wicked-crew 0.9.13 → 0.10.1

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 (111) hide show
  1. package/dist/api/job-title.d.ts +24 -0
  2. package/dist/api/job-title.d.ts.map +1 -0
  3. package/dist/api/job-title.js +97 -0
  4. package/dist/api/job-title.js.map +1 -0
  5. package/dist/api/mcp.d.ts +26 -6
  6. package/dist/api/mcp.d.ts.map +1 -1
  7. package/dist/api/mcp.js +87 -10
  8. package/dist/api/mcp.js.map +1 -1
  9. package/dist/api/roster-standing.d.ts +27 -1
  10. package/dist/api/roster-standing.d.ts.map +1 -1
  11. package/dist/api/roster-standing.js +126 -10
  12. package/dist/api/roster-standing.js.map +1 -1
  13. package/dist/api/routes.d.ts.map +1 -1
  14. package/dist/api/routes.js +60 -13
  15. package/dist/api/routes.js.map +1 -1
  16. package/dist/api/run-timing-index.d.ts +23 -1
  17. package/dist/api/run-timing-index.d.ts.map +1 -1
  18. package/dist/api/run-timing-index.js +66 -1
  19. package/dist/api/run-timing-index.js.map +1 -1
  20. package/dist/api/seat-agents.d.ts +135 -0
  21. package/dist/api/seat-agents.d.ts.map +1 -0
  22. package/dist/api/seat-agents.js +186 -0
  23. package/dist/api/seat-agents.js.map +1 -0
  24. package/dist/api/seat-health.d.ts +22 -0
  25. package/dist/api/seat-health.d.ts.map +1 -1
  26. package/dist/api/seat-health.js +53 -6
  27. package/dist/api/seat-health.js.map +1 -1
  28. package/dist/api/seat-probe.d.ts +11 -2
  29. package/dist/api/seat-probe.d.ts.map +1 -1
  30. package/dist/api/seat-probe.js +28 -9
  31. package/dist/api/seat-probe.js.map +1 -1
  32. package/dist/api/seat-record.d.ts +1 -1
  33. package/dist/api/seat-record.js +1 -1
  34. package/dist/api/seat-scrub.d.ts +65 -0
  35. package/dist/api/seat-scrub.d.ts.map +1 -0
  36. package/dist/api/seat-scrub.js +193 -0
  37. package/dist/api/seat-scrub.js.map +1 -0
  38. package/dist/api/seat-standing.d.ts +3 -2
  39. package/dist/api/seat-standing.d.ts.map +1 -1
  40. package/dist/api/seat-standing.js +8 -7
  41. package/dist/api/seat-standing.js.map +1 -1
  42. package/dist/api/seat-version.d.ts +81 -0
  43. package/dist/api/seat-version.d.ts.map +1 -0
  44. package/dist/api/seat-version.js +174 -0
  45. package/dist/api/seat-version.js.map +1 -0
  46. package/dist/api/server.js +2 -2
  47. package/dist/api/server.js.map +1 -1
  48. package/dist/core/adapter.d.ts +12 -0
  49. package/dist/core/adapter.d.ts.map +1 -1
  50. package/dist/core/adapter.js +25 -0
  51. package/dist/core/adapter.js.map +1 -1
  52. package/dist/core/engine-roster.d.ts.map +1 -1
  53. package/dist/core/engine-roster.js +8 -0
  54. package/dist/core/engine-roster.js.map +1 -1
  55. package/dist/editors/registry.d.ts +13 -13
  56. package/dist/editors/registry.d.ts.map +1 -1
  57. package/dist/editors/registry.js +1 -0
  58. package/dist/editors/registry.js.map +1 -1
  59. package/dist/editors/routes.d.ts +19 -1
  60. package/dist/editors/routes.d.ts.map +1 -1
  61. package/dist/editors/routes.js +85 -7
  62. package/dist/editors/routes.js.map +1 -1
  63. package/dist/interactive/council-outcome.js +1 -1
  64. package/dist/mcp/broker.d.ts.map +1 -1
  65. package/dist/mcp/broker.js +17 -0
  66. package/dist/mcp/broker.js.map +1 -1
  67. package/dist/mcp/classify.d.ts +12 -2
  68. package/dist/mcp/classify.d.ts.map +1 -1
  69. package/dist/mcp/classify.js +5 -2
  70. package/dist/mcp/classify.js.map +1 -1
  71. package/dist/mcp/policies.d.ts +10 -1
  72. package/dist/mcp/policies.d.ts.map +1 -1
  73. package/dist/mcp/policies.js +16 -4
  74. package/dist/mcp/policies.js.map +1 -1
  75. package/dist/mcp/probe.d.ts +2 -0
  76. package/dist/mcp/probe.d.ts.map +1 -1
  77. package/dist/mcp/probe.js.map +1 -1
  78. package/dist/mcp/registry-store.d.ts +6 -0
  79. package/dist/mcp/registry-store.d.ts.map +1 -1
  80. package/dist/mcp/registry-store.js.map +1 -1
  81. package/dist/mcp/registry.d.ts +83 -7
  82. package/dist/mcp/registry.d.ts.map +1 -1
  83. package/dist/mcp/registry.js +213 -24
  84. package/dist/mcp/registry.js.map +1 -1
  85. package/dist/mcp/rest.d.ts +29 -2
  86. package/dist/mcp/rest.d.ts.map +1 -1
  87. package/dist/mcp/rest.js +123 -2
  88. package/dist/mcp/rest.js.map +1 -1
  89. package/dist/mcp-inspect/routes.d.ts +55 -0
  90. package/dist/mcp-inspect/routes.d.ts.map +1 -0
  91. package/dist/mcp-inspect/routes.js +268 -0
  92. package/dist/mcp-inspect/routes.js.map +1 -0
  93. package/dist/mcp-inspect/session.d.ts +153 -0
  94. package/dist/mcp-inspect/session.d.ts.map +1 -0
  95. package/dist/mcp-inspect/session.js +487 -0
  96. package/dist/mcp-inspect/session.js.map +1 -0
  97. package/dist/projects/state-home.d.ts +2 -1
  98. package/dist/projects/state-home.d.ts.map +1 -1
  99. package/dist/projects/state-home.js +34 -4
  100. package/dist/projects/state-home.js.map +1 -1
  101. package/dist/standing-orders/parse.js +1 -1
  102. package/dist/studio/assets/index-C6DLorst.css +32 -0
  103. package/dist/studio/assets/index-CAhuFWeA.js +609 -0
  104. package/dist/studio/editors/wicked-page/editor.json +1 -1
  105. package/dist/studio/editors/wicked-page/index.html +1 -1
  106. package/dist/studio/index.html +2 -2
  107. package/dist/studio/testid-inventory.json +553 -144
  108. package/endpoint-manifest.json +61 -15
  109. package/package.json +3 -3
  110. package/dist/studio/assets/index-DlZl1q2Q.js +0 -593
  111. package/dist/studio/assets/index-eLCOoPWX.css +0 -32
