@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
@@ -21,6 +21,7 @@ export declare function readAutomationAuthoringPreparation(service: CatalogServi
21
21
  operationId: string;
22
22
  contractVersion: number;
23
23
  label: string;
24
+ outputChannels?: import("../../../capabilities/tool-types.js").ToolNormalInvocationOperation["outputChannels"];
24
25
  pluginName?: string;
25
26
  catalogGroups: readonly import("../../../capabilities/tool-types.js").ToolCatalogGroup[];
26
27
  toolDescription?: string;
@@ -106,7 +107,7 @@ export declare function readAutomationAuthoringPreparation(service: CatalogServi
106
107
  readonly steps: readonly [{
107
108
  readonly key: "evidence";
108
109
  readonly kind: "tool";
109
- readonly title: "Read structured evidence";
110
+ readonly title: "Read text evidence";
110
111
  readonly operation: {
111
112
  readonly toolName: "catalog_tool";
112
113
  readonly operationId: "catalog_operation";
@@ -122,7 +123,7 @@ export declare function readAutomationAuthoringPreparation(service: CatalogServi
122
123
  readonly evidence: {
123
124
  readonly kind: "node_result";
124
125
  readonly nodeId: "$evidence";
125
- readonly select: "data";
126
+ readonly select: "text";
126
127
  };
127
128
  };
128
129
  }];
@@ -385,10 +386,15 @@ export declare function readAutomationAuthoringPreparation(service: CatalogServi
385
386
  };
386
387
  };
387
388
  readonly channels: {
388
- readonly text: "Tool display output; may be counts/status only, not serialized data.";
389
- readonly data: "Structured tool output, when provided. Omit pointer to pass it whole, without knowing field names.";
389
+ readonly text: "Saved text.";
390
+ readonly data: "Separate optional JSON; no implicit Text channel.";
390
391
  };
391
- readonly policy: "Use literal for constants, run_input for definition.inputs. node_result needs a succeeded earlier node; no implicit output. Select the operation's documented channel: data for records/ids, text when sufficient. Optional data-only RFC6901 pointer: /field, /items/0; escape ~ as ~0 and / as ~1. Never invent fields or execute future steps to inspect output.";
392
+ readonly outputChannels: {
393
+ content: string;
394
+ metadata: string;
395
+ conditional: string;
396
+ };
397
+ readonly policy: "literal=constants; run_input=definition.inputs; node_result needs prior success. Follow operation.outputChannels; absent=unknown. Whole data needs no pointer. RFC6901 pointers need documented fields (/items/0; ~ as ~0, / as ~1). Never execute steps for output discovery.";
392
398
  readonly files: "run_file resolves a new file for each run under its working directory; fileName is one portable filename, no path. source_files requires a configured source and an agent consumer. source_file index selects the frozen batch entry; field=snapshot_path|original_path|version.";
393
399
  readonly parallel: "branch_results is agent-only after the referenced parallel join; it supplies each branch's settled tail output/status. A failed/skipped source has no successful node_result for downstream bindings.";
394
400
  };
@@ -110,7 +110,7 @@ async function execute(service, params) {
110
110
  return { kind: "automation_authoring_catalog_v1", grantsPermissions: false,
111
111
  catalogScope: automationAuthoringCatalogScope(automationId),
112
112
  permissions: AUTOMATION_AUTHORING_REFERENCE.permissions,
113
- operations: catalog.grantableOperations.map(({ fixedParams: _fixedParams, ...operation }) => operation),
113
+ operations: catalog.grantableOperations.map(({ fixedParams: _fixedParams, outputChannels: _outputChannels, ...operation }) => operation),
114
114
  grantedOperations: catalog.operations.map(({ toolName, operationId, contractVersion }) => ({ toolName, operationId, contractVersion })),
115
115
  models: catalog.models,
116
116
  savedAgents: catalog.savedAgents.map((agent) => ({
@@ -1,8 +1,10 @@
1
1
  import { type ToolPermissionMode } from "../../capabilities/tool-permission-mode.js";
2
2
  import type { RegisteredToolNormalInvocation, ToolDefinition } from "../../capabilities/tool-types.js";
3
3
  import type { ToolRegistry } from "../ports.js";
4
+ import { type RuntimeModelPluginConfig } from "../config/model-plugin-config.js";
4
5
  /** One lazy registration snapshot; any declared restriction wins across projections. */
5
- export declare function captureRequestPermissionCatalog(registry: ToolRegistry, mode: ToolPermissionMode): Readonly<{
6
+ export declare function captureRequestPermissionCatalog(registry: ToolRegistry, mode: ToolPermissionMode, modelPlugins?: RuntimeModelPluginConfig): Readonly<{
7
+ isRequestToolBlockedForModel: (name: string) => boolean;
6
8
  listDefinitions: () => ToolDefinition[];
7
9
  listNormalInvocations: () => readonly RegisteredToolNormalInvocation[] | undefined;
8
10
  getDefinition: (name: string) => ToolDefinition | undefined;
@@ -1,13 +1,22 @@
1
1
  import { permitsRequiredToolMode, } from "../../capabilities/tool-permission-mode.js";
2
+ import { captureModelPluginConfig, } from "../config/model-plugin-config.js";
3
+ import { matchesToolSelectionId } from "../../shared/tool-selection.js";
2
4
  /** One lazy registration snapshot; any declared restriction wins across projections. */
3
- export function captureRequestPermissionCatalog(registry, mode) {
5
+ export function captureRequestPermissionCatalog(registry, mode, modelPlugins) {
6
+ const modelDeniedSelectors = captureModelPluginConfig(modelPlugins)?.deny ?? [];
4
7
  const definitions = Object.freeze([...registry.listDefinitions()]);
5
8
  const definitionByName = new Map(definitions.map((definition) => [definition.name, definition]));
6
9
  let registrations;
7
10
  let resolvedRegistrations = false;
8
11
  const registeredAllowedNames = new Set();
9
12
  const registeredDeniedNames = new Set();
10
- const permitsDefinition = (definition) => permitsRequiredToolMode(mode, definition.requiredPermissionMode);
13
+ const registeredModelDeniedNames = new Set();
14
+ const isDefinitionBlockedForModel = (definition) => modelDeniedSelectors.some((selector) => matchesToolSelectionId(definition.pluginName ?? "", definition.name, selector));
15
+ const permitsDefinition = (definition) => {
16
+ if (isDefinitionBlockedForModel(definition))
17
+ return false;
18
+ return permitsRequiredToolMode(mode, definition.requiredPermissionMode);
19
+ };
11
20
  const permitsRegistration = (registration) => {
12
21
  const definition = definitionByName.get(registration.toolName);
13
22
  if (definition && !permitsDefinition(definition))
@@ -23,6 +32,8 @@ export function captureRequestPermissionCatalog(registry, mode) {
23
32
  return undefined;
24
33
  }
25
34
  for (const registration of source) {
35
+ if (isDefinitionBlockedForModel(registration.definition))
36
+ registeredModelDeniedNames.add(registration.toolName);
26
37
  const names = permitsRegistration(registration)
27
38
  ? registeredAllowedNames
28
39
  : registeredDeniedNames;
@@ -41,7 +52,15 @@ export function captureRequestPermissionCatalog(registry, mode) {
41
52
  return permitsDefinition(definition);
42
53
  return registeredAllowedNames.has(name);
43
54
  }
55
+ function isRequestToolBlockedForModel(name) {
56
+ resolveRegistrations();
57
+ if (registeredModelDeniedNames.has(name))
58
+ return true;
59
+ const definition = definitionByName.get(name);
60
+ return definition !== undefined && isDefinitionBlockedForModel(definition);
61
+ }
44
62
  return Object.freeze({
63
+ isRequestToolBlockedForModel,
45
64
  listDefinitions: () => definitions.filter(({ name }) => isRequestToolAvailable(name)),
46
65
  listNormalInvocations: resolveRegistrations,
47
66
  getDefinition: (name) => isRequestToolAvailable(name) ? definitionByName.get(name) : undefined,
@@ -1,4 +1,5 @@
1
1
  import { type ToolPermissionMode } from "../../capabilities/tool-permission-mode.js";
2
2
  import type { ToolRegistry } from "../ports.js";
3
+ import type { RuntimeModelPluginConfig } from "../config/model-plugin-config.js";
3
4
  /** Captures user authority once; all discovery and execution use the same gate. */
4
- export declare function restrictToolRegistryToRequestMode(registry: ToolRegistry, mode: ToolPermissionMode): ToolRegistry;
5
+ export declare function restrictToolRegistryToRequestMode(registry: ToolRegistry, mode: ToolPermissionMode, modelPlugins?: RuntimeModelPluginConfig): ToolRegistry;
@@ -1,16 +1,24 @@
1
1
  import { captureRequestPermissionCatalog } from "./request-permission-catalog.js";
2
2
  /** Captures user authority once; all discovery and execution use the same gate. */
3
- export function restrictToolRegistryToRequestMode(registry, mode) {
4
- const catalog = captureRequestPermissionCatalog(registry, mode);
3
+ export function restrictToolRegistryToRequestMode(registry, mode, modelPlugins) {
4
+ const catalog = captureRequestPermissionCatalog(registry, mode, modelPlugins);
5
5
  const isRequestToolAvailable = catalog.isRequestToolAvailable;
6
- const rejectUnavailableTool = (tool) => ({
7
- ok: false,
8
- tool,
9
- output: "This tool is unavailable for the captured request permission mode.",
10
- producedNewInformation: false,
11
- error: "This tool is unavailable for the captured request permission mode.",
12
- errorCode: "tool_permission_mode_required",
13
- });
6
+ const rejectUnavailableTool = (tool) => {
7
+ const blockedForModel = catalog.isRequestToolBlockedForModel(tool);
8
+ const message = blockedForModel
9
+ ? "This tool is blocked for the selected request model profile."
10
+ : "This tool is unavailable for the captured request permission mode.";
11
+ return {
12
+ ok: false,
13
+ tool,
14
+ output: message,
15
+ producedNewInformation: false,
16
+ error: message,
17
+ errorCode: blockedForModel
18
+ ? "tool_model_policy_denied"
19
+ : "tool_permission_mode_required",
20
+ };
21
+ };
14
22
  const bindAuthority = (state) => ({
15
23
  ...state,
16
24
  requestContext: Object.freeze({
@@ -1,5 +1,6 @@
1
1
  import type { ToolPermissionMode } from "../../capabilities/tool-permission-mode.js";
2
2
  import type { RuntimeConfig, ToolRegistry } from "../ports.js";
3
+ import type { RuntimeModelPluginConfig } from "../config/model-plugin-config.js";
3
4
  import type { BoundRequestModelInvocationContext } from "../request/contracts.js";
4
5
  import type { ToolRequestAttachment } from "../../capabilities/tool-types.js";
5
6
  /**
@@ -10,6 +11,7 @@ import type { ToolRequestAttachment } from "../../capabilities/tool-types.js";
10
11
  export declare function createRequestRuntimeToolRegistry(params: Readonly<{
11
12
  request: BoundRequestModelInvocationContext;
12
13
  toolPermissionMode?: ToolPermissionMode;
14
+ modelPlugins?: RuntimeModelPluginConfig;
13
15
  requestAttachments?: readonly ToolRequestAttachment[];
14
16
  runtimeConfig?: RuntimeConfig;
15
17
  requestWorkingDirectory?: string;
@@ -9,7 +9,7 @@ import { bindRequestToolRegistry } from "./request-bound-tool-registry.js";
9
9
  */
10
10
  export function createRequestRuntimeToolRegistry(params) {
11
11
  const registry = restrictToolRegistryToRequestMode(params.toolRegistryOverride ??
12
- createConfiguredToolRegistry(params.runtimeConfig, []), params.toolPermissionMode ?? "ask");
12
+ createConfiguredToolRegistry(params.runtimeConfig, []), params.toolPermissionMode ?? "ask", params.modelPlugins);
13
13
  return bindRequestToolRegistry({
14
14
  registry,
15
15
  modelInvoker: createRequestToolModelInvoker(params.request),
@@ -1,6 +1,7 @@
1
1
  export declare const scheduleCreateOperations: readonly [Readonly<{
2
2
  operationId: string;
3
3
  summary: string;
4
+ outputChannels?: import("../../../capabilities/tool-types.js").ToolNormalInvocationOutputChannels;
4
5
  input: import("../../../capabilities/tool-types.js").ToolNormalInvocationInput;
5
6
  selectionControlIds?: readonly string[];
6
7
  fixedParams?: Readonly<Record<string, import("../../../capabilities/tool-types.js").ToolNormalInvocationFixedValue>>;
@@ -11,6 +12,7 @@ export declare const scheduleCreateOperations: readonly [Readonly<{
11
12
  }>, Readonly<{
12
13
  operationId: string;
13
14
  summary: string;
15
+ outputChannels?: import("../../../capabilities/tool-types.js").ToolNormalInvocationOutputChannels;
14
16
  input: import("../../../capabilities/tool-types.js").ToolNormalInvocationInput;
15
17
  selectionControlIds?: readonly string[];
16
18
  fixedParams?: Readonly<Record<string, import("../../../capabilities/tool-types.js").ToolNormalInvocationFixedValue>>;
@@ -21,6 +23,7 @@ export declare const scheduleCreateOperations: readonly [Readonly<{
21
23
  }>, Readonly<{
22
24
  operationId: string;
23
25
  summary: string;
26
+ outputChannels?: import("../../../capabilities/tool-types.js").ToolNormalInvocationOutputChannels;
24
27
  input: import("../../../capabilities/tool-types.js").ToolNormalInvocationInput;
25
28
  selectionControlIds?: readonly string[];
26
29
  fixedParams?: Readonly<Record<string, import("../../../capabilities/tool-types.js").ToolNormalInvocationFixedValue>>;
@@ -31,6 +34,7 @@ export declare const scheduleCreateOperations: readonly [Readonly<{
31
34
  }>, Readonly<{
32
35
  operationId: string;
33
36
  summary: string;
37
+ outputChannels?: import("../../../capabilities/tool-types.js").ToolNormalInvocationOutputChannels;
34
38
  input: import("../../../capabilities/tool-types.js").ToolNormalInvocationInput;
35
39
  selectionControlIds?: readonly string[];
36
40
  fixedParams?: Readonly<Record<string, import("../../../capabilities/tool-types.js").ToolNormalInvocationFixedValue>>;
@@ -41,6 +45,7 @@ export declare const scheduleCreateOperations: readonly [Readonly<{
41
45
  }>, Readonly<{
42
46
  operationId: string;
43
47
  summary: string;
48
+ outputChannels?: import("../../../capabilities/tool-types.js").ToolNormalInvocationOutputChannels;
44
49
  input: import("../../../capabilities/tool-types.js").ToolNormalInvocationInput;
45
50
  selectionControlIds?: readonly string[];
46
51
  fixedParams?: Readonly<Record<string, import("../../../capabilities/tool-types.js").ToolNormalInvocationFixedValue>>;
@@ -51,6 +56,7 @@ export declare const scheduleCreateOperations: readonly [Readonly<{
51
56
  }>, Readonly<{
52
57
  operationId: string;
53
58
  summary: string;
59
+ outputChannels?: import("../../../capabilities/tool-types.js").ToolNormalInvocationOutputChannels;
54
60
  input: import("../../../capabilities/tool-types.js").ToolNormalInvocationInput;
55
61
  selectionControlIds?: readonly string[];
56
62
  fixedParams?: Readonly<Record<string, import("../../../capabilities/tool-types.js").ToolNormalInvocationFixedValue>>;
@@ -1,7 +1,7 @@
1
1
  import { readFileSync } from "node:fs";
2
2
  import { dirname, isAbsolute, resolve } from "node:path";
3
3
  import { DEFAULT_RUNTIME_LOGGING_ENABLED, DEFAULT_RUNTIME_LOG_ROTATION_CONFIG, } from "./constants.js";
4
- import { isRequestExecutionPolicyId } from "./model-execution-policy.js";
4
+ import { buildRuntimeModelExecutionPolicy } from "./model-execution-policy.js";
5
5
  import { RuntimeConfigValidationError, validateModelProfileConfig, } from "./validation.js";
6
6
  import { readConfigPositiveInt, isRecord, readNestedConfigString, readNestedConfigStringArray, readOptionalBoolean, readOptionalStringMap, } from "./utils.js";
7
7
  export function compactTimeouts(timeouts) {
@@ -56,7 +56,9 @@ export function buildPluginConfig(config) {
56
56
  const enabled = readOptionalBoolean(config.plugins, "enabled");
57
57
  const allow = readNestedConfigStringArray(config.plugins, "allow");
58
58
  const deny = readNestedConfigStringArray(config.plugins, "deny");
59
+ const disabledPluginIds = readNestedConfigStringArray(config.plugins, "disabledPluginIds");
59
60
  const pluginConfig = {
61
+ ...(disabledPluginIds ? { disabledPluginIds } : {}),
60
62
  ...(enabled !== undefined ? { enabled } : {}),
61
63
  ...(allow ? { allow } : {}),
62
64
  ...(deny ? { deny } : {}),
@@ -432,10 +434,9 @@ function buildModelProfiles(profiles, options) {
432
434
  if (modelProfile) {
433
435
  gatewayEntries.push([profileId, modelProfile]);
434
436
  }
435
- const execution = isRecord(source.execution) ? source.execution : undefined;
436
- if (execution && isRequestExecutionPolicyId(execution.policy)) {
437
- executionEntries.push([profileId, { policy: execution.policy }]);
438
- }
437
+ const execution = buildRuntimeModelExecutionPolicy(source);
438
+ if (execution)
439
+ executionEntries.push([profileId, execution]);
439
440
  }
440
441
  return {
441
442
  ...(gatewayEntries.length > 0
@@ -1,3 +1,4 @@
1
+ import { validateProfileContextCapacity, } from "./model-context-capacity.js";
1
2
  import { RuntimeConfigValidationError } from "./validation.js";
2
3
  function hasConfiguredProfile(profiles, profileId) {
3
4
  return !!profileId && Object.hasOwn(profiles, profileId);
@@ -8,40 +9,6 @@ function hasConfiguredInvocationProfile(invocationProfiles, profileId) {
8
9
  function hasConfiguredCalibrationSlot(profiles, slotId) {
9
10
  return Object.values(profiles).some((profile) => Object.hasOwn(profile.calibration ?? {}, slotId));
10
11
  }
11
- function readPositiveSafeInteger(value) {
12
- return typeof value === "number" &&
13
- Number.isSafeInteger(value) &&
14
- value > 0
15
- ? value
16
- : undefined;
17
- }
18
- function validateProfileContextCapacity(params) {
19
- const field = `models.profiles.${params.profileId}.contextWindowTokens`;
20
- const declared = readPositiveSafeInteger(params.profile.contextWindowTokens);
21
- if (declared === undefined) {
22
- params.issues.push(`${field} must declare the physical context-window capacity as a positive safe integer`);
23
- return;
24
- }
25
- let effective = declared;
26
- if (params.providerType === "ollama" &&
27
- Object.hasOwn(params.profile.options ?? {}, "num_ctx")) {
28
- const allocated = readPositiveSafeInteger(params.profile.options?.num_ctx);
29
- if (allocated === undefined) {
30
- params.issues.push(`models.profiles.${params.profileId}.options.num_ctx must be a positive safe integer when configured`);
31
- return;
32
- }
33
- effective = Math.min(effective, allocated);
34
- }
35
- const profileFormatReserve = params.profile.context?.formatTokenAccounting?.fixedOverheadTokens ?? 0;
36
- const defaultFormatReserve = params.defaultContext?.formatTokenAccounting?.fixedOverheadTokens ?? 0;
37
- const configuredReserve = params.runnerConfig.context.outputReserveTokens +
38
- params.runnerConfig.context.safetyReserveTokens +
39
- params.runnerConfig.context.attachmentReserveTokens +
40
- Math.max(profileFormatReserve, defaultFormatReserve);
41
- if (configuredReserve >= effective) {
42
- params.issues.push(`models.profiles.${params.profileId} effective context window ${effective} must exceed configured output, safety, attachment, and format reserves ${configuredReserve}`);
43
- }
44
- }
45
12
  function validateProfileReference(params) {
46
13
  if (!hasConfiguredProfile(params.profiles, params.profileId)) {
47
14
  params.issues.push(`${params.field} references unknown model profile ${params.profileId}`);
@@ -73,6 +40,7 @@ function validateStepTarget(params) {
73
40
  */
74
41
  export function validateEffectiveRuntimeModelConfig(params) {
75
42
  const issues = [];
43
+ const capacityIssues = [];
76
44
  const providers = params.modelPolicy?.providers ?? {};
77
45
  const profiles = params.modelPolicy?.profiles ?? {};
78
46
  const invocationProfiles = params.modelPolicy?.invocationProfiles ?? {};
@@ -92,6 +60,7 @@ export function validateEffectiveRuntimeModelConfig(params) {
92
60
  }
93
61
  validateProfileContextCapacity({
94
62
  issues,
63
+ capacityIssues,
95
64
  profileId,
96
65
  profile,
97
66
  ...(providerId && providers[providerId]
@@ -169,6 +138,6 @@ export function validateEffectiveRuntimeModelConfig(params) {
169
138
  });
170
139
  }
171
140
  if (issues.length > 0) {
172
- throw new RuntimeConfigValidationError(params.configPath, issues);
141
+ throw new RuntimeConfigValidationError(params.configPath, issues, capacityIssues);
173
142
  }
174
143
  }
@@ -137,6 +137,10 @@ export const RUNTIME_CONFIG_SCHEMA_FIELDS = [
137
137
  env: [field.env],
138
138
  description: field.description,
139
139
  })),
140
+ {
141
+ path: "webUi.pageSize", type: "positive-number", defaultValue: "20",
142
+ description: "Sessions and messages per Web UI history page, including SPARK.",
143
+ },
140
144
  {
141
145
  path: "webUi.openOnRuntimeServiceStart",
142
146
  type: "boolean",
@@ -185,6 +189,12 @@ export const RUNTIME_CONFIG_SCHEMA_FIELDS = [
185
189
  defaultValue: "[]",
186
190
  description: "Installed plugin or capability ids denied after applying the allow-list.",
187
191
  },
192
+ {
193
+ path: "plugins.disabledPluginIds",
194
+ type: "string-array",
195
+ defaultValue: "[]",
196
+ description: "Exact plugin ids disabled independently of tool selectors. Entries are literal ids, not wildcards.",
197
+ },
188
198
  {
189
199
  path: "models.providers",
190
200
  type: "object-map",
@@ -210,6 +220,11 @@ export const RUNTIME_CONFIG_SCHEMA_FIELDS = [
210
220
  type: "object-map",
211
221
  description: "Per-model calibration slots keyed by semantic slot id. Runtime step config maps modelStep names to these slot ids. Slots may tune timeout, generation, context, format, and short model-specific instructions.",
212
222
  },
223
+ {
224
+ path: "models.profiles.<profileId>.plugins.deny",
225
+ type: "string-array",
226
+ description: "Additional denied plugin or capability selectors for requests selected by this model profile, including configRef profiles. Global plugin restrictions still apply.",
227
+ },
213
228
  {
214
229
  path: "models.profiles.<profileId>.execution.policy",
215
230
  type: "non-empty-string",
@@ -0,0 +1,20 @@
1
+ import type { ModelContextConfig, ModelGatewayPolicyConfig } from "../../model-gateway/types.js";
2
+ import type { RequestRunnerConfig } from "./runner/contracts.js";
3
+ export type ModelContextCapacityIssue = Readonly<{
4
+ profileId: string;
5
+ declaredTokens: number;
6
+ effectiveTokens: number;
7
+ reservedTokens: number;
8
+ minimumTokens: number;
9
+ allocationTokens?: number;
10
+ }>;
11
+ /** Keeps the admission invariant and its diagnostic evidence in one owner. */
12
+ export declare function validateProfileContextCapacity(params: {
13
+ issues: string[];
14
+ capacityIssues: ModelContextCapacityIssue[];
15
+ profileId: string;
16
+ profile: NonNullable<ModelGatewayPolicyConfig["profiles"]>[string];
17
+ providerType?: string;
18
+ runnerConfig: RequestRunnerConfig;
19
+ defaultContext?: ModelContextConfig;
20
+ }): void;
@@ -0,0 +1,55 @@
1
+ function readPositiveContextCapacity(value) {
2
+ if (typeof value !== "number")
3
+ return undefined;
4
+ if (!Number.isSafeInteger(value))
5
+ return undefined;
6
+ if (value <= 0)
7
+ return undefined;
8
+ return value;
9
+ }
10
+ function hasConfiguredOllamaContextAllocation(providerType, profile) {
11
+ if (providerType !== "ollama")
12
+ return false;
13
+ return Object.hasOwn(profile.options ?? {}, "num_ctx");
14
+ }
15
+ function hasInsufficientModelContextCapacity(effectiveTokens, reservedTokens) {
16
+ return reservedTokens >= effectiveTokens;
17
+ }
18
+ /** Keeps the admission invariant and its diagnostic evidence in one owner. */
19
+ export function validateProfileContextCapacity(params) {
20
+ const field = `models.profiles.${params.profileId}.contextWindowTokens`;
21
+ const declaredTokens = readPositiveContextCapacity(params.profile.contextWindowTokens);
22
+ if (declaredTokens === undefined) {
23
+ params.issues.push(`${field} must declare the physical context-window capacity as a positive safe integer`);
24
+ return;
25
+ }
26
+ const hasAllocation = hasConfiguredOllamaContextAllocation(params.providerType, params.profile);
27
+ const allocationTokens = hasAllocation
28
+ ? readPositiveContextCapacity(params.profile.options?.num_ctx)
29
+ : undefined;
30
+ const hasInvalidOllamaAllocation = hasAllocation && allocationTokens === undefined;
31
+ if (hasInvalidOllamaAllocation) {
32
+ params.issues.push(`models.profiles.${params.profileId}.options.num_ctx must be a positive safe integer when configured`);
33
+ return;
34
+ }
35
+ const effectiveTokens = allocationTokens === undefined
36
+ ? declaredTokens
37
+ : Math.min(declaredTokens, allocationTokens);
38
+ const profileFormatReserve = params.profile.context?.formatTokenAccounting?.fixedOverheadTokens ?? 0;
39
+ const defaultFormatReserve = params.defaultContext?.formatTokenAccounting?.fixedOverheadTokens ?? 0;
40
+ const reservedTokens = params.runnerConfig.context.outputReserveTokens +
41
+ params.runnerConfig.context.safetyReserveTokens +
42
+ params.runnerConfig.context.attachmentReserveTokens +
43
+ Math.max(profileFormatReserve, defaultFormatReserve);
44
+ if (!hasInsufficientModelContextCapacity(effectiveTokens, reservedTokens))
45
+ return;
46
+ params.issues.push(`models.profiles.${params.profileId} effective context window ${effectiveTokens} must exceed configured output, safety, attachment, and format reserves ${reservedTokens}`);
47
+ params.capacityIssues.push({
48
+ profileId: params.profileId,
49
+ declaredTokens,
50
+ effectiveTokens,
51
+ reservedTokens,
52
+ minimumTokens: reservedTokens + 1,
53
+ ...(allocationTokens === undefined ? {} : { allocationTokens }),
54
+ });
55
+ }
@@ -1,13 +1,17 @@
1
+ import { type RuntimeModelPluginConfig } from "./model-plugin-config.js";
1
2
  export declare const REQUEST_EXECUTION_POLICY_IDS: readonly ["supervisor-worker-v1", "execution-agent-v1"];
2
3
  export type RequestExecutionPolicyId = (typeof REQUEST_EXECUTION_POLICY_IDS)[number];
3
4
  export declare const DEFAULT_REQUEST_EXECUTION_POLICY_ID: RequestExecutionPolicyId;
4
5
  export type RuntimeModelExecutionPolicy = Readonly<{
5
- policy: RequestExecutionPolicyId;
6
+ policy?: RequestExecutionPolicyId;
7
+ plugins?: RuntimeModelPluginConfig;
6
8
  }>;
7
9
  export type RuntimeModelExecutionPolicies = Readonly<Record<string, RuntimeModelExecutionPolicy>>;
8
10
  export type RequestExecutionPolicySelection = Readonly<{
9
11
  policy: RequestExecutionPolicyId;
10
12
  primaryProfileId?: string;
13
+ plugins?: RuntimeModelPluginConfig;
11
14
  source: "model_profile" | "default";
12
15
  }>;
13
16
  export declare function isRequestExecutionPolicyId(value: unknown): value is RequestExecutionPolicyId;
17
+ export declare function buildRuntimeModelExecutionPolicy(source: Record<string, unknown>): RuntimeModelExecutionPolicy | undefined;
@@ -1,3 +1,5 @@
1
+ import { buildModelPluginConfig, } from "./model-plugin-config.js";
2
+ import { isRecord } from "./utils.js";
1
3
  export const REQUEST_EXECUTION_POLICY_IDS = [
2
4
  "supervisor-worker-v1",
3
5
  "execution-agent-v1",
@@ -6,3 +8,17 @@ export const DEFAULT_REQUEST_EXECUTION_POLICY_ID = "supervisor-worker-v1";
6
8
  export function isRequestExecutionPolicyId(value) {
7
9
  return REQUEST_EXECUTION_POLICY_IDS.some((policyId) => policyId === value);
8
10
  }
11
+ export function buildRuntimeModelExecutionPolicy(source) {
12
+ const execution = isRecord(source.execution) ? source.execution : undefined;
13
+ const configuredPolicy = execution?.policy;
14
+ const policy = isRequestExecutionPolicyId(configuredPolicy)
15
+ ? configuredPolicy
16
+ : undefined;
17
+ const plugins = buildModelPluginConfig(source.plugins);
18
+ if (!policy && !plugins)
19
+ return undefined;
20
+ return {
21
+ ...(policy ? { policy } : {}),
22
+ ...(plugins ? { plugins } : {}),
23
+ };
24
+ }
@@ -0,0 +1,8 @@
1
+ /** Runtime-only restrictions for the canonical request model profile. */
2
+ export type RuntimeModelPluginConfig = Readonly<{
3
+ deny?: readonly string[];
4
+ }>;
5
+ export declare function captureModelPluginConfig(config: RuntimeModelPluginConfig | undefined): RuntimeModelPluginConfig | undefined;
6
+ export declare function buildModelPluginConfig(value: unknown): RuntimeModelPluginConfig | undefined;
7
+ export declare function validateModelPluginConfig(issues: string[], profile: Record<string, unknown>, displayKey: string): void;
8
+ export declare function modelPluginConfigSchema(): Record<string, unknown>;
@@ -0,0 +1,40 @@
1
+ import { readNestedConfigStringArray } from "./utils.js";
2
+ import { validateOptionalObject, validateOptionalStringArray, } from "./validation/runtime-config-field-validation.js";
3
+ export function captureModelPluginConfig(config) {
4
+ const deny = readNestedConfigStringArray(config, "deny");
5
+ if (!deny)
6
+ return undefined;
7
+ return Object.freeze({ deny: Object.freeze(deny.sort()) });
8
+ }
9
+ export function buildModelPluginConfig(value) {
10
+ const deny = readNestedConfigStringArray(value, "deny");
11
+ return captureModelPluginConfig(deny ? { deny } : undefined);
12
+ }
13
+ function isSupportedModelPluginField(key) {
14
+ return key === "deny";
15
+ }
16
+ export function validateModelPluginConfig(issues, profile, displayKey) {
17
+ const plugins = validateOptionalObject(issues, profile, "plugins", `${displayKey}.plugins`);
18
+ if (!plugins)
19
+ return;
20
+ for (const key of Object.keys(plugins)) {
21
+ if (isSupportedModelPluginField(key))
22
+ continue;
23
+ issues.push(`${displayKey}.plugins.${key} is not a supported configuration field`);
24
+ }
25
+ validateOptionalStringArray(issues, plugins, "deny", `${displayKey}.plugins.deny`);
26
+ }
27
+ export function modelPluginConfigSchema() {
28
+ return {
29
+ type: "object",
30
+ description: "Runtime-only restrictions applied to the entire request selected by this model profile. Global plugin restrictions still apply.",
31
+ properties: {
32
+ deny: {
33
+ type: "array",
34
+ items: { type: "string" },
35
+ description: "Denied plugin IDs, capability names, plugin.capability selectors, or *. These restrictions do not depend on per-step model overrides.",
36
+ },
37
+ },
38
+ additionalProperties: false,
39
+ };
40
+ }
@@ -1,3 +1,4 @@
1
+ import { modelPluginConfigSchema } from "./model-plugin-config.js";
1
2
  import { DEFAULT_MEMORY_RECALL_CALL_LIMIT } from "../long-term-memory/recall-policy.js";
2
3
  import { PATH_CONFIG_FIELDS, STRING_CONFIG_FIELDS, TIMEOUT_CONFIG_FIELDS, } from "./fields.js";
3
4
  import { DEFAULT_RUNTIME_LOGGING_ENABLED, DEFAULT_RUNTIME_LOG_ROTATION_CONFIG, } from "./constants.js";
@@ -269,6 +270,7 @@ function pluginsSchema() {
269
270
  default: ["*"],
270
271
  },
271
272
  deny: stringArraySchema("Installed plugin or capability ids denied after applying the allow-list."),
273
+ disabledPluginIds: stringArraySchema("Exact plugin ids disabled independently of tool selectors. Entries are literal ids, not wildcards."),
272
274
  },
273
275
  additionalProperties: false,
274
276
  };
@@ -310,8 +312,9 @@ export function createRuntimeConfigJsonSchema() {
310
312
  },
311
313
  webUi: {
312
314
  type: "object",
313
- description: "Local Web UI startup behavior.",
315
+ description: "Local Web UI behavior.",
314
316
  properties: {
317
+ pageSize: { type: "integer", minimum: 1, default: 20, description: "Sessions and messages per Web UI history page, including SPARK." },
315
318
  openOnRuntimeServiceStart: {
316
319
  type: "boolean",
317
320
  default: false,
@@ -456,6 +459,7 @@ export function createRuntimeConfigJsonSchema() {
456
459
  },
457
460
  generation: modelGenerationSchema(),
458
461
  context: modelContextSchema(),
462
+ plugins: modelPluginConfigSchema(),
459
463
  execution: {
460
464
  type: "object",
461
465
  description: "Runtime-only request execution policy for this model profile. Omission selects supervisor-worker-v1; execution-agent-v1 is an explicit per-profile opt-in. This metadata is not forwarded to the model gateway.",
@@ -1,3 +1,4 @@
1
+ import { validateModelPluginConfig } from "../model-plugin-config.js";
1
2
  import { isRequestExecutionPolicyId, REQUEST_EXECUTION_POLICY_IDS, } from "../model-execution-policy.js";
2
3
  import { hasOwnValue, isRecord } from "../utils.js";
3
4
  import { validateModelContextConfig, validateModelGenerationConfig, } from "./model-invocation-config-validation.js";
@@ -79,6 +80,7 @@ export function validateModelProfileConfig(issues, profile, displayKey, options
79
80
  if (context) {
80
81
  validateModelContextConfig(issues, context, `${displayKey}.context`);
81
82
  }
83
+ validateModelPluginConfig(issues, profile, displayKey);
82
84
  const execution = validateOptionalObject(issues, profile, "execution", `${displayKey}.execution`);
83
85
  if (execution) {
84
86
  validateModelExecutionPolicy(issues, execution, `${displayKey}.execution`);
@@ -1,9 +1,11 @@
1
+ import type { ModelContextCapacityIssue } from "../model-context-capacity.js";
1
2
  export type RuntimeConfigValidationOptions = Readonly<{
2
3
  /** Inspection-only mode. Canonical runtime loading always omits this flag. */
3
4
  allowIncompleteSetup?: boolean;
4
5
  }>;
5
6
  export declare class RuntimeConfigValidationError extends Error {
7
+ readonly capacityIssues: readonly ModelContextCapacityIssue[];
6
8
  readonly configPath: string;
7
9
  readonly issues: string[];
8
- constructor(configPath: string, issues: string[]);
10
+ constructor(configPath: string, issues: string[], capacityIssues?: readonly ModelContextCapacityIssue[]);
9
11
  }
@@ -1,11 +1,13 @@
1
1
  export class RuntimeConfigValidationError extends Error {
2
+ capacityIssues;
2
3
  configPath;
3
4
  issues;
4
- constructor(configPath, issues) {
5
+ constructor(configPath, issues, capacityIssues = []) {
5
6
  super([
6
7
  `Invalid runtime config at ${configPath}:`,
7
8
  ...issues.map((issue) => `- ${issue}`),
8
9
  ].join("\n"));
10
+ this.capacityIssues = capacityIssues;
9
11
  this.name = "RuntimeConfigValidationError";
10
12
  this.configPath = configPath;
11
13
  this.issues = issues;