@abot-ai/runtime 1.2.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (550) hide show
  1. package/README.md +14 -0
  2. package/dist/scripts/init-runtime.js +4 -13
  3. package/dist/scripts/runtime-setup-directories.d.ts +2 -0
  4. package/dist/scripts/runtime-setup-directories.js +38 -0
  5. package/dist/src/bridge/request-steering.d.ts +2 -1
  6. package/dist/src/bridge/request-steering.js +4 -2
  7. package/dist/src/bridge/runtime-replay.js +2 -19
  8. package/dist/src/bridge/start-agent-bridge.js +1 -1
  9. package/dist/src/capabilities/normal-invocation/validator.js +1 -1
  10. package/dist/src/capabilities/tool-definition-validator/event-presentation.js +3 -0
  11. package/dist/src/capabilities/tool-definition-validator/event-result-metadata.d.ts +2 -0
  12. package/dist/src/capabilities/tool-definition-validator/event-result-metadata.js +74 -0
  13. package/dist/src/capabilities/tool-event-metadata.js +3 -0
  14. package/dist/src/capabilities/tool-result-event-projection.d.ts +3 -0
  15. package/dist/src/capabilities/tool-result-event-projection.js +82 -0
  16. package/dist/src/capabilities/tool-types.d.ts +5 -0
  17. package/dist/src/cli/abot.js +2 -11
  18. package/dist/src/runtime/adapters/in-memory-session-store.js +1 -0
  19. package/dist/src/runtime/adapters/long-term-memory/file-lock/acquisition.js +11 -2
  20. package/dist/src/runtime/adapters/long-term-memory/file-lock/contracts.d.ts +2 -0
  21. package/dist/src/runtime/adapters/long-term-memory/file-lock/synchronous-release.d.ts +2 -0
  22. package/dist/src/runtime/adapters/long-term-memory/file-lock/synchronous-release.js +40 -0
  23. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/approval.d.ts +3 -0
  24. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/approval.js +9 -0
  25. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/rejection-event.d.ts +13 -0
  26. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/rejection-event.js +25 -0
  27. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/run.js +18 -2
  28. package/dist/src/runtime/adapters/registered-tool-normal-invocations/executor.js +8 -0
  29. package/dist/src/runtime/adapters/registered-tool-normal-invocations/payload/lifecycle.js +7 -3
  30. package/dist/src/runtime/adapters/registered-tool-normal-invocations/shared/contracts.d.ts +17 -2
  31. package/dist/src/runtime/adapters/registered-tool-normal-invocations/shared/event-metadata.d.ts +9 -0
  32. package/dist/src/runtime/adapters/registered-tool-normal-invocations/shared/event-metadata.js +8 -0
  33. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/execution.js +16 -1
  34. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-observability.js +2 -2
  35. package/dist/src/runtime/adapters/scheduled-request-outcome.d.ts +11 -0
  36. package/dist/src/runtime/adapters/scheduled-request-outcome.js +41 -0
  37. package/dist/src/runtime/adapters/scheduler-runtime.d.ts +19 -0
  38. package/dist/src/runtime/adapters/scheduler-runtime.js +138 -0
  39. package/dist/src/runtime/capabilities/scheduling/create-operations.d.ts +55 -0
  40. package/dist/src/runtime/capabilities/scheduling/create-operations.js +30 -0
  41. package/dist/src/runtime/capabilities/scheduling/create-time-zone.d.ts +1 -0
  42. package/dist/src/runtime/capabilities/scheduling/create-time-zone.js +11 -0
  43. package/dist/src/runtime/capabilities/scheduling/job-list-page.d.ts +25 -0
  44. package/dist/src/runtime/capabilities/scheduling/job-list-page.js +40 -0
  45. package/dist/src/runtime/capabilities/scheduling/model-validation.d.ts +2 -0
  46. package/dist/src/runtime/capabilities/scheduling/model-validation.js +15 -0
  47. package/dist/src/runtime/capabilities/scheduling/tool-contract.d.ts +2 -0
  48. package/dist/src/runtime/capabilities/scheduling/tool-contract.js +35 -0
  49. package/dist/src/runtime/capabilities/scheduling/tool-input-properties.d.ts +43 -0
  50. package/dist/src/runtime/capabilities/scheduling/tool-input-properties.js +27 -0
  51. package/dist/src/runtime/capabilities/scheduling/tool-module.d.ts +4 -0
  52. package/dist/src/runtime/capabilities/scheduling/tool-module.js +158 -0
  53. package/dist/src/runtime/capabilities/scheduling/update-operations.d.ts +2 -0
  54. package/dist/src/runtime/capabilities/scheduling/update-operations.js +49 -0
  55. package/dist/src/runtime/composition.d.ts +23 -3
  56. package/dist/src/runtime/composition.js +12 -17
  57. package/dist/src/runtime/config/environment-paths.d.ts +10 -0
  58. package/dist/src/runtime/config/environment-paths.js +31 -0
  59. package/dist/src/runtime/config/environment-storage.d.ts +9 -0
  60. package/dist/src/runtime/config/environment-storage.js +65 -0
  61. package/dist/src/runtime/config/fields.js +7 -0
  62. package/dist/src/runtime/config/long-term-memory.js +15 -0
  63. package/dist/src/runtime/config/schema.js +8 -0
  64. package/dist/src/runtime/config.js +9 -5
  65. package/dist/src/runtime/context/scheduled-execution-context.d.ts +10 -0
  66. package/dist/src/runtime/context/scheduled-execution-context.js +52 -0
  67. package/dist/src/runtime/default-adapters.d.ts +3 -32
  68. package/dist/src/runtime/default-adapters.js +3 -270
  69. package/dist/src/runtime/default-environment-adapters.d.ts +19 -0
  70. package/dist/src/runtime/default-environment-adapters.js +144 -0
  71. package/dist/src/runtime/index.d.ts +5 -0
  72. package/dist/src/runtime/index.js +4 -0
  73. package/dist/src/runtime/local-application.d.ts +22 -0
  74. package/dist/src/runtime/local-application.js +81 -0
  75. package/dist/src/runtime/local-host/app-memory-dispatch.d.ts +11 -0
  76. package/dist/src/runtime/local-host/app-memory-dispatch.js +103 -0
  77. package/dist/src/runtime/local-host/app-owner.d.ts +4 -0
  78. package/dist/src/runtime/local-host/app-owner.js +119 -0
  79. package/dist/src/runtime/local-host/app-request-control.d.ts +24 -0
  80. package/dist/src/runtime/local-host/app-request-control.js +135 -0
  81. package/dist/src/runtime/local-host/app-service-dispatch.d.ts +5 -0
  82. package/dist/src/runtime/local-host/app-service-dispatch.js +64 -0
  83. package/dist/src/runtime/local-host/client-identity.d.ts +3 -0
  84. package/dist/src/runtime/local-host/client-identity.js +17 -0
  85. package/dist/src/runtime/local-host/client-memory.d.ts +7 -0
  86. package/dist/src/runtime/local-host/client-memory.js +54 -0
  87. package/dist/src/runtime/local-host/client-requests.d.ts +19 -0
  88. package/dist/src/runtime/local-host/client-requests.js +145 -0
  89. package/dist/src/runtime/local-host/client-services.d.ts +10 -0
  90. package/dist/src/runtime/local-host/client-services.js +14 -0
  91. package/dist/src/runtime/local-host/contracts.d.ts +36 -0
  92. package/dist/src/runtime/local-host/contracts.js +1 -0
  93. package/dist/src/runtime/local-host/endpoint.d.ts +7 -0
  94. package/dist/src/runtime/local-host/endpoint.js +79 -0
  95. package/dist/src/runtime/local-host/owner-activity.d.ts +10 -0
  96. package/dist/src/runtime/local-host/owner-activity.js +30 -0
  97. package/dist/src/runtime/local-host/owner-retirement.d.ts +3 -0
  98. package/dist/src/runtime/local-host/owner-retirement.js +15 -0
  99. package/dist/src/runtime/local-host/owner-server.d.ts +6 -0
  100. package/dist/src/runtime/local-host/owner-server.js +88 -0
  101. package/dist/src/runtime/local-host/private-access.d.ts +2 -0
  102. package/dist/src/runtime/local-host/private-access.js +16 -0
  103. package/dist/src/runtime/local-host/private-directory.d.ts +1 -0
  104. package/dist/src/runtime/local-host/private-directory.js +57 -0
  105. package/dist/src/runtime/local-host/rpc-peer.d.ts +22 -0
  106. package/dist/src/runtime/local-host/rpc-peer.js +168 -0
  107. package/dist/src/runtime/local-host/rpc-protocol.d.ts +21 -0
  108. package/dist/src/runtime/local-host/rpc-protocol.js +46 -0
  109. package/dist/src/runtime/local-host/startup-connection.d.ts +5 -0
  110. package/dist/src/runtime/local-host/startup-connection.js +72 -0
  111. package/dist/src/runtime/local-host/transport.d.ts +3 -0
  112. package/dist/src/runtime/local-host/transport.js +88 -0
  113. package/dist/src/runtime/local-host/windows-private-access.d.ts +1 -0
  114. package/dist/src/runtime/local-host/windows-private-access.js +51 -0
  115. package/dist/src/runtime/long-term-memory/onboarding/configuration.js +6 -0
  116. package/dist/src/runtime/long-term-memory/recall-binding.d.ts +3 -0
  117. package/dist/src/runtime/long-term-memory/recall-binding.js +27 -0
  118. package/dist/src/runtime/long-term-memory/recall-context.d.ts +20 -0
  119. package/dist/src/runtime/long-term-memory/recall-context.js +101 -0
  120. package/dist/src/runtime/long-term-memory/recall-continuation.d.ts +8 -0
  121. package/dist/src/runtime/long-term-memory/recall-continuation.js +36 -0
  122. package/dist/src/runtime/long-term-memory/recall-policy.d.ts +7 -0
  123. package/dist/src/runtime/long-term-memory/recall-policy.js +14 -0
  124. package/dist/src/runtime/long-term-memory/recall-result.d.ts +5 -0
  125. package/dist/src/runtime/long-term-memory/recall-result.js +54 -0
  126. package/dist/src/runtime/long-term-memory/repository-state.d.ts +2 -1
  127. package/dist/src/runtime/long-term-memory/repository-state.js +2 -2
  128. package/dist/src/runtime/model/invoke-raw-step.d.ts +1 -0
  129. package/dist/src/runtime/model/invoke-raw-step.js +1 -0
  130. package/dist/src/runtime/model/invoke-step.js +6 -0
  131. package/dist/src/runtime/model/invoke-structured-step.d.ts +1 -0
  132. package/dist/src/runtime/model/invoke-structured-step.js +1 -0
  133. package/dist/src/runtime/model/model-step-port.d.ts +2 -0
  134. package/dist/src/runtime/model/model-step-steering.d.ts +8 -0
  135. package/dist/src/runtime/model/model-step-steering.js +19 -0
  136. package/dist/src/runtime/orchestration/final-response/authoring-contract.js +1 -1
  137. package/dist/src/runtime/orchestration/final-response/invoke.d.ts +1 -0
  138. package/dist/src/runtime/orchestration/final-response/invoke.js +1 -0
  139. package/dist/src/runtime/orchestration/role-calls/activation-budget.js +1 -0
  140. package/dist/src/runtime/orchestration/role-calls/candidate-validation.js +9 -49
  141. package/dist/src/runtime/orchestration/role-calls/capability-selection-reconsideration.d.ts +9 -0
  142. package/dist/src/runtime/orchestration/role-calls/capability-selection-reconsideration.js +17 -8
  143. package/dist/src/runtime/orchestration/role-calls/capability-selection-supervision-validation.d.ts +2 -0
  144. package/dist/src/runtime/orchestration/role-calls/capability-selection-supervision-validation.js +62 -0
  145. package/dist/src/runtime/orchestration/role-calls/command-decoder.js +4 -0
  146. package/dist/src/runtime/orchestration/role-calls/command-dispatch/memory-recall-transitions.d.ts +4 -0
  147. package/dist/src/runtime/orchestration/role-calls/command-dispatch/memory-recall-transitions.js +89 -0
  148. package/dist/src/runtime/orchestration/role-calls/command-dispatch.js +5 -0
  149. package/dist/src/runtime/orchestration/role-calls/contracts.d.ts +9 -7
  150. package/dist/src/runtime/orchestration/role-calls/contracts.js +2 -2
  151. package/dist/src/runtime/orchestration/role-calls/diagnostics.js +3 -0
  152. package/dist/src/runtime/orchestration/role-calls/index.d.ts +1 -0
  153. package/dist/src/runtime/orchestration/role-calls/index.js +1 -0
  154. package/dist/src/runtime/orchestration/role-calls/memory-recall-contract.d.ts +51 -0
  155. package/dist/src/runtime/orchestration/role-calls/memory-recall-contract.js +4 -0
  156. package/dist/src/runtime/orchestration/role-calls/memory-recall-decoder.d.ts +6 -0
  157. package/dist/src/runtime/orchestration/role-calls/memory-recall-decoder.js +147 -0
  158. package/dist/src/runtime/orchestration/role-calls/memory-recall-diagnostics.d.ts +5 -0
  159. package/dist/src/runtime/orchestration/role-calls/memory-recall-diagnostics.js +27 -0
  160. package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.d.ts +3 -0
  161. package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.js +121 -0
  162. package/dist/src/runtime/orchestration/role-calls/memory-recall-transactions.d.ts +3 -0
  163. package/dist/src/runtime/orchestration/role-calls/memory-recall-transactions.js +44 -0
  164. package/dist/src/runtime/orchestration/role-calls/reducer.js +1 -0
  165. package/dist/src/runtime/orchestration/role-calls/transaction-effect.d.ts +5 -0
  166. package/dist/src/runtime/orchestration/role-calls/transaction-effect.js +14 -0
  167. package/dist/src/runtime/orchestration/role-calls/transactions.js +3 -24
  168. package/dist/src/runtime/plugins/manifest-validator.js +4 -1
  169. package/dist/src/runtime/ports.d.ts +4 -0
  170. package/dist/src/runtime/request/bound-runtime-handler.d.ts +2 -0
  171. package/dist/src/runtime/request/bound-runtime-handler.js +25 -0
  172. package/dist/src/runtime/request/contracts.d.ts +6 -0
  173. package/dist/src/runtime/request/execution-agent-root-execution.js +12 -0
  174. package/dist/src/runtime/request/execution-facets.js +6 -0
  175. package/dist/src/runtime/request/execution-scope-surfaces.js +10 -0
  176. package/dist/src/runtime/request/execution-scope.d.ts +1 -1
  177. package/dist/src/runtime/request/handler.js +6 -0
  178. package/dist/src/runtime/request/root-contract.d.ts +7 -1
  179. package/dist/src/runtime/request/root-execution-kernel.js +33 -37
  180. package/dist/src/runtime/request/root-memory-recall.d.ts +11 -0
  181. package/dist/src/runtime/request/root-memory-recall.js +71 -0
  182. package/dist/src/runtime/request/root-observation-handoff.d.ts +17 -0
  183. package/dist/src/runtime/request/root-observation-handoff.js +44 -0
  184. package/dist/src/runtime/request/scheduled-execution.d.ts +9 -0
  185. package/dist/src/runtime/request/scheduled-execution.js +32 -0
  186. package/dist/src/runtime/request/session-admission.d.ts +17 -0
  187. package/dist/src/runtime/request/session-admission.js +88 -0
  188. package/dist/src/runtime/request/supervisor-root-execution-diagnostics.d.ts +1 -1
  189. package/dist/src/runtime/request/supervisor-root-execution.js +8 -0
  190. package/dist/src/runtime/runtime-environment.d.ts +31 -0
  191. package/dist/src/runtime/runtime-environment.js +102 -0
  192. package/dist/src/runtime/runtime-host-environment.d.ts +8 -0
  193. package/dist/src/runtime/runtime-host-environment.js +57 -0
  194. package/dist/src/runtime/runtime-host-lifecycle.d.ts +4 -0
  195. package/dist/src/runtime/runtime-host-lifecycle.js +64 -0
  196. package/dist/src/runtime/runtime-host-scheduler-ownership.d.ts +5 -0
  197. package/dist/src/runtime/runtime-host-scheduler-ownership.js +67 -0
  198. package/dist/src/runtime/runtime-host.d.ts +19 -0
  199. package/dist/src/runtime/runtime-host.js +63 -0
  200. package/dist/src/runtime/scheduler/calendar-time.d.ts +10 -0
  201. package/dist/src/runtime/scheduler/calendar-time.js +58 -0
  202. package/dist/src/runtime/scheduler/contracts.d.ts +143 -0
  203. package/dist/src/runtime/scheduler/contracts.js +1 -0
  204. package/dist/src/runtime/scheduler/file-store.d.ts +2 -0
  205. package/dist/src/runtime/scheduler/file-store.js +76 -0
  206. package/dist/src/runtime/scheduler/instant-validation.d.ts +4 -0
  207. package/dist/src/runtime/scheduler/instant-validation.js +69 -0
  208. package/dist/src/runtime/scheduler/interval-range.d.ts +8 -0
  209. package/dist/src/runtime/scheduler/interval-range.js +24 -0
  210. package/dist/src/runtime/scheduler/job-management.d.ts +8 -0
  211. package/dist/src/runtime/scheduler/job-management.js +212 -0
  212. package/dist/src/runtime/scheduler/journal-checkpoint.d.ts +9 -0
  213. package/dist/src/runtime/scheduler/journal-checkpoint.js +45 -0
  214. package/dist/src/runtime/scheduler/journal-durability.d.ts +8 -0
  215. package/dist/src/runtime/scheduler/journal-durability.js +59 -0
  216. package/dist/src/runtime/scheduler/journal-files.d.ts +14 -0
  217. package/dist/src/runtime/scheduler/journal-files.js +59 -0
  218. package/dist/src/runtime/scheduler/journal-head.d.ts +21 -0
  219. package/dist/src/runtime/scheduler/journal-head.js +81 -0
  220. package/dist/src/runtime/scheduler/journal-index-state.d.ts +31 -0
  221. package/dist/src/runtime/scheduler/journal-index-state.js +137 -0
  222. package/dist/src/runtime/scheduler/journal-index.d.ts +22 -0
  223. package/dist/src/runtime/scheduler/journal-index.js +195 -0
  224. package/dist/src/runtime/scheduler/journal-store.d.ts +21 -0
  225. package/dist/src/runtime/scheduler/journal-store.js +184 -0
  226. package/dist/src/runtime/scheduler/journal-transaction.d.ts +14 -0
  227. package/dist/src/runtime/scheduler/journal-transaction.js +104 -0
  228. package/dist/src/runtime/scheduler/next-occurrence.d.ts +3 -0
  229. package/dist/src/runtime/scheduler/next-occurrence.js +39 -0
  230. package/dist/src/runtime/scheduler/run-completion.d.ts +12 -0
  231. package/dist/src/runtime/scheduler/run-completion.js +77 -0
  232. package/dist/src/runtime/scheduler/run-list-query.d.ts +5 -0
  233. package/dist/src/runtime/scheduler/run-list-query.js +38 -0
  234. package/dist/src/runtime/scheduler/run-records.d.ts +6 -0
  235. package/dist/src/runtime/scheduler/run-records.js +41 -0
  236. package/dist/src/runtime/scheduler/schedule-update.d.ts +3 -0
  237. package/dist/src/runtime/scheduler/schedule-update.js +22 -0
  238. package/dist/src/runtime/scheduler/schedule-validation.d.ts +10 -0
  239. package/dist/src/runtime/scheduler/schedule-validation.js +132 -0
  240. package/dist/src/runtime/scheduler/scheduler-engine.d.ts +2 -0
  241. package/dist/src/runtime/scheduler/scheduler-engine.js +174 -0
  242. package/dist/src/runtime/scheduler/scheduler-service.d.ts +10 -0
  243. package/dist/src/runtime/scheduler/scheduler-service.js +115 -0
  244. package/dist/src/runtime/scheduler/service-context.d.ts +21 -0
  245. package/dist/src/runtime/scheduler/service-context.js +26 -0
  246. package/dist/src/runtime/scheduler/session-deletion-state.d.ts +9 -0
  247. package/dist/src/runtime/scheduler/session-deletion-state.js +30 -0
  248. package/dist/src/runtime/scheduler/snapshot-validation.d.ts +4 -0
  249. package/dist/src/runtime/scheduler/snapshot-validation.js +112 -0
  250. package/dist/src/runtime/scheduler/startup-recovery.d.ts +2 -0
  251. package/dist/src/runtime/scheduler/startup-recovery.js +38 -0
  252. package/dist/src/runtime/scheduler/validation-error.d.ts +4 -0
  253. package/dist/src/runtime/scheduler/validation-error.js +8 -0
  254. package/dist/src/runtime/scheduler/working-store.d.ts +3 -0
  255. package/dist/src/runtime/scheduler/working-store.js +8 -0
  256. package/dist/src/runtime/session/request-session.d.ts +1 -0
  257. package/dist/src/runtime/session/request-session.js +14 -1
  258. package/dist/src/runtime/session/session-attachment-deletion.d.ts +8 -0
  259. package/dist/src/runtime/session/session-attachment-deletion.js +87 -0
  260. package/dist/src/runtime/session/session-deletion-boundary.d.ts +10 -0
  261. package/dist/src/runtime/session/session-deletion-boundary.js +39 -0
  262. package/dist/src/runtime/session/session-deletion-cleanup.d.ts +7 -0
  263. package/dist/src/runtime/session/session-deletion-cleanup.js +62 -0
  264. package/dist/src/runtime/session/session-deletion-finalization.d.ts +7 -0
  265. package/dist/src/runtime/session/session-deletion-finalization.js +34 -0
  266. package/dist/src/runtime/session/session-deletion-receipts.d.ts +7 -0
  267. package/dist/src/runtime/session/session-deletion-receipts.js +18 -0
  268. package/dist/src/runtime/session/session-lifecycle-store.d.ts +21 -0
  269. package/dist/src/runtime/session/session-lifecycle-store.js +72 -0
  270. package/dist/src/runtime/session/session-mutation-queue.d.ts +3 -0
  271. package/dist/src/runtime/session/session-mutation-queue.js +15 -0
  272. package/dist/src/runtime/steps/execution-agent/capability-decision-parsing.d.ts +16 -0
  273. package/dist/src/runtime/steps/execution-agent/capability-decision-parsing.js +165 -0
  274. package/dist/src/runtime/steps/execution-agent/contracts.d.ts +3 -1
  275. package/dist/src/runtime/steps/execution-agent/decision-parsing.d.ts +2 -0
  276. package/dist/src/runtime/steps/execution-agent/decision-parsing.js +195 -0
  277. package/dist/src/runtime/steps/execution-agent/decision-validation.d.ts +30 -0
  278. package/dist/src/runtime/steps/execution-agent/decision-validation.js +127 -0
  279. package/dist/src/runtime/steps/execution-agent/format.d.ts +1 -0
  280. package/dist/src/runtime/steps/execution-agent/format.js +12 -0
  281. package/dist/src/runtime/steps/execution-agent/input.d.ts +2 -1
  282. package/dist/src/runtime/steps/execution-agent/input.js +17 -2
  283. package/dist/src/runtime/steps/execution-agent/parser.d.ts +1 -2
  284. package/dist/src/runtime/steps/execution-agent/parser.js +1 -472
  285. package/dist/src/runtime/steps/execution-agent/prompt.d.ts +2 -0
  286. package/dist/src/runtime/steps/execution-agent/prompt.js +2 -0
  287. package/dist/src/runtime/steps/execution-agent/reconsideration-context.js +4 -3
  288. package/dist/src/runtime/steps/execution-agent/response-input.js +5 -4
  289. package/dist/src/runtime/steps/execution-agent/response-run.d.ts +3 -0
  290. package/dist/src/runtime/steps/execution-agent/response-run.js +7 -3
  291. package/dist/src/runtime/steps/execution-agent/run.d.ts +2 -0
  292. package/dist/src/runtime/steps/execution-agent/run.js +2 -0
  293. package/dist/src/runtime/steps/execution-agent/state-context.d.ts +2 -1
  294. package/dist/src/runtime/steps/execution-agent/state-context.js +13 -5
  295. package/dist/src/runtime/steps/memory-recall-decision.d.ts +30 -0
  296. package/dist/src/runtime/steps/memory-recall-decision.js +101 -0
  297. package/dist/src/runtime/steps/memory-recall-prompt.d.ts +1 -0
  298. package/dist/src/runtime/steps/memory-recall-prompt.js +15 -0
  299. package/dist/src/runtime/steps/supervisor-decision/contracts.d.ts +4 -2
  300. package/dist/src/runtime/steps/supervisor-decision/diagnostics.d.ts +2 -0
  301. package/dist/src/runtime/steps/supervisor-decision/diagnostics.js +13 -6
  302. package/dist/src/runtime/steps/supervisor-decision/format.d.ts +2 -0
  303. package/dist/src/runtime/steps/supervisor-decision/format.js +41 -2
  304. package/dist/src/runtime/steps/supervisor-decision/input.d.ts +5 -1
  305. package/dist/src/runtime/steps/supervisor-decision/input.js +25 -5
  306. package/dist/src/runtime/steps/supervisor-decision/memory-recall-continuation.d.ts +10 -0
  307. package/dist/src/runtime/steps/supervisor-decision/memory-recall-continuation.js +32 -0
  308. package/dist/src/runtime/steps/supervisor-decision/parser.d.ts +2 -0
  309. package/dist/src/runtime/steps/supervisor-decision/parser.js +36 -1
  310. package/dist/src/runtime/steps/supervisor-decision/prompt.d.ts +3 -0
  311. package/dist/src/runtime/steps/supervisor-decision/prompt.js +16 -8
  312. package/dist/src/runtime/steps/supervisor-decision/response-recommendation.d.ts +13 -0
  313. package/dist/src/runtime/steps/supervisor-decision/response-recommendation.js +32 -0
  314. package/dist/src/runtime/steps/supervisor-decision/resume.d.ts +2 -0
  315. package/dist/src/runtime/steps/supervisor-decision/resume.js +13 -0
  316. package/dist/src/runtime/steps/supervisor-decision/run.d.ts +3 -0
  317. package/dist/src/runtime/steps/supervisor-decision/run.js +19 -0
  318. package/dist/src/runtime/steps/supervisor-decision/working-directory.js +7 -1
  319. package/dist/src/runtime/steps/supervisor-response/diagnostics.d.ts +1 -0
  320. package/dist/src/runtime/steps/supervisor-response/diagnostics.js +1 -0
  321. package/dist/src/runtime/steps/supervisor-response/input.d.ts +2 -1
  322. package/dist/src/runtime/steps/supervisor-response/input.js +17 -4
  323. package/dist/src/runtime/steps/supervisor-response/memory-authoring.d.ts +1 -0
  324. package/dist/src/runtime/steps/supervisor-response/memory-authoring.js +4 -0
  325. package/dist/src/runtime/steps/supervisor-response/prompt.d.ts +1 -0
  326. package/dist/src/runtime/steps/supervisor-response/prompt.js +8 -2
  327. package/dist/src/runtime/steps/supervisor-response/response-recommendation.d.ts +10 -0
  328. package/dist/src/runtime/steps/supervisor-response/response-recommendation.js +25 -0
  329. package/dist/src/runtime/steps/supervisor-response/run.d.ts +6 -1
  330. package/dist/src/runtime/steps/supervisor-response/run.js +26 -7
  331. package/dist/src/sessions/record/projection.js +1 -0
  332. package/dist/src/sessions/schedule-metadata.d.ts +8 -0
  333. package/dist/src/sessions/schedule-metadata.js +1 -0
  334. package/dist/src/sessions/session-service.d.ts +1 -0
  335. package/dist/src/sessions/session-service.js +1 -0
  336. package/dist/src/sessions/types.d.ts +2 -0
  337. package/dist/src/shared/directory-authority/bootstrap.d.ts +1 -0
  338. package/dist/src/shared/directory-authority/bootstrap.js +118 -0
  339. package/dist/src/shared/directory-authority/command.d.ts +8 -0
  340. package/dist/src/shared/directory-authority/command.js +27 -0
  341. package/dist/src/shared/directory-authority/errors.d.ts +5 -0
  342. package/dist/src/shared/directory-authority/errors.js +10 -0
  343. package/dist/src/shared/directory-authority/index.d.ts +3 -0
  344. package/dist/src/shared/directory-authority/index.js +3 -0
  345. package/dist/src/shared/directory-authority/protocol.d.ts +11 -0
  346. package/dist/src/shared/directory-authority/protocol.js +62 -0
  347. package/dist/src/shared/directory-authority/task.d.ts +7 -0
  348. package/dist/src/shared/directory-authority/task.js +97 -0
  349. package/dist/src/shared/http-server-shutdown.d.ts +4 -0
  350. package/dist/src/shared/http-server-shutdown.js +17 -0
  351. package/dist/src/shared/public-http/aggregate-gate.d.ts +3 -0
  352. package/dist/src/shared/public-http/aggregate-gate.js +87 -0
  353. package/dist/src/shared/public-http/deadline.d.ts +2 -0
  354. package/dist/src/shared/public-http/deadline.js +29 -0
  355. package/dist/src/shared/public-http/errors.d.ts +6 -0
  356. package/dist/src/shared/public-http/errors.js +11 -0
  357. package/dist/src/shared/public-http/limits.d.ts +8 -0
  358. package/dist/src/shared/public-http/limits.js +8 -0
  359. package/dist/src/shared/public-http/network-policy.d.ts +11 -0
  360. package/dist/src/shared/public-http/network-policy.js +178 -0
  361. package/dist/src/shared/public-http/public-http.d.ts +24 -0
  362. package/dist/src/shared/public-http/public-http.js +85 -0
  363. package/dist/src/shared/public-http/request-hop.d.ts +18 -0
  364. package/dist/src/shared/public-http/request-hop.js +140 -0
  365. package/dist/src/web-ui/app/ARCHITECTURE.md +66 -4
  366. package/dist/src/web-ui/app/app-bootstrap.js +53 -0
  367. package/dist/src/web-ui/app/app-dom.js +80 -0
  368. package/dist/src/web-ui/app/app.js +195 -212
  369. package/dist/src/web-ui/app/components/conversation-activity.d.ts +2 -0
  370. package/dist/src/web-ui/app/components/conversation-activity.js +34 -7
  371. package/dist/src/web-ui/app/components/conversation-role-cards.d.ts +1 -0
  372. package/dist/src/web-ui/app/components/conversation-role-cards.js +61 -5
  373. package/dist/src/web-ui/app/components/conversation-schedule.js +71 -0
  374. package/dist/src/web-ui/app/components/conversation-status.js +65 -0
  375. package/dist/src/web-ui/app/components/conversation-tools.d.ts +13 -0
  376. package/dist/src/web-ui/app/components/conversation-tools.js +284 -0
  377. package/dist/src/web-ui/app/components/conversation-view.js +39 -11
  378. package/dist/src/web-ui/app/components/dashboard/activity.js +61 -0
  379. package/dist/src/web-ui/app/components/dashboard/icons.js +23 -0
  380. package/dist/src/web-ui/app/components/dashboard/recent-conversations.js +64 -0
  381. package/dist/src/web-ui/app/components/dashboard/workspace.js +107 -0
  382. package/dist/src/web-ui/app/components/message-link-previews.d.ts +16 -0
  383. package/dist/src/web-ui/app/components/message-link-previews.js +179 -0
  384. package/dist/src/web-ui/app/components/schedules/details.js +101 -0
  385. package/dist/src/web-ui/app/components/schedules/form.d.ts +13 -0
  386. package/dist/src/web-ui/app/components/schedules/form.js +246 -0
  387. package/dist/src/web-ui/app/components/schedules/workspace-state.js +59 -0
  388. package/dist/src/web-ui/app/components/schedules/workspace.js +165 -0
  389. package/dist/src/web-ui/app/components/workspace-shell.js +48 -2
  390. package/dist/src/web-ui/app/configuration-feature.js +72 -0
  391. package/dist/src/web-ui/app/controllers/composer-attachments-controller.d.ts +1 -0
  392. package/dist/src/web-ui/app/controllers/composer-attachments-controller.js +17 -6
  393. package/dist/src/web-ui/app/controllers/composer-submit-controller.d.ts +2 -0
  394. package/dist/src/web-ui/app/controllers/composer-submit-controller.js +15 -1
  395. package/dist/src/web-ui/app/controllers/composer-surface-controller.js +58 -0
  396. package/dist/src/web-ui/app/controllers/composer-workspace-controller.d.ts +53 -0
  397. package/dist/src/web-ui/app/controllers/composer-workspace-controller.js +180 -0
  398. package/dist/src/web-ui/app/controllers/conversation-read-state-controller.d.ts +23 -0
  399. package/dist/src/web-ui/app/controllers/conversation-read-state-controller.js +82 -0
  400. package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +8 -0
  401. package/dist/src/web-ui/app/controllers/conversation-session-controller.js +28 -39
  402. package/dist/src/web-ui/app/controllers/dashboard-controller.js +127 -0
  403. package/dist/src/web-ui/app/controllers/home-composer-feature.d.ts +40 -0
  404. package/dist/src/web-ui/app/controllers/home-composer-feature.js +119 -0
  405. package/dist/src/web-ui/app/controllers/home-conversation-activation.js +37 -0
  406. package/dist/src/web-ui/app/controllers/realtime-event-controller.d.ts +1 -0
  407. package/dist/src/web-ui/app/controllers/realtime-event-controller.js +74 -3
  408. package/dist/src/web-ui/app/controllers/runtime-selection-controller.d.ts +2 -1
  409. package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +15 -14
  410. package/dist/src/web-ui/app/controllers/schedule-realtime.js +118 -0
  411. package/dist/src/web-ui/app/controllers/schedules-controller.js +421 -0
  412. package/dist/src/web-ui/app/controllers/session-controller.js +30 -3
  413. package/dist/src/web-ui/app/dashboard-feature.js +44 -0
  414. package/dist/src/web-ui/app/index.html +53 -1
  415. package/dist/src/web-ui/app/lib/composer-submission-scope.d.ts +21 -0
  416. package/dist/src/web-ui/app/lib/composer-submission-scope.js +13 -0
  417. package/dist/src/web-ui/app/lib/context-window-snapshot-order.d.ts +15 -0
  418. package/dist/src/web-ui/app/lib/context-window-snapshot-order.js +31 -0
  419. package/dist/src/web-ui/app/lib/conversation-role-model.d.ts +10 -1
  420. package/dist/src/web-ui/app/lib/conversation-role-model.js +97 -15
  421. package/dist/src/web-ui/app/lib/conversation-status-model.d.ts +12 -0
  422. package/dist/src/web-ui/app/lib/conversation-status-model.js +116 -0
  423. package/dist/src/web-ui/app/lib/dashboard-job-templates.js +41 -0
  424. package/dist/src/web-ui/app/lib/dashboard-presentation.js +126 -0
  425. package/dist/src/web-ui/app/lib/message-markdown.d.ts +5 -0
  426. package/dist/src/web-ui/app/lib/message-markdown.js +99 -0
  427. package/dist/src/web-ui/app/lib/message-url-policy.d.ts +1 -0
  428. package/dist/src/web-ui/app/lib/message-url-policy.js +13 -0
  429. package/dist/src/web-ui/app/lib/schedule-errors.js +29 -0
  430. package/dist/src/web-ui/app/lib/schedule-message.js +30 -0
  431. package/dist/src/web-ui/app/lib/schedule-presentation.js +81 -0
  432. package/dist/src/web-ui/app/lib/session-read-state.d.ts +22 -0
  433. package/dist/src/web-ui/app/lib/session-read-state.js +63 -0
  434. package/dist/src/web-ui/app/lib/text-format.js +2 -143
  435. package/dist/src/web-ui/app/lib/tool-activity-event.d.ts +26 -0
  436. package/dist/src/web-ui/app/lib/tool-activity-event.js +228 -0
  437. package/dist/src/web-ui/app/lib/tool-activity-model.d.ts +41 -0
  438. package/dist/src/web-ui/app/lib/tool-activity-model.js +255 -0
  439. package/dist/src/web-ui/app/lib/tool-timeline.d.ts +3 -0
  440. package/dist/src/web-ui/app/lib/tool-timeline.js +18 -0
  441. package/dist/src/web-ui/app/schedules-feature.js +87 -0
  442. package/dist/src/web-ui/app/services/message-link-preview-client.d.ts +14 -0
  443. package/dist/src/web-ui/app/services/message-link-preview-client.js +96 -0
  444. package/dist/src/web-ui/app/services/runtime-web-client/schedules.js +51 -0
  445. package/dist/src/web-ui/app/services/runtime-web-client.d.ts +37 -0
  446. package/dist/src/web-ui/app/services/runtime-web-client.js +13 -8
  447. package/dist/src/web-ui/app/styles/00-tokens-base.css +11 -11
  448. package/dist/src/web-ui/app/styles/18-dashboard.css +384 -0
  449. package/dist/src/web-ui/app/styles/20-chat-composer.css +1 -130
  450. package/dist/src/web-ui/app/styles/26-message-content.css +295 -0
  451. package/dist/src/web-ui/app/styles/27-conversation-tools.css +266 -0
  452. package/dist/src/web-ui/app/styles/28-conversation-status.css +52 -0
  453. package/dist/src/web-ui/app/styles/38-schedule-workspace.css +263 -0
  454. package/dist/src/web-ui/app/styles/38-schedules.css +352 -0
  455. package/dist/src/web-ui/app/styles/90-responsive.css +14 -0
  456. package/dist/src/web-ui/app/styles/91-schedules-responsive.css +72 -0
  457. package/dist/src/web-ui/app/styles/92-dashboard-responsive.css +88 -0
  458. package/dist/src/web-ui/app/styles.css +8 -0
  459. package/dist/src/web-ui/app/ui-behavior.d.ts +1 -1
  460. package/dist/src/web-ui/app/ui-behavior.js +3 -1
  461. package/dist/src/web-ui/app/vendor/README.md +15 -0
  462. package/dist/src/web-ui/app/vendor/markdown-it.LICENSE +22 -0
  463. package/dist/src/web-ui/app/vendor/markdown-it.js +3003 -0
  464. package/dist/src/web-ui/link-preview/metadata.d.ts +9 -0
  465. package/dist/src/web-ui/link-preview/metadata.js +97 -0
  466. package/dist/src/web-ui/link-preview/preview-cache.d.ts +4 -0
  467. package/dist/src/web-ui/link-preview/preview-cache.js +23 -0
  468. package/dist/src/web-ui/link-preview/raster-response.d.ts +9 -0
  469. package/dist/src/web-ui/link-preview/raster-response.js +49 -0
  470. package/dist/src/web-ui/link-preview/routes.d.ts +3 -0
  471. package/dist/src/web-ui/link-preview/routes.js +97 -0
  472. package/dist/src/web-ui/link-preview/service.d.ts +11 -0
  473. package/dist/src/web-ui/link-preview/service.js +117 -0
  474. package/dist/src/web-ui/local-runtime/api-router.d.ts +4 -1
  475. package/dist/src/web-ui/local-runtime/api-router.js +42 -73
  476. package/dist/src/web-ui/local-runtime/contracts.d.ts +2 -2
  477. package/dist/src/web-ui/local-runtime/environment-registry.d.ts +12 -1
  478. package/dist/src/web-ui/local-runtime/environment-registry.js +38 -3
  479. package/dist/src/web-ui/local-runtime/realtime-controller.js +3 -1
  480. package/dist/src/web-ui/local-runtime/request-execution.d.ts +5 -1
  481. package/dist/src/web-ui/local-runtime/request-execution.js +38 -2
  482. package/dist/src/web-ui/local-runtime/schedule-job-creation.d.ts +7 -0
  483. package/dist/src/web-ui/local-runtime/schedule-job-creation.js +62 -0
  484. package/dist/src/web-ui/local-runtime/schedule-management-routes.d.ts +30 -0
  485. package/dist/src/web-ui/local-runtime/schedule-management-routes.js +134 -0
  486. package/dist/src/web-ui/local-runtime/schedule-run-page.d.ts +5 -0
  487. package/dist/src/web-ui/local-runtime/schedule-run-page.js +23 -0
  488. package/dist/src/web-ui/local-runtime/session-routes.d.ts +17 -0
  489. package/dist/src/web-ui/local-runtime/session-routes.js +74 -0
  490. package/dist/src/web-ui/local-runtime-backend.d.ts +2 -0
  491. package/dist/src/web-ui/local-runtime-backend.js +11 -1
  492. package/dist/src/web-ui/schedule-creation-contract.d.ts +7 -0
  493. package/dist/src/web-ui/schedule-creation-contract.js +1 -0
  494. package/dist/src/web-ui/server-shutdown.d.ts +4 -0
  495. package/dist/src/web-ui/server-shutdown.js +32 -0
  496. package/dist/src/web-ui/server.js +13 -10
  497. package/dist/src/web-ui/session-read-state/availability.d.ts +16 -0
  498. package/dist/src/web-ui/session-read-state/availability.js +20 -0
  499. package/dist/src/web-ui/session-read-state/projection.d.ts +17 -0
  500. package/dist/src/web-ui/session-read-state/projection.js +71 -0
  501. package/dist/src/web-ui/session-read-state/service.d.ts +86 -0
  502. package/dist/src/web-ui/session-read-state/service.js +89 -0
  503. package/dist/src/web-ui/session-read-state/store.d.ts +22 -0
  504. package/dist/src/web-ui/session-read-state/store.js +110 -0
  505. package/docs/configuration.md +41 -1
  506. package/docs/long-term-memory.md +46 -5
  507. package/docs/plugins.md +15 -9
  508. package/docs/runtime-invariant-coverage.md +1 -1
  509. package/docs/runtime-library.md +23 -0
  510. package/docs/runtime-public-contracts.md +32 -1
  511. package/package.json +3 -1
  512. package/plugins/code-outline/plugin.json +15 -0
  513. package/plugins/document-reader/plugin.json +17 -0
  514. package/plugins/exec/plugin.json +3 -3
  515. package/plugins/exec/skills/exec_skill/SKILL.md +1 -1
  516. package/plugins/exec/source/process-manager.ts +1 -20
  517. package/plugins/exec/source/shell-platform.ts +29 -0
  518. package/plugins/exec/src/index.cjs +25 -18
  519. package/plugins/filesystem/plugin.json +17 -2
  520. package/plugins/filesystem/source/atomic-write.ts +9 -0
  521. package/plugins/filesystem/source/bounded-io.ts +5 -99
  522. package/plugins/filesystem/source/directory-authority-write.ts +64 -0
  523. package/plugins/filesystem/source/directory-sample-task.ts +23 -0
  524. package/plugins/filesystem/source/directory-sample.ts +132 -0
  525. package/plugins/filesystem/source/directory-write-task.ts +160 -0
  526. package/plugins/filesystem/source/mutation-parent.ts +11 -0
  527. package/plugins/filesystem/src/index.cjs +693 -118
  528. package/plugins/json-inspector/plugin.json +12 -0
  529. package/plugins/local-search/plugin.json +12 -0
  530. package/plugins/local-search/source/index.ts +2 -0
  531. package/plugins/local-search/source/paths.ts +30 -7
  532. package/plugins/local-search/source/ripgrep-process.ts +69 -0
  533. package/plugins/local-search/source/ripgrep.ts +19 -23
  534. package/plugins/local-search/src/index.cjs +295 -32
  535. package/plugins/memory/plugin.json +26 -1
  536. package/plugins/memory/source/index.ts +10 -6
  537. package/plugins/memory/src/index.cjs +11 -7
  538. package/plugins/project-orientation/plugin.json +14 -0
  539. package/plugins/web/source/aggregate-gate.ts +8 -130
  540. package/plugins/web/source/deadline.ts +14 -50
  541. package/plugins/web/source/errors.ts +17 -11
  542. package/plugins/web/source/limits.ts +3 -6
  543. package/plugins/web/source/network-policy.ts +28 -226
  544. package/plugins/web/source/public-http.ts +17 -142
  545. package/plugins/web/source/request-hop.ts +11 -191
  546. package/plugins/web/src/index.cjs +119 -59
  547. package/runtime.config.schema.json +7 -0
  548. package/src/runtime/README.md +105 -1
  549. package/src/runtime/local-host/README.md +86 -0
  550. package/src/runtime/scheduler/README.md +166 -0
