wicked-crew 0.7.35 → 0.7.36
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/dist/api/chat-scope.d.ts +25 -1
- package/dist/api/chat-scope.d.ts.map +1 -1
- package/dist/api/chat-scope.js +59 -10
- package/dist/api/chat-scope.js.map +1 -1
- package/dist/api/delivery-cache.d.ts +23 -6
- package/dist/api/delivery-cache.d.ts.map +1 -1
- package/dist/api/delivery-cache.js +27 -17
- package/dist/api/delivery-cache.js.map +1 -1
- package/dist/api/delivery-index.d.ts +45 -3
- package/dist/api/delivery-index.d.ts.map +1 -1
- package/dist/api/delivery-index.js +79 -4
- package/dist/api/delivery-index.js.map +1 -1
- package/dist/api/retry-index.d.ts +14 -0
- package/dist/api/retry-index.d.ts.map +1 -1
- package/dist/api/retry-index.js +29 -0
- package/dist/api/retry-index.js.map +1 -1
- package/dist/api/roster-standing.d.ts +4 -4
- package/dist/api/roster-standing.d.ts.map +1 -1
- package/dist/api/roster-standing.js +24 -12
- package/dist/api/roster-standing.js.map +1 -1
- package/dist/api/routes.d.ts +138 -10
- package/dist/api/routes.d.ts.map +1 -1
- package/dist/api/routes.js +261 -39
- package/dist/api/routes.js.map +1 -1
- package/dist/api/run-timing-index.d.ts +22 -0
- package/dist/api/run-timing-index.d.ts.map +1 -1
- package/dist/api/run-timing-index.js +34 -0
- package/dist/api/run-timing-index.js.map +1 -1
- package/dist/api/seat-health.d.ts +2 -46
- package/dist/api/seat-health.d.ts.map +1 -1
- package/dist/api/seat-health.js +28 -111
- package/dist/api/seat-health.js.map +1 -1
- package/dist/api/seat-standing.d.ts +9 -8
- package/dist/api/seat-standing.d.ts.map +1 -1
- package/dist/api/seat-standing.js +22 -32
- package/dist/api/seat-standing.js.map +1 -1
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +96 -9
- package/dist/api/server.js.map +1 -1
- package/dist/api/skills.d.ts +2 -2
- package/dist/api/stall-frame-index.d.ts +68 -0
- package/dist/api/stall-frame-index.d.ts.map +1 -0
- package/dist/api/stall-frame-index.js +106 -0
- package/dist/api/stall-frame-index.js.map +1 -0
- package/dist/api/stall-watchdog.d.ts +22 -2
- package/dist/api/stall-watchdog.d.ts.map +1 -1
- package/dist/api/stall-watchdog.js +41 -11
- package/dist/api/stall-watchdog.js.map +1 -1
- package/dist/campaigns/plan.d.ts +12 -2
- package/dist/campaigns/plan.d.ts.map +1 -1
- package/dist/campaigns/plan.js +3 -0
- package/dist/campaigns/plan.js.map +1 -1
- package/dist/campaigns/rollup.d.ts +5 -0
- package/dist/campaigns/rollup.d.ts.map +1 -1
- package/dist/campaigns/rollup.js +3 -2
- package/dist/campaigns/rollup.js.map +1 -1
- package/dist/campaigns/routes.d.ts +5 -2
- package/dist/campaigns/routes.d.ts.map +1 -1
- package/dist/campaigns/routes.js +13 -3
- package/dist/campaigns/routes.js.map +1 -1
- package/dist/cli/index.js +73 -16
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/port.d.ts +19 -0
- package/dist/cli/port.d.ts.map +1 -0
- package/dist/cli/port.js +39 -0
- package/dist/cli/port.js.map +1 -0
- package/dist/core/adapter.d.ts +56 -11
- package/dist/core/adapter.d.ts.map +1 -1
- package/dist/core/adapter.js +119 -31
- package/dist/core/adapter.js.map +1 -1
- package/dist/core/bridge-reaper.d.ts +57 -1
- package/dist/core/bridge-reaper.d.ts.map +1 -1
- package/dist/core/bridge-reaper.js +143 -21
- package/dist/core/bridge-reaper.js.map +1 -1
- package/dist/core/cursor.d.ts +7 -0
- package/dist/core/cursor.d.ts.map +1 -1
- package/dist/core/cursor.js +7 -1
- package/dist/core/cursor.js.map +1 -1
- package/dist/core/deliver-text.d.ts +35 -2
- package/dist/core/deliver-text.d.ts.map +1 -1
- package/dist/core/deliver-text.js +127 -17
- package/dist/core/deliver-text.js.map +1 -1
- package/dist/core/deliver-triage.d.ts.map +1 -1
- package/dist/core/deliver-triage.js +5 -2
- package/dist/core/deliver-triage.js.map +1 -1
- package/dist/core/deliver.d.ts +76 -2
- package/dist/core/deliver.d.ts.map +1 -1
- package/dist/core/deliver.js +209 -16
- package/dist/core/deliver.js.map +1 -1
- package/dist/core/engine-roster.d.ts +4 -3
- package/dist/core/engine-roster.d.ts.map +1 -1
- package/dist/core/engine-roster.js +10 -14
- package/dist/core/engine-roster.js.map +1 -1
- package/dist/core/types.d.ts +20 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/interactive/bridge-pool.d.ts +48 -5
- package/dist/interactive/bridge-pool.d.ts.map +1 -1
- package/dist/interactive/bridge-pool.js +100 -8
- package/dist/interactive/bridge-pool.js.map +1 -1
- package/dist/projects/graph.d.ts +4 -0
- package/dist/projects/graph.d.ts.map +1 -1
- package/dist/projects/graph.js +4 -2
- package/dist/projects/graph.js.map +1 -1
- package/dist/projects/routes.d.ts +2 -2
- package/dist/qe/acceptance.d.ts.map +1 -1
- package/dist/qe/acceptance.js +7 -1
- package/dist/qe/acceptance.js.map +1 -1
- package/dist/skills/base-skill.d.ts +10 -0
- package/dist/skills/base-skill.d.ts.map +1 -1
- package/dist/skills/base-skill.js +16 -4
- package/dist/skills/base-skill.js.map +1 -1
- package/dist/studio/assets/{index-CJp35PKj.js → index-Dk98qXKv.js} +103 -102
- package/dist/studio/index.html +1 -1
- package/dist/studio/testid-inventory.json +29 -5
- package/endpoint-manifest.json +12 -0
- package/package.json +3 -3
|
@@ -21,7 +21,70 @@
|
|
|
21
21
|
* the per-run output endpoint.
|
|
22
22
|
*/
|
|
23
23
|
import { execCapped } from '../core/exec.js';
|
|
24
|
-
import { DELIVER_LIFT_CONFLICT_MARKER } from '../core/deliver.js';
|
|
24
|
+
import { DELIVER_LIFT_CONFLICT_MARKER, DELIVER_PHASE_ID } from '../core/deliver.js';
|
|
25
|
+
import { resolveRunWorkflow } from '../qe/acceptance.js';
|
|
26
|
+
/**
|
|
27
|
+
* Does this workflow DEFINITION do code work — the ONE predicate crew already applies at launch
|
|
28
|
+
* (`routes.ts` `POST /runs`: `deliver` defaults to `'pr'` only for such a def): some phase declares
|
|
29
|
+
* `executes_code` and is not the evaluator's. Hoisted here (DES-L8 §5 PR-8A; adjudicated §4.8) so
|
|
30
|
+
* the launch-time default and the read-time classification below cannot drift —
|
|
31
|
+
* `tests/delivery-classification.test.ts` pins this function equal to the inline rule for every
|
|
32
|
+
* shipped def — by DRIVING `POST /runs` with no `deliver` and reading the `run.launched` audit
|
|
33
|
+
* `detail.deliver` the closure's own rule produced (never a copy of the predicate). The inline call
|
|
34
|
+
* in the `POST /runs` closure stays this train; its 3-line swap to this import is a follow-up in
|
|
35
|
+
* that closure's owner lane.
|
|
36
|
+
*/
|
|
37
|
+
export function isCodeWorkDef(def) {
|
|
38
|
+
return def.phases.some((p) => p.executes_code === true && p.role !== 'evaluator');
|
|
39
|
+
}
|
|
40
|
+
/** The phase id a planned unit carries — the `<base>:<phase>` suffix (`qe/acceptance.ts`'s rule);
|
|
41
|
+
* `''` for a free-text unit (`u1`, `u2`, …) or a legacy id with no colon. */
|
|
42
|
+
export function phaseIdOf(unitId) {
|
|
43
|
+
const colonIdx = unitId.indexOf(':');
|
|
44
|
+
return colonIdx >= 0 ? unitId.slice(colonIdx + 1) : '';
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Could THIS run ever have delivered (crew#481 / F-BM-006 list half; D-14 — a READ-TIME derivation,
|
|
48
|
+
* nothing persisted)? TRUE when a `deliver` unit was planned (the composed per-run phase or an
|
|
49
|
+
* operator overlay's own), when the def is unknown (`null` — a free-text `wf-…` run or a def the
|
|
50
|
+
* registry no longer holds: today's candidacy, never narrowed on a guess), or when the def does
|
|
51
|
+
* code work ({@link isCodeWorkDef}). FALSE only for a RESOLVED def with no deliver unit and no
|
|
52
|
+
* code-work phase — `onboarding`, `capture-learnings`, `domain-graph-slice`, `chat`, … — whose
|
|
53
|
+
* completed runs then read `delivery: 'none'` instead of the stranded/vacuous a live worktree used
|
|
54
|
+
* to earn them (the board's "nine runs need you" after onboarding). A code-work run launched with
|
|
55
|
+
* `deliver: 'none'` stays a candidate: its work is on `wicked/<id>`, liftable post hoc.
|
|
56
|
+
*/
|
|
57
|
+
export function runCanDeliver(view, def) {
|
|
58
|
+
if ((view.units ?? []).some((u) => phaseIdOf(u.id) === DELIVER_PHASE_ID))
|
|
59
|
+
return true;
|
|
60
|
+
if (def === null)
|
|
61
|
+
return true;
|
|
62
|
+
return isCodeWorkDef(def);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* The ONE def-awareness closure the daemon hands its delivery cache and its campaigns rollup —
|
|
66
|
+
* `runCanDeliver` over the run's def resolved through the registry (`resolveRunWorkflow`). Built
|
|
67
|
+
* for a READ path: a run record with no `workflow_id` (a fake adapter's minimal session, an older
|
|
68
|
+
* record), no `units`, or a registry that throws resolves NO def ⇒ `runCanDeliver(view, null)` ⇒
|
|
69
|
+
* today's candidacy — never a 500 on `GET /runs` (the auth-required suite's `{ id, status }`
|
|
70
|
+
* sessions are exactly this shape). Absence of an answer is today's label, not an error.
|
|
71
|
+
*/
|
|
72
|
+
export function canDeliverResolver(listWorkflows, log) {
|
|
73
|
+
return (view) => {
|
|
74
|
+
let def = null;
|
|
75
|
+
try {
|
|
76
|
+
def =
|
|
77
|
+
typeof view.session?.workflow_id === 'string' ? resolveRunWorkflow(view, listWorkflows() ?? []) : null;
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
// A registry that cannot answer is the ABSENCE of a def, not a verdict: the run keeps today's
|
|
81
|
+
// candidacy (never `none` on an error, never a 500) — and the defect is SAID, never swallowed.
|
|
82
|
+
log?.(`[runs] delivery classification: the workflow registry could not answer for ${view.session?.id ?? '?'} (reads as a candidate): ${err instanceof Error ? err.message : String(err)}`);
|
|
83
|
+
def = null;
|
|
84
|
+
}
|
|
85
|
+
return runCanDeliver(view, def);
|
|
86
|
+
};
|
|
87
|
+
}
|
|
25
88
|
/**
|
|
26
89
|
* The tri-state delivery derivation (crew#393) — HONEST by construction, computed at DTO
|
|
27
90
|
* assembly from three facts and nothing else:
|
|
@@ -37,10 +100,18 @@ import { DELIVER_LIFT_CONFLICT_MARKER } from '../core/deliver.js';
|
|
|
37
100
|
*
|
|
38
101
|
* `worktreeExists` is injected (a `fs.existsSync` in production) so route tests can pin the
|
|
39
102
|
* derivation without staging real directories.
|
|
103
|
+
*
|
|
104
|
+
* `canDeliver` (crew#481, D-14) is the def-awareness — {@link runCanDeliver}'s answer, resolved by
|
|
105
|
+
* the caller (the cache dep / the rollup dep) so this fn stays a pure derivation: `false` answers
|
|
106
|
+
* `'none'` for a completed run whose def could never have delivered, AFTER the url check (a recorded
|
|
107
|
+
* PR always wins, whatever the def) and BEFORE the worktree stat (nothing there is liftable work).
|
|
108
|
+
* Defaults to `true` = today's behaviour for every caller that has no def in hand.
|
|
40
109
|
*/
|
|
41
|
-
export function deliveryStateOf(session, url, worktreeExists) {
|
|
110
|
+
export function deliveryStateOf(session, url, worktreeExists, canDeliver = true) {
|
|
42
111
|
if (url !== undefined)
|
|
43
112
|
return { delivery: 'delivered', deliverUrl: url };
|
|
113
|
+
if (!canDeliver)
|
|
114
|
+
return { delivery: 'none' };
|
|
44
115
|
if (session.status === 'completed' &&
|
|
45
116
|
session.repo_ref != null &&
|
|
46
117
|
typeof session.workdir === 'string' &&
|
|
@@ -89,8 +160,12 @@ export class VacuityProbeUnavailable extends Error {
|
|
|
89
160
|
* completed run's branch has made its work unreachable — it reads vacuous, which is what the
|
|
90
161
|
* run now amounts to.)
|
|
91
162
|
*/
|
|
92
|
-
export async function deliveryStateWithVacuity(session, url, probes) {
|
|
93
|
-
const state = deliveryStateOf(session, url, probes.worktreeExists);
|
|
163
|
+
export async function deliveryStateWithVacuity(session, url, probes, canDeliver = true) {
|
|
164
|
+
const state = deliveryStateOf(session, url, probes.worktreeExists, canDeliver);
|
|
165
|
+
// A run that could never have delivered is 'none' by definition (crew#481): no probe can turn
|
|
166
|
+
// "nothing was ever liftable" into vacuous — and the git pair must not be spent finding out.
|
|
167
|
+
if (!canDeliver)
|
|
168
|
+
return state;
|
|
94
169
|
if (state.delivery === 'stranded') {
|
|
95
170
|
// `deliveryStateOf` only answers 'stranded' after proving workdir is a non-empty string.
|
|
96
171
|
return (await probes.worktreeIsClean(session.workdir))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery-index.js","sourceRoot":"","sources":["../../src/api/delivery-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"delivery-index.js","sourceRoot":"","sources":["../../src/api/delivery-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,8 +14,17 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import type { AuditLog } from './audit.js';
|
|
16
16
|
import type { AuditEntry } from '../core/types.js';
|
|
17
|
+
/** The pull request a run REVISES (DES-L9 / crew#550) — the durable record is the `run.launched`
|
|
18
|
+
* audit entry's `detail.revisesPr` (number, head branch, URL), written beside `retryOf`. */
|
|
19
|
+
export interface RevisesPrRecord {
|
|
20
|
+
number: number;
|
|
21
|
+
headRef: string;
|
|
22
|
+
url: string;
|
|
23
|
+
}
|
|
17
24
|
export declare class RetryIndex {
|
|
18
25
|
private readonly runToRetryOf;
|
|
26
|
+
/** DES-L9: run → the PR it revises, from the same `run.launched` entry (post-hoc re-push reads it). */
|
|
27
|
+
private readonly runToRevisesPr;
|
|
19
28
|
/**
|
|
20
29
|
* Consume pre-read `run.launched` entries — the seam that lets `createServer` feed this index
|
|
21
30
|
* and `GroupIndex` from ONE trail scan (the delivery-index consolidation note, crew#321).
|
|
@@ -32,5 +41,10 @@ export declare class RetryIndex {
|
|
|
32
41
|
set(runId: string, retryOf: string): void;
|
|
33
42
|
/** The run id this run retries, or `undefined` (the DTO spells that as an ABSENT field). */
|
|
34
43
|
retryOfFor(runId: string): string | undefined;
|
|
44
|
+
/** DES-L9: record the PR a run revises (the same post-commit point that writes the trail entry). */
|
|
45
|
+
setRevisesPr(runId: string, pr: RevisesPrRecord): void;
|
|
46
|
+
/** The PR this run revises, or `undefined` — a post-hoc `POST /runs/:id/deliver` on a stranded
|
|
47
|
+
* revision re-pushes to THAT branch (after re-checking the PR is still OPEN), never a new PR. */
|
|
48
|
+
revisesPrFor(runId: string): RevisesPrRecord | undefined;
|
|
35
49
|
}
|
|
36
50
|
//# sourceMappingURL=retry-index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry-index.d.ts","sourceRoot":"","sources":["../../src/api/retry-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;
|
|
1
|
+
{"version":3,"file":"retry-index.d.ts","sourceRoot":"","sources":["../../src/api/retry-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD;6FAC6F;AAC7F,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAcD,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;IAC1D,uGAAuG;IACvG,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAsC;IAErE;;;OAGG;IACH,wBAAwB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI;IAarD;;;;;;OAMG;IACG,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAY1E,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAIzC,4FAA4F;IAC5F,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI7C,oGAAoG;IACpG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,eAAe,GAAG,IAAI;IAItD;sGACkG;IAClG,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;CAGzD"}
|
package/dist/api/retry-index.js
CHANGED
|
@@ -12,8 +12,24 @@
|
|
|
12
12
|
* pre-CREW-UX-3 behavior, not an error) and updated at the same post-commit point that writes
|
|
13
13
|
* the audit entry, so the map can only lag by a failed hydrate, never diverge silently.
|
|
14
14
|
*/
|
|
15
|
+
function revisesPrOf(detail) {
|
|
16
|
+
const v = detail?.['revisesPr'];
|
|
17
|
+
if (v === null || typeof v !== 'object')
|
|
18
|
+
return undefined;
|
|
19
|
+
const r = v;
|
|
20
|
+
const number = r['number'];
|
|
21
|
+
const headRef = r['headRef'];
|
|
22
|
+
const url = r['url'];
|
|
23
|
+
if (typeof number !== 'number' || !Number.isInteger(number) || number <= 0)
|
|
24
|
+
return undefined;
|
|
25
|
+
if (typeof headRef !== 'string' || headRef === '' || typeof url !== 'string')
|
|
26
|
+
return undefined;
|
|
27
|
+
return { number, headRef, url };
|
|
28
|
+
}
|
|
15
29
|
export class RetryIndex {
|
|
16
30
|
runToRetryOf = new Map();
|
|
31
|
+
/** DES-L9: run → the PR it revises, from the same `run.launched` entry (post-hoc re-push reads it). */
|
|
32
|
+
runToRevisesPr = new Map();
|
|
17
33
|
/**
|
|
18
34
|
* Consume pre-read `run.launched` entries — the seam that lets `createServer` feed this index
|
|
19
35
|
* and `GroupIndex` from ONE trail scan (the delivery-index consolidation note, crew#321).
|
|
@@ -24,6 +40,10 @@ export class RetryIndex {
|
|
|
24
40
|
if (typeof entry.runId === 'string' && typeof retryOf === 'string') {
|
|
25
41
|
this.runToRetryOf.set(entry.runId, retryOf);
|
|
26
42
|
}
|
|
43
|
+
const revises = revisesPrOf(entry.detail);
|
|
44
|
+
if (typeof entry.runId === 'string' && revises !== undefined) {
|
|
45
|
+
this.runToRevisesPr.set(entry.runId, revises);
|
|
46
|
+
}
|
|
27
47
|
}
|
|
28
48
|
}
|
|
29
49
|
/**
|
|
@@ -48,5 +68,14 @@ export class RetryIndex {
|
|
|
48
68
|
retryOfFor(runId) {
|
|
49
69
|
return this.runToRetryOf.get(runId);
|
|
50
70
|
}
|
|
71
|
+
/** DES-L9: record the PR a run revises (the same post-commit point that writes the trail entry). */
|
|
72
|
+
setRevisesPr(runId, pr) {
|
|
73
|
+
this.runToRevisesPr.set(runId, pr);
|
|
74
|
+
}
|
|
75
|
+
/** The PR this run revises, or `undefined` — a post-hoc `POST /runs/:id/deliver` on a stranded
|
|
76
|
+
* revision re-pushes to THAT branch (after re-checking the PR is still OPEN), never a new PR. */
|
|
77
|
+
revisesPrFor(runId) {
|
|
78
|
+
return this.runToRevisesPr.get(runId);
|
|
79
|
+
}
|
|
51
80
|
}
|
|
52
81
|
//# sourceMappingURL=retry-index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry-index.js","sourceRoot":"","sources":["../../src/api/retry-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"retry-index.js","sourceRoot":"","sources":["../../src/api/retry-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The ONE roster accessor every launch path shares: the registry roster decorated with crew's
|
|
3
|
-
* STANDING (F-2R2-009) — runtime `health`, `signed_in`, `auth`, `council_eligible` + its reason
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* STANDING (F-2R2-009) — runtime `health`, `signed_in`, `auth`, `council_eligible` + its reason —
|
|
4
|
+
* so `engineRosterJson` (core/engine-roster.ts) can bench a seat the daemon already knows is
|
|
5
|
+
* unusable before the engine convenes it. (R5b: crew keeps no council bench of its own.)
|
|
6
6
|
*
|
|
7
7
|
* F-RECON-002 / F-RECON-003: this used to be a closure inside `registerRoutes`, so ONLY the routes
|
|
8
8
|
* (`POST /runs`, `/testing/*`, campaigns, steering) launched with standing. The interactive seams
|
|
@@ -36,7 +36,7 @@ export interface RosterStandingDeps {
|
|
|
36
36
|
* Build the accessor. Each seat's registry fields ride through verbatim — the spread is
|
|
37
37
|
* deliberately NOT a field whitelist, which is what lets the engine's `login_invocation` pass
|
|
38
38
|
* untouched — and gains `health`, `signed_in`, and the standing readings (`auth`, `free_tier*`,
|
|
39
|
-
* `council_eligible`, `council_ineligible_reason`, `
|
|
39
|
+
* `council_eligible`, `council_ineligible_reason`, `auth_source/evidence`).
|
|
40
40
|
*/
|
|
41
41
|
export declare function rosterWithStandingFactory(deps: RosterStandingDeps): RosterWithStanding;
|
|
42
42
|
//# sourceMappingURL=roster-standing.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roster-standing.d.ts","sourceRoot":"","sources":["../../src/api/roster-standing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAI1D,0FAA0F;AAC1F,MAAM,MAAM,kBAAkB,GAAG,MAAM,UAAU,EAAE,CAAC;AAEpD,MAAM,WAAW,kBAAkB;IACjC,kGAAkG;IAClG,UAAU,EAAE,iBAAiB,CAAC;IAC9B;gEAC4D;IAC5D,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,KAAK,OAAO,GAAG,IAAI,CAAC;IAC1E;iFAC6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,OAAO,EAAE,CAAC;IAC3B,oFAAoF;IACpF,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,kBAAkB,GAAG,kBAAkB,
|
|
1
|
+
{"version":3,"file":"roster-standing.d.ts","sourceRoot":"","sources":["../../src/api/roster-standing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAI1D,0FAA0F;AAC1F,MAAM,MAAM,kBAAkB,GAAG,MAAM,UAAU,EAAE,CAAC;AAEpD,MAAM,WAAW,kBAAkB;IACjC,kGAAkG;IAClG,UAAU,EAAE,iBAAiB,CAAC;IAC9B;gEAC4D;IAC5D,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,KAAK,OAAO,GAAG,IAAI,CAAC;IAC1E;iFAC6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,OAAO,EAAE,CAAC;IAC3B,oFAAoF;IACpF,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,kBAAkB,GAAG,kBAAkB,CAwCtF"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The ONE roster accessor every launch path shares: the registry roster decorated with crew's
|
|
3
|
-
* STANDING (F-2R2-009) — runtime `health`, `signed_in`, `auth`, `council_eligible` + its reason
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* STANDING (F-2R2-009) — runtime `health`, `signed_in`, `auth`, `council_eligible` + its reason —
|
|
4
|
+
* so `engineRosterJson` (core/engine-roster.ts) can bench a seat the daemon already knows is
|
|
5
|
+
* unusable before the engine convenes it. (R5b: crew keeps no council bench of its own.)
|
|
6
6
|
*
|
|
7
7
|
* F-RECON-002 / F-RECON-003: this used to be a closure inside `registerRoutes`, so ONLY the routes
|
|
8
8
|
* (`POST /runs`, `/testing/*`, campaigns, steering) launched with standing. The interactive seams
|
|
@@ -18,12 +18,12 @@
|
|
|
18
18
|
*/
|
|
19
19
|
import { CoreAdapter } from '../core/adapter.js';
|
|
20
20
|
import { signedInHeuristic } from './seat-signin.js';
|
|
21
|
-
import { seatStanding } from './seat-standing.js';
|
|
21
|
+
import { seatStanding, chatSeatAdmission } from './seat-standing.js';
|
|
22
22
|
/**
|
|
23
23
|
* Build the accessor. Each seat's registry fields ride through verbatim — the spread is
|
|
24
24
|
* deliberately NOT a field whitelist, which is what lets the engine's `login_invocation` pass
|
|
25
25
|
* untouched — and gains `health`, `signed_in`, and the standing readings (`auth`, `free_tier*`,
|
|
26
|
-
* `council_eligible`, `council_ineligible_reason`, `
|
|
26
|
+
* `council_eligible`, `council_ineligible_reason`, `auth_source/evidence`).
|
|
27
27
|
*/
|
|
28
28
|
export function rosterWithStandingFactory(deps) {
|
|
29
29
|
const { seatHealth } = deps;
|
|
@@ -36,17 +36,29 @@ export function rosterWithStandingFactory(deps) {
|
|
|
36
36
|
const key = String(seat.key);
|
|
37
37
|
const health = seatHealth.healthFor(key);
|
|
38
38
|
const signed = signedIn(key, workerRoot === '' ? undefined : workerRoot);
|
|
39
|
+
// (R5b, DES-L3 PR-3D) No crew-side council bench any more: the engine's per-run ballot ledger
|
|
40
|
+
// (`session.benched_seats`) is the one bench, so there is no bench reading to pass and no
|
|
41
|
+
// health reading to weigh — the roster's standing is the auth picture alone.
|
|
42
|
+
const standing = seatStanding(seat, signed,
|
|
43
|
+
// F-A45-006: the seat's OWN "no credential" report (a ballot's "No API key found", a
|
|
44
|
+
// worker's 401, an auth ACP fallback) overrides the file probe — `auth` flips, not only
|
|
45
|
+
// `council_eligible`, and the evidence rides on the wire.
|
|
46
|
+
seatHealth.authFailureFor(key));
|
|
47
|
+
// F-W1-005 (wave-1 P6): the chat admission verdict the daemon itself applies when `POST /chats`
|
|
48
|
+
// picks its default seats — the SAME `chatSeatAdmission` call, for both scope modes — so the
|
|
49
|
+
// studio's picker offers exactly the seats an open would seat, from one source of truth (no
|
|
50
|
+
// client-side copy of the rule). Additive on the wire (`RosterSeat` index signature until
|
|
51
|
+
// api-types 0.39.0 types it).
|
|
52
|
+
const standingSeat = seat;
|
|
39
53
|
return {
|
|
40
54
|
...seat,
|
|
41
55
|
health,
|
|
42
56
|
signed_in: signed,
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
// `council_eligible`, and the evidence rides on the wire.
|
|
49
|
-
seatHealth.authFailureFor(key)),
|
|
57
|
+
...standing,
|
|
58
|
+
chat_admission: {
|
|
59
|
+
unscoped: chatSeatAdmission(standingSeat, standing.auth, false),
|
|
60
|
+
scoped: chatSeatAdmission(standingSeat, standing.auth, true),
|
|
61
|
+
},
|
|
50
62
|
};
|
|
51
63
|
});
|
|
52
64
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roster-standing.js","sourceRoot":"","sources":["../../src/api/roster-standing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"roster-standing.js","sourceRoot":"","sources":["../../src/api/roster-standing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAqB,MAAM,oBAAoB,CAAC;AAkBxF;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAwB;IAChE,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,iBAAiB,CAAC;IACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACpC,OAAO,GAAiB,EAAE;QACxB,MAAM,UAAU,GAAG,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAC7C,OAAQ,QAAQ,EAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAC/C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC7B,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACzC,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;YACzE,8FAA8F;YAC9F,0FAA0F;YAC1F,6EAA6E;YAC7E,MAAM,QAAQ,GAAG,YAAY,CAC3B,IAA+F,EAC/F,MAAM;YACN,qFAAqF;YACrF,wFAAwF;YACxF,0DAA0D;YAC1D,UAAU,CAAC,cAAc,CAAC,GAAG,CAAC,CAC/B,CAAC;YACF,gGAAgG;YAChG,6FAA6F;YAC7F,4FAA4F;YAC5F,0FAA0F;YAC1F,8BAA8B;YAC9B,MAAM,YAAY,GAAG,IAA+B,CAAC;YACrD,OAAO;gBACL,GAAG,IAAI;gBACP,MAAM;gBACN,SAAS,EAAE,MAAM;gBACjB,GAAG,QAAQ;gBACX,cAAc,EAAE;oBACd,QAAQ,EAAE,iBAAiB,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;oBAC/D,MAAM,EAAE,iBAAiB,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;iBAC7D;aACF,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/api/routes.d.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import type { FastifyInstance } from 'fastify';
|
|
2
|
+
import type { RecordedStallFrame } from './stall-frame-index.js';
|
|
2
3
|
import { z } from 'zod';
|
|
3
4
|
import { CoreAdapter } from '../core/adapter.js';
|
|
4
5
|
import type { CodeGraphData, CoreEvent, RepoFinding } from '../core/types.js';
|
|
5
6
|
import { type GateCache } from './gate-cache.js';
|
|
6
7
|
import type { ElicitationCache } from './elicitation-cache.js';
|
|
7
8
|
import { QeGateCache } from '../qe/gate-events.js';
|
|
8
|
-
import type { ConformanceRule, SteeringType } from '../core/types.js';
|
|
9
|
+
import type { ConformanceRule, SessionView, SteeringType } from '../core/types.js';
|
|
9
10
|
import { SeatHealthTracker } from './seat-health.js';
|
|
10
11
|
import { type RosterWithStanding } from './roster-standing.js';
|
|
11
12
|
import { ChatTurnIndex } from './chat-turns.js';
|
|
@@ -18,6 +19,7 @@ import { type SkillsRuntime } from '../skills/runtime.js';
|
|
|
18
19
|
import { type StateHomeWatch } from '../projects/state-home-preflight.js';
|
|
19
20
|
import type { EvalRunStore } from './eval-store.js';
|
|
20
21
|
import { InteractiveBridgePool } from '../interactive/bridge-pool.js';
|
|
22
|
+
import { type PullRequestResolution } from '../core/deliver.js';
|
|
21
23
|
import type { DocGroundingStore } from '../interactive/doc-grounding.js';
|
|
22
24
|
import type { DocLedgerSweep } from '../interactive/doc-ledger-sweep.js';
|
|
23
25
|
import { AuditLog } from './audit.js';
|
|
@@ -49,6 +51,16 @@ export interface RepoGraphReply {
|
|
|
49
51
|
reason?: string;
|
|
50
52
|
finding?: RepoFinding;
|
|
51
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* The whole-graph counts from `wicked-estate stats --db` stdout (`nodes=N edges=M files=F …`, the
|
|
56
|
+
* first line estate prints — `main.rs`'s `stats` summary). `undefined` when the line does not parse
|
|
57
|
+
* (an older/newer estate, an error message): the caller leaves `CodeGraphData.totals` ABSENT.
|
|
58
|
+
*/
|
|
59
|
+
export declare function parseEstateTotals(stdout: string): {
|
|
60
|
+
nodes: number;
|
|
61
|
+
edges: number;
|
|
62
|
+
files: number;
|
|
63
|
+
} | undefined;
|
|
52
64
|
/**
|
|
53
65
|
* Map an APPROVED policy proposal (estate `proposal.approve` → `handed_off`) into a steering
|
|
54
66
|
* ConformanceRule (DES-MEM-FACETED-001 §5.2). A policy proposal's `kind_type` is
|
|
@@ -86,7 +98,7 @@ export declare function policyProposalToRule(proposalId: string, kindType: strin
|
|
|
86
98
|
* schema does not accept — so `.strict()` is what turns that trip into a 400 instead of an
|
|
87
99
|
* unworkflowed run reported as `201`.
|
|
88
100
|
*/
|
|
89
|
-
export declare const LaunchSchema: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodObject<{
|
|
101
|
+
export declare const LaunchSchema: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodObject<{
|
|
90
102
|
problem: z.ZodString;
|
|
91
103
|
sessionId: z.ZodOptional<z.ZodString>;
|
|
92
104
|
clisJson: z.ZodOptional<z.ZodString>;
|
|
@@ -125,10 +137,78 @@ export declare const LaunchSchema: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodO
|
|
|
125
137
|
* sharing a label form one `RunGroup` on `GET /campaigns`. Persisted/echoed like
|
|
126
138
|
* `campaignId` (as `AgentSession.group_label`). */
|
|
127
139
|
groupLabel: z.ZodOptional<z.ZodString>;
|
|
140
|
+
/** DES-L9 / crew#550 (api-types 0.38.0) — REVISE an OPEN same-repository pull request: its head
|
|
141
|
+
* branch becomes the run's base and the deliver phase pushes the run's commits onto it (no
|
|
142
|
+
* second PR), commenting the run record. Needs `repoRef` + `workflow` and `deliver: "pr"`
|
|
143
|
+
* (explicit `"none"` is a 400; a daemon that resolves the omitted field to `none` is a 409).
|
|
144
|
+
* Resolved via `gh pr view` at launch — not OPEN / a fork / gh failure ⇒ 409, nothing launched.
|
|
145
|
+
* Send it only when `GET /health.capabilities.revisesPr === true` (engine ≥ 0.7.27). */
|
|
146
|
+
revisesPr: z.ZodOptional<z.ZodNumber>;
|
|
128
147
|
}, "strict", z.ZodTypeAny, {
|
|
129
148
|
problem: string;
|
|
130
149
|
workflow?: string | undefined;
|
|
131
150
|
deliver?: "pr" | "none" | undefined;
|
|
151
|
+
revisesPr?: number | undefined;
|
|
152
|
+
projectId?: string | undefined;
|
|
153
|
+
repoRef?: string | undefined;
|
|
154
|
+
campaignId?: string | undefined;
|
|
155
|
+
groupLabel?: string | undefined;
|
|
156
|
+
clisJson?: string | undefined;
|
|
157
|
+
sessionId?: string | undefined;
|
|
158
|
+
retryOf?: string | undefined;
|
|
159
|
+
entityMode?: "shared" | "isolated" | undefined;
|
|
160
|
+
humanConfirm?: string | undefined;
|
|
161
|
+
deliverGate?: "auto" | "human" | undefined;
|
|
162
|
+
}, {
|
|
163
|
+
problem: string;
|
|
164
|
+
workflow?: string | undefined;
|
|
165
|
+
deliver?: "pr" | "none" | undefined;
|
|
166
|
+
revisesPr?: number | undefined;
|
|
167
|
+
projectId?: string | undefined;
|
|
168
|
+
repoRef?: string | undefined;
|
|
169
|
+
campaignId?: string | undefined;
|
|
170
|
+
groupLabel?: string | undefined;
|
|
171
|
+
clisJson?: string | undefined;
|
|
172
|
+
sessionId?: string | undefined;
|
|
173
|
+
retryOf?: string | undefined;
|
|
174
|
+
entityMode?: "shared" | "isolated" | undefined;
|
|
175
|
+
humanConfirm?: string | undefined;
|
|
176
|
+
deliverGate?: "auto" | "human" | undefined;
|
|
177
|
+
}>, {
|
|
178
|
+
problem: string;
|
|
179
|
+
workflow?: string | undefined;
|
|
180
|
+
deliver?: "pr" | "none" | undefined;
|
|
181
|
+
revisesPr?: number | undefined;
|
|
182
|
+
projectId?: string | undefined;
|
|
183
|
+
repoRef?: string | undefined;
|
|
184
|
+
campaignId?: string | undefined;
|
|
185
|
+
groupLabel?: string | undefined;
|
|
186
|
+
clisJson?: string | undefined;
|
|
187
|
+
sessionId?: string | undefined;
|
|
188
|
+
retryOf?: string | undefined;
|
|
189
|
+
entityMode?: "shared" | "isolated" | undefined;
|
|
190
|
+
humanConfirm?: string | undefined;
|
|
191
|
+
deliverGate?: "auto" | "human" | undefined;
|
|
192
|
+
}, {
|
|
193
|
+
problem: string;
|
|
194
|
+
workflow?: string | undefined;
|
|
195
|
+
deliver?: "pr" | "none" | undefined;
|
|
196
|
+
revisesPr?: number | undefined;
|
|
197
|
+
projectId?: string | undefined;
|
|
198
|
+
repoRef?: string | undefined;
|
|
199
|
+
campaignId?: string | undefined;
|
|
200
|
+
groupLabel?: string | undefined;
|
|
201
|
+
clisJson?: string | undefined;
|
|
202
|
+
sessionId?: string | undefined;
|
|
203
|
+
retryOf?: string | undefined;
|
|
204
|
+
entityMode?: "shared" | "isolated" | undefined;
|
|
205
|
+
humanConfirm?: string | undefined;
|
|
206
|
+
deliverGate?: "auto" | "human" | undefined;
|
|
207
|
+
}>, {
|
|
208
|
+
problem: string;
|
|
209
|
+
workflow?: string | undefined;
|
|
210
|
+
deliver?: "pr" | "none" | undefined;
|
|
211
|
+
revisesPr?: number | undefined;
|
|
132
212
|
projectId?: string | undefined;
|
|
133
213
|
repoRef?: string | undefined;
|
|
134
214
|
campaignId?: string | undefined;
|
|
@@ -143,6 +223,7 @@ export declare const LaunchSchema: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodO
|
|
|
143
223
|
problem: string;
|
|
144
224
|
workflow?: string | undefined;
|
|
145
225
|
deliver?: "pr" | "none" | undefined;
|
|
226
|
+
revisesPr?: number | undefined;
|
|
146
227
|
projectId?: string | undefined;
|
|
147
228
|
repoRef?: string | undefined;
|
|
148
229
|
campaignId?: string | undefined;
|
|
@@ -157,6 +238,7 @@ export declare const LaunchSchema: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodO
|
|
|
157
238
|
problem: string;
|
|
158
239
|
workflow?: string | undefined;
|
|
159
240
|
deliver?: "pr" | "none" | undefined;
|
|
241
|
+
revisesPr?: number | undefined;
|
|
160
242
|
projectId?: string | undefined;
|
|
161
243
|
repoRef?: string | undefined;
|
|
162
244
|
campaignId?: string | undefined;
|
|
@@ -171,6 +253,7 @@ export declare const LaunchSchema: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodO
|
|
|
171
253
|
problem: string;
|
|
172
254
|
workflow?: string | undefined;
|
|
173
255
|
deliver?: "pr" | "none" | undefined;
|
|
256
|
+
revisesPr?: number | undefined;
|
|
174
257
|
projectId?: string | undefined;
|
|
175
258
|
repoRef?: string | undefined;
|
|
176
259
|
campaignId?: string | undefined;
|
|
@@ -185,6 +268,7 @@ export declare const LaunchSchema: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodO
|
|
|
185
268
|
problem: string;
|
|
186
269
|
workflow?: string | undefined;
|
|
187
270
|
deliver?: "pr" | "none" | undefined;
|
|
271
|
+
revisesPr?: number | undefined;
|
|
188
272
|
projectId?: string | undefined;
|
|
189
273
|
repoRef?: string | undefined;
|
|
190
274
|
campaignId?: string | undefined;
|
|
@@ -199,6 +283,7 @@ export declare const LaunchSchema: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodO
|
|
|
199
283
|
problem: string;
|
|
200
284
|
workflow?: string | undefined;
|
|
201
285
|
deliver?: "pr" | "none" | undefined;
|
|
286
|
+
revisesPr?: number | undefined;
|
|
202
287
|
projectId?: string | undefined;
|
|
203
288
|
repoRef?: string | undefined;
|
|
204
289
|
campaignId?: string | undefined;
|
|
@@ -213,6 +298,7 @@ export declare const LaunchSchema: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodO
|
|
|
213
298
|
problem: string;
|
|
214
299
|
workflow?: string | undefined;
|
|
215
300
|
deliver?: "pr" | "none" | undefined;
|
|
301
|
+
revisesPr?: number | undefined;
|
|
216
302
|
projectId?: string | undefined;
|
|
217
303
|
repoRef?: string | undefined;
|
|
218
304
|
campaignId?: string | undefined;
|
|
@@ -227,6 +313,7 @@ export declare const LaunchSchema: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodO
|
|
|
227
313
|
problem: string;
|
|
228
314
|
workflow?: string | undefined;
|
|
229
315
|
deliver?: "pr" | "none" | undefined;
|
|
316
|
+
revisesPr?: number | undefined;
|
|
230
317
|
projectId?: string | undefined;
|
|
231
318
|
repoRef?: string | undefined;
|
|
232
319
|
campaignId?: string | undefined;
|
|
@@ -238,15 +325,48 @@ export declare const LaunchSchema: z.ZodEffects<z.ZodEffects<z.ZodEffects<z.ZodO
|
|
|
238
325
|
humanConfirm?: string | undefined;
|
|
239
326
|
deliverGate?: "auto" | "human" | undefined;
|
|
240
327
|
}>;
|
|
241
|
-
|
|
328
|
+
/** `POST /runs/:id/gate` (api-types 0.38.0 `GateDecision`; DES-L1 PR-2). Additive arms: `action`
|
|
329
|
+
* names the arm (`approve` | `request_changes` | `reject`; absent = today's two-arm mapping of
|
|
330
|
+
* `approve`), `amendScope` says where an approve's `amend` lands (`cursor` = the gated unit, today's
|
|
331
|
+
* behaviour | `creator` = the first creator phase at/after the cursor — an intake steer reaches the
|
|
332
|
+
* phase that implements). `request_changes` sends a NOT-PASS review back to the creator with the
|
|
333
|
+
* findings in context (`amend` = the operator's note). A disagreement between `action` and
|
|
334
|
+
* `approve` is a 400 that names both. */
|
|
335
|
+
export declare const GateSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<{
|
|
242
336
|
approve: z.ZodBoolean;
|
|
243
337
|
amend: z.ZodOptional<z.ZodString>;
|
|
338
|
+
action: z.ZodOptional<z.ZodEnum<["approve", "request_changes", "reject"]>>;
|
|
339
|
+
amendScope: z.ZodOptional<z.ZodEnum<["cursor", "creator"]>>;
|
|
244
340
|
}, "strict", z.ZodTypeAny, {
|
|
245
341
|
approve: boolean;
|
|
342
|
+
action?: "approve" | "request_changes" | "reject" | undefined;
|
|
343
|
+
amend?: string | undefined;
|
|
344
|
+
amendScope?: "creator" | "cursor" | undefined;
|
|
345
|
+
}, {
|
|
346
|
+
approve: boolean;
|
|
347
|
+
action?: "approve" | "request_changes" | "reject" | undefined;
|
|
348
|
+
amend?: string | undefined;
|
|
349
|
+
amendScope?: "creator" | "cursor" | undefined;
|
|
350
|
+
}>, {
|
|
351
|
+
approve: boolean;
|
|
352
|
+
action?: "approve" | "request_changes" | "reject" | undefined;
|
|
246
353
|
amend?: string | undefined;
|
|
354
|
+
amendScope?: "creator" | "cursor" | undefined;
|
|
247
355
|
}, {
|
|
248
356
|
approve: boolean;
|
|
357
|
+
action?: "approve" | "request_changes" | "reject" | undefined;
|
|
358
|
+
amend?: string | undefined;
|
|
359
|
+
amendScope?: "creator" | "cursor" | undefined;
|
|
360
|
+
}>, {
|
|
361
|
+
approve: boolean;
|
|
362
|
+
action?: "approve" | "request_changes" | "reject" | undefined;
|
|
249
363
|
amend?: string | undefined;
|
|
364
|
+
amendScope?: "creator" | "cursor" | undefined;
|
|
365
|
+
}, {
|
|
366
|
+
approve: boolean;
|
|
367
|
+
action?: "approve" | "request_changes" | "reject" | undefined;
|
|
368
|
+
amend?: string | undefined;
|
|
369
|
+
amendScope?: "creator" | "cursor" | undefined;
|
|
250
370
|
}>;
|
|
251
371
|
/** `PUT /runs/:id/guidance` (DES-UX-002 §7.2, CREW-UX-7) — the durable pre-gate note body.
|
|
252
372
|
* The empty string is a legal body: it CLEARS the note. The byte cap is checked in the route
|
|
@@ -304,13 +424,15 @@ export interface SecurityDeps {
|
|
|
304
424
|
audit: AuditLog;
|
|
305
425
|
authMode: AuthMode;
|
|
306
426
|
}
|
|
307
|
-
/**
|
|
308
|
-
* Daemon-runtime deps the routes read but `createServer` owns: the seat-health fold (crew#274,
|
|
309
|
-
* fed by the daemon's single CoreEvent subscription) and the OS opener for `/open` (crew#273,
|
|
310
|
-
* injectable so tests never actually open anything).
|
|
311
|
-
*/
|
|
312
427
|
export interface RuntimeDeps {
|
|
428
|
+
/** DES-L9: how `revisesPr` is resolved to a PR head branch (`gh pr view`, 5 s). Injectable so
|
|
429
|
+
* route tests answer without gh; production uses `core/deliver.ts::resolvePullRequest`. */
|
|
430
|
+
resolvePullRequest?: (repoRoot: string, number: number) => Promise<PullRequestResolution>;
|
|
313
431
|
seatHealth?: SeatHealthTracker;
|
|
432
|
+
/** wicked-studio#284: the stall watchdog's remembered frames for a run — merged into
|
|
433
|
+
* `GET /runs/:id/events` at serve time so a reloaded page sees the `workerStalled` /
|
|
434
|
+
* `workerStallEscalated` facts the live socket carried. Absent ⇒ engine events only. */
|
|
435
|
+
stallFrames?: (runId: string) => readonly RecordedStallFrame[];
|
|
314
436
|
/** Run→retry-lineage index (CREW-UX-3) — `createServer` hydrates one from the audit trail so
|
|
315
437
|
* a restarted daemon still echoes `retry_of`; a directly-driven route set gets a fresh one. */
|
|
316
438
|
retryIndex?: RetryIndex;
|
|
@@ -359,6 +481,12 @@ export interface RuntimeDeps {
|
|
|
359
481
|
* directly-driven route set gets a COLD, unstarted one over the same injectable probes:
|
|
360
482
|
* reads then answer the stat-only tri-state until a test sweeps or warms it explicitly. */
|
|
361
483
|
deliveryCache?: DeliveryDerivationCache;
|
|
484
|
+
/** Def-awareness for the delivery derivation (crew#481 / D-14) — `createServer` injects the
|
|
485
|
+
* `runCanDeliver(view, resolveRunWorkflow(view, adapter.listWorkflows()))` closure it also hands
|
|
486
|
+
* its cache, so the campaigns rollup and the run DTOs classify from ONE predicate. A
|
|
487
|
+
* directly-driven route set derives the same closure over the adapter's registry when it has
|
|
488
|
+
* one, else every completed repo-scoped run stays a candidate (today's read). */
|
|
489
|
+
canDeliver?: (view: SessionView) => boolean;
|
|
362
490
|
/** The post-hoc deliver exec (crew#393, `POST /runs/:id/deliver`) — spawns the hardened
|
|
363
491
|
* deliver script in a run's worktree. Injectable so route tests aim the spawn's HOME/PATH at
|
|
364
492
|
* a fixture (stub `gh`, local bare origin); defaults to the real `bash -lc` spawn. */
|
|
@@ -454,15 +582,15 @@ export declare const ChatOpenSchema: z.ZodObject<{
|
|
|
454
582
|
projectId: z.ZodOptional<z.ZodString>;
|
|
455
583
|
}, "strict", z.ZodTypeAny, {
|
|
456
584
|
projectId?: string | undefined;
|
|
585
|
+
repoRef?: string | undefined;
|
|
457
586
|
chatId?: string | undefined;
|
|
458
587
|
clis?: string[] | undefined;
|
|
459
|
-
repoRef?: string | undefined;
|
|
460
588
|
repoRefs?: string[] | undefined;
|
|
461
589
|
}, {
|
|
462
590
|
projectId?: string | undefined;
|
|
591
|
+
repoRef?: string | undefined;
|
|
463
592
|
chatId?: string | undefined;
|
|
464
593
|
clis?: string[] | undefined;
|
|
465
|
-
repoRef?: string | undefined;
|
|
466
594
|
repoRefs?: string[] | undefined;
|
|
467
595
|
}>;
|
|
468
596
|
export declare function registerRoutes(app: FastifyInstance, adapter: CoreAdapter, gateCache: GateCache, elicitationCache: ElicitationCache, qeGateEvents?: QeGateCache, projects?: ProjectRoutesDeps, security?: SecurityDeps, runtime?: RuntimeDeps): void;
|