@xopcai/xopc 0.0.106 → 0.0.107

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 (370) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/dashscope/xopc.extension.json +7 -2
  3. package/dist/extensions/fal/xopc.extension.json +7 -2
  4. package/dist/extensions/feishu/src/adapters/gateway-setup.js +22 -26
  5. package/dist/extensions/feishu/src/adapters/gateway-setup.js.map +1 -1
  6. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  7. package/dist/extensions/feishu/src/workflow-progress.js +1 -1
  8. package/dist/extensions/feishu/xopc.extension.json +458 -26
  9. package/dist/extensions/google/xopc.extension.json +7 -2
  10. package/dist/extensions/minimax/xopc.extension.json +8 -2
  11. package/dist/extensions/openai/xopc.extension.json +7 -2
  12. package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
  13. package/dist/extensions/telegram/src/inbound-processor.js +1 -1
  14. package/dist/extensions/telegram/src/plugin.js +1 -1
  15. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  16. package/dist/extensions/telegram/src/update-offset-store.js +1 -1
  17. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  18. package/dist/extensions/telegram/xopc.extension.json +10 -2
  19. package/dist/extensions/weixin/src/api/api.js +2 -2
  20. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  21. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  22. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  23. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  24. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  25. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  26. package/dist/extensions/weixin/src/plugin.js +1 -1
  27. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  28. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  29. package/dist/extensions/weixin/xopc.extension.json +57 -14
  30. package/dist/gateway/static/root/apple-touch-icon.png +0 -0
  31. package/dist/gateway/static/root/assets/agents-BXg2_mE4.js +78 -0
  32. package/dist/gateway/static/root/assets/apps-page-CJqQ-7Ss.js +1 -0
  33. package/dist/gateway/static/root/assets/channels-settings-DvMZ6NAd.js +1 -0
  34. package/dist/gateway/static/root/assets/cron-page-BPBlvSl5.js +1 -0
  35. package/dist/gateway/static/root/assets/{dist-OM9qGfm5.js → dist-CZh0c-s8.js} +1 -1
  36. package/dist/gateway/static/root/assets/{extension-debug-page-D-WHrr_w.js → extension-debug-page-DyJQR0SR.js} +1 -1
  37. package/dist/gateway/static/root/assets/{extension-page-CCgjSoKn.js → extension-page-CDTuUr9B.js} +1 -1
  38. package/dist/gateway/static/root/assets/{extension-settings-page-BJH5a-Gn.js → extension-settings-page-DszZ8zHD.js} +1 -1
  39. package/dist/gateway/static/root/assets/{fetch-CkvRO30i.js → fetch-CFdKBnE6.js} +1 -1
  40. package/dist/gateway/static/root/assets/{gateway-startup-retry-BkKyRDrF.js → gateway-startup-retry-DdngdObI.js} +1 -1
  41. package/dist/gateway/static/root/assets/{heartbeat-config-api-CVyP6pFj.js → heartbeat-config-api-U10wnPdc.js} +1 -1
  42. package/dist/gateway/static/root/assets/index-DBc-bVOQ.js +4845 -0
  43. package/dist/gateway/static/root/assets/index-DI5_GsZt.css +1 -0
  44. package/dist/gateway/static/root/assets/{logs-page-R6Vv_Ja6.js → logs-page-B6js8Bfi.js} +2 -2
  45. package/dist/gateway/static/root/assets/{note-detail-page-BUDarLhh.js → note-detail-page-DFzAXR35.js} +4 -4
  46. package/dist/gateway/static/root/assets/{note-time-Cc2-T21g.js → note-time-DOiSU-10.js} +1 -1
  47. package/dist/gateway/static/root/assets/notes-page-DAuZJMT8.js +1 -0
  48. package/dist/gateway/static/root/assets/{schema-form-CrlOmEZt.js → schema-form-zM36dvbY.js} +1 -1
  49. package/dist/gateway/static/root/assets/sessions-page-CAsV03BY.js +1 -0
  50. package/dist/gateway/static/root/assets/{settings-advanced-gate-BBAQxxew.js → settings-advanced-gate-BCvObK1y.js} +1 -1
  51. package/dist/gateway/static/root/assets/{settings-form-section-DjPD-ErC.js → settings-form-section-Bvl-RInc.js} +1 -1
  52. package/dist/gateway/static/root/assets/settings-page-DuCJDd74.js +3 -0
  53. package/dist/gateway/static/root/assets/{share-preview-page-BjvPht3V.js → share-preview-page-rpL4DDTO.js} +1 -1
  54. package/dist/gateway/static/root/assets/skills-page--BioR9J4.js +2 -0
  55. package/dist/gateway/static/root/assets/{theme-store-DYgVdRB4.js → theme-store-BZozwAeK.js} +1 -1
  56. package/dist/gateway/static/root/assets/url-DQRqHuL-.js +3 -0
  57. package/dist/gateway/static/root/assets/voice-api-key-field-D2RJaoj_.js +1 -0
  58. package/dist/gateway/static/root/assets/{workflow-page.utils-D4sqR0yX.js → workflow-page.utils-BxacHYen.js} +1 -1
  59. package/dist/gateway/static/root/assets/workflows-page-B1B-est-.js +18 -0
  60. package/dist/gateway/static/root/favicon-16.png +0 -0
  61. package/dist/gateway/static/root/favicon-32.png +0 -0
  62. package/dist/gateway/static/root/favicon.ico +0 -0
  63. package/dist/gateway/static/root/favicon.svg +18 -0
  64. package/dist/gateway/static/root/index.html +11 -10
  65. package/dist/package.js +1 -1
  66. package/dist/src/agent/agent-manager.js +7 -7
  67. package/dist/src/agent/agent-scope.js +1 -1
  68. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  69. package/dist/src/agent/context/workspace-seed.js +2 -2
  70. package/dist/src/agent/context/workspace-state.js +1 -1
  71. package/dist/src/agent/goals/goal-run-store.js +4 -4
  72. package/dist/src/agent/goals/persistent-goal-service.js +1 -1
  73. package/dist/src/agent/goals/post-turn.js +2 -2
  74. package/dist/src/agent/image/load-image-media.js +2 -2
  75. package/dist/src/agent/ipc/bus.js +1 -1
  76. package/dist/src/agent/ipc/inbox.js +2 -2
  77. package/dist/src/agent/ipc/socket.js +1 -1
  78. package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
  79. package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
  80. package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
  81. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  82. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  83. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  84. package/dist/src/agent/memory/dreaming/events.js +1 -1
  85. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  86. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  87. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  88. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  89. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  90. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  91. package/dist/src/agent/memory/memory-flush.js +1 -1
  92. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  93. package/dist/src/agent/models/manager.js +1 -1
  94. package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
  95. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  96. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  97. package/dist/src/agent/sandbox/path-policy.js +2 -2
  98. package/dist/src/agent/service.js +4 -4
  99. package/dist/src/agent/session/session-inspector.js +1 -1
  100. package/dist/src/agent/skills/config.js +1 -1
  101. package/dist/src/agent/skills/hub-hash.js +2 -2
  102. package/dist/src/agent/skills/hub-lock.js +1 -1
  103. package/dist/src/agent/skills/hub-pull.js +2 -2
  104. package/dist/src/agent/skills/index.js +1 -1
  105. package/dist/src/agent/skills/managed-store.js +1 -1
  106. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +4 -0
  107. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js +4 -2
  108. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -1
  109. package/dist/src/agent/skills/scanner.js +1 -1
  110. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  111. package/dist/src/agent/skills/skill-manager.js +1 -1
  112. package/dist/src/agent/starter-agents.d.ts +19 -0
  113. package/dist/src/agent/starter-agents.js +190 -0
  114. package/dist/src/agent/starter-agents.js.map +1 -0
  115. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  116. package/dist/src/agent/tools/factory.js +1 -1
  117. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  118. package/dist/src/agent/tools/send-media.js +1 -1
  119. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  120. package/dist/src/agent/tools/workflow-tool.js +1 -1
  121. package/dist/src/agent/tools/write.js +1 -1
  122. package/dist/src/agent/workflow/catalog.js +1 -1
  123. package/dist/src/agent/workflow/runtime.js +49 -15
  124. package/dist/src/agent/workflow/runtime.js.map +1 -1
  125. package/dist/src/agent/workflow/types.d.ts +11 -0
  126. package/dist/src/auth/credentials.js +3 -3
  127. package/dist/src/auth/profiles/store.js +2 -2
  128. package/dist/src/auth/sync-provider-auth.js +1 -1
  129. package/dist/src/browser/cache-dir-policy.js +1 -1
  130. package/dist/src/browser/cdp-local-launcher.js +2 -2
  131. package/dist/src/browser/providers/browser-ext-install.js +3 -3
  132. package/dist/src/browser/providers/cloakbrowser.js +4 -4
  133. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  134. package/dist/src/browser/stealth.js +1 -1
  135. package/dist/src/channels/catalog/channel-catalog-service.js +13 -0
  136. package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -1
  137. package/dist/src/channels/outbound/persist-store.js +1 -1
  138. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  139. package/dist/src/channels/pairing/pairing-store.js +2 -2
  140. package/dist/src/channels/plugins/types.adapters.d.ts +2 -0
  141. package/dist/src/chat-commands/agent-edit.js +2 -2
  142. package/dist/src/chat-commands/builtins/config.js +2 -2
  143. package/dist/src/chat-commands/context.js +1 -1
  144. package/dist/src/cli/commands/config.js +1 -1
  145. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  146. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  147. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  148. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  149. package/dist/src/cli/commands/extension-create.d.ts +2 -0
  150. package/dist/src/cli/commands/extension-create.js +165 -0
  151. package/dist/src/cli/commands/extension-create.js.map +1 -0
  152. package/dist/src/cli/commands/extension-dev.js +1 -3
  153. package/dist/src/cli/commands/extension-dev.js.map +1 -1
  154. package/dist/src/cli/commands/extension-marketplace.js +105 -81
  155. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  156. package/dist/src/cli/commands/extension-pack.d.ts +13 -0
  157. package/dist/src/cli/commands/extension-pack.js +159 -91
  158. package/dist/src/cli/commands/extension-pack.js.map +1 -1
  159. package/dist/src/cli/commands/extension.d.ts +2 -0
  160. package/dist/src/cli/commands/extension.js +375 -3
  161. package/dist/src/cli/commands/extension.js.map +1 -1
  162. package/dist/src/cli/commands/gateway/logs.js +1 -1
  163. package/dist/src/cli/commands/gateway/run-foreground.js +1 -2
  164. package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
  165. package/dist/src/cli/commands/image.js +1 -1
  166. package/dist/src/cli/commands/init.js +3 -3
  167. package/dist/src/cli/commands/models.js +1 -1
  168. package/dist/src/cli/commands/onboard/model.js +2 -2
  169. package/dist/src/cli/commands/onboard.js +0 -2
  170. package/dist/src/cli/commands/onboard.js.map +1 -1
  171. package/dist/src/cli/commands/setup.js +0 -2
  172. package/dist/src/cli/commands/setup.js.map +1 -1
  173. package/dist/src/cli/utils/init-workspace-core.js +10 -7
  174. package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
  175. package/dist/src/config/agent-profile.js +1 -1
  176. package/dist/src/config/agent-typed-models.js +1 -1
  177. package/dist/src/config/gateway-bind.js +1 -1
  178. package/dist/src/config/index.js +5 -5
  179. package/dist/src/config/loader.js +2 -2
  180. package/dist/src/config/models-json.js +2 -2
  181. package/dist/src/config/paths-state.js +1 -1
  182. package/dist/src/config/paths.d.ts +2 -2
  183. package/dist/src/config/paths.js +6 -5
  184. package/dist/src/config/paths.js.map +1 -1
  185. package/dist/src/config/profile.js +2 -2
  186. package/dist/src/config/schema.d.ts +2 -0
  187. package/dist/src/config/schema.js +3 -1
  188. package/dist/src/config/schema.js.map +1 -1
  189. package/dist/src/config/workspace-path.js +1 -1
  190. package/dist/src/cron/executor.js +2 -2
  191. package/dist/src/cron/persistence.js +1 -1
  192. package/dist/src/daemon/constants.js +1 -1
  193. package/dist/src/daemon/install-plan.js +2 -2
  194. package/dist/src/daemon/launchd.js +2 -2
  195. package/dist/src/daemon/schtasks.js +2 -2
  196. package/dist/src/daemon/systemd.js +2 -2
  197. package/dist/src/extensions/api.d.ts +4 -2
  198. package/dist/src/extensions/api.js +31 -12
  199. package/dist/src/extensions/api.js.map +1 -1
  200. package/dist/src/extensions/bundle-mcp.js +1 -1
  201. package/dist/src/extensions/discover-extensions.js +2 -1
  202. package/dist/src/extensions/discover-extensions.js.map +1 -1
  203. package/dist/src/extensions/health.js +1 -1
  204. package/dist/src/extensions/install.d.ts +1 -0
  205. package/dist/src/extensions/install.js +51 -8
  206. package/dist/src/extensions/install.js.map +1 -1
  207. package/dist/src/extensions/loader.d.ts +0 -4
  208. package/dist/src/extensions/loader.js +55 -88
  209. package/dist/src/extensions/loader.js.map +1 -1
  210. package/dist/src/extensions/lockfile.d.ts +9 -1
  211. package/dist/src/extensions/lockfile.js +2 -2
  212. package/dist/src/extensions/lockfile.js.map +1 -1
  213. package/dist/src/extensions/normalize-manifest.js +20 -4
  214. package/dist/src/extensions/normalize-manifest.js.map +1 -1
  215. package/dist/src/extensions/package-contract.d.ts +12 -0
  216. package/dist/src/extensions/package-contract.js +59 -0
  217. package/dist/src/extensions/package-contract.js.map +1 -0
  218. package/dist/src/extensions/sdk/core.d.ts +1 -1
  219. package/dist/src/extensions/sdk/index.d.ts +1 -1
  220. package/dist/src/extensions/sdk/index.js.map +1 -1
  221. package/dist/src/extensions/types/manifest.d.ts +15 -0
  222. package/dist/src/extensions/update.js +1 -1
  223. package/dist/src/gateway/agents-admin.d.ts +0 -8
  224. package/dist/src/gateway/agents-admin.js +3 -28
  225. package/dist/src/gateway/agents-admin.js.map +1 -1
  226. package/dist/src/gateway/file-path-classifier.js +2 -2
  227. package/dist/src/gateway/heartbeat/service.js +1 -1
  228. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  229. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  230. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  231. package/dist/src/gateway/hono/oauth-async.js +1 -1
  232. package/dist/src/gateway/hono/oauth.js +1 -1
  233. package/dist/src/gateway/hono/routes/agents.js +2 -56
  234. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  235. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  236. package/dist/src/gateway/hono/routes/channels.js +10 -1
  237. package/dist/src/gateway/hono/routes/channels.js.map +1 -1
  238. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  239. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  240. package/dist/src/gateway/hono/routes/host-fs.js +2 -2
  241. package/dist/src/gateway/hono/routes/models.js +1 -1
  242. package/dist/src/gateway/hono/routes/shares.js +1 -1
  243. package/dist/src/gateway/hono/routes/workflows.js +130 -0
  244. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  245. package/dist/src/gateway/hono/routes/workspace.js +2 -2
  246. package/dist/src/gateway/lock.js +3 -3
  247. package/dist/src/gateway/ports.js +1 -1
  248. package/dist/src/gateway/service/agent-runner.js +2 -2
  249. package/dist/src/gateway/service/marketplace-service.js +2 -2
  250. package/dist/src/gateway/service.d.ts +2 -0
  251. package/dist/src/gateway/service.js +45 -1
  252. package/dist/src/gateway/service.js.map +1 -1
  253. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  254. package/dist/src/heartbeat/index.js +1 -1
  255. package/dist/src/infra/brew.js +1 -1
  256. package/dist/src/infra/package-json.js +1 -1
  257. package/dist/src/infra/package-update-steps.js +1 -1
  258. package/dist/src/infra/path-env.js +2 -2
  259. package/dist/src/infra/restart.js +2 -2
  260. package/dist/src/infra/stable-node-path.js +1 -1
  261. package/dist/src/infra/update-check.js +1 -1
  262. package/dist/src/infra/update-global.js +1 -1
  263. package/dist/src/infra/update-lock.js +3 -3
  264. package/dist/src/infra/update-runner.js +1 -1
  265. package/dist/src/infra/update-startup.js +2 -2
  266. package/dist/src/infra/write-file-atomic.js +2 -2
  267. package/dist/src/media/store.js +1 -1
  268. package/dist/src/notes/agent-context.d.ts +12 -4
  269. package/dist/src/notes/agent-context.js +1 -1
  270. package/dist/src/notes/agent-context.js.map +1 -1
  271. package/dist/src/notes/store.js +2 -2
  272. package/dist/src/project-trust/trust-store.js +2 -2
  273. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  274. package/dist/src/providers/index.js +2 -2
  275. package/dist/src/providers/model-registry.js +1 -1
  276. package/dist/src/session/init-session-turn.js +2 -2
  277. package/dist/src/session/resolve-session.js +3 -3
  278. package/dist/src/session/session-title.js +2 -2
  279. package/dist/src/session/store.js +2 -2
  280. package/dist/src/share/share-auto.js +2 -2
  281. package/dist/src/share/share-store.js +3 -3
  282. package/dist/src/share/share-thumbnail.js +2 -2
  283. package/dist/src/share/share-zip.js +1 -1
  284. package/dist/src/share/site-share-store.js +3 -3
  285. package/dist/src/share/site-static-serve.js +1 -1
  286. package/dist/src/storage/sqlite/connection.js +2 -2
  287. package/dist/src/storage/sqlite/memory-index-repository.js +2 -2
  288. package/dist/src/storage/sqlite/migrations/discover.js +1 -1
  289. package/dist/src/storage/sqlite/migrations/runner.js +1 -1
  290. package/dist/src/storage/sqlite/schema.js +1 -1
  291. package/dist/src/tui/backends/embedded-backend.js +1 -8
  292. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  293. package/dist/src/tui/backends/gateway-sse-backend.js +0 -7
  294. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  295. package/dist/src/tui/clipboard-image.js +3 -3
  296. package/dist/src/tui/theme-manager.js +1 -1
  297. package/dist/src/tui/tui-backend.d.ts +0 -1
  298. package/dist/src/tui/tui-command-formatters.js +3 -3
  299. package/dist/src/tui/tui-commands.js +3 -3
  300. package/dist/src/tui/tui-commands.js.map +1 -1
  301. package/dist/src/tui/tui-keybindings-file.js +1 -1
  302. package/dist/src/tui/tui-picker-overlay.js +1 -1
  303. package/dist/src/tui/tui-picker-overlay.js.map +1 -1
  304. package/dist/src/tui/tui-scoped-models.js +2 -2
  305. package/dist/src/tui/tui-settings.js +1 -1
  306. package/dist/src/tui/tui-startup-resources.js +1 -1
  307. package/dist/src/tui/tui.js +5 -5
  308. package/dist/src/tunnel/frpc-binary.js +3 -3
  309. package/dist/src/tunnel/frpc-config.js +1 -1
  310. package/dist/src/tunnel/frpc-extract.js +1 -1
  311. package/dist/src/tunnel/tunnel-state.js +1 -1
  312. package/dist/src/utils/logger/audit.js +1 -1
  313. package/dist/src/utils/logger/log-store.js +1 -1
  314. package/dist/src/utils/logger/rotation.js +1 -1
  315. package/dist/src/voice/tts/audio.js +1 -1
  316. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  317. package/dist/src/workflows/domain/definition-utils.d.ts +1 -0
  318. package/dist/src/workflows/domain/definition-utils.js +32 -2
  319. package/dist/src/workflows/domain/definition-utils.js.map +1 -1
  320. package/dist/src/workflows/domain/definition.d.ts +2 -0
  321. package/dist/src/workflows/domain/event.d.ts +2 -1
  322. package/dist/src/workflows/domain/index.d.ts +1 -0
  323. package/dist/src/workflows/domain/index.js +3 -2
  324. package/dist/src/workflows/domain/run.d.ts +27 -1
  325. package/dist/src/workflows/domain/run.js.map +1 -1
  326. package/dist/src/workflows/domain/schema-validation.d.ts +8 -0
  327. package/dist/src/workflows/domain/schema-validation.js +28 -0
  328. package/dist/src/workflows/domain/schema-validation.js.map +1 -0
  329. package/dist/src/workflows/draft/index.d.ts +3 -0
  330. package/dist/src/workflows/draft/index.js +3 -0
  331. package/dist/src/workflows/draft/workflow-draft-prompt.d.ts +23 -0
  332. package/dist/src/workflows/draft/workflow-draft-prompt.js +98 -0
  333. package/dist/src/workflows/draft/workflow-draft-prompt.js.map +1 -0
  334. package/dist/src/workflows/draft/workflow-draft-service.d.ts +12 -0
  335. package/dist/src/workflows/draft/workflow-draft-service.js +131 -0
  336. package/dist/src/workflows/draft/workflow-draft-service.js.map +1 -0
  337. package/dist/src/workflows/draft/workflow-draft-validator.d.ts +4 -0
  338. package/dist/src/workflows/draft/workflow-draft-validator.js +133 -0
  339. package/dist/src/workflows/draft/workflow-draft-validator.js.map +1 -0
  340. package/dist/src/workflows/draft/workflow-draft.types.d.ts +44 -0
  341. package/dist/src/workflows/draft/workflow-draft.types.js +1 -0
  342. package/dist/src/workflows/engine/projector.js +1 -0
  343. package/dist/src/workflows/engine/projector.js.map +1 -1
  344. package/dist/src/workflows/engine/workflow-engine.d.ts +18 -0
  345. package/dist/src/workflows/engine/workflow-engine.js +320 -11
  346. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  347. package/dist/src/workflows/index.js +4 -3
  348. package/dist/src/workflows/service/workflow-run-service.d.ts +14 -3
  349. package/dist/src/workflows/service/workflow-run-service.js +227 -6
  350. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  351. package/dist/src/workflows/service/workflow-run-service.types.d.ts +7 -2
  352. package/dist/src/workflows/store/event-store.js +1 -1
  353. package/dist/src/workflows/store/run-store.js +1 -1
  354. package/package.json +4 -2
  355. package/dist/gateway/static/root/assets/agents-3eP0vqFO.js +0 -396
  356. package/dist/gateway/static/root/assets/apps-page-CZ2ZKrko.js +0 -1
  357. package/dist/gateway/static/root/assets/channels-settings-BbETa93K.js +0 -1
  358. package/dist/gateway/static/root/assets/cron-page-DCtUkHMu.js +0 -1
  359. package/dist/gateway/static/root/assets/index-BPYKW7FB.css +0 -1
  360. package/dist/gateway/static/root/assets/index-CEZxETzw.js +0 -4845
  361. package/dist/gateway/static/root/assets/notes-page-EAHl16bq.js +0 -1
  362. package/dist/gateway/static/root/assets/sessions-page-Ce_xuuSB.js +0 -1
  363. package/dist/gateway/static/root/assets/settings-page-KhQ9QgH0.js +0 -3
  364. package/dist/gateway/static/root/assets/skills-page-C0laq7l1.js +0 -2
  365. package/dist/gateway/static/root/assets/url-DPEStU4M.js +0 -3
  366. package/dist/gateway/static/root/assets/voice-api-key-field-DeGckWkl.js +0 -1
  367. package/dist/gateway/static/root/assets/workflows-page-DFjM95g5.js +0 -27
  368. package/dist/src/agent/builtin-agent-ids.d.ts +0 -2
  369. package/dist/src/agent/builtin-agent-ids.js +0 -17
  370. package/dist/src/agent/builtin-agent-ids.js.map +0 -1
