@abot-ai/runtime 1.6.0 → 1.7.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 (380) 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-types.d.ts +1 -1
  8. package/dist/src/cli/host-companion-bundle.mjs +7570 -6781
  9. package/dist/src/cli/host-companion-entry.js +5 -22
  10. package/dist/src/cli/host-companion-input.d.ts +3 -0
  11. package/dist/src/cli/host-companion-input.js +21 -0
  12. package/dist/src/cli/host-companion-lifecycle.d.ts +11 -0
  13. package/dist/src/cli/host-companion-lifecycle.js +32 -0
  14. package/dist/src/cli/host-companion-setup-target.d.ts +4 -0
  15. package/dist/src/cli/host-companion-setup-target.js +17 -0
  16. package/dist/src/cli/host-companion-startup.d.ts +2 -0
  17. package/dist/src/cli/host-companion-startup.js +7 -2
  18. package/dist/src/cli/host-companion.d.ts +6 -0
  19. package/dist/src/cli/host-companion.js +30 -27
  20. package/dist/src/cli/windows-companion-store-entry.d.ts +9 -0
  21. package/dist/src/cli/windows-companion-store-entry.js +67 -0
  22. package/dist/src/computer-access/command-output-capture.d.ts +37 -0
  23. package/dist/src/computer-access/command-output-capture.js +136 -0
  24. package/dist/src/computer-access/command-output-retention.d.ts +5 -0
  25. package/dist/src/computer-access/command-output-retention.js +90 -0
  26. package/dist/src/computer-access/command-output.d.ts +7 -0
  27. package/dist/src/computer-access/command-output.js +1 -0
  28. package/dist/src/computer-access/commands.d.ts +1 -0
  29. package/dist/src/computer-access/commands.js +1 -1
  30. package/dist/src/computer-access/companion/command-output-protocol.d.ts +12 -0
  31. package/dist/src/computer-access/companion/command-output-protocol.js +28 -0
  32. package/dist/src/computer-access/companion/command-output.d.ts +13 -0
  33. package/dist/src/computer-access/companion/command-output.js +110 -0
  34. package/dist/src/computer-access/companion/install-link-macos.d.ts +7 -0
  35. package/dist/src/computer-access/companion/install-link-macos.js +48 -0
  36. package/dist/src/computer-access/companion/install-link-registration.d.ts +4 -0
  37. package/dist/src/computer-access/companion/install-link-registration.js +184 -0
  38. package/dist/src/computer-access/companion/install-link-windows.d.ts +4 -0
  39. package/dist/src/computer-access/companion/install-link-windows.js +65 -0
  40. package/dist/src/computer-access/companion/install-link.d.ts +9 -0
  41. package/dist/src/computer-access/companion/install-link.js +54 -0
  42. package/dist/src/computer-access/companion/native-messages.js +3 -0
  43. package/dist/src/computer-access/companion/native-session.d.ts +1 -0
  44. package/dist/src/computer-access/companion/native-session.js +14 -2
  45. package/dist/src/computer-access/companion/native-supervisor.js +1 -0
  46. package/dist/src/computer-access/companion/notification-windows.d.ts +1 -1
  47. package/dist/src/computer-access/companion/notification-windows.js +8 -3
  48. package/dist/src/computer-access/companion/protocol.d.ts +1 -1
  49. package/dist/src/computer-access/companion/protocol.js +6 -0
  50. package/dist/src/computer-access/companion/release-version.d.ts +1 -1
  51. package/dist/src/computer-access/companion/release-version.js +1 -1
  52. package/dist/src/computer-access/companion/windows-store/connection-error.d.ts +7 -0
  53. package/dist/src/computer-access/companion/windows-store/connection-error.js +19 -0
  54. package/dist/src/computer-access/companion/windows-store/connection-link.d.ts +13 -0
  55. package/dist/src/computer-access/companion/windows-store/connection-link.js +109 -0
  56. package/dist/src/computer-access/companion/windows-store/identity.d.ts +13 -0
  57. package/dist/src/computer-access/companion/windows-store/identity.js +13 -0
  58. package/dist/src/computer-access/companion/windows-store/lifecycle.d.ts +5 -0
  59. package/dist/src/computer-access/companion/windows-store/lifecycle.js +90 -0
  60. package/dist/src/computer-access/contracts.d.ts +1 -1
  61. package/dist/src/computer-access/handlers.d.ts +2 -1
  62. package/dist/src/computer-access/handlers.js +5 -1
  63. package/dist/src/computer-access/process-capture.d.ts +6 -0
  64. package/dist/src/computer-access/process-capture.js +1 -0
  65. package/dist/src/computer-access/process-result.d.ts +2 -0
  66. package/dist/src/computer-access/process-result.js +14 -6
  67. package/dist/src/computer-access/process-runner.d.ts +2 -1
  68. package/dist/src/computer-access/process-runner.js +21 -13
  69. package/dist/src/model-gateway/server/configuration.d.ts +2 -0
  70. package/dist/src/model-gateway/server/configuration.js +73 -21
  71. package/dist/src/plugin-contract/install-source.d.ts +13 -0
  72. package/dist/src/plugin-contract/install-source.js +99 -0
  73. package/dist/src/plugin-contract/manifest.d.ts +2 -1
  74. package/dist/src/plugin-sdk/computer-access.d.ts +8 -0
  75. package/dist/src/plugin-sdk/computer-access.js +5 -0
  76. package/dist/src/runtime/adapters/in-memory-session-store.js +6 -16
  77. package/dist/src/runtime/admin/config-control.js +2 -1
  78. package/dist/src/runtime/automations/catalog.d.ts +3 -0
  79. package/dist/src/runtime/automations/catalog.js +1 -0
  80. package/dist/src/runtime/automations/model-dependency-projection.d.ts +2 -0
  81. package/dist/src/runtime/automations/service.d.ts +2 -0
  82. package/dist/src/runtime/capabilities/automation-builder/authoring-reference.d.ts +10 -5
  83. package/dist/src/runtime/capabilities/automation-builder/authoring-reference.js +8 -7
  84. package/dist/src/runtime/capabilities/automation-builder/payload-instructions.d.ts +2 -2
  85. package/dist/src/runtime/capabilities/automation-builder/payload-instructions.js +2 -2
  86. package/dist/src/runtime/capabilities/automation-builder/tool-contract.d.ts +2 -2
  87. package/dist/src/runtime/capabilities/automations/authoring-catalog.js +1 -1
  88. package/dist/src/runtime/capabilities/automations/authoring-preparation.d.ts +11 -5
  89. package/dist/src/runtime/capabilities/automations/tool-module.js +1 -1
  90. package/dist/src/runtime/capabilities/request-permission-catalog.d.ts +3 -1
  91. package/dist/src/runtime/capabilities/request-permission-catalog.js +21 -2
  92. package/dist/src/runtime/capabilities/request-permission-tool-registry.d.ts +2 -1
  93. package/dist/src/runtime/capabilities/request-permission-tool-registry.js +18 -10
  94. package/dist/src/runtime/capabilities/request-runtime-tool-registry.d.ts +2 -0
  95. package/dist/src/runtime/capabilities/request-runtime-tool-registry.js +1 -1
  96. package/dist/src/runtime/capabilities/scheduling/create-operations.d.ts +6 -0
  97. package/dist/src/runtime/config/builders.js +6 -5
  98. package/dist/src/runtime/config/effective-model-config-validation.js +4 -35
  99. package/dist/src/runtime/config/fields.js +15 -0
  100. package/dist/src/runtime/config/model-context-capacity.d.ts +20 -0
  101. package/dist/src/runtime/config/model-context-capacity.js +55 -0
  102. package/dist/src/runtime/config/model-execution-policy.d.ts +5 -1
  103. package/dist/src/runtime/config/model-execution-policy.js +16 -0
  104. package/dist/src/runtime/config/model-plugin-config.d.ts +8 -0
  105. package/dist/src/runtime/config/model-plugin-config.js +40 -0
  106. package/dist/src/runtime/config/schema.js +5 -1
  107. package/dist/src/runtime/config/validation/model-profile-validation.js +2 -0
  108. package/dist/src/runtime/config/validation/runtime-config-validation-contract.d.ts +3 -1
  109. package/dist/src/runtime/config/validation/runtime-config-validation-contract.js +3 -1
  110. package/dist/src/runtime/config/validation/runtime-root-section-validation.js +11 -4
  111. package/dist/src/runtime/config/validation/web-ui-config-validation.js +3 -2
  112. package/dist/src/runtime/config/web-ui.d.ts +5 -0
  113. package/dist/src/runtime/config/web-ui.js +5 -0
  114. package/dist/src/runtime/config.js +2 -0
  115. package/dist/src/runtime/local-application.d.ts +2 -0
  116. package/dist/src/runtime/local-host/app-owner.js +50 -6
  117. package/dist/src/runtime/local-host/app-request-control.d.ts +3 -1
  118. package/dist/src/runtime/local-host/app-request-control.js +91 -11
  119. package/dist/src/runtime/local-host/client-requests.js +32 -5
  120. package/dist/src/runtime/local-host/client-services.d.ts +2 -0
  121. package/dist/src/runtime/local-host/local-request-diagnostics.d.ts +9 -0
  122. package/dist/src/runtime/local-host/local-request-diagnostics.js +47 -0
  123. package/dist/src/runtime/local-host/saved-approvals.js +23 -2
  124. package/dist/src/runtime/model/model-selection.js +4 -1
  125. package/dist/src/runtime/observability/request-control-diagnostics.d.ts +6 -0
  126. package/dist/src/runtime/observability/request-control-diagnostics.js +52 -0
  127. package/dist/src/runtime/plugins/configuration-context.d.ts +9 -0
  128. package/dist/src/runtime/plugins/configuration-context.js +42 -0
  129. package/dist/src/runtime/plugins/configuration-settings.d.ts +2 -0
  130. package/dist/src/runtime/plugins/configuration-settings.js +26 -0
  131. package/dist/src/runtime/plugins/configuration-store.d.ts +23 -0
  132. package/dist/src/runtime/plugins/configuration-store.js +100 -0
  133. package/dist/src/runtime/plugins/configuration-write.d.ts +5 -0
  134. package/dist/src/runtime/plugins/configuration-write.js +58 -0
  135. package/dist/src/runtime/plugins/installation/archive.d.ts +2 -0
  136. package/dist/src/runtime/plugins/installation/archive.js +107 -0
  137. package/dist/src/runtime/plugins/installation/github-download.d.ts +9 -0
  138. package/dist/src/runtime/plugins/installation/github-download.js +72 -0
  139. package/dist/src/runtime/plugins/installation/installed-package.d.ts +9 -0
  140. package/dist/src/runtime/plugins/installation/installed-package.js +66 -0
  141. package/dist/src/runtime/plugins/installation/package.d.ts +45 -0
  142. package/dist/src/runtime/plugins/installation/package.js +79 -0
  143. package/dist/src/runtime/plugins/installation/portable-path.d.ts +2 -0
  144. package/dist/src/runtime/plugins/installation/portable-path.js +10 -0
  145. package/dist/src/runtime/plugins/installation/publication.d.ts +10 -0
  146. package/dist/src/runtime/plugins/installation/publication.js +17 -0
  147. package/dist/src/runtime/plugins/installation/service.d.ts +41 -0
  148. package/dist/src/runtime/plugins/installation/service.js +80 -0
  149. package/dist/src/runtime/plugins/loader.js +15 -29
  150. package/dist/src/runtime/plugins/manifest-projection.js +1 -0
  151. package/dist/src/runtime/plugins/manifest-validator.js +3 -0
  152. package/dist/src/runtime/plugins/module-cache.d.ts +2 -0
  153. package/dist/src/runtime/plugins/module-cache.js +19 -0
  154. package/dist/src/runtime/plugins/selection.d.ts +2 -0
  155. package/dist/src/runtime/plugins/selection.js +16 -11
  156. package/dist/src/runtime/ports.d.ts +6 -4
  157. package/dist/src/runtime/request/dependencies.d.ts +2 -1
  158. package/dist/src/runtime/request/execution-payload-compacted-evidence.d.ts +1 -1
  159. package/dist/src/runtime/request/handler.js +8 -0
  160. package/dist/src/runtime/request/prepared-execution.js +6 -1
  161. package/dist/src/runtime/request/request-steering.d.ts +4 -0
  162. package/dist/src/runtime/request/request-steering.js +37 -12
  163. package/dist/src/runtime/request/worker-capability-composition.d.ts +2 -0
  164. package/dist/src/runtime/request/worker-capability-composition.js +4 -1
  165. package/dist/src/runtime/scheduler/journal-index-state.d.ts +1 -1
  166. package/dist/src/sessions/assistant-initiative-message.d.ts +3 -0
  167. package/dist/src/sessions/assistant-initiative-message.js +12 -0
  168. package/dist/src/sessions/assistant-initiative.d.ts +2 -2
  169. package/dist/src/sessions/assistant-initiative.js +1 -7
  170. package/dist/src/sessions/durable-session-commit.d.ts +2 -1
  171. package/dist/src/sessions/durable-session-commit.js +6 -1
  172. package/dist/src/sessions/metadata/projection.d.ts +15 -0
  173. package/dist/src/sessions/metadata/projection.js +55 -0
  174. package/dist/src/sessions/metadata/publication.d.ts +12 -0
  175. package/dist/src/sessions/metadata/publication.js +78 -0
  176. package/dist/src/sessions/metadata/source-receipt.d.ts +5 -0
  177. package/dist/src/sessions/metadata/source-receipt.js +42 -0
  178. package/dist/src/sessions/metadata/store.d.ts +7 -0
  179. package/dist/src/sessions/metadata/store.js +119 -0
  180. package/dist/src/sessions/record/projection.d.ts +3 -1
  181. package/dist/src/sessions/record/projection.js +26 -18
  182. package/dist/src/sessions/request-lifecycle/service.js +3 -3
  183. package/dist/src/sessions/session-service.d.ts +2 -4
  184. package/dist/src/sessions/session-service.js +4 -16
  185. package/dist/src/sessions/session-store.d.ts +2 -1
  186. package/dist/src/sessions/session-store.js +9 -3
  187. package/dist/src/sessions/snapshot.d.ts +17 -0
  188. package/dist/src/sessions/snapshot.js +105 -0
  189. package/dist/src/sessions/types.d.ts +2 -0
  190. package/dist/src/shared/tool-selection.d.ts +2 -0
  191. package/dist/src/shared/tool-selection.js +7 -0
  192. package/dist/src/web-ui/app/ARCHITECTURE.md +14 -0
  193. package/dist/src/web-ui/app/app.js +6 -3
  194. package/dist/src/web-ui/app/components/config-workspace/config-model.js +2 -0
  195. package/dist/src/web-ui/app/components/config-workspace/model-plugin-permissions.js +130 -0
  196. package/dist/src/web-ui/app/components/config-workspace/model-plugin-selection.js +180 -0
  197. package/dist/src/web-ui/app/components/config-workspace/model-plugin-view-state.js +114 -0
  198. package/dist/src/web-ui/app/components/config-workspace/model-rendering.js +3 -0
  199. package/dist/src/web-ui/app/components/config-workspace/model-summary.js +39 -0
  200. package/dist/src/web-ui/app/components/config-workspace/summary-rendering.js +30 -0
  201. package/dist/src/web-ui/app/components/config-workspace/workspace-events.js +37 -0
  202. package/dist/src/web-ui/app/components/config-workspace/workspace-mutations.js +2 -0
  203. package/dist/src/web-ui/app/components/config-workspace/workspace-persistence.js +9 -1
  204. package/dist/src/web-ui/app/components/config-workspace/workspace-view.js +23 -67
  205. package/dist/src/web-ui/app/components/config-workspace.js +11 -2
  206. package/dist/src/web-ui/app/components/conversation-view.js +36 -5
  207. package/dist/src/web-ui/app/components/dashboard/recent-conversations.js +2 -1
  208. package/dist/src/web-ui/app/components/dashboard/workspace.js +2 -1
  209. package/dist/src/web-ui/app/components/operations-summary.js +105 -0
  210. package/dist/src/web-ui/app/components/passive-learning/home.js +1 -9
  211. package/dist/src/web-ui/app/components/plugins/configuration-draft.js +34 -0
  212. package/dist/src/web-ui/app/components/plugins/configuration-editor.js +147 -0
  213. package/dist/src/web-ui/app/components/plugins/configuration-fields.js +103 -0
  214. package/dist/src/web-ui/app/components/plugins/configuration-retained-secrets.js +20 -0
  215. package/dist/src/web-ui/app/components/plugins/configuration-settings.js +108 -0
  216. package/dist/src/web-ui/app/components/plugins/discovery-rendering.js +37 -0
  217. package/dist/src/web-ui/app/components/plugins/installation.js +212 -0
  218. package/dist/src/web-ui/app/components/plugins/manager.js +160 -6
  219. package/dist/src/web-ui/app/components/plugins/removal.js +130 -0
  220. package/dist/src/web-ui/app/components/plugins/rendering.js +14 -2
  221. package/dist/src/web-ui/app/components/plugins/summary.js +54 -0
  222. package/dist/src/web-ui/app/components/plugins/tabs.js +31 -0
  223. package/dist/src/web-ui/app/components/plugins/view-state.js +3 -1
  224. package/dist/src/web-ui/app/components/runtime-setup/connection-form.js +5 -2
  225. package/dist/src/web-ui/app/components/runtime-setup/connection-state.js +9 -1
  226. package/dist/src/web-ui/app/components/runtime-setup/context-window-feedback.js +71 -0
  227. package/dist/src/web-ui/app/components/runtime-setup/optional-steps.js +2 -0
  228. package/dist/src/web-ui/app/components/runtime-setup-guide.js +15 -3
  229. package/dist/src/web-ui/app/components/spark-chat/empty-state.js +1 -0
  230. package/dist/src/web-ui/app/components/spark-chat/panel.js +1 -0
  231. package/dist/src/web-ui/app/components/system-host/connection-card.js +35 -0
  232. package/dist/src/web-ui/app/components/system-host/macos-setup.js +1 -1
  233. package/dist/src/web-ui/app/components/system-host/manager.js +45 -12
  234. package/dist/src/web-ui/app/components/system-host/rendering.js +111 -106
  235. package/dist/src/web-ui/app/components/system-host/windows-store-setup.js +293 -0
  236. package/dist/src/web-ui/app/components/workspace-shell.js +6 -0
  237. package/dist/src/web-ui/app/computer-access-feature.js +22 -5
  238. package/dist/src/web-ui/app/configuration-feature.js +35 -2
  239. package/dist/src/web-ui/app/controllers/app-event-bindings.js +4 -1
  240. package/dist/src/web-ui/app/controllers/conversation-read-state-controller.d.ts +1 -0
  241. package/dist/src/web-ui/app/controllers/conversation-read-state-controller.js +7 -3
  242. package/dist/src/web-ui/app/controllers/conversation-request-hydration.js +88 -0
  243. package/dist/src/web-ui/app/controllers/conversation-session-controller.d.ts +9 -3
  244. package/dist/src/web-ui/app/controllers/conversation-session-controller.js +52 -144
  245. package/dist/src/web-ui/app/controllers/history-pagination.js +111 -0
  246. package/dist/src/web-ui/app/controllers/operations-controller.d.ts +12 -0
  247. package/dist/src/web-ui/app/controllers/operations-controller.js +28 -21
  248. package/dist/src/web-ui/app/controllers/runtime-onboarding-controller.d.ts +1 -0
  249. package/dist/src/web-ui/app/controllers/runtime-onboarding-controller.js +11 -0
  250. package/dist/src/web-ui/app/controllers/session-controller.js +10 -2
  251. package/dist/src/web-ui/app/controllers/session-list-pagination.js +71 -0
  252. package/dist/src/web-ui/app/controllers/session-sidebar-controller.js +6 -4
  253. package/dist/src/web-ui/app/controllers/spark-chat-reading.js +1 -0
  254. package/dist/src/web-ui/app/controllers/spark-chat-sync.js +24 -5
  255. package/dist/src/web-ui/app/controllers/workspace-route-controller.js +21 -19
  256. package/dist/src/web-ui/app/dashboard-feature.js +2 -2
  257. package/dist/src/web-ui/app/index.html +6 -2
  258. package/dist/src/web-ui/app/lib/history-page-messages.js +49 -0
  259. package/dist/src/web-ui/app/lib/request-lifecycle-view.js +8 -0
  260. package/dist/src/web-ui/app/lib/workspace-route.d.ts +3 -0
  261. package/dist/src/web-ui/app/lib/workspace-route.js +4 -0
  262. package/dist/src/web-ui/app/passive-learning-feature.js +0 -1
  263. package/dist/src/web-ui/app/runtime-onboarding-feature.js +3 -0
  264. package/dist/src/web-ui/app/schedules-feature.js +1 -1
  265. package/dist/src/web-ui/app/services/runtime-web-client/configuration.js +20 -0
  266. package/dist/src/web-ui/app/services/runtime-web-client/plugin-configuration.js +19 -0
  267. package/dist/src/web-ui/app/services/runtime-web-client/spark-chat.js +4 -4
  268. package/dist/src/web-ui/app/services/runtime-web-client/system-host.js +2 -0
  269. package/dist/src/web-ui/app/services/runtime-web-client.d.ts +6 -1
  270. package/dist/src/web-ui/app/services/runtime-web-client.js +12 -3
  271. package/dist/src/web-ui/app/spark-chat-feature.js +76 -19
  272. package/dist/src/web-ui/app/styles/11-product-links.css +30 -0
  273. package/dist/src/web-ui/app/styles/41-plugin-configuration.css +79 -0
  274. package/dist/src/web-ui/app/styles/41-plugin-discovery.css +132 -0
  275. package/dist/src/web-ui/app/styles/41-plugin-management.css +6 -0
  276. package/dist/src/web-ui/app/styles/42-model-plugin-permissions.css +173 -0
  277. package/dist/src/web-ui/app/styles/46-system-host.css +61 -107
  278. package/dist/src/web-ui/app/styles/47-config-controls.css +13 -1
  279. package/dist/src/web-ui/app/styles/54-spark-chat.css +33 -1
  280. package/dist/src/web-ui/app/styles.css +4 -0
  281. package/dist/src/web-ui/local-runtime/api-router.js +11 -6
  282. package/dist/src/web-ui/local-runtime/approval-request-attachment.js +14 -5
  283. package/dist/src/web-ui/local-runtime/configuration-activation-source.d.ts +1 -1
  284. package/dist/src/web-ui/local-runtime/configuration-activation-source.js +9 -3
  285. package/dist/src/web-ui/local-runtime/contracts.d.ts +4 -3
  286. package/dist/src/web-ui/local-runtime/environment-registry.d.ts +5 -1
  287. package/dist/src/web-ui/local-runtime/environment-registry.js +53 -11
  288. package/dist/src/web-ui/local-runtime/history-pagination.d.ts +16 -0
  289. package/dist/src/web-ui/local-runtime/history-pagination.js +20 -0
  290. package/dist/src/web-ui/local-runtime/plugin-configuration-routes.d.ts +16 -0
  291. package/dist/src/web-ui/local-runtime/plugin-configuration-routes.js +68 -0
  292. package/dist/src/web-ui/local-runtime/plugin-installation-routes.d.ts +16 -0
  293. package/dist/src/web-ui/local-runtime/plugin-installation-routes.js +96 -0
  294. package/dist/src/web-ui/local-runtime/plugin-management-routes.d.ts +8 -1
  295. package/dist/src/web-ui/local-runtime/plugin-management-routes.js +17 -0
  296. package/dist/src/web-ui/local-runtime/plugin-mutation-admission.d.ts +7 -0
  297. package/dist/src/web-ui/local-runtime/plugin-mutation-admission.js +17 -0
  298. package/dist/src/web-ui/local-runtime/plugin-removal-routes.d.ts +18 -0
  299. package/dist/src/web-ui/local-runtime/plugin-removal-routes.js +60 -0
  300. package/dist/src/web-ui/local-runtime/realtime-controller.js +41 -2
  301. package/dist/src/web-ui/local-runtime/request-cancellation-route.js +28 -1
  302. package/dist/src/web-ui/local-runtime/request-control-observation.d.ts +19 -0
  303. package/dist/src/web-ui/local-runtime/request-control-observation.js +80 -0
  304. package/dist/src/web-ui/local-runtime/request-execution.js +69 -37
  305. package/dist/src/web-ui/local-runtime/runtime-setup-context-window.d.ts +20 -0
  306. package/dist/src/web-ui/local-runtime/runtime-setup-context-window.js +44 -0
  307. package/dist/src/web-ui/local-runtime/runtime-setup-routes.js +2 -0
  308. package/dist/src/web-ui/local-runtime/runtime-setup-validation.js +9 -2
  309. package/dist/src/web-ui/local-runtime/session-routes.d.ts +1 -0
  310. package/dist/src/web-ui/local-runtime/session-routes.js +16 -4
  311. package/dist/src/web-ui/local-runtime/spark-chat-routes.js +4 -3
  312. package/dist/src/web-ui/plugin-capability-selection.js +4 -1
  313. package/dist/src/web-ui/plugin-configuration-input.d.ts +12 -0
  314. package/dist/src/web-ui/plugin-configuration-input.js +68 -0
  315. package/dist/src/web-ui/plugin-configuration-retained-secrets.d.ts +9 -0
  316. package/dist/src/web-ui/plugin-configuration-retained-secrets.js +48 -0
  317. package/dist/src/web-ui/plugin-configuration-service.d.ts +52 -0
  318. package/dist/src/web-ui/plugin-configuration-service.js +66 -0
  319. package/dist/src/web-ui/plugin-configuration-view.d.ts +25 -0
  320. package/dist/src/web-ui/plugin-configuration-view.js +45 -0
  321. package/dist/src/web-ui/plugin-disabled-selection.d.ts +7 -0
  322. package/dist/src/web-ui/plugin-disabled-selection.js +17 -0
  323. package/dist/src/web-ui/plugin-management-catalog.d.ts +3 -1
  324. package/dist/src/web-ui/plugin-management-catalog.js +11 -1
  325. package/dist/src/web-ui/plugin-management-selection.js +22 -9
  326. package/dist/src/web-ui/plugin-management-service.d.ts +5 -1
  327. package/dist/src/web-ui/plugin-management-service.js +11 -7
  328. package/dist/src/web-ui/plugin-removal-error.d.ts +7 -0
  329. package/dist/src/web-ui/plugin-removal-error.js +16 -0
  330. package/dist/src/web-ui/plugin-removal-service.d.ts +30 -0
  331. package/dist/src/web-ui/plugin-removal-service.js +109 -0
  332. package/dist/src/web-ui/runtime-setup-gateway.d.ts +6 -2
  333. package/dist/src/web-ui/runtime-setup-gateway.js +30 -10
  334. package/dist/src/web-ui/server.js +6 -2
  335. package/dist/src/web-ui/session-read-state/overview.d.ts +42 -0
  336. package/dist/src/web-ui/session-read-state/overview.js +16 -0
  337. package/dist/src/web-ui/session-read-state/pagination.d.ts +15 -0
  338. package/dist/src/web-ui/session-read-state/pagination.js +42 -0
  339. package/dist/src/web-ui/session-read-state/projection.d.ts +4 -3
  340. package/dist/src/web-ui/session-read-state/service.d.ts +213 -20
  341. package/dist/src/web-ui/session-read-state/service.js +25 -23
  342. package/dist/src/web-ui/session-read-state/visible-messages.d.ts +3 -3
  343. package/dist/src/web-ui/system-host-setup/companion-linux.js +1 -1
  344. package/dist/src/web-ui/system-host-setup/installer-contract.d.ts +1 -1
  345. package/dist/src/web-ui/system-host-setup/installer-contract.js +2 -2
  346. package/dist/src/web-ui/system-host-setup/installers.js +0 -7
  347. package/dist/src/web-ui/system-host-setup/local-connection.d.ts +4 -1
  348. package/dist/src/web-ui/system-host-setup/local-connection.js +10 -17
  349. package/dist/src/web-ui/system-host-setup/routes.d.ts +2 -0
  350. package/dist/src/web-ui/system-host-setup/routes.js +32 -9
  351. package/dist/src/web-ui/system-host-setup/setup-mutation.d.ts +9 -0
  352. package/dist/src/web-ui/system-host-setup/setup-mutation.js +27 -0
  353. package/dist/src/web-ui/system-host-setup/windows-store-route.d.ts +13 -0
  354. package/dist/src/web-ui/system-host-setup/windows-store-route.js +68 -0
  355. package/docs/configuration.md +46 -0
  356. package/docs/installation.md +45 -24
  357. package/docs/plugins.md +165 -2
  358. package/docs/projects-and-full-plus.md +2 -6
  359. package/docs/runtime-library.md +0 -1
  360. package/docs/windows-companion-store.md +127 -0
  361. package/package.json +3 -3
  362. package/plugins/document-reader/plugin.json +1 -0
  363. package/plugins/exec/plugin.json +3 -0
  364. package/plugins/filesystem/plugin.json +2 -0
  365. package/plugins/local-search/plugin.json +1 -0
  366. package/plugins/system/README.md +43 -3
  367. package/plugins/system/plugin.json +5 -0
  368. package/plugins/system/source/companion-command-output.ts +82 -0
  369. package/plugins/system/source/host-dispatch.ts +4 -0
  370. package/plugins/system/source/index.ts +11 -5
  371. package/plugins/system/source/local-command-output.ts +61 -0
  372. package/plugins/system/source/request-system-modules.ts +2 -0
  373. package/plugins/system/src/index.cjs +474 -39
  374. package/plugins/web/README.md +2 -2
  375. package/plugins/web/plugin.json +4 -0
  376. package/runtime.config.schema.json +25 -1
  377. package/src/runtime/README.md +12 -2
  378. package/dist/src/web-ui/system-host-setup/companion-windows.d.ts +0 -2
  379. package/dist/src/web-ui/system-host-setup/companion-windows.js +0 -108
  380. package/docs/publishing.md +0 -167
