@xopcai/xopc 0.0.190 → 0.0.192

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 (342) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{activity-store-DstnJCS5.js → activity-store-B-tzXpDD.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-9vAbkroX.js → agent-avatar-dicebear-xOu0qNwc.js} +1 -1
  5. package/dist/gateway/static/root/assets/agents-CxuwvDk0.js +68 -0
  6. package/dist/gateway/static/root/assets/{api-BTL9kayv.js → api-fMItZb-h.js} +1 -1
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-DkFeIdBf.js → app-management-settings-panel-D6Rv3OWI.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-Bxs8Fpaj.js → appearance-settings-CKoNCwco.js} +1 -1
  9. package/dist/gateway/static/root/assets/apps-page-wAb5dnHZ.js +1 -0
  10. package/dist/gateway/static/root/assets/{archive-plugin-Ch2RmLCC.js → archive-plugin-BokNQBwH.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-BhMQM_Ky.js → attachment-load-Dx1HglsM.js} +1 -1
  12. package/dist/gateway/static/root/assets/automations-page-Drgazevs.js +6 -0
  13. package/dist/gateway/static/root/assets/{binary-plugins-D6CqlymH.js → binary-plugins-CPYAflIG.js} +1 -1
  14. package/dist/gateway/static/root/assets/{block-editor-ClL6HEg9.js → block-editor-BFLgl8SS.js} +47 -47
  15. package/dist/gateway/static/root/assets/browser-settings-page-DmYlFJW7.js +8 -0
  16. package/dist/gateway/static/root/assets/{browser-workflow-inputs-BYy48VhN.js → browser-workflow-inputs-CqLnqA9z.js} +1 -1
  17. package/dist/gateway/static/root/assets/{browser-workflows-page-zgLibuMH.js → browser-workflows-page-Db5v3HtE.js} +2 -2
  18. package/dist/gateway/static/root/assets/capabilities-settings-panel-D7Z8T0o5.js +7 -0
  19. package/dist/gateway/static/root/assets/capability-presets-api-lov0J9A2.js +1 -0
  20. package/dist/gateway/static/root/assets/capability-presets-settings-panel-COjnwO0U.js +3 -0
  21. package/dist/gateway/static/root/assets/{channel-recipient-api-BThDGiO3.js → channel-recipient-api-DSJznouK.js} +1 -1
  22. package/dist/gateway/static/root/assets/channels-settings-DcRYBNN7.js +1 -0
  23. package/dist/gateway/static/root/assets/channels-status-swr-C2UYdebT.js +1 -0
  24. package/dist/gateway/static/root/assets/{code-editor-D4_k-6QN.js → code-editor-dFzqyDXS.js} +1 -1
  25. package/dist/gateway/static/root/assets/{connectors-api-DS9ED-EL.js → connectors-api-3ccRyS3L.js} +1 -1
  26. package/dist/gateway/static/root/assets/connectors-page-FVmvBG9H.js +2 -0
  27. package/dist/gateway/static/root/assets/{cron-expression-CkgsvhtW.js → cron-expression-C9hhCiuo.js} +1 -1
  28. package/dist/gateway/static/root/assets/dependency-picker-CTtZFZug.js +1 -0
  29. package/dist/gateway/static/root/assets/{desktop-pet-Cv8rGhYW.js → desktop-pet-DOUeNVmC.js} +1 -1
  30. package/dist/gateway/static/root/assets/{desktop-pet-settings-CIeJdwfV.js → desktop-pet-settings-D4704vtl.js} +1 -1
  31. package/dist/gateway/static/root/assets/{directory-picker-path-field-D8jXEiAY.js → directory-picker-path-field-DJDXeA1B.js} +1 -1
  32. package/dist/gateway/static/root/assets/{extension-debug-page-CCZ9u6TZ.js → extension-debug-page-C0n2NMF1.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-page-CV36ILRG.js → extension-page-vG-xxRNs.js} +1 -1
  34. package/dist/gateway/static/root/assets/extension-settings-page-CtuY2THd.js +1 -0
  35. package/dist/gateway/static/root/assets/{gateway-config-api-D4_r5iJM.js → gateway-config-api-CZra7GuI.js} +1 -1
  36. package/dist/gateway/static/root/assets/{gateway-settings-CYlntpBH.js → gateway-settings-Cz33jRkR.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-startup-retry-EO9mKvzE.js → gateway-startup-retry-BbVV0udv.js} +1 -1
  38. package/dist/gateway/static/root/assets/{heartbeat-settings-D4SyWob8.js → heartbeat-settings-D2XMlA_U.js} +1 -1
  39. package/dist/gateway/static/root/assets/home-page-CPrHkPN6.js +3 -0
  40. package/dist/gateway/static/root/assets/html-workspace-editor-bXK5tq64.js +1 -0
  41. package/dist/gateway/static/root/assets/{image-generation-api-Bu7PyVSh.js → image-generation-api-BgrOvhaJ.js} +1 -1
  42. package/dist/gateway/static/root/assets/index-Cg7Xnlu3.css +1 -0
  43. package/dist/gateway/static/root/assets/index-DzmbmOGA.js +150 -0
  44. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BMhCuVBZ.js → keyboard-shortcuts-settings-BfyAEG1G.js} +1 -1
  45. package/dist/gateway/static/root/assets/local-app-workbench-page-Clz47vSr.js +2 -0
  46. package/dist/gateway/static/root/assets/{local-apps-page-ijIe7_y2.js → local-apps-page-BYalcRSY.js} +1 -1
  47. package/dist/gateway/static/root/assets/{locale-store-deR2zRaE.js → locale-store-VOY1wMO9.js} +1 -1
  48. package/dist/gateway/static/root/assets/logs-page-Cxq9WMf5.js +2 -0
  49. package/dist/gateway/static/root/assets/{management-settings--V_fovKD.js → management-settings-BQf-6s32.js} +1 -1
  50. package/dist/gateway/static/root/assets/{markdown-editor-BvUebh3C.js → markdown-editor-TWGaF7Xa.js} +2 -2
  51. package/dist/gateway/static/root/assets/{markdown-split-Dt9-in6W.js → markdown-split-Cy_2SN1Q.js} +1 -1
  52. package/dist/gateway/static/root/assets/{media-plugins-B3pj_iO0.js → media-plugins-CkDupqb2.js} +1 -1
  53. package/dist/gateway/static/root/assets/messages-DMJ-6-1m.js +3 -0
  54. package/dist/gateway/static/root/assets/{notes-page-DZ366lIT.js → notes-page-kiGRR9jo.js} +1 -1
  55. package/dist/gateway/static/root/assets/notes-workbench-DkYkPGyB.js +4 -0
  56. package/dist/gateway/static/root/assets/{page-tabs-C5ge434C.js → page-tabs-CvzSdYVj.js} +1 -1
  57. package/dist/gateway/static/root/assets/{preview-open-alternatives-BFa9DgSV.js → preview-open-alternatives-kZ0nco7e.js} +1 -1
  58. package/dist/gateway/static/root/assets/{product-open-page-Dc9CcWdu.js → product-open-page-DgoieqQC.js} +1 -1
  59. package/dist/gateway/static/root/assets/project-detail-page-CeSjJd-N.js +1 -0
  60. package/dist/gateway/static/root/assets/projects-page-fZ1rm4b9.js +1 -0
  61. package/dist/gateway/static/root/assets/remote-access-hub-CbYI6KC8.js +1 -0
  62. package/dist/gateway/static/root/assets/runtime-tools-settings-panel-Bud_NTEZ.js +5 -0
  63. package/dist/gateway/static/root/assets/{schema-form-B84DckWe.js → schema-form-GlbsCBmv.js} +1 -1
  64. package/dist/gateway/static/root/assets/sessions-page-sOJ_TnLm.js +1 -0
  65. package/dist/gateway/static/root/assets/settings-advanced-gate-BI0u77dt.js +1 -0
  66. package/dist/gateway/static/root/assets/{settings-form-section-Dp9itvdy.js → settings-form-section-CKLns16d.js} +1 -1
  67. package/dist/gateway/static/root/assets/{settings-loading-skeleton-CCtlhoy7.js → settings-loading-skeleton-BDzpxgk0.js} +1 -1
  68. package/dist/gateway/static/root/assets/settings-page-BH0pF7QB.js +1 -0
  69. package/dist/gateway/static/root/assets/{settings-page-layout-EQIOJa_L.js → settings-page-layout-J793iqfm.js} +1 -1
  70. package/dist/gateway/static/root/assets/{setup-status-panel-Cwi-SPja.js → setup-status-panel-CGsml89P.js} +1 -1
  71. package/dist/gateway/static/root/assets/{share-preview-page-C4_B2jvf.js → share-preview-page-UTm_7r0l.js} +1 -1
  72. package/dist/gateway/static/root/assets/shares-settings-BM--lgUS.js +1 -0
  73. package/dist/gateway/static/root/assets/skill-reload-api-CGCOC-rV.js +1 -0
  74. package/dist/gateway/static/root/assets/skills-page-iLyaOl48.js +2 -0
  75. package/dist/gateway/static/root/assets/skills-page.utils-Bwid1TGB.js +1 -0
  76. package/dist/gateway/static/root/assets/style-TIDOdKy0.js +7 -0
  77. package/dist/gateway/static/root/assets/{system-settings-panel-Dpx2ags2.js → system-settings-panel-BcB3p1e3.js} +1 -1
  78. package/dist/gateway/static/root/assets/task-detail-page-DQYEf08v.js +1 -0
  79. package/dist/gateway/static/root/assets/{theme-store-DnBOcGXi.js → theme-store-GVZOImyb.js} +1 -1
  80. package/dist/gateway/static/root/assets/{typed-models-lib-DULmTHUB.js → typed-models-lib-CT2c85Ju.js} +1 -1
  81. package/dist/gateway/static/root/assets/{use-autosave-BrjVk5VH.js → use-autosave-CcvY7DTh.js} +1 -1
  82. package/dist/gateway/static/root/assets/user-context-page-CGI41bfO.js +1 -0
  83. package/dist/gateway/static/root/assets/{vendor-codemirror--gTq3YAI.js → vendor-codemirror-DRr7hFaD.js} +16 -16
  84. package/dist/gateway/static/root/assets/voice-api-key-field-Ricc3QGo.js +1 -0
  85. package/dist/gateway/static/root/assets/{work-discovery-overlay-Wr-uF7VA.js → work-discovery-overlay-BoomfqhX.js} +1 -1
  86. package/dist/gateway/static/root/assets/{work-discovery-page-BWds95sL.js → work-discovery-page-mbnepbQk.js} +1 -1
  87. package/dist/gateway/static/root/assets/workflow-run-setup-panel-DSWG2xqL.js +3 -0
  88. package/dist/gateway/static/root/assets/workflows-page-DtV0ruyk.js +5 -0
  89. package/dist/gateway/static/root/index.html +7 -7
  90. package/dist/package.js +1 -1
  91. package/dist/src/agent/agent-manager.d.ts +2 -0
  92. package/dist/src/agent/agent-manager.js +76 -0
  93. package/dist/src/agent/background-review/prompts.d.ts +1 -1
  94. package/dist/src/agent/background-review/prompts.js +1 -1
  95. package/dist/src/agent/background-review/run-background-review.js +3 -12
  96. package/dist/src/agent/embedded/run-for-session.js +3 -0
  97. package/dist/src/agent/embedded/run-turn.js +4 -1
  98. package/dist/src/agent/embedded/session-runner.js +3 -4
  99. package/dist/src/agent/embedded/types.d.ts +10 -1
  100. package/dist/src/agent/embedded/xopc-stream-bridge.js +3 -2
  101. package/dist/src/agent/external-tools/mcp-provider.d.ts +1 -0
  102. package/dist/src/agent/external-tools/mcp-provider.js +21 -6
  103. package/dist/src/agent/image/generation/openai-images-provider.d.ts +1 -1
  104. package/dist/src/agent/image/generation/openai-images-provider.js +1 -1
  105. package/dist/src/agent/image/generation/provider-registry.d.ts +2 -0
  106. package/dist/src/agent/image/generation/provider-registry.js +21 -10
  107. package/dist/src/agent/image/generation/providers/dashscope.js +20 -0
  108. package/dist/src/agent/image/generation/providers/fal.d.ts +1 -1
  109. package/dist/src/agent/image/generation/providers/fal.js +12 -6
  110. package/dist/src/agent/image/generation/providers/google.js +8 -0
  111. package/dist/src/agent/image/generation/providers/minimax.js +20 -0
  112. package/dist/src/agent/image/generation/providers/openai.js +36 -26
  113. package/dist/src/agent/image/generation/providers/xopc-cloud.d.ts +2 -0
  114. package/dist/src/agent/image/generation/providers/xopc-cloud.js +74 -0
  115. package/dist/src/agent/image/generation/types.d.ts +15 -2
  116. package/dist/src/agent/mcp/bundle-mcp-gateway.d.ts +1 -0
  117. package/dist/src/agent/mcp/bundle-mcp-gateway.js +2 -1
  118. package/dist/src/agent/mcp/bundle-mcp-policy.d.ts +5 -1
  119. package/dist/src/agent/mcp/bundle-mcp-policy.js +11 -3
  120. package/dist/src/agent/mcp/bundle-mcp-runtime.js +3 -2
  121. package/dist/src/agent/mcp/bundle-mcp-types.d.ts +2 -1
  122. package/dist/src/agent/mcp/index.js +2 -2
  123. package/dist/src/agent/mcp/mcp-stdio-transport.js +1 -1
  124. package/dist/src/agent/mcp/mcp-transport.d.ts +2 -1
  125. package/dist/src/agent/mcp/mcp-transport.js +22 -4
  126. package/dist/src/agent/memory/compaction.js +19 -17
  127. package/dist/src/agent/memory/context-budget.js +2 -3
  128. package/dist/src/agent/memory/understanding/service.d.ts +1 -0
  129. package/dist/src/agent/memory/understanding/service.js +49 -20
  130. package/dist/src/agent/memory/understanding/types.d.ts +1 -0
  131. package/dist/src/agent/memory/user-context-coordinator.js +6 -0
  132. package/dist/src/agent/orchestration/agent-orchestrator.js +15 -1
  133. package/dist/src/agent/service/direct-turn-helpers.js +14 -5
  134. package/dist/src/agent/skills/index.d.ts +1 -1
  135. package/dist/src/agent/skills/index.js +2 -2
  136. package/dist/src/agent/skills/installer.d.ts +3 -10
  137. package/dist/src/agent/skills/installer.js +99 -156
  138. package/dist/src/agent/skills/marketplace/adapter.types.d.ts +3 -1
  139. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +30 -6
  140. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +21 -4
  141. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +7 -4
  142. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +3 -0
  143. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js +7 -1
  144. package/dist/src/agent/skills/marketplace/search.d.ts +2 -2
  145. package/dist/src/agent/skills/marketplace/search.js +52 -21
  146. package/dist/src/agent/skills/skills-marketplace.d.ts +1 -1
  147. package/dist/src/agent/skills/skills-marketplace.js +2 -2
  148. package/dist/src/agent/skills/types.d.ts +0 -8
  149. package/dist/src/agent/tools/exec-command.d.ts +1 -0
  150. package/dist/src/agent/tools/exec-command.js +2 -1
  151. package/dist/src/agent/tools/factory.d.ts +1 -0
  152. package/dist/src/agent/tools/factory.js +17 -2
  153. package/dist/src/agent/tools/managed-job-tool.d.ts +1 -1
  154. package/dist/src/agent/tools/managed-job-tool.js +3 -2
  155. package/dist/src/agent/tools/skill-install-tool.d.ts +2 -2
  156. package/dist/src/agent/tools/skill-install-tool.js +8 -4
  157. package/dist/src/agent/tools/skills-marketplace-search-tool.js +3 -2
  158. package/dist/src/agent/tools/workflow-tool.d.ts +1 -0
  159. package/dist/src/agent/tools/workflow-tool.js +14 -4
  160. package/dist/src/agent-manifest/schema.d.ts +20 -0
  161. package/dist/src/agent-manifest/schema.js +6 -1
  162. package/dist/src/browser/providers/cloakbrowser.js +1 -1
  163. package/dist/src/cli/command-loaders.js +1 -0
  164. package/dist/src/cli/command-manifest.js +4 -0
  165. package/dist/src/cli/commands/doctor/checks/node-version.js +3 -3
  166. package/dist/src/cli/commands/doctor/checks/tool-runtimes.d.ts +2 -0
  167. package/dist/src/cli/commands/doctor/checks/tool-runtimes.js +36 -0
  168. package/dist/src/cli/commands/doctor/flow.js +2 -0
  169. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  170. package/dist/src/cli/commands/models.js +0 -1
  171. package/dist/src/cli/commands/onboard/model.d.ts +18 -0
  172. package/dist/src/cli/commands/onboard/model.js +81 -5
  173. package/dist/src/cli/commands/onboard.js +13 -1
  174. package/dist/src/cli/commands/runtime.d.ts +1 -0
  175. package/dist/src/cli/commands/runtime.js +77 -0
  176. package/dist/src/cli/commands/setup.js +15 -1
  177. package/dist/src/cli/commands/skills.js +7 -4
  178. package/dist/src/config/agent-profile.js +1 -1
  179. package/dist/src/config/index.js +2 -2
  180. package/dist/src/config/schema.d.ts +125 -0
  181. package/dist/src/config/schema.js +77 -2
  182. package/dist/src/config/voice.d.ts +6 -0
  183. package/dist/src/config/voice.js +17 -0
  184. package/dist/src/extensions/install.js +1 -1
  185. package/dist/src/extensions/types/providers.d.ts +4 -0
  186. package/dist/src/gateway/agents-admin.js +1 -1
  187. package/dist/src/gateway/capability-presets-admin.d.ts +9 -0
  188. package/dist/src/gateway/capability-presets-admin.js +24 -6
  189. package/dist/src/gateway/chat-stream/mapper.js +8 -4
  190. package/dist/src/gateway/chat-stream/protocol.d.ts +10 -1
  191. package/dist/src/gateway/heartbeat/service.js +1 -1
  192. package/dist/src/gateway/hono/lib/config-payload.d.ts +1 -0
  193. package/dist/src/gateway/hono/routes/commands-skills.js +2 -1
  194. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  195. package/dist/src/gateway/hono/routes/models.js +11 -11
  196. package/dist/src/gateway/hono/routes/runtime-tools.d.ts +3 -0
  197. package/dist/src/gateway/hono/routes/runtime-tools.js +142 -0
  198. package/dist/src/gateway/hono/routes/understanding-sources.js +2 -1
  199. package/dist/src/gateway/hono/routes/voice.js +43 -2
  200. package/dist/src/gateway/hono/routes/workflows.js +1 -1
  201. package/dist/src/gateway/hono/routes/you.js +22 -25
  202. package/dist/src/gateway/image-generation-setup.d.ts +2 -3
  203. package/dist/src/gateway/image-generation-setup.js +39 -8
  204. package/dist/src/gateway/service/marketplace-service.d.ts +1 -1
  205. package/dist/src/gateway/service/marketplace-service.js +2 -2
  206. package/dist/src/heartbeat/index.js +1 -1
  207. package/dist/src/infra/update-global.js +1 -1
  208. package/dist/src/providers/extension-stream-bridge.js +8 -7
  209. package/dist/src/providers/model-catalog-store.d.ts +35 -0
  210. package/dist/src/providers/model-catalog-store.js +25 -1
  211. package/dist/src/providers/model-catalog-sync-service.js +6 -0
  212. package/dist/src/providers/model-registry.js +4 -4
  213. package/dist/src/providers/prompt-cache-payload.d.ts +13 -0
  214. package/dist/src/providers/prompt-cache-payload.js +110 -0
  215. package/dist/src/providers/register-runtime-providers.js +4 -4
  216. package/dist/src/providers/xopc-cloud-model-source.js +101 -8
  217. package/dist/src/runtime-tools/archive.d.ts +8 -0
  218. package/dist/src/runtime-tools/archive.js +99 -0
  219. package/dist/src/runtime-tools/bootstrap.d.ts +16 -0
  220. package/dist/src/runtime-tools/bootstrap.js +33 -0
  221. package/dist/src/runtime-tools/catalog.d.ts +19 -0
  222. package/dist/src/runtime-tools/catalog.js +59 -0
  223. package/dist/src/runtime-tools/command.d.ts +15 -0
  224. package/dist/src/runtime-tools/command.js +59 -0
  225. package/dist/src/runtime-tools/download-source.d.ts +24 -0
  226. package/dist/src/runtime-tools/download-source.js +125 -0
  227. package/dist/src/runtime-tools/downloader.d.ts +21 -0
  228. package/dist/src/runtime-tools/downloader.js +137 -0
  229. package/dist/src/runtime-tools/environment.d.ts +20 -0
  230. package/dist/src/runtime-tools/environment.js +113 -0
  231. package/dist/src/runtime-tools/errors.d.ts +10 -0
  232. package/dist/src/runtime-tools/errors.js +14 -0
  233. package/dist/src/runtime-tools/index.d.ts +7 -0
  234. package/dist/src/runtime-tools/index.js +7 -0
  235. package/dist/src/runtime-tools/install-lock.d.ts +1 -0
  236. package/dist/src/runtime-tools/install-lock.js +50 -0
  237. package/dist/src/runtime-tools/manager.d.ts +20 -0
  238. package/dist/src/runtime-tools/manager.js +641 -0
  239. package/dist/src/runtime-tools/manifest-store.d.ts +3 -0
  240. package/dist/src/runtime-tools/manifest-store.js +26 -0
  241. package/dist/src/runtime-tools/network.d.ts +9 -0
  242. package/dist/src/runtime-tools/network.js +41 -0
  243. package/dist/src/runtime-tools/offline-bundle.d.ts +16 -0
  244. package/dist/src/runtime-tools/offline-bundle.js +41 -0
  245. package/dist/src/runtime-tools/paths.d.ts +7 -0
  246. package/dist/src/runtime-tools/paths.js +22 -0
  247. package/dist/src/runtime-tools/probe.d.ts +7 -0
  248. package/dist/src/runtime-tools/probe.js +71 -0
  249. package/dist/src/runtime-tools/prune.d.ts +10 -0
  250. package/dist/src/runtime-tools/prune.js +93 -0
  251. package/dist/src/runtime-tools/types.d.ts +70 -0
  252. package/dist/src/runtime-tools/types.js +1 -0
  253. package/dist/src/share/share-zip.js +1 -1
  254. package/dist/src/storage/sqlite/migrations/113_memory_evidence_single_source.sql +42 -20
  255. package/dist/src/tasks/home-query-service.js +1 -5
  256. package/dist/src/tasks/index.js +2 -2
  257. package/dist/src/tasks/project-operating-view-service.d.ts +2 -1
  258. package/dist/src/tasks/project-operating-view-service.js +6 -4
  259. package/dist/src/tasks/task-dependency-service.d.ts +2 -1
  260. package/dist/src/tasks/task-dependency-service.js +15 -0
  261. package/dist/src/tunnel/frpc-binary.js +1 -1
  262. package/dist/src/user-context/domain.d.ts +2 -1
  263. package/dist/src/user-context/domain.js +12 -1
  264. package/dist/src/user-context/manual-understanding.js +8 -10
  265. package/dist/src/user-context/planner.js +1 -6
  266. package/dist/src/user-context/sources/activity-clustering.d.ts +5 -0
  267. package/dist/src/user-context/sources/activity-clustering.js +130 -0
  268. package/dist/src/user-context/sources/catalog.js +26 -0
  269. package/dist/src/user-context/sources/local-source-contract.d.ts +3 -0
  270. package/dist/src/user-context/sources/local-source-contract.js +15 -0
  271. package/dist/src/user-context/sources/repository.js +7 -1
  272. package/dist/src/user-context/sources/types.d.ts +7 -1
  273. package/dist/src/user-context/understanding.d.ts +15 -0
  274. package/dist/src/user-context/understanding.js +24 -0
  275. package/dist/src/voice/local/model-files.js +1 -1
  276. package/dist/src/voice/metadata/builtin.js +99 -32
  277. package/dist/src/voice/metadata/types.d.ts +3 -0
  278. package/dist/src/voice/stt/availability.js +4 -1
  279. package/dist/src/voice/stt/config-slice.d.ts +0 -2
  280. package/dist/src/voice/stt/config-slice.js +1 -6
  281. package/dist/src/voice/stt/factory.js +2 -2
  282. package/dist/src/voice/stt/index.d.ts +2 -3
  283. package/dist/src/voice/stt/list-providers.js +1 -1
  284. package/dist/src/voice/stt/providers/alibaba-transcription.d.ts +0 -19
  285. package/dist/src/voice/stt/providers/alibaba-transcription.js +59 -132
  286. package/dist/src/voice/stt/providers/index.d.ts +1 -0
  287. package/dist/src/voice/stt/providers/index.js +2 -1
  288. package/dist/src/voice/stt/providers/openai-transcription.d.ts +2 -2
  289. package/dist/src/voice/stt/providers/openai-transcription.js +4 -4
  290. package/dist/src/voice/stt/providers/xopc-cloud-transcription.d.ts +2 -0
  291. package/dist/src/voice/stt/providers/xopc-cloud-transcription.js +49 -0
  292. package/dist/src/voice/stt/types.js +2 -2
  293. package/dist/src/voice/tts/providers/index.d.ts +1 -0
  294. package/dist/src/voice/tts/providers/index.js +2 -1
  295. package/dist/src/voice/tts/providers/xopc-cloud-speech.d.ts +2 -0
  296. package/dist/src/voice/tts/providers/xopc-cloud-speech.js +113 -0
  297. package/dist/src/voice/tts/types.d.ts +1 -1
  298. package/dist/src/work-discovery/analyzer.js +9 -4
  299. package/dist/src/work-discovery/candidate-discovery.d.ts +1 -0
  300. package/dist/src/work-discovery/candidate-discovery.js +3 -3
  301. package/dist/src/work-discovery/index.js +2 -2
  302. package/dist/src/work-discovery/service.d.ts +2 -1
  303. package/dist/src/work-discovery/service.js +126 -37
  304. package/dist/src/work-discovery/types.d.ts +1 -0
  305. package/dist/src/workflows/service/workflow-run-service.js +8 -0
  306. package/dist/src/workflows/service/workflow-run-service.types.d.ts +1 -1
  307. package/package.json +1 -1
  308. package/dist/gateway/static/root/assets/agents-D1t4SfMQ.js +0 -68
  309. package/dist/gateway/static/root/assets/apps-page-Cgrgu5OW.js +0 -1
  310. package/dist/gateway/static/root/assets/automations-page-CtJxstKh.js +0 -6
  311. package/dist/gateway/static/root/assets/browser-settings-page-DW99iDmD.js +0 -8
  312. package/dist/gateway/static/root/assets/capabilities-settings-panel-CHUrT9EB.js +0 -7
  313. package/dist/gateway/static/root/assets/capability-presets-api-BB8t4Ja7.js +0 -1
  314. package/dist/gateway/static/root/assets/capability-presets-settings-panel-Cycrv0YV.js +0 -1
  315. package/dist/gateway/static/root/assets/channels-settings-V96gPUAU.js +0 -1
  316. package/dist/gateway/static/root/assets/channels-status-swr-Cz7SAAkm.js +0 -1
  317. package/dist/gateway/static/root/assets/connectors-page-BhlyQoQI.js +0 -2
  318. package/dist/gateway/static/root/assets/extension-settings-page-IyQrSILY.js +0 -1
  319. package/dist/gateway/static/root/assets/home-page-B2Kagoh8.js +0 -3
  320. package/dist/gateway/static/root/assets/html-workspace-editor-C3DKAkMc.js +0 -1
  321. package/dist/gateway/static/root/assets/index-CYT5DOzr.js +0 -150
  322. package/dist/gateway/static/root/assets/index-D6e3tPL-.css +0 -1
  323. package/dist/gateway/static/root/assets/local-app-workbench-page-BHYbFjqy.js +0 -2
  324. package/dist/gateway/static/root/assets/logs-page-IIn8Tess.js +0 -2
  325. package/dist/gateway/static/root/assets/messages-B4XqB8I6.js +0 -3
  326. package/dist/gateway/static/root/assets/notes-workbench-S2sBVOLw.js +0 -4
  327. package/dist/gateway/static/root/assets/project-detail-page-BilzoCJ7.js +0 -1
  328. package/dist/gateway/static/root/assets/projects-page-BoQUyacP.js +0 -1
  329. package/dist/gateway/static/root/assets/remote-access-hub-DUyUaCRF.js +0 -1
  330. package/dist/gateway/static/root/assets/sessions-page-Dzxlq1F0.js +0 -1
  331. package/dist/gateway/static/root/assets/settings-advanced-gate-TzwlZxU6.js +0 -1
  332. package/dist/gateway/static/root/assets/settings-page-DQmMKf8r.js +0 -1
  333. package/dist/gateway/static/root/assets/shares-settings-CkyuGlZK.js +0 -1
  334. package/dist/gateway/static/root/assets/skill-reload-api-BJCePQK5.js +0 -1
  335. package/dist/gateway/static/root/assets/skills-page-BYWLfmJi.js +0 -2
  336. package/dist/gateway/static/root/assets/skills-page.utils-Jhm24i4h.js +0 -1
  337. package/dist/gateway/static/root/assets/task-detail-page-DLAdxI6e.js +0 -1
  338. package/dist/gateway/static/root/assets/user-context-page-9AAFpGAL.js +0 -1
  339. package/dist/gateway/static/root/assets/voice-api-key-field-BISTPfq_.js +0 -1
  340. package/dist/gateway/static/root/assets/workflow-run-setup-panel-DHqHP8_6.js +0 -3
  341. package/dist/gateway/static/root/assets/workflows-page-0b4_DFHr.js +0 -11
  342. /package/dist/gateway/static/root/assets/{workflows-page-DLioOiRN.css → style-DLioOiRN.css} +0 -0
