@wildorder/nightshift 0.13.0 → 0.15.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/README.md +64 -26
- package/dist/agent-probe.d.ts +21 -2
- package/dist/agent-probe.d.ts.map +1 -1
- package/dist/agent-probe.js +76 -22
- package/dist/agent-probe.js.map +1 -1
- package/dist/agent-runner.d.ts +90 -2
- package/dist/agent-runner.d.ts.map +1 -1
- package/dist/agent-runner.js +382 -24
- package/dist/agent-runner.js.map +1 -1
- package/dist/agent-summary.d.ts +15 -0
- package/dist/agent-summary.d.ts.map +1 -1
- package/dist/agent-summary.js +32 -2
- package/dist/agent-summary.js.map +1 -1
- package/dist/as-built.d.ts +6 -0
- package/dist/as-built.d.ts.map +1 -1
- package/dist/as-built.js +7 -0
- package/dist/as-built.js.map +1 -1
- package/dist/author.d.ts +13 -3
- package/dist/author.d.ts.map +1 -1
- package/dist/author.js +267 -30
- package/dist/author.js.map +1 -1
- package/dist/ci-init.d.ts.map +1 -1
- package/dist/ci-init.js +17 -12
- package/dist/ci-init.js.map +1 -1
- package/dist/cli.js +74 -15
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +11 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +13 -0
- package/dist/config.js.map +1 -1
- package/dist/crash-report.d.ts +58 -0
- package/dist/crash-report.d.ts.map +1 -0
- package/dist/crash-report.js +115 -0
- package/dist/crash-report.js.map +1 -0
- package/dist/decide.js +1 -1
- package/dist/decide.js.map +1 -1
- package/dist/decider-review.d.ts +33 -5
- package/dist/decider-review.d.ts.map +1 -1
- package/dist/decider-review.js +55 -9
- package/dist/decider-review.js.map +1 -1
- package/dist/decision-ledger.d.ts +44 -1
- package/dist/decision-ledger.d.ts.map +1 -1
- package/dist/decision-ledger.js +46 -1
- package/dist/decision-ledger.js.map +1 -1
- package/dist/decision-view.d.ts +10 -1
- package/dist/decision-view.d.ts.map +1 -1
- package/dist/decision-view.js +41 -0
- package/dist/decision-view.js.map +1 -1
- package/dist/manifest.d.ts +29 -1
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +236 -11
- package/dist/manifest.js.map +1 -1
- package/dist/permits.d.ts +135 -0
- package/dist/permits.d.ts.map +1 -0
- package/dist/permits.js +397 -0
- package/dist/permits.js.map +1 -0
- package/dist/publish.d.ts +35 -0
- package/dist/publish.d.ts.map +1 -1
- package/dist/publish.js +149 -16
- package/dist/publish.js.map +1 -1
- package/dist/run-program.d.ts +53 -2
- package/dist/run-program.d.ts.map +1 -1
- package/dist/run-program.js +539 -56
- package/dist/run-program.js.map +1 -1
- package/dist/whole-program-review.d.ts +4 -0
- package/dist/whole-program-review.d.ts.map +1 -1
- package/dist/whole-program-review.js +9 -1
- package/dist/whole-program-review.js.map +1 -1
- package/package.json +2 -2
- package/dist/verify-allowlist.d.ts +0 -23
- package/dist/verify-allowlist.d.ts.map +0 -1
- package/dist/verify-allowlist.js +0 -46
- package/dist/verify-allowlist.js.map +0 -1
package/dist/agent-runner.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
|
+
import { randomBytes } from "node:crypto";
|
|
3
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
4
|
+
import { join } from "node:path";
|
|
2
5
|
import crossSpawn from "cross-spawn";
|
|
3
6
|
// In-memory output is kept to a bounded tail; full output belongs in the
|
|
4
7
|
// per-workstream log via onOutput streaming.
|
|
@@ -47,7 +50,10 @@ export function runProcess(command, args, options) {
|
|
|
47
50
|
};
|
|
48
51
|
child.stdout.setEncoding("utf8");
|
|
49
52
|
child.stderr.setEncoding("utf8");
|
|
50
|
-
child.stdout.on("data",
|
|
53
|
+
child.stdout.on("data", (chunk) => {
|
|
54
|
+
push(chunk);
|
|
55
|
+
options.onStdout?.(chunk);
|
|
56
|
+
});
|
|
51
57
|
child.stderr.on("data", push);
|
|
52
58
|
child.on("error", rejectPromise);
|
|
53
59
|
let inputError;
|
|
@@ -65,36 +71,388 @@ export function runProcess(command, args, options) {
|
|
|
65
71
|
child.stdin.end();
|
|
66
72
|
});
|
|
67
73
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
74
|
+
/**
|
|
75
|
+
* True when the derived argv asked Claude for stream-json output — either
|
|
76
|
+
* the separate-token shape `src/permits.ts`'s derivation appends
|
|
77
|
+
* (`--output-format stream-json`), or an operator-authored `--output-format=
|
|
78
|
+
* stream-json` single token, which the derivation leaves untouched and
|
|
79
|
+
* WS-02's spec requires the demultiplexer observe naturally rather than
|
|
80
|
+
* silently leaving unobserved. Detected on the pre-prompt args, not the
|
|
81
|
+
* prompt text, so a prompt that happens to contain the same words never
|
|
82
|
+
* trips it.
|
|
83
|
+
*/
|
|
84
|
+
function claudeStreamJsonRequested(args) {
|
|
85
|
+
const idx = args.indexOf("--output-format");
|
|
86
|
+
if (idx !== -1 && args[idx + 1] === "stream-json")
|
|
87
|
+
return true;
|
|
88
|
+
return args.some((arg) => arg === "--output-format=stream-json");
|
|
89
|
+
}
|
|
90
|
+
/** The reason the demultiplexer records when a denial event carries none of
|
|
91
|
+
* its own — the CLI's `result.permission_denials` entries name the tool and
|
|
92
|
+
* its input but not why (the why lives in the error `tool_result` the model
|
|
93
|
+
* saw, which is preferred when it can be correlated by `tool_use_id`). */
|
|
94
|
+
const DEFAULT_DENIAL_REASON = "denied by permission mode";
|
|
95
|
+
/** A denial shape flexible enough for either the result event's
|
|
96
|
+
* `permission_denials` entries or a `permission_denied`-shaped system
|
|
97
|
+
* message — both are read the same way. */
|
|
98
|
+
function parseDenial(raw) {
|
|
99
|
+
if (raw === null || typeof raw !== "object")
|
|
100
|
+
return undefined;
|
|
101
|
+
const record = raw;
|
|
102
|
+
const toolInput = record.tool_input !== null && typeof record.tool_input === "object"
|
|
103
|
+
? record.tool_input
|
|
104
|
+
: undefined;
|
|
105
|
+
const command = typeof record.command === "string"
|
|
106
|
+
? record.command
|
|
107
|
+
: typeof toolInput?.command === "string"
|
|
108
|
+
? toolInput.command
|
|
109
|
+
: undefined;
|
|
110
|
+
if (command === undefined)
|
|
111
|
+
return undefined;
|
|
112
|
+
const explicitReason = typeof record.reason === "string"
|
|
113
|
+
? record.reason
|
|
114
|
+
: typeof record.message === "string"
|
|
115
|
+
? record.message
|
|
116
|
+
: undefined;
|
|
117
|
+
const tool = typeof record.tool_name === "string"
|
|
118
|
+
? record.tool_name
|
|
119
|
+
: typeof record.tool === "string"
|
|
120
|
+
? record.tool
|
|
121
|
+
: undefined;
|
|
122
|
+
const toolUseId = typeof record.tool_use_id === "string" ? record.tool_use_id : undefined;
|
|
123
|
+
return {
|
|
124
|
+
command,
|
|
125
|
+
reason: explicitReason ?? DEFAULT_DENIAL_REASON,
|
|
126
|
+
reasoned: explicitReason !== undefined,
|
|
127
|
+
...(tool === undefined ? {} : { tool }),
|
|
128
|
+
...(toolUseId === undefined ? {} : { toolUseId }),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* The first sentence of an error `tool_result`'s text — the real CLI's
|
|
133
|
+
* denial reads "Permission to use Bash has been denied because Claude Code
|
|
134
|
+
* is running in don't ask mode. IMPORTANT: You *may* attempt..." and only the
|
|
135
|
+
* first sentence is the reason; the rest is guidance addressed to the model.
|
|
136
|
+
*/
|
|
137
|
+
function firstSentence(text) {
|
|
138
|
+
const trimmed = text.trim();
|
|
139
|
+
const match = /^(.*?[.!?])(?:\s|$)/su.exec(trimmed);
|
|
140
|
+
return (match?.[1] ?? trimmed).trim();
|
|
141
|
+
}
|
|
142
|
+
/** The text of a `tool_result` block, whether the CLI sent it as a string or
|
|
143
|
+
* as content blocks. */
|
|
144
|
+
function toolResultText(block) {
|
|
145
|
+
if (typeof block.content === "string")
|
|
146
|
+
return block.content;
|
|
147
|
+
if (Array.isArray(block.content)) {
|
|
148
|
+
const texts = block.content
|
|
149
|
+
.filter((part) => part?.type === "text" && typeof part.text === "string")
|
|
150
|
+
.map((part) => part.text);
|
|
151
|
+
return texts.length === 0 ? undefined : texts.join("\n");
|
|
152
|
+
}
|
|
153
|
+
return undefined;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Demultiplexes a Claude `--output-format stream-json` NDJSON stream,
|
|
157
|
+
* incrementally as chunks arrive — never from `runProcess`'s bounded 200 KB
|
|
158
|
+
* tail, which would keep the trailing `result` event while silently
|
|
159
|
+
* dropping the earlier `tool_use` commands this transcript exists to record.
|
|
160
|
+
* Only the first non-empty line decides whether the stream is NDJSON at all;
|
|
161
|
+
* a later line that fails to parse is skipped rather than invalidating what
|
|
162
|
+
* was already collected.
|
|
163
|
+
*
|
|
164
|
+
* A `tool_use` block is a *request*; it becomes an executed command only if
|
|
165
|
+
* no denial retracts it. The CLI names the refused request by `tool_use_id`
|
|
166
|
+
* in `result.permission_denials`, so that is the primary correlation; a
|
|
167
|
+
* denial without an id (a `permission_denied`-shaped system event) retracts
|
|
168
|
+
* the earliest still-unretracted request with the same command text. The
|
|
169
|
+
* transcript's `commands` list therefore means "ran", never "asked to run" —
|
|
170
|
+
* a denied command appears under `denials` only.
|
|
171
|
+
*/
|
|
172
|
+
function createClaudeStreamJsonDemultiplexer() {
|
|
173
|
+
let carry = "";
|
|
174
|
+
let firstLineSeen = false;
|
|
175
|
+
let isNdjson = true;
|
|
176
|
+
let corrupted = false;
|
|
177
|
+
const requests = [];
|
|
178
|
+
const denials = [];
|
|
179
|
+
/** Error `tool_result` text by `tool_use_id` — the CLI's own wording of a refusal. */
|
|
180
|
+
const errorResults = new Map();
|
|
181
|
+
let resultText;
|
|
182
|
+
let assistantText = "";
|
|
183
|
+
function routeEvent(event) {
|
|
184
|
+
if (event === null || typeof event !== "object")
|
|
185
|
+
return;
|
|
186
|
+
const record = event;
|
|
187
|
+
if (record.type === "assistant") {
|
|
188
|
+
const content = record.message?.content;
|
|
189
|
+
if (Array.isArray(content)) {
|
|
190
|
+
for (const block of content) {
|
|
191
|
+
if (block?.type === "tool_use" && block.name === "Bash") {
|
|
192
|
+
const input = block.input;
|
|
193
|
+
const command = typeof input?.command === "string" ? input.command : undefined;
|
|
194
|
+
if (command !== undefined) {
|
|
195
|
+
const description = typeof input?.description === "string" ? input.description : undefined;
|
|
196
|
+
const toolUseId = typeof block.id === "string" ? block.id : undefined;
|
|
197
|
+
requests.push({
|
|
198
|
+
command,
|
|
199
|
+
...(description === undefined ? {} : { description }),
|
|
200
|
+
...(toolUseId === undefined ? {} : { toolUseId }),
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
else if (block?.type === "text" && typeof block.text === "string") {
|
|
205
|
+
assistantText += (assistantText === "" ? "" : "\n\n") + block.text;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
if (record.type === "user") {
|
|
212
|
+
const content = record.message?.content;
|
|
213
|
+
if (Array.isArray(content)) {
|
|
214
|
+
for (const block of content) {
|
|
215
|
+
if (block?.type === "tool_result" && block.is_error === true && typeof block.tool_use_id === "string") {
|
|
216
|
+
const text = toolResultText(block);
|
|
217
|
+
if (text !== undefined)
|
|
218
|
+
errorResults.set(block.tool_use_id, text);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
if (record.type === "system") {
|
|
225
|
+
if (record.subtype === "permission_denied") {
|
|
226
|
+
const denial = parseDenial(record);
|
|
227
|
+
if (denial)
|
|
228
|
+
denials.push(denial);
|
|
229
|
+
}
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
if (record.type === "result") {
|
|
233
|
+
if (typeof record.result === "string")
|
|
234
|
+
resultText = record.result;
|
|
235
|
+
if (Array.isArray(record.permission_denials)) {
|
|
236
|
+
for (const raw of record.permission_denials) {
|
|
237
|
+
const denial = parseDenial(raw);
|
|
238
|
+
if (denial)
|
|
239
|
+
denials.push(denial);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/** Retracts denied requests from the executed list and fills in each
|
|
245
|
+
* denial's reason from the CLI's error tool_result when the event itself
|
|
246
|
+
* carried none. */
|
|
247
|
+
function reconcile() {
|
|
248
|
+
const retracted = new Set();
|
|
249
|
+
const finalDenials = [];
|
|
250
|
+
for (const denial of denials) {
|
|
251
|
+
let index = -1;
|
|
252
|
+
if (denial.toolUseId !== undefined) {
|
|
253
|
+
index = requests.findIndex((request) => request.toolUseId === denial.toolUseId);
|
|
254
|
+
}
|
|
255
|
+
if (index === -1) {
|
|
256
|
+
index = requests.findIndex((request, i) => !retracted.has(i) && request.command === denial.command);
|
|
257
|
+
}
|
|
258
|
+
if (index !== -1)
|
|
259
|
+
retracted.add(index);
|
|
260
|
+
const errorText = denial.toolUseId === undefined ? undefined : errorResults.get(denial.toolUseId);
|
|
261
|
+
const reason = !denial.reasoned && errorText !== undefined ? firstSentence(errorText) : denial.reason;
|
|
262
|
+
finalDenials.push({
|
|
263
|
+
command: denial.command,
|
|
264
|
+
reason,
|
|
265
|
+
...(denial.tool === undefined ? {} : { tool: denial.tool }),
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
const commands = requests
|
|
269
|
+
.filter((_request, i) => !retracted.has(i))
|
|
270
|
+
.map(({ command, description }) => description === undefined ? { command } : { command, description });
|
|
271
|
+
return { commands, denials: finalDenials };
|
|
272
|
+
}
|
|
273
|
+
function consumeLine(rawLine) {
|
|
274
|
+
const line = rawLine.trim();
|
|
275
|
+
if (line === "")
|
|
276
|
+
return;
|
|
277
|
+
if (!firstLineSeen) {
|
|
278
|
+
firstLineSeen = true;
|
|
279
|
+
try {
|
|
280
|
+
routeEvent(JSON.parse(line));
|
|
281
|
+
}
|
|
282
|
+
catch {
|
|
283
|
+
isNdjson = false;
|
|
284
|
+
}
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
if (!isNdjson)
|
|
288
|
+
return;
|
|
289
|
+
try {
|
|
290
|
+
routeEvent(JSON.parse(line));
|
|
291
|
+
}
|
|
292
|
+
catch {
|
|
293
|
+
// A corrupt line mid-stream is skipped, fail-open — it does not
|
|
294
|
+
// invalidate the events already collected. But the skipped line could
|
|
295
|
+
// itself have been a `tool_use` or a denial, so this is recorded as
|
|
296
|
+
// `corrupted` rather than silently dropped: `observed: true` must
|
|
297
|
+
// never claim a transcript is complete when a line was lost.
|
|
298
|
+
corrupted = true;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
return {
|
|
302
|
+
feed(chunk) {
|
|
303
|
+
if (firstLineSeen && !isNdjson)
|
|
304
|
+
return;
|
|
305
|
+
carry += chunk;
|
|
306
|
+
let newline;
|
|
307
|
+
while ((newline = carry.indexOf("\n")) !== -1) {
|
|
308
|
+
const line = carry.slice(0, newline);
|
|
309
|
+
carry = carry.slice(newline + 1);
|
|
310
|
+
consumeLine(line);
|
|
311
|
+
if (firstLineSeen && !isNdjson)
|
|
312
|
+
return;
|
|
313
|
+
}
|
|
314
|
+
},
|
|
315
|
+
finish() {
|
|
316
|
+
if (!(firstLineSeen && !isNdjson) && carry !== "")
|
|
317
|
+
consumeLine(carry);
|
|
318
|
+
carry = "";
|
|
319
|
+
if (!firstLineSeen || !isNdjson)
|
|
320
|
+
return undefined;
|
|
321
|
+
const { commands, denials: finalDenials } = reconcile();
|
|
322
|
+
return {
|
|
323
|
+
output: resultText ?? assistantText,
|
|
324
|
+
transcript: {
|
|
325
|
+
observed: true,
|
|
326
|
+
commands,
|
|
327
|
+
denials: finalDenials,
|
|
328
|
+
...(corrupted ? { corrupted: true } : {}),
|
|
329
|
+
},
|
|
330
|
+
};
|
|
331
|
+
},
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Demultiplexes a whole captured stream-json string in one call — what
|
|
336
|
+
* fixture-replay tests exercise. `undefined` means the input did not parse as
|
|
337
|
+
* NDJSON at all (the raw-text fallback applies).
|
|
338
|
+
*/
|
|
339
|
+
export function demultiplexClaudeStreamJson(raw) {
|
|
340
|
+
const demux = createClaudeStreamJsonDemultiplexer();
|
|
341
|
+
demux.feed(raw);
|
|
342
|
+
return demux.finish();
|
|
343
|
+
}
|
|
344
|
+
export const defaultAgentRunner = async (invocation) => {
|
|
345
|
+
const finalArgs = invocation.promptMode === "argument"
|
|
346
|
+
? [...invocation.args, invocation.prompt]
|
|
347
|
+
: invocation.args;
|
|
348
|
+
const demux = claudeStreamJsonRequested(invocation.args)
|
|
349
|
+
? createClaudeStreamJsonDemultiplexer()
|
|
350
|
+
: undefined;
|
|
351
|
+
const result = await runProcess(invocation.command, finalArgs, {
|
|
352
|
+
cwd: invocation.cwd,
|
|
353
|
+
// Never a shell: agent args are structured argv from the config, and
|
|
354
|
+
// a shell would re-parse them — on Windows cmd.exe word-splits any
|
|
355
|
+
// argument containing a space (this crashed every claude spawn whose
|
|
356
|
+
// --allowedTools grant mirrored a multi-word verify command) and
|
|
357
|
+
// mangles multiline prompt arguments. cross-spawn inside runProcess
|
|
358
|
+
// handles the .cmd shims the Windows shell used to be needed for.
|
|
359
|
+
shell: false,
|
|
360
|
+
env: sanitizedEnvironment(),
|
|
361
|
+
...(invocation.onOutput ? { onOutput: invocation.onOutput } : {}),
|
|
362
|
+
// Stdout-only: stderr can carry plain-text CLI warnings ahead of or
|
|
363
|
+
// interleaved with the NDJSON stream, and feeding those into the line
|
|
364
|
+
// parser would corrupt or invalidate a stream that is, on stdout alone,
|
|
365
|
+
// perfectly well-formed.
|
|
366
|
+
onStdout: (chunk) => demux?.feed(chunk),
|
|
367
|
+
...(invocation.promptMode === "stdin"
|
|
368
|
+
? { input: invocation.prompt }
|
|
369
|
+
: {}),
|
|
370
|
+
});
|
|
371
|
+
if (!demux)
|
|
372
|
+
return result;
|
|
373
|
+
const demultiplexed = demux.finish();
|
|
374
|
+
if (demultiplexed === undefined) {
|
|
375
|
+
// Not NDJSON at all (an older CLI ignored the flag, or the process
|
|
376
|
+
// crashed before its first event) — the raw tail stays `output` exactly
|
|
377
|
+
// as it works today; `observed: false` distinguishes this from a spawn
|
|
378
|
+
// this module never asked to be observed in the first place.
|
|
379
|
+
return { ...result, transcript: { observed: false, commands: [], denials: [] } };
|
|
380
|
+
}
|
|
381
|
+
return {
|
|
382
|
+
...result,
|
|
383
|
+
// The reconstructed result/assistant text is preferred; an NDJSON stream
|
|
384
|
+
// that parsed but carried no final text (an error/max_turns subtype)
|
|
385
|
+
// falls back to the raw tail rather than handing the parsers an empty
|
|
386
|
+
// string.
|
|
387
|
+
output: demultiplexed.output !== "" ? demultiplexed.output : result.output,
|
|
388
|
+
transcript: demultiplexed.transcript,
|
|
389
|
+
};
|
|
390
|
+
};
|
|
85
391
|
export const defaultVerifyRunner = (command, cwd) => runProcess(command, [], { cwd, shell: true });
|
|
86
392
|
export function tail(output, limit = 2000) {
|
|
87
393
|
return output.length > limit ? output.slice(-limit) : output;
|
|
88
394
|
}
|
|
89
|
-
/**
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
395
|
+
/** JSONL body: a header line naming role/label, then one line per command and one per denial. */
|
|
396
|
+
async function writeTranscript(sink, role, transcript) {
|
|
397
|
+
const dir = join(sink.root, "build-logs", sink.programId);
|
|
398
|
+
await mkdir(dir, { recursive: true });
|
|
399
|
+
const nonce = randomBytes(4).toString("hex");
|
|
400
|
+
const fileName = `${sink.label}-${nonce}.jsonl`;
|
|
401
|
+
const lines = [
|
|
402
|
+
JSON.stringify({ role, label: sink.label, ...(transcript.corrupted ? { corrupted: true } : {}) }),
|
|
403
|
+
...transcript.commands.map((command) => JSON.stringify({ kind: "command", ...command })),
|
|
404
|
+
...transcript.denials.map((denial) => JSON.stringify({ kind: "denial", ...denial })),
|
|
405
|
+
];
|
|
406
|
+
await writeFile(join(dir, fileName), `${lines.join("\n")}\n`, "utf8");
|
|
407
|
+
return `build-logs/${sink.programId}/${fileName}`;
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Writes a spawn's transcript as JSONL under `build-logs/<programId>/` and
|
|
411
|
+
* logs the path — the one place this happens, shared by `invokeAgent` and
|
|
412
|
+
* the doctor probe (`agent-probe.ts`, which spawns through an already-derived
|
|
413
|
+
* invocation and so cannot go through `invokeAgent` itself). A no-op when the
|
|
414
|
+
* result carries no transcript at all (a non-Claude spawn, an operator-
|
|
415
|
+
* configured or operator-`--output-format` role — never asked to be
|
|
416
|
+
* observed).
|
|
417
|
+
*/
|
|
418
|
+
export async function recordAgentTranscript(observe, role, result) {
|
|
419
|
+
if (!result.transcript)
|
|
420
|
+
return;
|
|
421
|
+
if (result.transcript.observed) {
|
|
422
|
+
const path = await writeTranscript(observe, role, result.transcript);
|
|
423
|
+
observe.log(result.transcript.corrupted
|
|
424
|
+
? `transcript: ${path} (warning: a line mid-stream could not be parsed — ` +
|
|
425
|
+
"this transcript may be missing a command or denial)"
|
|
426
|
+
: `transcript: ${path}`);
|
|
427
|
+
}
|
|
428
|
+
else {
|
|
429
|
+
observe.log(`transcript: ${observe.label}'s stream-json output did not parse as NDJSON — falling back to raw text`);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Spawns a configured agent role with a prompt; shared by every brief
|
|
434
|
+
* spawner. `permits` derives the posture for this role/agent/host before the
|
|
435
|
+
* process ever starts — an operator-authored permission flag in `agent.args`
|
|
436
|
+
* is spawned untouched (WS-01 SC-05); everything else gets the flags
|
|
437
|
+
* `src/permits.ts` derives from the role's fixed posture and the run's
|
|
438
|
+
* containment.
|
|
439
|
+
*
|
|
440
|
+
* `observe`, when given, writes the spawn's transcript (if one was observed)
|
|
441
|
+
* as JSONL under `build-logs/<programId>/` and logs the path — the one place
|
|
442
|
+
* this happens, rather than duplicated across every spawning call site.
|
|
443
|
+
*/
|
|
444
|
+
export async function invokeAgent(runner, agent, prompt, cwd, permits, role, observe) {
|
|
445
|
+
const derived = await permits.derive(role, agent);
|
|
446
|
+
const result = await runner({
|
|
447
|
+
command: derived.agent.command,
|
|
448
|
+
args: derived.agent.args,
|
|
94
449
|
prompt,
|
|
95
|
-
promptMode: agent.promptMode,
|
|
450
|
+
promptMode: derived.agent.promptMode,
|
|
96
451
|
cwd,
|
|
97
452
|
});
|
|
453
|
+
if (observe)
|
|
454
|
+
await recordAgentTranscript(observe, role, result);
|
|
455
|
+
return result;
|
|
98
456
|
}
|
|
99
457
|
/**
|
|
100
458
|
* The implementer: the `agent` block, or the environment fallback for hosts
|
package/dist/agent-runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../src/agent-runner.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent-runner.js","sourceRoot":"","sources":["../src/agent-runner.ts"],"names":[],"mappings":"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"}
|
package/dist/agent-summary.d.ts
CHANGED
|
@@ -5,7 +5,22 @@ export interface AgentSummary {
|
|
|
5
5
|
text: string;
|
|
6
6
|
/** False when no block was found and `text` is a fallback tail. */
|
|
7
7
|
available: boolean;
|
|
8
|
+
/** Denials the agent reported in its summary block. Empty when none. */
|
|
9
|
+
needsPermission: NeedsPermission[];
|
|
8
10
|
}
|
|
11
|
+
export interface NeedsPermission {
|
|
12
|
+
command: string;
|
|
13
|
+
/** The `because:` line that followed, when the agent supplied one. */
|
|
14
|
+
reason?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Pulls `needs-permission:`/`because:` pairs out of a summary block's text,
|
|
18
|
+
* line by line. Deliberately forgiving — a formatting slip must never fail a
|
|
19
|
+
* verified workstream — so a `because:` with no preceding command is dropped
|
|
20
|
+
* and a blank command is skipped, rather than either throwing or misreading
|
|
21
|
+
* the next real pair.
|
|
22
|
+
*/
|
|
23
|
+
export declare function extractNeedsPermission(summaryText: string): NeedsPermission[];
|
|
9
24
|
/**
|
|
10
25
|
* The last summary block in the output. Last rather than first for the same
|
|
11
26
|
* reason {@link extractJson} takes the last json block: an agent that echoes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-summary.d.ts","sourceRoot":"","sources":["../src/agent-summary.ts"],"names":[],"mappings":"AAuCA,+EAA+E;AAC/E,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,MAAM,WAAW,YAAY;IAC3B,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,SAAS,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-summary.d.ts","sourceRoot":"","sources":["../src/agent-summary.ts"],"names":[],"mappings":"AAuCA,+EAA+E;AAC/E,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,MAAM,WAAW,YAAY;IAC3B,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,SAAS,EAAE,OAAO,CAAC;IACnB,wEAAwE;IACxE,eAAe,EAAE,eAAe,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAKD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,GAAG,eAAe,EAAE,CAe7E;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAOjE;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,SAAM,GAAG,YAAY,CAW5E;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,YAAY,GACpB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAOzB;AAED,gFAAgF;AAChF,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,SAAM,GAAG,MAAM,CAKtE"}
|
package/dist/agent-summary.js
CHANGED
|
@@ -38,6 +38,34 @@ Put it last. If you also return a \`\`\`json block, both must be present.
|
|
|
38
38
|
export function summaryContract() {
|
|
39
39
|
return CONTRACT;
|
|
40
40
|
}
|
|
41
|
+
const NEEDS_PERMISSION_LINE = /^\s*needs-permission:\s*(.+)$/iu;
|
|
42
|
+
const BECAUSE_LINE = /^\s*because:\s*(.+)$/iu;
|
|
43
|
+
/**
|
|
44
|
+
* Pulls `needs-permission:`/`because:` pairs out of a summary block's text,
|
|
45
|
+
* line by line. Deliberately forgiving — a formatting slip must never fail a
|
|
46
|
+
* verified workstream — so a `because:` with no preceding command is dropped
|
|
47
|
+
* and a blank command is skipped, rather than either throwing or misreading
|
|
48
|
+
* the next real pair.
|
|
49
|
+
*/
|
|
50
|
+
export function extractNeedsPermission(summaryText) {
|
|
51
|
+
const lines = summaryText.split(/\r?\n/u);
|
|
52
|
+
const results = [];
|
|
53
|
+
for (let i = 0; i < lines.length; i++) {
|
|
54
|
+
const match = NEEDS_PERMISSION_LINE.exec(lines[i] ?? "");
|
|
55
|
+
if (!match)
|
|
56
|
+
continue;
|
|
57
|
+
const command = match[1]?.trim();
|
|
58
|
+
if (command === undefined || command === "")
|
|
59
|
+
continue;
|
|
60
|
+
let j = i + 1;
|
|
61
|
+
while (j < lines.length && (lines[j] ?? "").trim() === "")
|
|
62
|
+
j++;
|
|
63
|
+
const becauseMatch = j < lines.length ? BECAUSE_LINE.exec(lines[j] ?? "") : null;
|
|
64
|
+
const reason = becauseMatch?.[1]?.trim();
|
|
65
|
+
results.push(reason === undefined || reason === "" ? { command } : { command, reason });
|
|
66
|
+
}
|
|
67
|
+
return results;
|
|
68
|
+
}
|
|
41
69
|
/**
|
|
42
70
|
* The last summary block in the output. Last rather than first for the same
|
|
43
71
|
* reason {@link extractJson} takes the last json block: an agent that echoes
|
|
@@ -60,12 +88,14 @@ export function extractSummary(output) {
|
|
|
60
88
|
*/
|
|
61
89
|
export function resolveSummary(output, tailLimit = 600) {
|
|
62
90
|
const text = extractSummary(output);
|
|
63
|
-
if (text !== undefined)
|
|
64
|
-
return { text, available: true };
|
|
91
|
+
if (text !== undefined) {
|
|
92
|
+
return { text, available: true, needsPermission: extractNeedsPermission(text) };
|
|
93
|
+
}
|
|
65
94
|
const fallback = tail(output, tailLimit).trim();
|
|
66
95
|
return {
|
|
67
96
|
text: fallback === "" ? "(no output)" : fallback,
|
|
68
97
|
available: false,
|
|
98
|
+
needsPermission: [],
|
|
69
99
|
};
|
|
70
100
|
}
|
|
71
101
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-summary.js","sourceRoot":"","sources":["../src/agent-summary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,QAAQ,GAAG;;;;;;;;;;;;;CAahB,CAAC,IAAI,EAAE,CAAC;AAET,+EAA+E;AAC/E,MAAM,UAAU,eAAe;IAC7B,OAAO,QAAQ,CAAC;AAClB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-summary.js","sourceRoot":"","sources":["../src/agent-summary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,QAAQ,GAAG;;;;;;;;;;;;;CAahB,CAAC,IAAI,EAAE,CAAC;AAET,+EAA+E;AAC/E,MAAM,UAAU,eAAe;IAC7B,OAAO,QAAQ,CAAC;AAClB,CAAC;AAiBD,MAAM,qBAAqB,GAAG,iCAAiC,CAAC;AAChE,MAAM,YAAY,GAAG,wBAAwB,CAAC;AAE9C;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,WAAmB;IACxD,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAsB,EAAE,CAAC;IACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QACjC,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,EAAE;YAAE,SAAS;QACtD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,CAAC,EAAE,CAAC;QAC/D,MAAM,YAAY,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACjF,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,0CAA0C,CAAC,CAAC,CAAC;IACjF,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QAC9B,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC;IACrD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,SAAS,GAAG,GAAG;IAC5D,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;IAClF,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,OAAO;QACL,IAAI,EAAE,QAAQ,KAAK,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ;QAChD,SAAS,EAAE,KAAK;QAChB,eAAe,EAAE,EAAE;KACpB,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,MAAc,EACd,OAAqB;IAErB,OAAO;QACL,IAAI;QACJ,OAAO,EAAE,OAAO,CAAC,IAAI;QACrB,gBAAgB,EAAE,OAAO,CAAC,SAAS;QACnC,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC;KAC/C,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,WAAW,CAAC,OAAqB,EAAE,KAAK,GAAG,GAAG;IAC5D,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D,MAAM,OAAO,GACX,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB,OAAO,EAAE,CAAC;AACvE,CAAC"}
|
package/dist/as-built.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type AgentRunner } from "./agent-runner.js";
|
|
2
2
|
import type { NightshiftConfig } from "./config.js";
|
|
3
3
|
import { type ProgramManifest } from "./manifest.js";
|
|
4
|
+
import { type PermitsContext } from "./permits.js";
|
|
4
5
|
import { type AsBuiltFs, type WholeProgramReviewOutcome } from "./whole-program-review.js";
|
|
5
6
|
/**
|
|
6
7
|
* Git operations this module needs, kept local rather than declared on the
|
|
@@ -70,6 +71,11 @@ export interface RefreshAsBuiltOptions {
|
|
|
70
71
|
/** Loaded by the caller, exactly as `run` and `author` already do. */
|
|
71
72
|
config: NightshiftConfig;
|
|
72
73
|
agentRunner?: AgentRunner;
|
|
74
|
+
/** Defaults to a real context built from `config` — this is a top-level
|
|
75
|
+
* entry point (the `as-built` command and publish's pre-publish sync
|
|
76
|
+
* both call it directly, with no owner above building one). Tests inject
|
|
77
|
+
* `NOOP_PERMITS_CONTEXT` to avoid a real capability-detection spawn. */
|
|
78
|
+
permits?: PermitsContext;
|
|
73
79
|
git?: AsBuiltGit;
|
|
74
80
|
/** Test seam only; passed straight through to the pass. */
|
|
75
81
|
fs?: AsBuiltFs;
|
package/dist/as-built.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"as-built.d.ts","sourceRoot":"","sources":["../src/as-built.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"as-built.d.ts","sourceRoot":"","sources":["../src/as-built.ts"],"names":[],"mappings":"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"}
|
package/dist/as-built.js
CHANGED
|
@@ -3,6 +3,7 @@ import { resolve } from "node:path";
|
|
|
3
3
|
import { promisify } from "node:util";
|
|
4
4
|
import { defaultAgentRunner, describeAgent, resolveReviewerAgent, } from "./agent-runner.js";
|
|
5
5
|
import { loadManifest } from "./manifest.js";
|
|
6
|
+
import { buildPermitsContext } from "./permits.js";
|
|
6
7
|
import { defaultGitOps } from "./run-program.js";
|
|
7
8
|
import { renderWholeProgramReview, runWholeProgramReview, } from "./whole-program-review.js";
|
|
8
9
|
/**
|
|
@@ -230,18 +231,24 @@ export async function refreshAsBuilt(options) {
|
|
|
230
231
|
const reviewer = reviewerAgent
|
|
231
232
|
? describeAgent(reviewerAgent)
|
|
232
233
|
: "no reviewerAgent is configured";
|
|
234
|
+
// Built only once every refusal above is behind us, so a refused refresh
|
|
235
|
+
// never writes a settings pair it would have no chance to remove.
|
|
236
|
+
const permits = options.permits ?? (await buildPermitsContext({ config: options.config }));
|
|
233
237
|
const outcome = await runWholeProgramReview({
|
|
234
238
|
root,
|
|
235
239
|
programId: options.programId,
|
|
236
240
|
manifest,
|
|
237
241
|
config: options.config,
|
|
238
242
|
agentRunner,
|
|
243
|
+
permits,
|
|
239
244
|
diff,
|
|
240
245
|
baseCommit: resolution.base,
|
|
241
246
|
...(notBuilt.length === 0 ? {} : { notBuilt }),
|
|
242
247
|
...(options.fs === undefined ? {} : { fs: options.fs }),
|
|
243
248
|
log,
|
|
244
249
|
});
|
|
250
|
+
if (options.permits === undefined)
|
|
251
|
+
await permits.dispose?.();
|
|
245
252
|
let commit;
|
|
246
253
|
let leftStaged = [];
|
|
247
254
|
const errors = [];
|