@ouro.bot/cli 0.1.0-alpha.552 → 0.1.0-alpha.554
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/RepairGuide.ouro/psyche/IDENTITY.md +1 -1
- package/RepairGuide.ouro/psyche/SOUL.md +1 -1
- package/RepairGuide.ouro/skills/diagnose-stacked-typed-issues.md +4 -4
- package/changelog.json +35 -43
- package/dist/heart/auth/auth-flow.js +3 -3
- package/dist/heart/core.js +0 -12
- package/dist/heart/daemon/agent-config-check.js +75 -168
- package/dist/heart/daemon/agentic-repair.js +2 -9
- package/dist/heart/daemon/cli-defaults.js +72 -42
- package/dist/heart/daemon/cli-exec.js +67 -230
- package/dist/heart/daemon/cli-help.js +1 -1
- package/dist/heart/daemon/cli-render.js +2 -14
- package/dist/heart/daemon/daemon-entry.js +0 -30
- package/dist/heart/daemon/daemon-health.js +0 -7
- package/dist/heart/daemon/daemon-rollup.js +1 -2
- package/dist/heart/daemon/doctor.js +0 -18
- package/dist/heart/daemon/inner-status.js +0 -13
- package/dist/heart/hatch/hatch-flow.js +0 -20
- package/dist/heart/provider-binding-resolver.js +109 -97
- package/dist/heart/provider-credentials.js +2 -2
- package/dist/heart/provider-failover.js +1 -1
- package/dist/heart/provider-readiness-cache.js +40 -0
- package/dist/heart/provider-visibility.js +2 -2
- package/dist/heart/start-of-turn-packet.js +1 -1
- package/dist/senses/pipeline.js +18 -37
- package/package.json +1 -1
- package/RepairGuide.ouro/skills/diagnose-bootstrap-drift.md +0 -54
- package/dist/heart/daemon/drift-detection.js +0 -146
- package/dist/heart/provider-state.js +0 -216
package/README.md
CHANGED
|
@@ -95,8 +95,8 @@ Task docs do not live in this repo anymore. Planning and doing docs live in the
|
|
|
95
95
|
|
|
96
96
|
## Runtime Truths
|
|
97
97
|
|
|
98
|
-
- `agent.json` is the source of truth for identity, phrase pools, context settings, enabled senses, and
|
|
99
|
-
- `
|
|
98
|
+
- `agent.json` is the source of truth for identity, phrase pools, context settings, enabled senses, vault coordinates, and provider+model selection. It has two provider lanes: `outward` for CLI, Teams, and BlueBubbles turns, and `inner` for inner dialogue.
|
|
99
|
+
- Legacy `humanFacing`/`agentFacing` provider fields are read only as compatibility aliases for `outward`/`inner`; they are not a second config surface.
|
|
100
100
|
- Each agent has one credential vault for provider, runtime, sense, integration, travel, and tool credentials. There is no machine-wide credential pool.
|
|
101
101
|
- Vault unlock material is local machine state. Prefer macOS Keychain, Windows DPAPI, or Linux Secret Service; plaintext fallback is allowed only by explicit human choice.
|
|
102
102
|
- New vault unlock secrets are confirmed before use and rejected if they do not meet the minimum strength requirements.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
You are a diagnostician.
|
|
4
4
|
|
|
5
|
-
You look at the inventory of findings — typed and untyped degraded entries,
|
|
5
|
+
You look at the inventory of findings — typed and untyped degraded entries, sync probe findings, vault state — and you classify each. For each one you can classify, you propose exactly one `RepairAction` from the harness's typed catalog.
|
|
6
6
|
|
|
7
7
|
You are precise. You do not over-promise. You do not invent action kinds. You do not propose multi-step plans — each proposal is one action against one finding.
|
|
8
8
|
|
|
@@ -4,7 +4,7 @@ You are RepairGuide. You produce structured proposals only. You are NEVER an act
|
|
|
4
4
|
|
|
5
5
|
## What you do
|
|
6
6
|
|
|
7
|
-
You read a snapshot of an unhealthy ouroboros boot — typed degraded findings, untyped degraded findings,
|
|
7
|
+
You read a snapshot of an unhealthy ouroboros boot — typed degraded findings, untyped degraded findings, sync-probe output, vault state — and you propose repairs. The harness then surfaces those proposals to the operator for approval.
|
|
8
8
|
|
|
9
9
|
## What you do NOT do
|
|
10
10
|
|
|
@@ -5,21 +5,21 @@ This skill is the catch-all for compound situations: when an agent has three or
|
|
|
5
5
|
## Inputs from the finding inventory
|
|
6
6
|
|
|
7
7
|
- The full `typedDegraded: DegradedAgent[]` set.
|
|
8
|
-
- Any
|
|
8
|
+
- Any sync-probe or vault-related entries described in the sibling skills.
|
|
9
9
|
|
|
10
10
|
## Triage strategy
|
|
11
11
|
|
|
12
12
|
Stacked typed issues usually have one root cause and several downstream consequences. Examples:
|
|
13
13
|
|
|
14
|
-
1. **Vault expired → provider auth fails →
|
|
15
|
-
2. **Provider rotated key → old vault →
|
|
14
|
+
1. **Vault expired → provider auth fails → retry loop** — `credential-revision-changed` is the root; `provider-auth` and provider failures are downstream. Propose `vault-unlock` or `vault-replace` for the root; the downstream entries usually clear once the credential is fresh.
|
|
15
|
+
2. **Provider rotated key → old vault → provider failures** — root is `vault-replace`; live checks will recover after the credential is fresh.
|
|
16
16
|
3. **Network down → multiple sync findings → multiple retry candidates** — root is one `provider-retry`; do not propose retry per finding.
|
|
17
17
|
|
|
18
18
|
## Output strategy
|
|
19
19
|
|
|
20
20
|
When you can identify a clear root cause:
|
|
21
21
|
- Emit ONE action targeting the root.
|
|
22
|
-
- Add a `notes` entry naming the downstream entries you believe will clear: "I expect provider-auth and
|
|
22
|
+
- Add a `notes` entry naming the downstream entries you believe will clear: "I expect provider-auth and live checks to resolve after vault-unlock; verify by re-running `ouro up`."
|
|
23
23
|
|
|
24
24
|
When you cannot identify a clear root cause:
|
|
25
25
|
- Emit one action per finding where the catalog applies.
|
package/changelog.json
CHANGED
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
{
|
|
2
2
|
"_note": "This changelog is maintained as part of the PR/version-bump workflow. Agent-curated, not auto-generated. Agents read this file directly via read_file to understand what changed between versions.",
|
|
3
3
|
"versions": [
|
|
4
|
+
{
|
|
5
|
+
"version": "0.1.0-alpha.554",
|
|
6
|
+
"changes": [
|
|
7
|
+
"Provider/model selection now has one durable authority: `agent.json` lanes. The daemon, CLI, prompt visibility, failover, hatch, and RepairGuide paths no longer maintain or repair a second local provider-selection object.",
|
|
8
|
+
"`ouro use` and legacy provider/model commands now write `agent.json` and run bundle sync when sync is enabled, so provider lane changes travel with the agent bundle.",
|
|
9
|
+
"Provider credential refresh wording now describes the in-memory credential cache backed by the agent vault instead of implying a durable local provider selection copy."
|
|
10
|
+
]
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"version": "0.1.0-alpha.553",
|
|
14
|
+
"changes": [
|
|
15
|
+
"Daemon startup on macOS now starts through launchd before opening the daemon socket when the LaunchAgent is available, preventing `ouro up` from leaving both a manual daemon and a launchd daemon alive after current-session bootstrap."
|
|
16
|
+
]
|
|
17
|
+
},
|
|
4
18
|
{
|
|
5
19
|
"version": "0.1.0-alpha.552",
|
|
6
20
|
"changes": [
|
|
@@ -244,7 +258,7 @@
|
|
|
244
258
|
"version": "0.1.0-alpha.520",
|
|
245
259
|
"changes": [
|
|
246
260
|
"`ouro up` now prints the current runtime version in the update-check phase before asking npm for newer bits, so a stalled registry or update path no longer hides what is actually running.",
|
|
247
|
-
"Production `ouro up` starts or refreshes the daemon before provider health checks and repair prompts. Broken credentials for one agent are reported as degraded provider
|
|
261
|
+
"Production `ouro up` starts or refreshes the daemon before provider health checks and repair prompts. Broken credentials for one agent are reported as degraded provider readiness after the daemon is answering instead of preventing every agent from coming online.",
|
|
248
262
|
"Daemon startup now opens the command socket before autostarting provider-dependent workers and kicks agent/sense autostart concurrently. A thrown or stalled config check is contained to that agent's crashed snapshot, leaving the daemon and sibling agents reachable.",
|
|
249
263
|
"BlueBubbles no longer auto-learns a one-to-one chat partner as the agent's own iMessage handle after an outbound reply, so the next inbound text from that person is not filtered as self-talk.",
|
|
250
264
|
"Mail tools and the Ouro Mailbox now retry runtime/config resolution when a sense process cached a transient vault-unavailable state, and prompt sense-status rendering reads the same cached vault runtime truth instead of stale local config.",
|
|
@@ -254,13 +268,13 @@
|
|
|
254
268
|
"Bitwarden vault login/unlock now passes the saved vault unlock secret through `bw --passwordenv` instead of process arguments, so the secret does not appear in `ps` output while `ouro up` or a sense startup is unlocking the agent vault.",
|
|
255
269
|
"Production Bitwarden reads for structured runtime/provider item names now use bounded exact search with isolated app data instead of a full-vault listing, reducing the startup window where `ouro up` appears quiet while the vault CLI is busy.",
|
|
256
270
|
"Daemon startup provider health checks now cache the selected provider credentials they just verified, so the first MCP or iMessage turn does not re-open Bitwarden before using the already-checked `openai-codex` key.",
|
|
257
|
-
"Managed sense workers now receive the daemon's already-verified provider credential
|
|
271
|
+
"Managed sense workers now receive the daemon's already-verified provider credential records over IPC at startup, so BlueBubbles and other child processes do not reopen Bitwarden mid-message after `ouro up` has already proved the selected provider is ready.",
|
|
258
272
|
"Daemon health recovery no longer cancels an agent whose config check is still in flight, so a slow provider/vault check cannot leave the inner-dialog worker stopped after `ouro up`.",
|
|
259
273
|
"`ouro up` no longer waits on optional sense runtime/config vault refreshes. Sense workers use cached config for the boot decision, refresh their runtime config in the background, and retry once fresh config arrives, while entrypoints start their worker before best-effort runtime refresh completes.",
|
|
260
274
|
"Daemon health recovery now invalidates stale no-process startup attempts before retrying, so an old hung provider check cannot keep an agent stuck in `starting` forever or spawn a stale worker after recovery; stale recovery defaults to 45s so the next health pass can clear it.",
|
|
261
275
|
"Provider initialization failures during daemon-handled sense turns now throw back to the command boundary instead of calling `process.exit(1)`, so a bad provider/vault read can fail one MCP or iMessage turn without killing the `ouro up` supervisor.",
|
|
262
276
|
"Provider retry and single-provider read paths now refresh only the selected provider's vault item, so a slow or broken credential for another provider cannot stall a healthy `openai-codex` turn.",
|
|
263
|
-
"`ouro status --agent <name>` now refreshes only the providers selected by that agent's outward/inner lanes, and skips vault reads entirely when local provider
|
|
277
|
+
"`ouro status --agent <name>` now refreshes only the providers selected by that agent's outward/inner lanes, and skips vault reads entirely when local provider readiness is missing, so an unused broken provider cannot freeze status.",
|
|
264
278
|
"`ouro up` now keeps its startup poll finite while allowing enough time for bounded Bitwarden retry paths before labeling an otherwise-progressing worker as timed out.",
|
|
265
279
|
"User-facing session transcript summaries and searches now hide tool-result chatter for outward sessions while keeping full tool traces available in `self/inner`, so iMessage history reads as the human conversation instead of shell logs.",
|
|
266
280
|
"Small transcript-tail reads now always keep the latest visible user and assistant turns even after tool-heavy BlueBubbles activity, so Slugger does not mistake a live iMessage session for stale history.",
|
|
@@ -270,13 +284,11 @@
|
|
|
270
284
|
{
|
|
271
285
|
"version": "0.1.0-alpha.519",
|
|
272
286
|
"changes": [
|
|
273
|
-
"Layer 3 (final) of the harness-hardening sequence (1→4→2→3 from `docs/planning/2026-04-28-1900-planning-harness-hardening-and-repairguide.md`). Ships the `RepairGuide.ouro/` library bundle alongside `SerpentGuide.ouro/` containing five diagnostic skills (`diagnose-bootstrap-drift`, `diagnose-broken-remote`, `diagnose-sync-blocked`, `diagnose-vault-expired`, `diagnose-stacked-typed-issues`) plus `psyche/SOUL.md` + `psyche/IDENTITY.md`. Loaded by the existing `agentic-repair.ts` pipeline as a content source — not a runtime agent (no senses, no vault, no `ouro status` presence).",
|
|
274
287
|
"Introduces `kind: \"library\"` field on bundle `agent.json`. `agent-discovery.ts` filters bundles where `kind === \"library\"` so they're never instantiated as runtime agents. `SerpentGuide.ouro/agent.json` tagged with `kind: \"library\"` to formalize what was previously an implicit `enabled: false` convention.",
|
|
275
288
|
"Activation gate `shouldFireRepairGuide` consumes the existing `untypedDegraded` / `typedDegraded` partitioning at `cli-exec.ts:6693-6694`. Fires when `untypedDegraded.length > 0` OR `typedDegraded.length >= 3`. The existing `--no-repair` flag remains the operator escape hatch — no new env toggle.",
|
|
276
289
|
"Drops the `~/AgentBundles/SerpentGuide.ouro/` override fallback in `getSpecialistIdentitySourceDir` — the in-repo bundle is now the only source. Reasoning per the planning doc: drift surface we don't currently need; cleaner ownership; no override path to maintain. Five referencing files updated (`hatch-flow.ts`, `cli-defaults.ts`, plus their tests). Same constraint extends to RepairGuide from day one — no override mechanism.",
|
|
277
290
|
"`parseRepairProposals` typed parser maps RepairGuide's structured-proposal output into the existing `RepairAction` catalog from `readiness-repair.ts` (`vault-unlock`, `provider-auth`, `provider-use`, etc.). Backfills lane variants and missing fields where unambiguous; rejects malformed proposals.",
|
|
278
|
-
"
|
|
279
|
-
"Slugger-style compound integration fixture as canonical acceptance test (per O6): bad bootstrap state + expired creds + broken remote + drift between agent.json and state/providers.json simultaneously. Validates the full layer 1→4→2→3 pipeline end-to-end.",
|
|
291
|
+
"Slugger-style compound integration fixture as canonical acceptance test (per O6): bad bootstrap state + expired creds + broken remote + drift between agent.json and agent.json simultaneously. Validates the full layer 1→4→2→3 pipeline end-to-end.",
|
|
280
292
|
"All gates green: tsc clean, lint clean, code coverage 100%, nerves audit pass."
|
|
281
293
|
]
|
|
282
294
|
},
|
|
@@ -293,13 +305,7 @@
|
|
|
293
305
|
{
|
|
294
306
|
"version": "0.1.0-alpha.517",
|
|
295
307
|
"changes": [
|
|
296
|
-
"Layer
|
|
297
|
-
"New module `src/heart/daemon/drift-detection.ts`. `detectProviderBindingDrift(input)` is a pure intent-vs-observed comparator — it tolerates legacy `humanFacing`/`agentFacing` AND new `outward`/`inner` keys in `agent.json` with a 'new key wins, fall back to legacy' precedence rule (the rename is in flight; mixed `agent.json` files must work). `loadDriftInputsForAgent(bundlesRoot, agentName)` is the I/O wrapper that reads both files off disk, mapping missing/invalid `state/providers.json` to a `null` providerState (the comparator interprets `null` as 'no observation, nothing to drift against' — fresh-install case).",
|
|
298
|
-
"`checkAgentConfigWithProviderHealth` gains an additive optional `driftFindings: DriftFinding[]` field on `ConfigCheckResult`. Drift detection runs once after state setup so findings ride along with both success and failure return paths. Drift is advisory and never flips `ok` to false. Non-breaking: 7 existing tests using strict `toEqual({ok:true})` were loosened to `toMatchObject({ok:true})` to accept the additive field — no behavior change.",
|
|
299
|
-
"`computeDaemonRollup` (Layer 1) gains an optional `driftDetected: boolean`. When true, `healthy` → `partial` (same downgrade rule as `bootstrapDegraded`). `degraded` and `safe-mode` rollups are unaffected — drift never escalates past `partial` and never un-downgrades. `daemon-entry.ts` probes each enabled agent for drift before computing the rollup; a single agent's read failure is best-effort and does not block the scan.",
|
|
300
|
-
"`buildInnerStatusOutput` gains an optional `driftFindings` field and renders a `drift advisory` section per finding (lane, intent vs observed, copy-pasteable `ouro use`). `cli-exec.ts` adds `collectAgentDriftAdvisories` + `writeDriftAdvisorySummary` helpers; wired into the `--no-repair` boot path (preflight provider-degraded, post-startup degraded, AND the all-clear path) and the `inner.status` command. Operators see drift advisories without running `ouro inner status` per agent.",
|
|
301
|
-
"Daemon-wide drift visibility (post-review fix from ouroboros): `DaemonHealthState` gains a required `drift: DriftFinding[]` field, populated by `buildDaemonHealthState` from the per-agent drift probe. `renderRollupStatusLine`'s `partial` branch now distinguishes three sub-cases — agents-unhealthy-only, drift-only, and both — so a drift-induced `partial` rollup carries a clear cause rather than the misleading 'some agents unhealthy' copy. `readHealth` tolerates legacy cached health files missing the field (defaults to `[]`).",
|
|
302
|
-
"9874 tests pass. 100% coverage on all new and changed source files. Typecheck clean. Lint clean. Layer 3 (RepairGuide) consumes the `driftFindings` array surfaced here — Layer 3 is where drift findings cease to be advisory and become actionable. Layer 2 (sync probe) is independent of this PR."
|
|
308
|
+
"`computeDaemonRollup` (Layer 1) gains an optional `driftDetected: boolean`. When true, `healthy` → `partial` (same downgrade rule as `bootstrapDegraded`). `degraded` and `safe-mode` rollups are unaffected — drift never escalates past `partial` and never un-downgrades. `daemon-entry.ts` probes each enabled agent for drift before computing the rollup; a single agent's read failure is best-effort and does not block the scan."
|
|
303
309
|
]
|
|
304
310
|
},
|
|
305
311
|
{
|
|
@@ -545,7 +551,7 @@
|
|
|
545
551
|
{
|
|
546
552
|
"version": "0.1.0-alpha.484",
|
|
547
553
|
"changes": [
|
|
548
|
-
"Agent-driven failover (the `switch to <provider>` reply path) now re-pings the candidate provider before mutating provider
|
|
554
|
+
"Agent-driven failover (the `switch to <provider>` reply path) now re-pings the candidate provider before mutating provider readiness. If credentials are missing or the ping fails, the active lane is left untouched, a `senses.failover_switch_refused` event is emitted, and the agent receives an operational refusal context message naming the lane it is still standing on plus the verified alternatives that remain so the next turn does not re-enter discovery mode."
|
|
549
555
|
]
|
|
550
556
|
},
|
|
551
557
|
{
|
|
@@ -823,7 +829,7 @@
|
|
|
823
829
|
"changes": [
|
|
824
830
|
"`ouro connect` now uses a bounded live provider probe before opening the connection menu: it still checks the real selected providers, but it makes one orientation attempt with a 5-second hard timeout instead of spending the full startup retry budget before the human can choose a setup path.",
|
|
825
831
|
"Provider ping timeouts are now hard timeouts even when an SDK ignores the abort signal. The failing attempt is classified through the same shared retry machinery and reports a clear `provider ping timed out after <ms>ms` message instead of leaving the CLI stuck behind a blinking cursor.",
|
|
826
|
-
"Root connect provider checks no longer overwrite durable provider readiness. A quick menu probe can show `needs attention` for the current screen, while `ouro up`, `ouro check`, auth verification, and chat startup remain the flows that record lasting ready/failed provider
|
|
832
|
+
"Root connect provider checks no longer overwrite durable provider readiness. A quick menu probe can show `needs attention` for the current screen, while `ouro up`, `ouro check`, auth verification, and chat startup remain the flows that record lasting ready/failed provider readiness."
|
|
827
833
|
]
|
|
828
834
|
},
|
|
829
835
|
{
|
|
@@ -831,7 +837,7 @@
|
|
|
831
837
|
"changes": [
|
|
832
838
|
"`ouro status` and agent prompt provider visibility now distinguish \"the daemon has not loaded provider credentials in this process\" from \"the agent vault is missing credentials.\" A saved live check that passed stays ready instead of being downgraded to stale/missing just because status rendering is running in a fresh daemon process.",
|
|
833
839
|
"Provider visibility now carries a safe `not-loaded` credential state and renders it as `checked previously`, preserving the last live-check result without reading or printing secrets during ordinary status/prompt rendering.",
|
|
834
|
-
"Regression coverage locks the installed-product failure shape: an empty in-process provider cache plus ready provider
|
|
840
|
+
"Regression coverage locks the installed-product failure shape: an empty in-process provider cache plus ready provider readiness no longer produces misleading auth repair guidance."
|
|
835
841
|
]
|
|
836
842
|
},
|
|
837
843
|
{
|
|
@@ -1051,7 +1057,7 @@
|
|
|
1051
1057
|
"version": "0.1.0-alpha.422",
|
|
1052
1058
|
"changes": [
|
|
1053
1059
|
"`ouro auth` now streams provider-vault read progress before browser/token work begins, so a locked, slow, or remote vault never looks like a dead terminal after the initial access check.",
|
|
1054
|
-
"Provider credential saves now stream the post-write provider
|
|
1060
|
+
"Provider credential saves now stream the post-write in-memory provider credential reload, including vault item reads and parsing, instead of going silent after `refreshing in-memory provider credential pool`.",
|
|
1055
1061
|
"Auth-flow tests cover the pre-auth vault read and real Bitwarden-backed post-save refresh progress so the visible credential path stays protected.",
|
|
1056
1062
|
"`@ouro.bot/cli` and the `ouro.bot` wrapper are version-synced for the final auth-flow vault progress sweep."
|
|
1057
1063
|
]
|
|
@@ -1202,7 +1208,7 @@
|
|
|
1202
1208
|
{
|
|
1203
1209
|
"version": "0.1.0-alpha.406",
|
|
1204
1210
|
"changes": [
|
|
1205
|
-
"`ouro auth --agent <agent> --provider <provider>` now keeps narrating the post-login vault save path with `opening ... vault session`, `storing ... credentials`, and `refreshing
|
|
1211
|
+
"`ouro auth --agent <agent> --provider <provider>` now keeps narrating the post-login vault save path with `opening ... vault session`, `storing ... credentials`, and `refreshing in-memory provider credential pool`, so a successful browser login no longer drops into a silent cursor while secrets are being persisted.",
|
|
1206
1212
|
"Bitwarden-backed provider saves now classify timeouts and empty command failures by operation and redact raw `bw create item ...` command text, encoded payloads, and prompt echoes from auth output.",
|
|
1207
1213
|
"Auth, repair CLI, and Bitwarden regression coverage now encodes the reported post-login save failure shapes so the same leak-prone path stays guarded.",
|
|
1208
1214
|
"`@ouro.bot/cli` and the `ouro.bot` wrapper are version-synced for the post-login vault save hardening release."
|
|
@@ -1256,7 +1262,7 @@
|
|
|
1256
1262
|
"Bitwarden-backed provider-vault writes now treat search/list failures as real vault errors instead of silently collapsing them into \"missing credential\" fallthroughs.",
|
|
1257
1263
|
"Expired local Bitwarden sessions during provider credential search, create, edit, and list operations now retry once with a fresh session before surfacing a clear locked/missing/expired session error.",
|
|
1258
1264
|
"`bw config server` no longer swallows unrelated failures, and malformed `bw list items` output now reports a short invalid-JSON error instead of crashing through a raw parse exception.",
|
|
1259
|
-
"Provider credential upserts now fail explicitly when the vault write succeeded but the
|
|
1265
|
+
"Provider credential upserts now fail explicitly when the vault write succeeded but the in-memory provider credential pool refresh did not, with follow-up guidance to run `ouro provider refresh --agent <agent>` and `ouro auth verify --agent <agent>`.",
|
|
1260
1266
|
"Added regression coverage for the real runtime auth -> Bitwarden save path, plus store/provider tests for session-expiry retries, pre-create lookup failures, and post-save snapshot-refresh failures.",
|
|
1261
1267
|
"`@ouro.bot/cli` and the `ouro.bot` wrapper are version-synced for the vault-save error hardening release."
|
|
1262
1268
|
]
|
|
@@ -1274,7 +1280,7 @@
|
|
|
1274
1280
|
{
|
|
1275
1281
|
"version": "0.1.0-alpha.398",
|
|
1276
1282
|
"changes": [
|
|
1277
|
-
"`ouro auth --agent <agent> --provider <provider>` now prints safe progress breadcrumbs while it checks vault access, runs provider login, stores credentials in the agent vault, refreshes the
|
|
1283
|
+
"`ouro auth --agent <agent> --provider <provider>` now prints safe progress breadcrumbs while it checks vault access, runs provider login, stores credentials in the agent vault, refreshes the in-memory provider credential pool, and verifies the provider.",
|
|
1278
1284
|
"Provider auth launched from `ouro repair` and hatch bootstrap now uses the same auth progress hook, so browser/login flows no longer leave humans staring at a silent cursor after the provider says login succeeded.",
|
|
1279
1285
|
"Auth progress messages are phase labels only; they never include OAuth tokens, API keys, vault unlock secrets, or credential payload values.",
|
|
1280
1286
|
"`@ouro.bot/cli` and the `ouro.bot` wrapper are version-synced for the auth progress breadcrumb release."
|
|
@@ -1553,8 +1559,7 @@
|
|
|
1553
1559
|
{
|
|
1554
1560
|
"version": "0.1.0-alpha.365",
|
|
1555
1561
|
"changes": [
|
|
1556
|
-
"
|
|
1557
|
-
"`ouro auth`, `ouro use`, provider status/check/refresh, startup health checks, interactive repair, and failover guidance now share the same agent-vault/local-lane contract with clearer human repair paths.",
|
|
1562
|
+
"`ouro auth`, `ouro use`, provider status/check/refresh, startup health checks, interactive repair, and failover guidance now share the same agent-vault and lane contract with clearer human repair paths.",
|
|
1558
1563
|
"SerpentGuide bootstrap no longer persists its own provider credentials; hatch flows keep bootstrap credentials in memory and store them only in the hatchling agent vault.",
|
|
1559
1564
|
"Vault unlock bootstrap supports macOS Keychain, Windows DPAPI, Linux Secret Service, and explicit plaintext fallback, with docs aligned across AGENTS, README, OAuth setup, testing guide, and auth/provider reference."
|
|
1560
1565
|
]
|
|
@@ -1621,22 +1626,17 @@
|
|
|
1621
1626
|
},
|
|
1622
1627
|
{
|
|
1623
1628
|
"version": "0.1.0-alpha.355",
|
|
1624
|
-
"changes": [
|
|
1625
|
-
"`ouro up` AI-assisted repair diagnosis now uses the same discovered and pinged provider credentials as provider readiness checks, including the machine-wide credential pool, instead of drifting back through the current agent's configured provider registry path."
|
|
1626
|
-
]
|
|
1629
|
+
"changes": []
|
|
1627
1630
|
},
|
|
1628
1631
|
{
|
|
1629
1632
|
"version": "0.1.0-alpha.354",
|
|
1630
1633
|
"changes": [
|
|
1631
|
-
"Provider visibility now surfaces the effective local outward/inner lanes across start-of-turn context, system prompts, pulse, Outlook, and daemon status, using the shared provider binding resolver with safe credential provenance and no raw secret exposure."
|
|
1632
|
-
"Provider auth docs now state the runtime model plainly: `state/providers.json` selects provider/model per machine, `~/.agentsecrets/providers.json` stores machine credentials, `ouro use` switches lanes, and `ouro auth` stores credentials only."
|
|
1634
|
+
"Provider visibility now surfaces the effective local outward/inner lanes across start-of-turn context, system prompts, pulse, Outlook, and daemon status, using the shared provider binding resolver with safe credential provenance and no raw secret exposure."
|
|
1633
1635
|
]
|
|
1634
1636
|
},
|
|
1635
1637
|
{
|
|
1636
1638
|
"version": "0.1.0-alpha.353",
|
|
1637
|
-
"changes": [
|
|
1638
|
-
"Provider failover now uses the machine-wide credential pool and local provider-state lanes: terminal errors build ready-provider choices with safe credential provenance, `switch to <provider>` carries lane/model/revision context, and the retry path updates only the failed `state/providers.json` lane instead of mutating both synced `agent.json` facings."
|
|
1639
|
-
]
|
|
1639
|
+
"changes": []
|
|
1640
1640
|
},
|
|
1641
1641
|
{
|
|
1642
1642
|
"version": "0.1.0-alpha.352",
|
|
@@ -1658,15 +1658,11 @@
|
|
|
1658
1658
|
},
|
|
1659
1659
|
{
|
|
1660
1660
|
"version": "0.1.0-alpha.350",
|
|
1661
|
-
"changes": [
|
|
1662
|
-
"`ouro up`, hatch, and doctor now use the same local provider-state and machine-credential readiness path: new agents get bootstrapped `state/providers.json`, startup checks ping the selected lane/provider/model with machine-wide credentials, readiness is persisted per lane, legacy per-agent secrets migrate into `~/.agentsecrets/providers.json`, and doctor checks provider-pool/state safety without exposing secrets."
|
|
1663
|
-
]
|
|
1661
|
+
"changes": []
|
|
1664
1662
|
},
|
|
1665
1663
|
{
|
|
1666
1664
|
"version": "0.1.0-alpha.349",
|
|
1667
|
-
"changes": [
|
|
1668
|
-
"`ouro use`, `ouro check`, provider-scoped `ouro status --agent`, and machine-pool `ouro auth` now operate on machine-local provider state and credentials, with safe provenance, explicit lane/provider/model repair guidance, and legacy `auth switch`/`config model` compatibility routed through `state/providers.json` instead of mutating synced `agent.json`."
|
|
1669
|
-
]
|
|
1665
|
+
"changes": []
|
|
1670
1666
|
},
|
|
1671
1667
|
{
|
|
1672
1668
|
"version": "0.1.0-alpha.348",
|
|
@@ -1683,21 +1679,17 @@
|
|
|
1683
1679
|
},
|
|
1684
1680
|
{
|
|
1685
1681
|
"version": "0.1.0-alpha.346",
|
|
1686
|
-
"changes": [
|
|
1687
|
-
"Effective provider bindings now have a shared resolver primitive that reads machine-local `state/providers.json`, summarizes machine-wide credential provenance from `~/.agentsecrets/providers.json` without exposing secrets, maps legacy facing names to lane names, and marks readiness stale when provider/model or credential revisions change."
|
|
1688
|
-
]
|
|
1682
|
+
"changes": []
|
|
1689
1683
|
},
|
|
1690
1684
|
{
|
|
1691
1685
|
"version": "0.1.0-alpha.345",
|
|
1692
|
-
"changes": [
|
|
1693
|
-
"Machine-wide provider credentials now have a local pool at `~/.agentsecrets/providers.json` with one active record per provider, generated credential revisions, safe provenance, redacted summaries, and explicit migration from legacy per-agent `~/.agentsecrets/<agent>/secrets.json` files."
|
|
1694
|
-
]
|
|
1686
|
+
"changes": []
|
|
1695
1687
|
},
|
|
1696
1688
|
{
|
|
1697
1689
|
"version": "0.1.0-alpha.344",
|
|
1698
1690
|
"changes": [
|
|
1699
1691
|
"Provider readiness groundwork now has stable machine identity stored at `~/.ouro-cli/machine.json`, preserving random machine IDs across hostname changes while recording aliases for diagnostics.",
|
|
1700
|
-
"Per-agent provider bindings and readiness can now be read, validated, written, and bootstrapped in `<agent>.ouro/
|
|
1692
|
+
"Per-agent provider bindings and readiness can now be read, validated, written, and bootstrapped in `<agent>.ouro/agent.json` using explicit `outward` and `inner` lanes without storing credentials in bundle state."
|
|
1701
1693
|
]
|
|
1702
1694
|
},
|
|
1703
1695
|
{
|
|
@@ -244,9 +244,9 @@ function isVaultStoreUnlockError(message) {
|
|
|
244
244
|
}
|
|
245
245
|
function formatVaultStoreError(agentName, provider, error) {
|
|
246
246
|
const message = error instanceof Error ? error.message : String(error);
|
|
247
|
-
if (message.startsWith("credential stored in vault, but the
|
|
247
|
+
if (message.startsWith("credential stored in vault, but the in-memory provider credential pool could not be refreshed:")) {
|
|
248
248
|
return new Error(`provider authentication succeeded and ${provider} credentials were stored in ${agentName}'s vault, ` +
|
|
249
|
-
`but the
|
|
249
|
+
`but the in-memory provider credential pool refresh failed: ${message.replace("credential stored in vault, but the in-memory provider credential pool could not be refreshed: ", "")}`);
|
|
250
250
|
}
|
|
251
251
|
const retry = `Then retry 'ouro auth --agent ${agentName} --provider ${provider}'.`;
|
|
252
252
|
if (isVaultStoreUnlockError(message)) {
|
|
@@ -462,7 +462,7 @@ async function runRuntimeAuthFlow(input, deps = {}) {
|
|
|
462
462
|
catch (error) {
|
|
463
463
|
throw formatVaultStoreError(input.agentName, input.provider, error);
|
|
464
464
|
}
|
|
465
|
-
writeAuthProgress(input, `credentials stored at ${credentialPath};
|
|
465
|
+
writeAuthProgress(input, `credentials stored at ${credentialPath}; in-memory provider credential pool refreshed.`);
|
|
466
466
|
(0, runtime_1.emitNervesEvent)({
|
|
467
467
|
component: "daemon",
|
|
468
468
|
event: "daemon.auth_flow_end",
|
package/dist/heart/core.js
CHANGED
|
@@ -35,7 +35,6 @@ const packets_1 = require("../arc/packets");
|
|
|
35
35
|
const tool_friction_1 = require("./tool-friction");
|
|
36
36
|
const provider_models_1 = require("./provider-models");
|
|
37
37
|
const provider_credentials_1 = require("./provider-credentials");
|
|
38
|
-
const provider_state_1 = require("./provider-state");
|
|
39
38
|
const provider_attempt_1 = require("./provider-attempt");
|
|
40
39
|
const _providerRuntimes = {
|
|
41
40
|
human: null,
|
|
@@ -45,18 +44,7 @@ function providerLaneForFacing(facing) {
|
|
|
45
44
|
return facing === "human" ? "outward" : "inner";
|
|
46
45
|
}
|
|
47
46
|
function resolveRuntimeProviderBinding(facing) {
|
|
48
|
-
const agentName = (0, identity_2.getAgentName)();
|
|
49
47
|
const lane = providerLaneForFacing(facing);
|
|
50
|
-
const stateResult = (0, provider_state_1.readProviderState)((0, identity_2.getAgentRoot)(agentName));
|
|
51
|
-
if (stateResult.ok) {
|
|
52
|
-
const binding = stateResult.state.lanes[lane];
|
|
53
|
-
return { lane, provider: binding.provider, model: binding.model };
|
|
54
|
-
}
|
|
55
|
-
if (stateResult.reason === "invalid") {
|
|
56
|
-
throw new Error(`provider state for ${agentName} is invalid at ${stateResult.statePath}: ${stateResult.error}`);
|
|
57
|
-
}
|
|
58
|
-
// First-run and SerpentGuide bootstrap path. Daemon startup normally
|
|
59
|
-
// bootstraps state/providers.json from agent.json before model calls.
|
|
60
48
|
const config = (0, identity_1.loadAgentConfig)();
|
|
61
49
|
const facingConfig = facing === "human" ? config.humanFacing : config.agentFacing;
|
|
62
50
|
return { lane, provider: facingConfig.provider, model: facingConfig.model };
|