@@ -3,10 +3,13 @@ import { createLogger } from "../../utils/logger/index.js";
3
3
  import { init_logger } from "../../utils/logger.js";
4
4
  import { init_normalize_manifest, normalizeExtensionManifest } from "../../extensions/normalize-manifest.js";
5
5
  import { checkEngineCompatibility } from "../../extensions/engine-check.js";
6
+ import { collectExtensionPackageDependencyIssues } from "../../extensions/package-contract.js";
6
7
  import { colors } from "../utils/colors.js";
7
- import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, statSync } from "node:fs";
8
- import { isAbsolute, join, resolve } from "node:path";
8
+ import { basename, join, relative, resolve } from "node:path";
9
+ import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from "node:fs";
10
+ import { createHash } from "node:crypto";
9
11
  import { execSync } from "node:child_process";
12
+ import AdmZip from "adm-zip";
10
13
  import { Command } from "commander";
11
14
  //#region src/cli/commands/extension-pack.ts
12
15
  init_normalize_manifest();
@@ -62,18 +65,8 @@ function collectContributionPaths(manifest, extRoot) {
62
65
  return out;
63
66
  }
64
67
  function resolveMainFile(root, main) {
65
- const cands = [
66
- main,
67
- "index.ts",
68
- "index.js",
69
- "extension.ts",
70
- "extension.js"
71
- ].filter((x) => typeof x === "string" && x.length > 0);
72
- for (const c of cands) {
73
- const p = join(root, c);
74
- if (existsSync(p)) return p;
75
- }
76
- return null;
68
+ const p = join(root, main);
69
+ return existsSync(p) ? p : null;
77
70
  }
