@xopcai/xopc 0.0.125 → 0.0.127

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 (386) hide show
  1. package/README.md +56 -102
  2. package/README.zh-CN.md +51 -98
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/feishu/src/schema/config-schema.d.ts +6 -6
  5. package/dist/extensions/feishu/src/workflow-progress.js +1 -1
  6. package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
  7. package/dist/extensions/telegram/src/config-schema.d.ts +8 -8
  8. package/dist/extensions/telegram/src/inbound-processor.js +1 -1
  9. package/dist/extensions/telegram/src/plugin.js +1 -1
  10. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  11. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  12. package/dist/extensions/telegram/xopc.extension.json +1 -1
  13. package/dist/extensions/weixin/src/api/api.js +1 -1
  14. package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
  15. package/dist/extensions/weixin/src/plugin.js +1 -1
  16. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  17. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BKDKICZV.js → agent-avatar-dicebear-CgGgO4OV.js} +1 -1
  18. package/dist/gateway/static/root/assets/agents-k59l7NMb.js +2 -0
  19. package/dist/gateway/static/root/assets/{app-management-settings-panel-DI4BqHKW.js → app-management-settings-panel-DeQsTsyy.js} +1 -1
  20. package/dist/gateway/static/root/assets/{appearance-settings-6_ie3NQ4.js → appearance-settings-BnHQW7Hv.js} +1 -1
  21. package/dist/gateway/static/root/assets/apps-page-BG9b4abG.js +1 -0
  22. package/dist/gateway/static/root/assets/{archive-plugin-kUHEJ1HK.js → archive-plugin-5NXT7Zqv.js} +1 -1
  23. package/dist/gateway/static/root/assets/{attachment-load-Dm-9prpU.js → attachment-load-DghwhYe0.js} +1 -1
  24. package/dist/gateway/static/root/assets/{automation-suggestion-card-OTxQTPnC.js → automation-suggestion-card-DYmESgwl.js} +1 -1
  25. package/dist/gateway/static/root/assets/automations-page-De8mVutL.js +4 -0
  26. package/dist/gateway/static/root/assets/{binary-plugins-DllA_jQ0.js → binary-plugins-DSbPKdWX.js} +1 -1
  27. package/dist/gateway/static/root/assets/{block-editor-Cm6CWNj1.js → block-editor-CoZ-_np-.js} +28 -28
  28. package/dist/gateway/static/root/assets/browser-settings-page-C_ZRa4LF.js +8 -0
  29. package/dist/gateway/static/root/assets/{capability-presets-api-VJ89b6I2.js → capability-presets-api-hny224j-.js} +1 -1
  30. package/dist/gateway/static/root/assets/{capability-presets-settings-panel-BaPj8wC2.js → capability-presets-settings-panel-Drc0qLsw.js} +1 -1
  31. package/dist/gateway/static/root/assets/{channel-recipient-api-B5PwBEUx.js → channel-recipient-api-DAlOHxKJ.js} +1 -1
  32. package/dist/gateway/static/root/assets/channels-settings-CA20zBV9.js +1 -0
  33. package/dist/gateway/static/root/assets/connectors-page-qMyMB5te.js +2 -0
  34. package/dist/gateway/static/root/assets/desktop-pet-XG6Vb_fZ.js +1 -0
  35. package/dist/gateway/static/root/assets/desktop-pet-settings-npJ0Oh5p.js +1 -0
  36. package/dist/gateway/static/root/assets/desktop-pet-sprite-DqZ6fbIj.js +1 -0
  37. package/dist/gateway/static/root/assets/directory-picker-path-field-BR2ItBuf.js +1 -0
  38. package/dist/gateway/static/root/assets/dreaming-settings-CkUZ997f.js +3 -0
  39. package/dist/gateway/static/root/assets/{extension-debug-page-BaM0FpW7.js → extension-debug-page-Tl0f1rNv.js} +1 -1
  40. package/dist/gateway/static/root/assets/{extension-page-DuZWVOGA.js → extension-page-Ck7QuwE3.js} +1 -1
  41. package/dist/gateway/static/root/assets/{extension-settings-page-DarVtbmJ.js → extension-settings-page-3RMhQtZ3.js} +1 -1
  42. package/dist/gateway/static/root/assets/{fetch-NFKfkqrd.js → fetch-pg2ErdAk.js} +1 -1
  43. package/dist/gateway/static/root/assets/{gateway-config-api-CFEm9rgy.js → gateway-config-api-DbG97ia2.js} +1 -1
  44. package/dist/gateway/static/root/assets/gateway-settings-B8cyqKk-.js +1 -0
  45. package/dist/gateway/static/root/assets/{gateway-startup-retry-Dtwh_yGg.js → gateway-startup-retry-Yh8h3hkj.js} +1 -1
  46. package/dist/gateway/static/root/assets/{goal-create-dialog-BKP7ylcG.js → goal-create-dialog-DmeW7Zz3.js} +1 -1
  47. package/dist/gateway/static/root/assets/goal-detail-page-DrTyGbVD.js +1 -0
  48. package/dist/gateway/static/root/assets/{goals-config-api-DTWZNA_Y.js → goals-config-api-CxCWGIBB.js} +1 -1
  49. package/dist/gateway/static/root/assets/goals-page-DV1bJhIh.js +2 -0
  50. package/dist/gateway/static/root/assets/{goals-settings-Bhct0ZT-.js → goals-settings-9DrfOkP5.js} +1 -1
  51. package/dist/gateway/static/root/assets/{heartbeat-settings-C-UxSU4a.js → heartbeat-settings-KaDpZrv0.js} +1 -1
  52. package/dist/gateway/static/root/assets/index-C2F0Clvm.js +256 -0
  53. package/dist/gateway/static/root/assets/index-COQSX5d_.css +1 -0
  54. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-DCjy2y4d.js → keyboard-shortcuts-settings-CfQrt_Rb.js} +1 -1
  55. package/dist/gateway/static/root/assets/logs-page-C9dpiNTF.js +2 -0
  56. package/dist/gateway/static/root/assets/{markdown-split-BaqxP-GQ.js → markdown-split-BwiMdCf_.js} +1 -1
  57. package/dist/gateway/static/root/assets/{media-plugins-DQ_EXloK.js → media-plugins-DhoizyZv.js} +1 -1
  58. package/dist/gateway/static/root/assets/messages-DmnbiNxU.js +3 -0
  59. package/dist/gateway/static/root/assets/models-hub-panel-zdCdmBmH.js +2 -0
  60. package/dist/gateway/static/root/assets/notes-page-MpGeFfPt.js +1 -0
  61. package/dist/gateway/static/root/assets/notes-workbench-DYCM3yd2.js +2 -0
  62. package/dist/gateway/static/root/assets/{page-tabs-EIZhLppK.js → page-tabs-DDC2t4Z8.js} +1 -1
  63. package/dist/gateway/static/root/assets/{preview-open-alternatives-r_uB4Epr.js → preview-open-alternatives-BTmk-XDM.js} +1 -1
  64. package/dist/gateway/static/root/assets/project-detail-page-Cu0ElRnS.js +1 -0
  65. package/dist/gateway/static/root/assets/projects-page-DakNaUjZ.js +1 -0
  66. package/dist/gateway/static/root/assets/remote-access-hub-DYKjt7L9.js +1 -0
  67. package/dist/gateway/static/root/assets/{save-bar-controls-B132Uf-2.js → save-bar-controls-DqU-yKIh.js} +1 -1
  68. package/dist/gateway/static/root/assets/{schedule-field-B5qshALm.js → schedule-field-CUttkoSB.js} +1 -1
  69. package/dist/gateway/static/root/assets/{schema-form-CvLmkdS9.js → schema-form-CVSQA9nI.js} +1 -1
  70. package/dist/gateway/static/root/assets/sessions-page-CcGHDsz1.js +1 -0
  71. package/dist/gateway/static/root/assets/settings-advanced-gate-CuFdeKNu.js +1 -0
  72. package/dist/gateway/static/root/assets/{settings-collapsible-section-pRlvqsAf.js → settings-collapsible-section-CK7ogS-P.js} +1 -1
  73. package/dist/gateway/static/root/assets/settings-form-section-Bugp38Fa.js +1 -0
  74. package/dist/gateway/static/root/assets/settings-page-0AJoUvxi.js +1 -0
  75. package/dist/gateway/static/root/assets/settings-page-layout-DBRWwdhh.js +1 -0
  76. package/dist/gateway/static/root/assets/setup-status-panel-D6a_hEk7.js +1 -0
  77. package/dist/gateway/static/root/assets/{share-preview-page-v6-IOp8t.js → share-preview-page-BtsuETKF.js} +1 -1
  78. package/dist/gateway/static/root/assets/shares-settings-CcEFT7S9.js +1 -0
  79. package/dist/gateway/static/root/assets/skill-reload-api-BcN_RuTD.js +1 -0
  80. package/dist/gateway/static/root/assets/skills-page-BbRZZZA5.js +2 -0
  81. package/dist/gateway/static/root/assets/{system-settings-panel-HUU2FFjM.js → system-settings-panel-DJ6YuLqR.js} +1 -1
  82. package/dist/gateway/static/root/assets/{typed-models-lib-AH160QHh.js → typed-models-lib-B0T7N8Km.js} +1 -1
  83. package/dist/gateway/static/root/assets/{use-channel-catalog-BXzDmjCQ.js → use-channel-catalog-C6vrxdzZ.js} +1 -1
  84. package/dist/gateway/static/root/assets/{user-profile-settings-panel-DxwnQvQ3.js → user-profile-settings-panel-DZ0nKMgj.js} +1 -1
  85. package/dist/gateway/static/root/assets/{utils-i5POEtqd.js → utils-CehXcWAY.js} +1 -1
  86. package/dist/gateway/static/root/assets/voice-api-key-field-2QKflCx8.js +1 -0
  87. package/dist/gateway/static/root/assets/work-item-detail-page-DfJnuWq1.js +1 -0
  88. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-ClVVMgN-.js → workflow-run-setup-panel-c4jeaohQ.js} +2 -2
  89. package/dist/gateway/static/root/assets/{workflow-start-dialog-Dv4ZA1T0.js → workflow-start-dialog-ENRHjoqa.js} +1 -1
  90. package/dist/gateway/static/root/assets/workflows-page-BJwwFTm_.js +18 -0
  91. package/dist/gateway/static/root/index.html +5 -5
  92. package/dist/package.js +1 -1
  93. package/dist/src/activity/context.d.ts +11 -0
  94. package/dist/src/activity/context.js +36 -0
  95. package/dist/src/activity/context.js.map +1 -0
  96. package/dist/src/activity/emitter.d.ts +6 -0
  97. package/dist/src/activity/emitter.js +43 -0
  98. package/dist/src/activity/emitter.js.map +1 -0
  99. package/dist/src/activity/index.d.ts +3 -0
  100. package/dist/src/activity/index.js +3 -0
  101. package/dist/src/activity/service.d.ts +12 -0
  102. package/dist/src/activity/service.js +59 -0
  103. package/dist/src/activity/service.js.map +1 -0
  104. package/dist/src/activity/types.d.ts +109 -0
  105. package/dist/src/activity/types.js +1 -0
  106. package/dist/src/agent/agent-instance-gateway.d.ts +5 -0
  107. package/dist/src/agent/agent-manager.d.ts +21 -0
  108. package/dist/src/agent/agent-manager.js +118 -6
  109. package/dist/src/agent/agent-manager.js.map +1 -1
  110. package/dist/src/agent/capabilities/definitions.d.ts +153 -0
  111. package/dist/src/agent/capabilities/definitions.js +156 -0
  112. package/dist/src/agent/capabilities/definitions.js.map +1 -0
  113. package/dist/src/agent/capabilities/index.d.ts +2 -0
  114. package/dist/src/agent/capabilities/index.js +3 -0
  115. package/dist/src/agent/capabilities/registry.d.ts +10 -0
  116. package/dist/src/agent/capabilities/registry.js +51 -0
  117. package/dist/src/agent/capabilities/registry.js.map +1 -0
  118. package/dist/src/agent/context/project-context.js +2 -2
  119. package/dist/src/agent/context/workspace-seed.js +2 -2
  120. package/dist/src/agent/embedded/run-for-session.js +1 -1
  121. package/dist/src/agent/goals/post-turn.js +2 -2
  122. package/dist/src/agent/ipc/bus.js +1 -1
  123. package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
  124. package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
  125. package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
  126. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  127. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  128. package/dist/src/agent/models/manager.js +1 -1
  129. package/dist/src/agent/orchestration/agent-orchestrator.js +1 -1
  130. package/dist/src/agent/service/process-direct-one-shot.js +5 -3
  131. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  132. package/dist/src/agent/service/process-direct-streaming.js +4 -3
  133. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  134. package/dist/src/agent/service.d.ts +2 -0
  135. package/dist/src/agent/service.js +9 -3
  136. package/dist/src/agent/service.js.map +1 -1
  137. package/dist/src/agent/service.types.d.ts +7 -0
  138. package/dist/src/agent/session/session-inspector.js +1 -1
  139. package/dist/src/agent/skills/hub-pull.js +1 -1
  140. package/dist/src/agent/skills/parse-skill-metadata.js +9 -1
  141. package/dist/src/agent/skills/parse-skill-metadata.js.map +1 -1
  142. package/dist/src/agent/skills/skill-manager.d.ts +4 -0
  143. package/dist/src/agent/skills/skill-manager.js +17 -0
  144. package/dist/src/agent/skills/skill-manager.js.map +1 -1
  145. package/dist/src/agent/skills/types.d.ts +5 -0
  146. package/dist/src/agent/tool-manuals/index.js +15 -6
  147. package/dist/src/agent/tool-manuals/index.js.map +1 -1
  148. package/dist/src/agent/tool-manuals/xopc-use.d.ts +1 -0
  149. package/dist/src/agent/tool-manuals/xopc-use.js +204 -0
  150. package/dist/src/agent/tool-manuals/xopc-use.js.map +1 -0
  151. package/dist/src/agent/tools/desktop-pet-tool.d.ts +24 -0
  152. package/dist/src/agent/tools/desktop-pet-tool.js +90 -0
  153. package/dist/src/agent/tools/desktop-pet-tool.js.map +1 -0
  154. package/dist/src/agent/tools/factory.d.ts +9 -0
  155. package/dist/src/agent/tools/factory.js +26 -0
  156. package/dist/src/agent/tools/factory.js.map +1 -1
  157. package/dist/src/agent/tools/goal-tool.js +2 -2
  158. package/dist/src/agent/tools/index.d.ts +2 -0
  159. package/dist/src/agent/tools/index.js +3 -1
  160. package/dist/src/agent/tools/workflow-tool.js +1 -1
  161. package/dist/src/agent/tools/xopc-use-tool.d.ts +34 -0
  162. package/dist/src/agent/tools/xopc-use-tool.js +636 -0
  163. package/dist/src/agent/tools/xopc-use-tool.js.map +1 -0
  164. package/dist/src/agent-manifest/schema.d.ts +27 -27
  165. package/dist/src/automations/api/routes.js +1 -1
  166. package/dist/src/automations/domain/validation.d.ts +55 -55
  167. package/dist/src/automations/draft/automation-draft-service.js +1 -1
  168. package/dist/src/automations/draft/automation-draft-validator.d.ts +25 -25
  169. package/dist/src/automations/service/action-executor.js +2 -2
  170. package/dist/src/browser/cdp-local-launcher.js +1 -1
  171. package/dist/src/browser/providers/browser-ext-install.js +3 -3
  172. package/dist/src/browser/providers/cloakbrowser.js +2 -2
  173. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  174. package/dist/src/browser/stealth.js +1 -1
  175. package/dist/src/chat-commands/agent-edit.js +1 -1
  176. package/dist/src/chat-commands/builtins/config.js +1 -1
  177. package/dist/src/chat-commands/builtins/goal.js +2 -2
  178. package/dist/src/chat-commands/context.js +1 -1
  179. package/dist/src/cli/commands/agent.js +3 -3
  180. package/dist/src/cli/commands/doctor/checks/database-schema.js +2 -2
  181. package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
  182. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  183. package/dist/src/cli/commands/extension-pack.js +1 -1
  184. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  185. package/dist/src/cli/commands/goal.js +3 -3
  186. package/dist/src/cli/commands/init.js +1 -1
  187. package/dist/src/cli/commands/models.js +1 -1
  188. package/dist/src/cli/commands/onboard.js +1 -1
  189. package/dist/src/cli/commands/profile.js +1 -1
  190. package/dist/src/cli/commands/project.js +4 -4
  191. package/dist/src/cli/commands/tunnel.js +1 -1
  192. package/dist/src/cli/commands/update.js +1 -1
  193. package/dist/src/cli/extension-cli-register.js +1 -1
  194. package/dist/src/config/agent-profile.js +1 -1
  195. package/dist/src/config/gateway-bind.js +1 -1
  196. package/dist/src/config/index.js +2 -2
  197. package/dist/src/config/loader.js +1 -1
  198. package/dist/src/config/models-json.d.ts +14 -14
  199. package/dist/src/config/models-json.js +1 -1
  200. package/dist/src/config/schema.d.ts +60 -60
  201. package/dist/src/daemon/launchd.js +1 -1
  202. package/dist/src/daemon/systemd.js +1 -1
  203. package/dist/src/extensions/discover-extensions.js +1 -1
  204. package/dist/src/extensions/loader.js +2 -2
  205. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  206. package/dist/src/gateway/agent-builtin-tools.js +1 -0
  207. package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
  208. package/dist/src/gateway/agents-admin.js +1 -1
  209. package/dist/src/gateway/hono/lib/config-payload.d.ts +14 -14
  210. package/dist/src/gateway/hono/lib/static-ui.js +1 -1
  211. package/dist/src/gateway/hono/middleware/log-context.js +8 -1
  212. package/dist/src/gateway/hono/middleware/log-context.js.map +1 -1
  213. package/dist/src/gateway/hono/routes/activity.d.ts +14 -0
  214. package/dist/src/gateway/hono/routes/activity.js +72 -0
  215. package/dist/src/gateway/hono/routes/activity.js.map +1 -0
  216. package/dist/src/gateway/hono/routes/commands-skills.js +7 -0
  217. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  218. package/dist/src/gateway/hono/routes/goals.js +1 -1
  219. package/dist/src/gateway/hono/routes/index.js +2 -0
  220. package/dist/src/gateway/hono/routes/index.js.map +1 -1
  221. package/dist/src/gateway/hono/routes/lazy-bundles.js +2 -1
  222. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  223. package/dist/src/gateway/hono/routes/memory.js +2 -2
  224. package/dist/src/gateway/hono/routes/projects.js +93 -15
  225. package/dist/src/gateway/hono/routes/projects.js.map +1 -1
  226. package/dist/src/gateway/hono/routes/sessions.js +101 -2
  227. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  228. package/dist/src/gateway/hono/routes/workflows.js +2 -2
  229. package/dist/src/gateway/lock.js +1 -1
  230. package/dist/src/gateway/ports.js +1 -1
  231. package/dist/src/gateway/run-loop.js +1 -1
  232. package/dist/src/gateway/service/run-gateway-agent.js +6 -2
  233. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  234. package/dist/src/gateway/service/sessions-api.d.ts +10 -0
  235. package/dist/src/gateway/service/sessions-api.js +31 -0
  236. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  237. package/dist/src/gateway/service.js +12 -9
  238. package/dist/src/gateway/service.js.map +1 -1
  239. package/dist/src/goals/goal-store.js +1 -1
  240. package/dist/src/goals/goal-store.js.map +1 -1
  241. package/dist/src/goals/goal-workflow-judge.js +1 -1
  242. package/dist/src/infra/ports.js +1 -1
  243. package/dist/src/infra/ssh-tunnel.js +1 -1
  244. package/dist/src/infra/update-check.js +1 -1
  245. package/dist/src/infra/update-restart.js +1 -1
  246. package/dist/src/migrations/runner.js +1 -1
  247. package/dist/src/notes/service.js +65 -6
  248. package/dist/src/notes/service.js.map +1 -1
  249. package/dist/src/notes/store.js +1 -1
  250. package/dist/src/pets/factory.d.ts +25 -0
  251. package/dist/src/pets/factory.js +327 -0
  252. package/dist/src/pets/factory.js.map +1 -0
  253. package/dist/src/pets/manifest.d.ts +2 -0
  254. package/dist/src/pets/manifest.js +16 -0
  255. package/dist/src/pets/manifest.js.map +1 -0
  256. package/dist/src/pets/validator.d.ts +12 -0
  257. package/dist/src/pets/validator.js +175 -0
  258. package/dist/src/pets/validator.js.map +1 -0
  259. package/dist/src/projects/project-service.d.ts +4 -1
  260. package/dist/src/projects/project-service.js +65 -2
  261. package/dist/src/projects/project-service.js.map +1 -1
  262. package/dist/src/projects/project-store.d.ts +3 -1
  263. package/dist/src/projects/project-store.js +56 -6
  264. package/dist/src/projects/project-store.js.map +1 -1
  265. package/dist/src/projects/types.d.ts +12 -0
  266. package/dist/src/projects/workspace.js +1 -1
  267. package/dist/src/routing/agent-session-key.js +1 -1
  268. package/dist/src/routing/resolve-route.js +1 -1
  269. package/dist/src/routing/resolve-tui-session-key.js +1 -1
  270. package/dist/src/session/client-history.d.ts +3 -0
  271. package/dist/src/session/client-history.js +24 -9
  272. package/dist/src/session/client-history.js.map +1 -1
  273. package/dist/src/session/init-session-turn.js +1 -1
  274. package/dist/src/session/resolve-session.js +1 -1
  275. package/dist/src/session/session-title.js +24 -4
  276. package/dist/src/session/session-title.js.map +1 -1
  277. package/dist/src/session/store.js +1 -1
  278. package/dist/src/session/types.d.ts +4 -0
  279. package/dist/src/session/types.js.map +1 -1
  280. package/dist/src/storage/sqlite/activity-repository.d.ts +8 -0
  281. package/dist/src/storage/sqlite/activity-repository.js +208 -0
  282. package/dist/src/storage/sqlite/activity-repository.js.map +1 -0
  283. package/dist/src/storage/sqlite/connection.js +1 -1
  284. package/dist/src/storage/sqlite/index.d.ts +1 -0
  285. package/dist/src/storage/sqlite/index.js +2 -1
  286. package/dist/src/storage/sqlite/migrations/024_activity_events.sql +62 -0
  287. package/dist/src/storage/sqlite/migrations/025_project_pinned_at.sql +5 -0
  288. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  289. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  290. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  291. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  292. package/dist/src/storage/sqlite/row-mappers.js +1 -1
  293. package/dist/src/storage/sqlite/schema.js +1 -1
  294. package/dist/src/storage/sqlite/schema.sql +63 -0
  295. package/dist/src/storage/sqlite/session-repository.js +11 -0
  296. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  297. package/dist/src/tui/backends/embedded-backend.d.ts +13 -0
  298. package/dist/src/tui/backends/embedded-backend.js +76 -7
  299. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  300. package/dist/src/tui/backends/gateway-sse-backend.d.ts +13 -0
  301. package/dist/src/tui/backends/gateway-sse-backend.js +53 -0
  302. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  303. package/dist/src/tui/chat-history.js +16 -3
  304. package/dist/src/tui/chat-history.js.map +1 -1
  305. package/dist/src/tui/clipboard-image.js +1 -1
  306. package/dist/src/tui/components/chat-log.d.ts +23 -3
  307. package/dist/src/tui/components/chat-log.js +68 -9
  308. package/dist/src/tui/components/chat-log.js.map +1 -1
  309. package/dist/src/tui/components/tui-bottom-bar.js +9 -5
  310. package/dist/src/tui/components/tui-bottom-bar.js.map +1 -1
  311. package/dist/src/tui/tui-backend.d.ts +16 -0
  312. package/dist/src/tui/tui-command-formatters.js +2 -2
  313. package/dist/src/tui/tui-commands.d.ts +9 -0
  314. package/dist/src/tui/tui-commands.js +95 -6
  315. package/dist/src/tui/tui-commands.js.map +1 -1
  316. package/dist/src/tui/tui-picker-overlay.d.ts +1 -0
  317. package/dist/src/tui/tui-picker-overlay.js +36 -1
  318. package/dist/src/tui/tui-picker-overlay.js.map +1 -1
  319. package/dist/src/tui/tui-picker-services.d.ts +13 -0
  320. package/dist/src/tui/tui-run-state.js +11 -0
  321. package/dist/src/tui/tui-run-state.js.map +1 -1
  322. package/dist/src/tui/tui-run-status-format.d.ts +3 -0
  323. package/dist/src/tui/tui-run-status-format.js +33 -0
  324. package/dist/src/tui/tui-run-status-format.js.map +1 -0
  325. package/dist/src/tui/tui-session-actions.d.ts +5 -0
  326. package/dist/src/tui/tui-session-actions.js +24 -0
  327. package/dist/src/tui/tui-session-actions.js.map +1 -1
  328. package/dist/src/tui/tui-timeline-picker.d.ts +19 -0
  329. package/dist/src/tui/tui-timeline-picker.js +81 -0
  330. package/dist/src/tui/tui-timeline-picker.js.map +1 -0
  331. package/dist/src/tui/tui-timeline.d.ts +15 -0
  332. package/dist/src/tui/tui-timeline.js +65 -0
  333. package/dist/src/tui/tui-timeline.js.map +1 -0
  334. package/dist/src/tui/tui-types.d.ts +1 -0
  335. package/dist/src/tui/tui-types.js +1 -0
  336. package/dist/src/tui/tui-types.js.map +1 -1
  337. package/dist/src/tui/tui.js +31 -25
  338. package/dist/src/tui/tui.js.map +1 -1
  339. package/dist/src/utils/index.js +1 -1
  340. package/dist/src/utils/logger/index.js +1 -1
  341. package/dist/src/utils/logger/stats.d.ts +3 -3
  342. package/dist/src/utils/logger.js +1 -1
  343. package/dist/src/work-items/agent-context.d.ts +5 -1
  344. package/dist/src/work-items/agent-context.js +39 -3
  345. package/dist/src/work-items/agent-context.js.map +1 -1
  346. package/dist/src/work-items/work-item-service.d.ts +2 -0
  347. package/dist/src/work-items/work-item-service.js +97 -0
  348. package/dist/src/work-items/work-item-service.js.map +1 -1
  349. package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
  350. package/dist/src/workflows/service/workflow-session-bridge.js +1 -1
  351. package/package.json +5 -5
  352. package/skills/creative/hatch-pet/SKILL.md +63 -0
  353. package/dist/gateway/static/root/assets/agents-BnTB7-c5.js +0 -2
  354. package/dist/gateway/static/root/assets/apps-page-B6bG65SW.js +0 -1
  355. package/dist/gateway/static/root/assets/automations-page-1lVbo0dS.js +0 -1
  356. package/dist/gateway/static/root/assets/browser-settings-page-CzDBlOK0.js +0 -8
  357. package/dist/gateway/static/root/assets/channels-settings-Df4m7p1k.js +0 -1
  358. package/dist/gateway/static/root/assets/connectors-page-BMTphmHS.js +0 -2
  359. package/dist/gateway/static/root/assets/directory-picker-path-field-DySMzOF6.js +0 -1
  360. package/dist/gateway/static/root/assets/dist-By6Rh2ee.js +0 -1
  361. package/dist/gateway/static/root/assets/dreaming-settings-D_AjSnV_.js +0 -3
  362. package/dist/gateway/static/root/assets/gateway-settings-BMk2S5td.js +0 -1
  363. package/dist/gateway/static/root/assets/goal-detail-page-C2cTxf71.js +0 -1
  364. package/dist/gateway/static/root/assets/goals-page-CTmA3hWK.js +0 -2
  365. package/dist/gateway/static/root/assets/index-BNHDd2j1.css +0 -1
  366. package/dist/gateway/static/root/assets/index-BPXLPMuY.js +0 -193
  367. package/dist/gateway/static/root/assets/logs-page-CGc3_CQU.js +0 -2
  368. package/dist/gateway/static/root/assets/messages-CjuIJcZl.js +0 -3
  369. package/dist/gateway/static/root/assets/models-hub-panel-Drz4UQMb.js +0 -2
  370. package/dist/gateway/static/root/assets/notes-page-CY1ylng1.js +0 -1
  371. package/dist/gateway/static/root/assets/notes-workbench-X7IaD--t.js +0 -2
  372. package/dist/gateway/static/root/assets/project-detail-page-DE5adRBE.js +0 -1
  373. package/dist/gateway/static/root/assets/projects-page-CuOb1k6F.js +0 -1
  374. package/dist/gateway/static/root/assets/remote-access-hub-BOxNrUVA.js +0 -1
  375. package/dist/gateway/static/root/assets/sessions-page-CY0IQcGW.js +0 -1
  376. package/dist/gateway/static/root/assets/settings-advanced-gate-D4NBNVCB.js +0 -1
  377. package/dist/gateway/static/root/assets/settings-form-section-BBYUDLVd.js +0 -1
  378. package/dist/gateway/static/root/assets/settings-page-DaO7zYZM.js +0 -1
  379. package/dist/gateway/static/root/assets/settings-page-layout-D8g9PAek.js +0 -1
  380. package/dist/gateway/static/root/assets/setup-status-panel-Bks0CLLT.js +0 -1
  381. package/dist/gateway/static/root/assets/shares-settings-CEZsKm9r.js +0 -1
  382. package/dist/gateway/static/root/assets/skill-reload-api-oTkHbb9W.js +0 -1
  383. package/dist/gateway/static/root/assets/skills-page-DigsbZ6K.js +0 -2
  384. package/dist/gateway/static/root/assets/voice-api-key-field-CEJklEgb.js +0 -1
  385. package/dist/gateway/static/root/assets/work-item-detail-page-CD6FL_Rs.js +0 -1
  386. package/dist/gateway/static/root/assets/workflows-page-OLQiUpoW.js +0 -18
