@abot-ai/runtime 1.6.0 → 1.8.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 (750) hide show
  1. package/README.md +2 -0
  2. package/dist/src/bridge/request-steering.js +60 -15
  3. package/dist/src/capabilities/normal-invocation/contracts.d.ts +3 -0
  4. package/dist/src/capabilities/normal-invocation/output-channels.d.ts +10 -0
  5. package/dist/src/capabilities/normal-invocation/output-channels.js +29 -0
  6. package/dist/src/capabilities/normal-invocation/validator.js +4 -2
  7. package/dist/src/capabilities/tool-request-resources.d.ts +3 -0
  8. package/dist/src/capabilities/tool-types.d.ts +1 -1
  9. package/dist/src/cli/abot.js +2 -0
  10. package/dist/src/cli/host-companion-bundle.mjs +8003 -6796
  11. package/dist/src/cli/host-companion-entry.js +5 -22
  12. package/dist/src/cli/host-companion-input.d.ts +3 -0
  13. package/dist/src/cli/host-companion-input.js +21 -0
  14. package/dist/src/cli/host-companion-lifecycle.d.ts +11 -0
  15. package/dist/src/cli/host-companion-lifecycle.js +32 -0
  16. package/dist/src/cli/host-companion-setup-target.d.ts +4 -0
  17. package/dist/src/cli/host-companion-setup-target.js +17 -0
  18. package/dist/src/cli/host-companion-startup.d.ts +2 -0
  19. package/dist/src/cli/host-companion-startup.js +7 -2
  20. package/dist/src/cli/host-companion.d.ts +6 -0
  21. package/dist/src/cli/host-companion.js +30 -27
  22. package/dist/src/cli/windows-companion-store-entry.d.ts +9 -0
  23. package/dist/src/cli/windows-companion-store-entry.js +67 -0
  24. package/dist/src/computer-access/collection-consent.d.ts +9 -0
  25. package/dist/src/computer-access/collection-consent.js +47 -0
  26. package/dist/src/computer-access/command-output-capture.d.ts +48 -0
  27. package/dist/src/computer-access/command-output-capture.js +202 -0
  28. package/dist/src/computer-access/command-output-protection.d.ts +17 -0
  29. package/dist/src/computer-access/command-output-protection.js +59 -0
  30. package/dist/src/computer-access/command-output-retention.d.ts +5 -0
  31. package/dist/src/computer-access/command-output-retention.js +90 -0
  32. package/dist/src/computer-access/command-output.d.ts +7 -0
  33. package/dist/src/computer-access/command-output.js +1 -0
  34. package/dist/src/computer-access/commands.d.ts +1 -0
  35. package/dist/src/computer-access/commands.js +1 -1
  36. package/dist/src/computer-access/companion/command-output-protocol.d.ts +12 -0
  37. package/dist/src/computer-access/companion/command-output-protocol.js +28 -0
  38. package/dist/src/computer-access/companion/command-output.d.ts +14 -0
  39. package/dist/src/computer-access/companion/command-output.js +127 -0
  40. package/dist/src/computer-access/companion/install-link-macos.d.ts +7 -0
  41. package/dist/src/computer-access/companion/install-link-macos.js +49 -0
  42. package/dist/src/computer-access/companion/install-link-registration.d.ts +4 -0
  43. package/dist/src/computer-access/companion/install-link-registration.js +184 -0
  44. package/dist/src/computer-access/companion/install-link-windows.d.ts +4 -0
  45. package/dist/src/computer-access/companion/install-link-windows.js +65 -0
  46. package/dist/src/computer-access/companion/install-link.d.ts +9 -0
  47. package/dist/src/computer-access/companion/install-link.js +54 -0
  48. package/dist/src/computer-access/companion/native-messages.js +3 -0
  49. package/dist/src/computer-access/companion/native-notifications.js +3 -2
  50. package/dist/src/computer-access/companion/native-session.d.ts +1 -0
  51. package/dist/src/computer-access/companion/native-session.js +20 -4
  52. package/dist/src/computer-access/companion/native-supervisor.js +1 -0
  53. package/dist/src/computer-access/companion/notification-windows.d.ts +1 -1
  54. package/dist/src/computer-access/companion/notification-windows.js +8 -3
  55. package/dist/src/computer-access/companion/observation-filter.js +2 -26
  56. package/dist/src/computer-access/companion/observation-process.d.ts +2 -0
  57. package/dist/src/computer-access/companion/observation-process.js +51 -25
  58. package/dist/src/computer-access/companion/observation-redaction.d.ts +2 -7
  59. package/dist/src/computer-access/companion/observation-redaction.js +2 -111
  60. package/dist/src/computer-access/companion/protocol.d.ts +1 -1
  61. package/dist/src/computer-access/companion/protocol.js +6 -0
  62. package/dist/src/computer-access/companion/release-version.d.ts +1 -1
  63. package/dist/src/computer-access/companion/release-version.js +1 -1
  64. package/dist/src/computer-access/companion/secret-protection-protocol.d.ts +6 -0
  65. package/dist/src/computer-access/companion/secret-protection-protocol.js +6 -0
  66. package/dist/src/computer-access/companion/windows-store/connection-error.d.ts +7 -0
  67. package/dist/src/computer-access/companion/windows-store/connection-error.js +19 -0
  68. package/dist/src/computer-access/companion/windows-store/connection-link.d.ts +13 -0
  69. package/dist/src/computer-access/companion/windows-store/connection-link.js +109 -0
  70. package/dist/src/computer-access/companion/windows-store/identity.d.ts +13 -0
  71. package/dist/src/computer-access/companion/windows-store/identity.js +13 -0
  72. package/dist/src/computer-access/companion/windows-store/lifecycle.d.ts +5 -0
  73. package/dist/src/computer-access/companion/windows-store/lifecycle.js +90 -0
  74. package/dist/src/computer-access/computer/companion-sessions.js +7 -6
  75. package/dist/src/computer-access/computer/unix-native-process.js +23 -11
  76. package/dist/src/computer-access/contracts.d.ts +1 -1
  77. package/dist/src/computer-access/handlers.d.ts +3 -1
  78. package/dist/src/computer-access/handlers.js +83 -11
  79. package/dist/src/computer-access/host-observation.d.ts +3 -3
  80. package/dist/src/computer-access/native-observation-connection.d.ts +12 -0
  81. package/dist/src/computer-access/native-observation-connection.js +78 -0
  82. package/dist/src/computer-access/native-observation-ownership.d.ts +6 -0
  83. package/dist/src/computer-access/native-observation-ownership.js +55 -0
  84. package/dist/src/computer-access/native-observation-shutdown.d.ts +7 -0
  85. package/dist/src/computer-access/native-observation-shutdown.js +58 -0
  86. package/dist/src/computer-access/observation-source.d.ts +6 -0
  87. package/dist/src/computer-access/observation-source.js +10 -0
  88. package/dist/src/computer-access/process-capture.d.ts +6 -0
  89. package/dist/src/computer-access/process-capture.js +1 -0
  90. package/dist/src/computer-access/process-result.d.ts +2 -0
  91. package/dist/src/computer-access/process-result.js +14 -6
  92. package/dist/src/computer-access/process-runner.d.ts +2 -1
  93. package/dist/src/computer-access/process-runner.js +21 -13
  94. package/dist/src/computer-access/security/desktop-result.d.ts +8 -0
  95. package/dist/src/computer-access/security/desktop-result.js +146 -0
  96. package/dist/src/computer-access/security/observed-error.d.ts +2 -0
  97. package/dist/src/computer-access/security/observed-error.js +10 -0
  98. package/dist/src/computer-access/security/secret-text.d.ts +7 -0
  99. package/dist/src/computer-access/security/secret-text.js +111 -0
  100. package/dist/src/computer-access/security/system-results.d.ts +2 -0
  101. package/dist/src/computer-access/security/system-results.js +53 -0
  102. package/dist/src/computer-access/system-result-protection.d.ts +11 -0
  103. package/dist/src/computer-access/system-result-protection.js +1 -0
  104. package/dist/src/model-gateway/observability/provider-response-capture.d.ts +60 -0
  105. package/dist/src/model-gateway/observability/provider-response-capture.js +68 -0
  106. package/dist/src/model-gateway/observability/provider-response-prefix.d.ts +7 -0
  107. package/dist/src/model-gateway/observability/provider-response-prefix.js +14 -0
  108. package/dist/src/model-gateway/observability/provider-response-tail.d.ts +8 -0
  109. package/dist/src/model-gateway/observability/provider-response-tail.js +28 -0
  110. package/dist/src/model-gateway/observability/provider-sse-diagnostics.d.ts +30 -0
  111. package/dist/src/model-gateway/observability/provider-sse-diagnostics.js +119 -0
  112. package/dist/src/model-gateway/observability/provider-trace.js +30 -8
  113. package/dist/src/model-gateway/providers/ollama/adapter.js +8 -2
  114. package/dist/src/model-gateway/providers/ollama/stream-normalizer.js +70 -50
  115. package/dist/src/model-gateway/providers/ollama/stream-termination.d.ts +6 -0
  116. package/dist/src/model-gateway/providers/ollama/stream-termination.js +20 -0
  117. package/dist/src/model-gateway/providers/openai/adapter.js +9 -7
  118. package/dist/src/model-gateway/providers/openai/diagnostics.d.ts +0 -1
  119. package/dist/src/model-gateway/providers/openai/diagnostics.js +0 -9
  120. package/dist/src/model-gateway/providers/openai/function-output.d.ts +11 -0
  121. package/dist/src/model-gateway/providers/openai/function-output.js +37 -0
  122. package/dist/src/model-gateway/providers/openai/function-result.d.ts +7 -0
  123. package/dist/src/model-gateway/providers/openai/function-result.js +35 -0
  124. package/dist/src/model-gateway/providers/openai/message-output-policy.d.ts +3 -0
  125. package/dist/src/model-gateway/providers/openai/message-output-policy.js +16 -0
  126. package/dist/src/model-gateway/providers/openai/payload.d.ts +0 -2
  127. package/dist/src/model-gateway/providers/openai/payload.js +6 -23
  128. package/dist/src/model-gateway/providers/openai/response-lifetime.d.ts +2 -0
  129. package/dist/src/model-gateway/providers/openai/response-lifetime.js +64 -0
  130. package/dist/src/model-gateway/providers/openai/sse-data.d.ts +9 -0
  131. package/dist/src/model-gateway/providers/openai/sse-data.js +67 -0
  132. package/dist/src/model-gateway/providers/openai/stream-normalizer.d.ts +10 -22
  133. package/dist/src/model-gateway/providers/openai/stream-normalizer.js +78 -79
  134. package/dist/src/model-gateway/providers/openai/stream.js +13 -41
  135. package/dist/src/model-gateway/providers/openai/structured-message-output.d.ts +42 -0
  136. package/dist/src/model-gateway/providers/openai/structured-message-output.js +175 -0
  137. package/dist/src/model-gateway/server/configuration.d.ts +2 -0
  138. package/dist/src/model-gateway/server/configuration.js +73 -21
  139. package/dist/src/model-gateway/server.js +5 -1
  140. package/dist/src/plugin-contract/index.d.ts +1 -0
  141. package/dist/src/plugin-contract/index.js +1 -0
  142. package/dist/src/plugin-contract/install-source.d.ts +13 -0
  143. package/dist/src/plugin-contract/install-source.js +99 -0
  144. package/dist/src/plugin-contract/manifest.d.ts +4 -1
  145. package/dist/src/plugin-contract/manifest.js +1 -0
  146. package/dist/src/plugin-contract/platform-compatibility.d.ts +16 -0
  147. package/dist/src/plugin-contract/platform-compatibility.js +3 -0
  148. package/dist/src/plugin-sdk/computer-access.d.ts +12 -0
  149. package/dist/src/plugin-sdk/computer-access.js +6 -0
  150. package/dist/src/plugin-sdk/files-windows/process.d.ts +3 -0
  151. package/dist/src/plugin-sdk/files-windows/process.js +93 -0
  152. package/dist/src/plugin-sdk/files-windows/read-script.d.ts +1 -0
  153. package/dist/src/plugin-sdk/files-windows/read-script.js +43 -0
  154. package/dist/src/plugin-sdk/files-windows/read.d.ts +6 -0
  155. package/dist/src/plugin-sdk/files-windows/read.js +56 -0
  156. package/dist/src/plugin-sdk/files-windows/result.d.ts +4 -0
  157. package/dist/src/plugin-sdk/files-windows/result.js +67 -0
  158. package/dist/src/plugin-sdk/files.js +4 -0
  159. package/dist/src/plugin-sdk/index.d.ts +1 -0
  160. package/dist/src/plugin-sdk/index.js +1 -0
  161. package/dist/src/plugin-sdk/mutation-result.d.ts +7 -0
  162. package/dist/src/plugin-sdk/mutation-result.js +11 -0
  163. package/dist/src/runtime/adapters/in-memory-session-store.js +6 -16
  164. package/dist/src/runtime/adapters/long-term-memory/file-lock/acquisition.js +20 -3
  165. package/dist/src/runtime/adapters/long-term-memory/file-lock/owner-record.js +3 -1
  166. package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.d.ts +3 -0
  167. package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.js +20 -0
  168. package/dist/src/runtime/adapters/long-term-memory/file-lock/snapshot.js +7 -3
  169. package/dist/src/runtime/adapters/passive-learning-runtime.d.ts +1 -1
  170. package/dist/src/runtime/adapters/passive-learning-runtime.js +3 -3
  171. package/dist/src/runtime/adapters/runtime-observation-connection.d.ts +5 -0
  172. package/dist/src/runtime/adapters/runtime-observation-connection.js +13 -0
  173. package/dist/src/runtime/admin/config-control.js +2 -1
  174. package/dist/src/runtime/automations/catalog.d.ts +3 -0
  175. package/dist/src/runtime/automations/catalog.js +1 -0
  176. package/dist/src/runtime/automations/model-dependency-projection.d.ts +2 -0
  177. package/dist/src/runtime/automations/service.d.ts +2 -0
  178. package/dist/src/runtime/capabilities/automation-builder/authoring-reference.d.ts +10 -5
  179. package/dist/src/runtime/capabilities/automation-builder/authoring-reference.js +8 -7
  180. package/dist/src/runtime/capabilities/automation-builder/payload-instructions.d.ts +2 -2
  181. package/dist/src/runtime/capabilities/automation-builder/payload-instructions.js +2 -2
  182. package/dist/src/runtime/capabilities/automation-builder/tool-contract.d.ts +2 -2
  183. package/dist/src/runtime/capabilities/automations/authoring-catalog.js +1 -1
  184. package/dist/src/runtime/capabilities/automations/authoring-preparation.d.ts +11 -5
  185. package/dist/src/runtime/capabilities/automations/tool-module.js +1 -1
  186. package/dist/src/runtime/capabilities/request-permission-catalog.d.ts +3 -1
  187. package/dist/src/runtime/capabilities/request-permission-catalog.js +21 -2
  188. package/dist/src/runtime/capabilities/request-permission-tool-registry.d.ts +2 -1
  189. package/dist/src/runtime/capabilities/request-permission-tool-registry.js +18 -10
  190. package/dist/src/runtime/capabilities/request-runtime-tool-registry.d.ts +2 -0
  191. package/dist/src/runtime/capabilities/request-runtime-tool-registry.js +1 -1
  192. package/dist/src/runtime/capabilities/scheduling/create-operations.d.ts +6 -0
  193. package/dist/src/runtime/config/builders.js +6 -5
  194. package/dist/src/runtime/config/effective-model-config-validation.js +4 -35
  195. package/dist/src/runtime/config/fields.js +15 -0
  196. package/dist/src/runtime/config/model-context-capacity.d.ts +20 -0
  197. package/dist/src/runtime/config/model-context-capacity.js +55 -0
  198. package/dist/src/runtime/config/model-execution-policy.d.ts +5 -1
  199. package/dist/src/runtime/config/model-execution-policy.js +16 -0
  200. package/dist/src/runtime/config/model-plugin-config.d.ts +8 -0
  201. package/dist/src/runtime/config/model-plugin-config.js +40 -0
  202. package/dist/src/runtime/config/schema.js +5 -1
  203. package/dist/src/runtime/config/validation/model-profile-validation.js +2 -0
  204. package/dist/src/runtime/config/validation/runtime-config-validation-contract.d.ts +3 -1
  205. package/dist/src/runtime/config/validation/runtime-config-validation-contract.js +3 -1
  206. package/dist/src/runtime/config/validation/runtime-root-section-validation.js +11 -4
  207. package/dist/src/runtime/config/validation/web-ui-config-validation.js +3 -2
  208. package/dist/src/runtime/config/web-ui.d.ts +5 -0
  209. package/dist/src/runtime/config/web-ui.js +5 -0
  210. package/dist/src/runtime/config.js +2 -0
  211. package/dist/src/runtime/local-application.d.ts +2 -0
  212. package/dist/src/runtime/local-host/app-owner.js +50 -6
  213. package/dist/src/runtime/local-host/app-request-control.d.ts +3 -1
  214. package/dist/src/runtime/local-host/app-request-control.js +91 -11
  215. package/dist/src/runtime/local-host/client-requests.js +32 -5
  216. package/dist/src/runtime/local-host/client-services.d.ts +2 -0
  217. package/dist/src/runtime/local-host/local-request-diagnostics.d.ts +9 -0
  218. package/dist/src/runtime/local-host/local-request-diagnostics.js +47 -0
  219. package/dist/src/runtime/local-host/saved-approvals.js +23 -2
  220. package/dist/src/runtime/local-host/windows-private-access.js +2 -0
  221. package/dist/src/runtime/model/model-selection.js +4 -1
  222. package/dist/src/runtime/observability/request-control-diagnostics.d.ts +6 -0
  223. package/dist/src/runtime/observability/request-control-diagnostics.js +52 -0
  224. package/dist/src/runtime/passive-learning/application-catalog.js +3 -1
  225. package/dist/src/runtime/passive-learning/collection-source.js +7 -0
  226. package/dist/src/runtime/passive-learning/service.js +2 -3
  227. package/dist/src/runtime/passive-learning/status-projection.d.ts +2 -0
  228. package/dist/src/runtime/passive-learning/status-projection.js +9 -0
  229. package/dist/src/runtime/plugins/configuration-context.d.ts +9 -0
  230. package/dist/src/runtime/plugins/configuration-context.js +42 -0
  231. package/dist/src/runtime/plugins/configuration-settings.d.ts +2 -0
  232. package/dist/src/runtime/plugins/configuration-settings.js +26 -0
  233. package/dist/src/runtime/plugins/configuration-store.d.ts +23 -0
  234. package/dist/src/runtime/plugins/configuration-store.js +100 -0
  235. package/dist/src/runtime/plugins/configuration-write.d.ts +5 -0
  236. package/dist/src/runtime/plugins/configuration-write.js +58 -0
  237. package/dist/src/runtime/plugins/installation/archive.d.ts +2 -0
  238. package/dist/src/runtime/plugins/installation/archive.js +107 -0
  239. package/dist/src/runtime/plugins/installation/github-download.d.ts +9 -0
  240. package/dist/src/runtime/plugins/installation/github-download.js +72 -0
  241. package/dist/src/runtime/plugins/installation/installed-package.d.ts +9 -0
  242. package/dist/src/runtime/plugins/installation/installed-package.js +66 -0
  243. package/dist/src/runtime/plugins/installation/package.d.ts +53 -0
  244. package/dist/src/runtime/plugins/installation/package.js +81 -0
  245. package/dist/src/runtime/plugins/installation/portable-path.d.ts +2 -0
  246. package/dist/src/runtime/plugins/installation/portable-path.js +10 -0
  247. package/dist/src/runtime/plugins/installation/publication.d.ts +10 -0
  248. package/dist/src/runtime/plugins/installation/publication.js +17 -0
  249. package/dist/src/runtime/plugins/installation/service.d.ts +48 -0
  250. package/dist/src/runtime/plugins/installation/service.js +80 -0
  251. package/dist/src/runtime/plugins/loader.js +34 -38
  252. package/dist/src/runtime/plugins/manifest-platform-compatibility.d.ts +2 -0
  253. package/dist/src/runtime/plugins/manifest-platform-compatibility.js +39 -0
  254. package/dist/src/runtime/plugins/manifest-projection.js +1 -0
  255. package/dist/src/runtime/plugins/manifest-validator.js +12 -1
  256. package/dist/src/runtime/plugins/module-cache.d.ts +2 -0
  257. package/dist/src/runtime/plugins/module-cache.js +19 -0
  258. package/dist/src/runtime/plugins/platform-compatibility.d.ts +4 -0
  259. package/dist/src/runtime/plugins/platform-compatibility.js +44 -0
  260. package/dist/src/runtime/plugins/selection.d.ts +2 -0
  261. package/dist/src/runtime/plugins/selection.js +16 -11
  262. package/dist/src/runtime/ports.d.ts +6 -4
  263. package/dist/src/runtime/request/approval-wait/activation-events.js +19 -7
  264. package/dist/src/runtime/request/approval-wait/execution-compaction-restore.d.ts +20 -0
  265. package/dist/src/runtime/request/approval-wait/execution-compaction-restore.js +118 -0
  266. package/dist/src/runtime/request/approval-wait/super-compaction-restore.js +2 -1
  267. package/dist/src/runtime/request/dependencies.d.ts +2 -1
  268. package/dist/src/runtime/request/execution-payload-compacted-evidence.d.ts +1 -1
  269. package/dist/src/runtime/request/handler.js +8 -0
  270. package/dist/src/runtime/request/prepared-execution.js +9 -1
  271. package/dist/src/runtime/request/request-steering.d.ts +4 -0
  272. package/dist/src/runtime/request/request-steering.js +37 -12
  273. package/dist/src/runtime/request/worker-capability-composition.d.ts +2 -0
  274. package/dist/src/runtime/request/worker-capability-composition.js +4 -1
  275. package/dist/src/runtime/scheduler/journal-index-state.d.ts +1 -1
  276. package/dist/src/runtime/steps/execution-agent/capability-result-context.d.ts +6 -0
  277. package/dist/src/runtime/steps/execution-agent/capability-result-context.js +29 -0
  278. package/dist/src/runtime/steps/execution-agent/format.js +2 -3
  279. package/dist/src/runtime/steps/execution-agent/input.js +1 -1
  280. package/dist/src/runtime/steps/execution-agent/prompt.js +5 -5
  281. package/dist/src/runtime/steps/execution-agent/response-prompt.js +1 -0
  282. package/dist/src/runtime/steps/execution-agent/state-context.d.ts +2 -3
  283. package/dist/src/runtime/steps/execution-agent/state-context.js +26 -35
  284. package/dist/src/runtime/steps/execution-agent/work-plan-contract.d.ts +1 -3
  285. package/dist/src/runtime/steps/execution-agent/work-plan-contract.js +0 -55
  286. package/dist/src/runtime/steps/execution-agent/work-plan-schema.d.ts +3 -0
  287. package/dist/src/runtime/steps/execution-agent/work-plan-schema.js +61 -0
  288. package/dist/src/sessions/assistant-initiative-message.d.ts +3 -0
  289. package/dist/src/sessions/assistant-initiative-message.js +12 -0
  290. package/dist/src/sessions/assistant-initiative.d.ts +2 -2
  291. package/dist/src/sessions/assistant-initiative.js +1 -7
  292. package/dist/src/sessions/durable-session-commit.d.ts +2 -1
  293. package/dist/src/sessions/durable-session-commit.js +9 -4
  294. package/dist/src/sessions/metadata/projection.d.ts +15 -0
  295. package/dist/src/sessions/metadata/projection.js +55 -0
  296. package/dist/src/sessions/metadata/publication.d.ts +12 -0
  297. package/dist/src/sessions/metadata/publication.js +78 -0
  298. package/dist/src/sessions/metadata/source-receipt.d.ts +5 -0
  299. package/dist/src/sessions/metadata/source-receipt.js +42 -0
  300. package/dist/src/sessions/metadata/store.d.ts +7 -0
  301. package/dist/src/sessions/metadata/store.js +119 -0
  302. package/dist/src/sessions/prepared-session-replacement.d.ts +6 -0
  303. package/dist/src/sessions/prepared-session-replacement.js +46 -0
  304. package/dist/src/sessions/record/projection.d.ts +3 -1
  305. package/dist/src/sessions/record/projection.js +26 -18
  306. package/dist/src/sessions/request-lifecycle/service.js +3 -3
  307. package/dist/src/sessions/session-service.d.ts +2 -4
  308. package/dist/src/sessions/session-service.js +4 -16
  309. package/dist/src/sessions/session-store.d.ts +2 -1
  310. package/dist/src/sessions/session-store.js +11 -5
  311. package/dist/src/sessions/snapshot.d.ts +17 -0
  312. package/dist/src/sessions/snapshot.js +105 -0
  313. package/dist/src/sessions/types.d.ts +2 -0
  314. package/dist/src/shared/passive-observation-self-exclusion.d.ts +5 -0
  315. package/dist/src/shared/passive-observation-self-exclusion.js +37 -0
  316. package/dist/src/shared/tool-selection.d.ts +2 -0
  317. package/dist/src/shared/tool-selection.js +7 -0
  318. package/dist/src/shared/windows-file-io/authority-script.d.ts +1 -0
  319. package/dist/src/shared/windows-file-io/authority-script.js +94 -0
  320. package/dist/src/shared/windows-file-io/native-script.d.ts +2 -0
  321. package/dist/src/shared/windows-file-io/native-script.js +120 -0
  322. package/dist/src/shared/windows-file-io/read-bytes-script.d.ts +1 -0
  323. package/dist/src/shared/windows-file-io/read-bytes-script.js +18 -0
  324. package/dist/src/shared/windows-job-object.d.ts +2 -0
  325. package/dist/src/shared/windows-job-object.js +66 -0
  326. package/dist/src/web-ui/app/ARCHITECTURE.md +14 -0
  327. package/dist/src/web-ui/app/app-bootstrap.js +14 -1
  328. package/dist/src/web-ui/app/app-state.js +0 -7
  329. package/dist/src/web-ui/app/app.js +59 -159
  330. package/dist/src/web-ui/app/components/automations/node-inspector.js +3 -2
  331. package/dist/src/web-ui/app/components/automations/step-editor-dialog.js +3 -0
  332. package/dist/src/web-ui/app/components/composer-submission-notice.js +50 -0
  333. package/dist/src/web-ui/app/components/config-workspace/config-model.js +2 -0
  334. package/dist/src/web-ui/app/components/config-workspace/model-plugin-permissions.js +136 -0
  335. package/dist/src/web-ui/app/components/config-workspace/model-plugin-selection.js +180 -0
  336. package/dist/src/web-ui/app/components/config-workspace/model-plugin-view-state.js +114 -0
  337. package/dist/src/web-ui/app/components/config-workspace/model-rendering.js +3 -0
  338. package/dist/src/web-ui/app/components/config-workspace/model-summary.js +39 -0
  339. package/dist/src/web-ui/app/components/config-workspace/summary-rendering.js +30 -0
  340. package/dist/src/web-ui/app/components/config-workspace/workspace-events.js +37 -0
  341. package/dist/src/web-ui/app/components/config-workspace/workspace-mutations.js +24 -2
  342. package/dist/src/web-ui/app/components/config-workspace/workspace-persistence.js +9 -1
  343. package/dist/src/web-ui/app/components/config-workspace/workspace-view.js +23 -67
  344. package/dist/src/web-ui/app/components/config-workspace.js +11 -2
  345. package/dist/src/web-ui/app/components/conversation-view.js +36 -5
  346. package/dist/src/web-ui/app/components/dashboard/recent-conversations.js +2 -1
  347. package/dist/src/web-ui/app/components/dashboard/workspace.js +2 -1
  348. package/dist/src/web-ui/app/components/home-guidance/daily-review.js +2 -2
  349. package/dist/src/web-ui/app/components/home-guidance/home-guidance.js +20 -6
  350. package/dist/src/web-ui/app/components/model-setup/context-window-feedback.js +53 -0
  351. package/dist/src/web-ui/app/components/model-setup/save-flow.js +3 -1
  352. package/dist/src/web-ui/app/components/model-setup/save-outcome.js +1 -0
  353. package/dist/src/web-ui/app/components/model-setup/wizard.js +12 -0
  354. package/dist/src/web-ui/app/components/operations-summary.js +105 -0
  355. package/dist/src/web-ui/app/components/passive-learning/activity-controls.js +4 -0
  356. package/dist/src/web-ui/app/components/passive-learning/collection-access.js +35 -0
  357. package/dist/src/web-ui/app/components/passive-learning/collection-consent-dialog.js +59 -0
  358. package/dist/src/web-ui/app/components/passive-learning/collection-consent-gate.js +94 -0
  359. package/dist/src/web-ui/app/components/passive-learning/computer-update-notice.js +6 -0
  360. package/dist/src/web-ui/app/components/passive-learning/failure-copy.js +1 -0
  361. package/dist/src/web-ui/app/components/passive-learning/home.js +8 -11
  362. package/dist/src/web-ui/app/components/passive-learning/macos-collection-restart-notice.js +1 -0
  363. package/dist/src/web-ui/app/components/passive-learning/memory.js +2 -4
  364. package/dist/src/web-ui/app/components/passive-learning/workspace-view.js +2 -2
  365. package/dist/src/web-ui/app/components/plugins/compatibility.js +13 -0
  366. package/dist/src/web-ui/app/components/plugins/configuration-draft.js +34 -0
  367. package/dist/src/web-ui/app/components/plugins/configuration-editor.js +147 -0
  368. package/dist/src/web-ui/app/components/plugins/configuration-fields.js +103 -0
  369. package/dist/src/web-ui/app/components/plugins/configuration-retained-secrets.js +20 -0
  370. package/dist/src/web-ui/app/components/plugins/configuration-settings.js +108 -0
  371. package/dist/src/web-ui/app/components/plugins/discovery-rendering.js +45 -0
  372. package/dist/src/web-ui/app/components/plugins/installation-compatibility.js +7 -0
  373. package/dist/src/web-ui/app/components/plugins/installation.js +213 -0
  374. package/dist/src/web-ui/app/components/plugins/manager.js +160 -6
  375. package/dist/src/web-ui/app/components/plugins/removal.js +130 -0
  376. package/dist/src/web-ui/app/components/plugins/rendering.js +17 -2
  377. package/dist/src/web-ui/app/components/plugins/summary.js +54 -0
  378. package/dist/src/web-ui/app/components/plugins/tabs.js +31 -0
  379. package/dist/src/web-ui/app/components/plugins/view-state.js +3 -1
  380. package/dist/src/web-ui/app/components/reasoning-override-prompt.js +82 -0
  381. package/dist/src/web-ui/app/components/runtime-config-activation.js +22 -8
  382. package/dist/src/web-ui/app/components/runtime-setup/connection-form.js +5 -2
  383. package/dist/src/web-ui/app/components/runtime-setup/connection-state.js +9 -1
  384. package/dist/src/web-ui/app/components/runtime-setup/context-window-feedback.js +71 -0
  385. package/dist/src/web-ui/app/components/runtime-setup/optional-steps.js +9 -4
  386. package/dist/src/web-ui/app/components/runtime-setup/plugins.js +3 -1
  387. package/dist/src/web-ui/app/components/runtime-setup/rendering.js +6 -4
  388. package/dist/src/web-ui/app/components/runtime-setup-guide.d.ts +1 -0
  389. package/dist/src/web-ui/app/components/runtime-setup-guide.js +15 -3
  390. package/dist/src/web-ui/app/components/schedules/form.js +10 -8
  391. package/dist/src/web-ui/app/components/schedules/workspace.js +23 -4
  392. package/dist/src/web-ui/app/components/session-sidebar-sections.js +2 -2
  393. package/dist/src/web-ui/app/components/spark-chat/empty-state.js +1 -0
  394. package/dist/src/web-ui/app/components/spark-chat/handoff-actions.js +9 -3
  395. package/dist/src/web-ui/app/components/spark-chat/panel.js +1 -0
  396. package/dist/src/web-ui/app/components/spark-chat/placement.js +4 -7
  397. package/dist/src/web-ui/app/components/spark-chat/settings.js +7 -3
  398. package/dist/src/web-ui/app/components/system-host/connection-card.js +35 -0
  399. package/dist/src/web-ui/app/components/system-host/macos-permissions.js +2 -0
  400. package/dist/src/web-ui/app/components/system-host/macos-setup.js +1 -1
  401. package/dist/src/web-ui/app/components/system-host/manager.js +45 -12
  402. package/dist/src/web-ui/app/components/system-host/native-windows-access.js +50 -0
  403. package/dist/src/web-ui/app/components/system-host/rendering.js +114 -106
  404. package/dist/src/web-ui/app/components/system-host/windows-store-setup.js +293 -0
  405. package/dist/src/web-ui/app/components/workspace-shell.js +6 -0
  406. package/dist/src/web-ui/app/components/workspace-storage-notice.js +37 -0
  407. package/dist/src/web-ui/app/computer-access-feature.js +22 -5
  408. package/dist/src/web-ui/app/configuration-environment-refresh.js +27 -34
  409. package/dist/src/web-ui/app/configuration-feature.js +44 -3
  410. package/dist/src/web-ui/app/controllers/app-event-bindings.js +41 -105
  411. package/dist/src/web-ui/app/controllers/chat-request-controller.d.ts +28 -0
  412. package/dist/src/web-ui/app/controllers/chat-request-controller.js +34 -66
  413. package/dist/src/web-ui/app/controllers/composer-attachments-controller.d.ts +15 -40
  414. package/dist/src/web-ui/app/controllers/composer-attachments-controller.js +26 -69
  415. package/dist/src/web-ui/app/controllers/composer-draft-view.d.ts +27 -0
  416. package/dist/src/web-ui/app/controllers/composer-draft-view.js +48 -0
  417. package/dist/src/web-ui/app/controllers/composer-drafts.d.ts +55 -0
  418. package/dist/src/web-ui/app/controllers/composer-drafts.js +120 -0
  419. package/dist/src/web-ui/app/controllers/composer-feature.d.ts +65 -0
  420. package/dist/src/web-ui/app/controllers/composer-feature.js +124 -0
  421. package/dist/src/web-ui/app/controllers/composer-queue-controller.d.ts +33 -94
  422. package/dist/src/web-ui/app/controllers/composer-queue-controller.js +185 -251
  423. package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.d.ts +48 -0
  424. package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.js +97 -0
  425. package/dist/src/web-ui/app/controllers/composer-submit-controller.d.ts +30 -61
  426. package/dist/src/web-ui/app/controllers/composer-submit-controller.js +56 -138
  427. package/dist/src/web-ui/app/controllers/composer-surface-controller.js +6 -0
  428. package/dist/src/web-ui/app/controllers/composer-workspace-controller.d.ts +22 -40
  429. package/dist/src/web-ui/app/controllers/composer-workspace-controller.js +49 -165
  430. package/dist/src/web-ui/app/controllers/conversation-navigation-intent.js +15 -0
  431. package/dist/src/web-ui/app/controllers/conversation-read-state-controller.d.ts +1 -0
  432. package/dist/src/web-ui/app/controllers/conversation-read-state-controller.js +7 -3
  433. package/dist/src/web-ui/app/controllers/conversation-request-hydration.js +91 -0
  434. package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +10 -5
  435. package/dist/src/web-ui/app/controllers/conversation-session-controller.js +97 -162
  436. package/dist/src/web-ui/app/controllers/conversation-workspace-activation.js +27 -0
  437. package/dist/src/web-ui/app/controllers/daily-memory-review.js +15 -16
  438. package/dist/src/web-ui/app/controllers/environment-transition.js +126 -0
  439. package/dist/src/web-ui/app/controllers/environment-workspace-preparation.js +18 -0
  440. package/dist/src/web-ui/app/controllers/history-pagination.js +111 -0
  441. package/dist/src/web-ui/app/controllers/home-composer-feature.d.ts +14 -36
  442. package/dist/src/web-ui/app/controllers/home-composer-feature.js +17 -114
  443. package/dist/src/web-ui/app/controllers/home-conversation-activation.js +6 -8
  444. package/dist/src/web-ui/app/controllers/operations-controller.d.ts +12 -0
  445. package/dist/src/web-ui/app/controllers/operations-controller.js +28 -21
  446. package/dist/src/web-ui/app/controllers/passive-learning-controller.js +56 -0
  447. package/dist/src/web-ui/app/controllers/projects-controller.d.ts +1 -1
  448. package/dist/src/web-ui/app/controllers/projects-controller.js +6 -1
  449. package/dist/src/web-ui/app/controllers/reasoning-mode-controller.js +174 -0
  450. package/dist/src/web-ui/app/controllers/runtime-onboarding-controller.d.ts +1 -0
  451. package/dist/src/web-ui/app/controllers/runtime-onboarding-controller.js +11 -0
  452. package/dist/src/web-ui/app/controllers/runtime-selection-controller.d.ts +7 -0
  453. package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +20 -155
  454. package/dist/src/web-ui/app/controllers/session-controller.js +43 -19
  455. package/dist/src/web-ui/app/controllers/session-list-pagination.js +71 -0
  456. package/dist/src/web-ui/app/controllers/session-pin-updates.js +14 -0
  457. package/dist/src/web-ui/app/controllers/session-sidebar-controller.js +17 -17
  458. package/dist/src/web-ui/app/controllers/spark-chat-reading.js +1 -0
  459. package/dist/src/web-ui/app/controllers/spark-chat-sync.js +26 -7
  460. package/dist/src/web-ui/app/controllers/steer-controller.js +9 -7
  461. package/dist/src/web-ui/app/controllers/tool-permission-mode-controller.js +1 -1
  462. package/dist/src/web-ui/app/controllers/workspace-conversation-opener.js +34 -0
  463. package/dist/src/web-ui/app/controllers/workspace-route-controller.js +21 -19
  464. package/dist/src/web-ui/app/dashboard-feature.js +4 -3
  465. package/dist/src/web-ui/app/index.html +6 -2
  466. package/dist/src/web-ui/app/lib/history-page-messages.js +49 -0
  467. package/dist/src/web-ui/app/lib/reasoning-controls.js +35 -0
  468. package/dist/src/web-ui/app/lib/request-lifecycle-view.js +8 -0
  469. package/dist/src/web-ui/app/lib/session-composer-queue-ownership.js +58 -0
  470. package/dist/src/web-ui/app/lib/session-composer-queue.d.ts +12 -0
  471. package/dist/src/web-ui/app/lib/session-composer-queue.js +25 -6
  472. package/dist/src/web-ui/app/lib/workspace-route.d.ts +3 -0
  473. package/dist/src/web-ui/app/lib/workspace-route.js +4 -0
  474. package/dist/src/web-ui/app/passive-learning-feature.js +16 -4
  475. package/dist/src/web-ui/app/runtime-onboarding-feature.js +3 -0
  476. package/dist/src/web-ui/app/schedules-feature.js +5 -3
  477. package/dist/src/web-ui/app/services/client-preferences.d.ts +18 -10
  478. package/dist/src/web-ui/app/services/client-preferences.js +25 -16
  479. package/dist/src/web-ui/app/services/home-guidance-preferences.js +13 -13
  480. package/dist/src/web-ui/app/services/reasoning-override.js +12 -0
  481. package/dist/src/web-ui/app/services/runtime-web-client/automations.js +10 -2
  482. package/dist/src/web-ui/app/services/runtime-web-client/configuration.js +20 -0
  483. package/dist/src/web-ui/app/services/runtime-web-client/memory.js +7 -2
  484. package/dist/src/web-ui/app/services/runtime-web-client/plugin-configuration.js +19 -0
  485. package/dist/src/web-ui/app/services/runtime-web-client/spark-chat.js +4 -4
  486. package/dist/src/web-ui/app/services/runtime-web-client/system-host.js +4 -0
  487. package/dist/src/web-ui/app/services/runtime-web-client.d.ts +8 -1
  488. package/dist/src/web-ui/app/services/runtime-web-client.js +14 -3
  489. package/dist/src/web-ui/app/services/server-composer-queue.js +32 -0
  490. package/dist/src/web-ui/app/services/session-sidebar-preferences.js +5 -5
  491. package/dist/src/web-ui/app/services/workspace-state-storage.js +116 -0
  492. package/dist/src/web-ui/app/services/workspace-state.js +27 -0
  493. package/dist/src/web-ui/app/spark-chat-conversation.js +34 -45
  494. package/dist/src/web-ui/app/spark-chat-feature.js +84 -21
  495. package/dist/src/web-ui/app/styles/11-product-links.css +30 -0
  496. package/dist/src/web-ui/app/styles/21-composer-controls.css +16 -0
  497. package/dist/src/web-ui/app/styles/41-plugin-configuration.css +79 -0
  498. package/dist/src/web-ui/app/styles/41-plugin-discovery.css +132 -0
  499. package/dist/src/web-ui/app/styles/41-plugin-management.css +14 -0
  500. package/dist/src/web-ui/app/styles/42-model-plugin-permissions.css +174 -0
  501. package/dist/src/web-ui/app/styles/46-system-host.css +61 -107
  502. package/dist/src/web-ui/app/styles/47-config-controls.css +13 -1
  503. package/dist/src/web-ui/app/styles/49-collection-consent.css +30 -0
  504. package/dist/src/web-ui/app/styles/54-spark-chat.css +33 -1
  505. package/dist/src/web-ui/app/styles/64-workspace-storage.css +23 -0
  506. package/dist/src/web-ui/app/styles.css +6 -0
  507. package/dist/src/web-ui/client-state/contracts.d.ts +15 -0
  508. package/dist/src/web-ui/client-state/contracts.js +13 -0
  509. package/dist/src/web-ui/client-state/preference-shapes.d.ts +2 -0
  510. package/dist/src/web-ui/client-state/preference-shapes.js +80 -0
  511. package/dist/src/web-ui/client-state/preferences.d.ts +3 -0
  512. package/dist/src/web-ui/client-state/preferences.js +84 -0
  513. package/dist/src/web-ui/client-state/queue.d.ts +3 -0
  514. package/dist/src/web-ui/client-state/queue.js +43 -0
  515. package/dist/src/web-ui/client-state/routes.d.ts +7 -0
  516. package/dist/src/web-ui/client-state/routes.js +58 -0
  517. package/dist/src/web-ui/client-state/store.d.ts +14 -0
  518. package/dist/src/web-ui/client-state/store.js +88 -0
  519. package/dist/src/web-ui/local-runtime/api-router.js +11 -6
  520. package/dist/src/web-ui/local-runtime/approval-request-attachment.js +14 -5
  521. package/dist/src/web-ui/local-runtime/configuration-activation-source.d.ts +1 -1
  522. package/dist/src/web-ui/local-runtime/configuration-activation-source.js +11 -3
  523. package/dist/src/web-ui/local-runtime/contracts.d.ts +4 -3
  524. package/dist/src/web-ui/local-runtime/environment-registry.d.ts +5 -1
  525. package/dist/src/web-ui/local-runtime/environment-registry.js +53 -11
  526. package/dist/src/web-ui/local-runtime/history-pagination.d.ts +16 -0
  527. package/dist/src/web-ui/local-runtime/history-pagination.js +20 -0
  528. package/dist/src/web-ui/local-runtime/http.js +11 -2
  529. package/dist/src/web-ui/local-runtime/model-context-capacity-error.d.ts +14 -0
  530. package/dist/src/web-ui/local-runtime/model-context-capacity-error.js +28 -0
  531. package/dist/src/web-ui/local-runtime/model-setup-context-window.d.ts +15 -0
  532. package/dist/src/web-ui/local-runtime/model-setup-context-window.js +25 -0
  533. package/dist/src/web-ui/local-runtime/model-setup-routes.js +2 -0
  534. package/dist/src/web-ui/local-runtime/model-setup-service.js +5 -2
  535. package/dist/src/web-ui/local-runtime/model-setup-validation.d.ts +1 -0
  536. package/dist/src/web-ui/local-runtime/model-setup-validation.js +14 -7
  537. package/dist/src/web-ui/local-runtime/plugin-configuration-routes.d.ts +16 -0
  538. package/dist/src/web-ui/local-runtime/plugin-configuration-routes.js +68 -0
  539. package/dist/src/web-ui/local-runtime/plugin-installation-routes.d.ts +16 -0
  540. package/dist/src/web-ui/local-runtime/plugin-installation-routes.js +96 -0
  541. package/dist/src/web-ui/local-runtime/plugin-management-routes.d.ts +8 -1
  542. package/dist/src/web-ui/local-runtime/plugin-management-routes.js +17 -0
  543. package/dist/src/web-ui/local-runtime/plugin-mutation-admission.d.ts +7 -0
  544. package/dist/src/web-ui/local-runtime/plugin-mutation-admission.js +17 -0
  545. package/dist/src/web-ui/local-runtime/plugin-removal-routes.d.ts +18 -0
  546. package/dist/src/web-ui/local-runtime/plugin-removal-routes.js +60 -0
  547. package/dist/src/web-ui/local-runtime/realtime-controller.js +41 -2
  548. package/dist/src/web-ui/local-runtime/request-body-error.d.ts +11 -0
  549. package/dist/src/web-ui/local-runtime/request-body-error.js +14 -0
  550. package/dist/src/web-ui/local-runtime/request-cancellation-route.js +28 -1
  551. package/dist/src/web-ui/local-runtime/request-control-observation.d.ts +19 -0
  552. package/dist/src/web-ui/local-runtime/request-control-observation.js +80 -0
  553. package/dist/src/web-ui/local-runtime/request-execution.js +66 -34
  554. package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.d.ts +2 -0
  555. package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.js +35 -22
  556. package/dist/src/web-ui/local-runtime/runtime-setup-context-window.d.ts +13 -0
  557. package/dist/src/web-ui/local-runtime/runtime-setup-context-window.js +21 -0
  558. package/dist/src/web-ui/local-runtime/runtime-setup-credentials.d.ts +15 -1
  559. package/dist/src/web-ui/local-runtime/runtime-setup-credentials.js +30 -11
  560. package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.d.ts +20 -0
  561. package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.js +104 -0
  562. package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.d.ts +29 -0
  563. package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.js +151 -0
  564. package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.d.ts +7 -0
  565. package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.js +87 -0
  566. package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.d.ts +3 -0
  567. package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.js +37 -0
  568. package/dist/src/web-ui/local-runtime/runtime-setup-routes.js +2 -0
  569. package/dist/src/web-ui/local-runtime/runtime-setup-service.js +4 -0
  570. package/dist/src/web-ui/local-runtime/runtime-setup-validation.js +9 -2
  571. package/dist/src/web-ui/local-runtime/session-routes.d.ts +1 -0
  572. package/dist/src/web-ui/local-runtime/session-routes.js +16 -4
  573. package/dist/src/web-ui/local-runtime/spark-chat-routes.js +4 -3
  574. package/dist/src/web-ui/local-runtime-backend.js +14 -0
  575. package/dist/src/web-ui/plugin-capability-selection.js +4 -1
  576. package/dist/src/web-ui/plugin-configuration-input.d.ts +12 -0
  577. package/dist/src/web-ui/plugin-configuration-input.js +68 -0
  578. package/dist/src/web-ui/plugin-configuration-retained-secrets.d.ts +9 -0
  579. package/dist/src/web-ui/plugin-configuration-retained-secrets.js +48 -0
  580. package/dist/src/web-ui/plugin-configuration-service.d.ts +52 -0
  581. package/dist/src/web-ui/plugin-configuration-service.js +66 -0
  582. package/dist/src/web-ui/plugin-configuration-view.d.ts +25 -0
  583. package/dist/src/web-ui/plugin-configuration-view.js +45 -0
  584. package/dist/src/web-ui/plugin-disabled-selection.d.ts +7 -0
  585. package/dist/src/web-ui/plugin-disabled-selection.js +17 -0
  586. package/dist/src/web-ui/plugin-management-catalog.d.ts +5 -1
  587. package/dist/src/web-ui/plugin-management-catalog.js +13 -1
  588. package/dist/src/web-ui/plugin-management-selection.js +22 -9
  589. package/dist/src/web-ui/plugin-management-service.d.ts +6 -1
  590. package/dist/src/web-ui/plugin-management-service.js +11 -7
  591. package/dist/src/web-ui/plugin-removal-error.d.ts +7 -0
  592. package/dist/src/web-ui/plugin-removal-error.js +16 -0
  593. package/dist/src/web-ui/plugin-removal-service.d.ts +31 -0
  594. package/dist/src/web-ui/plugin-removal-service.js +109 -0
  595. package/dist/src/web-ui/runtime-setup-gateway.d.ts +6 -2
  596. package/dist/src/web-ui/runtime-setup-gateway.js +30 -10
  597. package/dist/src/web-ui/server-readiness.d.ts +3 -0
  598. package/dist/src/web-ui/server-readiness.js +36 -0
  599. package/dist/src/web-ui/server.d.ts +2 -0
  600. package/dist/src/web-ui/server.js +29 -3
  601. package/dist/src/web-ui/session-read-state/overview.d.ts +42 -0
  602. package/dist/src/web-ui/session-read-state/overview.js +16 -0
  603. package/dist/src/web-ui/session-read-state/pagination.d.ts +15 -0
  604. package/dist/src/web-ui/session-read-state/pagination.js +42 -0
  605. package/dist/src/web-ui/session-read-state/projection.d.ts +4 -3
  606. package/dist/src/web-ui/session-read-state/service.d.ts +213 -20
  607. package/dist/src/web-ui/session-read-state/service.js +25 -23
  608. package/dist/src/web-ui/session-read-state/visible-messages.d.ts +3 -3
  609. package/dist/src/web-ui/system-host-service.js +13 -2
  610. package/dist/src/web-ui/system-host-setup/collection-consent-route.d.ts +3 -0
  611. package/dist/src/web-ui/system-host-setup/collection-consent-route.js +30 -0
  612. package/dist/src/web-ui/system-host-setup/companion-linux.js +1 -1
  613. package/dist/src/web-ui/system-host-setup/installer-contract.d.ts +1 -1
  614. package/dist/src/web-ui/system-host-setup/installer-contract.js +2 -2
  615. package/dist/src/web-ui/system-host-setup/installers.js +0 -7
  616. package/dist/src/web-ui/system-host-setup/local-connection.d.ts +4 -1
  617. package/dist/src/web-ui/system-host-setup/local-connection.js +10 -17
  618. package/dist/src/web-ui/system-host-setup/routes.d.ts +2 -0
  619. package/dist/src/web-ui/system-host-setup/routes.js +32 -9
  620. package/dist/src/web-ui/system-host-setup/setup-mutation.d.ts +9 -0
  621. package/dist/src/web-ui/system-host-setup/setup-mutation.js +27 -0
  622. package/dist/src/web-ui/system-host-setup/windows-store-route.d.ts +13 -0
  623. package/dist/src/web-ui/system-host-setup/windows-store-route.js +68 -0
  624. package/docs/configuration.md +46 -0
  625. package/docs/installation.md +88 -28
  626. package/docs/plugins.md +310 -6
  627. package/docs/projects-and-full-plus.md +2 -6
  628. package/docs/runtime-library.md +0 -1
  629. package/docs/tool-execution-result-evidence-contract.md +57 -0
  630. package/docs/windows-companion-store.md +132 -0
  631. package/package.json +6 -4
  632. package/plugins/capability-brief/plugin.json +4 -0
  633. package/plugins/code-outline/README.md +20 -0
  634. package/plugins/code-outline/plugin.json +1 -0
  635. package/plugins/code-outline/source/index.ts +16 -20
  636. package/plugins/code-outline/source/read-failure.ts +40 -0
  637. package/plugins/code-outline/src/index.cjs +614 -29
  638. package/plugins/document-reader/README.md +33 -0
  639. package/plugins/document-reader/plugin.json +2 -0
  640. package/plugins/document-reader/source/pdf-contract.ts +57 -0
  641. package/plugins/document-reader/source/pdf-parser.ts +139 -0
  642. package/plugins/document-reader/source/pdf-process-main.ts +56 -0
  643. package/plugins/document-reader/source/pdf-process.ts +207 -0
  644. package/plugins/document-reader/source/pdf-result.ts +79 -0
  645. package/plugins/document-reader/source/pdf-worker.ts +39 -303
  646. package/plugins/document-reader/source/pdf.ts +4 -1
  647. package/plugins/document-reader/source/read-failure.ts +37 -0
  648. package/plugins/document-reader/source/reader.ts +3 -19
  649. package/plugins/document-reader/src/index.cjs +995 -211
  650. package/plugins/exec/README.md +19 -0
  651. package/plugins/exec/plugin.json +7 -3
  652. package/plugins/exec/skills/exec_skill/SKILL.md +3 -2
  653. package/plugins/exec/source/filesystem-file-observer.ts +98 -0
  654. package/plugins/exec/source/filesystem-observer.ts +8 -79
  655. package/plugins/exec/source/output-files.ts +12 -6
  656. package/plugins/exec/source/paths.ts +3 -1
  657. package/plugins/exec/source/process-manager.ts +8 -24
  658. package/plugins/exec/source/shell-platform.ts +19 -3
  659. package/plugins/exec/source/shell-process.ts +55 -0
  660. package/plugins/exec/source/windows-job-source.ts +1 -0
  661. package/plugins/exec/source/windows-shell-bootstrap.ts +20 -0
  662. package/plugins/exec/src/index.cjs +252 -96
  663. package/plugins/filesystem/README.md +65 -0
  664. package/plugins/filesystem/plugin.json +8 -2
  665. package/plugins/filesystem/source/atomic-write.ts +2 -0
  666. package/plugins/filesystem/source/bounded-io.ts +80 -306
  667. package/plugins/filesystem/source/directory-sample.ts +2 -0
  668. package/plugins/filesystem/source/errors.ts +14 -0
  669. package/plugins/filesystem/source/file-observation.ts +151 -0
  670. package/plugins/filesystem/source/file-version.ts +41 -0
  671. package/plugins/filesystem/source/index.ts +6 -0
  672. package/plugins/filesystem/source/mutation-coordinator.ts +1 -0
  673. package/plugins/filesystem/source/windows/authority-script.ts +1 -0
  674. package/plugins/filesystem/source/windows/native-script.ts +1 -0
  675. package/plugins/filesystem/source/windows/operations.ts +197 -0
  676. package/plugins/filesystem/source/windows/process.ts +214 -0
  677. package/plugins/filesystem/source/windows/publication-script.ts +29 -0
  678. package/plugins/filesystem/source/windows/read-script.ts +63 -0
  679. package/plugins/filesystem/source/windows/request-availability.ts +67 -0
  680. package/plugins/filesystem/source/windows/source.ts +42 -0
  681. package/plugins/filesystem/source/windows/storage-script.ts +11 -0
  682. package/plugins/filesystem/source/windows/streams-script.ts +24 -0
  683. package/plugins/filesystem/source/windows/write-script.ts +86 -0
  684. package/plugins/filesystem/src/index.cjs +1208 -322
  685. package/plugins/json-inspector/README.md +18 -0
  686. package/plugins/json-inspector/plugin.json +1 -0
  687. package/plugins/json-inspector/source/index.ts +16 -19
  688. package/plugins/json-inspector/source/read-failure.ts +42 -0
  689. package/plugins/json-inspector/src/index.cjs +612 -27
  690. package/plugins/local-search/README.md +29 -0
  691. package/plugins/local-search/plugin.json +2 -0
  692. package/plugins/local-search/source/errors.ts +2 -0
  693. package/plugins/local-search/source/paths.ts +3 -0
  694. package/plugins/local-search/source/ripgrep-process.ts +31 -5
  695. package/plugins/local-search/source/ripgrep.ts +3 -3
  696. package/plugins/local-search/source/windows-authority.ts +99 -0
  697. package/plugins/local-search/source/windows-search-lease.ts +49 -0
  698. package/plugins/local-search/source/windows-search-process.ts +91 -0
  699. package/plugins/local-search/source/windows-search-script.ts +52 -0
  700. package/plugins/local-search/src/index.cjs +595 -26
  701. package/plugins/memory/plugin.json +4 -0
  702. package/plugins/memory/source/lock-directory-claim.ts +56 -0
  703. package/plugins/memory/source/lock-owner-file.ts +71 -0
  704. package/plugins/memory/source/lock-path-observation.ts +26 -0
  705. package/plugins/memory/source/prepared-memory-replacement.ts +40 -0
  706. package/plugins/memory/source/store-lock.ts +12 -7
  707. package/plugins/memory/source/store.ts +3 -2
  708. package/plugins/memory/src/index.cjs +174 -25
  709. package/plugins/project-orientation/README.md +23 -0
  710. package/plugins/project-orientation/plugin.json +1 -0
  711. package/plugins/project-orientation/source/index.ts +12 -9
  712. package/plugins/project-orientation/source/inspection-failure.ts +70 -0
  713. package/plugins/project-orientation/source/manifest-summary.ts +9 -2
  714. package/plugins/project-orientation/source/tree.ts +6 -0
  715. package/plugins/project-orientation/src/index.cjs +647 -31
  716. package/plugins/system/README.md +81 -5
  717. package/plugins/system/plugin.json +10 -1
  718. package/plugins/system/skills/system_actions/SKILL.md +1 -1
  719. package/plugins/system/source/command-working-directory.ts +47 -0
  720. package/plugins/system/source/companion-command-output.ts +82 -0
  721. package/plugins/system/source/computer/handlers.ts +13 -9
  722. package/plugins/system/source/computer/observation-result.ts +10 -5
  723. package/plugins/system/source/computer/request-computers.ts +10 -3
  724. package/plugins/system/source/computer/request-modules.ts +3 -6
  725. package/plugins/system/source/computer/runtime-platform.ts +18 -0
  726. package/plugins/system/source/host-dispatch.ts +21 -1
  727. package/plugins/system/source/index.ts +14 -6
  728. package/plugins/system/source/local-command-output-retention.ts +16 -0
  729. package/plugins/system/source/local-command-output.ts +69 -0
  730. package/plugins/system/source/request-system-modules.ts +14 -2
  731. package/plugins/system/source/request-target-snapshot.ts +2 -1
  732. package/plugins/system/source/security/desktop-result.ts +177 -0
  733. package/plugins/system/source/security/observed-error.ts +10 -0
  734. package/plugins/system/source/security/secret-text.ts +118 -0
  735. package/plugins/system/source/security/system-results.ts +62 -0
  736. package/plugins/system/source/security/windows-output-directory.ts +82 -0
  737. package/plugins/system/src/index.cjs +1207 -86
  738. package/plugins/system-probe/plugin.json +8 -2
  739. package/plugins/system-probe/source/disk-path.ts +8 -0
  740. package/plugins/system-probe/source/index.ts +10 -5
  741. package/plugins/system-probe/source/machine-load.ts +33 -0
  742. package/plugins/system-probe/source/metrics.ts +6 -8
  743. package/plugins/system-probe/src/index.cjs +49 -16
  744. package/plugins/web/README.md +2 -2
  745. package/plugins/web/plugin.json +8 -0
  746. package/runtime.config.schema.json +25 -1
  747. package/src/runtime/README.md +12 -2
  748. package/dist/src/web-ui/system-host-setup/companion-windows.d.ts +0 -2
  749. package/dist/src/web-ui/system-host-setup/companion-windows.js +0 -108
  750. package/docs/publishing.md +0 -167
