@animalabs/agent-framework 0.21.1 → 0.22.1

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 (348) hide show
  1. package/README.md +54 -4
  2. package/dist/src/agent.d.ts +17 -4
  3. package/dist/src/agent.d.ts.map +1 -1
  4. package/dist/src/agent.js +105 -43
  5. package/dist/src/agent.js.map +1 -1
  6. package/dist/src/api/server.d.ts.map +1 -1
  7. package/dist/src/api/server.js +41 -4
  8. package/dist/src/api/server.js.map +1 -1
  9. package/dist/src/code-execution/py-runner.d.ts +22 -1
  10. package/dist/src/code-execution/py-runner.d.ts.map +1 -1
  11. package/dist/src/code-execution/py-runner.js +64 -9
  12. package/dist/src/code-execution/py-runner.js.map +1 -1
  13. package/dist/src/code-execution/runtime-py.d.ts +4 -0
  14. package/dist/src/code-execution/runtime-py.d.ts.map +1 -1
  15. package/dist/src/code-execution/runtime-py.js +215 -38
  16. package/dist/src/code-execution/runtime-py.js.map +1 -1
  17. package/dist/src/framework.d.ts +569 -59
  18. package/dist/src/framework.d.ts.map +1 -1
  19. package/dist/src/framework.js +3091 -542
  20. package/dist/src/framework.js.map +1 -1
  21. package/dist/src/gate/event-gate.d.ts +21 -0
  22. package/dist/src/gate/event-gate.d.ts.map +1 -1
  23. package/dist/src/gate/event-gate.js +40 -7
  24. package/dist/src/gate/event-gate.js.map +1 -1
  25. package/dist/src/index.d.ts +7 -2
  26. package/dist/src/index.d.ts.map +1 -1
  27. package/dist/src/index.js +4 -0
  28. package/dist/src/index.js.map +1 -1
  29. package/dist/src/mcpl/channel-registry.d.ts.map +1 -1
  30. package/dist/src/mcpl/channel-registry.js +26 -3
  31. package/dist/src/mcpl/channel-registry.js.map +1 -1
  32. package/dist/src/mcpl/conversation-router.d.ts +28 -1
  33. package/dist/src/mcpl/conversation-router.d.ts.map +1 -1
  34. package/dist/src/mcpl/conversation-router.js +17 -0
  35. package/dist/src/mcpl/conversation-router.js.map +1 -1
  36. package/dist/src/mcpl/feature-set-manager.d.ts +11 -0
  37. package/dist/src/mcpl/feature-set-manager.d.ts.map +1 -1
  38. package/dist/src/mcpl/feature-set-manager.js +31 -7
  39. package/dist/src/mcpl/feature-set-manager.js.map +1 -1
  40. package/dist/src/mcpl/index.d.ts +4 -0
  41. package/dist/src/mcpl/index.d.ts.map +1 -1
  42. package/dist/src/mcpl/index.js +1 -0
  43. package/dist/src/mcpl/index.js.map +1 -1
  44. package/dist/src/mcpl/prose-stream-router.d.ts +27 -6
  45. package/dist/src/mcpl/prose-stream-router.d.ts.map +1 -1
  46. package/dist/src/mcpl/prose-stream-router.js +85 -22
  47. package/dist/src/mcpl/prose-stream-router.js.map +1 -1
  48. package/dist/src/mcpl/push-coalescer.d.ts +32 -4
  49. package/dist/src/mcpl/push-coalescer.d.ts.map +1 -1
  50. package/dist/src/mcpl/push-coalescer.js +46 -13
  51. package/dist/src/mcpl/push-coalescer.js.map +1 -1
  52. package/dist/src/mcpl/push-handler.d.ts +5 -3
  53. package/dist/src/mcpl/push-handler.d.ts.map +1 -1
  54. package/dist/src/mcpl/push-handler.js +41 -11
  55. package/dist/src/mcpl/push-handler.js.map +1 -1
  56. package/dist/src/mcpl/reference-fetcher.d.ts +2 -1
  57. package/dist/src/mcpl/reference-fetcher.d.ts.map +1 -1
  58. package/dist/src/mcpl/reference-fetcher.js +20 -9
  59. package/dist/src/mcpl/reference-fetcher.js.map +1 -1
  60. package/dist/src/mcpl/references.d.ts +29 -6
  61. package/dist/src/mcpl/references.d.ts.map +1 -1
  62. package/dist/src/mcpl/references.js +57 -16
  63. package/dist/src/mcpl/references.js.map +1 -1
  64. package/dist/src/mcpl/server-connection.d.ts +32 -1
  65. package/dist/src/mcpl/server-connection.d.ts.map +1 -1
  66. package/dist/src/mcpl/server-connection.js +76 -11
  67. package/dist/src/mcpl/server-connection.js.map +1 -1
  68. package/dist/src/mcpl/server-registry.d.ts +5 -2
  69. package/dist/src/mcpl/server-registry.d.ts.map +1 -1
  70. package/dist/src/mcpl/server-registry.js +25 -7
  71. package/dist/src/mcpl/server-registry.js.map +1 -1
  72. package/dist/src/mcpl/tool-lifecycle.d.ts +52 -2
  73. package/dist/src/mcpl/tool-lifecycle.d.ts.map +1 -1
  74. package/dist/src/mcpl/tool-lifecycle.js +47 -1
  75. package/dist/src/mcpl/tool-lifecycle.js.map +1 -1
  76. package/dist/src/mcpl/tool-pattern-check.d.ts +51 -0
  77. package/dist/src/mcpl/tool-pattern-check.d.ts.map +1 -0
  78. package/dist/src/mcpl/tool-pattern-check.js +79 -0
  79. package/dist/src/mcpl/tool-pattern-check.js.map +1 -0
  80. package/dist/src/mcpl/types.d.ts +15 -5
  81. package/dist/src/mcpl/types.d.ts.map +1 -1
  82. package/dist/src/mcpl/types.js.map +1 -1
  83. package/dist/src/mcpl/visible-content.d.ts +39 -0
  84. package/dist/src/mcpl/visible-content.d.ts.map +1 -0
  85. package/dist/src/mcpl/visible-content.js +54 -0
  86. package/dist/src/mcpl/visible-content.js.map +1 -0
  87. package/dist/src/module-registry.d.ts +90 -6
  88. package/dist/src/module-registry.d.ts.map +1 -1
  89. package/dist/src/module-registry.js +260 -18
  90. package/dist/src/module-registry.js.map +1 -1
  91. package/dist/src/modules/workspace/branch-intent.d.ts +72 -0
  92. package/dist/src/modules/workspace/branch-intent.d.ts.map +1 -0
  93. package/dist/src/modules/workspace/branch-intent.js +83 -0
  94. package/dist/src/modules/workspace/branch-intent.js.map +1 -0
  95. package/dist/src/modules/workspace/disk-agreement.d.ts +167 -0
  96. package/dist/src/modules/workspace/disk-agreement.d.ts.map +1 -0
  97. package/dist/src/modules/workspace/disk-agreement.js +259 -0
  98. package/dist/src/modules/workspace/disk-agreement.js.map +1 -0
  99. package/dist/src/modules/workspace/effects.d.ts +84 -0
  100. package/dist/src/modules/workspace/effects.d.ts.map +1 -0
  101. package/dist/src/modules/workspace/effects.js +368 -0
  102. package/dist/src/modules/workspace/effects.js.map +1 -0
  103. package/dist/src/modules/workspace/index.d.ts +155 -17
  104. package/dist/src/modules/workspace/index.d.ts.map +1 -1
  105. package/dist/src/modules/workspace/index.js +1101 -424
  106. package/dist/src/modules/workspace/index.js.map +1 -1
  107. package/dist/src/modules/workspace/observe.d.ts +288 -0
  108. package/dist/src/modules/workspace/observe.d.ts.map +1 -0
  109. package/dist/src/modules/workspace/observe.js +825 -0
  110. package/dist/src/modules/workspace/observe.js.map +1 -0
  111. package/dist/src/modules/workspace/reconcile.d.ts +238 -0
  112. package/dist/src/modules/workspace/reconcile.d.ts.map +1 -0
  113. package/dist/src/modules/workspace/reconcile.js +909 -0
  114. package/dist/src/modules/workspace/reconcile.js.map +1 -0
  115. package/dist/src/modules/workspace/sync.d.ts +6 -59
  116. package/dist/src/modules/workspace/sync.d.ts.map +1 -1
  117. package/dist/src/modules/workspace/sync.js +6 -257
  118. package/dist/src/modules/workspace/sync.js.map +1 -1
  119. package/dist/src/modules/workspace/types.d.ts +77 -10
  120. package/dist/src/modules/workspace/types.d.ts.map +1 -1
  121. package/dist/src/modules/workspace/types.js.map +1 -1
  122. package/dist/src/operator-log.d.ts +41 -0
  123. package/dist/src/operator-log.d.ts.map +1 -1
  124. package/dist/src/operator-log.js.map +1 -1
  125. package/dist/src/provider-waits.d.ts +216 -0
  126. package/dist/src/provider-waits.d.ts.map +1 -0
  127. package/dist/src/provider-waits.js +482 -0
  128. package/dist/src/provider-waits.js.map +1 -0
  129. package/dist/src/record-journal.d.ts +127 -0
  130. package/dist/src/record-journal.d.ts.map +1 -0
  131. package/dist/src/record-journal.js +202 -0
  132. package/dist/src/record-journal.js.map +1 -0
  133. package/dist/src/refusal-reactions.d.ts +14 -12
  134. package/dist/src/refusal-reactions.d.ts.map +1 -1
  135. package/dist/src/refusal-reactions.js +14 -12
  136. package/dist/src/refusal-reactions.js.map +1 -1
  137. package/dist/src/shutdown.d.ts +13 -0
  138. package/dist/src/shutdown.d.ts.map +1 -0
  139. package/dist/src/shutdown.js +46 -0
  140. package/dist/src/shutdown.js.map +1 -0
  141. package/dist/src/silent-heartbeat.d.ts +74 -0
  142. package/dist/src/silent-heartbeat.d.ts.map +1 -0
  143. package/dist/src/silent-heartbeat.js +77 -0
  144. package/dist/src/silent-heartbeat.js.map +1 -0
  145. package/dist/src/tool-presentation.d.ts +50 -0
  146. package/dist/src/tool-presentation.d.ts.map +1 -0
  147. package/dist/src/tool-presentation.js +235 -0
  148. package/dist/src/tool-presentation.js.map +1 -0
  149. package/dist/src/tool-result-guard.d.ts +142 -6
  150. package/dist/src/tool-result-guard.d.ts.map +1 -1
  151. package/dist/src/tool-result-guard.js +357 -36
  152. package/dist/src/tool-result-guard.js.map +1 -1
  153. package/dist/src/tool-result-history.d.ts +13 -0
  154. package/dist/src/tool-result-history.d.ts.map +1 -1
  155. package/dist/src/tool-result-history.js +21 -1
  156. package/dist/src/tool-result-history.js.map +1 -1
  157. package/dist/src/types/agent.d.ts +18 -2
  158. package/dist/src/types/agent.d.ts.map +1 -1
  159. package/dist/src/types/events.d.ts +16 -0
  160. package/dist/src/types/events.d.ts.map +1 -1
  161. package/dist/src/types/framework.d.ts +12 -0
  162. package/dist/src/types/framework.d.ts.map +1 -1
  163. package/dist/src/types/module.d.ts +26 -4
  164. package/dist/src/types/module.d.ts.map +1 -1
  165. package/dist/src/types/trace.d.ts +87 -3
  166. package/dist/src/types/trace.d.ts.map +1 -1
  167. package/dist/test/batched-wake-locus.test.d.ts +2 -0
  168. package/dist/test/batched-wake-locus.test.d.ts.map +1 -0
  169. package/dist/test/batched-wake-locus.test.js +166 -0
  170. package/dist/test/batched-wake-locus.test.js.map +1 -0
  171. package/dist/test/code-execution.test.js +386 -2
  172. package/dist/test/code-execution.test.js.map +1 -1
  173. package/dist/test/component-defaults.test.d.ts +2 -0
  174. package/dist/test/component-defaults.test.d.ts.map +1 -0
  175. package/dist/test/component-defaults.test.js +54 -0
  176. package/dist/test/component-defaults.test.js.map +1 -0
  177. package/dist/test/conversation-routing.test.js +57 -1
  178. package/dist/test/conversation-routing.test.js.map +1 -1
  179. package/dist/test/discord-awareness-outbox.test.js +3 -0
  180. package/dist/test/discord-awareness-outbox.test.js.map +1 -1
  181. package/dist/test/ephemeral-settle.test.js +3 -0
  182. package/dist/test/ephemeral-settle.test.js.map +1 -1
  183. package/dist/test/event-gate.test.js +118 -0
  184. package/dist/test/event-gate.test.js.map +1 -1
  185. package/dist/test/explicit-prose-routing.test.js +975 -0
  186. package/dist/test/explicit-prose-routing.test.js.map +1 -1
  187. package/dist/test/framework.test.js +160 -1
  188. package/dist/test/framework.test.js.map +1 -1
  189. package/dist/test/helpers/coalescing-fixture.d.ts.map +1 -1
  190. package/dist/test/helpers/coalescing-fixture.js +3 -2
  191. package/dist/test/helpers/coalescing-fixture.js.map +1 -1
  192. package/dist/test/helpers/pytc-stop-rows.d.ts +11 -0
  193. package/dist/test/helpers/pytc-stop-rows.d.ts.map +1 -0
  194. package/dist/test/helpers/pytc-stop-rows.js +143 -0
  195. package/dist/test/helpers/pytc-stop-rows.js.map +1 -0
  196. package/dist/test/inference-exhaustion-rewind.test.js +142 -14
  197. package/dist/test/inference-exhaustion-rewind.test.js.map +1 -1
  198. package/dist/test/inference-failure-bounds.test.d.ts +2 -0
  199. package/dist/test/inference-failure-bounds.test.d.ts.map +1 -0
  200. package/dist/test/inference-failure-bounds.test.js +1201 -0
  201. package/dist/test/inference-failure-bounds.test.js.map +1 -0
  202. package/dist/test/late-events-after-stop.test.d.ts +2 -0
  203. package/dist/test/late-events-after-stop.test.d.ts.map +1 -0
  204. package/dist/test/late-events-after-stop.test.js +122 -0
  205. package/dist/test/late-events-after-stop.test.js.map +1 -0
  206. package/dist/test/mcpl-awareness-barrier.test.js +141 -0
  207. package/dist/test/mcpl-awareness-barrier.test.js.map +1 -1
  208. package/dist/test/mcpl-coalescing.test.js +97 -22
  209. package/dist/test/mcpl-coalescing.test.js.map +1 -1
  210. package/dist/test/mcpl-config-diagnostics.test.d.ts +2 -0
  211. package/dist/test/mcpl-config-diagnostics.test.d.ts.map +1 -0
  212. package/dist/test/mcpl-config-diagnostics.test.js +452 -0
  213. package/dist/test/mcpl-config-diagnostics.test.js.map +1 -0
  214. package/dist/test/mcpl-empty-content.test.d.ts +2 -0
  215. package/dist/test/mcpl-empty-content.test.d.ts.map +1 -0
  216. package/dist/test/mcpl-empty-content.test.js +368 -0
  217. package/dist/test/mcpl-empty-content.test.js.map +1 -0
  218. package/dist/test/mcpl-manifest-changed.test.js +2 -1
  219. package/dist/test/mcpl-manifest-changed.test.js.map +1 -1
  220. package/dist/test/mcpl-reference-fetcher.test.js +232 -4
  221. package/dist/test/mcpl-reference-fetcher.test.js.map +1 -1
  222. package/dist/test/mcpl-reference-fields.test.js +69 -2
  223. package/dist/test/mcpl-reference-fields.test.js.map +1 -1
  224. package/dist/test/mcpl-tool-lifecycle-emitter.test.js +106 -1
  225. package/dist/test/mcpl-tool-lifecycle-emitter.test.js.map +1 -1
  226. package/dist/test/mcpl-tool-lifecycle-script.test.d.ts +2 -0
  227. package/dist/test/mcpl-tool-lifecycle-script.test.d.ts.map +1 -0
  228. package/dist/test/mcpl-tool-lifecycle-script.test.js +288 -0
  229. package/dist/test/mcpl-tool-lifecycle-script.test.js.map +1 -0
  230. package/dist/test/mcpl-ws-transport.test.js +103 -0
  231. package/dist/test/mcpl-ws-transport.test.js.map +1 -1
  232. package/dist/test/ops-alert.test.js +2 -1
  233. package/dist/test/ops-alert.test.js.map +1 -1
  234. package/dist/test/placed-reaction-baseline.test.d.ts +2 -0
  235. package/dist/test/placed-reaction-baseline.test.d.ts.map +1 -0
  236. package/dist/test/placed-reaction-baseline.test.js +312 -0
  237. package/dist/test/placed-reaction-baseline.test.js.map +1 -0
  238. package/dist/test/prose-stream-router.test.js +41 -0
  239. package/dist/test/prose-stream-router.test.js.map +1 -1
  240. package/dist/test/provider-acceleration-cooldown.test.js +5 -1
  241. package/dist/test/provider-acceleration-cooldown.test.js.map +1 -1
  242. package/dist/test/provider-waits.test.d.ts +2 -0
  243. package/dist/test/provider-waits.test.d.ts.map +1 -0
  244. package/dist/test/provider-waits.test.js +2196 -0
  245. package/dist/test/provider-waits.test.js.map +1 -0
  246. package/dist/test/reaction-baseline-platform.test.d.ts +2 -0
  247. package/dist/test/reaction-baseline-platform.test.d.ts.map +1 -0
  248. package/dist/test/reaction-baseline-platform.test.js +124 -0
  249. package/dist/test/reaction-baseline-platform.test.js.map +1 -0
  250. package/dist/test/record-journal.test.d.ts +6 -0
  251. package/dist/test/record-journal.test.d.ts.map +1 -0
  252. package/dist/test/record-journal.test.js +269 -0
  253. package/dist/test/record-journal.test.js.map +1 -0
  254. package/dist/test/refusal-reaction-baseline.test.js +10 -3
  255. package/dist/test/refusal-reaction-baseline.test.js.map +1 -1
  256. package/dist/test/save-recent-image.test.js +240 -2
  257. package/dist/test/save-recent-image.test.js.map +1 -1
  258. package/dist/test/shutdown-errors.test.d.ts +2 -0
  259. package/dist/test/shutdown-errors.test.d.ts.map +1 -0
  260. package/dist/test/shutdown-errors.test.js +662 -0
  261. package/dist/test/shutdown-errors.test.js.map +1 -0
  262. package/dist/test/silent-heartbeat-rows.test.d.ts +2 -0
  263. package/dist/test/silent-heartbeat-rows.test.d.ts.map +1 -0
  264. package/dist/test/silent-heartbeat-rows.test.js +451 -0
  265. package/dist/test/silent-heartbeat-rows.test.js.map +1 -0
  266. package/dist/test/silent-heartbeat.test.js +49 -38
  267. package/dist/test/silent-heartbeat.test.js.map +1 -1
  268. package/dist/test/stop-with-work-in-flight.test.d.ts +23 -0
  269. package/dist/test/stop-with-work-in-flight.test.d.ts.map +1 -0
  270. package/dist/test/stop-with-work-in-flight.test.js +672 -0
  271. package/dist/test/stop-with-work-in-flight.test.js.map +1 -0
  272. package/dist/test/surgery-marks-receipt.test.d.ts +2 -0
  273. package/dist/test/surgery-marks-receipt.test.d.ts.map +1 -0
  274. package/dist/test/surgery-marks-receipt.test.js +540 -0
  275. package/dist/test/surgery-marks-receipt.test.js.map +1 -0
  276. package/dist/test/tool-batch-hook.test.d.ts +8 -0
  277. package/dist/test/tool-batch-hook.test.d.ts.map +1 -0
  278. package/dist/test/tool-batch-hook.test.js +275 -0
  279. package/dist/test/tool-batch-hook.test.js.map +1 -0
  280. package/dist/test/tool-presentation.test.d.ts +2 -0
  281. package/dist/test/tool-presentation.test.d.ts.map +1 -0
  282. package/dist/test/tool-presentation.test.js +268 -0
  283. package/dist/test/tool-presentation.test.js.map +1 -0
  284. package/dist/test/tool-result-guard.test.js +2545 -19
  285. package/dist/test/tool-result-guard.test.js.map +1 -1
  286. package/dist/test/tool-result-history.test.js +2 -1
  287. package/dist/test/tool-result-history.test.js.map +1 -1
  288. package/dist/test/turn-trigger-provenance.test.js +35 -0
  289. package/dist/test/turn-trigger-provenance.test.js.map +1 -1
  290. package/dist/test/unconvertible-tool-result.test.d.ts +2 -0
  291. package/dist/test/unconvertible-tool-result.test.d.ts.map +1 -0
  292. package/dist/test/unconvertible-tool-result.test.js +358 -0
  293. package/dist/test/unconvertible-tool-result.test.js.map +1 -0
  294. package/dist/test/workspace-materialize-freshness.test.d.ts +16 -0
  295. package/dist/test/workspace-materialize-freshness.test.d.ts.map +1 -0
  296. package/dist/test/workspace-materialize-freshness.test.js +252 -0
  297. package/dist/test/workspace-materialize-freshness.test.js.map +1 -0
  298. package/dist/test/workspace-three-way.test.d.ts +12 -0
  299. package/dist/test/workspace-three-way.test.d.ts.map +1 -0
  300. package/dist/test/workspace-three-way.test.js +3194 -0
  301. package/dist/test/workspace-three-way.test.js.map +1 -0
  302. package/dist/tsconfig.tsbuildinfo +1 -1
  303. package/package.json +2 -2
  304. package/src/agent.ts +124 -45
  305. package/src/api/server.ts +43 -4
  306. package/src/code-execution/py-runner.ts +66 -9
  307. package/src/code-execution/runtime-py.ts +215 -38
  308. package/src/framework.ts +3191 -544
  309. package/src/gate/event-gate.ts +59 -7
  310. package/src/index.ts +18 -2
  311. package/src/mcpl/channel-registry.ts +24 -3
  312. package/src/mcpl/conversation-router.ts +34 -1
  313. package/src/mcpl/feature-set-manager.ts +36 -11
  314. package/src/mcpl/index.ts +4 -0
  315. package/src/mcpl/prose-stream-router.ts +79 -23
  316. package/src/mcpl/push-coalescer.ts +62 -13
  317. package/src/mcpl/push-handler.ts +41 -12
  318. package/src/mcpl/reference-fetcher.ts +18 -8
  319. package/src/mcpl/references.ts +57 -13
  320. package/src/mcpl/server-connection.ts +95 -13
  321. package/src/mcpl/server-registry.ts +24 -7
  322. package/src/mcpl/tool-lifecycle.ts +77 -2
  323. package/src/mcpl/tool-pattern-check.ts +106 -0
  324. package/src/mcpl/types.ts +15 -5
  325. package/src/mcpl/visible-content.ts +57 -0
  326. package/src/module-registry.ts +269 -25
  327. package/src/modules/workspace/branch-intent.ts +123 -0
  328. package/src/modules/workspace/disk-agreement.ts +325 -0
  329. package/src/modules/workspace/effects.ts +362 -0
  330. package/src/modules/workspace/index.ts +1098 -446
  331. package/src/modules/workspace/observe.ts +865 -0
  332. package/src/modules/workspace/reconcile.ts +1157 -0
  333. package/src/modules/workspace/sync.ts +6 -336
  334. package/src/modules/workspace/types.ts +75 -10
  335. package/src/operator-log.ts +30 -0
  336. package/src/provider-waits.ts +523 -0
  337. package/src/record-journal.ts +246 -0
  338. package/src/refusal-reactions.ts +14 -12
  339. package/src/shutdown.ts +49 -0
  340. package/src/silent-heartbeat.ts +141 -0
  341. package/src/tool-presentation.ts +188 -0
  342. package/src/tool-result-guard.ts +384 -34
  343. package/src/tool-result-history.ts +25 -1
  344. package/src/types/agent.ts +18 -2
  345. package/src/types/events.ts +16 -0
  346. package/src/types/framework.ts +12 -0
  347. package/src/types/module.ts +27 -4
  348. package/src/types/trace.ts +94 -3
