@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
@@ -10,7 +10,7 @@ the default `supervisor-worker-v1` policy and the opt-in
10
10
  | The handler resolves one compiled execution policy from the selected model profile and supplies its same authority to capability composition and the runner. Omission remains `supervisor-worker-v1`. | `src/runtime/model/model-selection.ts`, `src/runtime/request/handler.ts`, `src/runtime/request/role-executor-composition.ts` | `model-execution-policy.test.ts`, `request-execution-policy-composition.test.ts` |
11
11
  | `supervisor-worker-v1` retains the delegated Supervisor, Planner, Worker, and Reviewer contracts; `execution-agent-v1` changes model-facing contracts and authority without adding another runner, ledger, reducer, capability engine, or finalizer. | `src/runtime/request/root-execution-kernel.ts`, `src/runtime/request/role-executor-composition.ts` | `root-execution-kernel-policy-mechanics.test.ts`, `supervisor-request-runner.test.ts`, `execution-agent-request-runner.test.ts` |
12
12
  | Role choice is model-owned and limited to the exact subordinate contracts registered by the frozen policy. | `src/runtime/steps/*`, `src/runtime/orchestration/role-executors/`, `src/runtime/orchestration/role-calls/` | `role-executor-registry.test.ts`, `planner-decision.test.ts`, `execution-agent-advisory-executors.test.ts` |
13
- | Every subordinate result returns to its exact caller through an exact-head ledger v17 commit. Under `supervisor-worker-v1`, terminal Planner and Worker results receive a runtime-owned, constant-size `work_result_v1` receipt; supplied work receipts are rejected, lineage is derived and fingerprint-verified from that ledger, and `execution-agent-v1` receives none. Planner Graph and Auditor outputs remain passive terminal child results. | `src/runtime/orchestration/role-calls/`, `src/runtime/steps/planner-graph/`, `src/runtime/steps/auditor-decision/` | `role-call-ledger.test.ts`, `role-call-work-result-receipt-reducer.test.ts`, `role-call-planner-work-result-receipt.test.ts`, `execution-agent-advisory-executors.test.ts`, `supervisor-request-runner.test.ts` |
13
+ | Every subordinate result returns to its exact caller through an exact-head ledger v18 commit. Under `supervisor-worker-v1`, terminal Planner and Worker results receive a runtime-owned, constant-size `work_result_v1` receipt; supplied work receipts are rejected, lineage is derived and fingerprint-verified from that ledger, and `execution-agent-v1` receives none. Planner Graph and Auditor outputs remain passive terminal child results. | `src/runtime/orchestration/role-calls/`, `src/runtime/steps/planner-graph/`, `src/runtime/steps/auditor-decision/` | `role-call-ledger.test.ts`, `role-call-work-result-receipt-reducer.test.ts`, `role-call-planner-work-result-receipt.test.ts`, `execution-agent-advisory-executors.test.ts`, `supervisor-request-runner.test.ts` |
14
14
  | Planner's semantic contract requires declaring every currently known execution outcome before the first child dispatch; schema and parser mechanically bind exactly one independently completable production item per Worker dispatch. A directly bound Worker receives that item, explicit dependencies, supervision evidence, and its own capability-result lane without the broader request, Planner objective, or sibling execution summaries. | `src/runtime/steps/planner-decision/`, `src/runtime/steps/worker-decision/`, `src/runtime/context/request-tool-results.ts` | `planner-plan-contract.test.ts`, `planner-single-item-dispatch.test.ts`, `planner-worker-context-isolation.test.ts`, `planner-worker-tool-result-scope.test.ts` |
15
15
  | Capability authority is validated against the frozen policy and bound to the exact authorized call and activation: Worker for the default policy, canonical root for the direct policy. Both use the same binding and adapter engine. | `src/runtime/orchestration/role-calls/`, `src/runtime/orchestration/worker-capabilities/`, `src/runtime/request/root-execution-kernel.ts` | `root-execution-kernel-policy-mechanics.test.ts`, `worker-capability-binding.test.ts`, `execution-agent-request-runner.test.ts` |
