@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.
Files changed (73) hide show
  1. package/README.md +64 -26
  2. package/dist/agent-probe.d.ts +21 -2
  3. package/dist/agent-probe.d.ts.map +1 -1
  4. package/dist/agent-probe.js +76 -22
  5. package/dist/agent-probe.js.map +1 -1
  6. package/dist/agent-runner.d.ts +90 -2
  7. package/dist/agent-runner.d.ts.map +1 -1
  8. package/dist/agent-runner.js +382 -24
  9. package/dist/agent-runner.js.map +1 -1
  10. package/dist/agent-summary.d.ts +15 -0
  11. package/dist/agent-summary.d.ts.map +1 -1
  12. package/dist/agent-summary.js +32 -2
  13. package/dist/agent-summary.js.map +1 -1
  14. package/dist/as-built.d.ts +6 -0
  15. package/dist/as-built.d.ts.map +1 -1
  16. package/dist/as-built.js +7 -0
  17. package/dist/as-built.js.map +1 -1
  18. package/dist/author.d.ts +13 -3
  19. package/dist/author.d.ts.map +1 -1
  20. package/dist/author.js +267 -30
  21. package/dist/author.js.map +1 -1
  22. package/dist/ci-init.d.ts.map +1 -1
  23. package/dist/ci-init.js +17 -12
  24. package/dist/ci-init.js.map +1 -1
  25. package/dist/cli.js +74 -15
  26. package/dist/cli.js.map +1 -1
  27. package/dist/config.d.ts +11 -0
  28. package/dist/config.d.ts.map +1 -1
  29. package/dist/config.js +13 -0
  30. package/dist/config.js.map +1 -1
  31. package/dist/crash-report.d.ts +58 -0
  32. package/dist/crash-report.d.ts.map +1 -0
  33. package/dist/crash-report.js +115 -0
  34. package/dist/crash-report.js.map +1 -0
  35. package/dist/decide.js +1 -1
  36. package/dist/decide.js.map +1 -1
  37. package/dist/decider-review.d.ts +33 -5
  38. package/dist/decider-review.d.ts.map +1 -1
  39. package/dist/decider-review.js +55 -9
  40. package/dist/decider-review.js.map +1 -1
  41. package/dist/decision-ledger.d.ts +44 -1
  42. package/dist/decision-ledger.d.ts.map +1 -1
  43. package/dist/decision-ledger.js +46 -1
  44. package/dist/decision-ledger.js.map +1 -1
  45. package/dist/decision-view.d.ts +10 -1
  46. package/dist/decision-view.d.ts.map +1 -1
  47. package/dist/decision-view.js +41 -0
  48. package/dist/decision-view.js.map +1 -1
  49. package/dist/manifest.d.ts +29 -1
  50. package/dist/manifest.d.ts.map +1 -1
  51. package/dist/manifest.js +236 -11
  52. package/dist/manifest.js.map +1 -1
  53. package/dist/permits.d.ts +135 -0
  54. package/dist/permits.d.ts.map +1 -0
  55. package/dist/permits.js +397 -0
  56. package/dist/permits.js.map +1 -0
  57. package/dist/publish.d.ts +35 -0
  58. package/dist/publish.d.ts.map +1 -1
  59. package/dist/publish.js +149 -16
  60. package/dist/publish.js.map +1 -1
  61. package/dist/run-program.d.ts +53 -2
  62. package/dist/run-program.d.ts.map +1 -1
  63. package/dist/run-program.js +539 -56
  64. package/dist/run-program.js.map +1 -1
  65. package/dist/whole-program-review.d.ts +4 -0
  66. package/dist/whole-program-review.d.ts.map +1 -1
  67. package/dist/whole-program-review.js +9 -1
  68. package/dist/whole-program-review.js.map +1 -1
  69. package/package.json +2 -2
  70. package/dist/verify-allowlist.d.ts +0 -23
  71. package/dist/verify-allowlist.d.ts.map +0 -1
  72. package/dist/verify-allowlist.js +0 -46
  73. package/dist/verify-allowlist.js.map +0 -1
@@ -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", push);
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
- export const defaultAgentRunner = (invocation) => runProcess(invocation.command, invocation.promptMode === "argument"
69
- ? [...invocation.args, invocation.prompt]
70
- : invocation.args, {
71
- cwd: invocation.cwd,
72
- // Never a shell: agent args are structured argv from the config, and
73
- // a shell would re-parse them on Windows cmd.exe word-splits any
74
- // argument containing a space (this crashed every claude spawn whose
75
- // --allowedTools grant mirrored a multi-word verify command) and
76
- // mangles multiline prompt arguments. cross-spawn inside runProcess
77
- // handles the .cmd shims the Windows shell used to be needed for.
78
- shell: false,
79
- env: sanitizedEnvironment(),
80
- ...(invocation.onOutput ? { onOutput: invocation.onOutput } : {}),
81
- ...(invocation.promptMode === "stdin"
82
- ? { input: invocation.prompt }
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
- /** Spawns a configured agent role with a prompt; shared by every brief spawner. */
90
- export async function invokeAgent(runner, agent, prompt, cwd) {
91
- return runner({
92
- command: agent.command,
93
- args: agent.args,
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
@@ -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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"}
@@ -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;CACpB;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,CAQ5E;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"}
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"}
@@ -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;AASD;;;;;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;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACzD,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;KACjB,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"}
1
+ {"version":3,"file":"agent-summary.js","sourceRoot":"","sources":["../src/agent-summary.ts"],"names":[],"mappings":"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"}
@@ -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;
@@ -1 +1 @@
1
- {"version":3,"file":"as-built.d.ts","sourceRoot":"","sources":["../src/as-built.ts"],"names":[],"mappings":"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"}
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;AACnE,OAAO,EAAuB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAExE,OAAO,EAGL,KAAK,SAAS,EAEd,KAAK,yBAAyB,EAC/B,MAAM,2BAA2B,CAAC;AAWnC;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACxD,yEAAyE;IACzE,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChF,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxD;;;;OAIG;IACH,eAAe,CACb,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC/B,iFAAiF;IACjF,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACxE,+EAA+E;IAC/E,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACvE,kFAAkF;IAClF,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC7C;AAMD,eAAO,MAAM,iBAAiB,EAAE,UAwD/B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B;IACE,EAAE,EAAE,IAAI,CAAC;IACT,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC/C,GACD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAAC,KAAK,EAAE;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,UAAU,CAAC;IAChB,QAAQ,EAAE,eAAe,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAmH9B;AAED;;;;GAIG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAI3D;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,MAAM,EAAE,gBAAgB,CAAC;IACzB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;6EAGyE;IACzE,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,2DAA2D;IAC3D,EAAE,CAAC,EAAE,SAAS,CAAC;IACf,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,iEAAiE;IACjE,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,yBAAyB,CAAC;IACnC,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,cAAc,EAAE,MAAM,CAAC;IACvB,2EAA2E;IAC3E,cAAc,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACrD,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,+DAA+D;IAC/D,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,uEAAuE;IACvE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAiBD;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CA2F/B;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,EAAE,CAgD1E"}
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 = [];