@abot-ai/runtime 1.2.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (550) hide show
  1. package/README.md +14 -0
  2. package/dist/scripts/init-runtime.js +4 -13
  3. package/dist/scripts/runtime-setup-directories.d.ts +2 -0
  4. package/dist/scripts/runtime-setup-directories.js +38 -0
  5. package/dist/src/bridge/request-steering.d.ts +2 -1
  6. package/dist/src/bridge/request-steering.js +4 -2
  7. package/dist/src/bridge/runtime-replay.js +2 -19
  8. package/dist/src/bridge/start-agent-bridge.js +1 -1
  9. package/dist/src/capabilities/normal-invocation/validator.js +1 -1
  10. package/dist/src/capabilities/tool-definition-validator/event-presentation.js +3 -0
  11. package/dist/src/capabilities/tool-definition-validator/event-result-metadata.d.ts +2 -0
  12. package/dist/src/capabilities/tool-definition-validator/event-result-metadata.js +74 -0
  13. package/dist/src/capabilities/tool-event-metadata.js +3 -0
  14. package/dist/src/capabilities/tool-result-event-projection.d.ts +3 -0
  15. package/dist/src/capabilities/tool-result-event-projection.js +82 -0
  16. package/dist/src/capabilities/tool-types.d.ts +5 -0
  17. package/dist/src/cli/abot.js +2 -11
  18. package/dist/src/runtime/adapters/in-memory-session-store.js +1 -0
  19. package/dist/src/runtime/adapters/long-term-memory/file-lock/acquisition.js +11 -2
  20. package/dist/src/runtime/adapters/long-term-memory/file-lock/contracts.d.ts +2 -0
  21. package/dist/src/runtime/adapters/long-term-memory/file-lock/synchronous-release.d.ts +2 -0
  22. package/dist/src/runtime/adapters/long-term-memory/file-lock/synchronous-release.js +40 -0
  23. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/approval.d.ts +3 -0
  24. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/approval.js +9 -0
  25. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/rejection-event.d.ts +13 -0
  26. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/rejection-event.js +25 -0
  27. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/run.js +18 -2
  28. package/dist/src/runtime/adapters/registered-tool-normal-invocations/executor.js +8 -0
  29. package/dist/src/runtime/adapters/registered-tool-normal-invocations/payload/lifecycle.js +7 -3
  30. package/dist/src/runtime/adapters/registered-tool-normal-invocations/shared/contracts.d.ts +17 -2
  31. package/dist/src/runtime/adapters/registered-tool-normal-invocations/shared/event-metadata.d.ts +9 -0
  32. package/dist/src/runtime/adapters/registered-tool-normal-invocations/shared/event-metadata.js +8 -0
  33. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/execution.js +16 -1
  34. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-observability.js +2 -2
  35. package/dist/src/runtime/adapters/scheduled-request-outcome.d.ts +11 -0
  36. package/dist/src/runtime/adapters/scheduled-request-outcome.js +41 -0
  37. package/dist/src/runtime/adapters/scheduler-runtime.d.ts +19 -0
  38. package/dist/src/runtime/adapters/scheduler-runtime.js +138 -0
  39. package/dist/src/runtime/capabilities/scheduling/create-operations.d.ts +55 -0
  40. package/dist/src/runtime/capabilities/scheduling/create-operations.js +30 -0
  41. package/dist/src/runtime/capabilities/scheduling/create-time-zone.d.ts +1 -0
  42. package/dist/src/runtime/capabilities/scheduling/create-time-zone.js +11 -0
  43. package/dist/src/runtime/capabilities/scheduling/job-list-page.d.ts +25 -0
  44. package/dist/src/runtime/capabilities/scheduling/job-list-page.js +40 -0
  45. package/dist/src/runtime/capabilities/scheduling/model-validation.d.ts +2 -0
  46. package/dist/src/runtime/capabilities/scheduling/model-validation.js +15 -0
  47. package/dist/src/runtime/capabilities/scheduling/tool-contract.d.ts +2 -0
  48. package/dist/src/runtime/capabilities/scheduling/tool-contract.js +35 -0
  49. package/dist/src/runtime/capabilities/scheduling/tool-input-properties.d.ts +43 -0
  50. package/dist/src/runtime/capabilities/scheduling/tool-input-properties.js +27 -0
  51. package/dist/src/runtime/capabilities/scheduling/tool-module.d.ts +4 -0
  52. package/dist/src/runtime/capabilities/scheduling/tool-module.js +158 -0
  53. package/dist/src/runtime/capabilities/scheduling/update-operations.d.ts +2 -0
  54. package/dist/src/runtime/capabilities/scheduling/update-operations.js +49 -0
  55. package/dist/src/runtime/composition.d.ts +23 -3
  56. package/dist/src/runtime/composition.js +12 -17
  57. package/dist/src/runtime/config/environment-paths.d.ts +10 -0
  58. package/dist/src/runtime/config/environment-paths.js +31 -0
  59. package/dist/src/runtime/config/environment-storage.d.ts +9 -0
  60. package/dist/src/runtime/config/environment-storage.js +65 -0
  61. package/dist/src/runtime/config/fields.js +7 -0
  62. package/dist/src/runtime/config/long-term-memory.js +15 -0
  63. package/dist/src/runtime/config/schema.js +8 -0
  64. package/dist/src/runtime/config.js +9 -5
  65. package/dist/src/runtime/context/scheduled-execution-context.d.ts +10 -0
  66. package/dist/src/runtime/context/scheduled-execution-context.js +52 -0
  67. package/dist/src/runtime/default-adapters.d.ts +3 -32
  68. package/dist/src/runtime/default-adapters.js +3 -270
  69. package/dist/src/runtime/default-environment-adapters.d.ts +19 -0
  70. package/dist/src/runtime/default-environment-adapters.js +144 -0
  71. package/dist/src/runtime/index.d.ts +5 -0
  72. package/dist/src/runtime/index.js +4 -0
  73. package/dist/src/runtime/local-application.d.ts +22 -0
  74. package/dist/src/runtime/local-application.js +81 -0
  75. package/dist/src/runtime/local-host/app-memory-dispatch.d.ts +11 -0
  76. package/dist/src/runtime/local-host/app-memory-dispatch.js +103 -0
  77. package/dist/src/runtime/local-host/app-owner.d.ts +4 -0
  78. package/dist/src/runtime/local-host/app-owner.js +119 -0
  79. package/dist/src/runtime/local-host/app-request-control.d.ts +24 -0
  80. package/dist/src/runtime/local-host/app-request-control.js +135 -0
  81. package/dist/src/runtime/local-host/app-service-dispatch.d.ts +5 -0
  82. package/dist/src/runtime/local-host/app-service-dispatch.js +64 -0
  83. package/dist/src/runtime/local-host/client-identity.d.ts +3 -0
  84. package/dist/src/runtime/local-host/client-identity.js +17 -0
  85. package/dist/src/runtime/local-host/client-memory.d.ts +7 -0
  86. package/dist/src/runtime/local-host/client-memory.js +54 -0
  87. package/dist/src/runtime/local-host/client-requests.d.ts +19 -0
  88. package/dist/src/runtime/local-host/client-requests.js +145 -0
  89. package/dist/src/runtime/local-host/client-services.d.ts +10 -0
  90. package/dist/src/runtime/local-host/client-services.js +14 -0
  91. package/dist/src/runtime/local-host/contracts.d.ts +36 -0
  92. package/dist/src/runtime/local-host/contracts.js +1 -0
  93. package/dist/src/runtime/local-host/endpoint.d.ts +7 -0
  94. package/dist/src/runtime/local-host/endpoint.js +79 -0
  95. package/dist/src/runtime/local-host/owner-activity.d.ts +10 -0
  96. package/dist/src/runtime/local-host/owner-activity.js +30 -0
  97. package/dist/src/runtime/local-host/owner-retirement.d.ts +3 -0
  98. package/dist/src/runtime/local-host/owner-retirement.js +15 -0
  99. package/dist/src/runtime/local-host/owner-server.d.ts +6 -0
  100. package/dist/src/runtime/local-host/owner-server.js +88 -0
  101. package/dist/src/runtime/local-host/private-access.d.ts +2 -0
  102. package/dist/src/runtime/local-host/private-access.js +16 -0
  103. package/dist/src/runtime/local-host/private-directory.d.ts +1 -0
  104. package/dist/src/runtime/local-host/private-directory.js +57 -0
  105. package/dist/src/runtime/local-host/rpc-peer.d.ts +22 -0
  106. package/dist/src/runtime/local-host/rpc-peer.js +168 -0
  107. package/dist/src/runtime/local-host/rpc-protocol.d.ts +21 -0
  108. package/dist/src/runtime/local-host/rpc-protocol.js +46 -0
  109. package/dist/src/runtime/local-host/startup-connection.d.ts +5 -0
  110. package/dist/src/runtime/local-host/startup-connection.js +72 -0
  111. package/dist/src/runtime/local-host/transport.d.ts +3 -0
  112. package/dist/src/runtime/local-host/transport.js +88 -0
  113. package/dist/src/runtime/local-host/windows-private-access.d.ts +1 -0
  114. package/dist/src/runtime/local-host/windows-private-access.js +51 -0
  115. package/dist/src/runtime/long-term-memory/onboarding/configuration.js +6 -0
  116. package/dist/src/runtime/long-term-memory/recall-binding.d.ts +3 -0
  117. package/dist/src/runtime/long-term-memory/recall-binding.js +27 -0
  118. package/dist/src/runtime/long-term-memory/recall-context.d.ts +20 -0
  119. package/dist/src/runtime/long-term-memory/recall-context.js +101 -0
  120. package/dist/src/runtime/long-term-memory/recall-continuation.d.ts +8 -0
  121. package/dist/src/runtime/long-term-memory/recall-continuation.js +36 -0
  122. package/dist/src/runtime/long-term-memory/recall-policy.d.ts +7 -0
  123. package/dist/src/runtime/long-term-memory/recall-policy.js +14 -0
  124. package/dist/src/runtime/long-term-memory/recall-result.d.ts +5 -0
  125. package/dist/src/runtime/long-term-memory/recall-result.js +54 -0
  126. package/dist/src/runtime/long-term-memory/repository-state.d.ts +2 -1
  127. package/dist/src/runtime/long-term-memory/repository-state.js +2 -2
  128. package/dist/src/runtime/model/invoke-raw-step.d.ts +1 -0
  129. package/dist/src/runtime/model/invoke-raw-step.js +1 -0
  130. package/dist/src/runtime/model/invoke-step.js +6 -0
  131. package/dist/src/runtime/model/invoke-structured-step.d.ts +1 -0
  132. package/dist/src/runtime/model/invoke-structured-step.js +1 -0
  133. package/dist/src/runtime/model/model-step-port.d.ts +2 -0
  134. package/dist/src/runtime/model/model-step-steering.d.ts +8 -0
  135. package/dist/src/runtime/model/model-step-steering.js +19 -0
  136. package/dist/src/runtime/orchestration/final-response/authoring-contract.js +1 -1
  137. package/dist/src/runtime/orchestration/final-response/invoke.d.ts +1 -0
  138. package/dist/src/runtime/orchestration/final-response/invoke.js +1 -0
  139. package/dist/src/runtime/orchestration/role-calls/activation-budget.js +1 -0
  140. package/dist/src/runtime/orchestration/role-calls/candidate-validation.js +9 -49
  141. package/dist/src/runtime/orchestration/role-calls/capability-selection-reconsideration.d.ts +9 -0
  142. package/dist/src/runtime/orchestration/role-calls/capability-selection-reconsideration.js +17 -8
  143. package/dist/src/runtime/orchestration/role-calls/capability-selection-supervision-validation.d.ts +2 -0
  144. package/dist/src/runtime/orchestration/role-calls/capability-selection-supervision-validation.js +62 -0
  145. package/dist/src/runtime/orchestration/role-calls/command-decoder.js +4 -0
  146. package/dist/src/runtime/orchestration/role-calls/command-dispatch/memory-recall-transitions.d.ts +4 -0
  147. package/dist/src/runtime/orchestration/role-calls/command-dispatch/memory-recall-transitions.js +89 -0
  148. package/dist/src/runtime/orchestration/role-calls/command-dispatch.js +5 -0
  149. package/dist/src/runtime/orchestration/role-calls/contracts.d.ts +9 -7
  150. package/dist/src/runtime/orchestration/role-calls/contracts.js +2 -2
  151. package/dist/src/runtime/orchestration/role-calls/diagnostics.js +3 -0
  152. package/dist/src/runtime/orchestration/role-calls/index.d.ts +1 -0
  153. package/dist/src/runtime/orchestration/role-calls/index.js +1 -0
  154. package/dist/src/runtime/orchestration/role-calls/memory-recall-contract.d.ts +51 -0
  155. package/dist/src/runtime/orchestration/role-calls/memory-recall-contract.js +4 -0
  156. package/dist/src/runtime/orchestration/role-calls/memory-recall-decoder.d.ts +6 -0
  157. package/dist/src/runtime/orchestration/role-calls/memory-recall-decoder.js +147 -0
  158. package/dist/src/runtime/orchestration/role-calls/memory-recall-diagnostics.d.ts +5 -0
  159. package/dist/src/runtime/orchestration/role-calls/memory-recall-diagnostics.js +27 -0
  160. package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.d.ts +3 -0
  161. package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.js +121 -0
  162. package/dist/src/runtime/orchestration/role-calls/memory-recall-transactions.d.ts +3 -0
  163. package/dist/src/runtime/orchestration/role-calls/memory-recall-transactions.js +44 -0
  164. package/dist/src/runtime/orchestration/role-calls/reducer.js +1 -0
  165. package/dist/src/runtime/orchestration/role-calls/transaction-effect.d.ts +5 -0
  166. package/dist/src/runtime/orchestration/role-calls/transaction-effect.js +14 -0
  167. package/dist/src/runtime/orchestration/role-calls/transactions.js +3 -24
  168. package/dist/src/runtime/plugins/manifest-validator.js +4 -1
  169. package/dist/src/runtime/ports.d.ts +4 -0
  170. package/dist/src/runtime/request/bound-runtime-handler.d.ts +2 -0
  171. package/dist/src/runtime/request/bound-runtime-handler.js +25 -0
  172. package/dist/src/runtime/request/contracts.d.ts +6 -0
  173. package/dist/src/runtime/request/execution-agent-root-execution.js +12 -0
  174. package/dist/src/runtime/request/execution-facets.js +6 -0
  175. package/dist/src/runtime/request/execution-scope-surfaces.js +10 -0
  176. package/dist/src/runtime/request/execution-scope.d.ts +1 -1
  177. package/dist/src/runtime/request/handler.js +6 -0
  178. package/dist/src/runtime/request/root-contract.d.ts +7 -1
  179. package/dist/src/runtime/request/root-execution-kernel.js +33 -37
  180. package/dist/src/runtime/request/root-memory-recall.d.ts +11 -0
  181. package/dist/src/runtime/request/root-memory-recall.js +71 -0
  182. package/dist/src/runtime/request/root-observation-handoff.d.ts +17 -0
  183. package/dist/src/runtime/request/root-observation-handoff.js +44 -0
  184. package/dist/src/runtime/request/scheduled-execution.d.ts +9 -0
  185. package/dist/src/runtime/request/scheduled-execution.js +32 -0
  186. package/dist/src/runtime/request/session-admission.d.ts +17 -0
  187. package/dist/src/runtime/request/session-admission.js +88 -0
  188. package/dist/src/runtime/request/supervisor-root-execution-diagnostics.d.ts +1 -1
  189. package/dist/src/runtime/request/supervisor-root-execution.js +8 -0
  190. package/dist/src/runtime/runtime-environment.d.ts +31 -0
  191. package/dist/src/runtime/runtime-environment.js +102 -0
  192. package/dist/src/runtime/runtime-host-environment.d.ts +8 -0
  193. package/dist/src/runtime/runtime-host-environment.js +57 -0
  194. package/dist/src/runtime/runtime-host-lifecycle.d.ts +4 -0
  195. package/dist/src/runtime/runtime-host-lifecycle.js +64 -0
  196. package/dist/src/runtime/runtime-host-scheduler-ownership.d.ts +5 -0
  197. package/dist/src/runtime/runtime-host-scheduler-ownership.js +67 -0
  198. package/dist/src/runtime/runtime-host.d.ts +19 -0
  199. package/dist/src/runtime/runtime-host.js +63 -0
  200. package/dist/src/runtime/scheduler/calendar-time.d.ts +10 -0
  201. package/dist/src/runtime/scheduler/calendar-time.js +58 -0
  202. package/dist/src/runtime/scheduler/contracts.d.ts +143 -0
  203. package/dist/src/runtime/scheduler/contracts.js +1 -0
  204. package/dist/src/runtime/scheduler/file-store.d.ts +2 -0
  205. package/dist/src/runtime/scheduler/file-store.js +76 -0
  206. package/dist/src/runtime/scheduler/instant-validation.d.ts +4 -0
  207. package/dist/src/runtime/scheduler/instant-validation.js +69 -0
  208. package/dist/src/runtime/scheduler/interval-range.d.ts +8 -0
  209. package/dist/src/runtime/scheduler/interval-range.js +24 -0
  210. package/dist/src/runtime/scheduler/job-management.d.ts +8 -0
  211. package/dist/src/runtime/scheduler/job-management.js +212 -0
  212. package/dist/src/runtime/scheduler/journal-checkpoint.d.ts +9 -0
  213. package/dist/src/runtime/scheduler/journal-checkpoint.js +45 -0
  214. package/dist/src/runtime/scheduler/journal-durability.d.ts +8 -0
  215. package/dist/src/runtime/scheduler/journal-durability.js +59 -0
  216. package/dist/src/runtime/scheduler/journal-files.d.ts +14 -0
  217. package/dist/src/runtime/scheduler/journal-files.js +59 -0
  218. package/dist/src/runtime/scheduler/journal-head.d.ts +21 -0
  219. package/dist/src/runtime/scheduler/journal-head.js +81 -0
  220. package/dist/src/runtime/scheduler/journal-index-state.d.ts +31 -0
  221. package/dist/src/runtime/scheduler/journal-index-state.js +137 -0
  222. package/dist/src/runtime/scheduler/journal-index.d.ts +22 -0
  223. package/dist/src/runtime/scheduler/journal-index.js +195 -0
  224. package/dist/src/runtime/scheduler/journal-store.d.ts +21 -0
  225. package/dist/src/runtime/scheduler/journal-store.js +184 -0
  226. package/dist/src/runtime/scheduler/journal-transaction.d.ts +14 -0
  227. package/dist/src/runtime/scheduler/journal-transaction.js +104 -0
  228. package/dist/src/runtime/scheduler/next-occurrence.d.ts +3 -0
  229. package/dist/src/runtime/scheduler/next-occurrence.js +39 -0
  230. package/dist/src/runtime/scheduler/run-completion.d.ts +12 -0
  231. package/dist/src/runtime/scheduler/run-completion.js +77 -0
  232. package/dist/src/runtime/scheduler/run-list-query.d.ts +5 -0
  233. package/dist/src/runtime/scheduler/run-list-query.js +38 -0
  234. package/dist/src/runtime/scheduler/run-records.d.ts +6 -0
  235. package/dist/src/runtime/scheduler/run-records.js +41 -0
  236. package/dist/src/runtime/scheduler/schedule-update.d.ts +3 -0
  237. package/dist/src/runtime/scheduler/schedule-update.js +22 -0
  238. package/dist/src/runtime/scheduler/schedule-validation.d.ts +10 -0
  239. package/dist/src/runtime/scheduler/schedule-validation.js +132 -0
  240. package/dist/src/runtime/scheduler/scheduler-engine.d.ts +2 -0
  241. package/dist/src/runtime/scheduler/scheduler-engine.js +174 -0
  242. package/dist/src/runtime/scheduler/scheduler-service.d.ts +10 -0
  243. package/dist/src/runtime/scheduler/scheduler-service.js +115 -0
  244. package/dist/src/runtime/scheduler/service-context.d.ts +21 -0
  245. package/dist/src/runtime/scheduler/service-context.js +26 -0
  246. package/dist/src/runtime/scheduler/session-deletion-state.d.ts +9 -0
  247. package/dist/src/runtime/scheduler/session-deletion-state.js +30 -0
  248. package/dist/src/runtime/scheduler/snapshot-validation.d.ts +4 -0
  249. package/dist/src/runtime/scheduler/snapshot-validation.js +112 -0
  250. package/dist/src/runtime/scheduler/startup-recovery.d.ts +2 -0
  251. package/dist/src/runtime/scheduler/startup-recovery.js +38 -0
  252. package/dist/src/runtime/scheduler/validation-error.d.ts +4 -0
  253. package/dist/src/runtime/scheduler/validation-error.js +8 -0
  254. package/dist/src/runtime/scheduler/working-store.d.ts +3 -0
  255. package/dist/src/runtime/scheduler/working-store.js +8 -0
  256. package/dist/src/runtime/session/request-session.d.ts +1 -0
  257. package/dist/src/runtime/session/request-session.js +14 -1
  258. package/dist/src/runtime/session/session-attachment-deletion.d.ts +8 -0
  259. package/dist/src/runtime/session/session-attachment-deletion.js +87 -0
  260. package/dist/src/runtime/session/session-deletion-boundary.d.ts +10 -0
  261. package/dist/src/runtime/session/session-deletion-boundary.js +39 -0
  262. package/dist/src/runtime/session/session-deletion-cleanup.d.ts +7 -0
  263. package/dist/src/runtime/session/session-deletion-cleanup.js +62 -0
  264. package/dist/src/runtime/session/session-deletion-finalization.d.ts +7 -0
  265. package/dist/src/runtime/session/session-deletion-finalization.js +34 -0
  266. package/dist/src/runtime/session/session-deletion-receipts.d.ts +7 -0
  267. package/dist/src/runtime/session/session-deletion-receipts.js +18 -0
  268. package/dist/src/runtime/session/session-lifecycle-store.d.ts +21 -0
  269. package/dist/src/runtime/session/session-lifecycle-store.js +72 -0
  270. package/dist/src/runtime/session/session-mutation-queue.d.ts +3 -0
  271. package/dist/src/runtime/session/session-mutation-queue.js +15 -0
  272. package/dist/src/runtime/steps/execution-agent/capability-decision-parsing.d.ts +16 -0
  273. package/dist/src/runtime/steps/execution-agent/capability-decision-parsing.js +165 -0
  274. package/dist/src/runtime/steps/execution-agent/contracts.d.ts +3 -1
  275. package/dist/src/runtime/steps/execution-agent/decision-parsing.d.ts +2 -0
  276. package/dist/src/runtime/steps/execution-agent/decision-parsing.js +195 -0
  277. package/dist/src/runtime/steps/execution-agent/decision-validation.d.ts +30 -0
  278. package/dist/src/runtime/steps/execution-agent/decision-validation.js +127 -0
  279. package/dist/src/runtime/steps/execution-agent/format.d.ts +1 -0
  280. package/dist/src/runtime/steps/execution-agent/format.js +12 -0
  281. package/dist/src/runtime/steps/execution-agent/input.d.ts +2 -1
  282. package/dist/src/runtime/steps/execution-agent/input.js +17 -2
  283. package/dist/src/runtime/steps/execution-agent/parser.d.ts +1 -2
  284. package/dist/src/runtime/steps/execution-agent/parser.js +1 -472
  285. package/dist/src/runtime/steps/execution-agent/prompt.d.ts +2 -0
  286. package/dist/src/runtime/steps/execution-agent/prompt.js +2 -0
  287. package/dist/src/runtime/steps/execution-agent/reconsideration-context.js +4 -3
  288. package/dist/src/runtime/steps/execution-agent/response-input.js +5 -4
  289. package/dist/src/runtime/steps/execution-agent/response-run.d.ts +3 -0
  290. package/dist/src/runtime/steps/execution-agent/response-run.js +7 -3
  291. package/dist/src/runtime/steps/execution-agent/run.d.ts +2 -0
  292. package/dist/src/runtime/steps/execution-agent/run.js +2 -0
  293. package/dist/src/runtime/steps/execution-agent/state-context.d.ts +2 -1
  294. package/dist/src/runtime/steps/execution-agent/state-context.js +13 -5
  295. package/dist/src/runtime/steps/memory-recall-decision.d.ts +30 -0
  296. package/dist/src/runtime/steps/memory-recall-decision.js +101 -0
  297. package/dist/src/runtime/steps/memory-recall-prompt.d.ts +1 -0
  298. package/dist/src/runtime/steps/memory-recall-prompt.js +15 -0
  299. package/dist/src/runtime/steps/supervisor-decision/contracts.d.ts +4 -2
  300. package/dist/src/runtime/steps/supervisor-decision/diagnostics.d.ts +2 -0
  301. package/dist/src/runtime/steps/supervisor-decision/diagnostics.js +13 -6
  302. package/dist/src/runtime/steps/supervisor-decision/format.d.ts +2 -0
  303. package/dist/src/runtime/steps/supervisor-decision/format.js +41 -2
  304. package/dist/src/runtime/steps/supervisor-decision/input.d.ts +5 -1
  305. package/dist/src/runtime/steps/supervisor-decision/input.js +25 -5
  306. package/dist/src/runtime/steps/supervisor-decision/memory-recall-continuation.d.ts +10 -0
  307. package/dist/src/runtime/steps/supervisor-decision/memory-recall-continuation.js +32 -0
  308. package/dist/src/runtime/steps/supervisor-decision/parser.d.ts +2 -0
  309. package/dist/src/runtime/steps/supervisor-decision/parser.js +36 -1
  310. package/dist/src/runtime/steps/supervisor-decision/prompt.d.ts +3 -0
  311. package/dist/src/runtime/steps/supervisor-decision/prompt.js +16 -8
  312. package/dist/src/runtime/steps/supervisor-decision/response-recommendation.d.ts +13 -0
  313. package/dist/src/runtime/steps/supervisor-decision/response-recommendation.js +32 -0
  314. package/dist/src/runtime/steps/supervisor-decision/resume.d.ts +2 -0
  315. package/dist/src/runtime/steps/supervisor-decision/resume.js +13 -0
  316. package/dist/src/runtime/steps/supervisor-decision/run.d.ts +3 -0
  317. package/dist/src/runtime/steps/supervisor-decision/run.js +19 -0
  318. package/dist/src/runtime/steps/supervisor-decision/working-directory.js +7 -1
  319. package/dist/src/runtime/steps/supervisor-response/diagnostics.d.ts +1 -0
  320. package/dist/src/runtime/steps/supervisor-response/diagnostics.js +1 -0
  321. package/dist/src/runtime/steps/supervisor-response/input.d.ts +2 -1
  322. package/dist/src/runtime/steps/supervisor-response/input.js +17 -4
  323. package/dist/src/runtime/steps/supervisor-response/memory-authoring.d.ts +1 -0
  324. package/dist/src/runtime/steps/supervisor-response/memory-authoring.js +4 -0
  325. package/dist/src/runtime/steps/supervisor-response/prompt.d.ts +1 -0
  326. package/dist/src/runtime/steps/supervisor-response/prompt.js +8 -2
  327. package/dist/src/runtime/steps/supervisor-response/response-recommendation.d.ts +10 -0
  328. package/dist/src/runtime/steps/supervisor-response/response-recommendation.js +25 -0
  329. package/dist/src/runtime/steps/supervisor-response/run.d.ts +6 -1
  330. package/dist/src/runtime/steps/supervisor-response/run.js +26 -7
  331. package/dist/src/sessions/record/projection.js +1 -0
  332. package/dist/src/sessions/schedule-metadata.d.ts +8 -0
  333. package/dist/src/sessions/schedule-metadata.js +1 -0
  334. package/dist/src/sessions/session-service.d.ts +1 -0
  335. package/dist/src/sessions/session-service.js +1 -0
  336. package/dist/src/sessions/types.d.ts +2 -0
  337. package/dist/src/shared/directory-authority/bootstrap.d.ts +1 -0
  338. package/dist/src/shared/directory-authority/bootstrap.js +118 -0
  339. package/dist/src/shared/directory-authority/command.d.ts +8 -0
  340. package/dist/src/shared/directory-authority/command.js +27 -0
  341. package/dist/src/shared/directory-authority/errors.d.ts +5 -0
  342. package/dist/src/shared/directory-authority/errors.js +10 -0
  343. package/dist/src/shared/directory-authority/index.d.ts +3 -0
  344. package/dist/src/shared/directory-authority/index.js +3 -0
  345. package/dist/src/shared/directory-authority/protocol.d.ts +11 -0
  346. package/dist/src/shared/directory-authority/protocol.js +62 -0
  347. package/dist/src/shared/directory-authority/task.d.ts +7 -0
  348. package/dist/src/shared/directory-authority/task.js +97 -0
  349. package/dist/src/shared/http-server-shutdown.d.ts +4 -0
  350. package/dist/src/shared/http-server-shutdown.js +17 -0
  351. package/dist/src/shared/public-http/aggregate-gate.d.ts +3 -0
  352. package/dist/src/shared/public-http/aggregate-gate.js +87 -0
  353. package/dist/src/shared/public-http/deadline.d.ts +2 -0
  354. package/dist/src/shared/public-http/deadline.js +29 -0
  355. package/dist/src/shared/public-http/errors.d.ts +6 -0
  356. package/dist/src/shared/public-http/errors.js +11 -0
  357. package/dist/src/shared/public-http/limits.d.ts +8 -0
  358. package/dist/src/shared/public-http/limits.js +8 -0
  359. package/dist/src/shared/public-http/network-policy.d.ts +11 -0
  360. package/dist/src/shared/public-http/network-policy.js +178 -0
  361. package/dist/src/shared/public-http/public-http.d.ts +24 -0
  362. package/dist/src/shared/public-http/public-http.js +85 -0
  363. package/dist/src/shared/public-http/request-hop.d.ts +18 -0
  364. package/dist/src/shared/public-http/request-hop.js +140 -0
  365. package/dist/src/web-ui/app/ARCHITECTURE.md +66 -4
  366. package/dist/src/web-ui/app/app-bootstrap.js +53 -0
  367. package/dist/src/web-ui/app/app-dom.js +80 -0
  368. package/dist/src/web-ui/app/app.js +195 -212
  369. package/dist/src/web-ui/app/components/conversation-activity.d.ts +2 -0
  370. package/dist/src/web-ui/app/components/conversation-activity.js +34 -7
  371. package/dist/src/web-ui/app/components/conversation-role-cards.d.ts +1 -0
  372. package/dist/src/web-ui/app/components/conversation-role-cards.js +61 -5
  373. package/dist/src/web-ui/app/components/conversation-schedule.js +71 -0
  374. package/dist/src/web-ui/app/components/conversation-status.js +65 -0
  375. package/dist/src/web-ui/app/components/conversation-tools.d.ts +13 -0
  376. package/dist/src/web-ui/app/components/conversation-tools.js +284 -0
  377. package/dist/src/web-ui/app/components/conversation-view.js +39 -11
  378. package/dist/src/web-ui/app/components/dashboard/activity.js +61 -0
  379. package/dist/src/web-ui/app/components/dashboard/icons.js +23 -0
  380. package/dist/src/web-ui/app/components/dashboard/recent-conversations.js +64 -0
  381. package/dist/src/web-ui/app/components/dashboard/workspace.js +107 -0
  382. package/dist/src/web-ui/app/components/message-link-previews.d.ts +16 -0
  383. package/dist/src/web-ui/app/components/message-link-previews.js +179 -0
  384. package/dist/src/web-ui/app/components/schedules/details.js +101 -0
  385. package/dist/src/web-ui/app/components/schedules/form.d.ts +13 -0
  386. package/dist/src/web-ui/app/components/schedules/form.js +246 -0
  387. package/dist/src/web-ui/app/components/schedules/workspace-state.js +59 -0
  388. package/dist/src/web-ui/app/components/schedules/workspace.js +165 -0
  389. package/dist/src/web-ui/app/components/workspace-shell.js +48 -2
  390. package/dist/src/web-ui/app/configuration-feature.js +72 -0
  391. package/dist/src/web-ui/app/controllers/composer-attachments-controller.d.ts +1 -0
  392. package/dist/src/web-ui/app/controllers/composer-attachments-controller.js +17 -6
  393. package/dist/src/web-ui/app/controllers/composer-submit-controller.d.ts +2 -0
  394. package/dist/src/web-ui/app/controllers/composer-submit-controller.js +15 -1
  395. package/dist/src/web-ui/app/controllers/composer-surface-controller.js +58 -0
  396. package/dist/src/web-ui/app/controllers/composer-workspace-controller.d.ts +53 -0
  397. package/dist/src/web-ui/app/controllers/composer-workspace-controller.js +180 -0
  398. package/dist/src/web-ui/app/controllers/conversation-read-state-controller.d.ts +23 -0
  399. package/dist/src/web-ui/app/controllers/conversation-read-state-controller.js +82 -0
  400. package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +8 -0
  401. package/dist/src/web-ui/app/controllers/conversation-session-controller.js +28 -39
  402. package/dist/src/web-ui/app/controllers/dashboard-controller.js +127 -0
  403. package/dist/src/web-ui/app/controllers/home-composer-feature.d.ts +40 -0
  404. package/dist/src/web-ui/app/controllers/home-composer-feature.js +119 -0
  405. package/dist/src/web-ui/app/controllers/home-conversation-activation.js +37 -0
  406. package/dist/src/web-ui/app/controllers/realtime-event-controller.d.ts +1 -0
  407. package/dist/src/web-ui/app/controllers/realtime-event-controller.js +74 -3
  408. package/dist/src/web-ui/app/controllers/runtime-selection-controller.d.ts +2 -1
  409. package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +15 -14
  410. package/dist/src/web-ui/app/controllers/schedule-realtime.js +118 -0
  411. package/dist/src/web-ui/app/controllers/schedules-controller.js +421 -0
  412. package/dist/src/web-ui/app/controllers/session-controller.js +30 -3
  413. package/dist/src/web-ui/app/dashboard-feature.js +44 -0
  414. package/dist/src/web-ui/app/index.html +53 -1
  415. package/dist/src/web-ui/app/lib/composer-submission-scope.d.ts +21 -0
  416. package/dist/src/web-ui/app/lib/composer-submission-scope.js +13 -0
  417. package/dist/src/web-ui/app/lib/context-window-snapshot-order.d.ts +15 -0
  418. package/dist/src/web-ui/app/lib/context-window-snapshot-order.js +31 -0
  419. package/dist/src/web-ui/app/lib/conversation-role-model.d.ts +10 -1
  420. package/dist/src/web-ui/app/lib/conversation-role-model.js +97 -15
  421. package/dist/src/web-ui/app/lib/conversation-status-model.d.ts +12 -0
  422. package/dist/src/web-ui/app/lib/conversation-status-model.js +116 -0
  423. package/dist/src/web-ui/app/lib/dashboard-job-templates.js +41 -0
  424. package/dist/src/web-ui/app/lib/dashboard-presentation.js +126 -0
  425. package/dist/src/web-ui/app/lib/message-markdown.d.ts +5 -0
  426. package/dist/src/web-ui/app/lib/message-markdown.js +99 -0
  427. package/dist/src/web-ui/app/lib/message-url-policy.d.ts +1 -0
  428. package/dist/src/web-ui/app/lib/message-url-policy.js +13 -0
  429. package/dist/src/web-ui/app/lib/schedule-errors.js +29 -0
  430. package/dist/src/web-ui/app/lib/schedule-message.js +30 -0
  431. package/dist/src/web-ui/app/lib/schedule-presentation.js +81 -0
  432. package/dist/src/web-ui/app/lib/session-read-state.d.ts +22 -0
  433. package/dist/src/web-ui/app/lib/session-read-state.js +63 -0
  434. package/dist/src/web-ui/app/lib/text-format.js +2 -143
  435. package/dist/src/web-ui/app/lib/tool-activity-event.d.ts +26 -0
  436. package/dist/src/web-ui/app/lib/tool-activity-event.js +228 -0
  437. package/dist/src/web-ui/app/lib/tool-activity-model.d.ts +41 -0
  438. package/dist/src/web-ui/app/lib/tool-activity-model.js +255 -0
  439. package/dist/src/web-ui/app/lib/tool-timeline.d.ts +3 -0
  440. package/dist/src/web-ui/app/lib/tool-timeline.js +18 -0
  441. package/dist/src/web-ui/app/schedules-feature.js +87 -0
  442. package/dist/src/web-ui/app/services/message-link-preview-client.d.ts +14 -0
  443. package/dist/src/web-ui/app/services/message-link-preview-client.js +96 -0
  444. package/dist/src/web-ui/app/services/runtime-web-client/schedules.js +51 -0
  445. package/dist/src/web-ui/app/services/runtime-web-client.d.ts +37 -0
  446. package/dist/src/web-ui/app/services/runtime-web-client.js +13 -8
  447. package/dist/src/web-ui/app/styles/00-tokens-base.css +11 -11
  448. package/dist/src/web-ui/app/styles/18-dashboard.css +384 -0
  449. package/dist/src/web-ui/app/styles/20-chat-composer.css +1 -130
  450. package/dist/src/web-ui/app/styles/26-message-content.css +295 -0
  451. package/dist/src/web-ui/app/styles/27-conversation-tools.css +266 -0
  452. package/dist/src/web-ui/app/styles/28-conversation-status.css +52 -0
  453. package/dist/src/web-ui/app/styles/38-schedule-workspace.css +263 -0
  454. package/dist/src/web-ui/app/styles/38-schedules.css +352 -0
  455. package/dist/src/web-ui/app/styles/90-responsive.css +14 -0
  456. package/dist/src/web-ui/app/styles/91-schedules-responsive.css +72 -0
  457. package/dist/src/web-ui/app/styles/92-dashboard-responsive.css +88 -0
  458. package/dist/src/web-ui/app/styles.css +8 -0
  459. package/dist/src/web-ui/app/ui-behavior.d.ts +1 -1
  460. package/dist/src/web-ui/app/ui-behavior.js +3 -1
  461. package/dist/src/web-ui/app/vendor/README.md +15 -0
  462. package/dist/src/web-ui/app/vendor/markdown-it.LICENSE +22 -0
  463. package/dist/src/web-ui/app/vendor/markdown-it.js +3003 -0
  464. package/dist/src/web-ui/link-preview/metadata.d.ts +9 -0
  465. package/dist/src/web-ui/link-preview/metadata.js +97 -0
  466. package/dist/src/web-ui/link-preview/preview-cache.d.ts +4 -0
  467. package/dist/src/web-ui/link-preview/preview-cache.js +23 -0
  468. package/dist/src/web-ui/link-preview/raster-response.d.ts +9 -0
  469. package/dist/src/web-ui/link-preview/raster-response.js +49 -0
  470. package/dist/src/web-ui/link-preview/routes.d.ts +3 -0
  471. package/dist/src/web-ui/link-preview/routes.js +97 -0
  472. package/dist/src/web-ui/link-preview/service.d.ts +11 -0
  473. package/dist/src/web-ui/link-preview/service.js +117 -0
  474. package/dist/src/web-ui/local-runtime/api-router.d.ts +4 -1
  475. package/dist/src/web-ui/local-runtime/api-router.js +42 -73
  476. package/dist/src/web-ui/local-runtime/contracts.d.ts +2 -2
  477. package/dist/src/web-ui/local-runtime/environment-registry.d.ts +12 -1
  478. package/dist/src/web-ui/local-runtime/environment-registry.js +38 -3
  479. package/dist/src/web-ui/local-runtime/realtime-controller.js +3 -1
  480. package/dist/src/web-ui/local-runtime/request-execution.d.ts +5 -1
  481. package/dist/src/web-ui/local-runtime/request-execution.js +38 -2
  482. package/dist/src/web-ui/local-runtime/schedule-job-creation.d.ts +7 -0
  483. package/dist/src/web-ui/local-runtime/schedule-job-creation.js +62 -0
  484. package/dist/src/web-ui/local-runtime/schedule-management-routes.d.ts +30 -0
  485. package/dist/src/web-ui/local-runtime/schedule-management-routes.js +134 -0
  486. package/dist/src/web-ui/local-runtime/schedule-run-page.d.ts +5 -0
  487. package/dist/src/web-ui/local-runtime/schedule-run-page.js +23 -0
  488. package/dist/src/web-ui/local-runtime/session-routes.d.ts +17 -0
  489. package/dist/src/web-ui/local-runtime/session-routes.js +74 -0
  490. package/dist/src/web-ui/local-runtime-backend.d.ts +2 -0
  491. package/dist/src/web-ui/local-runtime-backend.js +11 -1
  492. package/dist/src/web-ui/schedule-creation-contract.d.ts +7 -0
  493. package/dist/src/web-ui/schedule-creation-contract.js +1 -0
  494. package/dist/src/web-ui/server-shutdown.d.ts +4 -0
  495. package/dist/src/web-ui/server-shutdown.js +32 -0
  496. package/dist/src/web-ui/server.js +13 -10
  497. package/dist/src/web-ui/session-read-state/availability.d.ts +16 -0
  498. package/dist/src/web-ui/session-read-state/availability.js +20 -0
  499. package/dist/src/web-ui/session-read-state/projection.d.ts +17 -0
  500. package/dist/src/web-ui/session-read-state/projection.js +71 -0
  501. package/dist/src/web-ui/session-read-state/service.d.ts +86 -0
  502. package/dist/src/web-ui/session-read-state/service.js +89 -0
  503. package/dist/src/web-ui/session-read-state/store.d.ts +22 -0
  504. package/dist/src/web-ui/session-read-state/store.js +110 -0
  505. package/docs/configuration.md +41 -1
  506. package/docs/long-term-memory.md +46 -5
  507. package/docs/plugins.md +15 -9
  508. package/docs/runtime-invariant-coverage.md +1 -1
  509. package/docs/runtime-library.md +23 -0
  510. package/docs/runtime-public-contracts.md +32 -1
  511. package/package.json +3 -1
  512. package/plugins/code-outline/plugin.json +15 -0
  513. package/plugins/document-reader/plugin.json +17 -0
  514. package/plugins/exec/plugin.json +3 -3
  515. package/plugins/exec/skills/exec_skill/SKILL.md +1 -1
  516. package/plugins/exec/source/process-manager.ts +1 -20
  517. package/plugins/exec/source/shell-platform.ts +29 -0
  518. package/plugins/exec/src/index.cjs +25 -18
  519. package/plugins/filesystem/plugin.json +17 -2
  520. package/plugins/filesystem/source/atomic-write.ts +9 -0
  521. package/plugins/filesystem/source/bounded-io.ts +5 -99
  522. package/plugins/filesystem/source/directory-authority-write.ts +64 -0
  523. package/plugins/filesystem/source/directory-sample-task.ts +23 -0
  524. package/plugins/filesystem/source/directory-sample.ts +132 -0
  525. package/plugins/filesystem/source/directory-write-task.ts +160 -0
  526. package/plugins/filesystem/source/mutation-parent.ts +11 -0
  527. package/plugins/filesystem/src/index.cjs +693 -118
  528. package/plugins/json-inspector/plugin.json +12 -0
  529. package/plugins/local-search/plugin.json +12 -0
  530. package/plugins/local-search/source/index.ts +2 -0
  531. package/plugins/local-search/source/paths.ts +30 -7
  532. package/plugins/local-search/source/ripgrep-process.ts +69 -0
  533. package/plugins/local-search/source/ripgrep.ts +19 -23
  534. package/plugins/local-search/src/index.cjs +295 -32
  535. package/plugins/memory/plugin.json +26 -1
  536. package/plugins/memory/source/index.ts +10 -6
  537. package/plugins/memory/src/index.cjs +11 -7
  538. package/plugins/project-orientation/plugin.json +14 -0
  539. package/plugins/web/source/aggregate-gate.ts +8 -130
  540. package/plugins/web/source/deadline.ts +14 -50
  541. package/plugins/web/source/errors.ts +17 -11
  542. package/plugins/web/source/limits.ts +3 -6
  543. package/plugins/web/source/network-policy.ts +28 -226
  544. package/plugins/web/source/public-http.ts +17 -142
  545. package/plugins/web/source/request-hop.ts +11 -191
  546. package/plugins/web/src/index.cjs +119 -59
  547. package/runtime.config.schema.json +7 -0
  548. package/src/runtime/README.md +105 -1
  549. package/src/runtime/local-host/README.md +86 -0
  550. 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
  }
