@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
@@ -1,6 +1,6 @@
1
+ import { init_string_coerce, normalizeOptionalString } from "../../utils/string-coerce.js";
1
2
  import { createLogger } from "../../utils/logger/index.js";
2
3
  import { init_logger } from "../../utils/logger.js";
3
- import { init_string_coerce, normalizeOptionalString } from "../../utils/string-coerce.js";
4
4
  import { resolveGlobalSingleton } from "../../utils/global-singleton.js";
5
5
  import { sanitizeServerName } from "./bundle-mcp-names.js";
6
6
  import { redactSensitiveUrlLikeString } from "../../utils/redact-sensitive-url.js";
@@ -1,6 +1,6 @@
1
+ import { init_string_coerce, normalizeLowercaseStringOrEmpty } from "../../utils/string-coerce.js";
1
2
  import { createLogger } from "../../utils/logger/index.js";
2
3
  import { init_logger } from "../../utils/logger.js";
3
- import { init_string_coerce, normalizeLowercaseStringOrEmpty } from "../../utils/string-coerce.js";
4
4
  import { resolveXopcMcpTransportAlias } from "../../config/mcp-config-normalize.js";
5
5
  import { sanitizeForLog } from "../../utils/sanitize-log.js";
6
6
  import { describeHttpMcpServerLaunchConfig, resolveHttpMcpServerLaunchConfig } from "./mcp-http.js";
@@ -1,6 +1,6 @@
1
+ import { init_string_coerce, normalizeOptionalString } from "../../utils/string-coerce.js";
1
2
  import { createLogger } from "../../utils/logger/index.js";
2
3
  import { init_logger } from "../../utils/logger.js";
3
- import { init_string_coerce, normalizeOptionalString } from "../../utils/string-coerce.js";
4
4
  import { XopcStdioClientTransport } from "./mcp-stdio-transport.js";
5
5
  import { resolveMcpTransportConfig } from "./mcp-transport-config.js";
6
6
  import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
@@ -1,6 +1,6 @@
1
+ import { join } from "node:path";
1
2
  import { existsSync, mkdirSync, readFileSync } from "node:fs";
2
3
  import { mkdir, readFile, rename, writeFile } from "node:fs/promises";
3
- import { join } from "node:path";
4
4
  import lockfile from "proper-lockfile";
5
5
  //#region src/agent/memory/builtin-memory-store.ts
6
6
  /**
@@ -4,8 +4,8 @@ import { MEMORY_MD_FILENAME } from "./constants.js";
4
4
  import { clamp01, compareCandidatesByScore, computeCandidateScore, extractPromotionMarkers, isContaminatedSnippet, isExpiredEntry, isoDay, readFileLines, resolveDeepDefaults, sliceRange, snippetHash } from "./utils.js";
5
5
  import { loadDreamingStore, saveDreamingStore, withDreamingPromotionLock } from "./short-term-store.js";
6
6
  import { emptyDeepPhaseSkipped, writeDreamingDeepLastRun } from "./last-run.js";
7
- import fs from "node:fs/promises";
8
7
  import path from "node:path";
8
+ import fs from "node:fs/promises";
9
9
  //#region src/agent/memory/dreaming/deep-promotion.ts
10
10
  init_logger();
11
11
  const log = createLogger("Dreaming:Deep");
@@ -1,6 +1,6 @@
1
1
  import { DREAMING_DIR_RELATIVE, DREAMING_EVENTS_LOG_RELATIVE } from "./constants.js";
2
- import fs from "node:fs/promises";
3
2
  import path from "node:path";
3
+ import fs from "node:fs/promises";
4
4
  //#region src/agent/memory/dreaming/events.ts
5
5
  /**
6
6
  * Append a single event line to `memory/.dreams/events.jsonl`.
@@ -1,6 +1,6 @@
1
1
  import { DREAMING_LAST_RUN_RELATIVE } from "./constants.js";
2
- import fs from "node:fs/promises";
3
2
  import path from "node:path";
3
+ import fs from "node:fs/promises";
4
4
  //#region src/agent/memory/dreaming/last-run.ts
5
5
  const DREAMING_LAST_RUN_FORMAT_VERSION = 2;
6
6
  function isRecord(v) {
@@ -4,8 +4,8 @@ import { DREAMING_DIR_RELATIVE } from "./constants.js";
4
4
  import { buildEntryKey, isoDay, normalizeMemoryPath, normalizeSnippetForHash, snippetHash } from "./utils.js";
5
5
  import { bumpEntryPhaseSignal, loadDreamingStore, saveDreamingStore } from "./short-term-store.js";
6
6
  import "./last-run.js";
7
- import fs from "node:fs/promises";
8
7
  import path from "node:path";
8
+ import fs from "node:fs/promises";
9
9
  //#region src/agent/memory/dreaming/light-sweep.ts
10
10
  init_logger();
11
11
  const log = createLogger("Dreaming:Light");
@@ -1,8 +1,8 @@
1
1
  import { MEMORY_MD_FILENAME } from "./constants.js";
2
2
  import { clamp01, compareCandidatesByScore, computeCandidateScore, extractPromotionMarkers, isContaminatedSnippet, isExpiredEntry, readFileLines, resolveDeepDefaults, sliceRange, snippetHash } from "./utils.js";
3
3
  import { loadDreamingStore } from "./short-term-store.js";
4
- import fs from "node:fs/promises";
5
4
  import path from "node:path";
5
+ import fs from "node:fs/promises";
6
6
  //#region src/agent/memory/dreaming/preview.ts
7
7
  async function previewDreamingDeepPromotion(params) {
8
8
  const cfg = resolveDeepDefaults(params.config);
@@ -4,8 +4,8 @@ import { DREAMING_DIR_RELATIVE, DREAMS_MD_FILENAME, MS_PER_DAY } from "./constan
4
4
  import { isoDay } from "./utils.js";
5
5
  import { bumpEntryPhaseSignal, loadDreamingStore, saveDreamingStore } from "./short-term-store.js";
6
6
  import "./last-run.js";
7
- import fs from "node:fs/promises";
8
7
  import path from "node:path";
8
+ import fs from "node:fs/promises";
9
9
  //#region src/agent/memory/dreaming/rem-patterns.ts
10
10
  init_logger();
11
11
  const log = createLogger("Dreaming:REM");
@@ -2,9 +2,9 @@ import { createLogger } from "../../../utils/logger/index.js";
2
2
  import { init_logger } from "../../../utils/logger.js";
3
3
  import { SHORT_TERM_PROMOTION_LOCK_RELATIVE, SHORT_TERM_RECALL_STORE_RELATIVE } from "./constants.js";
4
4
  import { buildEntryKey, clamp01, isoDay, normalizeMemoryPath } from "./utils.js";
5
+ import path from "node:path";
5
6
  import { createHash, randomUUID } from "node:crypto";
6
7
  import fs from "node:fs/promises";
7
- import path from "node:path";
8
8
  //#region src/agent/memory/dreaming/short-term-store.ts
9
9
  init_logger();
10
10
  const log = createLogger("Dreaming:Store");
@@ -1,7 +1,7 @@
1
1
  import { DEFAULT_DEEP_CRON, DIVERSITY_WEIGHT, MS_PER_DAY, REINFORCEMENT_WEIGHT } from "./constants.js";
2
+ import path from "node:path";
2
3
  import { createHash } from "node:crypto";
3
4
  import fs from "node:fs/promises";
4
- import path from "node:path";
5
5
  //#region src/agent/memory/dreaming/utils.ts
6
6
  /** Normalize a workspace-relative memory path: forward slashes, no odd ../ escapes at start. */
