@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
@@ -0,0 +1,90 @@
1
+ import { readFile, readdir, rm, stat } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ export const DEFAULT_SYSTEM_OUTPUT_RETENTION_MS = 7 * 24 * 60 * 60_000;
4
+ export const activeSystemCaptures = new Set();
5
+ const jobs = new Map();
6
+ const CAPTURE_ID = /^[0-9a-f]{8}(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/;
7
+ export async function cleanupSystemOutput(root, retentionMs) {
8
+ const entries = await readdir(root, { withFileTypes: true }).catch((error) => {
9
+ if (error.code === "ENOENT")
10
+ return [];
11
+ throw error;
12
+ });
13
+ let removed = 0;
14
+ for (const entry of entries) {
15
+ if (!entry.isDirectory() || !CAPTURE_ID.test(entry.name))
16
+ continue;
17
+ const directory = join(root, entry.name);
18
+ if (activeSystemCaptures.has(directory))
19
+ continue;
20
+ const files = await readdir(directory);
21
+ const times = await Promise.all(files.map(async (file) => (await stat(join(directory, file))).mtimeMs));
22
+ const completedAt = Math.max((await stat(directory)).mtimeMs, ...times);
23
+ const captureRetentionMs = await readCaptureRetention(directory, entry.name, retentionMs);
24
+ if (Date.now() - completedAt < captureRetentionMs)
25
+ continue;
26
+ if (activeSystemCaptures.has(directory))
27
+ continue;
28
+ await rm(directory, { recursive: true });
29
+ removed += 1;
30
+ }
31
+ return removed;
32
+ }
33
+ /** Completed captures keep the policy recorded by their producer across reconnects. */
34
+ async function readCaptureRetention(directory, id, fallbackMs) {
35
+ let receipt;
36
+ try {
37
+ receipt = JSON.parse(await readFile(join(directory, "receipt.json"), "utf8"));
38
+ }
39
+ catch (error) {
40
+ if (error.code === "ENOENT")
41
+ return fallbackMs;
42
+ if (error instanceof SyntaxError)
43
+ return fallbackMs;
44
+ throw error;
45
+ }
46
+ if (receipt === null || typeof receipt !== "object")
47
+ return fallbackMs;
48
+ if (!("kind" in receipt) || receipt.kind !== "system_command_output_v1")
49
+ return fallbackMs;
50
+ if (!("id" in receipt) || receipt.id !== id)
51
+ return fallbackMs;
52
+ if (!("retentionMs" in receipt) || typeof receipt.retentionMs !== "number")
53
+ return fallbackMs;
54
+ if (!Number.isSafeInteger(receipt.retentionMs) || receipt.retentionMs < 1)
55
+ return fallbackMs;
56
+ return receipt.retentionMs;
57
+ }
58
+ /** One cleanup job per storage root; the supplied policy also covers incomplete captures. */
59
+ export function scheduleSystemOutputCleanup(root, retentionMs) {
60
+ const previous = jobs.get(root);
61
+ if (previous) {
62
+ previous.retentionMs = retentionMs;
63
+ previous.requested = true;
64
+ return;
65
+ }
66
+ const job = { retentionMs, requested: false };
67
+ jobs.set(root, job);
68
+ const sweep = async () => {
69
+ job.requested = false;
70
+ let empty = false;
71
+ try {
72
+ await cleanupSystemOutput(root, job.retentionMs);
73
+ empty = (await readdir(root).catch((error) => {
74
+ if (error.code === "ENOENT")
75
+ return [];
76
+ throw error;
77
+ })).length === 0;
78
+ }
79
+ catch {
80
+ process.emitWarning("SYSTEM output cleanup failed; retained output was not confirmed removed.", { code: "SYSTEM_OUTPUT_CLEANUP_FAILED" });
81
+ }
82
+ if (empty && !job.requested) {
83
+ jobs.delete(root);
84
+ return;
85
+ }
86
+ const timer = setTimeout(() => { void sweep(); }, Math.max(1, Math.min(job.retentionMs, 60 * 60_000)));
87
+ timer.unref();
88
+ };
89
+ void sweep();
90
+ }
@@ -0,0 +1,7 @@
1
+ import type { ToolExecutionContext, ToolImplementationOutput } from "../plugin-sdk/index.js";
2
+ import type { SystemProcessResult, SystemProcessRunner, SystemTarget } from "./contracts.js";
3
+ /** Allocated per command; probes and companion calls retain their existing runner. */
4
+ export type SystemCommandOutputFactory = (context?: ToolExecutionContext) => Readonly<{
5
+ run: SystemProcessRunner;
6
+ present(target: SystemTarget, result: SystemProcessResult): Promise<ToolImplementationOutput>;
7
+ }>;
@@ -0,0 +1 @@
1
+ export {};
@@ -3,5 +3,6 @@ export declare function executeSystemCommand(input: {
3
3
  target: SystemTarget;
4
4
  params: Record<string, unknown>;
5
5
  run: SystemProcessRunner;
6
+ runCommand?: SystemProcessRunner;
6
7
  abortSignal?: AbortSignal;
7
8
  }): Promise<SystemProcessResult>;
@@ -32,7 +32,7 @@ export async function executeSystemCommand(input) {
32
32
  const plan = params.elevated === true
33
33
  ? await elevatedSystemCommand({ target, command, cwd, run })
34
34
  : unprivilegedSystemCommand(target, command, cwd);
35
- return run({
35
+ return (input.runCommand ?? run)({
36
36
  ...plan,
37
37
  timeoutMs,
38
38
  ...(input.abortSignal ? { abortSignal: input.abortSignal } : {}),
@@ -0,0 +1,12 @@
1
+ export declare const SYSTEM_OUTPUT_CAPABILITY = "system_command_output_v1";
2
+ /** Base64 plus receipts stay below both Companion and broker message limits. */
3
+ export declare const SYSTEM_OUTPUT_CHUNK_BYTES: number;
4
+ export type SystemOutputTransfer = Readonly<{
5
+ kind: typeof SYSTEM_OUTPUT_CAPABILITY;
6
+ id: string;
7
+ stdoutBytes: number;
8
+ stderrBytes: number;
9
+ stdoutSha256: string;
10
+ stderrSha256: string;
11
+ }>;
12
+ export declare function readSystemOutputTransfer(value: unknown): SystemOutputTransfer;
@@ -0,0 +1,28 @@
1
+ import { isHostIdentifier, isHostRecord } from "./protocol.js";
2
+ export const SYSTEM_OUTPUT_CAPABILITY = "system_command_output_v1";
3
+ /** Base64 plus receipts stay below both Companion and broker message limits. */
4
+ export const SYSTEM_OUTPUT_CHUNK_BYTES = 64 * 1024;
5
+ function isStreamByteCount(value) {
6
+ return typeof value === "number" && Number.isSafeInteger(value) && value >= 0;
7
+ }
8
+ function isStreamDigest(value) {
9
+ return typeof value === "string" && /^[a-f0-9]{64}$/.test(value);
10
+ }
11
+ export function readSystemOutputTransfer(value) {
12
+ if (!isHostRecord(value))
13
+ throw new Error("system_output_receipt_invalid");
14
+ if (value.kind !== SYSTEM_OUTPUT_CAPABILITY)
15
+ throw new Error("system_output_receipt_invalid");
16
+ if (!isHostIdentifier(value.id))
17
+ throw new Error("system_output_receipt_invalid");
18
+ if (!isStreamByteCount(value.stdoutBytes))
19
+ throw new Error("system_output_receipt_invalid");
20
+ if (!isStreamByteCount(value.stderrBytes))
21
+ throw new Error("system_output_receipt_invalid");
22
+ if (!isStreamDigest(value.stdoutSha256))
23
+ throw new Error("system_output_receipt_invalid");
24
+ if (!isStreamDigest(value.stderrSha256))
25
+ throw new Error("system_output_receipt_invalid");
26
+ return { kind: SYSTEM_OUTPUT_CAPABILITY, id: value.id, stdoutBytes: value.stdoutBytes,
27
+ stderrBytes: value.stderrBytes, stdoutSha256: value.stdoutSha256, stderrSha256: value.stderrSha256 };
28
+ }
@@ -0,0 +1,13 @@
1
+ import { type ToolImplementation } from "../../plugin-sdk/index.js";
2
+ /** References belong to this authenticated connection; no arbitrary file access. */
3
+ export declare class CompanionCommandOutput {
4
+ private readonly stateDir;
5
+ private readonly captures;
6
+ private closed;
7
+ constructor(stateDir: string);
8
+ hasTransfers(): boolean;
9
+ close(): void;
10
+ handlers(): Record<string, ToolImplementation>;
11
+ private command;
12
+ private read;
13
+ }
@@ -0,0 +1,110 @@
1
+ import { join } from "node:path";
2
+ import { failureResult, readBoundedInteger, successResult } from "../../plugin-sdk/index.js";
3
+ import { createSystemHandlers } from "../handlers.js";
4
+ import { createSystemOutputCapture } from "../command-output-capture.js";
5
+ import { DEFAULT_SYSTEM_OUTPUT_RETENTION_MS, scheduleSystemOutputCleanup } from "../command-output-retention.js";
6
+ import { runSystemProcess } from "../process-runner.js";
7
+ import { buildSystemProcessResult } from "../process-result.js";
8
+ import { isHostIdentifier } from "./protocol.js";
9
+ import { SYSTEM_OUTPUT_CAPABILITY, SYSTEM_OUTPUT_CHUNK_BYTES, readSystemOutputTransfer } from "./command-output-protocol.js";
10
+ /** References belong to this authenticated connection; no arbitrary file access. */
11
+ export class CompanionCommandOutput {
12
+ stateDir;
13
+ captures = new Map();
14
+ closed = false;
15
+ constructor(stateDir) {
16
+ this.stateDir = stateDir;
17
+ scheduleSystemOutputCleanup(join(stateDir, "command-output"), DEFAULT_SYSTEM_OUTPUT_RETENTION_MS);
18
+ }
19
+ hasTransfers() { return this.captures.size > 0; }
20
+ close() {
21
+ this.closed = true;
22
+ for (const capture of this.captures.values())
23
+ capture.release();
24
+ this.captures.clear();
25
+ }
26
+ handlers() {
27
+ return {
28
+ system_command_capture: (params, context) => this.command(params, context),
29
+ system_command_output: async (params) => {
30
+ try {
31
+ return await this.read(params);
32
+ }
33
+ catch {
34
+ return failureResult({ errorCode: "system_output_unavailable", message: "Retained command output is unavailable in this connection. The command was not replayed." });
35
+ }
36
+ },
37
+ system_command_output_close: async (params) => {
38
+ if (!isHostIdentifier(params.captureId))
39
+ return failureResult({ errorCode: "system_output_reference_invalid", message: "Invalid output reference." });
40
+ this.captures.get(params.captureId)?.release();
41
+ this.captures.delete(params.captureId);
42
+ return successResult({ output: "Output transfer closed; disk retention remains in effect." });
43
+ },
44
+ };
45
+ }
46
+ async command(params, context) {
47
+ if (this.closed)
48
+ return failureResult({ errorCode: "system_output_closed", message: "The connection closed before dispatch." });
49
+ const retentionMs = readBoundedInteger(params.outputRetentionMs, {
50
+ name: "outputRetentionMs", defaultValue: DEFAULT_SYSTEM_OUTPUT_RETENTION_MS,
51
+ minimum: 1, maximum: Number.MAX_SAFE_INTEGER,
52
+ });
53
+ let captured;
54
+ const handlers = createSystemHandlers(undefined, undefined, () => ({
55
+ run: async (input) => {
56
+ if (input.abortSignal?.aborted)
57
+ return runSystemProcess(input);
58
+ captured = await createSystemOutputCapture(join(this.stateDir, "command-output"), retentionMs);
59
+ captured.retain();
60
+ try {
61
+ const result = await runSystemProcess(input, captured.capture);
62
+ await captured.finish(result, false);
63
+ return { ...result, outputTruncated: Boolean(captured.failure) };
64
+ }
65
+ catch (error) {
66
+ await captured.finish(undefined, false);
67
+ captured.release();
68
+ throw error;
69
+ }
70
+ },
71
+ present: async (target, result) => {
72
+ const receipt = buildSystemProcessResult(target, result, "command_process_completion");
73
+ if (!captured?.receipt)
74
+ return receipt;
75
+ const data = { ...receipt.data, outputCapture: captured.receipt };
76
+ if (captured.failure) {
77
+ captured.release();
78
+ return failureResult({ errorCode: "system_output_storage_failed", message: "Command output storage failed after dispatch; inspect the process receipt before another action.",
79
+ data: { ...data, storageFailure: captured.failure }, ...(result.exitCode !== null ? { exitCode: result.exitCode } : {}) });
80
+ }
81
+ if (this.closed || context?.abortSignal?.aborted) {
82
+ captured.release();
83
+ return { ...receipt, data };
84
+ }
85
+ const transfer = readSystemOutputTransfer({ kind: SYSTEM_OUTPUT_CAPABILITY, ...captured.receipt });
86
+ this.captures.set(transfer.id, captured);
87
+ return { ...receipt, output: receipt.output.split("\nSTDOUT excerpt:")[0] + "\nSTDOUT excerpt:\nStreams retained for exact transfer.",
88
+ data: { ...data, outputTransfer: transfer } };
89
+ },
90
+ }));
91
+ const { outputRetentionMs: _retention, ...command } = params;
92
+ return handlers.system_command(command, context);
93
+ }
94
+ async read(params) {
95
+ if (!isHostIdentifier(params.captureId))
96
+ throw new Error("system_output_reference_invalid");
97
+ const capture = this.captures.get(params.captureId);
98
+ if (!capture?.receipt)
99
+ throw new Error("system_output_reference_unknown");
100
+ if (params.stream !== "stdout" && params.stream !== "stderr")
101
+ throw new Error("system_output_stream_invalid");
102
+ const stream = params.stream;
103
+ const size = stream === "stdout" ? capture.receipt.stdoutBytes : capture.receipt.stderrBytes;
104
+ const offset = readBoundedInteger(params.offset, { name: "offset", minimum: 0, maximum: size });
105
+ const bytes = await capture.read(stream, offset, Math.min(SYSTEM_OUTPUT_CHUNK_BYTES, size - offset));
106
+ return successResult({ output: "Private command-output chunk.", data: {
107
+ captureId: params.captureId, stream, offset, bytes: bytes.toString("base64"),
108
+ } });
109
+ }
110
+ }
@@ -0,0 +1,7 @@
1
+ import type { NativeAutostartOptions } from "./autostart.js";
2
+ export declare function renderMacInstallLinkHandler(options: NativeAutostartOptions): string;
3
+ export declare const MAC_INSTALL_LINK_BUNDLE_ID = "com.abot.install-links";
4
+ export declare const MAC_INSTALL_LINK_HANDLER_QUERY_SCRIPT = "ObjC.import('CoreServices');\nfunction run(argv) {\n var handler = ObjC.castRefToObject($.LSCopyDefaultHandlerForURLScheme($(argv[0])));\n if (handler.isNil()) return '';\n return ObjC.unwrap(handler);\n}\n";
5
+ export declare function requireAvailableMacInstallScheme(): Promise<void>;
6
+ /** Preserve the executable and scripting metadata emitted by osacompile. */
7
+ export declare const MAC_INSTALL_LINK_PLIST_SCRIPT = "ObjC.import('Foundation');\nfunction run(argv) {\n var plist = $.NSMutableDictionary.alloc.initWithContentsOfFile($(argv[0]));\n if (!plist) throw new Error('Installation-link bundle has no property list.');\n var updates = {\n CFBundleIdentifier: 'com.abot.install-links',\n CFBundleName: 'ABot Install',\n LSUIElement: true,\n CFBundleURLTypes: [{CFBundleURLName: 'ABot installation links', CFBundleURLSchemes: ['abot']}]\n };\n Object.keys(updates).forEach(function(key) { plist.setObjectForKey($(updates[key]), $(key)); });\n if (!plist.writeToFileAtomically($(argv[0]), true)) throw new Error('Could not register installation links.');\n}\n";
@@ -0,0 +1,48 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ export function renderMacInstallLinkHandler(options) {
4
+ const literal = (value) => JSON.stringify(value);
5
+ return `ObjC.import('Foundation');
6
+ function openDocuments() {}
7
+ function openLocation(url) {
8
+ var task = $.NSTask.alloc.init;
9
+ task.launchPath = ${literal(options.nodePath)};
10
+ task.arguments = [${literal(options.cliPath)}, 'host', 'open-link', String(url)];
11
+ task.launch;
12
+ }
13
+ `;
14
+ }
15
+ export const MAC_INSTALL_LINK_BUNDLE_ID = "com.abot.install-links";
16
+ export const MAC_INSTALL_LINK_HANDLER_QUERY_SCRIPT = `ObjC.import('CoreServices');
17
+ function run(argv) {
18
+ var handler = ObjC.castRefToObject($.LSCopyDefaultHandlerForURLScheme($(argv[0])));
19
+ if (handler.isNil()) return '';
20
+ return ObjC.unwrap(handler);
21
+ }
22
+ `;
23
+ const executeFile = promisify(execFile);
24
+ function isAvailableMacInstallScheme(handler) {
25
+ if (!handler)
26
+ return true;
27
+ return handler === MAC_INSTALL_LINK_BUNDLE_ID;
28
+ }
29
+ export async function requireAvailableMacInstallScheme() {
30
+ const { stdout } = await executeFile("/usr/bin/osascript", ["-l", "JavaScript", "-e", MAC_INSTALL_LINK_HANDLER_QUERY_SCRIPT, "abot"], { timeout: 30_000, maxBuffer: 16_384 });
31
+ if (!isAvailableMacInstallScheme(stdout.trim()))
32
+ throw new Error("The abot URL scheme belongs to another application.");
33
+ }
34
+ /** Preserve the executable and scripting metadata emitted by osacompile. */
35
+ export const MAC_INSTALL_LINK_PLIST_SCRIPT = `ObjC.import('Foundation');
36
+ function run(argv) {
37
+ var plist = $.NSMutableDictionary.alloc.initWithContentsOfFile($(argv[0]));
38
+ if (!plist) throw new Error('Installation-link bundle has no property list.');
39
+ var updates = {
40
+ CFBundleIdentifier: '${MAC_INSTALL_LINK_BUNDLE_ID}',
41
+ CFBundleName: 'ABot Install',
42
+ LSUIElement: true,
43
+ CFBundleURLTypes: [{CFBundleURLName: 'ABot installation links', CFBundleURLSchemes: ['abot']}]
44
+ };
45
+ Object.keys(updates).forEach(function(key) { plist.setObjectForKey($(updates[key]), $(key)); });
46
+ if (!plist.writeToFileAtomically($(argv[0]), true)) throw new Error('Could not register installation links.');
47
+ }
48
+ `;
@@ -0,0 +1,4 @@
1
+ import type { NativeAutostartOptions } from "./autostart.js";
2
+ export declare function renderLinuxInstallLinkDesktop(options: NativeAutostartOptions): string;
3
+ export declare function installCompanionInstallLinks(options: NativeAutostartOptions): Promise<void>;
4
+ export declare function uninstallCompanionInstallLinks(options: NativeAutostartOptions): Promise<void>;
@@ -0,0 +1,184 @@
1
+ import { execFile } from "node:child_process";
2
+ import { lstat, mkdir, readFile, rm, writeFile } from "node:fs/promises";
3
+ import { dirname, join, posix } from "node:path";
4
+ import { promisify } from "node:util";
5
+ import { ensurePrivateRuntimeDirectory } from "../../runtime/local-host/private-directory.js";
6
+ import { renderWindowsInstallLinkLauncher, windowsInstallLinkLauncherPath, windowsInstallLinkRegistryScript, } from "./install-link-windows.js";
7
+ import { renderMacInstallLinkHandler, requireAvailableMacInstallScheme, MAC_INSTALL_LINK_PLIST_SCRIPT, MAC_INSTALL_LINK_BUNDLE_ID, } from "./install-link-macos.js";
8
+ const OWNER = "ABot managed installation links";
9
+ const executeFile = promisify(execFile);
10
+ function desktopArgument(value) {
11
+ if (/[\r\n\0]/u.test(value))
12
+ throw new Error("Unsupported Companion path.");
13
+ return ('"' +
14
+ value
15
+ .replaceAll("\\", "\\\\")
16
+ .replaceAll('"', '\\"')
17
+ .replaceAll("$", "\\$")
18
+ .replaceAll("`", "\\`")
19
+ .replaceAll("%", "%%") +
20
+ '"');
21
+ }
22
+ export function renderLinuxInstallLinkDesktop(options) {
23
+ return `[Desktop Entry]
24
+ # ${OWNER}
25
+ Type=Application
26
+ Name=ABot Install
27
+ Exec=${desktopArgument(options.nodePath)} ${desktopArgument(options.cliPath)} host open-link %u
28
+ Terminal=false
29
+ NoDisplay=true
30
+ MimeType=x-scheme-handler/abot;
31
+ `;
32
+ }
33
+ function registrationDirectory(options) {
34
+ return join(options.stateDir, "install-links");
35
+ }
36
+ async function run(options, file, args) {
37
+ if (options.execute)
38
+ return options.execute(file, args);
39
+ await executeFile(file, [...args], {
40
+ windowsHide: true,
41
+ timeout: 30_000,
42
+ maxBuffer: 16_384,
43
+ });
44
+ }
45
+ async function existingOwnedDirectory(path) {
46
+ const stat = await lstat(path).catch((error) => {
47
+ if (error.code === "ENOENT")
48
+ return undefined;
49
+ throw error;
50
+ });
51
+ if (!stat)
52
+ return false;
53
+ if (!stat.isDirectory() || stat.isSymbolicLink())
54
+ throw new Error("Installation-link directory is not owned.");
55
+ if ((await readFile(join(path, ".owner"), "utf8")) !== OWNER)
56
+ throw new Error("Installation-link directory is not owned.");
57
+ return true;
58
+ }
59
+ function hasAbsoluteLinuxDataHome(value) {
60
+ if (!value)
61
+ return false;
62
+ return posix.isAbsolute(value);
63
+ }
64
+ function linuxDesktopPath(options) {
65
+ const dataHome = process.env.XDG_DATA_HOME;
66
+ if (hasAbsoluteLinuxDataHome(dataHome))
67
+ return join(dataHome, "applications", "com.abot.install-links.desktop");
68
+ return join(options.homeDir, ".local", "share", "applications", "com.abot.install-links.desktop");
69
+ }
70
+ async function requireOwnedLinuxRegistration(path) {
71
+ const stat = await lstat(path).catch((error) => {
72
+ if (error.code === "ENOENT")
73
+ return undefined;
74
+ throw error;
75
+ });
76
+ if (!stat)
77
+ return;
78
+ if (!stat.isFile() ||
79
+ stat.isSymbolicLink() ||
80
+ !(await readFile(path, "utf8")).includes("# " + OWNER))
81
+ throw new Error("Installation-link desktop registration is not owned.");
82
+ }
83
+ function isAvailableLinuxInstallScheme(handler) {
84
+ if (!handler)
85
+ return true;
86
+ return handler === "com.abot.install-links.desktop";
87
+ }
88
+ async function requireAvailableLinuxInstallScheme() {
89
+ const { stdout } = await executeFile("xdg-mime", ["query", "default", "x-scheme-handler/abot"], { timeout: 30_000, maxBuffer: 16_384 });
90
+ if (!isAvailableLinuxInstallScheme(stdout.trim()))
91
+ throw new Error("The abot URL scheme belongs to another application.");
92
+ }
93
+ export async function installCompanionInstallLinks(options) {
94
+ const directory = registrationDirectory(options);
95
+ if (!(await existingOwnedDirectory(directory))) {
96
+ await ensurePrivateRuntimeDirectory(directory);
97
+ await writeFile(join(directory, ".owner"), OWNER, {
98
+ flag: "wx",
99
+ mode: 0o600,
100
+ });
101
+ }
102
+ if (options.platform === "win32") {
103
+ const launcher = windowsInstallLinkLauncherPath(options);
104
+ await writeFile(launcher, renderWindowsInstallLinkLauncher(options), {
105
+ mode: 0o600,
106
+ });
107
+ await run(options, "powershell.exe", [
108
+ "-NoProfile",
109
+ "-NonInteractive",
110
+ "-EncodedCommand",
111
+ Buffer.from(windowsInstallLinkRegistryScript("install", launcher), "utf16le").toString("base64"),
112
+ ]);
113
+ return;
114
+ }
115
+ if (options.platform === "linux") {
116
+ const desktop = linuxDesktopPath(options);
117
+ await requireOwnedLinuxRegistration(desktop);
118
+ await requireAvailableLinuxInstallScheme();
119
+ await mkdir(dirname(desktop), { recursive: true, mode: 0o700 });
120
+ await writeFile(desktop, renderLinuxInstallLinkDesktop(options), {
121
+ mode: 0o600,
122
+ });
123
+ await run(options, "xdg-mime", [
124
+ "default",
125
+ "com.abot.install-links.desktop",
126
+ "x-scheme-handler/abot",
127
+ ]);
128
+ return;
129
+ }
130
+ if (options.platform === "darwin") {
131
+ await requireAvailableMacInstallScheme();
132
+ const source = join(directory, "handler.js");
133
+ const app = join(directory, "ABot Install.app");
134
+ await writeFile(source, renderMacInstallLinkHandler(options), {
135
+ mode: 0o600,
136
+ });
137
+ await rm(app, { recursive: true, force: true });
138
+ await run(options, "/usr/bin/osacompile", [
139
+ "-l",
140
+ "JavaScript",
141
+ "-o",
142
+ app,
143
+ source,
144
+ ]);
145
+ await run(options, "/usr/bin/osascript", [
146
+ "-l",
147
+ "JavaScript",
148
+ "-e",
149
+ MAC_INSTALL_LINK_PLIST_SCRIPT,
150
+ join(app, "Contents", "Info.plist"),
151
+ ]);
152
+ await run(options, "/usr/bin/codesign", [
153
+ "--force",
154
+ "--sign",
155
+ "-",
156
+ "--identifier",
157
+ MAC_INSTALL_LINK_BUNDLE_ID,
158
+ app,
159
+ ]);
160
+ await run(options, "/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister", ["-f", app]);
161
+ return;
162
+ }
163
+ throw new Error("Installation links are not supported on this platform.");
164
+ }
165
+ export async function uninstallCompanionInstallLinks(options) {
166
+ const directory = registrationDirectory(options);
167
+ if (!(await existingOwnedDirectory(directory)))
168
+ return;
169
+ if (options.platform === "win32")
170
+ await run(options, "powershell.exe", [
171
+ "-NoProfile",
172
+ "-NonInteractive",
173
+ "-EncodedCommand",
174
+ Buffer.from(windowsInstallLinkRegistryScript("remove", windowsInstallLinkLauncherPath(options)), "utf16le").toString("base64"),
175
+ ]);
176
+ if (options.platform === "linux") {
177
+ const desktop = linuxDesktopPath(options);
178
+ await requireOwnedLinuxRegistration(desktop);
179
+ await rm(desktop, { force: true });
180
+ }
181
+ if (options.platform === "darwin")
182
+ await run(options, "/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister", ["-u", join(directory, "ABot Install.app")]);
183
+ await rm(directory, { recursive: true });
184
+ }
@@ -0,0 +1,4 @@
1
+ import type { NativeAutostartOptions } from "./autostart.js";
2
+ export declare function renderWindowsInstallLinkLauncher(options: NativeAutostartOptions): string;
3
+ export declare function windowsInstallLinkRegistryScript(action: "install" | "remove", launcher: string): string;
4
+ export declare function windowsInstallLinkLauncherPath(options: NativeAutostartOptions): string;
@@ -0,0 +1,65 @@
1
+ import { join } from "node:path";
2
+ function vbsText(value) {
3
+ if (/[\r\n\0]/u.test(value))
4
+ throw new Error("Unsupported Companion path.");
5
+ return '"' + value.replaceAll('"', '""') + '"';
6
+ }
7
+ export function renderWindowsInstallLinkLauncher(options) {
8
+ if (/["\r\n\0]/u.test(options.nodePath + options.cliPath))
9
+ throw new Error("Unsupported Companion path.");
10
+ const prefix = `"${options.nodePath}" "${options.cliPath}" host open-link --encoded `;
11
+ return [
12
+ "' ABot managed installation links",
13
+ "If WScript.Arguments.Count <> 1 Then WScript.Quit 1",
14
+ "value = WScript.Arguments(0)",
15
+ "If InStr(value, Chr(34)) > 0 Or InStr(value, vbCr) > 0 Or InStr(value, vbLf) > 0 Then WScript.Quit 1",
16
+ "If Len(value) > 2048 Then WScript.Quit 1",
17
+ 'Set stream = CreateObject("ADODB.Stream")',
18
+ "stream.Type = 2",
19
+ 'stream.Charset = "utf-8"',
20
+ "stream.Open",
21
+ "stream.WriteText value",
22
+ "stream.Position = 0",
23
+ "stream.Type = 1",
24
+ "stream.Position = 3",
25
+ 'Set document = CreateObject("Msxml2.DOMDocument.6.0")',
26
+ 'Set encoded = document.createElement("encoded")',
27
+ 'encoded.dataType = "bin.base64"',
28
+ "encoded.nodeTypedValue = stream.Read",
29
+ "stream.Close",
30
+ 'value = Replace(Replace(encoded.text, vbCr, ""), vbLf, "")',
31
+ 'Set shell = CreateObject("WScript.Shell")',
32
+ `shell.Run ${vbsText(prefix)} & value, 0, False`,
33
+ "",
34
+ ].join("\r\n");
35
+ }
36
+ export function windowsInstallLinkRegistryScript(action, launcher) {
37
+ const quoted = (value) => "'" + value.replaceAll("'", "''") + "'";
38
+ const command = `wscript.exe "${launcher}" "%1"`;
39
+ return `
40
+ $ErrorActionPreference = 'Stop'
41
+ $key = 'HKCU:\\Software\\Classes\\abot'
42
+ $expected = ${quoted(launcher)}
43
+ $exists = Test-Path -LiteralPath $key
44
+ function Assert-OwnedInstallLinkRegistration([string]$path) {
45
+ if (!(Test-Path -LiteralPath $path)) { return }
46
+ $owner = (Get-ItemProperty -LiteralPath $path -Name ABotInstallLinkOwner -ErrorAction SilentlyContinue).ABotInstallLinkOwner
47
+ if ($owner -ne $expected) { throw 'The abot protocol belongs to another application.' }
48
+ }
49
+ Assert-OwnedInstallLinkRegistration $key
50
+ ${action === "remove"
51
+ ? "if ($exists) { Remove-Item -LiteralPath $key -Recurse -Force }"
52
+ : `
53
+ Assert-OwnedInstallLinkRegistration 'Registry::HKEY_CLASSES_ROOT\\abot'
54
+ New-Item -Path $key -Force | Out-Null
55
+ Set-Item -LiteralPath $key -Value 'URL:ABot installation'
56
+ New-ItemProperty -LiteralPath $key -Name 'URL Protocol' -Value '' -PropertyType String -Force | Out-Null
57
+ New-ItemProperty -LiteralPath $key -Name ABotInstallLinkOwner -Value $expected -PropertyType String -Force | Out-Null
58
+ New-Item -Path ($key + '\\shell\\open\\command') -Force | Out-Null
59
+ Set-Item -LiteralPath ($key + '\\shell\\open\\command') -Value ${quoted(command)}
60
+ `}
61
+ `;
62
+ }
63
+ export function windowsInstallLinkLauncherPath(options) {
64
+ return join(options.stateDir, "install-links", "open-link.vbs");
65
+ }
@@ -0,0 +1,9 @@
1
+ import type { NativeHostState } from "./native-state.js";
2
+ export declare function pluginInstallReviewUrl(link: string, runtimeUrl: string): string;
3
+ /** The saved pairing owns the destination. Incoming links cannot select a host. */
4
+ export declare function openPluginInstallLink(state: Pick<NativeHostState, "read">, link: string, open?: typeof openReviewBrowser): Promise<void>;
5
+ declare function openReviewBrowser(url: string): Promise<void>;
6
+ /** Windows Script Host expands percent-delimited environment variables in Run().
7
+ * The launcher sends base64 so a website URL can never interpolate local values. */
8
+ export declare function parsePluginInstallArguments(args: readonly string[]): string;
9
+ export {};