@indigoai-us/hq-cli 5.130.0 → 5.132.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.
Files changed (79) hide show
  1. package/CHANGELOG.md +155 -1
  2. package/contracts/preflight/v1/fixtures.json +87 -0
  3. package/contracts/preflight/v1/schema.json +58 -0
  4. package/dist/command-catalog.generated.d.ts +39 -0
  5. package/dist/command-catalog.generated.js +50 -0
  6. package/dist/commands/dm.d.ts +2 -0
  7. package/dist/commands/dm.js +1 -1
  8. package/dist/commands/files.js +137 -9
  9. package/dist/commands/lanes.d.ts +13 -2
  10. package/dist/commands/lanes.js +394 -42
  11. package/dist/commands/mesh.js +66 -13
  12. package/dist/commands/update.js +1 -1
  13. package/dist/lib/bot/paths.d.ts +7 -5
  14. package/dist/lib/bot/paths.js +8 -1
  15. package/dist/lib/bot/prompt.d.ts +0 -2
  16. package/dist/lib/bot/prompt.js +5 -11
  17. package/dist/lib/bot/room-policy.d.ts +1 -24
  18. package/dist/lib/bot/room-policy.js +2 -35
  19. package/dist/lib/bot/run.d.ts +7 -8
  20. package/dist/lib/bot/run.js +21 -33
  21. package/dist/lib/bot/session.d.ts +1 -1
  22. package/dist/lib/bot/session.js +1 -1
  23. package/dist/lib/lanes/accounts.d.ts +6 -0
  24. package/dist/lib/lanes/accounts.js +2 -1
  25. package/dist/lib/lanes/config.d.ts +4 -0
  26. package/dist/lib/lanes/config.js +9 -0
  27. package/dist/lib/lanes/index.d.ts +10 -3
  28. package/dist/lib/lanes/index.js +5 -1
  29. package/dist/lib/lanes/mesh-events.js +4 -0
  30. package/dist/lib/lanes/models.d.ts +78 -0
  31. package/dist/lib/lanes/models.js +205 -0
  32. package/dist/lib/lanes/move-account.d.ts +56 -0
  33. package/dist/lib/lanes/move-account.js +193 -0
  34. package/dist/lib/lanes/provider-rejection.d.ts +86 -0
  35. package/dist/lib/lanes/provider-rejection.js +258 -0
  36. package/dist/lib/lanes/quota.d.ts +17 -0
  37. package/dist/lib/lanes/quota.js +24 -0
  38. package/dist/lib/lanes/reconcile-install.d.ts +24 -3
  39. package/dist/lib/lanes/reconcile-install.js +48 -12
  40. package/dist/lib/lanes/reconcile.js +41 -11
  41. package/dist/lib/lanes/spawn.js +26 -5
  42. package/dist/lib/lanes/store.js +10 -0
  43. package/dist/lib/lanes/types.d.ts +49 -2
  44. package/dist/lib/lanes/types.js +4 -3
  45. package/dist/lib/lanes/watcher.d.ts +27 -0
  46. package/dist/lib/lanes/watcher.js +68 -5
  47. package/dist/lib/mesh/api.d.ts +2 -0
  48. package/dist/lib/mesh/api.js +15 -2
  49. package/dist/lib/mesh/live/backfill-held.d.ts +4 -3
  50. package/dist/lib/mesh/live/backfill-held.js +37 -14
  51. package/dist/lib/mesh/live/daemon/doctor.d.ts +4 -0
  52. package/dist/lib/mesh/live/daemon/doctor.js +15 -4
  53. package/dist/lib/mesh/live/daemon/install.d.ts +5 -0
  54. package/dist/lib/mesh/live/daemon/install.js +84 -1
  55. package/dist/lib/mesh/live/daemon/run.d.ts +5 -0
  56. package/dist/lib/mesh/live/daemon/run.js +17 -4
  57. package/dist/lib/mesh/live/emit-client.d.ts +2 -0
  58. package/dist/lib/mesh/live/emit-client.js +15 -8
  59. package/dist/lib/mesh/live/emit-evidence.d.ts +19 -0
  60. package/dist/lib/mesh/live/emit-evidence.js +20 -2
  61. package/dist/lib/mesh/live/emit.d.ts +9 -0
  62. package/dist/lib/mesh/live/emit.js +28 -2
  63. package/dist/lib/mesh/live/flush.js +9 -3
  64. package/dist/lib/search-index/index.js +22 -3
  65. package/dist/lib/work-context/company.d.ts +16 -0
  66. package/dist/lib/work-context/company.js +46 -14
  67. package/dist/lib/work-context/preflight-contract.d.ts +28 -0
  68. package/dist/lib/work-context/preflight-contract.js +85 -0
  69. package/dist/main.js +11 -1
  70. package/dist/utils/cognito-session.d.ts +39 -0
  71. package/dist/utils/cognito-session.js +119 -3
  72. package/dist/utils/environmental-error.d.ts +18 -0
  73. package/dist/utils/environmental-error.js +240 -7
  74. package/dist/utils/expected-cli-error.d.ts +2 -0
  75. package/dist/utils/expected-cli-error.js +4 -0
  76. package/dist/utils/self-update.js +4 -1
  77. package/dist/utils/vault-api.d.ts +1 -0
  78. package/dist/utils/vault-api.js +11 -3
  79. package/package.json +3 -2
