@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
@@ -200,6 +200,7 @@ export class SessionService {
200
200
  taskType: options.taskType,
201
201
  requestId: options.requestId,
202
202
  cronJobId: options.cronJobId,
203
+ ...(options.schedule ? { schedule: options.schedule } : {}),
203
204
  cronTitle: options.cronTitle,
204
205
  triggerType: options.triggerType,
205
206
  attachments: options.attachments,
@@ -86,6 +86,7 @@ export type SessionListResult = {
86
86
  nextCursor: string | null;
87
87
  };
88
88
  export type SessionSnapshotMessage = {
89
+ schedule?: import("./schedule-metadata.js").ScheduleMessageReference;
89
90
  id: string | number;
90
91
  sessionId: string;
91
92
  role: SessionMessageRole;
@@ -137,6 +138,7 @@ export type SessionMessageDeleteResult = {
137
138
  deletedRequestEvents?: number;
138
139
  };
139
140
  export type SessionMessage = {
141
+ schedule?: import("./schedule-metadata.js").ScheduleMessageReference;
140
142
  id: string;
141
143
  role: SessionMessageRole;
142
144
  content: string;
@@ -0,0 +1,4 @@
1
+ import type { Server } from "node:http";
2
+ import type { WebSocketServer } from "ws";
3
+ /** Stops only this server's connections; active work is not drained on shutdown. */
4
+ export declare function closeHttpServerImmediately(server: Server, webSockets?: WebSocketServer): Promise<void>;
@@ -0,0 +1,17 @@
1
+ /** Stops only this server's connections; active work is not drained on shutdown. */
2
+ export function closeHttpServerImmediately(server, webSockets) {
3
+ return new Promise((resolve, reject) => {
4
+ server.close((error) => {
5
+ if (error) {
6
+ reject(error);
7
+ return;
8
+ }
9
+ resolve();
10
+ });
11
+ // Stop accepting first: a connection cannot arrive between the sweep and close.
12
+ server.closeAllConnections();
13
+ webSockets?.close();
14
+ for (const client of webSockets?.clients ?? [])
15
+ client.terminate();
16
+ });
17
+ }
@@ -0,0 +1,3 @@
1
+ export declare function createAggregateGate(maxActive: number, maxQueued: number): Readonly<{
2
+ run<T>(operation: () => Promise<T>, deadline: number, abortSignal?: AbortSignal): Promise<T>;
3
+ }>;
@@ -0,0 +1,87 @@
1
+ import { remainingTime, withinDeadline } from "./deadline.js";
2
+ import { PublicHttpError } from "./errors.js";
3
+ export function createAggregateGate(maxActive, maxQueued) {
4
+ let active = 0;
5
+ const queue = [];
6
+ const startQueued = () => {
7
+ while (active < maxActive && queue.length > 0) {
8
+ const waiter = queue.shift();
9
+ clearTimeout(waiter.timeout);
10
+ if (waiter.onAbort) {
11
+ waiter.abortSignal?.removeEventListener("abort", waiter.onAbort);
12
+ }
13
+ if (waiter.abortSignal?.aborted) {
14
+ waiter.reject(new PublicHttpError("web_request_aborted", "The web request was aborted."));
15
+ continue;
16
+ }
17
+ if (waiter.deadline <= Date.now()) {
18
+ waiter.reject(new PublicHttpError("web_request_timed_out", "The upstream web request timed out."));
19
+ continue;
20
+ }
21
+ active += 1;
22
+ let released = false;
23
+ waiter.resolve(() => {
24
+ if (released)
25
+ return;
26
+ released = true;
27
+ active -= 1;
28
+ startQueued();
29
+ });
30
+ }
31
+ };
32
+ const acquire = (deadline, abortSignal) => {
33
+ if (abortSignal?.aborted) {
34
+ return Promise.reject(new PublicHttpError("web_request_aborted", "The web request was aborted."));
35
+ }
36
+ if (active < maxActive) {
37
+ active += 1;
38
+ let released = false;
39
+ return Promise.resolve(() => {
40
+ if (released)
41
+ return;
42
+ released = true;
43
+ active -= 1;
44
+ startQueued();
45
+ });
46
+ }
47
+ if (queue.length >= maxQueued) {
48
+ return Promise.reject(new PublicHttpError("web_request_capacity_exceeded", "The web client is at its bounded request capacity."));
49
+ }
50
+ return new Promise((resolve, reject) => {
51
+ const waiter = {
52
+ resolve,
53
+ reject,
54
+ deadline,
55
+ ...(abortSignal ? { abortSignal } : {}),
56
+ };
57
+ const remove = () => {
58
+ const index = queue.indexOf(waiter);
59
+ if (index >= 0)
60
+ queue.splice(index, 1);
61
+ };
62
+ const fail = (error) => {
63
+ remove();
64
+ clearTimeout(waiter.timeout);
65
+ if (waiter.onAbort) {
66
+ abortSignal?.removeEventListener("abort", waiter.onAbort);
67
+ }
68
+ reject(error);
69
+ };
70
+ waiter.onAbort = () => fail(new PublicHttpError("web_request_aborted", "The web request was aborted."));
71
+ waiter.timeout = setTimeout(() => fail(new PublicHttpError("web_request_timed_out", "The upstream web request timed out.")), remainingTime(deadline));
72
+ waiter.timeout.unref?.();
73
+ abortSignal?.addEventListener("abort", waiter.onAbort, { once: true });
74
+ queue.push(waiter);
75
+ });
76
+ };
77
+ return Object.freeze({
78
+ async run(operation, deadline, abortSignal) {
79
+ const release = await acquire(deadline, abortSignal);
80
+ const rawWork = Promise.resolve().then(operation);
81
+ // A deadline rejects the visible operation promptly, but the capacity slot
82
+ // remains held until non-cancellable DNS or transport work actually settles.
83
+ void rawWork.then(release, release);
84
+ return await withinDeadline(rawWork, deadline, abortSignal);
85
+ },
86
+ });
87
+ }
@@ -0,0 +1,2 @@
1
+ export declare function remainingTime(deadline: number): number;
2
+ export declare function withinDeadline<T>(promise: Promise<T>, deadline: number, abortSignal?: AbortSignal): Promise<T>;
@@ -0,0 +1,29 @@
1
+ import { PublicHttpError } from "./errors.js";
2
+ export function remainingTime(deadline) {
3
+ const remaining = deadline - Date.now();
4
+ if (remaining <= 0) {
5
+ throw new PublicHttpError("web_request_timed_out", "The upstream web request timed out.");
6
+ }
7
+ return remaining;
8
+ }
9
+ export function withinDeadline(promise, deadline, abortSignal) {
10
+ if (abortSignal?.aborted) {
11
+ return Promise.reject(new PublicHttpError("web_request_aborted", "The web request was aborted."));
12
+ }
13
+ return new Promise((resolve, reject) => {
14
+ let settled = false;
15
+ const finish = (operation) => {
16
+ if (settled)
17
+ return;
18
+ settled = true;
19
+ clearTimeout(timeout);
20
+ abortSignal?.removeEventListener("abort", onAbort);
21
+ operation();
22
+ };
23
+ const onAbort = () => finish(() => reject(new PublicHttpError("web_request_aborted", "The web request was aborted.")));
24
+ const timeout = setTimeout(() => finish(() => reject(new PublicHttpError("web_request_timed_out", "The upstream web request timed out."))), remainingTime(deadline));
25
+ timeout.unref?.();
26
+ abortSignal?.addEventListener("abort", onAbort, { once: true });
27
+ promise.then((value) => finish(() => resolve(value)), (error) => finish(() => reject(error)));
28
+ });
29
+ }
@@ -0,0 +1,6 @@
1
+ export type PublicHttpErrorCode = "web_request_aborted" | "web_request_timed_out" | "web_request_capacity_exceeded" | "web_target_invalid" | "web_target_not_public" | "web_target_unresolvable" | "web_redirect_invalid" | "web_redirect_limit_exceeded" | "web_response_invalid";
2
+ export declare class PublicHttpError<Code extends string = PublicHttpErrorCode> extends Error {
3
+ readonly code: Code;
4
+ constructor(code: Code, message: string);
5
+ }
6
+ export declare function isPublicHttpError(error: unknown): error is PublicHttpError;
@@ -0,0 +1,11 @@
1
+ export class PublicHttpError extends Error {
2
+ code;
3
+ constructor(code, message) {
4
+ super(message);
5
+ this.name = "PublicHttpError";
6
+ this.code = code;
7
+ }
8
+ }
9
+ export function isPublicHttpError(error) {
10
+ return error instanceof PublicHttpError;
11
+ }
@@ -0,0 +1,8 @@
1
+ export declare const PUBLIC_HTTP_LIMITS: Readonly<{
2
+ readonly httpConcurrency: 6;
3
+ readonly httpQueueLimit: 64;
4
+ readonly redirects: 3;
5
+ readonly responseBytes: number;
6
+ readonly requestTimeoutMs: 10000;
7
+ readonly responseHeaderBytes: number;
8
+ }>;
@@ -0,0 +1,8 @@
1
+ export const PUBLIC_HTTP_LIMITS = Object.freeze({
2
+ httpConcurrency: 6,
3
+ httpQueueLimit: 64,
4
+ redirects: 3,
5
+ responseBytes: 512 * 1024,
6
+ requestTimeoutMs: 10_000,
7
+ responseHeaderBytes: 32 * 1024,
8
+ });
@@ -0,0 +1,11 @@
1
+ export type PublicAddress = Readonly<{
2
+ address: string;
3
+ family: 4 | 6;
4
+ }>;
5
+ export type HostResolver = (hostname: string) => Promise<readonly PublicAddress[]>;
6
+ export declare function isPublicIpv4(address: string): boolean;
7
+ export declare function isPublicIpv6(address: string): boolean;
8
+ export declare function isPublicAddress(address: PublicAddress): boolean;
9
+ export declare function parsePublicHttpUrl(rawUrl: string): URL;
10
+ export declare const resolveHostAddresses: HostResolver;
11
+ export declare function resolvePublicTarget(url: URL, resolver?: HostResolver): Promise<PublicAddress>;
@@ -0,0 +1,178 @@
1
+ import { lookup } from "node:dns/promises";
2
+ import { isIP } from "node:net";
3
+ import { PublicHttpError } from "./errors.js";
4
+ function ipv4Value(address) {
5
+ if (isIP(address) !== 4)
6
+ return undefined;
7
+ const octets = address.split(".").map(Number);
8
+ return (((octets[0] << 24) >>> 0) +
9
+ (octets[1] << 16) +
10
+ (octets[2] << 8) +
11
+ octets[3]);
12
+ }
13
+ function ipv4InCidr(value, base, bits) {
14
+ const shift = 32 - bits;
15
+ return value >>> shift === base >>> shift;
16
+ }
17
+ export function isPublicIpv4(address) {
18
+ const value = ipv4Value(address);
19
+ if (value === undefined)
20
+ return false;
21
+ const blocked = [
22
+ ["0.0.0.0", 8],
23
+ ["10.0.0.0", 8],
24
+ ["100.64.0.0", 10],
25
+ ["127.0.0.0", 8],
26
+ ["169.254.0.0", 16],
27
+ ["172.16.0.0", 12],
28
+ ["192.0.0.0", 24],
29
+ ["192.0.2.0", 24],
30
+ ["192.88.99.0", 24],
31
+ ["192.168.0.0", 16],
32
+ ["198.18.0.0", 15],
33
+ ["198.51.100.0", 24],
34
+ ["203.0.113.0", 24],
35
+ ["224.0.0.0", 4],
36
+ ["240.0.0.0", 4],
37
+ ];
38
+ return !blocked.some(([base, bits]) => ipv4InCidr(value, ipv4Value(base), bits));
39
+ }
40
+ function parseIpv6(address) {
41
+ const normalized = address.toLowerCase().replace(/^\[|\]$/gu, "");
42
+ if (normalized.includes("%") || isIP(normalized) !== 6)
43
+ return undefined;
44
+ let candidate = normalized;
45
+ const ipv4Tail = candidate.match(/(?:^|:)(\d+\.\d+\.\d+\.\d+)$/u)?.[1];
46
+ if (ipv4Tail) {
47
+ const value = ipv4Value(ipv4Tail);
48
+ if (value === undefined)
49
+ return undefined;
50
+ candidate = candidate.slice(0, -ipv4Tail.length);
51
+ candidate += `${((value >>> 16) & 0xffff).toString(16)}:${(value & 0xffff).toString(16)}`;
52
+ }
53
+ const doubleColon = candidate.indexOf("::");
54
+ if (doubleColon !== candidate.lastIndexOf("::"))
55
+ return undefined;
56
+ const head = (doubleColon >= 0 ? candidate.slice(0, doubleColon) : candidate)
57
+ .split(":")
58
+ .filter(Boolean);
59
+ const tail = (doubleColon >= 0 ? candidate.slice(doubleColon + 2) : "")
60
+ .split(":")
61
+ .filter(Boolean);
62
+ const missing = 8 - head.length - tail.length;
63
+ if ((doubleColon < 0 && missing !== 0) || (doubleColon >= 0 && missing < 1)) {
64
+ return undefined;
65
+ }
66
+ const groups = [...head, ...Array(missing).fill("0"), ...tail];
67
+ if (groups.length !== 8 ||
68
+ groups.some((group) => !/^[0-9a-f]{1,4}$/u.test(group))) {
69
+ return undefined;
70
+ }
71
+ return groups.reduce((value, group) => (value << 16n) | BigInt(Number.parseInt(group, 16)), 0n);
72
+ }
73
+ function ipv6InCidr(value, baseAddress, bits) {
74
+ const base = parseIpv6(baseAddress);
75
+ const shift = BigInt(128 - bits);
76
+ return value >> shift === base >> shift;
77
+ }
78
+ export function isPublicIpv6(address) {
79
+ const value = parseIpv6(address);
80
+ if (value === undefined)
81
+ return false;
82
+ if (ipv6InCidr(value, "::ffff:0:0", 96)) {
83
+ const mapped = Number(value & 0xffffffffn) >>> 0;
84
+ const dotted = [24, 16, 8, 0]
85
+ .map((shift) => (mapped >>> shift) & 0xff)
86
+ .join(".");
87
+ return isPublicIpv4(dotted);
88
+ }
89
+ if (ipv6InCidr(value, "64:ff9b::", 96) ||
90
+ ipv6InCidr(value, "64:ff9b:1::", 48)) {
91
+ return false;
92
+ }
93
+ if (!ipv6InCidr(value, "2000::", 3))
94
+ return false;
95
+ const blocked = [
96
+ ["2001::", 23],
97
+ ["2001:db8::", 32],
98
+ ["2002::", 16],
99
+ ["3fff::", 20],
100
+ ];
101
+ return !blocked.some(([base, bits]) => ipv6InCidr(value, base, bits));
102
+ }
103
+ export function isPublicAddress(address) {
104
+ return address.family === 4
105
+ ? isPublicIpv4(address.address)
106
+ : isPublicIpv6(address.address);
107
+ }
108
+ function normalizeHostname(hostname) {
109
+ return hostname
110
+ .toLowerCase()
111
+ .replace(/^\[|\]$/gu, "")
112
+ .replace(/\.$/u, "");
113
+ }
114
+ function isBlockedHostname(hostname) {
115
+ return (hostname === "localhost" ||
116
+ hostname.endsWith(".localhost") ||
117
+ hostname.endsWith(".local") ||
118
+ hostname.endsWith(".internal") ||
119
+ hostname.endsWith(".home") ||
120
+ hostname.endsWith(".lan"));
121
+ }
122
+ export function parsePublicHttpUrl(rawUrl) {
123
+ let parsed;
124
+ try {
125
+ parsed = new URL(rawUrl);
126
+ }
127
+ catch {
128
+ throw new PublicHttpError("web_target_invalid", "A valid absolute URL is required.");
129
+ }
130
+ if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
131
+ throw new PublicHttpError("web_target_invalid", "Only http and https URLs are supported.");
132
+ }
133
+ if (parsed.username || parsed.password) {
134
+ throw new PublicHttpError("web_target_invalid", "URLs containing credentials are not supported.");
135
+ }
136
+ const hostname = normalizeHostname(parsed.hostname);
137
+ if (!hostname || isBlockedHostname(hostname)) {
138
+ throw new PublicHttpError("web_target_not_public", "Only public Internet targets are allowed.");
139
+ }
140
+ const family = isIP(hostname);
141
+ if ((family === 4 && !isPublicIpv4(hostname)) ||
142
+ (family === 6 && !isPublicIpv6(hostname))) {
143
+ throw new PublicHttpError("web_target_not_public", "Only public Internet targets are allowed.");
144
+ }
145
+ return parsed;
146
+ }
147
+ export const resolveHostAddresses = async (hostname) => {
148
+ const normalized = normalizeHostname(hostname);
149
+ const literalFamily = isIP(normalized);
150
+ if (literalFamily === 4 || literalFamily === 6) {
151
+ return Object.freeze([
152
+ Object.freeze({ address: normalized, family: literalFamily }),
153
+ ]);
154
+ }
155
+ let resolved;
156
+ try {
157
+ resolved = await lookup(normalized, { all: true, verbatim: true });
158
+ }
159
+ catch {
160
+ throw new PublicHttpError("web_target_unresolvable", "The public target hostname could not be resolved.");
161
+ }
162
+ const addresses = resolved
163
+ .filter((entry) => entry.family === 4 || entry.family === 6)
164
+ .map((entry) => Object.freeze({ address: entry.address, family: entry.family }));
165
+ if (addresses.length === 0) {
166
+ throw new PublicHttpError("web_target_unresolvable", "The public target hostname could not be resolved.");
167
+ }
168
+ return Object.freeze(addresses);
169
+ };
170
+ export async function resolvePublicTarget(url, resolver = resolveHostAddresses) {
171
+ const hostname = normalizeHostname(url.hostname);
172
+ const addresses = await resolver(hostname);
173
+ if (addresses.length === 0 ||
174
+ addresses.some((entry) => !isPublicAddress(entry))) {
175
+ throw new PublicHttpError("web_target_not_public", "Only public Internet targets are allowed.");
176
+ }
177
+ return addresses[0];
178
+ }
@@ -0,0 +1,24 @@
1
+ import { type HostResolver } from "./network-policy.js";
2
+ import { requestPinnedHop, type HopRequester, type HopResponse } from "./request-hop.js";
3
+ export { requestPinnedHop };
4
+ export type { HopRequester };
5
+ export type PublicHttpResponse = HopResponse & Readonly<{
6
+ requestedUrl: string;
7
+ finalUrl: string;
8
+ }>;
9
+ export type PublicHttpRequest = Readonly<{
10
+ url: string;
11
+ headers?: Readonly<Record<string, string>>;
12
+ maxBytes?: number;
13
+ maxRedirects?: number;
14
+ followRedirects?: boolean;
15
+ timeoutMs?: number;
16
+ abortSignal?: AbortSignal;
17
+ }>;
18
+ export type PublicHttpClient = Readonly<{
19
+ get(request: PublicHttpRequest): Promise<PublicHttpResponse>;
20
+ }>;
21
+ export declare function createPublicHttpClient(dependencies?: Readonly<{
22
+ resolveHost?: HostResolver;
23
+ requestHop?: HopRequester;
24
+ }>): PublicHttpClient;
@@ -0,0 +1,85 @@
1
+ import { createAggregateGate } from "./aggregate-gate.js";
2
+ import { remainingTime } from "./deadline.js";
3
+ import { PublicHttpError, isPublicHttpError } from "./errors.js";
4
+ import { PUBLIC_HTTP_LIMITS } from "./limits.js";
5
+ import { parsePublicHttpUrl, resolvePublicTarget, } from "./network-policy.js";
6
+ import { requestPinnedHop, } from "./request-hop.js";
7
+ export { requestPinnedHop };
8
+ const REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);
9
+ function canFollowHttpRedirect(request, status) {
10
+ if (request.followRedirects === false)
11
+ return false;
12
+ return REDIRECT_STATUSES.has(status);
13
+ }
14
+ function redirectLocation(response) {
15
+ const raw = response.headers.location;
16
+ return Array.isArray(raw) ? raw[0] : raw;
17
+ }
18
+ function validateBounds(request) {
19
+ const maxBytes = request.maxBytes ?? PUBLIC_HTTP_LIMITS.responseBytes;
20
+ const maxRedirects = request.maxRedirects ?? PUBLIC_HTTP_LIMITS.redirects;
21
+ const timeoutMs = request.timeoutMs ?? PUBLIC_HTTP_LIMITS.requestTimeoutMs;
22
+ if (!Number.isSafeInteger(maxBytes) || maxBytes < 1) {
23
+ throw new RangeError("maxBytes must be a positive safe integer");
24
+ }
25
+ if (!Number.isSafeInteger(maxRedirects) || maxRedirects < 0) {
26
+ throw new RangeError("maxRedirects must be a non-negative safe integer");
27
+ }
28
+ if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1) {
29
+ throw new RangeError("timeoutMs must be a positive safe integer");
30
+ }
31
+ return Object.freeze({ maxBytes, maxRedirects, timeoutMs });
32
+ }
33
+ export function createPublicHttpClient(dependencies = {}) {
34
+ const resolveHost = dependencies.resolveHost;
35
+ const requestHop = dependencies.requestHop ?? requestPinnedHop;
36
+ const gate = createAggregateGate(PUBLIC_HTTP_LIMITS.httpConcurrency, PUBLIC_HTTP_LIMITS.httpQueueLimit);
37
+ return Object.freeze({
38
+ async get(request) {
39
+ const requested = parsePublicHttpUrl(request.url);
40
+ const bounds = validateBounds(request);
41
+ const deadline = Date.now() + bounds.timeoutMs;
42
+ let current = requested;
43
+ for (let redirectCount = 0;; redirectCount += 1) {
44
+ const address = await gate.run(() => resolvePublicTarget(current, resolveHost), deadline, request.abortSignal);
45
+ const response = await gate.run(() => requestHop({
46
+ url: current,
47
+ address,
48
+ headers: Object.freeze({
49
+ Accept: "text/html,application/xhtml+xml,text/plain,application/json;q=0.9,application/xml;q=0.8,text/xml;q=0.8",
50
+ "Accept-Encoding": "identity",
51
+ "User-Agent": "abot-runtime-web/1.0",
52
+ ...(request.headers ?? {}),
53
+ }),
54
+ maxBytes: bounds.maxBytes,
55
+ timeoutMs: remainingTime(deadline),
56
+ ...(request.abortSignal
57
+ ? { abortSignal: request.abortSignal }
58
+ : {}),
59
+ }), deadline, request.abortSignal);
60
+ if (!canFollowHttpRedirect(request, response.status)) {
61
+ return Object.freeze({
62
+ requestedUrl: requested.toString(),
63
+ finalUrl: current.toString(),
64
+ ...response,
65
+ });
66
+ }
67
+ const location = redirectLocation(response);
68
+ if (!location) {
69
+ throw new PublicHttpError("web_redirect_invalid", "The upstream redirect did not provide a valid destination.");
70
+ }
71
+ if (redirectCount >= bounds.maxRedirects) {
72
+ throw new PublicHttpError("web_redirect_limit_exceeded", "The web request exceeded the redirect limit.");
73
+ }
74
+ try {
75
+ current = parsePublicHttpUrl(new URL(location, current).toString());
76
+ }
77
+ catch (error) {
78
+ if (isPublicHttpError(error))
79
+ throw error;
80
+ throw new PublicHttpError("web_redirect_invalid", "The upstream redirect did not provide a valid destination.");
81
+ }
82
+ }
83
+ },
84
+ });
85
+ }
@@ -0,0 +1,18 @@
1
+ import { type IncomingHttpHeaders } from "node:http";
2
+ import type { PublicAddress } from "./network-policy.js";
3
+ export type HopResponse = Readonly<{
4
+ status: number;
5
+ headers: IncomingHttpHeaders;
6
+ body: Uint8Array;
7
+ bytesRead: number;
8
+ partialContent: boolean;
9
+ }>;
10
+ export type HopRequester = (params: {
11
+ url: URL;
12
+ address: PublicAddress;
13
+ headers: Readonly<Record<string, string>>;
14
+ maxBytes: number;
15
+ timeoutMs: number;
16
+ abortSignal?: AbortSignal;
17
+ }) => Promise<HopResponse>;
18
+ export declare const requestPinnedHop: HopRequester;