@@ -1 +1 @@
1
- {"version":3,"file":"skill-manager.js","names":[],"sources":["../../../../src/agent/skills/skill-manager.ts"],"sourcesContent":["/**\n * Skill Manager - Manages skills loading and expansion\n *\n * Handles skill initialization, reloading, and command expansion.\n */\n\nimport { createSkillLoader } from './index.js';\nimport { resolveBundledSkillsDir, resolveStateDir } from '../../config/paths.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { createSkillConfigManager, isSkillEnabled } from './config.js';\nimport { formatSkillsForPrompt, selectSkillsVisibleInPrompt } from './format-skills-prompt.js';\nimport type {\n LoadSkillsResult,\n Skill,\n SkillDiagnostic,\n SkillRuntimeStatus,\n} from './types.js';\n\nconst log = createLogger('SkillManager');\n\nexport interface SkillLoadResult {\n skills: Skill[];\n prompt: string;\n diagnostics: SkillDiagnostic[];\n}\n\nexport class SkillManager {\n private skillPrompt: string = '';\n private skills: Skill[] = [];\n private skillLoader = createSkillLoader();\n private workspace: string;\n private bundledSkillsDir: string;\n private version = 0;\n private loadedAt = 0;\n private reloadInProgress = false;\n private reloadPending = false;\n private lastReloadStartedAt: number | undefined;\n private lastReloadFinishedAt: number | undefined;\n private lastReloadReason: SkillRuntimeStatus['lastReloadReason'];\n private lastReloadOk: boolean | undefined;\n private lastReloadError: string | undefined;\n\n constructor(workspace: string, bundledSkillsDir?: string) {\n this.workspace = workspace;\n this.bundledSkillsDir = bundledSkillsDir || resolveBundledSkillsDir();\n this.initialize();\n }\n\n /**\n * Initialize skills from workspace and bundled directories\n */\n private initialize(): void {\n this.runReload('initial', () => this.skillLoader.init(this.workspace, this.bundledSkillsDir));\n }\n\n /**\n * Recompute skill XML prompt from current skills.json (no disk rescan).\n */\n refreshPromptFromConfig(): void {\n this.skillLoader.refreshPromptFromConfig();\n this.skillPrompt = this.skillLoader.getPrompt();\n this.version += 1;\n this.loadedAt = Date.now();\n this.lastReloadReason = 'config';\n this.lastReloadOk = true;\n this.lastReloadError = undefined;\n }\n\n /**\n * Reload skills from disk\n */\n reload(): void {\n this.runReload('disk', () => this.skillLoader.reload());\n }\n\n private runReload(reason: NonNullable<SkillRuntimeStatus['lastReloadReason']>, load: () => LoadSkillsResult): void {\n if (this.reloadInProgress) {\n this.reloadPending = true;\n return;\n }\n\n do {\n this.reloadPending = false;\n this.reloadInProgress = true;\n this.lastReloadStartedAt = Date.now();\n this.lastReloadReason = reason;\n try {\n const result = load();\n this.applyLoadResult(result);\n this.lastReloadOk = true;\n this.lastReloadError = undefined;\n log.info({ count: result.skills.length, version: this.version }, 'Skills reloaded');\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n this.lastReloadOk = false;\n this.lastReloadError = errorMessage;\n log.error({ err, errorMessage }, `Skills reload failed: ${errorMessage}`);\n } finally {\n this.lastReloadFinishedAt = Date.now();\n this.reloadInProgress = false;\n }\n } while (this.reloadPending);\n }\n\n private applyLoadResult(result: LoadSkillsResult): void {\n this.skillPrompt = result.prompt;\n this.skills = result.skills;\n this.version += 1;\n this.loadedAt = Date.now();\n\n for (const diag of result.diagnostics) {\n if (diag.type === 'collision') {\n log.warn({ skill: diag.skillName, path: diag.path, message: diag.message }, 'Skill collision');\n } else if (diag.type === 'warning') {\n log.warn({ skill: diag.skillName, path: diag.path, message: diag.message }, 'Skill warning');\n } else if (diag.type === 'error') {\n log.error({ skill: diag.skillName, path: diag.path, message: diag.message }, 'Skill error');\n }\n }\n }\n\n /**\n * Get the skill prompt to append to system prompt\n */\n getPrompt(): string {\n return this.skillPrompt;\n }\n\n /**\n * `<available_skills>` XML with optional per-agent allowlist and/or tool-based gating.\n * When both arguments are omitted, returns the cached prompt from disk load (no tool gating).\n */\n getPromptForSkillAllowlist(\n allowlist: string[] | undefined,\n registeredToolNames?: string[],\n ): string {\n if (allowlist === undefined && registeredToolNames === undefined) {\n return this.getPrompt();\n }\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n return formatSkillsForPrompt(this.getSkills(), skillsConfig, {\n skillAllowlist: allowlist,\n registeredToolNames,\n });\n }\n\n /** Skills visible for prompts and skills_list given the same indexing options as {@link getPromptForSkillAllowlist}. */\n selectSkillsForAgentIndexing(options?: {\n skillAllowlist?: string[];\n registeredToolNames?: string[];\n }): Skill[] {\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n return selectSkillsVisibleInPrompt(this.getSkills(), skillsConfig, options);\n }\n\n /**\n * Get all loaded skills\n */\n getSkills(): Skill[] {\n return [...this.skills];\n }\n\n getDiagnostics(): SkillDiagnostic[] {\n return this.skillLoader.getDiagnostics();\n }\n\n getVersion(): string {\n return String(this.version);\n }\n\n getLoadedAt(): number {\n return this.loadedAt;\n }\n\n getStatus(): SkillRuntimeStatus {\n return {\n version: this.getVersion(),\n loadedAt: this.loadedAt,\n reloadInProgress: this.reloadInProgress,\n reloadPending: this.reloadPending,\n ...(this.lastReloadStartedAt !== undefined ? { lastReloadStartedAt: this.lastReloadStartedAt } : {}),\n ...(this.lastReloadFinishedAt !== undefined ? { lastReloadFinishedAt: this.lastReloadFinishedAt } : {}),\n ...(this.lastReloadReason !== undefined ? { lastReloadReason: this.lastReloadReason } : {}),\n ...(this.lastReloadOk !== undefined ? { lastReloadOk: this.lastReloadOk } : {}),\n ...(this.lastReloadError !== undefined ? { lastReloadError: this.lastReloadError } : {}),\n };\n }\n\n /**\n * Get skill names\n */\n getSkillNames(): string[] {\n return this.skills.map((s) => s.name);\n }\n\n /** Names of skills included in the agent system prompt (`<available_skills>`). */\n getSkillNamesForPrompt(): string[] {\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n return this.getSkills()\n .filter((s) => !s.disableModelInvocation && isSkillEnabled(s, skillsConfig))\n .map((s) => s.name);\n }\n\n /**\n * Skills that are enabled for model discovery (respects skills.json and requirement checks).\n */\n getEnabledSkills(): Skill[] {\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n return this.getSkills().filter(\n (s) => !s.disableModelInvocation && isSkillEnabled(s, skillsConfig),\n );\n }\n\n /**\n * Like {@link getEnabledSkills} plus optional allowlist and tool gating (matches `<available_skills>`).\n */\n getEnabledSkillsForAgentSession(options?: {\n skillAllowlist?: string[];\n registeredToolNames?: string[];\n }): Skill[] {\n return this.selectSkillsForAgentIndexing(options);\n }\n\n /**\n * Find a skill by name\n */\n findSkill(name: string): Skill | undefined {\n return this.skills.find(s => s.name === name);\n }\n\n /**\n * Check if a skill exists\n */\n hasSkill(name: string): boolean {\n return this.skills.some(s => s.name === name);\n }\n\n /**\n * Expand a skill command into a full skill block\n */\n expandCommand(text: string, options?: { skillAllowlist?: string[]; registeredToolNames?: string[] }): string {\n if (!text.startsWith('/skill:')) {\n return text;\n }\n\n const { skillName, args } = this.parseSkillCommand(text);\n const visible = this.selectSkillsForAgentIndexing(options);\n const skill = visible.find((s) => s.name === skillName);\n\n if (!skill) {\n log.warn({ skillName }, 'Skill not visible for expansion');\n return text;\n }\n\n return this.buildSkillBlock(skill, args);\n }\n\n /**\n * Parse a /skill: command\n */\n private parseSkillCommand(text: string): { skillName: string; args?: string } {\n // Format: /skill:name args...\n const withoutPrefix = text.slice(7); // Remove '/skill:'\n const spaceIndex = withoutPrefix.indexOf(' ');\n\n if (spaceIndex === -1) {\n return { skillName: withoutPrefix.trim() };\n }\n\n return {\n skillName: withoutPrefix.slice(0, spaceIndex).trim(),\n args: withoutPrefix.slice(spaceIndex + 1).trim(),\n };\n }\n\n /**\n * Build a skill block for inclusion in the prompt\n */\n private buildSkillBlock(skill: Skill, args?: string): string {\n let block = `\\n\\n## Skill: ${skill.name}\\n\\n`;\n \n if (skill.description) {\n block += `${skill.description}\\n\\n`;\n }\n\n // Include raw skill content (SKILL.md content)\n if (skill.content) {\n block += `${skill.content}\\n\\n`;\n }\n\n if (args) {\n block += `**Arguments**: ${args}\\n\\n`;\n }\n\n return block;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"skill-manager.js","names":[],"sources":["../../../../src/agent/skills/skill-manager.ts"],"sourcesContent":["/**\n * Skill Manager - Manages skills loading and expansion\n *\n * Handles skill initialization, reloading, and command expansion.\n */\n\nimport { createSkillLoader } from './index.js';\nimport { resolveBundledSkillsDir, resolveStateDir } from '../../config/paths.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { createSkillConfigManager, isSkillEnabled } from './config.js';\nimport { formatSkillsForPrompt, selectSkillsVisibleInPrompt } from './format-skills-prompt.js';\nimport type {\n LoadSkillsResult,\n Skill,\n SkillDiagnostic,\n SkillRuntimeStatus,\n} from './types.js';\n\nconst log = createLogger('SkillManager');\nconst SKILL_TOKEN_RE = /\\/skill:([A-Za-z0-9][A-Za-z0-9._-]*)/g;\n\nexport interface SkillLoadResult {\n skills: Skill[];\n prompt: string;\n diagnostics: SkillDiagnostic[];\n}\n\nexport class SkillManager {\n private skillPrompt: string = '';\n private skills: Skill[] = [];\n private skillLoader = createSkillLoader();\n private workspace: string;\n private bundledSkillsDir: string;\n private version = 0;\n private loadedAt = 0;\n private reloadInProgress = false;\n private reloadPending = false;\n private lastReloadStartedAt: number | undefined;\n private lastReloadFinishedAt: number | undefined;\n private lastReloadReason: SkillRuntimeStatus['lastReloadReason'];\n private lastReloadOk: boolean | undefined;\n private lastReloadError: string | undefined;\n\n constructor(workspace: string, bundledSkillsDir?: string) {\n this.workspace = workspace;\n this.bundledSkillsDir = bundledSkillsDir || resolveBundledSkillsDir();\n this.initialize();\n }\n\n /**\n * Initialize skills from workspace and bundled directories\n */\n private initialize(): void {\n this.runReload('initial', () => this.skillLoader.init(this.workspace, this.bundledSkillsDir));\n }\n\n /**\n * Recompute skill XML prompt from current skills.json (no disk rescan).\n */\n refreshPromptFromConfig(): void {\n this.skillLoader.refreshPromptFromConfig();\n this.skillPrompt = this.skillLoader.getPrompt();\n this.version += 1;\n this.loadedAt = Date.now();\n this.lastReloadReason = 'config';\n this.lastReloadOk = true;\n this.lastReloadError = undefined;\n }\n\n /**\n * Reload skills from disk\n */\n reload(): void {\n this.runReload('disk', () => this.skillLoader.reload());\n }\n\n private runReload(reason: NonNullable<SkillRuntimeStatus['lastReloadReason']>, load: () => LoadSkillsResult): void {\n if (this.reloadInProgress) {\n this.reloadPending = true;\n return;\n }\n\n do {\n this.reloadPending = false;\n this.reloadInProgress = true;\n this.lastReloadStartedAt = Date.now();\n this.lastReloadReason = reason;\n try {\n const result = load();\n this.applyLoadResult(result);\n this.lastReloadOk = true;\n this.lastReloadError = undefined;\n log.info({ count: result.skills.length, version: this.version }, 'Skills reloaded');\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n this.lastReloadOk = false;\n this.lastReloadError = errorMessage;\n log.error({ err, errorMessage }, `Skills reload failed: ${errorMessage}`);\n } finally {\n this.lastReloadFinishedAt = Date.now();\n this.reloadInProgress = false;\n }\n } while (this.reloadPending);\n }\n\n private applyLoadResult(result: LoadSkillsResult): void {\n this.skillPrompt = result.prompt;\n this.skills = result.skills;\n this.version += 1;\n this.loadedAt = Date.now();\n\n for (const diag of result.diagnostics) {\n if (diag.type === 'collision') {\n log.warn({ skill: diag.skillName, path: diag.path, message: diag.message }, 'Skill collision');\n } else if (diag.type === 'warning') {\n log.warn({ skill: diag.skillName, path: diag.path, message: diag.message }, 'Skill warning');\n } else if (diag.type === 'error') {\n log.error({ skill: diag.skillName, path: diag.path, message: diag.message }, 'Skill error');\n }\n }\n }\n\n /**\n * Get the skill prompt to append to system prompt\n */\n getPrompt(): string {\n return this.skillPrompt;\n }\n\n /**\n * `<available_skills>` XML with optional per-agent allowlist and/or tool-based gating.\n * When both arguments are omitted, returns the cached prompt from disk load (no tool gating).\n */\n getPromptForSkillAllowlist(\n allowlist: string[] | undefined,\n registeredToolNames?: string[],\n ): string {\n if (allowlist === undefined && registeredToolNames === undefined) {\n return this.getPrompt();\n }\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n return formatSkillsForPrompt(this.getSkills(), skillsConfig, {\n skillAllowlist: allowlist,\n registeredToolNames,\n });\n }\n\n /** Skills visible for prompts and skills_list given the same indexing options as {@link getPromptForSkillAllowlist}. */\n selectSkillsForAgentIndexing(options?: {\n skillAllowlist?: string[];\n registeredToolNames?: string[];\n }): Skill[] {\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n return selectSkillsVisibleInPrompt(this.getSkills(), skillsConfig, options);\n }\n\n /**\n * Get all loaded skills\n */\n getSkills(): Skill[] {\n return [...this.skills];\n }\n\n getDiagnostics(): SkillDiagnostic[] {\n return this.skillLoader.getDiagnostics();\n }\n\n getVersion(): string {\n return String(this.version);\n }\n\n getLoadedAt(): number {\n return this.loadedAt;\n }\n\n getStatus(): SkillRuntimeStatus {\n return {\n version: this.getVersion(),\n loadedAt: this.loadedAt,\n reloadInProgress: this.reloadInProgress,\n reloadPending: this.reloadPending,\n ...(this.lastReloadStartedAt !== undefined ? { lastReloadStartedAt: this.lastReloadStartedAt } : {}),\n ...(this.lastReloadFinishedAt !== undefined ? { lastReloadFinishedAt: this.lastReloadFinishedAt } : {}),\n ...(this.lastReloadReason !== undefined ? { lastReloadReason: this.lastReloadReason } : {}),\n ...(this.lastReloadOk !== undefined ? { lastReloadOk: this.lastReloadOk } : {}),\n ...(this.lastReloadError !== undefined ? { lastReloadError: this.lastReloadError } : {}),\n };\n }\n\n /**\n * Get skill names\n */\n getSkillNames(): string[] {\n return this.skills.map((s) => s.name);\n }\n\n /** Names of skills included in the agent system prompt (`<available_skills>`). */\n getSkillNamesForPrompt(): string[] {\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n return this.getSkills()\n .filter((s) => !s.disableModelInvocation && isSkillEnabled(s, skillsConfig))\n .map((s) => s.name);\n }\n\n /**\n * Skills that are enabled for model discovery (respects skills.json and requirement checks).\n */\n getEnabledSkills(): Skill[] {\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n return this.getSkills().filter(\n (s) => !s.disableModelInvocation && isSkillEnabled(s, skillsConfig),\n );\n }\n\n /**\n * Like {@link getEnabledSkills} plus optional allowlist and tool gating (matches `<available_skills>`).\n */\n getEnabledSkillsForAgentSession(options?: {\n skillAllowlist?: string[];\n registeredToolNames?: string[];\n }): Skill[] {\n return this.selectSkillsForAgentIndexing(options);\n }\n\n getActivatedCapabilitiesForText(\n text: string,\n options?: { skillAllowlist?: string[]; registeredToolNames?: string[] },\n ): string[] {\n if (!text.includes('/skill:')) return [];\n const selected = new Set<string>();\n for (const match of text.matchAll(SKILL_TOKEN_RE)) {\n if (match[1]) selected.add(match[1]);\n }\n if (selected.size === 0) return [];\n\n const visible = this.selectSkillsForAgentIndexing(options);\n const activeCapabilities = new Set<string>();\n for (const skill of visible) {\n if (!selected.has(skill.name)) continue;\n for (const capabilityName of skill.metadata.xopc?.activatesCapabilities ?? []) {\n const trimmed = capabilityName.trim();\n if (trimmed) activeCapabilities.add(trimmed);\n }\n }\n return [...activeCapabilities];\n }\n\n /**\n * Find a skill by name\n */\n findSkill(name: string): Skill | undefined {\n return this.skills.find(s => s.name === name);\n }\n\n /**\n * Check if a skill exists\n */\n hasSkill(name: string): boolean {\n return this.skills.some(s => s.name === name);\n }\n\n /**\n * Expand a skill command into a full skill block\n */\n expandCommand(text: string, options?: { skillAllowlist?: string[]; registeredToolNames?: string[] }): string {\n if (!text.startsWith('/skill:')) {\n return text;\n }\n\n const { skillName, args } = this.parseSkillCommand(text);\n const visible = this.selectSkillsForAgentIndexing(options);\n const skill = visible.find((s) => s.name === skillName);\n\n if (!skill) {\n log.warn({ skillName }, 'Skill not visible for expansion');\n return text;\n }\n\n return this.buildSkillBlock(skill, args);\n }\n\n /**\n * Parse a /skill: command\n */\n private parseSkillCommand(text: string): { skillName: string; args?: string } {\n // Format: /skill:name args...\n const withoutPrefix = text.slice(7); // Remove '/skill:'\n const spaceIndex = withoutPrefix.indexOf(' ');\n\n if (spaceIndex === -1) {\n return { skillName: withoutPrefix.trim() };\n }\n\n return {\n skillName: withoutPrefix.slice(0, spaceIndex).trim(),\n args: withoutPrefix.slice(spaceIndex + 1).trim(),\n };\n }\n\n /**\n * Build a skill block for inclusion in the prompt\n */\n private buildSkillBlock(skill: Skill, args?: string): string {\n let block = `\\n\\n## Skill: ${skill.name}\\n\\n`;\n \n if (skill.description) {\n block += `${skill.description}\\n\\n`;\n }\n\n // Include raw skill content (SKILL.md content)\n if (skill.content) {\n block += `${skill.content}\\n\\n`;\n }\n\n if (args) {\n block += `**Arguments**: ${args}\\n\\n`;\n }\n\n return block;\n }\n}\n"],"mappings":";;;;;;;;;;;;;YAOiF;aAC5B;AAUrD,MAAM,MAAM,aAAa,eAAe;AACxC,MAAM,iBAAiB;AAQvB,IAAa,eAAb,MAA0B;CACxB,cAA8B;CAC9B,SAA0B,EAAE;CAC5B,cAAsB,mBAAmB;CACzC;CACA;CACA,UAAkB;CAClB,WAAmB;CACnB,mBAA2B;CAC3B,gBAAwB;CACxB;CACA;CACA;CACA;CACA;CAEA,YAAY,WAAmB,kBAA2B;AACxD,OAAK,YAAY;AACjB,OAAK,mBAAmB,oBAAoB,yBAAyB;AACrE,OAAK,YAAY;;;;;CAMnB,aAA2B;AACzB,OAAK,UAAU,iBAAiB,KAAK,YAAY,KAAK,KAAK,WAAW,KAAK,iBAAiB,CAAC;;;;;CAM/F,0BAAgC;AAC9B,OAAK,YAAY,yBAAyB;AAC1C,OAAK,cAAc,KAAK,YAAY,WAAW;AAC/C,OAAK,WAAW;AAChB,OAAK,WAAW,KAAK,KAAK;AAC1B,OAAK,mBAAmB;AACxB,OAAK,eAAe;AACpB,OAAK,kBAAkB,KAAA;;;;;CAMzB,SAAe;AACb,OAAK,UAAU,cAAc,KAAK,YAAY,QAAQ,CAAC;;CAGzD,UAAkB,QAA6D,MAAoC;AACjH,MAAI,KAAK,kBAAkB;AACzB,QAAK,gBAAgB;AACrB;;AAGF,KAAG;AACD,QAAK,gBAAgB;AACrB,QAAK,mBAAmB;AACxB,QAAK,sBAAsB,KAAK,KAAK;AACrC,QAAK,mBAAmB;AACxB,OAAI;IACF,MAAM,SAAS,MAAM;AACrB,SAAK,gBAAgB,OAAO;AAC5B,SAAK,eAAe;AACpB,SAAK,kBAAkB,KAAA;AACvB,QAAI,KAAK;KAAE,OAAO,OAAO,OAAO;KAAQ,SAAS,KAAK;KAAS,EAAE,kBAAkB;YAC5E,KAAK;IACZ,MAAM,eAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AACrE,SAAK,eAAe;AACpB,SAAK,kBAAkB;AACvB,QAAI,MAAM;KAAE;KAAK;KAAc,EAAE,yBAAyB,eAAe;aACjE;AACR,SAAK,uBAAuB,KAAK,KAAK;AACtC,SAAK,mBAAmB;;WAEnB,KAAK;;CAGhB,gBAAwB,QAAgC;AACtD,OAAK,cAAc,OAAO;AAC1B,OAAK,SAAS,OAAO;AACrB,OAAK,WAAW;AAChB,OAAK,WAAW,KAAK,KAAK;AAE1B,OAAK,MAAM,QAAQ,OAAO,YACxB,KAAI,KAAK,SAAS,YAChB,KAAI,KAAK;GAAE,OAAO,KAAK;GAAW,MAAM,KAAK;GAAM,SAAS,KAAK;GAAS,EAAE,kBAAkB;WACrF,KAAK,SAAS,UACvB,KAAI,KAAK;GAAE,OAAO,KAAK;GAAW,MAAM,KAAK;GAAM,SAAS,KAAK;GAAS,EAAE,gBAAgB;WACnF,KAAK,SAAS,QACvB,KAAI,MAAM;GAAE,OAAO,KAAK;GAAW,MAAM,KAAK;GAAM,SAAS,KAAK;GAAS,EAAE,cAAc;;;;;CAQjG,YAAoB;AAClB,SAAO,KAAK;;;;;;CAOd,2BACE,WACA,qBACQ;AACR,MAAI,cAAc,KAAA,KAAa,wBAAwB,KAAA,EACrD,QAAO,KAAK,WAAW;EAEzB,MAAM,eAAe,yBAAyB,iBAAiB,CAAC,CAAC,MAAM;AACvE,SAAO,sBAAsB,KAAK,WAAW,EAAE,cAAc;GAC3D,gBAAgB;GAChB;GACD,CAAC;;;CAIJ,6BAA6B,SAGjB;EACV,MAAM,eAAe,yBAAyB,iBAAiB,CAAC,CAAC,MAAM;AACvE,SAAO,4BAA4B,KAAK,WAAW,EAAE,cAAc,QAAQ;;;;;CAM7E,YAAqB;AACnB,SAAO,CAAC,GAAG,KAAK,OAAO;;CAGzB,iBAAoC;AAClC,SAAO,KAAK,YAAY,gBAAgB;;CAG1C,aAAqB;AACnB,SAAO,OAAO,KAAK,QAAQ;;CAG7B,cAAsB;AACpB,SAAO,KAAK;;CAGd,YAAgC;AAC9B,SAAO;GACL,SAAS,KAAK,YAAY;GAC1B,UAAU,KAAK;GACf,kBAAkB,KAAK;GACvB,eAAe,KAAK;GACpB,GAAI,KAAK,wBAAwB,KAAA,IAAY,EAAE,qBAAqB,KAAK,qBAAqB,GAAG,EAAE;GACnG,GAAI,KAAK,yBAAyB,KAAA,IAAY,EAAE,sBAAsB,KAAK,sBAAsB,GAAG,EAAE;GACtG,GAAI,KAAK,qBAAqB,KAAA,IAAY,EAAE,kBAAkB,KAAK,kBAAkB,GAAG,EAAE;GAC1F,GAAI,KAAK,iBAAiB,KAAA,IAAY,EAAE,cAAc,KAAK,cAAc,GAAG,EAAE;GAC9E,GAAI,KAAK,oBAAoB,KAAA,IAAY,EAAE,iBAAiB,KAAK,iBAAiB,GAAG,EAAE;GACxF;;;;;CAMH,gBAA0B;AACxB,SAAO,KAAK,OAAO,KAAK,MAAM,EAAE,KAAK;;;CAIvC,yBAAmC;EACjC,MAAM,eAAe,yBAAyB,iBAAiB,CAAC,CAAC,MAAM;AACvE,SAAO,KAAK,WAAW,CACpB,QAAQ,MAAM,CAAC,EAAE,0BAA0B,eAAe,GAAG,aAAa,CAAC,CAC3E,KAAK,MAAM,EAAE,KAAK;;;;;CAMvB,mBAA4B;EAC1B,MAAM,eAAe,yBAAyB,iBAAiB,CAAC,CAAC,MAAM;AACvE,SAAO,KAAK,WAAW,CAAC,QACrB,MAAM,CAAC,EAAE,0BAA0B,eAAe,GAAG,aAAa,CACpE;;;;;CAMH,gCAAgC,SAGpB;AACV,SAAO,KAAK,6BAA6B,QAAQ;;CAGnD,gCACE,MACA,SACU;AACV,MAAI,CAAC,KAAK,SAAS,UAAU,CAAE,QAAO,EAAE;EACxC,MAAM,2BAAW,IAAI,KAAa;AAClC,OAAK,MAAM,SAAS,KAAK,SAAS,eAAe,CAC/C,KAAI,MAAM,GAAI,UAAS,IAAI,MAAM,GAAG;AAEtC,MAAI,SAAS,SAAS,EAAG,QAAO,EAAE;EAElC,MAAM,UAAU,KAAK,6BAA6B,QAAQ;EAC1D,MAAM,qCAAqB,IAAI,KAAa;AAC5C,OAAK,MAAM,SAAS,SAAS;AAC3B,OAAI,CAAC,SAAS,IAAI,MAAM,KAAK,CAAE;AAC/B,QAAK,MAAM,kBAAkB,MAAM,SAAS,MAAM,yBAAyB,EAAE,EAAE;IAC7E,MAAM,UAAU,eAAe,MAAM;AACrC,QAAI,QAAS,oBAAmB,IAAI,QAAQ;;;AAGhD,SAAO,CAAC,GAAG,mBAAmB;;;;;CAMhC,UAAU,MAAiC;AACzC,SAAO,KAAK,OAAO,MAAK,MAAK,EAAE,SAAS,KAAK;;;;;CAM/C,SAAS,MAAuB;AAC9B,SAAO,KAAK,OAAO,MAAK,MAAK,EAAE,SAAS,KAAK;;;;;CAM/C,cAAc,MAAc,SAAiF;AAC3G,MAAI,CAAC,KAAK,WAAW,UAAU,CAC7B,QAAO;EAGT,MAAM,EAAE,WAAW,SAAS,KAAK,kBAAkB,KAAK;EAExD,MAAM,QADU,KAAK,6BAA6B,QAC7B,CAAC,MAAM,MAAM,EAAE,SAAS,UAAU;AAEvD,MAAI,CAAC,OAAO;AACV,OAAI,KAAK,EAAE,WAAW,EAAE,kCAAkC;AAC1D,UAAO;;AAGT,SAAO,KAAK,gBAAgB,OAAO,KAAK;;;;;CAM1C,kBAA0B,MAAoD;EAE5E,MAAM,gBAAgB,KAAK,MAAM,EAAE;EACnC,MAAM,aAAa,cAAc,QAAQ,IAAI;AAE7C,MAAI,eAAe,GACjB,QAAO,EAAE,WAAW,cAAc,MAAM,EAAE;AAG5C,SAAO;GACL,WAAW,cAAc,MAAM,GAAG,WAAW,CAAC,MAAM;GACpD,MAAM,cAAc,MAAM,aAAa,EAAE,CAAC,MAAM;GACjD;;;;;CAMH,gBAAwB,OAAc,MAAuB;EAC3D,IAAI,QAAQ,iBAAiB,MAAM,KAAK;AAExC,MAAI,MAAM,YACR,UAAS,GAAG,MAAM,YAAY;AAIhC,MAAI,MAAM,QACR,UAAS,GAAG,MAAM,QAAQ;AAG5B,MAAI,KACF,UAAS,kBAAkB,KAAK;AAGlC,SAAO"}
@@ -60,6 +60,11 @@ export interface SkillMetadata {
60
60
  requires?: SkillRequires;
61
61
  install?: SkillInstallSpec[];
62
62
  os?: Array<'darwin' | 'linux' | 'win32'>;
63
+ /**
64
+ * Lazy capability packs to inject only when this skill is explicitly selected for a turn.
65
+ * Parsed from `metadata.xopc.activates_capabilities`.
66
+ */
67
+ activatesCapabilities?: string[];
63
68
  };
64
69
  }
65
70
  export interface SkillConfig {
@@ -1,11 +1,20 @@
1
1
  import { browserUseManual } from "./browser.js";
2
+ import { xopcUseManual } from "./xopc-use.js";
2
3
  //#region src/agent/tool-manuals/index.ts
3
- const TOOL_MANUALS = { browser_use: {
4
- toolName: "browser_use",
5
- title: "Browser Tool Manual",
6
- description: "Usage guide for browser navigation, inspection, interaction, screenshots, and pipelines.",
7
- content: browserUseManual
8
- } };
4
+ const TOOL_MANUALS = {
5
+ browser_use: {
6
+ toolName: "browser_use",
7
+ title: "Browser Tool Manual",
8
+ description: "Usage guide for browser navigation, inspection, interaction, screenshots, and pipelines.",
9
+ content: browserUseManual
10
+ },
11
+ xopc_use: {
12
+ toolName: "xopc_use",
13
+ title: "XOPC Use Tool Manual",
14
+ description: "Usage guide for operating XOPC projects, notes, and project work items.",
15
+ content: xopcUseManual
16
+ }
17
+ };
9
18
  function normalizeToolName(toolName) {
10
19
  return toolName.trim().toLowerCase();
11
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/agent/tool-manuals/index.ts"],"sourcesContent":["import { browserUseManual } from './browser.js';\n\nexport interface ToolManual {\n toolName: string;\n title: string;\n description: string;\n content: string;\n}\n\nexport type ToolManualSummary = Omit<ToolManual, 'content'>;\n\nconst TOOL_MANUALS: Record<string, ToolManual> = {\n browser_use: {\n toolName: 'browser_use',\n title: 'Browser Tool Manual',\n description: 'Usage guide for browser navigation, inspection, interaction, screenshots, and pipelines.',\n content: browserUseManual,\n },\n};\n\nfunction normalizeToolName(toolName: string): string {\n return toolName.trim().toLowerCase();\n}\n\nexport function getToolManual(toolName: string): ToolManual | null {\n return TOOL_MANUALS[normalizeToolName(toolName)] ?? null;\n}\n\nexport function hasToolManual(toolName: string): boolean {\n return getToolManual(toolName) !== null;\n}\n\nexport function listToolManuals(): ToolManualSummary[] {\n return Object.values(TOOL_MANUALS)\n .map(({ toolName, title, description }) => ({ toolName, title, description }))\n .sort((a, b) => a.toolName.localeCompare(b.toolName));\n}\n"],"mappings":";;AAWA,MAAM,eAA2C,EAC/C,aAAa;CACX,UAAU;CACV,OAAO;CACP,aAAa;CACb,SAAS;CACV,EACF;AAED,SAAS,kBAAkB,UAA0B;AACnD,QAAO,SAAS,MAAM,CAAC,aAAa;;AAGtC,SAAgB,cAAc,UAAqC;AACjE,QAAO,aAAa,kBAAkB,SAAS,KAAK;;AAGtD,SAAgB,cAAc,UAA2B;AACvD,QAAO,cAAc,SAAS,KAAK;;AAGrC,SAAgB,kBAAuC;AACrD,QAAO,OAAO,OAAO,aAAa,CAC/B,KAAK,EAAE,UAAU,OAAO,mBAAmB;EAAE;EAAU;EAAO;EAAa,EAAE,CAC7E,MAAM,GAAG,MAAM,EAAE,SAAS,cAAc,EAAE,SAAS,CAAC"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/agent/tool-manuals/index.ts"],"sourcesContent":["import { browserUseManual } from './browser.js';\nimport { xopcUseManual } from './xopc-use.js';\n\nexport interface ToolManual {\n toolName: string;\n title: string;\n description: string;\n content: string;\n}\n\nexport type ToolManualSummary = Omit<ToolManual, 'content'>;\n\nconst TOOL_MANUALS: Record<string, ToolManual> = {\n browser_use: {\n toolName: 'browser_use',\n title: 'Browser Tool Manual',\n description: 'Usage guide for browser navigation, inspection, interaction, screenshots, and pipelines.',\n content: browserUseManual,\n },\n xopc_use: {\n toolName: 'xopc_use',\n title: 'XOPC Use Tool Manual',\n description: 'Usage guide for operating XOPC projects, notes, and project work items.',\n content: xopcUseManual,\n },\n};\n\nfunction normalizeToolName(toolName: string): string {\n return toolName.trim().toLowerCase();\n}\n\nexport function getToolManual(toolName: string): ToolManual | null {\n return TOOL_MANUALS[normalizeToolName(toolName)] ?? null;\n}\n\nexport function hasToolManual(toolName: string): boolean {\n return getToolManual(toolName) !== null;\n}\n\nexport function listToolManuals(): ToolManualSummary[] {\n return Object.values(TOOL_MANUALS)\n .map(({ toolName, title, description }) => ({ toolName, title, description }))\n .sort((a, b) => a.toolName.localeCompare(b.toolName));\n}\n"],"mappings":";;;AAYA,MAAM,eAA2C;CAC/C,aAAa;EACX,UAAU;EACV,OAAO;EACP,aAAa;EACb,SAAS;EACV;CACD,UAAU;EACR,UAAU;EACV,OAAO;EACP,aAAa;EACb,SAAS;EACV;CACF;AAED,SAAS,kBAAkB,UAA0B;AACnD,QAAO,SAAS,MAAM,CAAC,aAAa;;AAGtC,SAAgB,cAAc,UAAqC;AACjE,QAAO,aAAa,kBAAkB,SAAS,KAAK;;AAGtD,SAAgB,cAAc,UAA2B;AACvD,QAAO,cAAc,SAAS,KAAK;;AAGrC,SAAgB,kBAAuC;AACrD,QAAO,OAAO,OAAO,aAAa,CAC/B,KAAK,EAAE,UAAU,OAAO,mBAAmB;EAAE;EAAU;EAAO;EAAa,EAAE,CAC7E,MAAM,GAAG,MAAM,EAAE,SAAS,cAAc,EAAE,SAAS,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const xopcUseManual = "# XOPC Use Tool Manual\n\n## Overview\n\n`xopc_use` is the unified tool for operating XOPC product objects. Use it instead of editing storage files or database rows directly.\n\nBasic shape:\n\n```json\n{\n \"mode\": \"project | note | work_item\",\n \"command\": \"list | get | create | update | append | preview_edit | resolve_workspace\",\n \"args\": { \"...\": \"...\" },\n \"dryRun\": false\n}\n```\n\n## General Rules\n\n- Use `list` or `get` first when the target object is ambiguous.\n- Use `dryRun: true` before a broad or risky change.\n- Prefer additive operations over destructive replacement.\n- Do not invent ids. If an id is not known, search/list first.\n- Do not attempt delete/archive workflows through this tool unless the command is explicitly supported.\n- For non-trivial note rewrites, use `note.preview_edit` before `note.update`.\n\n## Projects\n\nProjects group sessions, work items, goals, workflows, files, and project instructions.\n\n### Find projects\n\n```json\n{ \"mode\": \"project\", \"command\": \"list\", \"args\": { \"search\": \"release\", \"limit\": 10 } }\n```\n\n### Read project detail\n\n```json\n{ \"mode\": \"project\", \"command\": \"get\", \"args\": { \"projectId\": \"project_id\" } }\n```\n\n### Create a project\n\nUse when the user asks to start or formalize a project. Include `workspaceRoot` when the project maps to a local repository or directory. Include `brief` for the concise product idea and `instructions` for agent-operating guidance.\n\n```json\n{\n \"mode\": \"project\",\n \"command\": \"create\",\n \"args\": {\n \"name\": \"AI Product Research\",\n \"workspaceRoot\": \"/path/to/repo\",\n \"brief\": \"Explore demand and feasibility for an AI product.\",\n \"instructions\": \"Keep decisions and open questions current.\"\n }\n}\n```\n\n### Update a project\n\nUse for metadata, brief, status, or instructions. Use `dryRun` first when changing `workspaceRoot` or broad instructions.\n\n```json\n{\n \"mode\": \"project\",\n \"command\": \"update\",\n \"args\": {\n \"projectId\": \"project_id\",\n \"status\": \"active\",\n \"instructions\": \"Prioritize safe previews before changing notes.\"\n }\n}\n```\n\n### Resolve workspace\n\nUse when a file path or current working directory should be mapped to a project.\n\n```json\n{\n \"mode\": \"project\",\n \"command\": \"resolve_workspace\",\n \"args\": { \"workspacePath\": \"/path/to/repo\", \"autoCreate\": false }\n}\n```\n\n## Notes\n\nNotes are user-owned markdown objects. Treat them as durable user content.\n\n### Find notes\n\n```json\n{ \"mode\": \"note\", \"command\": \"list\", \"args\": { \"search\": \"pricing\", \"limit\": 10 } }\n```\n\n### Create a note\n\n```json\n{\n \"mode\": \"note\",\n \"command\": \"create\",\n \"args\": {\n \"title\": \"Product direction\",\n \"markdown\": \"Initial notes...\",\n \"tags\": [\"product\"]\n }\n}\n```\n\n### Append to a note\n\nPrefer append when preserving original user notes and adding AI output.\n\n```json\n{\n \"mode\": \"note\",\n \"command\": \"append\",\n \"args\": {\n \"noteId\": \"note_id\",\n \"heading\": \"AI synthesis\",\n \"content\": \"Key points...\"\n }\n}\n```\n\n### Preview an edit\n\nUse before rewriting or restructuring a note.\n\n```json\n{\n \"mode\": \"note\",\n \"command\": \"preview_edit\",\n \"args\": {\n \"noteId\": \"note_id\",\n \"instruction\": \"Summarize this as action items\"\n }\n}\n```\n\n### Update a note\n\nUse only when the user clearly wants the canonical note changed. Prefer `append` or `preview_edit` otherwise.\n\n```json\n{\n \"mode\": \"note\",\n \"command\": \"update\",\n \"args\": {\n \"noteId\": \"note_id\",\n \"status\": \"processed\",\n \"tags\": [\"product\", \"validated\"]\n }\n}\n```\n\n## Work Items\n\nWork items are project-scoped tasks. If `projectId` is omitted, the tool may inherit the current session's project binding.\n\n### Create a work item\n\n```json\n{\n \"mode\": \"work_item\",\n \"command\": \"create\",\n \"args\": {\n \"projectId\": \"project_id\",\n \"title\": \"Validate technical feasibility\",\n \"description\": \"Check API, storage, UI, and safety implications.\",\n \"priority\": \"high\",\n \"status\": \"todo\"\n }\n}\n```\n\n### Update a work item\n\n```json\n{\n \"mode\": \"work_item\",\n \"command\": \"update\",\n \"args\": {\n \"workItemId\": \"work_item_id\",\n \"status\": \"in_progress\",\n \"nextAction\": \"Prototype the xopc_use tool path.\"\n }\n}\n```\n\n## Safety\n\n- `note.update` can replace canonical user content. Use `preview_edit` first for content rewrites.\n- `project.update.workspaceRoot` changes project-file scope. Use `dryRun` and ask the user if intent is unclear.\n- `work_item.update.archivedAt` hides work from normal active views. Confirm before archiving.\n- If the user asks for deletion, explain that deletion is not exposed through `xopc_use` yet.\n";
@@ -0,0 +1,204 @@
1
+ //#region src/agent/tool-manuals/xopc-use.ts
2
+ const xopcUseManual = `# XOPC Use Tool Manual
3
+
4
+ ## Overview
5
+
6
+ \`xopc_use\` is the unified tool for operating XOPC product objects. Use it instead of editing storage files or database rows directly.
7
+
8
+ Basic shape:
9
+
10
+ \`\`\`json
11
+ {
12
+ "mode": "project | note | work_item",
13
+ "command": "list | get | create | update | append | preview_edit | resolve_workspace",
14
+ "args": { "...": "..." },
15
+ "dryRun": false
16
+ }
17
+ \`\`\`
18
+
19
+ ## General Rules
20
+
21
+ - Use \`list\` or \`get\` first when the target object is ambiguous.
22
+ - Use \`dryRun: true\` before a broad or risky change.
23
+ - Prefer additive operations over destructive replacement.
24
+ - Do not invent ids. If an id is not known, search/list first.
25
+ - Do not attempt delete/archive workflows through this tool unless the command is explicitly supported.
26
+ - For non-trivial note rewrites, use \`note.preview_edit\` before \`note.update\`.
27
+
28
+ ## Projects
29
+
30
+ Projects group sessions, work items, goals, workflows, files, and project instructions.
31
+
32
+ ### Find projects
33
+
34
+ \`\`\`json
35
+ { "mode": "project", "command": "list", "args": { "search": "release", "limit": 10 } }
36
+ \`\`\`
37
+
38
+ ### Read project detail
39
+
40
+ \`\`\`json
41
+ { "mode": "project", "command": "get", "args": { "projectId": "project_id" } }
42
+ \`\`\`
43
+
44
+ ### Create a project
45
+
46
+ Use when the user asks to start or formalize a project. Include \`workspaceRoot\` when the project maps to a local repository or directory. Include \`brief\` for the concise product idea and \`instructions\` for agent-operating guidance.
47
+
48
+ \`\`\`json
49
+ {
50
+ "mode": "project",
51
+ "command": "create",
52
+ "args": {
53
+ "name": "AI Product Research",
54
+ "workspaceRoot": "/path/to/repo",
55
+ "brief": "Explore demand and feasibility for an AI product.",
56
+ "instructions": "Keep decisions and open questions current."
57
+ }
58
+ }
59
+ \`\`\`
60
+
61
+ ### Update a project
62
+
63
+ Use for metadata, brief, status, or instructions. Use \`dryRun\` first when changing \`workspaceRoot\` or broad instructions.
64
+
65
+ \`\`\`json
66
+ {
67
+ "mode": "project",
68
+ "command": "update",
69
+ "args": {
70
+ "projectId": "project_id",
71
+ "status": "active",
72
+ "instructions": "Prioritize safe previews before changing notes."
73
+ }
74
+ }
75
+ \`\`\`
76
+
77
+ ### Resolve workspace
78
+
79
+ Use when a file path or current working directory should be mapped to a project.
80
+
81
+ \`\`\`json
82
+ {
83
+ "mode": "project",
84
+ "command": "resolve_workspace",
85
+ "args": { "workspacePath": "/path/to/repo", "autoCreate": false }
86
+ }
87
+ \`\`\`
88
+
89
+ ## Notes
90
+
91
+ Notes are user-owned markdown objects. Treat them as durable user content.
92
+
93
+ ### Find notes
94
+
95
+ \`\`\`json
96
+ { "mode": "note", "command": "list", "args": { "search": "pricing", "limit": 10 } }
97
+ \`\`\`
98
+
99
+ ### Create a note
100
+
101
+ \`\`\`json
102
+ {
103
+ "mode": "note",
104
+ "command": "create",
105
+ "args": {
106
+ "title": "Product direction",
107
+ "markdown": "Initial notes...",
108
+ "tags": ["product"]
109
+ }
110
+ }
111
+ \`\`\`
112
+
113
+ ### Append to a note
114
+
115
+ Prefer append when preserving original user notes and adding AI output.
116
+
117
+ \`\`\`json
118
+ {
119
+ "mode": "note",
120
+ "command": "append",
121
+ "args": {
122
+ "noteId": "note_id",
123
+ "heading": "AI synthesis",
124
+ "content": "Key points..."
125
+ }
126
+ }
127
+ \`\`\`
128
+
129
+ ### Preview an edit
130
+
131
+ Use before rewriting or restructuring a note.
132
+
133
+ \`\`\`json
134
+ {
135
+ "mode": "note",
136
+ "command": "preview_edit",
137
+ "args": {
138
+ "noteId": "note_id",
139
+ "instruction": "Summarize this as action items"
140
+ }
141
+ }
142
+ \`\`\`
143
+
144
+ ### Update a note
145
+
146
+ Use only when the user clearly wants the canonical note changed. Prefer \`append\` or \`preview_edit\` otherwise.
147
+
148
+ \`\`\`json
149
+ {
150
+ "mode": "note",
151
+ "command": "update",
152
+ "args": {
153
+ "noteId": "note_id",
154
+ "status": "processed",
155
+ "tags": ["product", "validated"]
156
+ }
157
+ }
158
+ \`\`\`
159
+
160
+ ## Work Items
161
+
162
+ Work items are project-scoped tasks. If \`projectId\` is omitted, the tool may inherit the current session's project binding.
163
+
164
+ ### Create a work item
165
+
166
+ \`\`\`json
167
+ {
168
+ "mode": "work_item",
169
+ "command": "create",
170
+ "args": {
171
+ "projectId": "project_id",
172
+ "title": "Validate technical feasibility",
173
+ "description": "Check API, storage, UI, and safety implications.",
174
+ "priority": "high",
175
+ "status": "todo"
176
+ }
177
+ }
178
+ \`\`\`
179
+
180
+ ### Update a work item
181
+
182
+ \`\`\`json
183
+ {
184
+ "mode": "work_item",
185
+ "command": "update",
186
+ "args": {
187
+ "workItemId": "work_item_id",
188
+ "status": "in_progress",
189
+ "nextAction": "Prototype the xopc_use tool path."
190
+ }
191
+ }
192
+ \`\`\`
193
+
194
+ ## Safety
195
+
196
+ - \`note.update\` can replace canonical user content. Use \`preview_edit\` first for content rewrites.
197
+ - \`project.update.workspaceRoot\` changes project-file scope. Use \`dryRun\` and ask the user if intent is unclear.
198
+ - \`work_item.update.archivedAt\` hides work from normal active views. Confirm before archiving.
199
+ - If the user asks for deletion, explain that deletion is not exposed through \`xopc_use\` yet.
200
+ `;
201
+ //#endregion
202
+ export { xopcUseManual };
203
+
204
+ //# sourceMappingURL=xopc-use.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xopc-use.js","names":[],"sources":["../../../../src/agent/tool-manuals/xopc-use.ts"],"sourcesContent":["export const xopcUseManual = `# XOPC Use Tool Manual\n\n## Overview\n\n\\`xopc_use\\` is the unified tool for operating XOPC product objects. Use it instead of editing storage files or database rows directly.\n\nBasic shape:\n\n\\`\\`\\`json\n{\n \"mode\": \"project | note | work_item\",\n \"command\": \"list | get | create | update | append | preview_edit | resolve_workspace\",\n \"args\": { \"...\": \"...\" },\n \"dryRun\": false\n}\n\\`\\`\\`\n\n## General Rules\n\n- Use \\`list\\` or \\`get\\` first when the target object is ambiguous.\n- Use \\`dryRun: true\\` before a broad or risky change.\n- Prefer additive operations over destructive replacement.\n- Do not invent ids. If an id is not known, search/list first.\n- Do not attempt delete/archive workflows through this tool unless the command is explicitly supported.\n- For non-trivial note rewrites, use \\`note.preview_edit\\` before \\`note.update\\`.\n\n## Projects\n\nProjects group sessions, work items, goals, workflows, files, and project instructions.\n\n### Find projects\n\n\\`\\`\\`json\n{ \"mode\": \"project\", \"command\": \"list\", \"args\": { \"search\": \"release\", \"limit\": 10 } }\n\\`\\`\\`\n\n### Read project detail\n\n\\`\\`\\`json\n{ \"mode\": \"project\", \"command\": \"get\", \"args\": { \"projectId\": \"project_id\" } }\n\\`\\`\\`\n\n### Create a project\n\nUse when the user asks to start or formalize a project. Include \\`workspaceRoot\\` when the project maps to a local repository or directory. Include \\`brief\\` for the concise product idea and \\`instructions\\` for agent-operating guidance.\n\n\\`\\`\\`json\n{\n \"mode\": \"project\",\n \"command\": \"create\",\n \"args\": {\n \"name\": \"AI Product Research\",\n \"workspaceRoot\": \"/path/to/repo\",\n \"brief\": \"Explore demand and feasibility for an AI product.\",\n \"instructions\": \"Keep decisions and open questions current.\"\n }\n}\n\\`\\`\\`\n\n### Update a project\n\nUse for metadata, brief, status, or instructions. Use \\`dryRun\\` first when changing \\`workspaceRoot\\` or broad instructions.\n\n\\`\\`\\`json\n{\n \"mode\": \"project\",\n \"command\": \"update\",\n \"args\": {\n \"projectId\": \"project_id\",\n \"status\": \"active\",\n \"instructions\": \"Prioritize safe previews before changing notes.\"\n }\n}\n\\`\\`\\`\n\n### Resolve workspace\n\nUse when a file path or current working directory should be mapped to a project.\n\n\\`\\`\\`json\n{\n \"mode\": \"project\",\n \"command\": \"resolve_workspace\",\n \"args\": { \"workspacePath\": \"/path/to/repo\", \"autoCreate\": false }\n}\n\\`\\`\\`\n\n## Notes\n\nNotes are user-owned markdown objects. Treat them as durable user content.\n\n### Find notes\n\n\\`\\`\\`json\n{ \"mode\": \"note\", \"command\": \"list\", \"args\": { \"search\": \"pricing\", \"limit\": 10 } }\n\\`\\`\\`\n\n### Create a note\n\n\\`\\`\\`json\n{\n \"mode\": \"note\",\n \"command\": \"create\",\n \"args\": {\n \"title\": \"Product direction\",\n \"markdown\": \"Initial notes...\",\n \"tags\": [\"product\"]\n }\n}\n\\`\\`\\`\n\n### Append to a note\n\nPrefer append when preserving original user notes and adding AI output.\n\n\\`\\`\\`json\n{\n \"mode\": \"note\",\n \"command\": \"append\",\n \"args\": {\n \"noteId\": \"note_id\",\n \"heading\": \"AI synthesis\",\n \"content\": \"Key points...\"\n }\n}\n\\`\\`\\`\n\n### Preview an edit\n\nUse before rewriting or restructuring a note.\n\n\\`\\`\\`json\n{\n \"mode\": \"note\",\n \"command\": \"preview_edit\",\n \"args\": {\n \"noteId\": \"note_id\",\n \"instruction\": \"Summarize this as action items\"\n }\n}\n\\`\\`\\`\n\n### Update a note\n\nUse only when the user clearly wants the canonical note changed. Prefer \\`append\\` or \\`preview_edit\\` otherwise.\n\n\\`\\`\\`json\n{\n \"mode\": \"note\",\n \"command\": \"update\",\n \"args\": {\n \"noteId\": \"note_id\",\n \"status\": \"processed\",\n \"tags\": [\"product\", \"validated\"]\n }\n}\n\\`\\`\\`\n\n## Work Items\n\nWork items are project-scoped tasks. If \\`projectId\\` is omitted, the tool may inherit the current session's project binding.\n\n### Create a work item\n\n\\`\\`\\`json\n{\n \"mode\": \"work_item\",\n \"command\": \"create\",\n \"args\": {\n \"projectId\": \"project_id\",\n \"title\": \"Validate technical feasibility\",\n \"description\": \"Check API, storage, UI, and safety implications.\",\n \"priority\": \"high\",\n \"status\": \"todo\"\n }\n}\n\\`\\`\\`\n\n### Update a work item\n\n\\`\\`\\`json\n{\n \"mode\": \"work_item\",\n \"command\": \"update\",\n \"args\": {\n \"workItemId\": \"work_item_id\",\n \"status\": \"in_progress\",\n \"nextAction\": \"Prototype the xopc_use tool path.\"\n }\n}\n\\`\\`\\`\n\n## Safety\n\n- \\`note.update\\` can replace canonical user content. Use \\`preview_edit\\` first for content rewrites.\n- \\`project.update.workspaceRoot\\` changes project-file scope. Use \\`dryRun\\` and ask the user if intent is unclear.\n- \\`work_item.update.archivedAt\\` hides work from normal active views. Confirm before archiving.\n- If the user asks for deletion, explain that deletion is not exposed through \\`xopc_use\\` yet.\n`;\n"],"mappings":";AAAA,MAAa,gBAAgB"}
@@ -0,0 +1,24 @@
1
+ import type { AgentToolWithMetadata } from './metadata.js';
2
+ declare const DesktopPetCreateSchema: import("@sinclair/typebox/build/cjs/index.js").TObject<{
3
+ mode: import("@sinclair/typebox/build/cjs/index.js").TOptional<import("@sinclair/typebox/build/cjs/index.js").TUnion<[import("@sinclair/typebox/build/cjs/index.js").TLiteral<"create">, import("@sinclair/typebox/build/cjs/index.js").TLiteral<"update">]>>;
4
+ petId: import("@sinclair/typebox/build/cjs/index.js").TOptional<import("@sinclair/typebox/build/cjs/index.js").TString>;
5
+ prompt: import("@sinclair/typebox/build/cjs/index.js").TString;
6
+ name: import("@sinclair/typebox/build/cjs/index.js").TOptional<import("@sinclair/typebox/build/cjs/index.js").TString>;
7
+ description: import("@sinclair/typebox/build/cjs/index.js").TOptional<import("@sinclair/typebox/build/cjs/index.js").TString>;
8
+ overwrite: import("@sinclair/typebox/build/cjs/index.js").TOptional<import("@sinclair/typebox/build/cjs/index.js").TBoolean>;
9
+ }>;
10
+ export type DesktopPetCreateDetails = {
11
+ ok: true;
12
+ id: string;
13
+ name: string;
14
+ dir: string;
15
+ manifestPath: string;
16
+ thumbnailPath: string;
17
+ spritesheetPath: string;
18
+ mode: 'create' | 'update';
19
+ } | {
20
+ ok: false;
21
+ error: string;
22
+ };
23
+ export declare function createDesktopPetTool(): AgentToolWithMetadata<typeof DesktopPetCreateSchema, DesktopPetCreateDetails>;
24
+ export {};
@@ -0,0 +1,90 @@
1
+ import { createDesktopPetPackage } from "../../pets/factory.js";
2
+ import { Type } from "@sinclair/typebox";
3
+ //#region src/agent/tools/desktop-pet-tool.ts
4
+ const DesktopPetCreateSchema = Type.Object({
5
+ mode: Type.Optional(Type.Union([Type.Literal("create"), Type.Literal("update")], { description: "create installs a new pet package. update overwrites an existing custom pet package identified by petId." })),
6
+ petId: Type.Optional(Type.String({ description: "Existing custom pet id to update. Accepts either \"custom:<id>\" from Settings or the folder id under ~/.xopc/pets." })),
7
+ prompt: Type.String({ description: "Full description of the desired pet character, visual style, personality, colors, motifs, and requested changes." }),
8
+ name: Type.Optional(Type.String({ description: "Optional display name for the pet." })),
9
+ description: Type.Optional(Type.String({ description: "Optional short description shown in Settings." })),
10
+ overwrite: Type.Optional(Type.Boolean({ description: "When true, reuse the folder derived from the pet name. Default false creates a unique folder if one exists." }))
11
+ });
12
+ function createDesktopPetTool() {
13
+ return {
14
+ name: "create_desktop_pet",
15
+ label: "Create Pet",
16
+ description: "Create or update a custom animated desktop pet from a natural-language description. Packages are written under ~/.xopc/pets and can be selected in Settings > Pet. Use mode=update with petId when iterating on an existing custom pet.",
17
+ parameters: DesktopPetCreateSchema,
18
+ mutatesWorkspace: false,
19
+ mutationScope: "external",
20
+ supportsParallel: false,
21
+ idempotent: false,
22
+ requiresExclusiveWorkspaceLock: false,
23
+ finalGuardRelevant: false,
24
+ async execute(_toolCallId, params) {
25
+ const prompt = typeof params.prompt === "string" ? params.prompt.trim() : "";
26
+ if (!prompt) return {
27
+ content: [{
28
+ type: "text",
29
+ text: "prompt is required."
30
+ }],
31
+ details: {
32
+ ok: false,
33
+ error: "prompt is required"
34
+ }
35
+ };
36
+ const mode = params.mode === "update" ? "update" : "create";
37
+ const petId = typeof params.petId === "string" ? params.petId.trim() : "";
38
+ if (mode === "update" && !petId) return {
39
+ content: [{
40
+ type: "text",
41
+ text: "petId is required when mode is update."
42
+ }],
43
+ details: {
44
+ ok: false,
45
+ error: "petId is required when mode is update"
46
+ }
47
+ };
48
+ try {
49
+ const result = await createDesktopPetPackage({
50
+ ...mode === "update" ? { id: petId } : {},
51
+ prompt,
52
+ ...typeof params.name === "string" && params.name.trim() ? { name: params.name.trim() } : {},
53
+ ...typeof params.description === "string" && params.description.trim() ? { description: params.description.trim() } : {},
54
+ overwrite: mode === "update" ? true : params.overwrite === true
55
+ });
56
+ return {
57
+ content: [{
58
+ type: "text",
59
+ text: [
60
+ `${mode === "update" ? "Updated" : "Created"} desktop pet "${result.name}".`,
61
+ `Installed at: ${result.dir}`,
62
+ "Open Settings > Pet, refresh if needed, and select the new custom pet."
63
+ ].join("\n")
64
+ }],
65
+ details: {
66
+ ok: true,
67
+ mode,
68
+ ...result
69
+ }
70
+ };
71
+ } catch (e) {
72
+ const error = e instanceof Error ? e.message : String(e);
73
+ return {
74
+ content: [{
75
+ type: "text",
76
+ text: `Failed to create desktop pet: ${error}`
77
+ }],
78
+ details: {
79
+ ok: false,
80
+ error
81
+ }
82
+ };
83
+ }
84
+ }
85
+ };
86
+ }
87
+ //#endregion
88
+ export { createDesktopPetTool };
89
+
90
+ //# sourceMappingURL=desktop-pet-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"desktop-pet-tool.js","names":[],"sources":["../../../../src/agent/tools/desktop-pet-tool.ts"],"sourcesContent":["import { Type } from '@sinclair/typebox';\nimport type { AgentToolResult } from '@earendil-works/pi-agent-core';\n\nimport { createDesktopPetPackage } from '../../pets/factory.js';\nimport type { AgentToolWithMetadata } from './metadata.js';\n\nconst DesktopPetCreateSchema = Type.Object({\n mode: Type.Optional(\n Type.Union([Type.Literal('create'), Type.Literal('update')], {\n description:\n 'create installs a new pet package. update overwrites an existing custom pet package identified by petId.',\n }),\n ),\n petId: Type.Optional(\n Type.String({\n description:\n 'Existing custom pet id to update. Accepts either \"custom:<id>\" from Settings or the folder id under ~/.xopc/pets.',\n }),\n ),\n prompt: Type.String({\n description:\n 'Full description of the desired pet character, visual style, personality, colors, motifs, and requested changes.',\n }),\n name: Type.Optional(Type.String({ description: 'Optional display name for the pet.' })),\n description: Type.Optional(Type.String({ description: 'Optional short description shown in Settings.' })),\n overwrite: Type.Optional(\n Type.Boolean({\n description:\n 'When true, reuse the folder derived from the pet name. Default false creates a unique folder if one exists.',\n }),\n ),\n});\n\nexport type DesktopPetCreateDetails =\n | {\n ok: true;\n id: string;\n name: string;\n dir: string;\n manifestPath: string;\n thumbnailPath: string;\n spritesheetPath: string;\n mode: 'create' | 'update';\n }\n | {\n ok: false;\n error: string;\n };\n\nexport function createDesktopPetTool(): AgentToolWithMetadata<typeof DesktopPetCreateSchema, DesktopPetCreateDetails> {\n return {\n name: 'create_desktop_pet',\n label: 'Create Pet',\n description:\n 'Create or update a custom animated desktop pet from a natural-language description. Packages are written under ~/.xopc/pets and can be selected in Settings > Pet. Use mode=update with petId when iterating on an existing custom pet.',\n parameters: DesktopPetCreateSchema,\n mutatesWorkspace: false,\n mutationScope: 'external',\n supportsParallel: false,\n idempotent: false,\n requiresExclusiveWorkspaceLock: false,\n finalGuardRelevant: false,\n async execute(\n _toolCallId: string,\n params: Record<string, unknown>,\n ): Promise<AgentToolResult<DesktopPetCreateDetails>> {\n const prompt = typeof params.prompt === 'string' ? params.prompt.trim() : '';\n if (!prompt) {\n return {\n content: [{ type: 'text', text: 'prompt is required.' }],\n details: { ok: false, error: 'prompt is required' },\n };\n }\n const mode = params.mode === 'update' ? 'update' : 'create';\n const petId = typeof params.petId === 'string' ? params.petId.trim() : '';\n if (mode === 'update' && !petId) {\n return {\n content: [{ type: 'text', text: 'petId is required when mode is update.' }],\n details: { ok: false, error: 'petId is required when mode is update' },\n };\n }\n\n try {\n const result = await createDesktopPetPackage({\n ...(mode === 'update' ? { id: petId } : {}),\n prompt,\n ...(typeof params.name === 'string' && params.name.trim() ? { name: params.name.trim() } : {}),\n ...(typeof params.description === 'string' && params.description.trim()\n ? { description: params.description.trim() }\n : {}),\n overwrite: mode === 'update' ? true : params.overwrite === true,\n });\n return {\n content: [\n {\n type: 'text',\n text: [\n `${mode === 'update' ? 'Updated' : 'Created'} desktop pet \"${result.name}\".`,\n `Installed at: ${result.dir}`,\n 'Open Settings > Pet, refresh if needed, and select the new custom pet.',\n ].join('\\n'),\n },\n ],\n details: { ok: true, mode, ...result },\n };\n } catch (e) {\n const error = e instanceof Error ? e.message : String(e);\n return {\n content: [{ type: 'text', text: `Failed to create desktop pet: ${error}` }],\n details: { ok: false, error },\n };\n }\n },\n };\n}\n"],"mappings":";;;AAMA,MAAM,yBAAyB,KAAK,OAAO;CACzC,MAAM,KAAK,SACT,KAAK,MAAM,CAAC,KAAK,QAAQ,SAAS,EAAE,KAAK,QAAQ,SAAS,CAAC,EAAE,EAC3D,aACE,4GACH,CAAC,CACH;CACD,OAAO,KAAK,SACV,KAAK,OAAO,EACV,aACE,uHACH,CAAC,CACH;CACD,QAAQ,KAAK,OAAO,EAClB,aACE,oHACH,CAAC;CACF,MAAM,KAAK,SAAS,KAAK,OAAO,EAAE,aAAa,sCAAsC,CAAC,CAAC;CACvF,aAAa,KAAK,SAAS,KAAK,OAAO,EAAE,aAAa,iDAAiD,CAAC,CAAC;CACzG,WAAW,KAAK,SACd,KAAK,QAAQ,EACX,aACE,+GACH,CAAC,CACH;CACF,CAAC;AAkBF,SAAgB,uBAAsG;AACpH,QAAO;EACL,MAAM;EACN,OAAO;EACP,aACE;EACF,YAAY;EACZ,kBAAkB;EAClB,eAAe;EACf,kBAAkB;EAClB,YAAY;EACZ,gCAAgC;EAChC,oBAAoB;EACpB,MAAM,QACJ,aACA,QACmD;GACnD,MAAM,SAAS,OAAO,OAAO,WAAW,WAAW,OAAO,OAAO,MAAM,GAAG;AAC1E,OAAI,CAAC,OACH,QAAO;IACL,SAAS,CAAC;KAAE,MAAM;KAAQ,MAAM;KAAuB,CAAC;IACxD,SAAS;KAAE,IAAI;KAAO,OAAO;KAAsB;IACpD;GAEH,MAAM,OAAO,OAAO,SAAS,WAAW,WAAW;GACnD,MAAM,QAAQ,OAAO,OAAO,UAAU,WAAW,OAAO,MAAM,MAAM,GAAG;AACvE,OAAI,SAAS,YAAY,CAAC,MACxB,QAAO;IACL,SAAS,CAAC;KAAE,MAAM;KAAQ,MAAM;KAA0C,CAAC;IAC3E,SAAS;KAAE,IAAI;KAAO,OAAO;KAAyC;IACvE;AAGH,OAAI;IACF,MAAM,SAAS,MAAM,wBAAwB;KAC3C,GAAI,SAAS,WAAW,EAAE,IAAI,OAAO,GAAG,EAAE;KAC1C;KACA,GAAI,OAAO,OAAO,SAAS,YAAY,OAAO,KAAK,MAAM,GAAG,EAAE,MAAM,OAAO,KAAK,MAAM,EAAE,GAAG,EAAE;KAC7F,GAAI,OAAO,OAAO,gBAAgB,YAAY,OAAO,YAAY,MAAM,GACnE,EAAE,aAAa,OAAO,YAAY,MAAM,EAAE,GAC1C,EAAE;KACN,WAAW,SAAS,WAAW,OAAO,OAAO,cAAc;KAC5D,CAAC;AACF,WAAO;KACL,SAAS,CACP;MACE,MAAM;MACN,MAAM;OACJ,GAAG,SAAS,WAAW,YAAY,UAAU,gBAAgB,OAAO,KAAK;OACzE,iBAAiB,OAAO;OACxB;OACD,CAAC,KAAK,KAAK;MACb,CACF;KACD,SAAS;MAAE,IAAI;MAAM;MAAM,GAAG;MAAQ;KACvC;YACM,GAAG;IACV,MAAM,QAAQ,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;AACxD,WAAO;KACL,SAAS,CAAC;MAAE,MAAM;MAAQ,MAAM,iCAAiC;MAAS,CAAC;KAC3E,SAAS;MAAE,IAAI;MAAO;MAAO;KAC9B;;;EAGN"}
@@ -14,6 +14,9 @@ import type { MemoryManager } from '../memory/manager.js';
14
14
  import type { SessionStore } from '../../session/store.js';
15
15
  import type { GatewayClarifyRequestFn } from './clarify-tool.js';
16
16
  import type { AutomationService } from '../../automations/index.js';
17
+ import type { NotesService } from '../../notes/index.js';
18
+ import type { ProjectService } from '../../projects/index.js';
19
+ import type { WorkItemService } from '../../work-items/index.js';
17
20
  import type { WorkflowRunServiceLike } from '../../workflows/service/workflow-run-service.types.js';
18
21
  import type { SkillManager } from '../skills/skill-manager.js';
19
22
  import { type ToolExecutorConfig } from './executor.js';
@@ -42,6 +45,10 @@ export interface ToolFactoryDeps {
42
45
  };
43
46
  /** Gateway: enables the `automation` tool. */
44
47
  getAutomationService?: () => AutomationService | undefined;
48
+ /** Gateway: enables the `xopc_use` product-object tool. */
49
+ getNotesService?: () => NotesService | undefined;
50
+ getProjectService?: () => ProjectService | undefined;
51
+ getWorkItemService?: () => WorkItemService | undefined;
45
52
  /** Gateway: starts persisted workflow runs (dedicated chat session per run). */
46
53
  getWorkflowRunService?: () => WorkflowRunServiceLike | undefined;
47
54
  /** Current session skill indexing (tool gating + allowlist); used by skills_list / skill_view. */
@@ -92,5 +99,7 @@ export declare class AgentToolsFactory {
92
99
  /** Drop the tab for a session when its agent instance is removed. */
93
100
  closeBrowserPageForSession(sessionKey: string): Promise<void>;
94
101
  createCoreTools(options?: CreateCoreToolsOptions): AgentTool<any, any>[];
102
+ createCapabilityTools(capabilityNames: readonly string[], options?: Pick<CreateCoreToolsOptions, 'disabledTools'>): AgentTool<any, any>[];
103
+ getLazyCapabilityToolNames(): string[];
95
104
  createAllTools(coreOptions?: CreateCoreToolsOptions): AgentTool<any, any>[];
96
105
  }
@@ -33,9 +33,11 @@ import { createWorkflowTool } from "./workflow-tool.js";
33
33
  import "./execute-code-tool.js";
34
34
  import { createAutomationTool } from "./automation-tool.js";
35
35
  import { createGoalTool } from "./goal-tool.js";
36
+ import { createXopcUseTool } from "./xopc-use-tool.js";
36
37
  import { createSkillViewTool, createSkillsListTool } from "./skills-tools.js";
37
38
  import { createSkillManageTool } from "./skill-manage-tool.js";
38
39
  import { createToolManualTool } from "./tool-manual-tool.js";
40
+ import { createDesktopPetTool } from "./desktop-pet-tool.js";
39
41
  import { createImageTool } from "./image-tool.js";
40
42
  import { createImageGenerateTool } from "./image-generate-tool.js";
41
43
  import "./index.js";
@@ -46,6 +48,8 @@ import { wrapToolsWithProtection } from "./executor.js";
46
48
  import { mergeTtsConfigFromAppConfig } from "../../voice/tts/merge-config.js";
47
49
  import { createTextToSpeechTool } from "./tts-tool.js";
48
50
  import { createGoalEvidenceRecorder } from "./goal-evidence-recorder.js";
51
+ import { getAgentCapabilityToolNames } from "../capabilities/registry.js";
52
+ import "../capabilities/index.js";
49
53
  //#region src/agent/tools/factory.ts
50
54
  init_logger();
51
55
  const log = createLogger("AgentToolsFactory");
@@ -254,6 +258,14 @@ var AgentToolsFactory = class {
254
258
  getCurrentSessionKey: () => this.deps.getCurrentContext()?.sessionKey
255
259
  })] : [],
