wicked-crew 0.7.29 → 0.7.30

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 (97) hide show
  1. package/README.md +4 -1
  2. package/dist/api/chat-scope.d.ts.map +1 -1
  3. package/dist/api/chat-scope.js +5 -1
  4. package/dist/api/chat-scope.js.map +1 -1
  5. package/dist/api/governance-health.d.ts +25 -17
  6. package/dist/api/governance-health.d.ts.map +1 -1
  7. package/dist/api/governance-health.js +40 -9
  8. package/dist/api/governance-health.js.map +1 -1
  9. package/dist/api/routes.d.ts +22 -0
  10. package/dist/api/routes.d.ts.map +1 -1
  11. package/dist/api/routes.js +88 -34
  12. package/dist/api/routes.js.map +1 -1
  13. package/dist/api/seat-health.d.ts +38 -0
  14. package/dist/api/seat-health.d.ts.map +1 -1
  15. package/dist/api/seat-health.js +63 -0
  16. package/dist/api/seat-health.js.map +1 -1
  17. package/dist/api/seat-standing.d.ts +101 -0
  18. package/dist/api/seat-standing.d.ts.map +1 -0
  19. package/dist/api/seat-standing.js +138 -0
  20. package/dist/api/seat-standing.js.map +1 -0
  21. package/dist/api/server.d.ts.map +1 -1
  22. package/dist/api/server.js +17 -0
  23. package/dist/api/server.js.map +1 -1
  24. package/dist/cli/index.js +37 -5
  25. package/dist/cli/index.js.map +1 -1
  26. package/dist/core/adapter.d.ts +10 -0
  27. package/dist/core/adapter.d.ts.map +1 -1
  28. package/dist/core/adapter.js +26 -1
  29. package/dist/core/adapter.js.map +1 -1
  30. package/dist/core/bridge-path.d.ts +21 -0
  31. package/dist/core/bridge-path.d.ts.map +1 -1
  32. package/dist/core/bridge-path.js +37 -0
  33. package/dist/core/bridge-path.js.map +1 -1
  34. package/dist/core/bridge-reaper.d.ts.map +1 -1
  35. package/dist/core/bridge-reaper.js +7 -3
  36. package/dist/core/bridge-reaper.js.map +1 -1
  37. package/dist/core/governance-store.d.ts +22 -0
  38. package/dist/core/governance-store.d.ts.map +1 -1
  39. package/dist/core/governance-store.js +7 -0
  40. package/dist/core/governance-store.js.map +1 -1
  41. package/dist/interactive/bridge-pool.d.ts +29 -24
  42. package/dist/interactive/bridge-pool.d.ts.map +1 -1
  43. package/dist/interactive/bridge-pool.js +65 -3
  44. package/dist/interactive/bridge-pool.js.map +1 -1
  45. package/dist/interactive/chat-events.d.ts.map +1 -1
  46. package/dist/interactive/chat-events.js +5 -2
  47. package/dist/interactive/chat-events.js.map +1 -1
  48. package/dist/interactive/council-outcome.d.ts +28 -0
  49. package/dist/interactive/council-outcome.d.ts.map +1 -0
  50. package/dist/interactive/council-outcome.js +57 -0
  51. package/dist/interactive/council-outcome.js.map +1 -0
  52. package/dist/interactive/demo-events.d.ts.map +1 -1
  53. package/dist/interactive/demo-events.js +5 -2
  54. package/dist/interactive/demo-events.js.map +1 -1
  55. package/dist/interactive/doc-delete-routes.d.ts.map +1 -1
  56. package/dist/interactive/doc-delete-routes.js +3 -2
  57. package/dist/interactive/doc-delete-routes.js.map +1 -1
  58. package/dist/interactive/draft-events.d.ts.map +1 -1
  59. package/dist/interactive/draft-events.js +5 -2
  60. package/dist/interactive/draft-events.js.map +1 -1
  61. package/dist/interactive/edit-events.d.ts.map +1 -1
  62. package/dist/interactive/edit-events.js +5 -2
  63. package/dist/interactive/edit-events.js.map +1 -1
  64. package/dist/projects/auto-refresh.d.ts +54 -0
  65. package/dist/projects/auto-refresh.d.ts.map +1 -0
  66. package/dist/projects/auto-refresh.js +76 -0
  67. package/dist/projects/auto-refresh.js.map +1 -0
  68. package/dist/projects/graph.d.ts +15 -2
  69. package/dist/projects/graph.d.ts.map +1 -1
  70. package/dist/projects/graph.js +18 -8
  71. package/dist/projects/graph.js.map +1 -1
  72. package/dist/projects/routes.d.ts.map +1 -1
  73. package/dist/projects/routes.js +12 -2
  74. package/dist/projects/routes.js.map +1 -1
  75. package/dist/projects/state-home.d.ts +6 -0
  76. package/dist/projects/state-home.d.ts.map +1 -1
  77. package/dist/projects/state-home.js +9 -1
  78. package/dist/projects/state-home.js.map +1 -1
  79. package/dist/skills/guards.d.ts +17 -6
  80. package/dist/skills/guards.d.ts.map +1 -1
  81. package/dist/skills/guards.js +42 -15
  82. package/dist/skills/guards.js.map +1 -1
  83. package/dist/skills/refs.d.ts +181 -17
  84. package/dist/skills/refs.d.ts.map +1 -1
  85. package/dist/skills/refs.js +345 -26
  86. package/dist/skills/refs.js.map +1 -1
  87. package/dist/skills/store.d.ts +22 -1
  88. package/dist/skills/store.d.ts.map +1 -1
  89. package/dist/skills/store.js +161 -23
  90. package/dist/skills/store.js.map +1 -1
  91. package/dist/studio/assets/index-CWUS9Ump.js +542 -0
  92. package/dist/studio/assets/{index-CK1uJWs2.css → index-_ydd-jKd.css} +1 -1
  93. package/dist/studio/index.html +2 -2
  94. package/dist/studio/testid-inventory.json +359 -4
  95. package/endpoint-manifest.json +8 -3
  96. package/package.json +4 -4
  97. package/dist/studio/assets/index-CeJTutxP.js +0 -540