package/CHANGELOG.md CHANGED
@@ -2,6 +2,156 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [5.132.0] — 2026-09-22
6
+
7
+ ### Added
8
+
9
+ - `hq lanes resume <lane-id> --account <id>` and `hq lanes message <lane-id>
10
+ --account <id>` move a lane's provider session to another account of the
11
+ same provider and continue it there, with its full history. The claude
12
+ transcript (`projects/<encoded cwd>/<session>.jsonl`, plus the session's
13
+ subagent directory) or the codex rollout
14
+ (`sessions/YYYY/MM/DD/rollout-*-<session>.jsonl`) is copied into the target
15
+ account's home; the source copy stays, and a copy the target already holds
16
+ is refreshed when it differs, so a lane moved back resumes the turns it ran
17
+ elsewhere. Every check runs before anything is copied or written: the lane must not be running (`lane_running`), the
18
+ target must be an account of the lane's provider
19
+ (`account_provider_mismatch`), exist, be enabled, be logged in, hold no
20
+ quota hold (`account_quota_held`), and know the lane's model; a target that
21
+ pins a different model needs `--model <id>` (new on both commands, accepted
22
+ only with `--account`). Grok lanes are refused with
23
+ `provider_session_not_portable`; a missing transcript or rollout with
24
+ `provider_session_missing`, naming the path searched. The record's
25
+ `account` moves, `account_history` gains an `operator_move` entry,
26
+ `last_resume.account` names the account the run started on, and
27
+ `hq lanes show` prints them; a record that changed after the move was
28
+ prepared is refused with `account_move_conflict`. The capacity decision
29
+ runs under the target account's admission lock, and a moved lane holds its
30
+ slot (`pending_resume`) until its spawn claims it, so two moves cannot share
31
+ one free slot. A target at its running cap queues the lane there with
32
+ `pending_resume`, and the reconcile pass resumes the session on the target,
33
+ honouring `--no-compact`. Mesh events for a moved lane carry `account` and
34
+ `account_move`. Credential files are never copied.
35
+
36
+ - A provider-level turn failure is a named lane failure. When the worker's
37
+ stdout carries a codex `turn.failed` event, a Claude error result with an
38
+ HTTP status, or a grok error object, the watcher classifies the lane
39
+ `failed` with `terminal_reason: provider_rejected` and writes the
40
+ provider's message (capped), status, error class, `retryable`, and the
41
+ model and account the run used to `terminal_details`. Such an exit is never
42
+ `interrupted` and never spawns the envelope repair turn. A 429 stays on the
43
+ quota path. `hq lanes show` prints `terminal_reason` and
44
+ `terminal_details`.
45
+ - `hq lanes create --model` is validated against the provider's own model
46
+ list before anything is written: codex from the account home's
47
+ `models_cache.json`, grok from `grok models`, claude from the aliases and
48
+ full-name prefix in `claude --help`. An unknown id is refused with
49
+ `model_unsupported` naming the provider, the value, the source and the
50
+ accepted ids. A provider whose list cannot be read (missing, corrupt, or
51
+ unreadable cache; failed probe) is not validated. Validation runs before
52
+ the mesh thread is ensured and before the admission lock is taken, so a
53
+ refusal leaves nothing behind and a slow provider probe never holds the
54
+ lock. An unpinned create reads the list of every enabled account the
55
+ balanced choice could land on before the lock; the account is still chosen
56
+ under the lock, restricted to the accounts whose list accepted the model,
57
+ so nothing is refused once the mesh thread exists and no probe or catalog
58
+ read runs while the lock is held. A `grok models` or `claude --help` probe that exits nonzero
59
+ is not a catalog, whatever it printed, and skips validation. Every outpost
60
+ lane is validated at pickup on the executing host, after its account
61
+ binds, and fails with `model_unsupported` there; a lane cancelled during
62
+ the pickup probe stays cancelled and is not spawned. A picked-up lane is
63
+ stored ineligible for admission (`pickup_validation_pending`) until its
64
+ account binds, so the reconcile pass cannot spawn it while the probe is
65
+ out, and the failure write refuses an already-terminal or running record
66
+ inside its compare-and-swap.
67
+ - A codex `turn.failed` or grok error with status 429, or with no status and
68
+ a usage-limit or rate-limit message, now reaches the quota path (reset time
69
+ and account hold recorded) instead of ending `interrupted`, and skips the
70
+ envelope repair turn so the hold applies at once; an explicit non-429
71
+ status wins over quota-sounding text. The reconcile pass applies the same
72
+ routing when it recovers a lane whose worker and watcher both died. The
73
+ provider's output is scanned from the tail one line at a time, so a long
74
+ run's events are never all parsed and held at once. A 429 whose message
75
+ names no reset time holds the account for the provider's
76
+ `quota_default_hold_ms` (fifteen minutes unless configured), recorded with
77
+ `reset_source: default_hold`; a message with a reset time keeps that time.
78
+
79
+ ### Fixed
80
+
81
+ - `hq lanes reconcile install` no longer copies the installing shell's PATH
82
+ into the systemd unit. The unit PATH is, per resolved provider, the
83
+ directory holding the command name and the real binary's directory when a
84
+ symlink points elsewhere, then the hq binary's directory, then the node
85
+ binary's directory, then `/usr/local/bin:/usr/bin:/bin`, deduplicated; directories synced from
86
+ another machine's profile are left out.
87
+
88
+ ## [5.131.0] — 2026-09-22
89
+
90
+ ### Added
91
+
92
+ - `hq files share` can post the share record to a project channel instead of a
93
+ DM: `--channel <name>` names the channel and `--mention <person>` (repeatable)
94
+ tags people in it. Using `--mention` without `--channel` is an error. If you
95
+ or a mentioned person are not members of that channel, access is still
96
+ granted and the record falls back to a DM, with a short note on the CLI.
97
+ - Offline preflight results the CLI can emit are published at
98
+ `contracts/preflight/v1/schema.json` and `fixtures.json` (included in the
99
+ package). `hq mesh contract preflight --print-fixtures` prints the same
100
+ document. A test fails if the committed fixtures drift from the emitter.
101
+ contractVersion stays pinned at 1 until hq-core's vendored copy moves with it.
102
+
103
+ ### Fixed
104
+
105
+ ## [Unreleased]
106
+
107
+ - Held-event repair no longer treats a later event timestamp as proof that
108
+ metadata belongs to the current session instance. A reused session id stays
109
+ unresolved when the held event's binding episode does not match the current
110
+ one. A CLI self-update now records the verified HQ root and rewrites a
111
+ legacy daemon unit (no `HQ_ROOT`, or `Restart=on-failure`) before restarting
112
+ it, so the new process does not come up with an empty root allowlist.
113
+
114
+ ## [Unreleased]
115
+
116
+ - A machine credential (fleet box or local bot) no longer posts mesh events
117
+ with no company. `HQ_SPAWN_COMPANY`, the bot's company, or the identity
118
+ file is sent with the event. When none of those is set, the event is held
119
+ as `needs_company` and `hq mesh daemon doctor` shows the held count.
120
+ A membership probe that a machine token cannot answer leaves the company
121
+ in place and retries, instead of clearing it.
122
+
123
+ ## [Unreleased]
124
+
125
+ - Expected caller errors from company resolution, membership, and qmd lookups
126
+ no longer create Sentry issues. Windows filesystem failures remain visible
127
+ and now include redacted path context plus a sync-aware diagnostic.
128
+
129
+ - An acknowledged Work Mesh register keeps the company on the session even
130
+ when there is no project, or a project and no task. The next flush posts a
131
+ held event for that session instead of leaving it held for lack of a company.
132
+ Tests cover each acked-register branch.
133
+
134
+ - `hq mesh project set` sends the project version it just read (`If-Match` and
135
+ `expectedVersion`). A 409 prints "The Board changed while you were editing.
136
+ Re-run to pick up the latest." and exits non-zero. `--json` includes
137
+ `VERSION_CONFLICT`.
138
+
139
+ - `hq mesh session` prints each rejected event's server code (and `--json`
140
+ includes `rejections`). A flush dead-letter row for a per-event rejection
141
+ stores that code next to `reason`.
142
+
143
+ - A Cognito refresh that comes back for a different subject is refused and the
144
+ active `cognito-tokens.json` is left unchanged. `hq mesh daemon doctor`
145
+ prints the whoami subject and the subject the daemon is using.
146
+
147
+ ### Changed
148
+
149
+ - Local bots can reply to other people and bots in direct messages and in
150
+ connected rooms without an owner-only sender restriction. Each DM
151
+ correspondent has a separate conversation, and the owner's private context
152
+ stays out of other people's conversations. Bots retain their configured
153
+ owner and check suspicious requests before taking sensitive actions.
154
+
5
155
  ## [5.130.0] — 2026-09-22
