@xopcai/xopc 0.0.141 → 0.0.143

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 (605) hide show
  1. package/README.md +1 -1
  2. package/dist/browser-ext/manifest.json +1 -1
  3. package/dist/extensions/telegram/xopc.extension.json +1 -1
  4. package/dist/gateway/static/root/assets/activity-center-store-jITiX2vJ.js +1 -0
  5. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BRTCpm3t.js → agent-avatar-dicebear-DiME9u_P.js} +1 -1
  6. package/dist/gateway/static/root/assets/agents-DzBXhZXO.js +2 -0
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-DaMMZBAT.js → app-management-settings-panel-Cuo7SbUP.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-BXHThPyM.js → appearance-settings-DUfdNQqk.js} +1 -1
  9. package/dist/gateway/static/root/assets/apps-page-CKuKK5AU.js +1 -0
  10. package/dist/gateway/static/root/assets/{archive-plugin-izB-4N4L.js → archive-plugin-B-Qk6cGr.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-CJihXa5y.js → attachment-load-Di6EEbQX.js} +1 -1
  12. package/dist/gateway/static/root/assets/automation-suggestion-card-DGxvRxtO.js +1 -0
  13. package/dist/gateway/static/root/assets/automations-page-D-FF_WKV.js +4 -0
  14. package/dist/gateway/static/root/assets/{binary-plugins-D3VUeG8s.js → binary-plugins-ZaOZDH2I.js} +1 -1
  15. package/dist/gateway/static/root/assets/{block-editor-KnA0sLI3.js → block-editor-BTFhjWfg.js} +36 -36
  16. package/dist/gateway/static/root/assets/browser-settings-page-BvKLdEQt.js +8 -0
  17. package/dist/gateway/static/root/assets/{capability-presets-api-D8rRNhc6.js → capability-presets-api-BU-pVZiZ.js} +1 -1
  18. package/dist/gateway/static/root/assets/capability-presets-settings-panel-DgyeEwzh.js +2 -0
  19. package/dist/gateway/static/root/assets/{channel-recipient-api-BWgqwC5h.js → channel-recipient-api-DuulnhIj.js} +1 -1
  20. package/dist/gateway/static/root/assets/channels-settings-BbVsdD_I.js +1 -0
  21. package/dist/gateway/static/root/assets/channels-status-swr-B5lVrUsN.js +1 -0
  22. package/dist/gateway/static/root/assets/check-BODqo66o.js +1 -0
  23. package/dist/gateway/static/root/assets/chunk-QUQL4437-DXsxWP7r.js +4 -0
  24. package/dist/gateway/static/root/assets/circle-alert-RzVebuX2.js +1 -0
  25. package/dist/gateway/static/root/assets/connectors-page-B8QqVy3I.js +2 -0
  26. package/dist/gateway/static/root/assets/{desktop-pet-CzdqX001.js → desktop-pet---yzVxVR.js} +1 -1
  27. package/dist/gateway/static/root/assets/desktop-pet-settings-Dc3gqBJE.js +1 -0
  28. package/dist/gateway/static/root/assets/{directory-picker-path-field-PzlO5tSM.js → directory-picker-path-field-DCmOGLtK.js} +1 -1
  29. package/dist/gateway/static/root/assets/dreaming-settings-BgT5KZVe.js +3 -0
  30. package/dist/gateway/static/root/assets/{extension-debug-page-DcW8Ie3r.js → extension-debug-page-ByaKTTq4.js} +1 -1
  31. package/dist/gateway/static/root/assets/extension-page-BmRzHAZr.js +1 -0
  32. package/dist/gateway/static/root/assets/extension-settings-page-JUtwIhbF.js +1 -0
  33. package/dist/gateway/static/root/assets/{fetch-06q5eCMA.js → fetch-8QNN25Sh.js} +1 -1
  34. package/dist/gateway/static/root/assets/{gateway-config-api-4VXUJtLz.js → gateway-config-api-CxicF50_.js} +1 -1
  35. package/dist/gateway/static/root/assets/gateway-settings-Bz2I_EO5.js +1 -0
  36. package/dist/gateway/static/root/assets/{gateway-startup-retry-2f7_vsv7.js → gateway-startup-retry-5YBnS9Fj.js} +1 -1
  37. package/dist/gateway/static/root/assets/goal-create-dialog-VcoyuZGN.js +1 -0
  38. package/dist/gateway/static/root/assets/goal-detail-page-Cilkap2G.js +4 -0
  39. package/dist/gateway/static/root/assets/{goals-config-api-BpuQTufF.js → goals-config-api-CwcHRdC0.js} +1 -1
  40. package/dist/gateway/static/root/assets/goals-page-C6eoni4z.js +2 -0
  41. package/dist/gateway/static/root/assets/goals-settings-o4i-qAOS.js +1 -0
  42. package/dist/gateway/static/root/assets/heartbeat-settings-DQQkETX8.js +1 -0
  43. package/dist/gateway/static/root/assets/index-BKRqeRHm.js +257 -0
  44. package/dist/gateway/static/root/assets/index-CphxClbs.css +1 -0
  45. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-LT6qB-ua.js +1 -0
  46. package/dist/gateway/static/root/assets/logs-page-Dli2e3fS.js +7 -0
  47. package/dist/gateway/static/root/assets/{markdown-split-zS4KLNAf.js → markdown-split-Dw-yE2-y.js} +1 -1
  48. package/dist/gateway/static/root/assets/{media-plugins-_BgNJ9_7.js → media-plugins-D9NNNUgE.js} +1 -1
  49. package/dist/gateway/static/root/assets/messages-CzKxM6I4.js +5 -0
  50. package/dist/gateway/static/root/assets/models-hub-panel-DVn2Q1Ik.js +2 -0
  51. package/dist/gateway/static/root/assets/notes-page-CRgbJGgk.js +1 -0
  52. package/dist/gateway/static/root/assets/notes-workbench-BxZRHLWx.js +2 -0
  53. package/dist/gateway/static/root/assets/{page-tabs-B7sGQkgU.js → page-tabs-D4hkWVt_.js} +1 -1
  54. package/dist/gateway/static/root/assets/{preview-open-alternatives-D1ri4s_O.js → preview-open-alternatives-CIckv0uy.js} +1 -1
  55. package/dist/gateway/static/root/assets/project-detail-page-Doz53xLn.js +1 -0
  56. package/dist/gateway/static/root/assets/projects-page-DoMtcRLg.js +1 -0
  57. package/dist/gateway/static/root/assets/remote-access-hub-BeHVEgrm.js +1 -0
  58. package/dist/gateway/static/root/assets/{save-bar-controls-BClrOinh.js → save-bar-controls-B0b42kB2.js} +1 -1
  59. package/dist/gateway/static/root/assets/{schedule-field-CL7YTwLV.js → schedule-field-BtjEkczK.js} +1 -1
  60. package/dist/gateway/static/root/assets/{schema-form-ww4PiIje.js → schema-form-Bf0bk3i6.js} +1 -1
  61. package/dist/gateway/static/root/assets/sessions-page-Bk4bQsBe.js +1 -0
  62. package/dist/gateway/static/root/assets/settings-advanced-gate-DdFyaRMm.js +1 -0
  63. package/dist/gateway/static/root/assets/{settings-collapsible-section-D9gEEVm2.js → settings-collapsible-section-BTKTdTNX.js} +1 -1
  64. package/dist/gateway/static/root/assets/{settings-form-section-DGeEoBkb.js → settings-form-section-DL4P0sAj.js} +1 -1
  65. package/dist/gateway/static/root/assets/{settings-loading-skeleton-BXUeMR37.js → settings-loading-skeleton-BV6KFNj4.js} +1 -1
  66. package/dist/gateway/static/root/assets/settings-page-B_4DsX5W.js +1 -0
  67. package/dist/gateway/static/root/assets/{settings-page-layout-CEepfbCa.js → settings-page-layout-CyGlrInB.js} +1 -1
  68. package/dist/gateway/static/root/assets/setup-status-panel-DJ1_MLgX.js +1 -0
  69. package/dist/gateway/static/root/assets/share-preview-page-BQBV7YrV.js +2 -0
  70. package/dist/gateway/static/root/assets/shares-settings-0VuFLBeU.js +1 -0
  71. package/dist/gateway/static/root/assets/skill-reload-api-DO87Ckeo.js +1 -0
  72. package/dist/gateway/static/root/assets/skills-page-D3VdtxAn.js +2 -0
  73. package/dist/gateway/static/root/assets/{system-settings-panel-W6MBJXrr.js → system-settings-panel-D85fBBuI.js} +1 -1
  74. package/dist/gateway/static/root/assets/{typed-models-lib-BkODXN7T.js → typed-models-lib-CwEuYrHX.js} +1 -1
  75. package/dist/gateway/static/root/assets/{use-channel-catalog-CTbwLZXc.js → use-channel-catalog-COXIfXcl.js} +1 -1
  76. package/dist/gateway/static/root/assets/user-context-page-m9JVQ73F.js +1 -0
  77. package/dist/gateway/static/root/assets/user-profile-fields-editor-DtQiuY7E.js +1 -0
  78. package/dist/gateway/static/root/assets/user-profile-settings-panel-CWM0fEpb.js +1 -0
  79. package/dist/gateway/static/root/assets/{utils-ZxrKHxyb.js → utils--BO6xT3u.js} +1 -1
  80. package/dist/gateway/static/root/assets/voice-api-key-field-LoT3wgZ9.js +1 -0
  81. package/dist/gateway/static/root/assets/with-selector-aYPsXwdl.js +1 -0
  82. package/dist/gateway/static/root/assets/work-item-detail-page-DSTMz_mO.js +1 -0
  83. package/dist/gateway/static/root/assets/workflow-run-setup-panel-B35lJzvm.js +3 -0
  84. package/dist/gateway/static/root/assets/workflows-page-BfSm9oR8.js +11 -0
  85. package/dist/gateway/static/root/assets/workflows-page-DLioOiRN.css +1 -0
  86. package/dist/gateway/static/root/connector-icons/README.md +11 -0
  87. package/dist/gateway/static/root/connector-icons/airtable.svg +13 -0
  88. package/dist/gateway/static/root/connector-icons/asana.svg +15 -0
  89. package/dist/gateway/static/root/connector-icons/brave-search.svg +1 -0
  90. package/dist/gateway/static/root/connector-icons/clickup.svg +19 -0
  91. package/dist/gateway/static/root/connector-icons/composio.svg +266 -0
  92. package/dist/gateway/static/root/connector-icons/discord.svg +15 -0
  93. package/dist/gateway/static/root/connector-icons/dropbox.svg +152 -0
  94. package/dist/gateway/static/root/connector-icons/excel.svg +56 -0
  95. package/dist/gateway/static/root/connector-icons/fetch.svg +6 -0
  96. package/dist/gateway/static/root/connector-icons/figma.svg +178 -0
  97. package/dist/gateway/static/root/connector-icons/filesystem.svg +6 -0
  98. package/dist/gateway/static/root/connector-icons/github.svg +10 -0
  99. package/dist/gateway/static/root/connector-icons/gmail.svg +3 -0
  100. package/dist/gateway/static/root/connector-icons/google-calendar.svg +3 -0
  101. package/dist/gateway/static/root/connector-icons/google-docs.svg +25 -0
  102. package/dist/gateway/static/root/connector-icons/google-drive.svg +25 -0
  103. package/dist/gateway/static/root/connector-icons/google-sheets.svg +1 -0
  104. package/dist/gateway/static/root/connector-icons/hubspot.svg +142 -0
  105. package/dist/gateway/static/root/connector-icons/jira.svg +15 -0
  106. package/dist/gateway/static/root/connector-icons/linear.svg +5 -0
  107. package/dist/gateway/static/root/connector-icons/memory.svg +5 -0
  108. package/dist/gateway/static/root/connector-icons/microsoft-teams.svg +33 -0
  109. package/dist/gateway/static/root/connector-icons/notion.svg +5 -0
  110. package/dist/gateway/static/root/connector-icons/one-drive.svg +13 -0
  111. package/dist/gateway/static/root/connector-icons/outlook.svg +76 -0
  112. package/dist/gateway/static/root/connector-icons/playwright.svg +9 -0
  113. package/dist/gateway/static/root/connector-icons/salesforce.svg +17 -0
  114. package/dist/gateway/static/root/connector-icons/sequential-thinking.svg +8 -0
  115. package/dist/gateway/static/root/connector-icons/shopify.svg +5 -0
  116. package/dist/gateway/static/root/connector-icons/slack.svg +9 -0
  117. package/dist/gateway/static/root/connector-icons/spotify.svg +43 -0
  118. package/dist/gateway/static/root/connector-icons/stripe.svg +11 -0
  119. package/dist/gateway/static/root/connector-icons/telegram.svg +130 -0
  120. package/dist/gateway/static/root/connector-icons/time.svg +6 -0
  121. package/dist/gateway/static/root/connector-icons/todoist.svg +277 -0
  122. package/dist/gateway/static/root/connector-icons/trello.svg +19 -0
  123. package/dist/gateway/static/root/connector-icons/twitter.svg +128 -0
  124. package/dist/gateway/static/root/connector-icons/whatsapp.svg +61 -0
  125. package/dist/gateway/static/root/connector-icons/youtube.svg +11 -0
  126. package/dist/gateway/static/root/index.html +9 -6
  127. package/dist/package.js +1 -1
  128. package/dist/src/agent/agent-manager.d.ts +2 -0
  129. package/dist/src/agent/agent-manager.js +8 -0
  130. package/dist/src/agent/agent-manager.js.map +1 -1
  131. package/dist/src/agent/background-review/prompts.d.ts +1 -1
  132. package/dist/src/agent/background-review/prompts.js +3 -2
  133. package/dist/src/agent/background-review/prompts.js.map +1 -1
  134. package/dist/src/agent/embedded/session-runner.js +5 -5
  135. package/dist/src/agent/embedded/session-runner.js.map +1 -1
  136. package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
  137. package/dist/src/agent/embedded/xopc-auth-storage.d.ts +4 -3
  138. package/dist/src/agent/embedded/xopc-auth-storage.js +6 -6
  139. package/dist/src/agent/embedded/xopc-auth-storage.js.map +1 -1
  140. package/dist/src/agent/embedded/xopc-stream-bridge.js +1 -0
  141. package/dist/src/agent/embedded/xopc-stream-bridge.js.map +1 -1
  142. package/dist/src/agent/embedded/xopc-tools-bridge.d.ts +9 -0
  143. package/dist/src/agent/embedded/xopc-tools-bridge.js +71 -3
  144. package/dist/src/agent/embedded/xopc-tools-bridge.js.map +1 -1
  145. package/dist/src/agent/goals/checklist-judge.js +3 -3
  146. package/dist/src/agent/goals/checklist-judge.js.map +1 -1
  147. package/dist/src/agent/goals/judge.js +2 -2
  148. package/dist/src/agent/goals/judge.js.map +1 -1
  149. package/dist/src/agent/goals/post-turn.js +5 -4
  150. package/dist/src/agent/goals/post-turn.js.map +1 -1
  151. package/dist/src/agent/image/understanding/pi-ai-provider.js +2 -2
  152. package/dist/src/agent/image/understanding/pi-ai-provider.js.map +1 -1
  153. package/dist/src/agent/mcp/mcp-transport.js +4 -1
  154. package/dist/src/agent/mcp/mcp-transport.js.map +1 -1
  155. package/dist/src/agent/memory/compaction.js +2 -2
  156. package/dist/src/agent/memory/compaction.js.map +1 -1
  157. package/dist/src/agent/memory/context/planner.d.ts +1 -0
  158. package/dist/src/agent/memory/context/planner.js +60 -14
  159. package/dist/src/agent/memory/context/planner.js.map +1 -1
  160. package/dist/src/agent/memory/context/types.d.ts +3 -1
  161. package/dist/src/agent/memory/lifecycle.d.ts +11 -0
  162. package/dist/src/agent/memory/lifecycle.js +50 -0
  163. package/dist/src/agent/memory/lifecycle.js.map +1 -0
  164. package/dist/src/agent/memory/source-origin.d.ts +3 -0
  165. package/dist/src/agent/memory/source-origin.js +19 -0
  166. package/dist/src/agent/memory/source-origin.js.map +1 -0
  167. package/dist/src/agent/memory/understanding/service.js +5 -0
  168. package/dist/src/agent/memory/understanding/service.js.map +1 -1
  169. package/dist/src/agent/memory/user-context-coordinator.js +7 -2
  170. package/dist/src/agent/memory/user-context-coordinator.js.map +1 -1
  171. package/dist/src/agent/prompt/sections/behavior.d.ts +2 -0
  172. package/dist/src/agent/prompt/sections/behavior.js +30 -1
  173. package/dist/src/agent/prompt/sections/behavior.js.map +1 -1
  174. package/dist/src/agent/prompt/sections/tooling.js +1 -1
  175. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  176. package/dist/src/agent/prompt/service-prompt-builder.js +8 -1
  177. package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
  178. package/dist/src/agent/prompt/system-prompt.d.ts +2 -0
  179. package/dist/src/agent/prompt/system-prompt.js +6 -3
  180. package/dist/src/agent/prompt/system-prompt.js.map +1 -1
  181. package/dist/src/agent/service/btw-query.d.ts +4 -0
  182. package/dist/src/agent/service/btw-query.js +94 -13
  183. package/dist/src/agent/service/btw-query.js.map +1 -1
  184. package/dist/src/agent/service/process-direct-streaming.js +22 -0
  185. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  186. package/dist/src/agent/service.d.ts +2 -0
  187. package/dist/src/agent/service.js +9 -3
  188. package/dist/src/agent/service.js.map +1 -1
  189. package/dist/src/agent/session/session-inspector.js +9 -1
  190. package/dist/src/agent/session/session-inspector.js.map +1 -1
  191. package/dist/src/agent/starter-agents.js +1 -1
  192. package/dist/src/agent/starter-agents.js.map +1 -1
  193. package/dist/src/agent/tool-manuals/xopc-use.d.ts +1 -1
  194. package/dist/src/agent/tool-manuals/xopc-use.js +1 -1
  195. package/dist/src/agent/tool-manuals/xopc-use.js.map +1 -1
  196. package/dist/src/agent/tools/composio-tool.d.ts +18 -5
  197. package/dist/src/agent/tools/composio-tool.js +252 -35
  198. package/dist/src/agent/tools/composio-tool.js.map +1 -1
  199. package/dist/src/agent/tools/factory.js +7 -3
  200. package/dist/src/agent/tools/factory.js.map +1 -1
  201. package/dist/src/agent/tools/index.d.ts +1 -1
  202. package/dist/src/agent/tools/index.js +2 -2
  203. package/dist/src/agent/tools/session-search-tool.js +2 -2
  204. package/dist/src/agent/tools/session-search-tool.js.map +1 -1
  205. package/dist/src/agent/tools/web-extract.js +2 -2
  206. package/dist/src/agent/tools/web-extract.js.map +1 -1
  207. package/dist/src/agent/tools/workflow-tool.d.ts +0 -1
  208. package/dist/src/agent/tools/workflow-tool.js +3 -16
  209. package/dist/src/agent/tools/workflow-tool.js.map +1 -1
  210. package/dist/src/agent/workflow/builtins/index.d.ts +2 -28
  211. package/dist/src/agent/workflow/builtins/index.js +226 -41
  212. package/dist/src/agent/workflow/builtins/index.js.map +1 -1
  213. package/dist/src/agent/workflow/catalog.d.ts +32 -34
  214. package/dist/src/agent/workflow/catalog.js +158 -154
  215. package/dist/src/agent/workflow/catalog.js.map +1 -1
  216. package/dist/src/agent/workflow/index.d.ts +4 -6
  217. package/dist/src/agent/workflow/index.js +2 -5
  218. package/dist/src/agent/workflow/snapshot.d.ts +2 -2
  219. package/dist/src/agent/workflow/snapshot.js +2 -2
  220. package/dist/src/agent/workflow/snapshot.js.map +1 -1
  221. package/dist/src/agent/workflow/structured-output-tool.d.ts +2 -2
  222. package/dist/src/agent/workflow/structured-output-tool.js +2 -2
  223. package/dist/src/agent/workflow/structured-output-tool.js.map +1 -1
  224. package/dist/src/agent/workflow/subagent-runner.js +1 -1
  225. package/dist/src/agent/workflow/types.d.ts +31 -26
  226. package/dist/src/agent-manifest/index.d.ts +1 -0
  227. package/dist/src/agent-manifest/index.js +3 -1
  228. package/dist/src/agent-manifest/index.js.map +1 -1
  229. package/dist/src/agent-manifest/preset-chain.d.ts +10 -0
  230. package/dist/src/agent-manifest/preset-chain.js +32 -0
  231. package/dist/src/agent-manifest/preset-chain.js.map +1 -0
  232. package/dist/src/agent-manifest/resolver.js +3 -10
  233. package/dist/src/agent-manifest/resolver.js.map +1 -1
  234. package/dist/src/agent-manifest/schema.d.ts +4 -4
  235. package/dist/src/ai-assist/text-assist.d.ts +2 -1
  236. package/dist/src/ai-assist/text-assist.js +10 -23
  237. package/dist/src/ai-assist/text-assist.js.map +1 -1
  238. package/dist/src/auth/credentials.js +5 -2
  239. package/dist/src/auth/credentials.js.map +1 -1
  240. package/dist/src/auth/oauth/github-copilot.d.ts +3 -4
  241. package/dist/src/auth/oauth/github-copilot.js +66 -2
  242. package/dist/src/auth/oauth/github-copilot.js.map +1 -0
  243. package/dist/src/auth/oauth/index.js +2 -2
  244. package/dist/src/automations/api/routes.js +13 -1
  245. package/dist/src/automations/api/routes.js.map +1 -1
  246. package/dist/src/automations/domain/validation.d.ts +14 -14
  247. package/dist/src/automations/draft/automation-draft-service.js +3 -3
  248. package/dist/src/automations/draft/automation-draft-service.js.map +1 -1
  249. package/dist/src/automations/draft/automation-draft-validator.d.ts +3 -3
  250. package/dist/src/browser/providers/browser-ext-install.d.ts +11 -1
  251. package/dist/src/browser/providers/browser-ext-install.js +39 -14
  252. package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
  253. package/dist/src/capabilities/store-connector.d.ts +0 -1
  254. package/dist/src/capabilities/store-connector.js +3 -5
  255. package/dist/src/capabilities/store-connector.js.map +1 -1
  256. package/dist/src/chat-commands/builtins/review.js +84 -68
  257. package/dist/src/chat-commands/builtins/review.js.map +1 -1
  258. package/dist/src/chat-commands/builtins/workflow.js +9 -54
  259. package/dist/src/chat-commands/builtins/workflow.js.map +1 -1
  260. package/dist/src/chat-commands/types.d.ts +4 -0
  261. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  262. package/dist/src/cli/commands/extension-create.js +2 -2
  263. package/dist/src/cli/commands/extension-create.js.map +1 -1
  264. package/dist/src/cli/commands/extension-marketplace.js +42 -36
  265. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  266. package/dist/src/cli/commands/extension-pack.d.ts +6 -0
  267. package/dist/src/cli/commands/extension-pack.js +3 -2
  268. package/dist/src/cli/commands/extension-pack.js.map +1 -1
  269. package/dist/src/commands/agents.config.d.ts +1 -0
  270. package/dist/src/commands/agents.config.js +1 -0
  271. package/dist/src/commands/agents.config.js.map +1 -1
  272. package/dist/src/config/schema.d.ts +6 -6
  273. package/dist/src/config/schema.js +6 -22
  274. package/dist/src/config/schema.js.map +1 -1
  275. package/dist/src/config/web-patch.d.ts +1 -1
  276. package/dist/src/connectors/approval.d.ts +2 -0
  277. package/dist/src/connectors/approval.js +33 -0
  278. package/dist/src/connectors/approval.js.map +1 -0
  279. package/dist/src/connectors/auth-provider-registry.d.ts +9 -0
  280. package/dist/src/connectors/auth-provider-registry.js +17 -0
  281. package/dist/src/connectors/auth-provider-registry.js.map +1 -0
  282. package/dist/src/connectors/builtin-catalog.js +55 -116
  283. package/dist/src/connectors/builtin-catalog.js.map +1 -1
  284. package/dist/src/connectors/catalog.js +7 -2
  285. package/dist/src/connectors/catalog.js.map +1 -1
  286. package/dist/src/connectors/composio-catalog.d.ts +19 -0
  287. package/dist/src/connectors/composio-catalog.js +237 -0
  288. package/dist/src/connectors/composio-catalog.js.map +1 -0
  289. package/dist/src/connectors/composio-logo.d.ts +1 -0
  290. package/dist/src/connectors/composio-logo.js +51 -0
  291. package/dist/src/connectors/composio-logo.js.map +1 -0
  292. package/dist/src/connectors/composio-sessions.d.ts +116 -0
  293. package/dist/src/connectors/composio-sessions.js +296 -0
  294. package/dist/src/connectors/composio-sessions.js.map +1 -0
  295. package/dist/src/connectors/composio-triggers.d.ts +17 -0
  296. package/dist/src/connectors/composio-triggers.js +48 -5
  297. package/dist/src/connectors/composio-triggers.js.map +1 -1
  298. package/dist/src/connectors/composio.d.ts +31 -2
  299. package/dist/src/connectors/composio.js +374 -151
  300. package/dist/src/connectors/composio.js.map +1 -1
  301. package/dist/src/connectors/connector-memory-sync.d.ts +15 -0
  302. package/dist/src/connectors/connector-memory-sync.js +90 -0
  303. package/dist/src/connectors/connector-memory-sync.js.map +1 -0
  304. package/dist/src/connectors/install.js +35 -92
  305. package/dist/src/connectors/install.js.map +1 -1
  306. package/dist/src/connectors/instances.js +6 -2
  307. package/dist/src/connectors/instances.js.map +1 -1
  308. package/dist/src/connectors/integration-strategy.d.ts +3 -0
  309. package/dist/src/connectors/integration-strategy.js +29 -0
  310. package/dist/src/connectors/integration-strategy.js.map +1 -0
  311. package/dist/src/connectors/policy.d.ts +13 -0
  312. package/dist/src/connectors/policy.js +48 -0
  313. package/dist/src/connectors/policy.js.map +1 -0
  314. package/dist/src/connectors/providers.js +1 -1
  315. package/dist/src/connectors/runtime-adapter-registry.d.ts +25 -0
  316. package/dist/src/connectors/runtime-adapter-registry.js +154 -0
  317. package/dist/src/connectors/runtime-adapter-registry.js.map +1 -0
  318. package/dist/src/connectors/types.d.ts +113 -4
  319. package/dist/src/connectors/workflow-preflight.d.ts +20 -0
  320. package/dist/src/connectors/workflow-preflight.js +70 -0
  321. package/dist/src/connectors/workflow-preflight.js.map +1 -0
  322. package/dist/src/extensions/install-transaction.d.ts +16 -0
  323. package/dist/src/extensions/install-transaction.js +76 -0
  324. package/dist/src/extensions/install-transaction.js.map +1 -0
  325. package/dist/src/extensions/install.d.ts +2 -0
  326. package/dist/src/extensions/install.js +23 -1
  327. package/dist/src/extensions/install.js.map +1 -1
  328. package/dist/src/gateway/agents-admin.d.ts +2 -0
  329. package/dist/src/gateway/agents-admin.js +7 -0
  330. package/dist/src/gateway/agents-admin.js.map +1 -1
  331. package/dist/src/gateway/capability-presets-admin.d.ts +11 -0
  332. package/dist/src/gateway/capability-presets-admin.js +11 -4
  333. package/dist/src/gateway/capability-presets-admin.js.map +1 -1
  334. package/dist/src/gateway/chat-stream/mapper.js +17 -0
  335. package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
  336. package/dist/src/gateway/chat-stream/protocol.d.ts +18 -1
  337. package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -3
  338. package/dist/src/gateway/hono/routes/agents.js +3 -0
  339. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  340. package/dist/src/gateway/hono/routes/capability-presets.js +19 -1
  341. package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -1
  342. package/dist/src/gateway/hono/routes/connectors.js +188 -25
  343. package/dist/src/gateway/hono/routes/connectors.js.map +1 -1
  344. package/dist/src/gateway/hono/routes/goals.js +22 -3
  345. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  346. package/dist/src/gateway/hono/routes/home.d.ts +60 -1
  347. package/dist/src/gateway/hono/routes/home.js +244 -18
  348. package/dist/src/gateway/hono/routes/home.js.map +1 -1
  349. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  350. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  351. package/dist/src/gateway/hono/routes/memory.js +14 -1
  352. package/dist/src/gateway/hono/routes/memory.js.map +1 -1
  353. package/dist/src/gateway/hono/routes/models.js +1 -0
  354. package/dist/src/gateway/hono/routes/models.js.map +1 -1
  355. package/dist/src/gateway/hono/routes/projects.js +103 -2
  356. package/dist/src/gateway/hono/routes/projects.js.map +1 -1
  357. package/dist/src/gateway/hono/routes/public-gateway.js +93 -0
  358. package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
  359. package/dist/src/gateway/hono/routes/voice.js +2 -2
  360. package/dist/src/gateway/hono/routes/voice.js.map +1 -1
  361. package/dist/src/gateway/hono/routes/workflows.js +137 -22
  362. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  363. package/dist/src/gateway/hono/routes/you.d.ts +23 -0
  364. package/dist/src/gateway/hono/routes/you.js +538 -0
  365. package/dist/src/gateway/hono/routes/you.js.map +1 -0
  366. package/dist/src/gateway/hono/sse.d.ts +2 -1
  367. package/dist/src/gateway/hono/sse.js +2 -1
  368. package/dist/src/gateway/hono/sse.js.map +1 -1
  369. package/dist/src/gateway/service/marketplace-service.d.ts +13 -1
  370. package/dist/src/gateway/service/marketplace-service.js +96 -40
  371. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  372. package/dist/src/gateway/service.d.ts +2 -0
  373. package/dist/src/gateway/service.js +7 -1
  374. package/dist/src/gateway/service.js.map +1 -1
  375. package/dist/src/goals/goal-contract-draft.js +2 -2
  376. package/dist/src/goals/goal-contract-draft.js.map +1 -1
  377. package/dist/src/goals/goal-evidence-review.js +2 -2
  378. package/dist/src/goals/goal-evidence-review.js.map +1 -1
  379. package/dist/src/goals/goal-service.d.ts +7 -5
  380. package/dist/src/goals/goal-service.js +25 -13
  381. package/dist/src/goals/goal-service.js.map +1 -1
  382. package/dist/src/goals/goal-store.js +46 -7
  383. package/dist/src/goals/goal-store.js.map +1 -1
  384. package/dist/src/goals/types.d.ts +24 -0
  385. package/dist/src/notes/service.js +2 -2
  386. package/dist/src/notes/service.js.map +1 -1
  387. package/dist/src/providers/constants.d.ts +2 -0
  388. package/dist/src/providers/constants.js +11 -0
  389. package/dist/src/providers/constants.js.map +1 -0
  390. package/dist/src/providers/extension-stream-bridge.js +1 -0
  391. package/dist/src/providers/extension-stream-bridge.js.map +1 -1
  392. package/dist/src/providers/index.d.ts +3 -3
  393. package/dist/src/providers/index.js +5 -4
  394. package/dist/src/providers/index.js.map +1 -1
  395. package/dist/src/providers/model-call.d.ts +17 -0
  396. package/dist/src/providers/model-call.js +60 -0
  397. package/dist/src/providers/model-call.js.map +1 -0
  398. package/dist/src/session/session-title.js +2 -2
  399. package/dist/src/session/session-title.js.map +1 -1
  400. package/dist/src/storage/sqlite/connector-repository.d.ts +49 -0
  401. package/dist/src/storage/sqlite/connector-repository.js +385 -0
  402. package/dist/src/storage/sqlite/connector-repository.js.map +1 -0
  403. package/dist/src/storage/sqlite/index.d.ts +3 -0
  404. package/dist/src/storage/sqlite/index.js +4 -1
  405. package/dist/src/storage/sqlite/migrations/030_connectors.sql +94 -0
  406. package/dist/src/storage/sqlite/migrations/031_connector_approvals.sql +24 -0
  407. package/dist/src/storage/sqlite/migrations/032_connector_webhook_deliveries.sql +15 -0
  408. package/dist/src/storage/sqlite/migrations/033_user_trust_policies.sql +6 -0
  409. package/dist/src/storage/sqlite/migrations/034_allow_global_auto_trust.sql +14 -0
  410. package/dist/src/storage/sqlite/migrations/035_user_profile_prompt_state.sql +7 -0
  411. package/dist/src/storage/sqlite/migrations/036_goal_outcome_metric.sql +12 -0
  412. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  413. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  414. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  415. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  416. package/dist/src/storage/sqlite/schema.js +1 -1
  417. package/dist/src/storage/sqlite/user-profile-setup-repository.d.ts +3 -0
  418. package/dist/src/storage/sqlite/user-profile-setup-repository.js +34 -0
  419. package/dist/src/storage/sqlite/user-profile-setup-repository.js.map +1 -0
  420. package/dist/src/storage/sqlite/user-trust-repository.d.ts +3 -0
  421. package/dist/src/storage/sqlite/user-trust-repository.js +34 -0
  422. package/dist/src/storage/sqlite/user-trust-repository.js.map +1 -0
  423. package/dist/src/tui/components/assistant-message.js +15 -0
  424. package/dist/src/tui/components/assistant-message.js.map +1 -1
  425. package/dist/src/tui/tui-agent-events.js +85 -1
  426. package/dist/src/tui/tui-agent-events.js.map +1 -1
  427. package/dist/src/tui/tui-command-formatters.js +7 -7
  428. package/dist/src/tui/tui-command-formatters.js.map +1 -1
  429. package/dist/src/tui/tui-commands.js +1 -1
  430. package/dist/src/tui/tui-startup-resources.js +1 -1
  431. package/dist/src/user-context/import.d.ts +12 -0
  432. package/dist/src/user-context/import.js +48 -0
  433. package/dist/src/user-context/import.js.map +1 -0
  434. package/dist/src/user-context/profile.d.ts +37 -0
  435. package/dist/src/user-context/profile.js +165 -0
  436. package/dist/src/user-context/profile.js.map +1 -0
  437. package/dist/src/user-context/projection.d.ts +54 -0
  438. package/dist/src/user-context/projection.js +121 -0
  439. package/dist/src/user-context/projection.js.map +1 -0
  440. package/dist/src/user-context/source-recommendations.d.ts +13 -0
  441. package/dist/src/user-context/source-recommendations.js +86 -0
  442. package/dist/src/user-context/source-recommendations.js.map +1 -0
  443. package/dist/src/user-context/trust-policy.d.ts +11 -0
  444. package/dist/src/user-context/trust-policy.js +31 -0
  445. package/dist/src/user-context/trust-policy.js.map +1 -0
  446. package/dist/src/voice/tts/summarize.js +2 -2
  447. package/dist/src/voice/tts/summarize.js.map +1 -1
  448. package/dist/src/workflows/authoring/index.d.ts +1 -0
  449. package/dist/src/workflows/authoring/index.js +2 -0
  450. package/dist/src/workflows/authoring/workflow-draft-store.d.ts +33 -0
  451. package/dist/src/workflows/authoring/workflow-draft-store.js +74 -0
  452. package/dist/src/workflows/authoring/workflow-draft-store.js.map +1 -0
  453. package/dist/src/workflows/domain/definition-utils.d.ts +6 -4
  454. package/dist/src/workflows/domain/definition-utils.js +28 -26
  455. package/dist/src/workflows/domain/definition-utils.js.map +1 -1
  456. package/dist/src/workflows/domain/definition.d.ts +79 -6
  457. package/dist/src/workflows/domain/event.d.ts +18 -2
  458. package/dist/src/workflows/domain/index.js +3 -3
  459. package/dist/src/workflows/domain/run.d.ts +16 -2
  460. package/dist/src/workflows/domain/run.js.map +1 -1
  461. package/dist/src/workflows/domain/validation.d.ts +9 -5
  462. package/dist/src/workflows/domain/validation.js +183 -40
  463. package/dist/src/workflows/domain/validation.js.map +1 -1
  464. package/dist/src/workflows/draft/workflow-draft-prompt.d.ts +2 -3
  465. package/dist/src/workflows/draft/workflow-draft-prompt.js +31 -73
  466. package/dist/src/workflows/draft/workflow-draft-prompt.js.map +1 -1
  467. package/dist/src/workflows/draft/workflow-draft-service.js +6 -10
  468. package/dist/src/workflows/draft/workflow-draft-service.js.map +1 -1
  469. package/dist/src/workflows/draft/workflow-draft-validator.js +29 -37
  470. package/dist/src/workflows/draft/workflow-draft-validator.js.map +1 -1
  471. package/dist/src/workflows/draft/workflow-draft.types.d.ts +4 -4
  472. package/dist/src/workflows/engine/projector.js +43 -1
  473. package/dist/src/workflows/engine/projector.js.map +1 -1
  474. package/dist/src/workflows/engine/workflow-engine.d.ts +2 -3
  475. package/dist/src/workflows/engine/workflow-engine.js +24 -4
  476. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  477. package/dist/src/workflows/index.js +4 -7
  478. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +1 -9
  479. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -1
  480. package/dist/src/workflows/runtime/graph-workflow-runtime.d.ts +10 -0
  481. package/dist/src/workflows/runtime/graph-workflow-runtime.js +295 -0
  482. package/dist/src/workflows/runtime/graph-workflow-runtime.js.map +1 -0
  483. package/dist/src/workflows/runtime/index.d.ts +1 -2
  484. package/dist/src/workflows/runtime/index.js +2 -5
  485. package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +5 -8
  486. package/dist/src/workflows/service/workflow-run-service.js +15 -1
  487. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  488. package/dist/src/workflows/service/workflow-run-service.types.d.ts +2 -1
  489. package/package.json +8 -7
  490. package/dist/gateway/static/root/assets/agents-Bd863Akz.js +0 -2
  491. package/dist/gateway/static/root/assets/apps-page-B4omjLxa.js +0 -1
  492. package/dist/gateway/static/root/assets/automation-suggestion-card-fgtj5Gek.js +0 -1
  493. package/dist/gateway/static/root/assets/automations-page-Dz2mgjIR.js +0 -4
  494. package/dist/gateway/static/root/assets/browser-settings-page-DZZz5v_i.js +0 -8
  495. package/dist/gateway/static/root/assets/capability-presets-settings-panel-sCHojZr4.js +0 -1
  496. package/dist/gateway/static/root/assets/channels-settings-UyVSnf9s.js +0 -1
  497. package/dist/gateway/static/root/assets/channels-status-swr-CB5FzcLf.js +0 -1
  498. package/dist/gateway/static/root/assets/connectors-page-BzhHiUO4.js +0 -2
  499. package/dist/gateway/static/root/assets/desktop-pet-settings-DqqUPC7G.js +0 -1
  500. package/dist/gateway/static/root/assets/dreaming-settings-BmL54kQq.js +0 -3
  501. package/dist/gateway/static/root/assets/extension-page-DT5cpace.js +0 -1
  502. package/dist/gateway/static/root/assets/extension-settings-page-CbMk4GhQ.js +0 -1
  503. package/dist/gateway/static/root/assets/gateway-settings-CdghmKHJ.js +0 -1
  504. package/dist/gateway/static/root/assets/goal-create-dialog-CAlsM9MP.js +0 -1
  505. package/dist/gateway/static/root/assets/goal-detail-page-CLPa4F2y.js +0 -4
  506. package/dist/gateway/static/root/assets/goals-page-B2VpdzfH.js +0 -2
  507. package/dist/gateway/static/root/assets/goals-settings-CW1NwxvV.js +0 -1
  508. package/dist/gateway/static/root/assets/heartbeat-settings-C86k5tff.js +0 -1
  509. package/dist/gateway/static/root/assets/index-B8s8Pq5U.css +0 -1
  510. package/dist/gateway/static/root/assets/index-ehajXmqL.js +0 -262
  511. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-8xwKEhui.js +0 -1
  512. package/dist/gateway/static/root/assets/logs-page-C_BMONOO.js +0 -7
  513. package/dist/gateway/static/root/assets/messages-B-8CqAeX.js +0 -3
  514. package/dist/gateway/static/root/assets/models-hub-panel-Do_cwNjF.js +0 -2
  515. package/dist/gateway/static/root/assets/notes-page-5IdlPHaX.js +0 -1
  516. package/dist/gateway/static/root/assets/notes-workbench-0KsRZJIZ.js +0 -2
  517. package/dist/gateway/static/root/assets/project-detail-page-Dk2zB1gy.js +0 -1
  518. package/dist/gateway/static/root/assets/projects-page-CJQntm2G.js +0 -1
  519. package/dist/gateway/static/root/assets/remote-access-hub-CHeZZg7O.js +0 -1
  520. package/dist/gateway/static/root/assets/sessions-page-9Hb_r0AG.js +0 -1
  521. package/dist/gateway/static/root/assets/settings-advanced-gate-PmzVFvAv.js +0 -1
  522. package/dist/gateway/static/root/assets/settings-page-C5G2klUB.js +0 -1
  523. package/dist/gateway/static/root/assets/setup-status-panel-oQ8OLnw3.js +0 -1
  524. package/dist/gateway/static/root/assets/share-preview-page-CXtDHMSi.js +0 -2
  525. package/dist/gateway/static/root/assets/shares-settings-BlNoairj.js +0 -1
  526. package/dist/gateway/static/root/assets/skill-reload-api-BYV5x1KO.js +0 -1
  527. package/dist/gateway/static/root/assets/skills-page-ClBcKQZP.js +0 -2
  528. package/dist/gateway/static/root/assets/toast-z0toXu32.js +0 -1
  529. package/dist/gateway/static/root/assets/user-profile-settings-panel-CeC308-E.js +0 -1
  530. package/dist/gateway/static/root/assets/voice-api-key-field-BE57S-nS.js +0 -1
  531. package/dist/gateway/static/root/assets/work-item-detail-page-Di1ww5Aa.js +0 -1
  532. package/dist/gateway/static/root/assets/workflow-run-setup-panel-CzK84i-B.js +0 -3
  533. package/dist/gateway/static/root/assets/workflow-start-dialog-CtLTtNUB.js +0 -1
  534. package/dist/gateway/static/root/assets/workflows-page-CZFZdua9.js +0 -18
  535. package/dist/src/agent/workflow/builtins/audit-repo.d.ts +0 -13
  536. package/dist/src/agent/workflow/builtins/audit-repo.js +0 -183
  537. package/dist/src/agent/workflow/builtins/audit-repo.js.map +0 -1
  538. package/dist/src/agent/workflow/builtins/client-proposal.d.ts +0 -12
  539. package/dist/src/agent/workflow/builtins/client-proposal.js +0 -164
  540. package/dist/src/agent/workflow/builtins/client-proposal.js.map +0 -1
  541. package/dist/src/agent/workflow/builtins/competitor-scan.d.ts +0 -12
  542. package/dist/src/agent/workflow/builtins/competitor-scan.js +0 -164
  543. package/dist/src/agent/workflow/builtins/competitor-scan.js.map +0 -1
  544. package/dist/src/agent/workflow/builtins/content-draft.d.ts +0 -13
  545. package/dist/src/agent/workflow/builtins/content-draft.js +0 -159
  546. package/dist/src/agent/workflow/builtins/content-draft.js.map +0 -1
  547. package/dist/src/agent/workflow/builtins/content-repurpose.d.ts +0 -11
  548. package/dist/src/agent/workflow/builtins/content-repurpose.js +0 -146
  549. package/dist/src/agent/workflow/builtins/content-repurpose.js.map +0 -1
  550. package/dist/src/agent/workflow/builtins/debug-incident.d.ts +0 -13
  551. package/dist/src/agent/workflow/builtins/debug-incident.js +0 -177
  552. package/dist/src/agent/workflow/builtins/debug-incident.js.map +0 -1
  553. package/dist/src/agent/workflow/builtins/decision-compare.d.ts +0 -13
  554. package/dist/src/agent/workflow/builtins/decision-compare.js +0 -187
  555. package/dist/src/agent/workflow/builtins/decision-compare.js.map +0 -1
  556. package/dist/src/agent/workflow/builtins/implementation-plan.d.ts +0 -12
  557. package/dist/src/agent/workflow/builtins/implementation-plan.js +0 -185
  558. package/dist/src/agent/workflow/builtins/implementation-plan.js.map +0 -1
  559. package/dist/src/agent/workflow/builtins/inbox-triage.d.ts +0 -11
  560. package/dist/src/agent/workflow/builtins/inbox-triage.js +0 -158
  561. package/dist/src/agent/workflow/builtins/inbox-triage.js.map +0 -1
  562. package/dist/src/agent/workflow/builtins/meeting-prep.d.ts +0 -12
  563. package/dist/src/agent/workflow/builtins/meeting-prep.js +0 -152
  564. package/dist/src/agent/workflow/builtins/meeting-prep.js.map +0 -1
  565. package/dist/src/agent/workflow/builtins/multi-perspective-review.d.ts +0 -14
  566. package/dist/src/agent/workflow/builtins/multi-perspective-review.js +0 -171
  567. package/dist/src/agent/workflow/builtins/multi-perspective-review.js.map +0 -1
  568. package/dist/src/agent/workflow/builtins/offer-design.d.ts +0 -12
  569. package/dist/src/agent/workflow/builtins/offer-design.js +0 -170
  570. package/dist/src/agent/workflow/builtins/offer-design.js.map +0 -1
  571. package/dist/src/agent/workflow/builtins/pr-review.d.ts +0 -12
  572. package/dist/src/agent/workflow/builtins/pr-review.js +0 -178
  573. package/dist/src/agent/workflow/builtins/pr-review.js.map +0 -1
  574. package/dist/src/agent/workflow/builtins/release-check.d.ts +0 -11
  575. package/dist/src/agent/workflow/builtins/release-check.js +0 -174
  576. package/dist/src/agent/workflow/builtins/release-check.js.map +0 -1
  577. package/dist/src/agent/workflow/builtins/research.d.ts +0 -13
  578. package/dist/src/agent/workflow/builtins/research.js +0 -188
  579. package/dist/src/agent/workflow/builtins/research.js.map +0 -1
  580. package/dist/src/agent/workflow/builtins/weekly-review.d.ts +0 -12
  581. package/dist/src/agent/workflow/builtins/weekly-review.js +0 -139
  582. package/dist/src/agent/workflow/builtins/weekly-review.js.map +0 -1
  583. package/dist/src/agent/workflow/last-run-memory.d.ts +0 -42
  584. package/dist/src/agent/workflow/last-run-memory.js +0 -60
  585. package/dist/src/agent/workflow/last-run-memory.js.map +0 -1
  586. package/dist/src/agent/workflow/lint.d.ts +0 -38
  587. package/dist/src/agent/workflow/lint.js +0 -74
  588. package/dist/src/agent/workflow/lint.js.map +0 -1
  589. package/dist/src/agent/workflow/meta-locale.d.ts +0 -12
  590. package/dist/src/agent/workflow/meta-locale.js +0 -62
  591. package/dist/src/agent/workflow/meta-locale.js.map +0 -1
  592. package/dist/src/agent/workflow/parser.d.ts +0 -20
  593. package/dist/src/agent/workflow/parser.js +0 -152
  594. package/dist/src/agent/workflow/parser.js.map +0 -1
  595. package/dist/src/agent/workflow/runtime.d.ts +0 -34
  596. package/dist/src/agent/workflow/runtime.js +0 -402
  597. package/dist/src/agent/workflow/runtime.js.map +0 -1
  598. package/dist/src/connectors/oauth.d.ts +0 -22
  599. package/dist/src/connectors/oauth.js +0 -99
  600. package/dist/src/connectors/oauth.js.map +0 -1
  601. package/dist/src/workflows/runtime/script-runtime.d.ts +0 -3
  602. package/dist/src/workflows/runtime/script-runtime.js +0 -3
  603. package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +0 -5
  604. package/dist/src/workflows/runtime/script-workflow-runtime.js +0 -15
  605. package/dist/src/workflows/runtime/script-workflow-runtime.js.map +0 -1
