@abot-ai/runtime 1.7.0 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (532) hide show
  1. package/README.md +216 -222
  2. package/dist/src/capabilities/tool-definition-validator/definition-parser.js +8 -0
  3. package/dist/src/capabilities/tool-request-resources.d.ts +3 -0
  4. package/dist/src/capabilities/tool-types.d.ts +4 -0
  5. package/dist/src/cli/abot.js +2 -0
  6. package/dist/src/cli/host-companion-bundle.mjs +751 -333
  7. package/dist/src/computer-access/collection-consent.d.ts +9 -0
  8. package/dist/src/computer-access/collection-consent.js +47 -0
  9. package/dist/src/computer-access/command-output-capture.d.ts +17 -6
  10. package/dist/src/computer-access/command-output-capture.js +134 -68
  11. package/dist/src/computer-access/command-output-protection.d.ts +17 -0
  12. package/dist/src/computer-access/command-output-protection.js +59 -0
  13. package/dist/src/computer-access/companion/command-output.d.ts +1 -0
  14. package/dist/src/computer-access/companion/command-output.js +23 -6
  15. package/dist/src/computer-access/companion/install-link-macos.js +2 -1
  16. package/dist/src/computer-access/companion/native-notifications.js +3 -2
  17. package/dist/src/computer-access/companion/native-session.js +6 -2
  18. package/dist/src/computer-access/companion/observation-filter.js +2 -26
  19. package/dist/src/computer-access/companion/observation-process.d.ts +2 -0
  20. package/dist/src/computer-access/companion/observation-process.js +51 -25
  21. package/dist/src/computer-access/companion/observation-redaction.d.ts +2 -7
  22. package/dist/src/computer-access/companion/observation-redaction.js +2 -111
  23. package/dist/src/computer-access/companion/secret-protection-protocol.d.ts +6 -0
  24. package/dist/src/computer-access/companion/secret-protection-protocol.js +6 -0
  25. package/dist/src/computer-access/computer/companion-sessions.js +7 -6
  26. package/dist/src/computer-access/computer/unix-native-process.js +23 -11
  27. package/dist/src/computer-access/handlers.d.ts +2 -1
  28. package/dist/src/computer-access/handlers.js +79 -11
  29. package/dist/src/computer-access/host-observation.d.ts +3 -3
  30. package/dist/src/computer-access/native-observation-connection.d.ts +12 -0
  31. package/dist/src/computer-access/native-observation-connection.js +78 -0
  32. package/dist/src/computer-access/native-observation-ownership.d.ts +6 -0
  33. package/dist/src/computer-access/native-observation-ownership.js +55 -0
  34. package/dist/src/computer-access/native-observation-shutdown.d.ts +7 -0
  35. package/dist/src/computer-access/native-observation-shutdown.js +58 -0
  36. package/dist/src/computer-access/observation-source.d.ts +6 -0
  37. package/dist/src/computer-access/observation-source.js +10 -0
  38. package/dist/src/computer-access/security/desktop-result.d.ts +8 -0
  39. package/dist/src/computer-access/security/desktop-result.js +146 -0
  40. package/dist/src/computer-access/security/observed-error.d.ts +2 -0
  41. package/dist/src/computer-access/security/observed-error.js +10 -0
  42. package/dist/src/computer-access/security/secret-text.d.ts +7 -0
  43. package/dist/src/computer-access/security/secret-text.js +111 -0
  44. package/dist/src/computer-access/security/system-results.d.ts +2 -0
  45. package/dist/src/computer-access/security/system-results.js +53 -0
  46. package/dist/src/computer-access/system-result-protection.d.ts +11 -0
  47. package/dist/src/computer-access/system-result-protection.js +1 -0
  48. package/dist/src/model-gateway/observability/provider-response-capture.d.ts +60 -0
  49. package/dist/src/model-gateway/observability/provider-response-capture.js +68 -0
  50. package/dist/src/model-gateway/observability/provider-response-prefix.d.ts +7 -0
  51. package/dist/src/model-gateway/observability/provider-response-prefix.js +14 -0
  52. package/dist/src/model-gateway/observability/provider-response-tail.d.ts +8 -0
  53. package/dist/src/model-gateway/observability/provider-response-tail.js +28 -0
  54. package/dist/src/model-gateway/observability/provider-sse-diagnostics.d.ts +30 -0
  55. package/dist/src/model-gateway/observability/provider-sse-diagnostics.js +119 -0
  56. package/dist/src/model-gateway/observability/provider-trace.js +30 -8
  57. package/dist/src/model-gateway/protocol/message-contract.d.ts +1 -0
  58. package/dist/src/model-gateway/protocol/message-contract.js +1 -1
  59. package/dist/src/model-gateway/providers/ollama/adapter.js +8 -2
  60. package/dist/src/model-gateway/providers/ollama/stream-normalizer.js +70 -50
  61. package/dist/src/model-gateway/providers/ollama/stream-termination.d.ts +6 -0
  62. package/dist/src/model-gateway/providers/ollama/stream-termination.js +20 -0
  63. package/dist/src/model-gateway/providers/openai/adapter.js +9 -7
  64. package/dist/src/model-gateway/providers/openai/diagnostics.d.ts +0 -1
  65. package/dist/src/model-gateway/providers/openai/diagnostics.js +0 -9
  66. package/dist/src/model-gateway/providers/openai/function-output.d.ts +11 -0
  67. package/dist/src/model-gateway/providers/openai/function-output.js +37 -0
  68. package/dist/src/model-gateway/providers/openai/function-result.d.ts +7 -0
  69. package/dist/src/model-gateway/providers/openai/function-result.js +35 -0
  70. package/dist/src/model-gateway/providers/openai/message-output-policy.d.ts +3 -0
  71. package/dist/src/model-gateway/providers/openai/message-output-policy.js +16 -0
  72. package/dist/src/model-gateway/providers/openai/payload.d.ts +0 -2
  73. package/dist/src/model-gateway/providers/openai/payload.js +6 -23
  74. package/dist/src/model-gateway/providers/openai/response-lifetime.d.ts +2 -0
  75. package/dist/src/model-gateway/providers/openai/response-lifetime.js +64 -0
  76. package/dist/src/model-gateway/providers/openai/sse-data.d.ts +9 -0
  77. package/dist/src/model-gateway/providers/openai/sse-data.js +67 -0
  78. package/dist/src/model-gateway/providers/openai/stream-normalizer.d.ts +10 -22
  79. package/dist/src/model-gateway/providers/openai/stream-normalizer.js +78 -79
  80. package/dist/src/model-gateway/providers/openai/stream.js +13 -41
  81. package/dist/src/model-gateway/providers/openai/structured-message-output.d.ts +42 -0
  82. package/dist/src/model-gateway/providers/openai/structured-message-output.js +175 -0
  83. package/dist/src/model-gateway/server/chat-handler.js +5 -7
  84. package/dist/src/model-gateway/server/chat-stream-response.d.ts +7 -0
  85. package/dist/src/model-gateway/server/chat-stream-response.js +25 -0
  86. package/dist/src/model-gateway/server.js +5 -1
  87. package/dist/src/plugin-contract/index.d.ts +1 -0
  88. package/dist/src/plugin-contract/index.js +1 -0
  89. package/dist/src/plugin-contract/manifest.d.ts +2 -0
  90. package/dist/src/plugin-contract/manifest.js +1 -0
  91. package/dist/src/plugin-contract/platform-compatibility.d.ts +16 -0
  92. package/dist/src/plugin-contract/platform-compatibility.js +3 -0
  93. package/dist/src/plugin-sdk/computer-access.d.ts +4 -0
  94. package/dist/src/plugin-sdk/computer-access.js +1 -0
  95. package/dist/src/plugin-sdk/files-windows/process.d.ts +3 -0
  96. package/dist/src/plugin-sdk/files-windows/process.js +93 -0
  97. package/dist/src/plugin-sdk/files-windows/read-script.d.ts +1 -0
  98. package/dist/src/plugin-sdk/files-windows/read-script.js +43 -0
  99. package/dist/src/plugin-sdk/files-windows/read.d.ts +6 -0
  100. package/dist/src/plugin-sdk/files-windows/read.js +56 -0
  101. package/dist/src/plugin-sdk/files-windows/result.d.ts +4 -0
  102. package/dist/src/plugin-sdk/files-windows/result.js +67 -0
  103. package/dist/src/plugin-sdk/files.js +4 -0
  104. package/dist/src/plugin-sdk/index.d.ts +1 -0
  105. package/dist/src/plugin-sdk/index.js +1 -0
  106. package/dist/src/plugin-sdk/mutation-result.d.ts +7 -0
  107. package/dist/src/plugin-sdk/mutation-result.js +11 -0
  108. package/dist/src/runtime/adapters/long-term-memory/file-lock/acquisition.js +20 -3
  109. package/dist/src/runtime/adapters/long-term-memory/file-lock/owner-record.js +3 -1
  110. package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.d.ts +3 -0
  111. package/dist/src/runtime/adapters/long-term-memory/file-lock/path-observation.js +20 -0
  112. package/dist/src/runtime/adapters/long-term-memory/file-lock/snapshot.js +7 -3
  113. package/dist/src/runtime/adapters/passive-learning-runtime.d.ts +1 -1
  114. package/dist/src/runtime/adapters/passive-learning-runtime.js +3 -3
  115. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-rejection.d.ts +2 -2
  116. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/payload-rejection.js +2 -2
  117. package/dist/src/runtime/adapters/registered-tool-worker-capabilities/prepared-execution.js +17 -11
  118. package/dist/src/runtime/adapters/runtime-observation-connection.d.ts +5 -0
  119. package/dist/src/runtime/adapters/runtime-observation-connection.js +13 -0
  120. package/dist/src/runtime/capabilities/tool-availability.js +6 -0
  121. package/dist/src/runtime/context/capability-brief.d.ts +2 -2
  122. package/dist/src/runtime/context/capability-brief.js +3 -3
  123. package/dist/src/runtime/context/capability-descriptions.d.ts +3 -2
  124. package/dist/src/runtime/context/capability-descriptions.js +57 -20
  125. package/dist/src/runtime/local-host/windows-private-access.js +2 -0
  126. package/dist/src/runtime/long-term-memory/conversation-authoring/context.d.ts +6 -1
  127. package/dist/src/runtime/long-term-memory/conversation-authoring/context.js +51 -25
  128. package/dist/src/runtime/long-term-memory/initial-context.d.ts +17 -0
  129. package/dist/src/runtime/long-term-memory/initial-context.js +57 -0
  130. package/dist/src/runtime/long-term-memory/projection.js +1 -1
  131. package/dist/src/runtime/orchestration/role-calls/candidate-validation.js +2 -1
  132. package/dist/src/runtime/orchestration/role-calls/checkpoint-state.d.ts +1 -1
  133. package/dist/src/runtime/orchestration/role-calls/checkpoint-state.js +5 -2
  134. package/dist/src/runtime/orchestration/role-calls/contracts.d.ts +2 -1
  135. package/dist/src/runtime/orchestration/role-calls/ledger.d.ts +2 -1
  136. package/dist/src/runtime/orchestration/role-calls/ledger.js +2 -2
  137. package/dist/src/runtime/orchestration/role-calls/memory-recall-contract.d.ts +7 -0
  138. package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.d.ts +2 -0
  139. package/dist/src/runtime/orchestration/role-calls/memory-recall-state-validation.js +88 -0
  140. package/dist/src/runtime/orchestration/role-calls/reducer.d.ts +1 -1
  141. package/dist/src/runtime/orchestration/role-calls/reducer.js +2 -1
  142. package/dist/src/runtime/orchestration/worker-capabilities/contracts.d.ts +3 -1
  143. package/dist/src/runtime/orchestration/worker-capabilities/contracts.js +1 -1
  144. package/dist/src/runtime/orchestration/worker-capabilities/execution/approval-group.js +5 -1
  145. package/dist/src/runtime/orchestration/worker-capabilities/execution/execution-freshness.d.ts +5 -0
  146. package/dist/src/runtime/orchestration/worker-capabilities/execution/execution-freshness.js +31 -0
  147. package/dist/src/runtime/passive-learning/application-catalog.js +3 -1
  148. package/dist/src/runtime/passive-learning/collection-source.js +7 -0
  149. package/dist/src/runtime/passive-learning/service.js +2 -3
  150. package/dist/src/runtime/passive-learning/status-projection.d.ts +2 -0
  151. package/dist/src/runtime/passive-learning/status-projection.js +9 -0
  152. package/dist/src/runtime/plugins/installation/package.d.ts +8 -0
  153. package/dist/src/runtime/plugins/installation/package.js +2 -0
  154. package/dist/src/runtime/plugins/installation/service.d.ts +7 -0
  155. package/dist/src/runtime/plugins/loader.js +24 -14
  156. package/dist/src/runtime/plugins/manifest-platform-compatibility.d.ts +2 -0
  157. package/dist/src/runtime/plugins/manifest-platform-compatibility.js +39 -0
  158. package/dist/src/runtime/plugins/manifest-projection.js +3 -0
  159. package/dist/src/runtime/plugins/manifest-validator.js +9 -1
  160. package/dist/src/runtime/plugins/platform-compatibility.d.ts +4 -0
  161. package/dist/src/runtime/plugins/platform-compatibility.js +44 -0
  162. package/dist/src/runtime/request/approval-wait/activation-events.js +19 -7
  163. package/dist/src/runtime/request/approval-wait/execution-compaction-restore.d.ts +20 -0
  164. package/dist/src/runtime/request/approval-wait/execution-compaction-restore.js +118 -0
  165. package/dist/src/runtime/request/approval-wait/super-compaction-restore.js +2 -1
  166. package/dist/src/runtime/request/capability-execution-freshness.js +6 -1
  167. package/dist/src/runtime/request/execution-agent-root-execution.js +11 -1
  168. package/dist/src/runtime/request/prepared-execution.js +3 -0
  169. package/dist/src/runtime/request/root-contract.d.ts +2 -0
  170. package/dist/src/runtime/request/root-execution-kernel.js +1 -0
  171. package/dist/src/runtime/request/runner.js +9 -3
  172. package/dist/src/runtime/request/supervisor-root-execution.js +6 -0
  173. package/dist/src/runtime/steps/execution-agent/capability-result-context.d.ts +6 -0
  174. package/dist/src/runtime/steps/execution-agent/capability-result-context.js +29 -0
  175. package/dist/src/runtime/steps/execution-agent/contracts.d.ts +10 -0
  176. package/dist/src/runtime/steps/execution-agent/decision-parsing.js +13 -1
  177. package/dist/src/runtime/steps/execution-agent/direct-response-configuration.d.ts +3 -0
  178. package/dist/src/runtime/steps/execution-agent/direct-response-configuration.js +64 -0
  179. package/dist/src/runtime/steps/execution-agent/direct-response-contract.d.ts +7 -0
  180. package/dist/src/runtime/steps/execution-agent/direct-response-contract.js +56 -0
  181. package/dist/src/runtime/steps/execution-agent/direct-response-policy.d.ts +9 -0
  182. package/dist/src/runtime/steps/execution-agent/direct-response-policy.js +30 -0
  183. package/dist/src/runtime/steps/execution-agent/direct-response-prompt.d.ts +7 -0
  184. package/dist/src/runtime/steps/execution-agent/direct-response-prompt.js +43 -0
  185. package/dist/src/runtime/steps/execution-agent/format.js +4 -3
  186. package/dist/src/runtime/steps/execution-agent/input.d.ts +2 -0
  187. package/dist/src/runtime/steps/execution-agent/input.js +22 -1
  188. package/dist/src/runtime/steps/execution-agent/plugin-catalog.d.ts +4 -0
  189. package/dist/src/runtime/steps/execution-agent/plugin-catalog.js +8 -0
  190. package/dist/src/runtime/steps/execution-agent/prompt.d.ts +1 -0
  191. package/dist/src/runtime/steps/execution-agent/prompt.js +7 -8
  192. package/dist/src/runtime/steps/execution-agent/response-prompt.js +1 -0
  193. package/dist/src/runtime/steps/execution-agent/response-run.js +5 -11
  194. package/dist/src/runtime/steps/execution-agent/run.js +4 -1
  195. package/dist/src/runtime/steps/execution-agent/state-context.d.ts +3 -5
  196. package/dist/src/runtime/steps/execution-agent/state-context.js +5 -51
  197. package/dist/src/runtime/steps/execution-agent/work-plan-contract.d.ts +1 -3
  198. package/dist/src/runtime/steps/execution-agent/work-plan-contract.js +0 -55
  199. package/dist/src/runtime/steps/execution-agent/work-plan-schema.d.ts +3 -0
  200. package/dist/src/runtime/steps/execution-agent/work-plan-schema.js +61 -0
  201. package/dist/src/runtime/steps/planner-decision/capability-brief.d.ts +2 -0
  202. package/dist/src/runtime/steps/planner-decision/prompt.js +26 -49
  203. package/dist/src/runtime/steps/supervisor-decision/input.d.ts +1 -0
  204. package/dist/src/runtime/steps/supervisor-decision/input.js +5 -0
  205. package/dist/src/runtime/steps/supervisor-decision/prompt.d.ts +1 -0
  206. package/dist/src/runtime/steps/supervisor-decision/prompt.js +6 -2
  207. package/dist/src/runtime/steps/supervisor-decision/run.d.ts +1 -0
  208. package/dist/src/runtime/steps/supervisor-decision/run.js +4 -0
  209. package/dist/src/runtime/steps/supervisor-response/run.d.ts +2 -0
  210. package/dist/src/runtime/steps/supervisor-response/run.js +3 -6
  211. package/dist/src/sessions/durable-session-commit.js +3 -3
  212. package/dist/src/sessions/prepared-session-replacement.d.ts +6 -0
  213. package/dist/src/sessions/prepared-session-replacement.js +46 -0
  214. package/dist/src/sessions/session-store.js +3 -3
  215. package/dist/src/shared/passive-observation-self-exclusion.d.ts +5 -0
  216. package/dist/src/shared/passive-observation-self-exclusion.js +37 -0
  217. package/dist/src/shared/windows-file-io/authority-script.d.ts +1 -0
  218. package/dist/src/shared/windows-file-io/authority-script.js +94 -0
  219. package/dist/src/shared/windows-file-io/native-script.d.ts +2 -0
  220. package/dist/src/shared/windows-file-io/native-script.js +120 -0
  221. package/dist/src/shared/windows-file-io/read-bytes-script.d.ts +1 -0
  222. package/dist/src/shared/windows-file-io/read-bytes-script.js +18 -0
  223. package/dist/src/shared/windows-job-object.d.ts +2 -0
  224. package/dist/src/shared/windows-job-object.js +66 -0
  225. package/dist/src/web-ui/app/ARCHITECTURE.md +1 -1
  226. package/dist/src/web-ui/app/app-bootstrap.js +14 -1
  227. package/dist/src/web-ui/app/app-state.js +0 -7
  228. package/dist/src/web-ui/app/app.js +54 -156
  229. package/dist/src/web-ui/app/components/automations/node-inspector.js +3 -2
  230. package/dist/src/web-ui/app/components/automations/step-editor-dialog.js +3 -0
  231. package/dist/src/web-ui/app/components/automations/timeline.js +3 -2
  232. package/dist/src/web-ui/app/components/composer-submission-notice.js +50 -0
  233. package/dist/src/web-ui/app/components/config-workspace/model-plugin-permissions.js +7 -1
  234. package/dist/src/web-ui/app/components/config-workspace/workspace-mutations.js +22 -2
  235. package/dist/src/web-ui/app/components/dashboard/compact-layout.js +137 -0
  236. package/dist/src/web-ui/app/components/dashboard/icons.js +5 -0
  237. package/dist/src/web-ui/app/components/dashboard/widget-card.js +85 -0
  238. package/dist/src/web-ui/app/components/dashboard/widget-dialog.js +83 -0
  239. package/dist/src/web-ui/app/components/dashboard/widget-summaries.js +155 -0
  240. package/dist/src/web-ui/app/components/dashboard/workspace.js +28 -4
  241. package/dist/src/web-ui/app/components/home-guidance/daily-review.js +2 -2
  242. package/dist/src/web-ui/app/components/home-guidance/home-guidance.js +20 -6
  243. package/dist/src/web-ui/app/components/model-setup/context-window-feedback.js +53 -0
  244. package/dist/src/web-ui/app/components/model-setup/save-flow.js +3 -1
  245. package/dist/src/web-ui/app/components/model-setup/save-outcome.js +1 -0
  246. package/dist/src/web-ui/app/components/model-setup/wizard.js +12 -0
  247. package/dist/src/web-ui/app/components/operations-summary.js +2 -1
  248. package/dist/src/web-ui/app/components/passive-learning/activity-controls.js +4 -0
  249. package/dist/src/web-ui/app/components/passive-learning/collection-access.js +35 -0
  250. package/dist/src/web-ui/app/components/passive-learning/collection-consent-dialog.js +59 -0
  251. package/dist/src/web-ui/app/components/passive-learning/collection-consent-gate.js +94 -0
  252. package/dist/src/web-ui/app/components/passive-learning/computer-update-notice.js +6 -0
  253. package/dist/src/web-ui/app/components/passive-learning/failure-copy.js +1 -0
  254. package/dist/src/web-ui/app/components/passive-learning/home-widget-preview.js +32 -0
  255. package/dist/src/web-ui/app/components/passive-learning/home.js +11 -3
  256. package/dist/src/web-ui/app/components/passive-learning/macos-collection-restart-notice.js +1 -0
  257. package/dist/src/web-ui/app/components/passive-learning/memory.js +2 -4
  258. package/dist/src/web-ui/app/components/passive-learning/workspace-view.js +2 -2
  259. package/dist/src/web-ui/app/components/plugins/compatibility.js +13 -0
  260. package/dist/src/web-ui/app/components/plugins/discovery-rendering.js +9 -1
  261. package/dist/src/web-ui/app/components/plugins/installation-compatibility.js +7 -0
  262. package/dist/src/web-ui/app/components/plugins/installation.js +2 -1
  263. package/dist/src/web-ui/app/components/plugins/rendering.js +3 -0
  264. package/dist/src/web-ui/app/components/reasoning-override-prompt.js +82 -0
  265. package/dist/src/web-ui/app/components/runtime-config-activation.js +22 -8
  266. package/dist/src/web-ui/app/components/runtime-setup/optional-steps.js +7 -4
  267. package/dist/src/web-ui/app/components/runtime-setup/plugins.js +3 -1
  268. package/dist/src/web-ui/app/components/runtime-setup/rendering.js +6 -4
  269. package/dist/src/web-ui/app/components/runtime-setup-guide.d.ts +1 -0
  270. package/dist/src/web-ui/app/components/schedules/details.js +3 -2
  271. package/dist/src/web-ui/app/components/schedules/form.js +10 -8
  272. package/dist/src/web-ui/app/components/schedules/workspace.js +23 -4
  273. package/dist/src/web-ui/app/components/session-sidebar-sections.js +2 -2
  274. package/dist/src/web-ui/app/components/spark-chat/handoff-actions.js +9 -3
  275. package/dist/src/web-ui/app/components/spark-chat/panel.js +1 -1
  276. package/dist/src/web-ui/app/components/spark-chat/placement.js +4 -7
  277. package/dist/src/web-ui/app/components/spark-chat/settings.js +8 -4
  278. package/dist/src/web-ui/app/components/system-host/home-widget-permission-preview.js +75 -0
  279. package/dist/src/web-ui/app/components/system-host/home-widget-summary.js +93 -0
  280. package/dist/src/web-ui/app/components/system-host/macos-permission-rendering.js +2 -2
  281. package/dist/src/web-ui/app/components/system-host/macos-permissions.js +2 -0
  282. package/dist/src/web-ui/app/components/system-host/native-windows-access.js +50 -0
  283. package/dist/src/web-ui/app/components/system-host/rendering.js +6 -3
  284. package/dist/src/web-ui/app/components/system-host/windows-store-setup.js +2 -2
  285. package/dist/src/web-ui/app/components/workspace-storage-notice.js +37 -0
  286. package/dist/src/web-ui/app/computer-access-feature.js +13 -1
  287. package/dist/src/web-ui/app/configuration-environment-refresh.js +27 -34
  288. package/dist/src/web-ui/app/configuration-feature.js +11 -1
  289. package/dist/src/web-ui/app/controllers/app-event-bindings.js +38 -105
  290. package/dist/src/web-ui/app/controllers/chat-request-controller.d.ts +28 -0
  291. package/dist/src/web-ui/app/controllers/chat-request-controller.js +34 -66
  292. package/dist/src/web-ui/app/controllers/composer-attachments-controller.d.ts +15 -40
  293. package/dist/src/web-ui/app/controllers/composer-attachments-controller.js +26 -69
  294. package/dist/src/web-ui/app/controllers/composer-draft-view.d.ts +27 -0
  295. package/dist/src/web-ui/app/controllers/composer-draft-view.js +48 -0
  296. package/dist/src/web-ui/app/controllers/composer-drafts.d.ts +55 -0
  297. package/dist/src/web-ui/app/controllers/composer-drafts.js +120 -0
  298. package/dist/src/web-ui/app/controllers/composer-feature.d.ts +65 -0
  299. package/dist/src/web-ui/app/controllers/composer-feature.js +124 -0
  300. package/dist/src/web-ui/app/controllers/composer-queue-controller.d.ts +33 -94
  301. package/dist/src/web-ui/app/controllers/composer-queue-controller.js +185 -251
  302. package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.d.ts +48 -0
  303. package/dist/src/web-ui/app/controllers/composer-submission-lifecycle.js +97 -0
  304. package/dist/src/web-ui/app/controllers/composer-submit-controller.d.ts +30 -61
  305. package/dist/src/web-ui/app/controllers/composer-submit-controller.js +56 -138
  306. package/dist/src/web-ui/app/controllers/composer-surface-controller.js +6 -0
  307. package/dist/src/web-ui/app/controllers/composer-workspace-controller.d.ts +22 -40
  308. package/dist/src/web-ui/app/controllers/composer-workspace-controller.js +49 -165
  309. package/dist/src/web-ui/app/controllers/conversation-navigation-intent.js +15 -0
  310. package/dist/src/web-ui/app/controllers/conversation-request-hydration.js +20 -17
  311. package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +1 -2
  312. package/dist/src/web-ui/app/controllers/conversation-session-controller.js +49 -22
  313. package/dist/src/web-ui/app/controllers/conversation-workspace-activation.js +27 -0
  314. package/dist/src/web-ui/app/controllers/daily-memory-review.js +15 -16
  315. package/dist/src/web-ui/app/controllers/environment-transition.js +126 -0
  316. package/dist/src/web-ui/app/controllers/environment-workspace-preparation.js +18 -0
  317. package/dist/src/web-ui/app/controllers/home-composer-feature.d.ts +14 -36
  318. package/dist/src/web-ui/app/controllers/home-composer-feature.js +17 -114
  319. package/dist/src/web-ui/app/controllers/home-conversation-activation.js +6 -8
  320. package/dist/src/web-ui/app/controllers/operations-controller.js +2 -1
  321. package/dist/src/web-ui/app/controllers/passive-learning-controller.js +56 -0
  322. package/dist/src/web-ui/app/controllers/projects-controller.d.ts +1 -1
  323. package/dist/src/web-ui/app/controllers/projects-controller.js +6 -1
  324. package/dist/src/web-ui/app/controllers/reasoning-mode-controller.js +174 -0
  325. package/dist/src/web-ui/app/controllers/runtime-selection-controller.d.ts +7 -0
  326. package/dist/src/web-ui/app/controllers/runtime-selection-controller.js +20 -155
  327. package/dist/src/web-ui/app/controllers/session-controller.js +33 -17
  328. package/dist/src/web-ui/app/controllers/session-pin-updates.js +14 -0
  329. package/dist/src/web-ui/app/controllers/session-sidebar-controller.js +12 -14
  330. package/dist/src/web-ui/app/controllers/spark-chat-sync.js +2 -2
  331. package/dist/src/web-ui/app/controllers/steer-controller.js +9 -7
  332. package/dist/src/web-ui/app/controllers/tool-permission-mode-controller.js +1 -1
  333. package/dist/src/web-ui/app/controllers/workspace-conversation-opener.js +34 -0
  334. package/dist/src/web-ui/app/dashboard-feature.js +12 -2
  335. package/dist/src/web-ui/app/lib/reasoning-controls.js +40 -0
  336. package/dist/src/web-ui/app/lib/session-composer-queue-ownership.js +58 -0
  337. package/dist/src/web-ui/app/lib/session-composer-queue.d.ts +12 -0
  338. package/dist/src/web-ui/app/lib/session-composer-queue.js +25 -6
  339. package/dist/src/web-ui/app/passive-learning-feature.js +18 -5
  340. package/dist/src/web-ui/app/schedules-feature.js +5 -3
  341. package/dist/src/web-ui/app/services/client-preferences.d.ts +18 -10
  342. package/dist/src/web-ui/app/services/client-preferences.js +25 -16
  343. package/dist/src/web-ui/app/services/home-guidance-preferences.js +13 -13
  344. package/dist/src/web-ui/app/services/reasoning-override.js +12 -0
  345. package/dist/src/web-ui/app/services/runtime-web-client/automations.js +10 -2
  346. package/dist/src/web-ui/app/services/runtime-web-client/memory.js +7 -2
  347. package/dist/src/web-ui/app/services/runtime-web-client/system-host.js +2 -0
  348. package/dist/src/web-ui/app/services/runtime-web-client.d.ts +2 -0
  349. package/dist/src/web-ui/app/services/runtime-web-client.js +2 -0
  350. package/dist/src/web-ui/app/services/server-composer-queue.js +32 -0
  351. package/dist/src/web-ui/app/services/session-sidebar-preferences.js +5 -5
  352. package/dist/src/web-ui/app/services/workspace-state-storage.js +116 -0
  353. package/dist/src/web-ui/app/services/workspace-state.js +27 -0
  354. package/dist/src/web-ui/app/spark-chat-conversation.js +34 -45
  355. package/dist/src/web-ui/app/spark-chat-feature.js +10 -4
  356. package/dist/src/web-ui/app/styles/21-composer-controls.css +16 -0
  357. package/dist/src/web-ui/app/styles/41-plugin-management.css +8 -0
  358. package/dist/src/web-ui/app/styles/42-model-plugin-permissions.css +1 -0
  359. package/dist/src/web-ui/app/styles/49-collection-consent.css +30 -0
  360. package/dist/src/web-ui/app/styles/64-workspace-storage.css +23 -0
  361. package/dist/src/web-ui/app/styles/95-home-widgets.css +109 -0
  362. package/dist/src/web-ui/app/styles.css +3 -0
  363. package/dist/src/web-ui/client-state/contracts.d.ts +15 -0
  364. package/dist/src/web-ui/client-state/contracts.js +13 -0
  365. package/dist/src/web-ui/client-state/preference-shapes.d.ts +2 -0
  366. package/dist/src/web-ui/client-state/preference-shapes.js +80 -0
  367. package/dist/src/web-ui/client-state/preferences.d.ts +3 -0
  368. package/dist/src/web-ui/client-state/preferences.js +84 -0
  369. package/dist/src/web-ui/client-state/queue.d.ts +3 -0
  370. package/dist/src/web-ui/client-state/queue.js +43 -0
  371. package/dist/src/web-ui/client-state/routes.d.ts +7 -0
  372. package/dist/src/web-ui/client-state/routes.js +58 -0
  373. package/dist/src/web-ui/client-state/store.d.ts +14 -0
  374. package/dist/src/web-ui/client-state/store.js +88 -0
  375. package/dist/src/web-ui/local-runtime/configuration-activation-source.js +2 -0
  376. package/dist/src/web-ui/local-runtime/http.js +11 -2
  377. package/dist/src/web-ui/local-runtime/model-context-capacity-error.d.ts +14 -0
  378. package/dist/src/web-ui/local-runtime/model-context-capacity-error.js +28 -0
  379. package/dist/src/web-ui/local-runtime/model-setup-context-window.d.ts +15 -0
  380. package/dist/src/web-ui/local-runtime/model-setup-context-window.js +25 -0
  381. package/dist/src/web-ui/local-runtime/model-setup-routes.js +2 -0
  382. package/dist/src/web-ui/local-runtime/model-setup-service.js +5 -2
  383. package/dist/src/web-ui/local-runtime/model-setup-validation.d.ts +1 -0
  384. package/dist/src/web-ui/local-runtime/model-setup-validation.js +14 -7
  385. package/dist/src/web-ui/local-runtime/request-body-error.d.ts +11 -0
  386. package/dist/src/web-ui/local-runtime/request-body-error.js +14 -0
  387. package/dist/src/web-ui/local-runtime/request-control-observation.js +2 -2
  388. package/dist/src/web-ui/local-runtime/request-execution.js +18 -18
  389. package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.d.ts +2 -0
  390. package/dist/src/web-ui/local-runtime/runtime-setup-connection-edit.js +35 -22
  391. package/dist/src/web-ui/local-runtime/runtime-setup-context-window.d.ts +2 -9
  392. package/dist/src/web-ui/local-runtime/runtime-setup-context-window.js +4 -27
  393. package/dist/src/web-ui/local-runtime/runtime-setup-credentials.d.ts +15 -1
  394. package/dist/src/web-ui/local-runtime/runtime-setup-credentials.js +30 -11
  395. package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.d.ts +20 -0
  396. package/dist/src/web-ui/local-runtime/runtime-setup-edit-files.js +104 -0
  397. package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.d.ts +29 -0
  398. package/dist/src/web-ui/local-runtime/runtime-setup-edit-journal.js +151 -0
  399. package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.d.ts +7 -0
  400. package/dist/src/web-ui/local-runtime/runtime-setup-edit-recovery.js +87 -0
  401. package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.d.ts +3 -0
  402. package/dist/src/web-ui/local-runtime/runtime-setup-edit-transaction.js +37 -0
  403. package/dist/src/web-ui/local-runtime/runtime-setup-service.js +4 -0
  404. package/dist/src/web-ui/local-runtime-backend.js +14 -0
  405. package/dist/src/web-ui/plugin-management-catalog.d.ts +3 -1
  406. package/dist/src/web-ui/plugin-management-catalog.js +3 -1
  407. package/dist/src/web-ui/plugin-management-service.d.ts +1 -0
  408. package/dist/src/web-ui/plugin-removal-service.d.ts +1 -0
  409. package/dist/src/web-ui/server-readiness.d.ts +3 -0
  410. package/dist/src/web-ui/server-readiness.js +36 -0
  411. package/dist/src/web-ui/server.d.ts +2 -0
  412. package/dist/src/web-ui/server.js +23 -1
  413. package/dist/src/web-ui/system-host-service.js +13 -2
  414. package/dist/src/web-ui/system-host-setup/collection-consent-route.d.ts +3 -0
  415. package/dist/src/web-ui/system-host-setup/collection-consent-route.js +30 -0
  416. package/docs/installation.md +44 -5
  417. package/docs/plugins.md +174 -28
  418. package/docs/tool-execution-result-evidence-contract.md +57 -0
  419. package/docs/windows-companion-store.md +5 -0
  420. package/package.json +4 -2
  421. package/plugins/capability-brief/plugin.json +5 -1
  422. package/plugins/code-outline/README.md +20 -0
  423. package/plugins/code-outline/plugin.json +2 -1
  424. package/plugins/code-outline/source/index.ts +16 -20
  425. package/plugins/code-outline/source/read-failure.ts +40 -0
  426. package/plugins/code-outline/src/index.cjs +614 -29
  427. package/plugins/document-reader/README.md +33 -0
  428. package/plugins/document-reader/plugin.json +2 -1
  429. package/plugins/document-reader/source/pdf-contract.ts +57 -0
  430. package/plugins/document-reader/source/pdf-parser.ts +139 -0
  431. package/plugins/document-reader/source/pdf-process-main.ts +56 -0
  432. package/plugins/document-reader/source/pdf-process.ts +207 -0
  433. package/plugins/document-reader/source/pdf-result.ts +79 -0
  434. package/plugins/document-reader/source/pdf-worker.ts +39 -303
  435. package/plugins/document-reader/source/pdf.ts +4 -1
  436. package/plugins/document-reader/source/read-failure.ts +37 -0
  437. package/plugins/document-reader/source/reader.ts +3 -19
  438. package/plugins/document-reader/src/index.cjs +995 -211
  439. package/plugins/exec/README.md +19 -0
  440. package/plugins/exec/plugin.json +4 -3
  441. package/plugins/exec/skills/exec_skill/SKILL.md +3 -2
  442. package/plugins/exec/source/filesystem-file-observer.ts +98 -0
  443. package/plugins/exec/source/filesystem-observer.ts +8 -79
  444. package/plugins/exec/source/output-files.ts +12 -6
  445. package/plugins/exec/source/paths.ts +3 -1
  446. package/plugins/exec/source/process-manager.ts +8 -24
  447. package/plugins/exec/source/shell-platform.ts +19 -3
  448. package/plugins/exec/source/shell-process.ts +55 -0
  449. package/plugins/exec/source/windows-job-source.ts +1 -0
  450. package/plugins/exec/source/windows-shell-bootstrap.ts +20 -0
  451. package/plugins/exec/src/index.cjs +252 -96
  452. package/plugins/filesystem/README.md +65 -0
  453. package/plugins/filesystem/plugin.json +7 -3
  454. package/plugins/filesystem/source/atomic-write.ts +2 -0
  455. package/plugins/filesystem/source/bounded-io.ts +80 -306
  456. package/plugins/filesystem/source/directory-sample.ts +2 -0
  457. package/plugins/filesystem/source/errors.ts +14 -0
  458. package/plugins/filesystem/source/file-observation.ts +151 -0
  459. package/plugins/filesystem/source/file-version.ts +41 -0
  460. package/plugins/filesystem/source/index.ts +6 -0
  461. package/plugins/filesystem/source/mutation-coordinator.ts +1 -0
  462. package/plugins/filesystem/source/windows/authority-script.ts +1 -0
  463. package/plugins/filesystem/source/windows/native-script.ts +1 -0
  464. package/plugins/filesystem/source/windows/operations.ts +197 -0
  465. package/plugins/filesystem/source/windows/process.ts +214 -0
  466. package/plugins/filesystem/source/windows/publication-script.ts +29 -0
  467. package/plugins/filesystem/source/windows/read-script.ts +63 -0
  468. package/plugins/filesystem/source/windows/request-availability.ts +67 -0
  469. package/plugins/filesystem/source/windows/source.ts +42 -0
  470. package/plugins/filesystem/source/windows/storage-script.ts +11 -0
  471. package/plugins/filesystem/source/windows/streams-script.ts +24 -0
  472. package/plugins/filesystem/source/windows/write-script.ts +86 -0
  473. package/plugins/filesystem/src/index.cjs +1208 -322
  474. package/plugins/json-inspector/README.md +18 -0
  475. package/plugins/json-inspector/plugin.json +2 -1
  476. package/plugins/json-inspector/source/index.ts +16 -19
  477. package/plugins/json-inspector/source/read-failure.ts +42 -0
  478. package/plugins/json-inspector/src/index.cjs +612 -27
  479. package/plugins/local-search/README.md +29 -0
  480. package/plugins/local-search/plugin.json +2 -1
  481. package/plugins/local-search/source/errors.ts +2 -0
  482. package/plugins/local-search/source/paths.ts +3 -0
  483. package/plugins/local-search/source/ripgrep-process.ts +31 -5
  484. package/plugins/local-search/source/ripgrep.ts +3 -3
  485. package/plugins/local-search/source/windows-authority.ts +99 -0
  486. package/plugins/local-search/source/windows-search-lease.ts +49 -0
  487. package/plugins/local-search/source/windows-search-process.ts +91 -0
  488. package/plugins/local-search/source/windows-search-script.ts +52 -0
  489. package/plugins/local-search/src/index.cjs +595 -26
  490. package/plugins/memory/plugin.json +5 -1
  491. package/plugins/memory/source/lock-directory-claim.ts +56 -0
  492. package/plugins/memory/source/lock-owner-file.ts +71 -0
  493. package/plugins/memory/source/lock-path-observation.ts +26 -0
  494. package/plugins/memory/source/prepared-memory-replacement.ts +40 -0
  495. package/plugins/memory/source/store-lock.ts +12 -7
  496. package/plugins/memory/source/store.ts +3 -2
  497. package/plugins/memory/src/index.cjs +174 -25
  498. package/plugins/project-orientation/README.md +23 -0
  499. package/plugins/project-orientation/plugin.json +2 -1
  500. package/plugins/project-orientation/source/index.ts +12 -9
  501. package/plugins/project-orientation/source/inspection-failure.ts +70 -0
  502. package/plugins/project-orientation/source/manifest-summary.ts +9 -2
  503. package/plugins/project-orientation/source/tree.ts +6 -0
  504. package/plugins/project-orientation/src/index.cjs +647 -31
  505. package/plugins/system/README.md +51 -15
  506. package/plugins/system/plugin.json +6 -2
  507. package/plugins/system/skills/system_actions/SKILL.md +1 -1
  508. package/plugins/system/source/command-working-directory.ts +47 -0
  509. package/plugins/system/source/computer/handlers.ts +13 -9
  510. package/plugins/system/source/computer/observation-result.ts +10 -5
  511. package/plugins/system/source/computer/request-computers.ts +10 -3
  512. package/plugins/system/source/computer/request-modules.ts +3 -6
  513. package/plugins/system/source/computer/runtime-platform.ts +18 -0
  514. package/plugins/system/source/host-dispatch.ts +18 -2
  515. package/plugins/system/source/index.ts +5 -3
  516. package/plugins/system/source/local-command-output-retention.ts +16 -0
  517. package/plugins/system/source/local-command-output.ts +16 -8
  518. package/plugins/system/source/request-system-modules.ts +12 -2
  519. package/plugins/system/source/request-target-snapshot.ts +2 -1
  520. package/plugins/system/source/security/desktop-result.ts +177 -0
  521. package/plugins/system/source/security/observed-error.ts +10 -0
  522. package/plugins/system/source/security/secret-text.ts +118 -0
  523. package/plugins/system/source/security/system-results.ts +62 -0
  524. package/plugins/system/source/security/windows-output-directory.ts +82 -0
  525. package/plugins/system/src/index.cjs +837 -151
  526. package/plugins/system-probe/plugin.json +9 -3
  527. package/plugins/system-probe/source/disk-path.ts +8 -0
  528. package/plugins/system-probe/source/index.ts +10 -5
  529. package/plugins/system-probe/source/machine-load.ts +33 -0
  530. package/plugins/system-probe/source/metrics.ts +6 -8
  531. package/plugins/system-probe/src/index.cjs +49 -16
  532. package/plugins/web/plugin.json +5 -1
