@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
@@ -0,0 +1,145 @@
1
+ /** Client projections only. The owner validates and commits every steering update. */
2
+ export class LocalRuntimeClientRequests {
3
+ call;
4
+ scheduledOptions;
5
+ active = new Map();
6
+ approvals = new Map();
7
+ listeners = new Set();
8
+ constructor(call, scheduledOptions) {
9
+ this.call = call;
10
+ this.scheduledOptions = scheduledOptions;
11
+ }
12
+ requests = {
13
+ handle: async (ws, message, options = {}) => {
14
+ const requestId = String(message.requestId ?? "");
15
+ if (this.active.has(requestId))
16
+ throw new Error("local_runtime_request_already_active");
17
+ const state = this.open(requestId, options, (event) => ws.send(JSON.stringify(event)));
18
+ try {
19
+ await this.call("request.run", [
20
+ message,
21
+ {
22
+ approvalAvailable: Boolean(options.toolApprovalController),
23
+ steeringUpdates: options.requestSteering?.snapshot().updates ?? [],
24
+ },
25
+ ]);
26
+ }
27
+ finally {
28
+ state.accept();
29
+ this.active.delete(requestId);
30
+ }
31
+ },
32
+ steer: async (requestId, input) => {
33
+ await this.active.get(requestId)?.accepted;
34
+ return (await this.call("request.steer", [
35
+ requestId,
36
+ input,
37
+ ]));
38
+ },
39
+ };
40
+ subscribe(listener) {
41
+ this.listeners.add(listener);
42
+ return () => {
43
+ this.listeners.delete(listener);
44
+ };
45
+ }
46
+ receive(event) {
47
+ if (!event || typeof event !== "object")
48
+ return;
49
+ const envelope = event;
50
+ if (envelope.type === "scheduled.started") {
51
+ const run = envelope.run;
52
+ if (this.active.has(run.requestId))
53
+ return;
54
+ const state = this.open(run.requestId, this.scheduledOptions?.(run) ?? {});
55
+ state.run = run;
56
+ state.accept();
57
+ return;
58
+ }
59
+ if (envelope.type !== "scheduled.event")
60
+ return;
61
+ const payload = envelope.event;
62
+ this.publish(payload);
63
+ if (payload.type === "completed" || payload.type === "failed") {
64
+ this.active.delete(String(payload.requestId));
65
+ }
66
+ }
67
+ async handleCallback(method, args) {
68
+ if (method === "scheduled.started") {
69
+ this.receive({ type: "scheduled.started", run: args[0] });
70
+ return null;
71
+ }
72
+ if (method === "request.accepted") {
73
+ this.active.get(String(args[0]))?.accept();
74
+ return null;
75
+ }
76
+ if (method === "request.event") {
77
+ this.active
78
+ .get(String(args[0]))
79
+ ?.send?.(args[1]);
80
+ return null;
81
+ }
82
+ if (method === "request.approval.cancel") {
83
+ this.approvals.get(String(args[0]))?.abort();
84
+ return null;
85
+ }
86
+ if (method !== "request.approval")
87
+ throw new Error("local_runtime_callback_unknown");
88
+ const request = args[0];
89
+ const approval = this.active.get(request.requestId)?.options
90
+ .toolApprovalController;
91
+ if (!approval)
92
+ return { approved: false, reason: "Tool approval is unavailable." };
93
+ const controller = new AbortController();
94
+ this.approvals.set(request.approvalId, controller);
95
+ try {
96
+ return await approval.requestToolApproval(request, {
97
+ abortSignal: controller.signal,
98
+ });
99
+ }
100
+ finally {
101
+ this.approvals.delete(request.approvalId);
102
+ }
103
+ }
104
+ close(disconnected = false) {
105
+ if (disconnected) {
106
+ for (const [requestId, state] of this.active) {
107
+ if (!state.run)
108
+ continue;
109
+ this.publish({
110
+ type: "failed",
111
+ requestId,
112
+ sessionId: state.run.sessionId,
113
+ environment: state.run.environmentId,
114
+ error: "local_runtime_disconnected_outcome_unknown",
115
+ });
116
+ }
117
+ }
118
+ for (const controller of this.approvals.values())
119
+ controller.abort();
120
+ for (const state of this.active.values())
121
+ state.accept();
122
+ this.active.clear();
123
+ this.approvals.clear();
124
+ this.listeners.clear();
125
+ }
126
+ open(requestId, options, send) {
127
+ let accept;
128
+ const accepted = new Promise((resolve) => {
129
+ accept = resolve;
130
+ });
131
+ const state = { options, send, accept, accepted };
132
+ this.active.set(requestId, state);
133
+ return state;
134
+ }
135
+ publish(event) {
136
+ for (const listener of this.listeners) {
137
+ try {
138
+ listener(event);
139
+ }
140
+ catch {
141
+ // A client view cannot prevent request or approval cleanup.
142
+ }
143
+ }
144
+ }
145
+ }
@@ -0,0 +1,10 @@
1
+ import type { SessionStore } from "../ports.js";
2
+ import type { RuntimeAttachmentStore } from "../attachments/store.js";
3
+ import type { SchedulerService } from "../scheduler/contracts.js";
4
+ import type { LocalRuntimeCallHandler } from "./contracts.js";
5
+ /** Projections of owner APIs; lifecycle remains with the managed application. */
6
+ export declare function createLocalServiceClients(call: LocalRuntimeCallHandler): {
7
+ sessions: SessionStore;
8
+ attachments: RuntimeAttachmentStore;
9
+ scheduler: Omit<SchedulerService, "stop" | "start">;
10
+ };
@@ -0,0 +1,14 @@
1
+ import { bindManagedSessionAttachmentDeletion } from "../session/session-attachment-deletion.js";
2
+ import { LOCAL_SESSION_METHODS, LOCAL_ATTACHMENT_METHODS, LOCAL_SCHEDULER_METHODS, } from "./app-service-dispatch.js";
3
+ /** Projections of owner APIs; lifecycle remains with the managed application. */
4
+ export function createLocalServiceClients(call) {
5
+ const service = (prefix, methods) => Object.fromEntries(methods.map((method) => [
6
+ method,
7
+ (...args) => call(`${prefix}.${method}`, args),
8
+ ]));
9
+ const sessions = service("sessions", LOCAL_SESSION_METHODS);
10
+ const attachments = service("attachments", LOCAL_ATTACHMENT_METHODS);
11
+ const scheduler = service("scheduler", LOCAL_SCHEDULER_METHODS);
12
+ bindManagedSessionAttachmentDeletion(sessions, attachments);
13
+ return { sessions, attachments, scheduler };
14
+ }
@@ -0,0 +1,36 @@
1
+ export type LocalRuntimeCallHandler = (method: string, args: readonly unknown[]) => Promise<unknown>;
2
+ export type LocalRuntimePeer = Readonly<{
3
+ id: string;
4
+ callClient: LocalRuntimeCallHandler;
5
+ onClose: (listener: () => void) => () => void;
6
+ }>;
7
+ export type LocalRuntimeOwner = Readonly<{
8
+ call: (method: string, args: readonly unknown[], peer: LocalRuntimePeer) => Promise<unknown>;
9
+ subscribe: (listener: (event: unknown) => void) => () => void;
10
+ stop: () => Promise<void>;
11
+ /** Synchronous activity snapshot; stable after stop has closed intake. */
12
+ isIdle?: () => boolean;
13
+ /** Settles only after stopped-owner execution and persistence have finished. */
14
+ whenIdle?: () => Promise<void>;
15
+ }>;
16
+ export type LocalRuntimeConnection = Readonly<{
17
+ ownership: "owner" | "client";
18
+ call: (method: string, args?: readonly unknown[]) => Promise<unknown>;
19
+ subscribe: (listener: (event: unknown) => void) => () => void;
20
+ setClientHandler: (handler: LocalRuntimeCallHandler) => void;
21
+ onClose: (listener: () => void) => () => void;
22
+ close: () => Promise<void>;
23
+ }>;
24
+ export type LocalRuntimeConnectionOptions = Readonly<{
25
+ directory: string;
26
+ identity: string;
27
+ createOwner: () => Promise<LocalRuntimeOwner>;
28
+ startupTimeoutMs?: number;
29
+ }>;
30
+ export type LocalRuntimeEndpoint = Readonly<{
31
+ version: 1;
32
+ identity: string;
33
+ pid: number;
34
+ port: number;
35
+ token: string;
36
+ }>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ import type { LocalRuntimeEndpoint } from "./contracts.js";
2
+ export declare function localRuntimeEndpointPath(directory: string): string;
3
+ export { ensurePrivateRuntimeDirectory } from "./private-directory.js";
4
+ export declare function readLocalRuntimeEndpoint(directory: string): Promise<LocalRuntimeEndpoint | undefined>;
5
+ export declare function writeLocalRuntimeEndpoint(directory: string, endpoint: LocalRuntimeEndpoint): Promise<void>;
6
+ export declare function removeLocalRuntimeEndpoint(directory: string, token: string): Promise<void>;
7
+ export declare function isLocalRuntimeProcessAlive(pid: number): boolean;
@@ -0,0 +1,79 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { lstat, open, readFile, rename, rm } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { assertPrivateRuntimeAccess } from "./private-access.js";
5
+ export function localRuntimeEndpointPath(directory) {
6
+ return join(directory, "endpoint.json");
7
+ }
8
+ export { ensurePrivateRuntimeDirectory } from "./private-directory.js";
9
+ export async function readLocalRuntimeEndpoint(directory) {
10
+ const path = localRuntimeEndpointPath(directory);
11
+ try {
12
+ const stat = await lstat(path);
13
+ if (!stat.isFile() || stat.isSymbolicLink())
14
+ throw new Error("local_runtime_endpoint_not_private");
15
+ await assertPrivateRuntimeAccess(path, stat, "local_runtime_endpoint_not_private");
16
+ const value = JSON.parse(await readFile(path, "utf8"));
17
+ if (!isLocalRuntimeEndpoint(value))
18
+ throw new Error("local_runtime_invalid_endpoint");
19
+ return value;
20
+ }
21
+ catch (error) {
22
+ if (hasFileErrorCode(error, "ENOENT"))
23
+ return undefined;
24
+ throw error;
25
+ }
26
+ }
27
+ export async function writeLocalRuntimeEndpoint(directory, endpoint) {
28
+ const path = localRuntimeEndpointPath(directory);
29
+ const temporary = `${path}.${randomUUID()}.tmp`;
30
+ const handle = await open(temporary, "wx", 0o600);
31
+ try {
32
+ await handle.writeFile(JSON.stringify(endpoint), "utf8");
33
+ await handle.sync();
34
+ await handle.close();
35
+ await rename(temporary, path);
36
+ }
37
+ catch (error) {
38
+ await handle.close().catch(() => undefined);
39
+ await rm(temporary, { force: true }).catch(() => undefined);
40
+ throw error;
41
+ }
42
+ }
43
+ export async function removeLocalRuntimeEndpoint(directory, token) {
44
+ const endpoint = await readLocalRuntimeEndpoint(directory);
45
+ if (endpoint?.token !== token)
46
+ return;
47
+ await rm(localRuntimeEndpointPath(directory), { force: true });
48
+ }
49
+ export function isLocalRuntimeProcessAlive(pid) {
50
+ try {
51
+ process.kill(pid, 0);
52
+ return true;
53
+ }
54
+ catch (error) {
55
+ return !hasFileErrorCode(error, "ESRCH");
56
+ }
57
+ }
58
+ function isLocalRuntimeEndpoint(value) {
59
+ if (!value || typeof value !== "object" || Array.isArray(value))
60
+ return false;
61
+ const endpoint = value;
62
+ if (endpoint.version !== 1)
63
+ return false;
64
+ if (typeof endpoint.identity !== "string" || !endpoint.identity)
65
+ return false;
66
+ if (!isPositiveInteger(endpoint.pid))
67
+ return false;
68
+ if (!isPositiveInteger(endpoint.port) || endpoint.port > 65_535)
69
+ return false;
70
+ return (typeof endpoint.token === "string" && /^[a-f0-9]{64}$/.test(endpoint.token));
71
+ }
72
+ function isPositiveInteger(value) {
73
+ return typeof value === "number" && Number.isSafeInteger(value) && value > 0;
74
+ }
75
+ function hasFileErrorCode(error, code) {
76
+ if (!error || typeof error !== "object" || !("code" in error))
77
+ return false;
78
+ return error.code === code;
79
+ }
@@ -0,0 +1,10 @@
1
+ /** Keeps accepted RPC effects under the owner's lease until they settle. */
2
+ export declare class LocalRuntimeOwnerActivity {
3
+ private readonly active;
4
+ private stopped;
5
+ assertAcceptingRequests(): void;
6
+ run<T>(operation: () => Promise<T>): Promise<T>;
7
+ stop(): void;
8
+ isIdle(): boolean;
9
+ whenIdle(): Promise<void>;
10
+ }
@@ -0,0 +1,30 @@
1
+ /** Keeps accepted RPC effects under the owner's lease until they settle. */
2
+ export class LocalRuntimeOwnerActivity {
3
+ active = new Set();
4
+ stopped = false;
5
+ assertAcceptingRequests() {
6
+ if (this.stopped)
7
+ throw new Error("local_runtime_owner_stopped");
8
+ }
9
+ async run(operation) {
10
+ this.assertAcceptingRequests();
11
+ const pending = operation();
12
+ this.active.add(pending);
13
+ try {
14
+ return await pending;
15
+ }
16
+ finally {
17
+ this.active.delete(pending);
18
+ }
19
+ }
20
+ stop() {
21
+ this.stopped = true;
22
+ }
23
+ isIdle() {
24
+ return this.active.size === 0;
25
+ }
26
+ async whenIdle() {
27
+ // stop closes intake synchronously before the transport asks for this fence.
28
+ await Promise.allSettled([...this.active]);
29
+ }
30
+ }
@@ -0,0 +1,3 @@
1
+ import type { LocalRuntimeOwner } from "./contracts.js";
2
+ /** Releasing a live owner's lease is separate from closing client transport. */
3
+ export declare function releaseRuntimeOwnerWhenIdle(owner: LocalRuntimeOwner | undefined, release: () => Promise<void>): Promise<void>;
@@ -0,0 +1,15 @@
1
+ /** Releasing a live owner's lease is separate from closing client transport. */
2
+ export function releaseRuntimeOwnerWhenIdle(owner, release) {
3
+ if (!owner?.whenIdle)
4
+ return release();
5
+ const alreadyIdle = owner.isIdle?.() === true;
6
+ const retirement = owner.whenIdle().then(release);
7
+ if (alreadyIdle)
8
+ return retirement;
9
+ void retirement.catch((error) => {
10
+ // Fail closed: uncertainty must never admit a second environment writer.
11
+ // A true process exit still permits the normal abandoned-PID recovery.
12
+ console.error("Local runtime owner retirement failed:", error);
13
+ });
14
+ return Promise.resolve();
15
+ }
@@ -0,0 +1,6 @@
1
+ import type { LocalRuntimeEndpoint, LocalRuntimeOwner } from "./contracts.js";
2
+ export declare function localRuntimeIdentityHeader(identity: string): string;
3
+ export declare function startLocalRuntimeOwnerServer(identity: string, owner: LocalRuntimeOwner): Promise<{
4
+ endpoint: LocalRuntimeEndpoint;
5
+ close: () => Promise<void>;
6
+ }>;
@@ -0,0 +1,88 @@
1
+ import { createHash, randomBytes, timingSafeEqual } from "node:crypto";
2
+ import { createServer } from "node:http";
3
+ import { WebSocketServer } from "ws";
4
+ import { closeHttpServerImmediately } from "../../shared/http-server-shutdown.js";
5
+ import { LocalRuntimeRpcPeer } from "./rpc-peer.js";
6
+ export function localRuntimeIdentityHeader(identity) {
7
+ return createHash("sha256").update(identity).digest("hex");
8
+ }
9
+ export async function startLocalRuntimeOwnerServer(identity, owner) {
10
+ const token = randomBytes(32).toString("hex");
11
+ const expectedIdentity = localRuntimeIdentityHeader(identity);
12
+ const peers = new Set();
13
+ const server = createServer((_request, response) => {
14
+ response.writeHead(404).end();
15
+ });
16
+ const sockets = new WebSocketServer({
17
+ server,
18
+ maxPayload: 64 * 1024 * 1024,
19
+ perMessageDeflate: false,
20
+ verifyClient: ({ req }) => isAuthenticatedLocalClient(req, token, expectedIdentity),
21
+ });
22
+ sockets.on("connection", (socket) => {
23
+ const rpc = new LocalRuntimeRpcPeer(socket);
24
+ const peer = Object.freeze({
25
+ id: rpc.id,
26
+ callClient: (method, args) => rpc.call(method, args),
27
+ onClose: (listener) => rpc.onClose(listener),
28
+ });
29
+ rpc.setHandler((method, args) => owner.call(method, args, peer));
30
+ peers.add(rpc);
31
+ rpc.onClose(() => {
32
+ peers.delete(rpc);
33
+ });
34
+ });
35
+ const unsubscribe = owner.subscribe((event) => {
36
+ for (const peer of peers)
37
+ peer.publish(event);
38
+ });
39
+ try {
40
+ await new Promise((resolve, reject) => {
41
+ server.once("error", reject);
42
+ server.listen(0, "127.0.0.1", () => {
43
+ server.removeListener("error", reject);
44
+ resolve();
45
+ });
46
+ });
47
+ }
48
+ catch (error) {
49
+ unsubscribe();
50
+ sockets.close();
51
+ throw error;
52
+ }
53
+ const endpoint = {
54
+ version: 1,
55
+ identity,
56
+ pid: process.pid,
57
+ port: server.address().port,
58
+ token,
59
+ };
60
+ let shutdown;
61
+ return {
62
+ endpoint,
63
+ close: () => {
64
+ shutdown ??= closeOwner();
65
+ return shutdown;
66
+ },
67
+ };
68
+ async function closeOwner() {
69
+ unsubscribe();
70
+ const serverClosed = closeHttpServerImmediately(server, sockets);
71
+ for (const peer of peers)
72
+ peer.close();
73
+ await Promise.all([owner.stop(), serverClosed]);
74
+ }
75
+ }
76
+ function isAuthenticatedLocalClient(request, token, identity) {
77
+ if (request.socket.remoteAddress !== "127.0.0.1")
78
+ return false;
79
+ if (request.headers["x-abot-runtime-identity"] !== identity)
80
+ return false;
81
+ const authorization = request.headers.authorization ?? "";
82
+ const expected = `Bearer ${token}`;
83
+ const observedBytes = Buffer.from(authorization);
84
+ const expectedBytes = Buffer.from(expected);
85
+ if (observedBytes.length !== expectedBytes.length)
86
+ return false;
87
+ return timingSafeEqual(observedBytes, expectedBytes);
88
+ }
@@ -0,0 +1,2 @@
1
+ import type { Stats } from "node:fs";
2
+ export declare function assertPrivateRuntimeAccess(path: string, stat: Stats, errorCode: string, newlyCreatedDirectory?: boolean): Promise<void>;
@@ -0,0 +1,16 @@
1
+ import { verifyWindowsPrivateAccess } from "./windows-private-access.js";
2
+ export async function assertPrivateRuntimeAccess(path, stat, errorCode, newlyCreatedDirectory = false) {
3
+ if (process.platform === "win32") {
4
+ try {
5
+ await verifyWindowsPrivateAccess(path, newlyCreatedDirectory);
6
+ return;
7
+ }
8
+ catch {
9
+ throw new Error(errorCode);
10
+ }
11
+ }
12
+ if ((stat.mode & 0o077) !== 0)
13
+ throw new Error(errorCode);
14
+ if (process.getuid?.() !== stat.uid)
15
+ throw new Error(errorCode);
16
+ }
@@ -0,0 +1 @@
1
+ export declare function ensurePrivateRuntimeDirectory(directory: string): Promise<void>;
@@ -0,0 +1,57 @@
1
+ import { lstat, mkdir, mkdtemp, rename, rmdir } from "node:fs/promises";
2
+ import { basename, dirname, join } from "node:path";
3
+ import { assertPrivateRuntimeAccess } from "./private-access.js";
4
+ import { verifyWindowsPrivateAccess } from "./windows-private-access.js";
5
+ export async function ensurePrivateRuntimeDirectory(directory) {
6
+ if (process.platform === "win32")
7
+ await installWindowsPrivateDirectory(directory);
8
+ else
9
+ await mkdir(directory, { recursive: true, mode: 0o700 });
10
+ const stat = await lstat(directory);
11
+ if (!stat.isDirectory() || stat.isSymbolicLink())
12
+ throw new Error("local_runtime_directory_not_private");
13
+ await assertPrivateRuntimeAccess(directory, stat, "local_runtime_directory_not_private");
14
+ }
15
+ async function installWindowsPrivateDirectory(directory) {
16
+ if (await hasExistingPath(directory))
17
+ return;
18
+ const parent = dirname(directory);
19
+ await mkdir(parent, { recursive: true });
20
+ const temporary = await mkdtemp(join(parent, `.${basename(directory)}.private-`));
21
+ try {
22
+ await verifyWindowsPrivateAccess(temporary, true);
23
+ try {
24
+ await rename(temporary, directory);
25
+ }
26
+ catch (error) {
27
+ if (!(await hasExistingPath(directory)))
28
+ throw error;
29
+ // A concurrent creator won; the caller verifies its installed ACL below.
30
+ }
31
+ }
32
+ catch {
33
+ throw new Error("local_runtime_directory_not_private");
34
+ }
35
+ finally {
36
+ await rmdir(temporary).catch((error) => {
37
+ if (!isMissingPath(error))
38
+ throw error;
39
+ });
40
+ }
41
+ }
42
+ async function hasExistingPath(path) {
43
+ try {
44
+ await lstat(path);
45
+ return true;
46
+ }
47
+ catch (error) {
48
+ if (isMissingPath(error))
49
+ return false;
50
+ throw error;
51
+ }
52
+ }
53
+ function isMissingPath(error) {
54
+ if (!error || typeof error !== "object" || !("code" in error))
55
+ return false;
56
+ return error.code === "ENOENT";
57
+ }
@@ -0,0 +1,22 @@
1
+ import WebSocket from "ws";
2
+ import type { LocalRuntimeCallHandler } from "./contracts.js";
3
+ export declare class LocalRuntimeRpcPeer {
4
+ private readonly socket;
5
+ readonly id: `${string}-${string}-${string}-${string}-${string}`;
6
+ private readonly pending;
7
+ private readonly events;
8
+ private readonly closedListeners;
9
+ private handler;
10
+ private closed;
11
+ constructor(socket: WebSocket);
12
+ setHandler(handler: LocalRuntimeCallHandler): void;
13
+ call(method: string, args?: readonly unknown[]): Promise<unknown>;
14
+ subscribe(listener: (event: unknown) => void): () => void;
15
+ onClose(listener: () => void): () => void;
16
+ publish(value: unknown): void;
17
+ close(): void;
18
+ private send;
19
+ private receive;
20
+ private respond;
21
+ private disconnected;
22
+ }