@abot-ai/runtime 1.2.0 → 1.3.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 (516) hide show
  1. package/README.md +14 -0
  2. package/dist/src/bridge/request-steering.d.ts +2 -1
  3. package/dist/src/bridge/request-steering.js +4 -2
  4. package/dist/src/bridge/runtime-replay.js +2 -19
  5. package/dist/src/bridge/start-agent-bridge.js +1 -1
  6. package/dist/src/capabilities/normal-invocation/validator.js +1 -1
  7. package/dist/src/capabilities/tool-definition-validator/event-presentation.js +3 -0
  8. package/dist/src/capabilities/tool-definition-validator/event-result-metadata.d.ts +2 -0
  9. package/dist/src/capabilities/tool-definition-validator/event-result-metadata.js +74 -0
  10. package/dist/src/capabilities/tool-event-metadata.js +3 -0
  11. package/dist/src/capabilities/tool-result-event-projection.d.ts +3 -0
  12. package/dist/src/capabilities/tool-result-event-projection.js +82 -0
  13. package/dist/src/capabilities/tool-types.d.ts +5 -0
  14. package/dist/src/cli/abot.js +2 -11
  15. package/dist/src/runtime/adapters/in-memory-session-store.js +1 -0
  16. package/dist/src/runtime/adapters/long-term-memory/file-lock/acquisition.js +11 -2
  17. package/dist/src/runtime/adapters/long-term-memory/file-lock/contracts.d.ts +2 -0
  18. package/dist/src/runtime/adapters/long-term-memory/file-lock/synchronous-release.d.ts +2 -0
  19. package/dist/src/runtime/adapters/long-term-memory/file-lock/synchronous-release.js +40 -0
  20. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/approval.d.ts +3 -0
  21. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/approval.js +9 -0
  22. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/rejection-event.d.ts +13 -0
  23. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/rejection-event.js +25 -0
  24. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/run.js +18 -2
  25. package/dist/src/runtime/adapters/registered-tool-normal-invocations/executor.js +8 -0
  26. package/dist/src/runtime/adapters/registered-tool-normal-invocations/payload/lifecycle.js +7 -3
  27. package/dist/src/runtime/adapters/registered-tool-normal-invocations/shared/contracts.d.ts +17 -2
  28. package/dist/src/runtime/adapters/registered-tool-normal-invocations/shared/event-metadata.d.ts +9 -0
  29. package/dist/src/runtime/adapters/registered-tool-normal-invocations/shared/event-metadata.js +8 -0
  30. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/execution.js +16 -1
  31. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-observability.js +2 -2
  32. package/dist/src/runtime/adapters/scheduled-request-outcome.d.ts +11 -0
  33. package/dist/src/runtime/adapters/scheduled-request-outcome.js +41 -0
  34. package/dist/src/runtime/adapters/scheduler-runtime.d.ts +19 -0
  35. package/dist/src/runtime/adapters/scheduler-runtime.js +138 -0
  36. package/dist/src/runtime/capabilities/scheduling/create-operations.d.ts +55 -0
  37. package/dist/src/runtime/capabilities/scheduling/create-operations.js +30 -0
  38. package/dist/src/runtime/capabilities/scheduling/create-time-zone.d.ts +1 -0
  39. package/dist/src/runtime/capabilities/scheduling/create-time-zone.js +11 -0
  40. package/dist/src/runtime/capabilities/scheduling/job-list-page.d.ts +25 -0
  41. package/dist/src/runtime/capabilities/scheduling/job-list-page.js +40 -0
  42. package/dist/src/runtime/capabilities/scheduling/model-validation.d.ts +2 -0
  43. package/dist/src/runtime/capabilities/scheduling/model-validation.js +15 -0
  44. package/dist/src/runtime/capabilities/scheduling/tool-contract.d.ts +2 -0
  45. package/dist/src/runtime/capabilities/scheduling/tool-contract.js +35 -0
  46. package/dist/src/runtime/capabilities/scheduling/tool-input-properties.d.ts +43 -0
  47. package/dist/src/runtime/capabilities/scheduling/tool-input-properties.js +27 -0
  48. package/dist/src/runtime/capabilities/scheduling/tool-module.d.ts +4 -0
  49. package/dist/src/runtime/capabilities/scheduling/tool-module.js +158 -0
  50. package/dist/src/runtime/capabilities/scheduling/update-operations.d.ts +2 -0
  51. package/dist/src/runtime/capabilities/scheduling/update-operations.js +49 -0
  52. package/dist/src/runtime/composition.d.ts +23 -3
  53. package/dist/src/runtime/composition.js +12 -17
  54. package/dist/src/runtime/config/environment-paths.d.ts +10 -0
  55. package/dist/src/runtime/config/environment-paths.js +31 -0
  56. package/dist/src/runtime/config/environment-storage.d.ts +9 -0
  57. package/dist/src/runtime/config/environment-storage.js +65 -0
  58. package/dist/src/runtime/config/fields.js +7 -0
  59. package/dist/src/runtime/config/long-term-memory.js +15 -0
  60. package/dist/src/runtime/config/schema.js +8 -0
  61. package/dist/src/runtime/config.js +9 -5
  62. package/dist/src/runtime/context/scheduled-execution-context.d.ts +10 -0
  63. package/dist/src/runtime/context/scheduled-execution-context.js +52 -0
  64. package/dist/src/runtime/default-adapters.d.ts +3 -32
  65. package/dist/src/runtime/default-adapters.js +3 -270
  66. package/dist/src/runtime/default-environment-adapters.d.ts +19 -0
  67. package/dist/src/runtime/default-environment-adapters.js +144 -0
  68. package/dist/src/runtime/index.d.ts +5 -0
  69. package/dist/src/runtime/index.js +4 -0
  70. package/dist/src/runtime/local-application.d.ts +22 -0
  71. package/dist/src/runtime/local-application.js +81 -0
  72. package/dist/src/runtime/local-host/app-memory-dispatch.d.ts +11 -0
  73. package/dist/src/runtime/local-host/app-memory-dispatch.js +103 -0
  74. package/dist/src/runtime/local-host/app-owner.d.ts +4 -0
  75. package/dist/src/runtime/local-host/app-owner.js +119 -0
  76. package/dist/src/runtime/local-host/app-request-control.d.ts +24 -0
  77. package/dist/src/runtime/local-host/app-request-control.js +135 -0
  78. package/dist/src/runtime/local-host/app-service-dispatch.d.ts +5 -0
  79. package/dist/src/runtime/local-host/app-service-dispatch.js +64 -0
  80. package/dist/src/runtime/local-host/client-identity.d.ts +3 -0
  81. package/dist/src/runtime/local-host/client-identity.js +17 -0
  82. package/dist/src/runtime/local-host/client-memory.d.ts +7 -0
  83. package/dist/src/runtime/local-host/client-memory.js +54 -0
  84. package/dist/src/runtime/local-host/client-requests.d.ts +19 -0
  85. package/dist/src/runtime/local-host/client-requests.js +145 -0
  86. package/dist/src/runtime/local-host/client-services.d.ts +10 -0
  87. package/dist/src/runtime/local-host/client-services.js +14 -0
  88. package/dist/src/runtime/local-host/contracts.d.ts +36 -0
  89. package/dist/src/runtime/local-host/contracts.js +1 -0
  90. package/dist/src/runtime/local-host/endpoint.d.ts +7 -0
  91. package/dist/src/runtime/local-host/endpoint.js +79 -0
  92. package/dist/src/runtime/local-host/owner-activity.d.ts +10 -0
  93. package/dist/src/runtime/local-host/owner-activity.js +30 -0
  94. package/dist/src/runtime/local-host/owner-retirement.d.ts +3 -0
  95. package/dist/src/runtime/local-host/owner-retirement.js +15 -0
  96. package/dist/src/runtime/local-host/owner-server.d.ts +6 -0
  97. package/dist/src/runtime/local-host/owner-server.js +88 -0
  98. package/dist/src/runtime/local-host/private-access.d.ts +2 -0
  99. package/dist/src/runtime/local-host/private-access.js +16 -0
  100. package/dist/src/runtime/local-host/private-directory.d.ts +1 -0
  101. package/dist/src/runtime/local-host/private-directory.js +57 -0
  102. package/dist/src/runtime/local-host/rpc-peer.d.ts +22 -0
  103. package/dist/src/runtime/local-host/rpc-peer.js +168 -0
  104. package/dist/src/runtime/local-host/rpc-protocol.d.ts +21 -0
  105. package/dist/src/runtime/local-host/rpc-protocol.js +46 -0
  106. package/dist/src/runtime/local-host/startup-connection.d.ts +5 -0
  107. package/dist/src/runtime/local-host/startup-connection.js +72 -0
  108. package/dist/src/runtime/local-host/transport.d.ts +3 -0
  109. package/dist/src/runtime/local-host/transport.js +88 -0
  110. package/dist/src/runtime/local-host/windows-private-access.d.ts +1 -0
  111. package/dist/src/runtime/local-host/windows-private-access.js +51 -0
  112. package/dist/src/runtime/long-term-memory/onboarding/configuration.js +6 -0
  113. package/dist/src/runtime/long-term-memory/recall-binding.d.ts +3 -0
  114. package/dist/src/runtime/long-term-memory/recall-binding.js +27 -0
  115. package/dist/src/runtime/long-term-memory/recall-context.d.ts +20 -0
  116. package/dist/src/runtime/long-term-memory/recall-context.js +101 -0
  117. package/dist/src/runtime/long-term-memory/recall-continuation.d.ts +8 -0
  118. package/dist/src/runtime/long-term-memory/recall-continuation.js +36 -0
  119. package/dist/src/runtime/long-term-memory/recall-policy.d.ts +7 -0
  120. package/dist/src/runtime/long-term-memory/recall-policy.js +14 -0
  121. package/dist/src/runtime/long-term-memory/recall-result.d.ts +5 -0
  122. package/dist/src/runtime/long-term-memory/recall-result.js +54 -0
  123. package/dist/src/runtime/long-term-memory/repository-state.d.ts +2 -1
  124. package/dist/src/runtime/long-term-memory/repository-state.js +2 -2
  125. package/dist/src/runtime/model/invoke-raw-step.d.ts +1 -0
  126. package/dist/src/runtime/model/invoke-raw-step.js +1 -0
  127. package/dist/src/runtime/model/invoke-step.js +6 -0
  128. package/dist/src/runtime/model/invoke-structured-step.d.ts +1 -0
  129. package/dist/src/runtime/model/invoke-structured-step.js +1 -0
  130. package/dist/src/runtime/model/model-step-port.d.ts +2 -0
  131. package/dist/src/runtime/model/model-step-steering.d.ts +8 -0
  132. package/dist/src/runtime/model/model-step-steering.js +19 -0
  133. package/dist/src/runtime/orchestration/final-response/authoring-contract.js +1 -1
  134. package/dist/src/runtime/orchestration/final-response/invoke.d.ts +1 -0
  135. package/dist/src/runtime/orchestration/final-response/invoke.js +1 -0
  136. package/dist/src/runtime/orchestration/role-calls/activation-budget.js +1 -0
  137. package/dist/src/runtime/orchestration/role-calls/candidate-validation.js +9 -49
  138. package/dist/src/runtime/orchestration/role-calls/capability-selection-reconsideration.d.ts +9 -0
  139. package/dist/src/runtime/orchestration/role-calls/capability-selection-reconsideration.js +17 -8
  140. package/dist/src/runtime/orchestration/role-calls/capability-selection-supervision-validation.d.ts +2 -0
  141. package/dist/src/runtime/orchestration/role-calls/capability-selection-supervision-validation.js +62 -0
  142. package/dist/src/runtime/orchestration/role-calls/command-decoder.js +4 -0
  143. package/dist/src/runtime/orchestration/role-calls/command-dispatch/memory-recall-transitions.d.ts +4 -0
  144. package/dist/src/runtime/orchestration/role-calls/command-dispatch/memory-recall-transitions.js +89 -0
  145. package/dist/src/runtime/orchestration/role-calls/command-dispatch.js +5 -0
  146. package/dist/src/runtime/orchestration/role-calls/contracts.d.ts +9 -7
  147. package/dist/src/runtime/orchestration/role-calls/contracts.js +2 -2
  148. package/dist/src/runtime/orchestration/role-calls/diagnostics.js +3 -0
  149. package/dist/src/runtime/orchestration/role-calls/index.d.ts +1 -0
  150. package/dist/src/runtime/orchestration/role-calls/index.js +1 -0
  151. package/dist/src/runtime/orchestration/role-calls/memory-recall-contract.d.ts +51 -0
  152. package/dist/src/runtime/orchestration/role-calls/memory-recall-contract.js +4 -0
  153. package/dist/src/runtime/orchestration/role-calls/memory-recall-decoder.d.ts +6 -0
  154. package/dist/src/runtime/orchestration/role-calls/memory-recall-decoder.js +147 -0
  155. package/dist/src/runtime/orchestration/role-calls/memory-recall-diagnostics.d.ts +5 -0
  156. package/dist/src/runtime/orchestration/role-calls/memory-recall-diagnostics.js +27 -0
  157. package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.d.ts +3 -0
  158. package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.js +121 -0
  159. package/dist/src/runtime/orchestration/role-calls/memory-recall-transactions.d.ts +3 -0
  160. package/dist/src/runtime/orchestration/role-calls/memory-recall-transactions.js +44 -0
  161. package/dist/src/runtime/orchestration/role-calls/reducer.js +1 -0
  162. package/dist/src/runtime/orchestration/role-calls/transaction-effect.d.ts +5 -0
  163. package/dist/src/runtime/orchestration/role-calls/transaction-effect.js +14 -0
  164. package/dist/src/runtime/orchestration/role-calls/transactions.js +3 -24
  165. package/dist/src/runtime/plugins/manifest-validator.js +4 -1
  166. package/dist/src/runtime/ports.d.ts +4 -0
  167. package/dist/src/runtime/request/bound-runtime-handler.d.ts +2 -0
  168. package/dist/src/runtime/request/bound-runtime-handler.js +25 -0
  169. package/dist/src/runtime/request/contracts.d.ts +6 -0
  170. package/dist/src/runtime/request/execution-agent-root-execution.js +12 -0
  171. package/dist/src/runtime/request/execution-facets.js +6 -0
  172. package/dist/src/runtime/request/execution-scope-surfaces.js +10 -0
  173. package/dist/src/runtime/request/execution-scope.d.ts +1 -1
  174. package/dist/src/runtime/request/handler.js +6 -0
  175. package/dist/src/runtime/request/root-contract.d.ts +7 -1
  176. package/dist/src/runtime/request/root-execution-kernel.js +33 -37
  177. package/dist/src/runtime/request/root-memory-recall.d.ts +11 -0
  178. package/dist/src/runtime/request/root-memory-recall.js +71 -0
  179. package/dist/src/runtime/request/root-observation-handoff.d.ts +17 -0
  180. package/dist/src/runtime/request/root-observation-handoff.js +44 -0
  181. package/dist/src/runtime/request/scheduled-execution.d.ts +9 -0
  182. package/dist/src/runtime/request/scheduled-execution.js +32 -0
  183. package/dist/src/runtime/request/session-admission.d.ts +17 -0
  184. package/dist/src/runtime/request/session-admission.js +88 -0
  185. package/dist/src/runtime/request/supervisor-root-execution-diagnostics.d.ts +1 -1
  186. package/dist/src/runtime/request/supervisor-root-execution.js +8 -0
  187. package/dist/src/runtime/runtime-environment.d.ts +31 -0
  188. package/dist/src/runtime/runtime-environment.js +102 -0
  189. package/dist/src/runtime/runtime-host-environment.d.ts +8 -0
  190. package/dist/src/runtime/runtime-host-environment.js +57 -0
  191. package/dist/src/runtime/runtime-host-lifecycle.d.ts +4 -0
  192. package/dist/src/runtime/runtime-host-lifecycle.js +64 -0
  193. package/dist/src/runtime/runtime-host-scheduler-ownership.d.ts +5 -0
  194. package/dist/src/runtime/runtime-host-scheduler-ownership.js +67 -0
  195. package/dist/src/runtime/runtime-host.d.ts +19 -0
  196. package/dist/src/runtime/runtime-host.js +63 -0
  197. package/dist/src/runtime/scheduler/calendar-time.d.ts +10 -0
  198. package/dist/src/runtime/scheduler/calendar-time.js +58 -0
  199. package/dist/src/runtime/scheduler/contracts.d.ts +143 -0
  200. package/dist/src/runtime/scheduler/contracts.js +1 -0
  201. package/dist/src/runtime/scheduler/file-store.d.ts +2 -0
  202. package/dist/src/runtime/scheduler/file-store.js +76 -0
  203. package/dist/src/runtime/scheduler/instant-validation.d.ts +4 -0
  204. package/dist/src/runtime/scheduler/instant-validation.js +69 -0
  205. package/dist/src/runtime/scheduler/interval-range.d.ts +8 -0
  206. package/dist/src/runtime/scheduler/interval-range.js +24 -0
  207. package/dist/src/runtime/scheduler/job-management.d.ts +8 -0
  208. package/dist/src/runtime/scheduler/job-management.js +212 -0
  209. package/dist/src/runtime/scheduler/journal-checkpoint.d.ts +9 -0
  210. package/dist/src/runtime/scheduler/journal-checkpoint.js +45 -0
  211. package/dist/src/runtime/scheduler/journal-durability.d.ts +8 -0
  212. package/dist/src/runtime/scheduler/journal-durability.js +59 -0
  213. package/dist/src/runtime/scheduler/journal-files.d.ts +14 -0
  214. package/dist/src/runtime/scheduler/journal-files.js +59 -0
  215. package/dist/src/runtime/scheduler/journal-head.d.ts +21 -0
  216. package/dist/src/runtime/scheduler/journal-head.js +81 -0
  217. package/dist/src/runtime/scheduler/journal-index-state.d.ts +31 -0
  218. package/dist/src/runtime/scheduler/journal-index-state.js +137 -0
  219. package/dist/src/runtime/scheduler/journal-index.d.ts +22 -0
  220. package/dist/src/runtime/scheduler/journal-index.js +195 -0
  221. package/dist/src/runtime/scheduler/journal-store.d.ts +21 -0
  222. package/dist/src/runtime/scheduler/journal-store.js +184 -0
  223. package/dist/src/runtime/scheduler/journal-transaction.d.ts +14 -0
  224. package/dist/src/runtime/scheduler/journal-transaction.js +104 -0
  225. package/dist/src/runtime/scheduler/next-occurrence.d.ts +3 -0
  226. package/dist/src/runtime/scheduler/next-occurrence.js +39 -0
  227. package/dist/src/runtime/scheduler/run-completion.d.ts +12 -0
  228. package/dist/src/runtime/scheduler/run-completion.js +77 -0
  229. package/dist/src/runtime/scheduler/run-list-query.d.ts +5 -0
  230. package/dist/src/runtime/scheduler/run-list-query.js +38 -0
  231. package/dist/src/runtime/scheduler/run-records.d.ts +6 -0
  232. package/dist/src/runtime/scheduler/run-records.js +41 -0
  233. package/dist/src/runtime/scheduler/schedule-update.d.ts +3 -0
  234. package/dist/src/runtime/scheduler/schedule-update.js +22 -0
  235. package/dist/src/runtime/scheduler/schedule-validation.d.ts +10 -0
  236. package/dist/src/runtime/scheduler/schedule-validation.js +132 -0
  237. package/dist/src/runtime/scheduler/scheduler-engine.d.ts +2 -0
  238. package/dist/src/runtime/scheduler/scheduler-engine.js +174 -0
  239. package/dist/src/runtime/scheduler/scheduler-service.d.ts +10 -0
  240. package/dist/src/runtime/scheduler/scheduler-service.js +115 -0
  241. package/dist/src/runtime/scheduler/service-context.d.ts +21 -0
  242. package/dist/src/runtime/scheduler/service-context.js +26 -0
  243. package/dist/src/runtime/scheduler/session-deletion-state.d.ts +9 -0
  244. package/dist/src/runtime/scheduler/session-deletion-state.js +30 -0
  245. package/dist/src/runtime/scheduler/snapshot-validation.d.ts +4 -0
  246. package/dist/src/runtime/scheduler/snapshot-validation.js +112 -0
  247. package/dist/src/runtime/scheduler/startup-recovery.d.ts +2 -0
  248. package/dist/src/runtime/scheduler/startup-recovery.js +38 -0
  249. package/dist/src/runtime/scheduler/validation-error.d.ts +4 -0
  250. package/dist/src/runtime/scheduler/validation-error.js +8 -0
  251. package/dist/src/runtime/scheduler/working-store.d.ts +3 -0
  252. package/dist/src/runtime/scheduler/working-store.js +8 -0
  253. package/dist/src/runtime/session/request-session.d.ts +1 -0
  254. package/dist/src/runtime/session/request-session.js +14 -1
  255. package/dist/src/runtime/session/session-attachment-deletion.d.ts +8 -0
  256. package/dist/src/runtime/session/session-attachment-deletion.js +87 -0
  257. package/dist/src/runtime/session/session-deletion-boundary.d.ts +10 -0
  258. package/dist/src/runtime/session/session-deletion-boundary.js +39 -0
  259. package/dist/src/runtime/session/session-deletion-cleanup.d.ts +7 -0
  260. package/dist/src/runtime/session/session-deletion-cleanup.js +62 -0
  261. package/dist/src/runtime/session/session-deletion-finalization.d.ts +7 -0
  262. package/dist/src/runtime/session/session-deletion-finalization.js +34 -0
  263. package/dist/src/runtime/session/session-deletion-receipts.d.ts +7 -0
  264. package/dist/src/runtime/session/session-deletion-receipts.js +18 -0
  265. package/dist/src/runtime/session/session-lifecycle-store.d.ts +21 -0
  266. package/dist/src/runtime/session/session-lifecycle-store.js +72 -0
  267. package/dist/src/runtime/session/session-mutation-queue.d.ts +3 -0
  268. package/dist/src/runtime/session/session-mutation-queue.js +15 -0
  269. package/dist/src/runtime/steps/execution-agent/capability-decision-parsing.d.ts +16 -0
  270. package/dist/src/runtime/steps/execution-agent/capability-decision-parsing.js +165 -0
  271. package/dist/src/runtime/steps/execution-agent/contracts.d.ts +3 -1
  272. package/dist/src/runtime/steps/execution-agent/decision-parsing.d.ts +2 -0
  273. package/dist/src/runtime/steps/execution-agent/decision-parsing.js +195 -0
  274. package/dist/src/runtime/steps/execution-agent/decision-validation.d.ts +30 -0
  275. package/dist/src/runtime/steps/execution-agent/decision-validation.js +127 -0
  276. package/dist/src/runtime/steps/execution-agent/format.d.ts +1 -0
  277. package/dist/src/runtime/steps/execution-agent/format.js +12 -0
  278. package/dist/src/runtime/steps/execution-agent/input.d.ts +2 -1
  279. package/dist/src/runtime/steps/execution-agent/input.js +17 -2
  280. package/dist/src/runtime/steps/execution-agent/parser.d.ts +1 -2
  281. package/dist/src/runtime/steps/execution-agent/parser.js +1 -472
  282. package/dist/src/runtime/steps/execution-agent/prompt.d.ts +2 -0
  283. package/dist/src/runtime/steps/execution-agent/prompt.js +2 -0
  284. package/dist/src/runtime/steps/execution-agent/reconsideration-context.js +4 -3
  285. package/dist/src/runtime/steps/execution-agent/response-input.js +5 -4
  286. package/dist/src/runtime/steps/execution-agent/response-run.d.ts +3 -0
  287. package/dist/src/runtime/steps/execution-agent/response-run.js +7 -3
  288. package/dist/src/runtime/steps/execution-agent/run.d.ts +2 -0
  289. package/dist/src/runtime/steps/execution-agent/run.js +2 -0
  290. package/dist/src/runtime/steps/execution-agent/state-context.d.ts +2 -1
  291. package/dist/src/runtime/steps/execution-agent/state-context.js +13 -5
  292. package/dist/src/runtime/steps/memory-recall-decision.d.ts +30 -0
  293. package/dist/src/runtime/steps/memory-recall-decision.js +101 -0
  294. package/dist/src/runtime/steps/memory-recall-prompt.d.ts +1 -0
  295. package/dist/src/runtime/steps/memory-recall-prompt.js +15 -0
  296. package/dist/src/runtime/steps/supervisor-decision/contracts.d.ts +4 -2
  297. package/dist/src/runtime/steps/supervisor-decision/diagnostics.d.ts +2 -0
  298. package/dist/src/runtime/steps/supervisor-decision/diagnostics.js +13 -6
  299. package/dist/src/runtime/steps/supervisor-decision/format.d.ts +2 -0
  300. package/dist/src/runtime/steps/supervisor-decision/format.js +41 -2
  301. package/dist/src/runtime/steps/supervisor-decision/input.d.ts +5 -1
  302. package/dist/src/runtime/steps/supervisor-decision/input.js +25 -5
  303. package/dist/src/runtime/steps/supervisor-decision/memory-recall-continuation.d.ts +10 -0
  304. package/dist/src/runtime/steps/supervisor-decision/memory-recall-continuation.js +32 -0
  305. package/dist/src/runtime/steps/supervisor-decision/parser.d.ts +2 -0
  306. package/dist/src/runtime/steps/supervisor-decision/parser.js +36 -1
  307. package/dist/src/runtime/steps/supervisor-decision/prompt.d.ts +3 -0
  308. package/dist/src/runtime/steps/supervisor-decision/prompt.js +16 -8
  309. package/dist/src/runtime/steps/supervisor-decision/response-recommendation.d.ts +13 -0
  310. package/dist/src/runtime/steps/supervisor-decision/response-recommendation.js +32 -0
  311. package/dist/src/runtime/steps/supervisor-decision/resume.d.ts +2 -0
  312. package/dist/src/runtime/steps/supervisor-decision/resume.js +13 -0
  313. package/dist/src/runtime/steps/supervisor-decision/run.d.ts +3 -0
  314. package/dist/src/runtime/steps/supervisor-decision/run.js +19 -0
  315. package/dist/src/runtime/steps/supervisor-decision/working-directory.js +7 -1
  316. package/dist/src/runtime/steps/supervisor-response/diagnostics.d.ts +1 -0
  317. package/dist/src/runtime/steps/supervisor-response/diagnostics.js +1 -0
  318. package/dist/src/runtime/steps/supervisor-response/input.d.ts +2 -1
  319. package/dist/src/runtime/steps/supervisor-response/input.js +17 -4
  320. package/dist/src/runtime/steps/supervisor-response/memory-authoring.d.ts +1 -0
  321. package/dist/src/runtime/steps/supervisor-response/memory-authoring.js +4 -0
  322. package/dist/src/runtime/steps/supervisor-response/prompt.d.ts +1 -0
  323. package/dist/src/runtime/steps/supervisor-response/prompt.js +8 -2
  324. package/dist/src/runtime/steps/supervisor-response/response-recommendation.d.ts +10 -0
  325. package/dist/src/runtime/steps/supervisor-response/response-recommendation.js +25 -0
  326. package/dist/src/runtime/steps/supervisor-response/run.d.ts +6 -1
  327. package/dist/src/runtime/steps/supervisor-response/run.js +26 -7
  328. package/dist/src/sessions/record/projection.js +1 -0
  329. package/dist/src/sessions/schedule-metadata.d.ts +8 -0
  330. package/dist/src/sessions/schedule-metadata.js +1 -0
  331. package/dist/src/sessions/session-service.d.ts +1 -0
  332. package/dist/src/sessions/session-service.js +1 -0
  333. package/dist/src/sessions/types.d.ts +2 -0
  334. package/dist/src/shared/http-server-shutdown.d.ts +4 -0
  335. package/dist/src/shared/http-server-shutdown.js +17 -0
  336. package/dist/src/shared/public-http/aggregate-gate.d.ts +3 -0
  337. package/dist/src/shared/public-http/aggregate-gate.js +87 -0
  338. package/dist/src/shared/public-http/deadline.d.ts +2 -0
  339. package/dist/src/shared/public-http/deadline.js +29 -0
  340. package/dist/src/shared/public-http/errors.d.ts +6 -0
  341. package/dist/src/shared/public-http/errors.js +11 -0
  342. package/dist/src/shared/public-http/limits.d.ts +8 -0
  343. package/dist/src/shared/public-http/limits.js +8 -0
  344. package/dist/src/shared/public-http/network-policy.d.ts +11 -0
  345. package/dist/src/shared/public-http/network-policy.js +178 -0
  346. package/dist/src/shared/public-http/public-http.d.ts +24 -0
  347. package/dist/src/shared/public-http/public-http.js +85 -0
  348. package/dist/src/shared/public-http/request-hop.d.ts +18 -0
  349. package/dist/src/shared/public-http/request-hop.js +140 -0
  350. package/dist/src/web-ui/app/ARCHITECTURE.md +66 -4
  351. package/dist/src/web-ui/app/app-bootstrap.js +53 -0
  352. package/dist/src/web-ui/app/app-dom.js +80 -0
  353. package/dist/src/web-ui/app/app.js +195 -212
  354. package/dist/src/web-ui/app/components/conversation-activity.d.ts +2 -0
  355. package/dist/src/web-ui/app/components/conversation-activity.js +34 -7
  356. package/dist/src/web-ui/app/components/conversation-role-cards.d.ts +1 -0
  357. package/dist/src/web-ui/app/components/conversation-role-cards.js +61 -5
  358. package/dist/src/web-ui/app/components/conversation-schedule.js +71 -0
  359. package/dist/src/web-ui/app/components/conversation-status.js +65 -0
  360. package/dist/src/web-ui/app/components/conversation-tools.d.ts +13 -0
  361. package/dist/src/web-ui/app/components/conversation-tools.js +284 -0
  362. package/dist/src/web-ui/app/components/conversation-view.js +39 -11
  363. package/dist/src/web-ui/app/components/dashboard/activity.js +61 -0
  364. package/dist/src/web-ui/app/components/dashboard/icons.js +23 -0
  365. package/dist/src/web-ui/app/components/dashboard/recent-conversations.js +64 -0
  366. package/dist/src/web-ui/app/components/dashboard/workspace.js +107 -0
  367. package/dist/src/web-ui/app/components/message-link-previews.d.ts +16 -0
  368. package/dist/src/web-ui/app/components/message-link-previews.js +179 -0
  369. package/dist/src/web-ui/app/components/schedules/details.js +101 -0
  370. package/dist/src/web-ui/app/components/schedules/form.d.ts +13 -0
  371. package/dist/src/web-ui/app/components/schedules/form.js +246 -0
  372. package/dist/src/web-ui/app/components/schedules/workspace-state.js +59 -0
  373. package/dist/src/web-ui/app/components/schedules/workspace.js +165 -0
  374. package/dist/src/web-ui/app/components/workspace-shell.js +48 -2
  375. package/dist/src/web-ui/app/configuration-feature.js +72 -0
  376. package/dist/src/web-ui/app/controllers/composer-attachments-controller.d.ts +1 -0
  377. package/dist/src/web-ui/app/controllers/composer-attachments-controller.js +17 -6
  378. package/dist/src/web-ui/app/controllers/composer-submit-controller.d.ts +2 -0
  379. package/dist/src/web-ui/app/controllers/composer-submit-controller.js +15 -1
  380. package/dist/src/web-ui/app/controllers/composer-surface-controller.js +58 -0
  381. package/dist/src/web-ui/app/controllers/composer-workspace-controller.d.ts +53 -0
  382. package/dist/src/web-ui/app/controllers/composer-workspace-controller.js +180 -0
  383. package/dist/src/web-ui/app/controllers/conversation-read-state-controller.d.ts +23 -0
  384. package/dist/src/web-ui/app/controllers/conversation-read-state-controller.js +82 -0
  385. package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +8 -0
  386. package/dist/src/web-ui/app/controllers/conversation-session-controller.js +28 -39
  387. package/dist/src/web-ui/app/controllers/dashboard-controller.js +127 -0
  388. package/dist/src/web-ui/app/controllers/home-composer-feature.d.ts +40 -0
  389. package/dist/src/web-ui/app/controllers/home-composer-feature.js +119 -0
  390. package/dist/src/web-ui/app/controllers/home-conversation-activation.js +37 -0
  391. package/dist/src/web-ui/app/controllers/realtime-event-controller.d.ts +1 -0
  392. package/dist/src/web-ui/app/controllers/realtime-event-controller.js +74 -3
  393. package/dist/src/web-ui/app/controllers/runtime-selection-controller.d.ts +2 -1
  394. package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +15 -14
  395. package/dist/src/web-ui/app/controllers/schedule-realtime.js +118 -0
  396. package/dist/src/web-ui/app/controllers/schedules-controller.js +421 -0
  397. package/dist/src/web-ui/app/controllers/session-controller.js +30 -3
  398. package/dist/src/web-ui/app/dashboard-feature.js +44 -0
  399. package/dist/src/web-ui/app/index.html +53 -1
  400. package/dist/src/web-ui/app/lib/composer-submission-scope.d.ts +21 -0
  401. package/dist/src/web-ui/app/lib/composer-submission-scope.js +13 -0
  402. package/dist/src/web-ui/app/lib/context-window-snapshot-order.d.ts +15 -0
  403. package/dist/src/web-ui/app/lib/context-window-snapshot-order.js +31 -0
  404. package/dist/src/web-ui/app/lib/conversation-role-model.d.ts +10 -1
  405. package/dist/src/web-ui/app/lib/conversation-role-model.js +97 -15
  406. package/dist/src/web-ui/app/lib/conversation-status-model.d.ts +12 -0
  407. package/dist/src/web-ui/app/lib/conversation-status-model.js +116 -0
  408. package/dist/src/web-ui/app/lib/dashboard-job-templates.js +41 -0
  409. package/dist/src/web-ui/app/lib/dashboard-presentation.js +126 -0
  410. package/dist/src/web-ui/app/lib/message-markdown.d.ts +5 -0
  411. package/dist/src/web-ui/app/lib/message-markdown.js +99 -0
  412. package/dist/src/web-ui/app/lib/message-url-policy.d.ts +1 -0
  413. package/dist/src/web-ui/app/lib/message-url-policy.js +13 -0
  414. package/dist/src/web-ui/app/lib/schedule-errors.js +29 -0
  415. package/dist/src/web-ui/app/lib/schedule-message.js +30 -0
  416. package/dist/src/web-ui/app/lib/schedule-presentation.js +81 -0
  417. package/dist/src/web-ui/app/lib/session-read-state.d.ts +22 -0
  418. package/dist/src/web-ui/app/lib/session-read-state.js +63 -0
  419. package/dist/src/web-ui/app/lib/text-format.js +2 -143
  420. package/dist/src/web-ui/app/lib/tool-activity-event.d.ts +26 -0
  421. package/dist/src/web-ui/app/lib/tool-activity-event.js +228 -0
  422. package/dist/src/web-ui/app/lib/tool-activity-model.d.ts +41 -0
  423. package/dist/src/web-ui/app/lib/tool-activity-model.js +255 -0
  424. package/dist/src/web-ui/app/lib/tool-timeline.d.ts +3 -0
  425. package/dist/src/web-ui/app/lib/tool-timeline.js +18 -0
  426. package/dist/src/web-ui/app/schedules-feature.js +87 -0
  427. package/dist/src/web-ui/app/services/message-link-preview-client.d.ts +14 -0
  428. package/dist/src/web-ui/app/services/message-link-preview-client.js +96 -0
  429. package/dist/src/web-ui/app/services/runtime-web-client/schedules.js +51 -0
  430. package/dist/src/web-ui/app/services/runtime-web-client.d.ts +37 -0
  431. package/dist/src/web-ui/app/services/runtime-web-client.js +13 -8
  432. package/dist/src/web-ui/app/styles/00-tokens-base.css +11 -11
  433. package/dist/src/web-ui/app/styles/18-dashboard.css +384 -0
  434. package/dist/src/web-ui/app/styles/20-chat-composer.css +1 -130
  435. package/dist/src/web-ui/app/styles/26-message-content.css +295 -0
  436. package/dist/src/web-ui/app/styles/27-conversation-tools.css +266 -0
  437. package/dist/src/web-ui/app/styles/28-conversation-status.css +52 -0
  438. package/dist/src/web-ui/app/styles/38-schedule-workspace.css +263 -0
  439. package/dist/src/web-ui/app/styles/38-schedules.css +352 -0
  440. package/dist/src/web-ui/app/styles/90-responsive.css +14 -0
  441. package/dist/src/web-ui/app/styles/91-schedules-responsive.css +72 -0
  442. package/dist/src/web-ui/app/styles/92-dashboard-responsive.css +88 -0
  443. package/dist/src/web-ui/app/styles.css +8 -0
  444. package/dist/src/web-ui/app/ui-behavior.d.ts +1 -1
  445. package/dist/src/web-ui/app/ui-behavior.js +3 -1
  446. package/dist/src/web-ui/app/vendor/README.md +15 -0
  447. package/dist/src/web-ui/app/vendor/markdown-it.LICENSE +22 -0
  448. package/dist/src/web-ui/app/vendor/markdown-it.js +3003 -0
  449. package/dist/src/web-ui/link-preview/metadata.d.ts +9 -0
  450. package/dist/src/web-ui/link-preview/metadata.js +97 -0
  451. package/dist/src/web-ui/link-preview/preview-cache.d.ts +4 -0
  452. package/dist/src/web-ui/link-preview/preview-cache.js +23 -0
  453. package/dist/src/web-ui/link-preview/raster-response.d.ts +9 -0
  454. package/dist/src/web-ui/link-preview/raster-response.js +49 -0
  455. package/dist/src/web-ui/link-preview/routes.d.ts +3 -0
  456. package/dist/src/web-ui/link-preview/routes.js +97 -0
  457. package/dist/src/web-ui/link-preview/service.d.ts +11 -0
  458. package/dist/src/web-ui/link-preview/service.js +117 -0
  459. package/dist/src/web-ui/local-runtime/api-router.d.ts +4 -1
  460. package/dist/src/web-ui/local-runtime/api-router.js +42 -73
  461. package/dist/src/web-ui/local-runtime/contracts.d.ts +2 -2
  462. package/dist/src/web-ui/local-runtime/environment-registry.d.ts +12 -1
  463. package/dist/src/web-ui/local-runtime/environment-registry.js +38 -3
  464. package/dist/src/web-ui/local-runtime/realtime-controller.js +3 -1
  465. package/dist/src/web-ui/local-runtime/request-execution.d.ts +5 -1
  466. package/dist/src/web-ui/local-runtime/request-execution.js +38 -2
  467. package/dist/src/web-ui/local-runtime/schedule-job-creation.d.ts +7 -0
  468. package/dist/src/web-ui/local-runtime/schedule-job-creation.js +62 -0
  469. package/dist/src/web-ui/local-runtime/schedule-management-routes.d.ts +30 -0
  470. package/dist/src/web-ui/local-runtime/schedule-management-routes.js +134 -0
  471. package/dist/src/web-ui/local-runtime/schedule-run-page.d.ts +5 -0
  472. package/dist/src/web-ui/local-runtime/schedule-run-page.js +23 -0
  473. package/dist/src/web-ui/local-runtime/session-routes.d.ts +17 -0
  474. package/dist/src/web-ui/local-runtime/session-routes.js +74 -0
  475. package/dist/src/web-ui/local-runtime-backend.d.ts +2 -0
  476. package/dist/src/web-ui/local-runtime-backend.js +11 -1
  477. package/dist/src/web-ui/schedule-creation-contract.d.ts +7 -0
  478. package/dist/src/web-ui/schedule-creation-contract.js +1 -0
  479. package/dist/src/web-ui/server-shutdown.d.ts +4 -0
  480. package/dist/src/web-ui/server-shutdown.js +32 -0
  481. package/dist/src/web-ui/server.js +13 -10
  482. package/dist/src/web-ui/session-read-state/availability.d.ts +16 -0
  483. package/dist/src/web-ui/session-read-state/availability.js +20 -0
  484. package/dist/src/web-ui/session-read-state/projection.d.ts +17 -0
  485. package/dist/src/web-ui/session-read-state/projection.js +71 -0
  486. package/dist/src/web-ui/session-read-state/service.d.ts +86 -0
  487. package/dist/src/web-ui/session-read-state/service.js +89 -0
  488. package/dist/src/web-ui/session-read-state/store.d.ts +22 -0
  489. package/dist/src/web-ui/session-read-state/store.js +110 -0
  490. package/docs/configuration.md +41 -1
  491. package/docs/long-term-memory.md +46 -5
  492. package/docs/runtime-invariant-coverage.md +1 -1
  493. package/docs/runtime-library.md +23 -0
  494. package/docs/runtime-public-contracts.md +32 -1
  495. package/package.json +3 -1
  496. package/plugins/code-outline/plugin.json +15 -0
  497. package/plugins/document-reader/plugin.json +17 -0
  498. package/plugins/filesystem/plugin.json +17 -2
  499. package/plugins/json-inspector/plugin.json +12 -0
  500. package/plugins/local-search/plugin.json +12 -0
  501. package/plugins/memory/plugin.json +26 -1
  502. package/plugins/memory/source/index.ts +10 -6
  503. package/plugins/memory/src/index.cjs +11 -7
  504. package/plugins/project-orientation/plugin.json +14 -0
  505. package/plugins/web/source/aggregate-gate.ts +8 -130
  506. package/plugins/web/source/deadline.ts +14 -50
  507. package/plugins/web/source/errors.ts +17 -11
  508. package/plugins/web/source/limits.ts +3 -6
  509. package/plugins/web/source/network-policy.ts +28 -226
  510. package/plugins/web/source/public-http.ts +17 -142
  511. package/plugins/web/source/request-hop.ts +11 -191
  512. package/plugins/web/src/index.cjs +119 -59
  513. package/runtime.config.schema.json +7 -0
  514. package/src/runtime/README.md +105 -1
  515. package/src/runtime/local-host/README.md +86 -0
  516. package/src/runtime/scheduler/README.md +166 -0
