agentfootprint 9.135.1 → 9.137.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 (276) hide show
  1. package/CAPABILITIES.md +3 -0
  2. package/dist/bridge/eventMeta.js +5 -1
  3. package/dist/bridge/eventMeta.js.map +1 -1
  4. package/dist/bridge/eventSourcePosition.js +63 -0
  5. package/dist/bridge/eventSourcePosition.js.map +1 -0
  6. package/dist/core/Agent.js +53 -7
  7. package/dist/core/Agent.js.map +1 -1
  8. package/dist/core/agent/AgentBuilder.js +11 -2
  9. package/dist/core/agent/AgentBuilder.js.map +1 -1
  10. package/dist/core/agent/act.js +3 -19
  11. package/dist/core/agent/act.js.map +1 -1
  12. package/dist/core/agent/buildAgentChart.js.map +1 -1
  13. package/dist/core/agent/middleware/ledger.js +1 -1
  14. package/dist/core/agent/middleware/messagePhase.js +24 -0
  15. package/dist/core/agent/middleware/messagePhase.js.map +1 -0
  16. package/dist/core/agent/stages/callLLM.js +7 -2
  17. package/dist/core/agent/stages/callLLM.js.map +1 -1
  18. package/dist/core/agent/stages/outputAdmission.js +14 -0
  19. package/dist/core/agent/stages/outputAdmission.js.map +1 -0
  20. package/dist/core/agent/stages/prepareFinal.js +43 -21
  21. package/dist/core/agent/stages/prepareFinal.js.map +1 -1
  22. package/dist/core/agent/stages/reliabilityExecution.js +28 -7
  23. package/dist/core/agent/stages/reliabilityExecution.js.map +1 -1
  24. package/dist/core/agent/stages/seed.js +8 -10
  25. package/dist/core/agent/stages/seed.js.map +1 -1
  26. package/dist/core/agent/stages/toolCalls.js +63 -42
  27. package/dist/core/agent/stages/toolCalls.js.map +1 -1
  28. package/dist/core/agent/toolArgsValidation.js +35 -11
  29. package/dist/core/agent/toolArgsValidation.js.map +1 -1
  30. package/dist/core/agent/toolDispatch.js +8 -2
  31. package/dist/core/agent/toolDispatch.js.map +1 -1
  32. package/dist/core/agent/toolSecurityEvents.js +23 -0
  33. package/dist/core/agent/toolSecurityEvents.js.map +1 -0
  34. package/dist/core/codeRunnerTool.js +1 -0
  35. package/dist/core/codeRunnerTool.js.map +1 -1
  36. package/dist/core/conversation.js +21 -6
  37. package/dist/core/conversation.js.map +1 -1
  38. package/dist/esm/bridge/eventMeta.d.ts +5 -1
  39. package/dist/esm/bridge/eventMeta.js +5 -1
  40. package/dist/esm/bridge/eventMeta.js.map +1 -1
  41. package/dist/esm/bridge/eventSourcePosition.d.ts +10 -0
  42. package/dist/esm/bridge/eventSourcePosition.js +59 -0
  43. package/dist/esm/bridge/eventSourcePosition.js.map +1 -0
  44. package/dist/esm/core/Agent.d.ts +15 -3
  45. package/dist/esm/core/Agent.js +53 -7
  46. package/dist/esm/core/Agent.js.map +1 -1
  47. package/dist/esm/core/agent/AgentBuilder.d.ts +11 -2
  48. package/dist/esm/core/agent/AgentBuilder.js +11 -2
  49. package/dist/esm/core/agent/AgentBuilder.js.map +1 -1
  50. package/dist/esm/core/agent/act.d.ts +5 -2
  51. package/dist/esm/core/agent/act.js +3 -19
  52. package/dist/esm/core/agent/act.js.map +1 -1
  53. package/dist/esm/core/agent/buildAgentChart.d.ts +2 -0
  54. package/dist/esm/core/agent/buildAgentChart.js.map +1 -1
  55. package/dist/esm/core/agent/middleware/ledger.d.ts +1 -1
  56. package/dist/esm/core/agent/middleware/ledger.js +1 -1
  57. package/dist/esm/core/agent/middleware/messagePhase.d.ts +5 -0
  58. package/dist/esm/core/agent/middleware/messagePhase.js +19 -0
  59. package/dist/esm/core/agent/middleware/messagePhase.js.map +1 -0
  60. package/dist/esm/core/agent/stages/callLLM.d.ts +3 -1
  61. package/dist/esm/core/agent/stages/callLLM.js +7 -2
  62. package/dist/esm/core/agent/stages/callLLM.js.map +1 -1
  63. package/dist/esm/core/agent/stages/outputAdmission.d.ts +6 -0
  64. package/dist/esm/core/agent/stages/outputAdmission.js +10 -0
  65. package/dist/esm/core/agent/stages/outputAdmission.js.map +1 -0
  66. package/dist/esm/core/agent/stages/prepareFinal.d.ts +5 -44
  67. package/dist/esm/core/agent/stages/prepareFinal.js +42 -20
  68. package/dist/esm/core/agent/stages/prepareFinal.js.map +1 -1
  69. package/dist/esm/core/agent/stages/reliabilityExecution.d.ts +8 -1
  70. package/dist/esm/core/agent/stages/reliabilityExecution.js +28 -7
  71. package/dist/esm/core/agent/stages/reliabilityExecution.js.map +1 -1
  72. package/dist/esm/core/agent/stages/seed.js +8 -10
  73. package/dist/esm/core/agent/stages/seed.js.map +1 -1
  74. package/dist/esm/core/agent/stages/toolCalls.js +63 -42
  75. package/dist/esm/core/agent/stages/toolCalls.js.map +1 -1
  76. package/dist/esm/core/agent/toolArgsValidation.d.ts +9 -5
  77. package/dist/esm/core/agent/toolArgsValidation.js +35 -11
  78. package/dist/esm/core/agent/toolArgsValidation.js.map +1 -1
  79. package/dist/esm/core/agent/toolDispatch.d.ts +3 -2
  80. package/dist/esm/core/agent/toolDispatch.js +8 -2
  81. package/dist/esm/core/agent/toolDispatch.js.map +1 -1
  82. package/dist/esm/core/agent/toolSecurityEvents.d.ts +18 -0
  83. package/dist/esm/core/agent/toolSecurityEvents.js +19 -0
  84. package/dist/esm/core/agent/toolSecurityEvents.js.map +1 -0
  85. package/dist/esm/core/codeRunnerTool.js +1 -0
  86. package/dist/esm/core/codeRunnerTool.js.map +1 -1
  87. package/dist/esm/core/conversation.d.ts +16 -1
  88. package/dist/esm/core/conversation.js +20 -5
  89. package/dist/esm/core/conversation.js.map +1 -1
  90. package/dist/esm/events/payloads.d.ts +22 -11
  91. package/dist/esm/events/types.d.ts +32 -2
  92. package/dist/esm/index.d.ts +1 -1
  93. package/dist/esm/index.js.map +1 -1
  94. package/dist/esm/lib/context-bisect/localize.d.ts +8 -1
  95. package/dist/esm/lib/context-bisect/localize.js +29 -6
  96. package/dist/esm/lib/context-bisect/localize.js.map +1 -1
  97. package/dist/esm/lib/context-bisect/loop-recall.js +3 -2
  98. package/dist/esm/lib/context-bisect/loop-recall.js.map +1 -1
  99. package/dist/esm/lib/context-bisect/sliceToBacktrackTrace.js +12 -9
  100. package/dist/esm/lib/context-bisect/sliceToBacktrackTrace.js.map +1 -1
  101. package/dist/esm/lib/context-bisect/trajectory.d.ts +11 -1
  102. package/dist/esm/lib/context-bisect/trajectory.js +34 -19
  103. package/dist/esm/lib/context-bisect/trajectory.js.map +1 -1
  104. package/dist/esm/lib/context-bisect/types.d.ts +9 -1
  105. package/dist/esm/lib/context-bisect/types.js.map +1 -1
  106. package/dist/esm/lib/context-bisect/variable-recall.js +0 -0
  107. package/dist/esm/lib/context-bisect/variable-recall.js.map +1 -1
  108. package/dist/esm/lib/context-ledger/contextLedger.d.ts +6 -0
  109. package/dist/esm/lib/context-ledger/contextLedger.js +45 -14
  110. package/dist/esm/lib/context-ledger/contextLedger.js.map +1 -1
  111. package/dist/esm/lib/context-ledger/types.d.ts +10 -0
  112. package/dist/esm/lib/injection-engine/skillToolDescriptors.js +1 -0
  113. package/dist/esm/lib/injection-engine/skillToolDescriptors.js.map +1 -1
  114. package/dist/esm/lib/mcp/mcpServe.js +11 -4
  115. package/dist/esm/lib/mcp/mcpServe.js.map +1 -1
  116. package/dist/esm/lib/trace-toolpack/debugPrompt.d.ts +1 -1
  117. package/dist/esm/lib/trace-toolpack/debugPrompt.js +1 -0
  118. package/dist/esm/lib/trace-toolpack/debugPrompt.js.map +1 -1
  119. package/dist/esm/lib/trace-toolpack/innerDescent.d.ts +58 -0
  120. package/dist/esm/lib/trace-toolpack/innerDescent.js +68 -0
  121. package/dist/esm/lib/trace-toolpack/innerDescent.js.map +1 -0
  122. package/dist/esm/lib/trace-toolpack/subflowRecords.d.ts +55 -0
  123. package/dist/esm/lib/trace-toolpack/subflowRecords.js +124 -0
  124. package/dist/esm/lib/trace-toolpack/subflowRecords.js.map +1 -0
  125. package/dist/esm/lib/trace-toolpack/traceToolNames.d.ts +1 -1
  126. package/dist/esm/lib/trace-toolpack/traceToolNames.js +1 -0
  127. package/dist/esm/lib/trace-toolpack/traceToolNames.js.map +1 -1
  128. package/dist/esm/lib/trace-toolpack/traceToolpack.d.ts +1 -0
  129. package/dist/esm/lib/trace-toolpack/traceToolpack.js +351 -90
  130. package/dist/esm/lib/trace-toolpack/traceToolpack.js.map +1 -1
  131. package/dist/esm/lib/trust-boundaries/capture.d.ts +6 -0
  132. package/dist/esm/lib/trust-boundaries/capture.js +161 -0
  133. package/dist/esm/lib/trust-boundaries/capture.js.map +1 -0
  134. package/dist/esm/lib/trust-boundaries/index.d.ts +2 -0
  135. package/dist/esm/lib/trust-boundaries/index.js +2 -0
  136. package/dist/esm/lib/trust-boundaries/index.js.map +1 -0
  137. package/dist/esm/lib/trust-boundaries/project.d.ts +13 -0
  138. package/dist/esm/lib/trust-boundaries/project.js +170 -0
  139. package/dist/esm/lib/trust-boundaries/project.js.map +1 -0
  140. package/dist/esm/lib/trust-boundaries/types.d.ts +81 -0
  141. package/dist/esm/lib/trust-boundaries/types.js +2 -0
  142. package/dist/esm/lib/trust-boundaries/types.js.map +1 -0
  143. package/dist/esm/observe.d.ts +1 -0
  144. package/dist/esm/observe.js +3 -0
  145. package/dist/esm/observe.js.map +1 -1
  146. package/dist/esm/recorders/core/EmitBridge.js +7 -1
  147. package/dist/esm/recorders/core/EmitBridge.js.map +1 -1
  148. package/dist/esm/recorders/observability/recordRun.d.ts +29 -4
  149. package/dist/esm/recorders/observability/recordRun.js +144 -70
  150. package/dist/esm/recorders/observability/recordRun.js.map +1 -1
  151. package/dist/esm/recorders/observability/recordingEnvelope.js +5 -3
  152. package/dist/esm/recorders/observability/recordingEnvelope.js.map +1 -1
  153. package/dist/index.js.map +1 -1
  154. package/dist/lib/context-bisect/localize.js +28 -5
  155. package/dist/lib/context-bisect/localize.js.map +1 -1
  156. package/dist/lib/context-bisect/loop-recall.js +3 -2
  157. package/dist/lib/context-bisect/loop-recall.js.map +1 -1
  158. package/dist/lib/context-bisect/sliceToBacktrackTrace.js +12 -9
  159. package/dist/lib/context-bisect/sliceToBacktrackTrace.js.map +1 -1
  160. package/dist/lib/context-bisect/trajectory.js +33 -18
  161. package/dist/lib/context-bisect/trajectory.js.map +1 -1
  162. package/dist/lib/context-bisect/types.js.map +1 -1
  163. package/dist/lib/context-bisect/variable-recall.js +0 -0
  164. package/dist/lib/context-bisect/variable-recall.js.map +1 -1
  165. package/dist/lib/context-ledger/contextLedger.js +44 -13
  166. package/dist/lib/context-ledger/contextLedger.js.map +1 -1
  167. package/dist/lib/injection-engine/skillToolDescriptors.js +1 -0
  168. package/dist/lib/injection-engine/skillToolDescriptors.js.map +1 -1
  169. package/dist/lib/mcp/mcpServe.js +11 -4
  170. package/dist/lib/mcp/mcpServe.js.map +1 -1
  171. package/dist/lib/trace-toolpack/debugPrompt.js +1 -0
  172. package/dist/lib/trace-toolpack/debugPrompt.js.map +1 -1
  173. package/dist/lib/trace-toolpack/innerDescent.js +74 -0
  174. package/dist/lib/trace-toolpack/innerDescent.js.map +1 -0
  175. package/dist/lib/trace-toolpack/subflowRecords.js +134 -0
  176. package/dist/lib/trace-toolpack/subflowRecords.js.map +1 -0
  177. package/dist/lib/trace-toolpack/traceToolNames.js +1 -0
  178. package/dist/lib/trace-toolpack/traceToolNames.js.map +1 -1
  179. package/dist/lib/trace-toolpack/traceToolpack.js +350 -89
  180. package/dist/lib/trace-toolpack/traceToolpack.js.map +1 -1
  181. package/dist/lib/trust-boundaries/capture.js +165 -0
  182. package/dist/lib/trust-boundaries/capture.js.map +1 -0
  183. package/dist/lib/trust-boundaries/index.js +6 -0
  184. package/dist/lib/trust-boundaries/index.js.map +1 -0
  185. package/dist/lib/trust-boundaries/project.js +174 -0
  186. package/dist/lib/trust-boundaries/project.js.map +1 -0
  187. package/dist/lib/trust-boundaries/types.js +3 -0
  188. package/dist/lib/trust-boundaries/types.js.map +1 -0
  189. package/dist/observe.js +17 -13
  190. package/dist/observe.js.map +1 -1
  191. package/dist/recorders/core/EmitBridge.js +7 -1
  192. package/dist/recorders/core/EmitBridge.js.map +1 -1
  193. package/dist/recorders/observability/recordRun.js +144 -70
  194. package/dist/recorders/observability/recordRun.js.map +1 -1
  195. package/dist/recorders/observability/recordingEnvelope.js +5 -3
  196. package/dist/recorders/observability/recordingEnvelope.js.map +1 -1
  197. package/dist/types/bridge/eventMeta.d.ts +5 -1
  198. package/dist/types/bridge/eventMeta.d.ts.map +1 -1
  199. package/dist/types/bridge/eventSourcePosition.d.ts +11 -0
  200. package/dist/types/bridge/eventSourcePosition.d.ts.map +1 -0
  201. package/dist/types/core/Agent.d.ts +15 -3
  202. package/dist/types/core/Agent.d.ts.map +1 -1
  203. package/dist/types/core/agent/AgentBuilder.d.ts +11 -2
  204. package/dist/types/core/agent/AgentBuilder.d.ts.map +1 -1
  205. package/dist/types/core/agent/act.d.ts +5 -2
  206. package/dist/types/core/agent/act.d.ts.map +1 -1
  207. package/dist/types/core/agent/buildAgentChart.d.ts +2 -0
  208. package/dist/types/core/agent/buildAgentChart.d.ts.map +1 -1
  209. package/dist/types/core/agent/middleware/ledger.d.ts +1 -1
  210. package/dist/types/core/agent/middleware/messagePhase.d.ts +6 -0
  211. package/dist/types/core/agent/middleware/messagePhase.d.ts.map +1 -0
  212. package/dist/types/core/agent/stages/callLLM.d.ts +3 -1
  213. package/dist/types/core/agent/stages/callLLM.d.ts.map +1 -1
  214. package/dist/types/core/agent/stages/outputAdmission.d.ts +7 -0
  215. package/dist/types/core/agent/stages/outputAdmission.d.ts.map +1 -0
  216. package/dist/types/core/agent/stages/prepareFinal.d.ts +5 -44
  217. package/dist/types/core/agent/stages/prepareFinal.d.ts.map +1 -1
  218. package/dist/types/core/agent/stages/reliabilityExecution.d.ts +8 -1
  219. package/dist/types/core/agent/stages/reliabilityExecution.d.ts.map +1 -1
  220. package/dist/types/core/agent/stages/seed.d.ts.map +1 -1
  221. package/dist/types/core/agent/stages/toolCalls.d.ts.map +1 -1
  222. package/dist/types/core/agent/toolArgsValidation.d.ts +9 -5
  223. package/dist/types/core/agent/toolArgsValidation.d.ts.map +1 -1
  224. package/dist/types/core/agent/toolDispatch.d.ts +3 -2
  225. package/dist/types/core/agent/toolDispatch.d.ts.map +1 -1
  226. package/dist/types/core/agent/toolSecurityEvents.d.ts +19 -0
  227. package/dist/types/core/agent/toolSecurityEvents.d.ts.map +1 -0
  228. package/dist/types/core/codeRunnerTool.d.ts.map +1 -1
  229. package/dist/types/core/conversation.d.ts +16 -1
  230. package/dist/types/core/conversation.d.ts.map +1 -1
  231. package/dist/types/events/payloads.d.ts +22 -11
  232. package/dist/types/events/payloads.d.ts.map +1 -1
  233. package/dist/types/events/types.d.ts +32 -2
  234. package/dist/types/events/types.d.ts.map +1 -1
  235. package/dist/types/index.d.ts +1 -1
  236. package/dist/types/index.d.ts.map +1 -1
  237. package/dist/types/lib/context-bisect/localize.d.ts +8 -1
  238. package/dist/types/lib/context-bisect/localize.d.ts.map +1 -1
  239. package/dist/types/lib/context-bisect/loop-recall.d.ts.map +1 -1
  240. package/dist/types/lib/context-bisect/sliceToBacktrackTrace.d.ts.map +1 -1
  241. package/dist/types/lib/context-bisect/trajectory.d.ts +11 -1
  242. package/dist/types/lib/context-bisect/trajectory.d.ts.map +1 -1
  243. package/dist/types/lib/context-bisect/types.d.ts +9 -1
  244. package/dist/types/lib/context-bisect/types.d.ts.map +1 -1
  245. package/dist/types/lib/context-bisect/variable-recall.d.ts.map +1 -1
  246. package/dist/types/lib/context-ledger/contextLedger.d.ts +6 -0
  247. package/dist/types/lib/context-ledger/contextLedger.d.ts.map +1 -1
  248. package/dist/types/lib/context-ledger/types.d.ts +10 -0
  249. package/dist/types/lib/context-ledger/types.d.ts.map +1 -1
  250. package/dist/types/lib/injection-engine/skillToolDescriptors.d.ts.map +1 -1
  251. package/dist/types/lib/mcp/mcpServe.d.ts.map +1 -1
  252. package/dist/types/lib/trace-toolpack/debugPrompt.d.ts +1 -1
  253. package/dist/types/lib/trace-toolpack/debugPrompt.d.ts.map +1 -1
  254. package/dist/types/lib/trace-toolpack/innerDescent.d.ts +59 -0
  255. package/dist/types/lib/trace-toolpack/innerDescent.d.ts.map +1 -0
  256. package/dist/types/lib/trace-toolpack/subflowRecords.d.ts +56 -0
  257. package/dist/types/lib/trace-toolpack/subflowRecords.d.ts.map +1 -0
  258. package/dist/types/lib/trace-toolpack/traceToolNames.d.ts +1 -1
  259. package/dist/types/lib/trace-toolpack/traceToolNames.d.ts.map +1 -1
  260. package/dist/types/lib/trace-toolpack/traceToolpack.d.ts +1 -0
  261. package/dist/types/lib/trace-toolpack/traceToolpack.d.ts.map +1 -1
  262. package/dist/types/lib/trust-boundaries/capture.d.ts +7 -0
  263. package/dist/types/lib/trust-boundaries/capture.d.ts.map +1 -0
  264. package/dist/types/lib/trust-boundaries/index.d.ts +3 -0
  265. package/dist/types/lib/trust-boundaries/index.d.ts.map +1 -0
  266. package/dist/types/lib/trust-boundaries/project.d.ts +14 -0
  267. package/dist/types/lib/trust-boundaries/project.d.ts.map +1 -0
  268. package/dist/types/lib/trust-boundaries/types.d.ts +82 -0
  269. package/dist/types/lib/trust-boundaries/types.d.ts.map +1 -0
  270. package/dist/types/observe.d.ts +1 -0
  271. package/dist/types/observe.d.ts.map +1 -1
  272. package/dist/types/recorders/core/EmitBridge.d.ts.map +1 -1
  273. package/dist/types/recorders/observability/recordRun.d.ts +29 -4
  274. package/dist/types/recorders/observability/recordRun.d.ts.map +1 -1
  275. package/dist/types/recorders/observability/recordingEnvelope.d.ts.map +1 -1
  276. package/package.json +3 -3