16
16
  | Worker and root payloads use the same `tool_payload.raw` author; principal, controls, runtime-issued direct-Planner-item receipt, and admitted evidence are mechanically bounded before model invocation. Root and non-Planner Worker payloads retain the exact request source; a canonically bound Planner item omits it. Work-result receipts and derived lineage are stripped before Worker raw payload and result authoring while optional semantic checkpoints remain. | `src/runtime/orchestration/worker-capabilities/payload-author.ts`, `src/runtime/request/worker-capability-payload.ts`, `src/runtime/steps/worker-decision/` | `planner-worker-context-isolation.test.ts`, `registered-tool-worker-assignment-provenance.test.ts`, `worker-capability-payload-author.test.ts`, `worker-payload-dependency-projection-pr1.test.ts`, `execution-agent-request-runner.test.ts` |
@@ -41,12 +41,35 @@ const handle = runtime.host.start({
41
41
  toolRegistry: runtime.tools,
42
42
  });
43
43
 
44
+ await handle.ready;
45
+
44
46
  process.on("SIGINT", async () => {
45
47
  await handle.stop();
46
48
  process.exit(0);
47
49
  });
48
50
  ```
49
51
 
52
+ The default host starts the scheduler automatically, including persisted Jobs.
53
+ Overlapping handles for the same scheduler share its lifetime: `stop()` closes
54
+ that handle's Bridge, and only the last handle stops the scheduler. `start()` remains
55
+ synchronous for compatibility; the optional `ready` promise exposes asynchronous
56
+ startup errors and requests wait for readiness. A failed startup releases its own
57
+ resources even when a consumer does not read `ready`. Custom injected hosts may
58
+ keep the existing `{ stop }` handle.
59
+
60
+ Supply adapter overrides before starting a host. A different session store,
61
+ configuration, model client, attachment store, tool registry or memory service
62
+ rebuilds the scheduler's request graph as well as ordinary requests. Session
63
+ storage remains backed by the injected store, through the composed deletion
64
+ guard. Use the host's effective graph consistently; do not start the original
65
+ graph alongside its replacement against the same scheduler directory. An event
66
+ observer override alone keeps the existing admission and scheduler lifetime.
67
+
68
+ Session deletion finishes attachment cleanup before acknowledging the deletion
69
+ receipt. An explicit repeat retries only failed cleanup, through the same owner
70
+ for Web, Bridge and local clients. Web shutdown closes HTTP/WebSocket intake and
71
+ prevents new environment initialization before awaiting pending startup work.
72
+
50
73
  ## Runtime Config
51
74
 
52
75
  The default host reads `runtime.config.json`, then lets environment variables
@@ -131,7 +131,9 @@ not create `planner.plan.*` state or events.
131
131
  Runtime capabilities use the stable tool event envelope. Adapter-owned
132
132
  presentation metadata supplies the tool, operation and action type; target
133
133
  metadata contains only resolved logical paths. Physical
134
- roots, opaque subject identities and authored payload bodies are never exposed.
134
+ roots and opaque subject identities are never exposed. A plugin may opt into
135
+ bounded input or result excerpts through its declared event presentation.
136
+ These excerpts are display data, not additional model instructions or evidence.
135
137
  These events describe capability execution only. Only `planner.plan.*` events
136
138
  report canonical item-status changes or semantic progress.
137
139
 
@@ -146,6 +148,31 @@ Tool events use the current tool execution boundary:
146
148
  A `tool.completed` event with `ok: true` proves only that the tool step
147
149
  succeeded. It does not prove the user request is complete.
148
150
 
151
+ Registered-tool events may include an optional `executionId` shared by their
152
+ payload, approval and execution stages. Clients correlate with
153
+ `(requestId, executionId)` rather than matching tool names or arrival order.
154
+ Payload publication still occurs after canonical admission. Older events without
155
+ this field do not establish a lifecycle pairing.
156
+
157
+ The same adapter boundary may include `executorRole` and `roleCallId` from the
158
+ canonical role call. Clients can place the action under its executor even when
159
+ the active role has changed before completion. These fields are display identity;
160
+ they do not change runtime stages, tool parameters, approval inputs or evidence.
161
+ The root role identifier remains `supervisor` regardless of its selected contract.
162
+
163
+ `eventPresentation.resultMetadata` maps optional display keys to existing tool
164
+ result fields through `{path, kind}` descriptors. Paths select `output` or an
165
+ own-property path under `data` (at most four segments). Kinds are `preview`,
166
+ `number` and `boolean`, with at most 16 mappings. A preview is limited to 1,200
167
+ characters and 20 lines, with a 2,400-character total preview budget per event;
168
+ its companion `<key>Truncated` flag describes preview clipping, independently
169
+ of source-result truncation. Missing or mismatched fields are omitted. Valid
170
+ declared values take precedence over generic metadata; omitted fields retain
171
+ the existing fallback metadata. Projection
172
+ does not mutate tool results, canonical evidence, action references or model
173
+ context. The client renders excerpts as inert text and never reconstructs an
174
+ old result by re-reading the current file or memory store.
175
+
149
176
  ## ToolRegistry
150
177
 
151
178
  `ToolRegistry` owns active tool capability discovery and execution:
@@ -177,6 +204,10 @@ retained for compatibility. They must not select a request path or role.
177
204
  Model-facing availability and controls come from the registered
178
205
  `normalInvocation` contract.
179
206
 
207
+ A normal-invocation contract accepts at most 32 operations. This bounds the
208
+ registered operation catalog; it does not limit invocation frequency or the
209
+ number of user-created scheduled Jobs.
210
+
180
211
  Every plugin-handler return is normalized by `ToolRegistry` into one complete
181
212
  `ToolExecutionResult`, whether the operation succeeds or fails. The selected
182
213
  tool identity is Runtime-owned; plugins provide the operation result. The
package/package.json CHANGED
@@ -83,6 +83,8 @@
83
83
  "dist/src/web-ui/",
84
84
  "runtime.config.schema.json",
85
85
  "src/runtime/README.md",
86
+ "src/runtime/scheduler/README.md",
87
+ "src/runtime/local-host/README.md",
86
88
  "LICENSE",
87
89
  "docs/architecture.md",
88
90
  "docs/bridge-compatibility.md",
@@ -172,5 +174,5 @@
172
174
  },
173
175
  "type": "module",
174
176
  "types": "./dist/src/runtime/index.d.ts",
175
- "version": "1.2.0"
177
+ "version": "1.3.1"
176
178
  }
@@ -17,6 +17,21 @@
17
17
  "inspect_code_outline": {
18
18
  "description": "Extract a bounded outline of symbols, selectors, elements, and imports from one source file beneath the configured agent work directory or configured workspace sources, without returning the full file.",
19
19
  "routingCapability": "semantic_lookup",
20
+ "eventPresentation": {
21
+ "metadata": {
22
+ "displayTarget": { "param": "path", "kind": "string" },
23
+ "maxSymbols": { "param": "maxSymbols", "kind": "number" }
24
+ },
25
+ "resultMetadata": {
26
+ "outputPreview": { "path": "output", "kind": "preview" },
27
+ "lineCount": { "path": "data.lineCount", "kind": "number" },
28
+ "returnedItemCount": { "path": "data.truncation.returnedSymbols", "kind": "number" },
29
+ "totalItemCount": { "path": "data.truncation.totalSymbols", "kind": "number" },
30
+ "sourceTruncated": { "path": "data.truncation.symbolsTruncated", "kind": "boolean" },
31
+ "importsTruncated": { "path": "data.truncation.importsTruncated", "kind": "boolean" },
32
+ "outputTruncated": { "path": "data.truncation.output.truncated", "kind": "boolean" }
33
+ }
34
+ },
20
35
  "runtimePathBindings": [
21
36
  {
22
37
  "operationId": "inspect_code_outline",
@@ -13,6 +13,23 @@
13
13
  "description": "Extract bounded text from an attached or configured-root PDF, DOCX, XLSX, PPTX, TXT, CSV, Markdown, JSON, or RTF document. Use source for an attachment id/name or configured-root path. Use source_mode=working_path with path for a runtime/session artifact beneath the current execution working directory. Document bytes remain outside model context, and results expose only attachment identities or logical runtime paths.",
14
14
  "routingCapability": "filesystem_inspection",
15
15
  "developmentRoles": ["inspect", "verify"],
16
+ "eventPresentation": {
17
+ "metadata": {
18
+ "source": { "param": "source", "kind": "string" },
19
+ "displayTarget": { "param": "path", "kind": "string" },
20
+ "sourceMode": { "param": "source_mode", "kind": "string" },
21
+ "startChar": { "param": "start_char", "kind": "number" },
22
+ "maxChars": { "param": "max_chars", "kind": "number" }
23
+ },
24
+ "resultMetadata": {
25
+ "outputPreview": { "path": "output", "kind": "preview" },
26
+ "startChar": { "path": "data.startChar", "kind": "number" },
27
+ "endChar": { "path": "data.endChar", "kind": "number" },
28
+ "totalCharacters": { "path": "data.totalCharacters", "kind": "number" },
29
+ "inputBytes": { "path": "data.inputBytes", "kind": "number" },
30
+ "sourceTruncated": { "path": "data.truncated", "kind": "boolean" }
31
+ }
32
+ },
16
33
  "runtimePathBindings": [
17
34
  {
18
35
  "operationId": "read_document",
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
3
  "name": "exec",
4
4
  "version": "1.0.0",
5
- "description": "Execute, observe, and cancel bounded non-interactive Linux /bin/bash processes.",
5
+ "description": "Execute, observe, and cancel bounded non-interactive /bin/bash processes on Linux and macOS.",
6
6
  "extensions": {
7
7
  "ai.abot.runtime": {
8
8
  "version": 1,
@@ -19,7 +19,7 @@
19
19
  "capabilities": {
20
20
  "exec": {
21
21
  "catalogGroups": ["read", "write", "exec"],
22
- "description": "Execute one bounded non-interactive Linux /bin/bash command. The explicit cwd must resolve inside agent work or the configured workspace; `.` means the agent-work root and `workspace/...` selects the workspace. The shell itself runs with the runtime process permissions and is not an operating-system sandbox. A command still running after the foreground window yields a process ID and cursor that exec_wait can resume without restarting it. Prefer dedicated inspection and file-mutation capabilities when they can express the task.",
22
+ "description": "Execute one bounded non-interactive /bin/bash command on Linux or macOS. The explicit cwd must resolve inside agent work or the configured workspace; `.` means the agent-work root and `workspace/...` selects the workspace. The shell itself runs with the runtime process permissions and is not an operating-system sandbox. A command still running after the foreground window yields a process ID and cursor that exec_wait can resume without restarting it. Prefer dedicated inspection and file-mutation capabilities when they can express the task.",
23
23
  "routingCapability": "filesystem_inspection",
24
24
  "developmentRoles": ["inspect", "establish", "verify", "auxiliary"],
25
25
  "eventPresentation": {
@@ -31,7 +31,7 @@
31
31
  "skills": ["exec_skill"],
32
32
  "operations": {
33
33
  "execute_command": {
34
- "summary": "Execute one bounded non-interactive Linux /bin/bash command in an explicit existing agent-work or workspace directory. The cwd boundary is not an OS sandbox. Full-access availability does not authorize servers, GUI automation, installs, service changes, background work, or other sensitive effects.",
34
+ "summary": "Execute one bounded non-interactive /bin/bash command on Linux or macOS in an explicit existing agent-work or workspace directory. The cwd boundary is not an OS sandbox. Full-access availability does not authorize servers, GUI automation, installs, service changes, background work, or other sensitive effects.",
35
35
  "input": {
36
36
  "type": "object",
37
37
  "additionalProperties": false,
@@ -1,7 +1,7 @@
1
1
  # Exec Skill
2
2
 
3
3
  - Use `exec` for narrow shell-native discovery or verification when a dedicated tool is insufficient.
4
- - `exec` v1 is available only on Linux with executable `/bin/bash`; it does not select a Windows shell or another fallback shell.
4
+ - `exec` is available on Linux and macOS with executable `/bin/bash`; it does not select a Windows shell or another fallback shell. Commands must use the utilities and options available on the host.
5
5
  - Resolve `.` and ordinary relative `cwd` values from the configured agent work directory. They are never rewritten to the active Worker working directory. Use `workspace/...` only when the configured workspace is explicitly intended.
6
6
  - Always provide an explicit existing `cwd`. For an existing project, use its project path. To create a new project, use an existing parent `cwd` (normally `.`) and create the project path in the command.
7
7
  - The cwd is restricted to configured roots, but the shell runs with the runtime process permissions and is not an operating-system sandbox.
@@ -1,6 +1,4 @@
1
1
  import { spawn, type ChildProcessByStdio } from "node:child_process";
2
- import { constants } from "node:fs";
3
- import { access } from "node:fs/promises";
4
2
  import { randomUUID } from "node:crypto";
5
3
  import type { Readable } from "node:stream";
6
4
  import { StringDecoder } from "node:string_decoder";
@@ -8,13 +6,13 @@ import { StringDecoder } from "node:string_decoder";
8
6
  import { sanitizeJsonText } from "../../../src/plugin-sdk/index.js";
9
7
 
10
8
  import { ExecPluginError } from "./errors.js";
9
+ import { assertSupportedShell, EXEC_SHELL } from "./shell-platform.js";
11
10
  import type {
12
11
  ExecProcessSnapshot,
13
12
  ExecStreamSnapshot,
14
13
  ExecTerminationReason,
15
14
  } from "./types.js";
16
15
 
17
- const EXEC_SHELL = "/bin/bash";
18
16
  const COMPLETED_PROCESS_RETENTION_MS = 5 * 60_000;
19
17
  const MAX_ACTIVE_PROCESSES_PER_SCOPE = 4;
20
18
 
@@ -115,23 +113,6 @@ export type ExecProcessManager = Readonly<{
115
113
  release(processId: string, scope: string): Promise<void>;
116
114
  }>;
117
115
 
118
- async function assertSupportedShell(): Promise<void> {
119
- if (process.platform !== "linux") {
120
- throw new ExecPluginError(
121
- "exec_platform_unsupported",
122
- "The exec plugin v1 requires Linux and /bin/bash.",
123
- );
124
- }
125
- try {
126
- await access(EXEC_SHELL, constants.X_OK);
127
- } catch {
128
- throw new ExecPluginError(
129
- "exec_shell_unavailable",
130
- "The exec plugin cannot start because executable /bin/bash is unavailable.",
131
- );
132
- }
133
- }
134
-
135
116
  export function createExecProcessManager(): ExecProcessManager {
136
117
  const processes = new Map<string, ManagedExecProcess>();
137
118
 
@@ -0,0 +1,29 @@
1
+ import { constants } from "node:fs";
2
+ import { access } from "node:fs/promises";
3
+
4
+ import { ExecPluginError } from "./errors.js";
5
+
6
+ export const EXEC_SHELL = "/bin/bash";
7
+
8
+ function isSupportedExecPlatform(platform: NodeJS.Platform): boolean {
9
+ return platform === "linux" || platform === "darwin";
10
+ }
11
+
12
+ export async function assertSupportedShell(
13
+ platform: NodeJS.Platform = process.platform,
14
+ ): Promise<void> {
15
+ if (!isSupportedExecPlatform(platform)) {
16
+ throw new ExecPluginError(
17
+ "exec_platform_unsupported",
18
+ "The exec plugin requires Linux or macOS and executable /bin/bash.",
19
+ );
20
+ }
21
+ try {
22
+ await access(EXEC_SHELL, constants.X_OK);
23
+ } catch {
24
+ throw new ExecPluginError(
25
+ "exec_shell_unavailable",
26
+ "The exec plugin cannot start because executable /bin/bash is unavailable.",
27
+ );
28
+ }
29
+ }
@@ -558,11 +558,34 @@ function resolveExecScopedPath(pluginContext, executionContext, rawPath, cwd) {
558
558
 
559
559
  // plugins/exec/source/process-manager.ts
560
560
  var import_node_child_process = require("node:child_process");
561
- var import_node_fs2 = require("node:fs");
562
- var import_promises3 = require("node:fs/promises");
563
561
  var import_node_crypto2 = require("node:crypto");
564
562
  var import_node_string_decoder = require("node:string_decoder");
563
+
564
+ // plugins/exec/source/shell-platform.ts
565
+ var import_node_fs2 = require("node:fs");
566
+ var import_promises3 = require("node:fs/promises");
565
567
  var EXEC_SHELL = "/bin/bash";
568
+ function isSupportedExecPlatform(platform) {
569
+ return platform === "linux" || platform === "darwin";
570
+ }
571
+ async function assertSupportedShell(platform = process.platform) {
572
+ if (!isSupportedExecPlatform(platform)) {
573
+ throw new ExecPluginError(
574
+ "exec_platform_unsupported",
575
+ "The exec plugin requires Linux or macOS and executable /bin/bash."
576
+ );
577
+ }
578
+ try {
579
+ await (0, import_promises3.access)(EXEC_SHELL, import_node_fs2.constants.X_OK);
580
+ } catch {
581
+ throw new ExecPluginError(
582
+ "exec_shell_unavailable",
583
+ "The exec plugin cannot start because executable /bin/bash is unavailable."
584
+ );
585
+ }
586
+ }
587
+
588
+ // plugins/exec/source/process-manager.ts
566
589
  var COMPLETED_PROCESS_RETENTION_MS = 5 * 6e4;
567
590
  var MAX_ACTIVE_PROCESSES_PER_SCOPE = 4;
568
591
  var CappedTextBuffer = class {
@@ -602,22 +625,6 @@ var CappedTextBuffer = class {
602
625
  });
603
626
  }
604
627
  };
605
- async function assertSupportedShell() {
606
- if (process.platform !== "linux") {
607
- throw new ExecPluginError(
608
- "exec_platform_unsupported",
609
- "The exec plugin v1 requires Linux and /bin/bash."
610
- );
611
- }
612
- try {
613
- await (0, import_promises3.access)(EXEC_SHELL, import_node_fs2.constants.X_OK);
614
- } catch {
615
- throw new ExecPluginError(
616
- "exec_shell_unavailable",
617
- "The exec plugin cannot start because executable /bin/bash is unavailable."
618
- );
619
- }
620
- }
621
628
  function createExecProcessManager() {
622
629
  const processes = /* @__PURE__ */ new Map();
623
630
  const unknownProcess = () => new ExecPluginError(
@@ -26,6 +26,9 @@
26
26
  "startLine": { "param": "start_line", "kind": "number" },
27
27
  "endLine": { "param": "end_line", "kind": "number" },
28
28
  "locator": { "param": "locator", "kind": "string" }
29
+ },
30
+ "resultMetadata": {
31
+ "outputPreview": { "path": "output", "kind": "preview" }
29
32
  }
30
33
  },
31
34
  "skills": [],
@@ -77,7 +80,11 @@
77
80
  "developmentRoles": ["mutate"],
78
81
  "eventPresentation": {
79
82
  "metadata": {
80
- "path": { "param": "path", "kind": "string" }
83
+ "path": { "param": "path", "kind": "string" },
84
+ "inputPreview": { "param": "instruction", "kind": "string" }
85
+ },
86
+ "resultMetadata": {
87
+ "outputPreview": { "path": "output", "kind": "preview" }
81
88
  }
82
89
  },
83
90
  "payloadChannelSpec": {
@@ -177,6 +184,10 @@
177
184
  "eventPresentation": {
178
185
  "metadata": {
179
186
  "path": { "param": "path", "kind": "string" }
187
+ },
188
+ "resultMetadata": {
189
+ "outputPreview": { "path": "output", "kind": "preview" },
190
+ "sourceTruncated": { "path": "data.truncation.truncated", "kind": "boolean" }
180
191
  }
181
192
  },
182
193
  "skills": ["read_file_skill"],
@@ -208,7 +219,11 @@
208
219
  "developmentRoles": ["establish", "mutate"],
209
220
  "eventPresentation": {
210
221
  "metadata": {
211
- "path": { "param": "path", "kind": "string" }
222
+ "path": { "param": "path", "kind": "string" },
223
+ "inputPreview": { "param": "content", "kind": "string" }
224
+ },
225
+ "resultMetadata": {
226
+ "outputPreview": { "path": "output", "kind": "preview" }
212
227
  }
213
228
  },
214
229
  "payloadChannelSpec": {
@@ -11,6 +11,7 @@ import {
11
11
  } from "./bounded-io.js";
12
12
  import { fail, isNodeErrorCode, rethrowFilesystemError } from "./errors.js";
13
13
  import { openMutationParent } from "./mutation-parent.js";
14
+ import { writeWithDirectoryAuthority } from "./directory-authority-write.js";
14
15
 
15
16
  export async function atomicWriteText(
16
17
  input: Readonly<{
@@ -20,6 +21,10 @@ export async function atomicWriteText(
20
21
  }>,
21
22
  ): Promise<void> {
22
23
  assertMutationContentSize(input.content);
24
+ if (requiresIsolatedDirectoryAuthority()) {
25
+ await writeWithDirectoryAuthority(input);
26
+ return;
27
+ }
23
28
  const parent = await openMutationParent(input.target);
24
29
  const targetPath = `${parent.procPath}/${parent.targetName}`;
25
30
  const anchoredTarget = Object.freeze({
@@ -113,3 +118,7 @@ async function syncDirectoryBestEffort(
113
118
  // The prepared file itself is always synced before the atomic install.
114
119
  }
115
120
  }
121
+
122
+ function requiresIsolatedDirectoryAuthority(): boolean {
123
+ return process.platform === "darwin";
124
+ }
@@ -1,12 +1,6 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { constants, type BigIntStats } from "node:fs";
3
- import {
4
- opendir,
5
- open,
6
- realpath,
7
- stat,
8
- type FileHandle,
9
- } from "node:fs/promises";
3
+ import { open, realpath, stat, type FileHandle } from "node:fs/promises";
10
4
  import { relative, sep } from "node:path";
11
5
  import { StringDecoder } from "node:string_decoder";
12
6
  import { TextDecoder } from "node:util";
@@ -19,7 +13,10 @@ export const MAX_MUTATION_BYTES = 1_048_576;
19
13
  export const READ_HEAD_BYTES = 24_576;
20
14
  export const READ_TAIL_BYTES = 12_288;
21
15
  export const DEV_SCAN_BYTES = 1_048_576;
22
- export const DIRECTORY_ENTRY_LIMIT = 160;
16
+ export {
17
+ readDirectorySample,
18
+ DIRECTORY_ENTRY_LIMIT,
19
+ } from "./directory-sample.js";
23
20
 
24
21
  export type BoundedText = Readonly<{
25
22
  text: string;
@@ -350,97 +347,6 @@ export function assertMutationContentSize(content: string): number {
350
347
  return byteCount;
351
348
  }
352
349
 
353
- export async function readDirectorySample(
354
- target: ResolvedRuntimeToolPath,
355
- ): Promise<Readonly<{ entries: readonly string[]; truncated: boolean }>> {
356
- const entries: string[] = [];
357
- let handle: FileHandle | undefined;
358
- try {
359
- if (
360
- typeof constants.O_DIRECTORY !== "number" ||
361
- typeof constants.O_NOFOLLOW !== "number"
362
- ) {
363
- fail(
364
- "filesystem_safe_io_unsupported",
365
- "This platform does not provide the no-follow directory operation required for a safe read.",
366
- );
367
- }
368
- handle = await open(
369
- target.absolutePath,
370
- constants.O_RDONLY | constants.O_DIRECTORY | constants.O_NOFOLLOW,
371
- );
372
- const before = await handle.stat({ bigint: true });
373
- if (!before.isDirectory()) {
374
- fail("not_a_directory", `Expected a directory: ${target.logicalPath}`);
375
- }
376
- const [canonicalRoot, canonicalTarget] = await Promise.all([
377
- realpath(target.rootPath),
378
- realpath(target.absolutePath),
379
- ]);
380
- const rootRelative = relative(canonicalRoot, canonicalTarget);
381
- if (
382
- rootRelative === ".." ||
383
- rootRelative.startsWith(`..${sep}`) ||
384
- rootRelative.startsWith(sep)
385
- ) {
386
- fail(
387
- "filesystem_path_changed",
388
- `Directory changed outside its configured root: ${target.logicalPath}`,
389
- );
390
- }
391
- const pathIdentity = await stat(canonicalTarget, { bigint: true });
392
- if (
393
- !pathIdentity.isDirectory() ||
394
- pathIdentity.dev !== before.dev ||
395
- pathIdentity.ino !== before.ino
396
- ) {
397
- fail(
398
- "filesystem_path_changed",
399
- `Directory changed while it was being opened: ${target.logicalPath}`,
400
- );
401
- }
402
- const directory = await opendir(`/proc/self/fd/${handle.fd}`);
403
- for await (const entry of directory) {
404
- if (entries.length >= DIRECTORY_ENTRY_LIMIT) {
405
- await assertDirectoryStable(handle, before, target.logicalPath);
406
- entries.sort((left, right) => left.localeCompare(right));
407
- return Object.freeze({
408
- entries: Object.freeze(entries),
409
- truncated: true,
410
- });
411
- }
412
- entries.push(`${entry.name}${entry.isDirectory() ? "/" : ""}`);
413
- }
414
- await assertDirectoryStable(handle, before, target.logicalPath);
415
- entries.sort((left, right) => left.localeCompare(right));
416
- return Object.freeze({ entries: Object.freeze(entries), truncated: false });
417
- } catch (error: unknown) {
418
- return rethrowFilesystemError(error, "inspect", target.logicalPath);
419
- } finally {
420
- await handle?.close().catch(() => undefined);
421
- }
422
- }
423
-
424
- async function assertDirectoryStable(
425
- handle: FileHandle,
426
- before: BigIntStats,
427
- logicalPath: string,
428
- ): Promise<void> {
429
- const after = await handle.stat({ bigint: true });
430
- if (
431
- !after.isDirectory() ||
432
- after.dev !== before.dev ||
433
- after.ino !== before.ino ||
434
- after.mtimeNs !== before.mtimeNs ||
435
- after.ctimeNs !== before.ctimeNs
436
- ) {
437
- fail(
438
- "filesystem_read_changed",
439
- `Directory changed while it was being read: ${logicalPath}`,
440
- );
441
- }
442
- }
443
-
444
350
  function rejectBinary(buffer: Buffer, logicalPath: string): void {
445
351
  if (buffer.includes(0)) {
446
352
  fail(
@@ -0,0 +1,64 @@
1
+ import type { ResolvedRuntimeToolPath } from "../../../src/plugin-sdk/index.js";
2
+ import {
3
+ DirectoryAuthorityError,
4
+ runDirectoryAuthorityTask,
5
+ } from "../../../src/shared/directory-authority/index.js";
6
+ import type { MutationTargetVersion } from "./bounded-io.js";
7
+ import { fail, rethrowFilesystemError } from "./errors.js";
8
+ import { openMutationRoot } from "./mutation-parent.js";
9
+ import {
10
+ commitDirectoryWrite,
11
+ type DirectoryWriteInput,
12
+ } from "./directory-write-task.js";
13
+
14
+ export async function writeWithDirectoryAuthority(
15
+ input: Readonly<{
16
+ target: ResolvedRuntimeToolPath;
17
+ content: string;
18
+ expectedVersion: MutationTargetVersion;
19
+ }>,
20
+ ): Promise<void> {
21
+ const root = await openMutationRoot(input.target);
22
+ const expected = input.expectedVersion;
23
+ const expectedVersion: DirectoryWriteInput["expectedVersion"] =
24
+ expected.kind === "absent"
25
+ ? { kind: "absent" }
26
+ : {
27
+ ...expected,
28
+ device: String(expected.device),
29
+ inode: String(expected.inode),
30
+ modifiedNs: String(expected.modifiedNs),
31
+ changedNs: String(expected.changedNs),
32
+ };
33
+ try {
34
+ await runDirectoryAuthorityTask({
35
+ directoryPath: input.target.rootPath,
36
+ directoryFd: root.fd,
37
+ input: {
38
+ relativePath: input.target.relativePath,
39
+ content: input.content,
40
+ expectedVersion,
41
+ },
42
+ task: commitDirectoryWrite,
43
+ });
44
+ } catch (error) {
45
+ if (error instanceof DirectoryAuthorityError) {
46
+ if (error.code.startsWith("filesystem_")) {
47
+ fail(
48
+ error.code,
49
+ `Safe write failed: ${input.target.logicalPath}`,
50
+ error.data,
51
+ );
52
+ }
53
+ if (error.code.startsWith("directory_authority_")) {
54
+ fail(
55
+ "filesystem_path_changed",
56
+ `Directory authority was lost: ${input.target.logicalPath}`,
57
+ );
58
+ }
59
+ }
60
+ rethrowFilesystemError(error, "write", input.target.logicalPath);
61
+ } finally {
62
+ await root.close().catch(() => undefined);
63
+ }
64
+ }
@@ -0,0 +1,23 @@
1
+ /** Self-contained trusted task, run with an already verified directory cwd. */
2
+ export async function sampleDirectoryTask(
3
+ input: Readonly<{ maxEntries: number }>,
4
+ ): Promise<
5
+ Readonly<{
6
+ entries: readonly string[];
7
+ truncated: boolean;
8
+ }>
9
+ > {
10
+ const { opendir } =
11
+ require("node:fs/promises") as typeof import("node:fs/promises");
12
+ const entries: string[] = [];
13
+ const directory = await opendir(".");
14
+ for await (const entry of directory) {
15
+ if (entries.length >= input.maxEntries) {
16
+ entries.sort((left, right) => left.localeCompare(right));
17
+ return { entries, truncated: true };
18
+ }
19
+ entries.push(`${entry.name}${entry.isDirectory() ? "/" : ""}`);
20
+ }
21
+ entries.sort((left, right) => left.localeCompare(right));
22
+ return { entries, truncated: false };
23
+ }