@nifrajs/coding-agent 4.0.0 → 5.0.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 (99) hide show
  1. package/README.md +14 -2
  2. package/dist/cli.d.ts +13 -0
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +120 -100
  5. package/dist/cli.js.map +1 -1
  6. package/dist/context.d.ts.map +1 -1
  7. package/dist/context.js +9 -21
  8. package/dist/context.js.map +1 -1
  9. package/dist/diff.d.ts.map +1 -1
  10. package/dist/diff.js +8 -21
  11. package/dist/diff.js.map +1 -1
  12. package/dist/handoffs.d.ts +5 -0
  13. package/dist/handoffs.d.ts.map +1 -1
  14. package/dist/handoffs.js +27 -0
  15. package/dist/handoffs.js.map +1 -1
  16. package/dist/host.d.ts +15 -1
  17. package/dist/host.d.ts.map +1 -1
  18. package/dist/host.js +117 -13
  19. package/dist/host.js.map +1 -1
  20. package/dist/index.d.ts +1 -1
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +1 -1
  23. package/dist/index.js.map +1 -1
  24. package/dist/native.d.ts +22 -0
  25. package/dist/native.d.ts.map +1 -1
  26. package/dist/native.js +75 -18
  27. package/dist/native.js.map +1 -1
  28. package/dist/orchestration/dispatch.d.ts +5 -1
  29. package/dist/orchestration/dispatch.d.ts.map +1 -1
  30. package/dist/orchestration/dispatch.js +1 -1
  31. package/dist/orchestration/dispatch.js.map +1 -1
  32. package/dist/orchestration/evidence-store.d.ts.map +1 -1
  33. package/dist/orchestration/evidence-store.js +5 -6
  34. package/dist/orchestration/evidence-store.js.map +1 -1
  35. package/dist/orchestration/host.d.ts +14 -0
  36. package/dist/orchestration/host.d.ts.map +1 -1
  37. package/dist/orchestration/host.js +26 -0
  38. package/dist/orchestration/host.js.map +1 -1
  39. package/dist/orchestration/index.d.ts +1 -1
  40. package/dist/orchestration/index.d.ts.map +1 -1
  41. package/dist/orchestration/index.js.map +1 -1
  42. package/dist/orchestration/recovery.d.ts +5 -1
  43. package/dist/orchestration/recovery.d.ts.map +1 -1
  44. package/dist/orchestration/recovery.js +5 -3
  45. package/dist/orchestration/recovery.js.map +1 -1
  46. package/dist/process.d.ts +22 -1
  47. package/dist/process.d.ts.map +1 -1
  48. package/dist/process.js +63 -1
  49. package/dist/process.js.map +1 -1
  50. package/dist/rpc.d.ts +23 -0
  51. package/dist/rpc.d.ts.map +1 -1
  52. package/dist/rpc.js +204 -46
  53. package/dist/rpc.js.map +1 -1
  54. package/dist/session-migration.d.ts.map +1 -1
  55. package/dist/session-migration.js +30 -6
  56. package/dist/session-migration.js.map +1 -1
  57. package/dist/sessions.d.ts +13 -2
  58. package/dist/sessions.d.ts.map +1 -1
  59. package/dist/sessions.js +104 -24
  60. package/dist/sessions.js.map +1 -1
  61. package/dist/subagents.d.ts.map +1 -1
  62. package/dist/subagents.js +13 -2
  63. package/dist/subagents.js.map +1 -1
  64. package/dist/turn-replay.d.ts +40 -0
  65. package/dist/turn-replay.d.ts.map +1 -0
  66. package/dist/turn-replay.js +136 -0
  67. package/dist/turn-replay.js.map +1 -0
  68. package/dist/ui.js +84 -30
  69. package/dist/ui.js.map +1 -1
  70. package/dist/verification.d.ts +7 -0
  71. package/dist/verification.d.ts.map +1 -1
  72. package/dist/verification.js +66 -63
  73. package/dist/verification.js.map +1 -1
  74. package/dist/workflows.d.ts +5 -0
  75. package/dist/workflows.d.ts.map +1 -1
  76. package/dist/workflows.js +2 -1
  77. package/dist/workflows.js.map +1 -1
  78. package/package.json +6 -6
  79. package/src/cli.ts +125 -93
  80. package/src/context.ts +12 -20
  81. package/src/diff.ts +11 -23
  82. package/src/handoffs.ts +27 -0
  83. package/src/host.ts +134 -12
  84. package/src/index.ts +1 -0
  85. package/src/native.ts +118 -21
  86. package/src/orchestration/dispatch.ts +6 -2
  87. package/src/orchestration/evidence-store.ts +5 -6
  88. package/src/orchestration/host.ts +44 -0
  89. package/src/orchestration/index.ts +1 -0
  90. package/src/orchestration/recovery.ts +14 -8
  91. package/src/process.ts +77 -0
  92. package/src/rpc.ts +261 -49
  93. package/src/session-migration.ts +29 -5
  94. package/src/sessions.ts +115 -29
  95. package/src/subagents.ts +11 -2
  96. package/src/turn-replay.ts +151 -0
  97. package/src/ui.ts +90 -32
  98. package/src/verification.ts +74 -60
  99. package/src/workflows.ts +7 -1