package/README.md CHANGED
@@ -13,6 +13,7 @@ hardcoded defaults.
13
13
  - Configurable local and hosted model providers
14
14
  - Persistent conversations, request events, and replay
15
15
  - Optional passive long-term memory across sessions
16
+ - Local scheduled requests bound to their conversations
16
17
  - Planning, execution, and review workflows
17
18
  - Manifest-based tools and plugins with explicit runtime boundaries
18
19
  - Workspace, file, skill, and memory capabilities
@@ -34,11 +35,24 @@ The Web UI supports:
34
35
  - steering an active request or queuing the next message
35
36
  - editing runtime configuration
36
37
  - configuring passive long-term memory with a consumer-selected embedding model
38
+ - managing schedules, their saved models, and run history in the Schedules workspace
37
39
  - inspecting runtime status, logs, and health
38
40
 
39
41
  The UI is a client of the runtime; persisted sessions, events, and request state
40
42
  remain owned by the runtime.
41
43
 
44
+ Schedules can also be managed through the model's built-in `schedules` capability.
45
+ Every Job belongs to a conversation and runs there with its saved model and FULL
46
+ tool permissions. The chat shows a compact run card; expand it to read the exact
47
+ historical prompt. ABot must be running at the scheduled time. Missed offline
48
+ occurrences and failed runs are not retried. Cancelling a Job or deleting its
49
+ conversation prevents pending starts; an already-started run continues.
50
+
51
+ Timers, one-time requests, intervals, and daily/weekly/monthly schedules are
52
+ supported. Calendar schedules require an exact time and IANA time zone. Jobs and
53
+ run history are stored locally under the environment's runtime directory.
54
+ Scheduling uses the Runtime directly and requires no plugin or external bridge.
55
+
42
56
  ## Requirements