@@ -1,5 +1,10 @@
1
1
  import { PACKAGE_VERSION, init_package_version } from "../../../package-version.js";
2
+ import { claimConnectorWebhookDelivery, completeConnectorWebhookDelivery, releaseConnectorWebhookDelivery } from "../../../storage/sqlite/connector-repository.js";
3
+ import "../../../storage/sqlite/index.js";
4
+ import { composioLogoResponse } from "../../../connectors/composio-logo.js";
5
+ import { appendComposioTriggerEvent, applyComposioConnectionLifecycleEvent, normalizeComposioTriggerPayload, verifyComposioWebhook } from "../../../connectors/composio-triggers.js";
2
6
  import { serveStaticFile } from "../lib/static-ui.js";
7
+ import { createHash } from "node:crypto";
3
8
  //#region src/gateway/hono/routes/public-gateway.ts
4
9
  init_package_version();
5
10
  function registerPublicGatewayRoutes(app, service) {
@@ -18,6 +23,78 @@ function registerPublicGatewayRoutes(app, service) {
18
23
  startupDurationMs: health.startupDurationMs
19
24
  });
20
25
  });
26
+ app.post("/api/connectors/composio/webhook", async (c) => {
27
+ const secret = process.env.COMPOSIO_WEBHOOK_SECRET?.trim();
28
+ if (!secret) return c.json({
29
+ ok: false,
30
+ error: "Composio webhook is not configured."
31
+ }, 503);
32
+ const webhookId = c.req.header("webhook-id")?.trim() ?? "";
33
+ const body = await c.req.text();
34
+ let payload;
35
+ try {
36
+ payload = verifyComposioWebhook({
37
+ body,
38
+ webhookId,
39
+ webhookTimestamp: c.req.header("webhook-timestamp")?.trim() ?? "",
40
+ signature: c.req.header("webhook-signature")?.trim() ?? "",
41
+ secret
42
+ });
43
+ } catch {
44
+ return c.json({
45
+ ok: false,
46
+ error: "Invalid Composio webhook."
47
+ }, 401);
48
+ }
49
+ try {
50
+ const claim = claimConnectorWebhookDelivery({
51
+ id: webhookId,
52
+ provider: "composio",
53
+ payloadHash: createHash("sha256").update(body).digest("hex")
54
+ });
55
+ if (claim !== "claimed") return c.json({
56
+ ok: true,
57
+ payload: {
58
+ eventId: webhookId,
59
+ duplicate: true,
60
+ status: claim
61
+ }
62
+ });
63
+ const archivedPayload = payload && typeof payload === "object" && !Array.isArray(payload) ? {
64
+ ...payload,
65
+ id: webhookId
66
+ } : {
67
+ id: webhookId,
68
+ data: payload
69
+ };
70
+ const normalized = normalizeComposioTriggerPayload(archivedPayload, webhookId);
71
+ applyComposioConnectionLifecycleEvent(archivedPayload);
72
+ const event = await appendComposioTriggerEvent(service.currentConfig, archivedPayload);
73
+ const runs = await service.automationServiceInstance.triggerEvent({
74
+ type: `connector.${normalized.trigger ?? normalized.type}`,
75
+ source: normalized.toolkit ? `composio:${normalized.toolkit}` : "composio",
76
+ payload: {
77
+ ...normalized.data,
78
+ connectorId: normalized.toolkit ? `composio-${normalized.toolkit}` : "composio",
79
+ webhookId
80
+ }
81
+ });
82
+ completeConnectorWebhookDelivery(webhookId);
83
+ return c.json({
84
+ ok: true,
85
+ payload: {
86
+ eventId: event.id,
87
+ automationRuns: runs.length
88
+ }
89
+ });
90
+ } catch (error) {
91
+ releaseConnectorWebhookDelivery(webhookId, error);
92
+ return c.json({
93
+ ok: false,
94
+ error: "Composio webhook processing failed."
95
+ }, 500);
96
+ }
97
+ });
21
98
  app.get("/api", (c) => {
22
99
  return c.json({
23
100
  service: "xopc-gateway",
@@ -67,6 +144,22 @@ function registerPublicGatewayRoutes(app, service) {
67
144
  if (response) return response;
68
145
  return c.text("Not found", 404);
69
146
  });
147
+ app.get("/connector-icons/composio/:toolkit", async (c) => {
148
+ try {
149
+ return await composioLogoResponse(c.req.param("toolkit"));
150
+ } catch {
151
+ return c.json({
152
+ ok: false,
153
+ error: "Connector logo is unavailable."
154
+ }, 404);
155
+ }
156
+ });
157
+ /** From `web/public/connector-icons/` (Vite copies to static root). Public: img requests send no Bearer token. */
158
+ app.get("/connector-icons/*", (c) => {
159
+ const response = serveStaticFile(`connector-icons/${c.req.path.replace("/connector-icons/", "")}`, c.req.raw);
160
+ if (response) return response;
161
+ return c.text("Not found", 404);
162
+ });
70
163
  app.get("/favicon.ico", (c) => {
71
164
  const response = serveStaticFile("favicon.ico", c.req.raw);
72
165
  if (response) return response;
@@ -1 +1 @@
1
- {"version":3,"file":"public-gateway.js","names":[],"sources":["../../../../../src/gateway/hono/routes/public-gateway.ts"],"sourcesContent":["import type { Hono } from 'hono';\n\nimport { PACKAGE_VERSION } from '../../../package-version.js';\nimport type { GatewayService } from '../../service.js';\nimport { serveStaticFile } from '../lib/static-ui.js';\n\nexport function registerPublicGatewayRoutes(app: Hono, service: GatewayService): void {\n app.get('/health', (c) => {\n return c.json(service.getHealth());\n });\n\n /** Public liveness probe (no auth) — minimal payload for CLI / load balancers. */\n app.get('/api/health', (c) => {\n const health = service.getHealth();\n return c.json({\n status: health.ready ? 'ok' : 'starting',\n ready: health.ready,\n httpListening: health.httpListening,\n version: health.version,\n uptime: health.uptime,\n startupDurationMs: health.startupDurationMs,\n });\n });\n\n app.get('/api', (c) => {\n return c.json({\n service: 'xopc-gateway',\n version: PACKAGE_VERSION,\n transport: 'streamable-http',\n endpoints: [\n 'GET /health',\n 'GET /api/health',\n 'GET /status',\n 'GET /api/status',\n 'POST /api/agent (SSE stream / JSON)',\n 'POST /api/agent/abort',\n 'POST /api/agent/steer',\n 'POST /api/send',\n 'GET /api/events (SSE stream)',\n 'GET /api/channels/catalog',\n 'GET /api/channels/status',\n 'POST /api/channels/:channelId/actions/:actionId',\n 'GET /api/config',\n 'GET /api/agents',\n 'POST /api/agents',\n 'PATCH /api/agents/:id',\n 'DELETE /api/agents/:id',\n 'GET/PUT/DELETE /api/agents/:id/avatar',\n 'GET/PUT /api/agents/:id/files/...',\n 'DELETE /api/providers/:providerId/key',\n 'PATCH /api/config',\n 'POST /api/config/reload',\n 'POST /api/heartbeat/trigger',\n '... /api/automations/*',\n '... /api/automation-runs/*',\n 'GET/PATCH /api/sessions/:key/agent-config',\n '... /api/sessions/*',\n 'GET /api/host/fs/meta',\n 'GET /api/host/fs/list',\n ],\n });\n });\n\n app.get('/assets/*', (c) => {\n const path = c.req.path.replace('/assets/', '');\n const response = serveStaticFile(`assets/${path}`, c.req.raw);\n if (response) return response;\n return c.text('Not found', 404);\n });\n\n /** From `web/public/channel-icons/` (Vite copies to static root). Public: img requests send no Bearer token. */\n app.get('/channel-icons/*', (c) => {\n const path = c.req.path.replace('/channel-icons/', '');\n const response = serveStaticFile(`channel-icons/${path}`, c.req.raw);\n if (response) return response;\n return c.text('Not found', 404);\n });\n\n app.get('/favicon.ico', (c) => {\n const response = serveStaticFile('favicon.ico', c.req.raw);\n if (response) return response;\n const fallback = serveStaticFile('logo.svg', c.req.raw);\n if (fallback) return fallback;\n return c.text('Not found', 404);\n });\n\n app.get('/logo.svg', (c) => {\n const response = serveStaticFile('logo.svg', c.req.raw);\n if (response) return response;\n return c.text('Not found', 404);\n });\n\n app.get('/logo-dark.svg', (c) => {\n const response = serveStaticFile('logo-dark.svg', c.req.raw);\n if (response) return response;\n return c.text('Not found', 404);\n });\n\n app.get('/', (c) => {\n const response = serveStaticFile('index.html', c.req.raw);\n if (response) return response;\n return c.text('UI not found', 404);\n });\n}\n"],"mappings":";;;sBAE8D;AAI9D,SAAgB,4BAA4B,KAAW,SAA+B;AACpF,KAAI,IAAI,YAAY,MAAM;AACxB,SAAO,EAAE,KAAK,QAAQ,WAAW,CAAC;GAClC;;AAGF,KAAI,IAAI,gBAAgB,MAAM;EAC5B,MAAM,SAAS,QAAQ,WAAW;AAClC,SAAO,EAAE,KAAK;GACZ,QAAQ,OAAO,QAAQ,OAAO;GAC9B,OAAO,OAAO;GACd,eAAe,OAAO;GACtB,SAAS,OAAO;GAChB,QAAQ,OAAO;GACf,mBAAmB,OAAO;GAC3B,CAAC;GACF;AAEF,KAAI,IAAI,SAAS,MAAM;AACrB,SAAO,EAAE,KAAK;GACZ,SAAS;GACT,SAAS;GACT,WAAW;GACX,WAAW;IACT;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACD;GACF,CAAC;GACF;AAEF,KAAI,IAAI,cAAc,MAAM;EAE1B,MAAM,WAAW,gBAAgB,UADpB,EAAE,IAAI,KAAK,QAAQ,YAAY,GACG,IAAI,EAAE,IAAI,IAAI;AAC7D,MAAI,SAAU,QAAO;AACrB,SAAO,EAAE,KAAK,aAAa,IAAI;GAC/B;;AAGF,KAAI,IAAI,qBAAqB,MAAM;EAEjC,MAAM,WAAW,gBAAgB,iBADpB,EAAE,IAAI,KAAK,QAAQ,mBAAmB,GACG,IAAI,EAAE,IAAI,IAAI;AACpE,MAAI,SAAU,QAAO;AACrB,SAAO,EAAE,KAAK,aAAa,IAAI;GAC/B;AAEF,KAAI,IAAI,iBAAiB,MAAM;EAC7B,MAAM,WAAW,gBAAgB,eAAe,EAAE,IAAI,IAAI;AAC1D,MAAI,SAAU,QAAO;EACrB,MAAM,WAAW,gBAAgB,YAAY,EAAE,IAAI,IAAI;AACvD,MAAI,SAAU,QAAO;AACrB,SAAO,EAAE,KAAK,aAAa,IAAI;GAC/B;AAEF,KAAI,IAAI,cAAc,MAAM;EAC1B,MAAM,WAAW,gBAAgB,YAAY,EAAE,IAAI,IAAI;AACvD,MAAI,SAAU,QAAO;AACrB,SAAO,EAAE,KAAK,aAAa,IAAI;GAC/B;AAEF,KAAI,IAAI,mBAAmB,MAAM;EAC/B,MAAM,WAAW,gBAAgB,iBAAiB,EAAE,IAAI,IAAI;AAC5D,MAAI,SAAU,QAAO;AACrB,SAAO,EAAE,KAAK,aAAa,IAAI;GAC/B;AAEF,KAAI,IAAI,MAAM,MAAM;EAClB,MAAM,WAAW,gBAAgB,cAAc,EAAE,IAAI,IAAI;AACzD,MAAI,SAAU,QAAO;AACrB,SAAO,EAAE,KAAK,gBAAgB,IAAI;GAClC"}
1
+ {"version":3,"file":"public-gateway.js","names":[],"sources":["../../../../../src/gateway/hono/routes/public-gateway.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\n\nimport type { Hono } from 'hono';\n\nimport { composioLogoResponse } from '../../../connectors/composio-logo.js';\nimport {\n appendComposioTriggerEvent,\n applyComposioConnectionLifecycleEvent,\n normalizeComposioTriggerPayload,\n verifyComposioWebhook,\n} from '../../../connectors/composio-triggers.js';\nimport { PACKAGE_VERSION } from '../../../package-version.js';\nimport {\n claimConnectorWebhookDelivery,\n completeConnectorWebhookDelivery,\n releaseConnectorWebhookDelivery,\n} from '../../../storage/sqlite/index.js';\nimport type { GatewayService } from '../../service.js';\nimport { serveStaticFile } from '../lib/static-ui.js';\n\nexport function registerPublicGatewayRoutes(app: Hono, service: GatewayService): void {\n app.get('/health', (c) => {\n return c.json(service.getHealth());\n });\n\n /** Public liveness probe (no auth) — minimal payload for CLI / load balancers. */\n app.get('/api/health', (c) => {\n const health = service.getHealth();\n return c.json({\n status: health.ready ? 'ok' : 'starting',\n ready: health.ready,\n httpListening: health.httpListening,\n version: health.version,\n uptime: health.uptime,\n startupDurationMs: health.startupDurationMs,\n });\n });\n\n app.post('/api/connectors/composio/webhook', async (c) => {\n const secret = process.env.COMPOSIO_WEBHOOK_SECRET?.trim();\n if (!secret) return c.json({ ok: false, error: 'Composio webhook is not configured.' }, 503);\n const webhookId = c.req.header('webhook-id')?.trim() ?? '';\n const body = await c.req.text();\n let payload: unknown;\n try {\n payload = verifyComposioWebhook({\n body,\n webhookId,\n webhookTimestamp: c.req.header('webhook-timestamp')?.trim() ?? '',\n signature: c.req.header('webhook-signature')?.trim() ?? '',\n secret,\n });\n } catch {\n return c.json({ ok: false, error: 'Invalid Composio webhook.' }, 401);\n }\n try {\n const claim = claimConnectorWebhookDelivery({\n id: webhookId,\n provider: 'composio',\n payloadHash: createHash('sha256').update(body).digest('hex'),\n });\n if (claim !== 'claimed') {\n return c.json({ ok: true, payload: { eventId: webhookId, duplicate: true, status: claim } });\n }\n const archivedPayload = payload && typeof payload === 'object' && !Array.isArray(payload)\n ? { ...payload as Record<string, unknown>, id: webhookId }\n : { id: webhookId, data: payload };\n const normalized = normalizeComposioTriggerPayload(archivedPayload, webhookId);\n applyComposioConnectionLifecycleEvent(archivedPayload);\n const event = await appendComposioTriggerEvent(service.currentConfig, archivedPayload);\n const runs = await service.automationServiceInstance.triggerEvent({\n type: `connector.${normalized.trigger ?? normalized.type}`,\n source: normalized.toolkit ? `composio:${normalized.toolkit}` : 'composio',\n payload: {\n ...normalized.data,\n connectorId: normalized.toolkit ? `composio-${normalized.toolkit}` : 'composio',\n webhookId,\n },\n });\n completeConnectorWebhookDelivery(webhookId);\n return c.json({ ok: true, payload: { eventId: event.id, automationRuns: runs.length } });\n } catch (error) {\n releaseConnectorWebhookDelivery(webhookId, error);\n return c.json({ ok: false, error: 'Composio webhook processing failed.' }, 500);\n }\n });\n\n app.get('/api', (c) => {\n return c.json({\n service: 'xopc-gateway',\n version: PACKAGE_VERSION,\n transport: 'streamable-http',\n endpoints: [\n 'GET /health',\n 'GET /api/health',\n 'GET /status',\n 'GET /api/status',\n 'POST /api/agent (SSE stream / JSON)',\n 'POST /api/agent/abort',\n 'POST /api/agent/steer',\n 'POST /api/send',\n 'GET /api/events (SSE stream)',\n 'GET /api/channels/catalog',\n 'GET /api/channels/status',\n 'POST /api/channels/:channelId/actions/:actionId',\n 'GET /api/config',\n 'GET /api/agents',\n 'POST /api/agents',\n 'PATCH /api/agents/:id',\n 'DELETE /api/agents/:id',\n 'GET/PUT/DELETE /api/agents/:id/avatar',\n 'GET/PUT /api/agents/:id/files/...',\n 'DELETE /api/providers/:providerId/key',\n 'PATCH /api/config',\n 'POST /api/config/reload',\n 'POST /api/heartbeat/trigger',\n '... /api/automations/*',\n '... /api/automation-runs/*',\n 'GET/PATCH /api/sessions/:key/agent-config',\n '... /api/sessions/*',\n 'GET /api/host/fs/meta',\n 'GET /api/host/fs/list',\n ],\n });\n });\n\n app.get('/assets/*', (c) => {\n const path = c.req.path.replace('/assets/', '');\n const response = serveStaticFile(`assets/${path}`, c.req.raw);\n if (response) return response;\n return c.text('Not found', 404);\n });\n\n /** From `web/public/channel-icons/` (Vite copies to static root). Public: img requests send no Bearer token. */\n app.get('/channel-icons/*', (c) => {\n const path = c.req.path.replace('/channel-icons/', '');\n const response = serveStaticFile(`channel-icons/${path}`, c.req.raw);\n if (response) return response;\n return c.text('Not found', 404);\n });\n\n app.get('/connector-icons/composio/:toolkit', async (c) => {\n try {\n return await composioLogoResponse(c.req.param('toolkit'));\n } catch {\n return c.json({ ok: false, error: 'Connector logo is unavailable.' }, 404);\n }\n });\n\n /** From `web/public/connector-icons/` (Vite copies to static root). Public: img requests send no Bearer token. */\n app.get('/connector-icons/*', (c) => {\n const path = c.req.path.replace('/connector-icons/', '');\n const response = serveStaticFile(`connector-icons/${path}`, c.req.raw);\n if (response) return response;\n return c.text('Not found', 404);\n });\n\n app.get('/favicon.ico', (c) => {\n const response = serveStaticFile('favicon.ico', c.req.raw);\n if (response) return response;\n const fallback = serveStaticFile('logo.svg', c.req.raw);\n if (fallback) return fallback;\n return c.text('Not found', 404);\n });\n\n app.get('/logo.svg', (c) => {\n const response = serveStaticFile('logo.svg', c.req.raw);\n if (response) return response;\n return c.text('Not found', 404);\n });\n\n app.get('/logo-dark.svg', (c) => {\n const response = serveStaticFile('logo-dark.svg', c.req.raw);\n if (response) return response;\n return c.text('Not found', 404);\n });\n\n app.get('/', (c) => {\n const response = serveStaticFile('index.html', c.req.raw);\n if (response) return response;\n return c.text('UI not found', 404);\n });\n}\n"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { getDefaultModelSync, init_providers, resolveModel } from "../../../providers/index.js";
2
+ import { completeWithResolvedCredentials } from "../../../providers/model-call.js";
2
3
  import { resolveTtsProviderConfigSlice } from "../../../voice/tts/config-slice.js";
3
4
  import { isTTSAvailable } from "../../../voice/tts/factory.js";
4
5
  import { speak } from "../../../voice/tts/speak-core.js";
@@ -12,7 +13,6 @@ import { listSttProvidersForApi } from "../../../voice/stt/list-providers.js";
12
13
  import "../../../voice/tts/index.js";
13
14
  import { createGatewayRouteLogger } from "../lib/route-logger.js";
14
15
  import { listTtsProvidersForApi } from "../../../voice/tts/list-providers.js";
15
- import { complete } from "@earendil-works/pi-ai/compat";
16
16
  //#region src/gateway/hono/routes/voice.ts
17
17
  init_providers();
18
18
  const log = createGatewayRouteLogger("Voice");
@@ -62,7 +62,7 @@ async function refineTranscript(raw, config, signal) {
62
62
  };
63
63
  const timeoutSignal = typeof AbortSignal !== "undefined" && typeof AbortSignal.timeout === "function" ? AbortSignal.timeout(REFINE_TIMEOUT_MS) : void 0;
64
64
  const mergedSignal = signal && timeoutSignal && typeof AbortSignal.any === "function" ? AbortSignal.any([signal, timeoutSignal]) : signal ?? timeoutSignal;
65
- const result = await complete(model, { messages: [userMsg] }, {
65
+ const result = await completeWithResolvedCredentials(model, { messages: [userMsg] }, {
66
66
  maxTokens: Math.min(raw.length * 3, 4096),
67
67
  temperature: .2,
68
68
  signal: mergedSignal
@@ -1 +1 @@
1
- {"version":3,"file":"voice.js","names":[],"sources":["../../../../../src/gateway/hono/routes/voice.ts"],"sourcesContent":["/**\n * Voice routes — POST /api/voice/transcribe\n *\n * Single endpoint that:\n * 1. Runs STT (Whisper preferred for low latency, Alibaba fallback)\n * 2. Optionally runs LLM refine on the raw transcript\n * 3. Returns { raw, refined?, language }\n *\n * LLM refine is auto-applied when a model is resolvable; gracefully degrades\n * to raw-only when no LLM is configured.\n */\n\nimport type { Hono } from 'hono';\nimport { complete, type UserMessage } from '@earendil-works/pi-ai/compat';\n\nimport type { Config } from '../../../config/schema.js';\nimport { getDefaultModelSync, resolveModel } from '../../../providers/index.js';\nimport { isSTTAvailable, transcribe } from '../../../voice/stt/index.js';\nimport { isTTSAvailable, mergeTtsConfigFromAppConfig, speak } from '../../../voice/tts/index.js';\nimport { listTtsProvidersForApi } from '../../../voice/tts/list-providers.js';\nimport { listSttProvidersForApi } from '../../../voice/stt/list-providers.js';\nimport { mergeSttConfigFromAppConfig } from '../../../channels/attachments/voice-stt-webchat.js';\nimport { resolveSttProviderConfigSlice } from '../../../voice/stt/config-slice.js';\nimport { resolveTtsProviderConfigSlice } from '../../../voice/tts/config-slice.js';\nimport { createGatewayRouteLogger } from '../lib/route-logger.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nconst log = createGatewayRouteLogger('Voice');\n\nfunction readVoiceApiKeyFromConfigFileOnly(\n cfg: Config,\n kind: 'stt' | 'tts',\n providerId: string,\n): string | undefined {\n const id = providerId.trim();\n if (!id) return undefined;\n const slice =\n kind === 'stt'\n ? resolveSttProviderConfigSlice(id, cfg.tools?.media?.audio)\n : resolveTtsProviderConfigSlice(id, cfg.messages?.tts);\n const key = slice.apiKey;\n return typeof key === 'string' && key.trim() ? key.trim() : undefined;\n}\n\nconst REFINE_TIMEOUT_MS = 15_000;\nconst MAX_AUDIO_BYTES = 25 * 1024 * 1024; // 25 MB\n\nconst REFINE_SYSTEM_PROMPT = `你是语音转文字后处理助手。将语音转写原文整理为高质量文本输入。\n\n规则:\n1. 修正明显的语音识别错误\n2. 添加正确的标点符号\n3. 去除口语赘词(嗯、啊、那个、就是说、然后就是)\n4. 保持原意不变,不要扩写或改变语义\n5. 如果原文已经很好,原样输出\n6. 只输出整理后的文字,不要解释`;\n\nfunction resolveRefineModel(config: Config | undefined): ReturnType<typeof resolveModel> | null {\n const envRef = process.env.XOPC_VOICE_REFINE_MODEL?.trim();\n if (envRef) {\n try {\n return resolveModel(envRef);\n } catch { /* fall through */ }\n }\n for (const candidate of ['openai/gpt-5.6-luna', 'google/gemini-3.5-flash']) {\n try {\n return resolveModel(candidate);\n } catch { /* next */ }\n }\n try {\n return resolveModel(getDefaultModelSync(config));\n } catch {\n return null;\n }\n}\n\nasync function refineTranscript(\n raw: string,\n config: Config | undefined,\n signal?: AbortSignal,\n): Promise<string | undefined> {\n if (!raw.trim()) return undefined;\n\n const model = resolveRefineModel(config);\n if (!model) {\n log.debug('No LLM model available for voice refine; returning raw only');\n return undefined;\n }\n\n try {\n const userMsg: UserMessage = {\n role: 'user',\n content: `${REFINE_SYSTEM_PROMPT}\\n\\n原文:${raw}`,\n timestamp: Date.now(),\n };\n\n const timeoutSignal =\n typeof AbortSignal !== 'undefined' && typeof AbortSignal.timeout === 'function'\n ? AbortSignal.timeout(REFINE_TIMEOUT_MS)\n : undefined;\n const mergedSignal =\n signal && timeoutSignal && typeof AbortSignal.any === 'function'\n ? AbortSignal.any([signal, timeoutSignal])\n : signal ?? timeoutSignal;\n\n const result = await complete(\n model,\n { messages: [userMsg] },\n {\n maxTokens: Math.min(raw.length * 3, 4096),\n temperature: 0.2,\n signal: mergedSignal as AbortSignal,\n },\n );\n\n let out = '';\n if (Array.isArray(result.content)) {\n for (const c of result.content) {\n if (c && typeof c === 'object' && (c as { type?: string }).type === 'text') {\n out += String((c as { text?: string }).text || '');\n }\n }\n }\n\n const refined = out.trim();\n if (!refined || refined === raw.trim()) return undefined;\n return refined;\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n log.warn({ errorMessage: msg }, 'Voice refine failed; returning raw only');\n return undefined;\n }\n}\n\nexport function registerVoiceRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n\n /**\n * GET /api/voice/providers\n *\n * Lists registered SpeechProviderPlugin ids with configured state for the\n * current gateway config (OpenClaw `tts.providers` equivalent).\n */\n authenticated.get('/api/voice/providers', (c) => {\n const config = service.currentConfig as Config;\n const payload = listTtsProvidersForApi(config);\n return c.json({ ok: true, payload });\n });\n\n /**\n * GET /api/voice/stt-providers\n *\n * Lists registered MediaUnderstandingProvider ids with configured state for\n * the current gateway config (OpenClaw `tools.media.audio.providers` equivalent).\n */\n authenticated.get('/api/voice/stt-providers', (c) => {\n const config = service.currentConfig as Config;\n const payload = listSttProvidersForApi(config);\n return c.json({ ok: true, payload });\n });\n\n /**\n * POST /api/voice/reveal-api-key — return plaintext voice provider apiKey from config file only.\n * Body: `{ kind: 'stt' | 'tts', provider: string }`\n */\n authenticated.post('/api/voice/reveal-api-key', strictRateLimitMiddleware, async (c) => {\n let body: { kind?: unknown; provider?: unknown } = {};\n try {\n body = (await c.req.json()) as typeof body;\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON body' } }, 400);\n }\n const kind = body.kind === 'stt' || body.kind === 'tts' ? body.kind : null;\n const provider = typeof body.provider === 'string' ? body.provider.trim() : '';\n if (!kind) {\n return c.json({ ok: false, error: { message: 'kind must be \"stt\" or \"tts\"' } }, 400);\n }\n if (!provider) {\n return c.json({ ok: false, error: { message: 'provider is required' } }, 400);\n }\n\n const cfg = service.currentConfig as Config;\n const apiKey = readVoiceApiKeyFromConfigFileOnly(cfg, kind, provider);\n return c.json({\n ok: true,\n payload: {\n kind,\n provider,\n apiKey: apiKey ?? null,\n source: apiKey ? ('config' as const) : ('none' as const),\n },\n });\n });\n\n /**\n * POST /api/voice/tts-test\n *\n * Body: { text: string, provider?: string, model?: string, voice?: string }\n * Response: { ok: true, payload: { audio: string, format: string, provider: string } }\n */\n authenticated.post('/api/voice/tts-test', strictRateLimitMiddleware, async (c) => {\n let body: { text?: unknown; provider?: unknown; model?: unknown; voice?: unknown; providerConfig?: unknown } = {};\n try {\n body = (await c.req.json()) as typeof body;\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON body' } }, 400);\n }\n\n const text = typeof body.text === 'string' ? body.text.trim() : '';\n if (!text) {\n return c.json({ ok: false, error: { message: 'text is required' } }, 400);\n }\n if (text.length > 1000) {\n return c.json({ ok: false, error: { message: 'text exceeds 1000 characters' } }, 400);\n }\n\n const config = service.currentConfig as Config;\n const baseTtsConfig = mergeTtsConfigFromAppConfig(config.messages?.tts);\n const provider = typeof body.provider === 'string' && body.provider.trim() ? body.provider.trim() : baseTtsConfig.provider;\n const providerConfig =\n body.providerConfig && typeof body.providerConfig === 'object' && !Array.isArray(body.providerConfig)\n ? (body.providerConfig as Record<string, unknown>)\n : undefined;\n const ttsConfig = {\n ...baseTtsConfig,\n enabled: true,\n provider,\n providers: {\n ...(baseTtsConfig.providers ?? {}),\n ...(providerConfig ? { [provider]: { ...(baseTtsConfig.providers?.[provider] ?? {}), ...providerConfig } } : {}),\n },\n fallback: { enabled: false, order: [provider] },\n };\n\n if (!isTTSAvailable(ttsConfig)) {\n return c.json({\n ok: false,\n error: { message: `TTS provider \"${provider}\" is not configured.` },\n }, 503);\n }\n\n try {\n const startedAt = Date.now();\n const result = await speak(text, ttsConfig, {\n appConfig: config,\n parseDirectives: false,\n tts: {\n ...(typeof body.model === 'string' && body.model.trim() ? { model: body.model.trim() } : {}),\n ...(typeof body.voice === 'string' && body.voice.trim() ? { voice: body.voice.trim() } : {}),\n },\n });\n if (!result.audio.length) {\n throw new Error(`TTS provider \"${result.provider}\" returned empty audio`);\n }\n const mimeType =\n result.format === 'opus' || result.format === 'ogg'\n ? 'audio/ogg'\n : result.format === 'mp3' || result.format === 'mpeg'\n ? 'audio/mpeg'\n : result.format === 'wav'\n ? 'audio/wav'\n : `audio/${result.format}`;\n return c.json({\n ok: true,\n payload: {\n audio: result.audio.toString('base64'),\n mimeType,\n format: result.format,\n provider: result.provider,\n latencyMs: Date.now() - startedAt,\n audioSize: result.audio.length,\n },\n });\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n log.error({ errorMessage: msg, provider }, 'Voice TTS test failed');\n return c.json({ ok: false, error: { message: `TTS test failed: ${msg}` } }, 502);\n }\n });\n\n /**\n * POST /api/voice/transcribe\n *\n * Body: { audio: string (base64), mimeType: string, language?: string }\n * Response: { ok: true, payload: { raw: string, refined?: string, language?: string } }\n */\n authenticated.post('/api/voice/transcribe', async (c) => {\n let body: { audio?: string; mimeType?: string; language?: string } = {};\n try {\n body = (await c.req.json()) as typeof body;\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON body' } }, 400);\n }\n\n const { audio, mimeType, language } = body;\n if (!audio || typeof audio !== 'string') {\n return c.json({ ok: false, error: { message: 'Missing required field: audio (base64)' } }, 400);\n }\n if (!mimeType || typeof mimeType !== 'string') {\n return c.json({ ok: false, error: { message: 'Missing required field: mimeType' } }, 400);\n }\n\n // Decode base64 audio\n let audioBuffer: Buffer;\n try {\n audioBuffer = Buffer.from(audio, 'base64');\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid base64 audio data' } }, 400);\n }\n\n if (audioBuffer.length === 0) {\n return c.json({ ok: false, error: { message: 'Empty audio data' } }, 400);\n }\n if (audioBuffer.length > MAX_AUDIO_BYTES) {\n return c.json({ ok: false, error: { message: 'Audio data exceeds 25 MB limit' } }, 400);\n }\n\n // Resolve STT config from app config\n const config = service.currentConfig as Config;\n const sttConfigRaw = config.tools?.media?.audio;\n const sttConfig = mergeSttConfigFromAppConfig(sttConfigRaw, config.tools?.media);\n\n if (!isSTTAvailable(sttConfig)) {\n return c.json({\n ok: false,\n error: { message: 'STT is not configured. Enable STT in gateway config (tools.media.audio).' },\n }, 503);\n }\n\n // Run STT\n let raw: string;\n let detectedLanguage: string | undefined;\n try {\n const result = await transcribe(audioBuffer, sttConfig, {\n language: language || (sttConfig.provider === 'alibaba' ? 'zh' : undefined),\n });\n raw = result.text;\n detectedLanguage = result.language ?? language;\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n log.error({ errorMessage: msg }, 'Voice transcription failed');\n return c.json({ ok: false, error: { message: `Transcription failed: ${msg}` } }, 502);\n }\n\n if (!raw.trim()) {\n return c.json({\n ok: true,\n payload: { raw: '', language: detectedLanguage },\n });\n }\n\n // Run LLM refine (auto, best-effort)\n const refined = await refineTranscript(raw, config);\n\n return c.json({\n ok: true,\n payload: {\n raw,\n ...(refined ? { refined } : {}),\n ...(detectedLanguage ? { language: detectedLanguage } : {}),\n },\n });\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"voice.js","names":[],"sources":["../../../../../src/gateway/hono/routes/voice.ts"],"sourcesContent":["/**\n * Voice routes — POST /api/voice/transcribe\n *\n * Single endpoint that:\n * 1. Runs STT (Whisper preferred for low latency, Alibaba fallback)\n * 2. Optionally runs LLM refine on the raw transcript\n * 3. Returns { raw, refined?, language }\n *\n * LLM refine is auto-applied when a model is resolvable; gracefully degrades\n * to raw-only when no LLM is configured.\n */\n\nimport type { Hono } from 'hono';\nimport { type UserMessage } from '@earendil-works/pi-ai/compat';\n\nimport type { Config } from '../../../config/schema.js';\nimport { getDefaultModelSync, resolveModel } from '../../../providers/index.js';\nimport { completeWithResolvedCredentials } from '../../../providers/model-call.js';\nimport { isSTTAvailable, transcribe } from '../../../voice/stt/index.js';\nimport { isTTSAvailable, mergeTtsConfigFromAppConfig, speak } from '../../../voice/tts/index.js';\nimport { listTtsProvidersForApi } from '../../../voice/tts/list-providers.js';\nimport { listSttProvidersForApi } from '../../../voice/stt/list-providers.js';\nimport { mergeSttConfigFromAppConfig } from '../../../channels/attachments/voice-stt-webchat.js';\nimport { resolveSttProviderConfigSlice } from '../../../voice/stt/config-slice.js';\nimport { resolveTtsProviderConfigSlice } from '../../../voice/tts/config-slice.js';\nimport { createGatewayRouteLogger } from '../lib/route-logger.js';\nimport type { AuthenticatedRouteDeps } from './deps.js';\n\nconst log = createGatewayRouteLogger('Voice');\n\nfunction readVoiceApiKeyFromConfigFileOnly(\n cfg: Config,\n kind: 'stt' | 'tts',\n providerId: string,\n): string | undefined {\n const id = providerId.trim();\n if (!id) return undefined;\n const slice =\n kind === 'stt'\n ? resolveSttProviderConfigSlice(id, cfg.tools?.media?.audio)\n : resolveTtsProviderConfigSlice(id, cfg.messages?.tts);\n const key = slice.apiKey;\n return typeof key === 'string' && key.trim() ? key.trim() : undefined;\n}\n\nconst REFINE_TIMEOUT_MS = 15_000;\nconst MAX_AUDIO_BYTES = 25 * 1024 * 1024; // 25 MB\n\nconst REFINE_SYSTEM_PROMPT = `你是语音转文字后处理助手。将语音转写原文整理为高质量文本输入。\n\n规则:\n1. 修正明显的语音识别错误\n2. 添加正确的标点符号\n3. 去除口语赘词(嗯、啊、那个、就是说、然后就是)\n4. 保持原意不变,不要扩写或改变语义\n5. 如果原文已经很好,原样输出\n6. 只输出整理后的文字,不要解释`;\n\nfunction resolveRefineModel(config: Config | undefined): ReturnType<typeof resolveModel> | null {\n const envRef = process.env.XOPC_VOICE_REFINE_MODEL?.trim();\n if (envRef) {\n try {\n return resolveModel(envRef);\n } catch { /* fall through */ }\n }\n for (const candidate of ['openai/gpt-5.6-luna', 'google/gemini-3.5-flash']) {\n try {\n return resolveModel(candidate);\n } catch { /* next */ }\n }\n try {\n return resolveModel(getDefaultModelSync(config));\n } catch {\n return null;\n }\n}\n\nasync function refineTranscript(\n raw: string,\n config: Config | undefined,\n signal?: AbortSignal,\n): Promise<string | undefined> {\n if (!raw.trim()) return undefined;\n\n const model = resolveRefineModel(config);\n if (!model) {\n log.debug('No LLM model available for voice refine; returning raw only');\n return undefined;\n }\n\n try {\n const userMsg: UserMessage = {\n role: 'user',\n content: `${REFINE_SYSTEM_PROMPT}\\n\\n原文:${raw}`,\n timestamp: Date.now(),\n };\n\n const timeoutSignal =\n typeof AbortSignal !== 'undefined' && typeof AbortSignal.timeout === 'function'\n ? AbortSignal.timeout(REFINE_TIMEOUT_MS)\n : undefined;\n const mergedSignal =\n signal && timeoutSignal && typeof AbortSignal.any === 'function'\n ? AbortSignal.any([signal, timeoutSignal])\n : signal ?? timeoutSignal;\n\n const result = await completeWithResolvedCredentials(\n model,\n { messages: [userMsg] },\n {\n maxTokens: Math.min(raw.length * 3, 4096),\n temperature: 0.2,\n signal: mergedSignal as AbortSignal,\n },\n );\n\n let out = '';\n if (Array.isArray(result.content)) {\n for (const c of result.content) {\n if (c && typeof c === 'object' && (c as { type?: string }).type === 'text') {\n out += String((c as { text?: string }).text || '');\n }\n }\n }\n\n const refined = out.trim();\n if (!refined || refined === raw.trim()) return undefined;\n return refined;\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n log.warn({ errorMessage: msg }, 'Voice refine failed; returning raw only');\n return undefined;\n }\n}\n\nexport function registerVoiceRoutes(authenticated: Hono, deps: AuthenticatedRouteDeps): void {\n const { service, strictRateLimitMiddleware } = deps;\n\n /**\n * GET /api/voice/providers\n *\n * Lists registered SpeechProviderPlugin ids with configured state for the\n * current gateway config (OpenClaw `tts.providers` equivalent).\n */\n authenticated.get('/api/voice/providers', (c) => {\n const config = service.currentConfig as Config;\n const payload = listTtsProvidersForApi(config);\n return c.json({ ok: true, payload });\n });\n\n /**\n * GET /api/voice/stt-providers\n *\n * Lists registered MediaUnderstandingProvider ids with configured state for\n * the current gateway config (OpenClaw `tools.media.audio.providers` equivalent).\n */\n authenticated.get('/api/voice/stt-providers', (c) => {\n const config = service.currentConfig as Config;\n const payload = listSttProvidersForApi(config);\n return c.json({ ok: true, payload });\n });\n\n /**\n * POST /api/voice/reveal-api-key — return plaintext voice provider apiKey from config file only.\n * Body: `{ kind: 'stt' | 'tts', provider: string }`\n */\n authenticated.post('/api/voice/reveal-api-key', strictRateLimitMiddleware, async (c) => {\n let body: { kind?: unknown; provider?: unknown } = {};\n try {\n body = (await c.req.json()) as typeof body;\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON body' } }, 400);\n }\n const kind = body.kind === 'stt' || body.kind === 'tts' ? body.kind : null;\n const provider = typeof body.provider === 'string' ? body.provider.trim() : '';\n if (!kind) {\n return c.json({ ok: false, error: { message: 'kind must be \"stt\" or \"tts\"' } }, 400);\n }\n if (!provider) {\n return c.json({ ok: false, error: { message: 'provider is required' } }, 400);\n }\n\n const cfg = service.currentConfig as Config;\n const apiKey = readVoiceApiKeyFromConfigFileOnly(cfg, kind, provider);\n return c.json({\n ok: true,\n payload: {\n kind,\n provider,\n apiKey: apiKey ?? null,\n source: apiKey ? ('config' as const) : ('none' as const),\n },\n });\n });\n\n /**\n * POST /api/voice/tts-test\n *\n * Body: { text: string, provider?: string, model?: string, voice?: string }\n * Response: { ok: true, payload: { audio: string, format: string, provider: string } }\n */\n authenticated.post('/api/voice/tts-test', strictRateLimitMiddleware, async (c) => {\n let body: { text?: unknown; provider?: unknown; model?: unknown; voice?: unknown; providerConfig?: unknown } = {};\n try {\n body = (await c.req.json()) as typeof body;\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON body' } }, 400);\n }\n\n const text = typeof body.text === 'string' ? body.text.trim() : '';\n if (!text) {\n return c.json({ ok: false, error: { message: 'text is required' } }, 400);\n }\n if (text.length > 1000) {\n return c.json({ ok: false, error: { message: 'text exceeds 1000 characters' } }, 400);\n }\n\n const config = service.currentConfig as Config;\n const baseTtsConfig = mergeTtsConfigFromAppConfig(config.messages?.tts);\n const provider = typeof body.provider === 'string' && body.provider.trim() ? body.provider.trim() : baseTtsConfig.provider;\n const providerConfig =\n body.providerConfig && typeof body.providerConfig === 'object' && !Array.isArray(body.providerConfig)\n ? (body.providerConfig as Record<string, unknown>)\n : undefined;\n const ttsConfig = {\n ...baseTtsConfig,\n enabled: true,\n provider,\n providers: {\n ...(baseTtsConfig.providers ?? {}),\n ...(providerConfig ? { [provider]: { ...(baseTtsConfig.providers?.[provider] ?? {}), ...providerConfig } } : {}),\n },\n fallback: { enabled: false, order: [provider] },\n };\n\n if (!isTTSAvailable(ttsConfig)) {\n return c.json({\n ok: false,\n error: { message: `TTS provider \"${provider}\" is not configured.` },\n }, 503);\n }\n\n try {\n const startedAt = Date.now();\n const result = await speak(text, ttsConfig, {\n appConfig: config,\n parseDirectives: false,\n tts: {\n ...(typeof body.model === 'string' && body.model.trim() ? { model: body.model.trim() } : {}),\n ...(typeof body.voice === 'string' && body.voice.trim() ? { voice: body.voice.trim() } : {}),\n },\n });\n if (!result.audio.length) {\n throw new Error(`TTS provider \"${result.provider}\" returned empty audio`);\n }\n const mimeType =\n result.format === 'opus' || result.format === 'ogg'\n ? 'audio/ogg'\n : result.format === 'mp3' || result.format === 'mpeg'\n ? 'audio/mpeg'\n : result.format === 'wav'\n ? 'audio/wav'\n : `audio/${result.format}`;\n return c.json({\n ok: true,\n payload: {\n audio: result.audio.toString('base64'),\n mimeType,\n format: result.format,\n provider: result.provider,\n latencyMs: Date.now() - startedAt,\n audioSize: result.audio.length,\n },\n });\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n log.error({ errorMessage: msg, provider }, 'Voice TTS test failed');\n return c.json({ ok: false, error: { message: `TTS test failed: ${msg}` } }, 502);\n }\n });\n\n /**\n * POST /api/voice/transcribe\n *\n * Body: { audio: string (base64), mimeType: string, language?: string }\n * Response: { ok: true, payload: { raw: string, refined?: string, language?: string } }\n */\n authenticated.post('/api/voice/transcribe', async (c) => {\n let body: { audio?: string; mimeType?: string; language?: string } = {};\n try {\n body = (await c.req.json()) as typeof body;\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid JSON body' } }, 400);\n }\n\n const { audio, mimeType, language } = body;\n if (!audio || typeof audio !== 'string') {\n return c.json({ ok: false, error: { message: 'Missing required field: audio (base64)' } }, 400);\n }\n if (!mimeType || typeof mimeType !== 'string') {\n return c.json({ ok: false, error: { message: 'Missing required field: mimeType' } }, 400);\n }\n\n // Decode base64 audio\n let audioBuffer: Buffer;\n try {\n audioBuffer = Buffer.from(audio, 'base64');\n } catch {\n return c.json({ ok: false, error: { message: 'Invalid base64 audio data' } }, 400);\n }\n\n if (audioBuffer.length === 0) {\n return c.json({ ok: false, error: { message: 'Empty audio data' } }, 400);\n }\n if (audioBuffer.length > MAX_AUDIO_BYTES) {\n return c.json({ ok: false, error: { message: 'Audio data exceeds 25 MB limit' } }, 400);\n }\n\n // Resolve STT config from app config\n const config = service.currentConfig as Config;\n const sttConfigRaw = config.tools?.media?.audio;\n const sttConfig = mergeSttConfigFromAppConfig(sttConfigRaw, config.tools?.media);\n\n if (!isSTTAvailable(sttConfig)) {\n return c.json({\n ok: false,\n error: { message: 'STT is not configured. Enable STT in gateway config (tools.media.audio).' },\n }, 503);\n }\n\n // Run STT\n let raw: string;\n let detectedLanguage: string | undefined;\n try {\n const result = await transcribe(audioBuffer, sttConfig, {\n language: language || (sttConfig.provider === 'alibaba' ? 'zh' : undefined),\n });\n raw = result.text;\n detectedLanguage = result.language ?? language;\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n log.error({ errorMessage: msg }, 'Voice transcription failed');\n return c.json({ ok: false, error: { message: `Transcription failed: ${msg}` } }, 502);\n }\n\n if (!raw.trim()) {\n return c.json({\n ok: true,\n payload: { raw: '', language: detectedLanguage },\n });\n }\n\n // Run LLM refine (auto, best-effort)\n const refined = await refineTranscript(raw, config);\n\n return c.json({\n ok: true,\n payload: {\n raw,\n ...(refined ? { refined } : {}),\n ...(detectedLanguage ? { language: detectedLanguage } : {}),\n },\n });\n });\n}\n"],"mappings":"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"}
@@ -1,13 +1,14 @@
1
1
  import { init_agent_scope, resolveDefaultAgentId } from "../../../agent/agent-scope.js";
2
- import { createWorkflowCatalog } from "../../../agent/workflow/catalog.js";
3
2
  import { resolveProjectAgentId } from "../../../projects/project-agent.js";
4
3
  import "../../../projects/index.js";
5
- import { messagesToClientHistory } from "../../../session/client-history.js";
6
- import { buildWorkflowDefinition } from "../../../workflows/domain/definition-utils.js";
7
4
  import { validateWorkflowDefinitionInput } from "../../../workflows/domain/validation.js";
5
+ import { WorkflowNameConflictError, WorkflowRevisionConflictError, createWorkflowCatalog } from "../../../agent/workflow/catalog.js";
6
+ import { messagesToClientHistory } from "../../../session/client-history.js";
8
7
  import "../../../workflows/domain/index.js";
9
8
  import { resolveWorkflowRunArtifactsDir } from "../../../workflows/store/paths.js";
10
9
  import { WorkflowDraftService } from "../../../workflows/draft/workflow-draft-service.js";
10
+ import { WorkflowDraftConflictError, WorkflowDraftStore } from "../../../workflows/authoring/workflow-draft-store.js";
11
+ import "../../../workflows/authoring/index.js";
11
12
  import "../../../workflows/draft/index.js";
12
13
  import { basename, join } from "node:path";
13
14
  import { readFile, stat } from "node:fs/promises";
@@ -20,7 +21,7 @@ function registerWorkflowRoutes(authenticated, deps) {
20
21
  const catalog = createWorkflowCatalog();
21
22
  const definitions = catalog.list().map((entry) => {
22
23
  try {
23
- return toWorkflowDefinition(catalog.load(entry.name));
24
+ return catalog.load(entry.name);
24
25
  } catch {
25
26
  return null;
26
27
  }
@@ -31,7 +32,7 @@ function registerWorkflowRoutes(authenticated, deps) {
31
32
  const id = c.req.param("id");
32
33
  const catalog = createWorkflowCatalog();
33
34
  try {
34
- const definition = toWorkflowDefinition(catalog.load(id));
35
+ const definition = catalog.load(id);
35
36
  return c.json({ definition });
36
37
  } catch (err) {
37
38
  return c.json({ error: err instanceof Error ? err.message : "Workflow definition not found" }, 404);
@@ -41,11 +42,11 @@ function registerWorkflowRoutes(authenticated, deps) {
41
42
  const body = await readJsonBody(c.req.raw);
42
43
  const result = validateWorkflowDefinitionInput({
43
44
  name: body.name,
44
- script: body.script
45
+ graph: body.graph
45
46
  });
46
47
  return c.json(result);
47
48
  });
48
- authenticated.post("/api/workflows/definitions/draft", async (c) => {
49
+ authenticated.post("/api/workflows/definitions/generate", async (c) => {
49
50
  const body = await readJsonBody(c.req.raw);
50
51
  const prompt = body.prompt?.trim();
51
52
  if (!prompt) return c.json({ error: "prompt is required" }, 400);
@@ -57,7 +58,7 @@ function registerWorkflowRoutes(authenticated, deps) {
57
58
  agentId,
58
59
  language: body.language,
59
60
  mode: body.mode,
60
- existingScript: body.existingScript,
61
+ existingGraph: body.existingGraph,
61
62
  constraints: body.constraints
62
63
  }, c.req.raw.signal);
63
64
  return c.json({ draft }, 201);
@@ -67,31 +68,146 @@ function registerWorkflowRoutes(authenticated, deps) {
67
68
  });
68
69
  authenticated.post("/api/workflows/definitions", async (c) => {
69
70
  const body = await readJsonBody(c.req.raw);
71
+ if (!Number.isSafeInteger(body.expectedRevision) || body.expectedRevision < 0) return c.json({ error: "expectedRevision is required" }, 400);
70
72
  const validation = validateWorkflowDefinitionInput({
71
73
  name: body.name,
72
- script: body.script
74
+ graph: body.graph
73
75
  });
74
76
  if (!validation.valid) return c.json({
75
77
  error: validation.errors[0]?.message ?? "Invalid workflow definition",
76
78
  validation
77
79
  }, 400);
78
80
  const name = body.name?.trim() ?? "";
79
- const script = body.script ?? "";
80
81
  const catalog = createWorkflowCatalog();
81
82
  try {
82
- catalog.save(name, script);
83
- const definition = toWorkflowDefinition(catalog.load(name));
84
- return c.json({ definition }, 201);
83
+ const { definition } = catalog.save({
84
+ name,
85
+ graph: body.graph,
86
+ manifest: body.manifest,
87
+ expectedRevision: body.expectedRevision,
88
+ intent: body.expectedRevision === 0 ? "create" : "update"
89
+ });
90
+ return c.json({ definition }, body.expectedRevision === 0 ? 201 : 200);
85
91
  } catch (err) {
92
+ if (err instanceof WorkflowNameConflictError) return c.json({
93
+ error: `Workflow name "${err.workflowName}" is already in use.`,
94
+ code: "WORKFLOW_NAME_EXISTS",
95
+ name: err.workflowName,
96
+ currentRevision: err.currentRevision,
97
+ suggestedName: suggestAvailableWorkflowName(err.workflowName, catalog.list().map((entry) => entry.name))
98
+ }, 409);
99
+ if (err instanceof WorkflowRevisionConflictError) return c.json({
100
+ error: err.message,
101
+ code: "WORKFLOW_REVISION_CONFLICT",
102
+ currentRevision: err.currentRevision
103
+ }, 409);
86
104
  return c.json({ error: err instanceof Error ? err.message : "Failed to save workflow" }, 400);
87
105
  }
88
106
  });
107
+ authenticated.put("/api/workflows/definitions/:id", async (c) => {
108
+ const id = c.req.param("id").trim();
109
+ const body = await readJsonBody(c.req.raw);
110
+ if (!Number.isSafeInteger(body.expectedRevision) || body.expectedRevision < 1) return c.json({ error: "expectedRevision is required" }, 400);
111
+ const validation = validateWorkflowDefinitionInput({
112
+ name: id,
113
+ graph: body.graph
114
+ });
115
+ if (!validation.valid) return c.json({
116
+ error: validation.errors[0]?.message ?? "Invalid workflow definition",
117
+ validation
118
+ }, 400);
119
+ const catalog = createWorkflowCatalog();
120
+ try {
121
+ const { definition } = catalog.save({
122
+ name: id,
123
+ graph: body.graph,
124
+ manifest: body.manifest,
125
+ expectedRevision: body.expectedRevision,
126
+ intent: "update"
127
+ });
128
+ return c.json({ definition });
129
+ } catch (err) {
130
+ if (err instanceof WorkflowRevisionConflictError) return c.json({
131
+ error: err.message,
132
+ code: "WORKFLOW_REVISION_CONFLICT",
133
+ currentRevision: err.currentRevision
134
+ }, 409);
135
+ return c.json({ error: err instanceof Error ? err.message : "Failed to save workflow" }, 400);
136
+ }
137
+ });
138
+ authenticated.get("/api/workflows/definitions/:id/revisions", (c) => {
139
+ const id = c.req.param("id");
140
+ try {
141
+ return c.json({ revisions: createWorkflowCatalog().listRevisions(id) });
142
+ } catch (err) {
143
+ return c.json({ error: err instanceof Error ? err.message : "Failed to list workflow revisions" }, 400);
144
+ }
145
+ });
146
+ authenticated.get("/api/workflows/definitions/:id/revisions/:revision", (c) => {
147
+ const id = c.req.param("id");
148
+ const revision = Number.parseInt(c.req.param("revision"), 10);
149
+ try {
150
+ return c.json({ definition: createWorkflowCatalog().loadRevision(id, revision) });
151
+ } catch (err) {
152
+ return c.json({ error: err instanceof Error ? err.message : "Workflow revision not found" }, 404);
153
+ }
154
+ });
155
+ authenticated.post("/api/workflows/definitions/:id/revisions/:revision/restore", async (c) => {
156
+ const id = c.req.param("id");
157
+ const revision = Number.parseInt(c.req.param("revision"), 10);
158
+ const body = await readJsonBody(c.req.raw);
159
+ if (!Number.isSafeInteger(body.expectedRevision)) return c.json({ error: "expectedRevision is required" }, 400);
160
+ try {
161
+ const { definition } = createWorkflowCatalog().restore(id, revision, body.expectedRevision);
162
+ return c.json({ definition }, 201);
163
+ } catch (err) {
164
+ if (err instanceof WorkflowRevisionConflictError) return c.json({
165
+ error: err.message,
166
+ currentRevision: err.currentRevision
167
+ }, 409);
168
+ return c.json({ error: err instanceof Error ? err.message : "Failed to restore workflow revision" }, 400);
169
+ }
170
+ });
171
+ authenticated.get("/api/workflows/drafts", (c) => {
172
+ const workflowName = c.req.query("workflowName")?.trim();
173
+ return c.json({ drafts: new WorkflowDraftStore().list(workflowName) });
174
+ });
175
+ authenticated.get("/api/workflows/drafts/:draftId", (c) => {
176
+ try {
177
+ const draft = new WorkflowDraftStore().get(c.req.param("draftId"));
178
+ return draft ? c.json({ draft }) : c.json({ error: "Workflow draft not found" }, 404);
179
+ } catch (err) {
180
+ return c.json({ error: err instanceof Error ? err.message : "Failed to load workflow draft" }, 400);
181
+ }
182
+ });
183
+ authenticated.post("/api/workflows/drafts", async (c) => {
184
+ const body = await readJsonBody(c.req.raw);
185
+ try {
186
+ const draft = new WorkflowDraftStore().save(body);
187
+ return c.json({ draft }, body.id ? 200 : 201);
188
+ } catch (err) {
189
+ if (err instanceof WorkflowDraftConflictError) return c.json({
190
+ error: err.message,
191
+ currentUpdatedAtMs: err.currentUpdatedAtMs
192
+ }, 409);
193
+ return c.json({ error: err instanceof Error ? err.message : "Failed to save workflow draft" }, 400);
194
+ }
195
+ });
196
+ authenticated.delete("/api/workflows/drafts/:draftId", (c) => {
197
+ try {
198
+ return new WorkflowDraftStore().remove(c.req.param("draftId")) ? c.json({ removed: true }) : c.json({ error: "Workflow draft not found" }, 404);
199
+ } catch (err) {
200
+ return c.json({ error: err instanceof Error ? err.message : "Failed to delete workflow draft" }, 400);
201
+ }
202
+ });
89
203
  authenticated.delete("/api/workflows/definitions/:id", (c) => {
90
204
  const id = c.req.param("id").trim();
91
205
  if (!id) return c.json({ error: "id is required" }, 400);
92
206
  const catalog = createWorkflowCatalog();
93
207
  try {
94
208
  if (!catalog.remove(id)) return c.json({ error: "User workflow not found or cannot delete built-in workflow" }, 404);
209
+ const drafts = new WorkflowDraftStore().list(id);
210
+ for (const draft of drafts) new WorkflowDraftStore().remove(draft.id);
95
211
  return c.json({ removed: true });
96
212
  } catch (err) {
97
213
  return c.json({ error: err instanceof Error ? err.message : "Failed to delete workflow" }, 400);
@@ -332,15 +448,6 @@ function getAgentId(rawAgentId, config) {
332
448
  if (trimmed) return trimmed;
333
449
  return resolveDefaultAgentId(config);
334
450
  }
335
- function toWorkflowDefinition(loaded) {
336
- return buildWorkflowDefinition({
337
- name: loaded.name,
338
- source: loaded.source,
339
- script: loaded.script,
340
- meta: loaded.meta,
341
- manifest: loaded.manifest
342
- });
343
- }
344
451
  function buildWorkflowStats(runs) {
345
452
  const activeStatuses = new Set(["queued", "running"]);
346
453
  const succeededStatuses = new Set(["succeeded"]);
@@ -387,6 +494,14 @@ function normalizePositiveInteger(value) {
387
494
  if (typeof value !== "number" || !Number.isFinite(value) || value < 1) return;
388
495
  return Math.floor(value);
389
496
  }
497
+ function suggestAvailableWorkflowName(name, existingNames) {
498
+ const used = new Set(existingNames);
499
+ for (let suffix = 2; suffix < 1e3; suffix += 1) {
500
+ const candidate = `${name}_${suffix}`;
501
+ if (!used.has(candidate)) return candidate;
502
+ }
503
+ return `${name}_${Date.now()}`;
504
+ }
390
505
  function findWorkflowArtifact(view, artifactId) {
391
506
  return [...view.artifacts ?? [], ...extractResultArtifacts(view.run?.result)].find((artifact) => artifact.id === artifactId) ?? null;
392
507
  }