wicked-crew 0.6.0 → 0.7.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/dist/api/audit.d.ts +13 -0
- package/dist/api/audit.d.ts.map +1 -1
- package/dist/api/audit.js +18 -2
- package/dist/api/audit.js.map +1 -1
- package/dist/api/guidance-index.d.ts +39 -0
- package/dist/api/guidance-index.d.ts.map +1 -0
- package/dist/api/guidance-index.js +67 -0
- package/dist/api/guidance-index.js.map +1 -0
- package/dist/api/open-path.d.ts +16 -0
- package/dist/api/open-path.d.ts.map +1 -1
- package/dist/api/open-path.js +22 -0
- package/dist/api/open-path.js.map +1 -1
- package/dist/api/retry-index.d.ts +30 -0
- package/dist/api/retry-index.d.ts.map +1 -0
- package/dist/api/retry-index.js +45 -0
- package/dist/api/retry-index.js.map +1 -0
- package/dist/api/routes.d.ts +53 -1
- package/dist/api/routes.d.ts.map +1 -1
- package/dist/api/routes.js +352 -23
- package/dist/api/routes.js.map +1 -1
- package/dist/api/run-files.d.ts +63 -0
- package/dist/api/run-files.d.ts.map +1 -0
- package/dist/api/run-files.js +271 -0
- package/dist/api/run-files.js.map +1 -0
- package/dist/api/server.d.ts +79 -0
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +135 -6
- package/dist/api/server.js.map +1 -1
- package/dist/api/stall-watchdog.d.ts +62 -0
- package/dist/api/stall-watchdog.d.ts.map +1 -0
- package/dist/api/stall-watchdog.js +138 -0
- package/dist/api/stall-watchdog.js.map +1 -0
- package/dist/cli/index.js +78 -13
- package/dist/cli/index.js.map +1 -1
- package/dist/core/adapter.d.ts +24 -10
- package/dist/core/adapter.d.ts.map +1 -1
- package/dist/core/adapter.js +191 -30
- package/dist/core/adapter.js.map +1 -1
- package/dist/core/bridge-reaper.d.ts +134 -0
- package/dist/core/bridge-reaper.d.ts.map +1 -0
- package/dist/core/bridge-reaper.js +286 -0
- package/dist/core/bridge-reaper.js.map +1 -0
- package/dist/core/deliver.d.ts +118 -0
- package/dist/core/deliver.d.ts.map +1 -0
- package/dist/core/deliver.js +241 -0
- package/dist/core/deliver.js.map +1 -0
- package/dist/core/deliverable-floor.d.ts +103 -0
- package/dist/core/deliverable-floor.d.ts.map +1 -0
- package/dist/core/deliverable-floor.js +173 -0
- package/dist/core/deliverable-floor.js.map +1 -0
- package/dist/core/exec.d.ts +2 -0
- package/dist/core/exec.d.ts.map +1 -1
- package/dist/core/exec.js.map +1 -1
- package/dist/core/types.d.ts +79 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -1
- package/dist/interactive/bridge-pool.d.ts +28 -0
- package/dist/interactive/bridge-pool.d.ts.map +1 -1
- package/dist/interactive/bridge-pool.js +67 -10
- package/dist/interactive/bridge-pool.js.map +1 -1
- package/dist/interactive/chat-events.d.ts +207 -0
- package/dist/interactive/chat-events.d.ts.map +1 -0
- package/dist/interactive/chat-events.js +769 -0
- package/dist/interactive/chat-events.js.map +1 -0
- package/dist/interactive/demo-events.d.ts +283 -0
- package/dist/interactive/demo-events.d.ts.map +1 -0
- package/dist/interactive/demo-events.js +889 -0
- package/dist/interactive/demo-events.js.map +1 -0
- package/dist/interactive/draft-events.d.ts +87 -7
- package/dist/interactive/draft-events.d.ts.map +1 -1
- package/dist/interactive/draft-events.js +352 -49
- package/dist/interactive/draft-events.js.map +1 -1
- package/dist/interactive/edit-events.d.ts +22 -0
- package/dist/interactive/edit-events.d.ts.map +1 -1
- package/dist/interactive/edit-events.js +73 -2
- package/dist/interactive/edit-events.js.map +1 -1
- package/dist/interactive/repo-snapshot.d.ts +100 -0
- package/dist/interactive/repo-snapshot.d.ts.map +1 -0
- package/dist/interactive/repo-snapshot.js +289 -0
- package/dist/interactive/repo-snapshot.js.map +1 -0
- package/dist/projects/graph-paths.d.ts +92 -0
- package/dist/projects/graph-paths.d.ts.map +1 -0
- package/dist/projects/graph-paths.js +130 -0
- package/dist/projects/graph-paths.js.map +1 -0
- package/dist/projects/graph.d.ts +179 -0
- package/dist/projects/graph.d.ts.map +1 -0
- package/dist/projects/graph.js +775 -0
- package/dist/projects/graph.js.map +1 -0
- package/dist/projects/routes.d.ts +7 -0
- package/dist/projects/routes.d.ts.map +1 -1
- package/dist/projects/routes.js +122 -0
- package/dist/projects/routes.js.map +1 -1
- package/dist/studio/assets/index-8p8uwCxG.js +530 -0
- package/dist/studio/assets/index-D6S9zUtO.css +32 -0
- package/dist/studio/index.html +5 -3
- package/package.json +3 -3
- package/dist/studio/assets/index-CCwXa1cn.js +0 -428
- package/dist/studio/assets/index-HWxo0h41.css +0 -32
package/dist/api/audit.d.ts
CHANGED
|
@@ -21,6 +21,8 @@ export interface AuditReadFilter {
|
|
|
21
21
|
/** Max entries returned (newest first). Default 200, capped at 1000. */
|
|
22
22
|
limit?: number;
|
|
23
23
|
}
|
|
24
|
+
/** `readAll`'s filter: no limit — the whole point is that nothing gets trimmed. */
|
|
25
|
+
export type AuditScanFilter = Omit<AuditReadFilter, 'limit'>;
|
|
24
26
|
export declare class AuditLog {
|
|
25
27
|
readonly path: string;
|
|
26
28
|
private readonly warn;
|
|
@@ -53,5 +55,16 @@ export declare class AuditLog {
|
|
|
53
55
|
* still answers.
|
|
54
56
|
*/
|
|
55
57
|
read(filter?: AuditReadFilter): Promise<AuditEntry[]>;
|
|
58
|
+
/**
|
|
59
|
+
* Read the trail EXHAUSTIVELY, newest first — no read cap. The hydrate path
|
|
60
|
+
* for the boot-time indexes (`RetryIndex`, `GuidanceIndex`): durable facts
|
|
61
|
+
* like retry lineage must not vanish because 1000+ newer launches landed on
|
|
62
|
+
* top of them (BRIEF-UX-002 C5). Same cost class as `read` — that already
|
|
63
|
+
* parses the whole file and only trims the returned slice — so this is a
|
|
64
|
+
* one-time full-file scan at boot, measured at ~19ms on a 19k-line live trail.
|
|
65
|
+
*/
|
|
66
|
+
readAll(filter?: AuditScanFilter): Promise<AuditEntry[]>;
|
|
67
|
+
/** The shared full-file parse: every matching entry, newest first, uncapped. */
|
|
68
|
+
private scan;
|
|
56
69
|
}
|
|
57
70
|
//# sourceMappingURL=audit.d.ts.map
|
package/dist/api/audit.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/api/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE1D,qDAAqD;AACrD,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAE7E;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,QAAQ;IAMjB,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI;IANvB,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAS;gBAGd,IAAI,GAAE,MAA2B,EACzB,IAAI,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAA6B;IAGvE;;;;;;OAMG;IACH,MAAM,CAAC,IAAI,IAAI,QAAQ;IAMvB;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,IAAI;IAyBzG,wCAAwC;IACxC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB;;;;OAIG;IACG,IAAI,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/api/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE1D,qDAAqD;AACrD,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAE7E;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,mFAAmF;AACnF,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;AAE7D,qBAAa,QAAQ;IAMjB,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI;IANvB,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAS;gBAGd,IAAI,GAAE,MAA2B,EACzB,IAAI,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAA6B;IAGvE;;;;;;OAMG;IACH,MAAM,CAAC,IAAI,IAAI,QAAQ;IAMvB;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,IAAI;IAyBzG,wCAAwC;IACxC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB;;;;OAIG;IACG,IAAI,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAM3D;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAIxD,gFAAgF;YAClE,IAAI;CA0BnB"}
|
package/dist/api/audit.js
CHANGED
|
@@ -77,6 +77,23 @@ export class AuditLog {
|
|
|
77
77
|
* still answers.
|
|
78
78
|
*/
|
|
79
79
|
async read(filter) {
|
|
80
|
+
const entries = await this.scan(filter);
|
|
81
|
+
const limit = Math.min(Math.max(filter?.limit ?? 200, 1), 1000);
|
|
82
|
+
return entries.slice(0, limit);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Read the trail EXHAUSTIVELY, newest first — no read cap. The hydrate path
|
|
86
|
+
* for the boot-time indexes (`RetryIndex`, `GuidanceIndex`): durable facts
|
|
87
|
+
* like retry lineage must not vanish because 1000+ newer launches landed on
|
|
88
|
+
* top of them (BRIEF-UX-002 C5). Same cost class as `read` — that already
|
|
89
|
+
* parses the whole file and only trims the returned slice — so this is a
|
|
90
|
+
* one-time full-file scan at boot, measured at ~19ms on a 19k-line live trail.
|
|
91
|
+
*/
|
|
92
|
+
readAll(filter) {
|
|
93
|
+
return this.scan(filter);
|
|
94
|
+
}
|
|
95
|
+
/** The shared full-file parse: every matching entry, newest first, uncapped. */
|
|
96
|
+
async scan(filter) {
|
|
80
97
|
if (this.disabled)
|
|
81
98
|
return [];
|
|
82
99
|
await this.flush();
|
|
@@ -108,8 +125,7 @@ export class AuditLog {
|
|
|
108
125
|
}
|
|
109
126
|
}
|
|
110
127
|
entries.reverse(); // file order is append order; the API answers newest first
|
|
111
|
-
|
|
112
|
-
return entries.slice(0, limit);
|
|
128
|
+
return entries;
|
|
113
129
|
}
|
|
114
130
|
}
|
|
115
131
|
//# sourceMappingURL=audit.js.map
|
package/dist/api/audit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/api/audit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAG1C,qDAAqD;AACrD,MAAM,UAAU,gBAAgB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACnE,OAAO,GAAG,CAAC,uBAAuB,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,WAAW,CAAC,CAAC;AACtF,CAAC;
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/api/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The run→operator-guidance index (DES-UX-002 §7.2, CREW-UX-7).
|
|
3
|
+
*
|
|
4
|
+
* NAMING NOTE: DES-UX-002 §7.2 labels this slice CREW-UX-4, but that id was already spent on an
|
|
5
|
+
* unrelated merged slice (crew#308) — this implementation is CREW-UX-7; the doc's §7.2 spec is
|
|
6
|
+
* what it implements.
|
|
7
|
+
*
|
|
8
|
+
* A durable pre-gate annotation: ONE operator guidance note per run, upserted via
|
|
9
|
+
* `PUT /runs/:id/guidance` and echoed as `AgentSession.guidance` on the run DTOs. The engine's
|
|
10
|
+
* run record carries no such field (wicked-core-ts 0.6.x), so — exactly like retry lineage
|
|
11
|
+
* (CREW-UX-3) and the actor trail (task #88) — the durable record is the audit trail: every
|
|
12
|
+
* write lands as a `guidance.set` entry whose `detail.text` is the full note (empty string =
|
|
13
|
+
* cleared), and this map is the read-side latency layer that lets the run DTOs echo it without
|
|
14
|
+
* a trail scan per request.
|
|
15
|
+
*
|
|
16
|
+
* Mirrors `RetryIndex`'s posture: hydrated once at server start (best-effort — a missing or
|
|
17
|
+
* unreadable trail leaves guidance blank, the pre-CREW-UX-7 behavior, not an error) and updated
|
|
18
|
+
* at the same post-commit point that writes the audit entry, so the map can only lag by a
|
|
19
|
+
* failed hydrate, never diverge silently.
|
|
20
|
+
*/
|
|
21
|
+
import type { AuditLog } from './audit.js';
|
|
22
|
+
export declare class GuidanceIndex {
|
|
23
|
+
private readonly runToGuidance;
|
|
24
|
+
/**
|
|
25
|
+
* Load guidance from EVERY `guidance.set` entry in the trail — exhaustively, not capped
|
|
26
|
+
* (BRIEF-UX-002 C5, same defect as `RetryIndex.hydrate`: a durable note must not vanish
|
|
27
|
+
* because 1000+ newer writes landed on top of it). The trail answers newest first, so the
|
|
28
|
+
* FIRST entry seen per run is the current note — later (older) entries for the same run
|
|
29
|
+
* are superseded writes and are skipped, which is also what keeps a cleared note (newest
|
|
30
|
+
* entry has `text: ''`) from being resurrected by an older non-empty one. Still best-effort,
|
|
31
|
+
* like `RetryIndex.hydrate`; cost is one full-file scan at boot.
|
|
32
|
+
*/
|
|
33
|
+
hydrate(audit: AuditLog, log?: (msg: string) => void): Promise<void>;
|
|
34
|
+
/** Upsert the note; the empty string CLEARS it (the DTO field goes back to absent). */
|
|
35
|
+
set(runId: string, text: string): void;
|
|
36
|
+
/** The note for this run, or `undefined` (the DTO spells that as an ABSENT field). */
|
|
37
|
+
guidanceFor(runId: string): string | undefined;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=guidance-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guidance-index.d.ts","sourceRoot":"","sources":["../../src/api/guidance-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA6B;IAE3D;;;;;;;;OAQG;IACG,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAuB1E,uFAAuF;IACvF,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAKtC,sFAAsF;IACtF,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAG/C"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The run→operator-guidance index (DES-UX-002 §7.2, CREW-UX-7).
|
|
3
|
+
*
|
|
4
|
+
* NAMING NOTE: DES-UX-002 §7.2 labels this slice CREW-UX-4, but that id was already spent on an
|
|
5
|
+
* unrelated merged slice (crew#308) — this implementation is CREW-UX-7; the doc's §7.2 spec is
|
|
6
|
+
* what it implements.
|
|
7
|
+
*
|
|
8
|
+
* A durable pre-gate annotation: ONE operator guidance note per run, upserted via
|
|
9
|
+
* `PUT /runs/:id/guidance` and echoed as `AgentSession.guidance` on the run DTOs. The engine's
|
|
10
|
+
* run record carries no such field (wicked-core-ts 0.6.x), so — exactly like retry lineage
|
|
11
|
+
* (CREW-UX-3) and the actor trail (task #88) — the durable record is the audit trail: every
|
|
12
|
+
* write lands as a `guidance.set` entry whose `detail.text` is the full note (empty string =
|
|
13
|
+
* cleared), and this map is the read-side latency layer that lets the run DTOs echo it without
|
|
14
|
+
* a trail scan per request.
|
|
15
|
+
*
|
|
16
|
+
* Mirrors `RetryIndex`'s posture: hydrated once at server start (best-effort — a missing or
|
|
17
|
+
* unreadable trail leaves guidance blank, the pre-CREW-UX-7 behavior, not an error) and updated
|
|
18
|
+
* at the same post-commit point that writes the audit entry, so the map can only lag by a
|
|
19
|
+
* failed hydrate, never diverge silently.
|
|
20
|
+
*/
|
|
21
|
+
export class GuidanceIndex {
|
|
22
|
+
runToGuidance = new Map();
|
|
23
|
+
/**
|
|
24
|
+
* Load guidance from EVERY `guidance.set` entry in the trail — exhaustively, not capped
|
|
25
|
+
* (BRIEF-UX-002 C5, same defect as `RetryIndex.hydrate`: a durable note must not vanish
|
|
26
|
+
* because 1000+ newer writes landed on top of it). The trail answers newest first, so the
|
|
27
|
+
* FIRST entry seen per run is the current note — later (older) entries for the same run
|
|
28
|
+
* are superseded writes and are skipped, which is also what keeps a cleared note (newest
|
|
29
|
+
* entry has `text: ''`) from being resurrected by an older non-empty one. Still best-effort,
|
|
30
|
+
* like `RetryIndex.hydrate`; cost is one full-file scan at boot.
|
|
31
|
+
*/
|
|
32
|
+
async hydrate(audit, log) {
|
|
33
|
+
try {
|
|
34
|
+
const superseded = new Set();
|
|
35
|
+
for (const entry of await audit.readAll({ action: 'guidance.set' })) {
|
|
36
|
+
if (typeof entry.runId !== 'string')
|
|
37
|
+
continue;
|
|
38
|
+
if (superseded.has(entry.runId))
|
|
39
|
+
continue;
|
|
40
|
+
// The NEWEST entry for a run decides — even when its text is malformed. Marking the
|
|
41
|
+
// run seen BEFORE the text check keeps a corrupt newest write from resurrecting an
|
|
42
|
+
// older superseded note (Copilot, #312): unknowable current note = no note.
|
|
43
|
+
superseded.add(entry.runId);
|
|
44
|
+
const text = entry.detail?.['text'];
|
|
45
|
+
if (typeof text !== 'string')
|
|
46
|
+
continue;
|
|
47
|
+
if (text !== '')
|
|
48
|
+
this.runToGuidance.set(entry.runId, text);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
log?.(`[runs] guidance-index hydrate failed (prior runs read as no-guidance until restart): ${err instanceof Error ? err.message : String(err)}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/** Upsert the note; the empty string CLEARS it (the DTO field goes back to absent). */
|
|
56
|
+
set(runId, text) {
|
|
57
|
+
if (text === '')
|
|
58
|
+
this.runToGuidance.delete(runId);
|
|
59
|
+
else
|
|
60
|
+
this.runToGuidance.set(runId, text);
|
|
61
|
+
}
|
|
62
|
+
/** The note for this run, or `undefined` (the DTO spells that as an ABSENT field). */
|
|
63
|
+
guidanceFor(runId) {
|
|
64
|
+
return this.runToGuidance.get(runId);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=guidance-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guidance-index.js","sourceRoot":"","sources":["../../src/api/guidance-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,MAAM,OAAO,aAAa;IACP,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE3D;;;;;;;;OAQG;IACH,KAAK,CAAC,OAAO,CAAC,KAAe,EAAE,GAA2B;QACxD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;YACrC,KAAK,MAAM,KAAK,IAAI,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;gBACpE,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;oBAAE,SAAS;gBAC9C,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC;oBAAE,SAAS;gBAC1C,oFAAoF;gBACpF,mFAAmF;gBACnF,4EAA4E;gBAC5E,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;gBACpC,IAAI,OAAO,IAAI,KAAK,QAAQ;oBAAE,SAAS;gBACvC,IAAI,IAAI,KAAK,EAAE;oBAAE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,EAAE,CACH,wFACE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,EAAE,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,uFAAuF;IACvF,GAAG,CAAC,KAAa,EAAE,IAAY;QAC7B,IAAI,IAAI,KAAK,EAAE;YAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;;YAC7C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,sFAAsF;IACtF,WAAW,CAAC,KAAa;QACvB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;CACF"}
|
package/dist/api/open-path.d.ts
CHANGED
|
@@ -4,6 +4,22 @@
|
|
|
4
4
|
* whose name merely starts with dots (`/a/..hidden`) is not wrongly excluded.
|
|
5
5
|
*/
|
|
6
6
|
export declare function isInsideRoot(root: string, target: string): boolean;
|
|
7
|
+
/** The session fields the root set is derived from — structural on purpose, so this stays a leaf
|
|
8
|
+
* module (routes.ts hands it the wire-shape `SessionView.session`; tests hand it a literal). */
|
|
9
|
+
export interface RootSourceSession {
|
|
10
|
+
workdir?: string | null;
|
|
11
|
+
extra_write_roots?: string[] | null;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The ONE root set a caller-supplied path is contained against (DES-FEEDBACK-002 CREW-1):
|
|
15
|
+
* the run's workdir + its `extra_write_roots` (when a run is in play) + every registered repo
|
|
16
|
+
* root. Extracted from the `POST /open` handler so `/open`, `GET /runs/:id/files`, and
|
|
17
|
+
* `GET /runs/:id/diff` cannot drift — three copies of a containment root set is how one of
|
|
18
|
+
* them quietly widens.
|
|
19
|
+
*/
|
|
20
|
+
export declare function allowedRootsFor(session: RootSourceSession | undefined, repos: ReadonlyArray<{
|
|
21
|
+
root_path: string;
|
|
22
|
+
}>): string[];
|
|
7
23
|
/** The platform's opener invocation. Exported for tests; args are always a real argv array. */
|
|
8
24
|
export declare function platformOpenCommand(target: string): {
|
|
9
25
|
cmd: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open-path.d.ts","sourceRoot":"","sources":["../../src/api/open-path.ts"],"names":[],"mappings":"AAYA;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CA2BlE;AAED,+FAA+F;AAC/F,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAWnF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUnE"}
|
|
1
|
+
{"version":3,"file":"open-path.d.ts","sourceRoot":"","sources":["../../src/api/open-path.ts"],"names":[],"mappings":"AAYA;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CA2BlE;AAED;iGACiG;AACjG,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CACrC;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,iBAAiB,GAAG,SAAS,EACtC,KAAK,EAAE,aAAa,CAAC;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,GAC1C,MAAM,EAAE,CAWV;AAED,+FAA+F;AAC/F,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAWnF;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUnE"}
|
package/dist/api/open-path.js
CHANGED
|
@@ -47,6 +47,28 @@ export function isInsideRoot(root, target) {
|
|
|
47
47
|
return false; // different drive/tree entirely (win32)
|
|
48
48
|
return rel.split(sep)[0] !== '..';
|
|
49
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* The ONE root set a caller-supplied path is contained against (DES-FEEDBACK-002 CREW-1):
|
|
52
|
+
* the run's workdir + its `extra_write_roots` (when a run is in play) + every registered repo
|
|
53
|
+
* root. Extracted from the `POST /open` handler so `/open`, `GET /runs/:id/files`, and
|
|
54
|
+
* `GET /runs/:id/diff` cannot drift — three copies of a containment root set is how one of
|
|
55
|
+
* them quietly widens.
|
|
56
|
+
*/
|
|
57
|
+
export function allowedRootsFor(session, repos) {
|
|
58
|
+
const roots = [];
|
|
59
|
+
if (session !== undefined) {
|
|
60
|
+
const workdir = session.workdir;
|
|
61
|
+
if (typeof workdir === 'string' && workdir.length > 0)
|
|
62
|
+
roots.push(workdir);
|
|
63
|
+
for (const r of session.extra_write_roots ?? []) {
|
|
64
|
+
if (typeof r === 'string' && r.length > 0)
|
|
65
|
+
roots.push(r);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
for (const repo of repos)
|
|
69
|
+
roots.push(repo.root_path);
|
|
70
|
+
return roots;
|
|
71
|
+
}
|
|
50
72
|
/** The platform's opener invocation. Exported for tests; args are always a real argv array. */
|
|
51
73
|
export function platformOpenCommand(target) {
|
|
52
74
|
switch (process.platform) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open-path.js","sourceRoot":"","sources":["../../src/api/open-path.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"open-path.js","sourceRoot":"","sources":["../../src/api/open-path.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The run→retry-lineage index (DES-UX-001 §8.3, CREW-UX-3).
|
|
3
|
+
*
|
|
4
|
+
* The engine's `LaunchOptions` carries no lineage field (checked, wicked-core-ts 0.6.x), so —
|
|
5
|
+
* exactly like the actor trail (task #88) — WHICH run a launch retries is knowledge only the
|
|
6
|
+
* daemon's HTTP layer ever holds. The durable record is the `run.launched` audit entry whose
|
|
7
|
+
* `detail.retryOf` the launch route writes; this map is the read-side latency layer that lets
|
|
8
|
+
* `GET /runs` / `GET /runs/:id` echo `AgentSession.retry_of` without a trail scan per request.
|
|
9
|
+
*
|
|
10
|
+
* Mirrors `MembershipIndex`'s posture: hydrated once at server start (from the audit trail,
|
|
11
|
+
* best-effort — a missing/unreadable trail leaves lineage blank for PRIOR runs, which is the
|
|
12
|
+
* pre-CREW-UX-3 behavior, not an error) and updated at the same post-commit point that writes
|
|
13
|
+
* the audit entry, so the map can only lag by a failed hydrate, never diverge silently.
|
|
14
|
+
*/
|
|
15
|
+
import type { AuditLog } from './audit.js';
|
|
16
|
+
export declare class RetryIndex {
|
|
17
|
+
private readonly runToRetryOf;
|
|
18
|
+
/**
|
|
19
|
+
* Load lineage from EVERY `run.launched` entry in the trail — exhaustively, not capped
|
|
20
|
+
* (BRIEF-UX-002 C5: a lineage fact 2,678 launches deep must survive a restart; the newest-1000
|
|
21
|
+
* cap silently dropped it and the chronicle rendered the chain as peer episodes). Still
|
|
22
|
+
* best-effort: a missing/unreadable trail leaves lineage blank, the pre-CREW-UX-3 answer.
|
|
23
|
+
* Cost: one full-file scan at boot — `read` already parses the whole file anyway.
|
|
24
|
+
*/
|
|
25
|
+
hydrate(audit: AuditLog, log?: (msg: string) => void): Promise<void>;
|
|
26
|
+
set(runId: string, retryOf: string): void;
|
|
27
|
+
/** The run id this run retries, or `undefined` (the DTO spells that as an ABSENT field). */
|
|
28
|
+
retryOfFor(runId: string): string | undefined;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=retry-index.d.ts.map
|
|
@@ -0,0 +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;AAE3C,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;IAE1D;;;;;;OAMG;IACG,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB1E,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAIzC,4FAA4F;IAC5F,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAG9C"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The run→retry-lineage index (DES-UX-001 §8.3, CREW-UX-3).
|
|
3
|
+
*
|
|
4
|
+
* The engine's `LaunchOptions` carries no lineage field (checked, wicked-core-ts 0.6.x), so —
|
|
5
|
+
* exactly like the actor trail (task #88) — WHICH run a launch retries is knowledge only the
|
|
6
|
+
* daemon's HTTP layer ever holds. The durable record is the `run.launched` audit entry whose
|
|
7
|
+
* `detail.retryOf` the launch route writes; this map is the read-side latency layer that lets
|
|
8
|
+
* `GET /runs` / `GET /runs/:id` echo `AgentSession.retry_of` without a trail scan per request.
|
|
9
|
+
*
|
|
10
|
+
* Mirrors `MembershipIndex`'s posture: hydrated once at server start (from the audit trail,
|
|
11
|
+
* best-effort — a missing/unreadable trail leaves lineage blank for PRIOR runs, which is the
|
|
12
|
+
* pre-CREW-UX-3 behavior, not an error) and updated at the same post-commit point that writes
|
|
13
|
+
* the audit entry, so the map can only lag by a failed hydrate, never diverge silently.
|
|
14
|
+
*/
|
|
15
|
+
export class RetryIndex {
|
|
16
|
+
runToRetryOf = new Map();
|
|
17
|
+
/**
|
|
18
|
+
* Load lineage from EVERY `run.launched` entry in the trail — exhaustively, not capped
|
|
19
|
+
* (BRIEF-UX-002 C5: a lineage fact 2,678 launches deep must survive a restart; the newest-1000
|
|
20
|
+
* cap silently dropped it and the chronicle rendered the chain as peer episodes). Still
|
|
21
|
+
* best-effort: a missing/unreadable trail leaves lineage blank, the pre-CREW-UX-3 answer.
|
|
22
|
+
* Cost: one full-file scan at boot — `read` already parses the whole file anyway.
|
|
23
|
+
*/
|
|
24
|
+
async hydrate(audit, log) {
|
|
25
|
+
try {
|
|
26
|
+
for (const entry of await audit.readAll({ action: 'run.launched' })) {
|
|
27
|
+
const retryOf = entry.detail?.['retryOf'];
|
|
28
|
+
if (typeof entry.runId === 'string' && typeof retryOf === 'string') {
|
|
29
|
+
this.runToRetryOf.set(entry.runId, retryOf);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
log?.(`[runs] retry-index hydrate failed (prior runs read as not-a-retry until restart): ${err instanceof Error ? err.message : String(err)}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
set(runId, retryOf) {
|
|
38
|
+
this.runToRetryOf.set(runId, retryOf);
|
|
39
|
+
}
|
|
40
|
+
/** The run id this run retries, or `undefined` (the DTO spells that as an ABSENT field). */
|
|
41
|
+
retryOfFor(runId) {
|
|
42
|
+
return this.runToRetryOf.get(runId);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=retry-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-index.js","sourceRoot":"","sources":["../../src/api/retry-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,MAAM,OAAO,UAAU;IACJ,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE1D;;;;;;OAMG;IACH,KAAK,CAAC,OAAO,CAAC,KAAe,EAAE,GAA2B;QACxD,IAAI,CAAC;YACH,KAAK,MAAM,KAAK,IAAI,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;gBACpE,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC;gBAC1C,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;oBACnE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBAC9C,CAAC;YACH,CAAC;QACH,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
|
@@ -8,6 +8,8 @@ import { SeatHealthTracker } from './seat-health.js';
|
|
|
8
8
|
import { type ProjectRoutesDeps } from '../projects/routes.js';
|
|
9
9
|
import { InteractiveBridgePool } from '../interactive/bridge-pool.js';
|
|
10
10
|
import { AuditLog } from './audit.js';
|
|
11
|
+
import { RetryIndex } from './retry-index.js';
|
|
12
|
+
import { GuidanceIndex } from './guidance-index.js';
|
|
11
13
|
import { type AuthMode } from './auth.js';
|
|
12
14
|
export { API_PREFIX } from './api-prefix.js';
|
|
13
15
|
/**
|
|
@@ -23,7 +25,7 @@ export { API_PREFIX } from './api-prefix.js';
|
|
|
23
25
|
* schema does not accept — so `.strict()` is what turns that trip into a 400 instead of an
|
|
24
26
|
* unworkflowed run reported as `201`.
|
|
25
27
|
*/
|
|
26
|
-
export declare const LaunchSchema: z.ZodObject<{
|
|
28
|
+
export declare const LaunchSchema: z.ZodEffects<z.ZodObject<{
|
|
27
29
|
problem: z.ZodString;
|
|
28
30
|
sessionId: z.ZodOptional<z.ZodString>;
|
|
29
31
|
clisJson: z.ZodOptional<z.ZodString>;
|
|
@@ -34,8 +36,18 @@ export declare const LaunchSchema: z.ZodObject<{
|
|
|
34
36
|
/** DES-PROJECT-001 §2.2 — file the run into a project; membership attaches atomically with
|
|
35
37
|
* the launch record. Unknown/archived ⇒ the launch fails (never a silent unfiled run). */
|
|
36
38
|
projectId: z.ZodOptional<z.ZodString>;
|
|
39
|
+
/** crew#293 — `"pr"` appends the hardened deliver Tool phase (push run branch + `gh pr create`)
|
|
40
|
+
* to a PER-RUN copy of the selected workflow. Requires `workflow` (enforced by the refine
|
|
41
|
+
* below, so the 400 happens at parse time, not after the adapter is consulted). */
|
|
42
|
+
deliver: z.ZodOptional<z.ZodLiteral<"pr">>;
|
|
43
|
+
/** DES-UX-001 §8.3 (CREW-UX-3) — the run this launch retries. Must name an EXISTING run id
|
|
44
|
+
* (the route checks the store and 400s with a named error otherwise); persisted via the
|
|
45
|
+
* `run.launched` audit entry + retry index and echoed as `AgentSession.retry_of`. */
|
|
46
|
+
retryOf: z.ZodOptional<z.ZodString>;
|
|
37
47
|
}, "strict", z.ZodTypeAny, {
|
|
38
48
|
problem: string;
|
|
49
|
+
retryOf?: string | undefined;
|
|
50
|
+
deliver?: "pr" | undefined;
|
|
39
51
|
projectId?: string | undefined;
|
|
40
52
|
sessionId?: string | undefined;
|
|
41
53
|
clisJson?: string | undefined;
|
|
@@ -45,6 +57,30 @@ export declare const LaunchSchema: z.ZodObject<{
|
|
|
45
57
|
workflow?: string | undefined;
|
|
46
58
|
}, {
|
|
47
59
|
problem: string;
|
|
60
|
+
retryOf?: string | undefined;
|
|
61
|
+
deliver?: "pr" | undefined;
|
|
62
|
+
projectId?: string | undefined;
|
|
63
|
+
sessionId?: string | undefined;
|
|
64
|
+
clisJson?: string | undefined;
|
|
65
|
+
entityMode?: "shared" | "isolated" | undefined;
|
|
66
|
+
humanConfirm?: string | undefined;
|
|
67
|
+
repoRef?: string | undefined;
|
|
68
|
+
workflow?: string | undefined;
|
|
69
|
+
}>, {
|
|
70
|
+
problem: string;
|
|
71
|
+
retryOf?: string | undefined;
|
|
72
|
+
deliver?: "pr" | undefined;
|
|
73
|
+
projectId?: string | undefined;
|
|
74
|
+
sessionId?: string | undefined;
|
|
75
|
+
clisJson?: string | undefined;
|
|
76
|
+
entityMode?: "shared" | "isolated" | undefined;
|
|
77
|
+
humanConfirm?: string | undefined;
|
|
78
|
+
repoRef?: string | undefined;
|
|
79
|
+
workflow?: string | undefined;
|
|
80
|
+
}, {
|
|
81
|
+
problem: string;
|
|
82
|
+
retryOf?: string | undefined;
|
|
83
|
+
deliver?: "pr" | undefined;
|
|
48
84
|
projectId?: string | undefined;
|
|
49
85
|
sessionId?: string | undefined;
|
|
50
86
|
clisJson?: string | undefined;
|
|
@@ -63,6 +99,16 @@ export declare const GateSchema: z.ZodObject<{
|
|
|
63
99
|
approve: boolean;
|
|
64
100
|
amend?: string | undefined;
|
|
65
101
|
}>;
|
|
102
|
+
/** `PUT /runs/:id/guidance` (DES-UX-002 §7.2, CREW-UX-7) — the durable pre-gate note body.
|
|
103
|
+
* The empty string is a legal body: it CLEARS the note. The byte cap is checked in the route
|
|
104
|
+
* (not zod's char-counting `max`) so the 400 names the actual limit. */
|
|
105
|
+
export declare const GuidanceSchema: z.ZodObject<{
|
|
106
|
+
text: z.ZodString;
|
|
107
|
+
}, "strict", z.ZodTypeAny, {
|
|
108
|
+
text: string;
|
|
109
|
+
}, {
|
|
110
|
+
text: string;
|
|
111
|
+
}>;
|
|
66
112
|
export declare const OpenTerminalSchema: z.ZodObject<{
|
|
67
113
|
cwd: z.ZodString;
|
|
68
114
|
cmd: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
@@ -105,6 +151,12 @@ export interface SecurityDeps {
|
|
|
105
151
|
*/
|
|
106
152
|
export interface RuntimeDeps {
|
|
107
153
|
seatHealth?: SeatHealthTracker;
|
|
154
|
+
/** Run→retry-lineage index (CREW-UX-3) — `createServer` hydrates one from the audit trail so
|
|
155
|
+
* a restarted daemon still echoes `retry_of`; a directly-driven route set gets a fresh one. */
|
|
156
|
+
retryIndex?: RetryIndex;
|
|
157
|
+
/** Run→operator-guidance index (CREW-UX-7) — `createServer` hydrates one from the audit trail
|
|
158
|
+
* so a restarted daemon still echoes `guidance`; a directly-driven route set gets a fresh one. */
|
|
159
|
+
guidanceIndex?: GuidanceIndex;
|
|
108
160
|
openWithOs?: (target: string) => Promise<void>;
|
|
109
161
|
/** Seat sign-in presence probe (seat sign-in) — injectable so route tests never read the
|
|
110
162
|
* 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,
|
|
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,EAAwB,WAAW,EAAkD,MAAM,oBAAoB,CAAC;AAEvH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAMnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAWrD,OAAO,EAAyB,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAEtF,OAAO,EAAe,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAInF,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGvD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAyF7C;;;;;;;;;;;;GAYG;AAIH,eAAO,MAAM,YAAY;;;;;;;;IAQvB;+FAC2F;;IAE3F;;wFAEoF;;IAEpF;;0FAEsF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKtF,CAAC;AAEH,eAAO,MAAM,UAAU;;;;;;;;;EAGZ,CAAC;AAEZ;;yEAEyE;AACzE,eAAO,MAAM,cAAc;;;;;;EAEhB,CAAC;AAUZ,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;EAQpB,CAAC;AAOZ,4FAA4F;AAC5F,eAAO,MAAM,cAAc;;;;;;;;;EAGhB,CAAC;AAwBZ,sEAAsE;AACtE,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,QAAQ,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B;oGACgG;IAChG,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB;uGACmG;IACnG,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C;2FACuF;IACvF,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,KAAK,OAAO,GAAG,IAAI,CAAC;IAC1E;;0DAEsD;IACtD,kBAAkB,CAAC,EAAE,qBAAqB,CAAC;CAC5C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,SAAS,EACpB,gBAAgB,EAAE,gBAAgB,EAIlC,YAAY,GAAE,WAA+B,EAG7C,QAAQ,GAAE,iBAAqF,EAK/F,QAAQ,GAAE,YAA0D,EAGpE,OAAO,GAAE,WAAgB,GACxB,IAAI,CAqtDN"}
|