78
71
  function validateManifest(ctx) {
79
72
  const { manifest, extensionDir, diagnostics } = ctx;
@@ -81,9 +74,13 @@ function validateManifest(ctx) {
81
74
  level: "error",
82
75
  message: "Manifest \"id\" is required"
83
76
  });
84
- if (!resolveMainFile(extensionDir, manifest.main)) diagnostics.push({
77
+ if (!manifest.main) diagnostics.push({
78
+ level: "error",
79
+ message: "Manifest \"main\" is required and must point at built JavaScript"
80
+ });
81
+ if (!(manifest.main ? resolveMainFile(extensionDir, manifest.main) : null)) diagnostics.push({
85
82
  level: "error",
86
- message: `Main entry not found (expected main, index.ts, index.js, etc. in ${extensionDir})`
83
+ message: `Main entry not found: ${manifest.main ?? "(missing)"}`
87
84
  });
88
85
  if (manifest.ui?.main) {
89
86
  if (!existsSync(join(extensionDir, manifest.ui.main))) diagnostics.push({
@@ -95,32 +92,37 @@ function validateManifest(ctx) {
95
92
  level: "error",
96
93
  message: `UI contribution entry missing: ${p}`
97
94
  });
98
- if (manifest.engines?.xopc) {
95
+ if (manifest.main && !/\.(mjs|cjs|js)$/i.test(manifest.main)) diagnostics.push({
96
+ level: "error",
97
+ message: `Strict package contract requires manifest.main to point at built JavaScript, got "${manifest.main}"`
98
+ });
99
+ if (!manifest.engines?.xopc) diagnostics.push({
100
+ level: "error",
101
+ message: "manifest engines.xopc is required for independent extension packages"
102
+ });
103
+ else {
99
104
  const r = checkEngineCompatibility(PACKAGE_VERSION, manifest.engines.xopc);
100
105
  if (r.parseWarning) diagnostics.push({
101
- level: "warning",
102
- message: `engines.xopc parse issue — ${r.reason ?? "unknown"} (continuing)`
106
+ level: "error",
107
+ message: `engines.xopc parse issue — ${r.reason ?? "unknown"}`
103
108
  });
104
109
  else if (!r.compatible) diagnostics.push({
105
- level: "warning",
110
+ level: "error",
106
111
  message: `engines.xopc not satisfied by current xopc ${PACKAGE_VERSION}: ${r.reason ?? manifest.engines.xopc}`
107
112
  });
108
113
  }
109
114
  }
110
115
  function validatePackageJson(ctx) {
111
116
  const { packageJson, diagnostics, extensionDir } = ctx;
112
- const deps = packageJson.dependencies;
113
- if (isRecord(deps)) {
114
- for (const [name, v] of Object.entries(deps)) if (typeof v === "string" && v.startsWith("workspace:")) diagnostics.push({
115
- level: "warning",
116
- message: `dependency "${name}": ${v} — will be replaced when packing from a pnpm workspace`
117
- });
118
- }
117
+ for (const issue of collectExtensionPackageDependencyIssues(packageJson, { strictRuntimeSdkDeps: true })) diagnostics.push({
118
+ level: "error",
119
+ message: issue.message
120
+ });
119
121
  const files = packageJson.files;
120
122
  if (Array.isArray(files)) {
121
123
  if (!files.some((f) => f === MANIFEST || f === "**/xopc.extension.json")) diagnostics.push({
122
- level: "warning",
123
- message: `package.json "files" should include "${MANIFEST}" so the archive ships the manifest`
124
+ level: "error",
125
+ message: `package.json "files" must include "${MANIFEST}" so the archive ships the manifest`
124
126
  });
125
127
  }
126
128
  const keywords = packageJson.keywords;
@@ -137,14 +139,123 @@ function validatePackageJson(ctx) {
137
139
  message: "package.json is missing"
138
140
  });
139
141
  }
140
- function pnpmAvailable() {
142
+ const SECRET_FILE_RE = /(^|\/)(\.env(?:\..*)?|\.npmrc|\.yarnrc|id_rsa|id_ed25519|.*\.(?:pem|key|p12|pfx))$/i;
143
+ const SECRET_TEXT_RE = /(sk-[A-Za-z0-9_-]{20,}|xox[baprs]-[A-Za-z0-9-]{20,}|AKIA[0-9A-Z]{16}|-----BEGIN (?:RSA |OPENSSH |EC |DSA )?PRIVATE KEY-----)/;
144
+ function scanUnsafeFiles(root, diagnostics) {
145
+ const walk = (dir) => {
146
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
147
+ const full = join(dir, entry.name);
148
+ const rel = relative(root, full).replace(/\\/g, "/");
149
+ if (shouldExcludeFromArtifact(rel)) continue;
150
+ if (SECRET_FILE_RE.test(rel)) {
151
+ diagnostics.push({
152
+ level: "error",
153
+ message: `Unsafe secret-like file would be packaged: ${rel}`
154
+ });
155
+ continue;
156
+ }
157
+ if (entry.isDirectory()) walk(full);
158
+ else if (entry.isFile()) {
159
+ if (statSync(full).size <= 1024 * 1024 && /\.(?:js|mjs|cjs|json|html|css|md|txt|map)$/i.test(entry.name)) {
160
+ const text = readFileSync(full, "utf-8");
161
+ if (SECRET_TEXT_RE.test(text)) diagnostics.push({
162
+ level: "error",
163
+ message: `Potential secret token found in packaged file: ${rel}`
164
+ });
165
+ }
166
+ }
167
+ }
168
+ };
169
+ walk(root);
170
+ }
171
+ function validateExtensionPackageDirectory(dir) {
172
+ const extensionDir = resolve(dir || ".");
173
+ const diagnostics = [];
174
+ if (!existsSync(extensionDir) || !existsSync(join(extensionDir, "package.json"))) {
175
+ diagnostics.push({
176
+ level: "error",
177
+ message: `Not an extension project (no package.json): ${extensionDir}`
178
+ });
179
+ return {
180
+ extensionDir,
181
+ manifest: null,
182
+ packageJson: null,
183
+ diagnostics,
184
+ ok: false
185
+ };
186
+ }
187
+ const manifest = loadManifestAtRoot(extensionDir, diagnostics);
188
+ let packageJson = null;
141
189
  try {
142
- execSync("pnpm --version", { stdio: "pipe" });
143
- return true;
144
- } catch {
145
- return false;
190
+ packageJson = loadJson(join(extensionDir, "package.json"));
191
+ if (!isRecord(packageJson)) throw new Error("package.json must be an object");
192
+ } catch (e) {
193
+ diagnostics.push({
194
+ level: "error",
195
+ message: e instanceof Error ? e.message : String(e)
196
+ });
197
+ }
198
+ if (manifest && packageJson) {
199
+ const ctx = {
200
+ extensionDir,
201
+ manifest,
202
+ packageJson,
203
+ diagnostics
204
+ };
205
+ validateManifest(ctx);
206
+ validatePackageJson(ctx);
207
+ scanUnsafeFiles(extensionDir, diagnostics);
208
+ }
209
+ return {
210
+ extensionDir,
211
+ manifest,
212
+ packageJson,
213
+ diagnostics,
214
+ ok: !diagnostics.some((d) => d.level === "error")
215
+ };
216
+ }
217
+ function shouldExcludeFromArtifact(rel) {
218
+ const parts = rel.split(/[\\/]+/);
219
+ if (parts.some((p) => p === "node_modules" || p === ".git" || p === ".turbo" || p === ".cache")) return true;
220
+ const name = parts.at(-1) ?? rel;
221
+ if (name === ".DS_Store") return true;
222
+ if (name.endsWith(".tgz") || name.endsWith(".zip") || name.endsWith(".sha256") || name.endsWith(".manifest.json")) return true;
223
+ if (name.endsWith(".tsbuildinfo")) return true;
224
+ return false;
225
+ }
226
+ function addDirectoryToZip(zip, root, dir) {
227
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
228
+ const full = join(dir, entry.name);
229
+ const rel = relative(root, full).replace(/\\/g, "/");
230
+ if (shouldExcludeFromArtifact(rel)) continue;
231
+ if (entry.isDirectory()) addDirectoryToZip(zip, root, full);
232
+ else if (entry.isFile()) zip.addFile(rel, readFileSync(full));
146
233
  }
147
234
  }
235
+ function writeStoreReadyArtifact(params) {
236
+ mkdirSync(params.outDir, { recursive: true });
237
+ const name = String(params.packageJson.name ?? params.manifest.id).replace(/^@/, "").replace(/[\\/]+/g, "-").replace(/[^A-Za-z0-9._-]+/g, "-");
238
+ const version = String(params.manifest.version ?? params.packageJson.version ?? "0.0.0");
239
+ const base = `${name}-${version}`;
240
+ const zipPath = join(params.outDir, `${base}.zip`);
241
+ const zip = new AdmZip();
242
+ addDirectoryToZip(zip, params.extensionDir, params.extensionDir);
243
+ zip.writeZip(zipPath);
244
+ const buffer = readFileSync(zipPath);
245
+ const sha256Hex = createHash("sha256").update(buffer).digest("hex");
246
+ const integrity = `sha256-${createHash("sha256").update(buffer).digest("base64")}`;
247
+ writeFileSync(join(params.outDir, `${base}.sha256`), `${sha256Hex} ${basename(zipPath)}\n`);
248
+ writeFileSync(join(params.outDir, `${base}.manifest.json`), JSON.stringify({
249
+ id: params.manifest.id,
250
+ name: params.manifest.name,
251
+ version,
252
+ artifact: basename(zipPath),
253
+ integrity,
254
+ manifest: params.manifest,
255
+ packageJson: params.packageJson
256
+ }, null, 2));
257
+ return zipPath;
258
+ }
148
259
  function printDiagnostics(d) {
149
260
  for (const x of d) if (x.level === "error") console.error(`${colors.red("error")}:`, x.message);
150
261
  else if (x.level === "warning") console.log(`${colors.yellow("warning")}:`, x.message);
@@ -152,37 +263,11 @@ function printDiagnostics(d) {
152
263
  }
153
264
  function createExtensionPackCommand() {
154
265
  return new Command("pack").description("Package an extension as a .tgz archive for distribution").argument("[dir]", "Extension directory (default: current working directory)", ".").option("--out <dir>", "Output directory for the .tgz (default: extension directory)", "").option("--no-build-ui", "Skip automatic \"npm run build:ui\" when defined").option("--dry-run", "Validate only; do not create an archive", false).action((dir, opts) => {
155
- const extensionDir = resolve(dir || ".");
266
+ const validation = validateExtensionPackageDirectory(dir || ".");
267
+ const { extensionDir, manifest, packageJson, diagnostics } = validation;
156
268
  const outDir = opts.out && opts.out.length > 0 ? resolve(opts.out) : extensionDir;
157
- const diagnostics = [];
158
- if (!existsSync(extensionDir) || !existsSync(join(extensionDir, "package.json"))) {
159
- console.error(colors.red("error:"), `Not an extension project (no package.json): ${extensionDir}`);
160
- process.exit(1);
161
- }
162
- const manifest = loadManifestAtRoot(extensionDir, diagnostics);
163
- if (!manifest) {
164
- printDiagnostics(diagnostics);
165
- process.exit(1);
166
- }
167
- let packageJson;
168
- try {
169
- packageJson = loadJson(join(extensionDir, "package.json"));
170
- if (!isRecord(packageJson)) throw new Error("package.json must be an object");
171
- } catch (e) {
172
- log.error({ err: e }, "Failed to read package.json");
173
- console.error(colors.red("error:"), e instanceof Error ? e.message : String(e));
174
- process.exit(1);
175
- }
176
- const ctx = {
177
- extensionDir,
178
- manifest,
179
- packageJson,
180
- diagnostics
181
- };
182
- validateManifest(ctx);
183
- validatePackageJson(ctx);
184
269
  printDiagnostics(diagnostics);
185
- if (diagnostics.some((d) => d.level === "error")) {
270
+ if (!validation.ok || !manifest || !packageJson) {
186
271
  console.error(colors.red("Pack validation failed (fix errors above)."));
187
272
  process.exit(1);
188
273
  }
@@ -201,43 +286,26 @@ function createExtensionPackCommand() {
201
286
  console.error(colors.red("error:"), `UI build failed: ${e instanceof Error ? e.message : String(e)}`);
202
287
  process.exit(1);
203
288
  }
204
- let tarball;
289
+ let artifactPath;
205
290
  try {
206
- const lines = execSync(pnpmAvailable() ? "pnpm pack" : "npm pack", {
207
- cwd: extensionDir,
208
- encoding: "utf-8"
209
- }).split(/\r?\n/).map((l) => l.trim()).filter(Boolean);
210
- const line = lines.slice().reverse().find((l) => l.endsWith(".tgz") && !l.startsWith("WARN")) ?? lines.at(-1) ?? "";
211
- if (line.endsWith(".tgz")) tarball = isAbsolute(line) || line.startsWith("file:") ? resolve(line.replace(/^file:/, "")) : join(extensionDir, line);
212
- else tarball = "";
213
- if (!tarball) {
214
- const tgzs = readdirSync(extensionDir).filter((f) => f.endsWith(".tgz"));
215
- tgzs.sort((a, b) => statSync(join(extensionDir, b)).mtimeMs - statSync(join(extensionDir, a)).mtimeMs);
216
- const last = tgzs[0];
217
- tarball = last ? join(extensionDir, last) : "";
218
- }
219
- if (!tarball || !existsSync(tarball)) throw new Error("Could not locate .tgz after pack; check pnpm/npm output");
291
+ artifactPath = writeStoreReadyArtifact({
292
+ extensionDir,
293
+ outDir,
294
+ manifest,
295
+ packageJson
296
+ });
220
297
  } catch (e) {
221
298
  log.error({ err: e }, "pack failed");
222
299
  console.error(colors.red("error:"), e instanceof Error ? e.message : String(e));
223
300
  process.exit(1);
224
301
  }
225
- if (outDir !== extensionDir) try {
226
- mkdirSync(outDir, { recursive: true });
227
- const dest = join(outDir, tarball.includes("/") ? tarball.slice(tarball.lastIndexOf("/") + 1) : tarball);
228
- renameSync(tarball, dest);
229
- tarball = dest;
230
- } catch (e) {
231
- console.error(colors.red("error:"), `Failed to move archive to --out: ${e instanceof Error ? e.message : String(e)}`);
232
- process.exit(1);
233
- }
234
- const displayPath = tarball;
235
302
  console.log("");
236
- console.log(colors.green("Pack complete:"), displayPath);
237
- console.log(colors.cyan("Next:"), "install the .tgz with your extension workflow, or extract into the global / workspace extensions directory.");
303
+ console.log(colors.green("Pack complete:"), artifactPath);
304
+ console.log(colors.cyan("Generated:"), ".zip artifact, .sha256 checksum, .manifest.json metadata");
305
+ console.log(colors.cyan("Next:"), "upload the generated artifact set to store.xopc.ai or install the zip via the store pipeline.");
238
306
  });
239
307
  }
240
308
  //#endregion
241
- export { createExtensionPackCommand };
309
+ export { createExtensionPackCommand, validateExtensionPackageDirectory };
242
310
 
243
311
  //# sourceMappingURL=extension-pack.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"extension-pack.js","names":[],"sources":["../../../../src/cli/commands/extension-pack.ts"],"sourcesContent":["import { execSync } from 'node:child_process';\nimport { existsSync, readFileSync, readdirSync, renameSync, mkdirSync, statSync } from 'node:fs';\nimport { isAbsolute, join, resolve } from 'node:path';\n\nimport { Command } from 'commander';\n\nimport { checkEngineCompatibility } from '../../extensions/engine-check.js';\nimport type { ExtensionManifest } from '../../extensions/types/index.js';\nimport { normalizeExtensionManifest } from '../../extensions/normalize-manifest.js';\nimport { PACKAGE_VERSION } from '../../package-version.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { colors } from '../utils/colors.js';\n\nconst log = createLogger('ExtensionPack');\nconst MANIFEST = 'xopc.extension.json';\n\ninterface PackContext {\n extensionDir: string;\n manifest: ExtensionManifest;\n packageJson: Record<string, unknown>;\n diagnostics: PackDiagnostic[];\n}\n\ninterface PackDiagnostic {\n level: 'error' | 'warning' | 'info';\n message: string;\n}\n\nfunction isRecord(x: unknown): x is Record<string, unknown> {\n return typeof x === 'object' && x !== null && !Array.isArray(x);\n}\n\nfunction loadJson(path: string): unknown {\n return JSON.parse(readFileSync(path, 'utf-8') as string) as unknown;\n}\n\nfunction loadManifestAtRoot(\n root: string,\n diagnostics: PackDiagnostic[],\n): ExtensionManifest | null {\n const manifestPath = join(root, MANIFEST);\n if (!existsSync(manifestPath)) {\n diagnostics.push({ level: 'error', message: `Missing ${MANIFEST} in ${root}` });\n return null;\n }\n try {\n const raw = loadJson(manifestPath);\n if (!isRecord(raw)) {\n diagnostics.push({ level: 'error', message: `${MANIFEST} must be a JSON object` });\n return null;\n }\n return normalizeExtensionManifest(raw);\n } catch (e) {\n diagnostics.push({\n level: 'error',\n message: `Failed to parse ${MANIFEST}: ${e instanceof Error ? e.message : String(e)}`,\n });\n return null;\n }\n}\n\nfunction collectContributionPaths(manifest: ExtensionManifest, extRoot: string): string[] {\n const out: string[] = [];\n const ui = manifest.ui;\n if (ui?.main) out.push(join(extRoot, ui.main));\n if (ui?.icon) out.push(join(extRoot, ui.icon));\n const c = ui?.contributions;\n if (!c) return out;\n for (const p of c.sidebarPanels ?? []) {\n if (p.entrypoint) out.push(join(extRoot, p.entrypoint));\n }\n for (const p of c.settingsPanels ?? []) {\n if (p.entrypoint) out.push(join(extRoot, p.entrypoint));\n }\n for (const p of c.chatWidgets ?? []) {\n if (p.entrypoint) out.push(join(extRoot, p.entrypoint));\n }\n for (const p of c.pages ?? []) {\n if (p.entrypoint) out.push(join(extRoot, p.entrypoint));\n }\n for (const p of c.statusBarItems ?? []) {\n if (p.entrypoint) out.push(join(extRoot, p.entrypoint));\n }\n return out;\n}\n\nfunction resolveMainFile(root: string, main?: string): string | null {\n const cands = [main, 'index.ts', 'index.js', 'extension.ts', 'extension.js'].filter(\n (x): x is string => typeof x === 'string' && x.length > 0,\n );\n for (const c of cands) {\n const p = join(root, c);\n if (existsSync(p)) return p;\n }\n return null;\n}\n\nfunction validateManifest(ctx: PackContext): void {\n const { manifest, extensionDir, diagnostics } = ctx;\n if (!manifest.id || !String(manifest.id).trim()) {\n diagnostics.push({ level: 'error', message: 'Manifest \"id\" is required' });\n }\n const mainFile = resolveMainFile(extensionDir, manifest.main);\n if (!mainFile) {\n diagnostics.push({\n level: 'error',\n message: `Main entry not found (expected main, index.ts, index.js, etc. in ${extensionDir})`,\n });\n }\n\n if (manifest.ui?.main) {\n const p = join(extensionDir, manifest.ui.main);\n if (!existsSync(p)) {\n diagnostics.push({ level: 'error', message: `ui.main missing: ${manifest.ui.main}` });\n }\n }\n\n for (const p of collectContributionPaths(manifest, extensionDir)) {\n if (!existsSync(p)) {\n diagnostics.push({ level: 'error', message: `UI contribution entry missing: ${p}` });\n }\n }\n\n if (manifest.engines?.xopc) {\n const r = checkEngineCompatibility(PACKAGE_VERSION, manifest.engines.xopc);\n if (r.parseWarning) {\n diagnostics.push({\n level: 'warning',\n message: `engines.xopc parse issue — ${r.reason ?? 'unknown'} (continuing)`,\n });\n } else if (!r.compatible) {\n diagnostics.push({\n level: 'warning',\n message: `engines.xopc not satisfied by current xopc ${PACKAGE_VERSION}: ${r.reason ?? manifest.engines.xopc}`,\n });\n }\n }\n}\n\nfunction validatePackageJson(ctx: PackContext): void {\n const { packageJson, diagnostics, extensionDir } = ctx;\n const deps = packageJson.dependencies;\n if (isRecord(deps)) {\n for (const [name, v] of Object.entries(deps)) {\n if (typeof v === 'string' && v.startsWith('workspace:')) {\n diagnostics.push({\n level: 'warning',\n message: `dependency \"${name}\": ${v} — will be replaced when packing from a pnpm workspace`,\n });\n }\n }\n }\n\n const files = packageJson.files;\n if (Array.isArray(files)) {\n if (!files.some((f) => f === MANIFEST || f === '**/xopc.extension.json')) {\n diagnostics.push({\n level: 'warning',\n message: `package.json \"files\" should include \"${MANIFEST}\" so the archive ships the manifest`,\n });\n }\n }\n\n const keywords = packageJson.keywords;\n if (Array.isArray(keywords) && !keywords.includes('xopc-extension')) {\n diagnostics.push({\n level: 'info',\n message: 'Consider adding \"xopc-extension\" to package.json keywords for discoverability',\n });\n } else if (!Array.isArray(keywords)) {\n diagnostics.push({ level: 'info', message: 'Consider adding keywords: [\"xopc-extension\", ...]' });\n }\n\n if (!existsSync(join(extensionDir, 'package.json'))) {\n diagnostics.push({ level: 'error', message: 'package.json is missing' });\n }\n}\n\nfunction pnpmAvailable(): boolean {\n try {\n execSync('pnpm --version', { stdio: 'pipe' });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction printDiagnostics(d: PackDiagnostic[]): void {\n for (const x of d) {\n if (x.level === 'error') {\n console.error(`${colors.red('error')}:`, x.message);\n } else if (x.level === 'warning') {\n console.log(`${colors.yellow('warning')}:`, x.message);\n } else {\n console.log(`${colors.cyan('info')}:`, x.message);\n }\n }\n}\n\nexport function createExtensionPackCommand(): Command {\n return new Command('pack')\n .description('Package an extension as a .tgz archive for distribution')\n .argument('[dir]', 'Extension directory (default: current working directory)', '.')\n .option('--out <dir>', 'Output directory for the .tgz (default: extension directory)', '')\n .option('--no-build-ui', 'Skip automatic \"npm run build:ui\" when defined')\n .option('--dry-run', 'Validate only; do not create an archive', false)\n .action((dir: string, opts: { out?: string; buildUi: boolean; dryRun: boolean }) => {\n const extensionDir = resolve(dir || '.');\n const outDir = opts.out && opts.out.length > 0 ? resolve(opts.out) : extensionDir;\n const diagnostics: PackDiagnostic[] = [];\n if (!existsSync(extensionDir) || !existsSync(join(extensionDir, 'package.json'))) {\n console.error(\n colors.red('error:'),\n `Not an extension project (no package.json): ${extensionDir}`,\n );\n process.exit(1);\n }\n const manifest = loadManifestAtRoot(extensionDir, diagnostics);\n if (!manifest) {\n printDiagnostics(diagnostics);\n process.exit(1);\n }\n\n let packageJson: Record<string, unknown>;\n try {\n packageJson = loadJson(join(extensionDir, 'package.json')) as Record<string, unknown>;\n if (!isRecord(packageJson)) {\n throw new Error('package.json must be an object');\n }\n } catch (e) {\n log.error({ err: e }, 'Failed to read package.json');\n console.error(\n colors.red('error:'),\n e instanceof Error ? e.message : String(e),\n );\n process.exit(1);\n }\n\n const ctx: PackContext = { extensionDir, manifest, packageJson, diagnostics };\n validateManifest(ctx);\n validatePackageJson(ctx);\n\n printDiagnostics(diagnostics);\n\n const hasError = diagnostics.some((d) => d.level === 'error');\n if (hasError) {\n console.error(colors.red('Pack validation failed (fix errors above).'));\n process.exit(1);\n }\n\n if (opts.dryRun) {\n console.log(colors.green('OK'), ' — dry run; no archive created');\n return;\n }\n\n const scripts = isRecord(packageJson.scripts) ? (packageJson.scripts as Record<string, unknown>) : null;\n if (opts.buildUi && scripts && typeof scripts['build:ui'] === 'string') {\n try {\n console.log(colors.cyan('Running'), 'npm run build:ui …');\n execSync('npm run build:ui', { cwd: extensionDir, stdio: 'inherit' });\n } catch (e) {\n console.error(\n colors.red('error:'),\n `UI build failed: ${e instanceof Error ? e.message : String(e)}`,\n );\n process.exit(1);\n }\n }\n\n let tarball: string;\n try {\n const cmd = pnpmAvailable() ? 'pnpm pack' : 'npm pack';\n const out = execSync(cmd, { cwd: extensionDir, encoding: 'utf-8' });\n const lines = out\n .split(/\\r?\\n/)\n .map((l) => l.trim())\n .filter(Boolean);\n const line = lines\n .slice()\n .reverse()\n .find((l) => l.endsWith('.tgz') && !l.startsWith('WARN')) ?? lines.at(-1) ?? '';\n if (line.endsWith('.tgz')) {\n tarball = isAbsolute(line) || line.startsWith('file:') ? resolve(line.replace(/^file:/, '')) : join(extensionDir, line);\n } else {\n tarball = '';\n }\n if (!tarball) {\n const tgzs = readdirSync(extensionDir).filter((f) => f.endsWith('.tgz'));\n tgzs.sort(\n (a, b) => statSync(join(extensionDir, b)).mtimeMs - statSync(join(extensionDir, a)).mtimeMs,\n );\n const last = tgzs[0];\n tarball = last ? join(extensionDir, last) : '';\n }\n if (!tarball || !existsSync(tarball)) {\n throw new Error('Could not locate .tgz after pack; check pnpm/npm output');\n }\n } catch (e) {\n log.error({ err: e }, 'pack failed');\n console.error(\n colors.red('error:'),\n e instanceof Error ? e.message : String(e),\n );\n process.exit(1);\n }\n\n if (outDir !== extensionDir) {\n try {\n mkdirSync(outDir, { recursive: true });\n const base = tarball.includes('/') ? tarball.slice(tarball.lastIndexOf('/') + 1) : tarball;\n const dest = join(outDir, base);\n renameSync(tarball, dest);\n tarball = dest;\n } catch (e) {\n console.error(\n colors.red('error:'),\n `Failed to move archive to --out: ${e instanceof Error ? e.message : String(e)}`,\n );\n process.exit(1);\n }\n }\n\n const displayPath = tarball;\n console.log('');\n console.log(colors.green('Pack complete:'), displayPath);\n console.log(\n colors.cyan('Next:'),\n 'install the .tgz with your extension workflow, or extract into the global / workspace extensions directory.',\n );\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"extension-pack.js","names":[],"sources":["../../../../src/cli/commands/extension-pack.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport { execSync } from 'node:child_process';\nimport { existsSync, readFileSync, readdirSync, mkdirSync, statSync, writeFileSync } from 'node:fs';\nimport { basename, join, relative, resolve } from 'node:path';\n\nimport AdmZip from 'adm-zip';\nimport { Command } from 'commander';\n\nimport { checkEngineCompatibility } from '../../extensions/engine-check.js';\nimport type { ExtensionManifest } from '../../extensions/types/index.js';\nimport { normalizeExtensionManifest } from '../../extensions/normalize-manifest.js';\nimport { collectExtensionPackageDependencyIssues } from '../../extensions/package-contract.js';\nimport { PACKAGE_VERSION } from '../../package-version.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { colors } from '../utils/colors.js';\n\nconst log = createLogger('ExtensionPack');\nconst MANIFEST = 'xopc.extension.json';\n\ninterface PackContext {\n extensionDir: string;\n manifest: ExtensionManifest;\n packageJson: Record<string, unknown>;\n diagnostics: PackDiagnostic[];\n}\n\nexport interface PackDiagnostic {\n level: 'error' | 'warning' | 'info';\n message: string;\n}\n\nexport interface ExtensionPackageValidationResult {\n extensionDir: string;\n manifest: ExtensionManifest | null;\n packageJson: Record<string, unknown> | null;\n diagnostics: PackDiagnostic[];\n ok: boolean;\n}\n\nfunction isRecord(x: unknown): x is Record<string, unknown> {\n return typeof x === 'object' && x !== null && !Array.isArray(x);\n}\n\nfunction loadJson(path: string): unknown {\n return JSON.parse(readFileSync(path, 'utf-8') as string) as unknown;\n}\n\nfunction loadManifestAtRoot(\n root: string,\n diagnostics: PackDiagnostic[],\n): ExtensionManifest | null {\n const manifestPath = join(root, MANIFEST);\n if (!existsSync(manifestPath)) {\n diagnostics.push({ level: 'error', message: `Missing ${MANIFEST} in ${root}` });\n return null;\n }\n try {\n const raw = loadJson(manifestPath);\n if (!isRecord(raw)) {\n diagnostics.push({ level: 'error', message: `${MANIFEST} must be a JSON object` });\n return null;\n }\n return normalizeExtensionManifest(raw);\n } catch (e) {\n diagnostics.push({\n level: 'error',\n message: `Failed to parse ${MANIFEST}: ${e instanceof Error ? e.message : String(e)}`,\n });\n return null;\n }\n}\n\nfunction collectContributionPaths(manifest: ExtensionManifest, extRoot: string): string[] {\n const out: string[] = [];\n const ui = manifest.ui;\n if (ui?.main) out.push(join(extRoot, ui.main));\n if (ui?.icon) out.push(join(extRoot, ui.icon));\n const c = ui?.contributions;\n if (!c) return out;\n for (const p of c.sidebarPanels ?? []) {\n if (p.entrypoint) out.push(join(extRoot, p.entrypoint));\n }\n for (const p of c.settingsPanels ?? []) {\n if (p.entrypoint) out.push(join(extRoot, p.entrypoint));\n }\n for (const p of c.chatWidgets ?? []) {\n if (p.entrypoint) out.push(join(extRoot, p.entrypoint));\n }\n for (const p of c.pages ?? []) {\n if (p.entrypoint) out.push(join(extRoot, p.entrypoint));\n }\n for (const p of c.statusBarItems ?? []) {\n if (p.entrypoint) out.push(join(extRoot, p.entrypoint));\n }\n return out;\n}\n\nfunction resolveMainFile(root: string, main: string): string | null {\n const p = join(root, main);\n return existsSync(p) ? p : null;\n}\n\nfunction validateManifest(ctx: PackContext): void {\n const { manifest, extensionDir, diagnostics } = ctx;\n if (!manifest.id || !String(manifest.id).trim()) {\n diagnostics.push({ level: 'error', message: 'Manifest \"id\" is required' });\n }\n if (!manifest.main) {\n diagnostics.push({ level: 'error', message: 'Manifest \"main\" is required and must point at built JavaScript' });\n }\n const mainFile = manifest.main ? resolveMainFile(extensionDir, manifest.main) : null;\n if (!mainFile) {\n diagnostics.push({\n level: 'error',\n message: `Main entry not found: ${manifest.main ?? '(missing)'}`,\n });\n }\n\n if (manifest.ui?.main) {\n const p = join(extensionDir, manifest.ui.main);\n if (!existsSync(p)) {\n diagnostics.push({ level: 'error', message: `ui.main missing: ${manifest.ui.main}` });\n }\n }\n\n for (const p of collectContributionPaths(manifest, extensionDir)) {\n if (!existsSync(p)) {\n diagnostics.push({ level: 'error', message: `UI contribution entry missing: ${p}` });\n }\n }\n\n if (manifest.main && !/\\.(mjs|cjs|js)$/i.test(manifest.main)) {\n diagnostics.push({\n level: 'error',\n message: `Strict package contract requires manifest.main to point at built JavaScript, got \"${manifest.main}\"`,\n });\n }\n\n if (!manifest.engines?.xopc) {\n diagnostics.push({\n level: 'error',\n message: 'manifest engines.xopc is required for independent extension packages',\n });\n } else {\n const r = checkEngineCompatibility(PACKAGE_VERSION, manifest.engines.xopc);\n if (r.parseWarning) {\n diagnostics.push({\n level: 'error',\n message: `engines.xopc parse issue — ${r.reason ?? 'unknown'}`,\n });\n } else if (!r.compatible) {\n diagnostics.push({\n level: 'error',\n message: `engines.xopc not satisfied by current xopc ${PACKAGE_VERSION}: ${r.reason ?? manifest.engines.xopc}`,\n });\n }\n }\n}\n\nfunction validatePackageJson(ctx: PackContext): void {\n const { packageJson, diagnostics, extensionDir } = ctx;\n for (const issue of collectExtensionPackageDependencyIssues(packageJson, {\n strictRuntimeSdkDeps: true,\n })) {\n diagnostics.push({\n level: 'error',\n message: issue.message,\n });\n }\n\n const files = packageJson.files;\n if (Array.isArray(files)) {\n if (!files.some((f) => f === MANIFEST || f === '**/xopc.extension.json')) {\n diagnostics.push({\n level: 'error',\n message: `package.json \"files\" must include \"${MANIFEST}\" so the archive ships the manifest`,\n });\n }\n }\n\n const keywords = packageJson.keywords;\n if (Array.isArray(keywords) && !keywords.includes('xopc-extension')) {\n diagnostics.push({\n level: 'info',\n message: 'Consider adding \"xopc-extension\" to package.json keywords for discoverability',\n });\n } else if (!Array.isArray(keywords)) {\n diagnostics.push({ level: 'info', message: 'Consider adding keywords: [\"xopc-extension\", ...]' });\n }\n\n if (!existsSync(join(extensionDir, 'package.json'))) {\n diagnostics.push({ level: 'error', message: 'package.json is missing' });\n }\n}\n\nconst SECRET_FILE_RE = /(^|\\/)(\\.env(?:\\..*)?|\\.npmrc|\\.yarnrc|id_rsa|id_ed25519|.*\\.(?:pem|key|p12|pfx))$/i;\nconst SECRET_TEXT_RE = /(sk-[A-Za-z0-9_-]{20,}|xox[baprs]-[A-Za-z0-9-]{20,}|AKIA[0-9A-Z]{16}|-----BEGIN (?:RSA |OPENSSH |EC |DSA )?PRIVATE KEY-----)/;\n\nfunction scanUnsafeFiles(root: string, diagnostics: PackDiagnostic[]): void {\n const walk = (dir: string) => {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const full = join(dir, entry.name);\n const rel = relative(root, full).replace(/\\\\/g, '/');\n if (shouldExcludeFromArtifact(rel)) continue;\n if (SECRET_FILE_RE.test(rel)) {\n diagnostics.push({ level: 'error', message: `Unsafe secret-like file would be packaged: ${rel}` });\n continue;\n }\n if (entry.isDirectory()) {\n walk(full);\n } else if (entry.isFile()) {\n const size = statSync(full).size;\n if (size <= 1024 * 1024 && /\\.(?:js|mjs|cjs|json|html|css|md|txt|map)$/i.test(entry.name)) {\n const text = readFileSync(full, 'utf-8');\n if (SECRET_TEXT_RE.test(text)) {\n diagnostics.push({ level: 'error', message: `Potential secret token found in packaged file: ${rel}` });\n }\n }\n }\n }\n };\n walk(root);\n}\n\nexport function validateExtensionPackageDirectory(dir: string): ExtensionPackageValidationResult {\n const extensionDir = resolve(dir || '.');\n const diagnostics: PackDiagnostic[] = [];\n if (!existsSync(extensionDir) || !existsSync(join(extensionDir, 'package.json'))) {\n diagnostics.push({ level: 'error', message: `Not an extension project (no package.json): ${extensionDir}` });\n return { extensionDir, manifest: null, packageJson: null, diagnostics, ok: false };\n }\n const manifest = loadManifestAtRoot(extensionDir, diagnostics);\n let packageJson: Record<string, unknown> | null = null;\n try {\n packageJson = loadJson(join(extensionDir, 'package.json')) as Record<string, unknown>;\n if (!isRecord(packageJson)) throw new Error('package.json must be an object');\n } catch (e) {\n diagnostics.push({ level: 'error', message: e instanceof Error ? e.message : String(e) });\n }\n if (manifest && packageJson) {\n const ctx: PackContext = { extensionDir, manifest, packageJson, diagnostics };\n validateManifest(ctx);\n validatePackageJson(ctx);\n scanUnsafeFiles(extensionDir, diagnostics);\n }\n return {\n extensionDir,\n manifest,\n packageJson,\n diagnostics,\n ok: !diagnostics.some((d) => d.level === 'error'),\n };\n}\n\nfunction shouldExcludeFromArtifact(rel: string): boolean {\n const parts = rel.split(/[\\\\/]+/);\n if (parts.some((p) => p === 'node_modules' || p === '.git' || p === '.turbo' || p === '.cache')) return true;\n const name = parts.at(-1) ?? rel;\n if (name === '.DS_Store') return true;\n if (name.endsWith('.tgz') || name.endsWith('.zip') || name.endsWith('.sha256') || name.endsWith('.manifest.json')) return true;\n if (name.endsWith('.tsbuildinfo')) return true;\n return false;\n}\n\nfunction addDirectoryToZip(zip: AdmZip, root: string, dir: string): void {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const full = join(dir, entry.name);\n const rel = relative(root, full).replace(/\\\\/g, '/');\n if (shouldExcludeFromArtifact(rel)) continue;\n if (entry.isDirectory()) {\n addDirectoryToZip(zip, root, full);\n } else if (entry.isFile()) {\n zip.addFile(rel, readFileSync(full));\n }\n }\n}\n\nfunction writeStoreReadyArtifact(params: {\n extensionDir: string;\n outDir: string;\n manifest: ExtensionManifest;\n packageJson: Record<string, unknown>;\n}): string {\n mkdirSync(params.outDir, { recursive: true });\n const name = String(params.packageJson.name ?? params.manifest.id)\n .replace(/^@/, '')\n .replace(/[\\\\/]+/g, '-')\n .replace(/[^A-Za-z0-9._-]+/g, '-');\n const version = String(params.manifest.version ?? params.packageJson.version ?? '0.0.0');\n const base = `${name}-${version}`;\n const zipPath = join(params.outDir, `${base}.zip`);\n const zip = new AdmZip();\n addDirectoryToZip(zip, params.extensionDir, params.extensionDir);\n zip.writeZip(zipPath);\n\n const buffer = readFileSync(zipPath);\n const sha256Hex = createHash('sha256').update(buffer).digest('hex');\n const integrity = `sha256-${createHash('sha256').update(buffer).digest('base64')}`;\n writeFileSync(join(params.outDir, `${base}.sha256`), `${sha256Hex} ${basename(zipPath)}\\n`);\n writeFileSync(\n join(params.outDir, `${base}.manifest.json`),\n JSON.stringify(\n {\n id: params.manifest.id,\n name: params.manifest.name,\n version,\n artifact: basename(zipPath),\n integrity,\n manifest: params.manifest,\n packageJson: params.packageJson,\n },\n null,\n 2,\n ),\n );\n return zipPath;\n}\n\nfunction printDiagnostics(d: PackDiagnostic[]): void {\n for (const x of d) {\n if (x.level === 'error') {\n console.error(`${colors.red('error')}:`, x.message);\n } else if (x.level === 'warning') {\n console.log(`${colors.yellow('warning')}:`, x.message);\n } else {\n console.log(`${colors.cyan('info')}:`, x.message);\n }\n }\n}\n\nexport function createExtensionPackCommand(): Command {\n return new Command('pack')\n .description('Package an extension as a .tgz archive for distribution')\n .argument('[dir]', 'Extension directory (default: current working directory)', '.')\n .option('--out <dir>', 'Output directory for the .tgz (default: extension directory)', '')\n .option('--no-build-ui', 'Skip automatic \"npm run build:ui\" when defined')\n .option('--dry-run', 'Validate only; do not create an archive', false)\n .action((dir: string, opts: { out?: string; buildUi: boolean; dryRun: boolean }) => {\n const validation = validateExtensionPackageDirectory(dir || '.');\n const { extensionDir, manifest, packageJson, diagnostics } = validation;\n const outDir = opts.out && opts.out.length > 0 ? resolve(opts.out) : extensionDir;\n printDiagnostics(diagnostics);\n\n if (!validation.ok || !manifest || !packageJson) {\n console.error(colors.red('Pack validation failed (fix errors above).'));\n process.exit(1);\n }\n\n if (opts.dryRun) {\n console.log(colors.green('OK'), ' — dry run; no archive created');\n return;\n }\n\n const scripts = isRecord(packageJson.scripts) ? (packageJson.scripts as Record<string, unknown>) : null;\n if (opts.buildUi && scripts && typeof scripts['build:ui'] === 'string') {\n try {\n console.log(colors.cyan('Running'), 'npm run build:ui …');\n execSync('npm run build:ui', { cwd: extensionDir, stdio: 'inherit' });\n } catch (e) {\n console.error(\n colors.red('error:'),\n `UI build failed: ${e instanceof Error ? e.message : String(e)}`,\n );\n process.exit(1);\n }\n }\n\n let artifactPath: string;\n try {\n artifactPath = writeStoreReadyArtifact({ extensionDir, outDir, manifest, packageJson });\n } catch (e) {\n log.error({ err: e }, 'pack failed');\n console.error(colors.red('error:'), e instanceof Error ? e.message : String(e));\n process.exit(1);\n }\n\n console.log('');\n console.log(colors.green('Pack complete:'), artifactPath);\n console.log(colors.cyan('Generated:'), '.zip artifact, .sha256 checksum, .manifest.json metadata');\n console.log(colors.cyan('Next:'), 'upload the generated artifact set to store.xopc.ai or install the zip via the store pipeline.');\n });\n}\n"],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  import { Command } from 'commander';
2
2
  export declare function createExtensionListCommand(): Command;
3
+ export declare function createExtensionInspectCommand(): Command;
3
4
  export declare function createExtensionFreezeCommand(): Command;
4
5
  export declare function createExtensionHealthCommand(): Command;
5
6
  export declare function createExtensionVerifyCommand(): Command;
7
+ export declare function createExtensionDoctorCommand(): Command;
6
8
  export declare function createExtensionAuditCommand(): Command;
7
9
  export declare function registerExtensionCommands(program: Command): void;