6
156
 
7
157
  ### Fixed
@@ -313,7 +463,11 @@
313
463
  with its tenant intact, the write reflects the true classification, and no
314
464
  `projectId`, `taskId`, or binding episode is fabricated on partial paths.
315
465
  Note: a company resolved by slug only (no uid) is still not attributed on
316
- either path.
466
+ either path. Tests disable each of those two writers in turn
467
+ (`writeAckedRegisterState`, and the post-ack `writeSessionState`) and
468
+ require the other one to still land the company for a company-only ack
469
+ and a company-plus-project ack. The production write itself landed in
470
+ `28aee9e` (#670).
317
471
 
318
472
  - The setup bot no longer posts the same question twice when a turn takes a
319
473
  while: a question asked in an interim update is held back if the final
@@ -0,0 +1,87 @@
1
+ {
2
+ "contractVersion": 1,
3
+ "source": "hq-cli contracts/preflight/v1/fixtures.json",
4
+ "classifications": [
5
+ "unresolved",
6
+ "needs_company",
7
+ "company_conflict",
8
+ "needs_project",
9
+ "needs_task",
10
+ "bound",
11
+ "untracked"
12
+ ],
13
+ "fixtures": [
14
+ {
15
+ "contractVersion": 1,
16
+ "kind": "queued",
17
+ "classification": "unresolved",
18
+ "delivery": "queued",
19
+ "lifecycle": "open",
20
+ "sessionId": "sid-preflight-fixture",
21
+ "clientOperationId": "op-preflight-fixture"
22
+ },
23
+ {
24
+ "contractVersion": 1,
25
+ "kind": "needs_company",
26
+ "classification": "needs_company",
27
+ "delivery": "clean",
28
+ "lifecycle": "open",
29
+ "sessionId": "sid-preflight-fixture",
30
+ "clientOperationId": "op-preflight-fixture"
31
+ },
32
+ {
33
+ "contractVersion": 1,
34
+ "kind": "company_conflict",
35
+ "classification": "company_conflict",
36
+ "delivery": "clean",
37
+ "lifecycle": "open",
38
+ "sessionId": "sid-preflight-fixture",
39
+ "clientOperationId": "op-preflight-fixture"
40
+ },
41
+ {
42
+ "contractVersion": 1,
43
+ "kind": "queued",
44
+ "classification": "needs_project",
45
+ "delivery": "queued",
46
+ "lifecycle": "open",
47
+ "sessionId": "sid-preflight-fixture",
48
+ "clientOperationId": "op-preflight-fixture",
49
+ "companySlug": "acme",
50
+ "companyUid": "cmp_acme"
51
+ },
52
+ {
53
+ "contractVersion": 1,
54
+ "kind": "queued",
55
+ "classification": "needs_task",
56
+ "delivery": "queued",
57
+ "lifecycle": "open",
58
+ "sessionId": "sid-preflight-fixture",
59
+ "clientOperationId": "op-preflight-fixture",
60
+ "companySlug": "acme",
61
+ "companyUid": "cmp_acme",
62
+ "projectId": "dispatch-proj"
63
+ },
64
+ {
65
+ "contractVersion": 1,
66
+ "kind": "queued",
67
+ "classification": "bound",
68
+ "delivery": "queued",
69
+ "lifecycle": "open",
70
+ "sessionId": "sid-preflight-fixture",
71
+ "clientOperationId": "op-preflight-fixture",
72
+ "companySlug": "acme",
73
+ "companyUid": "cmp_acme",
74
+ "projectId": "dispatch-proj",
75
+ "taskId": "US-9"
76
+ },
77
+ {
78
+ "contractVersion": 1,
79
+ "kind": "untracked",
80
+ "classification": "untracked",
81
+ "delivery": "clean",
82
+ "lifecycle": "open",
83
+ "sessionId": "sid-preflight-fixture",
84
+ "clientOperationId": "op-preflight-fixture"
85
+ }
86
+ ]
87
+ }
@@ -0,0 +1,58 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://hq.getindigo.ai/schemas/work-context/preflight/v1/schema.json",
4
+ "title": "Offline preflight ContextResult",
5
+ "description": "Shapes hq mesh context reconcile --offline emits. Hook consumers must accept every fixture and reject any classification outside this enum. Bump contractVersion together with hq-core core/hooks/SessionStart/preflight-fixtures.json.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "contractVersion",
10
+ "kind",
11
+ "classification",
12
+ "delivery",
13
+ "lifecycle",
14
+ "sessionId",
15
+ "clientOperationId"
16
+ ],
17
+ "properties": {
18
+ "contractVersion": { "type": "integer", "const": 1 },
19
+ "kind": {
20
+ "type": "string",
21
+ "enum": [
22
+ "queued",
23
+ "needs_company",
24
+ "company_conflict",
25
+ "untracked",
26
+ "bound",
27
+ "needs_project",
28
+ "needs_task",
29
+ "error"
30
+ ]
31
+ },
32
+ "classification": {
33
+ "type": "string",
34
+ "enum": [
35
+ "unresolved",
36
+ "needs_company",
37
+ "company_conflict",
38
+ "needs_project",
39
+ "needs_task",
40
+ "bound",
41
+ "untracked"
42
+ ]
43
+ },
44
+ "delivery": {
45
+ "type": "string",
46
+ "enum": ["clean", "queued", "acked", "quarantined"]
47
+ },
48
+ "lifecycle": { "type": "string", "enum": ["open", "terminal"] },
49
+ "sessionId": { "type": "string", "minLength": 1 },
50
+ "clientOperationId": { "type": "string", "minLength": 1 },
51
+ "companySlug": { "type": "string", "minLength": 1 },
52
+ "companyUid": { "type": "string", "minLength": 1 },
53
+ "projectId": { "type": "string", "minLength": 1 },
54
+ "taskId": { "type": "string", "minLength": 1 },
55
+ "bindingEpisodeId": { "type": "string", "minLength": 1 },
56
+ "errorCode": { "type": "string", "minLength": 1 }
57
+ }
58
+ }
@@ -1677,6 +1677,12 @@ export declare const COMMAND_CATALOG: readonly [{
1677
1677
  }, {
1678
1678
  readonly flags: "--no-open";
1679
1679
  readonly description: "Print the share-session URL but do not launch the browser";
1680
+ }, {
1681
+ readonly flags: "--channel <name>";
1682
+ readonly description: "Post the share record to this named channel instead of a DM";
1683
+ }, {
1684
+ readonly flags: "--mention <person>";
1685
+ readonly description: "Mention a person on the channel share record (repeatable)";
1680
1686
  }];