@@ -0,0 +1,235 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { fchmodSync, closeSync, fstatSync, lstatSync, openSync, readSync, renameSync, unlinkSync, writeFileSync } from 'node:fs';
3
+ const MAX_BYTES = 256 * 1024;
4
+ const protectedNames = new Set(['set_tool_visibility', 'set_tool_description', 'workspace--read']);
5
+ export const isPresentationTool = (name) => name === 'set_tool_visibility' || name === 'set_tool_description';
6
+ const hash = (value) => createHash('sha256').update(value).digest('hex');
7
+ export function parsePresentation(raw) {
8
+ const doc = JSON.parse(raw);
9
+ if (!doc || doc.version !== 1 || !doc.tools || typeof doc.tools !== 'object' || Array.isArray(doc.tools)
10
+ || Object.keys(doc).some(k => !['version', 'tools'].includes(k)))
11
+ throw new Error('Expected {"version":1,"tools":{...}}');
12
+ for (const [name, value] of Object.entries(doc.tools)) {
13
+ if (!name || !value || typeof value !== 'object' || Array.isArray(value))
14
+ throw new Error(`Invalid override: ${name}`);
15
+ const item = value;
16
+ if (Object.keys(item).some(k => !['description', 'visible'].includes(k))
17
+ || ('description' in item && (typeof item.description !== 'string' || item.description.length > 32768))
18
+ || ('visible' in item && typeof item.visible !== 'boolean'))
19
+ throw new Error(`Invalid description/visibility for ${name}`);
20
+ if (protectedNames.has(name) && item.visible === false)
21
+ throw new Error(`Cannot hide recovery tool ${name}`);
22
+ }
23
+ return doc;
24
+ }
25
+ export function presentationTools(path) {
26
+ const signpost = ` Read the generated catalogue with workspace--read {"path":${JSON.stringify(path)},"limit":140}. Hidden tools remain available; changes affect the next newly compiled request, not an in-flight stream.`;
27
+ return [
28
+ { name: 'set_tool_visibility', description: 'Show or hide a tool definition. Hiding does not revoke permission.' + signpost,
29
+ inputSchema: { type: 'object', properties: { name: { type: 'string' }, visible: { type: 'boolean' } }, required: ['name', 'visible'], additionalProperties: false } },
30
+ { name: 'set_tool_description', description: 'Set a personal tool description; null restores the configured component default, or the installed description when none is configured.' + signpost,
31
+ inputSchema: { type: 'object', properties: { name: { type: 'string' }, description: { type: ['string', 'null'] } }, required: ['name', 'description'], additionalProperties: false } },
32
+ ];
33
+ }
34
+ /** Per-agent presentation; files are the sole persistent source, independent of editor identity. */
35
+ export class ToolPresentation {
36
+ config;
37
+ constructor(config) {
38
+ this.config = config;
39
+ }
40
+ read(path = this.config.path, allowMissing = true) {
41
+ let fd;
42
+ try {
43
+ fd = openSync(path, 'r');
44
+ }
45
+ catch (error) {
46
+ if (allowMissing && error.code === 'ENOENT')
47
+ return '{"version":1,"tools":{}}';
48
+ throw error;
49
+ }
50
+ try {
51
+ const stat = fstatSync(fd);
52
+ if (!stat.isFile() || stat.size > MAX_BYTES)
53
+ throw new Error('Presentation must be a regular file under 256 KiB');
54
+ const data = Buffer.alloc(MAX_BYTES + 1);
55
+ let size = 0, count = 0;
56
+ while (size < data.length && (count = readSync(fd, data, size, data.length - size, null)) > 0)
57
+ size += count;
58
+ if (size > MAX_BYTES)
59
+ throw new Error('Presentation exceeds 256 KiB');
60
+ return data.subarray(0, size).toString('utf8');
61
+ }
62
+ finally {
63
+ closeSync(fd);
64
+ }
65
+ }
66
+ resolve(tools, sources = new Map()) {
67
+ let raw = '', doc = { version: 1, tools: {} }, diagnostics = [];
68
+ try {
69
+ raw = this.read();
70
+ doc = parsePresentation(raw);
71
+ }
72
+ catch (error) {
73
+ diagnostics.push(`Overrides not applied: ${String(error)}. Default visibility and component descriptions retained.`);
74
+ }
75
+ const defaults = new Map();
76
+ const configuredSources = new Set();
77
+ for (const profile of this.config.defaults ?? []) {
78
+ if (configuredSources.has(profile.source)) {
79
+ diagnostics.push(`Duplicate defaults source ignored: ${profile.source}`);
80
+ continue;
81
+ }
82
+ configuredSources.add(profile.source);
83
+ // Absent components contribute neither tools nor missing-file errors.
84
+ if (!tools.some(t => (sources.get(t.name) ?? 'Unattributed') === profile.source))
85
+ continue;
86
+ try {
87
+ const profileDoc = parsePresentation(this.read(profile.path, false));
88
+ if (Object.values(profileDoc.tools).some(item => Object.keys(item).some(k => k !== 'description')))
89
+ throw new Error('Component defaults may contain descriptions only; visibility belongs to the resident');
90
+ for (const tool of tools) {
91
+ if ((sources.get(tool.name) ?? 'Unattributed') !== profile.source)
92
+ continue;
93
+ const item = Object.hasOwn(profileDoc.tools, tool.name) ? profileDoc.tools[tool.name] : undefined;
94
+ if (item?.description !== undefined)
95
+ defaults.set(tool.name, { description: item.description, path: profile.path });
96
+ }
97
+ }
98
+ catch (error) {
99
+ diagnostics.push(`Component defaults not applied (${profile.source}): ${String(error)}`);
100
+ }
101
+ }
102
+ const names = new Set(tools.map(t => t.name));
103
+ for (const name of Object.keys(doc.tools))
104
+ if (!names.has(name))
105
+ diagnostics.push(`Not currently available: ${name}`);
106
+ const entries = tools.map(tool => {
107
+ const override = Object.hasOwn(doc.tools, tool.name) ? doc.tools[tool.name] : undefined;
108
+ // Always retain a usable discovery signpost, even when its wording is overridden.
109
+ const componentDefault = defaults.get(tool.name);
110
+ let description = override?.description ?? componentDefault?.description ?? tool.description;
111
+ const descriptionSource = override?.description !== undefined ? this.config.path : componentDefault?.path ?? "installed component";
112
+ if (isPresentationTool(tool.name) && (override?.description !== undefined || componentDefault !== undefined))
113
+ description += `\nCatalogue: workspace--read {"path":${JSON.stringify(this.config.cataloguePath)},"limit":140}. Changes affect the next newly compiled request.`;
114
+ return { name: tool.name, source: sources.get(tool.name) ?? 'Unattributed', visible: override?.visible ?? true, originalDescription: tool.description, description, descriptionSource, inputSchema: structuredClone(tool.inputSchema) };
115
+ });
116
+ const available = tools.map((tool, i) => ({ ...structuredClone(tool), description: entries[i].description }));
117
+ return { revision: hash(JSON.stringify({ raw, entries, diagnostics })), source: this.config.path, cataloguePath: this.config.cataloguePath, diagnostics, available,
118
+ advertised: available.filter((_, i) => entries[i].visible), entries };
119
+ }
120
+ edit(tool, input, available) {
121
+ const lock = this.config.path + '.lock';
122
+ let fd, tempFd, temp;
123
+ try {
124
+ if (!isPresentationTool(tool))
125
+ throw new Error('Unknown editing tool');
126
+ const value = input;
127
+ const field = tool === 'set_tool_visibility' ? 'visible' : 'description';
128
+ if (!value || typeof value !== 'object' || Array.isArray(value) || typeof value.name !== 'string'
129
+ || Object.keys(value).some(k => !['name', field].includes(k)) || !Object.hasOwn(value, field))
130
+ throw new Error('Invalid editing arguments');
131
+ if (!available.some(t => t.name === value.name))
132
+ throw new Error('Tool is not currently available to this agent');
133
+ if (field === 'visible' ? typeof value.visible !== 'boolean' : value.description !== null && typeof value.description !== 'string')
134
+ throw new Error(`Invalid ${field}`);
135
+ fd = openSync(lock, 'wx', 0o600);
136
+ let mode = 0o600;
137
+ try {
138
+ const stat = lstatSync(this.config.path);
139
+ if (stat.isSymbolicLink())
140
+ throw new Error('Edit the target file directly; tool editing refuses symlinks');
141
+ mode = stat.mode & 0o777;
142
+ }
143
+ catch (error) {
144
+ if (error.code !== 'ENOENT')
145
+ throw error;
146
+ }
147
+ const before = this.read(), doc = parsePresentation(before);
148
+ const old = Object.hasOwn(doc.tools, value.name) ? doc.tools[value.name] : {};
149
+ const updated = { ...old };
150
+ if (field === 'description' && value.description === null)
151
+ delete updated.description;
152
+ else
153
+ Object.assign(updated, { [field]: value[field] });
154
+ Object.defineProperty(doc.tools, value.name, { value: updated, enumerable: true, writable: true, configurable: true });
155
+ const next = JSON.stringify(doc, null, 2) + '\n';
156
+ parsePresentation(next);
157
+ if (Buffer.byteLength(next) > MAX_BYTES)
158
+ throw new Error('Presentation exceeds 256 KiB');
159
+ temp = this.config.path + '.' + randomUUID() + '.tmp';
160
+ tempFd = openSync(temp, 'wx', 0o600);
161
+ writeFileSync(tempFd, next);
162
+ fchmodSync(tempFd, mode); // preserve permissions on the opened inode, never a replacement path
163
+ if (this.read() !== before)
164
+ throw new Error('File changed concurrently; retry after reading it');
165
+ const opened = fstatSync(tempFd), named = lstatSync(temp);
166
+ if (!named.isFile() || named.dev !== opened.dev || named.ino !== opened.ino)
167
+ throw new Error('Temporary file changed concurrently; retry after checking the directory');
168
+ renameSync(temp, this.config.path);
169
+ temp = undefined;
170
+ return { success: true, data: { name: value.name, [field]: value[field], effective: 'next newly compiled request', catalogue: this.config.cataloguePath } };
171
+ }
172
+ catch (error) {
173
+ return { success: false, isError: true, error: String(error) };
174
+ }
175
+ finally {
176
+ if (tempFd !== undefined)
177
+ closeSync(tempFd);
178
+ if (temp)
179
+ try {
180
+ unlinkSync(temp);
181
+ }
182
+ catch { }
183
+ if (fd !== undefined) {
184
+ closeSync(fd);
185
+ unlinkSync(lock);
186
+ }
187
+ }
188
+ }
189
+ }
190
+ export function renderCatalogue(snapshot) {
191
+ const groups = new Map();
192
+ for (const entry of snapshot.entries) {
193
+ const group = groups.get(entry.source) ?? [];
194
+ group.push(entry);
195
+ groups.set(entry.source, group);
196
+ }
197
+ const visible = snapshot.entries.filter(e => e.visible).length;
198
+ const lines = [
199
+ '# Tool catalogue — generated from currently available tools', '',
200
+ `Revision: ${snapshot.revision}`, '',
201
+ `${snapshot.entries.length} tools: ${visible} visible, ${snapshot.entries.length - visible} hidden.`,
202
+ 'Visible = supplied in new requests. Hidden = stored away, still available.',
203
+ 'These are your visibility choices, not fixed primary/secondary rankings.',
204
+ 'Copy exact names from the index; similar-sounding names may not exist.',
205
+ 'Show a hidden tool: set_tool_visibility {"name":"EXACT_NAME","visible":true}.',
206
+ `Read details: workspace--read {"path":${JSON.stringify(snapshot.cataloguePath)},"offset":LINE,"limit":LINES}.`,
207
+ 'Line references below belong to this revision; reread the index after changes.', '',
208
+ ];
209
+ for (const diagnostic of snapshot.diagnostics)
210
+ lines.push('Diagnostic: ' + diagnostic);
211
+ lines.push('## Index by source', '');
212
+ const index = new Map();
213
+ for (const [source, entries] of groups) {
214
+ lines.push(`### ${source} (${entries.length})`);
215
+ for (const entry of entries) {
216
+ index.set(entry.name, lines.length);
217
+ lines.push('');
218
+ }
219
+ lines.push('');
220
+ }
221
+ lines.push('## Full definitions', '');
222
+ for (const [source, entries] of groups) {
223
+ lines.push(`### ${source}`, '');
224
+ for (const entry of entries) {
225
+ const start = lines.length + 1;
226
+ lines.push(`#### ${entry.name} (${entry.visible ? 'visible' : 'hidden'})`, '', ...entry.description.split('\n'), '', `Description from: ${entry.descriptionSource ?? 'installed component'}`, '', `Schema: ${JSON.stringify(entry.inputSchema)}`);
227
+ if (entry.description !== entry.originalDescription)
228
+ lines.push('', 'Original description:', ...entry.originalDescription.split('\n'));
229
+ lines.push('');
230
+ lines[index.get(entry.name)] = `- [${entry.visible ? 'visible' : 'hidden'}] ${entry.name} — details: offset ${start}, limit ${lines.length - start + 1}`;
231
+ }
232
+ }
233
+ return lines.join('\n');
234
+ }
235
+ //# sourceMappingURL=tool-presentation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-presentation.js","sourceRoot":"","sources":["../../src/tool-presentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAsBjI,MAAM,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC;AAC7B,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,qBAAqB,EAAE,sBAAsB,EAAE,iBAAiB,CAAC,CAAC,CAAC;AACnG,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,IAAI,KAAK,qBAAqB,IAAI,IAAI,KAAK,sBAAsB,CAAC;AAC/H,MAAM,IAAI,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAEzF,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;WACjG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC9H,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;QACvH,MAAM,IAAI,GAAG,KAAgC,CAAC;QAC9C,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;eACnE,CAAC,aAAa,IAAI,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;eACpG,CAAC,SAAS,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,IAAI,EAAE,CAAC,CAAC;QAC7H,IAAI,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC;IAC/G,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,QAAQ,GAAG,8DAA8D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,wHAAwH,CAAC;IAC5N,OAAO;QACL,EAAC,IAAI,EAAC,qBAAqB,EAAE,WAAW,EAAC,oEAAoE,GAAG,QAAQ;YACtH,WAAW,EAAC,EAAC,IAAI,EAAC,QAAQ,EAAC,UAAU,EAAC,EAAC,IAAI,EAAC,EAAC,IAAI,EAAC,QAAQ,EAAC,EAAC,OAAO,EAAC,EAAC,IAAI,EAAC,SAAS,EAAC,EAAC,EAAC,QAAQ,EAAC,CAAC,MAAM,EAAC,SAAS,CAAC,EAAC,oBAAoB,EAAC,KAAK,EAAC,EAAC;QAChJ,EAAC,IAAI,EAAC,sBAAsB,EAAE,WAAW,EAAC,wIAAwI,GAAG,QAAQ;YAC3L,WAAW,EAAC,EAAC,IAAI,EAAC,QAAQ,EAAC,UAAU,EAAC,EAAC,IAAI,EAAC,EAAC,IAAI,EAAC,QAAQ,EAAC,EAAC,WAAW,EAAC,EAAC,IAAI,EAAC,CAAC,QAAQ,EAAC,MAAM,CAAC,EAAC,EAAC,EAAC,QAAQ,EAAC,CAAC,MAAM,EAAC,aAAa,CAAC,EAAC,oBAAoB,EAAC,KAAK,EAAC,EAAC;KAClI,CAAC;AACnC,CAAC;AAED,oGAAoG;AACpG,MAAM,OAAO,gBAAgB;IACN;IAArB,YAAqB,MAA8B;QAA9B,WAAM,GAAN,MAAM,CAAwB;IAAG,CAAC;IAC/C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;QACvD,IAAI,EAAU,CAAC;QACf,IAAI,CAAC;YAAC,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAAC,CAAC;QACjC,OAAO,KAAK,EAAE,CAAC;YAAC,IAAI,YAAY,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,0BAA0B,CAAC;YAAC,MAAM,KAAK,CAAC;QAAC,CAAC;QACzI,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,GAAG,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;YAClH,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;YACzC,IAAI,IAAI,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;YACxB,OAAO,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC;gBAAE,IAAI,IAAI,KAAK,CAAC;YAC7G,IAAI,IAAI,GAAG,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YACtE,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChD,CAAC;gBAAS,CAAC;YAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;IAC9B,CAAC;IACD,OAAO,CAAC,KAAuB,EAAE,UAAuC,IAAI,GAAG,EAAE;QAC/E,IAAI,GAAG,GAAG,EAAE,EAAE,GAAG,GAAyB,EAAC,OAAO,EAAC,CAAC,EAAC,KAAK,EAAC,EAAE,EAAC,EAAE,WAAW,GAAa,EAAE,CAAC;QAC3F,IAAI,CAAC;YAAC,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAAC,GAAG,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAAC,CAAC;QACxD,OAAO,KAAK,EAAE,CAAC;YAAC,WAAW,CAAC,IAAI,CAAC,0BAA0B,MAAM,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAAC,CAAC;QACvI,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA+C,CAAC;QACxE,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAU,CAAC;QAC5C,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;YACjD,IAAI,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1C,WAAW,CAAC,IAAI,CAAC,sCAAsC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;gBAAC,SAAS;YACrF,CAAC;YACD,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACtC,sEAAsE;YACtE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC;gBAAE,SAAS;YAC3F,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;gBACrE,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC;oBAChG,MAAM,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAC;gBAC1G,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,cAAc,CAAC,KAAK,OAAO,CAAC,MAAM;wBAAE,SAAS;oBAC5E,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;oBAClG,IAAI,IAAI,EAAE,WAAW,KAAK,SAAS;wBAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,EAAC,WAAW,EAAC,IAAI,CAAC,WAAW,EAAC,IAAI,EAAC,OAAO,CAAC,IAAI,EAAC,CAAC,CAAC;gBACjH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAAC,WAAW,CAAC,IAAI,CAAC,mCAAmC,OAAO,CAAC,MAAM,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAAC,CAAC;QAC/G,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,WAAW,CAAC,IAAI,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAC;QACtH,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC/B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACxF,kFAAkF;YAClF,MAAM,gBAAgB,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjD,IAAI,WAAW,GAAG,QAAQ,EAAE,WAAW,IAAI,gBAAgB,EAAE,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC;YAC7F,MAAM,iBAAiB,GAAG,QAAQ,EAAE,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,gBAAgB,EAAE,IAAI,IAAI,qBAAqB,CAAC;YACnI,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,KAAK,SAAS,IAAI,gBAAgB,KAAK,SAAS,CAAC;gBAC1G,WAAW,IAAI,wCAAwC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,gEAAgE,CAAC;YACnK,OAAO,EAAC,IAAI,EAAC,IAAI,CAAC,IAAI,EAAC,MAAM,EAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,cAAc,EAAC,OAAO,EAAC,QAAQ,EAAE,OAAO,IAAI,IAAI,EAAC,mBAAmB,EAAC,IAAI,CAAC,WAAW,EAAC,WAAW,EAAC,iBAAiB,EAAC,WAAW,EAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,EAAC,CAAC;QAC7N,CAAC,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAC,GAAG,eAAe,CAAC,IAAI,CAAC,EAAC,WAAW,EAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAC,CAAC,CAAC,CAAC;QACzG,OAAO,EAAC,QAAQ,EAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAC,GAAG,EAAC,OAAO,EAAC,WAAW,EAAC,CAAC,CAAC,EAAC,MAAM,EAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAC,aAAa,EAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAC,WAAW,EAAC,SAAS;YACpJ,UAAU,EAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAC,CAAC,EAAC,EAAE,CAAA,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAC,OAAO,EAAC,CAAC;IACpE,CAAC;IACD,IAAI,CAAC,IAAY,EAAE,KAAc,EAAE,SAA2B;QAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC;QACxC,IAAI,EAAsB,EAAE,MAA0B,EAAE,IAAwB,CAAC;QACjF,IAAI,CAAC;YACH,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;YACvE,MAAM,KAAK,GAAG,KAAgC,CAAC;YAC/C,MAAM,KAAK,GAAG,IAAI,KAAK,qBAAqB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC;YACzE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;mBAC5F,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAC,CAAC,CAAC,MAAM,EAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAC,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC3I,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA,EAAE,CAAA,CAAC,CAAC,IAAI,KAAG,KAAK,CAAC,IAAI,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YAC9G,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,KAAK,IAAI,IAAI,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC;YACxK,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YACjC,IAAI,IAAI,GAAG,KAAK,CAAC;YACjB,IAAI,CAAC;gBAAC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAAC,IAAI,IAAI,CAAC,cAAc,EAAE;oBAAE,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;gBAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;YAAC,CAAC;YACvL,OAAO,KAAK,EAAE,CAAC;gBAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;oBAAE,MAAM,KAAK,CAAC;YAAC,CAAC;YACtF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAC5D,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7E,MAAM,OAAO,GAAG,EAAC,GAAG,GAAG,EAAC,CAAC;YACzB,IAAI,KAAK,KAAK,aAAa,IAAI,KAAK,CAAC,WAAW,KAAK,IAAI;gBAAE,OAAO,OAAO,CAAC,WAAW,CAAC;;gBACjF,MAAM,CAAC,MAAM,CAAC,OAAO,EAAC,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,CAAC,KAAK,CAAC,EAAC,CAAC,CAAC;YACnD,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAC,KAAK,CAAC,IAAI,EAAC,EAAC,KAAK,EAAC,OAAO,EAAC,UAAU,EAAC,IAAI,EAAC,QAAQ,EAAC,IAAI,EAAC,YAAY,EAAC,IAAI,EAAC,CAAC,CAAC;YAC5G,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAC,IAAI,EAAC,CAAC,CAAC,GAAC,IAAI,CAAC;YAC7C,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACxB,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAC,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YACvF,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,GAAG,GAAG,UAAU,EAAE,GAAG,MAAM,CAAC;YACtD,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAC,IAAI,EAAC,KAAK,CAAC,CAAC;YACnC,aAAa,CAAC,MAAM,EAAC,IAAI,CAAC,CAAC;YAC3B,UAAU,CAAC,MAAM,EAAC,IAAI,CAAC,CAAC,CAAC,qEAAqE;YAC9F,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;YACjG,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;YAC1D,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG;gBACzE,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAC;YAC7F,UAAU,CAAC,IAAI,EAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAAC,IAAI,GAAC,SAAS,CAAC;YAClD,OAAO,EAAC,OAAO,EAAC,IAAI,EAAC,IAAI,EAAC,EAAC,IAAI,EAAC,KAAK,CAAC,IAAI,EAAC,CAAC,KAAK,CAAC,EAAC,KAAK,CAAC,KAAK,CAAC,EAAC,SAAS,EAAC,6BAA6B,EAAC,SAAS,EAAC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAC,EAAC,CAAC;QAChJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,OAAO,EAAC,OAAO,EAAC,KAAK,EAAC,OAAO,EAAC,IAAI,EAAC,KAAK,EAAC,MAAM,CAAC,KAAK,CAAC,EAAC,CAAC;QAAC,CAAC;gBACpE,CAAC;YAAC,IAAG,MAAM,KAAG,SAAS;gBAAE,SAAS,CAAC,MAAM,CAAC,CAAC;YAAC,IAAG,IAAI;gBAAE,IAAG,CAAC;oBAAA,UAAU,CAAC,IAAI,CAAC,CAAC;gBAAA,CAAC;gBAAA,MAAK,CAAC,CAAA,CAAC;YAAC,IAAG,EAAE,KAAG,SAAS,EAAC,CAAC;gBAAA,SAAS,CAAC,EAAE,CAAC,CAAC;gBAAA,UAAU,CAAC,IAAI,CAAC,CAAC;YAAA,CAAC;QAAC,CAAC;IAClJ,CAAC;CACF;AACD,MAAM,UAAU,eAAe,CAAC,QAA8B;IAC5D,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2C,CAAC;IAClE,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;IACD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAC/D,MAAM,KAAK,GAAa;QACtB,6DAA6D,EAAE,EAAE;QACjE,aAAa,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE;QACpC,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,WAAW,OAAO,aAAa,QAAQ,CAAC,OAAO,CAAC,MAAM,GAAC,OAAO,UAAU;QAClG,4EAA4E;QAC5E,0EAA0E;QAC1E,wEAAwE;QACxE,+EAA+E;QAC/E,yCAAyC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,gCAAgC;QAC/G,gFAAgF,EAAE,EAAE;KACrF,CAAC;IACF,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,cAAc,GAAC,UAAU,CAAC,CAAC;IACrF,KAAK,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,MAAM,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QAChD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAAA,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAAA,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAAA,CAAC;QACjF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;IACtC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,MAAM,EAAE,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QAChC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,QAAQ,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,CAAA,CAAC,CAAA,SAAS,CAAA,CAAC,CAAA,QAAQ,GAAG,EAAE,EAAE,EACvE,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,qBAAqB,KAAK,CAAC,iBAAiB,IAAI,qBAAqB,EAAE,EAAE,EAAE,EAAE,WAAW,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YACrK,IAAG,KAAK,CAAC,WAAW,KAAG,KAAK,CAAC,mBAAmB;gBAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,uBAAuB,EAAE,GAAG,KAAK,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACpI,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC,GAAG,MAAM,KAAK,CAAC,OAAO,CAAA,CAAC,CAAA,SAAS,CAAA,CAAC,CAAA,QAAQ,KAAK,KAAK,CAAC,IAAI,sBAAsB,KAAK,WAAW,KAAK,CAAC,MAAM,GAAC,KAAK,GAAC,CAAC,EAAE,CAAC;QACpJ,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -1,8 +1,76 @@
1
- import type { ContextManager, MessageId } from '@animalabs/context-manager';
1
+ import type { ContextManager, MessageId, MessageMetadata } from '@animalabs/context-manager';
2
2
  import type { ContentBlock, NormalizedMessage, ToolResult } from '@animalabs/membrane';