@@ -1,33 +1,22 @@
1
- import type { ComposerScope } from "./composer-queue-controller.js";
2
-
3
- export interface ComposerSubmissionBlock {
4
- code: string;
5
- message: string;
6
- }
7
-
8
- export interface ComposerSubmitState {
9
- activeRequestId: string;
10
- pendingAttachments: readonly unknown[];
11
- composerSending: boolean;
12
- currentSessionId: string;
13
- sessionViewVersion?: number;
14
- }
15
-
16
- export interface ComposerSubmitDom {
17
- composerInput: {
18
- value: string;
19
- scrollHeight: number;
20
- style: { height: string };
21
- focus(): void;
22
- };
23
- }
1
+ import type { ComposerDraft } from "./composer-drafts.js";
2
+ import type { ComposerInputSurface } from "./composer-draft-view.js";
3
+ import type { ComposerAttachmentsController } from "./composer-attachments-controller.js";
4
+ import type { ComposerQueueController } from "./composer-queue-controller.js";
5
+ import type { ChatRequestController } from "./chat-request-controller.js";
6
+ import type { ComposerSubmissionAction, ComposerSubmissionLifecycle, ComposerSubmissionResult } from "./composer-submission-lifecycle.js";
7
+ import type { ConversationSessionState } from "./conversation-session-controller.js";
8
+
9
+ export interface ComposerSubmissionBlock { code: string; message: string }
10
+ export type ComposerSubmitState = Pick<ConversationSessionState, "activeRequestId" | "currentSessionId" | "requestLifecycles">;
11
+ export interface ComposerSubmitDom { composerInput: ComposerInputSurface }
24
12
 