@@ -15,11 +15,18 @@
15
15
  * only lag by a failed hydrate, never diverge silently.
16
16
  */
17
17
  import type { AuditLog } from './audit.js';
18
- import type { Actor, AuditEntry } from '../core/types.js';
18
+ import type { Actor, AuditEntry, RecordedEvent, SessionView } from '../core/types.js';
19
19
  export declare class RunTimingIndex {
20
20
  private readonly runToCreatedAt;
21
21
  /** runId → terminal instant, unix SECONDS (`AgentSession.ended_at`; api-types 0.38.0, crew#496). */
22
22
  private readonly runToEndedAt;
23
+ /** crew#985: runId → terminal instant DERIVED from the engine event log (unix SECONDS), for runs
24
+ * with no `run.ended` entry. Kept apart from {@link runToEndedAt} so it never stands in for the
25
+ * durable record: the daemon still writes `run.ended` when it sees the frame. */
26
+ private readonly runToDerivedEndedAt;
27
+ /** crew#985: runId → the read of its engine event log (settled = read; in flight = awaited by an
28
+ * overlapping request, so no request serves a run undated while another is still reading it). */
29
+ private readonly endedBackfill;
23
30
  /** runId → launch channel (`AgentSession.channel`; crew#632). */
24
31
  private readonly runToChannel;
25
32
  /** runId → launch actor string (`AgentSession.launch_actor`; crew#632). */
@@ -121,6 +128,21 @@ export declare class RunTimingIndex {
121
128
  * never fabricated: a live run, a pre-field run, a run that terminalled before THIS daemon
122
129
  * booted, a lost trail). */
123
130
  endedAtFor(runId: string): number | undefined;
131
+ /** Whether the run has a RECORDED terminal instant (a `run.ended` entry, live or hydrated). The
132
+ * daemon writes the entry only when this is false, so an event-log derivation never skips it. */
133
+ hasRecordedEnd(runId: string): boolean;
134
+ /**
135
+ * crew#985: date the terminal runs that have no `run.ended` entry (runs that ended before
136
+ * crew#496 shipped the entry, or while no daemon was watching) from the engine's own event log:
137
+ * the FIRST terminal frame's capture `ts`, the same first-wins rule as {@link setEnded}. Read-only
138
+ * and in memory: nothing is written to the trail, so the next boot derives it again, and a
139
+ * recorded `run.ended` (live or hydrated) always wins over the derivation.
140
+ *
141
+ * Each run's log is read at most once per process (a terminal run's log does not grow). A run
142
+ * whose log has no terminal frame (it predates the log) stays ABSENT. A failed read is not
143
+ * remembered, so a later request tries again.
144
+ */
145
+ backfillEndedFromEvents(views: readonly SessionView[], runEvents: (runId: string) => Promise<RecordedEvent[] | null>): Promise<void>;
124
146
  }