3
3
  import type { CompletedToolCall } from './types/index.js';
4
4
  export declare const TOOL_RESULT_GUARD_NOTICE = "Tool result withheld by the guard. The tool has already executed.";
5
5
  export declare const TOOL_RESULT_GUARD_AUDIT_STATE = "framework/tool-result-guard";
6
+ /** Where a withheld result's original went: a workspace path; the path a
7
+ * write to it failed at (`error`); the path a write was still under way to
8
+ * when the host stopped waiting for it (`unfinished`); no write, because the
9
+ * workspace isn't answering (`workspace_unanswered`: an earlier write is
10
+ * still under way past the host's deadline) or because the workspace had
11
+ * left the stub's branch when the file would have been committed
12
+ * (`branch_changed`), or because the batch used its deadline before this
13
+ * write could start (`batch_deadline`); or null when no file is written at all (no writable
14
+ * workspace, or the host is stopping). */
15
+ export type WithheldSpill = {
16
+ path: string;
17
+ error?: string;
18
+ unfinished?: true;
19
+ } | {
20
+ skipped: 'workspace_unanswered' | 'branch_changed' | 'batch_deadline';
21
+ } | null;
22
+ /**
23
+ * Writes one withheld original as a workspace file, using what remains of
24
+ * the batch's absolute deadline. A write still running then is unfinished.
25
+ * Once a write reaches that deadline, later spills are workspace_unanswered
26
+ * until all overdue writes settle. Other batches can start before that gate
27
+ * closes. An exhausted batch starts no write (batch_deadline).
28
+ * The tree entry lands on branch or the write is declined (branch_changed).
29
+ * The mount's disk directory is shared across branches.
30
+ */
31
+ export type WithheldSpiller = (label: string, text: string, branch: string, deadline: number) => Promise<WithheldSpill>;
32
+ /** What a host gives a guard for its withheld results: where originals are
33
+ * written, where each annotation is registered, so the host's stop can
34
+ * wait for it even after the agent itself was disposed, and where the
35
+ * guard says whether it has work left. */
36
+ export interface WithheldHost {
37
+ spill: WithheldSpiller;
38
+ /** Absolute deadline for one batch (Date.now() time), taken when the batch is queued. */
39
+ deadline(): number;
40
+ track(annotation: Promise<void>): void;
41
+ /** Whether the guard is idle (see ToolResultGuard.idle), told after each
42
+ * change that can alter it: when an annotation starts or ends, and after
43
+ * each pass over the storage queue. A host keeps a guard that isn't idle
44
+ * within reach for retries, whatever has become of its agent, and lets
45
+ * an idle one go. */
46
+ idle(idle: boolean): void;
47
+ }
48
+ /**
49
+ * The stub a withheld result settles to: #159's neutral notice, then where
50
+ * the original is, then, when its tool marked any, the fields kept from its
51
+ * result (`kept`, from keptWhenWithheld). It names no refusal and no
52
+ * category (#159 keeps those in operational logs), so reading the rest back
53
+ * is the agent's deliberate choice (agent-framework #277). The place holds
54
+ * the result as stored, which for one over the inline cap is its capped
55
+ * text, whose own note names the file with the whole output; so the stub
56
+ * says "its result", not its full result. A failed write's own error text
57
+ * stays in the audit record and the logs, not here. The audit record is
58
+ * said to keep the original only when it was saved: a staged record whose
59
+ * save failed is still queued in memory, and a restart before its retry
60
+ * loses it.
61
+ */
62
+ export declare function withheldResultNotice(spill: WithheldSpill, auditDurable: boolean, kept?: string): string;
63
+ /**
64
+ * What a withheld result's stub keeps of it: the fields of its data that its
65
+ * tool marked as saying what it acted on (ToolResult.keepWhenWithheld), in
66
+ * the order marked, serialized as a stored result is. Past the inline cap
67
+ * they're cut, with a note that says so and where the whole result is, since
68
+ * a later field can then be cut away entirely. Undefined when it keeps
69
+ * nothing, as for a failed result (agent-framework #277). A write's file
70
+ * list is evidence of what it did, rarely what drew a refusal, and keeping it
71
+ * is what shows a clobbered file when the receipt is withheld.
72
+ */
73
+ export declare function keptWhenWithheld(result: CompletedToolCall['result'], maxChars: number | undefined): string | undefined;
6
74
  /**
7
75
  * Admission of newly returned tool output to durable model-facing memory.
8
76
  *
@@ -21,8 +89,43 @@ export declare class ToolResultGuard {
21
89
  private override;
22
90
  /** True until a recovery produces a clean response/new tool round. */