package/CAPABILITIES.md CHANGED
@@ -20,6 +20,9 @@ not in this table, search `src/index.ts` for the nearest noun before writing cod
20
20
 
21
21
  | If you are about to build… | It is | Where | Since |
22
22
  |---|---|---|---|
23
+ | observing selected middleware, permission and credential facts at runtime with bounded content-minimized metadata, explicit loss counters and optional source positions; never inferring approval, redaction or complete coverage from silence | `trustBoundaryRecorder` + `TrustBoundaryRecorder` | `src/lib/trust-boundaries/` | 9.137.0 |
24
+ | keeping a queued event's emission time and supplied engine log coordinates, without guessing a root index or confusing agent and engine run identities; absent when the engine supplies no usable position | `EventSourcePosition` + `projectEventSourcePosition` | `src/bridge/eventSourcePosition.ts` | 9.137.0 |
25
+ | identifying which same-name tool call a permission check or credential event describes — captured at dispatch, including resume and inner pull failures; qualify with run identity, missing fields stay unknown | `ToolCallEventIdentity` + `bindToolSecurityEvents` | `src/core/agent/toolSecurityEvents.ts` | 9.137.0 |
23
26
  | guiding an evidence repair to ask for missing context without inventing values | `recoveryInstruction` + `EvidenceRecoveryContext` | `src/core/agent/evidence/` | 9.96.0 |
