@haven_ai/connect 0.9.0-alpha.0 → 0.10.0-alpha.0

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 CHANGED
@@ -47,7 +47,40 @@ Do not point it at a project repository, shared folder, or cloud-synced folder.
47
47
 
48
48
  Use `--ack-local-tools` with Haven-generated setup prompts. It prepares the
49
49
  local Haven tools acknowledgement during setup so Codex and Claude Code can load
50
- Haven after a normal restart.
50
+ Haven after a normal restart. It also works with `--repair`: when an upgrade
51
+ changes the signer's tool set, the stored acknowledgement no longer matches and
52
+ the new signer refuses to start — `--repair --ack-local-tools` re-acknowledges
53
+ consent for the signer the repair installs (printing the consent block), with
54
+ no setup token. With a bare `--doctor` the flag is refused: the doctor is
55
+ read-only. The token-free path, without a repair, is the recorded wrapper:
56
+ `<agent dir>/bin/haven-signer.mjs --ack < /dev/null`.
57
+
58
+ ## Updating an agent's own connector (#3799)
59
+
60
+ On a machine with several agents, an agent can update its own pair in one
61
+ command. `--doctor` and `--repair` accept `--name <slug>` and select the agent
62
+ directory by its recorded MCP pair (`haven-<slug>` / `haven-signer-<slug>`) —
63
+ the same rule `--rekey --name` and `--unwire --name` use. An unknown slug is
64
+ refused listing the slugs that exist; two live directories claiming one pair
65
+ are refused listing both; tombstoned directories never match. When several
66
+ agents exist and no `--name` or `--credentials-dir` is given, the multi-agent
67
+ refusal names, per directory, the agent id AND the pair it owns, and offers the
68
+ `--name <slug>` command for named pairs.
69
+
70
+ Two honesty rules worth knowing:
71
+
72
+ - On Claude Code, `--repair` writes no MCP config (the connector does not own
73
+ that runtime's registry). It re-points `<dir>/bin/haven-signer.mjs` at the
74
+ pinned signer runtime, and says exactly that — the entry that launches the
75
+ wrapper uses the new signer after a restart. `--doctor --runtime claude-code`
76
+ names the recorded pair and how to confirm it (`claude mcp get
77
+ haven-signer-<slug>`).
78
+ - When the stored consent does not match the pinned signer's tool set, a bare
79
+ `--repair` stops before writing anything and names the token-free
80
+ re-consent command; `--repair --ack-local-tools` performs the
81
+ re-acknowledgement with the installed signer during the repair. The stored
82
+ ack holds only a hash, so a mismatch is never reported as "the tools grew" —
83
+ a rekey or a chain change produces the same mismatch.
51
84
 
52
85
  ## Supported runtimes
53
86
 
@@ -78,7 +111,9 @@ spending authority.
78
111
  ### `--doctor` reports every agent, not just one (#1697)
79
112
 
80
113
  With several agents wired into one runtime (`--name`), the doctor enumerates
81
- every credential directory on the machine and classifies each one:
114
+ every credential directory on the machine and classifies each one. An agent can
115
+ also select its OWN directory with `--doctor --name <slug>` or
116
+ `--repair --name <slug>` — see [Updating an agent's own connector](#updating-an-agents-own-connector-3799):
82
117
 
83
118
  | Classification | Meaning |
84
119
  | --- | --- |
@@ -109,7 +144,7 @@ report stays `version: 1`; `level` is additive.
109
144
  | Level | Meaning | Example |
110
145
  | --- | --- | --- |
111
146
  | `ok` | Nothing to say. | The installed signer matches the connector's pin. |
112
- | `advisory` | Worth reading; nothing is broken. Exit 0. | `signer_runtime`: the install is intact but behind the pinned version ("intact, but outdated" — both versions named, `--repair` offered); `signer_runtime_unused` (#3123): runtime directories nothing references; `mcp_server_name_rebound` (#3122): two local binding records claim one server name. `superseded_agents` on a recognised runtime with no config file the connector can read (Claude Code, `other`): a second live key is reported, and the check says why "wired" cannot be verified from this machine. |
147
+ | `advisory` | Worth reading; nothing is broken. Exit 0. | `signer_runtime`: the install is intact but behind the pinned version ("intact, but outdated" — both versions named, `--repair` offered); `signer_runtime_unused` (#3123): runtime directories nothing references; `mcp_server_name_rebound` (#3122): two local binding records claim one server name. `superseded_agents` on a recognised runtime with no config file the connector can read (Claude Code, `other`): a second live key is reported, and the check — labelled "Other agent credentials (wiring not verifiable)" — says why "wired" cannot be verified from this machine. On Claude Code a pair named in `~/.claude.json` counts as wired (#3830), so only directories that file does not name reach this advisory, and the inventory row reads "not verified as wired" rather than "superseded"; a directory it upgrades runs the full per-agent checks and can fail the run. |
113
148
  | `failed` | A real failure with one repair action. Exit 1. | A stale or empty runtime directory; a live key in a directory the runtime's config demonstrably does not use. |
114
149
 
115
150
  What stays blocking is live spend authority: a directory whose stored key
@@ -285,10 +320,10 @@ long-lived host afterwards, as with any retirement.
285
320
 
286
321
  Setup guards the **name slot** (a taken `--name`, the bare pair already wired
287
322
  — #2551 refuses or asks) but never the **wallet**: a machine can carry several
288
- agents with live keys, and until #3122 the "your previous agent(s) still exist
289
- with their own keys" heads-up was printed only after the credentials were
290
- written (that completion heads-up, #1688, is unchanged — this slice ADDS an
291
- earlier notice). Two things changed, both from local files only (no network call is
323
+ agents with live keys, and until #3122 the heads-up naming the other agent
324
+ directories was printed only after the credentials were written (that
325
+ completion heads-up, #1688, still prints — reworded by #3830, see below — and
326
+ this slice ADDS an earlier notice). Two things changed, both from local files only (no network call is
292
327
  added; the backend is not asked whether any key still authenticates):
293
328
 
294
329
  - **Before the key is minted or anything is written**, setup names every
@@ -383,21 +418,29 @@ deployment, so the two differing is intended topology, not an environment
383
418
  mismatch. It is non-secret: the same string goes into your own MCP config file,
384
419
  and the API key travels beside it in a header.
385
420
 
386
- `superseded_agent_ids` lists the other agent directories on this machine. A
387
- re-run mints a NEW agent, and without `--replace` retires nothing, so those
388
- older agents still hold live API and signing keys — use **Remove agent…** on the
389
- Haven agent page for each if you meant to replace them. Empty on a clean first run; an empty
390
- list here is not a guarantee, since a scan that cannot read the credential root
391
- also yields one rather than failing a completed setup.
392
-
393
- **The dashboard offers the revoke, never the connector (#2561).** The same ids
394
- now ride the install-status report, so the Haven dashboard can put a
395
- revoke next to the setup that displaced them; it also ends the agent's budget
396
- with one owner signature (#3542). The connector does not
397
- and must not do it: `POST /agents/:id/revoke` is owner-authenticated, and an
398
- agent credential retiring a sibling agent is the "agent editing its own
399
- authority" the re-key routes refuse. Nothing is revoked automatically — the
400
- owner clicks, one agent at a time.
421
+ `superseded_agent_ids` lists the other agent directories on this machine —
422
+ every one, key-less and tombstoned included, on any backend. Despite the field
423
+ name it is **not** a replace set (#3830): since named pairs became the default
424
+ (#3737), a run without `--replace` adds its agent alongside the ones already
425
+ here and retires nothing, so most listed agents are simply other agents, many
426
+ of them wired and in use. Agents a `--replace` run actually retired are
427
+ `retired_agent_ids`. The completion heads-up names the list as "other agent
428
+ directories on this machine" and says this setup revoked none of them; if you
429
+ no longer use one, use **Remove agent…** on its Haven agent page. Empty on a
430
+ clean first run; an empty list here is not a guarantee, since a scan that
431
+ cannot read the credential root also yields one rather than failing a
432
+ completed setup.
433
+
434
+ **The dashboard lists them; revoking stays on each agent's page (#2561,
435
+ #3830).** The same ids ride the install-status report, and the connect modal's
436
+ completed state lists those that are the owner's agents and not revoked
437
+ (active, paused or still in setup), each linking to its agent page. It
438
+ does not call them replaced and offers no revoke there (owner decision,
439
+ 2026-10-09): the report cannot tell a coexisting agent
440
+ from a retired one. The connector never revokes either: `POST
441
+ /agents/:id/revoke` is owner-authenticated, and an agent credential retiring a
442
+ sibling agent is the "agent editing its own authority" the re-key routes
443
+ refuse.
401
444
 
402
445
  On the REPORT the field is a tri-state, unlike the `--json` outcome above: a
403
446
  list, `[]` when the scan ran and found none, and `null` when it could not run.
@@ -411,7 +454,12 @@ untouched — and `superseded_agents_retired_locally` is `true` when that
411
454
  retirement covered every collision entry (`false`: the install ended with an
412
455
  error code and the retirement was skipped, or one entry failed). Both fields
413
456
  are absent on any other run and say nothing about the backend, where nothing is
414
- revoked.
457
+ revoked. Separately, since #3772 a run that retired at least one directory tells
458
+ Haven which ones (`POST /agent-connection-setups/{setupId}/retired-agents`, with
459
+ the new agent's key, `retired_agent_ids` only), so a session still running as a
460
+ retired agent sees a `supersededBy` warning on its own `haven_get_agent` /
461
+ `haven_get_allowances`. That report is best-effort — an older backend's 404 is
462
+ ignored silently and any other failure is one log line — and it still pauses and revokes nothing.
415
463
 
416
464
  A `wiring_collision` refusal (a non-interactive bare setup over a live
417
465
  previous agent, #2551) carries `error.superseded_agent_ids` and
@@ -718,7 +766,8 @@ repair spelled out: use **Remove agent…** on the Haven agent page, then remove
718
766
  the directory. An already-revoked one reports as informational; an unreachable
719
767
  probe is a note, never a verdict. Connect never revokes or deletes
720
768
  credentials itself — it reports, you decide. The setup completion output
721
- names superseded agents the moment they are created, for the same reason.
769
+ names the other agent directories the moment the new agent is created, for
770
+ the same reason.
722
771
  One honest limit: "newest" is decided by file mtime, so a restored backup or
723
772
  a sync tool that rewrites timestamps can make doctor examine the wrong
724
773
  directory as current — before revoking anything, confirm the agent id