wicked-crew-api-types 0.35.0 → 0.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.d.ts +518 -11
- package/package.json +1 -1
package/index.d.ts
CHANGED
|
@@ -137,6 +137,24 @@ export type RoutingInfo =
|
|
|
137
137
|
| { method: 'evaluator_distinct'; winner: string; was: string }
|
|
138
138
|
| { method: 'tool' };
|
|
139
139
|
|
|
140
|
+
/**
|
|
141
|
+
* `GET /health` (api-types 0.37.0 — the shape was previously undeclared here; `status`,
|
|
142
|
+
* `version` and `ping` are unchanged since 0.1). `capabilities` (additive) names what the
|
|
143
|
+
* running daemon + its engine addon can actually do, so a client never promises a behaviour the
|
|
144
|
+
* deployment cannot keep:
|
|
145
|
+
* - `deliverGate` — the engine pauses before the composed `deliver` phase pushes and opens the
|
|
146
|
+
* PR unless the launch said `deliverGate: 'auto'` (F-E2E-030; wicked-core-ts ≥ 0.7.24).
|
|
147
|
+
* `false` (or the whole object absent — a daemon before 0.7.33) ⇒ delivery follows verify
|
|
148
|
+
* UNATTENDED; a composer must say so instead of promising a gate, and must not send
|
|
149
|
+
* `deliverGate` (an older daemon's launch schema rejects it).
|
|
150
|
+
*/
|
|
151
|
+
export interface HealthResponse {
|
|
152
|
+
status: string;
|
|
153
|
+
version: string;
|
|
154
|
+
ping: string;
|
|
155
|
+
capabilities?: { deliverGate: boolean };
|
|
156
|
+
}
|
|
157
|
+
|
|
140
158
|
/** A run (`AgentSession`). */
|
|
141
159
|
export interface AgentSession {
|
|
142
160
|
id: string;
|
|
@@ -147,6 +165,14 @@ export interface AgentSession {
|
|
|
147
165
|
clis: string[];
|
|
148
166
|
status: SessionStatus;
|
|
149
167
|
human_confirm: HumanConfirm;
|
|
168
|
+
/**
|
|
169
|
+
* Whether the run's deliver phase may push and open its PR WITHOUT a human confirming it
|
|
170
|
+
* first (F-E2E-030; api-types 0.37.0, additive). `false` — the engine pauses before the `deliver` Tool unit
|
|
171
|
+
* whatever `human_confirm` says; `true` — the launch opted out explicitly (`deliverGate:
|
|
172
|
+
* 'auto'`). ABSENT on runs from an engine that predates the deliver gate (wicked-core-ts <
|
|
173
|
+
* 0.7.24): such an engine delivers unattended — render no gate promise for it.
|
|
174
|
+
*/
|
|
175
|
+
auto_deliver?: boolean;
|
|
150
176
|
unit_ix: number;
|
|
151
177
|
attempt: number;
|
|
152
178
|
workdir: string | null;
|
|
@@ -282,6 +308,34 @@ export interface AgentSession {
|
|
|
282
308
|
* now; a joined `AgentSession.cost` is a follow-up once that store exists.
|
|
283
309
|
*/
|
|
284
310
|
created_at?: number;
|
|
311
|
+
/**
|
|
312
|
+
* The interactive DOCUMENT this run answered (wave 6, F-4R2-006 root fix; api-types 0.36.0) —
|
|
313
|
+
* daemon-joined at DTO assembly on `GET /runs` and `GET /runs/:id` from the interactive seams'
|
|
314
|
+
* handoff ledgers (the system of record for "this handoff was answered by this run"), so a skin
|
|
315
|
+
* no longer parses `extra_write_roots` for it. `GET /runs?doc=<id>` filters on it. `null` =
|
|
316
|
+
* genuinely not a document run; ABSENT = a pre-0.36 daemon. A document chip renders only on
|
|
317
|
+
* `typeof === 'string'`.
|
|
318
|
+
*/
|
|
319
|
+
document_id?: string | null;
|
|
320
|
+
/**
|
|
321
|
+
* Wave 6 (F-7R2-013): the run branch the worktree was minted on (`wicked/<run id>`, sanitized) —
|
|
322
|
+
* recorded by the engine when the worktree is ready and durable past its reap, so
|
|
323
|
+
* `GET /runs/:id/diff` serves the run's work from the branch (`source: 'branch'`) once the
|
|
324
|
+
* worktree is gone. Absent for an unbound run and on an engine predating wave 6 (the daemon then
|
|
325
|
+
* derives `wicked/<id>` itself).
|
|
326
|
+
*/
|
|
327
|
+
run_branch?: string;
|
|
328
|
+
/** Wave 6 (F-7R2-013): the commit the worktree was minted FROM (`runBaseResolved.baseCommit`) —
|
|
329
|
+
* the branch diff's base. Absent for an unbound run, a reused worktree, or an older engine (the
|
|
330
|
+
* daemon then uses the branch's merge-base with the default branch). */
|
|
331
|
+
base_commit?: string;
|
|
332
|
+
/** Wave 6 (F-7R2-013): when the run reached a TERMINAL status, unix millis. A COMPLETED run's
|
|
333
|
+
* worktree is RETAINED from here until archive or the engine's retention window elapses
|
|
334
|
+
* (`WICKED_COMPLETED_WORKTREE_KEEP_DAYS`, default 14). Absent on a live run and on older engines. */
|
|
335
|
+
finished_at?: number;
|
|
336
|
+
/** Wave 6 (F-7R2-006): the seats BENCHED for this run — never convened, never a failover or
|
|
337
|
+
* judge target. Absent (never `[]`) when none / on an older engine. */
|
|
338
|
+
benched_seats?: BenchedSeat[];
|
|
285
339
|
}
|
|
286
340
|
|
|
287
341
|
/** An ordered unit of work within a run (`WorkUnit`). */
|
|
@@ -434,6 +488,17 @@ export interface RosterSeat {
|
|
|
434
488
|
* cheaply (keychain-backed seats, unknown seat keys). Absent on a daemon predating the field.
|
|
435
489
|
*/
|
|
436
490
|
auth?: SeatAuth;
|
|
491
|
+
/**
|
|
492
|
+
* Where `auth` came from (api-types 0.36.0, F-A45-006): `seat-stderr` — the seat ITSELF reported
|
|
493
|
+
* no credential (a council ballot's "No API key found", a worker's 401, an authentication ACP
|
|
494
|
+
* fallback) within the last 30 minutes with no ok output since, which OVERRIDES the credential-
|
|
495
|
+
* file probe (`signed_in`) — the fresh rig's pi read `signed_in: true` off an empty `auth.json`
|
|
496
|
+
* while every ballot failed. Absent = the probe decided (and since 0.36.0 the probe itself needs
|
|
497
|
+
* a credential-SHAPED file, never mere presence).
|
|
498
|
+
*/
|
|
499
|
+
auth_source?: 'seat-stderr';
|
|
500
|
+
/** Present with `auth_source: 'seat-stderr'`: the seat's own words, bounded. */
|
|
501
|
+
auth_evidence?: string;
|
|
437
502
|
/** Present when `auth` is `not_required`: the free tier the seat answers on. */
|
|
438
503
|
free_tier?: string;
|
|
439
504
|
/**
|
|
@@ -523,6 +588,21 @@ export interface RunDiff {
|
|
|
523
588
|
diff: string;
|
|
524
589
|
/** The diff exceeded the 1 MB output cap and was cut. */
|
|
525
590
|
truncated: boolean;
|
|
591
|
+
/**
|
|
592
|
+
* Where the diff was read from (wave 6, F-7R2-013; api-types 0.36.0): `worktree` — the live run
|
|
593
|
+
* worktree (staged + unstaged + untracked; the pre-0.36 answer); `branch` — the run's retained
|
|
594
|
+
* `wicked/<id>` branch in the REGISTERED repository, diffed against its base, served when the
|
|
595
|
+
* engine has reaped the worktree (a completed run) so the files view never goes dark at
|
|
596
|
+
* completion. A pre-0.36 daemon omits the field and answers 409 for a reaped worktree; 409 now
|
|
597
|
+
* means "no worktree AND no run branch" (nothing was ever committed for the run).
|
|
598
|
+
*/
|
|
599
|
+
source?: 'worktree' | 'branch';
|
|
600
|
+
/** `source: 'branch'` — the run branch the diff was read from. */
|
|
601
|
+
branch?: string;
|
|
602
|
+
/** `source: 'branch'` — the base commit the branch was diffed against: the engine's recorded
|
|
603
|
+
* `AgentSession.base_commit` when it has one, else the branch's merge-base with the default
|
|
604
|
+
* branch; `?base=<ref>` overrides it with a plain in-repo ref. */
|
|
605
|
+
base?: string;
|
|
526
606
|
}
|
|
527
607
|
|
|
528
608
|
/** The daemon's cached open-gate record (`GET /runs/:id/gate`, DES-STUDIO-001 §3.3). */
|
|
@@ -681,17 +761,40 @@ export interface CoreEvent {
|
|
|
681
761
|
hasValidatorPin?: boolean;
|
|
682
762
|
executor_type?: string;
|
|
683
763
|
executorType?: string;
|
|
684
|
-
// unitDistributed enrichment fields
|
|
764
|
+
// unitDistributed enrichment fields — the wire spelling is camelCase (event_to_json; see
|
|
765
|
+
// UnitDistributedEvent, api-types 0.36.0); the snake_case variants are kept for older relays.
|
|
766
|
+
routingMethod?: string;
|
|
685
767
|
routing_method?: string;
|
|
686
768
|
agreement_pct?: number | null;
|
|
687
769
|
returned?: number | null;
|
|
770
|
+
seated?: number | null;
|
|
688
771
|
dissent?: number | null;
|
|
772
|
+
degradedReason?: string | null;
|
|
689
773
|
degraded_reason?: string | null;
|
|
774
|
+
seatConstraint?: string | null;
|
|
775
|
+
/** `gateEvaluated` (wave 6, F-7R2-005): `true` when NOTHING gated the unit — render as UNGATED. */
|
|
776
|
+
ungated?: boolean;
|
|
777
|
+
/** `gateEvaluated` (wave 6): why, when `ungated`. */
|
|
778
|
+
ungatedReason?: string | null;
|
|
779
|
+
/** `gateEvaluated` (wave 6, #449 @ 9e11685): why the deterministic layer is absent / why no judge ran. */
|
|
780
|
+
floorNote?: string | null;
|
|
781
|
+
judgeSkippedReason?: string | null;
|
|
782
|
+
/** `repoChecksEvaluated` (wave 6): the sandbox level, and why the sandbox / check detection failed. */
|
|
783
|
+
sandboxLevel?: string;
|
|
784
|
+
sandboxError?: string | null;
|
|
785
|
+
detectError?: string | null;
|
|
786
|
+
/** `workerToolCallDenied` (wave 6, F-7R2-012): the refused command / the remedy / the unit's role. */
|
|
787
|
+
command?: string;
|
|
788
|
+
remedy?: string;
|
|
789
|
+
role?: string;
|
|
790
|
+
/** `runBaseResolved` (wave 6, F-7R2-013): the run branch the worktree was minted on. */
|
|
791
|
+
runBranch?: string;
|
|
690
792
|
// councilConvened / councilDeliberated / councilVoted (live deliberation) — camelCase
|
|
691
793
|
// per event_to_json
|
|
692
794
|
clis?: string[];
|
|
693
795
|
consensus?: boolean;
|
|
694
|
-
|
|
796
|
+
/** councilConvened/Deliberated/Voted: a number; `unitDistributed` (api-types 0.36.0): `number | null`. */
|
|
797
|
+
agreementPct?: number | null;
|
|
695
798
|
votes?: number;
|
|
696
799
|
/** councilDeliberated: the completed ballot number (1-based). */
|
|
697
800
|
round?: number;
|
|
@@ -957,6 +1060,28 @@ export interface GateEvaluatedEvent {
|
|
|
957
1060
|
* pick, `false` when the judge fell back to the single default runner (prompt-only independence).
|
|
958
1061
|
* `null` when no judge ran or the seat is unknown. */
|
|
959
1062
|
judgeDistinct: boolean | null;
|
|
1063
|
+
/**
|
|
1064
|
+
* Wave 6 (F-7R2-005, api-types 0.36.0): `true` when NOTHING gated this unit — no deterministic
|
|
1065
|
+
* floor (no pinned validator, and the repo-checks floor did not apply), no agent judge, and an
|
|
1066
|
+
* EMPTY evaluator-policy selection — the exact default-allow shape run b86c14c1 passed seven times.
|
|
1067
|
+
* A consumer MUST render it as UNGATED, never as "pass", and a narrator must never say "checks
|
|
1068
|
+
* ran" without a `repoChecksEvaluated` for the same unit. Absent on an engine predating wave 6
|
|
1069
|
+
* (read `=== true`); `false` on a gated unit.
|
|
1070
|
+
*/
|
|
1071
|
+
ungated?: boolean;
|
|
1072
|
+
/** WHY, when `ungated` — each absent layer and its cause (`"no judge: no eligible judge seat
|
|
1073
|
+
* distinct from creator \`claude\` (roster: claude; benched: codex (signed out))"`). `null` when
|
|
1074
|
+
* gated; absent on an older engine. */
|
|
1075
|
+
ungatedReason?: string | null;
|
|
1076
|
+
/** Wave 6 (wicked-core#449 @ 9e11685, api-types 0.36.0): WHY the deterministic layer is absent —
|
|
1077
|
+
* set whenever `hasDeterministicFloor` is `false` on an agent unit, judge or not (`"no pinned
|
|
1078
|
+
* validator; the repo-checks floor did not apply: the tree was not changed"`). `null` when a
|
|
1079
|
+
* floor ran; absent on an older engine. */
|
|
1080
|
+
floorNote?: string | null;
|
|
1081
|
+
/** Wave 6: WHY no judge was convened for a unit that WANTED one (its tree changed and no pinned
|
|
1082
|
+
* validator gated it) — `"no eligible judge seat distinct from creator \`claude\` (roster: …;
|
|
1083
|
+
* benched: …)"`. `null` when a judge ran or none was wanted; absent on an older engine. */
|
|
1084
|
+
judgeSkippedReason?: string | null;
|
|
960
1085
|
}
|
|
961
1086
|
|
|
962
1087
|
/** Foundation wave: session started with enriched context. */
|
|
@@ -1024,6 +1149,12 @@ export type AcpFallbackKind =
|
|
|
1024
1149
|
| 'binary_unavailable'
|
|
1025
1150
|
| 'session_died'
|
|
1026
1151
|
| 'auth_required'
|
|
1152
|
+
/** Wave 6 (F-7R2-019, api-types 0.36.0): the ACP handshake was REFUSED for authentication — the
|
|
1153
|
+
* seat's account, not its binary (`pi-acp` existed; pi answered 401). The engine benches the seat
|
|
1154
|
+
* for the run and does NOT attempt the single-shot wrapped fallback (it fails the same way). */
|
|
1155
|
+
| 'auth_failed'
|
|
1156
|
+
/** Wave 6 — the seat reported no credential at all (`unauthenticated`); same bench, same no-retry. */
|
|
1157
|
+
| 'unauthenticated'
|
|
1027
1158
|
| 'governance_requires_wrapped'
|
|
1028
1159
|
| 'read_only_requires_wrapped'
|
|
1029
1160
|
| (string & {});
|
|
@@ -1264,8 +1395,19 @@ export type RepoChecksEvaluatedEvent = {
|
|
|
1264
1395
|
attempt: number;
|
|
1265
1396
|
passed: boolean;
|
|
1266
1397
|
criterion: string;
|
|
1398
|
+
/** The checks that RAN. EMPTY means "0 checks detected" — a consumer must say so, never "checks
|
|
1399
|
+
* ran"; since wave 6 the frame says WHY (`detectError`, `sandboxError`). */
|
|
1267
1400
|
checks: RepoCheckRun[];
|
|
1268
1401
|
skipped: string[];
|
|
1402
|
+
/** Wave 6 (wicked-core#449 @ 9e11685, api-types 0.36.0): the sandbox level the checks ran under
|
|
1403
|
+
* (`bwrap`, `sandbox-exec`, `none`, …). Absent on an older engine. */
|
|
1404
|
+
sandboxLevel?: string;
|
|
1405
|
+
/** Wave 6: why the sandbox could not be armed, when it could not (`null` when it was). */
|
|
1406
|
+
sandboxError?: string | null;
|
|
1407
|
+
/** Wave 6: why check DETECTION failed (an unreadable `package.json`, a manifest with no
|
|
1408
|
+
* `typecheck`/`lint`/`test` script, …) — the reason an empty `checks` is empty; `null` when
|
|
1409
|
+
* detection succeeded. */
|
|
1410
|
+
detectError?: string | null;
|
|
1269
1411
|
};
|
|
1270
1412
|
|
|
1271
1413
|
// ── wicked-core#431 gate / deliver evidence (F-3R2-013 / -010 / -009; api-types 0.33.0) ──────────
|
|
@@ -1404,6 +1546,11 @@ export type RunBaseResolvedEvent = {
|
|
|
1404
1546
|
fetched: boolean;
|
|
1405
1547
|
lifted: boolean;
|
|
1406
1548
|
note: string | null;
|
|
1549
|
+
/** Wave 6 (F-7R2-013, api-types 0.36.0): the run branch the worktree was minted on
|
|
1550
|
+
* (`wicked/<run id>`, sanitized), recorded on the session as `run_branch` beside `base_commit`
|
|
1551
|
+
* so the run's diff is servable from the branch once the worktree is reaped. Absent on an
|
|
1552
|
+
* engine predating wave 6. */
|
|
1553
|
+
runBranch?: string;
|
|
1407
1554
|
};
|
|
1408
1555
|
|
|
1409
1556
|
/** The gate-evidence events (wicked-core F-036/F-039, extended by wicked-core#431 — api-types 0.33.0
|
|
@@ -1411,12 +1558,45 @@ export type RunBaseResolvedEvent = {
|
|
|
1411
1558
|
* {@link EvaluatorToolCallDeniedEvent}) as a discriminated union for consumers that narrow on `type`;
|
|
1412
1559
|
* they also flow through the permissive {@link CoreEvent}. {@link RunBaseResolvedEvent} is
|
|
1413
1560
|
* session-level evidence and stands on its own. */
|
|
1561
|
+
/**
|
|
1562
|
+
* Wave 6 (F-7R2-012, api-types 0.36.0) — a WORKER seat asked to run a REMOTE-WRITING command
|
|
1563
|
+
* (`git push`, `gh pr create|merge|edit|comment`, a `gh api` mutation, `gh release`, …) and the
|
|
1564
|
+
* engine REFUSED it: delivery is performed by the run's deliver phase (which lifts, re-verifies,
|
|
1565
|
+
* pushes and opens the PR so the ledger records it), never by a creator or evaluator seat. Emitted
|
|
1566
|
+
* on both carriers: the ACP permission bridge (`carrier: 'acp'`) answers the seat's permission
|
|
1567
|
+
* request with its reject option; the wrapped carrier's PreToolUse gate hook (`carrier:
|
|
1568
|
+
* 'wrapped_cli'`) blocks the call and the fold replays the record at the gate. A refusal costs the
|
|
1569
|
+
* seat one tool call, never the unit — the seat continues with `remedy`. Spelled exactly as
|
|
1570
|
+
* wicked-core's `CoreEvent::to_json` emits it. `type` alias on purpose (relays through the
|
|
1571
|
+
* `CoreEvent`-typed seams unchanged).
|
|
1572
|
+
*/
|
|
1573
|
+
export type WorkerToolCallDeniedEvent = {
|
|
1574
|
+
type: 'workerToolCallDenied';
|
|
1575
|
+
session: string;
|
|
1576
|
+
ord: number;
|
|
1577
|
+
attempt: number;
|
|
1578
|
+
/** The registry seat key. */
|
|
1579
|
+
cli: string;
|
|
1580
|
+
/** `'acp'` | `'wrapped_cli'`; open-ended for a future carrier. */
|
|
1581
|
+
carrier: 'acp' | 'wrapped_cli' | (string & {});
|
|
1582
|
+
/** The unit's role (`creator` | `evaluator` | `neutral`). */
|
|
1583
|
+
role: 'creator' | 'evaluator' | 'neutral' | (string & {});
|
|
1584
|
+
/** The tool the seat invoked (`Bash`, `bash`, `shell`, …). */
|
|
1585
|
+
tool: string;
|
|
1586
|
+
/** The command text the seat sent. */
|
|
1587
|
+
command: string;
|
|
1588
|
+
reason: string;
|
|
1589
|
+
/** What the seat was told to do instead ("delivery is performed by the run's deliver phase"). */
|
|
1590
|
+
remedy: string;
|
|
1591
|
+
};
|
|
1592
|
+
|
|
1414
1593
|
export type GateEvidenceEvent =
|
|
1415
1594
|
| EvaluatorMutatedWorktreeEvent
|
|
1416
1595
|
| RepoChecksEvaluatedEvent
|
|
1417
1596
|
| WorktreeRestoredEvent
|
|
1418
1597
|
| DeliverLiftEvaluatedEvent
|
|
1419
|
-
| EvaluatorToolCallDeniedEvent
|
|
1598
|
+
| EvaluatorToolCallDeniedEvent
|
|
1599
|
+
| WorkerToolCallDeniedEvent;
|
|
1420
1600
|
|
|
1421
1601
|
// ── P2 decisions-full observability events (wicked-core EVT-001/012/013) ────
|
|
1422
1602
|
|
|
@@ -1488,17 +1668,64 @@ export interface UnitPlannedEvent {
|
|
|
1488
1668
|
executor_type: 'agent' | 'tool';
|
|
1489
1669
|
}
|
|
1490
1670
|
|
|
1491
|
-
/**
|
|
1671
|
+
/**
|
|
1672
|
+
* Foundation wave: a unit was distributed with full routing detail.
|
|
1673
|
+
*
|
|
1674
|
+
* WIRE SPELLING (api-types 0.36.0, crew#533 follow-through): the engine's `CoreEvent::to_json` and
|
|
1675
|
+
* the napi frames spell these fields camelCase — `routingMethod`, `agreementPct`, `returned`,
|
|
1676
|
+
* `seated`, `dissent`, `degradedReason`, `seatConstraint` — exactly as `wicked-core-ts`'s own
|
|
1677
|
+
* `UnitDistributedEventJson` declares them; `packages/crew/tests/wire-contract.test.ts` pins this
|
|
1678
|
+
* interface against that type AND against a recorded frame. Pre-0.36 this interface declared the
|
|
1679
|
+
* snake_case spellings, which the engine never emitted — a consumer reading `degraded_reason` got
|
|
1680
|
+
* `undefined` and rendered a benched council as whole. The snake_case names stay for ONE minor as
|
|
1681
|
+
* `@deprecated` optional aliases (a normalising relay may still produce them); consumers read the
|
|
1682
|
+
* camelCase names. Every camelCase `Option` field is emitted unconditionally: `null`, never absent.
|
|
1683
|
+
*/
|
|
1492
1684
|
export interface UnitDistributedEvent {
|
|
1493
1685
|
type: 'unitDistributed';
|
|
1494
1686
|
session: string;
|
|
1495
1687
|
ord: number;
|
|
1688
|
+
/** The roster key of the assigned seat. */
|
|
1496
1689
|
cli: string;
|
|
1497
|
-
|
|
1498
|
-
|
|
1690
|
+
/** How the seat was chosen: the council verdict, a degrade to the first candidate, an
|
|
1691
|
+
* evaluator ≠ creator reassignment, or a deterministic tool execution. */
|
|
1692
|
+
routingMethod: 'council' | 'degraded' | 'evaluator_distinct' | 'tool';
|
|
1693
|
+
agreementPct: number | null;
|
|
1694
|
+
/** Ballots that came back. Read against `seated`. */
|
|
1499
1695
|
returned: number | null;
|
|
1696
|
+
/** Seats CONVENED for the council that produced this assignment (`null` = unknown / not a council). */
|
|
1697
|
+
seated: number | null;
|
|
1500
1698
|
dissent: number | null;
|
|
1501
|
-
|
|
1699
|
+
/**
|
|
1700
|
+
* WHY the routing was degraded. Since wave 6 (F-7R2-006) the engine sets it on EVERY routing arm
|
|
1701
|
+
* whenever the eligible seat set is smaller than the configured roster — `"4 of 5 seats benched:
|
|
1702
|
+
* codex (signed out — launcher), pi (unauthenticated — ballot), …"` — not only for its `degraded`
|
|
1703
|
+
* arm, so a council that held on a fraction of its seats reads as degraded. `null` when whole.
|
|
1704
|
+
*/
|
|
1705
|
+
degradedReason: string | null;
|
|
1706
|
+
/** WHY the candidate seats were narrowed BEFORE the council voted (core#401): a non-portable
|
|
1707
|
+
* skill constrained the unit to a claude seat. `null` when every roster seat was a candidate. */
|
|
1708
|
+
seatConstraint: string | null;
|
|
1709
|
+
/** @deprecated api-types 0.36.0 — the engine emits `routingMethod`; removed in 0.37. */
|
|
1710
|
+
routing_method?: 'council' | 'degraded' | 'evaluator_distinct' | 'tool';
|
|
1711
|
+
/** @deprecated api-types 0.36.0 — the engine emits `agreementPct`; removed in 0.37. */
|
|
1712
|
+
agreement_pct?: number | null;
|
|
1713
|
+
/** @deprecated api-types 0.36.0 — the engine emits `degradedReason`; removed in 0.37. */
|
|
1714
|
+
degraded_reason?: string | null;
|
|
1715
|
+
}
|
|
1716
|
+
|
|
1717
|
+
/** One seat the wave-6 engine BENCHED for a run (`AgentSession.benched_seats`, F-7R2-006): never
|
|
1718
|
+
* convened, never a failover or judge target, named in `unitDistributed.degradedReason`. */
|
|
1719
|
+
export interface BenchedSeat {
|
|
1720
|
+
/** The roster key. */
|
|
1721
|
+
cli: string;
|
|
1722
|
+
/** Why — the launcher's words (`signed out`) or the engine's classification (`not_logged_in`,
|
|
1723
|
+
* `unauthenticated`). */
|
|
1724
|
+
reason: string;
|
|
1725
|
+
/** Who benched it: `launcher` (the roster's health probe — crew's `council_eligible`), `ballot`
|
|
1726
|
+
* (a council seat failure), `worker` (a unit's worker failed with an auth refusal), `judge`
|
|
1727
|
+
* (the seat failed while judging another unit — wicked-core#449 @ 9e11685). */
|
|
1728
|
+
source: 'launcher' | 'ballot' | 'worker' | 'judge' | (string & {});
|
|
1502
1729
|
}
|
|
1503
1730
|
|
|
1504
1731
|
// ── Worker injection + reassignment events (core#93) ──────────────────────────
|
|
@@ -1962,8 +2189,40 @@ export interface SkillsManifestResponse {
|
|
|
1962
2189
|
root: string;
|
|
1963
2190
|
/** The VERIFIED published snapshot `current` resolves to, or `null` before the first publish.
|
|
1964
2191
|
* `path` is the absolute REAL path of `snapshots/<gen>` — byte-identical to the one input the
|
|
1965
|
-
* engine is handed (`WICKED_SKILLS_SNAPSHOT`; design v3.1 §2).
|
|
1966
|
-
|
|
2192
|
+
* engine is handed (`WICKED_SKILLS_SNAPSHOT`; design v3.1 §2). `rules` / `drift` (api-types
|
|
2193
|
+
* 0.36.0, F-083 / crew#535) ride beside it on a daemon ≥ 0.7.30 — absent on an older one. */
|
|
2194
|
+
current: {
|
|
2195
|
+
gen: number;
|
|
2196
|
+
path: string;
|
|
2197
|
+
/** The portability rules the generation was published under vs the rules this daemon runs:
|
|
2198
|
+
* `recorded` is `null` for a generation predating the identity (0.7.29 and earlier);
|
|
2199
|
+
* `stale: true` = they differ and the daemon raised `skills.stale-rules`. */
|
|
2200
|
+
rules?: {
|
|
2201
|
+
recorded: PortabilityRulesIdentity | null;
|
|
2202
|
+
running: PortabilityRulesIdentity;
|
|
2203
|
+
stale: boolean;
|
|
2204
|
+
};
|
|
2205
|
+
/** The rows whose portability derives differently under the running rules than the snapshot
|
|
2206
|
+
* recorded — the `skills.stale-rules` warning names up to five; the list carries the rest.
|
|
2207
|
+
* `recorded.reasons` is `null` for a row written before per-reason portability (0.34.0). */
|
|
2208
|
+
drift?: SnapshotRowDrift[];
|
|
2209
|
+
} | null;
|
|
2210
|
+
}
|
|
2211
|
+
|
|
2212
|
+
/** The identity of a portability-rule table (api-types 0.36.0, F-083): its version and the
|
|
2213
|
+
* sha256 of the committed parity fixture (`tests/fixtures/portability_rules.json`). */
|
|
2214
|
+
export interface PortabilityRulesIdentity {
|
|
2215
|
+
version: number;
|
|
2216
|
+
sha256: string;
|
|
2217
|
+
}
|
|
2218
|
+
|
|
2219
|
+
/** One snapshot row whose portability the RUNNING rules derive differently than the snapshot
|
|
2220
|
+
* recorded (api-types 0.36.0, F-083) — see `SkillsManifestResponse.current.drift`. */
|
|
2221
|
+
export interface SnapshotRowDrift {
|
|
2222
|
+
name: string;
|
|
2223
|
+
recorded: { portable: boolean; reasons: SkillPortabilityReason[] | null };
|
|
2224
|
+
/** What the RUNNING rules derive for the row — the same per-reason shape `SkillEntry.portability` carries. */
|
|
2225
|
+
derived: SkillPortability;
|
|
1967
2226
|
}
|
|
1968
2227
|
|
|
1969
2228
|
export interface SkillFileEntry {
|
|
@@ -2565,6 +2824,148 @@ export interface TestingReconResponse {
|
|
|
2565
2824
|
projectAttachError?: string;
|
|
2566
2825
|
}
|
|
2567
2826
|
|
|
2827
|
+
// ── The governed test-authoring launch (wave 6; api-types 0.36.0) ──────────────────────────────
|
|
2828
|
+
|
|
2829
|
+
/**
|
|
2830
|
+
* The id of the governed test-authoring workflow the daemon serves (`GET /workflows` lists it, not
|
|
2831
|
+
* `is_system` — an operator-selectable work mode): recon (`wicked-garden-qe` plan) → author
|
|
2832
|
+
* (creator, evidence-floor pinned, `wicked-garden-qe` author) → verify (a TOOL phase that RUNS every
|
|
2833
|
+
* produced test under the repository's own harness — vitest/jest/pytest/Playwright — and FAILS the
|
|
2834
|
+
* unit when one fails or was never executed) → review (evaluator ≠ creator, `wicked-garden-qe`
|
|
2835
|
+
* review) → the ENGINE's deliver phase (appended per run; never a worker's `gh pr create`).
|
|
2836
|
+
* F-7R2-003/004/005/012/014/015 + acceptance R4-r2.
|
|
2837
|
+
*/
|
|
2838
|
+
export type QeAuthorTestsWorkflowId = 'qe-author-tests';
|
|
2839
|
+
|
|
2840
|
+
/**
|
|
2841
|
+
* Body of `POST /testing/author` — the Testing page's "New test". Same scope wire as
|
|
2842
|
+
* {@link TestingReconBody} (`repoRefs` and/or `projectId`, resolved server-side), but the scope
|
|
2843
|
+
* MUST resolve to ≥ 1 repo (a test-authoring run writes into a repository; an unscoped author is a
|
|
2844
|
+
* 400). One governed `qe-author-tests` run per resolved repo, each filed under the repo's
|
|
2845
|
+
* `qe-tests-<repo name>` label group (`RunGroup` on `GET /campaigns`).
|
|
2846
|
+
*/
|
|
2847
|
+
export interface TestingAuthorBody {
|
|
2848
|
+
/** The operator's intent — what to test — verbatim; the run's problem statement. */
|
|
2849
|
+
problem: string;
|
|
2850
|
+
/** The project to FILE the runs into. Alone: the scope is the project's `crew.repo` members. */
|
|
2851
|
+
projectId?: string;
|
|
2852
|
+
/**
|
|
2853
|
+
* The repos to author into (registry id or name). With `projectId`, THIS is the scope and the
|
|
2854
|
+
* project is the filing only (a NARROWED project scope — studio #263 F-4): the runs are filed
|
|
2855
|
+
* into the project without inheriting its other repo members, so a skin with repo chips names
|
|
2856
|
+
* the repos and the project once instead of fanning one `POST /runs` per repo (one deliver/PR
|
|
2857
|
+
* each). Unlike {@link TestingReconBody}, where both fields union. The 201 says which was used
|
|
2858
|
+
* (`scope`).
|
|
2859
|
+
*/
|
|
2860
|
+
repoRefs?: string[];
|
|
2861
|
+
/** EXPLICITLY launch unattended (no intake gate). Default `false`: each run pauses at its intake
|
|
2862
|
+
* gate (`before:1`) with the plan on the table before any unit runs. */
|
|
2863
|
+
ungated?: boolean;
|
|
2864
|
+
/** `pr` (default) — the ENGINE's deliver phase opens the PR; `none` — the tests stay on the run
|
|
2865
|
+
* branch (`delivery: 'stranded'` on the wire, liftable via `POST /runs/:id/deliver`). */
|
|
2866
|
+
deliver?: 'pr' | 'none';
|
|
2867
|
+
}
|
|
2868
|
+
|
|
2869
|
+
/** One planned phase as the intake gate shows it — derived from the workflow DEFINITION. */
|
|
2870
|
+
export interface WorkflowPlanPhase {
|
|
2871
|
+
id: string;
|
|
2872
|
+
kind: StageKindPhase;
|
|
2873
|
+
role: PhaseRole;
|
|
2874
|
+
executor: 'agent' | 'tool';
|
|
2875
|
+
/** The garden skill the phase routes through (`wicked-garden-qe`), `null` for a tool phase. */
|
|
2876
|
+
skillRef: string | null;
|
|
2877
|
+
/** `auto` | `human` (unconditional confirm) | `human_if_not_pass` (a not-pass verdict escalates). */
|
|
2878
|
+
gate: 'auto' | 'human' | 'human_if_not_pass';
|
|
2879
|
+
executesCode: boolean;
|
|
2880
|
+
/** `true` for the phase the ENGINE appends and owns (the deliver phase) — not in the def. */
|
|
2881
|
+
engine?: boolean;
|
|
2882
|
+
}
|
|
2883
|
+
|
|
2884
|
+
/** The plan the intake gate shows (F-7R2-008): the phases in order + the seats a council may
|
|
2885
|
+
* pick from (the launcher's eligible roster — benched seats excluded). */
|
|
2886
|
+
export interface WorkflowPlan {
|
|
2887
|
+
workflow: string;
|
|
2888
|
+
phases: WorkflowPlanPhase[];
|
|
2889
|
+
seats: string[];
|
|
2890
|
+
}
|
|
2891
|
+
|
|
2892
|
+
/** One launched authoring run and the label group it was filed under. */
|
|
2893
|
+
export interface TestingAuthorRun {
|
|
2894
|
+
runId: string;
|
|
2895
|
+
repoRef: string;
|
|
2896
|
+
/** `qe-tests-<repo name>` — the `RunGroup.label` on `GET /campaigns`. */
|
|
2897
|
+
label: string;
|
|
2898
|
+
}
|
|
2899
|
+
|
|
2900
|
+
/**
|
|
2901
|
+
* The `POST /testing/author` 201 body. `runIds` is the source of truth (one per resolved repo in
|
|
2902
|
+
* the caller's order); `runId` is its first entry. `plan` is what the intake card renders before
|
|
2903
|
+
* approval; `gate` says whether the runs paused there. `campaignRegistered` is always `false`: an
|
|
2904
|
+
* author launch is filed as label groups, never an engine campaign (campaign nodes are
|
|
2905
|
+
* engine-launched and would not receive the daemon's deliver composition).
|
|
2906
|
+
*/
|
|
2907
|
+
export interface TestingAuthorResponse {
|
|
2908
|
+
runId: string;
|
|
2909
|
+
runIds: string[];
|
|
2910
|
+
workflow: QeAuthorTestsWorkflowId;
|
|
2911
|
+
runs: TestingAuthorRun[];
|
|
2912
|
+
gate: 'before:1' | 'none';
|
|
2913
|
+
deliver: 'pr' | 'none';
|
|
2914
|
+
plan: WorkflowPlan;
|
|
2915
|
+
/** How the repos were chosen: `repoRefs` — the named repos (a `projectId`, when given, was the
|
|
2916
|
+
* filing only); `project` — the project's `crew.repo` members. Absent on a daemon predating it. */
|
|
2917
|
+
scope?: 'repoRefs' | 'project';
|
|
2918
|
+
campaignRegistered: false;
|
|
2919
|
+
}
|
|
2920
|
+
|
|
2921
|
+
/** One produced test file as the verify phase judged it. */
|
|
2922
|
+
export interface TestSetFile {
|
|
2923
|
+
path: string;
|
|
2924
|
+
/** `playwright` | `playwright-python` | `vitest` | `jest` | `pytest` | `python` | `unknown`. */
|
|
2925
|
+
harness: string;
|
|
2926
|
+
status: 'passed' | 'failed' | 'not-executed';
|
|
2927
|
+
}
|
|
2928
|
+
|
|
2929
|
+
/**
|
|
2930
|
+
* A registered TEST SET (wave 6, F-7R2-014; api-types 0.36.0) — the produced tests of a terminal
|
|
2931
|
+
* `qe-author-tests` run, read back from its verify phase's `QE-VERIFY` report and recorded as a
|
|
2932
|
+
* durable `testing.testset.registered` audit entry the daemon hydrates at boot. Served as
|
|
2933
|
+
* `CampaignsListResponse.test_sets` — what the Test landing counts. Deny-dominates: a run whose
|
|
2934
|
+
* verify phase FAILED registers too (`verified: false`, counts intact) so a red set is shown, never
|
|
2935
|
+
* hidden; a run that never reached its verdict registers with zero counts and `plan: null`.
|
|
2936
|
+
*/
|
|
2937
|
+
export interface TestSet {
|
|
2938
|
+
/** `testset-<run id>` — one set per producing run. */
|
|
2939
|
+
id: string;
|
|
2940
|
+
run_id: string;
|
|
2941
|
+
workflow_id: QeAuthorTestsWorkflowId;
|
|
2942
|
+
/** The `RunGroup.label` the launch filed the run under, when it did. */
|
|
2943
|
+
label?: string;
|
|
2944
|
+
repo_ref: string | null;
|
|
2945
|
+
repo_name?: string;
|
|
2946
|
+
/** Unix millis. */
|
|
2947
|
+
registered_at: number;
|
|
2948
|
+
/** The producing run's terminal status. */
|
|
2949
|
+
run_status: SessionStatus | (string & {});
|
|
2950
|
+
/** The verify unit's status (`done` | `rejected` | …); `null` when the run never planned one. */
|
|
2951
|
+
verify_status: string | null;
|
|
2952
|
+
/** `true` ONLY when the verify phase passed: ≥ 1 produced test, every one executed and green,
|
|
2953
|
+
* the repository checks green, the PLAN present. */
|
|
2954
|
+
verified: boolean;
|
|
2955
|
+
files: TestSetFile[];
|
|
2956
|
+
produced: number;
|
|
2957
|
+
executed: number;
|
|
2958
|
+
passed: number;
|
|
2959
|
+
failed: number;
|
|
2960
|
+
not_executed: number;
|
|
2961
|
+
/** The produced `tests/PLAN-*.md`, `null` when none was produced. */
|
|
2962
|
+
plan: string | null;
|
|
2963
|
+
/** The harnesses the produced tests ran under (unique, first-use order). */
|
|
2964
|
+
harnesses: string[];
|
|
2965
|
+
/** The delivered PR, when the engine's deliver phase opened one. */
|
|
2966
|
+
deliverUrl?: string;
|
|
2967
|
+
}
|
|
2968
|
+
|
|
2568
2969
|
// ── Governance claims (crew#40/43) ─────────────────────────────────────────────
|
|
2569
2970
|
|
|
2570
2971
|
/**
|
|
@@ -2625,6 +3026,18 @@ export interface LaunchRunBody {
|
|
|
2625
3026
|
* omit the field entirely against pre-0.18 servers.
|
|
2626
3027
|
*/
|
|
2627
3028
|
deliver?: 'pr' | 'none';
|
|
3029
|
+
/**
|
|
3030
|
+
* Who confirms the deliver phase (F-E2E-030; api-types 0.37.0, additive). `'human'` — the default when omitted:
|
|
3031
|
+
* the ENGINE pauses before the composed `deliver` Tool unit pushes the run branch and opens the
|
|
3032
|
+
* PR, whatever `humanConfirm` says (the push leaves the machine under the daemon's active gh
|
|
3033
|
+
* account, so it is confirmed unless the caller opts out). `'auto'` — the caller's EXPLICIT
|
|
3034
|
+
* opt-out: the push and PR follow verify unattended; a client sending it must name the posture
|
|
3035
|
+
* "auto-deliver" to its operator. `humanConfirm: 'none'` is NOT an opt-out (it is that field's
|
|
3036
|
+
* default and typo fallback). Requires wicked-core-ts ≥ 0.7.24 / crew ≥ 0.7.33 for the gate to
|
|
3037
|
+
* exist at all — read `AgentSession.auto_deliver` to learn whether the engine knows it. An
|
|
3038
|
+
* older daemon's launch schema rejects the field with a 400 — omit it against such servers.
|
|
3039
|
+
*/
|
|
3040
|
+
deliverGate?: 'human' | 'auto';
|
|
2628
3041
|
/**
|
|
2629
3042
|
* Retry lineage (DES-UX-001 §8.3, CREW-UX-3; api-types 0.8.0): the id of the run this
|
|
2630
3043
|
* launch retries. Must name an EXISTING run id — an unknown id fails the launch (400 with
|
|
@@ -3329,6 +3742,12 @@ export interface InteractiveStatusPosted {
|
|
|
3329
3742
|
message?: string;
|
|
3330
3743
|
/** The edit seam stamps the handoff version it is answering. */
|
|
3331
3744
|
version?: number;
|
|
3745
|
+
/** Wave 6 (F-4R2-005 root fix; api-types 0.36.0): the governed run this narration is about, so a
|
|
3746
|
+
* skin keys the thread per run. Absent on a pre-launch status and on a pre-0.36 daemon. */
|
|
3747
|
+
run_id?: string;
|
|
3748
|
+
/** Wave 6: the unit (ord) the line narrates — the latest unit-scoped engine frame's `ord`, so a
|
|
3749
|
+
* skin renders one council at a time. Absent before the first unit-scoped frame. */
|
|
3750
|
+
unit_ord?: number;
|
|
3332
3751
|
}
|
|
3333
3752
|
|
|
3334
3753
|
/**
|
|
@@ -3357,6 +3776,62 @@ export interface InteractiveDocSummary {
|
|
|
3357
3776
|
projectId: string;
|
|
3358
3777
|
}
|
|
3359
3778
|
|
|
3779
|
+
/**
|
|
3780
|
+
* `GET /api/v1/interactive/docs` (api-types 0.36.0, studio #263) — every interactive document across
|
|
3781
|
+
* projects, listed by the DAEMON from disk WITHOUT spawning a bridge: each project's docs root
|
|
3782
|
+
* (the per-project `interactiveRoot` binding, else `WICKED_INTERACTIVE_ROOT`, else the default
|
|
3783
|
+
* root / its `projects/<id>` partition), each slug-named child carrying a `versions.json`, read by
|
|
3784
|
+
* the bridge's own `listDocs` rules — plus what only the daemon knows: the seams that answered
|
|
3785
|
+
* the document and the governed runs they launched (the handoff ledgers). The per-project
|
|
3786
|
+
* `GET /projects/:id/interactive/api/docs` spawns one bridge per project (≈60 s cold start) — a
|
|
3787
|
+
* skin must never fan that out on mount; this is the listing it mounts with. `?includeRetired=1`
|
|
3788
|
+
* lists tombstoned rows too.
|
|
3789
|
+
*/
|
|
3790
|
+
export interface InteractiveDocsListing {
|
|
3791
|
+
/** Newest first (by `updatedAt`), then by name. */
|
|
3792
|
+
docs: InteractiveDocIndexRow[];
|
|
3793
|
+
/** Project docs roots the daemon could not read (or a partition its containment walk refused),
|
|
3794
|
+
* with the reason — never silently dropped. `[]` when every root was readable. */
|
|
3795
|
+
unreachable: InteractiveDocsUnreachable[];
|
|
3796
|
+
}
|
|
3797
|
+
|
|
3798
|
+
/** The seams that can answer a document (the handoff ledgers). */
|
|
3799
|
+
export type InteractiveSeamKind = 'draft' | 'edit' | 'chat' | 'demo' | (string & {});
|
|
3800
|
+
|
|
3801
|
+
/** One document on the daemon-wide listing (api-types 0.36.0). */
|
|
3802
|
+
export interface InteractiveDocIndexRow {
|
|
3803
|
+
/** The project whose docs root holds the document. A root SHARED by several projects (an
|
|
3804
|
+
* explicit `interactiveRoot` binding, or `WICKED_INTERACTIVE_ROOT` applying to all) lists once,
|
|
3805
|
+
* under the first project in listing order (the synthesized `default` first). */
|
|
3806
|
+
projectId: string;
|
|
3807
|
+
/** The doc name (slug). */
|
|
3808
|
+
name: string;
|
|
3809
|
+
/** Manifest `kind`; a manifest without one lists as `doc`. */
|
|
3810
|
+
kind: 'doc' | 'html' | 'source' | 'demo' | (string & {});
|
|
3811
|
+
/** Head version; `null` when the manifest carries none. */
|
|
3812
|
+
head: number | null;
|
|
3813
|
+
/** Lineage size. */
|
|
3814
|
+
versions: number;
|
|
3815
|
+
/** ISO-8601 of the head (last) version, or `null` when the lineage is empty. */
|
|
3816
|
+
updatedAt: string | null;
|
|
3817
|
+
/** Present only on a retired (tombstoned) row, listed only with `?includeRetired=1`. */
|
|
3818
|
+
retired?: true;
|
|
3819
|
+
/** ISO-8601 retirement timestamp; present with `retired`. */
|
|
3820
|
+
retiredAt?: string;
|
|
3821
|
+
/** The seams that answered this document, from the handoff ledgers (`[]` = none yet). */
|
|
3822
|
+
kinds: InteractiveSeamKind[];
|
|
3823
|
+
/** The governed runs those seams launched for it (ledger order) — the doc ↔ run binding. */
|
|
3824
|
+
runs: string[];
|
|
3825
|
+
}
|
|
3826
|
+
|
|
3827
|
+
/** A project docs root the listing could not read (api-types 0.36.0). */
|
|
3828
|
+
export interface InteractiveDocsUnreachable {
|
|
3829
|
+
projectId: string;
|
|
3830
|
+
/** The resolved root, or `null` when the containment walk refused the partition before resolving one. */
|
|
3831
|
+
root: string | null;
|
|
3832
|
+
error: string;
|
|
3833
|
+
}
|
|
3834
|
+
|
|
3360
3835
|
/**
|
|
3361
3836
|
* One normalized entry of the merged project activity feed
|
|
3362
3837
|
* (`GET /projects/:id/activity`, ADR §5.2): core events of member runs/chats
|
|
@@ -3491,9 +3966,22 @@ export interface ChatSeatOutcome {
|
|
|
3491
3966
|
* REQUESTED seat (`clis`) the engine refused (`ChatSeatOutcome.ok: false`, its `error` repeated
|
|
3492
3967
|
* here as `reason`). One list for the scope card and the thread to read.
|
|
3493
3968
|
*/
|
|
3969
|
+
/**
|
|
3970
|
+
* Why a seat was not seated (api-types 0.36.0, F-A45-011): `auth` — signed out (the probe, or the
|
|
3971
|
+
* seat's own "no credential" report); `scope` — the scoped-chat admission rule; `bench` — benched by
|
|
3972
|
+
* this daemon's recent councils; `budget` — the engine did not warm it within its dispatch budget
|
|
3973
|
+
* (the seat timed out or was dropped at dispatch); `engine` — the engine refused it with its own
|
|
3974
|
+
* reason. Open-ended so a newer daemon's source parses in an older skin.
|
|
3975
|
+
*/
|
|
3976
|
+
export type ChatRefusalSource = 'auth' | 'scope' | 'bench' | 'budget' | 'engine' | (string & {});
|
|
3977
|
+
|
|
3494
3978
|
export interface ChatSeatRefusal {
|
|
3495
3979
|
cliKey: string;
|
|
3496
3980
|
reason: string;
|
|
3981
|
+
/** api-types 0.36.0 (F-A45-011): the cause class. Absent on a daemon predating the field. Since
|
|
3982
|
+
* 0.36.0 EVERY requested-or-defaulted seat that is not in `seats` as warm has an entry — a seat
|
|
3983
|
+
* the engine DROPPED at dispatch (absent from `seats` altogether) included, never a silent gap. */
|
|
3984
|
+
source?: ChatRefusalSource;
|
|
3497
3985
|
}
|
|
3498
3986
|
|
|
3499
3987
|
/** `POST /chats` → 201. */
|
|
@@ -3522,6 +4010,8 @@ export type ChatSeatRefusedFrame = {
|
|
|
3522
4010
|
chat: string;
|
|
3523
4011
|
cliKey: string;
|
|
3524
4012
|
reason: string;
|
|
4013
|
+
/** api-types 0.36.0 (F-A45-011): the cause class — see {@link ChatRefusalSource}. */
|
|
4014
|
+
source?: ChatRefusalSource;
|
|
3525
4015
|
project_id?: string;
|
|
3526
4016
|
};
|
|
3527
4017
|
|
|
@@ -3551,6 +4041,10 @@ export interface ChatDetailResponse {
|
|
|
3551
4041
|
seats: string[];
|
|
3552
4042
|
/** The scope recorded at open; `null` for a chat this daemon did not open (or after a restart). */
|
|
3553
4043
|
scope: ChatScope | null;
|
|
4044
|
+
/** The seats refused at open (api-types 0.36.0, F-A45-011) — the same list the 201 carried, so
|
|
4045
|
+
* the admission copy survives a reload; `null` for a chat this daemon did not open; absent on a
|
|
4046
|
+
* daemon predating the field. */
|
|
4047
|
+
refused?: ChatSeatRefusal[] | null;
|
|
3554
4048
|
}
|
|
3555
4049
|
|
|
3556
4050
|
// ── Project code graph (DES-PROJECT-001; the co-located multi-repo graph) ──────
|
|
@@ -3945,6 +4439,9 @@ export interface RunGroup {
|
|
|
3945
4439
|
export interface CampaignsListResponse {
|
|
3946
4440
|
campaigns: Campaign[];
|
|
3947
4441
|
groups: RunGroup[];
|
|
4442
|
+
/** The registered test sets (wave 6, F-7R2-014; api-types 0.36.0 — ADDITIVE: a pre-0.36 daemon
|
|
4443
|
+
* omits it). Newest first. See {@link TestSet}. */
|
|
4444
|
+
test_sets?: TestSet[];
|
|
3948
4445
|
}
|
|
3949
4446
|
|
|
3950
4447
|
/**
|
|
@@ -4239,8 +4736,18 @@ export interface DiagnosticsSkillsFinding {
|
|
|
4239
4736
|
* (`error`, api-types 0.29.0) = `manifest.json` could not be read when diagnostics were taken
|
|
4240
4737
|
* (corrupt, unreadable, or the root no longer the one the store bound) — reported as
|
|
4241
4738
|
* `config-error` with the cause instead of the stale boot outcome; the exported engine input is
|
|
4242
|
-
* unchanged until the daemon restarts.
|
|
4243
|
-
|
|
4739
|
+
* unchanged until the daemon restarts; `skills.stale-rules` (`warning`, api-types 0.36.0, F-083 /
|
|
4740
|
+
* crew#535) = the CURRENT generation was published under OTHER portability rules than the daemon
|
|
4741
|
+
* now runs — accepted (the snapshot is never rewritten; the runtime stays `published`), the rows
|
|
4742
|
+
* that now derive differently are named (`SkillsManifestResponse.current.drift`), and a publish
|
|
4743
|
+
* records the running rules and clears it. */
|
|
4744
|
+
kind:
|
|
4745
|
+
| 'skills.fallback'
|
|
4746
|
+
| 'skills.blocked'
|
|
4747
|
+
| 'skills.config'
|
|
4748
|
+
| 'skills.source'
|
|
4749
|
+
| 'skills.manifest'
|
|
4750
|
+
| 'skills.stale-rules';
|
|
4244
4751
|
severity: 'warning' | 'error';
|
|
4245
4752
|
message: string;
|
|
4246
4753
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "wicked-crew-api-types",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.37.0",
|
|
4
4
|
"description": "The wire contract of the wicked-crew daemon's /api/v1 REST surface and /ws CoreEvent frames \u2014 types only, zero runtime",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"types": "./index.d.ts",
|