256
260
  ...this.deps.getAutomationService ? [createAutomationTool({ getAutomationService: this.deps.getAutomationService })] : [],
261
+ ...this.deps.getProjectService || this.deps.getNotesService || this.deps.getWorkItemService ? [createXopcUseTool({
262
+ getConfig: () => this.deps.getConfig?.(),
263
+ getCurrentAgentId: () => options.agentId,
264
+ getCurrentSessionKey: () => this.deps.getCurrentContext()?.sessionKey,
265
+ getNotesService: this.deps.getNotesService,
266
+ getProjectService: this.deps.getProjectService,
267
+ getWorkItemService: this.deps.getWorkItemService
268
+ })] : [],
257
269
  createGoalTool({ getCurrentSessionKey: () => this.deps.getCurrentContext()?.sessionKey }),
258
270
  ...browserEnabled ? [createBrowserUseTool({
259
271
  getManager: () => this.ensureBrowserManager(),
@@ -276,6 +288,20 @@ var AgentToolsFactory = class {
276
288
  ...optionalTools
277
289
  ], disabled);
278
290
  }
291
+ createCapabilityTools(capabilityNames, options) {
292
+ const disabled = options?.disabledTools;
293
+ const raw = [];
294
+ const toolNames = /* @__PURE__ */ new Set();
295
+ for (const toolName of getAgentCapabilityToolNames(capabilityNames)) {
296
+ if (disabled?.has(toolName) || toolNames.has(toolName)) continue;
297
+ toolNames.add(toolName);
298
+ if (toolName === "create_desktop_pet") raw.push(createDesktopPetTool());
299
+ }
300
+ return wrapToolsWithProtection(raw, this.deps.toolExecutorConfig);
301
+ }
302
+ getLazyCapabilityToolNames() {
303
+ return ["create_desktop_pet"];
304
+ }
279
305
  createAllTools(coreOptions) {
280
306
  const coreTools = this.createCoreTools(coreOptions);
281
307
  const disableExtensions = coreOptions?.disabledTools?.has("extensions");