23
91
  recovering: boolean;
92
+ /** Writes withheld originals where the agent can read them; without it,
93
+ * a stub names only the audit record. */
94
+ private host;
95
+ /** Annotations of withheld stubs, chained in settlement order. */
96
+ private annotating;
97
+ /** Annotations started so far, so a read can tell one began during it. */
98
+ private annotationsStarted;
24
99
  constructor(agentName: string, cm: ContextManager, configured?: boolean);
25
100
  get enabled(): boolean;
101
+ setHost(host: WithheldHost | undefined): void;
102
+ /** Settles once every annotation started so far has finished: each of
103
+ * those stubs has been edited to say where its original is, or its edit
104
+ * failed and waits in the storage queue, retried in order until it lands
105
+ * or an operator's change supersedes it (until then the stub is the bare
106
+ * notice, kept out of summaries by its compression hold, and the audit
107
+ * record names the place). It never rejects. Each batch has one deadline
108
+ * for all its workspace writes; queued batches are annotated in order.
109
+ * A request may carry an unfinished-write notice once that deadline passes. */
110
+ whenAnnotated(): Promise<void>;
111
+ /**
112
+ * Runs `read` (a compile of the context) once no withheld stub is still
113
+ * being annotated, and again if an annotation began while it ran, since a
114
+ * settlement can land during the compile's own awaits, such as a previous
115
+ * frame's teardown abandoning its batch. The framework's sent-request
116
+ * compiles go through it: the agent's activations, its direct
117
+ * API calls and their refusal retry, and a conversation fork's seed from its
118
+ * template. A request preview doesn't, so it never waits on a
119
+ * workspace write.
120
+ *
121
+ * Before `read`, a stub edit that failed gets another try with the rest of
122
+ * the storage queue; a store that is still failing then compiles the bare
123
+ * notice, which its hold keeps out of summaries.
124
+ */
125
+ afterAnnotations<T>(read: () => Promise<T>): Promise<T>;
126
+ /** No annotation is running and no storage work is queued: nothing of this
127
+ * guard is left for a host to wait on or retry. */
128
+ get idle(): boolean;
26
129
  setOverride(value: boolean | undefined): void;