@@ -5,6 +5,36 @@ export type { SeatHealth };
5
5
  export declare const FALLBACK_WINDOW_MS: number;
6
6
  /** Fallbacks within the window that flip a seat inactive. */
7
7
  export declare const FALLBACK_THRESHOLD = 3;
8
+ /**
9
+ * The council BENCH fold (independent review of #533, F-1): `councilSeatFailed { cli, kind }` is the
10
+ * engine's own evidence that a seat cannot hold a ballot — `non_zero_exit` ("Not logged in", "No
11
+ * API key found", "exceeded your monthly quota") or `timed_out` (opencode past the 40 s dispatch
12
+ * budget on the phase-4 rig). Until this fold existed the tracker never read it, so a seat benched
13
+ * in every council kept `health: active` and the roster's `council_eligible` prediction could not
14
+ * learn. The fold is bounded on purpose: only PRIMARY failures count (`benched` is the engine's
15
+ * derivative of an earlier failure, not a new observation), only within {@link COUNCIL_BENCH_WINDOW_MS},
16
+ * and only from {@link COUNCIL_BENCH_THRESHOLD} failures up (one timed-out ballot is weather). It
17
+ * does NOT flip `health` — a chat is not a council and the free tier may still answer — it feeds
18
+ * `council_eligible` through {@link SeatHealthTracker.councilBenchFor}, and an ok unit output clears
19
+ * it like every other recovery.
20
+ */
21
+ export declare const COUNCIL_BENCH_WINDOW_MS: number;
22
+ export declare const COUNCIL_BENCH_THRESHOLD = 2;
23
+ /** The `councilSeatFailed.kind` values that are the seat's OWN failure (the engine's `benched` is derivative). */
24
+ export declare const COUNCIL_PRIMARY_FAILURE_KINDS: ReadonlySet<string>;
25
+ /** What the roster carries as `council_bench` when a seat is benched by this daemon's recent evidence. */
26
+ export interface CouncilBench {
27
+ /** Primary ballot failures inside the window. */
28
+ failures: number;
29
+ last_kind: string;
30
+ /** ISO-8601 of the last failure. */
31
+ last_at: string;
32
+ /** The run the last failure happened in, when the frame named one. */
33
+ last_run?: string;
34
+ /** A bounded excerpt of the last failure's detail / stderr, when there was one. */
35
+ last_detail?: string;
36
+ window_ms: number;
37
+ }
8
38
  /**
9
39
  * In-memory per-seat health, folded from live CoreEvents. In-memory ON PURPOSE: health is a
10
40
  * statement about the running platform's ability to reach a CLI right now — a daemon restart
@@ -18,6 +48,8 @@ export declare class SeatHealthTracker {
18
48
  private readonly assignments;
19
49
  /** cli key → recent failure-fallback timestamps (epoch ms), pruned to the rolling window. */
20
50
  private readonly fallbacks;
51
+ /** cli key → primary council ballot failures inside {@link COUNCIL_BENCH_WINDOW_MS}. */
52
+ private readonly councilFailures;
21
53
  /** Default `since` for seats that have never changed state. */
22
54
  private readonly startedAt;
