@abot-ai/runtime 1.3.0 → 1.4.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 (660) hide show
  1. package/dist/plugins/system/source/application-catalog.d.ts +14 -0
  2. package/dist/plugins/system/source/application-catalog.js +185 -0
  3. package/dist/plugins/system/source/application-launch.d.ts +10 -0
  4. package/dist/plugins/system/source/application-launch.js +80 -0
  5. package/dist/plugins/system/source/application-observation.d.ts +25 -0
  6. package/dist/plugins/system/source/application-observation.js +53 -0
  7. package/dist/plugins/system/source/commands.d.ts +7 -0
  8. package/dist/plugins/system/source/commands.js +71 -0
  9. package/dist/plugins/system/source/companion/autostart.d.ts +16 -0
  10. package/dist/plugins/system/source/companion/autostart.js +146 -0
  11. package/dist/plugins/system/source/companion/broker-location.d.ts +11 -0
  12. package/dist/plugins/system/source/companion/broker-location.js +76 -0
  13. package/dist/plugins/system/source/companion/broker-server.d.ts +4 -0
  14. package/dist/plugins/system/source/companion/broker-server.js +147 -0
  15. package/dist/plugins/system/source/companion/connection.d.ts +25 -0
  16. package/dist/plugins/system/source/companion/connection.js +182 -0
  17. package/dist/plugins/system/source/companion/liveness.d.ts +3 -0
  18. package/dist/plugins/system/source/companion/liveness.js +20 -0
  19. package/dist/plugins/system/source/companion/native-address.d.ts +12 -0
  20. package/dist/plugins/system/source/companion/native-address.js +41 -0
  21. package/dist/plugins/system/source/companion/native-identity.d.ts +2 -0
  22. package/dist/plugins/system/source/companion/native-identity.js +23 -0
  23. package/dist/plugins/system/source/companion/native-messages.d.ts +9 -0
  24. package/dist/plugins/system/source/companion/native-messages.js +77 -0
  25. package/dist/plugins/system/source/companion/native-session.d.ts +19 -0
  26. package/dist/plugins/system/source/companion/native-session.js +205 -0
  27. package/dist/plugins/system/source/companion/native-state.d.ts +22 -0
  28. package/dist/plugins/system/source/companion/native-state.js +126 -0
  29. package/dist/plugins/system/source/companion/native-supervisor.d.ts +10 -0
  30. package/dist/plugins/system/source/companion/native-supervisor.js +93 -0
  31. package/dist/plugins/system/source/companion/pairing-store.d.ts +22 -0
  32. package/dist/plugins/system/source/companion/pairing-store.js +102 -0
  33. package/dist/plugins/system/source/companion/private-store.d.ts +4 -0
  34. package/dist/plugins/system/source/companion/private-store.js +59 -0
  35. package/dist/plugins/system/source/companion/process-owner-identity.d.ts +22 -0
  36. package/dist/plugins/system/source/companion/process-owner-identity.js +144 -0
  37. package/dist/plugins/system/source/companion/protocol.d.ts +57 -0
  38. package/dist/plugins/system/source/companion/protocol.js +66 -0
  39. package/dist/plugins/system/source/contracts.d.ts +38 -0
  40. package/dist/plugins/system/source/contracts.js +7 -0
  41. package/dist/plugins/system/source/elevation.d.ts +8 -0
  42. package/dist/plugins/system/source/elevation.js +57 -0
  43. package/dist/plugins/system/source/handlers.d.ts +3 -0
  44. package/dist/plugins/system/source/handlers.js +90 -0
  45. package/dist/plugins/system/source/host-evidence.d.ts +4 -0
  46. package/dist/plugins/system/source/host-evidence.js +52 -0
  47. package/dist/plugins/system/source/host-observation.d.ts +25 -0
  48. package/dist/plugins/system/source/host-observation.js +59 -0
  49. package/dist/plugins/system/source/process-result.d.ts +4 -0
  50. package/dist/plugins/system/source/process-result.js +86 -0
  51. package/dist/plugins/system/source/process-runner.d.ts +3 -0
  52. package/dist/plugins/system/source/process-runner.js +103 -0
  53. package/dist/plugins/system/source/target-observation.d.ts +18 -0
  54. package/dist/plugins/system/source/target-observation.js +29 -0
  55. package/dist/plugins/system/source/targets.d.ts +8 -0
  56. package/dist/plugins/system/source/targets.js +101 -0
  57. package/dist/scripts/add-runtime-model.js +10 -53
  58. package/dist/scripts/init-runtime.js +4 -13
  59. package/dist/scripts/runtime-model-addition.d.ts +13 -0
  60. package/dist/scripts/runtime-model-addition.js +53 -0
  61. package/dist/scripts/runtime-setup-directories.d.ts +2 -0
  62. package/dist/scripts/runtime-setup-directories.js +38 -0
  63. package/dist/scripts/runtime-setup-files.d.ts +3 -1
  64. package/dist/scripts/runtime-setup-files.js +18 -1
  65. package/dist/src/capabilities/file-output-presentation.d.ts +43 -0
  66. package/dist/src/capabilities/file-output-presentation.js +133 -0
  67. package/dist/src/capabilities/tool-definition-validator/definition-parser.js +2 -0
  68. package/dist/src/capabilities/tool-definition-validator/event-input-text-options.d.ts +5 -0
  69. package/dist/src/capabilities/tool-definition-validator/event-input-text-options.js +37 -0
  70. package/dist/src/capabilities/tool-definition-validator/event-presentation.js +3 -0
  71. package/dist/src/capabilities/tool-definition-validator/module-registry.js +12 -0
  72. package/dist/src/capabilities/tool-event-input-text.d.ts +9 -0
  73. package/dist/src/capabilities/tool-event-input-text.js +64 -0
  74. package/dist/src/capabilities/tool-event-metadata.js +10 -0
  75. package/dist/src/capabilities/tool-executor.d.ts +1 -0
  76. package/dist/src/capabilities/tool-executor.js +1 -0
  77. package/dist/src/capabilities/tool-permission-mode.d.ts +7 -0
  78. package/dist/src/capabilities/tool-permission-mode.js +27 -0
  79. package/dist/src/capabilities/tool-types.d.ts +18 -2
  80. package/dist/src/cli/abot.js +18 -15
  81. package/dist/src/cli/host-companion-bundle.mjs +5201 -0
  82. package/dist/src/cli/host-companion-entry.d.ts +8 -0
  83. package/dist/src/cli/host-companion-entry.js +70 -0
  84. package/dist/src/cli/host-companion-startup.d.ts +4 -0
  85. package/dist/src/cli/host-companion-startup.js +35 -0
  86. package/dist/src/cli/host-companion.d.ts +5 -0
  87. package/dist/src/cli/host-companion.js +203 -0
  88. package/dist/src/model-gateway/server/configuration.js +4 -1
  89. package/dist/src/model-gateway/server/contracts.d.ts +2 -0
  90. package/dist/src/plugin-contract/entrypoint.d.ts +4 -2
  91. package/dist/src/plugin-contract/manifest.d.ts +1 -0
  92. package/dist/src/runtime/adapters/config-file-transaction.d.ts +46 -0
  93. package/dist/src/runtime/adapters/config-file-transaction.js +158 -0
  94. package/dist/src/runtime/adapters/configured-skill-provider.js +3 -3
  95. package/dist/src/runtime/adapters/in-memory-session-store.js +11 -1
  96. package/dist/src/runtime/adapters/long-term-memory/file-lock/acquisition.js +7 -3
  97. package/dist/src/runtime/adapters/long-term-memory/file-lock/contracts.d.ts +4 -1
  98. package/dist/src/runtime/adapters/long-term-memory/file-lock/install.d.ts +1 -1
  99. package/dist/src/runtime/adapters/long-term-memory/file-lock/install.js +5 -1
  100. package/dist/src/runtime/adapters/long-term-memory/file-lock/owner-identity.d.ts +3 -0
  101. package/dist/src/runtime/adapters/long-term-memory/file-lock/owner-identity.js +15 -0
  102. package/dist/src/runtime/adapters/long-term-memory/file-lock/owner-record.js +2 -0
  103. package/dist/src/runtime/adapters/long-term-memory/onboarding-config-repository.js +17 -43
  104. package/dist/src/runtime/adapters/registered-tool-normal-invocations/catalog/registrations.js +6 -2
  105. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/approval.js +10 -1
  106. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/execution-binding.d.ts +11 -0
  107. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/execution-binding.js +37 -0
  108. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/file-output-presentation.d.ts +7 -0
  109. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/file-output-presentation.js +105 -0
  110. package/dist/src/runtime/adapters/registered-tool-normal-invocations/execution/run.js +29 -3
  111. package/dist/src/runtime/adapters/registered-tool-normal-invocations/shared/action-fingerprint.d.ts +1 -0
  112. package/dist/src/runtime/adapters/registered-tool-normal-invocations/shared/action-fingerprint.js +1 -0
  113. package/dist/src/runtime/capabilities/configured-tool-registry.js +9 -1
  114. package/dist/src/runtime/capabilities/file-output-root-identity.d.ts +5 -0
  115. package/dist/src/runtime/capabilities/file-output-root-identity.js +146 -0
  116. package/dist/src/runtime/capabilities/file-output-root-marker-creation.d.ts +5 -0
  117. package/dist/src/runtime/capabilities/file-output-root-marker-creation.js +63 -0
  118. package/dist/src/runtime/capabilities/request-bound-tool-registry.d.ts +1 -0
  119. package/dist/src/runtime/capabilities/request-bound-tool-registry.js +6 -1
  120. package/dist/src/runtime/capabilities/request-module-preparation.d.ts +3 -0
  121. package/dist/src/runtime/capabilities/request-module-preparation.js +102 -0
  122. package/dist/src/runtime/capabilities/request-permission-catalog.d.ts +10 -0
  123. package/dist/src/runtime/capabilities/request-permission-catalog.js +50 -0
  124. package/dist/src/runtime/capabilities/request-permission-tool-registry.d.ts +4 -0
  125. package/dist/src/runtime/capabilities/request-permission-tool-registry.js +61 -0
  126. package/dist/src/runtime/capabilities/request-runtime-tool-registry.d.ts +3 -0
  127. package/dist/src/runtime/capabilities/request-runtime-tool-registry.js +5 -2
  128. package/dist/src/runtime/capabilities/request-working-directory.d.ts +3 -0
  129. package/dist/src/runtime/capabilities/request-working-directory.js +12 -0
  130. package/dist/src/runtime/composition.d.ts +2 -0
  131. package/dist/src/runtime/config/runner/loader.d.ts +4 -0
  132. package/dist/src/runtime/config/runner/loader.js +23 -3
  133. package/dist/src/runtime/context/capability-brief-budget.d.ts +18 -0
  134. package/dist/src/runtime/context/capability-brief-budget.js +38 -0
  135. package/dist/src/runtime/context/capability-brief-readmission.d.ts +21 -0
  136. package/dist/src/runtime/context/capability-brief-readmission.js +47 -0
  137. package/dist/src/runtime/context/capability-brief.d.ts +9 -2
  138. package/dist/src/runtime/context/capability-brief.js +21 -39
  139. package/dist/src/runtime/context/capability-descriptions.d.ts +3 -0
  140. package/dist/src/runtime/context/capability-descriptions.js +23 -0
  141. package/dist/src/runtime/default-environment-adapters.js +3 -4
  142. package/dist/src/runtime/local-application.d.ts +18 -0
  143. package/dist/src/runtime/local-application.js +12 -0
  144. package/dist/src/runtime/local-host/app-service-dispatch.d.ts +1 -0
  145. package/dist/src/runtime/local-host/app-service-dispatch.js +9 -0
  146. package/dist/src/runtime/local-host/client-services.d.ts +16 -0
  147. package/dist/src/runtime/local-host/client-services.js +3 -2
  148. package/dist/src/runtime/local-host/contracts.d.ts +4 -0
  149. package/dist/src/runtime/local-host/startup-connection.js +22 -7
  150. package/dist/src/runtime/local-host/transport.js +14 -2
  151. package/dist/src/runtime/orchestration/role-calls/candidate-validation.js +5 -2
  152. package/dist/src/runtime/orchestration/role-calls/command-decoder.js +3 -0
  153. package/dist/src/runtime/orchestration/role-calls/command-dispatch/work-plan-transition.d.ts +3 -0
  154. package/dist/src/runtime/orchestration/role-calls/command-dispatch/work-plan-transition.js +46 -0
  155. package/dist/src/runtime/orchestration/role-calls/command-dispatch.js +3 -0
  156. package/dist/src/runtime/orchestration/role-calls/contracts.d.ts +8 -4
  157. package/dist/src/runtime/orchestration/role-calls/transactions.js +2 -0
  158. package/dist/src/runtime/orchestration/role-calls/work-plan-contracts.d.ts +48 -0
  159. package/dist/src/runtime/orchestration/role-calls/work-plan-contracts.js +9 -0
  160. package/dist/src/runtime/orchestration/role-calls/work-plan-source.d.ts +7 -0
  161. package/dist/src/runtime/orchestration/role-calls/work-plan-source.js +85 -0
  162. package/dist/src/runtime/orchestration/role-calls/work-plan-transactions.d.ts +3 -0
  163. package/dist/src/runtime/orchestration/role-calls/work-plan-transactions.js +17 -0
  164. package/dist/src/runtime/orchestration/role-calls/work-plan-validation.d.ts +10 -0
  165. package/dist/src/runtime/orchestration/role-calls/work-plan-validation.js +149 -0
  166. package/dist/src/runtime/orchestration/worker-capabilities/contracts.d.ts +1 -1
  167. package/dist/src/runtime/orchestration/worker-capabilities/contracts.js +1 -1
  168. package/dist/src/runtime/plugins/compiled-catalog.d.ts +2 -1
  169. package/dist/src/runtime/plugins/configured-manifests.d.ts +3 -0
  170. package/dist/src/runtime/plugins/configured-manifests.js +37 -0
  171. package/dist/src/runtime/plugins/entrypoint-validation.d.ts +6 -0
  172. package/dist/src/runtime/plugins/entrypoint-validation.js +74 -0
  173. package/dist/src/runtime/plugins/loader.js +11 -123
  174. package/dist/src/runtime/plugins/manifest-discovery.d.ts +4 -1
  175. package/dist/src/runtime/plugins/manifest-discovery.js +8 -1
  176. package/dist/src/runtime/plugins/manifest-projection.js +3 -0
  177. package/dist/src/runtime/plugins/manifest-validator.js +7 -1
  178. package/dist/src/runtime/plugins/runtime-capability-plugins.d.ts +4 -0
  179. package/dist/src/runtime/plugins/runtime-capability-plugins.js +7 -0
  180. package/dist/src/runtime/plugins/selection.d.ts +14 -0
  181. package/dist/src/runtime/plugins/selection.js +38 -0
  182. package/dist/src/runtime/ports.d.ts +8 -2
  183. package/dist/src/runtime/projects/contracts.d.ts +40 -0
  184. package/dist/src/runtime/projects/contracts.js +10 -0
  185. package/dist/src/runtime/projects/folders.d.ts +7 -0
  186. package/dist/src/runtime/projects/folders.js +110 -0
  187. package/dist/src/runtime/projects/repository.d.ts +10 -0
  188. package/dist/src/runtime/projects/repository.js +54 -0
  189. package/dist/src/runtime/projects/service.d.ts +3 -0
  190. package/dist/src/runtime/projects/service.js +34 -0
  191. package/dist/src/runtime/projects/session-paths.d.ts +5 -0
  192. package/dist/src/runtime/projects/session-paths.js +13 -0
  193. package/dist/src/runtime/request/execution-agent-plan-update.d.ts +4 -0
  194. package/dist/src/runtime/request/execution-agent-plan-update.js +13 -0
  195. package/dist/src/runtime/request/execution-agent-root-execution.js +9 -1
  196. package/dist/src/runtime/request/handler.js +9 -2
  197. package/dist/src/runtime/request/input.d.ts +2 -1
  198. package/dist/src/runtime/request/input.js +1 -6
  199. package/dist/src/runtime/request/role-call-planner-events.js +4 -0
  200. package/dist/src/runtime/request/role-executor-composition.js +9 -1
  201. package/dist/src/runtime/request/root-contract.d.ts +6 -1
  202. package/dist/src/runtime/request/root-execution-kernel.js +17 -0
  203. package/dist/src/runtime/request/root-plan-event-projection.d.ts +3 -0
  204. package/dist/src/runtime/request/root-plan-event-projection.js +32 -0
  205. package/dist/src/runtime/request/root-plan-update.d.ts +15 -0
  206. package/dist/src/runtime/request/root-plan-update.js +20 -0
  207. package/dist/src/runtime/request/worker-capability-composition.d.ts +1 -0
  208. package/dist/src/runtime/request/worker-capability-composition.js +2 -0
  209. package/dist/src/runtime/runtime-environment.d.ts +1 -0
  210. package/dist/src/runtime/runtime-environment.js +2 -0
  211. package/dist/src/runtime/steps/auditor-decision/advisory-receipt.d.ts +32 -0
  212. package/dist/src/runtime/steps/auditor-decision/advisory-receipt.js +106 -0
  213. package/dist/src/runtime/steps/auditor-decision/advisory-result-budget.d.ts +5 -0
  214. package/dist/src/runtime/steps/auditor-decision/advisory-result-budget.js +40 -0
  215. package/dist/src/runtime/steps/auditor-decision/audit-input-state.d.ts +12 -0
  216. package/dist/src/runtime/steps/auditor-decision/audit-input-state.js +101 -0
  217. package/dist/src/runtime/steps/auditor-decision/contracts.d.ts +31 -16
  218. package/dist/src/runtime/steps/auditor-decision/contracts.js +3 -3
  219. package/dist/src/runtime/steps/auditor-decision/evidence-binding.d.ts +5 -0
  220. package/dist/src/runtime/steps/auditor-decision/evidence-binding.js +43 -0
  221. package/dist/src/runtime/steps/auditor-decision/evidence-coverage.d.ts +2 -0
  222. package/dist/src/runtime/steps/auditor-decision/evidence-coverage.js +71 -0
  223. package/dist/src/runtime/steps/auditor-decision/evidence-inventory.d.ts +13 -0
  224. package/dist/src/runtime/steps/auditor-decision/evidence-inventory.js +89 -0
  225. package/dist/src/runtime/steps/auditor-decision/evidence-representation.d.ts +10 -0
  226. package/dist/src/runtime/steps/auditor-decision/evidence-representation.js +56 -0
  227. package/dist/src/runtime/steps/auditor-decision/evidence-selection.d.ts +9 -0
  228. package/dist/src/runtime/steps/auditor-decision/evidence-selection.js +71 -0
  229. package/dist/src/runtime/steps/auditor-decision/format.js +44 -2
  230. package/dist/src/runtime/steps/auditor-decision/index.d.ts +3 -0
  231. package/dist/src/runtime/steps/auditor-decision/index.js +3 -0
  232. package/dist/src/runtime/steps/auditor-decision/input.d.ts +2 -2
  233. package/dist/src/runtime/steps/auditor-decision/input.js +64 -20
  234. package/dist/src/runtime/steps/auditor-decision/parser.js +38 -23
  235. package/dist/src/runtime/steps/auditor-decision/projection.js +49 -99
  236. package/dist/src/runtime/steps/auditor-decision/prompt.d.ts +1 -1
  237. package/dist/src/runtime/steps/auditor-decision/prompt.js +9 -4
  238. package/dist/src/runtime/steps/auditor-decision/run.js +79 -47
  239. package/dist/src/runtime/steps/execution-agent/contracts.d.ts +8 -1
  240. package/dist/src/runtime/steps/execution-agent/contracts.js +2 -0
  241. package/dist/src/runtime/steps/execution-agent/decision-parsing.js +4 -0
  242. package/dist/src/runtime/steps/execution-agent/format.js +4 -3
  243. package/dist/src/runtime/steps/execution-agent/input.js +10 -11
  244. package/dist/src/runtime/steps/execution-agent/prompt.d.ts +1 -0
  245. package/dist/src/runtime/steps/execution-agent/prompt.js +11 -4
  246. package/dist/src/runtime/steps/execution-agent/state-context.js +10 -0
  247. package/dist/src/runtime/steps/execution-agent/work-plan-contract.d.ts +18 -0
  248. package/dist/src/runtime/steps/execution-agent/work-plan-contract.js +86 -0
  249. package/dist/src/runtime/steps/execution-agent/work-plan-decision-parsing.d.ts +2 -0
  250. package/dist/src/runtime/steps/execution-agent/work-plan-decision-parsing.js +38 -0
  251. package/dist/src/runtime/steps/execution-agent/work-plan-sources.d.ts +6 -0
  252. package/dist/src/runtime/steps/execution-agent/work-plan-sources.js +54 -0
  253. package/dist/src/runtime/steps/planner-decision/capability-brief.d.ts +40 -0
  254. package/dist/src/runtime/steps/planner-decision/capability-brief.js +47 -0
  255. package/dist/src/runtime/steps/planner-decision/input.d.ts +4 -2
  256. package/dist/src/runtime/steps/planner-decision/input.js +23 -13
  257. package/dist/src/runtime/steps/planner-decision/prompt.js +2 -2
  258. package/dist/src/runtime/steps/planner-decision/run.js +11 -7
  259. package/dist/src/runtime/steps/planner-graph/parser.js +0 -11
  260. package/dist/src/runtime/steps/planner-graph/prompt.js +2 -1
  261. package/dist/src/runtime/steps/supervisor-decision/capability-brief-readmission.d.ts +10 -0
  262. package/dist/src/runtime/steps/supervisor-decision/capability-brief-readmission.js +39 -0
  263. package/dist/src/runtime/steps/supervisor-decision/run.js +2 -1
  264. package/dist/src/runtime/steps/worker-decision/parser/accepted-decision.d.ts +3 -1
  265. package/dist/src/runtime/steps/worker-decision/parser/accepted-decision.js +20 -1
  266. package/dist/src/runtime/steps/worker-decision/parser/capability-batch-validation.d.ts +1 -1
  267. package/dist/src/runtime/steps/worker-decision/parser/capability-batch-validation.js +6 -6
  268. package/dist/src/runtime/steps/worker-decision/parser/capability-invocation-validation.js +2 -1
  269. package/dist/src/sessions/project-binding.d.ts +12 -0
  270. package/dist/src/sessions/project-binding.js +49 -0
  271. package/dist/src/sessions/record/projection.d.ts +6 -1
  272. package/dist/src/sessions/record/projection.js +1 -0
  273. package/dist/src/sessions/session-service.d.ts +2 -1
  274. package/dist/src/sessions/session-service.js +11 -1
  275. package/dist/src/sessions/types.d.ts +7 -0
  276. package/dist/src/shared/directory-authority/bootstrap.d.ts +1 -0
  277. package/dist/src/shared/directory-authority/bootstrap.js +118 -0
  278. package/dist/src/shared/directory-authority/command.d.ts +8 -0
  279. package/dist/src/shared/directory-authority/command.js +27 -0
  280. package/dist/src/shared/directory-authority/errors.d.ts +5 -0
  281. package/dist/src/shared/directory-authority/errors.js +10 -0
  282. package/dist/src/shared/directory-authority/index.d.ts +3 -0
  283. package/dist/src/shared/directory-authority/index.js +3 -0
  284. package/dist/src/shared/directory-authority/protocol.d.ts +11 -0
  285. package/dist/src/shared/directory-authority/protocol.js +62 -0
  286. package/dist/src/shared/directory-authority/task.d.ts +7 -0
  287. package/dist/src/shared/directory-authority/task.js +97 -0
  288. package/dist/src/web-ui/app/ARCHITECTURE.md +121 -1
  289. package/dist/src/web-ui/app/app-bootstrap.js +3 -0
  290. package/dist/src/web-ui/app/app-dom.js +3 -0
  291. package/dist/src/web-ui/app/app-state.js +38 -0
  292. package/dist/src/web-ui/app/app.js +76 -67
  293. package/dist/src/web-ui/app/components/config-workspace/config-model.js +23 -3
  294. package/dist/src/web-ui/app/components/config-workspace/dashboard-rendering.js +2 -0
  295. package/dist/src/web-ui/app/components/config-workspace/field-rendering.js +2 -0
  296. package/dist/src/web-ui/app/components/config-workspace/model-rendering.js +6 -0
  297. package/dist/src/web-ui/app/components/config-workspace/model-setup-entry.js +27 -0
  298. package/dist/src/web-ui/app/components/config-workspace/raw-config-repair.js +28 -0
  299. package/dist/src/web-ui/app/components/config-workspace/workspace-events.js +5 -0
  300. package/dist/src/web-ui/app/components/config-workspace/workspace-mutations.js +23 -3
  301. package/dist/src/web-ui/app/components/config-workspace/workspace-persistence.js +26 -8
  302. package/dist/src/web-ui/app/components/config-workspace/workspace-view.js +56 -0
  303. package/dist/src/web-ui/app/components/config-workspace.js +11 -0
  304. package/dist/src/web-ui/app/components/conversation-activity.d.ts +6 -0
  305. package/dist/src/web-ui/app/components/conversation-activity.js +10 -2
  306. package/dist/src/web-ui/app/components/conversation-file-action.js +33 -0
  307. package/dist/src/web-ui/app/components/conversation-file-focus.d.ts +12 -0
  308. package/dist/src/web-ui/app/components/conversation-file-focus.js +149 -0
  309. package/dist/src/web-ui/app/components/conversation-file-preview.d.ts +23 -0
  310. package/dist/src/web-ui/app/components/conversation-file-preview.js +247 -0
  311. package/dist/src/web-ui/app/components/conversation-role-cards.d.ts +6 -0
  312. package/dist/src/web-ui/app/components/conversation-role-cards.js +10 -2
  313. package/dist/src/web-ui/app/components/conversation-tool-evidence.d.ts +9 -0
  314. package/dist/src/web-ui/app/components/conversation-tool-evidence.js +129 -0
  315. package/dist/src/web-ui/app/components/conversation-tools.d.ts +6 -0
  316. package/dist/src/web-ui/app/components/conversation-tools.js +25 -105
  317. package/dist/src/web-ui/app/components/conversation-view.js +10 -1
  318. package/dist/src/web-ui/app/components/dashboard/workspace.js +19 -7
  319. package/dist/src/web-ui/app/components/model-setup/rendering.js +99 -0
  320. package/dist/src/web-ui/app/components/model-setup/save-flow.js +111 -0
  321. package/dist/src/web-ui/app/components/model-setup/save-outcome.js +16 -0
  322. package/dist/src/web-ui/app/components/model-setup/validation.js +125 -0
  323. package/dist/src/web-ui/app/components/model-setup/wizard.d.ts +44 -0
  324. package/dist/src/web-ui/app/components/model-setup/wizard.js +370 -0
  325. package/dist/src/web-ui/app/components/plugins/manager.js +200 -0
  326. package/dist/src/web-ui/app/components/plugins/rendering.js +124 -0
  327. package/dist/src/web-ui/app/components/plugins/view-state.js +123 -0
  328. package/dist/src/web-ui/app/components/project-creation.js +119 -0
  329. package/dist/src/web-ui/app/components/project-session-groups.js +95 -0
  330. package/dist/src/web-ui/app/components/runtime-config-activation.js +83 -0
  331. package/dist/src/web-ui/app/components/runtime-setup/bridge-guide.d.ts +9 -0
  332. package/dist/src/web-ui/app/components/runtime-setup/bridge-guide.js +198 -0
  333. package/dist/src/web-ui/app/components/runtime-setup/bridge-rendering.js +107 -0
  334. package/dist/src/web-ui/app/components/runtime-setup/commands.js +54 -0
  335. package/dist/src/web-ui/app/components/runtime-setup/configuration-recovery.js +25 -0
  336. package/dist/src/web-ui/app/components/runtime-setup/connection-form.js +154 -0
  337. package/dist/src/web-ui/app/components/runtime-setup/connection-state.js +71 -0
  338. package/dist/src/web-ui/app/components/runtime-setup/context-window.js +18 -0
  339. package/dist/src/web-ui/app/components/runtime-setup/embedding-credential-status.d.ts +15 -0
  340. package/dist/src/web-ui/app/components/runtime-setup/embedding-credential-status.js +87 -0
  341. package/dist/src/web-ui/app/components/runtime-setup/embedding-provider-receipt.js +30 -0
  342. package/dist/src/web-ui/app/components/runtime-setup/embedding-rendering.js +57 -0
  343. package/dist/src/web-ui/app/components/runtime-setup/embedding.js +284 -0
  344. package/dist/src/web-ui/app/components/runtime-setup/optional-steps.js +117 -0
  345. package/dist/src/web-ui/app/components/runtime-setup/plugins.js +173 -0
  346. package/dist/src/web-ui/app/components/runtime-setup/rendering.js +141 -0
  347. package/dist/src/web-ui/app/components/runtime-setup/validation.js +69 -0
  348. package/dist/src/web-ui/app/components/runtime-setup/view-state.js +58 -0
  349. package/dist/src/web-ui/app/components/runtime-setup/wizard-shell.js +27 -0
  350. package/dist/src/web-ui/app/components/runtime-setup-guide.d.ts +66 -5
  351. package/dist/src/web-ui/app/components/runtime-setup-guide.js +415 -461
  352. package/dist/src/web-ui/app/components/system-host/download.js +38 -0
  353. package/dist/src/web-ui/app/components/system-host/manager.js +249 -0
  354. package/dist/src/web-ui/app/components/system-host/rendering.js +88 -0
  355. package/dist/src/web-ui/app/components/system-host/setup-notice.js +87 -0
  356. package/dist/src/web-ui/app/components/system-host/visibility.js +35 -0
  357. package/dist/src/web-ui/app/components/tool-approval-card.d.ts +4 -0
  358. package/dist/src/web-ui/app/components/tool-approval-card.js +15 -0
  359. package/dist/src/web-ui/app/configuration-environment-refresh.js +118 -0
  360. package/dist/src/web-ui/app/configuration-feature.js +125 -4
  361. package/dist/src/web-ui/app/controllers/app-event-bindings.js +2 -0
  362. package/dist/src/web-ui/app/controllers/composer-workspace-controller.d.ts +1 -0
  363. package/dist/src/web-ui/app/controllers/composer-workspace-controller.js +4 -3
  364. package/dist/src/web-ui/app/controllers/conversation-file-preview-controller.d.ts +24 -0
  365. package/dist/src/web-ui/app/controllers/conversation-file-preview-controller.js +158 -0
  366. package/dist/src/web-ui/app/controllers/conversation-file-preview-feature.d.ts +19 -0
  367. package/dist/src/web-ui/app/controllers/conversation-file-preview-feature.js +63 -0
  368. package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +1 -0
  369. package/dist/src/web-ui/app/controllers/conversation-session-controller.js +2 -0
  370. package/dist/src/web-ui/app/controllers/conversation-view-feature.js +28 -0
  371. package/dist/src/web-ui/app/controllers/dashboard-controller.js +17 -0
  372. package/dist/src/web-ui/app/controllers/projects-controller.d.ts +45 -0
  373. package/dist/src/web-ui/app/controllers/projects-controller.js +278 -0
  374. package/dist/src/web-ui/app/controllers/realtime-event-controller.js +3 -0
  375. package/dist/src/web-ui/app/controllers/runtime-onboarding-controller.js +13 -6
  376. package/dist/src/web-ui/app/controllers/runtime-selection-controller.d.ts +7 -1
  377. package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +11 -95
  378. package/dist/src/web-ui/app/controllers/session-controller.js +64 -57
  379. package/dist/src/web-ui/app/controllers/tool-permission-mode-controller.d.ts +20 -0
  380. package/dist/src/web-ui/app/controllers/tool-permission-mode-controller.js +116 -0
  381. package/dist/src/web-ui/app/dashboard-feature.js +32 -10
  382. package/dist/src/web-ui/app/index.html +44 -7
  383. package/dist/src/web-ui/app/lib/conversation-file-preview.d.ts +12 -0
  384. package/dist/src/web-ui/app/lib/conversation-file-reference.d.ts +30 -0
  385. package/dist/src/web-ui/app/lib/conversation-file-reference.js +66 -0
  386. package/dist/src/web-ui/app/lib/tool-activity-event.d.ts +2 -0
  387. package/dist/src/web-ui/app/lib/tool-activity-event.js +18 -6
  388. package/dist/src/web-ui/app/lib/tool-activity-model.d.ts +2 -0
  389. package/dist/src/web-ui/app/lib/tool-activity-model.js +4 -2
  390. package/dist/src/web-ui/app/lib/tool-permission-mode.d.ts +16 -0
  391. package/dist/src/web-ui/app/lib/tool-permission-mode.js +60 -0
  392. package/dist/src/web-ui/app/lib/tool-process-activity-fields.js +102 -0
  393. package/dist/src/web-ui/app/projects-feature.js +134 -0
  394. package/dist/src/web-ui/app/runtime-onboarding-feature.d.ts +34 -0
  395. package/dist/src/web-ui/app/runtime-onboarding-feature.js +92 -0
  396. package/dist/src/web-ui/app/runtime-setup-page-lifecycle.d.ts +5 -0
  397. package/dist/src/web-ui/app/runtime-setup-page-lifecycle.js +13 -0
  398. package/dist/src/web-ui/app/services/client-preferences.d.ts +24 -0
  399. package/dist/src/web-ui/app/services/client-preferences.js +32 -19
  400. package/dist/src/web-ui/app/services/runtime-web-client/configuration.js +46 -0
  401. package/dist/src/web-ui/app/services/runtime-web-client/conversation-files.d.ts +28 -0
  402. package/dist/src/web-ui/app/services/runtime-web-client/conversation-files.js +75 -0
  403. package/dist/src/web-ui/app/services/runtime-web-client/projects.d.ts +19 -0
  404. package/dist/src/web-ui/app/services/runtime-web-client/projects.js +34 -0
  405. package/dist/src/web-ui/app/services/runtime-web-client/system-host.js +27 -0
  406. package/dist/src/web-ui/app/services/runtime-web-client.d.ts +52 -0
  407. package/dist/src/web-ui/app/services/runtime-web-client.js +35 -4
  408. package/dist/src/web-ui/app/styles/13-projects.css +272 -0
  409. package/dist/src/web-ui/app/styles/18-dashboard.css +0 -5
  410. package/dist/src/web-ui/app/styles/19-runtime-setup.css +411 -0
  411. package/dist/src/web-ui/app/styles/20-chat-composer.css +0 -384
  412. package/dist/src/web-ui/app/styles/29-conversation-file-preview.css +254 -0
  413. package/dist/src/web-ui/app/styles/37-runtime-activation.css +26 -0
  414. package/dist/src/web-ui/app/styles/38-schedule-workspace.css +1 -10
  415. package/dist/src/web-ui/app/styles/41-plugin-management.css +351 -0
  416. package/dist/src/web-ui/app/styles/42-runtime-setup-plugins.css +179 -0
  417. package/dist/src/web-ui/app/styles/43-model-setup.css +73 -0
  418. package/dist/src/web-ui/app/styles/44-model-provider-cards.css +63 -0
  419. package/dist/src/web-ui/app/styles/45-bridge-setup.css +44 -0
  420. package/dist/src/web-ui/app/styles/46-system-host.css +132 -0
  421. package/dist/src/web-ui/app/styles.css +10 -0
  422. package/dist/src/web-ui/config-dashboard-backend.d.ts +5 -0
  423. package/dist/src/web-ui/config-dashboard-backend.js +94 -114
  424. package/dist/src/web-ui/config-dashboard-model-identity.d.ts +7 -0
  425. package/dist/src/web-ui/config-dashboard-model-identity.js +45 -0
  426. package/dist/src/web-ui/config-dashboard-save-transaction.d.ts +5 -0
  427. package/dist/src/web-ui/config-dashboard-save-transaction.js +21 -0
  428. package/dist/src/web-ui/environment-config.d.ts +17 -0
  429. package/dist/src/web-ui/environment-config.js +60 -0
  430. package/dist/src/web-ui/forwarded-loopback-policy.d.ts +2 -0
  431. package/dist/src/web-ui/forwarded-loopback-policy.js +14 -0
  432. package/dist/src/web-ui/local-runtime/api-router.d.ts +7 -0
  433. package/dist/src/web-ui/local-runtime/api-router.js +136 -12
  434. package/dist/src/web-ui/local-runtime/config-mutation-request.d.ts +8 -0
  435. package/dist/src/web-ui/local-runtime/config-mutation-request.js +55 -0
  436. package/dist/src/web-ui/local-runtime/configuration-activation-environments.d.ts +22 -0
  437. package/dist/src/web-ui/local-runtime/configuration-activation-environments.js +106 -0
  438. package/dist/src/web-ui/local-runtime/configuration-activation-source.d.ts +7 -0
  439. package/dist/src/web-ui/local-runtime/configuration-activation-source.js +36 -0
  440. package/dist/src/web-ui/local-runtime/configuration-activation.d.ts +20 -0
  441. package/dist/src/web-ui/local-runtime/configuration-activation.js +107 -0
  442. package/dist/src/web-ui/local-runtime/contracts.d.ts +8 -0
  443. package/dist/src/web-ui/local-runtime/conversation-file-access.d.ts +30 -0
  444. package/dist/src/web-ui/local-runtime/conversation-file-access.js +131 -0
  445. package/dist/src/web-ui/local-runtime/conversation-file-content.d.ts +21 -0
  446. package/dist/src/web-ui/local-runtime/conversation-file-content.js +75 -0
  447. package/dist/src/web-ui/local-runtime/conversation-file-format.d.ts +12 -0
  448. package/dist/src/web-ui/local-runtime/conversation-file-format.js +87 -0
  449. package/dist/src/web-ui/local-runtime/conversation-file-native-open.d.ts +10 -0
  450. package/dist/src/web-ui/local-runtime/conversation-file-native-open.js +94 -0
  451. package/dist/src/web-ui/local-runtime/conversation-file-native-request.d.ts +4 -0
  452. package/dist/src/web-ui/local-runtime/conversation-file-native-request.js +72 -0
  453. package/dist/src/web-ui/local-runtime/conversation-file-routes.d.ts +11 -0
  454. package/dist/src/web-ui/local-runtime/conversation-file-routes.js +105 -0
  455. package/dist/src/web-ui/local-runtime/conversation-file-target.d.ts +14 -0
  456. package/dist/src/web-ui/local-runtime/conversation-file-target.js +158 -0
  457. package/dist/src/web-ui/local-runtime/environment-registry.d.ts +14 -0
  458. package/dist/src/web-ui/local-runtime/environment-registry.js +121 -6
  459. package/dist/src/web-ui/local-runtime/memory-onboarding-routes.d.ts +2 -1
  460. package/dist/src/web-ui/local-runtime/memory-onboarding-routes.js +15 -10
  461. package/dist/src/web-ui/local-runtime/model-setup-catalog.d.ts +17 -0
  462. package/dist/src/web-ui/local-runtime/model-setup-catalog.js +45 -0
  463. package/dist/src/web-ui/local-runtime/model-setup-identity.d.ts +16 -0
  464. package/dist/src/web-ui/local-runtime/model-setup-identity.js +20 -0
  465. package/dist/src/web-ui/local-runtime/model-setup-input.d.ts +24 -0
  466. package/dist/src/web-ui/local-runtime/model-setup-input.js +107 -0
  467. package/dist/src/web-ui/local-runtime/model-setup-provider.d.ts +17 -0
  468. package/dist/src/web-ui/local-runtime/model-setup-provider.js +68 -0
  469. package/dist/src/web-ui/local-runtime/model-setup-retry.d.ts +14 -0
  470. package/dist/src/web-ui/local-runtime/model-setup-retry.js +47 -0
  471. package/dist/src/web-ui/local-runtime/model-setup-routes.d.ts +12 -0
  472. package/dist/src/web-ui/local-runtime/model-setup-routes.js +50 -0
  473. package/dist/src/web-ui/local-runtime/model-setup-service.d.ts +30 -0
  474. package/dist/src/web-ui/local-runtime/model-setup-service.js +93 -0
  475. package/dist/src/web-ui/local-runtime/model-setup-validation.d.ts +5 -0
  476. package/dist/src/web-ui/local-runtime/model-setup-validation.js +33 -0
  477. package/dist/src/web-ui/local-runtime/plugin-management-routes.d.ts +14 -0
  478. package/dist/src/web-ui/local-runtime/plugin-management-routes.js +50 -0
  479. package/dist/src/web-ui/local-runtime/project-routes.d.ts +17 -0
  480. package/dist/src/web-ui/local-runtime/project-routes.js +93 -0
  481. package/dist/src/web-ui/local-runtime/provider-credential-identity.d.ts +3 -0
  482. package/dist/src/web-ui/local-runtime/provider-credential-identity.js +18 -0
  483. package/dist/src/web-ui/local-runtime/request-execution.d.ts +1 -0
  484. package/dist/src/web-ui/local-runtime/request-execution.js +8 -0
  485. package/dist/src/web-ui/local-runtime/runtime-availability.js +36 -7
  486. package/dist/src/web-ui/local-runtime/runtime-setup-completion.d.ts +13 -0
  487. package/dist/src/web-ui/local-runtime/runtime-setup-completion.js +28 -0
  488. package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.d.ts +13 -0
  489. package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.js +110 -0
  490. package/dist/src/web-ui/local-runtime/runtime-setup-credential-completion.d.ts +4 -0
  491. package/dist/src/web-ui/local-runtime/runtime-setup-credential-completion.js +21 -0
  492. package/dist/src/web-ui/local-runtime/runtime-setup-credentials.d.ts +14 -0
  493. package/dist/src/web-ui/local-runtime/runtime-setup-credentials.js +148 -0
  494. package/dist/src/web-ui/local-runtime/runtime-setup-draft-recovery.d.ts +7 -0
  495. package/dist/src/web-ui/local-runtime/runtime-setup-draft-recovery.js +18 -0
  496. package/dist/src/web-ui/local-runtime/runtime-setup-draft.d.ts +21 -0
  497. package/dist/src/web-ui/local-runtime/runtime-setup-draft.js +105 -0
  498. package/dist/src/web-ui/local-runtime/runtime-setup-embedding-invalidation.d.ts +8 -0
  499. package/dist/src/web-ui/local-runtime/runtime-setup-embedding-invalidation.js +40 -0
  500. package/dist/src/web-ui/local-runtime/runtime-setup-environment-assignment.d.ts +1 -0
  501. package/dist/src/web-ui/local-runtime/runtime-setup-environment-assignment.js +27 -0
  502. package/dist/src/web-ui/local-runtime/runtime-setup-input.d.ts +19 -0
  503. package/dist/src/web-ui/local-runtime/runtime-setup-input.js +82 -0
  504. package/dist/src/web-ui/local-runtime/runtime-setup-model-file.d.ts +7 -0
  505. package/dist/src/web-ui/local-runtime/runtime-setup-model-file.js +35 -0
  506. package/dist/src/web-ui/local-runtime/runtime-setup-provider-ownership-recovery.d.ts +4 -0
  507. package/dist/src/web-ui/local-runtime/runtime-setup-provider-ownership-recovery.js +23 -0
  508. package/dist/src/web-ui/local-runtime/runtime-setup-provider-retention.d.ts +11 -0
  509. package/dist/src/web-ui/local-runtime/runtime-setup-provider-retention.js +31 -0
  510. package/dist/src/web-ui/local-runtime/runtime-setup-provider.d.ts +11 -0
  511. package/dist/src/web-ui/local-runtime/runtime-setup-provider.js +60 -0
  512. package/dist/src/web-ui/local-runtime/runtime-setup-receipt-file.d.ts +8 -0
  513. package/dist/src/web-ui/local-runtime/runtime-setup-receipt-file.js +77 -0
  514. package/dist/src/web-ui/local-runtime/runtime-setup-routes.d.ts +35 -0
  515. package/dist/src/web-ui/local-runtime/runtime-setup-routes.js +56 -0
  516. package/dist/src/web-ui/local-runtime/runtime-setup-scaffold.d.ts +17 -0
  517. package/dist/src/web-ui/local-runtime/runtime-setup-scaffold.js +229 -0
  518. package/dist/src/web-ui/local-runtime/runtime-setup-service.d.ts +65 -0
  519. package/dist/src/web-ui/local-runtime/runtime-setup-service.js +195 -0
  520. package/dist/src/web-ui/local-runtime/runtime-setup-validation.d.ts +8 -0
  521. package/dist/src/web-ui/local-runtime/runtime-setup-validation.js +35 -0
  522. package/dist/src/web-ui/local-runtime/saved-model-catalog.d.ts +3 -0
  523. package/dist/src/web-ui/local-runtime/saved-model-catalog.js +20 -0
  524. package/dist/src/web-ui/local-runtime/setup-embedding-input.d.ts +8 -0
  525. package/dist/src/web-ui/local-runtime/setup-embedding-input.js +71 -0
  526. package/dist/src/web-ui/local-runtime/setup-embedding-provider.d.ts +13 -0
  527. package/dist/src/web-ui/local-runtime/setup-embedding-provider.js +114 -0
  528. package/dist/src/web-ui/local-runtime/setup-embedding-routes.d.ts +12 -0
  529. package/dist/src/web-ui/local-runtime/setup-embedding-routes.js +53 -0
  530. package/dist/src/web-ui/local-runtime/setup-embedding-service.d.ts +32 -0
  531. package/dist/src/web-ui/local-runtime/setup-embedding-service.js +59 -0
  532. package/dist/src/web-ui/local-runtime-backend.d.ts +1 -0
  533. package/dist/src/web-ui/local-runtime-backend.js +3 -0
  534. package/dist/src/web-ui/plugin-capability-selection.d.ts +14 -0
  535. package/dist/src/web-ui/plugin-capability-selection.js +48 -0
  536. package/dist/src/web-ui/plugin-management-catalog.d.ts +26 -0
  537. package/dist/src/web-ui/plugin-management-catalog.js +56 -0
  538. package/dist/src/web-ui/plugin-management-selection.d.ts +16 -0
  539. package/dist/src/web-ui/plugin-management-selection.js +71 -0
  540. package/dist/src/web-ui/plugin-management-service.d.ts +29 -0
  541. package/dist/src/web-ui/plugin-management-service.js +150 -0
  542. package/dist/src/web-ui/request-authority.d.ts +8 -0
  543. package/dist/src/web-ui/request-authority.js +129 -0
  544. package/dist/src/web-ui/runtime-setup-gateway-address.d.ts +3 -0
  545. package/dist/src/web-ui/runtime-setup-gateway-address.js +26 -0
  546. package/dist/src/web-ui/runtime-setup-gateway.d.ts +29 -0
  547. package/dist/src/web-ui/runtime-setup-gateway.js +177 -0
  548. package/dist/src/web-ui/runtime-setup-shutdown.d.ts +2 -0
  549. package/dist/src/web-ui/runtime-setup-shutdown.js +20 -0
  550. package/dist/src/web-ui/server.d.ts +7 -14
  551. package/dist/src/web-ui/server.js +53 -63
  552. package/dist/src/web-ui/session-read-state/service.d.ts +12 -2
  553. package/dist/src/web-ui/system-host-service.d.ts +19 -0
  554. package/dist/src/web-ui/system-host-service.js +159 -0
  555. package/dist/src/web-ui/system-host-setup/companion-bundle.d.ts +2 -0
  556. package/dist/src/web-ui/system-host-setup/companion-bundle.js +12 -0
  557. package/dist/src/web-ui/system-host-setup/companion-macos.d.ts +2 -0
  558. package/dist/src/web-ui/system-host-setup/companion-macos.js +74 -0
  559. package/dist/src/web-ui/system-host-setup/companion-windows.d.ts +2 -0
  560. package/dist/src/web-ui/system-host-setup/companion-windows.js +105 -0
  561. package/dist/src/web-ui/system-host-setup/installer-contract.d.ts +18 -0
  562. package/dist/src/web-ui/system-host-setup/installer-contract.js +51 -0
  563. package/dist/src/web-ui/system-host-setup/installers.d.ts +6 -0
  564. package/dist/src/web-ui/system-host-setup/installers.js +30 -0
  565. package/dist/src/web-ui/system-host-setup/native-authorization.d.ts +3 -0
  566. package/dist/src/web-ui/system-host-setup/native-authorization.js +11 -0
  567. package/dist/src/web-ui/system-host-setup/node-distribution.d.ts +19 -0
  568. package/dist/src/web-ui/system-host-setup/node-distribution.js +9 -0
  569. package/dist/src/web-ui/system-host-setup/readiness.d.ts +18 -0
  570. package/dist/src/web-ui/system-host-setup/readiness.js +70 -0
  571. package/dist/src/web-ui/system-host-setup/routes.d.ts +20 -0
  572. package/dist/src/web-ui/system-host-setup/routes.js +121 -0
  573. package/dist/src/web-ui/system-host-setup/windows-script-wrapper.d.ts +2 -0
  574. package/dist/src/web-ui/system-host-setup/windows-script-wrapper.js +17 -0
  575. package/dist/src/web-ui/system-host-setup/wsl-interop-config.d.ts +3 -0
  576. package/dist/src/web-ui/system-host-setup/wsl-interop-config.js +67 -0
  577. package/dist/src/web-ui/system-host-setup/wsl-interop-windows.d.ts +1 -0
  578. package/dist/src/web-ui/system-host-setup/wsl-interop-windows.js +49 -0
  579. package/dist/src/web-ui/system-host-upgrade-authority.d.ts +5 -0
  580. package/dist/src/web-ui/system-host-upgrade-authority.js +13 -0
  581. package/docs/architecture.md +6 -1
  582. package/docs/installation.md +53 -17
  583. package/docs/known-limitations.md +14 -0
  584. package/docs/plugins.md +137 -26
  585. package/docs/projects-and-full-plus.md +218 -0
  586. package/docs/runtime-invariant-coverage.md +6 -3
  587. package/docs/runtime-prompt-policy-contracts.md +37 -5
  588. package/docs/runtime-public-contracts.md +17 -0
  589. package/package.json +5 -2
  590. package/plugins/exec/plugin.json +30 -9
  591. package/plugins/exec/skills/exec_process_skill/SKILL.md +1 -0
  592. package/plugins/exec/skills/exec_skill/SKILL.md +9 -10
  593. package/plugins/exec/source/handlers.ts +4 -38
  594. package/plugins/exec/source/paths.ts +53 -49
  595. package/plugins/exec/source/process-manager.ts +1 -20
  596. package/plugins/exec/source/shell-platform.ts +29 -0
  597. package/plugins/exec/source/types.ts +6 -4
  598. package/plugins/exec/source/validation.ts +33 -198
  599. package/plugins/exec/src/index.cjs +87 -222
  600. package/plugins/filesystem/plugin.json +1 -1
  601. package/plugins/filesystem/skills/dev_view_skill/SKILL.md +7 -0
  602. package/plugins/filesystem/source/atomic-write.ts +15 -3
  603. package/plugins/filesystem/source/bounded-io.ts +5 -99
  604. package/plugins/filesystem/source/dev-view.ts +2 -1
  605. package/plugins/filesystem/source/directory-authority-write.ts +68 -0
  606. package/plugins/filesystem/source/directory-sample-task.ts +23 -0
  607. package/plugins/filesystem/source/directory-sample.ts +132 -0
  608. package/plugins/filesystem/source/directory-write-task.ts +160 -0
  609. package/plugins/filesystem/source/edit-file.ts +3 -0
  610. package/plugins/filesystem/source/file-output-presentation.ts +42 -0
  611. package/plugins/filesystem/source/mutation-parent.ts +29 -9
  612. package/plugins/filesystem/source/view-locator.ts +141 -0
  613. package/plugins/filesystem/source/view-window.ts +12 -25
  614. package/plugins/filesystem/source/write-file.ts +8 -0
  615. package/plugins/filesystem/src/index.cjs +855 -153
  616. package/plugins/local-search/source/index.ts +2 -0
  617. package/plugins/local-search/source/paths.ts +30 -7
  618. package/plugins/local-search/source/ripgrep-process.ts +69 -0
  619. package/plugins/local-search/source/ripgrep.ts +19 -23
  620. package/plugins/local-search/src/index.cjs +295 -32
  621. package/plugins/system/plugin.json +374 -0
  622. package/plugins/system/skills/system_actions/SKILL.md +31 -0
  623. package/plugins/system/source/application-catalog.ts +237 -0
  624. package/plugins/system/source/application-launch.ts +113 -0
  625. package/plugins/system/source/application-observation.ts +78 -0
  626. package/plugins/system/source/commands.ts +106 -0
  627. package/plugins/system/source/companion/autostart.ts +185 -0
  628. package/plugins/system/source/companion/broker-client.ts +183 -0
  629. package/plugins/system/source/companion/broker-location.ts +89 -0
  630. package/plugins/system/source/companion/broker-server.ts +169 -0
  631. package/plugins/system/source/companion/connection.ts +211 -0
  632. package/plugins/system/source/companion/liveness.ts +23 -0
  633. package/plugins/system/source/companion/native-address.ts +55 -0
  634. package/plugins/system/source/companion/native-identity.ts +26 -0
  635. package/plugins/system/source/companion/native-messages.ts +100 -0
  636. package/plugins/system/source/companion/native-session.ts +268 -0
  637. package/plugins/system/source/companion/native-state.ts +135 -0
  638. package/plugins/system/source/companion/native-supervisor.ts +98 -0
  639. package/plugins/system/source/companion/pairing-store.ts +110 -0
  640. package/plugins/system/source/companion/private-store.ts +58 -0
  641. package/plugins/system/source/companion/process-owner-identity.ts +190 -0
  642. package/plugins/system/source/companion/protocol.ts +108 -0
  643. package/plugins/system/source/contracts.ts +44 -0
  644. package/plugins/system/source/elevation.ts +88 -0
  645. package/plugins/system/source/handlers.ts +120 -0
  646. package/plugins/system/source/host-dispatch.ts +106 -0
  647. package/plugins/system/source/host-evidence.ts +72 -0
  648. package/plugins/system/source/host-observation.ts +66 -0
  649. package/plugins/system/source/index.ts +8 -0
  650. package/plugins/system/source/process-result.ts +111 -0
  651. package/plugins/system/source/process-runner.ts +104 -0
  652. package/plugins/system/source/request-system-modules.ts +117 -0
  653. package/plugins/system/source/request-target-snapshot.ts +163 -0
  654. package/plugins/system/source/target-observation.ts +43 -0
  655. package/plugins/system/source/targets.ts +147 -0
  656. package/plugins/system/src/index.cjs +1730 -0
  657. package/src/runtime/README.md +36 -8
  658. package/src/runtime/local-host/README.md +7 -0
  659. package/dist/src/runtime/steps/planner-decision/capability-catalog-context.d.ts +0 -14
  660. package/dist/src/runtime/steps/planner-decision/capability-catalog-context.js +0 -87