@@ -108,10 +108,36 @@ export async function hasRuntimeSetupCredential(rootDir, apiKeyEnv = "OPENAI_API
108
108
  export async function persistRuntimeSetupCredentials(params) {
109
109
  await commitRuntimeSetupCredentials(params, async () => undefined);
110
110
  }
111
+ /** Publish process credentials only after the caller's complete transaction commits. */
112
+ export async function withPlannedRuntimeSetupCredentials(params, operation) {
113
+ const rootDir = await realpath(params.rootDir);
114
+ return withFileLock(join(rootDir, ".env.credentials.lock"), async () => {
115
+ const plan = await planCredentialAssignments({ ...params, rootDir });
116
+ const publish = () => {
117
+ const key = params.apiKey ||
118
+ process.env[plan.apiKeyEnv] ||
119
+ readSavedApiKey(plan.previousFile.raw ?? "", plan.apiKeyEnv);
120
+ if (key)
121
+ process.env[plan.apiKeyEnv] = key;
122
+ };
123
+ const result = await operation({
124
+ rootDir,
125
+ path: join(rootDir, ".env"),
126
+ text: plan.next,
127
+ previous: plan.previousFile,
128
+ write: () => replaceCredentialFile(rootDir, plan.previousFile.raw, plan.next),
129
+ publish,
130
+ });
131
+ publish();
132
+ return result;
133
+ });
134
+ }
111
135
  /** Keep the credential private and locked until the related setup commit settles. */
112
136
  export async function commitRuntimeSetupCredentials(params, commit) {
113
- const rootDir = await realpath(params.rootDir);
114
- return withFileLock(join(rootDir, ".env.credentials.lock"), () => saveCredentialAssignments({ ...params, rootDir }, commit));
137
+ return withPlannedRuntimeSetupCredentials(params, async (plan) => {
138
+ await plan.write();
139
+ return commitOrRestoreCredentials(plan.rootDir, plan.previous, plan.text, commit);
140
+ });
115
141
  }
116
142
  function wouldReplaceConfiguredCredential(preserveExistingCredential, incomingKey, configuredKeys) {
117
143
  if (!preserveExistingCredential)
@@ -124,7 +150,7 @@ function wouldReplaceConfiguredCredential(preserveExistingCredential, incomingKe
124
150
  return configuredKey !== incomingKey;
125
151
  });
126
152
  }
