@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,59 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { open, rename, rm } from "node:fs/promises";
3
+ import { dirname, resolve } from "node:path";
4
+ /** The replacement is visible, but its directory entry is not confirmed durable. */
5
+ export class JournalPublicationSyncError extends Error {
6
+ constructor(cause) {
7
+ super("scheduler_store_directory_sync_failed", { cause });
8
+ }
9
+ }
10
+ function supportsJournalDirectorySync() {
11
+ // Node does not support opening Windows directories for FileHandle.sync().
12
+ return process.platform !== "win32";
13
+ }
14
+ export async function syncJournalDirectory(directory) {
15
+ if (!supportsJournalDirectorySync())
16
+ return;
17
+ const handle = await open(directory, "r");
18
+ try {
19
+ await handle.sync();
20
+ }
21
+ finally {
22
+ await handle.close();
23
+ }
24
+ }
25
+ /** Establish the owned root, including directories left by an interrupted mkdir. */
26
+ export async function syncJournalDirectoryPath(directory) {
27
+ if (!supportsJournalDirectorySync())
28
+ return;
29
+ let current = resolve(directory);
30
+ for (;;) {
31
+ await syncJournalDirectory(current);
32
+ const parent = dirname(current);
33
+ if (parent === current)
34
+ return;
35
+ current = parent;
36
+ }
37
+ }
38
+ export async function writeJournalJson(path, value) {
39
+ const temporary = `${path}.${randomUUID()}.tmp`;
40
+ const handle = await open(temporary, "wx", 0o600);
41
+ try {
42
+ await handle.writeFile(JSON.stringify(value), "utf8");
43
+ await handle.sync();
44
+ await handle.close();
45
+ await rename(temporary, path);
46
+ }
47
+ catch (error) {
48
+ await handle.close().catch(() => undefined);
49
+ await rm(temporary, { force: true }).catch(() => undefined);
50
+ throw error;
51
+ }
52
+ try {
53
+ await syncJournalDirectory(dirname(path));
54
+ }
55
+ catch (error) {
56
+ // Do not unlink or roll back a replacement that readers can already see.
57
+ throw new JournalPublicationSyncError(error);
58
+ }
59
+ }
@@ -0,0 +1,14 @@
1
+ import { SchedulerJournalIndex } from "./journal-index.js";
2
+ import { type SchedulerTransaction } from "./journal-transaction.js";
3
+ export { SCHEDULER_MANIFEST, isMissingJournalFile } from "./journal-head.js";
4
+ export { writeJournalJson } from "./journal-durability.js";
5
+ export declare function readJournalGeneration(directory: string): Promise<string | undefined>;
6
+ export declare function loadJournalIndex(directory: string, generation: string): Promise<{
7
+ index: SchedulerJournalIndex;
8
+ sequence: number;
9
+ }>;
10
+ export declare function journalTransactionName(sequence: number): string;
11
+ export declare function createJournalGeneration(directory: string): Promise<string>;
12
+ /** Only under the owner lock. The committed pointer is the sole keep rule. */
13
+ export declare function cleanObsoleteJournalGenerations(directory: string, active?: string): Promise<void>;
14
+ export declare function initialJournalTransaction(): SchedulerTransaction;
@@ -0,0 +1,59 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { mkdir, readFile, readdir, rm } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { SchedulerJournalIndex } from "./journal-index.js";
5
+ import { parseSchedulerTransaction, } from "./journal-transaction.js";
6
+ import { JOURNAL_GENERATION_NAME, readJournalHead } from "./journal-head.js";
7
+ import { syncJournalDirectory } from "./journal-durability.js";
8
+ export { SCHEDULER_MANIFEST, isMissingJournalFile } from "./journal-head.js";
9
+ export { writeJournalJson } from "./journal-durability.js";
10
+ export async function readJournalGeneration(directory) {
11
+ return (await readJournalHead(directory))?.generation;
12
+ }
13
+ export async function loadJournalIndex(directory, generation) {
14
+ const path = join(directory, generation);
15
+ const entries = (await readdir(path))
16
+ .filter((name) => name.endsWith(".json"))
17
+ .sort();
18
+ if (!entries.length)
19
+ throw new Error("scheduler_store_corrupt");
20
+ const index = new SchedulerJournalIndex();
21
+ for (const [position, name] of entries.entries()) {
22
+ if (name !== journalTransactionName(position + 1))
23
+ throw new Error("scheduler_store_corrupt");
24
+ const file = join(path, name);
25
+ index.apply(parseSchedulerTransaction(JSON.parse(await readFile(file, "utf8"))), file);
26
+ }
27
+ return { index, sequence: entries.length };
28
+ }
29
+ export function journalTransactionName(sequence) {
30
+ if (!Number.isSafeInteger(sequence) || sequence < 1)
31
+ throw new Error("scheduler_store_sequence_invalid");
32
+ return `${String(sequence).padStart(16, "0")}.json`;
33
+ }
34
+ export async function createJournalGeneration(directory) {
35
+ const generation = `generation-${randomUUID()}`;
36
+ await mkdir(join(directory, generation), { mode: 0o700 });
37
+ await syncJournalDirectory(directory);
38
+ return generation;
39
+ }
40
+ /** Only under the owner lock. The committed pointer is the sole keep rule. */
41
+ export async function cleanObsoleteJournalGenerations(directory, active) {
42
+ for (const entry of await readdir(directory, { withFileTypes: true })) {
43
+ if (!isJournalGenerationDirectory(entry))
44
+ continue;
45
+ if (entry.name === active)
46
+ continue;
47
+ await rm(join(directory, entry.name), { recursive: true, force: true });
48
+ }
49
+ if (active)
50
+ await rm(join(directory, "scheduler.json"), { force: true });
51
+ }
52
+ function isJournalGenerationDirectory(entry) {
53
+ if (!entry.isDirectory())
54
+ return false;
55
+ return JOURNAL_GENERATION_NAME.test(entry.name);
56
+ }
57
+ export function initialJournalTransaction() {
58
+ return { version: 1, jobs: [], runs: [], deletedJobs: [], deletedRuns: [] };
59
+ }
@@ -0,0 +1,21 @@
1
+ export declare const SCHEDULER_MANIFEST = "scheduler-journal.json";
2
+ export declare const MAX_JOURNAL_SUFFIX = 256;
3
+ export declare const JOURNAL_GENERATION_NAME: RegExp;
4
+ export type JournalCheckpointReference = {
5
+ file: string;
6
+ sequence: number;
7
+ };
8
+ export type JournalHead = {
9
+ schemaVersion: 2;
10
+ generation: string;
11
+ } | CommittedJournalHead;
12
+ export type CommittedJournalHead = {
13
+ schemaVersion: 3;
14
+ generation: string;
15
+ sequence: number;
16
+ checkpoint: JournalCheckpointReference;
17
+ };
18
+ export declare function readJournalHead(directory: string): Promise<JournalHead | undefined>;
19
+ export declare function journalReadIdentity(head: JournalHead | undefined): string | undefined;
20
+ export declare function journalCheckpointName(sequence: number): string;
21
+ export declare function isMissingJournalFile(error: unknown): boolean;
@@ -0,0 +1,81 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ export const SCHEDULER_MANIFEST = "scheduler-journal.json";
4
+ export const MAX_JOURNAL_SUFFIX = 256;
5
+ export const JOURNAL_GENERATION_NAME = /^generation-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
6
+ export async function readJournalHead(directory) {
7
+ let text;
8
+ try {
9
+ text = await readFile(join(directory, SCHEDULER_MANIFEST), "utf8");
10
+ }
11
+ catch (error) {
12
+ if (isMissingJournalFile(error))
13
+ return undefined;
14
+ throw error;
15
+ }
16
+ return parseJournalHead(JSON.parse(text));
17
+ }
18
+ function parseJournalHead(value) {
19
+ if (!isJournalObject(value))
20
+ corruptJournalHead();
21
+ if (!isJournalGeneration(value.generation))
22
+ corruptJournalHead();
23
+ if (value.schemaVersion === 2)
24
+ return { schemaVersion: 2, generation: value.generation };
25
+ if (value.schemaVersion !== 3)
26
+ corruptJournalHead();
27
+ if (!isJournalSequence(value.sequence))
28
+ corruptJournalHead();
29
+ if (!isJournalObject(value.checkpoint))
30
+ corruptJournalHead();
31
+ const checkpoint = value.checkpoint;
32
+ if (!isJournalSequence(checkpoint.sequence))
33
+ corruptJournalHead();
34
+ if (checkpoint.file !== journalCheckpointName(checkpoint.sequence))
35
+ corruptJournalHead();
36
+ if (!hasBoundedJournalSuffix(value.sequence, checkpoint.sequence))
37
+ corruptJournalHead();
38
+ return {
39
+ schemaVersion: 3,
40
+ generation: value.generation,
41
+ sequence: value.sequence,
42
+ checkpoint: {
43
+ file: String(checkpoint.file),
44
+ sequence: checkpoint.sequence,
45
+ },
46
+ };
47
+ }
48
+ export function journalReadIdentity(head) {
49
+ if (!head)
50
+ return undefined;
51
+ if (head.schemaVersion === 2)
52
+ return head.generation;
53
+ return `${head.generation}/${head.checkpoint.file}`;
54
+ }
55
+ export function journalCheckpointName(sequence) {
56
+ if (!isJournalSequence(sequence))
57
+ corruptJournalHead();
58
+ return `checkpoint-${sequence}.json`;
59
+ }
60
+ export function isMissingJournalFile(error) {
61
+ return isJournalObject(error) && error.code === "ENOENT";
62
+ }
63
+ function isJournalObject(value) {
64
+ if (value === null || typeof value !== "object")
65
+ return false;
66
+ return !Array.isArray(value);
67
+ }
68
+ function isJournalGeneration(value) {
69
+ return typeof value === "string" && JOURNAL_GENERATION_NAME.test(value);
70
+ }
71
+ function isJournalSequence(value) {
72
+ return Number.isSafeInteger(value) && Number(value) >= 1;
73
+ }
74
+ function hasBoundedJournalSuffix(sequence, covered) {
75
+ if (sequence < covered)
76
+ return false;
77
+ return sequence - covered <= MAX_JOURNAL_SUFFIX;
78
+ }
79
+ function corruptJournalHead() {
80
+ throw new Error("scheduler_store_corrupt");
81
+ }
@@ -0,0 +1,31 @@
1
+ import type { SchedulerJob, SchedulerRun } from "./contracts.js";
2
+ export type JournalRunEntry = Pick<SchedulerRun, "id" | "jobId" | "sessionId" | "environmentId" | "jobRevision" | "scheduledAt" | "requestId" | "status"> & {
3
+ file: string;
4
+ offset: number;
5
+ active?: SchedulerRun;
6
+ };
7
+ export type JournalIndexState = {
8
+ jobs: SchedulerJob[];
9
+ runs: JournalRunEntry[];
10
+ };
11
+ export declare function encodeJournalIndexState(state: JournalIndexState, generation: string, sequence: number): {
12
+ version: number;
13
+ generation: string;
14
+ sequence: number;
15
+ jobs: SchedulerJob[];
16
+ runs: {
17
+ file: string;
18
+ id: string;
19
+ requestId: string;
20
+ sessionId: string;
21
+ status: import("./contracts.js").SchedulerRunStatus;
22
+ jobId: string;
23
+ scheduledAt: string;
24
+ environmentId: string;
25
+ jobRevision: number;
26
+ offset: number;
27
+ active?: SchedulerRun;
28
+ }[];
29
+ };
30
+ export declare function parseJournalIndexState(value: unknown, directory: string, generation: string, sequence: number): JournalIndexState;
31
+ export declare function matchesIndexedJournalRun(run: SchedulerRun | undefined, entry: JournalRunEntry): run is SchedulerRun;
@@ -0,0 +1,137 @@
1
+ import { basename, join } from "node:path";
2
+ import { parseStoredJob, parseStoredRun } from "./snapshot-validation.js";
3
+ export function encodeJournalIndexState(state, generation, sequence) {
4
+ return {
5
+ version: 1,
6
+ generation,
7
+ sequence,
8
+ jobs: state.jobs,
9
+ runs: state.runs.map((entry) => ({ ...entry, file: basename(entry.file) })),
10
+ };
11
+ }
12
+ export function parseJournalIndexState(value, directory, generation, sequence) {
13
+ if (!isIndexObject(value))
14
+ corruptJournalIndex();
15
+ if (value.version !== 1)
16
+ corruptJournalIndex();
17
+ if (value.generation !== generation)
18
+ corruptJournalIndex();
19
+ if (value.sequence !== sequence)
20
+ corruptJournalIndex();
21
+ if (!Array.isArray(value.jobs))
22
+ corruptJournalIndex();
23
+ if (!Array.isArray(value.runs))
24
+ corruptJournalIndex();
25
+ const jobs = value.jobs.map(parseStoredJob);
26
+ const owners = new Map(jobs.map((job) => [job.id, job]));
27
+ if (owners.size !== jobs.length)
28
+ corruptJournalIndex();
29
+ const runs = value.runs.map((entry) => parseJournalRunEntry(entry, directory, sequence, owners));
30
+ if (new Set(runs.map((entry) => entry.id)).size !== runs.length)
31
+ corruptJournalIndex();
32
+ return { jobs, runs };
33
+ }
34
+ function parseJournalRunEntry(value, directory, sequence, jobs) {
35
+ if (!isIndexObject(value))
36
+ corruptJournalIndex();
37
+ for (const field of [
38
+ "id",
39
+ "jobId",
40
+ "sessionId",
41
+ "environmentId",
42
+ "requestId",
43
+ "scheduledAt",
44
+ ]) {
45
+ if (typeof value[field] !== "string")
46
+ corruptJournalIndex();
47
+ }
48
+ if (!Number.isFinite(Date.parse(String(value.scheduledAt))))
49
+ corruptJournalIndex();
50
+ if (!isPositiveIndexInteger(value.jobRevision))
51
+ corruptJournalIndex();
52
+ if (!isNonnegativeIndexInteger(value.offset))
53
+ corruptJournalIndex();
54
+ if (!isCoveredTransactionFile(value.file, sequence))
55
+ corruptJournalIndex();
56
+ if (!isIndexedRunStatus(value.status))
57
+ corruptJournalIndex();
58
+ const entry = {
59
+ ...value,
60
+ file: join(directory, value.file),
61
+ };
62
+ requireIndexedRunOwner(entry, jobs.get(entry.jobId));
63
+ if (requiresActiveRunPayload(entry.status)) {
64
+ entry.active = parseStoredRun(value.active);
65
+ if (!matchesIndexedJournalRun(entry.active, entry))
66
+ corruptJournalIndex();
67
+ return entry;
68
+ }
69
+ if (value.active !== undefined)
70
+ corruptJournalIndex();
71
+ return entry;
72
+ }
73
+ export function matchesIndexedJournalRun(run, entry) {
74
+ if (!run)
75
+ return false;
76
+ const fields = [
77
+ "id",
78
+ "jobId",
79
+ "sessionId",
80
+ "environmentId",
81
+ "jobRevision",
82
+ "scheduledAt",
83
+ "requestId",
84
+ "status",
85
+ ];
86
+ return fields.every((field) => run[field] === entry[field]);
87
+ }
88
+ function requireIndexedRunOwner(entry, job) {
89
+ if (!job)
90
+ corruptJournalIndex();
91
+ if (entry.sessionId !== job.sessionId)
92
+ corruptJournalIndex();
93
+ if (entry.environmentId !== job.environmentId)
94
+ corruptJournalIndex();
95
+ if (entry.jobRevision > job.revision)
96
+ corruptJournalIndex();
97
+ }
98
+ function isIndexObject(value) {
99
+ if (value === null || typeof value !== "object")
100
+ return false;
101
+ return !Array.isArray(value);
102
+ }
103
+ function isPositiveIndexInteger(value) {
104
+ return Number.isSafeInteger(value) && Number(value) >= 1;
105
+ }
106
+ function isNonnegativeIndexInteger(value) {
107
+ return Number.isSafeInteger(value) && Number(value) >= 0;
108
+ }
109
+ function isCoveredTransactionFile(value, sequence) {
110
+ if (typeof value !== "string")
111
+ return false;
112
+ if (!/^[0-9]{16}\.json$/.test(value))
113
+ return false;
114
+ const reference = Number(value.slice(0, -5));
115
+ if (!isPositiveIndexInteger(reference))
116
+ return false;
117
+ return reference <= sequence;
118
+ }
119
+ function isIndexedRunStatus(value) {
120
+ if (typeof value !== "string")
121
+ return false;
122
+ return [
123
+ "pending",
124
+ "running",
125
+ "succeeded",
126
+ "failed",
127
+ "cancelled",
128
+ "interrupted",
129
+ "missed",
130
+ ].includes(value);
131
+ }
132
+ function requiresActiveRunPayload(status) {
133
+ return status === "pending" || status === "running";
134
+ }
135
+ function corruptJournalIndex() {
136
+ throw new Error("scheduler_store_corrupt");
137
+ }
@@ -0,0 +1,22 @@
1
+ import type { SchedulerRun, SchedulerRunListQuery, SchedulerSnapshot } from "./contracts.js";
2
+ import { type SchedulerTransaction } from "./journal-transaction.js";
3
+ import { type JournalIndexState } from "./journal-index-state.js";
4
+ export declare class SchedulerJournalIndex {
5
+ private jobs;
6
+ private runs;
7
+ private active;
8
+ constructor(state?: JournalIndexState);
9
+ exportState(): JournalIndexState;
10
+ validate(transaction: SchedulerTransaction): void;
11
+ private validateChangedJobHistory;
12
+ private prospectiveRunIds;
13
+ apply(transaction: SchedulerTransaction, file: string): void;
14
+ private applyRun;
15
+ private updateActiveRun;
16
+ private applyRunOrder;
17
+ snapshot(view?: "active"): Promise<SchedulerSnapshot>;
18
+ readRuns(jobId?: string, query?: SchedulerRunListQuery): Promise<SchedulerRun[]>;
19
+ private removeRun;
20
+ private removeJob;
21
+ }
22
+ export declare function isActiveSchedulerRun(run: SchedulerRun): boolean;
@@ -0,0 +1,195 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { assertJournalTransactionIds, parseSchedulerTransaction, } from "./journal-transaction.js";
3
+ import { querySchedulerRuns } from "./run-list-query.js";
4
+ import { matchesIndexedJournalRun, } from "./journal-index-state.js";
5
+ export class SchedulerJournalIndex {
6
+ jobs = new Map();
7
+ runs = new Map();
8
+ active = new Map();
9
+ constructor(state) {
10
+ if (!state)
11
+ return;
12
+ const detached = structuredClone(state);
13
+ this.jobs = new Map(detached.jobs.map((job) => [job.id, job]));
14
+ this.runs = new Map(detached.runs.map((run) => [run.id, run]));
15
+ for (const entry of this.runs.values()) {
16
+ if (entry.active)
17
+ this.active.set(entry.id, entry.active);
18
+ }
19
+ }
20
+ exportState() {
21
+ return structuredClone({
22
+ jobs: [...this.jobs.values()],
23
+ runs: [...this.runs.values()],
24
+ });
25
+ }
26
+ validate(transaction) {
27
+ assertJournalTransactionIds(transaction);
28
+ const jobs = new Map(this.jobs);
29
+ for (const job of transaction.jobs)
30
+ jobs.set(job.id, job);
31
+ for (const id of transaction.deletedJobs)
32
+ jobs.delete(id);
33
+ for (const run of transaction.runs)
34
+ assertJournalRunOwner(run, jobs.get(run.jobId));
35
+ this.validateChangedJobHistory(transaction);
36
+ if (transaction.jobOrder)
37
+ assertJournalOrder(jobs, transaction.jobOrder);
38
+ if (transaction.runOrder)
39
+ assertJournalOrder(this.prospectiveRunIds(transaction), transaction.runOrder);
40
+ }
41
+ validateChangedJobHistory(transaction) {
42
+ const changed = new Map(transaction.jobs
43
+ .filter((job) => requiresJournalHistoryValidation(this.jobs.get(job.id), job))
44
+ .map((job) => [job.id, job]));
45
+ if (changed.size === 0)
46
+ return;
47
+ const replaced = new Set([
48
+ ...transaction.deletedRuns,
49
+ ...transaction.runs.map((run) => run.id),
50
+ ]);
51
+ for (const entry of this.runs.values()) {
52
+ if (replaced.has(entry.id))
53
+ continue;
54
+ const job = changed.get(entry.jobId);
55
+ if (!job)
56
+ continue;
57
+ assertJournalRunOwner(entry, job);
58
+ }
59
+ }
60
+ prospectiveRunIds(transaction) {
61
+ const deletedJobs = new Set(transaction.deletedJobs);
62
+ const ids = new Set([...this.runs.values()]
63
+ .filter((run) => !deletedJobs.has(run.jobId))
64
+ .map((run) => run.id));
65
+ for (const id of transaction.deletedRuns)
66
+ ids.delete(id);
67
+ for (const run of transaction.runs)
68
+ ids.add(run.id);
69
+ return ids;
70
+ }
71
+ apply(transaction, file) {
72
+ this.validate(transaction);
73
+ for (const job of transaction.jobs)
74
+ this.jobs.set(job.id, job);
75
+ for (const id of transaction.deletedJobs)
76
+ this.removeJob(id);
77
+ for (const id of transaction.deletedRuns)
78
+ this.removeRun(id);
79
+ transaction.runs.forEach((run, offset) => this.applyRun(run, file, offset));
80
+ if (transaction.jobOrder)
81
+ this.jobs = orderedJournalRecords(this.jobs, transaction.jobOrder);
82
+ this.applyRunOrder(transaction.runOrder);
83
+ }
84
+ applyRun(run, file, offset) {
85
+ const entry = {
86
+ id: run.id,
87
+ jobId: run.jobId,
88
+ sessionId: run.sessionId,
89
+ environmentId: run.environmentId,
90
+ jobRevision: run.jobRevision,
91
+ scheduledAt: run.scheduledAt,
92
+ requestId: run.requestId,
93
+ status: run.status,
94
+ file,
95
+ offset,
96
+ };
97
+ this.updateActiveRun(run, entry);
98
+ this.runs.set(run.id, entry);
99
+ }
100
+ updateActiveRun(run, entry) {
101
+ if (!isActiveSchedulerRun(run)) {
102
+ this.active.delete(run.id);
103
+ return;
104
+ }
105
+ entry.active = run;
106
+ this.active.set(run.id, run);
107
+ }
108
+ applyRunOrder(order) {
109
+ if (!order)
110
+ return;
111
+ this.runs = orderedJournalRecords(this.runs, order);
112
+ this.active = orderedJournalRecords(this.active, order.filter((id) => this.active.has(id)));
113
+ }
114
+ async snapshot(view) {
115
+ return {
116
+ schemaVersion: 1,
117
+ jobs: structuredClone([...this.jobs.values()]),
118
+ runs: view === "active"
119
+ ? structuredClone([...this.active.values()])
120
+ : await this.readRuns(),
121
+ };
122
+ }
123
+ async readRuns(jobId, query) {
124
+ const selected = querySchedulerRuns([...this.runs.values()], jobId, query);
125
+ const files = new Map();
126
+ const result = [];
127
+ for (const entry of selected) {
128
+ if (entry.active) {
129
+ result.push(structuredClone(entry.active));
130
+ continue;
131
+ }
132
+ let loading = files.get(entry.file);
133
+ if (!loading) {
134
+ loading = readFile(entry.file, "utf8").then((text) => parseSchedulerTransaction(JSON.parse(text)));
135
+ files.set(entry.file, loading);
136
+ }
137
+ const run = (await loading).runs[entry.offset];
138
+ if (!matchesIndexedJournalRun(run, entry))
139
+ throw new Error("scheduler_store_corrupt");
140
+ result.push(structuredClone(run));
141
+ }
142
+ return result;
143
+ }
144
+ removeRun(id) {
145
+ this.runs.delete(id);
146
+ this.active.delete(id);
147
+ }
148
+ removeJob(id) {
149
+ this.jobs.delete(id);
150
+ for (const entry of this.runs.values()) {
151
+ if (entry.jobId === id)
152
+ this.removeRun(entry.id);
153
+ }
154
+ }
155
+ }
156
+ export function isActiveSchedulerRun(run) {
157
+ return run.status === "pending" || run.status === "running";
158
+ }
159
+ function orderedJournalRecords(records, order) {
160
+ assertJournalOrder(records, order);
161
+ return new Map(order.map((id) => [id, records.get(id)]));
162
+ }
163
+ function assertJournalOrder(records, order) {
164
+ if (!containsEveryJournalRecord(records, order))
165
+ throw new Error("scheduler_store_corrupt");
166
+ }
167
+ function containsEveryJournalRecord(records, order) {
168
+ if (order.length !== records.size)
169
+ return false;
170
+ if (new Set(order).size !== order.length)
171
+ return false;
172
+ return order.every((id) => records.has(id));
173
+ }
174
+ function requiresJournalHistoryValidation(previous, next) {
175
+ if (!previous)
176
+ return false;
177
+ if (previous.sessionId !== next.sessionId)
178
+ return true;
179
+ if (previous.environmentId !== next.environmentId)
180
+ return true;
181
+ return next.revision < previous.revision;
182
+ }
183
+ function assertJournalRunOwner(run, job) {
184
+ if (!hasConsistentJournalRunOwner(run, job))
185
+ throw new Error("scheduler_store_corrupt");
186
+ }
187
+ function hasConsistentJournalRunOwner(run, job) {
188
+ if (!job)
189
+ return false;
190
+ if (run.sessionId !== job.sessionId)
191
+ return false;
192
+ if (run.environmentId !== job.environmentId)
193
+ return false;
194
+ return run.jobRevision <= job.revision;
195
+ }
@@ -0,0 +1,21 @@
1
+ import type { SchedulerRunListQuery, SchedulerSnapshot } from "./contracts.js";
2
+ export declare class SchedulerJournalStore {
3
+ private readonly directory;
4
+ private index;
5
+ private sequence;
6
+ private generation?;
7
+ private head?;
8
+ private legacy?;
9
+ private publicationFailure?;
10
+ private ownedDirectoriesSynced;
11
+ constructor(directory: string);
12
+ load(): Promise<this>;
13
+ prepareOwned(): Promise<void>;
14
+ snapshot(view?: "active"): Promise<SchedulerSnapshot>;
15
+ readRuns(jobId?: string, query?: SchedulerRunListQuery): Promise<import("./contracts.js").SchedulerRun[]>;
16
+ update<T>(mutate: (state: SchedulerSnapshot) => T, view?: "active"): Promise<T>;
17
+ private replaceGeneration;
18
+ private ensureOwnedDirectoriesSynced;
19
+ private publishHead;
20
+ private requireDurablePublication;
21
+ }