@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
@@ -6,9 +6,11 @@ import { pathToFileURL } from "node:url";
6
6
  import { WebSocketServer } from "ws";
7
7
  import { inspectRuntimeConfigFileWithMeta } from "../runtime/config/loader.js";
8
8
  import { loadDotEnvFile } from "../shared/load-dotenv.js";
9
+ import { createWebUiShutdown } from "./server-shutdown.js";
9
10
  import { ExternalBridgeWebBackend } from "./external-bridge-backend.js";
10
11
  import { LocalRuntimeWebBackend } from "./local-runtime-backend.js";
11
12
  import { resolveWebUiAddress } from "./web-ui-address.js";
13
+ import { createLinkPreviewRouteHandler } from "./link-preview/routes.js";
12
14
  const DEFAULT_WEB_BACKEND = "runtime";
13
15
  const DEFAULT_BRIDGE_API_BASE = "http://127.0.0.1:8787/abot/api";
14
16
  const DEFAULT_BRIDGE_REALTIME_URL = "ws://127.0.0.1:8787/abot/realtime";
@@ -226,8 +228,11 @@ export function startWebUiServer(overrides = {}) {
226
228
  externalBridgeBackend.handleRealtimeConnection(client);
227
229
  });
228
230
  }
231
+ const handleLinkPreview = createLinkPreviewRouteHandler();
229
232
  const server = createServer((req, res) => {
230
233
  void (async () => {
234
+ if (await handleLinkPreview(req, res))
235
+ return;
231
236
  const pathname = new URL(req.url || "/", "http://localhost").pathname;
232
237
  if (pathname === "/web-config") {
233
238
  sendJson(res, 200, {
@@ -301,7 +306,12 @@ export function startWebUiServer(overrides = {}) {
301
306
  wss.emit("connection", ws, req);
302
307
  });
303
308
  });
304
- server.listen(options.port, options.host, () => {
309
+ const listenAbort = new AbortController();
310
+ server.listen({
311
+ port: options.port,
312
+ host: options.host,
313
+ signal: listenAbort.signal,
314
+ }, () => {
305
315
  console.log(`abot web UI listening on http://${options.host}:${options.port}`);
306
316
  if (localRuntimeBackend) {
307
317
  console.log("using local abot backend");
@@ -311,16 +321,9 @@ export function startWebUiServer(overrides = {}) {
311
321
  console.log(`using external bridge realtime ${options.realtimeUrl}`);
312
322
  }
313
323
  });
324
+ const schedulerStartup = localRuntimeBackend?.start(options.environments.map(({ id }) => id));
314
325
  return {
315
- close: () => new Promise((resolveClose, reject) => {
316
- wss.close();
317
- server.close((error) => {
318
- if (error)
319
- reject(error);
320
- else
321
- resolveClose();
322
- });
323
- }),
326
+ close: createWebUiShutdown(server, wss, schedulerStartup, () => localRuntimeBackend?.stop(), listenAbort),
324
327
  };
325
328
  }
326
329
  const invokedPath = process.argv[1] ? pathToFileURL(process.argv[1]).href : "";
@@ -0,0 +1,16 @@
1
+ /** Isolate UI sidecar failures; canonical session operations stay outside this boundary. */
2
+ export declare function captureReadStateAvailability<T>(operation: () => Promise<T>): Promise<{
3
+ readStateStatus: "available";
4
+ value: Awaited<T>;
5
+ } | {
6
+ readStateStatus: "unavailable";
7
+ value?: undefined;
8
+ }>;
9
+ export declare function unavailableSessionReadState(sessionId: string): {
10
+ sessionId: string;
11
+ readStateStatus: "unavailable";
12
+ unreadCount: null;
13
+ hasUnread: null;
14
+ lastReadAt: null;
15
+ lastReadMessageId: null;
16
+ };
@@ -0,0 +1,20 @@
1
+ /** Isolate UI sidecar failures; canonical session operations stay outside this boundary. */
2
+ export async function captureReadStateAvailability(operation) {
3
+ try {
4
+ return { readStateStatus: "available", value: await operation() };
5
+ }
6
+ catch (error) {
7
+ console.error("Web UI read tracking unavailable:", error);
8
+ return { readStateStatus: "unavailable" };
9
+ }
10
+ }
11
+ export function unavailableSessionReadState(sessionId) {
12
+ return {
13
+ sessionId,
14
+ readStateStatus: "unavailable",
15
+ unreadCount: null,
16
+ hasUnread: null,
17
+ lastReadAt: null,
18
+ lastReadMessageId: null,
19
+ };
20
+ }
@@ -0,0 +1,17 @@
1
+ import type { SessionSnapshotMessage } from "../../sessions/types.js";
2
+ import type { WebReadState } from "./store.js";
3
+ export type ReadBoundary = {
4
+ readThroughMessageId?: unknown;
5
+ readThroughRequestId?: unknown;
6
+ };
7
+ export declare function advanceReadCursor(state: WebReadState, sessionId: string, messages: SessionSnapshotMessage[], boundary: ReadBoundary, now: number): void;
8
+ export declare function projectSessionReadState(state: WebReadState, sessionId: string, messages: SessionSnapshotMessage[]): {
9
+ sessionId: string;
10
+ readStateStatus: "available";
11
+ unreadCount: number;
12
+ hasUnread: boolean;
13
+ lastReadMessageId: string | null;
14
+ lastReadAt: number;
15
+ latestMessageId: string | number | null;
16
+ latestAssistantMessageId: string | number | null;
17
+ };
@@ -0,0 +1,71 @@
1
+ function messageTimestamp(message) {
2
+ const value = typeof message.createdAt === "number"
3
+ ? message.createdAt
4
+ : Date.parse(String(message.createdAt));
5
+ return Number.isFinite(value) ? value : 0;
6
+ }
7
+ function cursorIndex(messages, cursor) {
8
+ if (!cursor)
9
+ return -1;
10
+ if (!cursor.messageId)
11
+ return -1;
12
+ return messages.findIndex((message) => String(message.id) === cursor.messageId &&
13
+ messageTimestamp(message) === cursor.createdAt);
14
+ }
15
+ function requestedAssistantIndex(messages, boundary) {
16
+ const id = boundary.readThroughMessageId;
17
+ const hasNumericBoundary = typeof id === "number" && Number.isSafeInteger(id) && id >= 0;
18
+ if (hasNumericBoundary)
19
+ return messages.findIndex((message) => message.role === "assistant" && String(message.id) === String(id));
20
+ const requestId = boundary.readThroughRequestId;
21
+ if (typeof requestId !== "string" || !requestId)
22
+ return -1;
23
+ for (let index = messages.length - 1; index >= 0; index -= 1) {
24
+ const message = messages[index];
25
+ if (message.role === "assistant" && message.requestId === requestId)
26
+ return index;
27
+ }
28
+ return -1;
29
+ }
30
+ export function advanceReadCursor(state, sessionId, messages, boundary, now) {
31
+ const nextIndex = requestedAssistantIndex(messages, boundary);
32
+ if (nextIndex < 0)
33
+ return;
34
+ const cursors = new Map(state.cursors);
35
+ const previous = cursors.get(sessionId);
36
+ const previousIndex = cursorIndex(messages, previous);
37
+ if (previousIndex >= nextIndex)
38
+ return;
39
+ const message = messages[nextIndex];
40
+ const createdAt = messageTimestamp(message);
41
+ if (previous && previous.createdAt > createdAt)
42
+ return;
43
+ cursors.set(sessionId, {
44
+ messageId: String(message.id),
45
+ createdAt,
46
+ lastReadAt: Math.max(now, (previous?.lastReadAt ?? state.initializedAt) + 1),
47
+ });
48
+ state.cursors = [...cursors];
49
+ }
50
+ export function projectSessionReadState(state, sessionId, messages) {
51
+ const cursor = new Map(state.cursors).get(sessionId);
52
+ const readIndex = cursorIndex(messages, cursor);
53
+ const unreadCount = messages.filter((message, index) => {
54
+ if (message.role !== "assistant")
55
+ return false;
56
+ if (messageTimestamp(message) <= state.initializedAt)
57
+ return false;
58
+ return index > readIndex;
59
+ }).length;
60
+ return {
61
+ sessionId,
62
+ readStateStatus: "available",
63
+ unreadCount,
64
+ hasUnread: unreadCount > 0,
65
+ lastReadMessageId: cursor?.messageId || null,
66
+ lastReadAt: cursor?.lastReadAt ?? state.initializedAt,
67
+ latestMessageId: messages.at(-1)?.id ?? null,
68
+ latestAssistantMessageId: [...messages].reverse().find((message) => message.role === "assistant")
69
+ ?.id ?? null,
70
+ };
71
+ }
@@ -0,0 +1,86 @@
1
+ import type { RuntimeConfig, SessionStore } from "../../runtime/ports.js";
2
+ import type { SessionSnapshot } from "../../sessions/types.js";
3
+ import { type ReadBoundary } from "./projection.js";
4
+ type Sessions = Pick<SessionStore, "getSessionSnapshot">;
5
+ type Environment = {
6
+ services: {
7
+ config: RuntimeConfig;
8
+ sessions: Sessions;
9
+ };
10
+ };
11
+ export declare class WebSessionReadStates {
12
+ private readonly getEnvironment;
13
+ private readonly now;
14
+ private readonly stores;
15
+ private readonly initializedAt;
16
+ constructor(getEnvironment: (id: string) => Environment, now?: () => number);
17
+ private store;
18
+ initialize(environmentId: string): Promise<void>;
19
+ forget(environmentId: string, sessionId: string): Promise<void>;
20
+ reset(environmentId: string, sessionId: string): Promise<void>;
21
+ project(environmentId: string, snapshot: SessionSnapshot): Promise<{
22
+ sessionId: string;
23
+ readStateStatus: "unavailable";
24
+ unreadCount: null;
25
+ hasUnread: null;
26
+ lastReadAt: null;
27
+ lastReadMessageId: null;
28
+ } | {
29
+ sessionId: string;
30
+ readStateStatus: "available";
31
+ unreadCount: number;
32
+ hasUnread: boolean;
33
+ lastReadMessageId: string | null;
34
+ lastReadAt: number;
35
+ latestMessageId: string | number | null;
36
+ latestAssistantMessageId: string | number | null;
37
+ }>;
38
+ mark(environmentId: string, sessionId: string, boundary: ReadBoundary): Promise<{
39
+ sessionId: string;
40
+ readStateStatus: "available";
41
+ unreadCount: number;
42
+ hasUnread: boolean;
43
+ lastReadMessageId: string | null;
44
+ lastReadAt: number;
45
+ latestMessageId: string | number | null;
46
+ latestAssistantMessageId: string | number | null;
47
+ } | null>;
48
+ list(environmentId: string): Promise<{
49
+ sessions: {
50
+ sessionId: string;
51
+ readStateStatus: "available";
52
+ unreadCount: number;
53
+ hasUnread: boolean;
54
+ lastReadMessageId: string | null;
55
+ lastReadAt: number;
56
+ latestMessageId: string | number | null;
57
+ latestAssistantMessageId: string | number | null;
58
+ id: string;
59
+ title: string;
60
+ createdAt: number;
61
+ updatedAt: number;
62
+ lastMessagePreview: string;
63
+ lastMessageAt: number | null;
64
+ }[];
65
+ nextCursor: null;
66
+ } | {
67
+ sessions: {
68
+ sessionId: string;
69
+ readStateStatus: "unavailable";
70
+ unreadCount: null;
71
+ hasUnread: null;
72
+ lastReadAt: null;
73
+ lastReadMessageId: null;
74
+ id: string;
75
+ title: string;
76
+ createdAt: number;
77
+ updatedAt: number;
78
+ lastMessagePreview: string;
79
+ lastMessageAt: number | null;
80
+ latestMessageId: string | number | null;
81
+ latestAssistantMessageId: string | number | null;
82
+ }[];
83
+ nextCursor: null;
84
+ }>;
85
+ }
86
+ export {};
@@ -0,0 +1,89 @@
1
+ import { createHash } from "node:crypto";
2
+ import { join, resolve } from "node:path";
3
+ import { SessionService } from "../../sessions/session-service.js";
4
+ import { clientVisibleMessages, toSessionListItem, toSnapshotMessage, } from "../../sessions/record/projection.js";
5
+ import { WebReadStateStore } from "./store.js";
6
+ import { captureReadStateAvailability, unavailableSessionReadState, } from "./availability.js";
7
+ import { advanceReadCursor, projectSessionReadState, } from "./projection.js";
8
+ export class WebSessionReadStates {
9
+ getEnvironment;
10
+ now;
11
+ stores = new Map();
12
+ initializedAt;
13
+ constructor(getEnvironment, now = Date.now) {
14
+ this.getEnvironment = getEnvironment;
15
+ this.now = now;
16
+ this.initializedAt = now();
17
+ }
18
+ store(environmentId) {
19
+ const { paths } = this.getEnvironment(environmentId).services.config;
20
+ const identity = JSON.stringify([
21
+ environmentId,
22
+ resolve(paths.sessionsDir),
23
+ ]);
24
+ const existing = this.stores.get(identity);
25
+ if (existing)
26
+ return existing;
27
+ const filename = createHash("sha256").update(identity).digest("hex") + ".json";
28
+ const store = new WebReadStateStore(join(paths.runtimeDir, "web-ui", "read-state", filename), this.initializedAt);
29
+ this.stores.set(identity, store);
30
+ return store;
31
+ }
32
+ initialize(environmentId) {
33
+ return this.store(environmentId).initialize();
34
+ }
35
+ async forget(environmentId, sessionId) {
36
+ await captureReadStateAvailability(() => this.store(environmentId).forget(sessionId));
37
+ }
38
+ async reset(environmentId, sessionId) {
39
+ await captureReadStateAvailability(() => this.store(environmentId).reset(sessionId, this.now()));
40
+ }
41
+ async project(environmentId, snapshot) {
42
+ const result = await captureReadStateAvailability(() => this.store(environmentId).transaction((state) => projectSessionReadState(state, snapshot.sessionId, snapshot.messages)));
43
+ if (result.readStateStatus === "unavailable")
44
+ return unavailableSessionReadState(snapshot.sessionId);
45
+ return result.value;
46
+ }
47
+ async mark(environmentId, sessionId, boundary) {
48
+ const store = this.store(environmentId);
49
+ await store.initialize();
50
+ const sessions = this.getEnvironment(environmentId).services.sessions;
51
+ return store.transaction(async (state) => {
52
+ const snapshot = await sessions.getSessionSnapshot(sessionId, {
53
+ includeRequests: false,
54
+ });
55
+ if (!snapshot)
56
+ return null;
57
+ advanceReadCursor(state, sessionId, snapshot.messages, boundary, this.now());
58
+ return projectSessionReadState(state, sessionId, snapshot.messages);
59
+ });
60
+ }
61
+ async list(environmentId) {
62
+ const { sessionsDir } = this.getEnvironment(environmentId).services.config.paths;
63
+ // One canonical disk enumeration avoids mutable offset pages and sending
64
+ // every request event across the managed Runtime's bounded RPC transport.
65
+ const records = await new SessionService({ sessionsDir }).getAllSessions();
66
+ const projectedSessions = records.map((record) => ({
67
+ summary: toSessionListItem(record),
68
+ messages: clientVisibleMessages(record.messages).map((message) => toSnapshotMessage(record.id, message, record.requests ?? [])),
69
+ }));
70
+ const result = await captureReadStateAvailability(() => this.store(environmentId).transaction((state) => {
71
+ const sessions = projectedSessions.map(({ summary, messages }) => {
72
+ return {
73
+ ...summary,
74
+ ...projectSessionReadState(state, summary.id, messages),
75
+ };
76
+ });
77
+ return { sessions, nextCursor: null };
78
+ }));
79
+ if (result.readStateStatus === "unavailable")
80
+ return {
81
+ sessions: projectedSessions.map(({ summary }) => ({
82
+ ...summary,
83
+ ...unavailableSessionReadState(summary.id),
84
+ })),
85
+ nextCursor: null,
86
+ };
87
+ return result.value;
88
+ }
89
+ }
@@ -0,0 +1,22 @@
1
+ export type WebReadCursor = {
2
+ messageId: string;
3
+ createdAt: number;
4
+ lastReadAt: number;
5
+ };
6
+ export type WebReadState = {
7
+ version: 1;
8
+ initializedAt: number;
9
+ cursors: Array<[string, WebReadCursor]>;
10
+ };
11
+ /** UI-owned state; never writes Runtime session records or model context. */
12
+ export declare class WebReadStateStore {
13
+ private readonly initializedAt;
14
+ private readonly path;
15
+ constructor(path: string, initializedAt: number);
16
+ private load;
17
+ private save;
18
+ transaction<T>(operation: (state: WebReadState) => T | Promise<T>): Promise<T>;
19
+ initialize(): Promise<void>;
20
+ reset(sessionId: string, now: number): Promise<void>;
21
+ forget(sessionId: string): Promise<void>;
22
+ }
@@ -0,0 +1,110 @@
1
+ import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
2
+ import { dirname, resolve } from "node:path";
3
+ import { randomUUID } from "node:crypto";
4
+ const pendingWrites = new Map();
5
+ function hasFileErrorCode(error, code) {
6
+ return error instanceof Error && "code" in error && error.code === code;
7
+ }
8
+ function isReadCursor(value) {
9
+ if (!value || typeof value !== "object")
10
+ return false;
11
+ const cursor = value;
12
+ if (typeof cursor.messageId !== "string")
13
+ return false;
14
+ if (!Number.isFinite(cursor.createdAt))
15
+ return false;
16
+ return Number.isFinite(cursor.lastReadAt);
17
+ }
18
+ function decodeReadState(raw) {
19
+ const state = JSON.parse(raw);
20
+ if (state?.version !== 1)
21
+ throw new Error("Unsupported Web UI read state.");
22
+ if (!Number.isFinite(state.initializedAt))
23
+ throw new Error("Invalid Web UI read boundary.");
24
+ if (!Array.isArray(state.cursors))
25
+ throw new Error("Invalid Web UI read cursors.");
26
+ for (const entry of state.cursors) {
27
+ if (!Array.isArray(entry) || entry.length !== 2)
28
+ throw new Error("Invalid Web UI read cursor entry.");
29
+ if (typeof entry[0] !== "string" || !isReadCursor(entry[1]))
30
+ throw new Error("Invalid Web UI read cursor entry.");
31
+ }
32
+ return state;
33
+ }
34
+ /** UI-owned state; never writes Runtime session records or model context. */
35
+ export class WebReadStateStore {
36
+ initializedAt;
37
+ path;
38
+ constructor(path, initializedAt) {
39
+ this.initializedAt = initializedAt;
40
+ this.path = resolve(path);
41
+ }
42
+ async load() {
43
+ try {
44
+ return decodeReadState(await readFile(this.path, "utf8"));
45
+ }
46
+ catch (error) {
47
+ if (hasFileErrorCode(error, "ENOENT"))
48
+ return null;
49
+ throw error;
50
+ }
51
+ }
52
+ async save(state) {
53
+ await mkdir(dirname(this.path), { recursive: true });
54
+ const temporary = `${this.path}.${process.pid}.${randomUUID()}.tmp`;
55
+ try {
56
+ await writeFile(temporary, JSON.stringify(state), "utf8");
57
+ await rename(temporary, this.path);
58
+ }
59
+ catch (error) {
60
+ await rm(temporary, { force: true }).catch(() => undefined);
61
+ throw error;
62
+ }
63
+ }
64
+ async transaction(operation) {
65
+ const prior = pendingWrites.get(this.path) ?? Promise.resolve();
66
+ const pending = prior
67
+ .catch(() => undefined)
68
+ .then(async () => {
69
+ const existing = await this.load();
70
+ const state = existing ?? {
71
+ version: 1,
72
+ initializedAt: this.initializedAt,
73
+ cursors: [],
74
+ };
75
+ const before = JSON.stringify(state);
76
+ const result = await operation(state);
77
+ if (!existing || JSON.stringify(state) !== before)
78
+ await this.save(state);
79
+ return result;
80
+ });
81
+ pendingWrites.set(this.path, pending);
82
+ try {
83
+ return await pending;
84
+ }
85
+ finally {
86
+ if (pendingWrites.get(this.path) === pending)
87
+ pendingWrites.delete(this.path);
88
+ }
89
+ }
90
+ initialize() {
91
+ return this.transaction(() => undefined);
92
+ }
93
+ reset(sessionId, now) {
94
+ return this.transaction((state) => {
95
+ const cursors = new Map(state.cursors);
96
+ const previous = cursors.get(sessionId);
97
+ cursors.set(sessionId, {
98
+ messageId: "",
99
+ createdAt: 0,
100
+ lastReadAt: Math.max(now, (previous?.lastReadAt ?? state.initializedAt) + 1),
101
+ });
102
+ state.cursors = [...cursors];
103
+ });
104
+ }
105
+ forget(sessionId) {
106
+ return this.transaction((state) => {
107
+ state.cursors = state.cursors.filter(([id]) => id !== sessionId);
108
+ });
109
+ }
110
+ }
@@ -143,7 +143,21 @@ storage, privacy, retrieval, and management behavior.
143
143
 
144
144
  ## Paths
145
145
 
146
- `environment.paths.runtimeDir` is environment-local generated runtime state.
146
+ `environment.paths.runtimeDir` is the generated runtime state base. A named
147
+ environment profile without its own `paths.runtimeDir` uses
148
+ `<base>/environments/<sha256(profileId)>`. The stable profile ID determines that
149
+ directory; changing models or adding another profile does not move its state.
150
+ `LLM_RUNTIME_DIR` takes precedence over profile paths and acts as the shared base
151
+ when a profile is selected. Without a selected profile, the existing runtime
152
+ directory layout is unchanged.
153
+
154
+ An explicit `environment.profiles.<id>.paths.runtimeDir` is already a final
155
+ environment directory and is preserved when there is no `LLM_RUNTIME_DIR`
156
+ override. Explicit session, attachment and trace path overrides also remain
157
+ final paths. Use distinct final paths for different environments. The resolved
158
+ runtime directory owns local hosting, scheduling, passive memory, plugin state,
159
+ and the default session, attachment and log paths. Shared, compiled, workspace
160
+ and agent-work directories retain their configured sharing behavior.
147
161
  `environment.paths.attachmentsDir` stores runtime-managed attachment files
148
162
  referenced by session/request metadata. Images and supported document files
149
163
  share this store; document contents are read on demand by a request-bound tool
@@ -220,6 +234,32 @@ LLM_RUNTIME_PROFILE=dev npm run dev
220
234
 
221
235
  The active profile id becomes the runtime id used by the bridge.
222
236
 
237
+ Existing populated state in an inherited base is never automatically moved or
238
+ silently replaced by an empty environment. Loading stops with
239
+ `runtime_environment_storage_assignment_required` until that state is explicitly
240
+ assigned. For example, to retain an existing `prod` environment at `.runtime`
241
+ and add an isolated `dev` environment:
242
+
243
+ ```json
244
+ {
245
+ "environment": {
246
+ "default": "prod",
247
+ "paths": { "runtimeDir": ".runtime" },
248
+ "profiles": {
249
+ "prod": { "paths": { "runtimeDir": ".runtime" } },
250
+ "dev": {}
251
+ }
252
+ }
253
+ }
254
+ ```
255
+
256
+ This leaves existing Jobs and conversations in place and gives `dev` its own
257
+ namespace. Preserve any previous explicit session, attachment and trace paths
258
+ on the assigned profile too. Remove a shared `LLM_RUNTIME_DIR` override before
259
+ making this assignment because environment variables keep their precedence.
260
+ The stored Jobs must retain their original environment ID. Empty state folders
261
+ and intentionally shared or compiled artifacts do not require assignment.
262
+
223
263
  ## Request Runner
224
264
 
225
265
  The runtime config owns host wiring, installed models, and plugin availability.
@@ -1,9 +1,10 @@
1
1
  # Passive Long-Term Memory
2
2
 
3
3
  ABot Runtime can retain selected user facts and preferences across sessions.
4
- This feature is passive: the model does not invoke a memory tool, and the
5
- Runtime core remains the only owner of retrieval, filtering, deduplication,
6
- storage, and deletion.
4
+ Memory is stored in a Runtime-owned pool. The Runtime core owns retrieval,
5
+ filtering, deduplication, storage, and deletion. The root model can request a
6
+ focused recall through its built-in decision contract without invoking a plugin
7
+ tool.
7
8
 
8
9
  Long-term memory is disabled by default. Enabling it is an explicit consumer
9
10
  choice because it may persist personal information between conversations.
@@ -47,8 +48,47 @@ reference context; it is never treated as a new user request or an instruction.
47
48
 
48
49
  Retrieval, candidate policy, filtering, deduplication, and persistence are
49
50
  shared by `supervisor.response` and `execution.response`; only their authoring
50
- contracts differ. Decision, planning, Worker, Reviewer, payload, and tool
51
- contexts do not receive the long-term memory projection.
51
+ contracts differ. Automatic retrieval remains a terminal-response feature.
52
+ Planner, Worker, Reviewer, payload, and tool contexts do not receive the memory
53
+ projection.
54
+
55
+ ## Model-Requested Recall
56
+
57
+ When memory is enabled, the Supervisor and Execution Agent root decisions may
58
+ choose `recall_memory` with a concise query about a remembered fact or preference.
59
+ This is an internal Runtime context request: it requires no plugin, capability
60
+ selection, controls, payload generation, or delegated role.
61
+
62
+ The existing memory service performs the search. The root receives a bounded
63
+ passive result and then chooses its next action in the same request loop:
64
+
65
+ - `found`: recalled records with their ids, provenance, and timestamps.
66
+ - `empty`: the search returned no matching records.
67
+ - `unavailable`: retrieval could not supply records; this does not mean the pool
68
+ contains no relevant memory.
69
+
70
+ Queries have a 1,024-character limit. Results contain at most six whole records
71
+ within a 6,000-character serialized budget; the combined root context uses the
72
+ same bound and declares omitted records and recalls. The request's existing
73
+ activation limit also applies to recall. `longTermMemory.maxRecallCallsPerRequest`
74
+ sets the maximum number of explicit lookups per user request (default: 5, a
75
+ positive integer). After that many calls, the model no longer receives the
76
+ `recall_memory` action. The request continues normally, with earlier recall
77
+ results still available. Changing the query or steering the active request does
78
+ not reset this count; a new request starts fresh. No independent retry loop is
79
+ introduced.
80
+ The result is bound to the requesting root and current user steering version;
81
+ superseded results are not projected into later decisions. Recalled facts are
82
+ reference data, not new instructions or proof that work completed.
83
+
84
+ The final response reuses explicit recall results without another automatic
85
+ search. If the model does not request recall, the ordinary automatic terminal
86
+ retrieval remains unchanged. Saving memory candidates keeps its existing
87
+ background lifecycle in both execution policies.
88
+
89
+ Recall still depends on the configured embedding provider. A stale vector index
90
+ may be rebuilt during search, so the shorter orchestration path does not imply a
91
+ fixed latency or offline lexical fallback.
52
92
 
53
93
  Both response paths also share the same configured response-experience
54
94
  methodology. It applies whether memory is enabled or disabled. Relevant memory
@@ -107,6 +147,7 @@ to it:
107
147
  "longTermMemory": {
108
148
  "enabled": true,
109
149
  "emitClientEvents": false,
150
+ "maxRecallCallsPerRequest": 5,
110
151
  "embeddingProfileId": "memory-embedding"
111
152
  }
112
153
  }
@@ -10,7 +10,7 @@ the default `supervisor-worker-v1` policy and the opt-in
10
10
  | The handler resolves one compiled execution policy from the selected model profile and supplies its same authority to capability composition and the runner. Omission remains `supervisor-worker-v1`. | `src/runtime/model/model-selection.ts`, `src/runtime/request/handler.ts`, `src/runtime/request/role-executor-composition.ts` | `model-execution-policy.test.ts`, `request-execution-policy-composition.test.ts` |
11
11
  | `supervisor-worker-v1` retains the delegated Supervisor, Planner, Worker, and Reviewer contracts; `execution-agent-v1` changes model-facing contracts and authority without adding another runner, ledger, reducer, capability engine, or finalizer. | `src/runtime/request/root-execution-kernel.ts`, `src/runtime/request/role-executor-composition.ts` | `root-execution-kernel-policy-mechanics.test.ts`, `supervisor-request-runner.test.ts`, `execution-agent-request-runner.test.ts` |
12
12
  | Role choice is model-owned and limited to the exact subordinate contracts registered by the frozen policy. | `src/runtime/steps/*`, `src/runtime/orchestration/role-executors/`, `src/runtime/orchestration/role-calls/` | `role-executor-registry.test.ts`, `planner-decision.test.ts`, `execution-agent-advisory-executors.test.ts` |
13
- | Every subordinate result returns to its exact caller through an exact-head ledger v17 commit. Under `supervisor-worker-v1`, terminal Planner and Worker results receive a runtime-owned, constant-size `work_result_v1` receipt; supplied work receipts are rejected, lineage is derived and fingerprint-verified from that ledger, and `execution-agent-v1` receives none. Planner Graph and Auditor outputs remain passive terminal child results. | `src/runtime/orchestration/role-calls/`, `src/runtime/steps/planner-graph/`, `src/runtime/steps/auditor-decision/` | `role-call-ledger.test.ts`, `role-call-work-result-receipt-reducer.test.ts`, `role-call-planner-work-result-receipt.test.ts`, `execution-agent-advisory-executors.test.ts`, `supervisor-request-runner.test.ts` |
13
+ | Every subordinate result returns to its exact caller through an exact-head ledger v18 commit. Under `supervisor-worker-v1`, terminal Planner and Worker results receive a runtime-owned, constant-size `work_result_v1` receipt; supplied work receipts are rejected, lineage is derived and fingerprint-verified from that ledger, and `execution-agent-v1` receives none. Planner Graph and Auditor outputs remain passive terminal child results. | `src/runtime/orchestration/role-calls/`, `src/runtime/steps/planner-graph/`, `src/runtime/steps/auditor-decision/` | `role-call-ledger.test.ts`, `role-call-work-result-receipt-reducer.test.ts`, `role-call-planner-work-result-receipt.test.ts`, `execution-agent-advisory-executors.test.ts`, `supervisor-request-runner.test.ts` |
14
14
  | Planner's semantic contract requires declaring every currently known execution outcome before the first child dispatch; schema and parser mechanically bind exactly one independently completable production item per Worker dispatch. A directly bound Worker receives that item, explicit dependencies, supervision evidence, and its own capability-result lane without the broader request, Planner objective, or sibling execution summaries. | `src/runtime/steps/planner-decision/`, `src/runtime/steps/worker-decision/`, `src/runtime/context/request-tool-results.ts` | `planner-plan-contract.test.ts`, `planner-single-item-dispatch.test.ts`, `planner-worker-context-isolation.test.ts`, `planner-worker-tool-result-scope.test.ts` |
15
15
  | Capability authority is validated against the frozen policy and bound to the exact authorized call and activation: Worker for the default policy, canonical root for the direct policy. Both use the same binding and adapter engine. | `src/runtime/orchestration/role-calls/`, `src/runtime/orchestration/worker-capabilities/`, `src/runtime/request/root-execution-kernel.ts` | `root-execution-kernel-policy-mechanics.test.ts`, `worker-capability-binding.test.ts`, `execution-agent-request-runner.test.ts` |
16
16
  | Worker and root payloads use the same `tool_payload.raw` author; principal, controls, runtime-issued direct-Planner-item receipt, and admitted evidence are mechanically bounded before model invocation. Root and non-Planner Worker payloads retain the exact request source; a canonically bound Planner item omits it. Work-result receipts and derived lineage are stripped before Worker raw payload and result authoring while optional semantic checkpoints remain. | `src/runtime/orchestration/worker-capabilities/payload-author.ts`, `src/runtime/request/worker-capability-payload.ts`, `src/runtime/steps/worker-decision/` | `planner-worker-context-isolation.test.ts`, `registered-tool-worker-assignment-provenance.test.ts`, `worker-capability-payload-author.test.ts`, `worker-payload-dependency-projection-pr1.test.ts`, `execution-agent-request-runner.test.ts` |