127
- async function saveCredentialAssignments(params, commit) {
153
+ async function planCredentialAssignments(params) {
128
154
  const apiKeyEnv = params.apiKeyEnv ?? "OPENAI_API_KEY";
129
155
  const previousFile = await readCredentialFileSnapshot(params.rootDir);
130
156
  const previous = previousFile.raw ?? "";
@@ -137,12 +163,5 @@ async function saveCredentialAssignments(params, commit) {
137
163
  let next = replaceRuntimeSetupEnvironmentAssignment(previous, "LLM_RUNTIME_CONFIG_FILE", params.configPath);
138
164
  if (params.apiKey)
139
165
  next = replaceRuntimeSetupEnvironmentAssignment(next, apiKeyEnv, params.apiKey);
140
- await replaceCredentialFile(params.rootDir, previousFile.raw, next);
141
- const result = await commitOrRestoreCredentials(params.rootDir, previousFile, next, commit);
142
- const key = params.apiKey ||
143
- process.env[apiKeyEnv] ||
144
- readSavedApiKey(previous, apiKeyEnv);
145
- if (key)
146
- process.env[apiKeyEnv] = key;
147
- return result;
166
+ return { previousFile, next, apiKeyEnv };
148
167
  }
@@ -0,0 +1,20 @@
1
+ import { RuntimeSetupError } from "./runtime-setup-input.js";
2
+ export type SetupEditFileSnapshot = Readonly<{
3
+ bytes: string | null;
4
+ mode: number;
5
+ }>;
6
+ export declare function setupEditRecoveryRequired(): RuntimeSetupError;
7
+ export declare function isMissingSetupEditFile(error: unknown): boolean;
8
+ /** Snapshots preserve bytes, existence and mode; linked or special targets are not owned. */
9
+ export declare function readSetupEditFile(path: string): Promise<SetupEditFileSnapshot>;
10
+ export declare function setupEditFileMatches(actual: SetupEditFileSnapshot, expected: SetupEditFileSnapshot): boolean;
11
+ export declare function setupEditTextSnapshot(text: string, mode: number): SetupEditFileSnapshot;
12
+ export declare function setupEditSnapshotText(snapshot: SetupEditFileSnapshot): string;
13
+ /** Directory sync is available on Unix; Windows does not expose it through Node. */
14
+ export declare function syncSetupEditDirectory(path: string): Promise<void>;
15
+ export declare function syncSetupEditFile(path: string): Promise<void>;
16
+ export declare function requireSetupEditFileSnapshot(path: string, expected: SetupEditFileSnapshot): Promise<void>;
17
+ /** Cooperative locks are held by the caller; recheck immediately before replacement. */
18
+ export declare function restoreSetupEditFile(path: string, expected: SetupEditFileSnapshot, replacement: SetupEditFileSnapshot): Promise<void>;
19
+ /** Publish the marker itself atomically; private mode also protects credential snapshots. */
20
+ export declare function publishSetupEditJournal(path: string, text: string, expected: SetupEditFileSnapshot): Promise<void>;
@@ -0,0 +1,104 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { chmod, lstat, open, readFile, rename, rm } from "node:fs/promises";
3
+ import { dirname } from "node:path";
4
+ import { canonicalConfigFilePath } from "../../runtime/adapters/config-file-transaction.js";
5
+ import { RuntimeSetupError } from "./runtime-setup-input.js";
6
+ export function setupEditRecoveryRequired() {
7
+ return new RuntimeSetupError("setup_edit_recovery_required", "An interrupted connection edit needs recovery. Restart this Runtime before applying configuration. If recovery reports a conflict, preserve the transaction and review the changed files.", 409);
8
+ }
9
+ export function isMissingSetupEditFile(error) {
10
+ return error instanceof Error && "code" in error && error.code === "ENOENT";
11
+ }
12
+ /** Snapshots preserve bytes, existence and mode; linked or special targets are not owned. */
13
+ export async function readSetupEditFile(path) {
14
+ if ((await canonicalConfigFilePath(path)) !== path)
15
+ throw setupEditRecoveryRequired();
16
+ try {
17
+ const info = await lstat(path);
18
+ if (!info.isFile() || info.isSymbolicLink())
19
+ throw setupEditRecoveryRequired();
20
+ return {
21
+ bytes: (await readFile(path)).toString("base64"),
22
+ mode: info.mode & 0o777,
23
+ };
24
+ }
25
+ catch (error) {
26
+ if (isMissingSetupEditFile(error))
27
+ return { bytes: null, mode: 0 };
28
+ throw error;
29
+ }
30
+ }
31
+ export function setupEditFileMatches(actual, expected) {
32
+ if (actual.bytes !== expected.bytes)
33
+ return false;
34
+ // Node's Windows chmod only implements the writable bit, unlike POSIX modes.
35
+ const mask = process.platform === "win32" ? 0o200 : 0o777;
36
+ return (actual.mode & mask) === (expected.mode & mask);
37
+ }
38
+ export function setupEditTextSnapshot(text, mode) {
39
+ return { bytes: Buffer.from(text, "utf8").toString("base64"), mode };
40
+ }
41
+ export function setupEditSnapshotText(snapshot) {
42
+ if (snapshot.bytes === null)
43
+ throw setupEditRecoveryRequired();
44
+ return Buffer.from(snapshot.bytes, "base64").toString("utf8");
45
+ }
46
+ /** Directory sync is available on Unix; Windows does not expose it through Node. */
47
+ export async function syncSetupEditDirectory(path) {
48
+ if (process.platform === "win32")
49
+ return;
50
+ const handle = await open(path, "r");
51
+ try {
52
+ await handle.sync();
53
+ }
54
+ finally {
55
+ await handle.close();
56
+ }
57
+ }
58
+ export async function syncSetupEditFile(path) {
59
+ // Windows FlushFileBuffers requires a handle opened for writing.
60
+ const handle = await open(path, process.platform === "win32" ? "r+" : "r");
61
+ try {
62
+ await handle.sync();
63
+ }
64
+ finally {
65
+ await handle.close();
66
+ }
67
+ await syncSetupEditDirectory(dirname(path));
68
+ }
69
+ export async function requireSetupEditFileSnapshot(path, expected) {
70
+ if (!setupEditFileMatches(await readSetupEditFile(path), expected))
71
+ throw setupEditRecoveryRequired();
72
+ }
73
+ /** Cooperative locks are held by the caller; recheck immediately before replacement. */
74
+ export async function restoreSetupEditFile(path, expected, replacement) {
75
+ await requireSetupEditFileSnapshot(path, expected);
76
+ if (replacement.bytes === null) {
77
+ await rm(path);
78
+ await syncSetupEditDirectory(dirname(path));
79
+ return;
80
+ }
81
+ const temporary = `${path}.${randomUUID()}.setup-edit.tmp`;
82
+ try {
83
+ const handle = await open(temporary, "wx", replacement.mode);
84
+ try {
85
+ await handle.writeFile(Buffer.from(replacement.bytes, "base64"));
86
+ await handle.chmod(replacement.mode);
87
+ await handle.sync();
88
+ }
89
+ finally {
90
+ await handle.close();
91
+ }
92
+ await requireSetupEditFileSnapshot(path, expected);
93
+ await rename(temporary, path);
94
+ await syncSetupEditDirectory(dirname(path));
95
+ }
96
+ finally {
97
+ await rm(temporary, { force: true });
98
+ }
99
+ }
100
+ /** Publish the marker itself atomically; private mode also protects credential snapshots. */
101
+ export async function publishSetupEditJournal(path, text, expected) {
102
+ await restoreSetupEditFile(path, expected, setupEditTextSnapshot(text, 0o600));
103
+ await chmod(path, 0o600);
104
+ }
@@ -0,0 +1,29 @@
1
+ import { type SetupEditFileSnapshot } from "./runtime-setup-edit-files.js";
2
+ export declare const SETUP_EDIT_JOURNAL_NAME = ".runtime-setup-edit.json";
3
+ declare const FILE_ROLES: readonly ["model", "config", "receipt", "credentials"];
4
+ type SetupEditFileRole = (typeof FILE_ROLES)[number];
5
+ export type SetupEditJournalFile = Readonly<{
6
+ role: SetupEditFileRole;
7
+ path: string;
8
+ before: SetupEditFileSnapshot;
9
+ after: SetupEditFileSnapshot;
10
+ }>;
11
+ export type SetupEditJournal = Readonly<{
12
+ version: 1;
13
+ id: string;
14
+ rootDir: string;
15
+ phase: "pending" | "committed";
16
+ files: readonly SetupEditJournalFile[];
17
+ }>;
18
+ export type SetupEditFilePlan = Readonly<{
19
+ role: SetupEditFileRole;
20
+ path: string;
21
+ text: string;
22
+ mode?: number;
23
+ }>;
24
+ export declare function setupEditJournalPath(rootDir: string): string;
25
+ export declare function validateSetupEditJournal(value: unknown, rootDir: string): Promise<SetupEditJournal>;
26
+ export declare function readSetupEditJournal(rootDir: string): Promise<SetupEditJournal | undefined>;
27
+ export declare function createSetupEditJournal(rootDir: string, plans: readonly SetupEditFilePlan[]): Promise<SetupEditJournal>;
28
+ export declare function writeSetupEditJournal(journal: SetupEditJournal, previous?: SetupEditJournal): Promise<void>;
29
+ export {};
@@ -0,0 +1,151 @@
1
+ import { parse } from "dotenv";
2
+ import { isDeepStrictEqual } from "node:util";
3
+ import { randomUUID } from "node:crypto";
4
+ import { dirname, join, resolve } from "node:path";
5
+ import { isRecord } from "../../runtime/config/utils.js";
6
+ import { canonicalConfigFilePath } from "../../runtime/adapters/config-file-transaction.js";
7
+ import { readSetupEditFile, setupEditRecoveryRequired, setupEditSnapshotText, setupEditTextSnapshot, publishSetupEditJournal, } from "./runtime-setup-edit-files.js";
8
+ export const SETUP_EDIT_JOURNAL_NAME = ".runtime-setup-edit.json";
9
+ const FILE_ROLES = ["model", "config", "receipt", "credentials"];
10
+ export function setupEditJournalPath(rootDir) {
11
+ return join(rootDir, SETUP_EDIT_JOURNAL_NAME);
12
+ }
13
+ function isSetupEditSnapshot(value) {
14
+ if (!isRecord(value))
15
+ return false;
16
+ if (!Number.isInteger(value.mode))
17
+ return false;
18
+ if (typeof value.mode !== "number" || value.mode < 0 || value.mode > 0o777)
19
+ return false;
20
+ if (value.bytes === null)
21
+ return value.mode === 0;
22
+ if (typeof value.bytes !== "string")
23
+ return false;
24
+ return Buffer.from(value.bytes, "base64").toString("base64") === value.bytes;
25
+ }
26
+ function isSetupEditJournalFile(value, index) {
27
+ if (!isRecord(value))
28
+ return false;
29
+ if (value.role !== FILE_ROLES[index])
30
+ return false;
31
+ if (typeof value.path !== "string" || value.path !== resolve(value.path))
32
+ return false;
33
+ if (!isSetupEditSnapshot(value.before))
34
+ return false;
35
+ if (!isSetupEditSnapshot(value.after))
36
+ return false;
37
+ if (value.after.bytes === null)
38
+ return false;
39
+ if (value.role !== "credentials" && value.before.bytes === null)
40
+ return false;
41
+ return true;
42
+ }
43
+ function parseSetupEditObject(snapshot) {
44
+ const value = JSON.parse(setupEditSnapshotText(snapshot));
45
+ if (!isRecord(value))
46
+ throw setupEditRecoveryRequired();
47
+ return value;
48
+ }
49
+ async function requireSetupEditFileBindings(journal) {
50
+ const [model, config, receipt, credentials] = journal.files;
51
+ if (receipt.path !== config.path + ".web-setup.json")
52
+ throw setupEditRecoveryRequired();
53
+ if (credentials.path !== join(journal.rootDir, ".env"))
54
+ throw setupEditRecoveryRequired();
55
+ if (new Set(journal.files.map((file) => file.path)).size !== FILE_ROLES.length)
56
+ throw setupEditRecoveryRequired();
57
+ for (const state of ["before", "after"]) {
58
+ const draft = parseSetupEditObject(receipt[state]);
59
+ if (draft.version !== 1 || typeof draft.revision !== "string")
60
+ throw setupEditRecoveryRequired();
61
+ if (draft.configPath !== config.path || draft.modelPath !== model.path)
62
+ throw setupEditRecoveryRequired();
63
+ if (!isDeepStrictEqual(draft.modelConfig, parseSetupEditObject(model[state])))
64
+ throw setupEditRecoveryRequired();
65
+ const saved = parseSetupEditObject(config[state]);
66
+ const models = isRecord(saved.models) ? saved.models : {};
67
+ const profiles = isRecord(models.profiles) ? models.profiles : {};
68
+ if (!isDeepStrictEqual(draft.profileReferences, profiles))
69
+ throw setupEditRecoveryRequired();
70
+ if (!isRecord(draft.ownedProviders))
71
+ throw setupEditRecoveryRequired();
72
+ const providers = isRecord(models.providers) ? models.providers : {};
73
+ for (const [id, provider] of Object.entries(draft.ownedProviders)) {
74
+ if (!isDeepStrictEqual(providers[id], provider))
75
+ throw setupEditRecoveryRequired();
76
+ }
77
+ const profile = isRecord(profiles.default) ? profiles.default : {};
78
+ if (typeof profile.configRef !== "string")
79
+ throw setupEditRecoveryRequired();
80
+ const referenced = await canonicalConfigFilePath(resolve(dirname(config.path), profile.configRef));
81
+ if (referenced !== model.path)
82
+ throw setupEditRecoveryRequired();
83
+ }
84
+ const env = parse(setupEditSnapshotText(credentials.after));
85
+ if (typeof env.LLM_RUNTIME_CONFIG_FILE !== "string")
86
+ throw setupEditRecoveryRequired();
87
+ const configured = await canonicalConfigFilePath(resolve(journal.rootDir, env.LLM_RUNTIME_CONFIG_FILE));
88
+ if (configured !== config.path)
89
+ throw setupEditRecoveryRequired();
90
+ }
91
+ export async function validateSetupEditJournal(value, rootDir) {
92
+ try {
93
+ if (!isRecord(value))
94
+ throw setupEditRecoveryRequired();
95
+ if (value.version !== 1 || typeof value.id !== "string")
96
+ throw setupEditRecoveryRequired();
97
+ if (value.rootDir !== rootDir)
98
+ throw setupEditRecoveryRequired();
99
+ if (value.phase !== "pending" && value.phase !== "committed")
100
+ throw setupEditRecoveryRequired();
101
+ if (!Array.isArray(value.files) || value.files.length !== FILE_ROLES.length)
102
+ throw setupEditRecoveryRequired();
103
+ if (!value.files.every(isSetupEditJournalFile))
104
+ throw setupEditRecoveryRequired();
105
+ const journal = value;
106
+ await requireSetupEditFileBindings(journal);
107
+ return journal;
108
+ }
109
+ catch {
110
+ throw setupEditRecoveryRequired();
111
+ }
112
+ }
113
+ export async function readSetupEditJournal(rootDir) {
114
+ const snapshot = await readSetupEditFile(setupEditJournalPath(rootDir));
115
+ if (snapshot.bytes === null)
116
+ return undefined;
117
+ let value;
118
+ try {
119
+ value = JSON.parse(setupEditSnapshotText(snapshot));
120
+ }
121
+ catch {
122
+ throw setupEditRecoveryRequired();
123
+ }
124
+ return validateSetupEditJournal(value, rootDir);
125
+ }
126
+ export async function createSetupEditJournal(rootDir, plans) {
127
+ const files = [];
128
+ for (const plan of plans) {
129
+ const before = await readSetupEditFile(plan.path);
130
+ files.push({
131
+ role: plan.role,
132
+ path: plan.path,
133
+ before,
134
+ after: setupEditTextSnapshot(plan.text, plan.mode ?? before.mode),
135
+ });
136
+ }
137
+ return validateSetupEditJournal({
138
+ version: 1,
139
+ id: randomUUID(),
140
+ rootDir,
141
+ phase: "pending",
142
+ files,
143
+ }, rootDir);
144
+ }
145
+ export async function writeSetupEditJournal(journal, previous) {
146
+ const path = setupEditJournalPath(journal.rootDir);
147
+ const expected = previous
148
+ ? setupEditTextSnapshot(JSON.stringify(previous) + "\n", 0o600)
149
+ : { bytes: null, mode: 0 };
150
+ await publishSetupEditJournal(path, JSON.stringify(journal) + "\n", expected);
151
+ }
@@ -0,0 +1,7 @@
1
+ import { type SetupEditJournal } from "./runtime-setup-edit-journal.js";
2
+ /** Synchronous consumers must not observe any part of an unresolved edit. */
3
+ export declare function requireRuntimeSetupEditSettled(rootDir: string): void;
4
+ /** Caller holds every participant lock; repeatable after interruption at any restore. */
5
+ export declare function reconcileSetupEditJournal(journal: SetupEditJournal): Promise<void>;
6
+ /** Runs before dotenv/configuration loading. No journal means no speculative repair. */
7
+ export declare function recoverRuntimeSetupEdit(rootDir: string): Promise<void>;
@@ -0,0 +1,87 @@
1
+ import { lstatSync, realpathSync } from "node:fs";
2
+ import { realpath, rm } from "node:fs/promises";
3
+ import { join, resolve } from "node:path";
4
+ import { withFileLock } from "../../runtime/adapters/long-term-memory/file-lock.js";
5
+ import { CONFIG_FILE_LOCK_OPTIONS } from "../../runtime/adapters/config-file-transaction.js";
6
+ import { isMissingSetupEditFile, readSetupEditFile, requireSetupEditFileSnapshot, restoreSetupEditFile, setupEditFileMatches, setupEditRecoveryRequired, setupEditTextSnapshot, syncSetupEditDirectory, } from "./runtime-setup-edit-files.js";
7
+ import { readSetupEditJournal, setupEditJournalPath, } from "./runtime-setup-edit-journal.js";
8
+ /** Synchronous consumers must not observe any part of an unresolved edit. */
9
+ export function requireRuntimeSetupEditSettled(rootDir) {
10
+ let path = resolve(rootDir);
11
+ try {
12
+ path = realpathSync(path);
13
+ lstatSync(setupEditJournalPath(path));
14
+ }
15
+ catch (error) {
16
+ if (isMissingSetupEditFile(error))
17
+ return;
18
+ throw setupEditRecoveryRequired();
19
+ }
20
+ throw setupEditRecoveryRequired();
21
+ }
22
+ async function requireRecoverableSetupEditFiles(journal) {
23
+ for (const file of journal.files) {
24
+ const current = await readSetupEditFile(file.path);
25
+ if (setupEditFileMatches(current, file.after))
26
+ continue;
27
+ if (journal.phase === "pending" &&
28
+ setupEditFileMatches(current, file.before))
29
+ continue;
30
+ throw setupEditRecoveryRequired();
31
+ }
32
+ }
33
+ /** Caller holds every participant lock; repeatable after interruption at any restore. */
34
+ export async function reconcileSetupEditJournal(journal) {
35
+ await requireRecoverableSetupEditFiles(journal);
36
+ if (journal.phase === "pending") {
37
+ for (const file of [...journal.files].reverse()) {
38
+ const current = await readSetupEditFile(file.path);
39
+ if (setupEditFileMatches(current, file.before))
40
+ continue;
41
+ if (!setupEditFileMatches(current, file.after))
42
+ throw setupEditRecoveryRequired();
43
+ await restoreSetupEditFile(file.path, file.after, file.before);
44
+ }
45
+ }
46
+ const path = setupEditJournalPath(journal.rootDir);
47
+ await requireSetupEditFileSnapshot(path, setupEditTextSnapshot(JSON.stringify(journal) + "\n", 0o600));
48
+ await rm(path);
49
+ await syncSetupEditDirectory(journal.rootDir);
50
+ }
51
+ async function withSetupEditRecoveryLocks(journal, operation) {
52
+ const [model, config, receipt] = journal.files;
53
+ const locks = [
54
+ config.path + ".config.lock",
55
+ model.path + ".config.lock",
56
+ join(journal.rootDir, ".env.credentials.lock"),
57
+ receipt.path + ".config.lock",
58
+ ];
59
+ const acquire = (index) => {
60
+ if (index === locks.length)
61
+ return operation();
62
+ return withFileLock(locks[index], () => acquire(index + 1), CONFIG_FILE_LOCK_OPTIONS);
63
+ };
64
+ return acquire(0);
65
+ }
66
+ /** Runs before dotenv/configuration loading. No journal means no speculative repair. */
67
+ export async function recoverRuntimeSetupEdit(rootDir) {
68
+ try {
69
+ requireRuntimeSetupEditSettled(rootDir);
70
+ return;
71
+ }
72
+ catch {
73
+ // Parsing and lock acquisition below decide whether recovery is safe.
74
+ }
75
+ const root = await realpath(rootDir);
76
+ await withFileLock(join(root, ".runtime-setup.lock"), async () => {
77
+ const journal = await readSetupEditJournal(root);
78
+ if (!journal)
79
+ return;
80
+ await withSetupEditRecoveryLocks(journal, async () => {
81
+ const current = await readSetupEditJournal(root);
82
+ if (!current || JSON.stringify(current) !== JSON.stringify(journal))
83
+ throw setupEditRecoveryRequired();
84
+ await reconcileSetupEditJournal(journal);
85
+ });
86
+ }, CONFIG_FILE_LOCK_OPTIONS);
87
+ }
@@ -0,0 +1,3 @@
1
+ import { type SetupEditFilePlan } from "./runtime-setup-edit-journal.js";
2
+ /** Setup, config, model and credential locks enclose this complete transaction. */
3
+ export declare function commitRuntimeSetupEdit(rootDir: string, files: readonly SetupEditFilePlan[], commit: () => Promise<void>, publishCommittedCredentials: () => void): Promise<void>;
@@ -0,0 +1,37 @@
1
+ import { realpath } from "node:fs/promises";
2
+ import { createSetupEditJournal, readSetupEditJournal, writeSetupEditJournal, } from "./runtime-setup-edit-journal.js";
3
+ import { requireSetupEditFileSnapshot, syncSetupEditFile, } from "./runtime-setup-edit-files.js";
4
+ import { reconcileSetupEditJournal, requireRuntimeSetupEditSettled, } from "./runtime-setup-edit-recovery.js";
5
+ /** Setup, config, model and credential locks enclose this complete transaction. */
6
+ export async function commitRuntimeSetupEdit(rootDir, files, commit, publishCommittedCredentials) {
7
+ const root = await realpath(rootDir);
8
+ requireRuntimeSetupEditSettled(root);
9
+ const journal = await createSetupEditJournal(root, files);
10
+ await writeSetupEditJournal(journal);
11
+ try {
12
+ await commit();
13
+ for (const file of journal.files) {
14
+ await requireSetupEditFileSnapshot(file.path, file.after);
15
+ await syncSetupEditFile(file.path);
16
+ }
17
+ await writeSetupEditJournal({ ...journal, phase: "committed" }, journal);
18
+ }
19
+ catch (error) {
20
+ try {
21
+ const persisted = await readSetupEditJournal(root);
22
+ if (persisted?.phase === "committed")
23
+ publishCommittedCredentials();
24
+ if (persisted)
25
+ await reconcileSetupEditJournal(persisted);
26
+ if (persisted?.phase === "committed")
27
+ return;
28
+ }
29
+ catch (recoveryError) {
30
+ throw new AggregateError([error, recoveryError], "Connection edit failed and needs recovery before it can be applied.");
31
+ }
32
+ throw error;
33
+ }
34
+ publishCommittedCredentials();
35
+ // A cleanup failure leaves a committed marker. Never roll it back.
36
+ await reconcileSetupEditJournal({ ...journal, phase: "committed" });
37
+ }
@@ -1,6 +1,7 @@
1
1
  import { assertConfigMutationRequest, ConfigMutationRequestError, } from "./config-mutation-request.js";
2
2
  import { readBody, readJsonBody, sendJson } from "./http.js";
3
3
  import { RuntimeSetupError } from "./runtime-setup-input.js";
4
+ import { runtimeSetupContextWindowErrorDetails } from "./runtime-setup-context-window.js";
4
5
  export class RuntimeSetupRoutes {
5
6
  service;
6
7
  constructor(service) {
@@ -43,6 +44,7 @@ export class RuntimeSetupRoutes {
43
44
  error instanceof ConfigMutationRequestError;
44
45
  sendJson(params.response, isPublicError ? error.statusCode : 400, {
45
46
  ok: false,
47
+ ...runtimeSetupContextWindowErrorDetails(error),
46
48
  error: error instanceof RuntimeSetupError
47
49
  ? error.code
48
50
  : "runtime_setup_failed",
@@ -1,3 +1,4 @@
1
+ import { requireRuntimeSetupEditSettled } from "./runtime-setup-edit-recovery.js";
1
2
  import { readDefaultContextWindowTokens } from "../../../scripts/runtime-setup-files.js";
2
3
  import { initializeConfiguredRuntimeDirectories } from "../../../scripts/runtime-setup-directories.js";
3
4
  import { configuredSetupModel, requiresConfiguredCredential, } from "./runtime-setup-provider.js";
@@ -20,6 +21,7 @@ export class RuntimeSetupService {
20
21
  this.options = options;
21
22
  }
22
23
  source() {
24
+ requireRuntimeSetupEditSettled(this.options.rootDir);
23
25
  return inspectRuntimeConfigFileWithMeta(this.options.rootDir, this.savedConfigPath ?? this.options.getConfigPath());
24
26
  }
25
27
  async status() {
@@ -156,7 +158,9 @@ export class RuntimeSetupService {
156
158
  draft,
157
159
  input,
158
160
  credentialChanged,
161
+ credentialWrite,
159
162
  });
163
+ credentialsPersisted = true;
160
164
  draft = edited.draft;
161
165
  embeddingInvalidated = edited.embeddingInvalidated;
162
166
  }
@@ -2,6 +2,7 @@ import { mkdtemp, rm, writeFile } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
3
  import { loadRuntimeConfig } from "../../runtime/config.js";
4
4
  import { isRecord } from "../../runtime/config/utils.js";
5
+ import { throwRuntimeSetupValidationError } from "./runtime-setup-context-window.js";
5
6
  /** Validate complete effective configuration in isolation before replacing local files. */
6
7
  export async function validateRuntimeSetupPlan(params) {
7
8
  const staging = await mkdtemp(join(params.rootDir, ".runtime-setup-validation-"));
@@ -26,8 +27,14 @@ export async function validateRuntimeSetupPlan(params) {
26
27
  ? Object.keys(environment.profiles)
27
28
  : [];
28
29
  const environments = profileIds.length ? profileIds : [undefined];
29
- for (const profileId of environments)
30
- loadRuntimeConfig({ rootDir: params.rootDir, configPath, profileId });
30
+ for (const profileId of environments) {
31
+ try {
32
+ loadRuntimeConfig({ rootDir: params.rootDir, configPath, profileId });
33
+ }
34
+ catch (error) {
35
+ throwRuntimeSetupValidationError(error, profileId);
36
+ }
37
+ }
31
38
  }
32
39
  finally {
33
40
  await rm(staging, { recursive: true, force: true });
@@ -3,6 +3,7 @@ import type { RuntimeEnvironment, JsonObject } from "./contracts.js";
3
3
  import { WebSessionReadStates } from "../session-read-state/service.js";
4
4
  import type { WorkspaceChangeNotifier } from "./workspace-notifications.js";
5
5
  type SessionRouteRequest = {
6
+ url?: URL;
6
7
  method: string;
7
8
  segments: string[];
8
9
  body: JsonObject | null;
@@ -1,3 +1,4 @@
1
+ import { historyPageOptions, publicHistorySnapshot } from "./history-pagination.js";
1
2
  import { deleteSessionWithAttachments } from "../../runtime/session/session-attachment-deletion.js";
2
3
  import { deleteSessionAttachmentsIfSupported } from "./attachment-routes.js";
3
4
  import { sendJson } from "./http.js";
@@ -34,13 +35,24 @@ export class WebSessionRoutes {
34
35
  });
35
36
  return true;
36
37
  }
38
+ if (method === "POST" && sessionId === "page" && !action) {
39
+ sendJson(response, 200, { ok: true, ...(await this.readStates.list(environmentId, body ?? {})) });
40
+ return true;
41
+ }
37
42
  if (!sessionId)
38
43
  return false;
39
44
  const sessions = environment.services.sessions;
40
45
  if (method === "GET" && action === "messages") {
41
- const snapshot = await sessions.getSessionSnapshot(sessionId, {
42
- includeRequests: true,
43
- });
46
+ let snapshot;
47
+ try {
48
+ snapshot = await sessions.getSessionSnapshot(sessionId, historyPageOptions(request.url, environment.services.config));
49
+ }
50
+ catch (error) {
51
+ if (!(error instanceof Error) || error.message !== "history_cursor_stale")
52
+ throw error;
53
+ sendJson(response, 409, { ok: false, error: error.message });
54
+ return true;
55
+ }
44
56
  if (!snapshot) {
45
57
  sendJson(response, 404, {
46
58
  ok: false,
@@ -52,7 +64,7 @@ export class WebSessionRoutes {
52
64
  }
53
65
  sendJson(response, 200, {
54
66
  ok: true,
55
- ...snapshot,
67
+ ...publicHistorySnapshot(snapshot),
56
68
  readState: await this.readStates.project(environmentId, snapshot),
57
69
  });
58
70
  return true;
@@ -1,3 +1,4 @@
1
+ import { historyPageOptions, publicHistorySnapshot } from "./history-pagination.js";
1
2
  import { ensureSparkSession } from "../../sessions/spark-session.js";
2
3
  import { acceptConfigMutationRequest } from "./config-mutation-request.js";
3
4
  import { loadSparkChatConfiguration, readSparkChatConfigurationUpdate } from "./spark-chat-configuration.js";
@@ -40,11 +41,11 @@ export class SparkChatRoutes {
40
41
  if (update)
41
42
  await environment.services.passiveLearning.configure(update);
42
43
  const configuration = await loadSparkChatConfiguration(environment.services.passiveLearning);
43
- const snapshot = await environment.services.sessions.getSessionSnapshot(session.id, { includeRequests: true });
44
+ const snapshot = await environment.services.sessions.getSessionSnapshot(session.id, historyPageOptions(new URL(input.request.url ?? "/", "http://localhost"), environment.services.config));
44
45
  if (!snapshot)
45
46
  throw new Error("spark_chat_unavailable");
46
47
  sendJson(input.response, 200, {
47
- ok: true, sessionId: session.id, ...configuration, snapshot,
48
+ ok: true, sessionId: session.id, ...configuration, snapshot: publicHistorySnapshot(snapshot),
48
49
  readState: await this.reads.project(input.environmentId, snapshot),
49
50
  });
50
51
  return true;
@@ -52,7 +53,7 @@ export class SparkChatRoutes {
52
53
  catch (error) {
53
54
  const code = error instanceof Error ? error.message : "spark_chat_unavailable";
54
55
  const invalid = ["spark_chat_preferences_invalid", "invalid_spark_tool_permission_mode", "visible_message_ids_invalid", "visible_message_receipts_invalid"].includes(code);
55
- const stale = ["read_generation_changed", "visible_message_receipt_stale"].includes(code);
56
+ const stale = ["read_generation_changed", "visible_message_receipt_stale", "history_cursor_stale"].includes(code);
56
57
  sendJson(input.response, invalid ? 400 : 409, {
57
58
  ok: false, error: invalid || stale ? code : "spark_chat_unavailable",
58
59
  });