7
7
  function normalizeMemoryPath(rel) {
@@ -1,8 +1,8 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
+ import { join } from "node:path";
3
4
  import { existsSync } from "node:fs";
4
5
  import { appendFile, mkdir, readFile, writeFile } from "node:fs/promises";
5
- import { join } from "node:path";
6
6
  //#region src/agent/memory/memory-flush.ts
7
7
  init_logger();
8
8
  const log = createLogger("MemoryFlush");
@@ -1,5 +1,5 @@
1
- import { readdir, stat } from "node:fs/promises";
2
1
  import { dirname, join } from "node:path";
2
+ import { readdir, stat } from "node:fs/promises";
3
3
  import { fileURLToPath } from "node:url";
4
4
  //#region src/agent/memory/plugin-discovery.ts
5
5
  async function discoverMemoryPlugins() {
@@ -1,6 +1,6 @@
1
+ import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
1
2
  import { createLogger } from "../../utils/logger/index.js";
2
3
  import { init_logger } from "../../utils/logger.js";
3
- import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
4
4
  import { getAllModels, getDefaultModelSync, init_providers, resolveModel } from "../../providers/index.js";
5
5
  import { resolveAgentTurnTimeoutMs, runAgentTurnWithTimeout } from "../orchestration/run-agent-turn-with-timeout.js";
6
6
  import { isAssistantTurnAborted, isAssistantTurnFailed, maybeRetryTurnAfterTransientLlmFailure } from "../orchestration/llm-turn-retry.js";
@@ -1,6 +1,6 @@
1
+ import { resolveStateDir } from "../../config/paths-state.js";
1
2
  import { createLogger } from "../../utils/logger/index.js";
2
3
  import { init_logger } from "../../utils/logger.js";
3
- import { resolveStateDir } from "../../config/paths-state.js";
4
4
  import { init_paths } from "../../config/paths.js";
5
5
  import { DEFAULT_USER_FILENAME } from "../context/workspace.js";
6
6
  import { resolveSystemPromptBuildParams } from "./system-prompt-params.js";
@@ -9,8 +9,8 @@ import { createSkillConfigManager } from "../skills/config.js";
9
9
  import { buildTtsSystemPromptHint } from "../../voice/tts/directives.js";
10
10
  import { mergeTtsConfigFromAppConfig } from "../../voice/tts/merge-config.js";
11
11
  import { selectSkillsVisibleInPrompt } from "../skills/format-skills-prompt.js";
12
- import { existsSync, readFileSync } from "node:fs";
13
12
  import { join } from "node:path";
13
+ import { existsSync, readFileSync } from "node:fs";
14
14
  //#region src/agent/prompt/service-prompt-builder.ts
15
15
  /**
16
16
  * System Prompt Builder - Builds the complete system prompt
@@ -1,7 +1,7 @@
1
1
  import { init_agent_scope, resolveAgentProfileDir } from "../agent-scope.js";
2
2
  import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
3
- import { readFileSync } from "node:fs";
4
3
  import { join, resolve } from "node:path";
4
+ import { readFileSync } from "node:fs";
5
5
  //#region src/agent/reply/post-compaction-context.ts
6
6
  init_agent_scope();
7
7
  const MAX_CONTEXT_CHARS = 1800;
@@ -1,5 +1,5 @@
1
- import { readFileSync } from "node:fs";
2
1
  import { resolve } from "node:path";
2
+ import { readFileSync } from "node:fs";
3
3
  //#region src/agent/reply/workspace-boundary-read.ts
4
4
  /**
5
5
  * Read a file relative to workspace root with path traversal guard and byte cap.
@@ -1,6 +1,6 @@
1
- import { realpathSync } from "node:fs";
2
- import { isAbsolute, normalize, resolve, sep } from "node:path";
3
1
  import { homedir } from "node:os";
2
+ import { isAbsolute, normalize, resolve, sep } from "node:path";
3
+ import { realpathSync } from "node:fs";
4
4
  //#region src/agent/sandbox/path-policy.ts
5
5
  /**
6
6
  * Path safety validation for sandbox isolation.
@@ -1,9 +1,9 @@
1
- import { createLogger } from "../utils/logger/index.js";
2
- import { init_logger } from "../utils/logger.js";
3
- import { init_agent_scope, resolveAgentHomeDir, resolveAgentProfileDir, resolveDefaultAgentId } from "./agent-scope.js";
4
1
  import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
5
2
  import { applyConfigOverrides } from "../config/runtime-overrides.js";
3
+ import { init_agent_scope, resolveAgentHomeDir, resolveAgentProfileDir, resolveDefaultAgentId } from "./agent-scope.js";
6
4
  import { extractProfileAgentId, resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
5
+ import { createLogger } from "../utils/logger/index.js";
6
+ import { init_logger } from "../utils/logger.js";
7
7
  import { extractTextContent } from "./context/workspace.js";
8
8
  import { getWorkflowProgressBroker } from "./workflow/progress-broker.js";
9
9
  import { onSessionTranscriptUpdate } from "../session/transcript-events.js";
@@ -60,8 +60,8 @@ import { parseOutboundSessionKey } from "./service/parse-outbound-session-key.js
60
60
  import { cleanTrailingErrors } from "./memory/message-sanitizer.js";
61
61
  import { MemoryFlushService } from "./memory/memory-flush.js";
62
62
  import { tryApplySessionTranscriptHygiene } from "./transcript/transcript-hygiene.js";
63
- import { existsSync, readFileSync } from "node:fs";
64
63
  import { join } from "node:path";
64
+ import { existsSync, readFileSync } from "node:fs";
65
65
  //#region src/agent/service.ts
66
66
  init_schema();
67
67
  init_logger();
@@ -1,6 +1,6 @@
1
+ import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
1
2
  import { createLogger } from "../../utils/logger/index.js";
2
3
  import { init_logger } from "../../utils/logger.js";
3
- import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
4
4
  import { resolveVerboseLevel } from "../../session/config-store.js";
5
5
  import { resolveEffectiveReasoningLevel, resolveEffectiveThinkingLevel } from "../../session/thinking-resolve.js";
6
6
  import { effectiveWorkspacePathForSession } from "../../session/session-workspace.js";
@@ -1,6 +1,6 @@
1
- import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
2
1
  import { createLogger } from "../../utils/logger/index.js";
3
2
  import { init_logger } from "../../utils/logger.js";
3
+ import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
4
4
  import { hasBinary } from "./installer.js";
5
5
  import { join } from "path";
6
6
  import { existsSync, readFileSync } from "fs";
@@ -1,6 +1,6 @@
1
- import { createHash } from "node:crypto";
2
- import { createReadStream, existsSync, readFileSync, readdirSync, statSync } from "node:fs";
3
1
  import { join, relative } from "node:path";
2
+ import { createReadStream, existsSync, readFileSync, readdirSync, statSync } from "node:fs";
3
+ import { createHash } from "node:crypto";
4
4
  //#region src/agent/skills/hub-hash.ts
5
5
  /**
6
6
  * Deterministic content hash for a skill directory (for hub lock / drift detection).
@@ -1,5 +1,5 @@
1
- import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
2
1
  import { init_paths, resolveSkillsLockPath } from "../../config/paths.js";
2
+ import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
3
3
  import { existsSync, readFileSync } from "node:fs";
4
4
  //#region src/agent/skills/hub-lock.ts
5
5
  /**
@@ -4,9 +4,9 @@ import { formatScanSummary, scanSkillDirectory } from "./scanner.js";
4
4
  import { getSkillsLockEntry, recordSkillsHubInstall } from "./hub-lock.js";
5
5
  import { installSkillFromZip, isValidSkillId } from "./managed-store.js";
6
6
  import { computeSkillTreeHashSync } from "./hub-hash.js";
7
- import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
8
- import { basename, join, normalize, resolve, sep } from "node:path";
9
7
  import { tmpdir } from "node:os";
8
+ import { basename, join, normalize, resolve, sep } from "node:path";
9
+ import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
10
10
  import { fileURLToPath } from "node:url";
11
11
  import { execFileSync } from "node:child_process";
12
12
  import { fetch } from "undici";
@@ -1,6 +1,6 @@
1
+ import { resolveStateDir } from "../../config/paths-state.js";
1
2
  import { createLogger } from "../../utils/logger/index.js";
2
3
  import { init_logger } from "../../utils/logger.js";
3
- import { resolveStateDir } from "../../config/paths-state.js";
4
4
  import { init_paths } from "../../config/paths.js";
5
5
  import { parseFrontmatter } from "../../markdown/frontmatter.js";
6
6
  import { findInstallSpec, getDefaultInstallerPreferences, hasBinary, installSkill } from "./installer.js";
@@ -1,8 +1,8 @@
1
1
  import { init_paths, resolveSkillsDir } from "../../config/paths.js";
2
2
  import { parseFrontmatter } from "../../markdown/frontmatter.js";
3
3
  import { loadSkillsLock } from "./hub-lock.js";
4
- import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs";
5
4
  import { dirname, join, resolve, sep } from "node:path";
5
+ import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs";
6
6
  import AdmZip from "adm-zip";
7
7
  //#region src/agent/skills/managed-store.ts
8
8
  /**
@@ -101,11 +101,15 @@ export interface StorePublishedPackageHead {
101
101
  latestVersion: {
102
102
  version: string;
103
103
  downloadUrl: string;
104
+ checksum?: string;
105
+ integrity?: string;
106
+ sha256?: string;
104
107
  };
105
108
  }
106
109
  export declare function resolveExtensionZipDownloadUrl(storeBaseUrl: string, packageName: string, version?: string): Promise<{
107
110
  downloadUrl: string;
108
111
  version: string;
112
+ integrity?: string;
109
113
  }>;
110
114
  export declare function downloadExtensionStoreZipBuffer(storeBaseUrl: string, downloadUrl: string): Promise<Buffer>;
111
115
  export declare function skillIdForMarketplaceInstall(packageName: string): string | undefined;
@@ -135,7 +135,8 @@ async function resolveExtensionZipDownloadUrl(storeBaseUrl, packageName, version
135
135
  assertDownloadUrlAllowed(detail.downloadUrl, base);
136
136
  return {
137
137
  downloadUrl: detail.downloadUrl,
138
- version: detail.version
138
+ version: detail.version,
139
+ integrity: detail.integrity ?? detail.checksum ?? detail.sha256
139
140
  };
140
141
  }
141
142
  const lv = meta.latestVersion;
@@ -143,7 +144,8 @@ async function resolveExtensionZipDownloadUrl(storeBaseUrl, packageName, version
143
144
  assertDownloadUrlAllowed(lv.downloadUrl, base);
144
145
  return {
145
146
  downloadUrl: lv.downloadUrl,
146
- version: lv.version
147
+ version: lv.version,
148
+ integrity: lv.integrity ?? lv.checksum ?? lv.sha256
147
149
  };
148
150
  }
149
151
  async function downloadExtensionStoreZipBuffer(storeBaseUrl, downloadUrl) {
@@ -1 +1 @@
1
- {"version":3,"file":"store-api-client.js","names":[],"sources":["../../../../../../../src/agent/skills/marketplace/adapters/store/store-api-client.ts"],"sourcesContent":["/**\n * HTTP client for the public xopc-store-compatible REST API (packages list, detail, zip download).\n * Used by the store marketplace adapter and SSRF-safe download helpers.\n *\n * Facade: {@link ../../../skills-marketplace.js}.\n */\n\nimport type { Config } from '../../../../../config/schema.js';\nimport { MAX_EXTENSION_STORE_ZIP_BYTES } from '../../../../../extensions/store-zip-limits.js';\nimport { isValidSkillId, MAX_SKILL_ZIP_BYTES } from '../../../managed-store.js';\nimport type { SkillMarkdownPreviewPayload } from '../../../types.js';\n\nconst DEFAULT_STORE_BASE = 'https://store.xopc.ai';\n\n/**\n * Marketplace provider identifier. Dynamic — extensions can register additional providers\n * via `api.registerMarketplaceAdapter()`. Built-in values: 'store', 'skillhub', 'clawhub'.\n */\nexport type SkillsMarketplaceProvider = string;\n\nexport interface SkillsStoreListParams {\n q?: string;\n page?: number;\n pageSize?: number;\n sort?: 'downloads' | 'newest';\n /** Adapter-defined category id (exact match against package `categories`). */\n category?: string;\n}\n\n/** Category option for marketplace filter chips (from adapter). */\nexport interface MarketplaceCategoryOption {\n id: string;\n label: string;\n}\n\n/** Mirrors xopc-store GET /api/v1/packages list response (subset used by UI). */\nexport interface SkillsStorePackageListItem {\n id: string;\n name: string;\n type: string;\n description: string;\n downloads: number;\n author: { username: string; avatarUrl: string | null };\n latestVersion?: string;\n updatedAt: string;\n /** Taxonomy / tags from the marketplace (adapter-specific). */\n categories?: string[];\n tags?: string[];\n stars?: number;\n /** Short provenance label for the row (e.g. ClawHub). */\n sourceLabel?: string;\n}\n\n/** Unified marketplace package list item (works for all adapters). */\nexport type MarketplacePackageListItem = SkillsStorePackageListItem;\n\nexport interface SkillsStoreListResponse {\n items: SkillsStorePackageListItem[];\n meta: { page: number; pageSize: number; total: number; totalPages: number };\n}\n\nexport function resolveSkillsStoreBaseUrl(config: Config): string {\n const env = process.env.XOPC_SKILLS_STORE_URL?.trim();\n if (env) {\n try {\n return normalizeBaseUrl(new URL(env).toString());\n } catch {\n // fall through\n }\n }\n const fromConfig = config.gateway?.skillsStoreBaseUrl?.trim();\n if (fromConfig) {\n try {\n return normalizeBaseUrl(new URL(fromConfig).toString());\n } catch {\n return DEFAULT_STORE_BASE;\n }\n }\n return DEFAULT_STORE_BASE;\n}\n\nexport { MAX_EXTENSION_STORE_ZIP_BYTES };\n\n/**\n * Base URL for extension downloads (defaults to skills store host — usually store.xopc.ai).\n * Override with `XOPC_EXTENSIONS_STORE_URL`.\n */\nexport function resolveExtensionsStoreBaseUrl(config: Config): string {\n const env = process.env.XOPC_EXTENSIONS_STORE_URL?.trim();\n if (env) {\n try {\n return normalizeBaseUrl(new URL(env).toString());\n } catch {\n // fall through\n }\n }\n return resolveSkillsStoreBaseUrl(config);\n}\n\nfunction normalizeBaseUrl(url: string): string {\n return url.replace(/\\/$/, '');\n}\n\nexport function getStoreOrigin(baseUrl: string): string {\n const u = new URL(baseUrl);\n return `${u.protocol}//${u.host}`;\n}\n\n/**\n * Allow download URLs whose origin matches the configured store base (SSRF guard).\n * Production store is HTTPS-only; local dev (`http://localhost` / `127.0.0.1`) may use HTTP.\n */\nexport function assertDownloadUrlAllowed(downloadUrl: string, storeBaseUrl: string): URL {\n let u: URL;\n try {\n u = new URL(downloadUrl);\n } catch {\n throw new Error('Invalid download URL from store');\n }\n const allowed = new URL(storeBaseUrl);\n const localHttpDev =\n allowed.protocol === 'http:' &&\n (allowed.hostname === 'localhost' || allowed.hostname === '127.0.0.1');\n if (localHttpDev) {\n if (u.protocol !== 'http:' && u.protocol !== 'https:') {\n throw new Error('Download URL must use HTTP or HTTPS');\n }\n } else if (u.protocol !== 'https:') {\n throw new Error('Download URL must use HTTPS');\n }\n if (u.host !== allowed.host) {\n throw new Error('Download URL host does not match configured store host');\n }\n return u;\n}\n\nasync function fetchJson<T>(url: string, init?: RequestInit): Promise<T> {\n const res = await fetch(url, {\n ...init,\n headers: { Accept: 'application/json', ...init?.headers },\n });\n const text = await res.text();\n if (!res.ok) {\n let msg = `Store request failed (${res.status})`;\n try {\n const j = JSON.parse(text) as { error?: { message?: string } };\n if (j.error?.message) msg = j.error.message;\n } catch {\n if (text) msg = text.slice(0, 200);\n }\n throw new Error(msg);\n }\n try {\n return JSON.parse(text) as T;\n } catch {\n throw new Error('Store returned invalid JSON');\n }\n}\n\nexport async function listSkillPackages(\n storeBaseUrl: string,\n params: SkillsStoreListParams,\n): Promise<SkillsStoreListResponse> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const sp = new URLSearchParams();\n sp.set('type', 'skill');\n if (params.q?.trim()) sp.set('q', params.q.trim());\n if (params.page != null) sp.set('page', String(params.page));\n if (params.pageSize != null) sp.set('pageSize', String(params.pageSize));\n if (params.sort) sp.set('sort', params.sort);\n if (params.category?.trim()) sp.set('category', params.category.trim());\n\n const url = `${base}/api/v1/packages?${sp.toString()}`;\n return fetchJson<SkillsStoreListResponse>(url);\n}\n\n/** GET /api/v1/packages/:name — published skill package (public). */\nexport interface MarketplacePackageDetail {\n id: string;\n name: string;\n type: string;\n description: string;\n readme: string | null;\n downloads: number;\n author: { username: string; avatarUrl: string | null };\n latestVersion: {\n version: string;\n changelog: string | null;\n publishedAt: string;\n };\n}\n\nexport async function fetchMarketplacePackageDetail(\n storeBaseUrl: string,\n packageName: string,\n): Promise<MarketplacePackageDetail> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const enc = encodeURIComponent(packageName.trim());\n return fetchJson<MarketplacePackageDetail>(`${base}/api/v1/packages/${enc}`);\n}\n\nexport async function resolveSkillZipDownloadUrl(\n storeBaseUrl: string,\n packageName: string,\n version?: string,\n): Promise<{ downloadUrl: string; version: string }> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const enc = encodeURIComponent(packageName);\n if (version?.trim()) {\n const v = encodeURIComponent(version.trim());\n const detail = await fetchJson<{\n downloadUrl: string;\n version: string;\n }>(`${base}/api/v1/packages/${enc}/versions/${v}`);\n if (!detail.downloadUrl) {\n throw new Error('Store version has no download URL');\n }\n assertDownloadUrlAllowed(detail.downloadUrl, base);\n return { downloadUrl: detail.downloadUrl, version: detail.version };\n }\n\n const pkg = await fetchJson<{\n name: string;\n latestVersion: { downloadUrl: string; version: string };\n }>(`${base}/api/v1/packages/${enc}`);\n if (!pkg.latestVersion?.downloadUrl) {\n throw new Error('Package has no published version');\n }\n assertDownloadUrlAllowed(pkg.latestVersion.downloadUrl, base);\n return {\n downloadUrl: pkg.latestVersion.downloadUrl,\n version: pkg.latestVersion.version,\n };\n}\n\nexport async function downloadSkillZipBuffer(\n storeBaseUrl: string,\n downloadUrl: string,\n): Promise<Buffer> {\n const base = normalizeBaseUrl(storeBaseUrl);\n assertDownloadUrlAllowed(downloadUrl, base);\n\n const res = await fetch(downloadUrl, { redirect: 'follow' });\n if (!res.ok) {\n throw new Error(`Failed to download skill archive (${res.status})`);\n }\n const len = res.headers.get('content-length');\n if (len) {\n const n = Number(len);\n if (Number.isFinite(n) && n > MAX_SKILL_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_SKILL_ZIP_BYTES} bytes)`);\n }\n }\n const ab = await res.arrayBuffer();\n const buf = Buffer.from(ab);\n if (buf.length > MAX_SKILL_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_SKILL_ZIP_BYTES} bytes)`);\n }\n return buf;\n}\n\n/** GET /api/v1/packages/:name — subset used for extension installs. */\nexport interface StorePublishedPackageHead {\n name: string;\n type: string;\n latestVersion: {\n version: string;\n downloadUrl: string;\n };\n}\n\nexport async function resolveExtensionZipDownloadUrl(\n storeBaseUrl: string,\n packageName: string,\n version?: string,\n): Promise<{ downloadUrl: string; version: string }> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const enc = encodeURIComponent(packageName.trim());\n const meta = await fetchJson<StorePublishedPackageHead>(`${base}/api/v1/packages/${enc}`);\n if (meta.type !== 'extension') {\n throw new Error(\n `Package \"${packageName}\" has type \"${meta.type}\" (expected extension). ` +\n 'Use `xopc skills install` for skills.',\n );\n }\n if (version?.trim()) {\n const v = encodeURIComponent(version.trim());\n const detail = await fetchJson<{ downloadUrl: string; version: string }>(\n `${base}/api/v1/packages/${enc}/versions/${v}`,\n );\n if (!detail.downloadUrl) {\n throw new Error('Store version has no download URL');\n }\n assertDownloadUrlAllowed(detail.downloadUrl, base);\n return { downloadUrl: detail.downloadUrl, version: detail.version };\n }\n const lv = meta.latestVersion;\n if (!lv?.downloadUrl) {\n throw new Error('Package has no published version');\n }\n assertDownloadUrlAllowed(lv.downloadUrl, base);\n return { downloadUrl: lv.downloadUrl, version: lv.version };\n}\n\nexport async function downloadExtensionStoreZipBuffer(\n storeBaseUrl: string,\n downloadUrl: string,\n): Promise<Buffer> {\n const base = normalizeBaseUrl(storeBaseUrl);\n assertDownloadUrlAllowed(downloadUrl, base);\n const res = await fetch(downloadUrl, { redirect: 'follow' });\n if (!res.ok) {\n throw new Error(`Failed to download extension archive (${res.status})`);\n }\n const len = res.headers.get('content-length');\n if (len) {\n const n = Number(len);\n if (Number.isFinite(n) && n > MAX_EXTENSION_STORE_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_EXTENSION_STORE_ZIP_BYTES} bytes)`);\n }\n }\n const ab = await res.arrayBuffer();\n const buf = Buffer.from(ab);\n if (buf.length > MAX_EXTENSION_STORE_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_EXTENSION_STORE_ZIP_BYTES} bytes)`);\n }\n return buf;\n}\n\nexport function skillIdForMarketplaceInstall(packageName: string): string | undefined {\n const trimmed = packageName.trim();\n if (!trimmed) return undefined;\n return isValidSkillId(trimmed) ? trimmed : undefined;\n}\n\n/**\n * Unified marketplace list response (adapter fills `provider`).\n */\nexport interface UnifiedMarketplaceListResponse {\n items: MarketplacePackageListItem[];\n meta: { page: number; pageSize: number; total: number; totalPages: number };\n provider: string;\n}\n\n/**\n * Unified marketplace package detail response.\n */\nexport interface UnifiedMarketplacePackageDetail extends MarketplacePackageDetail {\n provider: string;\n /** Gateway-normalized structured meta + body rendered by the console. */\n skillDocPreview: SkillMarkdownPreviewPayload;\n /** SkillHub-specific fields */\n skillHubInfo?: {\n category: string;\n installs: number;\n stars: number;\n securityReports?: {\n keen?: { status: string; statusText: string; reportUrl?: string };\n sanbu?: { status: string; statusText: string; reportUrl?: string };\n };\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"store-api-client.js","names":[],"sources":["../../../../../../../src/agent/skills/marketplace/adapters/store/store-api-client.ts"],"sourcesContent":["/**\n * HTTP client for the public xopc-store-compatible REST API (packages list, detail, zip download).\n * Used by the store marketplace adapter and SSRF-safe download helpers.\n *\n * Facade: {@link ../../../skills-marketplace.js}.\n */\n\nimport type { Config } from '../../../../../config/schema.js';\nimport { MAX_EXTENSION_STORE_ZIP_BYTES } from '../../../../../extensions/store-zip-limits.js';\nimport { isValidSkillId, MAX_SKILL_ZIP_BYTES } from '../../../managed-store.js';\nimport type { SkillMarkdownPreviewPayload } from '../../../types.js';\n\nconst DEFAULT_STORE_BASE = 'https://store.xopc.ai';\n\n/**\n * Marketplace provider identifier. Dynamic — extensions can register additional providers\n * via `api.registerMarketplaceAdapter()`. Built-in values: 'store', 'skillhub', 'clawhub'.\n */\nexport type SkillsMarketplaceProvider = string;\n\nexport interface SkillsStoreListParams {\n q?: string;\n page?: number;\n pageSize?: number;\n sort?: 'downloads' | 'newest';\n /** Adapter-defined category id (exact match against package `categories`). */\n category?: string;\n}\n\n/** Category option for marketplace filter chips (from adapter). */\nexport interface MarketplaceCategoryOption {\n id: string;\n label: string;\n}\n\n/** Mirrors xopc-store GET /api/v1/packages list response (subset used by UI). */\nexport interface SkillsStorePackageListItem {\n id: string;\n name: string;\n type: string;\n description: string;\n downloads: number;\n author: { username: string; avatarUrl: string | null };\n latestVersion?: string;\n updatedAt: string;\n /** Taxonomy / tags from the marketplace (adapter-specific). */\n categories?: string[];\n tags?: string[];\n stars?: number;\n /** Short provenance label for the row (e.g. ClawHub). */\n sourceLabel?: string;\n}\n\n/** Unified marketplace package list item (works for all adapters). */\nexport type MarketplacePackageListItem = SkillsStorePackageListItem;\n\nexport interface SkillsStoreListResponse {\n items: SkillsStorePackageListItem[];\n meta: { page: number; pageSize: number; total: number; totalPages: number };\n}\n\nexport function resolveSkillsStoreBaseUrl(config: Config): string {\n const env = process.env.XOPC_SKILLS_STORE_URL?.trim();\n if (env) {\n try {\n return normalizeBaseUrl(new URL(env).toString());\n } catch {\n // fall through\n }\n }\n const fromConfig = config.gateway?.skillsStoreBaseUrl?.trim();\n if (fromConfig) {\n try {\n return normalizeBaseUrl(new URL(fromConfig).toString());\n } catch {\n return DEFAULT_STORE_BASE;\n }\n }\n return DEFAULT_STORE_BASE;\n}\n\nexport { MAX_EXTENSION_STORE_ZIP_BYTES };\n\n/**\n * Base URL for extension downloads (defaults to skills store host — usually store.xopc.ai).\n * Override with `XOPC_EXTENSIONS_STORE_URL`.\n */\nexport function resolveExtensionsStoreBaseUrl(config: Config): string {\n const env = process.env.XOPC_EXTENSIONS_STORE_URL?.trim();\n if (env) {\n try {\n return normalizeBaseUrl(new URL(env).toString());\n } catch {\n // fall through\n }\n }\n return resolveSkillsStoreBaseUrl(config);\n}\n\nfunction normalizeBaseUrl(url: string): string {\n return url.replace(/\\/$/, '');\n}\n\nexport function getStoreOrigin(baseUrl: string): string {\n const u = new URL(baseUrl);\n return `${u.protocol}//${u.host}`;\n}\n\n/**\n * Allow download URLs whose origin matches the configured store base (SSRF guard).\n * Production store is HTTPS-only; local dev (`http://localhost` / `127.0.0.1`) may use HTTP.\n */\nexport function assertDownloadUrlAllowed(downloadUrl: string, storeBaseUrl: string): URL {\n let u: URL;\n try {\n u = new URL(downloadUrl);\n } catch {\n throw new Error('Invalid download URL from store');\n }\n const allowed = new URL(storeBaseUrl);\n const localHttpDev =\n allowed.protocol === 'http:' &&\n (allowed.hostname === 'localhost' || allowed.hostname === '127.0.0.1');\n if (localHttpDev) {\n if (u.protocol !== 'http:' && u.protocol !== 'https:') {\n throw new Error('Download URL must use HTTP or HTTPS');\n }\n } else if (u.protocol !== 'https:') {\n throw new Error('Download URL must use HTTPS');\n }\n if (u.host !== allowed.host) {\n throw new Error('Download URL host does not match configured store host');\n }\n return u;\n}\n\nasync function fetchJson<T>(url: string, init?: RequestInit): Promise<T> {\n const res = await fetch(url, {\n ...init,\n headers: { Accept: 'application/json', ...init?.headers },\n });\n const text = await res.text();\n if (!res.ok) {\n let msg = `Store request failed (${res.status})`;\n try {\n const j = JSON.parse(text) as { error?: { message?: string } };\n if (j.error?.message) msg = j.error.message;\n } catch {\n if (text) msg = text.slice(0, 200);\n }\n throw new Error(msg);\n }\n try {\n return JSON.parse(text) as T;\n } catch {\n throw new Error('Store returned invalid JSON');\n }\n}\n\nexport async function listSkillPackages(\n storeBaseUrl: string,\n params: SkillsStoreListParams,\n): Promise<SkillsStoreListResponse> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const sp = new URLSearchParams();\n sp.set('type', 'skill');\n if (params.q?.trim()) sp.set('q', params.q.trim());\n if (params.page != null) sp.set('page', String(params.page));\n if (params.pageSize != null) sp.set('pageSize', String(params.pageSize));\n if (params.sort) sp.set('sort', params.sort);\n if (params.category?.trim()) sp.set('category', params.category.trim());\n\n const url = `${base}/api/v1/packages?${sp.toString()}`;\n return fetchJson<SkillsStoreListResponse>(url);\n}\n\n/** GET /api/v1/packages/:name — published skill package (public). */\nexport interface MarketplacePackageDetail {\n id: string;\n name: string;\n type: string;\n description: string;\n readme: string | null;\n downloads: number;\n author: { username: string; avatarUrl: string | null };\n latestVersion: {\n version: string;\n changelog: string | null;\n publishedAt: string;\n };\n}\n\nexport async function fetchMarketplacePackageDetail(\n storeBaseUrl: string,\n packageName: string,\n): Promise<MarketplacePackageDetail> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const enc = encodeURIComponent(packageName.trim());\n return fetchJson<MarketplacePackageDetail>(`${base}/api/v1/packages/${enc}`);\n}\n\nexport async function resolveSkillZipDownloadUrl(\n storeBaseUrl: string,\n packageName: string,\n version?: string,\n): Promise<{ downloadUrl: string; version: string }> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const enc = encodeURIComponent(packageName);\n if (version?.trim()) {\n const v = encodeURIComponent(version.trim());\n const detail = await fetchJson<{\n downloadUrl: string;\n version: string;\n }>(`${base}/api/v1/packages/${enc}/versions/${v}`);\n if (!detail.downloadUrl) {\n throw new Error('Store version has no download URL');\n }\n assertDownloadUrlAllowed(detail.downloadUrl, base);\n return { downloadUrl: detail.downloadUrl, version: detail.version };\n }\n\n const pkg = await fetchJson<{\n name: string;\n latestVersion: { downloadUrl: string; version: string };\n }>(`${base}/api/v1/packages/${enc}`);\n if (!pkg.latestVersion?.downloadUrl) {\n throw new Error('Package has no published version');\n }\n assertDownloadUrlAllowed(pkg.latestVersion.downloadUrl, base);\n return {\n downloadUrl: pkg.latestVersion.downloadUrl,\n version: pkg.latestVersion.version,\n };\n}\n\nexport async function downloadSkillZipBuffer(\n storeBaseUrl: string,\n downloadUrl: string,\n): Promise<Buffer> {\n const base = normalizeBaseUrl(storeBaseUrl);\n assertDownloadUrlAllowed(downloadUrl, base);\n\n const res = await fetch(downloadUrl, { redirect: 'follow' });\n if (!res.ok) {\n throw new Error(`Failed to download skill archive (${res.status})`);\n }\n const len = res.headers.get('content-length');\n if (len) {\n const n = Number(len);\n if (Number.isFinite(n) && n > MAX_SKILL_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_SKILL_ZIP_BYTES} bytes)`);\n }\n }\n const ab = await res.arrayBuffer();\n const buf = Buffer.from(ab);\n if (buf.length > MAX_SKILL_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_SKILL_ZIP_BYTES} bytes)`);\n }\n return buf;\n}\n\n/** GET /api/v1/packages/:name — subset used for extension installs. */\nexport interface StorePublishedPackageHead {\n name: string;\n type: string;\n latestVersion: {\n version: string;\n downloadUrl: string;\n checksum?: string;\n integrity?: string;\n sha256?: string;\n };\n}\n\nexport async function resolveExtensionZipDownloadUrl(\n storeBaseUrl: string,\n packageName: string,\n version?: string,\n): Promise<{ downloadUrl: string; version: string; integrity?: string }> {\n const base = normalizeBaseUrl(storeBaseUrl);\n const enc = encodeURIComponent(packageName.trim());\n const meta = await fetchJson<StorePublishedPackageHead>(`${base}/api/v1/packages/${enc}`);\n if (meta.type !== 'extension') {\n throw new Error(\n `Package \"${packageName}\" has type \"${meta.type}\" (expected extension). ` +\n 'Use `xopc skills install` for skills.',\n );\n }\n if (version?.trim()) {\n const v = encodeURIComponent(version.trim());\n const detail = await fetchJson<{\n downloadUrl: string;\n version: string;\n checksum?: string;\n integrity?: string;\n sha256?: string;\n }>(`${base}/api/v1/packages/${enc}/versions/${v}`);\n if (!detail.downloadUrl) {\n throw new Error('Store version has no download URL');\n }\n assertDownloadUrlAllowed(detail.downloadUrl, base);\n return {\n downloadUrl: detail.downloadUrl,\n version: detail.version,\n integrity: detail.integrity ?? detail.checksum ?? detail.sha256,\n };\n }\n const lv = meta.latestVersion;\n if (!lv?.downloadUrl) {\n throw new Error('Package has no published version');\n }\n assertDownloadUrlAllowed(lv.downloadUrl, base);\n return {\n downloadUrl: lv.downloadUrl,\n version: lv.version,\n integrity: lv.integrity ?? lv.checksum ?? lv.sha256,\n };\n}\n\nexport async function downloadExtensionStoreZipBuffer(\n storeBaseUrl: string,\n downloadUrl: string,\n): Promise<Buffer> {\n const base = normalizeBaseUrl(storeBaseUrl);\n assertDownloadUrlAllowed(downloadUrl, base);\n const res = await fetch(downloadUrl, { redirect: 'follow' });\n if (!res.ok) {\n throw new Error(`Failed to download extension archive (${res.status})`);\n }\n const len = res.headers.get('content-length');\n if (len) {\n const n = Number(len);\n if (Number.isFinite(n) && n > MAX_EXTENSION_STORE_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_EXTENSION_STORE_ZIP_BYTES} bytes)`);\n }\n }\n const ab = await res.arrayBuffer();\n const buf = Buffer.from(ab);\n if (buf.length > MAX_EXTENSION_STORE_ZIP_BYTES) {\n throw new Error(`Zip exceeds maximum size (${MAX_EXTENSION_STORE_ZIP_BYTES} bytes)`);\n }\n return buf;\n}\n\nexport function skillIdForMarketplaceInstall(packageName: string): string | undefined {\n const trimmed = packageName.trim();\n if (!trimmed) return undefined;\n return isValidSkillId(trimmed) ? trimmed : undefined;\n}\n\n/**\n * Unified marketplace list response (adapter fills `provider`).\n */\nexport interface UnifiedMarketplaceListResponse {\n items: MarketplacePackageListItem[];\n meta: { page: number; pageSize: number; total: number; totalPages: number };\n provider: string;\n}\n\n/**\n * Unified marketplace package detail response.\n */\nexport interface UnifiedMarketplacePackageDetail extends MarketplacePackageDetail {\n provider: string;\n /** Gateway-normalized structured meta + body rendered by the console. */\n skillDocPreview: SkillMarkdownPreviewPayload;\n /** SkillHub-specific fields */\n skillHubInfo?: {\n category: string;\n installs: number;\n stars: number;\n securityReports?: {\n keen?: { status: string; statusText: string; reportUrl?: string };\n sanbu?: { status: string; statusText: string; reportUrl?: string };\n };\n };\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { readFile, readdir } from "fs/promises";
4
3
  import { join } from "path";
4
+ import { readFile, readdir } from "fs/promises";
5
5
  //#region src/agent/skills/scanner.ts
6
6
  /**
7
7
  * Skill security scanner — scans skill directories for potentially dangerous code patterns.
@@ -2,9 +2,9 @@ import { init_paths, resolveSkillsDir } from "../../config/paths.js";
2
2
  import { parseFrontmatter } from "../../markdown/frontmatter.js";
3
3
  import { fuzzyFindText, normalizeForFuzzyMatch, normalizeToLF, restoreLineEndings } from "../tools/edit-diff.js";
4
4
  import { formatScanSummary, scanSkillDirectory } from "./scanner.js";
5
- import { mkdir, writeFile } from "fs/promises";
6
5
  import { join, resolve, sep } from "path";
7
6
  import { existsSync, realpathSync } from "fs";
7
+ import { mkdir, writeFile } from "fs/promises";
8
8
  //#region src/agent/skills/skill-manage-ops.ts
9
9
  /**
10
10
  * Shared logic for the skill_manage agent tool (create / edit / patch / delete / write_file / remove_file).
@@ -1,6 +1,6 @@
1
+ import { resolveStateDir } from "../../config/paths-state.js";
1
2
  import { createLogger } from "../../utils/logger/index.js";
2
3
  import { init_logger } from "../../utils/logger.js";
3
- import { resolveStateDir } from "../../config/paths-state.js";
4
4
  import { init_paths, resolveBundledSkillsDir } from "../../config/paths.js";
5
5
  import { createSkillConfigManager, isSkillEnabled } from "./config.js";
6
6
  import { formatSkillsForPrompt, selectSkillsVisibleInPrompt } from "./format-skills-prompt.js";
@@ -0,0 +1,19 @@
1
+ import type { Config } from '../config/schema.js';
2
+ export declare const STARTER_AGENTS_INITIALIZED_VERSION = 1;
3
+ type StarterAgent = {
4
+ id: string;
5
+ displayName: string;
6
+ description: string;
7
+ emoji: string;
8
+ tools?: {
9
+ disable?: string[];
10
+ };
11
+ profileFiles: Record<string, string>;
12
+ };
13
+ export declare const STARTER_AGENTS: readonly StarterAgent[];
14
+ export declare function materializeStarterAgentFiles(cfg: Config): void;
15
+ export declare function ensureStarterAgentsInitialized(cfg: Config): {
16
+ config: Config;
17
+ changed: boolean;
18
+ };
19
+ export {};