package/docs/plugins.md CHANGED
@@ -300,13 +300,19 @@ Node filesystem APIs do not provide inode compare-and-swap, so a completely
300
300
  independent writer that ignores this coordination can still race in the final
301
301
  existing-file commit window. Consumers that require stronger multi-process
302
302
  coordination must place the work root behind a versioned or transactional store.
303
- Mutation path traversal requires Linux procfs and no-follow file-descriptor
304
- support. The plugin fails closed when either safety primitive is unavailable.
305
-
306
- The bundled `local-search` plugin also requires Linux procfs and no-follow
307
- file-descriptor support. It holds the selected file or directory through a
308
- stable descriptor for the complete ripgrep invocation and fails closed when
309
- that authority cannot be established.
303
+ Mutation path traversal requires no-follow directory handles. On Linux the
304
+ plugin anchors operations through procfs. On macOS an isolated Node child
305
+ inherits the held directory handle, verifies its current directory against
306
+ that handle, and performs basename-relative operations from the pinned current
307
+ directory. Each descendant transition is verified before mutation. The parent
308
+ Runtime never changes its current directory, and unavailable authority fails
309
+ closed. Directory inspection uses the same platform-specific authority.
310
+
311
+ The bundled `local-search` plugin holds the selected file or directory through
312
+ a stable descriptor for the complete ripgrep invocation. Linux directory
313
+ searches use procfs; macOS searches inherit the verified current directory of
314
+ an isolated Node child. File content searches use the held input descriptor on
315
+ both platforms. A search fails closed when its authority cannot be established.
310
316
 
311
317
  All output and structured data must be bounded at the producer. The shared SDK
312
318
  reserves wrapper headroom by rejecting plugin results above 128 KiB before they
@@ -316,8 +322,8 @@ and rendered text. A truncated success reports machine-readable truncation
316
322
  metadata; an operation that cannot produce a truthful bounded result fails
317
323
  explicitly.
318
324
 
319
- The bundled `exec` plugin is intentionally a Linux-only integration with
320
- non-interactive `/bin/bash`. Its configured working directory is constrained to
325
+ The bundled `exec` plugin supports Linux and macOS with non-interactive
326
+ `/bin/bash`. Commands must use utilities available on the host. Its configured working directory is constrained to
321
327
  agent-work or workspace roots, but the shell runs with the Runtime process
322
328
  permissions and is not an operating-system sandbox.
323
329