125
147
  /**
126
148
  * Record a `run.launched` audit entry AND stamp the run-timing index with the SAME durable `ts`, so
@@ -1 +1 @@
1
- {"version":3,"file":"run-timing-index.d.ts","sourceRoot":"","sources":["../../src/api/run-timing-index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-timing-index.d.ts","sourceRoot":"","sources":["../../src/api/run-timing-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAkBtF,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6B;IAC5D,oGAAoG;IACpG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;IAC1D;;sFAEkF;IAClF,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA6B;IACjE;sGACkG;IAClG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoC;IAClE,iEAAiE;IACjE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA+C;IAC5E,2EAA2E;IAC3E,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6B;IAC9D,sGAAsG;IACtG,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA6B;IAChE,0GAA0G;IAC1G,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA8B;IAChE;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,6EAA6E;IAC7E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,8FAA8F;IAC9F,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6B;IAC9D,wFAAwF;IACxF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IACxD,oEAAoE;IACpE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAqB;IACxD,uFAAuF;IACvF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAoC;IAEvE;;;;OAIG;IACH,wBAAwB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI;IA2BrD;;;;;;OAMG;IACG,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAY1E;;;;OAIG;IACH,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,IAAI;IAIlD,sGAAsG;IACtG,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI/C,sDAAsD;IACtD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI;IAIlE,oFAAoF;IACpF,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,KAAK,GAAG,SAAS;IAI/D,2DAA2D;IAC3D,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIlD,yFAAyF;IACzF,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIjD,6FAA6F;IAC7F,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI;IAK3E,oDAAoD;IACpD,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAI9C,sDAAsD;IACtD,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAI/B,4CAA4C;IAC5C,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIjC,oFAAoF;IACpF,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI;IAS3E,kGAAkG;IAClG,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIhD,qFAAqF;IACrF,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAItD,2EAA2E;IAC3E,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAI7C,iEAAiE;IACjE,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI;IAI7D,iHAAiH;IACjH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,SAAS;IAI1D,qGAAqG;IACrG,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI5C,mGAAmG;IACnG,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAInD,qGAAqG;IACrG,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAInD;;;;;;;;OAQG;IACH,uBAAuB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI;IAOpD;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IAKpD;;iCAE6B;IAC7B,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI7C;sGACkG;IAClG,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAItC;;;;;;;;;;OAUG;IACG,uBAAuB,CAC3B,KAAK,EAAE,SAAS,WAAW,EAAE,EAC7B,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,EAAE,GAAG,IAAI,CAAC,GAC5D,OAAO,CAAC,IAAI,CAAC;CAgCjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,QAAQ,EACf,cAAc,EAAE,cAAc,GAAG,SAAS,EAC1C,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC9B,MAAM,CA2BR"}
@@ -14,6 +14,12 @@
14
14
  * an error — and updated at the same post-commit point that writes the audit entry, so the map can
15
15
  * only lag by a failed hydrate, never diverge silently.
16
16
  */
17
+ /** The run statuses that are terminal (`SessionStatus`): the only runs `ended_at` may date. */
18
+ const TERMINAL_STATUSES = new Set(['completed', 'cancelled', 'failed']);
19
+ /** The engine frames that end a run: the same three the daemon records `run.ended` on. */
20
+ const TERMINAL_EVENTS = new Set(['sessionCompleted', 'sessionFailed', 'runCancelled']);
21
+ /** How many run event logs one backfill reads at once. */
22
+ const BACKFILL_CONCURRENCY = 4;
17
23
  /**
18
24
  * Millis → whole unix SECONDS. The DTO field (`AgentSession.created_at`) and every other
19
25
  * `created_at` in this wire contract (`ConformanceRule`, memory items) are unix SECONDS; the audit
@@ -26,6 +32,13 @@ export class RunTimingIndex {
26
32
  runToCreatedAt = new Map();
27
33
  /** runId → terminal instant, unix SECONDS (`AgentSession.ended_at`; api-types 0.38.0, crew#496). */
28
34
  runToEndedAt = new Map();
35
+ /** crew#985: runId → terminal instant DERIVED from the engine event log (unix SECONDS), for runs
36
+ * with no `run.ended` entry. Kept apart from {@link runToEndedAt} so it never stands in for the
37
+ * durable record: the daemon still writes `run.ended` when it sees the frame. */
38
+ runToDerivedEndedAt = new Map();
39
+ /** crew#985: runId → the read of its engine event log (settled = read; in flight = awaited by an
40
+ * overlapping request, so no request serves a run undated while another is still reading it). */
41
+ endedBackfill = new Map();
29
42
  /** runId → launch channel (`AgentSession.channel`; crew#632). */
30
43
  runToChannel = new Map();
31
44
  /** runId → launch actor string (`AgentSession.launch_actor`; crew#632). */
@@ -222,7 +235,59 @@ export class RunTimingIndex {
222
235
  * never fabricated: a live run, a pre-field run, a run that terminalled before THIS daemon
223
236
  * booted, a lost trail). */
224
237
  endedAtFor(runId) {
225
- return this.runToEndedAt.get(runId);
238
+ return this.runToEndedAt.get(runId) ?? this.runToDerivedEndedAt.get(runId);
239
+ }
240
+ /** Whether the run has a RECORDED terminal instant (a `run.ended` entry, live or hydrated). The
241
+ * daemon writes the entry only when this is false, so an event-log derivation never skips it. */
242
+ hasRecordedEnd(runId) {
243
+ return this.runToEndedAt.has(runId);
244
+ }
245
+ /**
246
+ * crew#985: date the terminal runs that have no `run.ended` entry (runs that ended before
247
+ * crew#496 shipped the entry, or while no daemon was watching) from the engine's own event log:
248
+ * the FIRST terminal frame's capture `ts`, the same first-wins rule as {@link setEnded}. Read-only
249
+ * and in memory: nothing is written to the trail, so the next boot derives it again, and a
250
+ * recorded `run.ended` (live or hydrated) always wins over the derivation.
251
+ *
252
+ * Each run's log is read at most once per process (a terminal run's log does not grow). A run
253
+ * whose log has no terminal frame (it predates the log) stays ABSENT. A failed read is not
254
+ * remembered, so a later request tries again.
255
+ */
256
+ async backfillEndedFromEvents(views, runEvents) {
257
+ const inFlight = [];
258
+ const pending = [];
259
+ for (const { session: s } of views) {
260
+ if (!TERMINAL_STATUSES.has(s.status) || this.runToEndedAt.has(s.id))
261
+ continue;
262
+ const read = this.endedBackfill.get(s.id);
263
+ if (read !== undefined) {
264
+ inFlight.push(read);
265
+ continue;
266
+ }
267
+ let settle;
268
+ this.endedBackfill.set(s.id, new Promise((resolve) => (settle = resolve)));
269
+ pending.push({ id: s.id, settle });
270
+ }
271
+ let next = 0;
272
+ const worker = async () => {
273
+ while (next < pending.length) {
274
+ const { id, settle } = pending[next++];
275
+ try {
276
+ const events = await runEvents(id);
277
+ const terminal = events?.find((e) => TERMINAL_EVENTS.has(e.type) && typeof e.ts === 'number' && e.ts > 0);
278
+ if (terminal !== undefined)
279
+ this.runToDerivedEndedAt.set(id, toSeconds(terminal.ts));
280
+ }
281
+ catch {
282
+ this.endedBackfill.delete(id);
283
+ }
284
+ finally {
285
+ settle();
286
+ }
287
+ }
288
+ };
289
+ await Promise.all(Array.from({ length: Math.min(BACKFILL_CONCURRENCY, pending.length) }, worker));
290
+ await Promise.all(inFlight);
226
291
  }
