@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
@@ -15,11 +15,18 @@ export function validatePluginConfig(issues, plugins) {
15
15
  validateOptionalBoolean(issues, plugins, "enabled", "plugins.enabled");
16
16
  validateOptionalStringArray(issues, plugins, "allow", "plugins.allow");
17
17
  validateOptionalStringArray(issues, plugins, "deny", "plugins.deny");
18
+ validateOptionalStringArray(issues, plugins, "disabledPluginIds", "plugins.disabledPluginIds");
19
+ const supportedPluginFields = [
20
+ "enabled",
21
+ "allow",
22
+ "deny",
23
+ "disabledPluginIds",
24
+ ];
18
25
  for (const key of Object.keys(plugins)) {
19
- const isUnsupportedPluginField = key !== "enabled" && key !== "allow" && key !== "deny";
20
- if (isUnsupportedPluginField) {
21
- issues.push(`plugins.${key} is not a supported configuration field`);
22
- }
26
+ const isSupportedPluginField = supportedPluginFields.includes(key);
27
+ if (isSupportedPluginField)
28
+ continue;
29
+ issues.push(`plugins.${key} is not a supported configuration field`);
23
30
  }
24
31
  }
25
32
  function hasInvalidRuntimeTimeout(value) {
@@ -1,10 +1,11 @@
1
- import { validateOptionalBoolean, validateOptionalObject, } from "./runtime-config-field-validation.js";
1
+ import { validateOptionalBoolean, validateOptionalPositiveInteger, validateOptionalObject, } from "./runtime-config-field-validation.js";
2
2
  import { RuntimeConfigValidationError } from "./runtime-config-validation-contract.js";
3
3
  function isUnsupportedWebUiField(key) {
4
- return key !== "openOnRuntimeServiceStart";
4
+ return !["openOnRuntimeServiceStart", "pageSize"].includes(key);
5
5
  }
6
6
  function validateWebUiConfig(issues, webUi) {
7
7
  validateOptionalBoolean(issues, webUi, "openOnRuntimeServiceStart", "webUi.openOnRuntimeServiceStart");
8
+ validateOptionalPositiveInteger(issues, webUi, "pageSize", "webUi.pageSize");
8
9
  for (const key of Object.keys(webUi)) {
9
10
  if (isUnsupportedWebUiField(key)) {
10
11
  issues.push(`webUi.${key} is not a supported configuration field`);
@@ -0,0 +1,5 @@
1
+ import type { RuntimeConfigFile } from "./types.js";
2
+ export declare const DEFAULT_WEB_UI_PAGE_SIZE = 20;
3
+ export declare function buildWebUiConfig(config: RuntimeConfigFile): {
4
+ pageSize: number;
5
+ };
@@ -0,0 +1,5 @@
1
+ export const DEFAULT_WEB_UI_PAGE_SIZE = 20;
2
+ export function buildWebUiConfig(config) {
3
+ const webUi = config.webUi;
4
+ return { pageSize: webUi?.pageSize ?? DEFAULT_WEB_UI_PAGE_SIZE };
5
+ }
@@ -1,4 +1,5 @@
1
1
  import { join } from "node:path";
2
+ import { buildWebUiConfig } from "./config/web-ui.js";
2
3
  import { DEFAULT_RUNTIME_ID, DEFAULT_MODEL_GATEWAY_URL, } from "../shared/constants.js";
3
4
  import { loadDotEnvFile } from "../shared/load-dotenv.js";
4
5
  import { buildFeatureFlags, buildLoggingConfig, buildRuntimeModelConfiguration, buildPluginConfig, compactTimeouts, } from "./config/builders.js";
@@ -155,6 +156,7 @@ export function loadRuntimeConfig(options = {}) {
155
156
  compiledDir,
156
157
  traceFile,
157
158
  },
159
+ webUi: buildWebUiConfig(fileConfig),
158
160
  logging: loggingConfig,
159
161
  ...(timeouts ? { timeouts } : {}),
160
162
  ...(pluginConfig ? { plugins: pluginConfig } : {}),
@@ -124,6 +124,7 @@ export declare function createLocalRuntimeApplication(config?: RuntimeConfig, op
124
124
  operationId: string;
125
125
  contractVersion: number;
126
126
  label: string;
127
+ outputChannels?: import("../capabilities/tool-types.js").ToolNormalInvocationOperation["outputChannels"];
127
128
  pluginName?: string;
128
129
  catalogGroups: readonly import("../capabilities/tool-types.js").ToolCatalogGroup[];
129
130
  toolDescription?: string;
@@ -141,6 +142,7 @@ export declare function createLocalRuntimeApplication(config?: RuntimeConfig, op
141
142
  operationId: string;
142
143
  contractVersion: number;
143
144
  label: string;
145
+ outputChannels?: import("../capabilities/tool-types.js").ToolNormalInvocationOperation["outputChannels"];
144
146
  pluginName?: string;
145
147
  catalogGroups: readonly import("../capabilities/tool-types.js").ToolCatalogGroup[];
146
148
  toolDescription?: string;
@@ -6,7 +6,8 @@ import { LocalRuntimeOwnerActivity } from "./owner-activity.js";
6
6
  import { dispatchLocalLearningCall } from "./app-learning-dispatch.js";
7
7
  import { projectLearningChangedEvent } from "./learning-events.js";
8
8
  import { SavedRequestApprovals } from "./saved-approvals.js";
9
- import { isLocalNativePermissionMethod, LocalNativePermissions } from "./app-native-permissions.js";
9
+ import { isLocalNativePermissionMethod, LocalNativePermissions, } from "./app-native-permissions.js";
10
+ import { steeringInputDiagnosticFields, steeringResultDiagnosticFields, traceLocalRequest, traceLocalRequestFailure, } from "./local-request-diagnostics.js";
10
11
  export async function createLocalRuntimeOwner(config, overrides = {}) {
11
12
  const listeners = new Set();
12
13
  const publish = (event) => {
@@ -31,7 +32,7 @@ export async function createLocalRuntimeOwner(config, overrides = {}) {
31
32
  const unsubscribe = application.subscribeScheduledEvents((event) => {
32
33
  publish({ type: "scheduled.event", event });
33
34
  if (event.type === "completed" || event.type === "failed")
34
- controls.finish(String(event.requestId));
35
+ controls.finish(String(event.requestId), event.type === "completed" ? "scheduled_completed" : "scheduled_failed");
35
36
  });
36
37
  const unsubscribeLearning = application.services.passiveLearning?.subscribe((change) => {
37
38
  const event = projectLearningChangedEvent(change);
@@ -74,9 +75,28 @@ export async function createLocalRuntimeOwner(config, overrides = {}) {
74
75
  }
75
76
  if (method === "request.steer") {
76
77
  const sessionId = controls.activeSessionId(args[0]);
77
- if (sessionId)
78
- await application.services.sessions.assertInteractiveSession?.(sessionId);
79
- return controls.steer(args[0], args[1]);
78
+ const fields = {
79
+ ...steeringInputDiagnosticFields(args[0], args[1]),
80
+ sessionId,
81
+ peerId: peer.id,
82
+ ownerEpoch: savedApprovals.ownerEpoch,
83
+ environmentId: config.runtimeId,
84
+ };
85
+ traceLocalRequest("steer.owner_received", fields);
86
+ try {
87
+ if (sessionId)
88
+ await application.services.sessions.assertInteractiveSession?.(sessionId);
89
+ const result = controls.steer(args[0], args[1]);
90
+ traceLocalRequest("steer.owner_result", {
91
+ ...fields,
92
+ ...steeringResultDiagnosticFields(result),
93
+ });
94
+ return result;
95
+ }
96
+ catch (error) {
97
+ traceLocalRequestFailure("steer.owner_failed", fields, error);
98
+ throw error;
99
+ }
80
100
  }
81
101
  if (method === "request.cancel") {
82
102
  if (await savedApprovals.cancel(args[0], args[1], args[2]))
@@ -136,25 +156,49 @@ async function runPeerRequest(application, controls, activity, savedApprovals, a
136
156
  const message = args[0];
137
157
  if (!message || typeof message.requestId !== "string")
138
158
  throw new Error("local_runtime_request_invalid");
159
+ const diagnosticFields = {
160
+ requestId: message.requestId,
161
+ sessionId: typeof message.sessionId === "string" ? message.sessionId : undefined,
162
+ peerId: peer.id,
163
+ ownerEpoch: savedApprovals.ownerEpoch,
164
+ environmentId: application.services.config.runtimeId,
165
+ };
166
+ traceLocalRequest("run.received", diagnosticFields);
139
167
  if (typeof message.sessionId === "string")
140
168
  await application.services.sessions.assertInteractiveSession?.(message.sessionId);
141
169
  const options = controls.ordinary(message.requestId, peer, (args[1] ?? {}), typeof message.sessionId === "string" ? message.sessionId : "");
142
170
  const durable = args[1]?.durableApprovals === true;
143
171
  if (durable)
144
172
  options.approvalExecution = { activation: savedApprovals.activation() };
173
+ traceLocalRequest("run.control_ready", {
174
+ ...diagnosticFields,
175
+ activationId: options.approvalExecution?.activation.activationId,
176
+ });
145
177
  const socket = {
146
178
  send(data) {
147
179
  controls.send(message.requestId, JSON.parse(data));
148
180
  },
149
181
  };
182
+ let diagnosticStage = "acceptance";
150
183
  try {
151
184
  await peer.callClient("request.accepted", [message.requestId]);
152
185
  activity.assertAcceptingRequests();
186
+ diagnosticStage = "execution";
187
+ traceLocalRequest("run.execution_started", diagnosticFields);
153
188
  const result = await application.requests.handle(socket, message, options);
189
+ traceLocalRequest("run.handler_settled", {
190
+ ...diagnosticFields,
191
+ awaitingApproval: result?.kind === "awaiting_approval",
192
+ });
193
+ diagnosticStage = "delivery_drain";
154
194
  await controls.drain(message.requestId);
155
195
  return result;
156
196
  }
197
+ catch (error) {
198
+ traceLocalRequestFailure("run.failed", { ...diagnosticFields, stage: diagnosticStage }, error);
199
+ throw error;
200
+ }
157
201
  finally {
158
- controls.finish(message.requestId);
202
+ controls.finish(message.requestId, "ordinary_handler_finally");
159
203
  }
160
204
  }
@@ -4,6 +4,7 @@ import { type RequestCancellationResult } from "../request/cancellation.js";
4
4
  import { type RequestSteeringUpdate } from "../request/request-steering.js";
5
5
  import type { SchedulerRun } from "../scheduler/contracts.js";
6
6
  import type { LocalRuntimePeer } from "./contracts.js";
7
+ import { type LocalRequestFinishSource } from "./local-request-diagnostics.js";
7
8
  import type { LocalPendingToolApproval, LocalToolApprovalDecisionResult } from "./request-approval-contracts.js";
8
9
  export type LocalRequestRunOptions = {
9
10
  approvalAvailable?: boolean;
@@ -22,12 +23,13 @@ export declare class LocalRequestControls {
22
23
  scheduled(run: SchedulerRun): RuntimeRequestOptions;
23
24
  steer(requestId: unknown, update: unknown): unknown;
24
25
  activeSessionId(requestId: unknown): string | undefined;
25
- finish(requestId: string): void;
26
+ finish(requestId: string, source?: LocalRequestFinishSource): void;
26
27
  cancel(requestId: unknown, sessionId: unknown, wait?: unknown): RequestCancellationResult;
27
28
  private matchesResumedWaitCancellation;
28
29
  private claimFinalization;
29
30
  stop(): void;
30
31
  private open;
32
+ private diagnosticFields;
31
33
  hasActiveRequest(requestId: unknown, sessionId: unknown): boolean;
32
34
  listApprovals(sessionId?: unknown): LocalPendingToolApproval[];
33
35
  decideApproval(input: unknown, peer: LocalRuntimePeer): LocalToolApprovalDecisionResult;
@@ -3,6 +3,8 @@ import { createRequestCancellationError, } from "../request/cancellation.js";
3
3
  import { createRequestSteeringInbox, } from "../request/request-steering.js";
4
4
  import { hasApprovalDecisionIdentity, LocalRequestApprovals, } from "./app-request-approvals.js";
5
5
  import { LocalRequestDelivery } from "./app-request-delivery.js";
6
+ import { createRequestControlDiagnosticId } from "../observability/request-control-diagnostics.js";
7
+ import { steeringInputDiagnosticFields, steeringResultDiagnosticFields, traceLocalRequest, } from "./local-request-diagnostics.js";
6
8
  export class LocalRequestControls {
7
9
  publish;
8
10
  active = new Map();
@@ -31,16 +33,23 @@ export class LocalRequestControls {
31
33
  }
32
34
  }
33
35
  catch (error) {
34
- this.finish(requestId);
36
+ this.finish(requestId, "initial_steering_rejected");
35
37
  throw error;
36
38
  }
37
39
  const control = this.active.get(requestId);
38
40
  control.resumedWait = resumedWait;
39
41
  control.peer = peer;
40
42
  control.delivery.attach(peer);
43
+ traceLocalRequest("control.attached", {
44
+ ...this.diagnosticFields(requestId, control),
45
+ peerId: peer.id,
46
+ generation: resumedWait?.generation,
47
+ waitId: resumedWait?.waitId,
48
+ revision: resumedWait?.revision,
49
+ });
41
50
  return {
42
51
  abortSignal: control.abort.signal,
43
- claimFinalization: () => this.claimFinalization(control),
52
+ claimFinalization: () => this.claimFinalization(requestId, control),
44
53
  requestSteering: steering,
45
54
  ...(options.approvalAvailable
46
55
  ? { toolApprovalController: this.approvals(requestId, control) }
@@ -54,7 +63,7 @@ export class LocalRequestControls {
54
63
  const peer = this.controlPeers.values().next().value;
55
64
  return {
56
65
  abortSignal: control.abort.signal,
57
- claimFinalization: () => this.claimFinalization(control),
66
+ claimFinalization: () => this.claimFinalization(run.requestId, control),
58
67
  requestSteering: steering,
59
68
  ...(peer
60
69
  ? { toolApprovalController: this.approvals(run.requestId, control) }
@@ -62,29 +71,70 @@ export class LocalRequestControls {
62
71
  };
63
72
  }
64
73
  steer(requestId, update) {
65
- if (typeof requestId !== "string")
74
+ const inputFields = steeringInputDiagnosticFields(requestId, update);
75
+ if (typeof requestId !== "string") {
76
+ traceLocalRequest("steer.rejected", {
77
+ ...inputFields,
78
+ diagnosticReason: "invalid_request_id",
79
+ reason: "request_not_active",
80
+ });
66
81
  return { ok: false, reason: "request_not_active" };
82
+ }
67
83
  const control = this.active.get(requestId);
68
- if (!control || control.abort.signal.aborted)
84
+ const fields = {
85
+ ...inputFields,
86
+ ...this.diagnosticFields(requestId, control),
87
+ };
88
+ if (!control || control.abort.signal.aborted) {
89
+ traceLocalRequest("steer.rejected", {
90
+ ...fields,
91
+ diagnosticReason: control ? "control_aborted" : "control_missing",
92
+ reason: "request_not_active",
93
+ });
69
94
  return { ok: false, reason: "request_not_active" };
70
- if (!update || typeof update !== "object")
95
+ }
96
+ if (!update || typeof update !== "object") {
97
+ traceLocalRequest("steer.rejected", {
98
+ ...fields,
99
+ diagnosticReason: "invalid_update_shape",
100
+ reason: "invalid_steer_request",
101
+ });
71
102
  return { ok: false, reason: "invalid_steer_request" };
103
+ }
72
104
  const input = update;
73
- if (typeof input.steerId !== "string" || typeof input.text !== "string")
105
+ if (typeof input.steerId !== "string" || typeof input.text !== "string") {
106
+ traceLocalRequest("steer.rejected", {
107
+ ...fields,
108
+ diagnosticReason: "invalid_update_shape",
109
+ reason: "invalid_steer_request",
110
+ });
74
111
  return { ok: false, reason: "invalid_steer_request" };
75
- return control.steering.append({
112
+ }
113
+ const result = control.steering.append({
76
114
  steerId: input.steerId,
77
115
  text: input.text,
78
116
  });
117
+ traceLocalRequest("steer.result", {
118
+ ...fields,
119
+ diagnosticReason: "inbox_result",
120
+ ...steeringResultDiagnosticFields(result),
121
+ });
122
+ return result;
79
123
  }
80
124
  activeSessionId(requestId) {
81
125
  return typeof requestId === "string"
82
126
  ? this.active.get(requestId)?.sessionId
83
127
  : undefined;
84
128
  }
85
- finish(requestId) {
129
+ finish(requestId, source = "unspecified") {
86
130
  const entry = this.active.get(requestId);
87
131
  this.active.delete(requestId);
132
+ traceLocalRequest("control.finished", {
133
+ ...this.diagnosticFields(requestId, entry),
134
+ controlPresent: false,
135
+ removed: Boolean(entry),
136
+ source,
137
+ });
88
138
  this.pendingApprovals.cancel(requestId);
89
139
  entry?.delivery.finish();
90
140
  void entry?.steering.close();
@@ -102,6 +152,7 @@ export class LocalRequestControls {
102
152
  if (!this.matchesResumedWaitCancellation(control, wait))
103
153
  return { accepted: false, reason: "request_not_active" };
104
154
  control.abort.abort(createRequestCancellationError());
155
+ traceLocalRequest("cancel.accepted", this.diagnosticFields(String(requestId), control));
105
156
  return { accepted: true };
106
157
  }
107
158
  matchesResumedWaitCancellation(control, input) {
@@ -121,16 +172,18 @@ export class LocalRequestControls {
121
172
  return false;
122
173
  return command.revision === wait.revision;
123
174
  }
124
- claimFinalization(control) {
175
+ claimFinalization(requestId, control) {
125
176
  // In-flight requests retain this exact control until canonical finalization.
126
177
  control.abort.signal.throwIfAborted();
127
178
  control.finalizing = true;
179
+ traceLocalRequest("finalization.claimed", this.diagnosticFields(requestId, control));
128
180
  }
129
181
  stop() {
130
182
  this.stopped = true;
131
183
  this.controlPeers.clear();
132
184
  for (const [requestId, control] of this.active) {
133
185
  control.abort.abort(createRequestInterruptionError());
186
+ traceLocalRequest("control.interrupted", this.diagnosticFields(requestId, control));
134
187
  }
135
188
  // Accepted requests retain their controls and inboxes until finalization.
136
189
  }
@@ -139,8 +192,13 @@ export class LocalRequestControls {
139
192
  throw new Error("local_runtime_owner_stopped");
140
193
  if (!requestId || this.active.has(requestId))
141
194
  throw new Error("local_runtime_request_already_active");
142
- const steering = createRequestSteeringInbox({ requestId });
195
+ const inboxId = createRequestControlDiagnosticId("owner_inbox");
196
+ const steering = createRequestSteeringInbox({
197
+ requestId,
198
+ diagnostics: { inboxId, origin: "local_owner" },
199
+ });
143
200
  this.active.set(requestId, {
201
+ inboxId,
144
202
  steering,
145
203
  sessionId,
146
204
  abort: new AbortController(),
@@ -148,8 +206,30 @@ export class LocalRequestControls {
148
206
  delivery: new LocalRequestDelivery(requestId),
149
207
  ...(run ? { run } : {}),
150
208
  });
209
+ traceLocalRequest("control.opened", {
210
+ requestId,
211
+ sessionId,
212
+ inboxId,
213
+ scheduled: Boolean(run),
214
+ activeControlCount: this.active.size,
215
+ });
151
216
  return steering;
152
217
  }
218
+ diagnosticFields(requestId, control) {
219
+ return {
220
+ requestId,
221
+ sessionId: control?.sessionId,
222
+ inboxId: control?.inboxId,
223
+ controlPresent: Boolean(control),
224
+ aborted: control?.abort.signal.aborted,
225
+ finalizing: control?.finalizing,
226
+ ownerStopped: this.stopped,
227
+ activeControlCount: this.active.size,
228
+ generation: control?.resumedWait?.generation,
229
+ waitId: control?.resumedWait?.waitId,
230
+ revision: control?.resumedWait?.revision,
231
+ };
232
+ }
153
233
  hasActiveRequest(requestId, sessionId) {
154
234
  if (typeof requestId !== "string")
155
235
  return false;
@@ -1,3 +1,4 @@
1
+ import { steeringInputDiagnosticFields, steeringResultDiagnosticFields, traceLocalRequest, traceLocalRequestFailure, } from "./local-request-diagnostics.js";
1
2
  import { PendingClientRequest, hasLiveApprovalAttachment, hasApprovalEndedBeforeAttachment, isApprovalTransportLoss, shouldRetainDetachedRequest, } from "./pending-client-request.js";
2
3
  /** Client projections only. The owner validates and commits every steering update. */
3
4
  export class LocalRuntimeClientRequests {
@@ -55,11 +56,37 @@ export class LocalRuntimeClientRequests {
55
56
  return outcome;
56
57
  },
57
58
  steer: async (requestId, input) => {
58
- await this.active.get(requestId)?.accepted;
59
- return (await this.call("request.steer", [
60
- requestId,
61
- input,
62
- ]));
59
+ const state = this.active.get(requestId);
60
+ const fields = {
61
+ ...steeringInputDiagnosticFields(requestId, input),
62
+ sessionId: state?.sessionId,
63
+ clientStatePresentAtEntry: Boolean(state),
64
+ detachedAtEntry: state?.detached,
65
+ };
66
+ traceLocalRequest("steer.client_requested", fields);
67
+ await state?.accepted;
68
+ const current = this.active.get(requestId);
69
+ const dispatchFields = {
70
+ ...fields,
71
+ clientStatePresentAtDispatch: Boolean(current),
72
+ clientStateUnchanged: current === state,
73
+ };
74
+ traceLocalRequest("steer.client_dispatch_attempted", dispatchFields);
75
+ try {
76
+ const result = (await this.call("request.steer", [
77
+ requestId,
78
+ input,
79
+ ]));
80
+ traceLocalRequest("steer.client_result", {
81
+ ...dispatchFields,
82
+ ...steeringResultDiagnosticFields(result),
83
+ });
84
+ return result;
85
+ }
86
+ catch (error) {
87
+ traceLocalRequestFailure("steer.client_failed", dispatchFields, error);
88
+ throw error;
89
+ }
63
90
  },
64
91
  };
65
92
  approvals = {
@@ -119,6 +119,7 @@ export declare function createLocalServiceClients(call: LocalRuntimeCallHandler)
119
119
  operationId: string;
120
120
  contractVersion: number;
121
121
  label: string;
122
+ outputChannels?: import("../../capabilities/tool-types.js").ToolNormalInvocationOperation["outputChannels"];
122
123
  pluginName?: string;
123
124
  catalogGroups: readonly import("../../capabilities/tool-types.js").ToolCatalogGroup[];
124
125
  toolDescription?: string;
@@ -136,6 +137,7 @@ export declare function createLocalServiceClients(call: LocalRuntimeCallHandler)
136
137
  operationId: string;
137
138
  contractVersion: number;
138
139
  label: string;
140
+ outputChannels?: import("../../capabilities/tool-types.js").ToolNormalInvocationOperation["outputChannels"];
139
141
  pluginName?: string;
140
142
  catalogGroups: readonly import("../../capabilities/tool-types.js").ToolCatalogGroup[];
141
143
  toolDescription?: string;
@@ -0,0 +1,9 @@
1
+ import type { RequestSteeringAppendResult } from "../request/request-steering.js";
2
+ import { type RequestControlDiagnosticFields } from "../observability/request-control-diagnostics.js";
3
+ export type LocalRequestDiagnosticFields = RequestControlDiagnosticFields;
4
+ export type LocalRequestFinishSource = "unspecified" | "initial_steering_rejected" | "ordinary_handler_finally" | "resumed_handler_finally" | "scheduled_completed" | "scheduled_failed";
5
+ /** Unknown transport values are observed without invoking user-supplied getters. */
6
+ export declare function steeringInputDiagnosticFields(requestId: unknown, input: unknown): LocalRequestDiagnosticFields;
7
+ export declare function steeringResultDiagnosticFields(result: RequestSteeringAppendResult): LocalRequestDiagnosticFields;
8
+ export declare function traceLocalRequest(event: string, fields: LocalRequestDiagnosticFields): void;
9
+ export declare function traceLocalRequestFailure(event: string, fields: LocalRequestDiagnosticFields, error: unknown): void;
@@ -0,0 +1,47 @@
1
+ import { diagnosticErrorType, traceRequestControl, } from "../observability/request-control-diagnostics.js";
2
+ /** Unknown transport values are observed without invoking user-supplied getters. */
3
+ export function steeringInputDiagnosticFields(requestId, input) {
4
+ const fields = {
5
+ requestId: typeof requestId === "string" ? requestId : undefined,
6
+ requestIdType: typeof requestId,
7
+ };
8
+ try {
9
+ if (!input || typeof input !== "object")
10
+ return fields;
11
+ const steerId = Object.getOwnPropertyDescriptor(input, "steerId")?.value;
12
+ const text = Object.getOwnPropertyDescriptor(input, "text")?.value;
13
+ return {
14
+ ...fields,
15
+ steerId: typeof steerId === "string" ? steerId : undefined,
16
+ textLength: typeof text === "string" ? text.length : undefined,
17
+ };
18
+ }
19
+ catch {
20
+ // An uninspectable diagnostic value must not change transport validation.
21
+ }
22
+ return fields;
23
+ }
24
+ export function steeringResultDiagnosticFields(result) {
25
+ try {
26
+ if (result.ok) {
27
+ return {
28
+ accepted: true,
29
+ duplicate: result.duplicate,
30
+ acceptedSequence: result.update.sequence,
31
+ };
32
+ }
33
+ return { accepted: false, reason: result.reason };
34
+ }
35
+ catch {
36
+ return { resultInspectable: false };
37
+ }
38
+ }
39
+ export function traceLocalRequest(event, fields) {
40
+ traceRequestControl("runtime.local_request_control", event, fields);
41
+ }
42
+ export function traceLocalRequestFailure(event, fields, error) {
43
+ traceLocalRequest(event, {
44
+ ...fields,
45
+ errorType: diagnosticErrorType(error),
46
+ });
47
+ }
@@ -3,6 +3,7 @@ import { REQUEST_APPROVAL_SNAPSHOT, } from "../request/approval-wait/snapshot.js
3
3
  import { validateApprovalResume } from "../request/approval-wait/preflight.js";
4
4
  import { hasApprovalDecisionIdentity } from "./app-request-approvals.js";
5
5
  import { traceDebug } from "../observability/debug-logger.js";
6
+ import { traceLocalRequest, traceLocalRequestFailure, } from "./local-request-diagnostics.js";
6
7
  function hasDurableIdentity(input) {
7
8
  return (typeof input.generation === "string" &&
8
9
  input.generation.length > 0 &&
@@ -250,6 +251,18 @@ export class SavedRequestApprovals {
250
251
  }
251
252
  async resume(snapshot, current, consumedWait, peer) {
252
253
  const { requestId, sessionId } = current;
254
+ const diagnosticFields = {
255
+ requestId,
256
+ sessionId,
257
+ ownerEpoch: current.activation?.ownerEpoch,
258
+ environmentId: this.application.services.config.runtimeId,
259
+ activationId: current.activation?.activationId,
260
+ generation: consumedWait.generation,
261
+ waitId: consumedWait.waitId,
262
+ revision: consumedWait.revision,
263
+ peerId: peer.id,
264
+ };
265
+ traceLocalRequest("run.resume_attempted", diagnosticFields);
253
266
  const options = this.controls.ordinary(requestId, peer, { approvalAvailable: true }, sessionId, consumedWait);
254
267
  const decisions = snapshot.runner.preparedGroup.entries.flatMap((entry) => {
255
268
  // The consumed wait has been removed; exact approval IDs bind its saved actions.
@@ -273,7 +286,7 @@ export class SavedRequestApprovals {
273
286
  send: (data) => this.emit([JSON.parse(data)], sessionId),
274
287
  };
275
288
  try {
276
- await this.application.requests.handle(ws, {
289
+ const outcome = await this.application.requests.handle(ws, {
277
290
  type: "run_request",
278
291
  requestId,
279
292
  sessionId,
@@ -288,9 +301,17 @@ export class SavedRequestApprovals {
288
301
  resume: { snapshot, current, decisions },
289
302
  },
290
303
  });
304
+ traceLocalRequest("run.resumed_handler_settled", {
305
+ ...diagnosticFields,
306
+ awaitingApproval: outcome?.kind === "awaiting_approval",
307
+ });
308
+ }
309
+ catch (error) {
310
+ traceLocalRequestFailure("run.resumed_failed", diagnosticFields, error);
311
+ throw error;
291
312
  }
292
313
  finally {
293
- this.controls.finish(requestId);
314
+ this.controls.finish(requestId, "resumed_handler_finally");
294
315
  }
295
316
  }
296
317
  emit(events, sessionId) {
@@ -1,3 +1,4 @@
1
+ import { captureModelPluginConfig } from "../config/model-plugin-config.js";
1
2
  import { resolveAgentMode } from "../../shared/agent.js";
2
3
  import { resolveProfileCandidate } from "../../shared/invocation-profile-selection.js";
3
4
  import { DEFAULT_REQUEST_EXECUTION_POLICY_ID, } from "../config/model-execution-policy.js";
@@ -43,10 +44,12 @@ function resolveRequestExecutionPolicy(params) {
43
44
  const configuredExecution = primary
44
45
  ? params.modelExecutionPolicies?.[primary.profileId]
45
46
  : undefined;
47
+ const plugins = captureModelPluginConfig(configuredExecution?.plugins);
46
48
  return Object.freeze({
47
49
  policy: configuredExecution?.policy ?? DEFAULT_REQUEST_EXECUTION_POLICY_ID,
48
50
  ...(primary ? { primaryProfileId: primary.profileId } : {}),
49
- source: configuredExecution ? "model_profile" : "default",
51
+ ...(plugins ? { plugins } : {}),
52
+ source: configuredExecution?.policy ? "model_profile" : "default",
50
53
  });
51
54
  }
52
55
  export function resolveModelSelection(params) {
@@ -0,0 +1,6 @@
1
+ export { classifyRuntimeErrorType as diagnosticErrorType } from "./error-type.js";
2
+ export type RequestControlDiagnosticFields = Readonly<Record<string, string | number | boolean | null | undefined>>;
3
+ /** Diagnostic identity only; never used for request admission or ownership. */
4
+ export declare function createRequestControlDiagnosticId(prefix: string): string;
5
+ /** Best-effort, content-free diagnostics must never change a control result. */
6
+ export declare function traceRequestControl(scope: string, event: string, fields?: RequestControlDiagnosticFields): void;