25
13
  export interface ComposerSubmitActions {
26
- primaryAction(): string;
14
+ primaryAction(): ComposerSubmissionAction;
27
15
  render(options: {
28
16
  activeRequestId: string;
29
- stopping?: boolean;
30
- onStop?: () => void;
17
+ waitingRequestId?: string;
18
+ stopping: boolean;
19
+ onStop(): void;
31
20
  attachmentCount: number;
32
21
  busy: boolean;
33
22
  disabled: boolean;
@@ -35,49 +24,29 @@ export interface ComposerSubmitActions {
35
24
  }): void;
36
25
  }
37
26
 
38
- export interface ComposerSubmitAttachments {
39
- activeUploadCount(): number;
40
- }
41
-
42
- export interface ComposerSubmitQueue {
43
- enqueue(text: string): Promise<void>;
44
- isCurrentDraining(): boolean;
45
- queuedCount(): number;
46
- restoreText(text: string, scope: ComposerScope): void;
47
- }
48
-
49
- export interface ComposerSubmitChatRequests {
50
- sendMessage(text: string): Promise<void>;
51
- stopRequest?(scope: ComposerScope & { requestId: string }): Promise<{ accepted: boolean; reason?: string }>;
52
- }
53
-
54
- export interface ComposerSubmitConversationSession {
55
- appendRequestError(error: unknown): void;
56
- }
57
-
27
+ export type ComposerDispatchResult = ComposerSubmissionResult | { status: "blocked"; error: unknown };
58
28
  export interface ComposerSubmitControllerOptions {
59
29
  state: ComposerSubmitState;
60
30
  dom: ComposerSubmitDom;
61
31
  composerActions: ComposerSubmitActions;
62
- attachments: ComposerSubmitAttachments;
63
- queue: ComposerSubmitQueue;
64
- steer: (text: string) => Promise<void>;
65
- chatRequests: ComposerSubmitChatRequests;
66
- conversationSession: ComposerSubmitConversationSession;
67
- selectedEnvironmentId: () => string;
68
- setMessageStatus: (message: string, busy?: boolean) => void;
69
- getSubmissionBlock?: () => ComposerSubmissionBlock | null;
70
- onSubmissionBlocked?: (block: ComposerSubmissionBlock) => void;
71
- isComposerVisible?: () => boolean;
32
+ getDraft(): ComposerDraft;
33
+ attachments: Pick<ComposerAttachmentsController, "activeUploadCount">;
34
+ queue: Pick<ComposerQueueController, "isCurrentDraining" | "queuedCount">;
35
+ lifecycle: Pick<ComposerSubmissionLifecycle, "hasPendingScope">;
36
+ submit(action: ComposerSubmissionAction): Promise<ComposerSubmissionResult>;
37
+ stopRequest: ChatRequestController["stopRequest"];
38
+ selectedEnvironmentId(): string;
39
+ setMessageStatus(message: string, busy?: boolean): void;
40
+ getSubmissionBlock?(): ComposerSubmissionBlock | null;
41
+ onSubmissionBlocked?(block: ComposerSubmissionBlock): void;
42
+ isComposerVisible?(): boolean;
43
+ allowsActiveRequest?: boolean;
72
44
  }
73
45
 
74
46
  export interface ComposerSubmitController {
75
47
  stop(): false | Promise<void>;
76
- dispatch(requestedAction?: string): void;
48
+ dispatch(requestedAction?: ComposerSubmissionAction): undefined | Promise<ComposerDispatchResult>;
77
49
  resize(): void;
78
50
  updateSendState(): void;
79
51
  }
80
-
81
- export declare function createComposerSubmitController(
82
- options: ComposerSubmitControllerOptions,
83
- ): ComposerSubmitController;
52
+ export declare function createComposerSubmitController(options: ComposerSubmitControllerOptions): ComposerSubmitController;
@@ -1,160 +1,78 @@
1
- import {
2
- captureComposerSubmissionScope,
3
- isCurrentComposerSubmissionScope,
4
- } from "../lib/composer-submission-scope.js";
5
1
  import { resolveComposerPrimaryAction } from "../ui-behavior.js";
6
2
  import { createComposerStopController } from "./composer-stop-controller.js";
7
- import {
8
- hasWaitingApproval,
9
- waitingRequest,
10
- } from "../lib/request-lifecycle-view.js";
3
+ import { hasWaitingApproval, waitingRequest } from "../lib/request-lifecycle-view.js";
11
4
 
5
+ /** UI intent only. The shared submission lifecycle owns all payload transitions. */
12
6
  export function createComposerSubmitController({
13
- state,
14
- dom,
15
- composerActions,
16
- attachments,
17
- queue,
18
- steer,
19
- chatRequests,
20
- conversationSession,
21
- selectedEnvironmentId,
22
- setMessageStatus,
23
- getSubmissionBlock = () => null,
24
- onSubmissionBlocked = () => {},
25
- isComposerVisible = () => true,
7
+ state, dom, composerActions, getDraft, attachments, queue, lifecycle, submit,
8
+ stopRequest, selectedEnvironmentId, setMessageStatus,
9
+ getSubmissionBlock = () => null, onSubmissionBlocked = () => {},
10
+ isComposerVisible = () => true, allowsActiveRequest = true,
26
11
  }) {
27
- const stopping = createComposerStopController({
28
- state,
29
- selectedEnvironmentId,
30
- setMessageStatus,
31
- updateSendState,
32
- stopRequest: (scope) => chatRequests.stopRequest(scope),
33
- });
12
+ const stopping = createComposerStopController({ state, selectedEnvironmentId,
13
+ setMessageStatus, updateSendState, stopRequest });
14
+
34
15
  function resize() {
35
16
  if (!isComposerVisible()) return;
36
17
  dom.composerInput.style.height = "auto";
37
- dom.composerInput.style.height = `${Math.min(
38
- dom.composerInput.scrollHeight,
39
- 168,
40
- )}px`;
18
+ dom.composerInput.style.height = `${Math.min(dom.composerInput.scrollHeight, 168)}px`;
19
+ }
20
+ function isBusy() {
21
+ if (lifecycle.hasPendingScope(getDraft().scope)) return true;
22
+ return allowsActiveRequest && queue.isCurrentDraining();
23
+ }
24
+ function cannotSubmit() {
25
+ if (stopping.isStopping()) return true;
26
+ if (allowsActiveRequest && hasWaitingApproval(state)) return true;
27
+ if (getSubmissionBlock()) return true;
28
+ if (!dom.composerInput.value.trim()) return true;
29
+ if (isBusy()) return true;
30
+ return attachments.activeUploadCount() > 0;
41
31
  }
42
-
43
32
  function updateSendState() {
44
33
  if (!isComposerVisible()) return;
45
- const queueDraining = queue.isCurrentDraining();
46
- const submissionBlock = getSubmissionBlock();
47
34
  composerActions.render({
48
- activeRequestId: state.activeRequestId,
49
- waitingRequestId: waitingRequest(state)?.requestId,
35
+ activeRequestId: allowsActiveRequest ? state.activeRequestId : "",
36
+ waitingRequestId: allowsActiveRequest ? waitingRequest(state)?.requestId : "",
50
37
  stopping: stopping.isStopping(),
51
- onStop: () => {
52
- if (isComposerVisible()) void stopping.stop();
53
- },
54
- attachmentCount: state.pendingAttachments.length,
55
- busy: state.composerSending || queueDraining,
56
- disabled:
57
- stopping.isStopping() ||
58
- hasWaitingApproval(state) ||
59
- Boolean(submissionBlock) ||
60
- !dom.composerInput.value.trim() ||
61
- state.composerSending ||
62
- queueDraining ||
63
- attachments.activeUploadCount() > 0,
64
- queuedCount: queue.queuedCount(),
38
+ onStop: () => { if (isComposerVisible()) void stopping.stop(); },
39
+ attachmentCount: getDraft().attachments.length,
40
+ busy: isBusy(), disabled: cannotSubmit(), queuedCount: allowsActiveRequest ? queue.queuedCount() : 0,
65
41
  });
66
42
  }
67
-
68
43
  function dispatch(requestedAction = "") {
69
44
  if (!isComposerVisible()) return;
70
- if (stopping.isStopping()) return;
71
- if (hasWaitingApproval(state)) {
72
- setMessageStatus(
73
- "Decide or cancel the pending approval before sending a new message.",
74
- );
75
- return;
76
- }
77
- const text = dom.composerInput.value.trim();
78
- const submissionBlock = getSubmissionBlock();
79
- if (text && submissionBlock) {
80
- onSubmissionBlocked(submissionBlock);
81
- updateSendState();
82
- return;
83
- }
84
- if (
85
- !text ||
86
- state.composerSending ||
87
- queue.isCurrentDraining() ||
88
- attachments.activeUploadCount() > 0
89
- ) {
90
- return;
91
- }
45
+ const block = getSubmissionBlock();
46
+ if (block) { onSubmissionBlocked(block); updateSendState(); return; }
47
+ if (cannotSubmit()) return;
92
48
  let action = requestedAction || composerActions.primaryAction();
93
- if (state.activeRequestId && action === "send") {
94
- action = resolveComposerPrimaryAction(
95
- state.activeRequestId,
96
- state.pendingAttachments.length,
97
- );
98
- }
99
- const submissionScope = {
100
- environmentId: selectedEnvironmentId(),
101
- sessionId: state.currentSessionId,
102
- };
103
- state.composerSending = true;
104
- setMessageStatus(
105
- action === "steer"
106
- ? "Sending an update to the active request."
107
- : action === "send_next"
108
- ? "Queueing the next message."
109
- : "ABot is working.",
110
- true,
111
- );
112
- updateSendState();
113
- dom.composerInput.value = "";
49
+ if (!allowsActiveRequest) action = "send";
50
+ if (allowsActiveRequest && state.activeRequestId && action === "send")
51
+ action = resolveComposerPrimaryAction(state.activeRequestId, getDraft().attachments.length);
52
+ setMessageStatus(submissionStatus(action), true);
53
+ // submit synchronously takes text and files before its first await.
54
+ const submittedScope = getDraft().scope;
55
+ const operation = submit(action);
114
56
  resize();
115
- const operation =
116
- action === "steer"
117
- ? steer(text)
118
- : action === "send_next"
119
- ? queue.enqueue(text)
120
- : chatRequests.sendMessage(text);
121
- const completionScope = captureComposerSubmissionScope(
122
- state,
123
- selectedEnvironmentId(),
124
- );
125
- const isSubmissionForCurrentComposerView = () =>
126
- isCurrentComposerSubmissionScope(
127
- completionScope,
128
- state,
129
- selectedEnvironmentId(),
130
- );
131
- void operation
132
- .then(() => {
133
- if (!isSubmissionForCurrentComposerView()) return;
134
- if (action === "steer") {
135
- setMessageStatus("Update accepted. ABot is working.", true);
136
- } else if (action === "send_next") {
137
- setMessageStatus("Message queued for this conversation.", true);
138
- }
139
- })
140
- .catch((error) => {
141
- if (!isSubmissionForCurrentComposerView()) return;
142
- if (action !== "send") queue.restoreText(text, submissionScope);
143
- conversationSession.appendRequestError(error);
144
- setMessageStatus("ABot request failed.");
145
- })
146
- .finally(() => {
147
- if (!isSubmissionForCurrentComposerView()) return;
148
- state.composerSending = false;
149
- updateSendState();
150
- if (isComposerVisible()) dom.composerInput.focus();
151
- });
57
+ updateSendState();
58
+ return operation.catch((error) => {
59
+ setMessageStatus(error.message);
60
+ return { status: "blocked", error };
61
+ }).finally(() => {
62
+ updateSendState();
63
+ if (isSameComposerScope(submittedScope, getDraft().scope) && isComposerVisible()) dom.composerInput.focus();
64
+ });
152
65
  }
66
+ return { dispatch, resize, updateSendState, stop: () => isComposerVisible() && stopping.stop() };
67
+ }
68
+
69
+ function submissionStatus(action) {
70
+ if (action === "steer") return "Sending an update to the active request.";
71
+ if (action === "send_next") return "Queueing the next message.";
72
+ return "ABot is working.";
73
+ }
153
74
 
154
- return {
155
- dispatch,
156
- resize,
157
- updateSendState,
158
- stop: () => isComposerVisible() && stopping.stop(),
159
- };
75
+ function isSameComposerScope(submitted, current) {
76
+ if (submitted.environmentId !== current.environmentId) return false;
77
+ return submitted.sessionId === current.sessionId;
160
78
  }
@@ -3,6 +3,7 @@ export function createComposerSurfaceController({
3
3
  getHomeComposer,
4
4
  getChatAttachments,
5
5
  getChatSubmit,
6
+ refreshComposerSurfaces = () => {},
6
7
  rememberModelSelection,
7
8
  showToast,
8
9
  }) {
@@ -27,8 +28,13 @@ export function createComposerSurfaceController({
27
28
  },
28
29
  updateComposerSendState() {
29
30
  workspace.syncChatDraft();
31
+ refreshComposerSurfaces();
30
32
  activeSubmit()?.updateSendState();
31
33
  },
34
+ refreshComposerSubmissionState() {
35
+ getChatSubmit()?.updateSendState();
36
+ getHomeComposer()?.submit.updateSendState();
37
+ },
32
38
  resizeComposerInput() {
33
39
  activeSubmit()?.resize();
34
40
  },
@@ -1,54 +1,36 @@
1
- import type {
2
- ComposerAttachment,
3
- ComposerAttachmentsState,
4
- } from "./composer-attachments-controller.js";
5
- import type {
6
- ComposerSubmitDom,
7
- ComposerSubmitState,
8
- } from "./composer-submit-controller.js";
1
+ import type { ComposerDraft, ComposerDrafts, ComposerScope } from "./composer-drafts.js";
2
+ import type { ComposerDraftInput, ComposerDraftView, ComposerInputSurface } from "./composer-draft-view.js";
9
3
 
10
- export interface ComposerWorkspaceDom extends ComposerSubmitDom {
4
+ export interface ComposerWorkspaceDom {
5
+ composerInput: ComposerDraftInput;
11
6
  composerForm: HTMLElement;
12
7
  runtimeSetupGuide?: HTMLElement;
13
- [name: string]: unknown;
14
- }
15
-
16
- export type HomeComposerState = ComposerAttachmentsState &
17
- ComposerSubmitState & {
18
- environmentId: string;
19
- text: string;
20
- };
21
-
22
- export interface HomeComposerDraft {
23
- sessionId: string;
24
- environmentId: string;
25
- text: string;
26
- attachments: ComposerAttachment[];
27
8
  }
28
9
 
29
10
  export interface ComposerWorkspaceController<T extends ComposerWorkspaceDom = ComposerWorkspaceDom> {
30
- chatDom: Omit<T, "composerInput"> & ComposerSubmitDom;
31
- homeDom: Omit<T, "composerInput"> & ComposerSubmitDom;
32
- homeState: HomeComposerState;
11
+ drafts: ComposerDrafts;
12
+ chatDraft(): ComposerDraft;
13
+ homeDraft(): ComposerDraft;
14
+ chatView: ComposerDraftView;
15
+ homeView: ComposerDraftView;
16
+ chatDom: Omit<T, "composerInput"> & { composerInput: ComposerInputSurface };
17
+ homeDom: Omit<T, "composerInput"> & { composerInput: ComposerInputSurface };
33
18
  setWorkspace(workspace: string): void;
34
19
  isHome(): boolean;
35
20
  isChatVisible(): boolean;
36
21
  composerSessionId(): string;
37
22
  ensureHomeSession(): string;
38
- resetHomeDraft(): void;
39
- takeHomeDraft(text: string): HomeComposerDraft;
40
- restoreHomeDraft(draft: HomeComposerDraft): void;
23
+ finishHomeActivation(scope: ComposerScope): void;
41
24
  syncChatDraft(): void;
42
25
  }
43
26
 
44
- export declare function createComposerWorkspaceController<T extends ComposerWorkspaceDom>(
45
- options: {
46
- state: Pick<ComposerSubmitState, "currentSessionId">;
47
- dom: T;
48
- homeComposerHost: HTMLElement;
49
- homeSetupHost?: HTMLElement;
50
- selectedEnvironmentId(): string;
51
- createSessionId?(): string;
52
- onSessionCreated?(sessionId: string): void;
53
- },
54
- ): ComposerWorkspaceController<T>;
27
+ export declare function createComposerWorkspaceController<T extends ComposerWorkspaceDom>(options: {
28
+ state: { currentSessionId: string };
29
+ dom: T;
30
+ homeComposerHost: HTMLElement;
31
+ homeSetupHost?: HTMLElement;
32
+ selectedEnvironmentId(): string;
33
+ createSessionId?(): string;
34
+ onSessionCreated?(sessionId: string): void;
35
+ drafts?: ComposerDrafts;
36
+ }): ComposerWorkspaceController<T>;
@@ -1,181 +1,65 @@
1
1
  import { createWebSessionId } from "../lib/text-format.js";
2
+ import { createComposerDrafts } from "./composer-drafts.js";
3
+ import { createComposerDraftView } from "./composer-draft-view.js";
2
4
 
5
+ /** Places the shared Home/Chat controls and selects a draft; it owns no payload. */
3
6
  export function createComposerWorkspaceController({
4
- state,
5
- dom,
6
- homeComposerHost,
7
- homeSetupHost,
8
- selectedEnvironmentId,
9
- createSessionId = createWebSessionId,
10
- onSessionCreated = () => {},
7
+ state, dom, homeComposerHost, homeSetupHost, selectedEnvironmentId,
8
+ createSessionId = createWebSessionId, onSessionCreated = () => {},
9
+ drafts = createComposerDrafts(),
11
10
  }) {
12
- const surfaces = [{
13
- element: dom.composerForm,
14
- homeHost: homeComposerHost,
15
- chatHost: dom.composerForm.parentElement,
16
- nextSibling: dom.composerForm.nextSibling,
17
- }];
18
- if (homeSetupHost && dom.runtimeSetupGuide) {
19
- surfaces.push({
20
- element: dom.runtimeSetupGuide,
21
- homeHost: homeSetupHost,
22
- chatHost: dom.runtimeSetupGuide.parentElement,
23
- nextSibling: dom.runtimeSetupGuide.nextSibling,
24
- });
25
- }
26
- const chatDrafts = new Map();
27
- const homeState = {
28
- currentSessionId: "",
29
- activeRequestId: "",
30
- pendingAttachments: [],
31
- pendingAttachmentUploadCounts: new Map(),
32
- composerAttachmentGeneration: 0,
33
- composerSending: false,
34
- environmentId: selectedEnvironmentId(),
35
- text: "",
36
- };
11
+ const surfaces = [{ element: dom.composerForm, homeHost: homeComposerHost,
12
+ chatHost: dom.composerForm.parentElement, nextSibling: dom.composerForm.nextSibling }];
13
+ if (homeSetupHost && dom.runtimeSetupGuide) surfaces.push({
14
+ element: dom.runtimeSetupGuide, homeHost: homeSetupHost,
15
+ chatHost: dom.runtimeSetupGuide.parentElement, nextSibling: dom.runtimeSetupGuide.nextSibling,
16
+ });
17
+ const homeSessions = new Map();
37
18
  let workspace = "chat";
38
- let displayedSource = "chat";
39
- let displayedChatKey = currentChatKey();
40
-
41
- function currentChatKey() {
42
- return JSON.stringify([selectedEnvironmentId(), state.currentSessionId]);
43
- }
44
-
45
- function saveDisplayedText() {
46
- if (displayedSource === "home") {
47
- homeState.text = dom.composerInput.value;
48
- return;
49
- }
50
- chatDrafts.set(displayedChatKey, dom.composerInput.value);
51
- }
52
-
53
- function isHome() {
54
- return workspace === "home";
55
- }
56
-
57
- function isChatVisible() {
58
- return workspace === "chat";
59
- }
60
-
61
- function isCurrentChatInputDisplayed() {
62
- if (displayedSource !== "chat") return false;
63
- return displayedChatKey === currentChatKey();
64
- }
65
-
66
- function createInputSurface(source) {
67
- const parkedStyle = { height: "" };
68
- const isDisplayed = () =>
69
- source === "home"
70
- ? displayedSource === "home"
71
- : isCurrentChatInputDisplayed();
72
- const isVisible = () => source === "home" ? isHome() : isChatVisible();
73
- return {
74
- get value() {
75
- if (isDisplayed()) return dom.composerInput.value;
76
- if (source === "home") return homeState.text;
77
- return chatDrafts.get(currentChatKey()) || "";
78
- },
79
- set value(value) {
80
- if (source === "home") homeState.text = value;
81
- else chatDrafts.set(currentChatKey(), value);
82
- if (isDisplayed()) dom.composerInput.value = value;
83
- },
84
- get style() {
85
- return isDisplayed() ? dom.composerInput.style : parkedStyle;
86
- },
87
- get scrollHeight() {
88
- return isDisplayed() ? dom.composerInput.scrollHeight : 0;
89
- },
90
- focus() {
91
- if (!isVisible()) return;
92
- if (isDisplayed()) dom.composerInput.focus();
93
- },
94
- };
95
- }
96
19
 
97
20
  function ensureHomeSession() {
98
- if (homeState.currentSessionId) return homeState.currentSessionId;
99
- homeState.currentSessionId = createSessionId();
100
- onSessionCreated(homeState.currentSessionId);
101
- return homeState.currentSessionId;
21
+ const environment = selectedEnvironmentId();
22
+ if (homeSessions.has(environment)) return homeSessions.get(environment);
23
+ const session = createSessionId();
24
+ homeSessions.set(environment, session);
25
+ onSessionCreated(session);
26
+ return session;
102
27
  }
103
-
104
- function moveWorkspaceSurface(surface) {
105
- if (isHome()) {
106
- surface.homeHost.appendChild(surface.element);
107
- return;
108
- }
109
- const nextSibling = surface.nextSibling?.parentElement === surface.chatHost
110
- ? surface.nextSibling
111
- : null;
112
- surface.chatHost.insertBefore(surface.element, nextSibling);
28
+ const chatDraft = () => drafts.open({ environmentId: selectedEnvironmentId(), sessionId: state.currentSessionId });
29
+ const homeDraft = () => drafts.open({ environmentId: selectedEnvironmentId(), sessionId: ensureHomeSession() });
30
+ const isHome = () => workspace === "home";
31
+ const isChatVisible = () => workspace === "chat";
32
+ const chatView = createComposerDraftView({ input: dom.composerInput, getDraft: chatDraft, isVisible: isChatVisible });
33
+ const homeView = createComposerDraftView({ input: dom.composerInput, getDraft: homeDraft, isVisible: isHome });
34
+
35
+ function moveSurface(surface) {
36
+ if (isHome()) { surface.homeHost.appendChild(surface.element); return; }
37
+ const sibling = surface.nextSibling?.parentElement === surface.chatHost ? surface.nextSibling : null;
38
+ surface.chatHost.insertBefore(surface.element, sibling);
113
39
  }
114
-
115
- function setWorkspace(nextWorkspace) {
116
- saveDisplayedText();
117
- workspace = nextWorkspace;
118
- displayedSource = isHome() ? "home" : "chat";
119
- displayedChatKey = currentChatKey();
120
- dom.composerInput.value = isHome()
121
- ? homeState.text
122
- : chatDrafts.get(displayedChatKey) || "";
123
- if (isHome()) ensureHomeSession();
124
- for (const surface of surfaces) moveWorkspaceSurface(surface);
40
+ function setWorkspace(next) {
41
+ if (isHome()) homeView.detach();
42
+ else chatView.detach();
43
+ workspace = next;
44
+ if (isHome()) homeView.display();
45
+ else chatView.display();
46
+ for (const surface of surfaces) moveSurface(surface);
125
47
  }
126
-
127
48
  function syncChatDraft() {
128
- if (displayedSource !== "chat") return;
129
- if (isCurrentChatInputDisplayed()) return;
130
- setWorkspace(workspace);
131
- }
132
-
133
- function resetHomeDraft() {
134
- homeState.currentSessionId = "";
135
- homeState.composerSending = false;
136
- homeState.pendingAttachments = [];
137
- homeState.composerAttachmentGeneration += 1;
138
- homeState.pendingAttachmentUploadCounts.clear();
139
- homeState.environmentId = selectedEnvironmentId();
140
- homeState.text = "";
141
- if (displayedSource === "home") dom.composerInput.value = "";
142
- }
143
-
144
- function takeHomeDraft(text) {
145
- const draft = {
146
- sessionId: ensureHomeSession(),
147
- environmentId: homeState.environmentId,
148
- text,
149
- attachments: [...homeState.pendingAttachments],
150
- };
151
- resetHomeDraft();
152
- return draft;
153
- }
154
-
155
- function restoreHomeDraft(draft) {
156
- homeState.currentSessionId = draft.sessionId;
157
- homeState.environmentId = draft.environmentId;
158
- homeState.pendingAttachments = draft.attachments;
159
- homeState.text = draft.text;
160
- if (displayedSource === "home") dom.composerInput.value = draft.text;
161
- }
162
-
163
- function composerSessionId() {
164
- return isHome() ? ensureHomeSession() : state.currentSessionId;
49
+ if (isHome()) { homeView.display(); return; }
50
+ chatView.display();
165
51
  }
52
+ drafts.subscribe((draft) => { chatView.refresh(draft); homeView.refresh(draft); });
53
+ chatView.display();
166
54
 
167
55
  return {
168
- chatDom: { ...dom, composerInput: createInputSurface("chat") },
169
- homeDom: { ...dom, composerInput: createInputSurface("home") },
170
- homeState,
171
- setWorkspace,
172
- isHome,
173
- isChatVisible,
174
- composerSessionId,
175
- ensureHomeSession,
176
- resetHomeDraft,
177
- takeHomeDraft,
178
- restoreHomeDraft,
179
- syncChatDraft,
56
+ drafts, chatDraft, homeDraft, chatView, homeView,
57
+ chatDom: { ...dom, composerInput: chatView.surface },
58
+ homeDom: { ...dom, composerInput: homeView.surface },
59
+ isHome, isChatVisible, setWorkspace, syncChatDraft, ensureHomeSession,
60
+ composerSessionId: () => isHome() ? ensureHomeSession() : state.currentSessionId,
61
+ finishHomeActivation(scope) {
62
+ if (homeSessions.get(scope.environmentId) === scope.sessionId) homeSessions.delete(scope.environmentId);
63
+ },
180
64
  };
181
65
  }