227
292
  }
228
293
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"run-timing-index.js","sourceRoot":"","sources":["../../src/api/run-timing-index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-timing-index.js","sourceRoot":"","sources":["../../src/api/run-timing-index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * The Agents page's readings per seat (DES-seats-page §7, asks A2–A6): what crew can say about a
3
+ * seat's readiness as FACTS and CODES, so studio owns every word (one copy table per code) and
4
+ * never re-derives an engine or crew rule.
5
+ *
6
+ * - `account` (A2): the account KIND only, never an identifier (`seat-scrub.ts`);
7
+ * - `recent_bench` (A3): the engine's bench of the seat that is ACTIVE now, not the week's history
8
+ * (`/roster/record` keeps that);
9
+ * - `work_admission` (A5): per scope kind, whether a job would give the seat work, with ONE reason
10
+ * code and where the refusal comes from (`auth`, `launcher`, `scope`). It reads the same standing
11
+ * the launch does, plus the engine's own worktree bench through `Core.worktreeBenched` (core#920).
12
+ * Without that predicate (an older addon) it is ABSENT: crew does not restate the engine's rule;
13
+ * - `qe_reviewer` (A4): whether the seat can run the isolated QE review. Since wicked-core#917 the
14
+ * engine starts the reviewer as a fresh session on ANY run seat it ADMITS, so the rule is: signed
15
+ * in, kept by a run bound to one repository (QE runs only there), and admitted by the host's skill
16
+ * routing to the QE skill (`Core.qeReviewerAdmitted`, wicked-core#923: a Claude-only skills root admits claude
17
+ * seats only). A reviewer-only seat counts: the engine's reviewer pool is the run's seats, not
18
+ * its workers. Absent unless the engine answers both predicates;
19
+ * - `issues` (A6): one entry per thing the page shows, most important first.
20
+ *
21
+ * Pure: no IO, no clock.
22
+ */
23
+ import type { SeatRecentBench } from './seat-health.js';
24
+ import type { GovernanceScopeKind, SeatGovernanceMode } from './seat-governance.js';
25
+ import type { SeatAccount } from './seat-scrub.js';
26
+ import { type ChatAdmission, type SeatStanding } from './seat-standing.js';
27
+ import type { SeatVersion } from './seat-version.js';
28
+ /** `RosterSeat.recent_bench` (api-types 0.115.0). */
29
+ export interface RecentBenchWire {
30
+ /** The engine's cause token (`quota_exhausted`, `not_logged_in`, `not_installed`,
31
+ * `approval_unavailable`, `timed_out`, …). */
32
+ kind: string;
33
+ /** Runs that benched the seat while this bench was active. */
34
+ runs: number;
35
+ /** ISO-8601 of the latest bench. */
36
+ last_at: string;
37
+ /** ISO-8601 of when crew stops carrying the bench to new launches (sooner on an ok turn). This is
38
+ * crew's window, not a provider reset time: no provider states one on the wire today. */
39
+ lifts_at: string;
40
+ /** Who benched it in the run: `worker` or `judge`. */
41
+ source: string;
42
+ /** The engine's own reason, verbatim (Technical details). */
43
+ reason: string;
44
+ }
45
+ /** The engine's cause token: the reason up to its first parenthesis. */
46
+ export declare function benchKind(reason: string): string;
47
+ export declare function recentBenchWire(bench: SeatRecentBench): RecentBenchWire;
48
+ /** Whether the seat's live sign-in check, answered AFTER the bench, lifts it. */
49
+ export declare function liveCheckLiftsBench(bench: SeatRecentBench, probe: {
50
+ signedIn: boolean | null;
51
+ check: string;
52
+ probedAt: string;
53
+ } | undefined): boolean;
54
+ /** `RosterSeat.account`: absent unless the seat can take a turn on its sign-in. */
55
+ export declare function seatAccount(auth: SeatStanding['auth'], stated: SeatAccount | undefined): SeatAccount | undefined;
56
+ export type WorkRefusalSource = 'auth' | 'launcher' | 'scope';
57
+ /** One reason code per refusal (studio's copy table keys on it). */
58
+ export type WorkReasonCode = 'signed_out' | 'not_enabled' | 'reviewer_only' | 'recent_bench' | 'login_pending' | 'worktree_bench' | 'scope_ungoverned';
59
+ export type WorkAdmission = {
60
+ ok: true;
61
+ } | {
62
+ ok: false;
63
+ reason_code: WorkReasonCode;
64
+ source: WorkRefusalSource;
65
+ reason: string;
66
+ };
67
+ /** `RosterSeat.qe_reviewer` (api-types 0.115.0). */
68
+ export type QeReviewerReasonCode = Exclude<WorkReasonCode, 'reviewer_only' | 'scope_ungoverned'> | 'skill_not_admitted';
69
+ export type QeReviewer = {
70
+ ok: true;
71
+ } | {
72
+ ok: false;
73
+ reason_code: QeReviewerReasonCode;
74
+ reason: string;
75
+ };
76
+ export interface WorkInputs {
77
+ enabled_for_council?: boolean | undefined;
78
+ seat_eligible_for_work?: boolean | undefined;
79
+ standing: SeatStanding;
80
+ /** The engine's bench crew carries to new launches (`SeatHealthTracker.recentBenchFor`). */
81
+ recentBench: SeatRecentBench | null;
82
+ /** The seat's login check has not answered yet (a launch would wait, then leave it out). */
83
+ loginPending: boolean;
84
+ /** The chat admission per scope kind the roster already serves (ASK-C2). */
85
+ chatAdmission: Record<GovernanceScopeKind, ChatAdmission>;
86
+ /** The engine's worktree bench reason for THIS seat on a bound run, `null` for none. */
87
+ worktreeBench: string | null;
88
+ }
89
+ /** `RosterSeat.work_admission` (see the module doc). */
90
+ export declare function workAdmission(i: WorkInputs): Record<GovernanceScopeKind, WorkAdmission>;
91
+ /** `RosterSeat.qe_reviewer` (see the module doc). `skillAdmitted` is the engine's answer. */
92
+ export declare function qeReviewer(i: WorkInputs, skillAdmitted: boolean): QeReviewer;
93
+ export type IssueSeverity = 'problem' | 'warning' | 'note';
94
+ export interface SeatIssueCommand {
95
+ purpose: 'sign_in' | 'sign_out' | 'version';
96
+ /** The safe rendering: the home directory written `$HOME` (it expands inside the double quotes
97
+ * the engine puts around the seat's root; `~` would not). The command to RUN stays the roster's
98
+ * `login_invocation` / `logout_invocation`. */
99
+ display: string;
100
+ }
101
+ export interface SeatIssue {
102
+ code: string;
103
+ severity: IssueSeverity;
104
+ /** Only names, versions, counts and ISO times — never free text from a CLI. */
105
+ params: Record<string, string | number>;
106
+ /** Crew's own one line, for a client that does not know the code (Technical details). */
107
+ message: string;
108
+ commands?: SeatIssueCommand[];
109
+ }
110
+ /** Everything the issue list reads, all already computed by the roster accessor. */
111
+ export interface IssueInputs {
112
+ key: string;
113
+ display_name: string;
114
+ binary: string;
115
+ login_invocation?: string;
116
+ logout_invocation?: string;
117
+ optIn: boolean;
118
+ standing: SeatStanding;
119
+ version?: SeatVersion;
120
+ governance: Record<GovernanceScopeKind, SeatGovernanceMode>;
121
+ /** `/diagnostics.seatGovernance.hostBoundary`: the OS launcher the repository boundary arms
122
+ * with, `null` when the host has none. */
123
+ hostBoundary: string | null;
124
+ recentBench: RecentBenchWire | undefined;
125
+ workAdmission?: Record<GovernanceScopeKind, WorkAdmission>;
126
+ qeReviewer?: QeReviewer;
127
+ /** Whether ANY seat on the roster can run QE now (`undefined` when that is not known). */
128
+ rosterQe: boolean | undefined;
129
+ home?: string;
130
+ }
131
+ /** A command for display: the home directory as `$HOME`. */
132
+ export declare function displayCommand(cmd: string, home?: string): string;
133
+ /** `RosterSeat.issues` (A6), most important first. */
134
+ export declare function seatIssues(i: IssueInputs): SeatIssue[];
135
+ //# sourceMappingURL=seat-agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seat-agents.d.ts","sourceRoot":"","sources":["../../src/api/seat-agents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,186 @@
1
+ /**
2
+ * The Agents page's readings per seat (DES-seats-page §7, asks A2–A6): what crew can say about a
3
+ * seat's readiness as FACTS and CODES, so studio owns every word (one copy table per code) and
4
+ * never re-derives an engine or crew rule.
5
+ *
6
+ * - `account` (A2): the account KIND only, never an identifier (`seat-scrub.ts`);
7
+ * - `recent_bench` (A3): the engine's bench of the seat that is ACTIVE now, not the week's history
8
+ * (`/roster/record` keeps that);
9
+ * - `work_admission` (A5): per scope kind, whether a job would give the seat work, with ONE reason
10
+ * code and where the refusal comes from (`auth`, `launcher`, `scope`). It reads the same standing
11
+ * the launch does, plus the engine's own worktree bench through `Core.worktreeBenched` (core#920).
12
+ * Without that predicate (an older addon) it is ABSENT: crew does not restate the engine's rule;
13
+ * - `qe_reviewer` (A4): whether the seat can run the isolated QE review. Since wicked-core#917 the
14
+ * engine starts the reviewer as a fresh session on ANY run seat it ADMITS, so the rule is: signed
15
+ * in, kept by a run bound to one repository (QE runs only there), and admitted by the host's skill
16
+ * routing to the QE skill (`Core.qeReviewerAdmitted`, wicked-core#923: a Claude-only skills root admits claude
17
+ * seats only). A reviewer-only seat counts: the engine's reviewer pool is the run's seats, not
18
+ * its workers. Absent unless the engine answers both predicates;
19
+ * - `issues` (A6): one entry per thing the page shows, most important first.
20
+ *
21
+ * Pure: no IO, no clock.
22
+ */
23
+ import { homeless } from './seat-standing.js';
24
+ /** The engine's cause token: the reason up to its first parenthesis. */
25
+ export function benchKind(reason) {
26
+ return reason.split(' (', 1)[0].trim();
27
+ }
28
+ export function recentBenchWire(bench) {
29
+ return {
30
+ kind: benchKind(bench.reason),
31
+ runs: bench.runs,
32
+ last_at: bench.at,
33
+ lifts_at: bench.until,
34
+ source: bench.source,
35
+ reason: bench.reason,
36
+ };
37
+ }
38
+ /** Bench kinds a LIVE sign-in answer disproves: the seat answered an authenticated request, so it is
39
+ * signed in and has quota. Other kinds (`approval_unavailable`, `not_installed`, `timed_out`) are
40
+ * about doing work, which a one-word reply does not prove. */
41
+ const LIVE_CLEARS = new Set(['not_logged_in', 'quota_exhausted', 'usage_limit']);
42
+ /** Whether the seat's live sign-in check, answered AFTER the bench, lifts it. */
43
+ export function liveCheckLiftsBench(bench, probe) {
44
+ if (probe === undefined || probe.signedIn !== true || probe.check !== 'live')
45
+ return false;
46
+ if (!LIVE_CLEARS.has(benchKind(bench.reason)))
47
+ return false;
48
+ return Date.parse(probe.probedAt) > Date.parse(bench.at);
49
+ }
50
+ // ── A2 ──────────────────────────────────────────────────────────────────────────────────────────
51
+ /** `RosterSeat.account`: absent unless the seat can take a turn on its sign-in. */
52
+ export function seatAccount(auth, stated) {
53
+ if (auth === 'not_required')
54
+ return { kind: 'free' };
55
+ if (auth !== 'signed_in')
56
+ return undefined;
57
+ return stated ?? { kind: 'unknown' };
58
+ }
59
+ /** The refusals every scope shares, in order: the first one is the seat's reason. */
60
+ function standingRefusal(i, opts) {
61
+ if (i.standing.auth === 'signed_out') {
62
+ return { ok: false, reason_code: 'signed_out', source: 'auth', reason: i.standing.council_ineligible_reason ?? 'signed out' };
63
+ }
64
+ if (i.enabled_for_council === false) {
65
+ return { ok: false, reason_code: 'not_enabled', source: 'launcher', reason: 'not enabled for council, so a launch benches it' };
66
+ }
67
+ if (!opts.reviewer && i.seat_eligible_for_work === false) {
68
+ return { ok: false, reason_code: 'reviewer_only', source: 'launcher', reason: 'a reviewer-only seat: it reviews work and is never given a unit' };
69
+ }
70
+ if (i.recentBench !== null) {
71
+ return { ok: false, reason_code: 'recent_bench', source: 'launcher', reason: i.standing.council_ineligible_reason ?? i.recentBench.reason };
72
+ }
73
+ if (i.loginPending) {
74
+ return { ok: false, reason_code: 'login_pending', source: 'launcher', reason: i.standing.council_ineligible_reason ?? 'login not verified yet' };
75
+ }
76
+ return null;
77
+ }
78
+ /** `RosterSeat.work_admission` (see the module doc). */
79
+ export function workAdmission(i) {
80
+ const base = standingRefusal(i, { reviewer: false });
81
+ const scope = (kind) => {
82
+ if (base !== null)
83
+ return base;
84
+ if (kind === 'scoped_bound' && i.worktreeBench !== null) {
85
+ return { ok: false, reason_code: 'worktree_bench', source: 'launcher', reason: i.worktreeBench };
86
+ }
87
+ const chat = i.chatAdmission[kind];
88
+ if (!chat.ok && chat.source === 'scope')
89
+ return { ok: false, reason_code: 'scope_ungoverned', source: 'scope', reason: chat.reason };
90
+ return { ok: true };
91
+ };
92
+ return { unscoped: scope('unscoped'), scoped: scope('scoped'), scoped_bound: scope('scoped_bound') };
93
+ }
94
+ /** `RosterSeat.qe_reviewer` (see the module doc). `skillAdmitted` is the engine's answer. */
95
+ export function qeReviewer(i, skillAdmitted) {
96
+ const r = standingRefusal(i, { reviewer: true });
97
+ if (r !== null)
98
+ return { ok: false, reason_code: r.reason_code, reason: r.reason };
99
+ if (i.worktreeBench !== null)
100
+ return { ok: false, reason_code: 'worktree_bench', reason: i.worktreeBench };
101
+ if (!skillAdmitted) {
102
+ return {
103
+ ok: false,
104
+ reason_code: 'skill_not_admitted',
105
+ reason: "this host's skills root admits only a claude seat to the QE skill (no published portability verdict, or the skill is not portable)",
106
+ };
107
+ }
108
+ return { ok: true };
109
+ }
110
+ const SEVERITY_ORDER = { problem: 0, warning: 1, note: 2 };
111
+ /** Within a severity: safety before availability (DES-seats-page §4, codex HIER r7). */
112
+ const SAFETY_CODES = new Set(['unchecked', 'version_unproven', 'fence_scoped']);
113
+ /** A command for display: the home directory as `$HOME`. */
114
+ export function displayCommand(cmd, home) {
115
+ return homeless(cmd, home, '$HOME');
116
+ }
117
+ /** `RosterSeat.issues` (A6), most important first. */
118
+ export function seatIssues(i) {
119
+ const out = [];
120
+ const name = i.display_name;
121
+ const signIn = typeof i.login_invocation === 'string' && i.login_invocation.trim() !== ''
122
+ ? [{ purpose: 'sign_in', display: displayCommand(i.login_invocation.trim(), i.home) }]
123
+ : [];
124
+ const signOut = typeof i.logout_invocation === 'string' && i.logout_invocation.trim() !== ''
125
+ ? [{ purpose: 'sign_out', display: displayCommand(i.logout_invocation.trim(), i.home) }]
126
+ : [];
127
+ const add = (code, severity, message, params = {}, commands = []) => {
128
+ out.push({ code, severity, params, message, ...(commands.length > 0 ? { commands } : {}) });
129
+ };
130
+ const st = i.standing;
131
+ if (st.auth === 'signed_out') {
132
+ add('signed_out', 'problem', `${name} is signed out, so it takes no work until it is signed in`, st.probed_at !== undefined ? { checked_at: st.probed_at } : {}, signIn);
133
+ if (i.rosterQe === false) {
134
+ add('qe_blocked', 'problem', 'no agent can run quality checks now, so jobs that need one wait before delivery', {}, signIn);
135
+ }
136
+ }
137
+ const bench = i.recentBench;
138
+ if (bench !== undefined) {
139
+ const code = bench.kind === 'quota_exhausted' ? 'quota' : bench.kind === 'usage_limit' ? 'usage_limit' : 'benched';
140
+ add(code, 'warning', `the engine benched ${name} (${bench.kind}) in ${bench.runs} run(s); new jobs leave it out until ${bench.lifts_at} or its next good turn`, {
141
+ kind: bench.kind,
142
+ runs: bench.runs,
143
+ last_at: bench.last_at,
144
+ lifts_at: bench.lifts_at,
145
+ });
146
+ }
147
+ const bound = i.workAdmission?.scoped_bound;
148
+ if (bound !== undefined && !bound.ok && bound.reason_code === 'worktree_bench') {
149
+ add('codex_worktree', 'warning', `${name} is benched on every job bound to a repository on this host`, {}, [...signOut, ...signIn]);
150
+ }
151
+ // Safety: the bound-run mode decides what holds the seat's writes in a job.
152
+ const gov = i.governance.scoped_bound;
153
+ if (i.version?.status === 'unproven') {
154
+ add('version_unproven', 'warning', `${name} ${i.version.installed ?? '(no version answer)'} is not the build its safety checks were proven on, so they switch off`, {
155
+ ...(i.version.installed !== null ? { installed: i.version.installed } : {}),
156
+ ...(i.version.proven !== null ? { proven: i.version.proven } : {}),
157
+ }, [{ purpose: 'version', display: `${i.binary} --version` }]);
158
+ }
159
+ else if (gov.mode === 'none') {
160
+ add('unchecked', 'warning', `nothing checks ${name}'s actions on this version`, { why: 'no_governance' });
161
+ }
162
+ else if (gov.source === 'repo_boundary' && i.hostBoundary === null) {
163
+ add('unchecked', 'warning', `there is no sandbox tool on this computer, so nothing limits what ${name} writes`, { why: 'no_host_boundary' });
164
+ }
165
+ else if (gov.source === 'repo_boundary' && i.governance.unscoped.mode === 'none') {
166
+ add('fence_scoped', 'warning', `${name}'s writes are kept inside one repository only when the work is bound to it`);
167
+ }
168
+ if (st.auth === 'signed_in' && st.login_check === 'status') {
169
+ add('live_check_failed', 'warning', `${name}'s status command says signed in, but its one live request did not answer`, st.probed_at !== undefined ? { checked_at: st.probed_at } : {}, signIn);
170
+ }
171
+ if (i.optIn)
172
+ add('opt_in', 'note', `${name} is opt-in: it is left out of new work unless you pick it`);
173
+ if (i.qeReviewer !== undefined && !i.qeReviewer.ok && i.qeReviewer.reason_code !== 'signed_out') {
174
+ add('no_qe', 'note', `${name} can't run quality checks now (${i.qeReviewer.reason_code})`, { reason_code: i.qeReviewer.reason_code });
175
+ }
176
+ if (st.auth === 'signed_in' && st.login_check === 'unverified') {
177
+ add('unverified', 'note', `${name}'s sign-in can't be confirmed: it has no status command`, {}, signIn);
178
+ }
179
+ return out
180
+ .map((issue, idx) => ({ issue, idx }))
181
+ .sort((a, b) => SEVERITY_ORDER[a.issue.severity] - SEVERITY_ORDER[b.issue.severity] ||
182
+ Number(!SAFETY_CODES.has(a.issue.code)) - Number(!SAFETY_CODES.has(b.issue.code)) ||
183
+ a.idx - b.idx)
184
+ .map(({ issue }) => issue);
185
+ }
186
+ //# sourceMappingURL=seat-agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seat-agents.js","sourceRoot":"","sources":["../../src/api/seat-agents.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,14 @@ export type { SeatHealth };
10
10
  export declare const AUTH_REFUSAL_PATTERNS: RegExp[];
11
11
  /** Whether a failure detail / stderr says the seat has no usable credential. */
12
12
  export declare function isAuthRefusal(text: string): boolean;
13
+ /**
14
+ * A8 (DES-seats-page §4.3): what a seat's refusal SAID, in crew's own vocabulary — the words each
15
+ * {@link AUTH_REFUSAL_PATTERNS} entry matched (`No API key`, `Not logged in`, `HTTP/1.1 401`,
16
+ * `OAuth session expired`), deduplicated, joined `; ` — or `null` when none matched. Never the
17
+ * CLI's surrounding prose: a refusal can carry a key, an account or an organisation in any shape,
18
+ * and no mask can know them all, so the roster carries only what crew's patterns name.
19
+ */
20
+ export declare function refusalSummary(text: string): string | null;
13
21
  /** How long a seat's own "no credential" report keeps its `auth` at `signed_out` with no ok output
14
22
  * since — the same window as the council bench; an ok unit output clears it at once. */
15
23
  export declare const AUTH_FAILURE_WINDOW_MS: number;
@@ -37,6 +45,8 @@ export interface SeatRecentBench {
37
45
  source: string;
38
46
  /** The run that benched it, when the frame named one. */
39
47
  run?: string;
48
+ /** (A3) How many runs benched the seat while this bench was active (at least 1). */
49
+ runs: number;
40
50
  }
41
51
  /** A seat's own report that it has no credential (`RosterSeat.auth_evidence`). */
42
52
  export interface SeatAuthFailure {
@@ -80,6 +90,18 @@ export declare class SeatHealthTracker {
80
90
  ingest(event: CoreEvent): void;
81
91
  /** Flip a seat ACTIVE: message cleared, `since` updated on a genuine transition. */
82
92
  markActive(key: string, atMs?: number): void;
93
+ /**
94
+ * (A3) Lift the seat's recent bench because something else proved it can work again — the roster
95
+ * calls this when the seat's own LIVE sign-in check answered after an account bench (signed out,
96
+ * out of quota). An ok output does the same through {@link markActive}.
97
+ */
98
+ clearRecentBench(key: string): void;
99
+ /**
100
+ * Drop the seat's own "no credential" report when it is OLDER than `beforeMs` — the roster calls
101
+ * this when the seat's LIVE sign-in check answered after it (the operator signed in since). A
102
+ * report that landed after the check is kept: the seat refused again.
103
+ */
104
+ clearAuthFailureBefore(key: string, beforeMs: number): void;
83
105
  /** Record a seat's own "no credential" report (F-A45-006) — the newest report wins. */
84
106
  private recordAuthFailure;
85
107
  /** Stamp an OBSERVED error on the seat — `lastErrorAt` only; the status stays `active` (R5). */
@@ -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;AAmC3B;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,EAuBzC,CAAC;AAEF,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAKD;yFACyF;AACzF,eAAO,MAAM,sBAAsB,QAAiB,CAAC;AAErD;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,QAAiB,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,6BAA6B;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,6FAA6F;IAC7F,KAAK,EAAE,MAAM,CAAC;IACd,iGAAiG;IACjG,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,kFAAkF;AAClF,MAAM,WAAW,eAAe;IAC9B,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,wEAAwE;IACxE,MAAM,EAAE,MAAM,CAAC;IACf,gGAAgG;IAChG,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;IACpC,wDAAwD;IACxD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,qBAAa,iBAAiB;IAYhB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAXjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,oGAAoG;IACpG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,mGAAmG;IACnG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0G;IACvI;qDACiD;IACjD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuF;IACrH,+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;IA4K9B,oFAAoF;IACpF,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,SAAa,GAAG,IAAI;IAWhD,uFAAuF;IACvF,OAAO,CAAC,iBAAiB;IAgBzB,gGAAgG;IAChG,OAAO,CAAC,UAAU;IAUlB;;;;OAIG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAa,GAAG,eAAe,GAAG,IAAI;IAevE;;;;;OAKG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAa,GAAG,eAAe,GAAG,IAAI;IAgBvE,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;AAmC3B;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,EAuBzC,CAAC;AAEF,gFAAgF;AAChF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAS1D;AAKD;yFACyF;AACzF,eAAO,MAAM,sBAAsB,QAAiB,CAAC;AAErD;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,QAAiB,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,6BAA6B;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,6FAA6F;IAC7F,KAAK,EAAE,MAAM,CAAC;IACd,iGAAiG;IACjG,MAAM,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oFAAoF;IACpF,IAAI,EAAE,MAAM,CAAC;CACd;AAED,kFAAkF;AAClF,MAAM,WAAW,eAAe;IAC9B,8BAA8B;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,wEAAwE;IACxE,MAAM,EAAE,MAAM,CAAC;IACf,gGAAgG;IAChG,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,KAAK,CAAC;IACpC,wDAAwD;IACxD,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;GAKG;AACH,qBAAa,iBAAiB;IAYhB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAXjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,oGAAoG;IACpG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6B;IACzD,mGAAmG;IACnG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA0G;IACvI;qDACiD;IACjD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqG;IACnI,+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;IAiL9B,oFAAoF;IACpF,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,SAAa,GAAG,IAAI;IAWhD;;;;OAIG;IACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAInC;;;;OAIG;IACH,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAK3D,uFAAuF;IACvF,OAAO,CAAC,iBAAiB;IAqBzB,gGAAgG;IAChG,OAAO,CAAC,UAAU;IAUlB;;;;OAIG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAa,GAAG,eAAe,GAAG,IAAI;IAevE;;;;;OAKG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAa,GAAG,eAAe,GAAG,IAAI;IAiBvE,iGAAiG;IACjG,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU;CAGnC"}