23
55
  constructor(opts?: {
@@ -33,6 +65,12 @@ export declare class SeatHealthTracker {
33
65
  ingest(event: CoreEvent): void;
34
66
  /** Flip a seat ACTIVE: message cleared, `since` updated on a genuine transition. */
35
67
  markActive(key: string, atMs?: number): void;
68
+ /**
69
+ * The seat's council bench from THIS daemon's recent evidence, or `null`: fewer than
70
+ * {@link COUNCIL_BENCH_THRESHOLD} primary ballot failures inside {@link COUNCIL_BENCH_WINDOW_MS}
71
+ * (older ones have aged out), or an ok output since.
72
+ */
73
+ councilBenchFor(key: string, nowMs?: number): CouncilBench | null;
36
74
  /** Flip a seat INACTIVE with the error excerpt; `since` survives while already inactive. */
37
75
  markInactive(key: string, message: string, atMs?: number): void;
38
76
  /** The seat's health — a seat never seen in an event is ACTIVE with no message (the default). */
@@ -1 +1 @@
1
- {"version":3,"file":"seat-health.d.ts","sourceRoot":"","sources":["../../src/api/seat-health.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EACL,eAAe,EAEhB,MAAM,8BAA8B,CAAC;AAGtC,YAAY,EAAE,UAAU,EAAE,CAAC;AAE3B,wDAAwD;AACxD,eAAO,MAAM,kBAAkB,QAAiB,CAAC;AACjD,6DAA6D;AAC7D,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAoCpC;;;;;GAKG;AACH,qBAAa,iBAAiB;IAShB,OAAO,CAAC,QAAQ,CAAC,IAAI;IARjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,oGAAoG;IACpG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,6FAA6F;IAC7F,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+B;IACzD,+DAA+D;IAC/D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4B;gBAEzB,IAAI,GAAE;QACjC;;;WAGG;QACH,SAAS,CAAC,EAAE,eAAe,CAAC;QAC5B,wEAAwE;QACxE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;KACtB;IAEN,4FAA4F;IAC5F,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAgI9B,oFAAoF;IACpF,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,SAAa,GAAG,IAAI;IAUhD,4FAA4F;IAC5F,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,SAAa,GAAG,IAAI;IAWnE,iGAAiG;IACjG,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU;CAGnC"}
1
+ {"version":3,"file":"seat-health.d.ts","sourceRoot":"","sources":["../../src/api/seat-health.ts"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EACL,eAAe,EAEhB,MAAM,8BAA8B,CAAC;AAGtC,YAAY,EAAE,UAAU,EAAE,CAAC;AAE3B,wDAAwD;AACxD,eAAO,MAAM,kBAAkB,QAAiB,CAAC;AACjD,6DAA6D;AAC7D,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,uBAAuB,QAAiB,CAAC;AACtD,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,kHAAkH;AAClH,eAAO,MAAM,6BAA6B,EAAE,WAAW,CAAC,MAAM,CAA2C,CAAC;AAU1G,0GAA0G;AAC1G,MAAM,WAAW,YAAY;IAC3B,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mFAAmF;IACnF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAoCD;;;;;GAKG;AACH,qBAAa,iBAAiB;IAWhB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAVjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,oGAAoG;IACpG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,6FAA6F;IAC7F,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+B;IACzD,wFAAwF;IACxF,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAuC;IACvE,+DAA+D;IAC/D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4B;gBAEzB,IAAI,GAAE;QACjC;;;WAGG;QACH,SAAS,CAAC,EAAE,eAAe,CAAC;QAC5B,wEAAwE;QACxE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;KACtB;IAEN,4FAA4F;IAC5F,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAkJ9B,oFAAoF;IACpF,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,SAAa,GAAG,IAAI;IAWhD;;;;OAIG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAa,GAAG,YAAY,GAAG,IAAI;IAmBrE,4FAA4F;IAC5F,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,SAAa,GAAG,IAAI;IAWnE,iGAAiG;IACjG,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU;CAGnC"}
@@ -40,6 +40,23 @@ import { triageDeliverFailure } from '../core/deliver-triage.js';
40
40
  export const FALLBACK_WINDOW_MS = 10 * 60 * 1000;
41
41
  /** Fallbacks within the window that flip a seat inactive. */
42
42
  export const FALLBACK_THRESHOLD = 3;
43
+ /**
44
+ * The council BENCH fold (independent review of #533, F-1): `councilSeatFailed { cli, kind }` is the
45
+ * engine's own evidence that a seat cannot hold a ballot — `non_zero_exit` ("Not logged in", "No
46
+ * API key found", "exceeded your monthly quota") or `timed_out` (opencode past the 40 s dispatch
47
+ * budget on the phase-4 rig). Until this fold existed the tracker never read it, so a seat benched
48
+ * in every council kept `health: active` and the roster's `council_eligible` prediction could not
49
+ * learn. The fold is bounded on purpose: only PRIMARY failures count (`benched` is the engine's
50
+ * derivative of an earlier failure, not a new observation), only within {@link COUNCIL_BENCH_WINDOW_MS},
51
+ * and only from {@link COUNCIL_BENCH_THRESHOLD} failures up (one timed-out ballot is weather). It
52
+ * does NOT flip `health` — a chat is not a council and the free tier may still answer — it feeds
53
+ * `council_eligible` through {@link SeatHealthTracker.councilBenchFor}, and an ok unit output clears
54
+ * it like every other recovery.
55
+ */
56
+ export const COUNCIL_BENCH_WINDOW_MS = 30 * 60 * 1000;
57
+ export const COUNCIL_BENCH_THRESHOLD = 2;
58
+ /** The `councilSeatFailed.kind` values that are the seat's OWN failure (the engine's `benched` is derivative). */
59
+ export const COUNCIL_PRIMARY_FAILURE_KINDS = new Set(['non_zero_exit', 'timed_out']);
43
60
  /** Health messages are operator-facing chips, not transcripts — bound them hard. */
44
61
  const EXCERPT_MAX = 240;
45
62
  function excerpt(s) {
@@ -81,6 +98,8 @@ export class SeatHealthTracker {
81
98
  assignments = new Map();
82
99
  /** cli key → recent failure-fallback timestamps (epoch ms), pruned to the rolling window. */
83
100
  fallbacks = new Map();
101
+ /** cli key → primary council ballot failures inside {@link COUNCIL_BENCH_WINDOW_MS}. */
102
+ councilFailures = new Map();
84
103
  /** Default `since` for seats that have never changed state. */
85
104
  startedAt = new Date().toISOString();
86
105
  constructor(opts = {}) {
@@ -150,6 +169,25 @@ export class SeatHealthTracker {
150
169
  }
151
170
  return;
152
171
  }
172
+ case 'councilSeatFailed': {
173
+ const cli = str(event.cli);
174
+ const kind = str(event.kind);
175
+ if (cli === undefined || kind === undefined || !COUNCIL_PRIMARY_FAILURE_KINDS.has(kind))
176
+ return;
177
+ const detail = str(event.detail) ?? str(event.stderr) ?? '';
178
+ const fresh = (this.councilFailures.get(cli) ?? []).filter((f) => at - f.at < COUNCIL_BENCH_WINDOW_MS);
179
+ fresh.push({ at, kind, detail: excerpt(detail), session });
180
+ this.councilFailures.set(cli, fresh);
181
+ // An observed error — stamped, never a status flip (see COUNCIL_BENCH_WINDOW_MS).
182
+ const prev = this.entries.get(cli);
183
+ this.entries.set(cli, {
184
+ status: prev?.status ?? 'active',
185
+ ...(prev?.message !== undefined ? { message: prev.message } : {}),
186
+ since: prev?.since ?? this.startedAt,
187
+ lastErrorAt: new Date(at).toISOString(),
188
+ });
189
+ return;
190
+ }
153
191
  case 'acpFallback': {
154
192
  const cliKey = str(event.cliKey);
155
193
  const fallbackKind = str(event.fallbackKind);
@@ -221,6 +259,31 @@ export class SeatHealthTracker {
221
259
  ...(prev?.lastErrorAt !== undefined ? { lastErrorAt: prev.lastErrorAt } : {}),
222
260
  });
223
261
  this.fallbacks.delete(key); // an ok output resets the repeated-fallback window too
262
+ this.councilFailures.delete(key); // …and the council bench: real work is the recovery
263
+ }
264
+ /**
265
+ * The seat's council bench from THIS daemon's recent evidence, or `null`: fewer than
266
+ * {@link COUNCIL_BENCH_THRESHOLD} primary ballot failures inside {@link COUNCIL_BENCH_WINDOW_MS}
267
+ * (older ones have aged out), or an ok output since.
268
+ */
269
+ councilBenchFor(key, nowMs = Date.now()) {
270
+ const fresh = (this.councilFailures.get(key) ?? []).filter((f) => nowMs - f.at < COUNCIL_BENCH_WINDOW_MS);
271
+ if (fresh.length === 0) {
272
+ this.councilFailures.delete(key);
273
+ return null;
274
+ }
275
+ this.councilFailures.set(key, fresh);
276
+ if (fresh.length < COUNCIL_BENCH_THRESHOLD)
277
+ return null;
278
+ const last = fresh[fresh.length - 1];
279
+ return {
280
+ failures: fresh.length,
281
+ last_kind: last.kind,
282
+ last_at: new Date(last.at).toISOString(),
283
+ ...(last.session !== undefined ? { last_run: last.session } : {}),
284
+ ...(last.detail !== '' ? { last_detail: last.detail } : {}),
285
+ window_ms: COUNCIL_BENCH_WINDOW_MS,
286
+ };
224
287
  }
225
288
  /** Flip a seat INACTIVE with the error excerpt; `since` survives while already inactive. */
226
289
  markInactive(key, message, atMs = Date.now()) {
@@ -1 +1 @@
1
- {"version":3,"file":"seat-health.js","sourceRoot":"","sources":["../../src/api/seat-health.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"seat-health.js","sourceRoot":"","sources":["../../src/api/seat-health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Seat STANDING — what the daemon can say about a roster seat's usability from what it already
3
+ * knows, so the roster and the chat admission read the SAME predicate (F-2R2-009, F-2R2-007).
4
+ *
5
+ * # The defect
6
+ *
7
+ * `GET /roster` carried `signed_in: false` for four seats and the Health rail rendered every one
8
+ * of them as "active · signed out" with a green tick. Two of those seats mean two different
9
+ * things by "signed out": codex / pi / copilot bench on their first ballot (`non_zero_exit`: "No
10
+ * API key found", "exceeded your monthly quota"), while opencode ANSWERED a scoped chat on its
11
+ * free tier (OpenCode Zen, no account). One word, two outcomes, and nothing on the wire to tell
12
+ * them apart — and `POST /chats` seated its defaults through a third, unrelated filter.
13
+ *
14
+ * # The model
15
+ *
16
+ * - `auth` — the sign-in probe's three values re-read against the seat's free-tier capability:
17
+ * `signed_in` (a credential artifact is observable), `signed_out` (none is, and the seat needs
18
+ * one to answer), `not_required` (none is, but the seat answers unauthenticated on a free tier
19
+ * — see {@link FREE_TIER_SEATS}), `unknown` (the probe cannot tell cheaply: keychain-backed
20
+ * seats, seat keys with no rule).
21
+ * - `council_eligible` — whether a council would seat and keep this seat as far as the daemon
22
+ * can tell: enabled for council, runtime health `active`, and `auth` not `signed_out`. A
23
+ * PREDICTION from the daemon's own records, not the engine's verdict — the engine convenes
24
+ * whatever roster it is handed and benches a seat only after it fails (F-4R2-007). `unknown`
25
+ * auth is eligible: refusing a seat the daemon cannot read would bench working keychain seats.
26
+ * - chat admission ({@link chatSeatAdmission}) — the seats a chat seats BY DEFAULT: the same
27
+ * auth predicate (a `signed_out` seat is refused up front with the reason, instead of failing
28
+ * its first turn), plus the engine's scope rule restated (a SCOPED chat holds only a seat whose
29
+ * ACP adapter asks permissions or whose record arms the kernel write floor). Every refusal
30
+ * carries every reason that applies, so the thread can say WHY a seat is missing.
31
+ *
32
+ * Pure, synchronous, no IO: the probe result and the health record are inputs.
33
+ */
34
+ import type { CouncilBench, SeatHealth } from './seat-health.js';
35
+ /** The seat's auth state, read for what it MEANS for the seat's usability. */
36
+ export type SeatAuth = 'signed_in' | 'signed_out' | 'not_required' | 'unknown';
37
+ /**
38
+ * Seats known to answer with NO credential at all — a free tier the CLI selects by itself when no
39
+ * provider is configured. A CREW-SIDE HEURISTIC, keyed by roster `key` (independent review of #533,
40
+ * F-1): the CLI registry declares no credential requirement today (`AgenticCli` has none;
41
+ * `AcpConfig.auth_method` is the ACP transport's auth, `None` for every built-in), so the daemon
42
+ * cannot read this off the record and says so on the wire (`free_tier_source: 'crew-heuristic'`).
43
+ * The day the `[cli]` record carries `credential = "optional"` (wicked-core follow-up), {@link seatAuth}
44
+ * reads the record first and reports `free_tier_source: 'registry'` — this table is the fallback.
45
+ * opencode runs its free "OpenCode Zen" models (`big-pickle` and friends) with no account, which is
46
+ * exactly what the fresh-rig chat exercised (F-2R2-009).
47
+ */
48
+ export declare const FREE_TIER_SEATS: Readonly<Record<string, string>>;
49
+ /** Where a `not_required` reading came from: the CLI's registry record, or crew's own table. */
50
+ export type FreeTierSource = 'registry' | 'crew-heuristic';
51
+ /** The auth reading for one seat: the probe's answer, re-read against the seat's credential requirement. */
52
+ export declare function seatAuth(seat: StandingSeat, signedIn: boolean | null): {
53
+ auth: SeatAuth;
54
+ free_tier?: string;
55
+ free_tier_source?: FreeTierSource;
56
+ };
57
+ /** The roster fields standing reads. Structural, so both the wire seat and a test stub satisfy it. */
58
+ export interface StandingSeat {
59
+ key: string;
60
+ enabled_for_council?: boolean;
61
+ acp?: {
62
+ acp_input_governance?: boolean;
63
+ os_sandbox?: boolean;
64
+ } | null;
65
+ /** A registry-declared credential requirement, when the engine's record carries one (future core). */
66
+ credential?: 'required' | 'optional' | string;
67
+ /** A registry-declared free-tier label, when the record carries one (future core). */
68
+ free_tier?: string;
69
+ }
70
+ export interface SeatStanding {
71
+ auth: SeatAuth;
72
+ /** Present when `auth` is `not_required`: the free tier the seat answers on. */
73
+ free_tier?: string;
74
+ /** Present with `free_tier`: whether the CLI registry declared it, or crew's own table did. */
75
+ free_tier_source?: FreeTierSource;
76
+ council_eligible: boolean;
77
+ /** Present when `council_eligible` is false: the one reason, in the operator's words. */
78
+ council_ineligible_reason?: string;
79
+ /** Present when THIS daemon's recent councils benched the seat (`SeatHealthTracker.councilBenchFor`). */
80
+ council_bench?: CouncilBench;
81
+ }
82
+ /** A seat whose `auth` lets it take a turn — the ONE predicate the roster and the chat share. */
83
+ export declare function authUsable(auth: SeatAuth): boolean;
84
+ export declare function seatStanding(seat: StandingSeat, signedIn: boolean | null, health: SeatHealth, bench?: CouncilBench | null): SeatStanding;
85
+ export type ChatAdmission = {
86
+ ok: true;
87
+ } | {
88
+ ok: false;
89
+ reason: string;
90
+ };
91
+ /**
92
+ * Whether a chat seats this seat BY DEFAULT — the seat's own auth standing plus, for a SCOPED chat,
93
+ * the engine's admission rule (`acp_runner.rs` `scoped_seat_admission`) restated so a refused seat
94
+ * is named with its reason instead of silently absent (F-2R2-007). Explicitly requested seats
95
+ * (`clis`) bypass this: the engine refuses them per seat, and its reason rides on the outcome.
96
+ * Takes the seat's `auth` only (independent review of #533, F-4): a chat is not a council, so
97
+ * `council_eligible` / health are deliberately NOT consulted here — a seat benched in councils can
98
+ * still answer a chat, and saying otherwise would refuse a working seat.
99
+ */
100
+ export declare function chatSeatAdmission(seat: StandingSeat, auth: SeatAuth, scoped: boolean): ChatAdmission;
101
+ //# sourceMappingURL=seat-standing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seat-standing.d.ts","sourceRoot":"","sources":["../../src/api/seat-standing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEjE,8EAA8E;AAC9E,MAAM,MAAM,QAAQ,GAAG,WAAW,GAAG,YAAY,GAAG,cAAc,GAAG,SAAS,CAAC;AAE/E;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAE3D,CAAC;AAEH,gGAAgG;AAChG,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,gBAAgB,CAAC;AAE3D,4GAA4G;AAC5G,wBAAgB,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,cAAc,CAAA;CAAE,CAgBhJ;AAED,sGAAsG;AACtG,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,GAAG,CAAC,EAAE;QAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACtE,sGAAsG;IACtG,UAAU,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC;IAC9C,sFAAsF;IACtF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,CAAC;IACf,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+FAA+F;IAC/F,gBAAgB,CAAC,EAAE,cAAc,CAAC;IAClC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,yFAAyF;IACzF,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,yGAAyG;IACzG,aAAa,CAAC,EAAE,YAAY,CAAC;CAC9B;AAED,iGAAiG;AACjG,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAElD;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,OAAO,GAAG,IAAI,EACxB,MAAM,EAAE,UAAU,EAClB,KAAK,GAAE,YAAY,GAAG,IAAW,GAChC,YAAY,CAyCd;AAED,MAAM,MAAM,aAAa,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzE;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAG,aAAa,CAiBpG"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Seat STANDING — what the daemon can say about a roster seat's usability from what it already
3
+ * knows, so the roster and the chat admission read the SAME predicate (F-2R2-009, F-2R2-007).
4
+ *
5
+ * # The defect
6
+ *
7
+ * `GET /roster` carried `signed_in: false` for four seats and the Health rail rendered every one
8
+ * of them as "active · signed out" with a green tick. Two of those seats mean two different
9
+ * things by "signed out": codex / pi / copilot bench on their first ballot (`non_zero_exit`: "No
10
+ * API key found", "exceeded your monthly quota"), while opencode ANSWERED a scoped chat on its
11
+ * free tier (OpenCode Zen, no account). One word, two outcomes, and nothing on the wire to tell
12
+ * them apart — and `POST /chats` seated its defaults through a third, unrelated filter.
13
+ *
14
+ * # The model
15
+ *
16
+ * - `auth` — the sign-in probe's three values re-read against the seat's free-tier capability:
17
+ * `signed_in` (a credential artifact is observable), `signed_out` (none is, and the seat needs
18
+ * one to answer), `not_required` (none is, but the seat answers unauthenticated on a free tier
19
+ * — see {@link FREE_TIER_SEATS}), `unknown` (the probe cannot tell cheaply: keychain-backed
20
+ * seats, seat keys with no rule).
21
+ * - `council_eligible` — whether a council would seat and keep this seat as far as the daemon
22
+ * can tell: enabled for council, runtime health `active`, and `auth` not `signed_out`. A
23
+ * PREDICTION from the daemon's own records, not the engine's verdict — the engine convenes
24
+ * whatever roster it is handed and benches a seat only after it fails (F-4R2-007). `unknown`
25
+ * auth is eligible: refusing a seat the daemon cannot read would bench working keychain seats.
26
+ * - chat admission ({@link chatSeatAdmission}) — the seats a chat seats BY DEFAULT: the same
27
+ * auth predicate (a `signed_out` seat is refused up front with the reason, instead of failing
28
+ * its first turn), plus the engine's scope rule restated (a SCOPED chat holds only a seat whose
29
+ * ACP adapter asks permissions or whose record arms the kernel write floor). Every refusal
30
+ * carries every reason that applies, so the thread can say WHY a seat is missing.
31
+ *
32
+ * Pure, synchronous, no IO: the probe result and the health record are inputs.
33
+ */
34
+ /**
35
+ * Seats known to answer with NO credential at all — a free tier the CLI selects by itself when no
36
+ * provider is configured. A CREW-SIDE HEURISTIC, keyed by roster `key` (independent review of #533,
37
+ * F-1): the CLI registry declares no credential requirement today (`AgenticCli` has none;
38
+ * `AcpConfig.auth_method` is the ACP transport's auth, `None` for every built-in), so the daemon
39
+ * cannot read this off the record and says so on the wire (`free_tier_source: 'crew-heuristic'`).
40
+ * The day the `[cli]` record carries `credential = "optional"` (wicked-core follow-up), {@link seatAuth}
41
+ * reads the record first and reports `free_tier_source: 'registry'` — this table is the fallback.
42
+ * opencode runs its free "OpenCode Zen" models (`big-pickle` and friends) with no account, which is
43
+ * exactly what the fresh-rig chat exercised (F-2R2-009).
44
+ */
45
+ export const FREE_TIER_SEATS = Object.freeze({
46
+ opencode: 'OpenCode Zen free models (no account needed)',
47
+ });
48
+ /** The auth reading for one seat: the probe's answer, re-read against the seat's credential requirement. */
49
+ export function seatAuth(seat, signedIn) {
50
+ if (signedIn === true)
51
+ return { auth: 'signed_in' };
52
+ if (signedIn === null)
53
+ return { auth: 'unknown' };
54
+ // The registry record wins when it declares the requirement (forward-compatible with the core
55
+ // follow-up: `credential: "optional"` + an optional `free_tier` label on the `[cli]` record).
56
+ if (seat.credential === 'optional') {
57
+ return {
58
+ auth: 'not_required',
59
+ free_tier: typeof seat.free_tier === 'string' && seat.free_tier !== '' ? seat.free_tier : 'free tier declared by the CLI registry',
60
+ free_tier_source: 'registry',
61
+ };
62
+ }
63
+ if (seat.credential === undefined && Object.hasOwn(FREE_TIER_SEATS, seat.key)) {
64
+ return { auth: 'not_required', free_tier: FREE_TIER_SEATS[seat.key], free_tier_source: 'crew-heuristic' };
65
+ }
66
+ return { auth: 'signed_out' };
67
+ }
68
+ /** A seat whose `auth` lets it take a turn — the ONE predicate the roster and the chat share. */
69
+ export function authUsable(auth) {
70
+ return auth !== 'signed_out';
71
+ }
72
+ export function seatStanding(seat, signedIn, health, bench = null) {
73
+ const read = seatAuth(seat, signedIn);
74
+ const auth = read.auth;
75
+ const base = {
76
+ ...read,
77
+ council_eligible: true,
78
+ };
79
+ if (seat.enabled_for_council === false) {
80
+ return { ...base, council_eligible: false, council_ineligible_reason: 'not enabled for council' };
81
+ }
82
+ if (!authUsable(auth)) {
83
+ return {
84
+ ...base,
85
+ council_eligible: false,
86
+ council_ineligible_reason: 'signed out — a council would bench this seat on its first ballot; sign it in from the System page',
87
+ };
88
+ }
89
+ if (health.status === 'inactive') {
90
+ return {
91
+ ...base,
92
+ council_eligible: false,
93
+ council_ineligible_reason: `inactive after a seat-level error${health.message !== undefined ? `: ${health.message}` : ''}`,
94
+ };
95
+ }
96
+ if (bench !== null) {
97
+ // The engine's own evidence, from THIS daemon's recent runs (independent review of #533, F-1):
98
+ // a seat that failed its ballots is benched whatever its auth reading says — the free tier
99
+ // that answers a chat can still time out a 40 s dispatch budget.
100
+ const minutes = Math.max(1, Math.round(bench.window_ms / 60_000));
101
+ return {
102
+ ...base,
103
+ council_eligible: false,
104
+ council_ineligible_reason: `benched by this daemon's recent councils: ${bench.failures} ballot failures in the last ${minutes} min — ` +
105
+ `last ${bench.last_kind}${bench.last_run !== undefined ? ` on run ${bench.last_run.slice(0, 8)}` : ''}` +
106
+ `${bench.last_detail !== undefined ? ` (${bench.last_detail})` : ''}; an ok unit output clears it`,
107
+ council_bench: bench,
108
+ };
109
+ }
110
+ return base;
111
+ }
112
+ /**
113
+ * Whether a chat seats this seat BY DEFAULT — the seat's own auth standing plus, for a SCOPED chat,
114
+ * the engine's admission rule (`acp_runner.rs` `scoped_seat_admission`) restated so a refused seat
115
+ * is named with its reason instead of silently absent (F-2R2-007). Explicitly requested seats
116
+ * (`clis`) bypass this: the engine refuses them per seat, and its reason rides on the outcome.
117
+ * Takes the seat's `auth` only (independent review of #533, F-4): a chat is not a council, so
118
+ * `council_eligible` / health are deliberately NOT consulted here — a seat benched in councils can
119
+ * still answer a chat, and saying otherwise would refuse a working seat.
120
+ */
121
+ export function chatSeatAdmission(seat, auth, scoped) {
122
+ const reasons = [];
123
+ if (!authUsable(auth)) {
124
+ reasons.push('signed out — it cannot take a turn until it is signed in from the System page');
125
+ }
126
+ if (scoped) {
127
+ const acp = seat.acp ?? undefined;
128
+ if (acp === undefined) {
129
+ reasons.push('it has no ACP adapter registered, and a scoped chat holds only ACP-governed seats');
130
+ }
131
+ else if (acp.acp_input_governance !== true && acp.os_sandbox !== true) {
132
+ reasons.push('its ACP adapter asks no permissions and its record arms no OS sandbox, so a scoped chat ' +
133
+ 'could not hold the repositories read-only for it (open the chat unscoped to include it)');
134
+ }
135
+ }
136
+ return reasons.length === 0 ? { ok: true } : { ok: false, reason: reasons.join('; ') };
137
+ }
138
+ //# sourceMappingURL=seat-standing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seat-standing.js","sourceRoot":"","sources":["../../src/api/seat-standing.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"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"}
@@ -47,6 +47,7 @@ import { resolveSkillsRoot, SkillsStore } from '../skills/store.js';
47
47
  import { uvSyncBaseline } from '../skills/venv.js';
48
48
  import { DEFAULT_WORKER_STALL_ESCALATE_MINUTES, DEFAULT_WORKER_STALL_MINUTES, } from '../core/types.js';
49
49
  import { daemonSignalLog } from '../core/daemon-signal-log.js';
50
+ import { refreshProjectGraphsAfterOnboarding } from '../projects/auto-refresh.js';
50
51
  // Allow the studio (a separate localhost origin, e.g. :4200) to call the
51
52
  // daemon's REST API. Restricted to loopback origins — the daemon only binds
52
53
  // 127.0.0.1, so this never widens exposure beyond the local machine.
@@ -677,6 +678,19 @@ export async function createServer(adapter, options) {
677
678
  session !== undefined) {
678
679
  void resolveRunDelivery(session).then(() => deliveryCache.warm(session));
679
680
  }
681
+ // A completed ONBOARDING run refreshes the project graph(s) its repo belongs to (F-2R2-008):
682
+ // bounded (plain refresh — unchanged members skip; one project at a time; at most two rounds),
683
+ // off the hot path, logged. Only runs THIS daemon launched are known here, by design.
684
+ if (event.type === 'sessionCompleted' && session !== undefined) {
685
+ const onboardedRepo = adapter.onboardedRepoOf(session);
686
+ if (onboardedRepo !== undefined) {
687
+ void refreshProjectGraphsAfterOnboarding(adapter, onboardedRepo, {
688
+ log: (m) => app.log.info(m),
689
+ }).catch((err) => {
690
+ app.log.warn(`[projects] auto-refresh after onboarding ${onboardedRepo} failed: ${err instanceof Error ? err.message : String(err)}`);
691
+ });
692
+ }
693
+ }
680
694
  // The foundation record's evidence pointer (§3.2 row 3): a project-bound run that completes
681
695
  // gets its run-scope pointer written, best-effort, off the hot path.
682
696
  if (event.type === 'sessionCompleted' && session !== undefined && projectId !== undefined) {
@@ -809,6 +823,9 @@ export async function createServer(adapter, options) {
809
823
  interactiveBridgeBusDataDir: options?.interactiveBridge?.busDataDir ?? null,
810
824
  docGrounding,
811
825
  ...(skillsRuntime !== undefined ? { skills: skillsRuntime } : {}),
826
+ // Routes that say something to the thread (a refused chat seat, F-2R2-007) emit through the
827
+ // SAME /ws fan-out the engine's frames take.
828
+ broadcast: (frame) => broadcast(frame),
812
829
  });
813
830
  // The UI-emittable direction of the interactive seam. Registered unconditionally (a null relay
814
831
  // answers 503, not 404) and BEFORE the static/SPA fallback below, like every other API route.