@@ -253,13 +253,13 @@ var writeFileAdapter = Object.freeze({
253
253
  });
254
254
 
255
255
  // plugins/filesystem/source/dev-view.ts
256
- var import_promises2 = require("node:fs/promises");
256
+ var import_promises3 = require("node:fs/promises");
257
257
 
258
258
  // plugins/filesystem/source/bounded-io.ts
259
259
  var import_node_crypto = require("node:crypto");
260
- var import_node_fs = require("node:fs");
261
- var import_promises = require("node:fs/promises");
262
- var import_node_path = require("node:path");
260
+ var import_node_fs2 = require("node:fs");
261
+ var import_promises2 = require("node:fs/promises");
262
+ var import_node_path3 = require("node:path");
263
263
  var import_node_string_decoder = require("node:string_decoder");
264
264
  var import_node_util = require("node:util");
265
265
 
@@ -302,12 +302,462 @@ function rethrowFilesystemError(error, operation, logicalPath) {
302
302
  );
303
303
  }
304
304
 
305
+ // plugins/filesystem/source/directory-sample.ts
306
+ var import_node_fs = require("node:fs");
307
+ var import_promises = require("node:fs/promises");
308
+ var import_node_path2 = require("node:path");
309
+
310
+ // src/shared/directory-authority/bootstrap.ts
311
+ function directoryAuthorityBootstrap(mode, messageLimit, task) {
312
+ const fs = require("node:fs");
313
+ function fail2(code, message) {
314
+ throw Object.assign(new Error(message), { code });
315
+ }
316
+ function verifyDirectoryAuthority() {
317
+ const expected = fs.fstatSync(3, { bigint: true });
318
+ const actual = fs.statSync(".", { bigint: true });
319
+ const matchesHeldDirectory = expected.isDirectory() && actual.isDirectory() && expected.dev === actual.dev && expected.ino === actual.ino;
320
+ if (matchesHeldDirectory) return;
321
+ fail2(
322
+ "directory_authority_changed",
323
+ "The directory changed before the operation could establish its authority."
324
+ );
325
+ }
326
+ function readRequest() {
327
+ const fd = mode === "task" ? 0 : 4;
328
+ const chunk = Buffer.alloc(64 * 1024);
329
+ const chunks = [];
330
+ let total = 0;
331
+ for (; ; ) {
332
+ const length = fs.readSync(fd, chunk, 0, chunk.length, null);
333
+ if (length === 0) break;
334
+ total += length;
335
+ if (total > messageLimit) {
336
+ fail2(
337
+ "directory_authority_request_too_large",
338
+ "The directory operation input exceeds the bridge byte limit."
339
+ );
340
+ }
341
+ chunks.push(Buffer.from(chunk.subarray(0, length)));
342
+ }
343
+ return JSON.parse(Buffer.concat(chunks).toString("utf8"));
344
+ }
345
+ function reportFailure(error) {
346
+ const detail = error;
347
+ const code = typeof detail?.code === "string" ? detail.code.slice(0, 256) : "directory_authority_failed";
348
+ const message = typeof detail?.message === "string" ? detail.message.slice(0, 4096) : "The directory operation failed.";
349
+ let encoded;
350
+ try {
351
+ encoded = JSON.stringify({
352
+ ok: false,
353
+ error: { code, message, data: detail?.data }
354
+ });
355
+ if (Buffer.byteLength(encoded) > messageLimit) throw new Error();
356
+ } catch {
357
+ encoded = JSON.stringify({ ok: false, error: { code, message } });
358
+ }
359
+ writeResponse(mode === "task" ? 1 : 2, encoded);
360
+ process.exitCode = mode === "task" ? 0 : 125;
361
+ }
362
+ function writeResponse(fd, encoded) {
363
+ const bytes = Buffer.from(encoded);
364
+ let offset = 0;
365
+ while (offset < bytes.length) {
366
+ offset += fs.writeSync(fd, bytes, offset, bytes.length - offset);
367
+ }
368
+ }
369
+ async function runTask(input) {
370
+ if (!task)
371
+ fail2("directory_authority_failed", "The directory task is missing.");
372
+ const result = await task(input);
373
+ const encoded = JSON.stringify({ ok: true, result });
374
+ if (Buffer.byteLength(encoded) > messageLimit) {
375
+ fail2(
376
+ "directory_authority_result_too_large",
377
+ "The directory operation result exceeds the bridge byte limit."
378
+ );
379
+ }
380
+ writeResponse(1, encoded);
381
+ }
382
+ function runCommand(input) {
383
+ const { spawn: spawn2 } = require("node:child_process");
384
+ const command = input;
385
+ const child = spawn2(command.command, command.args, {
386
+ stdio: ["ignore", "inherit", "inherit"],
387
+ env: process.env
388
+ });
389
+ child.once("error", reportFailure);
390
+ child.once("exit", (code, signal) => {
391
+ if (signal) {
392
+ process.kill(process.pid, signal);
393
+ return;
394
+ }
395
+ if (typeof code === "number") process.exitCode = code;
396
+ });
397
+ }
398
+ try {
399
+ verifyDirectoryAuthority();
400
+ const input = readRequest();
401
+ if (mode === "command") {
402
+ runCommand(input);
403
+ return;
404
+ }
405
+ void runTask(input).catch(reportFailure);
406
+ } catch (error) {
407
+ reportFailure(error);
408
+ }
409
+ }
410
+ function directoryAuthorityScript(mode, messageLimit, task) {
411
+ const taskSource = task ? `(${task.toString()})` : "undefined";
412
+ const preserveFunctionName = "const __name=(target,value)=>Object.defineProperty(target,'name',{value,configurable:true});";
413
+ return `${preserveFunctionName}(${directoryAuthorityBootstrap.toString()})(${JSON.stringify(mode)},${messageLimit},${taskSource});`;
414
+ }
415
+
416
+ // src/shared/directory-authority/protocol.ts
417
+ var import_node_path = require("node:path");
418
+
419
+ // src/shared/directory-authority/errors.ts
420
+ var DirectoryAuthorityError = class extends Error {
421
+ constructor(code, message, data) {
422
+ super(message);
423
+ this.code = code;
424
+ this.data = data;
425
+ this.name = "DirectoryAuthorityError";
426
+ }
427
+ code;
428
+ data;
429
+ };
430
+
431
+ // src/shared/directory-authority/protocol.ts
432
+ var AUTHORITY_MESSAGE_LIMIT = 8 * 1024 * 1024;
433
+ var AUTHORITY_STDERR_LIMIT = 16 * 1024;
434
+ var AUTHORITY_TASK_TIMEOUT_MS = 3e4;
435
+ function assertDirectoryAuthorityLocation(location) {
436
+ if (!(0, import_node_path.isAbsolute)(location.directoryPath)) {
437
+ throw new DirectoryAuthorityError(
438
+ "directory_authority_invalid_path",
439
+ "The directory authority requires an absolute starting path."
440
+ );
441
+ }
442
+ const hasOpenDescriptorNumber = Number.isInteger(location.directoryFd) && location.directoryFd >= 0;
443
+ if (hasOpenDescriptorNumber) return;
444
+ throw new DirectoryAuthorityError(
445
+ "directory_authority_invalid_fd",
446
+ "The directory authority requires an open directory descriptor."
447
+ );
448
+ }
449
+ function authorityEnvironment(environment = process.env) {
450
+ const sanitized = { ...environment };
451
+ delete sanitized.NODE_OPTIONS;
452
+ delete sanitized.NODE_PATH;
453
+ return sanitized;
454
+ }
455
+ function encodeAuthorityRequest(input) {
456
+ let encoded;
457
+ try {
458
+ encoded = JSON.stringify(input);
459
+ } catch {
460
+ throw new DirectoryAuthorityError(
461
+ "directory_authority_invalid_request",
462
+ "The directory operation input must be JSON serializable."
463
+ );
464
+ }
465
+ if (encoded === void 0) {
466
+ throw new DirectoryAuthorityError(
467
+ "directory_authority_invalid_request",
468
+ "The directory operation input must be JSON serializable."
469
+ );
470
+ }
471
+ if (Buffer.byteLength(encoded) <= AUTHORITY_MESSAGE_LIMIT) return encoded;
472
+ throw new DirectoryAuthorityError(
473
+ "directory_authority_request_too_large",
474
+ "The directory operation input exceeds the bridge byte limit."
475
+ );
476
+ }
477
+ function isAuthorityMessageObject(value) {
478
+ return typeof value === "object" && value !== null && !Array.isArray(value);
479
+ }
480
+ function decodeAuthorityResult(output) {
481
+ let message;
482
+ try {
483
+ message = JSON.parse(output);
484
+ } catch {
485
+ throw new DirectoryAuthorityError(
486
+ "directory_authority_protocol_error",
487
+ "The directory operation returned an invalid response."
488
+ );
489
+ }
490
+ if (!isAuthorityMessageObject(message)) {
491
+ throw new DirectoryAuthorityError(
492
+ "directory_authority_protocol_error",
493
+ "The directory operation returned an invalid response."
494
+ );
495
+ }
496
+ if (message.ok === true) return message.result;
497
+ const hasAuthorityError = message.ok === false && isAuthorityMessageObject(message.error);
498
+ if (!hasAuthorityError) {
499
+ throw new DirectoryAuthorityError(
500
+ "directory_authority_protocol_error",
501
+ "The directory operation returned an invalid response."
502
+ );
503
+ }
504
+ const {
505
+ code,
506
+ message: explanation,
507
+ data
508
+ } = message.error;
509
+ const hasErrorDescription = typeof code === "string" && typeof explanation === "string";
510
+ if (!hasErrorDescription) {
511
+ throw new DirectoryAuthorityError(
512
+ "directory_authority_protocol_error",
513
+ "The directory operation returned an invalid error response."
514
+ );
515
+ }
516
+ throw new DirectoryAuthorityError(
517
+ code,
518
+ explanation,
519
+ isAuthorityMessageObject(data) ? data : void 0
520
+ );
521
+ }
522
+
523
+ // src/shared/directory-authority/task.ts
524
+ var import_node_child_process = require("node:child_process");
525
+ async function runDirectoryAuthorityTask(input) {
526
+ assertDirectoryAuthorityLocation(input);
527
+ const request = encodeAuthorityRequest(input.input);
528
+ const timeoutMs = input.timeoutMs ?? AUTHORITY_TASK_TIMEOUT_MS;
529
+ const hasPositiveDeadline = Number.isFinite(timeoutMs) && timeoutMs > 0;
530
+ if (!hasPositiveDeadline) {
531
+ throw new DirectoryAuthorityError(
532
+ "directory_authority_invalid_timeout",
533
+ "The directory operation deadline must be a positive finite duration."
534
+ );
535
+ }
536
+ if (input.signal?.aborted) {
537
+ throw new DirectoryAuthorityError(
538
+ "directory_authority_aborted",
539
+ "The directory operation was cancelled before it started."
540
+ );
541
+ }
542
+ const child = (0, import_node_child_process.spawn)(
543
+ process.execPath,
544
+ [
545
+ "--input-type=commonjs",
546
+ "-e",
547
+ directoryAuthorityScript("task", AUTHORITY_MESSAGE_LIMIT, input.task)
548
+ ],
549
+ {
550
+ cwd: input.directoryPath,
551
+ env: authorityEnvironment(),
552
+ detached: true,
553
+ windowsHide: true,
554
+ stdio: ["pipe", "pipe", "pipe", input.directoryFd]
555
+ }
556
+ );
557
+ return new Promise((resolve, reject) => {
558
+ const chunks = [];
559
+ const stderrChunks = [];
560
+ let bytes = 0;
561
+ let stderrBytes = 0;
562
+ let failure;
563
+ const stop = (error) => {
564
+ if (failure) return;
565
+ failure = error;
566
+ if (typeof child.pid === "number") {
567
+ try {
568
+ process.kill(-child.pid, "SIGKILL");
569
+ return;
570
+ } catch {
571
+ }
572
+ }
573
+ child.kill("SIGKILL");
574
+ };
575
+ const onAbort = () => stop(
576
+ new DirectoryAuthorityError(
577
+ "directory_authority_aborted",
578
+ "The directory operation was cancelled."
579
+ )
580
+ );
581
+ const timer = setTimeout(
582
+ () => stop(
583
+ new DirectoryAuthorityError(
584
+ "directory_authority_timeout",
585
+ "The directory operation exceeded its deadline."
586
+ )
587
+ ),
588
+ timeoutMs
589
+ );
590
+ timer.unref();
591
+ input.signal?.addEventListener("abort", onAbort, { once: true });
592
+ if (input.signal?.aborted) onAbort();
593
+ child.stdout.on("data", (chunk) => {
594
+ bytes += chunk.length;
595
+ if (bytes > AUTHORITY_MESSAGE_LIMIT) {
596
+ stop(
597
+ new DirectoryAuthorityError(
598
+ "directory_authority_result_too_large",
599
+ "The directory operation result exceeds the bridge byte limit."
600
+ )
601
+ );
602
+ return;
603
+ }
604
+ chunks.push(chunk);
605
+ });
606
+ child.stderr.on("data", (chunk) => {
607
+ const remaining = Math.max(AUTHORITY_STDERR_LIMIT - stderrBytes, 0);
608
+ if (remaining === 0) return;
609
+ stderrChunks.push(chunk.subarray(0, remaining));
610
+ stderrBytes += Math.min(chunk.length, remaining);
611
+ });
612
+ child.stdin.on("error", () => void 0);
613
+ child.once("error", (error) => {
614
+ failure ??= new DirectoryAuthorityError(
615
+ "directory_authority_unavailable",
616
+ `The directory operation could not start: ${error.message}`
617
+ );
618
+ });
619
+ child.once("close", (code, signal) => {
620
+ clearTimeout(timer);
621
+ input.signal?.removeEventListener("abort", onAbort);
622
+ if (failure) {
623
+ reject(failure);
624
+ return;
625
+ }
626
+ if (code !== 0) {
627
+ reject(
628
+ new DirectoryAuthorityError(
629
+ "directory_authority_failed",
630
+ "The directory operation process did not complete successfully.",
631
+ {
632
+ exitCode: code,
633
+ signal,
634
+ stderr: Buffer.concat(stderrChunks).toString("utf8")
635
+ }
636
+ )
637
+ );
638
+ return;
639
+ }
640
+ try {
641
+ resolve(
642
+ decodeAuthorityResult(Buffer.concat(chunks).toString("utf8"))
643
+ );
644
+ } catch (error) {
645
+ reject(error);
646
+ }
647
+ });
648
+ child.stdin.end(request);
649
+ });
650
+ }
651
+
652
+ // plugins/filesystem/source/directory-sample-task.ts
653
+ async function sampleDirectoryTask(input) {
654
+ const { opendir: opendir2 } = require("node:fs/promises");
655
+ const entries = [];
656
+ const directory = await opendir2(".");
657
+ for await (const entry of directory) {
658
+ if (entries.length >= input.maxEntries) {
659
+ entries.sort((left, right) => left.localeCompare(right));
660
+ return { entries, truncated: true };
661
+ }
662
+ entries.push(`${entry.name}${entry.isDirectory() ? "/" : ""}`);
663
+ }
664
+ entries.sort((left, right) => left.localeCompare(right));
665
+ return { entries, truncated: false };
666
+ }
667
+
668
+ // plugins/filesystem/source/directory-sample.ts
669
+ var DIRECTORY_ENTRY_LIMIT = 160;
670
+ async function readDirectorySample(target) {
671
+ const entries = [];
672
+ let handle;
673
+ try {
674
+ if (typeof import_node_fs.constants.O_DIRECTORY !== "number" || typeof import_node_fs.constants.O_NOFOLLOW !== "number") {
675
+ fail(
676
+ "filesystem_safe_io_unsupported",
677
+ "This platform does not provide the no-follow directory operation required for a safe read."
678
+ );
679
+ }
680
+ handle = await (0, import_promises.open)(
681
+ target.absolutePath,
682
+ import_node_fs.constants.O_RDONLY | import_node_fs.constants.O_DIRECTORY | import_node_fs.constants.O_NOFOLLOW
683
+ );
684
+ const before = await handle.stat({ bigint: true });
685
+ if (!before.isDirectory()) {
686
+ fail("not_a_directory", `Expected a directory: ${target.logicalPath}`);
687
+ }
688
+ const [canonicalRoot, canonicalTarget] = await Promise.all([
689
+ (0, import_promises.realpath)(target.rootPath),
690
+ (0, import_promises.realpath)(target.absolutePath)
691
+ ]);
692
+ const rootRelative = (0, import_node_path2.relative)(canonicalRoot, canonicalTarget);
693
+ if (rootRelative === ".." || rootRelative.startsWith(`..${import_node_path2.sep}`) || rootRelative.startsWith(import_node_path2.sep)) {
694
+ fail(
695
+ "filesystem_path_changed",
696
+ `Directory changed outside its configured root: ${target.logicalPath}`
697
+ );
698
+ }
699
+ const pathIdentity = await (0, import_promises.stat)(canonicalTarget, { bigint: true });
700
+ if (!pathIdentity.isDirectory() || pathIdentity.dev !== before.dev || pathIdentity.ino !== before.ino) {
701
+ fail(
702
+ "filesystem_path_changed",
703
+ `Directory changed while it was being opened: ${target.logicalPath}`
704
+ );
705
+ }
706
+ if (requiresIsolatedDirectorySample()) {
707
+ const sample = await runDirectoryAuthorityTask({
708
+ directoryPath: target.absolutePath,
709
+ directoryFd: handle.fd,
710
+ input: { maxEntries: DIRECTORY_ENTRY_LIMIT },
711
+ task: sampleDirectoryTask
712
+ });
713
+ await assertDirectoryStable(handle, before, target.logicalPath);
714
+ return sample;
715
+ }
716
+ const directory = await (0, import_promises.opendir)(`/proc/self/fd/${handle.fd}`);
717
+ for await (const entry of directory) {
718
+ if (entries.length >= DIRECTORY_ENTRY_LIMIT) {
719
+ await assertDirectoryStable(handle, before, target.logicalPath);
720
+ entries.sort((left, right) => left.localeCompare(right));
721
+ return Object.freeze({
722
+ entries: Object.freeze(entries),
723
+ truncated: true
724
+ });
725
+ }
726
+ entries.push(`${entry.name}${entry.isDirectory() ? "/" : ""}`);
727
+ }
728
+ await assertDirectoryStable(handle, before, target.logicalPath);
729
+ entries.sort((left, right) => left.localeCompare(right));
730
+ return Object.freeze({ entries: Object.freeze(entries), truncated: false });
731
+ } catch (error) {
732
+ if (error instanceof DirectoryAuthorityError && error.code.startsWith("directory_authority_")) {
733
+ fail(
734
+ "filesystem_path_changed",
735
+ `Directory authority was lost: ${target.logicalPath}`
736
+ );
737
+ }
738
+ return rethrowFilesystemError(error, "inspect", target.logicalPath);
739
+ } finally {
740
+ await handle?.close().catch(() => void 0);
741
+ }
742
+ }
743
+ async function assertDirectoryStable(handle, before, logicalPath) {
744
+ const after = await handle.stat({ bigint: true });
745
+ if (!after.isDirectory() || after.dev !== before.dev || after.ino !== before.ino || after.mtimeNs !== before.mtimeNs || after.ctimeNs !== before.ctimeNs) {
746
+ fail(
747
+ "filesystem_read_changed",
748
+ `Directory changed while it was being read: ${logicalPath}`
749
+ );
750
+ }
751
+ }
752
+ function requiresIsolatedDirectorySample() {
753
+ return process.platform === "darwin";
754
+ }
755
+
305
756
  // plugins/filesystem/source/bounded-io.ts
