@nifrajs/coding-agent 3.2.0 → 3.5.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 (49) hide show
  1. package/dist/context.js +29 -1
  2. package/dist/context.js.map +1 -1
  3. package/dist/diff.js +38 -2
  4. package/dist/diff.js.map +1 -1
  5. package/dist/host.d.ts.map +1 -1
  6. package/dist/host.js +217 -24
  7. package/dist/host.js.map +1 -1
  8. package/dist/index.d.ts +1 -1
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +1 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/isolated.js +37 -2
  13. package/dist/isolated.js.map +1 -1
  14. package/dist/native.d.ts +17 -0
  15. package/dist/native.d.ts.map +1 -1
  16. package/dist/native.js +265 -41
  17. package/dist/native.js.map +1 -1
  18. package/dist/replay.d.ts +4 -0
  19. package/dist/replay.d.ts.map +1 -1
  20. package/dist/replay.js +189 -24
  21. package/dist/replay.js.map +1 -1
  22. package/dist/rpc.d.ts +10 -0
  23. package/dist/rpc.d.ts.map +1 -1
  24. package/dist/rpc.js +208 -29
  25. package/dist/rpc.js.map +1 -1
  26. package/dist/sessions.d.ts +14 -2
  27. package/dist/sessions.d.ts.map +1 -1
  28. package/dist/sessions.js +253 -59
  29. package/dist/sessions.js.map +1 -1
  30. package/dist/verification.d.ts +23 -0
  31. package/dist/verification.d.ts.map +1 -1
  32. package/dist/verification.js +113 -1
  33. package/dist/verification.js.map +1 -1
  34. package/dist/workflows.d.ts +1 -0
  35. package/dist/workflows.d.ts.map +1 -1
  36. package/dist/workflows.js +43 -21
  37. package/dist/workflows.js.map +1 -1
  38. package/package.json +6 -5
  39. package/src/context.ts +32 -1
  40. package/src/diff.ts +40 -2
  41. package/src/host.ts +219 -24
  42. package/src/index.ts +5 -0
  43. package/src/isolated.ts +39 -2
  44. package/src/native.ts +408 -42
  45. package/src/replay.ts +206 -25
  46. package/src/rpc.ts +261 -33
  47. package/src/sessions.ts +271 -56
  48. package/src/verification.ts +140 -1
  49. package/src/workflows.ts +37 -25
@@ -1 +1 @@
1
- {"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../src/workflows.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../src/workflows.ts"],"names":[],"mappings":"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"}
package/dist/workflows.js CHANGED
@@ -2,6 +2,7 @@ import { publicErrorDetails } from "./errors.js";
2
2
  /** Bounded orchestration primitives. The kernel knows no provider, UI, or framework package. */
3
3
  export class WorkflowRunner {
4
4
  options;
5
+ signal;
5
6
  values = new Map();
6
7
  completed = [];
7
8
  steps = 0;
@@ -11,6 +12,7 @@ export class WorkflowRunner {
11
12
  maxSteps: options.maxSteps ?? 128,
12
13
  maxDepth: options.maxDepth ?? 8,
13
14
  };
15
+ this.signal = options.signal ?? new AbortController().signal;
14
16
  if (!Number.isSafeInteger(this.options.maxSteps) || this.options.maxSteps < 1)
15
17
  throw new RangeError("workflow: maxSteps must be positive");
16
18
  if (!Number.isSafeInteger(this.options.maxDepth) || this.options.maxDepth < 1)
@@ -36,12 +38,12 @@ export class WorkflowRunner {
36
38
  };
37
39
  }
38
40
  }