@@ -0,0 +1,20 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import type { ResolvedRuntime, RuntimeKind, RuntimeManagerOptions, RuntimeRequest, RuntimeStatus } from './types.js';
3
+ export declare class ManagedRuntimeManager extends EventEmitter {
4
+ private readonly options;
5
+ private readonly inFlight;
6
+ constructor(options: RuntimeManagerOptions);
7
+ defaultVersion(runtime: RuntimeKind): string;
8
+ resolve(request: RuntimeRequest): Promise<ResolvedRuntime>;
9
+ private resolveUncached;
10
+ probeManaged(runtime: RuntimeKind, requestedVersion: string): Promise<ResolvedRuntime | null>;
11
+ install(runtime: RuntimeKind, version?: string, signal?: AbortSignal): Promise<ResolvedRuntime>;
12
+ private installDistribution;
13
+ private installPython;
14
+ private installBundledPython;
15
+ private uvEnvironment;
16
+ status(runtime: RuntimeKind): Promise<RuntimeStatus>;
17
+ statusAll(): Promise<RuntimeStatus[]>;
18
+ repair(runtime: RuntimeKind): Promise<ResolvedRuntime>;
19
+ private progress;
20
+ }
@@ -0,0 +1,641 @@
1
+ import { createLogger } from "../utils/logger/index.js";
2
+ import { init_logger } from "../utils/logger.js";
3
+ import { RuntimeError } from "./errors.js";
4
+ import { atomicInstallRuntime, extractRuntimeArchive } from "./archive.js";
5
+ import { runRuntimeCommand } from "./command.js";
6
+ import { DEFAULT_RUNTIME_VERSIONS, RUNTIME_CATALOG_VERSION, detectRuntimePlatform, resolveRuntimeAsset } from "./catalog.js";
7
+ import { canFallbackRuntimeDownload, downloadVerifiedArchive } from "./downloader.js";
8
+ import { canFallbackPythonInstall, resolveRuntimeDownloadSource, runtimeGatewayPythonMirror } from "./download-source.js";
9
+ import { withInstallLock } from "./install-lock.js";
10
+ import { runtimeDownloadPath, runtimeLockPath, runtimeStagingDir, runtimeToolsRoot, runtimeVersionDir } from "./paths.js";
11
+ import { readRuntimeManifest, writeRuntimeManifest } from "./manifest-store.js";
12
+ import { bundledPythonArchiveName, resolveOfflineBundleArtifact } from "./offline-bundle.js";
13
+ import { parseRuntimeVersion, probeSystemRuntime, versionSatisfies } from "./probe.js";
14
+ import { dirname, join } from "node:path";
15
+ import { randomUUID } from "node:crypto";
16
+ import { access, mkdir, realpath, rename, rm } from "node:fs/promises";
17
+ import { EventEmitter } from "node:events";
18
+ //#region src/runtime-tools/manager.ts
19
+ init_logger();
20
+ const log = createLogger("RuntimeManager");
21
+ function executableName(name) {
22
+ return process.platform === "win32" ? `${name}.exe` : name;
23
+ }
24
+ function nodeExecutables(installDir) {
25
+ if (process.platform === "win32") return {
26
+ primary: join(installDir, "node.exe"),
27
+ node: join(installDir, "node.exe"),
28
+ npm: join(installDir, "npm.cmd"),
29
+ npx: join(installDir, "npx.cmd"),
30
+ corepack: join(installDir, "corepack.cmd")
31
+ };
32
+ const bin = join(installDir, "bin");
33
+ return {
34
+ primary: join(bin, "node"),
35
+ node: join(bin, "node"),
36
+ npm: join(bin, "npm"),
37
+ npx: join(bin, "npx"),
38
+ corepack: join(bin, "corepack")
39
+ };
40
+ }
41
+ function uvExecutables(installDir) {
42
+ const uv = join(installDir, executableName("uv"));
43
+ return {
44
+ primary: uv,
45
+ uv,
46
+ uvx: join(installDir, executableName("uvx"))
47
+ };
48
+ }
49
+ function runtimeConfig(options, runtime) {
50
+ if (runtime === "node") return options.config.node;
51
+ if (runtime === "python") return options.config.python;
52
+ return {
53
+ enabled: options.config.uv.enabled,
54
+ version: options.config.uv.version,
55
+ preference: "managed-only",
56
+ provision: "eager"
57
+ };
58
+ }
59
+ var ManagedRuntimeManager = class extends EventEmitter {
60
+ inFlight = /* @__PURE__ */ new Map();
61
+ constructor(options) {
62
+ super();
63
+ this.options = options;
64
+ }
65
+ defaultVersion(runtime) {
66
+ return runtimeConfig(this.options, runtime).version ?? DEFAULT_RUNTIME_VERSIONS[runtime];
67
+ }
68
+ async resolve(request) {
69
+ const config = runtimeConfig(this.options, request.runtime);
70
+ const requestedVersion = request.version ?? this.defaultVersion(request.runtime);
71
+ if (!this.options.config.enabled || !config.enabled) throw new RuntimeError(`${request.runtime} runtime is disabled`, "RUNTIME_DISABLED", request.runtime, "resolve", false);
72
+ const key = `${request.runtime}:${requestedVersion}:${request.allowProvision === true}`;
73
+ const existing = this.inFlight.get(key);
74
+ if (existing) return await existing;
75
+ const operation = this.resolveUncached(request.runtime, requestedVersion, request);
76
+ this.inFlight.set(key, operation);
77
+ try {
78
+ return await operation;
79
+ } finally {
80
+ this.inFlight.delete(key);
81
+ }
82
+ }
83
+ async resolveUncached(runtime, requestedVersion, request) {
84
+ const config = runtimeConfig(this.options, runtime);
85
+ const order = config.preference.startsWith("system") ? ["system", "managed"] : ["managed", "system"];
86
+ const allowed = config.preference.endsWith("only") ? order.slice(0, 1) : order;
87
+ for (const source of allowed) if (source === "managed") {
88
+ const managed = await this.probeManaged(runtime, requestedVersion);
89
+ if (managed) return managed;
90
+ if (request.allowProvision && config.provision !== "disabled") try {
91
+ return await this.install(runtime, requestedVersion, request.signal);
92
+ } catch (error) {
93
+ if (allowed.length === 1) throw error;
94
+ log.warn({
95
+ err: error,
96
+ runtime,
97
+ requestedVersion,
98
+ phase: "managed_install"
99
+ }, `Managed ${runtime} installation failed; checking the system runtime`);
100
+ }
101
+ } else {
102
+ const system = await probeSystemRuntime(runtime, requestedVersion);
103
+ if (system) return {
104
+ runtime,
105
+ version: system.version,
106
+ source: "system",
107
+ executable: system.executables.primary,
108
+ executables: system.executables
109
+ };
110
+ }
111
+ throw new RuntimeError(`${runtime} ${requestedVersion} is not available`, "RUNTIME_NOT_FOUND", runtime, "resolve", true, [`Run xopc runtime install ${runtime}`]);
112
+ }
113
+ async probeManaged(runtime, requestedVersion) {
114
+ const manifest = await readRuntimeManifest(this.options.stateDir, runtime);
115
+ if (!manifest || !versionSatisfies(manifest.version, requestedVersion)) return null;
116
+ try {
117
+ const toolsRoot = await realpath(runtimeToolsRoot(this.options.stateDir));
118
+ const installDir = await realpath(manifest.installDir);
119
+ if (installDir !== toolsRoot && !installDir.startsWith(`${toolsRoot}${process.platform === "win32" ? "\\" : "/"}`)) return null;
120
+ await access(manifest.executables.primary);
121
+ const result = await runRuntimeCommand({
122
+ command: manifest.executables.primary,
123
+ args: ["--version"]
124
+ });
125
+ const version = parseRuntimeVersion(`${result.stdout}\n${result.stderr}`);
126
+ if (!result.ok || !version || !versionSatisfies(version, requestedVersion)) return null;
127
+ if (runtime === "node") {
128
+ const npm = manifest.executables.npm;
129
+ const npx = manifest.executables.npx;
130
+ if (!npm || !npx) return null;
131
+ const [npmProbe, npxProbe] = await Promise.all([runRuntimeCommand({
132
+ command: npm,
133
+ args: ["--version"]
134
+ }), runRuntimeCommand({
135
+ command: npx,
136
+ args: ["--version"]
137
+ })]);
138
+ if (!npmProbe.ok || !npxProbe.ok) return null;
139
+ }
140
+ return {
141
+ runtime,
142
+ version,
143
+ source: "managed",
144
+ executable: manifest.executables.primary,
145
+ executables: manifest.executables,
146
+ installDir: manifest.installDir
147
+ };
148
+ } catch {
149
+ return null;
150
+ }
151
+ }
152
+ async install(runtime, version = this.defaultVersion(runtime), signal) {
153
+ const config = runtimeConfig(this.options, runtime);
154
+ if (!this.options.config.enabled || !config.enabled) throw new RuntimeError(`${runtime} runtime is disabled`, "RUNTIME_DISABLED", runtime, "install", false);
155
+ if (runtime === "python") return await this.installPython(version, signal);
156
+ return await this.installDistribution(runtime, version, signal);
157
+ }
158
+ async installDistribution(runtime, version, signal) {
159
+ const platform = detectRuntimePlatform();
160
+ if (!platform) throw new RuntimeError(`Managed ${runtime} is not supported on ${process.platform}-${process.arch}`, "RUNTIME_UNSUPPORTED", runtime, "resolve_asset", false);
161
+ const operationId = randomUUID();
162
+ const asset = resolveRuntimeAsset({
163
+ runtime,
164
+ version,
165
+ platform
166
+ });
167
+ const installDir = runtimeVersionDir(this.options.stateDir, runtime, version);
168
+ return await withInstallLock(runtimeLockPath(this.options.stateDir, runtime, version), {
169
+ operationId,
170
+ runtime,
171
+ version
172
+ }, async () => {
173
+ const ready = await this.probeManaged(runtime, version);
174
+ if (ready) return ready;
175
+ this.progress({
176
+ operationId,
177
+ runtime,
178
+ phase: "resolve",
179
+ message: `Preparing ${runtime} ${version}`
180
+ });
181
+ const offline = this.options.config.download.bundleDir ? await resolveOfflineBundleArtifact({
182
+ bundleDir: this.options.config.download.bundleDir,
183
+ runtime,
184
+ archiveFile: asset.archiveFile
185
+ }) : null;
186
+ let selectedDownload = offline ? null : await resolveRuntimeDownloadSource({
187
+ asset,
188
+ platform,
189
+ config: this.options.config.download,
190
+ signal,
191
+ onFallback: (message) => this.progress({
192
+ operationId,
193
+ runtime,
194
+ phase: "resolve",
195
+ message
196
+ })
197
+ });
198
+ let expectedSha256 = offline?.sha256 ?? selectedDownload.sha256;
199
+ let archivePath;
200
+ if (offline) archivePath = offline.archivePath;
201
+ else {
202
+ const download = async () => await downloadVerifiedArchive({
203
+ runtime,
204
+ url: selectedDownload.url,
205
+ targetPath: runtimeDownloadPath(this.options.stateDir, asset.archiveFile),
206
+ expectedSha256,
207
+ timeoutMs: this.options.config.download.timeoutMs,
208
+ proxy: this.options.config.download.proxy,
209
+ signal,
210
+ onProgress: (downloadedBytes, totalBytes) => this.progress({
211
+ operationId,
212
+ runtime,
213
+ phase: "download",
214
+ message: `Downloading ${runtime} ${version}`,
215
+ downloadedBytes,
216
+ totalBytes
217
+ })
218
+ });
219
+ try {
220
+ archivePath = await download();
221
+ } catch (error) {
222
+ if (signal?.aborted || this.options.config.download.source !== "auto" || selectedDownload.source !== "website" || !canFallbackRuntimeDownload(error)) throw error;
223
+ this.progress({
224
+ operationId,
225
+ runtime,
226
+ phase: "resolve",
227
+ message: `Runtime gateway download failed; downloading ${runtime} directly`
228
+ });
229
+ selectedDownload = await resolveRuntimeDownloadSource({
230
+ asset,
231
+ platform,
232
+ config: {
233
+ ...this.options.config.download,
234
+ source: "direct-only"
235
+ },
236
+ signal
237
+ });
238
+ expectedSha256 = selectedDownload.sha256;
239
+ archivePath = await download();
240
+ }
241
+ }
242
+ const stagingDir = runtimeStagingDir(this.options.stateDir, runtime, version, operationId);
243
+ this.progress({
244
+ operationId,
245
+ runtime,
246
+ phase: "extract",
247
+ message: `Extracting ${runtime} ${version}`
248
+ });
249
+ await atomicInstallRuntime(await extractRuntimeArchive({
250
+ runtime,
251
+ archivePath,
252
+ archiveType: asset.archiveType,
253
+ stagingDir
254
+ }), installDir);
255
+ await rm(stagingDir, {
256
+ recursive: true,
257
+ force: true
258
+ });
259
+ const executables = runtime === "node" ? nodeExecutables(installDir) : uvExecutables(installDir);
260
+ const probe = await runRuntimeCommand({
261
+ command: executables.primary,
262
+ args: ["--version"]
263
+ });
264
+ const actualVersion = parseRuntimeVersion(`${probe.stdout}\n${probe.stderr}`);
265
+ if (!probe.ok || !actualVersion || !versionSatisfies(actualVersion, version)) {
266
+ await rm(installDir, {
267
+ recursive: true,
268
+ force: true
269
+ });
270
+ throw new RuntimeError(`${runtime} ${version} failed its installation probe`, "RUNTIME_PROBE_FAILED", runtime, "probe", true);
271
+ }
272
+ let packageManagerVersion;
273
+ if (runtime === "node") {
274
+ const npmProbe = await runRuntimeCommand({
275
+ command: executables.npm,
276
+ args: ["--version"]
277
+ });
278
+ const npxProbe = await runRuntimeCommand({
279
+ command: executables.npx,
280
+ args: ["--version"]
281
+ });
282
+ if (!npmProbe.ok || !npxProbe.ok) {
283
+ await rm(installDir, {
284
+ recursive: true,
285
+ force: true
286
+ });
287
+ throw new RuntimeError(`Node ${version} is missing npm or npx`, "RUNTIME_PROBE_FAILED", runtime, "probe_package_manager", true);
288
+ }
289
+ packageManagerVersion = npmProbe.stdout;
290
+ }
291
+ const now = (/* @__PURE__ */ new Date()).toISOString();
292
+ const manifest = {
293
+ schemaVersion: 1,
294
+ runtime,
295
+ version: actualVersion,
296
+ source: "managed",
297
+ platform: process.platform,
298
+ arch: process.arch,
299
+ installDir,
300
+ executables,
301
+ installedAt: now,
302
+ verifiedAt: now,
303
+ distribution: {
304
+ url: offline ? `offline:${asset.archiveFile}` : selectedDownload.url,
305
+ sha256: expectedSha256,
306
+ archiveFile: asset.archiveFile,
307
+ catalogVersion: RUNTIME_CATALOG_VERSION
308
+ },
309
+ probe: {
310
+ versionOutput: probe.stdout || probe.stderr,
311
+ packageManagerVersion
312
+ }
313
+ };
314
+ await writeRuntimeManifest(this.options.stateDir, manifest);
315
+ this.progress({
316
+ operationId,
317
+ runtime,
318
+ phase: "complete",
319
+ message: `${runtime} ${actualVersion} is ready`
320
+ });
321
+ return {
322
+ runtime,
323
+ version: actualVersion,
324
+ source: "managed",
325
+ executable: executables.primary,
326
+ executables,
327
+ installDir
328
+ };
329
+ });
330
+ }
331
+ async installPython(version, signal) {
332
+ const operationId = randomUUID();
333
+ const installDir = runtimeVersionDir(this.options.stateDir, "python", version);
334
+ return await withInstallLock(runtimeLockPath(this.options.stateDir, "python", version), {
335
+ operationId,
336
+ runtime: "python",
337
+ version
338
+ }, async () => {
339
+ const ready = await this.probeManaged("python", version);
340
+ if (ready) return ready;
341
+ if (this.options.config.download.bundleDir) return await this.installBundledPython({
342
+ version,
343
+ operationId,
344
+ installDir,
345
+ bundleDir: this.options.config.download.bundleDir
346
+ });
347
+ const uv = await this.resolve({
348
+ runtime: "uv",
349
+ allowProvision: true,
350
+ signal
351
+ });
352
+ await mkdir(dirname(installDir), { recursive: true });
353
+ const uvEnv = this.uvEnvironment(installDir);
354
+ this.progress({
355
+ operationId,
356
+ runtime: "python",
357
+ phase: "install",
358
+ message: `Installing Python ${version}`
359
+ });
360
+ const installArgs = [
361
+ "python",
362
+ "install",
363
+ version,
364
+ "--install-dir",
365
+ installDir,
366
+ "--no-config"
367
+ ];
368
+ const runInstall = async (env) => await runRuntimeCommand({
369
+ command: uv.executable,
370
+ args: installArgs,
371
+ env,
372
+ timeoutMs: this.options.config.download.timeoutMs,
373
+ signal
374
+ });
375
+ let installProbe = this.options.config.download.source === "direct-only" ? await runInstall(uvEnv) : await runInstall({
376
+ ...uvEnv,
377
+ UV_PYTHON_INSTALL_MIRROR: runtimeGatewayPythonMirror(this.options.config.download.gatewayBaseUrl)
378
+ });
379
+ if (!installProbe.ok && !installProbe.aborted && this.options.config.download.source === "auto" && canFallbackPythonInstall(`${installProbe.stdout}\n${installProbe.stderr}`, installProbe.timedOut)) {
380
+ this.progress({
381
+ operationId,
382
+ runtime: "python",
383
+ phase: "install",
384
+ message: `Runtime gateway unavailable; installing Python ${version} directly`
385
+ });
386
+ installProbe = await runInstall(uvEnv);
387
+ }
388
+ if (!installProbe.ok) throw new RuntimeError(`Python ${version} installation failed: ${installProbe.stderr || installProbe.stdout}`, "RUNTIME_PROBE_FAILED", "python", "install", true);
389
+ const findProbe = await runRuntimeCommand({
390
+ command: uv.executable,
391
+ args: [
392
+ "python",
393
+ "find",
394
+ version,
395
+ "--managed-python",
396
+ "--no-config"
397
+ ],
398
+ env: uvEnv
399
+ });
400
+ const python = findProbe.stdout.split(/\r?\n/).find(Boolean)?.trim();
401
+ if (!findProbe.ok || !python) throw new RuntimeError(`Python ${version} executable was not found after installation`, "RUNTIME_PROBE_FAILED", "python", "find", true);
402
+ const versionProbe = await runRuntimeCommand({
403
+ command: python,
404
+ args: ["-I", "--version"],
405
+ env: uvEnv
406
+ });
407
+ const actualVersion = parseRuntimeVersion(`${versionProbe.stdout}\n${versionProbe.stderr}`);
408
+ if (!versionProbe.ok || !actualVersion || !versionSatisfies(actualVersion, version)) throw new RuntimeError(`Python ${version} failed its installation probe`, "RUNTIME_PROBE_FAILED", "python", "probe", true);
409
+ const executables = {
410
+ primary: python,
411
+ python
412
+ };
413
+ const now = (/* @__PURE__ */ new Date()).toISOString();
414
+ await writeRuntimeManifest(this.options.stateDir, {
415
+ schemaVersion: 1,
416
+ runtime: "python",
417
+ version: actualVersion,
418
+ source: "managed",
419
+ platform: process.platform,
420
+ arch: process.arch,
421
+ installDir,
422
+ executables,
423
+ installedAt: now,
424
+ verifiedAt: now,
425
+ probe: { versionOutput: versionProbe.stdout || versionProbe.stderr }
426
+ });
427
+ this.progress({
428
+ operationId,
429
+ runtime: "python",
430
+ phase: "complete",
431
+ message: `Python ${actualVersion} is ready`
432
+ });
433
+ return {
434
+ runtime: "python",
435
+ version: actualVersion,
436
+ source: "managed",
437
+ executable: python,
438
+ executables,
439
+ installDir
440
+ };
441
+ });
442
+ }
443
+ async installBundledPython(params) {
444
+ const platform = detectRuntimePlatform();
445
+ if (!platform) throw new RuntimeError(`Managed python is not supported on ${process.platform}-${process.arch}`, "RUNTIME_UNSUPPORTED", "python", "offline_bundle", false);
446
+ const archiveFile = bundledPythonArchiveName({
447
+ version: params.version,
448
+ platform
449
+ });
450
+ const artifact = await resolveOfflineBundleArtifact({
451
+ bundleDir: params.bundleDir,
452
+ runtime: "python",
453
+ archiveFile
454
+ });
455
+ const stagingDir = runtimeStagingDir(this.options.stateDir, "python", params.version, params.operationId);
456
+ this.progress({
457
+ operationId: params.operationId,
458
+ runtime: "python",
459
+ phase: "extract",
460
+ message: `Extracting Python ${params.version} from offline bundle`
461
+ });
462
+ await atomicInstallRuntime(await extractRuntimeArchive({
463
+ runtime: "python",
464
+ archivePath: artifact.archivePath,
465
+ archiveType: artifact.archiveType,
466
+ stagingDir
467
+ }), params.installDir);
468
+ await rm(stagingDir, {
469
+ recursive: true,
470
+ force: true
471
+ });
472
+ const candidates = process.platform === "win32" ? [join(params.installDir, "python.exe")] : [join(params.installDir, "bin", "python3"), join(params.installDir, "bin", "python")];
473
+ let python;
474
+ for (const candidate of candidates) try {
475
+ await access(candidate);
476
+ python = candidate;
477
+ break;
478
+ } catch {}
479
+ if (!python) {
480
+ await rm(params.installDir, {
481
+ recursive: true,
482
+ force: true
483
+ });
484
+ throw new RuntimeError(`Offline Python ${params.version} has no Python executable`, "RUNTIME_PROBE_FAILED", "python", "probe", true);
485
+ }
486
+ const probe = await runRuntimeCommand({
487
+ command: python,
488
+ args: ["-I", "--version"]
489
+ });
490
+ const actualVersion = parseRuntimeVersion(`${probe.stdout}\n${probe.stderr}`);
491
+ if (!probe.ok || !actualVersion || !versionSatisfies(actualVersion, params.version)) {
492
+ await rm(params.installDir, {
493
+ recursive: true,
494
+ force: true
495
+ });
496
+ throw new RuntimeError(`Offline Python ${params.version} failed its installation probe`, "RUNTIME_PROBE_FAILED", "python", "probe", true);
497
+ }
498
+ const executables = {
499
+ primary: python,
500
+ python
501
+ };
502
+ const now = (/* @__PURE__ */ new Date()).toISOString();
503
+ await writeRuntimeManifest(this.options.stateDir, {
504
+ schemaVersion: 1,
505
+ runtime: "python",
506
+ version: actualVersion,
507
+ source: "managed",
508
+ platform: process.platform,
509
+ arch: process.arch,
510
+ installDir: params.installDir,
511
+ executables,
512
+ installedAt: now,
513
+ verifiedAt: now,
514
+ distribution: {
515
+ url: `offline:${artifact.archiveFile}`,
516
+ sha256: artifact.sha256,
517
+ archiveFile: artifact.archiveFile,
518
+ catalogVersion: RUNTIME_CATALOG_VERSION
519
+ },
520
+ probe: { versionOutput: probe.stdout || probe.stderr }
521
+ });
522
+ this.progress({
523
+ operationId: params.operationId,
524
+ runtime: "python",
525
+ phase: "complete",
526
+ message: `Python ${actualVersion} is ready`
527
+ });
528
+ return {
529
+ runtime: "python",
530
+ version: actualVersion,
531
+ source: "managed",
532
+ executable: python,
533
+ executables,
534
+ installDir: params.installDir
535
+ };
536
+ }
537
+ uvEnvironment(pythonInstallDir) {
538
+ const toolsRoot = runtimeToolsRoot(this.options.stateDir);
539
+ const env = {
540
+ ...process.env,
541
+ UV_PYTHON_INSTALL_DIR: pythonInstallDir,
542
+ UV_PYTHON_BIN_DIR: join(toolsRoot, "python", "bin"),
543
+ UV_CACHE_DIR: join(toolsRoot, "cache", "uv"),
544
+ UV_MANAGED_PYTHON: "1",
545
+ UV_NO_CONFIG: "1",
546
+ UV_HTTP_TIMEOUT: String(Math.ceil(this.options.config.download.timeoutMs / 1e3))
547
+ };
548
+ delete env.UV_PYTHON_INSTALL_MIRROR;
549
+ if (this.options.config.download.proxy) {
550
+ env.HTTP_PROXY = this.options.config.download.proxy;
551
+ env.HTTPS_PROXY = this.options.config.download.proxy;
552
+ }
553
+ return env;
554
+ }
555
+ async status(runtime) {
556
+ const config = runtimeConfig(this.options, runtime);
557
+ const requestedVersion = this.defaultVersion(runtime);
558
+ if (!this.options.config.enabled || !config.enabled) return {
559
+ runtime,
560
+ state: "disabled",
561
+ requestedVersion,
562
+ message: "Runtime is disabled",
563
+ repairable: false
564
+ };
565
+ try {
566
+ const resolved = await this.resolve({
567
+ runtime,
568
+ version: requestedVersion,
569
+ allowProvision: false
570
+ });
571
+ return {
572
+ runtime,
573
+ state: "ready",
574
+ requestedVersion,
575
+ resolved,
576
+ message: `${runtime} ${resolved.version} is ready (${resolved.source})`,
577
+ repairable: false
578
+ };
579
+ } catch {}
580
+ if (await readRuntimeManifest(this.options.stateDir, runtime)) return {
581
+ runtime,
582
+ state: "corrupted",
583
+ requestedVersion,
584
+ message: `${runtime} managed installation is incomplete or invalid`,
585
+ repairable: true
586
+ };
587
+ return {
588
+ runtime,
589
+ state: "absent",
590
+ requestedVersion,
591
+ message: `${runtime} ${requestedVersion} is not installed`,
592
+ repairable: true
593
+ };
594
+ }
595
+ async statusAll() {
596
+ return await Promise.all([
597
+ "node",
598
+ "uv",
599
+ "python"
600
+ ].map((runtime) => this.status(runtime)));
601
+ }
602
+ async repair(runtime) {
603
+ const version = this.defaultVersion(runtime);
604
+ const installDir = runtimeVersionDir(this.options.stateDir, runtime, version);
605
+ const backupDir = `${installDir}.repair-backup-${randomUUID()}`;
606
+ let hasBackup = false;
607
+ try {
608
+ await rename(installDir, backupDir);
609
+ hasBackup = true;
610
+ } catch {}
611
+ try {
612
+ const resolved = await this.install(runtime, version);
613
+ if (hasBackup) await rm(backupDir, {
614
+ recursive: true,
615
+ force: true
616
+ });
617
+ return resolved;
618
+ } catch (error) {
619
+ if (hasBackup) {
620
+ await rm(installDir, {
621
+ recursive: true,
622
+ force: true
623
+ });
624
+ await rename(backupDir, installDir);
625
+ }
626
+ throw error;
627
+ }
628
+ }
629
+ progress(event) {
630
+ this.emit("progress", event);
631
+ log.info({
632
+ operationId: event.operationId,
633
+ runtime: event.runtime,
634
+ phase: event.phase,
635
+ downloadedBytes: event.downloadedBytes,
636
+ totalBytes: event.totalBytes
637
+ }, event.message);
638
+ }
639
+ };
640
+ //#endregion
641
+ export { ManagedRuntimeManager };
@@ -0,0 +1,3 @@
1
+ import type { InstalledRuntimeManifest, RuntimeKind } from './types.js';
2
+ export declare function readRuntimeManifest(stateDir: string, runtime: RuntimeKind): Promise<InstalledRuntimeManifest | null>;
3
+ export declare function writeRuntimeManifest(stateDir: string, manifest: InstalledRuntimeManifest): Promise<void>;
@@ -0,0 +1,26 @@
1
+ import { runtimeManifestPath } from "./paths.js";
2
+ import { dirname } from "node:path";
3
+ import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
4
+ //#region src/runtime-tools/manifest-store.ts
5
+ function isManifest(value, runtime) {
6
+ if (!value || typeof value !== "object") return false;
7
+ const item = value;
8
+ return item.schemaVersion === 1 && item.runtime === runtime && typeof item.version === "string" && typeof item.installDir === "string" && !!item.executables && typeof item.executables.primary === "string";
9
+ }
10
+ async function readRuntimeManifest(stateDir, runtime) {
11
+ try {
12
+ const parsed = JSON.parse(await readFile(runtimeManifestPath(stateDir, runtime), "utf8"));
13
+ return isManifest(parsed, runtime) ? parsed : null;
14
+ } catch {
15
+ return null;
16
+ }
17
+ }
18
+ async function writeRuntimeManifest(stateDir, manifest) {
19
+ const target = runtimeManifestPath(stateDir, manifest.runtime);
20
+ await mkdir(dirname(target), { recursive: true });
21
+ const temporary = `${target}.${process.pid}.tmp`;
22
+ await writeFile(temporary, `${JSON.stringify(manifest, null, 2)}\n`, { mode: 384 });
23
+ await rename(temporary, target);
24
+ }
25
+ //#endregion
26
+ export { readRuntimeManifest, writeRuntimeManifest };
@@ -0,0 +1,9 @@
1
+ import { type RequestInit, type Response } from 'undici';
2
+ export declare function fetchRuntimeResource(params: {
3
+ url: string;
4
+ timeoutMs: number;
5
+ proxy?: string;
6
+ signal?: AbortSignal;
7
+ init?: Omit<RequestInit, 'dispatcher' | 'signal'>;
8
+ }): Promise<Response>;
9
+ export declare function readRuntimeResponseText(response: Response, maxBytes: number): Promise<string>;