24
27
  | checking a typed final answer against scoped evidence before streaming or memory delivery — optional host-authored checks with enforce/observe modes, canonical JSON and bounded read-only artifacts | `answerValidation` + `AnswerValidationError` | `src/answer-validation/` | 9.95.0 |
25
28
  | turning a written operational procedure (a runbook, a triage playbook) into ONE agent tool whose every answer is EVIDENCE — coverage folded up from the inner tools it calls, rule name+version, verdict rows with GENERATED meanings, and the recorded walk as an artifact ticket, never bytes | `runbookAsTool` — dials: `procedure` (factory, invoked per call with `ctx.tools`) + `resultKind` (`'verdict/*'` arms the rowset projection; anything else ships spine + the chart's `report`) + `rules {name, version}` (default absent ⇒ `rule_version: 'undeclared'`) + `verdicts {decider, maxRows}` (default 50; `verdict_meanings` = statically declared branches + this run's rule labels + the DEFAULT branch's label, which reaches evidence only when the chart calls `decide(s, rules, {branch, label})` — fp ≥9.16.1, the default is chosen by NO rule so nothing else can name it, and inside a generated fan-out branch the static walk is blind too; an undeclared or blank label stays ABSENT from the map, never invented from a branch id, and there is deliberately NO caller-supplied meanings map) + `presentation` (`'prose'` default = ship `table` + `VERDICT_RENDER_NOTE` "output it VERBATIM"; `'panel'` = the HOST renders the rowset, so NO `table` key at all + `PANEL_RENDER_NOTE` "the rows are already on the reader's screen — do not reproduce them"; the rowset half is byte-identical across modes, `table` stays RESERVED in both, an unknown value THROWS at definition) + `walk {cap, recording}` (cap default 500; over-cap ⇒ control-flow projection, declared · `recording: true` or `{label, maxBytes}`, default OFF — ALSO files the inner chart's own `{snapshot, events, structure}` under `recording/run` and puts its ref on the spine as `walk.recording_ref`, because the ROW projection cannot be drawn; snapshot read from the REDACTED mirror so one `redact` means the same for both; over `maxBytes` (`DEFAULT_RECORDING_MAX_BYTES` = 5,000,000) it is REFUSED not truncated; every absence — no store / over size / unserializable / store threw — is STATED in `walk.recording_note`, and the four `recording_*` fields are absent entirely when the dial is off) + `composedOf` (drift-checked at agent BUILD) + kept `recorders`/`keepRecord`/`keepRecordLimit`/`redact`; reserved state keys `verdicts`/`coverage`/`report` (the `report` bag lands BESIDE the spine, never over it — a report field spelling `af_coverage`/`af_provenance`/`rule_version`/`walk`/`report_note` or a live projection key is discarded and NAMED in `result.report_note`; precedence is explicit in `report.ts`, never spread order); inner `absent()` passes through VERBATIM unless the call said `allowAbsent`; walk kind `recording/chart-walk` + `walk_segment` discriminant | `src/core/runbook/` | 9.76.0, recording 9.79.0 |
@@ -19,7 +19,8 @@ const trace_1 = require("footprintjs/trace");
19
19
  * gracefully to 'unknown#0'.
20
20
  */
21
21
  function buildEventMeta(origin, run) {
22
- const now = Date.now();
22
+ const stageOrigin = origin;
23
+ const now = stageOrigin?.timestamp ?? Date.now();
23
24
  const runtimeStageId = origin?.runtimeStageId ?? 'unknown#0';
24
25
  // Normalize subflowPath across the 3 shapes footprintjs uses:
25
26
  // - undefined (RecorderContext: derive from runtimeStageId)
@@ -34,6 +35,9 @@ function buildEventMeta(origin, run) {
34
35
  return {
35
36
  wallClockMs: now,
36
37
  runOffsetMs: now - run.runStartMs,
38
+ ...(stageOrigin?.sourcePosition !== undefined && {
39
+ sourcePosition: stageOrigin.sourcePosition,
40
+ }),
37
41
  runtimeStageId,
38
42
  subflowPath,
39
43
  compositionPath: run.compositionPath,
@@ -1 +1 @@
1
- {"version":3,"file":"eventMeta.js","sourceRoot":"","sources":["../../src/bridge/eventMeta.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAGH,6CAAwD;AAkDxD;;;;;;;GAOG;AACH,SAAgB,cAAc,CAC5B,MAAkD,EAClD,GAAe;IAEf,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,cAAc,GAAG,MAAM,EAAE,cAAc,IAAI,WAAW,CAAC;IAC7D,8DAA8D;IAC9D,8DAA8D;IAC9D,mDAAmD;IACnD,kDAAkD;IAClD,MAAM,GAAG,GAAI,MAAkC,EAAE,WAAW,CAAC;IAC7D,MAAM,WAAW,GAAsB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QACvD,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ;YACzB,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC;YACvB,CAAC,CAAC,gBAAgB,CAAC,IAAA,2BAAmB,EAAC,cAAc,CAAC,CAAC,WAAW,CAAC,CAAC;IACtE,OAAO;QACL,WAAW,EAAE,GAAG;QAChB,WAAW,EAAE,GAAG,GAAG,GAAG,CAAC,UAAU;QACjC,cAAc;QACd,WAAW;QACX,eAAe,EAAE,GAAG,CAAC,eAAe;QACpC,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,GAAG,CAAC,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;QAC1D,GAAG,CAAC,GAAG,CAAC,aAAa,KAAK,SAAS,IAAI,EAAE,aAAa,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC;QAC5E,GAAG,CAAC,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;QAChE,GAAG,CAAC,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;QAChE,0EAA0E;QAC1E,oEAAoE;QACpE,GAAG,CAAC,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;QAChE,0EAA0E;QAC1E,0EAA0E;QAC1E,oEAAoE;QACpE,GAAG,CAAC,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;QAChE,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;KACxD,CAAC;AACJ,CAAC;AApCD,wCAoCC;AAED;;;;GAIG;AACU,QAAA,qBAAqB,GAAG,gBAAgB,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,SAAgB,iBAAiB,CAC/B,IAAiE,EACjE,GAA4C;IAE5C,MAAM,QAAQ,GAAG,IAAI,EAAE,KAAK,CAAC;IAC7B,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,6BAAqB;QAAE,OAAO,QAAQ,KAAK,GAAG,CAAC,KAAK,CAAC;IAChG,MAAM,WAAW,GAAG,IAAI,EAAE,SAAS,CAAC;IACpC,OAAO,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,GAAG,CAAC,SAAS,CAAC;AACpE,CAAC;AARD,8CAQC;AAED;;;;;;;GAOG;AACH,SAAgB,gBAAgB,CAAC,GAAuB;IACtD,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpD,CAAC;AAHD,4CAGC"}
1
+ {"version":3,"file":"eventMeta.js","sourceRoot":"","sources":["../../src/bridge/eventMeta.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAGH,6CAAwD;AAsDxD;;;;;;;GAOG;AACH,SAAgB,cAAc,CAC5B,MAAkD,EAClD,GAAe;IAEf,MAAM,WAAW,GAA4B,MAAM,CAAC;IACpD,MAAM,GAAG,GAAG,WAAW,EAAE,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IACjD,MAAM,cAAc,GAAG,MAAM,EAAE,cAAc,IAAI,WAAW,CAAC;IAC7D,8DAA8D;IAC9D,8DAA8D;IAC9D,mDAAmD;IACnD,kDAAkD;IAClD,MAAM,GAAG,GAAI,MAAkC,EAAE,WAAW,CAAC;IAC7D,MAAM,WAAW,GAAsB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QACvD,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ;YACzB,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC;YACvB,CAAC,CAAC,gBAAgB,CAAC,IAAA,2BAAmB,EAAC,cAAc,CAAC,CAAC,WAAW,CAAC,CAAC;IACtE,OAAO;QACL,WAAW,EAAE,GAAG;QAChB,WAAW,EAAE,GAAG,GAAG,GAAG,CAAC,UAAU;QACjC,GAAG,CAAC,WAAW,EAAE,cAAc,KAAK,SAAS,IAAI;YAC/C,cAAc,EAAE,WAAW,CAAC,cAAc;SAC3C,CAAC;QACF,cAAc;QACd,WAAW;QACX,eAAe,EAAE,GAAG,CAAC,eAAe;QACpC,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,GAAG,CAAC,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;QAC1D,GAAG,CAAC,GAAG,CAAC,aAAa,KAAK,SAAS,IAAI,EAAE,aAAa,EAAE,GAAG,CAAC,aAAa,EAAE,CAAC;QAC5E,GAAG,CAAC,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;QAChE,GAAG,CAAC,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;QAChE,0EAA0E;QAC1E,oEAAoE;QACpE,GAAG,CAAC,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;QAChE,0EAA0E;QAC1E,0EAA0E;QAC1E,oEAAoE;QACpE,GAAG,CAAC,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;QAChE,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;KACxD,CAAC;AACJ,CAAC;AAxCD,wCAwCC;AAED;;;;GAIG;AACU,QAAA,qBAAqB,GAAG,gBAAgB,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,SAAgB,iBAAiB,CAC/B,IAAiE,EACjE,GAA4C;IAE5C,MAAM,QAAQ,GAAG,IAAI,EAAE,KAAK,CAAC;IAC7B,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,6BAAqB;QAAE,OAAO,QAAQ,KAAK,GAAG,CAAC,KAAK,CAAC;IAChG,MAAM,WAAW,GAAG,IAAI,EAAE,SAAS,CAAC;IACpC,OAAO,WAAW,KAAK,SAAS,IAAI,WAAW,KAAK,GAAG,CAAC,SAAS,CAAC;AACpE,CAAC;AARD,8CAQC;AAED;;;;;;;GAOG;AACH,SAAgB,gBAAgB,CAAC,GAAuB;IACtD,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpD,CAAC;AAHD,4CAGC"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.projectEventSourcePosition = void 0;
4
+ /** Read only an own data property; metadata accessors are not evidence. */
5
+ function ownData(value, key) {
6
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
7
+ return descriptor && 'value' in descriptor ? descriptor.value : undefined;
8
+ }
9
+ function isRecord(value) {
10
+ return typeof value === 'object' && value !== null;
11
+ }
12
+ function isId(value) {
13
+ return typeof value === 'string' && value.length > 0;
14
+ }
15
+ /**
16
+ * Project the optional engine carrier into our public event wire vocabulary.
17
+ * Older or unaddressable emitters supply no coordinates. Invalid metadata is
18
+ * likewise unplaced, never repaired using the current executor or stage name.
19
+ * Only the named data fields cross this boundary, detached from their source.
20
+ *
21
+ * @internal
22
+ */
23
+ function projectEventSourcePosition(event) {
24
+ try {
25
+ const position = ownData(event, 'sourcePosition');
26
+ if (!isRecord(position))
27
+ return undefined;
28
+ const engineRunId = ownData(position, 'runId');
29
+ const logRunId = ownData(position, 'logRunId');
30
+ const path = ownData(position, 'drillPath');
31
+ const committedThroughIdx = ownData(position, 'committedThroughIdx');
32
+ if (!isId(engineRunId) ||
33
+ !isId(logRunId) ||
34
+ !Array.isArray(path) ||
35
+ typeof committedThroughIdx !== 'number' ||
36
+ !Number.isSafeInteger(committedThroughIdx) ||
37
+ committedThroughIdx < -1) {
38
+ return undefined;
39
+ }
40
+ const length = ownData(path, 'length');
41
+ if (typeof length !== 'number' || !Number.isSafeInteger(length) || length < 0)
42
+ return undefined;
43
+ const drillPath = [];
44
+ for (let i = 0; i < length; i++) {
45
+ const mountId = ownData(path, String(i));
46
+ if (!isId(mountId))
47
+ return undefined;
48
+ drillPath.push(mountId);
49
+ }
50
+ return Object.freeze({
51
+ engineRunId,
52
+ logRunId,
53
+ drillPath: Object.freeze(drillPath),
54
+ committedThroughIdx,
55
+ });
56
+ }
57
+ catch {
58
+ // A hostile/revoked metadata proxy cannot turn an observation into a run failure.
59
+ return undefined;
60
+ }
61
+ }
62
+ exports.projectEventSourcePosition = projectEventSourcePosition;
63
+ //# sourceMappingURL=eventSourcePosition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eventSourcePosition.js","sourceRoot":"","sources":["../../src/bridge/eventSourcePosition.ts"],"names":[],"mappings":";;;AAEA,2EAA2E;AAC3E,SAAS,OAAO,CAAC,KAAa,EAAE,GAAgB;IAC9C,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC/D,OAAO,UAAU,IAAI,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAC5E,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;AACrD,CAAC;AAED,SAAS,IAAI,CAAC,KAAc;IAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;AACvD,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,0BAA0B,CAAC,KAAa;IACtD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,OAAO,SAAS,CAAC;QAC1C,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC5C,MAAM,mBAAmB,GAAG,OAAO,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;QACrE,IACE,CAAC,IAAI,CAAC,WAAW,CAAC;YAClB,CAAC,IAAI,CAAC,QAAQ,CAAC;YACf,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YACpB,OAAO,mBAAmB,KAAK,QAAQ;YACvC,CAAC,MAAM,CAAC,aAAa,CAAC,mBAAmB,CAAC;YAC1C,mBAAmB,GAAG,CAAC,CAAC,EACxB,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACvC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;QAChG,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,SAAS,CAAC;YACrC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,WAAW;YACX,QAAQ;YACR,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;YACnC,mBAAmB;SACpB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,kFAAkF;QAClF,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AApCD,gEAoCC"}
@@ -160,6 +160,7 @@ const RunnerBase_js_1 = require("./RunnerBase.js");
160
160
  const validators_js_1 = require("./agent/validators.js");
161
161
  const route_js_1 = require("./agent/stages/route.js");
162
162
  const answerValidation_js_1 = require("./agent/stages/answerValidation.js");
163
+ const messagePhase_js_1 = require("./agent/middleware/messagePhase.js");
163
164
  const answerCoverage_js_1 = require("./agent/stages/answerCoverage.js");
164
165
  const index_js_1 = require("../answer-validation/index.js");
165
166
  const seed_js_1 = require("./agent/stages/seed.js");
@@ -609,6 +610,10 @@ class Agent extends RunnerBase_js_1.RunnerBase {
609
610
  * kept here rather than read back from the recording. Undefined after a run
610
611
  * that failed or paused. */
611
612
  lastRunAnswer;
613
+ /** Whether any run on this instance got past input admission — so a
614
+ * refused FIRST turn is reported as 'never-run', never as "continue from
615
+ * your earlier accepted checkpoint" when there is none. */
616
+ hadAdmittedRun = false;
612
617
  /** The id the CONSUMER chose, or undefined when they took the default.
613
618
  * `this.id` cannot answer that question — it is `'agent'` either way — and
614
619
  * the stored-conversation fingerprint refuses only on ids somebody picked
@@ -1709,6 +1714,7 @@ class Agent extends RunnerBase_js_1.RunnerBase {
1709
1714
  this.fileIntegrityDisposition();
1710
1715
  // Always released: a recording left subscribed would keep listening
1711
1716
  // through the next run and grow a tail nobody reads.
1717
+ this.noteAdmittedRun();
1712
1718
  recording?.stop();
1713
1719
  stopTracking();
1714
1720
  this.inFlightRunId = undefined;
@@ -1759,12 +1765,12 @@ class Agent extends RunnerBase_js_1.RunnerBase {
1759
1765
  // Refuse BEFORE the timing guards, so "there is nothing to follow up on"
1760
1766
  // is never reported as "a run is in flight" for an agent that has simply
1761
1767
  // not run yet.
1762
- if (this.getLastSnapshot() === undefined) {
1768
+ if (this.getLastSnapshot() === undefined || (this.lastInputRefused() && !this.hadAdmittedRun)) {
1763
1769
  throw new conversation_js_1.NoConversationError('Agent.followUp', 'never-run');
1764
1770
  }
1765
1771
  const conversation = this.checkpoint();
1766
1772
  if (conversation === undefined || conversation.history.length === 0) {
1767
- throw new conversation_js_1.NoConversationError('Agent.followUp', 'last-run-unfinished');
1773
+ throw new conversation_js_1.NoConversationError('Agent.followUp', this.lastInputRefused() ? 'last-input-refused' : 'last-run-unfinished');
1768
1774
  }
1769
1775
  return this.run({ message, continueFrom: conversation }, options);
1770
1776
  }
@@ -2179,6 +2185,7 @@ class Agent extends RunnerBase_js_1.RunnerBase {
2179
2185
  // Same terms as the fresh-run path: rows on every exit, before the
2180
2186
  // recording stops (9.60.0).
2181
2187
  this.fileIntegrityDisposition();
2188
+ this.noteAdmittedRun();
2182
2189
  recording?.stop();
2183
2190
  this.inFlightRunId = undefined;
2184
2191
  }
@@ -2223,7 +2230,10 @@ class Agent extends RunnerBase_js_1.RunnerBase {
2223
2230
  * hand it back next turn, and the agent continues where it left off — across
2224
2231
  * a restart, a deploy, or a different machine.
2225
2232
  *
2226
- * Returns `undefined` before any run has completed.
2233
+ * Returns `undefined` before any run has completed or when the latest run
2234
+ * was refused by input middleware. A refused input is not an admitted
2235
+ * conversation. Keep an earlier accepted checkpoint to continue explicitly;
2236
+ * `followUp()` after input denial raises `NoConversationError`.
2227
2237
  *
2228
2238
  * **Read from the run's own recording, not from a second copy.** The history
2229
2239
  * comes from `getLastSnapshot().sharedState.history` — the state the run
@@ -2253,8 +2263,9 @@ class Agent extends RunnerBase_js_1.RunnerBase {
2253
2263
  * const conversation = agent.checkpoint(); // persist anywhere
2254
2264
  * // …a restart later, on a fresh Agent:
2255
2265
  * await agent.run({ message: 'Make it three.', continueFrom: conversation });
2256
- * // `continueFrom` runs the 'input' middleware chain on the new turn; a user
2257
- * // entry appended to `history` by hand and passed to `resumeOnError` skips it.
2266
+ * // `continueFrom` admits the new turn through the 'input' middleware chain.
2267
+ * // `resumeOnError` rechecks originalInput but replays stored history as-is;
2268
+ * // it does not rewrite entries manually appended to that history.
2258
2269
  * ```
2259
2270
  */
2260
2271
  checkpoint() {
@@ -2262,6 +2273,10 @@ class Agent extends RunnerBase_js_1.RunnerBase {
2262
2273
  if (!snapshot)
2263
2274
  return undefined;
2264
2275
  const state = snapshot.sharedState;
2276
+ // Admission is decided by seed, before any conversation state is written.
2277
+ // Do not manufacture a blank replay carrier for an unadmitted attempt.
2278
+ if (this.lastInputRefused())
2279
+ return undefined;
2265
2280
  const recorded = (state?.history ?? []);
2266
2281
  const history = structuredClone(recorded);
2267
2282
  if (this.lastRunAnswer !== undefined && this.lastRunAnswer.length > 0) {
@@ -2300,6 +2315,17 @@ class Agent extends RunnerBase_js_1.RunnerBase {
2300
2315
  ...(turnNumber !== undefined && { turnNumber }),
2301
2316
  };
2302
2317
  }
2318
+ /** Called as each run/resume ends: remember a run that got past input admission. */
2319
+ noteAdmittedRun() {
2320
+ if (this.getLastSnapshot() !== undefined && !this.lastInputRefused()) {
2321
+ this.hadAdmittedRun = true;
2322
+ }
2323
+ }
2324
+ /** Whether input middleware refused the last run's message — the one reading both doors ask. */
2325
+ lastInputRefused() {
2326
+ const state = this.getLastSnapshot()?.sharedState;
2327
+ return state?.messageDeniedPhase === 'input';
2328
+ }
2303
2329
  /** Both checkpoint doors keep the repair budget separately from conversation text. */
2304
2330
  evidenceRecoveryOf(state) {
2305
2331
  if (state?.evidenceRevisionSpent !== true)
@@ -3641,7 +3667,7 @@ class Agent extends RunnerBase_js_1.RunnerBase {
3641
3667
  }
3642
3668
  }
3643
3669
  // Message-boundary refusal (7.18+) — a `messageMiddleware` returned
3644
- // `deny`. The stage wrote the flags and (at 'input') broke the chart. We
3670
+ // `deny`. The stage wrote the flags and stopped delivery. We
3645
3671
  // surface the typed error here, the same way a policy halt is surfaced,
3646
3672
  // because a refusal must never be mistaken for an answer: at 'input' no
3647
3673
  // model was ever asked, and at 'output' the middleware has just declined
@@ -3649,6 +3675,21 @@ class Agent extends RunnerBase_js_1.RunnerBase {
3649
3675
  if (this.messageMiddleware.length > 0) {
3650
3676
  const state = executor.getSnapshot().sharedState;
3651
3677
  if (state.messageDeniedReason !== undefined) {
3678
+ if (state.messageDeniedPhase === 'output') {
3679
+ // The chart stopped cleanly, so ErrorBridge's onRunFailed cannot
3680
+ // close public streams. This API boundary owns the refusal on both
3681
+ // run and resume. Name it as a virtual stage, not a fabricated
3682
+ // engine failure, and never echo policy text into a public stream.
3683
+ this.dispatcher.dispatch({
3684
+ type: 'agentfootprint.error.fatal',
3685
+ payload: {
3686
+ error: 'The output policy withheld this answer.',
3687
+ stage: '__output_admission__',
3688
+ scope: 'run',
3689
+ },
3690
+ meta: (0, eventMeta_js_1.buildEventMeta)({ runtimeStageId: '__output_admission__' }, this.currentRunContext),
3691
+ });
3692
+ }
3652
3693
  throw new errors_js_3.MessageDeniedError({
3653
3694
  reason: state.messageDeniedReason,
3654
3695
  phase: state.messageDeniedPhase ?? 'output',
@@ -3729,6 +3770,7 @@ class Agent extends RunnerBase_js_1.RunnerBase {
3729
3770
  }
3730
3771
  // ─── Chart assembly ────────────────────────────────────────────
3731
3772
  buildChart() {
3773
+ const governsOutput = (0, messagePhase_js_1.hasOutputMiddleware)(this.messageMiddleware);
3732
3774
  const provider = this.provider;
3733
3775
  const model = this.model;
3734
3776
  const temperature = this.temperature;
@@ -4358,7 +4400,10 @@ class Agent extends RunnerBase_js_1.RunnerBase {
4358
4400
  // seam peels `_findings` where the served schema carries it (ruled
4359
4401
  // tools only) — value-conditional, the same grammar.
4360
4402
  ...(argumentSources && { argumentSources: true }),
4361
- ...(this.answerValidationConfig !== undefined && { suppressDraftTokens: true }),
4403
+ ...((this.answerValidationConfig !== undefined || governsOutput) && {
4404
+ suppressDraftTokens: true,
4405
+ }),
4406
+ ...(governsOutput && { withholdDraftContent: true }),
4362
4407
  // Tool choice by classifier (9.105.0): the outcome row after the reply.
4363
4408
  ...(this.toolChoiceOptions !== undefined && { toolChoice: true }),
4364
4409
  // The declared ontology (9.106.0): the piece served from the run
@@ -4909,6 +4954,7 @@ class Agent extends RunnerBase_js_1.RunnerBase {
4909
4954
  ...(this.timeOptions !== undefined && { timeWindows: true }),
4910
4955
  ...(inputsArmed && this.timeOptions !== undefined && { timeLimits: true }),
4911
4956
  ...(this.answerValidationConfig !== undefined && { hasAnswerValidation: true }),
4957
+ ...(governsOutput && { releaseOutputTokens: true }),
4912
4958
  // The out-of-budget wrap-up branch (9.56.0) — the conditional-mount law
4913
4959
  // above, decided once beside the Route decider that routes to it so the
4914
4960
  // two can never disagree about whether the branch exists.