306
757
  var MAX_MUTATION_BYTES = 1048576;
307
758
  var READ_HEAD_BYTES = 24576;
308
759
  var READ_TAIL_BYTES = 12288;
309
760
  var DEV_SCAN_BYTES = 1048576;
310
- var DIRECTORY_ENTRY_LIMIT = 160;
311
761
  async function readExactBytes(reader, buffer, position, logicalPath) {
312
762
  let offset = 0;
313
763
  while (offset < buffer.length) {
@@ -349,15 +799,15 @@ function decodeMutationText(buffer, logicalPath) {
349
799
  async function openRegularFile(target) {
350
800
  let handle;
351
801
  try {
352
- if (typeof import_node_fs.constants.O_NOFOLLOW !== "number") {
802
+ if (typeof import_node_fs2.constants.O_NOFOLLOW !== "number") {
353
803
  fail(
354
804
  "filesystem_safe_io_unsupported",
355
805
  "This platform does not provide the no-follow operation required for a safe read."
356
806
  );
357
807
  }
358
- handle = await (0, import_promises.open)(
808
+ handle = await (0, import_promises2.open)(
359
809
  target.absolutePath,
360
- import_node_fs.constants.O_RDONLY | import_node_fs.constants.O_NOFOLLOW
810
+ import_node_fs2.constants.O_RDONLY | import_node_fs2.constants.O_NOFOLLOW
361
811
  );
362
812
  const info = await handle.stat({ bigint: true });
363
813
  if (!info.isFile()) {
@@ -365,17 +815,17 @@ async function openRegularFile(target) {
365
815
  }
366
816
  const metadata = metadataFromStat(info, target.logicalPath);
367
817
  const [canonicalRoot, canonicalTarget] = await Promise.all([
368
- (0, import_promises.realpath)(target.rootPath),
369
- (0, import_promises.realpath)(target.absolutePath)
818
+ (0, import_promises2.realpath)(target.rootPath),
819
+ (0, import_promises2.realpath)(target.absolutePath)
370
820
  ]);
371
- const rootRelative = (0, import_node_path.relative)(canonicalRoot, canonicalTarget);
372
- if (rootRelative === ".." || rootRelative.startsWith(`..${import_node_path.sep}`) || rootRelative.startsWith(import_node_path.sep)) {
821
+ const rootRelative = (0, import_node_path3.relative)(canonicalRoot, canonicalTarget);
822
+ if (rootRelative === ".." || rootRelative.startsWith(`..${import_node_path3.sep}`) || rootRelative.startsWith(import_node_path3.sep)) {
373
823
  fail(
374
824
  "filesystem_path_changed",
375
825
  `File changed outside its configured root: ${target.logicalPath}`
376
826
  );
377
827
  }
378
- const pathIdentity = await (0, import_promises.stat)(canonicalTarget, { bigint: true });
828
+ const pathIdentity = await (0, import_promises2.stat)(canonicalTarget, { bigint: true });
379
829
  if (!pathIdentity.isFile() || pathIdentity.dev !== info.dev || pathIdentity.ino !== info.ino) {
380
830
  fail(
381
831
  "filesystem_path_changed",
@@ -546,72 +996,6 @@ function assertMutationContentSize(content) {
546
996
  }
547
997
  return byteCount;
548
998
  }
549
- async function readDirectorySample(target) {
550
- const entries = [];
551
- let handle;
552
- try {
553
- if (typeof import_node_fs.constants.O_DIRECTORY !== "number" || typeof import_node_fs.constants.O_NOFOLLOW !== "number") {
554
- fail(
555
- "filesystem_safe_io_unsupported",
556
- "This platform does not provide the no-follow directory operation required for a safe read."
557
- );
558
- }
559
- handle = await (0, import_promises.open)(
560
- target.absolutePath,
561
- import_node_fs.constants.O_RDONLY | import_node_fs.constants.O_DIRECTORY | import_node_fs.constants.O_NOFOLLOW
562
- );
563
- const before = await handle.stat({ bigint: true });
564
- if (!before.isDirectory()) {
565
- fail("not_a_directory", `Expected a directory: ${target.logicalPath}`);
566
- }
567
- const [canonicalRoot, canonicalTarget] = await Promise.all([
568
- (0, import_promises.realpath)(target.rootPath),
569
- (0, import_promises.realpath)(target.absolutePath)
570
- ]);
571
- const rootRelative = (0, import_node_path.relative)(canonicalRoot, canonicalTarget);
572
- if (rootRelative === ".." || rootRelative.startsWith(`..${import_node_path.sep}`) || rootRelative.startsWith(import_node_path.sep)) {
573
- fail(
574
- "filesystem_path_changed",
575
- `Directory changed outside its configured root: ${target.logicalPath}`
576
- );
577
- }
578
- const pathIdentity = await (0, import_promises.stat)(canonicalTarget, { bigint: true });
579
- if (!pathIdentity.isDirectory() || pathIdentity.dev !== before.dev || pathIdentity.ino !== before.ino) {
580
- fail(
581
- "filesystem_path_changed",
582
- `Directory changed while it was being opened: ${target.logicalPath}`
583
- );
584
- }
585
- const directory = await (0, import_promises.opendir)(`/proc/self/fd/${handle.fd}`);
586
- for await (const entry of directory) {
587
- if (entries.length >= DIRECTORY_ENTRY_LIMIT) {
588
- await assertDirectoryStable(handle, before, target.logicalPath);
589
- entries.sort((left, right) => left.localeCompare(right));
590
- return Object.freeze({
591
- entries: Object.freeze(entries),
592
- truncated: true
593
- });
594
- }
595
- entries.push(`${entry.name}${entry.isDirectory() ? "/" : ""}`);
596
- }
597
- await assertDirectoryStable(handle, before, target.logicalPath);
598
- entries.sort((left, right) => left.localeCompare(right));
599
- return Object.freeze({ entries: Object.freeze(entries), truncated: false });
600
- } catch (error) {
601
- return rethrowFilesystemError(error, "inspect", target.logicalPath);
602
- } finally {
603
- await handle?.close().catch(() => void 0);
604
- }
605
- }
606
- async function assertDirectoryStable(handle, before, logicalPath) {
607
- const after = await handle.stat({ bigint: true });
608
- if (!after.isDirectory() || after.dev !== before.dev || after.ino !== before.ino || after.mtimeNs !== before.mtimeNs || after.ctimeNs !== before.ctimeNs) {
609
- fail(
610
- "filesystem_read_changed",
611
- `Directory changed while it was being read: ${logicalPath}`
612
- );
613
- }
614
- }
615
999
  function rejectBinary(buffer, logicalPath) {
616
1000
  if (buffer.includes(0)) {
617
1001
  fail(
@@ -659,6 +1043,107 @@ function failTargetChanged(logicalPath, expectedState, observedState) {
659
1043
  );
660
1044
  }
661
1045
 
1046
+ // plugins/filesystem/source/view-locator.ts
1047
+ var LOCATOR_CANDIDATE_LIMIT = 8;
1048
+ function selectViewLocatorWindow(input) {
1049
+ const offsets = collectLocatorOffsets(input.source.text, input.locator);
1050
+ const first = offsets[0];
1051
+ if (first === void 0) return null;
1052
+ if (hasAmbiguousLocatorMatches(offsets)) {
1053
+ rejectAmbiguousLocator(input, offsets);
1054
+ }
1055
+ const candidate = createLocatorCandidate(input, first);
1056
+ return {
1057
+ startLine: candidate.nextControls.start_line,
1058
+ endLine: candidate.nextControls.end_line,
1059
+ rangeTruncated: candidate.rangeTruncated
1060
+ };
1061
+ }
1062
+ function collectLocatorOffsets(text, locator) {
1063
+ const offsets = [];
1064
+ let start = 0;
1065
+ for (let count = 0; count <= LOCATOR_CANDIDATE_LIMIT; count += 1) {
1066
+ const offset = text.indexOf(locator, start);
1067
+ if (offset < 0) break;
1068
+ offsets.push(offset);
1069
+ start = offset + 1;
1070
+ }
1071
+ return offsets;
1072
+ }
1073
+ function hasAmbiguousLocatorMatches(offsets) {
1074
+ return offsets.length > 1;
1075
+ }
1076
+ function createLocatorCandidate(input, offset) {
1077
+ const matchStartLine = lineAtOffset(input.source.text, offset);
1078
+ const matchEndLine = lineAtOffset(
1079
+ input.source.text,
1080
+ offset + Math.max(input.locator.length - 1, 0)
1081
+ );
1082
+ const startLine = Math.max(1, matchStartLine - input.contextLines);
1083
+ const requestedEndLine = Math.min(
1084
+ input.lineCount,
1085
+ matchEndLine + input.contextLines
1086
+ );
1087
+ const endLine = Math.min(
1088
+ requestedEndLine,
1089
+ startLine + input.maxWindowLines - 1
1090
+ );
1091
+ return {
1092
+ matchStartLine,
1093
+ matchEndLine,
1094
+ rangeTruncated: requestedEndLine > endLine,
1095
+ nextControls: {
1096
+ path: input.path,
1097
+ start_line: startLine,
1098
+ end_line: endLine
1099
+ }
1100
+ };
1101
+ }
1102
+ function rejectAmbiguousLocator(input, offsets) {
1103
+ const candidates = offsets.slice(0, LOCATOR_CANDIDATE_LIMIT).map((offset) => createLocatorCandidate(input, offset));
1104
+ const candidatesTruncated = offsets.length > LOCATOR_CANDIDATE_LIMIT;
1105
+ const truncation = {
1106
+ candidateLimit: LOCATOR_CANDIDATE_LIMIT,
1107
+ candidatesTruncated,
1108
+ scanTruncated: input.source.truncated,
1109
+ omittedBytes: input.source.omittedBytes
1110
+ };
1111
+ fail(
1112
+ "ambiguous_text_locator",
1113
+ [
1114
+ "Locator matched multiple locations; no file window was selected.",
1115
+ "Choose a unique literal locator or select one candidate's numeric controls with locator omitted.",
1116
+ `Path: ${input.path}`,
1117
+ ...candidates.map(
1118
+ ({ matchStartLine, matchEndLine, nextControls }) => `Match lines ${matchStartLine}-${matchEndLine}: start_line=${nextControls.start_line}, end_line=${nextControls.end_line}`
1119
+ ),
1120
+ `Candidate list truncated: ${candidatesTruncated}`,
1121
+ `Scan truncated: ${input.source.truncated}; bytes scanned: ${input.source.bytesRead}/${input.source.byteCount}`
1122
+ ].join("\n"),
1123
+ {
1124
+ path: input.path,
1125
+ candidates,
1126
+ observedMatchCountLowerBound: offsets.length,
1127
+ truncation,
1128
+ eventMeta: {
1129
+ path: input.path,
1130
+ mode: "file",
1131
+ locatorAmbiguous: true,
1132
+ candidateCount: candidates.length,
1133
+ candidatesTruncated,
1134
+ scanTruncated: input.source.truncated
1135
+ }
1136
+ }
1137
+ );
1138
+ }
1139
+ function lineAtOffset(content, offset) {
1140
+ let line = 1;
1141
+ for (let index = 0; index < offset; index += 1) {
1142
+ if (content.charCodeAt(index) === 10) line += 1;
1143
+ }
1144
+ return line;
1145
+ }
1146
+
662
1147
  // plugins/filesystem/source/view-window.ts
663
1148
  var MAX_VIEW_LINES = 240;
664
1149
  var DEFAULT_CONTEXT_LINES = 8;
@@ -670,21 +1155,14 @@ function selectWindow(input) {
670
1155
  let startLine = input.startLine ?? 1;
671
1156
  let endLine = input.endLine ?? (input.startLine ? input.startLine + MAX_VIEW_LINES - 1 : MAX_VIEW_LINES);
672
1157
  if (input.locator) {
673
- const first = input.text.indexOf(input.locator);
674
- if (first < 0) return null;
675
- if (input.text.indexOf(input.locator, first + input.locator.length) >= 0) {
676
- fail(
677
- "ambiguous_text_locator",
678
- "Locator matched multiple locations. Use a more specific locator or numeric range."
679
- );
680
- }
681
- const locatorStart = lineAtOffset(input.text, first);
682
- const locatorEnd = lineAtOffset(
683
- input.text,
684
- first + Math.max(input.locator.length - 1, 0)
685
- );
686
- startLine = Math.max(1, locatorStart - input.contextLines);
687
- endLine = Math.min(input.lines.length, locatorEnd + input.contextLines);
1158
+ return selectViewLocatorWindow({
1159
+ path: input.path,
1160
+ source: input.source,
1161
+ lineCount: input.lines.length,
1162
+ locator: input.locator,
1163
+ contextLines: input.contextLines,
1164
+ maxWindowLines: MAX_VIEW_LINES
1165
+ });
688
1166
  }
689
1167
  if (endLine < startLine) [startLine, endLine] = [endLine, startLine];
690
1168
  const rangeTruncated = endLine - startLine + 1 > MAX_VIEW_LINES;
@@ -709,13 +1187,6 @@ function parseTrailingRange(value) {
709
1187
  endLine: Number.parseInt(match[3] ?? match[2], 10)
710
1188
  });
711
1189
  }
712
- function lineAtOffset(content, offset) {
713
- let line = 1;
714
- for (let index = 0; index < offset; index += 1) {
715
- if (content.charCodeAt(index) === 10) line += 1;
716
- }
717
- return line;
718
- }
719
1190
 
720
1191
  // plugins/filesystem/source/dev-view.ts
721
1192
  function createDevViewHandler(paths) {
@@ -725,7 +1196,7 @@ function createDevViewHandler(paths) {
725
1196
  const target = paths.resolve(pathRange.path, context);
726
1197
  let info;
727
1198
  try {
728
- info = await (0, import_promises2.stat)(target.absolutePath);
1199
+ info = await (0, import_promises3.stat)(target.absolutePath);
729
1200
  } catch (error) {
730
1201
  rethrowFilesystemError(error, "inspect", target.logicalPath);
731
1202
  }
@@ -818,7 +1289,8 @@ async function viewFile(input) {
818
1289
  const lines = completeScannedLines(source.text, source.truncated);
819
1290
  const availableLineCount = Math.max(lines.length, 1);
820
1291
  const selection = selectWindow({
821
- text: source.text,
1292
+ path: input.target.logicalPath,
1293
+ source,
822
1294
  lines,
823
1295
  startLine: input.startLine,
824
1296
  endLine: input.endLine,
@@ -924,22 +1396,22 @@ async function viewFile(input) {
924
1396
 
925
1397
  // plugins/filesystem/source/atomic-write.ts
926
1398
  var import_node_crypto2 = require("node:crypto");
927
- var import_promises4 = require("node:fs/promises");
928
- var import_node_path3 = require("node:path");
1399
+ var import_promises5 = require("node:fs/promises");
1400
+ var import_node_path5 = require("node:path");
929
1401
 
930
1402
  // plugins/filesystem/source/mutation-parent.ts
931
- var import_node_fs2 = require("node:fs");
932
- var import_promises3 = require("node:fs/promises");
933
- var import_node_path2 = require("node:path");
1403
+ var import_node_fs3 = require("node:fs");
1404
+ var import_promises4 = require("node:fs/promises");
1405
+ var import_node_path4 = require("node:path");
934
1406
  function isWithinRoot(target, root) {
935
- const rel = (0, import_node_path2.relative)(root, target);
936
- return rel === "" || rel !== ".." && !rel.startsWith(`..${import_node_path2.sep}`);
1407
+ const rel = (0, import_node_path4.relative)(root, target);
1408
+ return rel === "" || rel !== ".." && !rel.startsWith(`..${import_node_path4.sep}`);
937
1409
  }
938
1410
  function sameIdentity(left, right) {
939
1411
  return left.dev === right.dev && left.ino === right.ino;
940
1412
  }
941
1413
  async function openDirectory(path, rootPath, logicalPath, allowMissing = false) {
942
- if (typeof import_node_fs2.constants.O_DIRECTORY !== "number" || typeof import_node_fs2.constants.O_NOFOLLOW !== "number") {
1414
+ if (typeof import_node_fs3.constants.O_DIRECTORY !== "number" || typeof import_node_fs3.constants.O_NOFOLLOW !== "number") {
943
1415
  fail(
944
1416
  "filesystem_safe_io_unsupported",
945
1417
  "This platform does not provide the no-follow directory operations required for a safe write."
@@ -947,17 +1419,17 @@ async function openDirectory(path, rootPath, logicalPath, allowMissing = false)
947
1419
  }
948
1420
  let handle;
949
1421
  try {
950
- handle = await (0, import_promises3.open)(
1422
+ handle = await (0, import_promises4.open)(
951
1423
  path,
952
- import_node_fs2.constants.O_RDONLY | import_node_fs2.constants.O_DIRECTORY | import_node_fs2.constants.O_NOFOLLOW
1424
+ import_node_fs3.constants.O_RDONLY | import_node_fs3.constants.O_DIRECTORY | import_node_fs3.constants.O_NOFOLLOW
953
1425
  );
954
1426
  const opened = await handle.stat({ bigint: true });
955
1427
  if (!opened.isDirectory()) {
956
1428
  fail("not_a_directory", `Expected a directory: ${logicalPath}`);
957
1429
  }
958
1430
  const [canonicalRoot, canonicalDirectory] = await Promise.all([
959
- (0, import_promises3.realpath)(rootPath),
960
- (0, import_promises3.realpath)(path)
1431
+ (0, import_promises4.realpath)(rootPath),
1432
+ (0, import_promises4.realpath)(path)
961
1433
  ]);
962
1434
  if (!isWithinRoot(canonicalDirectory, canonicalRoot)) {
963
1435
  fail(
@@ -965,15 +1437,16 @@ async function openDirectory(path, rootPath, logicalPath, allowMissing = false)
965
1437
  `Directory changed outside its configured root: ${logicalPath}`
966
1438
  );
967
1439
  }
968
- const pathIdentity = await (0, import_promises3.stat)(canonicalDirectory, { bigint: true });
1440
+ const pathIdentity = await (0, import_promises4.stat)(canonicalDirectory, { bigint: true });
969
1441
  if (!pathIdentity.isDirectory() || !sameIdentity(opened, pathIdentity)) {
970
1442
  fail(
971
1443
  "filesystem_path_changed",
972
1444
  `Directory changed while it was being opened: ${logicalPath}`
973
1445
  );
974
1446
  }
1447
+ if (usesIsolatedDirectoryAuthority()) return handle;
975
1448
  const procPath = `/proc/self/fd/${handle.fd}`;
976
- const procIdentity = await (0, import_promises3.stat)(procPath, { bigint: true });
1449
+ const procIdentity = await (0, import_promises4.stat)(procPath, { bigint: true });
977
1450
  if (!procIdentity.isDirectory() || !sameIdentity(opened, procIdentity)) {
978
1451
  fail(
979
1452
  "filesystem_safe_io_unsupported",
@@ -1000,7 +1473,7 @@ async function openChildDirectory(parent, name, logicalPath) {
1000
1473
  if (!isNodeErrorCode(error, "ENOENT")) throw error;
1001
1474
  }
1002
1475
  try {
1003
- await (0, import_promises3.mkdir)(anchoredPath);
1476
+ await (0, import_promises4.mkdir)(anchoredPath);
1004
1477
  } catch (error) {
1005
1478
  if (!isNodeErrorCode(error, "EEXIST")) {
1006
1479
  rethrowFilesystemError(error, "write", logicalPath);
@@ -1022,35 +1495,253 @@ async function openMutationParent(target) {
1022
1495
  `Path changed while preparing the write: ${target.logicalPath}`
1023
1496
  );
1024
1497
  }
1025
- let current = await openDirectory(
1498
+ const rootHandle = await openDirectory(
1026
1499
  target.rootPath,
1027
1500
  target.rootPath,
1028
1501
  target.logicalPath
1029
1502
  );
1503
+ let current = rootHandle;
1030
1504
  try {
1031
1505
  for (const segment of segments) {
1032
- const next = await openChildDirectory(
1033
- current,
1034
- segment,
1035
- target.logicalPath
1036
- );
1037
- await current.close();
1038
- current = next;
1506
+ const previous = current;
1507
+ current = await openChildDirectory(previous, segment, target.logicalPath);
1508
+ if (previous !== rootHandle) {
1509
+ await previous.close().catch(() => void 0);
1510
+ }
1039
1511
  }
1040
1512
  return Object.freeze({
1041
1513
  handle: current,
1514
+ rootHandle,
1042
1515
  procPath: `/proc/self/fd/${current.fd}`,
1043
1516
  targetName
1044
1517
  });
1045
1518
  } catch (error) {
1046
- await current.close().catch(() => void 0);
1519
+ await closeMutationParent({ handle: current, rootHandle });
1047
1520
  throw error;
1048
1521
  }
1049
1522
  }
1523
+ async function closeMutationParent(parent) {
1524
+ for (const handle of /* @__PURE__ */ new Set([parent.handle, parent.rootHandle])) {
1525
+ await handle.close().catch(() => void 0);
1526
+ }
1527
+ }
1528
+ function usesIsolatedDirectoryAuthority() {
1529
+ return process.platform === "darwin";
1530
+ }
1531
+ function openMutationRoot(target) {
1532
+ return openDirectory(target.rootPath, target.rootPath, target.logicalPath);
1533
+ }
1534
+
1535
+ // plugins/filesystem/source/file-output-presentation.ts
1536
+ var import_node_fs4 = require("node:fs");
1537
+ function reportCommittedFileOutput(context, target, operation, root) {
1538
+ if (!context?.reportFileOutput) return;
1539
+ try {
1540
+ const identity = (0, import_node_fs4.fstatSync)(root.fd, { bigint: true });
1541
+ context.reportFileOutput({
1542
+ target,
1543
+ operation,
1544
+ rootIdentity: {
1545
+ device: String(identity.dev),
1546
+ inode: String(identity.ino),
1547
+ birthtimeNs: String(identity.birthtimeNs)
1548
+ }
1549
+ });
1550
+ } catch {
1551
+ }
1552
+ }
1553
+ function notifyCommittedFileOutput(root, onCommitted) {
1554
+ try {
1555
+ onCommitted?.(root);
1556
+ } catch {
1557
+ }
1558
+ }
1559
+
1560
+ // plugins/filesystem/source/directory-write-task.ts
1561
+ async function commitDirectoryWrite(input) {
1562
+ const fs = require("node:fs/promises");
1563
+ const { constants: constants4 } = require("node:fs");
1564
+ const { createHash: createHash3, randomUUID: randomUUID2 } = require("node:crypto");
1565
+ const expected = input.expectedVersion;
1566
+ function failWrite(code) {
1567
+ throw Object.assign(new Error(code), { code });
1568
+ }
1569
+ function hasNodeCode(error, code) {
1570
+ return error instanceof Error && "code" in error && error.code === code;
1571
+ }
1572
+ function isSingleComponent(value) {
1573
+ if (!value || value === "." || value === "..") return false;
1574
+ if (value.includes("/") || value.includes("\\")) return false;
1575
+ return !value.includes("\0");
1576
+ }
1577
+ const segments = input.relativePath.split("/");
1578
+ if (!segments.every(isSingleComponent)) failWrite("filesystem_path_changed");
1579
+ const targetName = segments.pop();
1580
+ if (Buffer.byteLength(input.content, "utf8") > 1048576) {
1581
+ failWrite("filesystem_file_too_large");
1582
+ }
1583
+ async function enterChildDirectory(name) {
1584
+ let handle;
1585
+ const flags = constants4.O_RDONLY | constants4.O_DIRECTORY | constants4.O_NOFOLLOW;
1586
+ try {
1587
+ handle = await fs.open(name, flags);
1588
+ } catch (error) {
1589
+ if (!hasNodeCode(error, "ENOENT")) throw error;
1590
+ try {
1591
+ await fs.mkdir(name);
1592
+ } catch (creationError) {
1593
+ if (!hasNodeCode(creationError, "EEXIST")) throw creationError;
1594
+ }
1595
+ handle = await fs.open(name, flags);
1596
+ }
1597
+ try {
1598
+ const held = await handle.stat({ bigint: true });
1599
+ if (!held.isDirectory()) failWrite("filesystem_path_changed");
1600
+ process.chdir(name);
1601
+ const entered = await fs.stat(".", { bigint: true });
1602
+ if (held.dev !== entered.dev || held.ino !== entered.ino) {
1603
+ failWrite("filesystem_path_changed");
1604
+ }
1605
+ } finally {
1606
+ await handle.close();
1607
+ }
1608
+ }
1609
+ for (const segment of segments) await enterChildDirectory(segment);
1610
+ function hasExpectedMetadata(info) {
1611
+ if (expected.kind !== "file" || !info.isFile()) return false;
1612
+ if (String(info.dev) !== expected.device) return false;
1613
+ if (String(info.ino) !== expected.inode) return false;
1614
+ if (Number(info.size) !== expected.size) return false;
1615
+ if ((Number(info.mode) & 4095) !== expected.mode) return false;
1616
+ if (String(info.mtimeNs) !== expected.modifiedNs) return false;
1617
+ return String(info.ctimeNs) === expected.changedNs;
1618
+ }
1619
+ async function assertExpectedTarget() {
1620
+ let target;
1621
+ try {
1622
+ target = await fs.open(
1623
+ targetName,
1624
+ constants4.O_RDONLY | constants4.O_NOFOLLOW | constants4.O_NONBLOCK
1625
+ );
1626
+ } catch (error) {
1627
+ if (hasNodeCode(error, "ENOENT") && expected.kind === "absent") return;
1628
+ failWrite("filesystem_target_changed");
1629
+ }
1630
+ try {
1631
+ const before = await target.stat({ bigint: true });
1632
+ if (!hasExpectedMetadata(before)) failWrite("filesystem_target_changed");
1633
+ if (expected.kind !== "file") failWrite("filesystem_target_changed");
1634
+ const bytes = Buffer.alloc(expected.size);
1635
+ let offset = 0;
1636
+ while (offset < bytes.length) {
1637
+ const { bytesRead } = await target.read(
1638
+ bytes,
1639
+ offset,
1640
+ bytes.length - offset,
1641
+ offset
1642
+ );
1643
+ if (bytesRead <= 0) failWrite("filesystem_target_changed");
1644
+ offset += bytesRead;
1645
+ }
1646
+ const after = await target.stat({ bigint: true });
1647
+ if (!hasExpectedMetadata(after)) failWrite("filesystem_target_changed");
1648
+ const digest2 = createHash3("sha256").update(bytes).digest("hex");
1649
+ if (digest2 !== expected.digest) failWrite("filesystem_target_changed");
1650
+ } finally {
1651
+ await target.close();
1652
+ }
1653
+ }
1654
+ const parent = await fs.open(
1655
+ ".",
1656
+ constants4.O_RDONLY | constants4.O_DIRECTORY | constants4.O_NOFOLLOW
1657
+ );
1658
+ const temporaryName = `.abot-${targetName}-${randomUUID2()}.tmp`;
1659
+ let temporaryCreated = false;
1660
+ try {
1661
+ const temporary = await fs.open(temporaryName, "wx");
1662
+ temporaryCreated = true;
1663
+ try {
1664
+ await temporary.writeFile(input.content, "utf8");
1665
+ if (expected.kind === "file") await temporary.chmod(expected.mode);
1666
+ await temporary.sync();
1667
+ } finally {
1668
+ await temporary.close();
1669
+ }
1670
+ await assertExpectedTarget();
1671
+ if (expected.kind === "file") {
1672
+ await fs.rename(temporaryName, targetName);
1673
+ temporaryCreated = false;
1674
+ } else {
1675
+ try {
1676
+ await fs.link(temporaryName, targetName);
1677
+ } catch (error) {
1678
+ if (hasNodeCode(error, "EEXIST"))
1679
+ failWrite("filesystem_target_changed");
1680
+ throw error;
1681
+ }
1682
+ const removed = await fs.rm(temporaryName, { force: true }).then(() => true).catch(() => false);
1683
+ temporaryCreated = !removed;
1684
+ }
1685
+ await parent.sync().catch(() => void 0);
1686
+ } finally {
1687
+ if (temporaryCreated)
1688
+ await fs.rm(temporaryName, { force: true }).catch(() => void 0);
1689
+ await parent.close().catch(() => void 0);
1690
+ }
1691
+ }
1692
+
1693
+ // plugins/filesystem/source/directory-authority-write.ts
1694
+ async function writeWithDirectoryAuthority(input) {
1695
+ const root = await openMutationRoot(input.target);
1696
+ const expected = input.expectedVersion;
1697
+ const expectedVersion = expected.kind === "absent" ? { kind: "absent" } : {
1698
+ ...expected,
1699
+ device: String(expected.device),
1700
+ inode: String(expected.inode),
1701
+ modifiedNs: String(expected.modifiedNs),
1702
+ changedNs: String(expected.changedNs)
1703
+ };
1704
+ try {
1705
+ await runDirectoryAuthorityTask({
1706
+ directoryPath: input.target.rootPath,
1707
+ directoryFd: root.fd,
1708
+ input: {
1709
+ relativePath: input.target.relativePath,
1710
+ content: input.content,
1711
+ expectedVersion
1712
+ },
1713
+ task: commitDirectoryWrite
1714
+ });
1715
+ notifyCommittedFileOutput(root, input.onCommitted);
1716
+ } catch (error) {
1717
+ if (error instanceof DirectoryAuthorityError) {
1718
+ if (error.code.startsWith("filesystem_")) {
1719
+ fail(
1720
+ error.code,
1721
+ `Safe write failed: ${input.target.logicalPath}`,
1722
+ error.data
1723
+ );
1724
+ }
1725
+ if (error.code.startsWith("directory_authority_")) {
1726
+ fail(
1727
+ "filesystem_path_changed",
1728
+ `Directory authority was lost: ${input.target.logicalPath}`
1729
+ );
1730
+ }
1731
+ }
1732
+ rethrowFilesystemError(error, "write", input.target.logicalPath);
1733
+ } finally {
1734
+ await root.close().catch(() => void 0);
1735
+ }
1736
+ }
1050
1737
 
1051
1738
  // plugins/filesystem/source/atomic-write.ts
1052
1739
  async function atomicWriteText(input) {
1053
1740
  assertMutationContentSize(input.content);
1741
+ if (requiresIsolatedDirectoryAuthority()) {
1742
+ await writeWithDirectoryAuthority(input);
1743
+ return;
1744
+ }
1054
1745
  const parent = await openMutationParent(input.target);
1055
1746
  const targetPath = `${parent.procPath}/${parent.targetName}`;
1056
1747
  const anchoredTarget = Object.freeze({
@@ -1059,12 +1750,12 @@ async function atomicWriteText(input) {
1059
1750
  absolutePath: targetPath,
1060
1751
  relativePath: parent.targetName
1061
1752
  });
1062
- const temporaryName = `.abot-${import_node_path3.posix.basename(parent.targetName)}-${(0, import_node_crypto2.randomUUID)()}.tmp`;
1753
+ const temporaryName = `.abot-${import_node_path5.posix.basename(parent.targetName)}-${(0, import_node_crypto2.randomUUID)()}.tmp`;
1063
1754
  const temporaryPath = `${parent.procPath}/${temporaryName}`;
1064
1755
  const existingMode = input.expectedVersion.kind === "file" ? input.expectedVersion.mode : void 0;
1065
1756
  let temporaryCreated = false;
1066
1757
  try {
1067
- const temporaryHandle = await (0, import_promises4.open)(temporaryPath, "wx");
1758
+ const temporaryHandle = await (0, import_promises5.open)(temporaryPath, "wx");
1068
1759
  temporaryCreated = true;
1069
1760
  try {
1070
1761
  await temporaryHandle.writeFile(input.content, "utf8");
@@ -1086,28 +1777,29 @@ async function atomicWriteText(input) {
1086
1777
  if (input.expectedVersion.kind === "file") {
1087
1778
  temporaryCreated = false;
1088
1779
  } else {
1089
- const removed = await (0, import_promises4.rm)(temporaryPath, { force: true }).then(() => true).catch(() => false);
1780
+ const removed = await (0, import_promises5.rm)(temporaryPath, { force: true }).then(() => true).catch(() => false);
1090
1781
  temporaryCreated = !removed;
1091
1782
  }
1092
1783
  await syncDirectoryBestEffort(parent.handle);
1784
+ notifyCommittedFileOutput(parent.rootHandle, input.onCommitted);
1093
1785
  } catch (error) {
1094
1786
  rethrowFilesystemError(error, "write", input.target.logicalPath);
1095
1787
  } finally {
1096
1788
  if (temporaryCreated) {
1097
- await (0, import_promises4.rm)(temporaryPath, { force: true }).catch(() => void 0);
1789
+ await (0, import_promises5.rm)(temporaryPath, { force: true }).catch(() => void 0);
1098
1790
  }
1099
- await parent.handle.close().catch(() => void 0);
1791
+ await closeMutationParent(parent);
1100
1792
  }
1101
1793
  }
1102
1794
  async function installPreparedFile(input) {
1103
1795
  const temporaryPath = `${input.parentProcPath}/${input.temporaryName}`;
1104
1796
  const targetPath = `${input.parentProcPath}/${input.targetName}`;
1105
1797
  if (input.expectedKind === "file") {
1106
- await (0, import_promises4.rename)(temporaryPath, targetPath);
1798
+ await (0, import_promises5.rename)(temporaryPath, targetPath);
1107
1799
  return;
1108
1800
  }
1109
1801
  try {
1110
- await (0, import_promises4.link)(temporaryPath, targetPath);
1802
+ await (0, import_promises5.link)(temporaryPath, targetPath);
1111
1803
  } catch (error) {
1112
1804
  if (isNodeErrorCode(error, "EEXIST")) {
1113
1805
  fail(
@@ -1124,10 +1816,13 @@ async function syncDirectoryBestEffort(handle) {
1124
1816
  } catch {
1125
1817
  }
1126
1818
  }
1819
+ function requiresIsolatedDirectoryAuthority() {
1820
+ return process.platform === "darwin";
1821
+ }
1127
1822
 
1128
1823
  // plugins/filesystem/source/draft/grounding.ts
1129
1824
  var import_node_crypto3 = require("node:crypto");
1130
- var import_node_path4 = require("node:path");
1825
+ var import_node_path6 = require("node:path");
1131
1826
  var GROUNDING_MAX_CHARS = 32768;
1132
1827
  var SNAPSHOT_MAX_CHARS = 3e4;
1133
1828
  var SNAPSHOT_SEGMENT_CHARS = Math.floor(SNAPSHOT_MAX_CHARS / 2);
@@ -1136,7 +1831,7 @@ function buildMutationGrounding(input) {
1136
1831
  const byteCount = Buffer.byteLength(input.content, "utf8");
1137
1832
  const lineCount = input.content.length ? input.content.split(/\r?\n/u).length : 0;
1138
1833
  const sha256 = (0, import_node_crypto3.createHash)("sha256").update(input.content).digest("hex");
1139
- const extension = (0, import_node_path4.extname)(input.logicalPath).toLowerCase() || "none";
1834
+ const extension = (0, import_node_path6.extname)(input.logicalPath).toLowerCase() || "none";
1140
1835
  const snapshot = projectSnapshot(input.content, input.previousContent);
1141
1836
  const summary = bound(
1142
1837
  [
@@ -1380,7 +2075,7 @@ function scopeError(message) {
1380
2075
  // plugins/filesystem/source/draft/validators.ts
1381
2076
  var import_parser = require("@babel/parser");
1382
2077
  var import_postcss = require("postcss");
1383
- var import_node_path5 = require("node:path");
2078
+ var import_node_path7 = require("node:path");
1384
2079
  var SCRIPT_EXTENSIONS = /* @__PURE__ */ new Set([
1385
2080
  ".js",
1386
2081
  ".jsx",
@@ -1420,7 +2115,7 @@ function lineColumnAt(content, offset) {
1420
2115
  });
1421
2116
  }
1422
2117
  function scriptOptions(targetPath) {
1423
- const extension = (0, import_node_path5.extname)(targetPath).toLowerCase();
2118
+ const extension = (0, import_node_path7.extname)(targetPath).toLowerCase();
1424
2119
  const plugins = [];
1425
2120
  if ([".js", ".jsx", ".mjs", ".cjs", ".tsx"].includes(extension)) {
1426
2121
  plugins.push("jsx");
@@ -1483,7 +2178,7 @@ function foreignScriptWrapper(content, targetPath, originalError) {
1483
2178
  return parseScript(projected.join("\n"), targetPath) === void 0;
1484
2179
  };
1485
2180
  if (opening && closing && first < last && parsesWithout(first, last)) {
1486
- const extension = (0, import_node_path5.extname)(targetPath).toLowerCase();
2181
+ const extension = (0, import_node_path7.extname)(targetPath).toLowerCase();
1487
2182
  if (!originalError && [".jsx", ".tsx"].includes(extension))
1488
2183
  return void 0;
1489
2184
  return wrapperDiagnostic(lines[first], first, "opening", 2);
@@ -1501,14 +2196,14 @@ var validators = Object.freeze([
1501
2196
  id: "json",
1502
2197
  label: "strict JSON",
1503
2198
  authoritativeStructure: true,
1504
- matchesTarget: (targetPath) => (0, import_node_path5.extname)(targetPath).toLowerCase() === ".json",
2199
+ matchesTarget: (targetPath) => (0, import_node_path7.extname)(targetPath).toLowerCase() === ".json",
1505
2200
  validate: (content) => validateJson(content)
1506
2201
  }),
1507
2202
  Object.freeze({
1508
2203
  id: "css",
1509
2204
  label: "CSS",
1510
2205
  authoritativeStructure: true,
1511
- matchesTarget: (targetPath) => (0, import_node_path5.extname)(targetPath).toLowerCase() === ".css",
2206
+ matchesTarget: (targetPath) => (0, import_node_path7.extname)(targetPath).toLowerCase() === ".css",
1512
2207
  validate(content, targetPath) {
1513
2208
  try {
1514
2209
  (0, import_postcss.parse)(content, { from: targetPath });
@@ -1528,7 +2223,7 @@ var validators = Object.freeze([
1528
2223
  id: "script",
1529
2224
  label: "JavaScript/TypeScript",
1530
2225
  authoritativeStructure: true,
1531
- matchesTarget: (targetPath) => SCRIPT_EXTENSIONS.has((0, import_node_path5.extname)(targetPath).toLowerCase()),
2226
+ matchesTarget: (targetPath) => SCRIPT_EXTENSIONS.has((0, import_node_path7.extname)(targetPath).toLowerCase()),
1532
2227
  validate(content, targetPath) {
1533
2228
  const error = parseScript(content, targetPath);
1534
2229
  return foreignScriptWrapper(content, targetPath, error) ?? (error ? scriptDiagnostic(error) : void 0);
@@ -1797,7 +2492,8 @@ function createEditFileHandler(paths, mutations) {
1797
2492
  await atomicWriteText({
1798
2493
  target,
1799
2494
  content: prepared2.content,
1800
- expectedVersion: snapshot.version
2495
+ expectedVersion: snapshot.version,
2496
+ onCommitted: (root) => reportCommittedFileOutput(context, target, "updated", root)
1801
2497
  });
1802
2498
  return result;
1803
2499
  });
@@ -1877,17 +2573,17 @@ function delimiterRegressions(previous, updated) {
1877
2573
  ["square", "[", "]"],
1878
2574
  ["paren", "(", ")"]
1879
2575
  ];
1880
- return delimiters.flatMap(([name, open4, close]) => {
1881
- if (!previous.includes(open4) || !previous.includes(close)) return [];
1882
- const before = balance(previous, open4, close);
1883
- const after = balance(updated, open4, close);
2576
+ return delimiters.flatMap(([name, open5, close]) => {
2577
+ if (!previous.includes(open5) || !previous.includes(close)) return [];
2578
+ const before = balance(previous, open5, close);
2579
+ const after = balance(updated, open5, close);
1884
2580
  return before === 0 && after !== 0 ? [`${name} delimiter balance changed from 0 to ${after}`] : [];
1885
2581
  });
1886
2582
  }
1887
- function balance(content, open4, close) {
2583
+ function balance(content, open5, close) {
1888
2584
  let count = 0;
1889
2585
  for (const character of content) {
1890
- if (character === open4) count += 1;
2586
+ if (character === open5) count += 1;
1891
2587
  else if (character === close) count -= 1;
1892
2588
  }
1893
2589
  return count;
@@ -1933,7 +2629,7 @@ function getProcessFilesystemMutationCoordinator() {
1933
2629
  }
1934
2630
 
1935
2631
  // plugins/filesystem/source/path-service.ts
1936
- var import_node_path6 = require("node:path");
2632
+ var import_node_path8 = require("node:path");
1937
2633
  var FILESYSTEM_LOCATIONS = Object.freeze([
1938
2634
  "agent_work",
1939
2635
  "workspace"
@@ -1951,7 +2647,7 @@ function logicalParent(logicalPath) {
1951
2647
  if (logicalPath === "." || logicalPath === "workspace") {
1952
2648
  return logicalPath;
1953
2649
  }
1954
- return import_node_path6.posix.dirname(logicalPath);
2650
+ return import_node_path8.posix.dirname(logicalPath);
1955
2651
  }
1956
2652
  function createFilesystemPathService(fallbackResolver) {
1957
2653
  return Object.freeze({
@@ -1966,7 +2662,7 @@ function createFilesystemPathService(fallbackResolver) {
1966
2662
  },
1967
2663
  sibling(target, name, context) {
1968
2664
  const parent = logicalParent(target.logicalPath);
1969
- const logicalPath = parent === "." ? name : import_node_path6.posix.join(parent, name);
2665
+ const logicalPath = parent === "." ? name : import_node_path8.posix.join(parent, name);
1970
2666
  return resolveWith(resolverFor(fallbackResolver, context), logicalPath);
1971
2667
  }
1972
2668
  });
@@ -2116,7 +2812,13 @@ function createWriteFileHandler(paths, mutations) {
2116
2812
  await atomicWriteText({
2117
2813
  target,
2118
2814
  content: prepared2.content,
2119
- expectedVersion: snapshot.version
2815
+ expectedVersion: snapshot.version,
2816
+ onCommitted: (root) => reportCommittedFileOutput(
2817
+ context,
2818
+ target,
2819
+ previousContent === null ? "created" : "updated",
2820
+ root
2821
+ )
2120
2822
  });
2121
2823
  return result;
2122
2824
  });