27
130
  get settingOverride(): boolean | undefined;
28
131
  get hasPending(): boolean;
@@ -37,15 +140,26 @@ export declare class ToolResultGuard {
37
140
  get pendingWireReserveTokens(): number;
38
141
  /** Ordered storage work, separate from batches awaiting a provider verdict.
39
142
  * A failed acceptance edit retains both the payload and its compression
40
- * hold here; it can never re-arm refusal handling or tool submission. */
143
+ * hold here; it can never re-arm refusal handling or tool submission.
144
+ * Any failed head, including an audit-only record, blocks later queued
145
+ * edits and their holds until that operation succeeds. */
41
146
  private unrecorded;
42
- /** Retry edits and audit writes before a new activation, audit write,
43
- * maintenance pass, or shutdown. A failed operation stays at the head. */
147
+ /** Retry edits and audit writes before a new activation, a compile of a
148
+ * request that is sent (afterAnnotations), an audit write, a maintenance
149
+ * pass, or shutdown. A failed operation stays at the head. */
44
150
  flushUnrecorded(): void;
151
+ /** Make an operation's history edit, if it still has one: once it is made,
152
+ * or superseded by an operator's change, only its record is left to
153
+ * write, and its hold can go. */
154
+ private applyEdit;
45
155
  private append;
46
156
  private write;
47
157
  private archive;
48
- storeResults(content: ContentBlock[], wireResults: ToolResult[], originals: CompletedToolCall[]): MessageId;
158
+ /** `inlineCap` is the cap the caller stored `content` under; what a stub
159
+ * keeps of a withheld result is cut at it too. */
160
+ storeResults(content: ContentBlock[], wireResults: ToolResult[], originals: CompletedToolCall[], metadata: MessageMetadata | undefined,
161
+ /** The cap the results were stored under: what a stub keeps is cut there too. */
162
+ inlineCap: number | undefined): MessageId;
49
163
  /** Results for a live continuation (provideToolResults). Marks the batch
50
164
  * submitted and returns the originals only when the audit is durable;
51
165
  * otherwise returns placeholder results and leaves it unsubmitted. */
@@ -74,8 +188,30 @@ export declare class ToolResultGuard {
74
188
  withhold(category: string): string[] | null;
75
189
  /** Transfer ownership from provider admission to an ordered storage job.
76
190
  * Failure retains the accepted payload and its hold until the edit succeeds.
77
- * Withheld content is final already, so audit failures cannot keep it held. */
191
+ * A withheld batch's hold passes to its annotation instead, and from there
192
+ * to its stub's edit, so no summary is made of a stub that doesn't yet say
193
+ * where its original went. */
78
194
  private settle;
195
+ /**
196
+ * Turn a withheld batch's notices into stubs that say where each original
197
+ * is (agent-framework #277): written to the workspace when a writable mount
198
+ * takes it, else kept in the audit record. A stub also keeps the file
199
+ * lists its tool marked. Its own unedited placeholder is
200
+ * the only thing it edits: an operator's later edit, removal or rollback
201
+ * stands.
202
+ *
203
+ * Where each original went is queued first, on its own ('annotated'), so
204
+ * a stub edit that fails can't take the record of a written file with it.
205
+ * The edit is then made at once, so no storage work queued ahead of it
206
+ * holds it, not even that record if its write is failing, and its record
207
+ * ('stub_updated') is written in order after the others. An
208
+ * edit that fails joins the ordered storage queue like an admission's, with
209
+ * the batch's compression hold: retried before the next activation, compile,
210
+ * maintenance pass or stop until it lands or an operator's change supersedes
211
+ * it. Until then the stub is the bare notice, which the hold keeps out of
212
+ * summaries, and the audit record names the file.
213
+ */
214
+ private annotate;
79
215
  private releaseOperationHold;
80
216
  private releaseHold;
81
217
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tool-result-guard.d.ts","sourceRoot":"","sources":["../../src/tool-result-guard.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACvF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAG1D,eAAO,MAAM,wBAAwB,sEAAsE,CAAC;AAC5G,eAAO,MAAM,6BAA6B,gCAAgC,CAAC;AAsB3E;;;;;;;;GAQG;AACH,qBAAa,eAAe;IAQxB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAT7B,OAAO,CAAC,OAAO,CAA2B;IAC1C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAsB;IACtC,sEAAsE;IACtE,UAAU,UAAS;gBAGA,SAAS,EAAE,MAAM,EACjB,EAAE,EAAE,cAAc,EAClB,UAAU,UAAQ;IAGrC,IAAI,OAAO,IAAI,OAAO,CAA6C;IACnE,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,IAAI;IAC7C,IAAI,eAAe,IAAI,OAAO,GAAG,SAAS,CAA0B;IACpE,IAAI,UAAU,IAAI,OAAO,CAAuC;IAChE;;iFAE6E;IAC7E,IAAI,mBAAmB,IAAI,OAAO,CAA6C;IAE/E;;;2EAGuE;IACvE,IAAI,wBAAwB,IAAI,MAAM,CAcrC;IAED;;6EAEyE;IACzE,OAAO,CAAC,UAAU,CAAwB;IAE1C;8EAC0E;IAC1E,eAAe,IAAI,IAAI;IA8BvB,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,KAAK;IAab,OAAO,CAAC,OAAO;IASf,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,WAAW,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,SAAS;IAmD3G;;0EAEsE;IACtE,iBAAiB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE;IAStD;;;iEAG6D;IAC7D,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAQ7B;sEACkE;IAClE,cAAc,CAAC,QAAQ,EAAE,iBAAiB,EAAE,EAAE,gBAAgB,UAAQ,GAAG,iBAAiB,EAAE;IAkB5F;;;yEAGqE;IACrE,eAAe,IAAI,IAAI;IAQvB;;;oDAGgD;IAChD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAO5C,4EAA4E;IAC5E,MAAM,IAAI,IAAI;IAQd,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAW3C;;mFAE+E;IAC/E,OAAO,CAAC,MAAM;IAmBd,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,WAAW;CAGpB"}
1
+ {"version":3,"file":"tool-result-guard.d.ts","sourceRoot":"","sources":["../../src/tool-result-guard.ts"],"names":[],"mappings":"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"}