43
57
 
44
58
  - Node.js `^20.19.0` or `>=22.12.0` (Node.js 21 is not supported)
@@ -1,8 +1,9 @@
1
1
  import type WebSocket from "ws";
2
+ import type { RuntimeRequestHandler } from "../runtime/composition.js";
2
3
  import { type RequestSteeringInbox } from "../runtime/request/request-steering.js";
3
4
  export type BridgeRequestSteeringRegistry = Readonly<{
4
5
  close(requestId: string, inbox: RequestSteeringInbox): Promise<void>;
5
6
  handleMessage(ws: WebSocket, message: Record<string, unknown>): Promise<boolean>;
6
7
  open(requestId: string): RequestSteeringInbox;
7
8
  }>;
8
- export declare function createBridgeRequestSteeringRegistry(): BridgeRequestSteeringRegistry;
9
+ export declare function createBridgeRequestSteeringRegistry(steer?: RuntimeRequestHandler["steer"]): BridgeRequestSteeringRegistry;
@@ -1,7 +1,7 @@
1
1
  import { traceDebug } from "../runtime/observability/debug-logger.js";
2
2
  import { createRequestSteeringInbox, } from "../runtime/request/request-steering.js";
3
3
  const LOG_SCOPE = "agent-bridge.request_steering";