39
- context() {
41
+ context(depth) {
40
42
  return {
41
- signal: this.options.signal ?? new AbortController().signal,
43
+ signal: this.signal,
42
44
  values: this.values,
43
45
  set: (name, value) => this.values.set(name, value),
44
- run: (step) => this.execute(step, 1),
46
+ run: (step) => this.execute(step, depth + 1),
45
47
  };
46
48
  }
47
49
  async execute(step, depth) {
@@ -53,9 +55,9 @@ export class WorkflowRunner {
53
55
  throw new Error("workflow cancelled");
54
56
  switch (step.type) {
55
57
  case "task":
56
- return this.single(step.id, () => step.run(this.context()));
58
+ return this.single(step.id, () => step.run(this.context(depth)));
57
59
  case "verify": {
58
- const result = await this.single(step.id, () => step.run(this.context()));
60
+ const result = await this.single(step.id, () => step.run(this.context(depth)));
59
61
  const ok = typeof result === "boolean" ? result : isVerificationResult(result) && result.ok;
60
62
  if (!ok)
61
63
  throw new Error(`verification failed: ${step.id}`);
@@ -63,18 +65,18 @@ export class WorkflowRunner {
63
65
  }
64
66
  case "approve": {
65
67
  await this.emit({ type: "approval.required", id: step.id, reason: step.reason });
66
- const approved = await this.single(step.id, () => step.run(this.context()));
68
+ const approved = await this.single(step.id, () => step.run(this.context(depth)));
67
69
  if (approved !== true)
68
70
  throw new Error(`approval denied: ${step.id}`);
69
71
  return approved;
70
72
  }
71
73
  case "checkpoint": {
72
- const result = await this.single(step.id, () => step.run(this.context()));
74
+ const result = await this.single(step.id, () => step.run(this.context(depth)));
73
75
  await this.emit({ type: "checkpoint.created", id: step.id });
74
76
  return result;
75
77
  }
76
78
  case "handoff":
77
- return this.single(step.id, () => step.run(this.context()));
79
+ return this.single(step.id, () => step.run(this.context(depth)));
78
80
  case "sequence": {
79
81
  const results = [];
80
82
  for (const child of step.steps)
@@ -82,11 +84,16 @@ export class WorkflowRunner {
82
84
  return results;
83
85
  }
84
86
  case "parallel":
87
+ if (step.steps.length === 0)
88
+ return [];
85
89
  return this.parallel(step.steps, step.maxConcurrency ?? step.steps.length, depth);
86
90
  case "retry": {
87
91
  const attempts = step.attempts ?? 3;
88
92
  if (!Number.isSafeInteger(attempts) || attempts < 1 || attempts > 16)
89
93
  throw new RangeError("workflow: attempts must be between 1 and 16");
94
+ const backoffMs = step.backoffMs ?? 0;
95
+ if (!Number.isSafeInteger(backoffMs) || backoffMs < 0)
96
+ throw new RangeError("workflow: backoffMs must be a non-negative safe integer");
90
97
  let last;
91
98
  for (let attempt = 0; attempt < attempts; attempt++) {
92
99
  try {
@@ -94,14 +101,14 @@ export class WorkflowRunner {
94
101
  }
95
102
  catch (error) {
96
103
  last = error;
97
- if (attempt + 1 < attempts && (step.backoffMs ?? 0) > 0)
98
- await delay(Math.min(step.backoffMs * (attempt + 1), 10_000), this.options.signal);
104
+ if (attempt + 1 < attempts && backoffMs > 0)
105
+ await delay(Math.min(backoffMs * (attempt + 1), 10_000), this.options.signal);
99
106
  }
100
107
  }
101
108
  throw last instanceof Error ? last : new Error(String(last));
102
109
  }
103
110
  case "branch": {
104
- const selected = await this.single(step.id, () => step.when(this.context()));
111
+ const selected = await this.single(step.id, () => step.when(this.context(depth)));
105
112
  return selected === true
106
113
  ? this.execute(step.then, depth + 1)
107
114
  : step.otherwise === undefined
@@ -151,18 +158,33 @@ export class WorkflowRunner {
151
158
  }
152
159
  async function delay(ms, signal) {
153
160
  await new Promise((resolve, reject) => {
154
- const timer = setTimeout(resolve, ms);
161
+ let settled = false;
162
+ let timer;
163
+ let onAbort;
164
+ const cleanup = () => {
165
+ if (timer !== undefined)
166
+ clearTimeout(timer);
167
+ if (signal !== undefined && onAbort !== undefined)
168
+ signal.removeEventListener("abort", onAbort);
169
+ };
170
+ const settle = (error) => {
171
+ if (settled)
172
+ return;
173
+ settled = true;
174
+ cleanup();
175
+ if (error === undefined)
176
+ resolve();
177
+ else
178
+ reject(error);
179
+ };
180
+ timer = setTimeout(() => settle(), ms);
155
181
  if (signal === undefined)
156
182
  return;
157
- if (signal.aborted) {
158
- clearTimeout(timer);
159
- reject(new Error("workflow cancelled"));
160
- return;
161
- }
162
- signal.addEventListener("abort", () => {
163
- clearTimeout(timer);
164
- reject(new Error("workflow cancelled"));
165
- }, { once: true });
183
+ onAbort = () => settle(new Error("workflow cancelled"));
184
+ signal.addEventListener("abort", onAbort, { once: true });
185
+ // Abort can race listener registration; check again after subscribing.
186
+ if (signal.aborted)
187
+ onAbort();
166
188
  });
167
189
  }
168
190
  function isVerificationResult(value) {
@@ -1 +1 @@
1
- {"version":3,"file":"workflows.js","sourceRoot":"","sources":["../src/workflows.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflows.js","sourceRoot":"","sources":["../src/workflows.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nifrajs/coding-agent",
3
- "version": "3.2.0",
3
+ "version": "3.5.0",
4
4
  "description": "Standalone, extensible Nifra coding-agent host and CLI.",
5
5
  "keywords": [
6
6
  "bun",
@@ -67,10 +67,11 @@
67
67
  "access": "public"
68
68
  },
69
69
  "dependencies": {
70
- "@nifrajs/agent": "3.2.0",
71
- "@nifrajs/agent-protocol": "3.2.0",
72
- "@nifrajs/jobs": "3.2.0",
73
- "@nifrajs/pi": "3.2.0"
70
+ "@nifrajs/agent": "3.5.0",
71
+ "@nifrajs/agent-review": "3.5.0",
72
+ "@nifrajs/agent-protocol": "3.5.0",
73
+ "@nifrajs/jobs": "3.5.0",
74
+ "@nifrajs/pi": "3.5.0"
74
75
  },
75
76
  "repository": {
76
77
  "type": "git",
package/src/context.ts CHANGED
@@ -72,10 +72,41 @@ function safeEnv(
72
72
  "LC_ALL",
73
73
  "TERM",
74
74
  "CI",
75
+ ...(process.platform === "win32"
76
+ ? [
77
+ "SystemRoot",
78
+ "WINDIR",
79
+ "TEMP",
80
+ "TMP",
81
+ "USERPROFILE",
82
+ "LOCALAPPDATA",
83
+ "APPDATA",
84
+ "COMSPEC",
85
+ "PATHEXT",
86
+ "BUN_INSTALL",
87
+ "HOMEDRIVE",
88
+ "HOMEPATH",
89
+ "USERNAME",
90
+ "USERDOMAIN",
91
+ "ProgramData",
92
+ "ProgramFiles",
93
+ "ProgramFiles(x86)",
94
+ ]
95
+ : []),
75
96
  ...Object.keys(overrides ?? {}),
76
97
  ])) {
77
- const value = overrides?.[name] ?? process.env[name]
98
+ const value =
99
+ overrides !== undefined && Object.hasOwn(overrides, name) ? overrides[name] : readEnv(name)
78
100
  if (value !== undefined) result[name] = value
79
101
  }
80
102
  return result
81
103
  }
104
+
105
+ function readEnv(name: string): string | undefined {
106
+ const exact = process.env[name]
107
+ if (exact !== undefined || process.platform !== "win32") return exact
108
+ const key = Object.keys(process.env).find(
109
+ (candidate) => candidate.toLowerCase() === name.toLowerCase(),
110
+ )
111
+ return key === undefined ? undefined : process.env[key]
112
+ }
package/src/diff.ts CHANGED
@@ -72,9 +72,47 @@ export async function readProjectDiff(options: ProjectDiffOptions): Promise<Proj
72
72
 
73
73
  function safeEnv(): Record<string, string> {
74
74
  const result: Record<string, string> = {}
75
- for (const name of ["PATH", "HOME", "LANG", "LC_ALL", "TERM", "GIT_PAGER"]) {
76
- const value = name === "GIT_PAGER" ? "cat" : process.env[name]
75
+ const names = [
76
+ "PATH",
77
+ "HOME",
78
+ "LANG",
79
+ "LC_ALL",
80
+ "TERM",
81
+ "GIT_PAGER",
82
+ ...(process.platform === "win32"
83
+ ? [
84
+ "SystemRoot",
85
+ "WINDIR",
86
+ "TEMP",
87
+ "TMP",
88
+ "USERPROFILE",
89
+ "LOCALAPPDATA",
90
+ "APPDATA",
91
+ "COMSPEC",
92
+ "PATHEXT",
93
+ "BUN_INSTALL",
94
+ "HOMEDRIVE",
95
+ "HOMEPATH",
96
+ "USERNAME",
97
+ "USERDOMAIN",
98
+ "ProgramData",
99
+ "ProgramFiles",
100
+ "ProgramFiles(x86)",
101
+ ]
102
+ : []),
103
+ ]
104
+ for (const name of names) {
105
+ const value = name === "GIT_PAGER" ? "cat" : readEnv(name)
77
106
  if (value !== undefined) result[name] = value
78
107
  }
79
108
  return result
80
109
  }
110
+
111
+ function readEnv(name: string): string | undefined {
112
+ const exact = process.env[name]
113
+ if (exact !== undefined || process.platform !== "win32") return exact
114
+ const key = Object.keys(process.env).find(
115
+ (candidate) => candidate.toLowerCase() === name.toLowerCase(),
116
+ )
117
+ return key === undefined ? undefined : process.env[key]
118
+ }
package/src/host.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  type AgentApprovalRequiredEvent,
3
+ type AgentApprovalResolvedEvent,
3
4
  type AgentBackend,
4
5
  type AgentEvent,
5
6
  type AgentEventPayload,
@@ -7,6 +8,7 @@ import {
7
8
  agentError,
8
9
  type CreateSessionInput,
9
10
  type ForkSessionResult,
11
+ isAgentEvent,
10
12
  type ReloadResult,
11
13
  } from "@nifrajs/agent-protocol"
12
14
  import {
@@ -85,18 +87,33 @@ export class CodingAgentHost {
85
87
 
86
88
  async start(input: CreateSessionInput): Promise<AgentSessionSnapshot> {
87
89
  if (this.session !== undefined) throw new Error("coding agent: a session is already active")
88
- this.session = await this.backend.createSession(input)
89
- let history: readonly import("./sessions.ts").SessionLogEntry[] = []
90
- if (input.sessionId !== undefined && this.sessionStore !== undefined) {
91
- history = await this.sessionStore.read(input.sessionId)
92
- this.context.restore(history.map(sessionEntryToContextRecord))
93
- } else {
90
+ const created = await this.backend.createSession(input)
91
+ this.session = created
92
+ try {
93
+ let history: readonly import("./sessions.ts").SessionLogEntry[] = []
94
+ if (input.sessionId !== undefined && this.sessionStore !== undefined) {
95
+ history = await this.sessionStore.read(input.sessionId)
96
+ this.context.restore(history.map(sessionEntryToContextRecord))
97
+ } else {
98
+ this.context.restore([])
99
+ }
100
+ this.nextSeq = nextSequence(created, history)
101
+ await this.extensions?.reload()
102
+ await this.sessionStore?.append(created.id, "session.started", created)
103
+ return created
104
+ } catch (error) {
105
+ // Session creation may allocate a process or other external resource. If history, extension
106
+ // initialization, or the first persistence write fails, roll the backend session back before
107
+ // exposing the failure; otherwise a retry leaks the live session behind `this.session = undefined`.
108
+ this.session = undefined
94
109
  this.context.restore([])
110
+ this.nextSeq = 0
111
+ await this.backend.cancel(created.id, "session startup failed").catch(() => {})
112
+ await this.backend.close(created.id).catch(() => {})
113
+ await this.extensions?.close().catch(() => {})
114
+ this.approvals.close()
115
+ throw error
95
116
  }
96
- this.nextSeq = nextSequence(this.session, history)
97
- await this.extensions?.reload()
98
- await this.sessionStore?.append(this.session.id, "session.started", this.session)
99
- return this.session
100
117
  }
101
118
 
102
119
  get snapshot(): AgentSessionSnapshot | undefined {
@@ -118,6 +135,12 @@ export class CodingAgentHost {
118
135
  const event = this.acceptBackendEvent(rawEvent)
119
136
  await this.recordEvent(event)
120
137
  yield event
138
+ if (event.type === "session.stopped") return
139
+ if (event.type === "session.failed") {
140
+ if (event.error.code === "BACKEND_PROTOCOL")
141
+ await this.backend.cancel(sessionId, "backend protocol error").catch(() => {})
142
+ return
143
+ }
121
144
  }
122
145
  if (signal?.aborted === true) return
123
146
 
@@ -132,8 +155,15 @@ export class CodingAgentHost {
132
155
 
133
156
  private nextSeq = 0
134
157
 
135
- private acceptBackendEvent(rawEvent: AgentEvent): AgentEvent {
158
+ private acceptBackendEvent(rawEvent: unknown): AgentEvent {
136
159
  const session = this.requireSession()
160
+ if (!isAgentEvent(rawEvent) || rawEvent.sessionId !== session.id) {
161
+ return this.createEvent({
162
+ type: "session.failed",
163
+ error: agentError("BACKEND_PROTOCOL", "backend emitted an invalid agent event"),
164
+ recoverable: false,
165
+ })
166
+ }
137
167
  const event = Object.freeze({
138
168
  ...rawEvent,
139
169
  sessionId: session.id,
@@ -152,6 +182,26 @@ export class CodingAgentHost {
152
182
  this.session = snapshot
153
183
  return Object.freeze({ ...event, snapshot }) as AgentEvent
154
184
  }
185
+ if (event.type === "session.stopped") {
186
+ const { activeTurnId: _activeTurnId, ...withoutActiveTurn } = session
187
+ this.session = Object.freeze({
188
+ ...withoutActiveTurn,
189
+ status: "stopped",
190
+ lastSeq: event.seq,
191
+ updatedAt: event.at,
192
+ })
193
+ return event
194
+ }
195
+ if (event.type === "session.failed") {
196
+ const { activeTurnId: _activeTurnId, ...withoutActiveTurn } = session
197
+ this.session = Object.freeze({
198
+ ...withoutActiveTurn,
199
+ status: "failed",
200
+ lastSeq: event.seq,
201
+ updatedAt: event.at,
202
+ })
203
+ return event
204
+ }
155
205
  this.session = Object.freeze({
156
206
  ...session,
157
207
  lastSeq: event.seq,
@@ -199,18 +249,30 @@ export class CodingAgentHost {
199
249
 
200
250
  private createEvent(payload: AgentEventPayload): AgentEvent {
201
251
  const session = this.requireSession()
202
- const event = Object.freeze({
252
+ const candidate = Object.freeze({
203
253
  version: 1 as const,
204
254
  sessionId: session.id,
205
255
  seq: this.nextSeq++,
206
256
  at: Date.now(),
207
257
  ...payload,
208
258
  }) as AgentEvent
209
- this.session = Object.freeze({
210
- ...session,
211
- lastSeq: event.seq,
212
- updatedAt: event.at,
213
- })
259
+ const event = normalizeHostEvent(candidate)
260
+ if (event === undefined) throw new Error("coding agent: host generated an invalid agent event")
261
+ if (event.type === "session.stopped" || event.type === "session.failed") {
262
+ const { activeTurnId: _activeTurnId, ...withoutActiveTurn } = session
263
+ this.session = Object.freeze({
264
+ ...withoutActiveTurn,
265
+ status: event.type === "session.stopped" ? "stopped" : "failed",
266
+ lastSeq: event.seq,
267
+ updatedAt: event.at,
268
+ })
269
+ } else {
270
+ this.session = Object.freeze({
271
+ ...session,
272
+ lastSeq: event.seq,
273
+ updatedAt: event.at,
274
+ })
275
+ }
214
276
  return event
215
277
  }
216
278
 
@@ -218,7 +280,11 @@ export class CodingAgentHost {
218
280
  const sessionId = this.requireSession().id
219
281
  if (event.type === "approval.required")
220
282
  await this.approvals.observe(event as AgentApprovalRequiredEvent)
221
- await this.sessionStore?.append(sessionId, event.type, event, {
283
+ else if (event.type === "approval.resolved") {
284
+ const resolved = event as AgentApprovalResolvedEvent
285
+ this.approvals.resolve(resolved.approvalId, resolved.approved, resolved.reason)
286
+ }
287
+ await this.sessionStore?.append(sessionId, event.type, eventEvidence(event), {
222
288
  pinned:
223
289
  event.type === "approval.required" ||
224
290
  event.type === "verification.completed" ||
@@ -305,7 +371,7 @@ export class CodingAgentHost {
305
371
  if (this.sessionStore === undefined) return Object.freeze([])
306
372
  if (!Number.isSafeInteger(limit) || limit < 1 || limit > 4096)
307
373
  throw new RangeError("coding agent: history limit must be between 1 and 4096")
308
- const entries = await this.sessionStore.read(this.session.id)
374
+ const entries = await this.sessionStore.read(this.session.id, limit)
309
375
  return Object.freeze(entries.slice(-limit))
310
376
  }
311
377
 
@@ -313,11 +379,16 @@ export class CodingAgentHost {
313
379
  if (this.session === undefined) return
314
380
  const id = this.session.id
315
381
  this.session = undefined
316
- await this.sessionStore?.append(id, "session.stopped", { reason })
317
- await this.backend.cancel(id, reason).catch(() => {})
318
- await this.backend.close(id).catch(() => {})
319
- await this.extensions?.close().catch(() => {})
320
- this.approvals.close()
382
+ try {
383
+ await this.sessionStore?.append(id, "session.stopped", { reason })
384
+ } finally {
385
+ // Persistence is an audit aid, not a prerequisite for releasing the backend. Always clean up
386
+ // the live session even when the store is full, read-only, or temporarily unavailable.
387
+ await this.backend.cancel(id, reason).catch(() => {})
388
+ await this.backend.close(id).catch(() => {})
389
+ await this.extensions?.close().catch(() => {})
390
+ this.approvals.close()
391
+ }
321
392
  }
322
393
 
323
394
  get pendingApprovals(): readonly ApprovalRequest[] {
@@ -389,6 +460,130 @@ function eventText(event: AgentEvent): string {
389
460
  }
390
461
  }
391
462
 
463
+ /** Keep host-owned diagnostics inside the same wire contract as backend events. */
464
+ function normalizeHostEvent(event: unknown): AgentEvent | undefined {
465
+ if (isAgentEvent(event)) return event
466
+ if (event === null || typeof event !== "object" || Array.isArray(event)) return undefined
467
+ const candidate = event as Record<string, unknown>
468
+ if (candidate.type === "verification.completed") {
469
+ // Verification reports are command output. They are useful to the repair prompt, but an
470
+ // arbitrary report must not bypass the protocol's depth/object/string limits on the live stream.
471
+ const { report: _report, ...withoutReport } = candidate
472
+ const fallback = Object.freeze(withoutReport)
473
+ return isAgentEvent(fallback) ? (fallback as AgentEvent) : undefined
474
+ }
475
+ if (candidate.type !== "repair.required") return undefined
476
+
477
+ const source = candidate.task
478
+ if (source === null || typeof source !== "object" || Array.isArray(source)) return undefined
479
+ const taskSource = source as Record<string, unknown>
480
+ const task = Object.freeze({
481
+ id: boundedHostToken(taskSource.id)
482
+ ? taskSource.id
483
+ : `verification-${typeof candidate.seq === "number" ? candidate.seq : "unknown"}`,
484
+ verification:
485
+ taskSource.verification === "check" ||
486
+ taskSource.verification === "assure" ||
487
+ taskSource.verification === "test"
488
+ ? taskSource.verification
489
+ : "check",
490
+ cwd: boundedHostText(taskSource.cwd, 4_096) || ".",
491
+ reason: boundedHostText(taskSource.reason, 256 * 1024) || "verification failed",
492
+ capabilities: Object.freeze(
493
+ (Array.isArray(taskSource.capabilities) ? taskSource.capabilities : []).filter(
494
+ boundedHostToken,
495
+ ),
496
+ ),
497
+ ...(typeof taskSource.output === "string"
498
+ ? { output: boundedHostText(taskSource.output, 256 * 1024) }
499
+ : {}),
500
+ })
501
+ const { task: _task, turnId, ...base } = candidate
502
+ const fallback = Object.freeze({
503
+ ...base,
504
+ ...(boundedHostToken(turnId) ? { turnId } : {}),
505
+ task,
506
+ })
507
+ return isAgentEvent(fallback) ? (fallback as AgentEvent) : undefined
508
+ }
509
+
510
+ function boundedHostText(value: unknown, max: number): string {
511
+ if (typeof value !== "string") return ""
512
+ const clean = value.replaceAll("\0", "")
513
+ return clean.length <= max ? clean : clean.slice(0, max)
514
+ }
515
+
516
+ function boundedHostToken(value: unknown): value is string {
517
+ return typeof value === "string" && /^[A-Za-z0-9._:/-]{1,128}$/.test(value)
518
+ }
519
+
520
+ /** Default session evidence is content-free; live protocol consumers still receive the full event. */
521
+ function eventEvidence(event: AgentEvent): unknown {
522
+ switch (event.type) {
523
+ case "session.started":
524
+ case "session.updated":
525
+ case "session.completed":
526
+ return {
527
+ status: event.snapshot.status,
528
+ lastSeq: event.snapshot.lastSeq,
529
+ activeTurnId: event.snapshot.activeTurnId,
530
+ capabilities: event.snapshot.capabilities,
531
+ }
532
+ case "turn.started":
533
+ return { turnId: event.turnId }
534
+ case "assistant.delta":
535
+ case "assistant.message":
536
+ return { turnId: event.turnId }
537
+ case "tool.started":
538
+ return { turnId: event.turnId, callId: event.callId, name: event.name }
539
+ case "tool.delta":
540
+ return { turnId: event.turnId, callId: event.callId }
541
+ case "tool.completed":
542
+ return {
543
+ turnId: event.turnId,
544
+ callId: event.callId,
545
+ name: event.name,
546
+ ok: event.ok,
547
+ ...(event.error === undefined ? {} : { errorCode: event.error.code }),
548
+ }
549
+ case "approval.required":
550
+ return {
551
+ turnId: event.turnId,
552
+ approvalId: event.approvalId,
553
+ action: event.action,
554
+ capability: event.capability,
555
+ }
556
+ case "approval.resolved":
557
+ return {
558
+ ...(event.turnId === undefined ? {} : { turnId: event.turnId }),
559
+ approvalId: event.approvalId,
560
+ approved: event.approved,
561
+ }
562
+ case "repair.required":
563
+ return {
564
+ ...(event.turnId === undefined ? {} : { turnId: event.turnId }),
565
+ taskId: event.task.id,
566
+ verification: event.task.verification,
567
+ capabilities: event.task.capabilities,
568
+ }
569
+ case "verification.completed":
570
+ return { name: event.name, ok: event.ok }
571
+ case "memory.compacted":
572
+ return { before: event.before, after: event.after, reason: event.reason }
573
+ case "extension.reloaded":
574
+ return {
575
+ revision: event.revision,
576
+ loaded: event.loaded,
577
+ disabled: event.disabled,
578
+ rolledBack: event.rolledBack,
579
+ }
580
+ case "session.failed":
581
+ return { errorCode: event.error.code, recoverable: event.recoverable }
582
+ case "session.stopped":
583
+ return {}
584
+ }
585
+ }
586
+
392
587
  function createRepairPrompt(
393
588
  tasks: readonly VerificationRepairTask[],
394
589
  attempt: number,
package/src/index.ts CHANGED
@@ -150,6 +150,11 @@ export {
150
150
  } from "./ui.ts"
151
151
  export {
152
152
  createVerificationRepairTask,
153
+ isSafeReviewDiff,
154
+ type ReviewExecutionErrorCode,
155
+ type ReviewExecutionResult,
156
+ type ReviewOptions,
157
+ runNifraReview,
153
158
  runNifraVerification,
154
159
  type VerificationOptions,
155
160
  type VerificationRepairTask,