1681
1687
  readonly subcommands: readonly [];
1682
1688
  }, {
@@ -5984,6 +5990,27 @@ export declare const COMMAND_CATALOG: readonly [{
5984
5990
  }];
5985
5991
  readonly subcommands: readonly [];
5986
5992
  }];
5993
+ }, {
5994
+ readonly name: "contract";
5995
+ readonly description: "Print versioned work-mesh contracts for other repositories";
5996
+ readonly aliases: readonly [];
5997
+ readonly hidden: false;
5998
+ readonly usage: "[options] [command]";
5999
+ readonly arguments: readonly [];
6000
+ readonly options: readonly [];
6001
+ readonly subcommands: readonly [{
6002
+ readonly name: "preflight";
6003
+ readonly description: "Offline preflight ContextResult contract (contracts/preflight/v1)";
6004
+ readonly aliases: readonly [];
6005
+ readonly hidden: false;
6006
+ readonly usage: "[options]";
6007
+ readonly arguments: readonly [];
6008
+ readonly options: readonly [{
6009
+ readonly flags: "--print-fixtures";
6010
+ readonly description: "Write the fixture file JSON to stdout";
6011
+ }];
6012
+ readonly subcommands: readonly [];
6013
+ }];
5987
6014
  }, {
5988
6015
  readonly name: "session";
5989
6016
  readonly description: "Local session-event spool: enqueue (printf-compatible), flush, and live status";
@@ -6753,6 +6780,12 @@ export declare const COMMAND_CATALOG: readonly [{
6753
6780
  }, {
6754
6781
  readonly flags: "--story <id>";
6755
6782
  readonly description: "Re-point story attribution from this message";
6783
+ }, {
6784
+ readonly flags: "--account <id>";
6785
+ readonly description: "Move the lane's session to this account of its provider before the message resumes it";
6786
+ }, {
6787
+ readonly flags: "--model <id>";
6788
+ readonly description: "Model for the moved lane (with --account only)";
6756
6789
  }, {
6757
6790
  readonly flags: "--no-compact";
6758
6791
  readonly description: "Skip the resume-time compaction check for this message";
@@ -6781,6 +6814,12 @@ export declare const COMMAND_CATALOG: readonly [{
6781
6814
  }, {
6782
6815
  readonly flags: "--story <id>";
6783
6816
  readonly description: "Re-point story attribution from this resume";
6817
+ }, {
6818
+ readonly flags: "--account <id>";
6819
+ readonly description: "Move the lane's session to this account of its provider before resuming";
6820
+ }, {
6821
+ readonly flags: "--model <id>";
6822
+ readonly description: "Model for the moved lane (with --account only)";
6784
6823
  }, {
6785
6824
  readonly flags: "--no-compact";
6786
6825
  readonly description: "Skip the resume-time compaction check for this resume";
@@ -2138,6 +2138,14 @@ export const COMMAND_CATALOG = [
2138
2138
  {
2139
2139
  "flags": "--no-open",
2140
2140
  "description": "Print the share-session URL but do not launch the browser"
2141
+ },
2142
+ {
2143
+ "flags": "--channel <name>",
2144
+ "description": "Post the share record to this named channel instead of a DM"
2145
+ },
2146
+ {
2147
+ "flags": "--mention <person>",
2148
+ "description": "Mention a person on the channel share record (repeatable)"
2141
2149
  }
2142
2150
  ],
2143
2151
  "subcommands": []
@@ -7725,6 +7733,32 @@ export const COMMAND_CATALOG = [
7725
7733
  }
7726
7734
  ]
7727
7735
  },
7736
+ {
7737
+ "name": "contract",
7738
+ "description": "Print versioned work-mesh contracts for other repositories",
7739
+ "aliases": [],
7740
+ "hidden": false,
7741
+ "usage": "[options] [command]",
7742
+ "arguments": [],
7743
+ "options": [],
7744
+ "subcommands": [
7745
+ {
7746
+ "name": "preflight",
7747
+ "description": "Offline preflight ContextResult contract (contracts/preflight/v1)",
7748
+ "aliases": [],
7749
+ "hidden": false,
7750
+ "usage": "[options]",
7751
+ "arguments": [],
7752
+ "options": [
7753
+ {
7754
+ "flags": "--print-fixtures",
7755
+ "description": "Write the fixture file JSON to stdout"
7756
+ }
7757
+ ],
7758
+ "subcommands": []
7759
+ }
7760
+ ]
7761
+ },
7728
7762
  {
7729
7763
  "name": "session",
7730
7764
  "description": "Local session-event spool: enqueue (printf-compatible), flush, and live status",
@@ -8729,6 +8763,14 @@ export const COMMAND_CATALOG = [
8729
8763
  "flags": "--story <id>",
8730
8764
  "description": "Re-point story attribution from this message"
8731
8765
  },
8766
+ {
8767
+ "flags": "--account <id>",
8768
+ "description": "Move the lane's session to this account of its provider before the message resumes it"
8769
+ },
8770
+ {
8771
+ "flags": "--model <id>",
8772
+ "description": "Model for the moved lane (with --account only)"
8773
+ },
8732
8774
  {
8733
8775
  "flags": "--no-compact",
8734
8776
  "description": "Skip the resume-time compaction check for this message"
@@ -8766,6 +8808,14 @@ export const COMMAND_CATALOG = [
8766
8808
  "flags": "--story <id>",
8767
8809
  "description": "Re-point story attribution from this resume"
8768
8810
  },
8811
+ {
8812
+ "flags": "--account <id>",
8813
+ "description": "Move the lane's session to this account of its provider before resuming"
8814
+ },
8815
+ {
8816
+ "flags": "--model <id>",
8817
+ "description": "Model for the moved lane (with --account only)"
8818
+ },
8769
8819
  {
8770
8820
  "flags": "--no-compact",
8771
8821
  "description": "Skip the resume-time compaction check for this resume"
@@ -190,6 +190,8 @@ export declare function buildConnectionActionBody(identifier: string, matched: C
190
190
  } | {
191
191
  withEmail: string;
192
192
  };
193
+ /** Fetch the caller's channels (GET /v1/notify/channels). */
194
+ export declare function fetchChannels(token: string): Promise<ChannelSummary[]>;
193
195
  /** One incoming DM as returned by GET /v1/notify/inbox. */
194
196
  export interface DmInboxEvent {
195
197
  eventId: string;
@@ -489,7 +489,7 @@ async function runGroupSend(recipients, message) {
489
489
  }
490
490
  }
491
491
  /** Fetch the caller's channels (GET /v1/notify/channels). */
492
- async function fetchChannels(token) {
492
+ export async function fetchChannels(token) {
493
493
  const res = await vaultApiFetch({ token, path: "/v1/notify/channels" });
494
494
  if (!res.ok) {
495
495
  const err = (await res.json().catch(() => ({})));