4
- export function createBridgeRequestSteeringRegistry() {
4
+ export function createBridgeRequestSteeringRegistry(steer) {
5
5
  const active = new Map();
6
6
  return Object.freeze({
7
7
  async close(requestId, inbox) {
@@ -23,7 +23,9 @@ export function createBridgeRequestSteeringRegistry() {
23
23
  const steerId = readString(message.steerId).trim();
24
24
  const text = readString(message.text).trim();
25
25
  const current = active.get(requestId);
26
- const result = current?.inbox.append({ steerId, text }) ??
26
+ const result = (steer && current
27
+ ? await steer(requestId, { steerId, text })
28
+ : current?.inbox.append({ steerId, text })) ??
27
29
  Object.freeze({
28
30
  ok: false,
29
31
  reason: "request_not_active",
@@ -2,6 +2,7 @@ import { randomUUID } from "node:crypto";
2
2
  import { readFile } from "node:fs/promises";
3
3
  import { clearSessionMessages, deleteMessageWithStats, deleteSessionWithStats, getRequestReplayById, getSessionSnapshot, listSessions, } from "../sessions/index.js";
4
4
  import { DEFAULT_MAX_ATTACHMENT_BYTES, } from "../runtime/attachments/store.js";
5
+ import { deleteSessionWithAttachments, deleteSessionAttachmentsIfSupported, } from "../runtime/session/session-attachment-deletion.js";
5
6
  import { resolveRuntimeAttachmentMimeType } from "../shared/attachments.js";
6
7
  const defaultRuntimeReplaySessionStore = {
7
8
  clearSessionMessages,
@@ -344,10 +345,7 @@ async function handleSessionDeleteRequest(ws, msg, sessionStore, attachmentStore
344
345
  return;
345
346
  }
346
347
  try {
347
- const result = await sessionStore.deleteSessionWithStats(sessionId);
348
- if (result.deleted) {
349
- await deleteSessionAttachmentsIfSupported(attachmentStore, sessionId);
350
- }
348
+ const result = await deleteSessionWithAttachments(sessionStore, attachmentStore, sessionId);
351
349
  sendRuntimeReplayResponse(ws, {
352
350
  type: "session.delete.response",
353
351
  correlationId,
@@ -402,21 +400,6 @@ async function handleSessionMessagesClearRequest(ws, msg, sessionStore, attachme
402
400
  }, error instanceof Error ? error.message : String(error));
403
401
  }
404
402
  }
405
- async function deleteSessionAttachmentsIfSupported(attachmentStore, sessionId) {
406
- if (!attachmentStore) {
407
- return;
408
- }
409
- try {
410
- await attachmentStore.deleteSessionAttachments(sessionId);
411
- }
412
- catch (error) {
413
- if (error instanceof Error &&
414
- error.message === "attachment_owner_invalid") {
415
- return;
416
- }
417
- throw error;
418
- }
419
- }
420
403
  async function deleteAttachmentIfSupported(attachmentStore, attachment, sessionId) {
421
404
  if (!attachmentStore?.deleteAttachment) {
422
405
  return;
@@ -109,7 +109,7 @@ export function startAgentBridge(options = {}) {
109
109
  let lastMessageAt;
110
110
  let lastPongAt;
111
111
  const pendingToolApprovals = new Map();
112
- const requestSteering = createBridgeRequestSteeringRegistry();
112
+ const requestSteering = createBridgeRequestSteeringRegistry(requestHandler.steer);
113
113
  function getStatus() {
114
114
  return {
115
115
  runtimeId,
@@ -1,5 +1,5 @@
1
1
  import { TOOL_NORMAL_INVOCATION_IDENTIFIER_MAX_LENGTH, TOOL_NORMAL_INVOCATION_PAYLOAD_MAX_BYTES, TOOL_NORMAL_INVOCATION_VERSION, } from "./contracts.js";
2
- const MAX_OPERATIONS = 16;
2
+ const MAX_OPERATIONS = 32;
3
3
  const MAX_SUMMARY_LENGTH = 512;
4
4
  const MAX_INSTRUCTIONS_LENGTH = 1_024;
5
5
  const MAX_PROPERTIES = 16;
@@ -1,4 +1,5 @@
1
1
  import { isToolDefinitionRecordValue } from "./definition-shape.js";
2
+ import { parseEventResultMetadata } from "./event-result-metadata.js";
2
3
  const EVENT_PROJECTION_KINDS = [
3
4
  "string",
4
5
  "number",
@@ -16,8 +17,10 @@ export function parseEventPresentation(toolName, raw) {
16
17
  }
17
18
  const metadata = Object.fromEntries(Object.entries(raw.metadata).map(([key, projection]) => parseEventMetadataProjection(toolName, key, projection)));
18
19
  const lifecycle = parseEventLifecycle(toolName, raw.lifecycle);
20
+ const resultMetadata = parseEventResultMetadata(raw.resultMetadata, `eventPresentation.resultMetadata (${toolName})`);
19
21
  return {
20
22
  metadata,
23
+ ...(resultMetadata ? { resultMetadata } : {}),
21
24
  ...(lifecycle ? { lifecycle } : {}),
22
25
  };
23
26
  }
@@ -0,0 +1,2 @@
1
+ import type { ToolEventPresentation } from "../tool-types.js";
2
+ export declare function parseEventResultMetadata(raw: unknown, path: string): ToolEventPresentation["resultMetadata"];
@@ -0,0 +1,74 @@
1
+ import { isToolDefinitionRecordValue } from "./definition-shape.js";
2
+ const RESULT_METADATA_LIMIT = 16;
3
+ const RESULT_PATH_SEGMENT_LIMIT = 4;
4
+ const RESULT_PROJECTION_KINDS = ["preview", "number", "boolean"];
5
+ const FORBIDDEN_PATH_SEGMENTS = new Set([
6
+ "__proto__",
7
+ "prototype",
8
+ "constructor",
9
+ ]);
10
+ export function parseEventResultMetadata(raw, path) {
11
+ if (raw === undefined)
12
+ return undefined;
13
+ if (!isToolDefinitionRecordValue(raw)) {
14
+ throw new Error(`${path} must be an object`);
15
+ }
16
+ const entries = Object.entries(raw);
17
+ if (entries.length > RESULT_METADATA_LIMIT) {
18
+ throw new Error(`${path} exceeds ${RESULT_METADATA_LIMIT} projections`);
19
+ }
20
+ const result = Object.fromEntries(entries.map(([key, value]) => {
21
+ if (!hasSupportedResultMetadataKey(key)) {
22
+ throw new Error(`${path} contains an invalid metadata key`);
23
+ }
24
+ if (!isToolDefinitionRecordValue(value)) {
25
+ throw new Error(`${path}.${key} must be an object`);
26
+ }
27
+ if (hasUnknownResultProjectionFields(value)) {
28
+ throw new Error(`${path}.${key} contains an unknown field`);
29
+ }
30
+ if (!hasSupportedResultMetadataPath(value.path)) {
31
+ throw new Error(`${path}.${key}.path must select output or data`);
32
+ }
33
+ if (!isResultProjectionKind(value.kind)) {
34
+ throw new Error(`${path}.${key}.kind is not supported`);
35
+ }
36
+ return [key, { path: value.path, kind: value.kind }];
37
+ }));
38
+ for (const [key, projection] of Object.entries(result)) {
39
+ if (projection.kind !== "preview")
40
+ continue;
41
+ if (Object.hasOwn(result, `${key}Truncated`)) {
42
+ throw new Error(`${path}.${key} conflicts with its truncation metadata`);
43
+ }
44
+ }
45
+ return result;
46
+ }
47
+ function hasSupportedResultMetadataKey(key) {
48
+ if (!/^[a-zA-Z][a-zA-Z0-9]{0,63}$/u.test(key))
49
+ return false;
50
+ return !FORBIDDEN_PATH_SEGMENTS.has(key);
51
+ }
52
+ function hasSupportedResultMetadataPath(value) {
53
+ if (typeof value !== "string")
54
+ return false;
55
+ if (value === "output")
56
+ return true;
57
+ const segments = value.split(".");
58
+ if (segments[0] !== "data")
59
+ return false;
60
+ if (segments.length < 2 || segments.length > RESULT_PATH_SEGMENT_LIMIT)
61
+ return false;
62
+ return segments.every(isSupportedResultPathSegment);
63
+ }
64
+ function hasUnknownResultProjectionFields(value) {
65
+ return Object.keys(value).some((field) => field !== "path" && field !== "kind");
66
+ }
67
+ function isSupportedResultPathSegment(segment) {
68
+ if (!/^[a-zA-Z][a-zA-Z0-9_]*$/u.test(segment))
69
+ return false;
70
+ return !FORBIDDEN_PATH_SEGMENTS.has(segment);
71
+ }
72
+ function isResultProjectionKind(value) {
73
+ return RESULT_PROJECTION_KINDS.includes(value);
74
+ }
@@ -1,3 +1,4 @@
1
+ import { projectToolResultEventMetadata } from "./tool-result-event-projection.js";
1
2
  function safeTrim(value) {
2
3
  return typeof value === "string" ? value.trim() : "";
3
4
  }
@@ -177,5 +178,7 @@ export function buildToolCompletedEventMetadata(call, result, definition) {
177
178
  ...(buildCallMeta(call, definition) || {}),
178
179
  ...toolResultData,
179
180
  ...(buildResultMeta(result, actions) || {}),
181
+ // Explicit result mappings override generic display fallbacks when present.
182
+ ...projectToolResultEventMetadata(result, definition?.eventPresentation?.resultMetadata),
180
183
  });
181
184
  }
@@ -0,0 +1,3 @@
1
+ import type { ToolEventMetadata, ToolEventPresentation, ToolExecutionResult } from "./tool-types.js";
2
+ /** Derive display metadata without changing canonical tool evidence. */
3
+ export declare function projectToolResultEventMetadata(result: ToolExecutionResult, projections: ToolEventPresentation["resultMetadata"]): ToolEventMetadata | undefined;
@@ -0,0 +1,82 @@
1
+ const PREVIEW_CHARACTER_LIMIT = 1_200;
2
+ const PREVIEW_LINE_LIMIT = 20;
3
+ const EVENT_PREVIEW_CHARACTER_LIMIT = 2_400;
4
+ /** Derive display metadata without changing canonical tool evidence. */
5
+ export function projectToolResultEventMetadata(result, projections) {
6
+ if (!projections)
7
+ return undefined;
8
+ const metadata = {};
9
+ let remainingCharacters = EVENT_PREVIEW_CHARACTER_LIMIT;
10
+ for (const [key, projection] of Object.entries(projections)) {
11
+ const value = readProjectedResultValue(result, projection);
12
+ if (value === undefined)
13
+ continue;
14
+ if (typeof value !== "string") {
15
+ metadata[key] = value;
16
+ continue;
17
+ }
18
+ const preview = boundResultPreview(value, remainingCharacters);
19
+ metadata[key] = preview.text;
20
+ metadata[`${key}Truncated`] = preview.truncated;
21
+ remainingCharacters -= preview.text.length;
22
+ }
23
+ return Object.keys(metadata).length > 0 ? metadata : undefined;
24
+ }
25
+ function readProjectedResultValue(result, projection) {
26
+ const value = readOwnResultPath(result, projection.path);
27
+ if (projection.kind === "number") {
28
+ return isFiniteResultNumber(value) ? value : undefined;
29
+ }
30
+ if (projection.kind === "boolean") {
31
+ return typeof value === "boolean" ? value : undefined;
32
+ }
33
+ return typeof value === "string" ? value : undefined;
34
+ }
35
+ function readOwnResultPath(result, path) {
36
+ let value = result;
37
+ for (const segment of path.split(".")) {
38
+ if (!isOwnResultContainer(value, segment))
39
+ return undefined;
40
+ value = value[segment];
41
+ }
42
+ return value;
43
+ }
44
+ function isOwnResultContainer(value, key) {
45
+ if (value === null || typeof value !== "object")
46
+ return false;
47
+ if (Array.isArray(value))
48
+ return false;
49
+ return Object.hasOwn(value, key);
50
+ }
51
+ function isFiniteResultNumber(value) {
52
+ return typeof value === "number" && Number.isFinite(value);
53
+ }
54
+ function boundResultPreview(value, remainingCharacters) {
55
+ const characterLimit = Math.min(PREVIEW_CHARACTER_LIMIT, remainingCharacters);
56
+ let end = Math.min(value.length, characterLimit);
57
+ let lineCount = 1;
58
+ for (let index = 0; index < end; index += 1) {
59
+ if (!startsPreviewLine(value, index))
60
+ continue;
61
+ lineCount += 1;
62
+ if (lineCount <= PREVIEW_LINE_LIMIT)
63
+ continue;
64
+ end = index;
65
+ break;
66
+ }
67
+ if (splitsSurrogatePair(value, end))
68
+ end -= 1;
69
+ return { text: value.slice(0, end), truncated: end < value.length };
70
+ }
71
+ function startsPreviewLine(value, index) {
72
+ if (value[index] === "\r")
73
+ return true;
74
+ return value[index] === "\n" && value[index - 1] !== "\r";
75
+ }
76
+ function splitsSurrogatePair(value, end) {
77
+ if (end <= 0 || end >= value.length)
78
+ return false;
79
+ const before = value.charCodeAt(end - 1);
80
+ const after = value.charCodeAt(end);
81
+ return (before >= 0xd800 && before <= 0xdbff && after >= 0xdc00 && after <= 0xdfff);
82
+ }
@@ -18,8 +18,13 @@ export type ToolEventLifecycleCopy = Readonly<{
18
18
  status: string;
19
19
  message: string;
20
20
  }>;
21
+ export type ToolEventResultMetadataProjection = Readonly<{
22
+ path: string;
23
+ kind: "preview" | "number" | "boolean";
24
+ }>;
21
25
  export type ToolEventPresentation = Readonly<{
22
26
  metadata: Readonly<Record<string, ToolEventMetadataProjection>>;
27
+ resultMetadata?: Readonly<Record<string, ToolEventResultMetadataProjection>>;
23
28
  lifecycle?: Readonly<{
24
29
  started?: ToolEventLifecycleCopy;
25
30
  completed?: ToolEventLifecycleCopy;
@@ -4,6 +4,7 @@ import { runInitRuntime } from "../../scripts/init-runtime.js";
4
4
  import { runConfigureLongTermMemory } from "../../scripts/configure-long-term-memory.js";
5
5
  import { createModelGatewayServer, resolveProviderAdapters, resolveModelGatewayPort, } from "../model-gateway/server.js";
6
6
  import { loadDotEnvFile } from "../shared/load-dotenv.js";
7
+ import { closeHttpServerImmediately } from "../shared/http-server-shutdown.js";
7
8
  import { startWebUiServer } from "../web-ui/server.js";
8
9
  import { resolveWebUiAddress } from "../web-ui/web-ui-address.js";
9
10
  function printHelp() {
@@ -23,16 +24,6 @@ function printHelp() {
23
24
  " start Start the local model gateway and Web UI.",
24
25
  ].join("\n"));
25
26
  }
26
- function closeServer(server) {
27
- return new Promise((resolveClose, reject) => {
28
- server.close((error) => {
29
- if (error)
30
- reject(error);
31
- else
32
- resolveClose();
33
- });
34
- });
35
- }
36
27
  async function runStart(args) {
37
28
  if (args.includes("--help") || args.includes("-h")) {
38
29
  console.log("Usage: abot start");
@@ -75,7 +66,7 @@ async function runStart(args) {
75
66
  closing = true;
76
67
  void Promise.all([
77
68
  webUi.close(),
78
- ...(gateway ? [closeServer(gateway)] : []),
69
+ ...(gateway ? [closeHttpServerImmediately(gateway)] : []),
79
70
  ]).then(() => resolveExit(), rejectExit);
80
71
  };
81
72
  process.once("SIGINT", shutdown);
@@ -175,6 +175,7 @@ class InMemorySessionStore {
175
175
  taskType: options.taskType,
176
176
  requestId: options.requestId,
177
177
  cronJobId: options.cronJobId,
178
+ ...(options.schedule ? { schedule: options.schedule } : {}),
178
179
  cronTitle: options.cronTitle,
179
180
  triggerType: options.triggerType,
180
181
  attachments: options.attachments,
@@ -3,6 +3,7 @@ import { removeEmptyLockTree, removeObservedOwner } from "./cleanup.js";
3
3
  import { fileSystemErrorCode, INCOMPLETE_LOCK_GRACE_MS, LOCK_ACQUIRE_TIMEOUT_MS, LOCK_RETRY_DELAY_MS, ownerFileName, } from "./contracts.js";
4
4
  import { installLockDirectory } from "./install.js";
5
5
  import { readLockSnapshot } from "./snapshot.js";
6
+ import { removeObservedOwnerSynchronously } from "./synchronous-release.js";
6
7
  export async function acquireFileLock(lockPath, options) {
7
8
  const waitMs = options.waitMs ?? LOCK_ACQUIRE_TIMEOUT_MS;
8
9
  const retryDelayMs = options.retryDelayMs ?? LOCK_RETRY_DELAY_MS;
@@ -12,7 +13,7 @@ export async function acquireFileLock(lockPath, options) {
12
13
  const token = randomUUID();
13
14
  try {
14
15
  await installLockDirectory(lockPath, token);
15
- return createRelease(lockPath, token);
16
+ return createRelease(lockPath, token, options.releaseMode);
16
17
  }
17
18
  catch (error) {
18
19
  if (!isLockContention(error))
@@ -27,15 +28,23 @@ export async function acquireFileLock(lockPath, options) {
27
28
  }
28
29
  }
29
30
  }
30
- function createRelease(lockPath, token) {
31
+ function createRelease(lockPath, token, releaseMode) {
31
32
  let released = false;
32
33
  return async () => {
33
34
  if (released)
34
35
  return;
36
+ if (requiresSynchronousRelease(releaseMode)) {
37
+ removeObservedOwnerSynchronously(lockPath, ownerFileName(token));
38
+ released = true;
39
+ return;
40
+ }
35
41
  await removeObservedOwner(lockPath, ownerFileName(token));
36
42
  released = true;
37
43
  };
38
44
  }
45
+ function requiresSynchronousRelease(mode) {
46
+ return mode === "synchronous";
47
+ }
39
48
  async function removeAbandonedLock(lockPath, processIsAlive) {
40
49
  const snapshot = await readLockSnapshot(lockPath);
41
50
  if (!snapshot)
@@ -8,6 +8,8 @@ export type FileLockOptions = Readonly<{
8
8
  waitMs?: number;
9
9
  retryDelayMs?: number;
10
10
  processIsAlive?: (pid: number) => boolean;
11
+ /** Long-lived host leases must finish physical cleanup before process.exit. */
12
+ releaseMode?: "asynchronous" | "synchronous";
11
13
  }>;
12
14
  export type LockRecord = Readonly<{
13
15
  pid: number;
@@ -0,0 +1,2 @@
1
+ /** Keep token removal and directory cleanup indivisible by JavaScript exit. */
2
+ export declare function removeObservedOwnerSynchronously(lockPath: string, observedOwnerFileName: string): boolean;
@@ -0,0 +1,40 @@
1
+ import { rmdirSync, unlinkSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { fileSystemErrorCode, LEASE_DIRECTORY_NAME } from "./contracts.js";
4
+ /** Keep token removal and directory cleanup indivisible by JavaScript exit. */
5
+ export function removeObservedOwnerSynchronously(lockPath, observedOwnerFileName) {
6
+ try {
7
+ unlinkSync(join(lockPath, LEASE_DIRECTORY_NAME, observedOwnerFileName));
8
+ }
9
+ catch (error) {
10
+ if (fileSystemErrorCode(error) === "ENOENT")
11
+ return false;
12
+ throw error;
13
+ }
14
+ if (!removeReleasedDirectory(join(lockPath, LEASE_DIRECTORY_NAME)))
15
+ return false;
16
+ return removeReleasedDirectory(lockPath);
17
+ }
18
+ function removeReleasedDirectory(path) {
19
+ try {
20
+ rmdirSync(path);
21
+ return true;
22
+ }
23
+ catch (error) {
24
+ if (fileSystemErrorCode(error) === "ENOENT")
25
+ return true;
26
+ if (hasReplacementDirectoryContent(error))
27
+ return false;
28
+ throw error;
29
+ }
30
+ }
31
+ function hasReplacementDirectoryContent(error) {
32
+ switch (fileSystemErrorCode(error)) {
33
+ case "EEXIST":
34
+ case "ENOTEMPTY":
35
+ case "ENOTDIR":
36
+ return true;
37
+ default:
38
+ return false;
39
+ }
40
+ }
@@ -1,7 +1,10 @@
1
1
  import type { ToolCall } from "../../../../capabilities/tool-types.js";
2
+ import { type ToolEventExecutorIdentity } from "../shared/event-metadata.js";
2
3
  import type { ToolApprovalController, ToolPermissionMode } from "../../../ports.js";
3
4
  import type { RegisteredToolNormalInvocationRejection } from "../shared/contracts.js";
4
5
  export declare function requestNormalInvocationApproval(params: {
6
+ executionId?: string;
7
+ executorIdentity?: ToolEventExecutorIdentity;
5
8
  requestId: string;
6
9
  abortSignal: AbortSignal;
7
10
  toolPermissionMode: ToolPermissionMode;
@@ -1,3 +1,4 @@
1
+ import { buildToolExecutorEventMetadata, } from "../shared/event-metadata.js";
1
2
  import { rejectNormalInvocation } from "../shared/rejection.js";
2
3
  export async function requestNormalInvocationApproval(params) {
3
4
  if (!params.force && params.toolPermissionMode !== "ask") {
@@ -5,6 +6,8 @@ export async function requestNormalInvocationApproval(params) {
5
6
  }
6
7
  const approvalId = params.nextApprovalId();
7
8
  params.onEvent?.("tool.approval.required", {
9
+ ...buildToolExecutorEventMetadata(params.executorIdentity),
10
+ ...(params.executionId ? { executionId: params.executionId } : {}),
8
11
  approvalId,
9
12
  tool: params.call.tool,
10
13
  ...(params.eventMeta ? { meta: params.eventMeta } : {}),
@@ -12,6 +15,8 @@ export async function requestNormalInvocationApproval(params) {
12
15
  if (!params.toolApprovalController) {
13
16
  const message = "Tool approval is required, but no approval controller is configured.";
14
17
  params.onEvent?.("tool.approval.rejected", {
18
+ ...buildToolExecutorEventMetadata(params.executorIdentity),
19
+ ...(params.executionId ? { executionId: params.executionId } : {}),
15
20
  approvalId,
16
21
  tool: params.call.tool,
17
22
  reason: message,
@@ -29,6 +34,8 @@ export async function requestNormalInvocationApproval(params) {
29
34
  }, { abortSignal: params.abortSignal });
30
35
  if (decision.approved) {
31
36
  params.onEvent?.("tool.approval.granted", {
37
+ ...buildToolExecutorEventMetadata(params.executorIdentity),
38
+ ...(params.executionId ? { executionId: params.executionId } : {}),
32
39
  approvalId,
33
40
  tool: params.call.tool,
34
41
  });
@@ -36,6 +43,8 @@ export async function requestNormalInvocationApproval(params) {
36
43
  }
37
44
  const message = decision.reason?.trim() || "Tool execution was rejected.";
38
45
  params.onEvent?.("tool.approval.rejected", {
46
+ ...buildToolExecutorEventMetadata(params.executorIdentity),
47
+ ...(params.executionId ? { executionId: params.executionId } : {}),
39
48
  approvalId,
40
49
  tool: params.call.tool,
41
50
  reason: message,
@@ -0,0 +1,13 @@
1
+ import type { BoundOperation, RegisteredToolNormalInvocationExecutor, RegisteredToolNormalInvocationExecutorParams, RegisteredToolPreparedNormalInvocation } from "../shared/contracts.js";
2
+ /** Projects source controls only; rejected calls are never prepared again. */
3
+ export declare function prepareNormalInvocationRejectionEvent(params: {
4
+ operationByHandle: WeakMap<object, BoundOperation>;
5
+ input: Parameters<RegisteredToolNormalInvocationExecutor["prepareRejectionEvent"]>[0];
6
+ onEvent: RegisteredToolNormalInvocationExecutorParams["onEvent"];
7
+ }): ReturnType<RegisteredToolNormalInvocationExecutor["prepareRejectionEvent"]>;
8
+ /** Reports an admitted invocation rejected before the external tool ran. */
9
+ export declare function createPreparedInvocationRejectionEmitter(params: {
10
+ tool: string;
11
+ eventMeta: Record<string, unknown> | undefined;
12
+ onEvent: RegisteredToolNormalInvocationExecutorParams["onEvent"];
13
+ }): RegisteredToolPreparedNormalInvocation["emitRejection"];
@@ -0,0 +1,25 @@
1
+ import { buildToolExecutorEventMetadata, buildToolIntentEventMetadata, } from "../shared/event-metadata.js";
2
+ /** Projects source controls only; rejected calls are never prepared again. */
3
+ export function prepareNormalInvocationRejectionEvent(params) {
4
+ const source = params.operationByHandle.get(params.input.handle);
5
+ if (!source)
6
+ return undefined;
7
+ return createPreparedInvocationRejectionEmitter({
8
+ tool: source.registration.toolName,
9
+ eventMeta: buildToolIntentEventMetadata({ tool: source.registration.toolName, params: params.input.controls }, params.input.intent, source.registration.definition),
10
+ onEvent: params.onEvent,
11
+ });
12
+ }
13
+ /** Reports an admitted invocation rejected before the external tool ran. */
14
+ export function createPreparedInvocationRejectionEmitter(params) {
15
+ return ({ executionId, executorIdentity, errorCode }) => {
16
+ params.onEvent?.("tool.failed", {
17
+ ...buildToolExecutorEventMetadata(executorIdentity),
18
+ executionId,
19
+ tool: params.tool,
20
+ stage: "before_external_execution",
21
+ error: errorCode,
22
+ ...(params.eventMeta ? { meta: params.eventMeta } : {}),
23
+ });
24
+ };
25
+ }
@@ -1,8 +1,9 @@
1
1
  import { buildToolCompletedEventActions, buildToolCompletedEventMetadata, buildToolLifecycleEventCopy, } from "../../../../capabilities/tool-event-metadata.js";
2
2
  import { requestNormalInvocationApproval } from "./approval.js";
3
+ import { createPreparedInvocationRejectionEmitter } from "./rejection-event.js";
3
4
  import { captureToolCall, materializeCall, resolveExactTargetOperation, validateCompleteCall, } from "./call-binding.js";
4
5
  import { createRegisteredToolActionFingerprint } from "../shared/action-fingerprint.js";
5
- import { buildToolIntentEventMetadata } from "../shared/event-metadata.js";
6
+ import { buildToolExecutorEventMetadata, buildToolIntentEventMetadata, } from "../shared/event-metadata.js";
6
7
  import { prepareCompleteInvocationInput } from "../payload/input-preparation.js";
7
8
  import { rejectNormalInvocation } from "../shared/rejection.js";
8
9
  export async function executeNormalInvocation(params) {
@@ -59,7 +60,14 @@ export function prepareNormalInvocation(params) {
59
60
  status: "prepared",
60
61
  actionFingerprint,
61
62
  acceptedControls: preparedInput.controls,
62
- execute: () => executePreparedNormalInvocation({
63
+ emitRejection: createPreparedInvocationRejectionEmitter({
64
+ tool: source.registration.toolName,
65
+ eventMeta,
66
+ onEvent: executor.onEvent,
67
+ }),
68
+ execute: (executionId, executorIdentity) => executePreparedNormalInvocation({
69
+ ...(executionId ? { executionId } : {}),
70
+ ...(executorIdentity ? { executorIdentity } : {}),
63
71
  executor,
64
72
  source,
65
73
  target: target.binding,
@@ -71,6 +79,10 @@ export function prepareNormalInvocation(params) {
71
79
  }
72
80
  async function executePreparedNormalInvocation(params) {
73
81
  const approval = await requestNormalInvocationApproval({
82
+ ...(params.executorIdentity
83
+ ? { executorIdentity: params.executorIdentity }
84
+ : {}),
85
+ ...(params.executionId ? { executionId: params.executionId } : {}),
74
86
  requestId: params.executor.requestId,
75
87
  abortSignal: params.executor.abortSignal,
76
88
  toolPermissionMode: params.executor.toolPermissionMode,
@@ -89,6 +101,8 @@ async function executePreparedNormalInvocation(params) {
89
101
  params.executor.abortSignal.throwIfAborted();
90
102
  const startedCopy = buildToolLifecycleEventCopy(params.target.registration.definition, "started");
91
103
  params.executor.onEvent?.("tool.started", {
104
+ ...buildToolExecutorEventMetadata(params.executorIdentity),
105
+ ...(params.executionId ? { executionId: params.executionId } : {}),
92
106
  tool: params.call.tool,
93
107
  ...(params.input.intent
94
108
  ? { intent: params.input.intent, intentSource: "model" }
@@ -106,6 +120,8 @@ async function executePreparedNormalInvocation(params) {
106
120
  const completedMeta = buildToolCompletedEventMetadata(params.call, result, params.target.registration.definition);
107
121
  const completedCopy = buildToolLifecycleEventCopy(params.target.registration.definition, result.ok ? "completed" : "failed");
108
122
  params.executor.onEvent?.("tool.completed", {
123
+ ...buildToolExecutorEventMetadata(params.executorIdentity),
124
+ ...(params.executionId ? { executionId: params.executionId } : {}),
109
125
  tool: params.source.registration.toolName,
110
126
  ok: result.ok,
111
127
  actions: completionActions,
@@ -4,6 +4,7 @@ import { projectRuntimePathBindings } from "./catalog/runtime-path-bindings.js";
4
4
  import { executeNormalInvocation, prepareNormalInvocation, } from "./execution/run.js";
5
5
  import { emitNormalInvocationPayloadLifecycle } from "./payload/lifecycle.js";
6
6
  import { prepareNormalInvocationPayloadLifecycle } from "./payload/lifecycle.js";
7
+ import { prepareNormalInvocationRejectionEvent } from "./execution/rejection-event.js";
7
8
  /**
8
9
  * Captures one selected ToolRegistry snapshot and executes its ordinary
9
10
  * invocation contracts. Normalization may only resolve another operation from
@@ -36,6 +37,13 @@ export function createRegisteredToolNormalInvocationExecutor(params) {
36
37
  })));
37
38
  return Object.freeze({
38
39
  operations,
40
+ prepareRejectionEvent(input) {
41
+ return prepareNormalInvocationRejectionEvent({
42
+ operationByHandle,
43
+ input,
44
+ onEvent: params.onEvent,
45
+ });
46
+ },
39
47
  emitPayloadLifecycle(input) {
40
48
  return emitNormalInvocationPayloadLifecycle({
41
49
  operationByHandle,