wicked-crew 0.7.34 → 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 +29 -1
- package/dist/api/chat-scope.d.ts.map +1 -1
- package/dist/api/chat-scope.js +67 -12
- package/dist/api/chat-scope.js.map +1 -1
- package/dist/api/chat-transcripts.d.ts +60 -0
- package/dist/api/chat-transcripts.d.ts.map +1 -0
- package/dist/api/chat-transcripts.js +139 -0
- package/dist/api/chat-transcripts.js.map +1 -0
- package/dist/api/chat-turns.d.ts +43 -4
- package/dist/api/chat-turns.d.ts.map +1 -1
- package/dist/api/chat-turns.js +73 -6
- package/dist/api/chat-turns.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/requirements.d.ts +3 -5
- package/dist/api/requirements.d.ts.map +1 -1
- package/dist/api/requirements.js +30 -146
- package/dist/api/requirements.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 +142 -10
- package/dist/api/routes.d.ts.map +1 -1
- package/dist/api/routes.js +292 -44
- 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 +114 -12
- package/dist/api/server.js.map +1 -1
- package/dist/api/skills.d.ts +2 -2
- package/dist/api/skills.d.ts.map +1 -1
- package/dist/api/skills.js +5 -2
- package/dist/api/skills.js.map +1 -1
- 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 +137 -23
- 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 +68 -2
- package/dist/core/adapter.d.ts.map +1 -1
- package/dist/core/adapter.js +176 -23
- 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 +30 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +6 -4
- package/dist/core/types.js.map +1 -1
- package/dist/core/versions.d.ts +17 -0
- package/dist/core/versions.d.ts.map +1 -0
- package/dist/core/versions.js +35 -0
- package/dist/core/versions.js.map +1 -0
- package/dist/interactive/bridge-pool.d.ts +66 -14
- package/dist/interactive/bridge-pool.d.ts.map +1 -1
- package/dist/interactive/bridge-pool.js +130 -17
- package/dist/interactive/bridge-pool.js.map +1 -1
- package/dist/interactive/bridge-root.d.ts +47 -16
- package/dist/interactive/bridge-root.d.ts.map +1 -1
- package/dist/interactive/bridge-root.js +102 -31
- package/dist/interactive/bridge-root.js.map +1 -1
- package/dist/interactive/doc-delete-routes.d.ts +3 -1
- package/dist/interactive/doc-delete-routes.d.ts.map +1 -1
- package/dist/interactive/doc-delete-routes.js.map +1 -1
- package/dist/interactive/doc-list-routes.d.ts +3 -1
- package/dist/interactive/doc-list-routes.d.ts.map +1 -1
- package/dist/interactive/doc-list-routes.js.map +1 -1
- package/dist/interactive/docs-index.d.ts +3 -1
- package/dist/interactive/docs-index.d.ts.map +1 -1
- package/dist/interactive/docs-index.js +1 -1
- package/dist/interactive/docs-index.js.map +1 -1
- package/dist/interactive/project-root.d.ts +8 -2
- package/dist/interactive/project-root.d.ts.map +1 -1
- package/dist/interactive/project-root.js +1 -1
- package/dist/interactive/project-root.js.map +1 -1
- package/dist/interactive/proxy-routes.d.ts +3 -1
- package/dist/interactive/proxy-routes.d.ts.map +1 -1
- package/dist/interactive/proxy-routes.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/projects/state-home-preflight.d.ts +30 -7
- package/dist/projects/state-home-preflight.d.ts.map +1 -1
- package/dist/projects/state-home-preflight.js +59 -16
- package/dist/projects/state-home-preflight.js.map +1 -1
- package/dist/projects/state-home-registry.d.ts.map +1 -1
- package/dist/projects/state-home-registry.js +2 -0
- package/dist/projects/state-home-registry.js.map +1 -1
- package/dist/qe/acceptance.d.ts +9 -0
- package/dist/qe/acceptance.d.ts.map +1 -1
- package/dist/qe/acceptance.js +16 -1
- package/dist/qe/acceptance.js.map +1 -1
- package/dist/qe/author-workflow.d.ts.map +1 -1
- package/dist/qe/author-workflow.js +2 -1
- package/dist/qe/author-workflow.js.map +1 -1
- package/dist/skills/base-skill.d.ts +32 -10
- package/dist/skills/base-skill.d.ts.map +1 -1
- package/dist/skills/base-skill.js +36 -27
- package/dist/skills/base-skill.js.map +1 -1
- package/dist/skills/guards.d.ts.map +1 -1
- package/dist/skills/guards.js +3 -0
- package/dist/skills/guards.js.map +1 -1
- package/dist/skills/runtime.d.ts +9 -5
- package/dist/skills/runtime.d.ts.map +1 -1
- package/dist/skills/runtime.js +11 -7
- package/dist/skills/runtime.js.map +1 -1
- package/dist/skills/store.d.ts +30 -0
- package/dist/skills/store.d.ts.map +1 -1
- package/dist/skills/store.js +159 -3
- package/dist/skills/store.js.map +1 -1
- package/dist/skills/tree.d.ts +12 -0
- package/dist/skills/tree.d.ts.map +1 -1
- package/dist/skills/tree.js +26 -0
- package/dist/skills/tree.js.map +1 -1
- package/dist/studio/assets/index-Dk98qXKv.js +546 -0
- package/dist/studio/index.html +1 -1
- package/dist/studio/testid-inventory.json +89 -5
- package/endpoint-manifest.json +13 -1
- package/package.json +4 -4
- package/dist/studio/assets/index-DhojBZ1T.js +0 -544
package/dist/api/chat-turns.js
CHANGED
|
@@ -21,13 +21,43 @@
|
|
|
21
21
|
* delta/reply under the message it answers instead of the newest bubble.
|
|
22
22
|
*
|
|
23
23
|
* A turn whose frames were lost (an engine restart, a seat reaped without a frame) must never wedge
|
|
24
|
-
* the chat: a turn older than `staleAfterMs` (default
|
|
25
|
-
*
|
|
24
|
+
* the chat: a turn older than `staleAfterMs` (default three engine turn budgets — `3 ×
|
|
25
|
+
* WICKED_CHAT_TURN_SECS`, 30 min at the engine's 600 s default; DES-L5 R16) is treated as ended by
|
|
26
|
+
* every read, and reported in the 409's `stale` reason when it is what let a send pass.
|
|
27
|
+
*
|
|
28
|
+
* DES-L5 (F-E2E-041): `begin` runs BEFORE the engine call, in the same tick as `inFlight`, so two
|
|
29
|
+
* racing sends cannot both pass the predicate and early `chatDelta`s are stamped; `reconcile` then
|
|
30
|
+
* squares the reserved audience with the seats the engine actually reached, and `abort` retracts a
|
|
31
|
+
* turn whose send the engine refused.
|
|
26
32
|
*/
|
|
27
33
|
import { randomUUID } from 'node:crypto';
|
|
28
34
|
export const CHAT_TURN_EXCERPT_CHARS = 120;
|
|
29
|
-
/**
|
|
30
|
-
|
|
35
|
+
/**
|
|
36
|
+
* The engine's per-turn chat budget default (wicked-core `chat_timeout`, DES-L5 R16 — 600 s, a
|
|
37
|
+
* hypothesis re-derived in the P6 re-run). The constant MIRRORS core's; the variable is the same
|
|
38
|
+
* one core-ts reads in this process, so the two agree on any deployment that sets it, and a drift
|
|
39
|
+
* of the default is a text bug in whichever side moved.
|
|
40
|
+
*/
|
|
41
|
+
export const CHAT_TURN_BUDGET_SECS_DEFAULT = 600;
|
|
42
|
+
/** How many engine turn budgets a turn may outlive with no closing frame before it reads as lost. */
|
|
43
|
+
export const CHAT_TURN_STALE_BUDGETS = 3;
|
|
44
|
+
/** The per-turn chat budget in seconds: `WICKED_CHAT_TURN_SECS` (a positive integer), else 600. */
|
|
45
|
+
export function chatTurnBudgetSecs(env = process.env) {
|
|
46
|
+
const raw = env['WICKED_CHAT_TURN_SECS'];
|
|
47
|
+
const n = raw === undefined ? Number.NaN : Number.parseInt(raw, 10);
|
|
48
|
+
return Number.isSafeInteger(n) && n > 0 ? n : CHAT_TURN_BUDGET_SECS_DEFAULT;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Three engine turn budgets, derived from the SAME variable the engine reads: a turn this old with
|
|
52
|
+
* no closing frame is lost, not live. Consequence (accepted, DES-L5 R16): a turn whose frames were
|
|
53
|
+
* lost wedges its seat for 30 min at the default (was 15) before `inFlight` treats it as ended —
|
|
54
|
+
* lost frames are an engine-restart class, and a restart empties the pool anyway.
|
|
55
|
+
*/
|
|
56
|
+
export function chatTurnStaleAfterMs(env = process.env) {
|
|
57
|
+
return CHAT_TURN_STALE_BUDGETS * chatTurnBudgetSecs(env) * 1000;
|
|
58
|
+
}
|
|
59
|
+
/** The stale ceiling at module load, from the daemon's environment (kept for readers of the constant). */
|
|
60
|
+
export const CHAT_TURN_STALE_AFTER_MS = chatTurnStaleAfterMs();
|
|
31
61
|
/** The frame kinds that carry a seat's progress on a turn (`chat` + `cliKey` fields). */
|
|
32
62
|
const SEAT_PROGRESS_FRAMES = new Set(['chatDelta', 'chatReply', 'chatSessionFailed']);
|
|
33
63
|
/** The frame kinds that END a seat's part of its turn. */
|
|
@@ -43,7 +73,7 @@ export class ChatTurnIndex {
|
|
|
43
73
|
staleAfterMs;
|
|
44
74
|
constructor(opts = {}) {
|
|
45
75
|
this.now = opts.now ?? Date.now;
|
|
46
|
-
this.staleAfterMs = opts.staleAfterMs ??
|
|
76
|
+
this.staleAfterMs = opts.staleAfterMs ?? chatTurnStaleAfterMs();
|
|
47
77
|
}
|
|
48
78
|
/** Drop turns whose frames were lost (see the module doc); returns the survivors. */
|
|
49
79
|
live(chatId) {
|
|
@@ -79,7 +109,12 @@ export class ChatTurnIndex {
|
|
|
79
109
|
}
|
|
80
110
|
return null;
|
|
81
111
|
}
|
|
82
|
-
/**
|
|
112
|
+
/**
|
|
113
|
+
* Open a turn for the seats a send is ABOUT to reach (the audience `inFlight` was asked about —
|
|
114
|
+
* DES-L5: called before the engine call, so the window between the predicate and the record is
|
|
115
|
+
* closed and early frames are stamped); `reconcile` squares it with the engine's answer. An empty
|
|
116
|
+
* seat list opens nothing (nothing to wait for).
|
|
117
|
+
*/
|
|
83
118
|
begin(chatId, seats, text) {
|
|
84
119
|
const unique = [...new Set(seats)];
|
|
85
120
|
if (unique.length === 0)
|
|
@@ -97,6 +132,38 @@ export class ChatTurnIndex {
|
|
|
97
132
|
this.turns.set(chatId, list);
|
|
98
133
|
return turn;
|
|
99
134
|
}
|
|
135
|
+
/**
|
|
136
|
+
* The engine's answer to the send `begin` reserved `turnId` for: `seats` become what the engine
|
|
137
|
+
* reached; `pending` keeps the reserved seats the engine confirmed and still answering, plus any
|
|
138
|
+
* seat the engine added that was never reserved — a reserved seat the engine did NOT reach is
|
|
139
|
+
* dropped (nothing will ever answer for it). An empty answer ends the turn. Returns the turn, or
|
|
140
|
+
* `null` when it is no longer live.
|
|
141
|
+
*/
|
|
142
|
+
reconcile(chatId, turnId, engineSeats) {
|
|
143
|
+
const turn = this.live(chatId).find((t) => t.turnId === turnId);
|
|
144
|
+
if (turn === undefined)
|
|
145
|
+
return null;
|
|
146
|
+
const reached = [...new Set(engineSeats)];
|
|
147
|
+
const reserved = turn.seats;
|
|
148
|
+
turn.pending = [
|
|
149
|
+
...turn.pending.filter((s) => reached.includes(s)),
|
|
150
|
+
...reached.filter((s) => !reserved.includes(s)),
|
|
151
|
+
];
|
|
152
|
+
turn.seats = reached;
|
|
153
|
+
this.live(chatId); // prunes an emptied turn
|
|
154
|
+
return turn.pending.length > 0 ? turn : null;
|
|
155
|
+
}
|
|
156
|
+
/** The engine REFUSED the send `begin` reserved `turnId` for: nothing is answering — retract it. */
|
|
157
|
+
abort(chatId, turnId) {
|
|
158
|
+
const list = this.turns.get(chatId);
|
|
159
|
+
if (list === undefined)
|
|
160
|
+
return;
|
|
161
|
+
const kept = list.filter((t) => t.turnId !== turnId);
|
|
162
|
+
if (kept.length === 0)
|
|
163
|
+
this.turns.delete(chatId);
|
|
164
|
+
else
|
|
165
|
+
this.turns.set(chatId, kept);
|
|
166
|
+
}
|
|
100
167
|
/** The live turn a seat of a chat is answering, if any. */
|
|
101
168
|
turnOf(chatId, cliKey) {
|
|
102
169
|
return this.live(chatId).find((t) => t.pending.includes(cliKey));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-turns.js","sourceRoot":"","sources":["../../src/api/chat-turns.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"chat-turns.js","sourceRoot":"","sources":["../../src/api/chat-turns.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,10 +33,12 @@
|
|
|
33
33
|
* untouched (miss ⇒ the honest stat-only degrade) and the run re-derives on a short backoff,
|
|
34
34
|
* so a raced terminal-frame warm heals in seconds even where the sweep is off.
|
|
35
35
|
*/
|
|
36
|
-
import type {
|
|
36
|
+
import type { SessionView } from '../core/types.js';
|
|
37
37
|
import { type DeliveryState, type VacuityProbes } from './delivery-index.js';
|
|
38
|
-
/**
|
|
39
|
-
|
|
38
|
+
/** What the cache classifies (crew#481): the whole run view — the deliver unit and the def
|
|
39
|
+
* (`workflow_id` → `resolveRunWorkflow`) are two of `runCanDeliver`'s inputs, so candidacy needs
|
|
40
|
+
* the view, not the session facts alone. */
|
|
41
|
+
export type CacheView = SessionView;
|
|
40
42
|
/** One tick = the trust window the per-probe memo already grants, so moving derivation off the
|
|
41
43
|
* request path changes WHO pays, never how stale a label may read. */
|
|
42
44
|
export declare const DELIVERY_SWEEP_INTERVAL_MS = 30000;
|
|
@@ -60,6 +62,12 @@ export interface DeliveryDerivationCacheDeps {
|
|
|
60
62
|
/** A run the `DeliveryIndex` already answers needs no derivation — the read path
|
|
61
63
|
* short-circuits on the recorded URL before it ever consults this cache. */
|
|
62
64
|
isDelivered: (runId: string) => boolean;
|
|
65
|
+
/** Def-awareness (crew#481 / D-14): `runCanDeliver(view, resolveRunWorkflow(view, workflows))` in
|
|
66
|
+
* the daemon — a completed run whose def has no deliver unit and no code-work phase is NOT a
|
|
67
|
+
* candidate (never derived, never cached; `read` answers `'none'` from the same predicate the
|
|
68
|
+
* campaigns rollup and the resume 409 apply). Absent ⇒ every completed repo-scoped run is a
|
|
69
|
+
* candidate — today's behaviour, for directly-driven route sets whose adapter has no registry. */
|
|
70
|
+
canDeliver?: (view: CacheView) => boolean;
|
|
63
71
|
/** Retry-backoff floor after a failed derivation (tests shorten it). */
|
|
64
72
|
retryBaseMs?: number;
|
|
65
73
|
log?: (msg: string) => void;
|
|
@@ -90,6 +98,14 @@ export declare class DeliveryDerivationCache {
|
|
|
90
98
|
* NEW retry timer after the stop already swept the set (Copilot on #435). */
|
|
91
99
|
private stopped;
|
|
92
100
|
constructor(deps: DeliveryDerivationCacheDeps);
|
|
101
|
+
/** The def-awareness answer for one view — `true` when no `canDeliver` dep is wired (today). */
|
|
102
|
+
private canDeliver;
|
|
103
|
+
/** Only a COMPLETED repo-scoped run THAT COULD HAVE DELIVERED has a full derivation that can
|
|
104
|
+
* differ from the stat-only tri-state (`deliveryStateWithVacuity` answers `deliveryStateOf`
|
|
105
|
+
* verbatim, git-free, for every other shape) — so only these runs are ever derived or cached.
|
|
106
|
+
* The third clause is crew#481: a completed `capture-learnings`/`onboarding` run is `'none'` by
|
|
107
|
+
* definition, so it is neither probed nor cached. */
|
|
108
|
+
private isCandidate;
|
|
93
109
|
/**
|
|
94
110
|
* The request path. Synchronous by design — a cache hit answers the background-derived state;
|
|
95
111
|
* a miss answers the stat-only tri-state (one `existsSync`, no git) and does NOT enqueue a
|
|
@@ -97,9 +113,11 @@ export declare class DeliveryDerivationCache {
|
|
|
97
113
|
* never fan a poll out into subprocess spawns, however cold the cache.
|
|
98
114
|
*
|
|
99
115
|
* Non-candidate shapes skip the cache entirely: their stat answer IS the full derivation, and
|
|
100
|
-
* skipping keeps a (theoretical) stale entry from ever outliving its run's candidacy.
|
|
116
|
+
* skipping keeps a (theoretical) stale entry from ever outliving its run's candidacy. The
|
|
117
|
+
* def-awareness rides the same `canDeliver` the candidacy read (crew#481): a completed run whose
|
|
118
|
+
* def could never have delivered answers `'none'` here, cold or warm.
|
|
101
119
|
*/
|
|
102
|
-
read(
|
|
120
|
+
read(view: CacheView): DeliveryState;
|
|
103
121
|
/**
|
|
104
122
|
* The terminal-frame warm: derive this run once, now, so a just-finished run's label heals in
|
|
105
123
|
* probe-time instead of waiting for the next tick. Fired from the daemon's CoreEvent
|
|
@@ -131,5 +149,4 @@ export declare class DeliveryDerivationCache {
|
|
|
131
149
|
private acquire;
|
|
132
150
|
private release;
|
|
133
151
|
}
|
|
134
|
-
export {};
|
|
135
152
|
//# sourceMappingURL=delivery-cache.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery-cache.d.ts","sourceRoot":"","sources":["../../src/api/delivery-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"delivery-cache.d.ts","sourceRoot":"","sources":["../../src/api/delivery-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAE7B;;6CAE6C;AAC7C,MAAM,MAAM,SAAS,GAAG,WAAW,CAAC;AAEpC;uEACuE;AACvE,eAAO,MAAM,0BAA0B,QAAwB,CAAC;AAEhE;;qFAEqF;AACrF,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C;;;;sCAIsC;AACtC,eAAO,MAAM,wBAAwB,OAAQ,CAAC;AAE9C,MAAM,WAAW,2BAA2B;IAC1C,8EAA8E;IAC9E,SAAS,EAAE,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IACxC;;uFAEmF;IACnF,MAAM,EAAE,aAAa,CAAC;IACtB;iFAC6E;IAC7E,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IACxC;;;;uGAImG;IACnG,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,CAAC;IAC1C,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B;iGAC6F;IAC7F,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED,qBAAa,uBAAuB;IAsBtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IArBjC;6FACyF;IACzF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D;gGAC4F;IAC5F,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoC;IAC7D;8FAC0F;IAC1F,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAA+C;IAC5D,oFAAoF;IACpF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6B;IAC1D;mEAC+D;IAC/D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4C;IACxE;kFAC8E;IAC9E,OAAO,CAAC,OAAO,CAAS;gBAEK,IAAI,EAAE,2BAA2B;IAE9D,gGAAgG;IAChG,OAAO,CAAC,UAAU;IAIlB;;;;0DAIsD;IACtD,OAAO,CAAC,WAAW;IAInB;;;;;;;;;;OAUG;IACH,IAAI,CAAC,IAAI,EAAE,SAAS,GAAG,aAAa;IASpC;;;;;OAKG;IACG,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBxC;;;;;OAKG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB5B;iFAC6E;IAC7E,KAAK,CAAC,UAAU,GAAE,MAAmC,GAAG,IAAI;IAU5D,IAAI,IAAI,IAAI;IAUZ;;;;;;;;iGAQ6F;IAC7F,OAAO,CAAC,QAAQ;YAqEF,OAAO;IAQrB,OAAO,CAAC,OAAO;CAKhB"}
|
|
@@ -47,12 +47,6 @@ export const MAX_CONCURRENT_DERIVATIONS = 3;
|
|
|
47
47
|
* is EXPECTED — the retry is what heals it in seconds even where no sweep ticks (test-built
|
|
48
48
|
* daemons keep the interval off). */
|
|
49
49
|
export const DERIVATION_RETRY_BASE_MS = 1_000;
|
|
50
|
-
/** Only a COMPLETED repo-scoped run's full derivation can differ from the stat-only tri-state
|
|
51
|
-
* (`deliveryStateWithVacuity` answers `deliveryStateOf` verbatim, git-free, for every other
|
|
52
|
-
* shape) — so only these runs are ever derived or cached. */
|
|
53
|
-
function isCandidate(session) {
|
|
54
|
-
return session.status === 'completed' && session.repo_ref != null;
|
|
55
|
-
}
|
|
56
50
|
export class DeliveryDerivationCache {
|
|
57
51
|
deps;
|
|
58
52
|
/** runId → the last full derivation. Entries exist only for candidate runs; the sweep prunes
|
|
@@ -78,6 +72,18 @@ export class DeliveryDerivationCache {
|
|
|
78
72
|
constructor(deps) {
|
|
79
73
|
this.deps = deps;
|
|
80
74
|
}
|
|
75
|
+
/** The def-awareness answer for one view — `true` when no `canDeliver` dep is wired (today). */
|
|
76
|
+
canDeliver(view) {
|
|
77
|
+
return this.deps.canDeliver?.(view) ?? true;
|
|
78
|
+
}
|
|
79
|
+
/** Only a COMPLETED repo-scoped run THAT COULD HAVE DELIVERED has a full derivation that can
|
|
80
|
+
* differ from the stat-only tri-state (`deliveryStateWithVacuity` answers `deliveryStateOf`
|
|
81
|
+
* verbatim, git-free, for every other shape) — so only these runs are ever derived or cached.
|
|
82
|
+
* The third clause is crew#481: a completed `capture-learnings`/`onboarding` run is `'none'` by
|
|
83
|
+
* definition, so it is neither probed nor cached. */
|
|
84
|
+
isCandidate(view, canDeliver = this.canDeliver(view)) {
|
|
85
|
+
return view.session.status === 'completed' && view.session.repo_ref != null && canDeliver;
|
|
86
|
+
}
|
|
81
87
|
/**
|
|
82
88
|
* The request path. Synchronous by design — a cache hit answers the background-derived state;
|
|
83
89
|
* a miss answers the stat-only tri-state (one `existsSync`, no git) and does NOT enqueue a
|
|
@@ -85,15 +91,18 @@ export class DeliveryDerivationCache {
|
|
|
85
91
|
* never fan a poll out into subprocess spawns, however cold the cache.
|
|
86
92
|
*
|
|
87
93
|
* Non-candidate shapes skip the cache entirely: their stat answer IS the full derivation, and
|
|
88
|
-
* skipping keeps a (theoretical) stale entry from ever outliving its run's candidacy.
|
|
94
|
+
* skipping keeps a (theoretical) stale entry from ever outliving its run's candidacy. The
|
|
95
|
+
* def-awareness rides the same `canDeliver` the candidacy read (crew#481): a completed run whose
|
|
96
|
+
* def could never have delivered answers `'none'` here, cold or warm.
|
|
89
97
|
*/
|
|
90
|
-
read(
|
|
91
|
-
|
|
92
|
-
|
|
98
|
+
read(view) {
|
|
99
|
+
const canDeliver = this.canDeliver(view); // one registry read per request, passed through
|
|
100
|
+
if (this.isCandidate(view, canDeliver)) {
|
|
101
|
+
const hit = this.derived.get(view.session.id);
|
|
93
102
|
if (hit !== undefined)
|
|
94
103
|
return hit;
|
|
95
104
|
}
|
|
96
|
-
return deliveryStateOf(session, undefined, this.deps.probes.worktreeExists);
|
|
105
|
+
return deliveryStateOf(view.session, undefined, this.deps.probes.worktreeExists, canDeliver);
|
|
97
106
|
}
|
|
98
107
|
/**
|
|
99
108
|
* The terminal-frame warm: derive this run once, now, so a just-finished run's label heals in
|
|
@@ -107,9 +116,9 @@ export class DeliveryDerivationCache {
|
|
|
107
116
|
return;
|
|
108
117
|
const views = await this.deps.listViews();
|
|
109
118
|
const view = views.find((v) => v.session.id === runId);
|
|
110
|
-
if (view === undefined || !isCandidate(view
|
|
119
|
+
if (view === undefined || !this.isCandidate(view))
|
|
111
120
|
return;
|
|
112
|
-
await this.schedule(view
|
|
121
|
+
await this.schedule(view);
|
|
113
122
|
}
|
|
114
123
|
catch (err) {
|
|
115
124
|
this.deps.log?.(`[runs] delivery-derivation warm for ${runId} failed (label reads stat-only until the next sweep): ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -133,8 +142,8 @@ export class DeliveryDerivationCache {
|
|
|
133
142
|
this.derived.delete(id);
|
|
134
143
|
}
|
|
135
144
|
await Promise.all(views
|
|
136
|
-
.filter((v) => isCandidate(v
|
|
137
|
-
.map((v) => this.schedule(v
|
|
145
|
+
.filter((v) => this.isCandidate(v) && !this.deps.isDelivered(v.session.id))
|
|
146
|
+
.map((v) => this.schedule(v)));
|
|
138
147
|
}
|
|
139
148
|
catch (err) {
|
|
140
149
|
this.deps.log?.(`[runs] delivery-derivation sweep failed (labels degrade to the stat-only read until the next tick): ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -174,14 +183,15 @@ export class DeliveryDerivationCache {
|
|
|
174
183
|
* the entry is left untouched (a miss keeps the honest stat-only degrade; a previous honest
|
|
175
184
|
* verdict stands) and the run re-derives after a short backoff, doubling up to the sweep
|
|
176
185
|
* cadence — the in-flight guard folds overlapping schedules, so retries can never storm. */
|
|
177
|
-
schedule(
|
|
186
|
+
schedule(view) {
|
|
187
|
+
const { session } = view;
|
|
178
188
|
const pending = this.inFlight.get(session.id);
|
|
179
189
|
if (pending !== undefined)
|
|
180
190
|
return pending;
|
|
181
191
|
const job = (async () => {
|
|
182
192
|
await this.acquire();
|
|
183
193
|
try {
|
|
184
|
-
const state = await deliveryStateWithVacuity(session, undefined, this.deps.probes);
|
|
194
|
+
const state = await deliveryStateWithVacuity(session, undefined, this.deps.probes, this.canDeliver(view));
|
|
185
195
|
// A 'stranded' verdict over a worktree that VANISHED mid-derivation is not an answer
|
|
186
196
|
// either: the engine's terminal reap races the terminal-frame warm, and a half-removed
|
|
187
197
|
// tree can read "dirty" (deleted paths in `git status`) the instant before its .git
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delivery-cache.js","sourceRoot":"","sources":["../../src/api/delivery-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAGH,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,uBAAuB,EACvB,qBAAqB,GAGtB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"delivery-cache.js","sourceRoot":"","sources":["../../src/api/delivery-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,13 +21,49 @@
|
|
|
21
21
|
* the per-run output endpoint.
|
|
22
22
|
*/
|
|
23
23
|
import type { AuditLog } from './audit.js';
|
|
24
|
-
import type { AgentSession, SessionView, WorkUnit } from '../core/types.js';
|
|
24
|
+
import type { AgentSession, SessionView, WorkUnit, WorkflowDef } from '../core/types.js';
|
|
25
25
|
/** What `AgentSession.delivery` + `deliverUrl` spell on the wire (api-types 0.18.0, crew#393). */
|
|
26
26
|
export interface DeliveryState {
|
|
27
27
|
delivery: 'delivered' | 'stranded' | 'vacuous' | 'none';
|
|
28
28
|
/** Present exactly when `delivery === 'delivered'`. */
|
|
29
29
|
deliverUrl?: string;
|
|
30
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Does this workflow DEFINITION do code work — the ONE predicate crew already applies at launch
|
|
33
|
+
* (`routes.ts` `POST /runs`: `deliver` defaults to `'pr'` only for such a def): some phase declares
|
|
34
|
+
* `executes_code` and is not the evaluator's. Hoisted here (DES-L8 §5 PR-8A; adjudicated §4.8) so
|
|
35
|
+
* the launch-time default and the read-time classification below cannot drift —
|
|
36
|
+
* `tests/delivery-classification.test.ts` pins this function equal to the inline rule for every
|
|
37
|
+
* shipped def — by DRIVING `POST /runs` with no `deliver` and reading the `run.launched` audit
|
|
38
|
+
* `detail.deliver` the closure's own rule produced (never a copy of the predicate). The inline call
|
|
39
|
+
* in the `POST /runs` closure stays this train; its 3-line swap to this import is a follow-up in
|
|
40
|
+
* that closure's owner lane.
|
|
41
|
+
*/
|
|
42
|
+
export declare function isCodeWorkDef(def: WorkflowDef): boolean;
|
|
43
|
+
/** The phase id a planned unit carries — the `<base>:<phase>` suffix (`qe/acceptance.ts`'s rule);
|
|
44
|
+
* `''` for a free-text unit (`u1`, `u2`, …) or a legacy id with no colon. */
|
|
45
|
+
export declare function phaseIdOf(unitId: string): string;
|
|
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 declare function runCanDeliver(view: SessionView, def: WorkflowDef | null): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* The ONE def-awareness closure the daemon hands its delivery cache and its campaigns rollup —
|
|
60
|
+
* `runCanDeliver` over the run's def resolved through the registry (`resolveRunWorkflow`). Built
|
|
61
|
+
* for a READ path: a run record with no `workflow_id` (a fake adapter's minimal session, an older
|
|
62
|
+
* record), no `units`, or a registry that throws resolves NO def ⇒ `runCanDeliver(view, null)` ⇒
|
|
63
|
+
* today's candidacy — never a 500 on `GET /runs` (the auth-required suite's `{ id, status }`
|
|
64
|
+
* sessions are exactly this shape). Absence of an answer is today's label, not an error.
|
|
65
|
+
*/
|
|
66
|
+
export declare function canDeliverResolver(listWorkflows: () => WorkflowDef[], log?: (msg: string) => void): (view: SessionView) => boolean;
|
|
31
67
|
/**
|
|
32
68
|
* The tri-state delivery derivation (crew#393) — HONEST by construction, computed at DTO
|
|
33
69
|
* assembly from three facts and nothing else:
|
|
@@ -43,8 +79,14 @@ export interface DeliveryState {
|
|
|
43
79
|
*
|
|
44
80
|
* `worktreeExists` is injected (a `fs.existsSync` in production) so route tests can pin the
|
|
45
81
|
* derivation without staging real directories.
|
|
82
|
+
*
|
|
83
|
+
* `canDeliver` (crew#481, D-14) is the def-awareness — {@link runCanDeliver}'s answer, resolved by
|
|
84
|
+
* the caller (the cache dep / the rollup dep) so this fn stays a pure derivation: `false` answers
|
|
85
|
+
* `'none'` for a completed run whose def could never have delivered, AFTER the url check (a recorded
|
|
86
|
+
* PR always wins, whatever the def) and BEFORE the worktree stat (nothing there is liftable work).
|
|
87
|
+
* Defaults to `true` = today's behaviour for every caller that has no def in hand.
|
|
46
88
|
*/
|
|
47
|
-
export declare function deliveryStateOf(session: Pick<AgentSession, 'status' | 'repo_ref' | 'workdir'>, url: string | undefined, worktreeExists: (path: string) => boolean): DeliveryState;
|
|
89
|
+
export declare function deliveryStateOf(session: Pick<AgentSession, 'status' | 'repo_ref' | 'workdir'>, url: string | undefined, worktreeExists: (path: string) => boolean, canDeliver?: boolean): DeliveryState;
|
|
48
90
|
/** The probes behind the `'vacuous'` derivation (crew#311) — injected so route tests can pin the
|
|
49
91
|
* derivation without staging real repos; production wires the memoized git probes below.
|
|
50
92
|
*
|
|
@@ -99,7 +141,7 @@ export declare class VacuityProbeUnavailable extends Error {
|
|
|
99
141
|
* completed run's branch has made its work unreachable — it reads vacuous, which is what the
|
|
100
142
|
* run now amounts to.)
|
|
101
143
|
*/
|
|
102
|
-
export declare function deliveryStateWithVacuity(session: Pick<AgentSession, 'id' | 'status' | 'repo_ref' | 'workdir'>, url: string | undefined, probes: VacuityProbes): Promise<DeliveryState>;
|
|
144
|
+
export declare function deliveryStateWithVacuity(session: Pick<AgentSession, 'id' | 'status' | 'repo_ref' | 'workdir'>, url: string | undefined, probes: VacuityProbes, canDeliver?: boolean): Promise<DeliveryState>;
|
|
103
145
|
/** How long a per-worktree cleanliness read is trusted before the next request re-probes. A
|
|
104
146
|
* terminal run's worktree only changes under operator hands, and `GET /runs` is polled — an
|
|
105
147
|
* unmemoized probe would be two git subprocesses per stranded run per poll. */
|
|
@@ -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":"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"}
|
|
@@ -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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"}
|
|
@@ -50,11 +50,9 @@ export interface RequirementsPage {
|
|
|
50
50
|
limit: number;
|
|
51
51
|
items: RequirementSummary[];
|
|
52
52
|
/**
|
|
53
|
-
* Which
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
* thousands of validated statements is an observed failure, not a hypothetical. Without
|
|
57
|
-
* this the caller cannot tell which one it is looking at. (FINDING-065)
|
|
53
|
+
* Which source served this corpus. Always `'artifact'` since 0.7.35 (crew#548 — the live-store
|
|
54
|
+
* read through a second SQLite library is gone; module header); the `'store'` arm stays in the
|
|
55
|
+
* wire type (`wicked-crew-api-types`) for readers of older daemons. (FINDING-065)
|
|
58
56
|
*/
|
|
59
57
|
source: 'store' | 'artifact';
|
|
60
58
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requirements.d.ts","sourceRoot":"","sources":["../../src/api/requirements.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"requirements.d.ts","sourceRoot":"","sources":["../../src/api/requirements.ts"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAmBlD,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,IAAI,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC5B;AAED,MAAM,MAAM,mBAAmB,GAAG,YAAY,GAAG,aAAa,CAAC;AAE/D;;;4CAG4C;AAC5C,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,mBAAmB,CAM5D;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,0FAA0F;IAC1F,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAAC;IACvC,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,iBAAkB,SAAQ,kBAAkB;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,OAAO,EAAE,CAAC;IACzB,gBAAgB,EAAE,OAAO,EAAE,CAAC;CAC7B;AAiID,MAAM,WAAW,iBAAiB;IAChC,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,QAAQ,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B;;;;OAIG;IACH,MAAM,EAAE,OAAO,GAAG,UAAU,CAAC;IAC7B;;;;;OAKG;IACH,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,wFAAwF;AACxF,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA0BlC;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,SAAS,EACf,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAmBnC;AAED,2FAA2F;AAC3F,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,SAAS,EACf,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAmBnC"}
|