@@ -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": "4.0.0",
3
+ "version": "5.0.0",
4
4
  "description": "Standalone, extensible Nifra coding-agent host and CLI.",
5
5
  "keywords": [
6
6
  "bun",
@@ -70,11 +70,11 @@
70
70
  "access": "public"
71
71
  },
72
72
  "dependencies": {
73
- "@nifrajs/agent": "4.0.0",
74
- "@nifrajs/agent-review": "4.0.0",
75
- "@nifrajs/agent-protocol": "4.0.0",
76
- "@nifrajs/jobs": "4.0.0",
77
- "@nifrajs/pi": "4.0.0"
73
+ "@nifrajs/agent": "5.0.0",
74
+ "@nifrajs/agent-review": "5.0.0",
75
+ "@nifrajs/agent-protocol": "5.0.0",
76
+ "@nifrajs/jobs": "5.0.0",
77
+ "@nifrajs/pi": "5.0.0"
78
78
  },
79
79
  "repository": {
80
80
  "type": "git",
package/src/cli.ts CHANGED
@@ -179,6 +179,35 @@ function parseVerificationNames(value: string): readonly ("check" | "assure" | "
179
179
  return Object.freeze([...new Set(names)] as ("check" | "assure" | "test")[])
180
180
  }
181
181
 
182
+ export interface LineHandlers {
183
+ /** Answers an approval command and returns true; returns false for any other line. */
184
+ readonly answerApproval: (message: string) => Promise<boolean>
185
+ readonly run: (message: string) => Promise<void>
186
+ readonly stopReading: () => void
187
+ }
188
+
189
+ /**
190
+ * Route interactive input. A running turn can be waiting on an approval, so approval commands answer
191
+ * at once; every other line runs in order behind the turn in flight. Reading ends at `/quit`, `/exit`
192
+ * or end of input, and settles once the queued lines have run. The first failure stops reading and
193
+ * is rethrown.
194
+ */
195
+ export async function dispatchLines(
196
+ lines: AsyncIterable<string>,
197
+ handlers: LineHandlers,
198
+ ): Promise<void> {
199
+ let queue: Promise<void> = Promise.resolve()
200
+ for await (const line of lines) {
201
+ const message = line.trim()
202
+ if (message.length === 0) continue
203
+ if (message === "/quit" || message === "/exit") break
204
+ if (await handlers.answerApproval(message)) continue
205
+ queue = queue.then(() => handlers.run(message))
206
+ queue.catch(handlers.stopReading)
207
+ }
208
+ await queue
209
+ }
210
+
182
211
  function printEvent(event: AgentEvent, json: boolean): void {
183
212
  if (json) {
184
213
  console.log(JSON.stringify(event))
@@ -304,102 +333,105 @@ async function main(): Promise<void> {
304
333
  input: process.stdin,
305
334
  output: options.json ? undefined : process.stdout,
306
335
  })
307
- try {
308
- for await (const line of readline) {
309
- const message = line.trim()
310
- if (message.length === 0) continue
311
- if (message === "/quit" || message === "/exit") break
312
- if (message === "/reload") {
313
- const result = await host.reload()
314
- if (options.json) console.log(JSON.stringify({ type: "extension.reloaded", ...result }))
315
- else console.error(`[reload] ${result.rolledBack ? "rolled back" : result.revision}`)
316
- continue
317
- }
318
- if (message === "/compact") {
319
- const result = await host.compact("manual")
320
- if (options.json) console.log(JSON.stringify({ type: "memory.compacted", ...result }))
321
- else console.error(`[memory] compacted ${result.before} -> ${result.after}`)
322
- continue
323
- }
324
- if (message === "/checkpoint") {
325
- await host.checkpoint()
326
- if (options.json) console.log(JSON.stringify({ type: "session.checkpoint", ok: true }))
327
- else console.error("[session] checkpoint saved")
328
- continue
329
- }
330
- const forkCommand = /^\/fork(?:\s+([^\s]+))?$/.exec(message)
331
- if (forkCommand !== null) {
332
- const result = await host.fork(forkCommand[1])
333
- if (options.json) console.log(JSON.stringify({ type: "session.forked", ...result }))
334
- else console.log(`[session] forked ${result.sessionId}`)
335
- continue
336
- }
337
- const historyCommand = /^\/history(?:\s+(\d+))?$/.exec(message)
338
- if (historyCommand !== null) {
339
- const result = await host.history(
340
- historyCommand[1] === undefined ? 20 : Number(historyCommand[1]),
336
+ const run = async (message: string): Promise<void> => {
337
+ if (message === "/reload") {
338
+ const result = await host.reload()
339
+ if (options.json) console.log(JSON.stringify({ type: "extension.reloaded", ...result }))
340
+ else console.error(`[reload] ${result.rolledBack ? "rolled back" : result.revision}`)
341
+ return
342
+ }
343
+ if (message === "/compact") {
344
+ const result = await host.compact("manual")
345
+ if (options.json) console.log(JSON.stringify({ type: "memory.compacted", ...result }))
346
+ else console.error(`[memory] compacted ${result.before} -> ${result.after}`)
347
+ return
348
+ }
349
+ if (message === "/checkpoint") {
350
+ await host.checkpoint()
351
+ if (options.json) console.log(JSON.stringify({ type: "session.checkpoint", ok: true }))
352
+ else console.error("[session] checkpoint saved")
353
+ return
354
+ }
355
+ const forkCommand = /^\/fork(?:\s+([^\s]+))?$/.exec(message)
356
+ if (forkCommand !== null) {
357
+ const result = await host.fork(forkCommand[1])
358
+ if (options.json) console.log(JSON.stringify({ type: "session.forked", ...result }))
359
+ else console.log(`[session] forked ${result.sessionId}`)
360
+ return
361
+ }
362
+ const historyCommand = /^\/history(?:\s+(\d+))?$/.exec(message)
363
+ if (historyCommand !== null) {
364
+ const result = await host.history(
365
+ historyCommand[1] === undefined ? 20 : Number(historyCommand[1]),
366
+ )
367
+ if (options.json) console.log(JSON.stringify({ type: "session.history", entries: result }))
368
+ else for (const entry of result) console.log(`${entry.seq} · ${entry.type}`)
369
+ return
370
+ }
371
+ if (message === "/check") {
372
+ const result = await runNifraVerification("check", { cwd: options.cwd })
373
+ if (options.json) console.log(JSON.stringify({ type: "verification.completed", ...result }))
374
+ else
375
+ console.error(
376
+ `[check] ${result.ok ? "passed" : "failed"}${result.status === null ? "" : ` (exit ${result.status})`}`,
341
377
  )
342
- if (options.json) console.log(JSON.stringify({ type: "session.history", entries: result }))
343
- else for (const entry of result) console.log(`${entry.seq} · ${entry.type}`)
344
- continue
345
- }
346
- if (message === "/check") {
347
- const result = await runNifraVerification("check", { cwd: options.cwd })
348
- if (options.json) console.log(JSON.stringify({ type: "verification.completed", ...result }))
349
- else
350
- console.error(
351
- `[check] ${result.ok ? "passed" : "failed"}${result.status === null ? "" : ` (exit ${result.status})`}`,
352
- )
353
- continue
354
- }
355
- if (message === "/assure") {
356
- const result = await runNifraVerification("assure", { cwd: options.cwd })
357
- if (options.json) console.log(JSON.stringify({ type: "verification.completed", ...result }))
358
- else
359
- console.error(
360
- `[assure] ${result.ok ? "passed" : "failed"}${result.status === null ? "" : ` (exit ${result.status})`}`,
361
- )
362
- continue
363
- }
364
- if (message === "/context") {
365
- const result = await runNifraContext({ cwd: options.cwd })
366
- if (options.json) console.log(JSON.stringify({ type: "context.completed", ...result }))
367
- else console.log(result.output ?? JSON.stringify(result.report ?? result))
368
- continue
369
- }
370
- if (message === "/approvals") {
371
- const result = host.pendingApprovals
372
- if (options.json) console.log(JSON.stringify({ type: "approval.list", pending: result }))
373
- else if (result.length === 0) console.log("No pending approvals")
374
- else
375
- for (const approval of result)
376
- console.log(`${approval.id} · ${approval.capability} · ${approval.action}`)
377
- continue
378
- }
379
- const approvalCommand = /^(\/approve|\/deny)\s+([^\s]+)$/.exec(message)
380
- if (approvalCommand !== null) {
381
- const result = await host.resolveApproval(
382
- approvalCommand[2]!,
383
- approvalCommand[1] === "/approve",
384
- "CLI decision",
378
+ return
379
+ }
380
+ if (message === "/assure") {
381
+ const result = await runNifraVerification("assure", { cwd: options.cwd })
382
+ if (options.json) console.log(JSON.stringify({ type: "verification.completed", ...result }))
383
+ else
384
+ console.error(
385
+ `[assure] ${result.ok ? "passed" : "failed"}${result.status === null ? "" : ` (exit ${result.status})`}`,
386
+ )
387
+ return
388
+ }
389
+ if (message === "/context") {
390
+ const result = await runNifraContext({ cwd: options.cwd })
391
+ if (options.json) console.log(JSON.stringify({ type: "context.completed", ...result }))
392
+ else console.log(result.output ?? JSON.stringify(result.report ?? result))
393
+ return
394
+ }
395
+ await send(message)
396
+ }
397
+
398
+ const answerApproval = async (message: string): Promise<boolean> => {
399
+ if (message === "/approvals") {
400
+ const result = host.pendingApprovals
401
+ if (options.json) console.log(JSON.stringify({ type: "approval.list", pending: result }))
402
+ else if (result.length === 0) console.log("No pending approvals")
403
+ else
404
+ for (const approval of result)
405
+ console.log(`${approval.id} · ${approval.capability} · ${approval.action}`)
406
+ return true
407
+ }
408
+ const approvalCommand = /^(\/approve|\/deny)\s+([^\s]+)$/.exec(message)
409
+ if (approvalCommand !== null) {
410
+ const result = await host.resolveApproval(
411
+ approvalCommand[2]!,
412
+ approvalCommand[1] === "/approve",
413
+ "CLI decision",
414
+ )
415
+ if (options.json)
416
+ console.log(
417
+ JSON.stringify({
418
+ type: "approval.resolved",
419
+ ...(result ?? { error: "approval not found" }),
420
+ }),
421
+ )
422
+ else
423
+ console.log(
424
+ result === undefined
425
+ ? "Approval not found"
426
+ : `${result.approved ? "Approved" : "Denied"} ${result.approvalId}`,
385
427
  )
386
- if (options.json)
387
- console.log(
388
- JSON.stringify({
389
- type: "approval.resolved",
390
- ...(result ?? { error: "approval not found" }),
391
- }),
392
- )
393
- else
394
- console.log(
395
- result === undefined
396
- ? "Approval not found"
397
- : `${result.approved ? "Approved" : "Denied"} ${result.approvalId}`,
398
- )
399
- continue
400
- }
401
- await send(message)
428
+ return true
402
429
  }
430
+ return false
431
+ }
432
+
433
+ try {
434
+ await dispatchLines(readline, { answerApproval, run, stopReading: () => readline.close() })
403
435
  } finally {
404
436
  readline.close()
405
437
  await stop()
package/src/context.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { readBoundedText } from "./process.ts"
1
+ import { runBoundedProcess } from "./process.ts"
2
2
 
3
3
  export interface NifraContextOptions {
4
4
  readonly cwd: string
@@ -18,25 +18,19 @@ export interface NifraContextResult {
18
18
 
19
19
  /** Project discovery kept outside the framework runtime; it is only spawned when an agent asks for it. */
20
20
  export async function runNifraContext(options: NifraContextOptions): Promise<NifraContextResult> {
21
- const proc = Bun.spawn([options.command ?? "nifra", "context"], {
22
- cwd: options.cwd,
23
- stdin: "ignore",
24
- stdout: "pipe",
25
- stderr: "pipe",
26
- env: safeEnv(options.env),
27
- })
28
21
  const timeoutMs = options.timeoutMs ?? 30_000
29
- let timedOut = false
30
- const timer = setTimeout(() => {
31
- timedOut = true
32
- proc.kill()
33
- }, timeoutMs)
34
22
  try {
35
- const [stdout, stderr, status] = await Promise.all([
36
- readBoundedText(proc.stdout, options.maxOutputBytes ?? 1_048_576),
37
- readBoundedText(proc.stderr, options.maxOutputBytes ?? 1_048_576),
38
- proc.exited,
39
- ])
23
+ const maxOutputBytes = options.maxOutputBytes ?? 1_048_576
24
+ const { stdout, stderr, status, timedOut } = await runBoundedProcess(
25
+ [options.command ?? "nifra", "context"],
26
+ {
27
+ cwd: options.cwd,
28
+ env: safeEnv(options.env),
29
+ timeoutMs,
30
+ maxStdoutBytes: maxOutputBytes,
31
+ maxStderrBytes: maxOutputBytes,
32
+ },
33
+ )
40
34
  let report: unknown
41
35
  try {
42
36
  report = JSON.parse(stdout.text)
@@ -56,8 +50,6 @@ export async function runNifraContext(options: NifraContextOptions): Promise<Nif
56
50
  status: null,
57
51
  error: error instanceof Error ? error.message : String(error),
58
52
  }
59
- } finally {
60
- clearTimeout(timer)
61
53
  }
62
54
  }
63
55
 
package/src/diff.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { publicErrorDetails } from "./errors.ts"
2
- import { readBoundedText } from "./process.ts"
2
+ import { runBoundedProcess } from "./process.ts"
3
3
 
4
4
  export interface ProjectDiffOptions {
5
5
  readonly cwd: string
@@ -29,27 +29,17 @@ export async function readProjectDiff(options: ProjectDiffOptions): Promise<Proj
29
29
  maxOutputBytes > 16 * 1024 * 1024
30
30
  )
31
31
  throw new RangeError("project diff: maxOutputBytes is invalid")
32
- const proc = Bun.spawn(
33
- ["git", "--no-pager", "diff", "HEAD", "--no-ext-diff", "--unified=3", "--"],
34
- {
35
- cwd: options.cwd,
36
- stdin: "ignore",
37
- stdout: "pipe",
38
- stderr: "pipe",
39
- env: safeEnv(),
40
- },
41
- )
42
- let timedOut = false
43
- const timer = setTimeout(() => {
44
- timedOut = true
45
- proc.kill()
46
- }, timeoutMs)
47
32
  try {
48
- const [stdout, stderr, status] = await Promise.all([
49
- readBoundedText(proc.stdout, maxOutputBytes),
50
- readBoundedText(proc.stderr, Math.min(maxOutputBytes, 64 * 1024)),
51
- proc.exited,
52
- ])
33
+ const { stdout, stderr, status, timedOut } = await runBoundedProcess(
34
+ ["git", "--no-pager", "diff", "HEAD", "--no-ext-diff", "--unified=3", "--"],
35
+ {
36
+ cwd: options.cwd,
37
+ env: safeEnv(),
38
+ timeoutMs,
39
+ maxStdoutBytes: maxOutputBytes,
40
+ maxStderrBytes: Math.min(maxOutputBytes, 64 * 1024),
41
+ },
42
+ )
53
43
  return {
54
44
  ok: !timedOut && status === 0,
55
45
  status,
@@ -65,8 +55,6 @@ export async function readProjectDiff(options: ProjectDiffOptions): Promise<Proj
65
55
  error: details.message,
66
56
  ...(details.stack === undefined ? {} : { stack: details.stack }),
67
57
  }
68
- } finally {
69
- clearTimeout(timer)
70
58
  }
71
59
  }
72
60
 
package/src/handoffs.ts CHANGED
@@ -93,6 +93,8 @@ export interface HandoffCoordinatorOptions {
93
93
  readonly approvals?: ApprovalManager
94
94
  readonly defaultTtlMs?: number
95
95
  readonly maxPending?: number
96
+ /** Settled boundaries kept for `list`/`inspect`; the oldest go first. Default 256. */
97
+ readonly maxRetained?: number
96
98
  /** Injectable clock (epoch ms). Defaults to {@link Date.now}. */
97
99
  readonly now?: () => number
98
100
  }
@@ -108,12 +110,14 @@ interface HandoffRecord {
108
110
 
109
111
  const DEFAULT_TTL_MS = 5 * 60_000
110
112
  const DEFAULT_MAX_PENDING = 64
113
+ const DEFAULT_MAX_RETAINED = 256
111
114
 
112
115
  export class HandoffCoordinator {
113
116
  private readonly vectors: ChildVectorTracker
114
117
  private readonly approvals: ApprovalManager | undefined
115
118
  private readonly defaultTtlMs: number
116
119
  private readonly maxPending: number
120
+ private readonly maxRetained: number
117
121
  private readonly now: () => number
118
122
  private readonly records = new Map<string, HandoffRecord>()
119
123
 
@@ -122,11 +126,14 @@ export class HandoffCoordinator {
122
126
  this.approvals = options.approvals
123
127
  this.defaultTtlMs = options.defaultTtlMs ?? DEFAULT_TTL_MS
124
128
  this.maxPending = options.maxPending ?? DEFAULT_MAX_PENDING
129
+ this.maxRetained = options.maxRetained ?? DEFAULT_MAX_RETAINED
125
130
  this.now = options.now ?? Date.now
126
131
  if (!Number.isSafeInteger(this.defaultTtlMs) || this.defaultTtlMs < 1)
127
132
  throw new RangeError("handoff: defaultTtlMs must be positive")
128
133
  if (!Number.isSafeInteger(this.maxPending) || this.maxPending < 1)
129
134
  throw new RangeError("handoff: maxPending must be positive")
135
+ if (!Number.isSafeInteger(this.maxRetained) || this.maxRetained < 0)
136
+ throw new RangeError("handoff: maxRetained must be a non-negative integer")
130
137
  }
131
138
 
132
139
  /** Open a pending handoff. Allocates the run's next monotonic child vector. */
@@ -142,6 +149,7 @@ export class HandoffCoordinator {
142
149
  (input.sessionId !== undefined && !SESSION_TOKEN.test(input.sessionId))
143
150
  )
144
151
  throw new HandoffError("invalid_handoff")
152
+ this.sweep()
145
153
  if (this.records.has(input.requestId)) throw new HandoffError("duplicate")
146
154
  if (this.activeCount() >= this.maxPending) throw new HandoffError("invalid_handoff")
147
155
 
@@ -182,6 +190,7 @@ export class HandoffCoordinator {
182
190
 
183
191
  /** Every boundary, or - with `activeOnly` - just those still awaiting a decision. */
184
192
  list(activeOnly = false): readonly HandoffView[] {
193
+ this.sweep()
185
194
  const views: HandoffView[] = []
186
195
  for (const record of this.records.values()) {
187
196
  if (activeOnly && this.isTerminal(record.state)) continue
@@ -192,6 +201,7 @@ export class HandoffCoordinator {
192
201
 
193
202
  /** Inspect one boundary by request id, or `undefined` when unknown. */
194
203
  inspect(requestId: string): HandoffView | undefined {
204
+ this.sweep()
195
205
  const record = this.records.get(requestId)
196
206
  return record === undefined ? undefined : this.view(record)
197
207
  }
@@ -265,6 +275,23 @@ export class HandoffCoordinator {
265
275
  return this.view(record)
266
276
  }
267
277
 
278
+ /** Expire every boundary past its deadline, then drop the oldest settled ones over `maxRetained`. */
279
+ private sweep(): void {
280
+ const now = this.now()
281
+ let settled = 0
282
+ for (const record of this.records.values()) {
283
+ if (!this.isTerminal(record.state) && !coordinateIsFresh(record.coordinate, now))
284
+ this.settle(record, "expired")
285
+ if (this.isTerminal(record.state)) settled++
286
+ }
287
+ for (const [requestId, record] of this.records) {
288
+ if (settled <= this.maxRetained) break
289
+ if (!this.isTerminal(record.state)) continue
290
+ this.records.delete(requestId)
291
+ settled--
292
+ }
293
+ }
294
+
268
295
  private settle(record: HandoffRecord, state: HandoffLifecycleState): void {
269
296
  record.state = state
270
297
  this.settleApproval(record, "expire")