@@ -2,23 +2,21 @@ import { installLocalMacCompanion, LocalCompanionSetupError } from "../../comput
2
2
  import { acceptConfigMutationRequest } from "../local-runtime/config-mutation-request.js";
3
3
  import { readBody, sendJson } from "../local-runtime/http.js";
4
4
  import { canSetUpLocalMac, localMacSetupRuntimeUrl } from "./local-setup-availability.js";
5
+ import { HostSetupMutation } from "./setup-mutation.js";
5
6
  export const LOCAL_HOST_SETUP_PATH = "/web-api/runtime/system-host/connect-local";
6
7
  function isEmptyLocalSetupRequest(body) {
7
8
  return JSON.stringify(body) === "{}";
8
9
  }
9
10
  export class LocalHostConnection {
10
11
  dependencies;
11
- pending;
12
+ mutation;
12
13
  constructor(dependencies) {
13
14
  this.dependencies = dependencies;
15
+ this.mutation = dependencies.mutation ?? new HostSetupMutation();
14
16
  }
15
- get busy() { return this.pending !== undefined; }
17
+ get busy() { return this.mutation.busy; }
16
18
  rejectConcurrentMutation(response) {
17
- if (!this.busy)
18
- return false;
19
- sendJson(response, 409, { ok: false, error: "host_setup_in_progress",
20
- message: "Computer access is being connected. Wait for setup to finish." });
21
- return true;
19
+ return this.mutation.rejectConcurrentMutation(response);
22
20
  }
23
21
  async handle(request, response) {
24
22
  if (request.method !== "POST") {
@@ -37,18 +35,17 @@ export class LocalHostConnection {
37
35
  sendJson(response, 400, { ok: false, error: "unexpected_host_configuration_fields" });
38
36
  return;
39
37
  }
38
+ await this.mutation.run(response, () => this.completeConnection(request, response));
39
+ }
40
+ async completeConnection(request, response) {
40
41
  const readiness = await this.dependencies.readiness();
41
42
  if (!canSetUpLocalMac(request, readiness)) {
42
43
  sendJson(response, 409, { ok: false, error: "host_local_setup_unavailable",
43
44
  message: "Direct setup requires ABot running natively on this Mac through its local address. Use a pairing code on the Mac for Docker or a forwarded Runtime." });
44
45
  return;
45
46
  }
46
- if (this.rejectConcurrentMutation(response))
47
- return;
48
- const pending = this.connect(localMacSetupRuntimeUrl(request));
49
- this.pending = pending;
50
47
  try {
51
- await pending;
48
+ await this.connect(localMacSetupRuntimeUrl(request));
52
49
  sendJson(response, 200, { ok: true });
53
50
  }
54
51
  catch (error) {
@@ -56,10 +53,6 @@ export class LocalHostConnection {
56
53
  throw error;
57
54
  sendJson(response, 503, { ok: false, error: error.code, message: error.message });
58
55
  }
59
- finally {
60
- if (this.pending === pending)
61
- this.pending = undefined;
62
- }
63
56
  }
64
57
  async connect(url) {
65
58
  const bundle = await this.dependencies.bundle();
@@ -73,5 +66,5 @@ export class LocalHostConnection {
73
66
  ...(host ? { upgradeHostId: host.hostId } : {}),
74
67
  });
75
68
  }
76
- async close() { await this.pending?.catch(() => undefined); }
69
+ async close() { await this.mutation.close(); }
77
70
  }
@@ -12,12 +12,14 @@ export type HostSetupRouteDependencies = {
12
12
  /** GUI writes use same-origin JSON; native code downloads use the expiring setup grant. */
13
13
  export declare class HostSetupRoutes {
14
14
  private readonly dependencies;
15
+ private readonly mutation;
15
16
  private readonly local;
16
17
  constructor(dependencies: HostSetupRouteDependencies);
17
18
  rejectConcurrentMutation(response: ServerResponse): boolean;
18
19
  close(): Promise<void>;
19
20
  private bundle;
20
21
  handle(request: IncomingMessage, response: ServerResponse, pathname: string): Promise<void>;
22
+ private issueSetupInstaller;
21
23
  private downloadBundle;
22
24
  private hasCurrentSetupGrant;
23
25
  }
@@ -5,12 +5,15 @@ import { readBody, sendJson } from "../local-runtime/http.js";
5
5
  import { hostBearerCredential } from "./native-authorization.js";
6
6
  import { renderCompanionInstaller, } from "./installers.js";
7
7
  import { InstallerInputError } from "./installer-contract.js";
8
+ import { WINDOWS_COMPANION_STORE_URL } from "../../computer-access/companion/windows-store/identity.js";
8
9
  import { readInstallerCompanionBundle } from "./companion-bundle.js";
9
10
  import { LocalHostConnection, LOCAL_HOST_SETUP_PATH } from "./local-connection.js";
11
+ import { handleWindowsStoreConnection, WINDOWS_STORE_CONNECTION_PATH } from "./windows-store-route.js";
12
+ import { HostSetupMutation } from "./setup-mutation.js";
10
13
  const setupPath = "/web-api/runtime/system-host/setup";
11
14
  const bundlePath = "/web-api/runtime/system-host/bundle";
12
15
  export function isHostSetupRoute(pathname) {
13
- return [setupPath, bundlePath, LOCAL_HOST_SETUP_PATH].includes(pathname);
16
+ return [setupPath, bundlePath, LOCAL_HOST_SETUP_PATH, WINDOWS_STORE_CONNECTION_PATH].includes(pathname);
14
17
  }
15
18
  export function sendHostSetupInputError(response, error) {
16
19
  if (!(error instanceof InstallerInputError))
@@ -37,6 +40,9 @@ function isSetupPlatformRequest(value) {
37
40
  return true;
38
41
  return platform === "windows" || platform === "macos";
39
42
  }
43
+ function canDownloadCompanionInstaller(platform) {
44
+ return platform === "macos" || platform === "linux";
45
+ }
40
46
  function requestRuntimeOrigin(request) {
41
47
  const encrypted = "encrypted" in request.socket && request.socket.encrypted;
42
48
  return new URL(`${encrypted ? "https" : "http"}://${request.headers.host}`)
@@ -45,21 +51,29 @@ function requestRuntimeOrigin(request) {
45
51
  /** GUI writes use same-origin JSON; native code downloads use the expiring setup grant. */
46
52
  export class HostSetupRoutes {
47
53
  dependencies;
54
+ mutation = new HostSetupMutation();
48
55
  local;
49
56
  constructor(dependencies) {
50
57
  this.dependencies = dependencies;
51
- this.local = new LocalHostConnection({ ...dependencies, bundle: () => this.bundle() });
58
+ this.local = new LocalHostConnection({ ...dependencies, mutation: this.mutation, bundle: () => this.bundle() });
52
59
  }
53
60
  rejectConcurrentMutation(response) {
54
- return this.local.rejectConcurrentMutation(response);
61
+ return this.mutation.rejectConcurrentMutation(response);
55
62
  }
56
- async close() { await this.local.close(); }
63
+ async close() { await this.mutation.close(); }
57
64
  async bundle() {
58
65
  if (this.dependencies.bundleFile)
59
66
  return readFile(this.dependencies.bundleFile);
60
67
  return readInstallerCompanionBundle();
61
68
  }
62
69
  async handle(request, response, pathname) {
70
+ if (pathname === WINDOWS_STORE_CONNECTION_PATH) {
71
+ await handleWindowsStoreConnection(request, response, {
72
+ ...this.dependencies,
73
+ mutation: this.mutation,
74
+ });
75
+ return;
76
+ }
63
77
  if (pathname === LOCAL_HOST_SETUP_PATH) {
64
78
  await this.local.handle(request, response);
65
79
  return;
@@ -89,10 +103,21 @@ export class HostSetupRoutes {
89
103
  });
90
104
  return;
91
105
  }
92
- if (this.rejectConcurrentMutation(response))
106
+ const platform = input.platform;
107
+ if (!canDownloadCompanionInstaller(platform)) {
108
+ sendJson(response, 410, {
109
+ ok: false,
110
+ error: "windows_store_required",
111
+ message: "Install or update ABot AI Companion through Microsoft Store.",
112
+ storeUrl: WINDOWS_COMPANION_STORE_URL,
113
+ });
93
114
  return;
115
+ }
116
+ await this.mutation.run(response, () => this.issueSetupInstaller(request, response, platform));
117
+ }
118
+ async issueSetupInstaller(request, response, platform) {
94
119
  const readiness = await this.dependencies.readiness();
95
- if (!readiness.platforms.includes(input.platform)) {
120
+ if (!readiness.platforms.includes(platform)) {
96
121
  sendJson(response, 409, {
97
122
  ok: false,
98
123
  error: "host_setup_not_required",
@@ -103,14 +128,12 @@ export class HostSetupRoutes {
103
128
  // Read and hash the exact running build before creating a setup grant.
104
129
  const bundle = await this.bundle();
105
130
  await this.dependencies.prepareCompanion();
106
- if (this.rejectConcurrentMutation(response))
107
- return;
108
131
  const upgrading = Boolean(this.dependencies.store.host());
109
132
  const pairing = upgrading
110
133
  ? this.dependencies.store.beginBundleUpgrade()
111
134
  : this.dependencies.store.begin(15 * 60_000);
112
135
  const installer = await renderCompanionInstaller({
113
- platform: input.platform,
136
+ platform,
114
137
  url: requestRuntimeOrigin(request),
115
138
  code: pairing.code,
116
139
  expiresAt: pairing.expiresAt,
@@ -0,0 +1,9 @@
1
+ import type { ServerResponse } from "node:http";
2
+ /** One installation owns one in-flight computer setup across connection routes. */
3
+ export declare class HostSetupMutation {
4
+ private pending?;
5
+ get busy(): boolean;
6
+ rejectConcurrentMutation(response: ServerResponse): boolean;
7
+ run(response: ServerResponse, operation: () => Promise<void>): Promise<void>;
8
+ close(): Promise<void>;
9
+ }
@@ -0,0 +1,27 @@
1
+ import { sendJson } from "../local-runtime/http.js";
2
+ /** One installation owns one in-flight computer setup across connection routes. */
3
+ export class HostSetupMutation {
4
+ pending;
5
+ get busy() { return this.pending !== undefined; }
6
+ rejectConcurrentMutation(response) {
7
+ if (!this.busy)
8
+ return false;
9
+ sendJson(response, 409, { ok: false, error: "host_setup_in_progress",
10
+ message: "Computer access is being connected. Wait for setup to finish." });
11
+ return true;
12
+ }
13
+ async run(response, operation) {
14
+ if (this.rejectConcurrentMutation(response))
15
+ return;
16
+ const pending = Promise.resolve().then(operation);
17
+ this.pending = pending;
18
+ try {
19
+ await pending;
20
+ }
21
+ finally {
22
+ if (this.pending === pending)
23
+ this.pending = undefined;
24
+ }
25
+ }
26
+ async close() { await this.pending?.catch(() => undefined); }
27
+ }
@@ -0,0 +1,13 @@
1
+ import type { IncomingMessage, ServerResponse } from "node:http";
2
+ import type { HostPairingStore } from "../../computer-access/companion/pairing-store.js";
3
+ import type { HostReadiness } from "./readiness.js";
4
+ import type { HostSetupMutation } from "./setup-mutation.js";
5
+ export declare const WINDOWS_STORE_CONNECTION_PATH = "/web-api/runtime/system-host/store-connect";
6
+ type StoreConnectionDependencies = Readonly<{
7
+ store: HostPairingStore;
8
+ readiness(): Promise<HostReadiness>;
9
+ prepareCompanion(): Promise<void>;
10
+ mutation: HostSetupMutation;
11
+ }>;
12
+ export declare function handleWindowsStoreConnection(request: IncomingMessage, response: ServerResponse, dependencies: StoreConnectionDependencies): Promise<void>;
13
+ export {};
@@ -0,0 +1,68 @@
1
+ import { COMPANION_RELEASE_VERSION } from "../../computer-access/companion/release-version.js";
2
+ import { createStoreConnectionLink, normalizeStoreConnectionOrigin } from "../../computer-access/companion/windows-store/connection-link.js";
3
+ import { WINDOWS_COMPANION_STORE_URL } from "../../computer-access/companion/windows-store/identity.js";
4
+ import { acceptConfigMutationRequest } from "../local-runtime/config-mutation-request.js";
5
+ import { readBody, sendJson } from "../local-runtime/http.js";
6
+ export const WINDOWS_STORE_CONNECTION_PATH = "/web-api/runtime/system-host/store-connect";
7
+ function canStartWindowsStoreConnection(readiness) {
8
+ if (!readiness.platforms.includes("windows"))
9
+ return false;
10
+ if (readiness.restartRequired)
11
+ return false;
12
+ if (readiness.route === "wsl_interop")
13
+ return false;
14
+ return readiness.route !== "native";
15
+ }
16
+ function hasEmptyConnectionBody(value) {
17
+ if (value === null || typeof value !== "object" || Array.isArray(value))
18
+ return false;
19
+ return Object.keys(value).length === 0;
20
+ }
21
+ export async function handleWindowsStoreConnection(request, response, dependencies) {
22
+ response.setHeader("Cache-Control", "no-store");
23
+ if (request.method !== "POST") {
24
+ sendJson(response, 405, { ok: false, error: "method_not_allowed" });
25
+ return;
26
+ }
27
+ if (!acceptConfigMutationRequest(request, response))
28
+ return;
29
+ let body;
30
+ try {
31
+ body = JSON.parse((await readBody(request, { maxBytes: 1_024 })).toString());
32
+ }
33
+ catch { /* rejected below */ }
34
+ if (!hasEmptyConnectionBody(body)) {
35
+ sendJson(response, 400, { ok: false, error: "invalid_store_connection_request" });
36
+ return;
37
+ }
38
+ await dependencies.mutation.run(response, () => issueWindowsStoreConnection(request, response, dependencies));
39
+ }
40
+ async function issueWindowsStoreConnection(request, response, dependencies) {
41
+ if (!canStartWindowsStoreConnection(await dependencies.readiness())) {
42
+ sendJson(response, 409, { ok: false, error: "host_setup_not_required", message: "Refresh the computer connection status." });
43
+ return;
44
+ }
45
+ const encrypted = "encrypted" in request.socket && request.socket.encrypted;
46
+ let origin;
47
+ try {
48
+ origin = normalizeStoreConnectionOrigin(`${encrypted ? "https" : "http"}://${request.headers.host}`);
49
+ }
50
+ catch {
51
+ sendJson(response, 400, { ok: false, error: "host_store_connection_rejected", message: "Store connection requires a local HTTP Runtime origin on this computer." });
52
+ return;
53
+ }
54
+ await dependencies.prepareCompanion();
55
+ const previous = dependencies.store.host();
56
+ const pairing = previous ? dependencies.store.beginBundleUpgrade() : dependencies.store.begin(15 * 60_000);
57
+ try {
58
+ const launchUrl = createStoreConnectionLink({
59
+ version: 1, url: origin, code: pairing.code, expiresAt: pairing.expiresAt,
60
+ companionRelease: COMPANION_RELEASE_VERSION,
61
+ ...(previous ? { upgradeHostId: previous.hostId } : {}),
62
+ });
63
+ sendJson(response, 200, { ok: true, launchUrl, expiresAt: pairing.expiresAt, storeUrl: WINDOWS_COMPANION_STORE_URL });
64
+ }
65
+ catch {
66
+ sendJson(response, 400, { ok: false, error: "host_store_connection_rejected", message: "Store connection requires a local HTTP Runtime origin on this computer." });
67
+ }
68
+ }
@@ -17,6 +17,21 @@ local paths, and profile choices there. The provider, concrete model id, and
17
17
  default profile are required configuration; the runtime does not supply a
18
18
  built-in model choice.
19
19
 
20
+ ## Web UI history pages
21
+
22
+ `webUi.pageSize` controls the number of sessions or messages loaded per page in
23
+ ordinary conversations and SPARK. It defaults to `20` and accepts a positive integer:
24
+
25
+ ```json
26
+ { "webUi": { "pageSize": 20 } }
27
+ ```
28
+
29
+ The Web UI loads more sessions while scrolling down and older messages while
30
+ scrolling up. Message activity travels with the corresponding message page.
31
+ Read state and active requests remain independent of the displayed page.
32
+ Pagination does not truncate model history or change the session file format;
33
+ opening a conversation still reads its canonical JSON file before projecting a page.
34
+
20
35
  ## Secrets
21
36
 
22
37
  Do not put secret values in JSON config. Store them in `.env`, service
@@ -427,6 +442,37 @@ secrets declarations, and skill bindings remain in each plugin package.
427
442
  Runtime orchestration does not hardcode concrete tool names or use the catalog
428
443
  to classify the user request.
429
444
 
445
+
446
+ A model profile can further restrict that catalog with `plugins.deny`, including
447
+ inside its linked `models/<profile>.config.json` file:
448
+
449
+ ```json
450
+ {
451
+ "plugins": {
452
+ "deny": ["filesystem.read_file", "memory"]
453
+ }
454
+ }
455
+ ```
456
+
457
+ These selectors use the same matching rules as the global deny list. They can
458
+ only remove globally available capabilities. Omission or an empty list adds no
459
+ model restriction. The effective primary profile selected for the request owns
460
+ the restriction for the entire request, including delegated roles, per-step
461
+ model overrides and approval resumes. Both Supervisor/Worker and Execution
462
+ Agent use the same filtered catalog and execution guard. This metadata stays in
463
+ the Runtime and is not sent to the model provider. Plugin loading and
464
+ `prepareRequest` hooks remain part of the existing shared plugin lifecycle.
465
+
466
+ In the Web UI **Models** workspace, expand **Plugin access** to allow or block
467
+ plugins for the selected model. Expand a plugin to control its individual tools.
468
+ The switches edit exact plugin IDs and qualified `plugin.tool` deny selectors;
469
+ turning a plugin off and on preserves its individual tool restrictions. Counts
470
+ show the tools available after global and model restrictions. Save the model
471
+ file, then apply configuration changes. Global restrictions still apply and
472
+ cannot be lifted here. Shared bare-tool rules, wildcards, missing-plugin IDs and
473
+ selectors that affect another plugin remain unchanged; review them under
474
+ **Saved rules** and edit them in the displayed model configuration file.
475
+
430
476
  For public or multi-model installs, keep each model's detailed calibration in a
431
477
  separate model profile file instead of expanding the main runtime config:
432
478
 
@@ -145,6 +145,42 @@ Computer access connection shared by SYSTEM tools, ABot Spark and compatible
145
145
  plugins. Direct native/WSL command access can already work; the shared companion
146
146
  adds desktop access and background collection without a second ABot Spark setup.
147
147
 
148
+ #### Windows: Microsoft Store connection
149
+
150
+ **ABot AI Companion** is available from
151
+ [Microsoft Store](https://apps.microsoft.com/detail/9PK2FDQQLQS9).
152
+ The product ID is `9PK2FDQQLQS9`.
153
+
154
+ Start with the computer connection card on **Home**, or the optional **Computer**
155
+ setup step:
156
+
157
+ 1. Choose **Install from Microsoft Store** to open **ABot AI Companion**.
158
+ 2. Install it once on the Windows computer you want to connect.
159
+ 3. Return to ABot and choose **I already have it**.
160
+ 4. Choose **Open Companion**. The browser may ask permission to open it.
161
+ 5. Check the Runtime address shown by Companion and approve the connection.
162
+ 6. Companion shows connection progress; this can take a few seconds. Wait for
163
+ **Your computer is ready** in the Web UI.
164
+
165
+ If Companion is already installed, start at step 3. The short-lived connection
166
+ link is a private invitation; do not share it. Request a new link if it expires.
167
+ The Web UI confirms the live connection rather than guessing whether the app is
168
+ installed.
169
+
170
+ If the computer is already paired but offline, choose **Open Companion**, then
171
+ start the saved connection in the app. If you disconnected inside Companion or
172
+ removed its saved connection, choose **Set up again** in ABot. Confirm the
173
+ reset, then open Companion and approve the new connection. Re-pairing revokes the
174
+ previous computer connection; it does not erase saved insights.
175
+
176
+ Store updates are intended to preserve the saved pairing. Computer actions and
177
+ optional Spark collection retain their existing, separate permission controls.
178
+ Computer content used by ABot may reach your selected model provider. Installation
179
+ alone does not start Spark collection. See [Windows Companion Store delivery](windows-companion-store.md)
180
+ for connection details and update compatibility.
181
+
182
+ #### macOS
183
+
148
184
  When ABot runs natively on your Mac, open its local Web UI and choose **Connect
149
185
  this Mac**. ABot uses its installed Node runtime and companion bundle, pairs the
150
186
  computer and enables startup at sign-in. This path does not download a Finder
@@ -205,11 +241,15 @@ not change Computer access pairing or send a model request. Application-specific
205
241
  Automation/Apple Events and protected-file access may still require separate
206
242
  consent for the applications or locations used by a later SYSTEM command.
207
243
 
208
- For Windows or Linux, download setup and run it in that computer's graphical
209
- login. Windows setup installs the companion and a private Node runtime; Linux
210
- uses an existing Node.js installation. Setup pairs automatically and enables
211
- startup at sign-in. Wait for **Ready** in the Web UI; downloading alone does not
212
- establish a connection. WSL uses the same Windows companion setup, which does
244
+ #### Linux and WSL
245
+
246
+ For Linux, download setup and run it in that computer's graphical login. Setup
247
+ uses an existing Node.js installation, pairs automatically and enables startup
248
+ at sign-in. Wait for **Ready** in the Web UI; downloading alone does not establish
249
+ a connection. This Linux flow is unchanged by the Windows Store integration.
250
+
251
+ Running ABot in WSL and existing WSL interop access are unchanged. To connect the
252
+ Windows desktop to a WSL Runtime, use the Windows Companion flow above; it does
213
253
  not require changing interop settings or restarting the distribution.
214
254
 
215
255
  Installation does not enable ABot Spark collection or disabled plugin tools.
@@ -355,22 +395,3 @@ profile without changing runtime policy or another model's settings.
355
395
 
356
396
  The repository ignores `.env`, `local/runtime.config.json`, `.runtime/`, and
357
397
  `dist/`. Do not commit local secrets or generated runtime state.
358
-
359
- ## Verify Package Surface
360
-
361
- Before publishing or opening a release PR:
362
-
363
- ```bash
364
- npm test -- --run
365
- npm run build
366
- npm run smoke:runtime-package
367
- npm run check:runtime-package
368
- npm run smoke:packed-runtime-package
369
- git diff --check
370
- ```
371
-
372
- `npm run build` regenerates `runtime.config.schema.json`, clears stale `dist`,
373
- and compiles the published TypeScript declarations.
374
-
375
- For the full public release checklist, see
376
- [`docs/publishing.md`](publishing.md).
package/docs/plugins.md CHANGED
@@ -16,6 +16,9 @@ the same physical directory, the catalog is discovered only once.
16
16
  Open **Plugins** to see installed manifests, capability counts,
17
17
  and enabled, partially enabled or disabled selections. Switches save the selected
18
18
  plugin's configuration while preserving capability-specific allow/deny rules.
19
+ Whole-plugin switches use `plugins.disabledPluginIds`, an exact list of plugin
20
+ IDs independent of capability names and qualified selectors. The list does not
21
+ interpret wildcards; legacy `allow` and `deny` rules keep their existing meaning.
19
22
  Choose **Manage tools** on a plugin to manage its declared tools inside the same card.
20
23
  The card keeps its size; the tool list scrolls when needed. Use **Back** or Escape
21
24
  to return to the plugin overview. For example, disabling filesystem.read_file
@@ -26,14 +29,164 @@ tools switched off.
26
29
  Global, parent-plugin and broad tool deny rules remain explicit blockers.
27
30
  A child switch does not silently remove those rules or enable sibling tools.
28
31
 
32
+ Install, configuration saves, enable/disable and Remove require every owning Runtime to be idle.
33
+ While a conversation or Job is running, these actions return a clear message
34
+ without saving the requested change. Open but idle conversations do not block
35
+ changes; browsing and reviewing repositories remain available. If another process
36
+ owns an environment, use the owning Web UI so its activity can be verified.
37
+
29
38
  Choose **Apply changes** to activate saved settings. The Web process replaces
30
39
  only its own idle environments and preserves session and Job files. If any
31
40
  environment is working, or another process owns it, changes remain saved and
32
41
  the UI explains why they cannot yet be applied. Saving a switch alone does not
33
42
  change tools available to an already running agent.
34
43
 
35
- This screen manages packages already installed on disk; it does not install
36
- plugins from a marketplace.
44
+ ## Configure Plugin Values
45
+
46
+ Choose **Configure** on an installed plugin, or use the same form during its
47
+ installation review. Fields come from the existing `settings.defaults` and
48
+ `secrets` declarations. Strings, numbers and booleans use ordinary controls;
49
+ objects, arrays and null defaults use JSON. The host checks declared setting
50
+ names and top-level default types. A null default supplies no type information;
51
+ semantic checks such as URL validity remain the plugin's responsibility.
52
+ The form shows whether each setting uses the plugin default or a local value.
53
+ Saving credentials alone leaves inherited defaults unchanged. Editing a setting
54
+ creates a local override, even when its value equals today's default; **Use plugin
55
+ default** removes that override when saved. Existing saved values stay local until
56
+ explicitly reset, so no upgrade automatically rewrites a user's configuration.
57
+ No manifest schema or SDK changes are required. If an upgraded plugin changes a
58
+ setting's default type, an incompatible retained value blocks loading with an
59
+ explicit configuration error. Configure remains available to correct the value;
60
+ the host does not silently replace it with a default.
61
+
62
+ **Save changes** persists values locally; **Apply changes** loads them into new
63
+ idle Runtime owners. Existing owners retain their loaded values, including when
64
+ activation fails and restores the previous configuration. GET returns settings
65
+ and credential-presence flags, never secret values. Passwords remain in their
66
+ mounted controls until submitted, and are cleared after submission.
67
+
68
+ Values are shared across environments of the same consumer root and are stored
69
+ in `<consumer-root>/.runtime/plugin-configuration.json`, outside plugin packages,
70
+ with owner-only file permissions. On POSIX, an existing file with any group or
71
+ other-user permission is rejected before its contents are read. Restore its
72
+ permissions with `chmod 600 .runtime/plugin-configuration.json` from the installation
73
+ root; the host does not change permissions automatically. They are local plaintext
74
+ configuration, not an
75
+ encrypted vault. This file must not be committed, published, or shared with a
76
+ plugin repository. The existing `.runtime/` exclusion also keeps it out of Git
77
+ and packages. Settings override declared defaults; undeclared settings are not
78
+ passed to plugins. A locally configured secret is bound to its declared name
79
+ and environment-variable name and is delivered through `context.secrets.get`.
80
+ Without a local override, the existing process environment remains the source.
81
+ Saving plugin values does not write `.env` or change `process.env`. Browser revision
82
+ tokens use a private process key rather than an unkeyed digest of secret-bearing
83
+ content. Reload an open form after restarting its Web UI process.
84
+
85
+ Keys removed from the current manifest, or whose environment binding changed,
86
+ appear under **Keys no longer used by this plugin** without exposing their values.
87
+ They remain saved until the user selects **Delete saved key** and saves. Ordinary
88
+ settings edits do not delete them. A changed binding under the same key name
89
+ requires explicitly deleting the old saved key before setting or clearing its
90
+ replacement; both choices can be submitted in one save. Configure remains
91
+ available for these keys even when the plugin has no current settings or secrets.
92
+
93
+ For each secret, keep the current value, replace it, or explicitly clear it.
94
+ Clear suppresses an inherited value for this plugin without deleting a shared
95
+ environment variable. Clearing a required secret prevents the plugin from
96
+ loading on the next Apply until the key is configured again. Remove retains
97
+ local settings and secrets; a later installation review shows the retained
98
+ settings and presence flags. Required secrets are checked before installation
99
+ commits, and failed selection saves roll back the local configuration and package.
100
+
101
+ ## Install Community Plugins
102
+
103
+ The **Installed** tab manages the existing catalog. **Discover** links to the
104
+ [ABot Marketplace](https://abot-ai.com/marketplace/) and installs public GitHub packages independently of that directory.
105
+ The Marketplace is a directory of community-owned repositories; listing approval
106
+ does not grant a repository permission to run on a user's machine.
107
+
108
+ Paste a repository URL in **Discover**, optionally choosing a branch, tag or
109
+ commit and a folder inside the repository. **Review plugin** resolves the source
110
+ to an exact commit, validates the manifest and its declared files without
111
+ executing plugin code, and displays its tools and configuration form.
112
+ Fill in required secrets before confirming installation.
113
+ **Install and enable** downloads the same commit, checks the reviewed content
114
+ digest, and installs it at `<consumer-root>/plugins/<manifest.name>`. Existing
115
+ plugin IDs and capability IDs are rejected; this flow never replaces a plugin.
116
+ Package publication and selection saving share the configuration lock with Apply;
117
+ a failed save removes the uncommitted package before Apply can discover it.
118
+ The normal configuration controls and global restrictions still apply.
119
+ The review offers **Install and enable** at both ends. After installation, the
120
+ UI returns to **Installed** with a status message. Choose **Apply changes** to
121
+ load the plugin into the Runtime.
122
+
123
+ Publishers must commit a complete package: `plugin.json`, its built CommonJS
124
+ `.cjs` entrypoint, referenced skills and all required assets. Bundle dependencies
125
+ that are not supplied by the public plugin SDK. Installation does not execute
126
+ `npm install`, build commands, lifecycle scripts or repository code. Public HTTPS
127
+ repositories on `github.com` are supported; private repositories, updates and
128
+ Studio packages are outside this first installation flow. Repository ZIPs are
129
+ limited to 25 MiB and 2,000 entries, with at most 16 MiB per extracted file and
130
+ 64 MiB total. Symlinks, traversal and non-portable filenames are rejected.
131
+
132
+ ### Install In ABot Links
133
+
134
+ Computer Access setup registers the `abot:` URL scheme on Windows, macOS and
135
+ Linux desktops. Existing installations can use **Update** in Computer Access
136
+ to install Companion release 12 and register links while keeping their pairing.
137
+ A website can render an ordinary link using this contract:
138
+
139
+ ```js
140
+ const link = new URL("abot://install");
141
+ link.searchParams.set("kind", "plugin");
142
+ link.searchParams.set("repo", "https://github.com/owner/plugin");
143
+ link.searchParams.set("ref", "v1.0.0"); // optional; a commit is recommended
144
+ link.searchParams.set("path", "plugins/example"); // optional repository folder
145
+ installAnchor.href = link.toString();
146
+ ```
147
+
148
+ Clicking the link opens **Discover** in the Runtime saved in the local Computer
149
+ Access pairing, with the source ready for review. A link cannot choose another
150
+ Runtime address or bypass local installation confirmation. The browser may ask
151
+ to open ABot. Without Computer Access, users can paste the same repository URL.
152
+ Companion disconnect/uninstall removes its owned protocol registration.
153
+
154
+ The local API uses `POST /runtime/plugins/inspect` with
155
+ `{ repository, ref?, path? }`, returning `{ ok, review }`.
156
+ Installation uses `POST /runtime/plugins/install` with
157
+ `{ source: review.source, digest: review.digest }`. Both require same-origin
158
+ JSON requests and completed Runtime setup. These APIs operate on the configured
159
+ consumer root and configuration file; they do not depend on the Marketplace.
160
+
161
+ ## Remove Community Plugins
162
+
163
+ **Remove** is available in the ongoing Plugins screen for packages installed by
164
+ this GitHub flow. After confirmation, it saves a disable, applies configuration
165
+ through the existing idle-owner checks, and only then deletes the installed
166
+ folder. Built-in plugins and manually copied folders without an installation
167
+ receipt do not offer Remove. Removal adds only the target's exact ID to
168
+ `plugins.disabledPluginIds`, so names shared with other tools or qualified
169
+ selectors cannot change another plugin's selection.
170
+
171
+ If work starts after the disable was saved but before Apply, the files remain.
172
+ Finish the active work, then choose **Remove** again. A failed Apply or any
173
+ concurrent configuration change also prevents deletion. Removal verifies the
174
+ moved directory before deleting it and retires its cached CommonJS modules so
175
+ a later installation loads the new entrypoint and package-local dependencies.
176
+ Selection rules remain in the configuration so removal cannot widen another
177
+ plugin's allow policy. Installing the same plugin again clears its exact disabled
178
+ ID and preserves other disabled IDs and capability-specific deny rules. Existing
179
+ qualified denies are not inferred to be removal-generated; review such legacy
180
+ rules explicitly in Advanced settings if they still disable the tools.
181
+
182
+ `POST /runtime/plugins/remove` accepts `{ pluginId }`, with the same origin,
183
+ JSON and completed-setup requirements as installation. It returns `removed`,
184
+ `activation`, a status message and the refreshed plugin snapshot. This removes
185
+ the installed plugin folder, including data the plugin kept inside it; files
186
+ stored elsewhere are retained. If Apply succeeds but a later removal check fails,
187
+ the error retains its HTTP status and code and includes `activation` with status
188
+ `ready`. The UI refreshes the active environments; `config_changed` still marks
189
+ the newer saved configuration as pending activation.
37
190
 
38
191
  ## Package Shape
39
192
 
@@ -143,6 +296,16 @@ input, effect, and approval. Optional capability metadata such as client event
143
296
  presentation, payload authoring, development roles, and selection grounding
144
297
  belongs here as well—not in runtime orchestration.
145
298
 
299
+ An operation may declare `outputChannels` alongside `summary`, for example
300
+ `{"text":"content","data":"metadata"}`. Both fields are required when declared:
301
+ `content` can carry substantive output (possibly bounded or summarized),
302
+ `metadata` contains only identifiers/status/counts/receipts, and `conditional`
303
+ depends on the operation inputs. Omission means unknown, not metadata. This
304
+ passive declaration describes the saved Studio channels, not every field in a
305
+ chat tool result; it changes no execution or binding behavior. Only selected
306
+ Studio `prepare_draft` operations expose it to models; ordinary tool summaries
307
+ and discovery stay concise. Whole Data bindings do not need field pointers.
308
+
146
309
  A plugin declares sensitive operations with `approval: "always"` in its
147
310
  manifest, as the bundled EXEC and SYSTEM plugins do. Apply that policy to every
148
311
  operation when the whole plugin is sensitive. The generic approval boundary