Configurazione

Il servizio account appartiene a OHarness Cloud. Il client conosce solo la sua origine pubblica, non il progetto Supabase né la chiave API del progetto Composio.

PosizioneResponsabilità
~/.oharness/config.jsonPreferenze generali di runtime: modelli, permessi, logging, sincronizzazione
~/.oharness/cloud.jsonIndirizzo pubblico Cloud opzionale: { "siteUrl": "https://oharness.ai" }
~/.oharness/plugins.json{ "runtimePlugins": [...] }; plugins opzionale per i bundle dichiarativi
~/.oharness/mcp.json{ "mcpServers": { ... } }; le modifiche ai connettori dal Web vengono scritte qui
Ambiente/segreti del deployment CloudConfigurazione di Supabase e chiavi di servizio di proprietà della piattaforma
Archivio delle credenzialiCredenziali di accesso dell'utente; non in nessuno dei file di configurazione sopra

OHARNESS_HOME reindirizza tutti e quattro i file del client. L'origine Cloud ufficiale è il valore predefinito; le sostituzioni self-hosted o di sviluppo usano OHARNESS_SITE_URL, poi cloud.json, poi l'origine pubblica inclusa nel pacchetto. HTTP è consentito solo per lo sviluppo su loopback. La configurazione del repository non può scegliere l'origine Cloud né caricare codice di plugin di runtime. Harness.create({ config, runtimePlugins }) da codice supporta ancora configurazioni fornite esplicitamente.

Memoria

Le note durature si configurano sotto memory in config.json (o nel oharness.config.json di un progetto): limiti, richiamo per messaggio ed estrazione automatica. Le note di progetto vivono come Markdown sotto <project>/MEMORY/; le note utente trasversali ai progetti vivono sotto ~/.oharness/memory/user/. Il consenso alla sincronizzazione e gli indici locali della macchina restano nella directory dell'utente. La configurazione di un progetto può regolare il richiamo o disattivare l'estrazione, ma solo la configurazione dell'utente può attivarla, perché consuma il credito del modello dell'utente. Memoria elenca ogni impostazione.

Artefatti

Una sessione in un progetto registrato salva ogni artefatto sotto <project>/ARTIFACTS/: la revisione più recente come file semplice (ARTIFACTS/blue-field.html), le revisioni che ha sostituito sotto ARTIFACTS/.versions/<name>/v<N>.<ext>. Una sessione può creare più artefatti, ciascuno nel proprio file; lo stesso nome da un'altra sessione riceve un suffisso (blue-field-2.html). Modificare il file principale in un editor cambia ciò che mostra il pannello. ~/.oharness/storage/artifact/<session>.jsonl resta l'indice — quale sessione ha creato cosa, e la versione e i campi di sincronizzazione di ogni revisione — senza il contenuto. Eliminare una sessione rimuove l'indice e lascia i file nel progetto. Le sessioni fuori da un progetto registrato, e le immagini raster, mantengono il contenuto nell'indice come prima. Il contenuto registrato inline prima di questa modifica viene spostato nel progetto la volta successiva che la sessione viene aperta.

Sincronizzazione

La destinazione self-hosted e la credenziale di sessione stanno solo nel config.json dell'utente:

{
  "sync": {
    "url": "https://sync.example.com",
    "token": "opaque-session-token",
    "enabled": true
  }
}

L'ordine di precedenza attuale è sync.url dell'utente, poi OHARNESS_SYNC_URL, poi la destinazione ufficiale integrata. La configurazione del repository non può impostare URL, token o team, perché permetterebbe a un repository clonato di reindirizzare le trascrizioni; può solo disattivare la sincronizzazione o aggiungere esclusioni. Riavvia OHarness dopo aver cambiato la destinazione. Vedi Gestire il tuo server di sincronizzazione per distribuire il servizio incluso e Protocollo di sincronizzazione per implementarne uno compatibile.

Migrazione compatibile

Le sezioni esistenti di config.json vengono lette solo come ripiego finché il rispettivo file separato è assente. Un file separato esistente fa fede, anche se contiene un elenco di plugin vuoto o una mappa MCP vuota. Il campo legacy account.siteUrl è accettato; i campi legacy di Supabase non sono più usati dal client.

npm run config:migrate             # Preview filenames only; no secrets printed
npm run config:migrate -- --apply  # Back up, split, then clean the old sections

La migrazione conserva le preferenze non correlate e non sovrascrive i file separati già esistenti. Salva un backup privato config.before-split.<id>.json e scrive per ultima la configurazione generale. I file vengono sostituiti in modo atomico con modalità 0600. Non modificare la configurazione durante la migrazione e non eseguire più processi di migrazione insieme. Il backup può contenere vecchie credenziali: tienilo privato ed eliminalo tu stesso dopo la verifica. La migrazione non modifica mai le credenziali di accesso né autorizza app.

Trasporto dell'account

L'accesso dal browser usa ancora /auth/desktop e /api/desktop/exchange di Cloud. Il refresh e il ripiego OTP da terminale ora usano /api/desktop/auth/refresh, /otp e /verify. Aggiorna Cloud prima di riavviare un client aggiornato. Un Cloud più vecchio restituisce un errore esplicito; il client non ripiega su chiamate dirette a Supabase.

Cloud usa il progetto di autenticazione configurato, convalida gli input, limita richieste e dimensioni delle risposte e restituisce solo i campi di sessione. I token non vengono mai registrati nei log né inclusi negli errori. Le richieste non vengono ritentate automaticamente; le risposte sono no-store. Le credenziali appena ottenute registrano la loro origine Cloud; cambiarla richiede di accedere di nuovo prima del refresh. Le credenziali legacy acquisiscono questa origine al primo refresh riuscito verso l'attuale indirizzo Cloud attendibile.

Il rate limit dell'endpoint Cloud è per processo. I deployment di produzione dovrebbero applicare anche un rate limiting condiviso all'edge. Le impostazioni Supabase del sito restano nel progetto Cloud; questa migrazione non richiede modifiche allo schema del database.

Il connettore cloud ospitato tiene in Cloud la chiave Composio e l'allowlist delle app. Il suo plugin di runtime integrato connector-cloud mostra nella chat Web le schede di autorizzazione e riprende lo strumento in attesa dopo un collegamento verificato. plugins.json controlla l'interruttore del plugin; non contiene credenziali della piattaforma.