@@ -0,0 +1,143 @@
1
+ import type { AgentMode } from "../../shared/types.js";
2
+ export type SchedulerScheduleInput = {
3
+ kind: "timer";
4
+ delayMs: number;
5
+ } | {
6
+ kind: "once";
7
+ at: string;
8
+ } | {
9
+ kind: "interval";
10
+ everyMs: number;
11
+ anchorAt?: string;
12
+ } | {
13
+ kind: "daily";
14
+ at: string;
15
+ } | {
16
+ kind: "weekly";
17
+ at: string;
18
+ weekdays: number[];
19
+ } | {
20
+ kind: "monthly";
21
+ at: string;
22
+ dayOfMonth: number;
23
+ };
24
+ export type SchedulerSchedule = {
25
+ kind: "timer";
26
+ delayMs: number;
27
+ at: string;
28
+ } | {
29
+ kind: "once";
30
+ at: string;
31
+ } | {
32
+ kind: "interval";
33
+ everyMs: number;
34
+ anchorAt: string;
35
+ } | {
36
+ kind: "daily";
37
+ at: string;
38
+ } | {
39
+ kind: "weekly";
40
+ at: string;
41
+ weekdays: number[];
42
+ } | {
43
+ kind: "monthly";
44
+ at: string;
45
+ dayOfMonth: number;
46
+ };
47
+ export type SchedulerJobState = "active" | "paused" | "cancelled" | "completed";
48
+ export interface SchedulerJob {
49
+ id: string;
50
+ environmentId: string;
51
+ sessionId: string;
52
+ title: string;
53
+ prompt: string;
54
+ modelProfileId: string;
55
+ agentMode: AgentMode;
56
+ toolPermissionMode: "full_access";
57
+ timeZone: string;
58
+ schedule: SchedulerSchedule;
59
+ state: SchedulerJobState;
60
+ createdAt: string;
61
+ updatedAt: string;
62
+ nextRunAt: string | null;
63
+ revision: number;
64
+ }
65
+ export interface CreateSchedulerJobInput {
66
+ sessionId: string;
67
+ title: string;
68
+ prompt: string;
69
+ modelProfileId: string;
70
+ agentMode: AgentMode;
71
+ timeZone: string;
72
+ schedule: SchedulerScheduleInput;
73
+ }
74
+ export type UpdateSchedulerJobInput = Partial<Omit<CreateSchedulerJobInput, "sessionId">>;
75
+ export type SchedulerRunStatus = "pending" | "running" | "succeeded" | "failed" | "cancelled" | "interrupted" | "missed";
76
+ export interface SchedulerRun {
77
+ id: string;
78
+ jobId: string;
79
+ environmentId: string;
80
+ sessionId: string;
81
+ requestId: string;
82
+ title: string;
83
+ prompt: string;
84
+ modelProfileId: string;
85
+ agentMode: AgentMode;
86
+ timeZone: string;
87
+ jobRevision: number;
88
+ scheduledAt: string;
89
+ startedAt?: string;
90
+ finishedAt?: string;
91
+ trigger: "schedule" | "manual";
92
+ status: SchedulerRunStatus;
93
+ resultText?: string;
94
+ resultMessageId?: string;
95
+ error?: string;
96
+ }
97
+ export interface SchedulerRunOutcome {
98
+ status: "succeeded" | "failed";
99
+ resultText?: string;
100
+ resultMessageId?: string;
101
+ error?: string;
102
+ }
103
+ export interface SchedulerExecutor {
104
+ sessionExists(sessionId: string): Promise<boolean>;
105
+ tryReserve(sessionId: string): (() => void) | null;
106
+ start(job: SchedulerJob, run: SchedulerRun): Promise<SchedulerRunOutcome>;
107
+ }
108
+ export interface SchedulerSnapshot {
109
+ schemaVersion: 1;
110
+ jobs: SchedulerJob[];
111
+ runs: SchedulerRun[];
112
+ }
113
+ export interface SchedulerStore {
114
+ acquire(): Promise<() => Promise<void>>;
115
+ read(view?: "active"): Promise<SchedulerSnapshot>;
116
+ update<T>(mutate: (state: SchedulerSnapshot) => T, view?: "active"): Promise<T>;
117
+ readRuns?(jobId?: string, query?: SchedulerRunListQuery): Promise<SchedulerRun[]>;
118
+ }
119
+ export interface SchedulerListFilter {
120
+ sessionId?: string;
121
+ state?: SchedulerJobState;
122
+ search?: string;
123
+ }
124
+ export interface SchedulerRunListQuery {
125
+ cursor?: string;
126
+ /** Bounded newest-first results; 101 allows a 100-record page plus lookahead. */
127
+ limit: number;
128
+ }
129
+ export interface SchedulerService {
130
+ start(): Promise<void>;
131
+ stop(): Promise<void>;
132
+ tick(): Promise<void>;
133
+ create(input: CreateSchedulerJobInput): Promise<SchedulerJob>;
134
+ list(filter?: SchedulerListFilter): Promise<SchedulerJob[]>;
135
+ get(jobId: string): Promise<SchedulerJob | null>;
136
+ update(jobId: string, patch: UpdateSchedulerJobInput): Promise<SchedulerJob>;
137
+ pause(jobId: string): Promise<SchedulerJob>;
138
+ resume(jobId: string): Promise<SchedulerJob>;
139
+ cancel(jobId: string): Promise<SchedulerJob>;
140
+ runNow(jobId: string): Promise<SchedulerRun>;
141
+ deleteSession(sessionId: string): Promise<void>;
142
+ listRuns(jobId?: string, query?: SchedulerRunListQuery): Promise<SchedulerRun[]>;
143
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { SchedulerStore } from "./contracts.js";
2
+ export declare function createFileSchedulerStore(directory: string): SchedulerStore;
@@ -0,0 +1,76 @@
1
+ import { mkdir } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { acquireFileLock } from "../adapters/long-term-memory/file-lock/acquisition.js";
4
+ import { SchedulerJournalStore } from "./journal-store.js";
5
+ import { journalReadIdentity, readJournalHead } from "./journal-head.js";
6
+ export function createFileSchedulerStore(directory) {
7
+ let releaseOwner;
8
+ let journal;
9
+ let transactionTail = Promise.resolve();
10
+ const enqueue = (operation) => {
11
+ const transaction = transactionTail.then(operation);
12
+ transactionTail = transaction.catch(() => undefined);
13
+ return transaction;
14
+ };
15
+ const readJournal = async (read) => {
16
+ if (journal)
17
+ return read(journal);
18
+ // Unowned readers have no cached lease. A retired immutable generation is
19
+ // retried only when its authoritative pointer changed during this read.
20
+ for (;;) {
21
+ const before = journalReadIdentity(await readJournalHead(directory));
22
+ const [result] = await Promise.allSettled([
23
+ new SchedulerJournalStore(directory).load().then(read),
24
+ ]);
25
+ if (before !== journalReadIdentity(await readJournalHead(directory)))
26
+ continue;
27
+ if (result.status === "rejected")
28
+ throw result.reason;
29
+ return result.value;
30
+ }
31
+ };
32
+ return {
33
+ acquire: async () => {
34
+ if (releaseOwner)
35
+ throw new Error("scheduler_store_in_use");
36
+ await mkdir(directory, { recursive: true, mode: 0o700 });
37
+ try {
38
+ releaseOwner = await acquireFileLock(join(directory, "scheduler.owner"), { waitMs: 0 });
39
+ }
40
+ catch (error) {
41
+ if (isOwnerContention(error))
42
+ throw new Error("scheduler_store_in_use");
43
+ throw error;
44
+ }
45
+ try {
46
+ journal = await new SchedulerJournalStore(directory).load();
47
+ await journal.prepareOwned();
48
+ }
49
+ catch (error) {
50
+ const release = releaseOwner;
51
+ releaseOwner = undefined;
52
+ journal = undefined;
53
+ await release();
54
+ throw error;
55
+ }
56
+ return async () => {
57
+ await transactionTail;
58
+ const release = releaseOwner;
59
+ releaseOwner = undefined;
60
+ journal = undefined;
61
+ await release?.();
62
+ };
63
+ },
64
+ read: (view) => enqueue(() => readJournal((store) => store.snapshot(view))),
65
+ readRuns: (jobId, query) => enqueue(() => readJournal((store) => store.readRuns(jobId, query))),
66
+ update: (mutate, view) => enqueue(async () => {
67
+ if (!releaseOwner || !journal)
68
+ throw new Error("scheduler_store_not_owned");
69
+ return journal.update(mutate, view);
70
+ }),
71
+ };
72
+ }
73
+ function isOwnerContention(error) {
74
+ return (error instanceof Error &&
75
+ error.message === "long_term_memory_store_lock_timeout");
76
+ }
@@ -0,0 +1,4 @@
1
+ export declare function parseSchedulerInstant(value: unknown, field: string): string;
2
+ export declare function schedulerInstantFromMilliseconds(value: number): string;
3
+ /** Canonical output must be accepted again by the four-digit ISO parser. */
4
+ export declare function isSupportedSchedulerInstant(value: number): boolean;
@@ -0,0 +1,69 @@
1
+ import { SchedulerValidationError } from "./validation-error.js";
2
+ const MIN_SCHEDULER_INSTANT = Date.parse("0000-01-01T00:00:00.000Z");
3
+ const MAX_SCHEDULER_INSTANT = Date.parse("9999-12-31T23:59:59.999Z");
4
+ export function parseSchedulerInstant(value, field) {
5
+ if (typeof value !== "string") {
6
+ throw new SchedulerValidationError("scheduler_invalid_schedule", `${field} requires an ISO instant`);
7
+ }
8
+ const match = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(?::(\d{2})(?:\.\d{1,3})?)?(Z|[+-]\d{2}:\d{2})$/i.exec(value);
9
+ if (!match) {
10
+ throw new SchedulerValidationError("scheduler_invalid_schedule", `${field} requires an ISO instant with an explicit UTC offset`);
11
+ }
12
+ const [, year, month, day, hour, minute, second = "0"] = match;
13
+ if (!isExistingCalendarDate(Number(year), Number(month), Number(day))) {
14
+ throw new SchedulerValidationError("scheduler_invalid_schedule", `${field} contains an invalid date`);
15
+ }
16
+ if (!isExistingClockTime(Number(hour), Number(minute), Number(second))) {
17
+ throw new SchedulerValidationError("scheduler_invalid_schedule", `${field} contains an invalid time`);
18
+ }
19
+ return schedulerInstantFromMilliseconds(Date.parse(value));
20
+ }
21
+ function isExistingCalendarDate(year, month, day) {
22
+ if (month < 1 || month > 12)
23
+ return false;
24
+ if (day < 1)
25
+ return false;
26
+ const monthDays = [
27
+ 31,
28
+ isLeapYear(year) ? 29 : 28,
29
+ 31,
30
+ 30,
31
+ 31,
32
+ 30,
33
+ 31,
34
+ 31,
35
+ 30,
36
+ 31,
37
+ 30,
38
+ 31,
39
+ ];
40
+ return day <= monthDays[month - 1];
41
+ }
42
+ function isLeapYear(year) {
43
+ if (year % 400 === 0)
44
+ return true;
45
+ if (year % 100 === 0)
46
+ return false;
47
+ return year % 4 === 0;
48
+ }
49
+ function isExistingClockTime(hour, minute, second) {
50
+ if (hour > 23)
51
+ return false;
52
+ if (minute > 59)
53
+ return false;
54
+ return second <= 59;
55
+ }
56
+ export function schedulerInstantFromMilliseconds(value) {
57
+ if (!isSupportedSchedulerInstant(value)) {
58
+ throw new SchedulerValidationError("scheduler_invalid_schedule", "Instant is outside the supported date range");
59
+ }
60
+ return new Date(value).toISOString();
61
+ }
62
+ /** Canonical output must be accepted again by the four-digit ISO parser. */
63
+ export function isSupportedSchedulerInstant(value) {
64
+ if (!Number.isSafeInteger(value))
65
+ return false;
66
+ if (value < MIN_SCHEDULER_INSTANT)
67
+ return false;
68
+ return value <= MAX_SCHEDULER_INSTANT;
69
+ }
@@ -0,0 +1,8 @@
1
+ import type { SchedulerSchedule } from "./contracts.js";
2
+ type IntervalSchedule = Extract<SchedulerSchedule, {
3
+ kind: "interval";
4
+ }>;
5
+ export declare function nextIntervalOccurrence(schedule: IntervalSchedule, after: number): string | null;
6
+ /** Admission only: legacy stored intervals remain readable until exhaustion. */
7
+ export declare function requireRepresentableIntervalRecurrence(schedule: SchedulerSchedule, after: number): void;
8
+ export {};
@@ -0,0 +1,24 @@
1
+ import { isSupportedSchedulerInstant, schedulerInstantFromMilliseconds, } from "./instant-validation.js";
2
+ import { SchedulerValidationError } from "./validation-error.js";
3
+ export function nextIntervalOccurrence(schedule, after) {
4
+ const anchor = Date.parse(schedule.anchorAt);
5
+ const steps = Math.max(0, Math.floor((after - anchor) / schedule.everyMs) + 1);
6
+ const next = anchor + steps * schedule.everyMs;
7
+ if (!isSupportedSchedulerInstant(next))
8
+ return null;
9
+ return schedulerInstantFromMilliseconds(next);
10
+ }
11
+ /** Admission only: legacy stored intervals remain readable until exhaustion. */
12
+ export function requireRepresentableIntervalRecurrence(schedule, after) {
13
+ if (schedule.kind !== "interval")
14
+ return;
15
+ const first = nextIntervalOccurrence(schedule, after);
16
+ if (first === null)
17
+ throwUnsupportedRecurrence();
18
+ const second = nextIntervalOccurrence(schedule, Date.parse(first));
19
+ if (second === null)
20
+ throwUnsupportedRecurrence();
21
+ }
22
+ function throwUnsupportedRecurrence() {
23
+ throw new SchedulerValidationError("scheduler_invalid_schedule", "Interval recurrence is outside the supported date range");
24
+ }
@@ -0,0 +1,8 @@
1
+ import type { CreateSchedulerJobInput, SchedulerJob, SchedulerJobState, SchedulerListFilter, SchedulerRun, UpdateSchedulerJobInput } from "./contracts.js";
2
+ import { type SchedulerContext } from "./service-context.js";
3
+ export declare function createSchedulerJob(context: SchedulerContext, input: CreateSchedulerJobInput): Promise<SchedulerJob>;
4
+ export declare function updateSchedulerJob(context: SchedulerContext, jobId: string, patch: UpdateSchedulerJobInput): Promise<SchedulerJob>;
5
+ export declare function changeSchedulerJobState(context: SchedulerContext, jobId: string, target: SchedulerJobState): Promise<SchedulerJob>;
6
+ export declare function requestSchedulerRunNow(context: SchedulerContext, jobId: string): Promise<SchedulerRun>;
7
+ export declare function deleteSchedulerSession(context: SchedulerContext, sessionId: string): Promise<void>;
8
+ export declare function matchesSchedulerFilter(job: SchedulerJob, filter: SchedulerListFilter): boolean;
@@ -0,0 +1,212 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { nextSchedulerOccurrence } from "./next-occurrence.js";
3
+ import { normalizeSchedulerScheduleUpdate } from "./schedule-update.js";
4
+ import { requireRepresentableIntervalRecurrence } from "./interval-range.js";
5
+ import { cancelPendingRuns, findPendingRun, makeSchedulerRun, requireSchedulerJob, } from "./run-records.js";
6
+ import { normalizeSchedulerSchedule, validateSchedulerJobInput, } from "./schedule-validation.js";
7
+ import { invalidateJob, requireRunningScheduler, } from "./service-context.js";
8
+ export function createSchedulerJob(context, input) {
9
+ return context.enqueue(async () => {
10
+ requireRunningScheduler(context);
11
+ validateSchedulerJobInput(input);
12
+ await requireExistingSession(context, input.sessionId);
13
+ const now = context.now();
14
+ const schedule = normalizeSchedulerSchedule(input.schedule, now);
15
+ requireRepresentableIntervalRecurrence(schedule, now);
16
+ const nextRunAt = nextSchedulerOccurrence(schedule, input.timeZone, now);
17
+ if (!nextRunAt)
18
+ throw new Error("scheduler_schedule_in_past");
19
+ const job = {
20
+ id: randomUUID(),
21
+ environmentId: context.environmentId,
22
+ sessionId: input.sessionId,
23
+ title: input.title.trim(),
24
+ prompt: input.prompt,
25
+ modelProfileId: input.modelProfileId,
26
+ agentMode: input.agentMode,
27
+ toolPermissionMode: "full_access",
28
+ timeZone: input.timeZone,
29
+ schedule,
30
+ state: "active",
31
+ createdAt: new Date(now).toISOString(),
32
+ updatedAt: new Date(now).toISOString(),
33
+ nextRunAt,
34
+ revision: 1,
35
+ };
36
+ return context.store.update((state) => {
37
+ if (context.deletedSessions.has(job.sessionId))
38
+ throw new Error("scheduler_session_deleted");
39
+ state.jobs.push(job);
40
+ return job;
41
+ });
42
+ });
43
+ }
44
+ export function updateSchedulerJob(context, jobId, patch) {
45
+ const settleInvalidation = invalidateJob(context, jobId);
46
+ return context
47
+ .enqueue(async () => {
48
+ requireRunningScheduler(context);
49
+ return context.store.update((state) => {
50
+ const job = requireSchedulerJob(state, jobId);
51
+ if (job.state === "cancelled")
52
+ throw new Error("scheduler_job_cancelled");
53
+ const editable = pickEditableFields(patch);
54
+ const input = { ...job, ...editable };
55
+ validateSchedulerJobInput(input);
56
+ const now = context.now();
57
+ const schedule = normalizeSchedulerScheduleUpdate(job.schedule, editable.schedule, now);
58
+ const candidate = { ...input, schedule };
59
+ if (!hasSchedulerJobChanges(job, candidate))
60
+ return job;
61
+ const changedTiming = hasSchedulerTimingChanges(job, candidate);
62
+ if (changedTiming)
63
+ requireRepresentableIntervalRecurrence(schedule, now);
64
+ const nextRunAt = changedTiming
65
+ ? nextSchedulerOccurrence(schedule, input.timeZone, now)
66
+ : job.nextRunAt;
67
+ if (changedTiming && !nextRunAt)
68
+ throw new Error("scheduler_schedule_in_past");
69
+ const pending = findPendingRun(state, jobId);
70
+ cancelPendingRuns(state, jobId, new Date(now).toISOString());
71
+ Object.assign(job, editable, {
72
+ schedule,
73
+ nextRunAt,
74
+ toolPermissionMode: "full_access",
75
+ updatedAt: new Date(now).toISOString(),
76
+ revision: job.revision + 1,
77
+ });
78
+ if (changedTiming && job.state === "completed")
79
+ job.state = "active";
80
+ if (pending && !changedTiming) {
81
+ state.runs.push(makeSchedulerRun(job, pending.scheduledAt, pending.trigger));
82
+ }
83
+ return job;
84
+ });
85
+ })
86
+ .finally(settleInvalidation);
87
+ }
88
+ function hasSchedulerTimingChanges(job, candidate) {
89
+ if (JSON.stringify(job.schedule) !== JSON.stringify(candidate.schedule))
90
+ return true;
91
+ if (job.timeZone === candidate.timeZone)
92
+ return false;
93
+ switch (candidate.schedule.kind) {
94
+ case "daily":
95
+ case "weekly":
96
+ case "monthly":
97
+ return true;
98
+ default:
99
+ return false;
100
+ }
101
+ }
102
+ function hasSchedulerJobChanges(job, candidate) {
103
+ if (hasSchedulerTimingChanges(job, candidate))
104
+ return true;
105
+ return [
106
+ "title",
107
+ "prompt",
108
+ "modelProfileId",
109
+ "agentMode",
110
+ "timeZone",
111
+ ].some((field) => job[field] !== candidate[field]);
112
+ }
113
+ function pickEditableFields(patch) {
114
+ const result = {};
115
+ for (const key of [
116
+ "title",
117
+ "prompt",
118
+ "modelProfileId",
119
+ "agentMode",
120
+ "timeZone",
121
+ "schedule",
122
+ ]) {
123
+ if (patch[key] === undefined)
124
+ continue;
125
+ Object.assign(result, { [key]: patch[key] });
126
+ }
127
+ return result;
128
+ }
129
+ export function changeSchedulerJobState(context, jobId, target) {
130
+ const settleInvalidation = invalidateJob(context, jobId);
131
+ return context
132
+ .enqueue(async () => {
133
+ requireRunningScheduler(context);
134
+ return context.store.update((state) => {
135
+ const job = requireSchedulerJob(state, jobId);
136
+ if (job.state === "cancelled" && target !== "cancelled") {
137
+ throw new Error("scheduler_job_cancelled");
138
+ }
139
+ const now = context.now();
140
+ if (target !== "active") {
141
+ cancelPendingRuns(state, jobId, new Date(now).toISOString());
142
+ }
143
+ if (job.state === target)
144
+ return job;
145
+ job.state = target;
146
+ job.updatedAt = new Date(now).toISOString();
147
+ job.revision += 1;
148
+ if (target === "cancelled")
149
+ job.nextRunAt = null;
150
+ if (target !== "active")
151
+ return job;
152
+ job.nextRunAt = nextSchedulerOccurrence(job.schedule, job.timeZone, now);
153
+ if (!job.nextRunAt)
154
+ job.state = "completed";
155
+ return job;
156
+ });
157
+ })
158
+ .finally(settleInvalidation);
159
+ }
160
+ export function requestSchedulerRunNow(context, jobId) {
161
+ return context.enqueue(async () => {
162
+ requireRunningScheduler(context);
163
+ const existing = await context.store.read();
164
+ const owner = requireSchedulerJob(existing, jobId);
165
+ await requireExistingSession(context, owner.sessionId);
166
+ return context.store.update((state) => {
167
+ const job = requireSchedulerJob(state, jobId);
168
+ if (job.state === "cancelled")
169
+ throw new Error("scheduler_job_cancelled");
170
+ if (context.deletedSessions.has(job.sessionId))
171
+ throw new Error("scheduler_session_deleted");
172
+ const pending = findPendingRun(state, jobId);
173
+ if (pending)
174
+ return pending;
175
+ const run = makeSchedulerRun(job, new Date(context.now()).toISOString(), "manual");
176
+ state.runs.push(run);
177
+ return run;
178
+ });
179
+ });
180
+ }
181
+ export function deleteSchedulerSession(context, sessionId) {
182
+ // Invalidation is synchronous: no awaited preparation may dispatch after this call.
183
+ const releaseIntent = context.deletedSessions.reserveIntent(sessionId);
184
+ return context
185
+ .enqueue(async () => {
186
+ requireRunningScheduler(context);
187
+ context.deletedSessions.add(sessionId);
188
+ await context.store.update((state) => {
189
+ state.jobs = state.jobs.filter((job) => job.sessionId !== sessionId);
190
+ state.runs = state.runs.filter((run) => run.sessionId !== sessionId);
191
+ });
192
+ })
193
+ .finally(releaseIntent);
194
+ }
195
+ export function matchesSchedulerFilter(job, filter) {
196
+ if (filter.sessionId !== undefined && job.sessionId !== filter.sessionId)
197
+ return false;
198
+ if (filter.state !== undefined && job.state !== filter.state)
199
+ return false;
200
+ if (!filter.search?.trim())
201
+ return true;
202
+ const searchable = [job.title, job.prompt, job.sessionId, job.modelProfileId]
203
+ .join(" ")
204
+ .toLowerCase();
205
+ return searchable.includes(filter.search.trim().toLowerCase());
206
+ }
207
+ async function requireExistingSession(context, sessionId) {
208
+ if (context.deletedSessions.has(sessionId))
209
+ throw new Error("scheduler_session_deleted");
210
+ if (!(await context.executor.sessionExists(sessionId)))
211
+ throw new Error("scheduler_session_not_found");
212
+ }
@@ -0,0 +1,9 @@
1
+ import { SchedulerJournalIndex } from "./journal-index.js";
2
+ import { type CommittedJournalHead } from "./journal-head.js";
3
+ export declare function loadCheckpointJournalIndex(directory: string, head: CommittedJournalHead): Promise<{
4
+ index: SchedulerJournalIndex;
5
+ sequence: number;
6
+ }>;
7
+ export declare function writeJournalCheckpoint(directory: string, generation: string, sequence: number, index: SchedulerJournalIndex): Promise<CommittedJournalHead>;
8
+ /** Only checkpoint artifacts are retired here; archived transaction payloads remain immutable. */
9
+ export declare function cleanObsoleteJournalCheckpoints(directory: string, head: CommittedJournalHead): Promise<void>;
@@ -0,0 +1,45 @@
1
+ import { mkdir, readFile, readdir, rm } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { SchedulerJournalIndex } from "./journal-index.js";
4
+ import { encodeJournalIndexState, parseJournalIndexState, } from "./journal-index-state.js";
5
+ import { journalCheckpointName, } from "./journal-head.js";
6
+ import { journalTransactionName, writeJournalJson } from "./journal-files.js";
7
+ import { parseSchedulerTransaction } from "./journal-transaction.js";
8
+ import { syncJournalDirectory } from "./journal-durability.js";
9
+ export async function loadCheckpointJournalIndex(directory, head) {
10
+ const generationDirectory = join(directory, head.generation);
11
+ const checkpointPath = join(generationDirectory, "checkpoints", head.checkpoint.file);
12
+ const state = parseJournalIndexState(JSON.parse(await readFile(checkpointPath, "utf8")), generationDirectory, head.generation, head.checkpoint.sequence);
13
+ const index = new SchedulerJournalIndex(state);
14
+ for (let sequence = head.checkpoint.sequence + 1; sequence <= head.sequence; sequence++) {
15
+ const file = join(generationDirectory, journalTransactionName(sequence));
16
+ index.apply(parseSchedulerTransaction(JSON.parse(await readFile(file, "utf8"))), file);
17
+ }
18
+ return { index, sequence: head.sequence };
19
+ }
20
+ export async function writeJournalCheckpoint(directory, generation, sequence, index) {
21
+ const checkpointDirectory = join(directory, generation, "checkpoints");
22
+ await mkdir(checkpointDirectory, { recursive: true, mode: 0o700 });
23
+ await syncJournalDirectory(join(directory, generation));
24
+ const file = journalCheckpointName(sequence);
25
+ const state = encodeJournalIndexState(index.exportState(), generation, sequence);
26
+ parseJournalIndexState(state, join(directory, generation), generation, sequence);
27
+ await writeJournalJson(join(checkpointDirectory, file), state);
28
+ return {
29
+ schemaVersion: 3,
30
+ generation,
31
+ sequence,
32
+ checkpoint: { file, sequence },
33
+ };
34
+ }
35
+ /** Only checkpoint artifacts are retired here; archived transaction payloads remain immutable. */
36
+ export async function cleanObsoleteJournalCheckpoints(directory, head) {
37
+ const path = join(directory, head.generation, "checkpoints");
38
+ for (const entry of await readdir(path, { withFileTypes: true })) {
39
+ if (!entry.isFile())
40
+ continue;
41
+ if (entry.name === head.checkpoint.file)
42
+ continue;
43
+ await rm(join(path, entry.name), { force: true });
44
+ }
45
+ }
@@ -0,0 +1,8 @@
1
+ /** The replacement is visible, but its directory entry is not confirmed durable. */
2
+ export declare class JournalPublicationSyncError extends Error {
3
+ constructor(cause: unknown);
4
+ }
5
+ export declare function syncJournalDirectory(directory: string): Promise<void>;
6
+ /** Establish the owned root, including directories left by an interrupted mkdir. */
7
+ export declare function syncJournalDirectoryPath(directory: string): Promise<void>;
8
+ export declare function writeJournalJson(path: string, value: unknown): Promise<void>;