wicked-crew 0.7.10 → 0.7.12
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/delivery-index.d.ts +21 -0
- package/dist/api/delivery-index.d.ts.map +1 -1
- package/dist/api/delivery-index.js +35 -0
- package/dist/api/delivery-index.js.map +1 -1
- package/dist/api/group-index.d.ts +59 -0
- package/dist/api/group-index.d.ts.map +1 -0
- package/dist/api/group-index.js +100 -0
- package/dist/api/group-index.js.map +1 -0
- package/dist/api/post-hoc-deliver.d.ts +27 -0
- package/dist/api/post-hoc-deliver.d.ts.map +1 -1
- package/dist/api/post-hoc-deliver.js +54 -0
- package/dist/api/post-hoc-deliver.js.map +1 -1
- package/dist/api/retry-index.d.ts +6 -0
- package/dist/api/retry-index.d.ts.map +1 -1
- package/dist/api/retry-index.js +13 -6
- package/dist/api/retry-index.js.map +1 -1
- package/dist/api/routes.d.ts +55 -2
- package/dist/api/routes.d.ts.map +1 -1
- package/dist/api/routes.js +188 -17
- package/dist/api/routes.js.map +1 -1
- package/dist/api/seat-health.d.ts +11 -0
- package/dist/api/seat-health.d.ts.map +1 -1
- package/dist/api/seat-health.js +23 -0
- package/dist/api/seat-health.js.map +1 -1
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +19 -5
- package/dist/api/server.js.map +1 -1
- package/dist/api/testing.d.ts.map +1 -1
- package/dist/api/testing.js +11 -27
- package/dist/api/testing.js.map +1 -1
- package/dist/campaigns/rollup.d.ts +39 -0
- package/dist/campaigns/rollup.d.ts.map +1 -0
- package/dist/campaigns/rollup.js +84 -0
- package/dist/campaigns/rollup.js.map +1 -0
- package/dist/campaigns/routes.d.ts +10 -3
- package/dist/campaigns/routes.d.ts.map +1 -1
- package/dist/campaigns/routes.js +27 -5
- package/dist/campaigns/routes.js.map +1 -1
- package/dist/cli/index.js +13 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/core/adapter.d.ts +0 -12
- package/dist/core/adapter.d.ts.map +1 -1
- package/dist/core/adapter.js +0 -14
- package/dist/core/adapter.js.map +1 -1
- package/dist/core/daemon-signal-log.d.ts +44 -0
- package/dist/core/daemon-signal-log.d.ts.map +1 -0
- package/dist/core/daemon-signal-log.js +57 -0
- package/dist/core/daemon-signal-log.js.map +1 -0
- package/dist/core/deliver.d.ts +20 -3
- package/dist/core/deliver.d.ts.map +1 -1
- package/dist/core/deliver.js +82 -9
- package/dist/core/deliver.js.map +1 -1
- package/dist/studio/assets/{index-gtE6scX0.js → index-DuU8RZg9.js} +95 -95
- package/dist/studio/index.html +1 -1
- package/dist/studio/testid-inventory.json +47 -17
- package/endpoint-manifest.json +4 -3
- package/package.json +3 -3
- package/dist/campaigns/worktrees.d.ts +0 -39
- package/dist/campaigns/worktrees.d.ts.map +0 -1
- package/dist/campaigns/worktrees.js +0 -95
- package/dist/campaigns/worktrees.js.map +0 -1
|
@@ -124,6 +124,27 @@ export declare function prUrlFrom(text: string): string | null;
|
|
|
124
124
|
* overlay-carried deliver phases (crew#321).
|
|
125
125
|
*/
|
|
126
126
|
export declare function deliverUnitOf(view: SessionView): WorkUnit | null;
|
|
127
|
+
/**
|
|
128
|
+
* Is this a `failed` run whose ONLY failure was the deliver phase's LIFT collision (crew#418)?
|
|
129
|
+
*
|
|
130
|
+
* The deliver phase is the LAST phase, so a rejected deliver unit whose `denial_reason` carries
|
|
131
|
+
* the deliver script's {@link DELIVER_LIFT_CONFLICT_MARKER} — with EVERY non-deliver unit still
|
|
132
|
+
* `done` — means the run's WORK is complete and committed on its `wicked/<id>` branch: only the
|
|
133
|
+
* lift into origin collided (a rebase conflict the changelog union merge could not clear, or a
|
|
134
|
+
* non-fast-forward push). The engine reports the run `failed` because a Tool phase exited
|
|
135
|
+
* non-zero; crew reinterprets THIS shape on the wire as `completed` + `delivery: 'stranded'`
|
|
136
|
+
* (recoverable via `POST /runs/:id/deliver`) — the same wire-derivation posture as `delivery`
|
|
137
|
+
* itself, leaving the engine's durable `failed` record untouched. The deliver unit stays
|
|
138
|
+
* `rejected` with its marker-bearing `denial_reason`, so WHY it stranded is still on the wire.
|
|
139
|
+
*
|
|
140
|
+
* FALSE — the run stays `failed` — for every genuine failure, because each misses a condition:
|
|
141
|
+
* - a rejected NON-deliver unit (a build/test/work phase failed) — `some(rejected)` guard;
|
|
142
|
+
* - a deliver rejection WITHOUT the marker: a spawn/infra fault (the crew#400 posture), a
|
|
143
|
+
* `gh` failure, nothing-to-deliver, or a wrong-worktree-branch refusal — the marker is the
|
|
144
|
+
* deliver script's own authority on WHY it refused, so crew never guesses from git's output;
|
|
145
|
+
* - a repo-less run (nothing to strand), or any non-`failed` status.
|
|
146
|
+
*/
|
|
147
|
+
export declare function isDeliverConflictStranded(view: SessionView): boolean;
|
|
127
148
|
export declare class DeliveryIndex {
|
|
128
149
|
private readonly runToUrl;
|
|
129
150
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery-index.d.ts","sourceRoot":"","sources":["../../src/api/delivery-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"delivery-index.d.ts","sourceRoot":"","sources":["../../src/api/delivery-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI5E,kGAAkG;AAClG,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;IACxD,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC,EAC9D,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,GACxC,aAAa,CAYf;AAED;6FAC6F;AAC7F,MAAM,WAAW,aAAa;IAC5B,kFAAkF;IAClF,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC1C,2FAA2F;IAC3F,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD;0FACsF;IACtF,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACxE;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC,EACrE,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,aAAa,CAAC,CAiBxB;AAED;;gFAEgF;AAChF,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAE5C;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,GAAE,MAA8B,EACrC,GAAG,GAAE,MAAM,MAAiB,GAC3B,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CA4BpC;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,EACjE,KAAK,GAAE,MAA8B,EACrC,GAAG,GAAE,MAAM,MAAiB,GAC3B,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CA4CtD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAGrD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,QAAQ,GAAG,IAAI,CAIhE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CASpE;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA6B;IAEtD;;;;;;;;OAQG;IACG,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB1E,8EAA8E;IAC9E,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAIrC;;;;OAIG;IACH,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAG1C"}
|
|
@@ -21,6 +21,7 @@
|
|
|
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
25
|
/**
|
|
25
26
|
* The tri-state delivery derivation (crew#393) — HONEST by construction, computed at DTO
|
|
26
27
|
* assembly from three facts and nothing else:
|
|
@@ -217,6 +218,40 @@ export function deliverUnitOf(view) {
|
|
|
217
218
|
return byId;
|
|
218
219
|
return view.units.find((u) => (u.tool_cmd ?? []).join(' ').includes('gh pr create')) ?? null;
|
|
219
220
|
}
|
|
221
|
+
/**
|
|
222
|
+
* Is this a `failed` run whose ONLY failure was the deliver phase's LIFT collision (crew#418)?
|
|
223
|
+
*
|
|
224
|
+
* The deliver phase is the LAST phase, so a rejected deliver unit whose `denial_reason` carries
|
|
225
|
+
* the deliver script's {@link DELIVER_LIFT_CONFLICT_MARKER} — with EVERY non-deliver unit still
|
|
226
|
+
* `done` — means the run's WORK is complete and committed on its `wicked/<id>` branch: only the
|
|
227
|
+
* lift into origin collided (a rebase conflict the changelog union merge could not clear, or a
|
|
228
|
+
* non-fast-forward push). The engine reports the run `failed` because a Tool phase exited
|
|
229
|
+
* non-zero; crew reinterprets THIS shape on the wire as `completed` + `delivery: 'stranded'`
|
|
230
|
+
* (recoverable via `POST /runs/:id/deliver`) — the same wire-derivation posture as `delivery`
|
|
231
|
+
* itself, leaving the engine's durable `failed` record untouched. The deliver unit stays
|
|
232
|
+
* `rejected` with its marker-bearing `denial_reason`, so WHY it stranded is still on the wire.
|
|
233
|
+
*
|
|
234
|
+
* FALSE — the run stays `failed` — for every genuine failure, because each misses a condition:
|
|
235
|
+
* - a rejected NON-deliver unit (a build/test/work phase failed) — `some(rejected)` guard;
|
|
236
|
+
* - a deliver rejection WITHOUT the marker: a spawn/infra fault (the crew#400 posture), a
|
|
237
|
+
* `gh` failure, nothing-to-deliver, or a wrong-worktree-branch refusal — the marker is the
|
|
238
|
+
* deliver script's own authority on WHY it refused, so crew never guesses from git's output;
|
|
239
|
+
* - a repo-less run (nothing to strand), or any non-`failed` status.
|
|
240
|
+
*/
|
|
241
|
+
export function isDeliverConflictStranded(view) {
|
|
242
|
+
if (view.session.status !== 'failed')
|
|
243
|
+
return false;
|
|
244
|
+
if (view.session.repo_ref == null)
|
|
245
|
+
return false;
|
|
246
|
+
const deliver = deliverUnitOf(view);
|
|
247
|
+
if (deliver === null || deliver.status !== 'rejected')
|
|
248
|
+
return false;
|
|
249
|
+
// A rejected unit that is NOT the deliver phase = a genuine work/build/test failure, not a
|
|
250
|
+
// clean run whose only casualty was the lift.
|
|
251
|
+
if (view.units.some((u) => u.id !== deliver.id && u.status === 'rejected'))
|
|
252
|
+
return false;
|
|
253
|
+
return (deliver.denial_reason ?? '').includes(DELIVER_LIFT_CONFLICT_MARKER);
|
|
254
|
+
}
|
|
220
255
|
export class DeliveryIndex {
|
|
221
256
|
runToUrl = new Map();
|
|
222
257
|
/**
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"delivery-index.js","sourceRoot":"","sources":["../../src/api/delivery-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The run→ad-hoc-group index (wicked-studio#27; api-types 0.19.0).
|
|
3
|
+
*
|
|
4
|
+
* Ad-hoc sibling runs launched via `POST /runs` can be filed onto a grouping surface at launch:
|
|
5
|
+
* `campaignId` attaches the run to an EXISTING engine campaign (validated loudly — an unknown id
|
|
6
|
+
* fails the launch), `groupLabel` puts it in a label group created on first use. Either way the
|
|
7
|
+
* attach is daemon-side PROVENANCE only: the engine's run record carries no such field (the run
|
|
8
|
+
* executes byte-identically to an ungrouped launch, and the campaign scheduler never learns of
|
|
9
|
+
* it), so — exactly like retry lineage (CREW-UX-3) and the actor trail (task #88) — the durable
|
|
10
|
+
* record is the `run.launched` audit entry (`detail.campaignId` / `detail.groupLabel`), and this
|
|
11
|
+
* map is the read-side latency layer that lets `GET /runs` echo `campaign_id`/`group_label` and
|
|
12
|
+
* `GET /campaigns` serve `attached_runs` + the `groups` rows without a trail scan per request.
|
|
13
|
+
*
|
|
14
|
+
* Mirrors `RetryIndex`'s posture: hydrated once at server start (best-effort — a missing or
|
|
15
|
+
* unreadable trail leaves prior runs ungrouped, the pre-0.19 behavior, not an error) and updated
|
|
16
|
+
* at the same post-commit point that writes the audit entry, so the map can only lag by a failed
|
|
17
|
+
* hydrate, never diverge silently.
|
|
18
|
+
*
|
|
19
|
+
* SCAN BUDGET: this index consumes the SAME `run.launched` entries `RetryIndex` already scans,
|
|
20
|
+
* so it exposes {@link GroupIndex.hydrateFromLaunchEntries} and `createServer` feeds both
|
|
21
|
+
* indexes from ONE `readAll({ action: 'run.launched' })` — boot stays at three full-file trail
|
|
22
|
+
* scans, not four (the delivery-index consolidation note, crew#321).
|
|
23
|
+
*/
|
|
24
|
+
import type { AuditLog } from './audit.js';
|
|
25
|
+
import type { AuditEntry } from '../core/types.js';
|
|
26
|
+
/** One launch's group attach: exactly one of the two forms (the launch route enforces it). */
|
|
27
|
+
export type GroupAttach = {
|
|
28
|
+
campaignId: string;
|
|
29
|
+
} | {
|
|
30
|
+
label: string;
|
|
31
|
+
};
|
|
32
|
+
export declare class GroupIndex {
|
|
33
|
+
private readonly runToAttach;
|
|
34
|
+
/** campaignId → attached run ids, launch order. */
|
|
35
|
+
private readonly campaignRuns;
|
|
36
|
+
/** label → member run ids, launch order. */
|
|
37
|
+
private readonly labelRuns;
|
|
38
|
+
/**
|
|
39
|
+
* Consume pre-read `run.launched` entries (NEWEST FIRST, `AuditLog.readAll`'s order —
|
|
40
|
+
* exhaustive, per BRIEF-UX-002 C5). The first entry seen per run wins, like the sibling
|
|
41
|
+
* indexes; member lists come out in LAUNCH order because insertion happens on a reversed
|
|
42
|
+
* walk. Idempotent per boot (called once).
|
|
43
|
+
*/
|
|
44
|
+
hydrateFromLaunchEntries(entries: AuditEntry[]): void;
|
|
45
|
+
/** Standalone hydrate (tests / direct use) — production shares the scan via `createServer`. */
|
|
46
|
+
hydrate(audit: AuditLog, log?: (msg: string) => void): Promise<void>;
|
|
47
|
+
/** Record one launch's attach (post-commit, beside the audit write). */
|
|
48
|
+
set(runId: string, attach: GroupAttach): void;
|
|
49
|
+
/** This run's attach, or `undefined` (the DTO spells that as ABSENT fields). */
|
|
50
|
+
attachOf(runId: string): GroupAttach | undefined;
|
|
51
|
+
/** Run ids attached to this campaign, launch order (`[]` when none). */
|
|
52
|
+
attachedTo(campaignId: string): string[];
|
|
53
|
+
/** Every label group: `{ label, runIds }` in first-use order, members in launch order. */
|
|
54
|
+
labelGroups(): Array<{
|
|
55
|
+
label: string;
|
|
56
|
+
runIds: string[];
|
|
57
|
+
}>;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=group-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-index.d.ts","sourceRoot":"","sources":["../../src/api/group-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,8FAA8F;AAC9F,MAAM,MAAM,WAAW,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAErE,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkC;IAC9D,mDAAmD;IACnD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA+B;IAC5D,4CAA4C;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+B;IAEzD;;;;;OAKG;IACH,wBAAwB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI;IAoBrD,+FAA+F;IACzF,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAY1E,wEAAwE;IACxE,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI;IAc7C,gFAAgF;IAChF,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAIhD,wEAAwE;IACxE,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE;IAIxC,0FAA0F;IAC1F,WAAW,IAAI,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAM1D"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The run→ad-hoc-group index (wicked-studio#27; api-types 0.19.0).
|
|
3
|
+
*
|
|
4
|
+
* Ad-hoc sibling runs launched via `POST /runs` can be filed onto a grouping surface at launch:
|
|
5
|
+
* `campaignId` attaches the run to an EXISTING engine campaign (validated loudly — an unknown id
|
|
6
|
+
* fails the launch), `groupLabel` puts it in a label group created on first use. Either way the
|
|
7
|
+
* attach is daemon-side PROVENANCE only: the engine's run record carries no such field (the run
|
|
8
|
+
* executes byte-identically to an ungrouped launch, and the campaign scheduler never learns of
|
|
9
|
+
* it), so — exactly like retry lineage (CREW-UX-3) and the actor trail (task #88) — the durable
|
|
10
|
+
* record is the `run.launched` audit entry (`detail.campaignId` / `detail.groupLabel`), and this
|
|
11
|
+
* map is the read-side latency layer that lets `GET /runs` echo `campaign_id`/`group_label` and
|
|
12
|
+
* `GET /campaigns` serve `attached_runs` + the `groups` rows without a trail scan per request.
|
|
13
|
+
*
|
|
14
|
+
* Mirrors `RetryIndex`'s posture: hydrated once at server start (best-effort — a missing or
|
|
15
|
+
* unreadable trail leaves prior runs ungrouped, the pre-0.19 behavior, not an error) and updated
|
|
16
|
+
* at the same post-commit point that writes the audit entry, so the map can only lag by a failed
|
|
17
|
+
* hydrate, never diverge silently.
|
|
18
|
+
*
|
|
19
|
+
* SCAN BUDGET: this index consumes the SAME `run.launched` entries `RetryIndex` already scans,
|
|
20
|
+
* so it exposes {@link GroupIndex.hydrateFromLaunchEntries} and `createServer` feeds both
|
|
21
|
+
* indexes from ONE `readAll({ action: 'run.launched' })` — boot stays at three full-file trail
|
|
22
|
+
* scans, not four (the delivery-index consolidation note, crew#321).
|
|
23
|
+
*/
|
|
24
|
+
export class GroupIndex {
|
|
25
|
+
runToAttach = new Map();
|
|
26
|
+
/** campaignId → attached run ids, launch order. */
|
|
27
|
+
campaignRuns = new Map();
|
|
28
|
+
/** label → member run ids, launch order. */
|
|
29
|
+
labelRuns = new Map();
|
|
30
|
+
/**
|
|
31
|
+
* Consume pre-read `run.launched` entries (NEWEST FIRST, `AuditLog.readAll`'s order —
|
|
32
|
+
* exhaustive, per BRIEF-UX-002 C5). The first entry seen per run wins, like the sibling
|
|
33
|
+
* indexes; member lists come out in LAUNCH order because insertion happens on a reversed
|
|
34
|
+
* walk. Idempotent per boot (called once).
|
|
35
|
+
*/
|
|
36
|
+
hydrateFromLaunchEntries(entries) {
|
|
37
|
+
const seen = new Set();
|
|
38
|
+
const oldestFirst = [];
|
|
39
|
+
for (const entry of entries) {
|
|
40
|
+
if (typeof entry.runId !== 'string')
|
|
41
|
+
continue;
|
|
42
|
+
if (seen.has(entry.runId))
|
|
43
|
+
continue;
|
|
44
|
+
seen.add(entry.runId);
|
|
45
|
+
const campaignId = entry.detail?.['campaignId'];
|
|
46
|
+
const label = entry.detail?.['groupLabel'];
|
|
47
|
+
if (typeof campaignId === 'string' && campaignId !== '') {
|
|
48
|
+
oldestFirst.push({ runId: entry.runId, attach: { campaignId } });
|
|
49
|
+
}
|
|
50
|
+
else if (typeof label === 'string' && label !== '') {
|
|
51
|
+
oldestFirst.push({ runId: entry.runId, attach: { label } });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// The trail reads newest-first; one reverse restores launch order (unshift-in-loop is O(n²)).
|
|
55
|
+
oldestFirst.reverse();
|
|
56
|
+
for (const { runId, attach } of oldestFirst)
|
|
57
|
+
this.set(runId, attach);
|
|
58
|
+
}
|
|
59
|
+
/** Standalone hydrate (tests / direct use) — production shares the scan via `createServer`. */
|
|
60
|
+
async hydrate(audit, log) {
|
|
61
|
+
try {
|
|
62
|
+
this.hydrateFromLaunchEntries(await audit.readAll({ action: 'run.launched' }));
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
log?.(`[runs] group-index hydrate failed (prior runs read as ungrouped until restart): ${err instanceof Error ? err.message : String(err)}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/** Record one launch's attach (post-commit, beside the audit write). */
|
|
69
|
+
set(runId, attach) {
|
|
70
|
+
if (this.runToAttach.has(runId))
|
|
71
|
+
return; // launch-time fact — first write wins
|
|
72
|
+
this.runToAttach.set(runId, attach);
|
|
73
|
+
if ('campaignId' in attach) {
|
|
74
|
+
const list = this.campaignRuns.get(attach.campaignId) ?? [];
|
|
75
|
+
list.push(runId);
|
|
76
|
+
this.campaignRuns.set(attach.campaignId, list);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
const list = this.labelRuns.get(attach.label) ?? [];
|
|
80
|
+
list.push(runId);
|
|
81
|
+
this.labelRuns.set(attach.label, list);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/** This run's attach, or `undefined` (the DTO spells that as ABSENT fields). */
|
|
85
|
+
attachOf(runId) {
|
|
86
|
+
return this.runToAttach.get(runId);
|
|
87
|
+
}
|
|
88
|
+
/** Run ids attached to this campaign, launch order (`[]` when none). */
|
|
89
|
+
attachedTo(campaignId) {
|
|
90
|
+
return [...(this.campaignRuns.get(campaignId) ?? [])];
|
|
91
|
+
}
|
|
92
|
+
/** Every label group: `{ label, runIds }` in first-use order, members in launch order. */
|
|
93
|
+
labelGroups() {
|
|
94
|
+
return [...this.labelRuns.entries()].map(([label, runIds]) => ({
|
|
95
|
+
label,
|
|
96
|
+
runIds: [...runIds],
|
|
97
|
+
}));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=group-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-index.js","sourceRoot":"","sources":["../../src/api/group-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAQH,MAAM,OAAO,UAAU;IACJ,WAAW,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC9D,mDAAmD;IAClC,YAAY,GAAG,IAAI,GAAG,EAAoB,CAAC;IAC5D,4CAA4C;IAC3B,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;IAEzD;;;;;OAKG;IACH,wBAAwB,CAAC,OAAqB;QAC5C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,WAAW,GAAkD,EAAE,CAAC;QACtE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;gBAAE,SAAS;YAC9C,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;gBAAE,SAAS;YACpC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACtB,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,YAAY,CAAC,CAAC;YAChD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,YAAY,CAAC,CAAC;YAC3C,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,EAAE,EAAE,CAAC;gBACxD,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;YACnE,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;gBACrD,WAAW,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QACD,8FAA8F;QAC9F,WAAW,CAAC,OAAO,EAAE,CAAC;QACtB,KAAK,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,WAAW;YAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACvE,CAAC;IAED,+FAA+F;IAC/F,KAAK,CAAC,OAAO,CAAC,KAAe,EAAE,GAA2B;QACxD,IAAI,CAAC;YACH,IAAI,CAAC,wBAAwB,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;QACjF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,EAAE,CACH,mFACE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,EAAE,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,GAAG,CAAC,KAAa,EAAE,MAAmB;QACpC,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,sCAAsC;QAC/E,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACpC,IAAI,YAAY,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YAC5D,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACjD,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YACpD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,gFAAgF;IAChF,QAAQ,CAAC,KAAa;QACpB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,wEAAwE;IACxE,UAAU,CAAC,UAAkB;QAC3B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,0FAA0F;IAC1F,WAAW;QACT,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7D,KAAK;YACL,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC;SACpB,CAAC,CAAC,CAAC;IACN,CAAC;CACF"}
|
|
@@ -28,6 +28,33 @@ export interface DeliverScriptResult {
|
|
|
28
28
|
/** The exec seam the deliver route runs the script through — injectable so route tests can
|
|
29
29
|
* point HOME/PATH at a fixture (a stub `gh`, a temp home) without touching the daemon env. */
|
|
30
30
|
export type DeliverExec = (workdir: string, intent?: string) => Promise<DeliverScriptResult>;
|
|
31
|
+
/** A worktree stood back up from a run's `wicked/<id>` branch, plus its teardown (crew#418). */
|
|
32
|
+
export interface ReprovisionedWorktree {
|
|
33
|
+
/** The path to deliver in — a throwaway checkout of `wicked/<runId>`. */
|
|
34
|
+
workdir: string;
|
|
35
|
+
/** Remove the throwaway worktree; the `wicked/<runId>` branch (the record) survives. */
|
|
36
|
+
cleanup: () => Promise<void>;
|
|
37
|
+
}
|
|
38
|
+
/** The reprovision seam (crew#418) — injectable so route tests never shell out to git. Resolves
|
|
39
|
+
* to a throwaway worktree checked out on the run's branch, or `null` when the branch is gone. */
|
|
40
|
+
export type WorktreeReprovisioner = (repoRoot: string, runId: string) => Promise<ReprovisionedWorktree | null>;
|
|
41
|
+
/**
|
|
42
|
+
* Stand a run's committed work back up from its `wicked/<runId>` branch (crew#418).
|
|
43
|
+
*
|
|
44
|
+
* The engine REAPS a failed-deliver run's worktree once the deliver phase has committed the work
|
|
45
|
+
* (a clean tree; `git worktree remove` succeeds even with the branch ahead) — the work then lives
|
|
46
|
+
* ONLY on the `wicked/<runId>` branch, which the reap never deletes ("the checkout is scaffolding,
|
|
47
|
+
* the branch is the record"). A post-hoc lift therefore has no worktree to run in; this checks the
|
|
48
|
+
* branch out at a THROWAWAY path so the hardened deliver script can commit-nothing / rebase / push
|
|
49
|
+
* it. The path's basename is deliberately NOT the run id, so the script's branch derivation falls
|
|
50
|
+
* back to `git branch --show-current` — which the checkout puts on `wicked/<runId>` — instead of
|
|
51
|
+
* `wicked/<basename>`. Never touches the engine's recorded worktree path, so it cannot race the
|
|
52
|
+
* engine's own worktree bookkeeping.
|
|
53
|
+
*
|
|
54
|
+
* Resolves `null` when the branch does not exist (nothing to reprovision) — the caller then
|
|
55
|
+
* answers the same "nothing to deliver" refusal as a truly empty run.
|
|
56
|
+
*/
|
|
57
|
+
export declare const gitReprovisionWorktree: WorktreeReprovisioner;
|
|
31
58
|
/**
|
|
32
59
|
* The production {@link DeliverExec}: `bash -lc <script>` in the run's worktree — the exact
|
|
33
60
|
* invocation core's `run_tool_cmd` uses for the deliver phase (login shell, so the operator's
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post-hoc-deliver.d.ts","sourceRoot":"","sources":["../../src/api/post-hoc-deliver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"post-hoc-deliver.d.ts","sourceRoot":"","sources":["../../src/api/post-hoc-deliver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AASH,wFAAwF;AACxF,MAAM,WAAW,mBAAmB;IAClC,6FAA6F;IAC7F,MAAM,EAAE,MAAM,CAAC;IACf,gGAAgG;IAChG,MAAM,EAAE,MAAM,CAAC;IACf;+FAC2F;IAC3F,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;+FAC+F;AAC/F,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAE7F,gGAAgG;AAChG,MAAM,WAAW,qBAAqB;IACpC,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,wFAAwF;IACxF,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED;kGACkG;AAClG,MAAM,MAAM,qBAAqB,GAAG,CAClC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,KACV,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;AAE3C;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,sBAAsB,EAAE,qBAmCpC,CAAC;AAQF;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,OAAO,CAAC,mBAAmB,CAAC,CA+B9B"}
|
|
@@ -16,7 +16,61 @@
|
|
|
16
16
|
* crew-side via `prUrlFrom`, the same grep the script itself ends with).
|
|
17
17
|
*/
|
|
18
18
|
import { execFile } from 'node:child_process';
|
|
19
|
+
import { mkdtemp, rm } from 'node:fs/promises';
|
|
20
|
+
import { tmpdir } from 'node:os';
|
|
21
|
+
import { join } from 'node:path';
|
|
19
22
|
import { deliverPrScript } from '../core/deliver.js';
|
|
23
|
+
/**
|
|
24
|
+
* Stand a run's committed work back up from its `wicked/<runId>` branch (crew#418).
|
|
25
|
+
*
|
|
26
|
+
* The engine REAPS a failed-deliver run's worktree once the deliver phase has committed the work
|
|
27
|
+
* (a clean tree; `git worktree remove` succeeds even with the branch ahead) — the work then lives
|
|
28
|
+
* ONLY on the `wicked/<runId>` branch, which the reap never deletes ("the checkout is scaffolding,
|
|
29
|
+
* the branch is the record"). A post-hoc lift therefore has no worktree to run in; this checks the
|
|
30
|
+
* branch out at a THROWAWAY path so the hardened deliver script can commit-nothing / rebase / push
|
|
31
|
+
* it. The path's basename is deliberately NOT the run id, so the script's branch derivation falls
|
|
32
|
+
* back to `git branch --show-current` — which the checkout puts on `wicked/<runId>` — instead of
|
|
33
|
+
* `wicked/<basename>`. Never touches the engine's recorded worktree path, so it cannot race the
|
|
34
|
+
* engine's own worktree bookkeeping.
|
|
35
|
+
*
|
|
36
|
+
* Resolves `null` when the branch does not exist (nothing to reprovision) — the caller then
|
|
37
|
+
* answers the same "nothing to deliver" refusal as a truly empty run.
|
|
38
|
+
*/
|
|
39
|
+
export const gitReprovisionWorktree = async (repoRoot, runId) => {
|
|
40
|
+
const branch = `wicked/${runId}`;
|
|
41
|
+
const run = (args) => new Promise((resolve, reject) => {
|
|
42
|
+
execFile('git', ['-C', repoRoot, ...args], { windowsHide: true }, (err) => err === null ? resolve() : reject(err));
|
|
43
|
+
});
|
|
44
|
+
const dir = await mkdtemp(join(tmpdir(), `wicked-deliver-${runId.replace(/[^\w.-]/g, '_')}-`));
|
|
45
|
+
// Is the run's branch even there? Absent ⇒ the work is genuinely GONE → null (the route answers
|
|
46
|
+
// 409 "nothing to deliver"). This is the ONLY reason to report null: an OPERATIONAL git failure
|
|
47
|
+
// below (permissions, corruption, a busy repo) must surface as an error, not be misreported as
|
|
48
|
+
// "gone" — so it is left to throw and the route answers 500.
|
|
49
|
+
try {
|
|
50
|
+
await run(['rev-parse', '--verify', '--quiet', `refs/heads/${branch}`]);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
await rm(dir, { recursive: true, force: true }).catch(() => undefined);
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
// Drop any dangling admin entry the reap left, THEN check the branch out at the empty temp dir
|
|
58
|
+
// (`git worktree add` accepts an existing empty directory).
|
|
59
|
+
await run(['worktree', 'prune']);
|
|
60
|
+
await run(['worktree', 'add', dir, branch]);
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
await rm(dir, { recursive: true, force: true }).catch(() => undefined);
|
|
64
|
+
throw err; // operational failure standing the worktree up — NOT "gone"
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
workdir: dir,
|
|
68
|
+
cleanup: async () => {
|
|
69
|
+
await run(['worktree', 'remove', '--force', dir]).catch(() => undefined);
|
|
70
|
+
await rm(dir, { recursive: true, force: true }).catch(() => undefined);
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
};
|
|
20
74
|
/** Everything the script prints stays bounded — 8 MiB is far past any real transcript. */
|
|
21
75
|
const OUTPUT_CAP_BYTES = 8 * 1024 * 1024;
|
|
22
76
|
/** A post-hoc lift talks to a real remote; 5 minutes is generous, hanging forever is not. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"post-hoc-deliver.js","sourceRoot":"","sources":["../../src/api/post-hoc-deliver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"post-hoc-deliver.js","sourceRoot":"","sources":["../../src/api/post-hoc-deliver.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,8 +13,14 @@
|
|
|
13
13
|
* the audit entry, so the map can only lag by a failed hydrate, never diverge silently.
|
|
14
14
|
*/
|
|
15
15
|
import type { AuditLog } from './audit.js';
|
|
16
|
+
import type { AuditEntry } from '../core/types.js';
|
|
16
17
|
export declare class RetryIndex {
|
|
17
18
|
private readonly runToRetryOf;
|
|
19
|
+
/**
|
|
20
|
+
* Consume pre-read `run.launched` entries — the seam that lets `createServer` feed this index
|
|
21
|
+
* and `GroupIndex` from ONE trail scan (the delivery-index consolidation note, crew#321).
|
|
22
|
+
*/
|
|
23
|
+
hydrateFromLaunchEntries(entries: AuditEntry[]): void;
|
|
18
24
|
/**
|
|
19
25
|
* Load lineage from EVERY `run.launched` entry in the trail — exhaustively, not capped
|
|
20
26
|
* (BRIEF-UX-002 C5: a lineage fact 2,678 launches deep must survive a restart; the newest-1000
|
|
@@ -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;
|
|
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;IAE1D;;;OAGG;IACH,wBAAwB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI;IASrD;;;;;;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;CAG9C"}
|
package/dist/api/retry-index.js
CHANGED
|
@@ -14,6 +14,18 @@
|
|
|
14
14
|
*/
|
|
15
15
|
export class RetryIndex {
|
|
16
16
|
runToRetryOf = new Map();
|
|
17
|
+
/**
|
|
18
|
+
* Consume pre-read `run.launched` entries — the seam that lets `createServer` feed this index
|
|
19
|
+
* and `GroupIndex` from ONE trail scan (the delivery-index consolidation note, crew#321).
|
|
20
|
+
*/
|
|
21
|
+
hydrateFromLaunchEntries(entries) {
|
|
22
|
+
for (const entry of entries) {
|
|
23
|
+
const retryOf = entry.detail?.['retryOf'];
|
|
24
|
+
if (typeof entry.runId === 'string' && typeof retryOf === 'string') {
|
|
25
|
+
this.runToRetryOf.set(entry.runId, retryOf);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
17
29
|
/**
|
|
18
30
|
* Load lineage from EVERY `run.launched` entry in the trail — exhaustively, not capped
|
|
19
31
|
* (BRIEF-UX-002 C5: a lineage fact 2,678 launches deep must survive a restart; the newest-1000
|
|
@@ -23,12 +35,7 @@ export class RetryIndex {
|
|
|
23
35
|
*/
|
|
24
36
|
async hydrate(audit, log) {
|
|
25
37
|
try {
|
|
26
|
-
|
|
27
|
-
const retryOf = entry.detail?.['retryOf'];
|
|
28
|
-
if (typeof entry.runId === 'string' && typeof retryOf === 'string') {
|
|
29
|
-
this.runToRetryOf.set(entry.runId, retryOf);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
38
|
+
this.hydrateFromLaunchEntries(await audit.readAll({ action: 'run.launched' }));
|
|
32
39
|
}
|
|
33
40
|
catch (err) {
|
|
34
41
|
log?.(`[runs] retry-index hydrate failed (prior runs read as not-a-retry until restart): ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -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":"AAAA;;;;;;;;;;;;;GAaG;AAKH,MAAM,OAAO,UAAU;IACJ,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE1D;;;OAGG;IACH,wBAAwB,CAAC,OAAqB;QAC5C,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC;YAC1C,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACnE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,OAAO,CAAC,KAAe,EAAE,GAA2B;QACxD,IAAI,CAAC;YACH,IAAI,CAAC,wBAAwB,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;QACjF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,EAAE,CACH,qFACE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,EAAE,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,GAAG,CAAC,KAAa,EAAE,OAAe;QAChC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,4FAA4F;IAC5F,UAAU,CAAC,KAAa;QACtB,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;CACF"}
|
package/dist/api/routes.d.ts
CHANGED
|
@@ -11,9 +11,10 @@ import type { DocLedgerSweep } from '../interactive/doc-ledger-sweep.js';
|
|
|
11
11
|
import { AuditLog } from './audit.js';
|
|
12
12
|
import { type ErrorRing } from './diagnostics.js';
|
|
13
13
|
import { RetryIndex } from './retry-index.js';
|
|
14
|
+
import { GroupIndex } from './group-index.js';
|
|
14
15
|
import { GuidanceIndex } from './guidance-index.js';
|
|
15
16
|
import { DeliveryIndex } from './delivery-index.js';
|
|
16
|
-
import { type DeliverExec } from './post-hoc-deliver.js';
|
|
17
|
+
import { type DeliverExec, type WorktreeReprovisioner } from './post-hoc-deliver.js';
|
|
17
18
|
import { type AuthMode } from './auth.js';
|
|
18
19
|
export { API_PREFIX } from './api-prefix.js';
|
|
19
20
|
/**
|
|
@@ -29,7 +30,7 @@ export { API_PREFIX } from './api-prefix.js';
|
|
|
29
30
|
* schema does not accept — so `.strict()` is what turns that trip into a 400 instead of an
|
|
30
31
|
* unworkflowed run reported as `201`.
|
|
31
32
|
*/
|
|
32
|
-
export declare const LaunchSchema: z.ZodEffects<z.ZodObject<{
|
|
33
|
+
export declare const LaunchSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<{
|
|
33
34
|
problem: z.ZodString;
|
|
34
35
|
sessionId: z.ZodOptional<z.ZodString>;
|
|
35
36
|
clisJson: z.ZodOptional<z.ZodString>;
|
|
@@ -52,10 +53,22 @@ export declare const LaunchSchema: z.ZodEffects<z.ZodObject<{
|
|
|
52
53
|
* (the route checks the store and 400s with a named error otherwise); persisted via the
|
|
53
54
|
* `run.launched` audit entry + retry index and echoed as `AgentSession.retry_of`. */
|
|
54
55
|
retryOf: z.ZodOptional<z.ZodString>;
|
|
56
|
+
/** wicked-studio#27 (api-types 0.19.0) — attach this AD-HOC run to an EXISTING campaign's
|
|
57
|
+
* surface. Validated against the campaign store before anything launches (unknown ⇒ 404,
|
|
58
|
+
* engine without campaign bindings ⇒ 501 — never a silently dropped attach); persisted via
|
|
59
|
+
* the `run.launched` audit entry + group index, echoed as `AgentSession.campaign_id`, and
|
|
60
|
+
* served under `Campaign.attached_runs`. Provenance only: the run is NOT a DAG node. */
|
|
61
|
+
campaignId: z.ZodOptional<z.ZodString>;
|
|
62
|
+
/** wicked-studio#27 (api-types 0.19.0) — ad-hoc label group, created on first use: runs
|
|
63
|
+
* sharing a label form one `RunGroup` on `GET /campaigns`. Persisted/echoed like
|
|
64
|
+
* `campaignId` (as `AgentSession.group_label`). */
|
|
65
|
+
groupLabel: z.ZodOptional<z.ZodString>;
|
|
55
66
|
}, "strict", z.ZodTypeAny, {
|
|
56
67
|
problem: string;
|
|
57
68
|
deliver?: "pr" | "none" | undefined;
|
|
58
69
|
projectId?: string | undefined;
|
|
70
|
+
campaignId?: string | undefined;
|
|
71
|
+
groupLabel?: string | undefined;
|
|
59
72
|
workflow?: string | undefined;
|
|
60
73
|
repoRef?: string | undefined;
|
|
61
74
|
clisJson?: string | undefined;
|
|
@@ -67,6 +80,8 @@ export declare const LaunchSchema: z.ZodEffects<z.ZodObject<{
|
|
|
67
80
|
problem: string;
|
|
68
81
|
deliver?: "pr" | "none" | undefined;
|
|
69
82
|
projectId?: string | undefined;
|
|
83
|
+
campaignId?: string | undefined;
|
|
84
|
+
groupLabel?: string | undefined;
|
|
70
85
|
workflow?: string | undefined;
|
|
71
86
|
repoRef?: string | undefined;
|
|
72
87
|
clisJson?: string | undefined;
|
|
@@ -78,6 +93,8 @@ export declare const LaunchSchema: z.ZodEffects<z.ZodObject<{
|
|
|
78
93
|
problem: string;
|
|
79
94
|
deliver?: "pr" | "none" | undefined;
|
|
80
95
|
projectId?: string | undefined;
|
|
96
|
+
campaignId?: string | undefined;
|
|
97
|
+
groupLabel?: string | undefined;
|
|
81
98
|
workflow?: string | undefined;
|
|
82
99
|
repoRef?: string | undefined;
|
|
83
100
|
clisJson?: string | undefined;
|
|
@@ -89,6 +106,34 @@ export declare const LaunchSchema: z.ZodEffects<z.ZodObject<{
|
|
|
89
106
|
problem: string;
|
|
90
107
|
deliver?: "pr" | "none" | undefined;
|
|
91
108
|
projectId?: string | undefined;
|
|
109
|
+
campaignId?: string | undefined;
|
|
110
|
+
groupLabel?: string | undefined;
|
|
111
|
+
workflow?: string | undefined;
|
|
112
|
+
repoRef?: string | undefined;
|
|
113
|
+
clisJson?: string | undefined;
|
|
114
|
+
sessionId?: string | undefined;
|
|
115
|
+
retryOf?: string | undefined;
|
|
116
|
+
entityMode?: "shared" | "isolated" | undefined;
|
|
117
|
+
humanConfirm?: string | undefined;
|
|
118
|
+
}>, {
|
|
119
|
+
problem: string;
|
|
120
|
+
deliver?: "pr" | "none" | undefined;
|
|
121
|
+
projectId?: string | undefined;
|
|
122
|
+
campaignId?: string | undefined;
|
|
123
|
+
groupLabel?: string | undefined;
|
|
124
|
+
workflow?: string | undefined;
|
|
125
|
+
repoRef?: string | undefined;
|
|
126
|
+
clisJson?: string | undefined;
|
|
127
|
+
sessionId?: string | undefined;
|
|
128
|
+
retryOf?: string | undefined;
|
|
129
|
+
entityMode?: "shared" | "isolated" | undefined;
|
|
130
|
+
humanConfirm?: string | undefined;
|
|
131
|
+
}, {
|
|
132
|
+
problem: string;
|
|
133
|
+
deliver?: "pr" | "none" | undefined;
|
|
134
|
+
projectId?: string | undefined;
|
|
135
|
+
campaignId?: string | undefined;
|
|
136
|
+
groupLabel?: string | undefined;
|
|
92
137
|
workflow?: string | undefined;
|
|
93
138
|
repoRef?: string | undefined;
|
|
94
139
|
clisJson?: string | undefined;
|
|
@@ -162,6 +207,10 @@ export interface RuntimeDeps {
|
|
|
162
207
|
/** Run→retry-lineage index (CREW-UX-3) — `createServer` hydrates one from the audit trail so
|
|
163
208
|
* a restarted daemon still echoes `retry_of`; a directly-driven route set gets a fresh one. */
|
|
164
209
|
retryIndex?: RetryIndex;
|
|
210
|
+
/** Run→ad-hoc-group index (wicked-studio#27) — `createServer` hydrates one from the audit
|
|
211
|
+
* trail (the SAME `run.launched` scan as `retryIndex`) so attaches survive a restart; a
|
|
212
|
+
* directly-driven route set gets a fresh one. */
|
|
213
|
+
groupIndex?: GroupIndex;
|
|
165
214
|
/** Run→operator-guidance index (CREW-UX-7) — `createServer` hydrates one from the audit trail
|
|
166
215
|
* so a restarted daemon still echoes `guidance`; a directly-driven route set gets a fresh one. */
|
|
167
216
|
guidanceIndex?: GuidanceIndex;
|
|
@@ -186,6 +235,10 @@ export interface RuntimeDeps {
|
|
|
186
235
|
* deliver script in a run's worktree. Injectable so route tests aim the spawn's HOME/PATH at
|
|
187
236
|
* a fixture (stub `gh`, local bare origin); defaults to the real `bash -lc` spawn. */
|
|
188
237
|
deliverExec?: DeliverExec;
|
|
238
|
+
/** Stand a lift-conflict-stranded run's worktree back up from its `wicked/<id>` branch when the
|
|
239
|
+
* engine has reaped it (crew#418) — the post-hoc deliver path uses it before the exec above.
|
|
240
|
+
* Injectable so route tests never shell out to git; defaults to {@link gitReprovisionWorktree}. */
|
|
241
|
+
reprovisionWorktree?: WorktreeReprovisioner;
|
|
189
242
|
openWithOs?: (target: string) => Promise<void>;
|
|
190
243
|
/** Seat sign-in presence probe (seat sign-in) — injectable so route tests never read the
|
|
191
244
|
* developer's real dotfiles. Defaults to the file/env heuristic in seat-signin.ts. */
|
package/dist/api/routes.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/api/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,OAAO,
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/api/routes.ts"],"names":[],"mappings":"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"}
|