wicked-crew 0.7.13 → 0.7.15
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-cache.d.ts +135 -0
- package/dist/api/delivery-cache.d.ts.map +1 -0
- package/dist/api/delivery-cache.js +245 -0
- package/dist/api/delivery-cache.js.map +1 -0
- package/dist/api/delivery-index.d.ts +45 -14
- package/dist/api/delivery-index.d.ts.map +1 -1
- package/dist/api/delivery-index.js +107 -55
- package/dist/api/delivery-index.js.map +1 -1
- package/dist/api/endpoint-manifest-live.d.ts.map +1 -1
- package/dist/api/endpoint-manifest-live.js +0 -1
- package/dist/api/endpoint-manifest-live.js.map +1 -1
- package/dist/api/gate-cache.d.ts +24 -0
- package/dist/api/gate-cache.d.ts.map +1 -1
- package/dist/api/gate-cache.js +35 -0
- package/dist/api/gate-cache.js.map +1 -1
- package/dist/api/routes.d.ts +14 -7
- package/dist/api/routes.d.ts.map +1 -1
- package/dist/api/routes.js +64 -17
- package/dist/api/routes.js.map +1 -1
- package/dist/api/seat-health.d.ts +0 -25
- package/dist/api/seat-health.d.ts.map +1 -1
- package/dist/api/seat-health.js +6 -81
- package/dist/api/seat-health.js.map +1 -1
- package/dist/api/server.d.ts +18 -15
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +87 -36
- package/dist/api/server.js.map +1 -1
- package/dist/api/stall-watchdog.d.ts +40 -3
- package/dist/api/stall-watchdog.d.ts.map +1 -1
- package/dist/api/stall-watchdog.js +94 -15
- package/dist/api/stall-watchdog.js.map +1 -1
- package/dist/campaigns/rollup.d.ts +3 -0
- package/dist/campaigns/rollup.d.ts.map +1 -1
- package/dist/campaigns/rollup.js +17 -2
- package/dist/campaigns/rollup.js.map +1 -1
- package/dist/campaigns/routes.d.ts +4 -4
- package/dist/core/deliver.d.ts +5 -5
- package/dist/core/deliver.d.ts.map +1 -1
- package/dist/core/deliver.js +59 -14
- package/dist/core/deliver.js.map +1 -1
- package/dist/core/types.d.ts +20 -4
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +20 -1
- package/dist/core/types.js.map +1 -1
- package/endpoint-manifest.json +3 -2
- package/package.json +2 -2
|
@@ -50,6 +50,20 @@ export function deliveryStateOf(session, url, worktreeExists) {
|
|
|
50
50
|
}
|
|
51
51
|
return { delivery: 'none' };
|
|
52
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* Thrown by the production probes when git COULD NOT ANSWER — infrastructure absence, not a
|
|
55
|
+
* verdict. The old behavior folded this into `false` ("not clean" / "not empty"), which was
|
|
56
|
+
* safe while every consumer re-probed within a TTL, but the delivery cache records derivations:
|
|
57
|
+
* caching a raced probe's `false` pinned a WRONG 'stranded' on a vacuous run (forever, where no
|
|
58
|
+
* sweep ticks). Distinguishing absence from verdict at the probe layer is what lets the cache
|
|
59
|
+
* refuse to record it.
|
|
60
|
+
*/
|
|
61
|
+
export class VacuityProbeUnavailable extends Error {
|
|
62
|
+
constructor(what, cause) {
|
|
63
|
+
super(`${what}: ${cause instanceof Error ? cause.message : String(cause)}`);
|
|
64
|
+
this.name = 'VacuityProbeUnavailable';
|
|
65
|
+
}
|
|
66
|
+
}
|
|
53
67
|
/**
|
|
54
68
|
* The delivery derivation WITH the vacuity split (crew#311) — the async refinement over
|
|
55
69
|
* {@link deliveryStateOf} the run DTOs actually use.
|
|
@@ -67,11 +81,13 @@ export function deliveryStateOf(session, url, worktreeExists) {
|
|
|
67
81
|
* work anywhere, while "reaped tree + commits on the branch" is landed work and stays
|
|
68
82
|
* `'none'` (nothing left in a worktree to lift).
|
|
69
83
|
*
|
|
70
|
-
* Both shapes now read `'vacuous'`, and only on POSITIVE reads
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
*
|
|
84
|
+
* Both shapes now read `'vacuous'`, and only on POSITIVE reads. A missing repo RECORD still
|
|
85
|
+
* reads `false` from the branch probe (a permanent state — the label honestly falls back to
|
|
86
|
+
* `'none'`), but a git failure now PROPAGATES as {@link VacuityProbeUnavailable} instead of
|
|
87
|
+
* silently keeping the pre-existing label: the caller owns the degrade (see the failure
|
|
88
|
+
* contract on {@link VacuityProbes}). (One honest edge: an operator who hand-deleted a
|
|
89
|
+
* completed run's branch has made its work unreachable — it reads vacuous, which is what the
|
|
90
|
+
* run now amounts to.)
|
|
75
91
|
*/
|
|
76
92
|
export async function deliveryStateWithVacuity(session, url, probes) {
|
|
77
93
|
const state = deliveryStateOf(session, url, probes.worktreeExists);
|
|
@@ -93,44 +109,73 @@ export async function deliveryStateWithVacuity(session, url, probes) {
|
|
|
93
109
|
* terminal run's worktree only changes under operator hands, and `GET /runs` is polled — an
|
|
94
110
|
* unmemoized probe would be two git subprocesses per stranded run per poll. */
|
|
95
111
|
export const WORKTREE_CLEAN_TTL_MS = 30_000;
|
|
112
|
+
/** How long a FAILED probe ({@link VacuityProbeUnavailable}) is memoized before a real
|
|
113
|
+
* re-probe. Deliberately short: a failure is usually a raced teardown or a load spike, and
|
|
114
|
+
* the delivery cache's retry needs a genuine re-probe in ~a second — but a request-path
|
|
115
|
+
* consumer (the campaigns rollup) polling over a persistently broken repo must not spawn two
|
|
116
|
+
* 10s-timeout gits per poll tick either. */
|
|
117
|
+
export const PROBE_FAILURE_TTL_MS = 1_000;
|
|
118
|
+
/** The shared memo shape for both probes: verdicts live for `ttlMs`, failures for
|
|
119
|
+
* {@link PROBE_FAILURE_TTL_MS} (re-thrown, not re-spawned, within that window). */
|
|
120
|
+
function memoized(probe, ttlMs, now) {
|
|
121
|
+
const memo = new Map();
|
|
122
|
+
return async (key) => {
|
|
123
|
+
const hit = memo.get(key);
|
|
124
|
+
if (hit !== undefined && now() - hit.at < ('err' in hit ? PROBE_FAILURE_TTL_MS : ttlMs)) {
|
|
125
|
+
if ('err' in hit)
|
|
126
|
+
throw hit.err;
|
|
127
|
+
return hit.value;
|
|
128
|
+
}
|
|
129
|
+
try {
|
|
130
|
+
const value = await probe(key);
|
|
131
|
+
memo.set(key, { at: now(), value });
|
|
132
|
+
return value;
|
|
133
|
+
}
|
|
134
|
+
catch (err) {
|
|
135
|
+
const e = err instanceof VacuityProbeUnavailable
|
|
136
|
+
? err
|
|
137
|
+
: new VacuityProbeUnavailable('vacuity probe failed', err);
|
|
138
|
+
memo.set(key, { at: now(), err: e });
|
|
139
|
+
throw e;
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
}
|
|
96
143
|
/**
|
|
97
144
|
* The production `worktreeIsClean` probe: the SAME two read-only instruments as the engine's
|
|
98
145
|
* `worktree_is_clean` — uncommitted paths (`git status --porcelain`, untracked included) and
|
|
99
146
|
* run-branch-only commits (`git log --oneline HEAD --not --exclude=wicked/* --branches`) —
|
|
100
147
|
* memoized per worktree path for {@link WORKTREE_CLEAN_TTL_MS}.
|
|
101
148
|
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
*
|
|
149
|
+
* A verdict comes only from git ANSWERING: exit 0 with empty/non-empty output. Any failure —
|
|
150
|
+
* git unspawnable, a timeout kill, a 128 "not a git repository", ENOENT from a worktree racing
|
|
151
|
+
* the terminal reap — throws {@link VacuityProbeUnavailable} (memoized for
|
|
152
|
+
* {@link PROBE_FAILURE_TTL_MS}) so no consumer can mistake absence for "not clean" and pin a
|
|
153
|
+
* wrong 'stranded' (PR #435 review). Callers degrade per the {@link VacuityProbes} contract.
|
|
105
154
|
*/
|
|
106
155
|
export function gitWorktreeIsClean(ttlMs = WORKTREE_CLEAN_TTL_MS, now = Date.now) {
|
|
107
|
-
const memo = new Map();
|
|
108
156
|
const probe = async (path) => {
|
|
109
157
|
const gitEmpty = async (args) => {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
158
|
+
try {
|
|
159
|
+
// Read-only git plumbing over the run's own worktree; argv array, never a shell string.
|
|
160
|
+
// GIT_OPTIONAL_LOCKS=0 (git ≥2.15): `git status` otherwise takes index.lock
|
|
161
|
+
// opportunistically to write back a refreshed index — a background probe must never
|
|
162
|
+
// hold a lock a concurrent deliver's `git add`/`git commit` can collide with.
|
|
163
|
+
const { stdout } = await execCapped('git', args, {
|
|
164
|
+
cwd: path,
|
|
165
|
+
timeout: 10_000,
|
|
166
|
+
windowsHide: true,
|
|
167
|
+
env: { ...process.env, GIT_OPTIONAL_LOCKS: '0' },
|
|
168
|
+
});
|
|
169
|
+
return stdout.trim() === '';
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
throw new VacuityProbeUnavailable(`git ${args[0] ?? ''} could not answer over ${path}`, err);
|
|
173
|
+
}
|
|
117
174
|
};
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
(await gitEmpty(['log', '--oneline', 'HEAD', '--not', '--exclude=wicked/*', '--branches'])));
|
|
121
|
-
}
|
|
122
|
-
catch {
|
|
123
|
-
return false;
|
|
124
|
-
}
|
|
125
|
-
};
|
|
126
|
-
return async (path) => {
|
|
127
|
-
const hit = memo.get(path);
|
|
128
|
-
if (hit !== undefined && now() - hit.at < ttlMs)
|
|
129
|
-
return hit.clean;
|
|
130
|
-
const clean = await probe(path);
|
|
131
|
-
memo.set(path, { at: now(), clean });
|
|
132
|
-
return clean;
|
|
175
|
+
return ((await gitEmpty(['status', '--porcelain'])) &&
|
|
176
|
+
(await gitEmpty(['log', '--oneline', 'HEAD', '--not', '--exclude=wicked/*', '--branches'])));
|
|
133
177
|
};
|
|
178
|
+
return memoized(probe, ttlMs, now);
|
|
134
179
|
}
|
|
135
180
|
/**
|
|
136
181
|
* The production `runBranchIsEmpty` probe — the reaped-worktree half of vacuity (crew#311).
|
|
@@ -139,37 +184,51 @@ export function gitWorktreeIsClean(ttlMs = WORKTREE_CLEAN_TTL_MS, now = Date.now
|
|
|
139
184
|
* `refs/heads/wicked/<runId>` no longer exists in the run's repo, or it exists and
|
|
140
185
|
* `git log <branch> --not --exclude=wicked/* --branches` is empty (the branch carries no commit
|
|
141
186
|
* of its own — the exact second instrument of the engine's `worktree_is_clean`, aimed at the
|
|
142
|
-
* branch instead of a checkout).
|
|
143
|
-
*
|
|
187
|
+
* branch instead of a checkout). A repo the registry no longer RESOLVES reads FALSE — a
|
|
188
|
+
* permanent state, the label honestly falls back to `'none'` — while a git failure or a
|
|
189
|
+
* registry read failure throws {@link VacuityProbeUnavailable} (absence of an answer, PR #435
|
|
190
|
+
* review), memoized for {@link PROBE_FAILURE_TTL_MS}; callers degrade per the
|
|
191
|
+
* {@link VacuityProbes} contract.
|
|
144
192
|
*
|
|
145
193
|
* `resolveRepoRoot` is injected (routes wire it to the adapter's repo registry) and its answer
|
|
146
194
|
* rides the same TTL memo as the verdict, so a `GET /runs` poll costs at most one registry read
|
|
147
195
|
* + one git pair per run per window.
|
|
148
196
|
*/
|
|
149
197
|
export function gitRunBranchIsEmpty(resolveRepoRoot, ttlMs = WORKTREE_CLEAN_TTL_MS, now = Date.now) {
|
|
150
|
-
const
|
|
151
|
-
|
|
198
|
+
const probe = async (key) => {
|
|
199
|
+
const [repoRef, runId] = key.split('\0');
|
|
152
200
|
let root;
|
|
153
201
|
try {
|
|
154
202
|
root = await resolveRepoRoot(repoRef);
|
|
155
203
|
}
|
|
156
|
-
catch {
|
|
157
|
-
|
|
204
|
+
catch (err) {
|
|
205
|
+
// A registry READ failure is transient infrastructure — not the same fact as the
|
|
206
|
+
// registry answering "no such repo".
|
|
207
|
+
throw new VacuityProbeUnavailable(`repo registry could not answer for ${repoRef}`, err);
|
|
158
208
|
}
|
|
159
209
|
if (root === undefined)
|
|
160
|
-
return false;
|
|
210
|
+
return false; // repo record gone — permanent, honestly 'none'
|
|
161
211
|
const branch = `refs/heads/wicked/${runId}`;
|
|
162
212
|
const gitOut = (args) =>
|
|
163
213
|
// Read-only git plumbing over the registered repo root; argv array, never a shell string.
|
|
164
|
-
|
|
214
|
+
// GIT_OPTIONAL_LOCKS=0: same no-opportunistic-locks posture as the worktree probe — this
|
|
215
|
+
// root is the repo a deliver (or the operator) may be writing in right now.
|
|
216
|
+
execCapped('git', args, {
|
|
217
|
+
cwd: root,
|
|
218
|
+
timeout: 10_000,
|
|
219
|
+
windowsHide: true,
|
|
220
|
+
env: { ...process.env, GIT_OPTIONAL_LOCKS: '0' },
|
|
221
|
+
});
|
|
165
222
|
try {
|
|
166
223
|
await gitOut(['rev-parse', '--verify', '--quiet', branch]);
|
|
167
224
|
}
|
|
168
225
|
catch (err) {
|
|
169
226
|
// `--verify --quiet` on a missing ref is a CLEAN exit 1 — the one verifiable "branch
|
|
170
227
|
// gone". Anything else (git unspawnable, deleted root ⇒ ENOENT, a 128 "not a git
|
|
171
|
-
// repository", a timeout kill) is
|
|
172
|
-
|
|
228
|
+
// repository", a timeout kill) is git NOT ANSWERING.
|
|
229
|
+
if (err.code === 1)
|
|
230
|
+
return true;
|
|
231
|
+
throw new VacuityProbeUnavailable(`git rev-parse could not answer over ${root}`, err);
|
|
173
232
|
}
|
|
174
233
|
try {
|
|
175
234
|
const { stdout } = await gitOut([
|
|
@@ -182,19 +241,12 @@ export function gitRunBranchIsEmpty(resolveRepoRoot, ttlMs = WORKTREE_CLEAN_TTL_
|
|
|
182
241
|
]);
|
|
183
242
|
return stdout.trim() === '';
|
|
184
243
|
}
|
|
185
|
-
catch {
|
|
186
|
-
|
|
244
|
+
catch (err) {
|
|
245
|
+
throw new VacuityProbeUnavailable(`git log could not answer over ${root}`, err);
|
|
187
246
|
}
|
|
188
247
|
};
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
const hit = memo.get(key);
|
|
192
|
-
if (hit !== undefined && now() - hit.at < ttlMs)
|
|
193
|
-
return hit.empty;
|
|
194
|
-
const empty = await probe(repoRef, runId);
|
|
195
|
-
memo.set(key, { at: now(), empty });
|
|
196
|
-
return empty;
|
|
197
|
-
};
|
|
248
|
+
const run = memoized(probe, ttlMs, now);
|
|
249
|
+
return (repoRef, runId) => run(`${repoRef}\0${runId}`);
|
|
198
250
|
}
|
|
199
251
|
/**
|
|
200
252
|
* The PR URL in a deliver transcript — crew's own extraction, mirrored
|
|
@@ -219,13 +271,13 @@ export function deliverUnitOf(view) {
|
|
|
219
271
|
return view.units.find((u) => (u.tool_cmd ?? []).join(' ').includes('gh pr create')) ?? null;
|
|
220
272
|
}
|
|
221
273
|
/**
|
|
222
|
-
* Is this a `failed` run whose ONLY failure was
|
|
274
|
+
* Is this a `failed` run whose ONLY failure was a recoverable deliver LIFT failure (crew#418/#432)?
|
|
223
275
|
*
|
|
224
276
|
* The deliver phase is the LAST phase, so a rejected deliver unit whose `denial_reason` carries
|
|
225
277
|
* the deliver script's {@link DELIVER_LIFT_CONFLICT_MARKER} — with EVERY non-deliver unit still
|
|
226
278
|
* `done` — means the run's WORK is complete and committed on its `wicked/<id>` branch: only the
|
|
227
|
-
* lift into origin
|
|
228
|
-
* non-fast-forward push). The engine reports the run `failed` because a Tool phase exited
|
|
279
|
+
* lift into origin could not complete (a rebase conflict the changelog union merge could not
|
|
280
|
+
* clear, a non-fast-forward push, or a transport/auth/remote rejection). The engine reports the run `failed` because a Tool phase exited
|
|
229
281
|
* non-zero; crew reinterprets THIS shape on the wire as `completed` + `delivery: 'stranded'`
|
|
230
282
|
* (recoverable via `POST /runs/:id/deliver`) — the same wire-derivation posture as `delivery`
|
|
231
283
|
* itself, leaving the engine's durable `failed` record untouched. The deliver unit stays
|
|
@@ -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;AASlE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,eAAe,CAC7B,OAA8D,EAC9D,GAAuB,EACvB,cAAyC;IAEzC,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;IACzE,IACE,OAAO,CAAC,MAAM,KAAK,WAAW;QAC9B,OAAO,CAAC,QAAQ,IAAI,IAAI;QACxB,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ;QACnC,OAAO,CAAC,OAAO,KAAK,EAAE;QACtB,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,EAC/B,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IAClC,CAAC;IACD,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAC9B,CAAC;
|
|
1
|
+
{"version":3,"file":"delivery-index.js","sourceRoot":"","sources":["../../src/api/delivery-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"endpoint-manifest-live.d.ts","sourceRoot":"","sources":["../../src/api/endpoint-manifest-live.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAQH,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEtF,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,gBAAgB,CAAC,
|
|
1
|
+
{"version":3,"file":"endpoint-manifest-live.d.ts","sourceRoot":"","sources":["../../src/api/endpoint-manifest-live.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAQH,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEtF,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAkC7E"}
|
|
@@ -48,7 +48,6 @@ export async function collectLiveEndpointManifest() {
|
|
|
48
48
|
auditPath: join(scratch, 'audit.log'),
|
|
49
49
|
projectEvents: { disabled: true },
|
|
50
50
|
interactiveWsRelay: { disabled: true },
|
|
51
|
-
seatHealthProbe: { enabled: false },
|
|
52
51
|
stallWatchdog: { enabled: false },
|
|
53
52
|
// Nonexistent on purpose — headless boot; see the module header.
|
|
54
53
|
studioRoot: join(scratch, 'no-studio-bundle'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"endpoint-manifest-live.js","sourceRoot":"","sources":["../../src/api/endpoint-manifest-live.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAyB,MAAM,wBAAwB,CAAC;AAEtF,MAAM,CAAC,KAAK,UAAU,2BAA2B;IAC/C,4FAA4F;IAC5F,kFAAkF;IAClF,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC;IACpC,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG;QACd,IAAI,EAAE,IAAI;QACV,iBAAiB,EAAE,GAAG,EAAE,CAAC,KAAK;QAC9B,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAC7B,wFAAwF;QACxF,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAE,CAAC;KACE,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE;YACtC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;YACrB,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC;YACrC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;YACjC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;YACtC,
|
|
1
|
+
{"version":3,"file":"endpoint-manifest-live.js","sourceRoot":"","sources":["../../src/api/endpoint-manifest-live.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAyB,MAAM,wBAAwB,CAAC;AAEtF,MAAM,CAAC,KAAK,UAAU,2BAA2B;IAC/C,4FAA4F;IAC5F,kFAAkF;IAClF,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,QAAQ,CAAC;IACpC,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,yBAAyB,CAAC,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG;QACd,IAAI,EAAE,IAAI;QACV,iBAAiB,EAAE,GAAG,EAAE,CAAC,KAAK;QAC9B,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAC7B,wFAAwF;QACxF,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAE,CAAC;KACE,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE;YACtC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;YACrB,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC;YACrC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;YACjC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;YACtC,aAAa,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;YACjC,iEAAiE;YACjE,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC;SAC9C,CAAC,CAAC;QACH,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO,qBAAqB,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;gBAAS,CAAC;YACT,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,IAAI,aAAa,KAAK,SAAS;YAAE,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;;YAC5D,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,aAAa,CAAC;QAC9C,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;AACH,CAAC"}
|
package/dist/api/gate-cache.d.ts
CHANGED
|
@@ -9,7 +9,31 @@ export interface GateCacheEntry {
|
|
|
9
9
|
lifecycle: 'open';
|
|
10
10
|
/** When the daemon observed the gate. */
|
|
11
11
|
receivedAt: string;
|
|
12
|
+
/**
|
|
13
|
+
* Present ONLY when the gate prompt reads as a pure sandbox/tool refusal — the worker reported it
|
|
14
|
+
* could not act, with no sign of productive work (issue #419). A warning for the operator, never a
|
|
15
|
+
* gate decision; omitted entirely on a normal gate so the wire is byte-identical.
|
|
16
|
+
*/
|
|
17
|
+
refusal?: {
|
|
18
|
+
matched: boolean;
|
|
19
|
+
reason: string;
|
|
20
|
+
};
|
|
12
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Detect whether a gate prompt is a PURE sandbox/tool refusal — the worker reporting it could not
|
|
24
|
+
* act (read-only sandbox, rejected writes, "could not modify/regenerate"), with NO sign it did real
|
|
25
|
+
* work (issue #419). Returns `{ matched: true, reason }` only when a refusal signature fires AND no
|
|
26
|
+
* work-done phrase vetoes it; `undefined` otherwise. This is a WARNING signal surfaced on the gate
|
|
27
|
+
* wire so an operator does not approve a refusal as if it were work — it never gates a decision.
|
|
28
|
+
*
|
|
29
|
+
* The bias is deliberately toward NOT flagging: a genuine work transcript that merely mentions
|
|
30
|
+
* "sandbox"/"blocked", or a mixed turn that refused one tool but did real work elsewhere, must not
|
|
31
|
+
* be flagged. A missed refusal is a lesser harm than a false one.
|
|
32
|
+
*/
|
|
33
|
+
export declare function detectRefusal(text: string): {
|
|
34
|
+
matched: boolean;
|
|
35
|
+
reason: string;
|
|
36
|
+
} | undefined;
|
|
13
37
|
/**
|
|
14
38
|
* Gate-prompt cache over a durable log (DES-STUDIO-001 §3.3).
|
|
15
39
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate-cache.d.ts","sourceRoot":"","sources":["../../src/api/gate-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/D,0CAA0C;AAC1C,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,sFAAsF;IACtF,MAAM,EAAE,MAAM,CAAC;IACf,sFAAsF;IACtF,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"gate-cache.d.ts","sourceRoot":"","sources":["../../src/api/gate-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/D,0CAA0C;AAC1C,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,sFAAsF;IACtF,MAAM,EAAE,MAAM,CAAC;IACf,sFAAsF;IACtF,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,OAAO,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAChD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAoB5F;AAkDD;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAE7D,8CAA8C;IAC9C,MAAM,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAI9B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,cAAc,GAAG,SAAS;IAQvE,8CAA8C;IAC9C,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI9C;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI;IAIjD,8FAA8F;IAC9F,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,IAAI;CAQtC"}
|
package/dist/api/gate-cache.js
CHANGED
|
@@ -1,3 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detect whether a gate prompt is a PURE sandbox/tool refusal — the worker reporting it could not
|
|
3
|
+
* act (read-only sandbox, rejected writes, "could not modify/regenerate"), with NO sign it did real
|
|
4
|
+
* work (issue #419). Returns `{ matched: true, reason }` only when a refusal signature fires AND no
|
|
5
|
+
* work-done phrase vetoes it; `undefined` otherwise. This is a WARNING signal surfaced on the gate
|
|
6
|
+
* wire so an operator does not approve a refusal as if it were work — it never gates a decision.
|
|
7
|
+
*
|
|
8
|
+
* The bias is deliberately toward NOT flagging: a genuine work transcript that merely mentions
|
|
9
|
+
* "sandbox"/"blocked", or a mixed turn that refused one tool but did real work elsewhere, must not
|
|
10
|
+
* be flagged. A missed refusal is a lesser harm than a false one.
|
|
11
|
+
*/
|
|
12
|
+
export function detectRefusal(text) {
|
|
13
|
+
const SIGNATURES = [
|
|
14
|
+
{ re: /blocked by[^.\n]*read-only (?:sandbox|workspace)/i, reason: 'blocked by a read-only sandbox' },
|
|
15
|
+
{ re: /writes?\s+(?:are|were)\s+rejected/i, reason: 'sandbox rejected writes' },
|
|
16
|
+
{ re: /could not (?:modify|regenerate|write|create)\b/i, reason: 'could not modify or regenerate files' },
|
|
17
|
+
{ re: /\bno files?\s+(?:were|was)\s+(?:changed|modified|written|created)\b/i, reason: 'no files were changed' },
|
|
18
|
+
{ re: /\bi\s+(?:cannot|can[’'`]?t)\s+(?:edit|modify|delete|write|create)\b/i, reason: 'refused a write operation' },
|
|
19
|
+
{
|
|
20
|
+
re: /network access[^.\n]*(?:unavailable|forbidden|blocked)|environment (?:forbids|prohibits)/i,
|
|
21
|
+
reason: 'blocked network/environment access',
|
|
22
|
+
},
|
|
23
|
+
];
|
|
24
|
+
// Any of these means the turn did real work — veto the flag. Err toward NOT flagging.
|
|
25
|
+
const WORK_DONE = /\bi\s+(?:fixed|implemented|added|changed|edited|wrote|created|updated|refactored|regenerated)\b|\bran\s+tests?\b|\btests?\s+(?:pass|passed|green)\b|\ball tests\b|\bthe fix\b|\bcommitted\b|\bsuccessfully\b|\bchanged\s+\d+\s+(?:files?|packages?)|\b\d+\s+(?:files?|packages?)\s+changed\b|\b\d+\s+(?:insertions?|deletions?)\b|\bdiff --git\b|\b\d+\s+passed\b/i;
|
|
26
|
+
const hit = SIGNATURES.find((s) => s.re.test(text));
|
|
27
|
+
if (hit === undefined)
|
|
28
|
+
return undefined;
|
|
29
|
+
if (WORK_DONE.test(text))
|
|
30
|
+
return undefined;
|
|
31
|
+
return { matched: true, reason: hit.reason };
|
|
32
|
+
}
|
|
1
33
|
/**
|
|
2
34
|
* When a gate was observed, ISO-8601.
|
|
3
35
|
*
|
|
@@ -24,11 +56,14 @@ function fold(entries, event) {
|
|
|
24
56
|
switch (event.type) {
|
|
25
57
|
case 'awaitingHuman':
|
|
26
58
|
if (typeof event.ord === 'number' && typeof event.prompt === 'string') {
|
|
59
|
+
const refusal = detectRefusal(event.prompt);
|
|
27
60
|
entries.set(session, {
|
|
28
61
|
ord: event.ord,
|
|
29
62
|
prompt: event.prompt,
|
|
30
63
|
lifecycle: 'open',
|
|
31
64
|
receivedAt: observedAt(event),
|
|
65
|
+
// Spread only when matched, so a normal gate's entry is byte-identical (no `refusal` key).
|
|
66
|
+
...(refusal !== undefined ? { refusal } : {}),
|
|
32
67
|
});
|
|
33
68
|
}
|
|
34
69
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gate-cache.js","sourceRoot":"","sources":["../../src/api/gate-cache.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"gate-cache.js","sourceRoot":"","sources":["../../src/api/gate-cache.ts"],"names":[],"mappings":"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"}
|
package/dist/api/routes.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { FastifyInstance } from 'fastify';
|
|
2
2
|
import { z } from 'zod';
|
|
3
3
|
import { CoreAdapter } from '../core/adapter.js';
|
|
4
|
-
import type
|
|
4
|
+
import { type GateCache } from './gate-cache.js';
|
|
5
5
|
import type { ElicitationCache } from './elicitation-cache.js';
|
|
6
6
|
import { QeGateCache } from '../qe/gate-events.js';
|
|
7
7
|
import { SeatHealthTracker } from './seat-health.js';
|
|
@@ -14,6 +14,7 @@ import { RetryIndex } from './retry-index.js';
|
|
|
14
14
|
import { GroupIndex } from './group-index.js';
|
|
15
15
|
import { GuidanceIndex } from './guidance-index.js';
|
|
16
16
|
import { DeliveryIndex } from './delivery-index.js';
|
|
17
|
+
import { DeliveryDerivationCache } from './delivery-cache.js';
|
|
17
18
|
import { type DeliverExec, type WorktreeReprovisioner } from './post-hoc-deliver.js';
|
|
18
19
|
import { type AuthMode } from './auth.js';
|
|
19
20
|
export { API_PREFIX } from './api-prefix.js';
|
|
@@ -66,11 +67,11 @@ export declare const LaunchSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<{
|
|
|
66
67
|
}, "strict", z.ZodTypeAny, {
|
|
67
68
|
problem: string;
|
|
68
69
|
deliver?: "pr" | "none" | undefined;
|
|
70
|
+
repoRef?: string | undefined;
|
|
69
71
|
projectId?: string | undefined;
|
|
70
72
|
campaignId?: string | undefined;
|
|
71
73
|
groupLabel?: string | undefined;
|
|
72
74
|
workflow?: string | undefined;
|
|
73
|
-
repoRef?: string | undefined;
|
|
74
75
|
clisJson?: string | undefined;
|
|
75
76
|
sessionId?: string | undefined;
|
|
76
77
|
retryOf?: string | undefined;
|
|
@@ -79,11 +80,11 @@ export declare const LaunchSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<{
|
|
|
79
80
|
}, {
|
|
80
81
|
problem: string;
|
|
81
82
|
deliver?: "pr" | "none" | undefined;
|
|
83
|
+
repoRef?: string | undefined;
|
|
82
84
|
projectId?: string | undefined;
|
|
83
85
|
campaignId?: string | undefined;
|
|
84
86
|
groupLabel?: string | undefined;
|
|
85
87
|
workflow?: string | undefined;
|
|
86
|
-
repoRef?: string | undefined;
|
|
87
88
|
clisJson?: string | undefined;
|
|
88
89
|
sessionId?: string | undefined;
|
|
89
90
|
retryOf?: string | undefined;
|
|
@@ -92,11 +93,11 @@ export declare const LaunchSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<{
|
|
|
92
93
|
}>, {
|
|
93
94
|
problem: string;
|
|
94
95
|
deliver?: "pr" | "none" | undefined;
|
|
96
|
+
repoRef?: string | undefined;
|
|
95
97
|
projectId?: string | undefined;
|
|
96
98
|
campaignId?: string | undefined;
|
|
97
99
|
groupLabel?: string | undefined;
|
|
98
100
|
workflow?: string | undefined;
|
|
99
|
-
repoRef?: string | undefined;
|
|
100
101
|
clisJson?: string | undefined;
|
|
101
102
|
sessionId?: string | undefined;
|
|
102
103
|
retryOf?: string | undefined;
|
|
@@ -105,11 +106,11 @@ export declare const LaunchSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<{
|
|
|
105
106
|
}, {
|
|
106
107
|
problem: string;
|
|
107
108
|
deliver?: "pr" | "none" | undefined;
|
|
109
|
+
repoRef?: string | undefined;
|
|
108
110
|
projectId?: string | undefined;
|
|
109
111
|
campaignId?: string | undefined;
|
|
110
112
|
groupLabel?: string | undefined;
|
|
111
113
|
workflow?: string | undefined;
|
|
112
|
-
repoRef?: string | undefined;
|
|
113
114
|
clisJson?: string | undefined;
|
|
114
115
|
sessionId?: string | undefined;
|
|
115
116
|
retryOf?: string | undefined;
|
|
@@ -118,11 +119,11 @@ export declare const LaunchSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<{
|
|
|
118
119
|
}>, {
|
|
119
120
|
problem: string;
|
|
120
121
|
deliver?: "pr" | "none" | undefined;
|
|
122
|
+
repoRef?: string | undefined;
|
|
121
123
|
projectId?: string | undefined;
|
|
122
124
|
campaignId?: string | undefined;
|
|
123
125
|
groupLabel?: string | undefined;
|
|
124
126
|
workflow?: string | undefined;
|
|
125
|
-
repoRef?: string | undefined;
|
|
126
127
|
clisJson?: string | undefined;
|
|
127
128
|
sessionId?: string | undefined;
|
|
128
129
|
retryOf?: string | undefined;
|
|
@@ -131,11 +132,11 @@ export declare const LaunchSchema: z.ZodEffects<z.ZodEffects<z.ZodObject<{
|
|
|
131
132
|
}, {
|
|
132
133
|
problem: string;
|
|
133
134
|
deliver?: "pr" | "none" | undefined;
|
|
135
|
+
repoRef?: string | undefined;
|
|
134
136
|
projectId?: string | undefined;
|
|
135
137
|
campaignId?: string | undefined;
|
|
136
138
|
groupLabel?: string | undefined;
|
|
137
139
|
workflow?: string | undefined;
|
|
138
|
-
repoRef?: string | undefined;
|
|
139
140
|
clisJson?: string | undefined;
|
|
140
141
|
sessionId?: string | undefined;
|
|
141
142
|
retryOf?: string | undefined;
|
|
@@ -231,6 +232,12 @@ export interface RuntimeDeps {
|
|
|
231
232
|
* the same reason; defaults to the TTL-memoized `gitRunBranchIsEmpty` over the adapter's
|
|
232
233
|
* repo registry. */
|
|
233
234
|
runBranchIsEmpty?: (repoRef: string, runId: string) => Promise<boolean>;
|
|
235
|
+
/** The background delivery-derivation cache (GET /runs p99): the run DTOs READ this instead
|
|
236
|
+
* of running the two git probes above at assembly — `createServer` builds one over the
|
|
237
|
+
* production probes, arms its sweep, and warms it at each run's terminal frame. A
|
|
238
|
+
* directly-driven route set gets a COLD, unstarted one over the same injectable probes:
|
|
239
|
+
* reads then answer the stat-only tri-state until a test sweeps or warms it explicitly. */
|
|
240
|
+
deliveryCache?: DeliveryDerivationCache;
|
|
234
241
|
/** The post-hoc deliver exec (crew#393, `POST /runs/:id/deliver`) — spawns the hardened
|
|
235
242
|
* deliver script in a run's worktree. Injectable so route tests aim the spawn's HOME/PATH at
|
|
236
243
|
* a fixture (stub `gh`, local bare origin); defaults to the real `bash -lc` spawn. */
|
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,EAAmD,WAAW,EAA4E,MAAM,oBAAoB,CAAC;AAE5K,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/api/routes.ts"],"names":[],"mappings":"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"}
|