@xopcai/xopc 0.0.142 → 0.0.144

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 (622) hide show
  1. package/README.md +1 -1
  2. package/dist/browser-ext/manifest.json +1 -1
  3. package/dist/extensions/feishu/src/workflow-progress.js +1 -1
  4. package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
  5. package/dist/extensions/telegram/src/inbound-processor.js +1 -1
  6. package/dist/extensions/telegram/src/plugin.js +1 -1
  7. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  8. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  9. package/dist/extensions/telegram/xopc.extension.json +1 -1
  10. package/dist/extensions/weixin/src/api/api.js +1 -1
  11. package/dist/extensions/weixin/src/plugin.js +1 -1
  12. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  13. package/dist/gateway/static/root/assets/activity-center-store-jITiX2vJ.js +1 -0
  14. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BawPxiu5.js → agent-avatar-dicebear-EAVnrCAs.js} +1 -1
  15. package/dist/gateway/static/root/assets/agents-5rTuJOtT.js +2 -0
  16. package/dist/gateway/static/root/assets/{app-management-settings-panel-81xd1p9R.js → app-management-settings-panel-Bu568NpC.js} +1 -1
  17. package/dist/gateway/static/root/assets/{appearance-settings-DYeQsYU8.js → appearance-settings-DSkm9bp_.js} +1 -1
  18. package/dist/gateway/static/root/assets/apps-page-DWetalKp.js +1 -0
  19. package/dist/gateway/static/root/assets/{archive-plugin-D_oa7oti.js → archive-plugin-C99N0vV6.js} +1 -1
  20. package/dist/gateway/static/root/assets/{attachment-load-Cd-bwI2N.js → attachment-load-CHTDqME5.js} +1 -1
  21. package/dist/gateway/static/root/assets/automation-suggestion-card-CBt6U3-S.js +1 -0
  22. package/dist/gateway/static/root/assets/automations-page-ICUfxeOz.js +4 -0
  23. package/dist/gateway/static/root/assets/{binary-plugins-O8svLKWw.js → binary-plugins-BRtxOLlM.js} +1 -1
  24. package/dist/gateway/static/root/assets/block-editor-CUlXfgXd.js +184 -0
  25. package/dist/gateway/static/root/assets/browser-settings-page-D7Bj4MKi.js +8 -0
  26. package/dist/gateway/static/root/assets/{capability-presets-api-dJy1Eqgx.js → capability-presets-api-Bg1ntFSD.js} +1 -1
  27. package/dist/gateway/static/root/assets/capability-presets-settings-panel-C-8I-Ktn.js +2 -0
  28. package/dist/gateway/static/root/assets/{channel-recipient-api-Bfuhp2ty.js → channel-recipient-api-DuulnhIj.js} +1 -1
  29. package/dist/gateway/static/root/assets/channels-settings-Dm5EqQyK.js +1 -0
  30. package/dist/gateway/static/root/assets/channels-status-swr-B5lVrUsN.js +1 -0
  31. package/dist/gateway/static/root/assets/check-BODqo66o.js +1 -0
  32. package/dist/gateway/static/root/assets/chunk-QUQL4437-DXsxWP7r.js +4 -0
  33. package/dist/gateway/static/root/assets/circle-alert-RzVebuX2.js +1 -0
  34. package/dist/gateway/static/root/assets/connectors-page-BOzjh-OK.js +2 -0
  35. package/dist/gateway/static/root/assets/{desktop-pet-DFMfIb5F.js → desktop-pet-C-Drhqyk.js} +1 -1
  36. package/dist/gateway/static/root/assets/desktop-pet-settings-CRGiolqF.js +1 -0
  37. package/dist/gateway/static/root/assets/{directory-picker-path-field-BrYt1gAr.js → directory-picker-path-field-Dw1L3M84.js} +1 -1
  38. package/dist/gateway/static/root/assets/dist-SwiI0Xu3.js +1 -0
  39. package/dist/gateway/static/root/assets/dreaming-settings-CF21cbjo.js +3 -0
  40. package/dist/gateway/static/root/assets/{extension-debug-page-Bh630pLD.js → extension-debug-page-Dcl8LJG_.js} +1 -1
  41. package/dist/gateway/static/root/assets/extension-page-i_BXmO_x.js +1 -0
  42. package/dist/gateway/static/root/assets/extension-settings-page-CWIi7xsn.js +1 -0
  43. package/dist/gateway/static/root/assets/{fetch-B1WtuprY.js → fetch-8QNN25Sh.js} +1 -1
  44. package/dist/gateway/static/root/assets/{gateway-config-api-De2N821l.js → gateway-config-api-2sLP2kkA.js} +1 -1
  45. package/dist/gateway/static/root/assets/gateway-settings-DMHiZc-2.js +1 -0
  46. package/dist/gateway/static/root/assets/{gateway-startup-retry-nEujFSDj.js → gateway-startup-retry-5YBnS9Fj.js} +1 -1
  47. package/dist/gateway/static/root/assets/goal-create-dialog-CAODVDiA.js +1 -0
  48. package/dist/gateway/static/root/assets/goal-detail-page-_d4DjmeX.js +4 -0
  49. package/dist/gateway/static/root/assets/{goals-config-api-DUy3eEse.js → goals-config-api-B4qeLKQS.js} +1 -1
  50. package/dist/gateway/static/root/assets/goals-page-lgsop664.js +2 -0
  51. package/dist/gateway/static/root/assets/goals-settings-Dx_1ZNgb.js +1 -0
  52. package/dist/gateway/static/root/assets/heartbeat-settings-DeTseEk_.js +1 -0
  53. package/dist/gateway/static/root/assets/index-CphxClbs.css +1 -0
  54. package/dist/gateway/static/root/assets/index-VWvztcst.js +257 -0
  55. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CVIwwM15.js → keyboard-shortcuts-settings-BpwpMmlk.js} +1 -1
  56. package/dist/gateway/static/root/assets/logs-page-9_hbTg3j.js +7 -0
  57. package/dist/gateway/static/root/assets/{markdown-split-B_6us9j7.js → markdown-split-BTRFTK0w.js} +1 -1
  58. package/dist/gateway/static/root/assets/{media-plugins-D_fryIyj.js → media-plugins-BABfIZPU.js} +1 -1
  59. package/dist/gateway/static/root/assets/messages-CzKxM6I4.js +5 -0
  60. package/dist/gateway/static/root/assets/models-hub-panel-B1CUvZxh.js +2 -0
  61. package/dist/gateway/static/root/assets/notes-page-88QBHW9a.js +1 -0
  62. package/dist/gateway/static/root/assets/notes-workbench-CerZOeLW.js +2 -0
  63. package/dist/gateway/static/root/assets/{page-tabs-D_8jGlqx.js → page-tabs-je95DZOf.js} +1 -1
  64. package/dist/gateway/static/root/assets/{preview-open-alternatives-BBLMK8Mp.js → preview-open-alternatives-BJbwi7Rc.js} +1 -1
  65. package/dist/gateway/static/root/assets/project-detail-page-BmrApldl.js +1 -0
  66. package/dist/gateway/static/root/assets/projects-page-tTn-k76N.js +1 -0
  67. package/dist/gateway/static/root/assets/remote-access-hub-DeA2-pOi.js +1 -0
  68. package/dist/gateway/static/root/assets/{save-bar-controls-DVS3FR5r.js → save-bar-controls-qWMQ9mod.js} +1 -1
  69. package/dist/gateway/static/root/assets/{schedule-field-D6vKd6-T.js → schedule-field-kxd270Gs.js} +1 -1
  70. package/dist/gateway/static/root/assets/{schema-form-BPy4lbIh.js → schema-form-DLnD-MuD.js} +1 -1
  71. package/dist/gateway/static/root/assets/sessions-page-D4kvvcL1.js +1 -0
  72. package/dist/gateway/static/root/assets/settings-advanced-gate-CI1OG4gq.js +1 -0
  73. package/dist/gateway/static/root/assets/{settings-collapsible-section-WzdikxPt.js → settings-collapsible-section-DQprvu5J.js} +1 -1
  74. package/dist/gateway/static/root/assets/{settings-form-section-CvfzhBV-.js → settings-form-section-Cqq7Y98y.js} +1 -1
  75. package/dist/gateway/static/root/assets/{settings-loading-skeleton-BxR-Ulhi.js → settings-loading-skeleton-b6rXULL5.js} +1 -1
  76. package/dist/gateway/static/root/assets/settings-page-BtBVz3cX.js +1 -0
  77. package/dist/gateway/static/root/assets/{settings-page-layout-CKefvbYi.js → settings-page-layout-BNJbtklV.js} +1 -1
  78. package/dist/gateway/static/root/assets/setup-status-panel-cmclUJzS.js +1 -0
  79. package/dist/gateway/static/root/assets/share-preview-page--zO-A1W1.js +2 -0
  80. package/dist/gateway/static/root/assets/shares-settings-DNJvqA67.js +1 -0
  81. package/dist/gateway/static/root/assets/skill-reload-api-DWr_0Xgn.js +1 -0
  82. package/dist/gateway/static/root/assets/skills-page-DEGsTbJx.js +2 -0
  83. package/dist/gateway/static/root/assets/{system-settings-panel-BokgAgf7.js → system-settings-panel-Cq9J7i7v.js} +1 -1
  84. package/dist/gateway/static/root/assets/{typed-models-lib-BwHlNL3L.js → typed-models-lib-CdSwi1gT.js} +1 -1
  85. package/dist/gateway/static/root/assets/{use-channel-catalog-DR11ap3A.js → use-channel-catalog-COXIfXcl.js} +1 -1
  86. package/dist/gateway/static/root/assets/user-context-page-C-V73ZaJ.js +1 -0
  87. package/dist/gateway/static/root/assets/user-profile-fields-editor-B1cxoGkh.js +1 -0
  88. package/dist/gateway/static/root/assets/user-profile-settings-panel-B8hlamVB.js +1 -0
  89. package/dist/gateway/static/root/assets/{utils-BKUWB-TT.js → utils-Dx01V8qF.js} +1 -1
  90. package/dist/gateway/static/root/assets/voice-api-key-field-DGpIUelZ.js +1 -0
  91. package/dist/gateway/static/root/assets/with-selector-aYPsXwdl.js +1 -0
  92. package/dist/gateway/static/root/assets/work-item-detail-page-fzWTxF26.js +1 -0
  93. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-CL_rnAUB.js → workflow-run-setup-panel-Dt_x8LGg.js} +2 -2
  94. package/dist/gateway/static/root/assets/workflows-page-Bg02zEUh.js +11 -0
  95. package/dist/gateway/static/root/assets/workflows-page-DLioOiRN.css +1 -0
  96. package/dist/gateway/static/root/connector-icons/README.md +11 -0
  97. package/dist/gateway/static/root/connector-icons/airtable.svg +13 -0
  98. package/dist/gateway/static/root/connector-icons/asana.svg +15 -0
  99. package/dist/gateway/static/root/connector-icons/brave-search.svg +1 -0
  100. package/dist/gateway/static/root/connector-icons/clickup.svg +19 -0
  101. package/dist/gateway/static/root/connector-icons/composio.svg +266 -0
  102. package/dist/gateway/static/root/connector-icons/discord.svg +15 -0
  103. package/dist/gateway/static/root/connector-icons/dropbox.svg +152 -0
  104. package/dist/gateway/static/root/connector-icons/excel.svg +56 -0
  105. package/dist/gateway/static/root/connector-icons/fetch.svg +6 -0
  106. package/dist/gateway/static/root/connector-icons/figma.svg +178 -0
  107. package/dist/gateway/static/root/connector-icons/filesystem.svg +6 -0
  108. package/dist/gateway/static/root/connector-icons/github.svg +10 -0
  109. package/dist/gateway/static/root/connector-icons/gmail.svg +3 -0
  110. package/dist/gateway/static/root/connector-icons/google-calendar.svg +3 -0
  111. package/dist/gateway/static/root/connector-icons/google-docs.svg +25 -0
  112. package/dist/gateway/static/root/connector-icons/google-drive.svg +25 -0
  113. package/dist/gateway/static/root/connector-icons/google-sheets.svg +1 -0
  114. package/dist/gateway/static/root/connector-icons/hubspot.svg +142 -0
  115. package/dist/gateway/static/root/connector-icons/jira.svg +15 -0
  116. package/dist/gateway/static/root/connector-icons/linear.svg +5 -0
  117. package/dist/gateway/static/root/connector-icons/memory.svg +5 -0
  118. package/dist/gateway/static/root/connector-icons/microsoft-teams.svg +33 -0
  119. package/dist/gateway/static/root/connector-icons/notion.svg +5 -0
  120. package/dist/gateway/static/root/connector-icons/one-drive.svg +13 -0
  121. package/dist/gateway/static/root/connector-icons/outlook.svg +76 -0
  122. package/dist/gateway/static/root/connector-icons/playwright.svg +9 -0
  123. package/dist/gateway/static/root/connector-icons/salesforce.svg +17 -0
  124. package/dist/gateway/static/root/connector-icons/sequential-thinking.svg +8 -0
  125. package/dist/gateway/static/root/connector-icons/shopify.svg +5 -0
  126. package/dist/gateway/static/root/connector-icons/slack.svg +9 -0
  127. package/dist/gateway/static/root/connector-icons/spotify.svg +43 -0
  128. package/dist/gateway/static/root/connector-icons/stripe.svg +11 -0
  129. package/dist/gateway/static/root/connector-icons/telegram.svg +130 -0
  130. package/dist/gateway/static/root/connector-icons/time.svg +6 -0
  131. package/dist/gateway/static/root/connector-icons/todoist.svg +277 -0
  132. package/dist/gateway/static/root/connector-icons/trello.svg +19 -0
  133. package/dist/gateway/static/root/connector-icons/twitter.svg +128 -0
  134. package/dist/gateway/static/root/connector-icons/whatsapp.svg +61 -0
  135. package/dist/gateway/static/root/connector-icons/youtube.svg +11 -0
  136. package/dist/gateway/static/root/index.html +10 -7
  137. package/dist/package.js +1 -1
  138. package/dist/src/activity/emitter.js +1 -1
  139. package/dist/src/agent/agent-manager.d.ts +2 -0
  140. package/dist/src/agent/agent-manager.js +12 -4
  141. package/dist/src/agent/agent-manager.js.map +1 -1
  142. package/dist/src/agent/background-review/prompts.d.ts +1 -1
  143. package/dist/src/agent/background-review/prompts.js +3 -2
  144. package/dist/src/agent/background-review/prompts.js.map +1 -1
  145. package/dist/src/agent/code-intelligence/binary.js +1 -1
  146. package/dist/src/agent/context/project-context.js +2 -2
  147. package/dist/src/agent/context/workspace-seed.js +2 -2
  148. package/dist/src/agent/embedded/run-for-session.js +1 -1
  149. package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
  150. package/dist/src/agent/embedded/xopc-tools-bridge.d.ts +9 -0
  151. package/dist/src/agent/embedded/xopc-tools-bridge.js +71 -3
  152. package/dist/src/agent/embedded/xopc-tools-bridge.js.map +1 -1
  153. package/dist/src/agent/goals/post-turn.js +7 -6
  154. package/dist/src/agent/goals/post-turn.js.map +1 -1
  155. package/dist/src/agent/ipc/bus.js +1 -1
  156. package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
  157. package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
  158. package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
  159. package/dist/src/agent/mcp/mcp-transport.js +5 -2
  160. package/dist/src/agent/mcp/mcp-transport.js.map +1 -1
  161. package/dist/src/agent/memory/context/planner.d.ts +1 -0
  162. package/dist/src/agent/memory/context/planner.js +60 -14
  163. package/dist/src/agent/memory/context/planner.js.map +1 -1
  164. package/dist/src/agent/memory/context/types.d.ts +3 -1
  165. package/dist/src/agent/memory/lifecycle.d.ts +11 -0
  166. package/dist/src/agent/memory/lifecycle.js +50 -0
  167. package/dist/src/agent/memory/lifecycle.js.map +1 -0
  168. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  169. package/dist/src/agent/memory/source-origin.d.ts +3 -0
  170. package/dist/src/agent/memory/source-origin.js +19 -0
  171. package/dist/src/agent/memory/source-origin.js.map +1 -0
  172. package/dist/src/agent/memory/understanding/service.js +5 -0
  173. package/dist/src/agent/memory/understanding/service.js.map +1 -1
  174. package/dist/src/agent/memory/user-context-coordinator.js +7 -2
  175. package/dist/src/agent/memory/user-context-coordinator.js.map +1 -1
  176. package/dist/src/agent/models/manager.js +1 -1
  177. package/dist/src/agent/orchestration/agent-orchestrator.js +1 -1
  178. package/dist/src/agent/prompt/sections/behavior.d.ts +2 -0
  179. package/dist/src/agent/prompt/sections/behavior.js +30 -1
  180. package/dist/src/agent/prompt/sections/behavior.js.map +1 -1
  181. package/dist/src/agent/prompt/sections/tooling.js +1 -1
  182. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  183. package/dist/src/agent/prompt/service-prompt-builder.js +8 -1
  184. package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
  185. package/dist/src/agent/prompt/system-prompt.d.ts +2 -0
  186. package/dist/src/agent/prompt/system-prompt.js +6 -3
  187. package/dist/src/agent/prompt/system-prompt.js.map +1 -1
  188. package/dist/src/agent/service/process-direct-streaming.js +22 -0
  189. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  190. package/dist/src/agent/service.d.ts +2 -0
  191. package/dist/src/agent/service.js +12 -6
  192. package/dist/src/agent/service.js.map +1 -1
  193. package/dist/src/agent/session/session-inspector.js +2 -2
  194. package/dist/src/agent/skills/hub-pull.js +1 -1
  195. package/dist/src/agent/starter-agents.js +1 -1
  196. package/dist/src/agent/starter-agents.js.map +1 -1
  197. package/dist/src/agent/tool-manuals/xopc-use.d.ts +1 -1
  198. package/dist/src/agent/tool-manuals/xopc-use.js +1 -1
  199. package/dist/src/agent/tool-manuals/xopc-use.js.map +1 -1
  200. package/dist/src/agent/tools/composio-tool.d.ts +18 -5
  201. package/dist/src/agent/tools/composio-tool.js +252 -35
  202. package/dist/src/agent/tools/composio-tool.js.map +1 -1
  203. package/dist/src/agent/tools/factory.js +7 -3
  204. package/dist/src/agent/tools/factory.js.map +1 -1
  205. package/dist/src/agent/tools/goal-tool.js +2 -2
  206. package/dist/src/agent/tools/index.d.ts +1 -1
  207. package/dist/src/agent/tools/index.js +2 -2
  208. package/dist/src/agent/tools/workflow-tool.d.ts +0 -1
  209. package/dist/src/agent/tools/workflow-tool.js +4 -17
  210. package/dist/src/agent/tools/workflow-tool.js.map +1 -1
  211. package/dist/src/agent/tools/xopc-use-tool.js +1 -1
  212. package/dist/src/agent/workflow/builtins/index.d.ts +2 -28
  213. package/dist/src/agent/workflow/builtins/index.js +226 -41
  214. package/dist/src/agent/workflow/builtins/index.js.map +1 -1
  215. package/dist/src/agent/workflow/catalog.d.ts +32 -34
  216. package/dist/src/agent/workflow/catalog.js +158 -154
  217. package/dist/src/agent/workflow/catalog.js.map +1 -1
  218. package/dist/src/agent/workflow/index.d.ts +4 -6
  219. package/dist/src/agent/workflow/index.js +2 -5
  220. package/dist/src/agent/workflow/snapshot.d.ts +2 -2
  221. package/dist/src/agent/workflow/snapshot.js +2 -2
  222. package/dist/src/agent/workflow/snapshot.js.map +1 -1
  223. package/dist/src/agent/workflow/structured-output-tool.d.ts +2 -2
  224. package/dist/src/agent/workflow/structured-output-tool.js +2 -2
  225. package/dist/src/agent/workflow/structured-output-tool.js.map +1 -1
  226. package/dist/src/agent/workflow/subagent-runner.js +1 -1
  227. package/dist/src/agent/workflow/types.d.ts +31 -26
  228. package/dist/src/agent/workspace-runtime/registry.js +2 -2
  229. package/dist/src/agent-manifest/index.d.ts +1 -0
  230. package/dist/src/agent-manifest/index.js +3 -1
  231. package/dist/src/agent-manifest/index.js.map +1 -1
  232. package/dist/src/agent-manifest/preset-chain.d.ts +10 -0
  233. package/dist/src/agent-manifest/preset-chain.js +32 -0
  234. package/dist/src/agent-manifest/preset-chain.js.map +1 -0
  235. package/dist/src/agent-manifest/resolver.js +3 -10
  236. package/dist/src/agent-manifest/resolver.js.map +1 -1
  237. package/dist/src/agent-manifest/schema.d.ts +4 -4
  238. package/dist/src/automations/api/routes.js +14 -2
  239. package/dist/src/automations/api/routes.js.map +1 -1
  240. package/dist/src/automations/domain/validation.d.ts +14 -14
  241. package/dist/src/automations/draft/automation-draft-validator.d.ts +3 -3
  242. package/dist/src/automations/service/action-executor.js +2 -2
  243. package/dist/src/browser/cdp-local-launcher.js +1 -1
  244. package/dist/src/browser/providers/browser-ext-install.d.ts +11 -1
  245. package/dist/src/browser/providers/browser-ext-install.js +42 -17
  246. package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
  247. package/dist/src/browser/providers/cloakbrowser.js +2 -2
  248. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  249. package/dist/src/browser/stealth.js +1 -1
  250. package/dist/src/capabilities/store-connector.d.ts +0 -1
  251. package/dist/src/capabilities/store-connector.js +4 -6
  252. package/dist/src/capabilities/store-connector.js.map +1 -1
  253. package/dist/src/chat-commands/agent-edit.js +1 -1
  254. package/dist/src/chat-commands/builtins/config.js +1 -1
  255. package/dist/src/chat-commands/builtins/goal.js +2 -2
  256. package/dist/src/chat-commands/builtins/review.js +72 -73
  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/context.js +1 -1
  261. package/dist/src/cli/commands/agent.js +1 -1
  262. package/dist/src/cli/commands/doctor/checks/database-schema.js +2 -2
  263. package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
  264. package/dist/src/cli/commands/extension-create.js +2 -2
  265. package/dist/src/cli/commands/extension-create.js.map +1 -1
  266. package/dist/src/cli/commands/extension-marketplace.js +43 -37
  267. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  268. package/dist/src/cli/commands/extension-pack.d.ts +6 -0
  269. package/dist/src/cli/commands/extension-pack.js +4 -3
  270. package/dist/src/cli/commands/extension-pack.js.map +1 -1
  271. package/dist/src/cli/commands/goal.js +2 -2
  272. package/dist/src/cli/commands/init.js +1 -1
  273. package/dist/src/cli/commands/project.js +3 -3
  274. package/dist/src/commands/agents.config.d.ts +1 -0
  275. package/dist/src/commands/agents.config.js +1 -0
  276. package/dist/src/commands/agents.config.js.map +1 -1
  277. package/dist/src/config/gateway-bind.js +1 -1
  278. package/dist/src/config/index.js +1 -1
  279. package/dist/src/config/loader.js +1 -1
  280. package/dist/src/config/models-json.js +1 -1
  281. package/dist/src/config/schema.d.ts +6 -6
  282. package/dist/src/config/schema.js +6 -22
  283. package/dist/src/config/schema.js.map +1 -1
  284. package/dist/src/config/web-patch.d.ts +1 -1
  285. package/dist/src/connectors/approval.d.ts +2 -0
  286. package/dist/src/connectors/approval.js +33 -0
  287. package/dist/src/connectors/approval.js.map +1 -0
  288. package/dist/src/connectors/auth-provider-registry.d.ts +9 -0
  289. package/dist/src/connectors/auth-provider-registry.js +17 -0
  290. package/dist/src/connectors/auth-provider-registry.js.map +1 -0
  291. package/dist/src/connectors/builtin-catalog.js +55 -116
  292. package/dist/src/connectors/builtin-catalog.js.map +1 -1
  293. package/dist/src/connectors/catalog.js +7 -2
  294. package/dist/src/connectors/catalog.js.map +1 -1
  295. package/dist/src/connectors/composio-catalog.d.ts +19 -0
  296. package/dist/src/connectors/composio-catalog.js +237 -0
  297. package/dist/src/connectors/composio-catalog.js.map +1 -0
  298. package/dist/src/connectors/composio-logo.d.ts +1 -0
  299. package/dist/src/connectors/composio-logo.js +51 -0
  300. package/dist/src/connectors/composio-logo.js.map +1 -0
  301. package/dist/src/connectors/composio-sessions.d.ts +116 -0
  302. package/dist/src/connectors/composio-sessions.js +296 -0
  303. package/dist/src/connectors/composio-sessions.js.map +1 -0
  304. package/dist/src/connectors/composio-triggers.d.ts +17 -0
  305. package/dist/src/connectors/composio-triggers.js +48 -5
  306. package/dist/src/connectors/composio-triggers.js.map +1 -1
  307. package/dist/src/connectors/composio.d.ts +31 -2
  308. package/dist/src/connectors/composio.js +374 -151
  309. package/dist/src/connectors/composio.js.map +1 -1
  310. package/dist/src/connectors/connector-memory-sync.d.ts +15 -0
  311. package/dist/src/connectors/connector-memory-sync.js +90 -0
  312. package/dist/src/connectors/connector-memory-sync.js.map +1 -0
  313. package/dist/src/connectors/install.js +35 -92
  314. package/dist/src/connectors/install.js.map +1 -1
  315. package/dist/src/connectors/instances.js +6 -2
  316. package/dist/src/connectors/instances.js.map +1 -1
  317. package/dist/src/connectors/integration-strategy.d.ts +3 -0
  318. package/dist/src/connectors/integration-strategy.js +29 -0
  319. package/dist/src/connectors/integration-strategy.js.map +1 -0
  320. package/dist/src/connectors/policy.d.ts +13 -0
  321. package/dist/src/connectors/policy.js +48 -0
  322. package/dist/src/connectors/policy.js.map +1 -0
  323. package/dist/src/connectors/providers.js +1 -1
  324. package/dist/src/connectors/runtime-adapter-registry.d.ts +25 -0
  325. package/dist/src/connectors/runtime-adapter-registry.js +154 -0
  326. package/dist/src/connectors/runtime-adapter-registry.js.map +1 -0
  327. package/dist/src/connectors/types.d.ts +113 -4
  328. package/dist/src/connectors/workflow-preflight.d.ts +20 -0
  329. package/dist/src/connectors/workflow-preflight.js +70 -0
  330. package/dist/src/connectors/workflow-preflight.js.map +1 -0
  331. package/dist/src/daemon/launchd.js +1 -1
  332. package/dist/src/daemon/systemd.js +1 -1
  333. package/dist/src/extensions/discover-extensions.js +1 -1
  334. package/dist/src/extensions/install-transaction.d.ts +16 -0
  335. package/dist/src/extensions/install-transaction.js +76 -0
  336. package/dist/src/extensions/install-transaction.js.map +1 -0
  337. package/dist/src/extensions/install.d.ts +2 -0
  338. package/dist/src/extensions/install.js +23 -1
  339. package/dist/src/extensions/install.js.map +1 -1
  340. package/dist/src/extensions/loader.js +2 -2
  341. package/dist/src/gateway/agents-admin.d.ts +2 -0
  342. package/dist/src/gateway/agents-admin.js +7 -0
  343. package/dist/src/gateway/agents-admin.js.map +1 -1
  344. package/dist/src/gateway/capability-presets-admin.d.ts +11 -0
  345. package/dist/src/gateway/capability-presets-admin.js +11 -4
  346. package/dist/src/gateway/capability-presets-admin.js.map +1 -1
  347. package/dist/src/gateway/chat-stream/mapper.js +17 -0
  348. package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
  349. package/dist/src/gateway/chat-stream/protocol.d.ts +18 -1
  350. package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -3
  351. package/dist/src/gateway/hono/lib/static-ui.js +1 -1
  352. package/dist/src/gateway/hono/routes/agents.js +3 -0
  353. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  354. package/dist/src/gateway/hono/routes/capability-presets.js +19 -1
  355. package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -1
  356. package/dist/src/gateway/hono/routes/connectors.js +188 -25
  357. package/dist/src/gateway/hono/routes/connectors.js.map +1 -1
  358. package/dist/src/gateway/hono/routes/goals.js +22 -3
  359. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  360. package/dist/src/gateway/hono/routes/home.d.ts +60 -1
  361. package/dist/src/gateway/hono/routes/home.js +244 -18
  362. package/dist/src/gateway/hono/routes/home.js.map +1 -1
  363. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  364. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  365. package/dist/src/gateway/hono/routes/memory.js +17 -4
  366. package/dist/src/gateway/hono/routes/memory.js.map +1 -1
  367. package/dist/src/gateway/hono/routes/projects.js +106 -5
  368. package/dist/src/gateway/hono/routes/projects.js.map +1 -1
  369. package/dist/src/gateway/hono/routes/public-gateway.js +93 -0
  370. package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
  371. package/dist/src/gateway/hono/routes/workflows.js +137 -22
  372. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  373. package/dist/src/gateway/hono/routes/you.d.ts +23 -0
  374. package/dist/src/gateway/hono/routes/you.js +538 -0
  375. package/dist/src/gateway/hono/routes/you.js.map +1 -0
  376. package/dist/src/gateway/hono/sse.d.ts +2 -1
  377. package/dist/src/gateway/hono/sse.js +2 -1
  378. package/dist/src/gateway/hono/sse.js.map +1 -1
  379. package/dist/src/gateway/lock.js +1 -1
  380. package/dist/src/gateway/ports.js +1 -1
  381. package/dist/src/gateway/service/marketplace-service.d.ts +13 -1
  382. package/dist/src/gateway/service/marketplace-service.js +96 -40
  383. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  384. package/dist/src/gateway/service.d.ts +2 -0
  385. package/dist/src/gateway/service.js +13 -7
  386. package/dist/src/gateway/service.js.map +1 -1
  387. package/dist/src/goals/goal-service.d.ts +7 -5
  388. package/dist/src/goals/goal-service.js +25 -13
  389. package/dist/src/goals/goal-service.js.map +1 -1
  390. package/dist/src/goals/goal-store.js +46 -7
  391. package/dist/src/goals/goal-store.js.map +1 -1
  392. package/dist/src/goals/goal-workflow-judge.js +1 -1
  393. package/dist/src/goals/types.d.ts +24 -0
  394. package/dist/src/infra/ports.js +1 -1
  395. package/dist/src/infra/ssh-tunnel.js +1 -1
  396. package/dist/src/infra/update-check.js +1 -1
  397. package/dist/src/migrations/runner.js +1 -1
  398. package/dist/src/notes/service.js +3 -3
  399. package/dist/src/notes/store.js +1 -1
  400. package/dist/src/projects/project-service.js +1 -1
  401. package/dist/src/projects/workspace.js +1 -1
  402. package/dist/src/routing/agent-session-key.js +1 -1
  403. package/dist/src/routing/resolve-route.js +1 -1
  404. package/dist/src/routing/resolve-tui-session-key.js +1 -1
  405. package/dist/src/session/init-session-turn.js +1 -1
  406. package/dist/src/session/resolve-session.js +1 -1
  407. package/dist/src/session/session-title.js +2 -2
  408. package/dist/src/session/store.js +1 -1
  409. package/dist/src/storage/sqlite/connection.js +1 -1
  410. package/dist/src/storage/sqlite/connector-repository.d.ts +49 -0
  411. package/dist/src/storage/sqlite/connector-repository.js +385 -0
  412. package/dist/src/storage/sqlite/connector-repository.js.map +1 -0
  413. package/dist/src/storage/sqlite/index.d.ts +3 -0
  414. package/dist/src/storage/sqlite/index.js +4 -1
  415. package/dist/src/storage/sqlite/migrations/030_connectors.sql +94 -0
  416. package/dist/src/storage/sqlite/migrations/031_connector_approvals.sql +24 -0
  417. package/dist/src/storage/sqlite/migrations/032_connector_webhook_deliveries.sql +15 -0
  418. package/dist/src/storage/sqlite/migrations/033_user_trust_policies.sql +6 -0
  419. package/dist/src/storage/sqlite/migrations/034_allow_global_auto_trust.sql +14 -0
  420. package/dist/src/storage/sqlite/migrations/035_user_profile_prompt_state.sql +7 -0
  421. package/dist/src/storage/sqlite/migrations/036_goal_outcome_metric.sql +12 -0
  422. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  423. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  424. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  425. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  426. package/dist/src/storage/sqlite/row-mappers.js +1 -1
  427. package/dist/src/storage/sqlite/schema.js +1 -1
  428. package/dist/src/storage/sqlite/user-profile-setup-repository.d.ts +3 -0
  429. package/dist/src/storage/sqlite/user-profile-setup-repository.js +34 -0
  430. package/dist/src/storage/sqlite/user-profile-setup-repository.js.map +1 -0
  431. package/dist/src/storage/sqlite/user-trust-repository.d.ts +3 -0
  432. package/dist/src/storage/sqlite/user-trust-repository.js +34 -0
  433. package/dist/src/storage/sqlite/user-trust-repository.js.map +1 -0
  434. package/dist/src/tui/backends/embedded-backend.js +4 -4
  435. package/dist/src/tui/clipboard-image.js +1 -1
  436. package/dist/src/tui/components/assistant-message.js +15 -0
  437. package/dist/src/tui/components/assistant-message.js.map +1 -1
  438. package/dist/src/tui/tui-agent-events.js +85 -1
  439. package/dist/src/tui/tui-agent-events.js.map +1 -1
  440. package/dist/src/tui/tui-command-formatters.js +9 -9
  441. package/dist/src/tui/tui-command-formatters.js.map +1 -1
  442. package/dist/src/tui/tui-commands.js +4 -4
  443. package/dist/src/tui/tui-startup-resources.js +1 -1
  444. package/dist/src/tui/tui.js +1 -1
  445. package/dist/src/user-context/import.d.ts +12 -0
  446. package/dist/src/user-context/import.js +48 -0
  447. package/dist/src/user-context/import.js.map +1 -0
  448. package/dist/src/user-context/profile.d.ts +37 -0
  449. package/dist/src/user-context/profile.js +165 -0
  450. package/dist/src/user-context/profile.js.map +1 -0
  451. package/dist/src/user-context/projection.d.ts +54 -0
  452. package/dist/src/user-context/projection.js +121 -0
  453. package/dist/src/user-context/projection.js.map +1 -0
  454. package/dist/src/user-context/source-recommendations.d.ts +13 -0
  455. package/dist/src/user-context/source-recommendations.js +86 -0
  456. package/dist/src/user-context/source-recommendations.js.map +1 -0
  457. package/dist/src/user-context/trust-policy.d.ts +11 -0
  458. package/dist/src/user-context/trust-policy.js +31 -0
  459. package/dist/src/user-context/trust-policy.js.map +1 -0
  460. package/dist/src/utils/index.js +1 -1
  461. package/dist/src/utils/logger/index.js +1 -1
  462. package/dist/src/utils/logger.js +1 -1
  463. package/dist/src/work-items/work-item-service.js +1 -1
  464. package/dist/src/workflows/authoring/index.d.ts +1 -0
  465. package/dist/src/workflows/authoring/index.js +2 -0
  466. package/dist/src/workflows/authoring/workflow-draft-store.d.ts +33 -0
  467. package/dist/src/workflows/authoring/workflow-draft-store.js +74 -0
  468. package/dist/src/workflows/authoring/workflow-draft-store.js.map +1 -0
  469. package/dist/src/workflows/domain/definition-utils.d.ts +6 -4
  470. package/dist/src/workflows/domain/definition-utils.js +28 -26
  471. package/dist/src/workflows/domain/definition-utils.js.map +1 -1
  472. package/dist/src/workflows/domain/definition.d.ts +79 -6
  473. package/dist/src/workflows/domain/event.d.ts +18 -2
  474. package/dist/src/workflows/domain/index.js +3 -3
  475. package/dist/src/workflows/domain/run.d.ts +16 -2
  476. package/dist/src/workflows/domain/run.js.map +1 -1
  477. package/dist/src/workflows/domain/validation.d.ts +9 -5
  478. package/dist/src/workflows/domain/validation.js +183 -40
  479. package/dist/src/workflows/domain/validation.js.map +1 -1
  480. package/dist/src/workflows/draft/workflow-draft-prompt.d.ts +2 -3
  481. package/dist/src/workflows/draft/workflow-draft-prompt.js +31 -73
  482. package/dist/src/workflows/draft/workflow-draft-prompt.js.map +1 -1
  483. package/dist/src/workflows/draft/workflow-draft-service.js +5 -9
  484. package/dist/src/workflows/draft/workflow-draft-service.js.map +1 -1
  485. package/dist/src/workflows/draft/workflow-draft-validator.js +29 -37
  486. package/dist/src/workflows/draft/workflow-draft-validator.js.map +1 -1
  487. package/dist/src/workflows/draft/workflow-draft.types.d.ts +4 -4
  488. package/dist/src/workflows/engine/projector.js +43 -1
  489. package/dist/src/workflows/engine/projector.js.map +1 -1
  490. package/dist/src/workflows/engine/workflow-engine.d.ts +2 -3
  491. package/dist/src/workflows/engine/workflow-engine.js +24 -4
  492. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  493. package/dist/src/workflows/index.js +4 -7
  494. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +1 -9
  495. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -1
  496. package/dist/src/workflows/runtime/graph-workflow-runtime.d.ts +10 -0
  497. package/dist/src/workflows/runtime/graph-workflow-runtime.js +295 -0
  498. package/dist/src/workflows/runtime/graph-workflow-runtime.js.map +1 -0
  499. package/dist/src/workflows/runtime/index.d.ts +1 -2
  500. package/dist/src/workflows/runtime/index.js +2 -5
  501. package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +5 -8
  502. package/dist/src/workflows/service/workflow-run-service.js +15 -1
  503. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  504. package/dist/src/workflows/service/workflow-run-service.types.d.ts +2 -1
  505. package/dist/src/workflows/service/workflow-session-bridge.js +3 -3
  506. package/package.json +5 -4
  507. package/dist/gateway/static/root/assets/agents-CyvCIHnB.js +0 -2
  508. package/dist/gateway/static/root/assets/apps-page-DK_Vx6nl.js +0 -1
  509. package/dist/gateway/static/root/assets/automation-suggestion-card-B1LV3YYv.js +0 -1
  510. package/dist/gateway/static/root/assets/automations-page-fzrovqhv.js +0 -4
  511. package/dist/gateway/static/root/assets/block-editor-Dhj5f4Bx.js +0 -184
  512. package/dist/gateway/static/root/assets/browser-settings-page-BDn-n-UB.js +0 -8
  513. package/dist/gateway/static/root/assets/capability-presets-settings-panel-Co5ipo_Q.js +0 -1
  514. package/dist/gateway/static/root/assets/channels-settings-BWlpaxg9.js +0 -1
  515. package/dist/gateway/static/root/assets/channels-status-swr-D_jkIZLV.js +0 -1
  516. package/dist/gateway/static/root/assets/connectors-page-BcekbW4q.js +0 -2
  517. package/dist/gateway/static/root/assets/desktop-pet-settings-BJCUuL8Y.js +0 -1
  518. package/dist/gateway/static/root/assets/dist-Mys7eFJ5.js +0 -1
  519. package/dist/gateway/static/root/assets/dreaming-settings-BN1Z2mIo.js +0 -3
  520. package/dist/gateway/static/root/assets/extension-page-B-1KxvVy.js +0 -1
  521. package/dist/gateway/static/root/assets/extension-settings-page-BF9NACI3.js +0 -1
  522. package/dist/gateway/static/root/assets/gateway-settings-DN9sNREz.js +0 -1
  523. package/dist/gateway/static/root/assets/goal-create-dialog-BpoQW8cD.js +0 -1
  524. package/dist/gateway/static/root/assets/goal-detail-page-CBRSPd0b.js +0 -4
  525. package/dist/gateway/static/root/assets/goals-page-BCcBi407.js +0 -2
  526. package/dist/gateway/static/root/assets/goals-settings-pkTXzXkh.js +0 -1
  527. package/dist/gateway/static/root/assets/heartbeat-settings-ezsufgLQ.js +0 -1
  528. package/dist/gateway/static/root/assets/index-B8s8Pq5U.css +0 -1
  529. package/dist/gateway/static/root/assets/index-DcUaXYeb.js +0 -262
  530. package/dist/gateway/static/root/assets/logs-page-DQtTRXtj.js +0 -7
  531. package/dist/gateway/static/root/assets/messages-BXNELNBa.js +0 -3
  532. package/dist/gateway/static/root/assets/models-hub-panel-BP2M9n6Q.js +0 -2
  533. package/dist/gateway/static/root/assets/notes-page-CspveYaO.js +0 -1
  534. package/dist/gateway/static/root/assets/notes-workbench-BHwzJ0OC.js +0 -2
  535. package/dist/gateway/static/root/assets/project-detail-page-Dy3rsobs.js +0 -1
  536. package/dist/gateway/static/root/assets/projects-page-CWKpPE0L.js +0 -1
  537. package/dist/gateway/static/root/assets/remote-access-hub-CqNRyXEo.js +0 -1
  538. package/dist/gateway/static/root/assets/sessions-page-MEME7ivF.js +0 -1
  539. package/dist/gateway/static/root/assets/settings-advanced-gate-JVd0qaSF.js +0 -1
  540. package/dist/gateway/static/root/assets/settings-page-DYEbB1EV.js +0 -1
  541. package/dist/gateway/static/root/assets/setup-status-panel-dWN8BJ3z.js +0 -1
  542. package/dist/gateway/static/root/assets/share-preview-page-D8foINzP.js +0 -2
  543. package/dist/gateway/static/root/assets/shares-settings-Tgbv1s7G.js +0 -1
  544. package/dist/gateway/static/root/assets/skill-reload-api-D_YK0b_Z.js +0 -1
  545. package/dist/gateway/static/root/assets/skills-page-DGytfoZK.js +0 -2
  546. package/dist/gateway/static/root/assets/toast-z0toXu32.js +0 -1
  547. package/dist/gateway/static/root/assets/user-profile-settings-panel-8YtygcJp.js +0 -1
  548. package/dist/gateway/static/root/assets/voice-api-key-field-BVH71EFf.js +0 -1
  549. package/dist/gateway/static/root/assets/work-item-detail-page-JeTE7XNM.js +0 -1
  550. package/dist/gateway/static/root/assets/workflow-start-dialog-_u8Uc1ze.js +0 -1
  551. package/dist/gateway/static/root/assets/workflows-page-ixgk_y1l.js +0 -18
  552. package/dist/src/agent/workflow/builtins/audit-repo.d.ts +0 -13
  553. package/dist/src/agent/workflow/builtins/audit-repo.js +0 -183
  554. package/dist/src/agent/workflow/builtins/audit-repo.js.map +0 -1
  555. package/dist/src/agent/workflow/builtins/client-proposal.d.ts +0 -12
  556. package/dist/src/agent/workflow/builtins/client-proposal.js +0 -164
  557. package/dist/src/agent/workflow/builtins/client-proposal.js.map +0 -1
  558. package/dist/src/agent/workflow/builtins/competitor-scan.d.ts +0 -12
  559. package/dist/src/agent/workflow/builtins/competitor-scan.js +0 -164
  560. package/dist/src/agent/workflow/builtins/competitor-scan.js.map +0 -1
  561. package/dist/src/agent/workflow/builtins/content-draft.d.ts +0 -13
  562. package/dist/src/agent/workflow/builtins/content-draft.js +0 -159
  563. package/dist/src/agent/workflow/builtins/content-draft.js.map +0 -1
  564. package/dist/src/agent/workflow/builtins/content-repurpose.d.ts +0 -11
  565. package/dist/src/agent/workflow/builtins/content-repurpose.js +0 -146
  566. package/dist/src/agent/workflow/builtins/content-repurpose.js.map +0 -1
  567. package/dist/src/agent/workflow/builtins/debug-incident.d.ts +0 -13
  568. package/dist/src/agent/workflow/builtins/debug-incident.js +0 -177
  569. package/dist/src/agent/workflow/builtins/debug-incident.js.map +0 -1
  570. package/dist/src/agent/workflow/builtins/decision-compare.d.ts +0 -13
  571. package/dist/src/agent/workflow/builtins/decision-compare.js +0 -187
  572. package/dist/src/agent/workflow/builtins/decision-compare.js.map +0 -1
  573. package/dist/src/agent/workflow/builtins/implementation-plan.d.ts +0 -12
  574. package/dist/src/agent/workflow/builtins/implementation-plan.js +0 -185
  575. package/dist/src/agent/workflow/builtins/implementation-plan.js.map +0 -1
  576. package/dist/src/agent/workflow/builtins/inbox-triage.d.ts +0 -11
  577. package/dist/src/agent/workflow/builtins/inbox-triage.js +0 -158
  578. package/dist/src/agent/workflow/builtins/inbox-triage.js.map +0 -1
  579. package/dist/src/agent/workflow/builtins/meeting-prep.d.ts +0 -12
  580. package/dist/src/agent/workflow/builtins/meeting-prep.js +0 -152
  581. package/dist/src/agent/workflow/builtins/meeting-prep.js.map +0 -1
  582. package/dist/src/agent/workflow/builtins/multi-perspective-review.d.ts +0 -14
  583. package/dist/src/agent/workflow/builtins/multi-perspective-review.js +0 -171
  584. package/dist/src/agent/workflow/builtins/multi-perspective-review.js.map +0 -1
  585. package/dist/src/agent/workflow/builtins/offer-design.d.ts +0 -12
  586. package/dist/src/agent/workflow/builtins/offer-design.js +0 -170
  587. package/dist/src/agent/workflow/builtins/offer-design.js.map +0 -1
  588. package/dist/src/agent/workflow/builtins/pr-review.d.ts +0 -12
  589. package/dist/src/agent/workflow/builtins/pr-review.js +0 -178
  590. package/dist/src/agent/workflow/builtins/pr-review.js.map +0 -1
  591. package/dist/src/agent/workflow/builtins/release-check.d.ts +0 -11
  592. package/dist/src/agent/workflow/builtins/release-check.js +0 -174
  593. package/dist/src/agent/workflow/builtins/release-check.js.map +0 -1
  594. package/dist/src/agent/workflow/builtins/research.d.ts +0 -13
  595. package/dist/src/agent/workflow/builtins/research.js +0 -188
  596. package/dist/src/agent/workflow/builtins/research.js.map +0 -1
  597. package/dist/src/agent/workflow/builtins/weekly-review.d.ts +0 -12
  598. package/dist/src/agent/workflow/builtins/weekly-review.js +0 -139
  599. package/dist/src/agent/workflow/builtins/weekly-review.js.map +0 -1
  600. package/dist/src/agent/workflow/last-run-memory.d.ts +0 -42
  601. package/dist/src/agent/workflow/last-run-memory.js +0 -60
  602. package/dist/src/agent/workflow/last-run-memory.js.map +0 -1
  603. package/dist/src/agent/workflow/lint.d.ts +0 -38
  604. package/dist/src/agent/workflow/lint.js +0 -74
  605. package/dist/src/agent/workflow/lint.js.map +0 -1
  606. package/dist/src/agent/workflow/meta-locale.d.ts +0 -12
  607. package/dist/src/agent/workflow/meta-locale.js +0 -62
  608. package/dist/src/agent/workflow/meta-locale.js.map +0 -1
  609. package/dist/src/agent/workflow/parser.d.ts +0 -20
  610. package/dist/src/agent/workflow/parser.js +0 -152
  611. package/dist/src/agent/workflow/parser.js.map +0 -1
  612. package/dist/src/agent/workflow/runtime.d.ts +0 -34
  613. package/dist/src/agent/workflow/runtime.js +0 -402
  614. package/dist/src/agent/workflow/runtime.js.map +0 -1
  615. package/dist/src/connectors/oauth.d.ts +0 -22
  616. package/dist/src/connectors/oauth.js +0 -99
  617. package/dist/src/connectors/oauth.js.map +0 -1
  618. package/dist/src/workflows/runtime/script-runtime.d.ts +0 -3
  619. package/dist/src/workflows/runtime/script-runtime.js +0 -3
  620. package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +0 -5
  621. package/dist/src/workflows/runtime/script-workflow-runtime.js +0 -15
  622. package/dist/src/workflows/runtime/script-workflow-runtime.js.map +0 -1
@@ -0,0 +1,51 @@
1
+ //#region src/connectors/composio-logo.ts
2
+ const COMPOSIO_LOGO_SLUG = /^[a-z0-9_]{1,80}$/;
3
+ const COMPOSIO_LOGO_MAX_BYTES = 512 * 1024;
4
+ const COMPOSIO_LOGO_CONTENT_TYPES = new Set([
5
+ "image/png",
6
+ "image/jpeg",
7
+ "image/webp",
8
+ "image/gif",
9
+ "image/svg+xml"
10
+ ]);
11
+ async function composioLogoResponse(toolkit) {
12
+ const slug = toolkit.trim().toLowerCase();
13
+ if (!COMPOSIO_LOGO_SLUG.test(slug)) return Response.json({
14
+ ok: false,
15
+ error: "Invalid toolkit slug."
16
+ }, { status: 400 });
17
+ const upstream = await fetch(`https://logos.composio.dev/api/${encodeURIComponent(slug)}`, {
18
+ headers: { Accept: "image/png,image/webp,image/svg+xml,image/*;q=0.8" },
19
+ redirect: "error",
20
+ signal: AbortSignal.timeout(8e3)
21
+ });
22
+ if (!upstream.ok) return Response.json({
23
+ ok: false,
24
+ error: "Connector logo is unavailable."
25
+ }, { status: 404 });
26
+ const contentType = upstream.headers.get("content-type")?.split(";")[0]?.trim().toLowerCase() ?? "";
27
+ if (!COMPOSIO_LOGO_CONTENT_TYPES.has(contentType)) return Response.json({
28
+ ok: false,
29
+ error: "Connector logo has an unsupported format."
30
+ }, { status: 415 });
31
+ if (Number(upstream.headers.get("content-length") ?? "0") > COMPOSIO_LOGO_MAX_BYTES) return Response.json({
32
+ ok: false,
33
+ error: "Connector logo is too large."
34
+ }, { status: 413 });
35
+ const data = await upstream.arrayBuffer();
36
+ if (data.byteLength > COMPOSIO_LOGO_MAX_BYTES) return Response.json({
37
+ ok: false,
38
+ error: "Connector logo is too large."
39
+ }, { status: 413 });
40
+ return new Response(data, { headers: {
41
+ "Cache-Control": "public, max-age=86400, stale-while-revalidate=604800",
42
+ "Content-Length": String(data.byteLength),
43
+ "Content-Security-Policy": "default-src 'none'; style-src 'unsafe-inline'",
44
+ "Content-Type": contentType,
45
+ "X-Content-Type-Options": "nosniff"
46
+ } });
47
+ }
48
+ //#endregion
49
+ export { composioLogoResponse };
50
+
51
+ //# sourceMappingURL=composio-logo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composio-logo.js","names":[],"sources":["../../../src/connectors/composio-logo.ts"],"sourcesContent":["const COMPOSIO_LOGO_SLUG = /^[a-z0-9_]{1,80}$/;\nconst COMPOSIO_LOGO_MAX_BYTES = 512 * 1024;\nconst COMPOSIO_LOGO_CONTENT_TYPES = new Set([\n 'image/png',\n 'image/jpeg',\n 'image/webp',\n 'image/gif',\n 'image/svg+xml',\n]);\n\nexport async function composioLogoResponse(toolkit: string): Promise<Response> {\n const slug = toolkit.trim().toLowerCase();\n if (!COMPOSIO_LOGO_SLUG.test(slug)) {\n return Response.json({ ok: false, error: 'Invalid toolkit slug.' }, { status: 400 });\n }\n const upstream = await fetch(`https://logos.composio.dev/api/${encodeURIComponent(slug)}`, {\n headers: { Accept: 'image/png,image/webp,image/svg+xml,image/*;q=0.8' },\n redirect: 'error',\n signal: AbortSignal.timeout(8_000),\n });\n if (!upstream.ok) {\n return Response.json({ ok: false, error: 'Connector logo is unavailable.' }, { status: 404 });\n }\n const contentType = upstream.headers.get('content-type')?.split(';')[0]?.trim().toLowerCase() ?? '';\n if (!COMPOSIO_LOGO_CONTENT_TYPES.has(contentType)) {\n return Response.json({ ok: false, error: 'Connector logo has an unsupported format.' }, { status: 415 });\n }\n const declaredLength = Number(upstream.headers.get('content-length') ?? '0');\n if (declaredLength > COMPOSIO_LOGO_MAX_BYTES) {\n return Response.json({ ok: false, error: 'Connector logo is too large.' }, { status: 413 });\n }\n const data = await upstream.arrayBuffer();\n if (data.byteLength > COMPOSIO_LOGO_MAX_BYTES) {\n return Response.json({ ok: false, error: 'Connector logo is too large.' }, { status: 413 });\n }\n return new Response(data, {\n headers: {\n 'Cache-Control': 'public, max-age=86400, stale-while-revalidate=604800',\n 'Content-Length': String(data.byteLength),\n 'Content-Security-Policy': \"default-src 'none'; style-src 'unsafe-inline'\",\n 'Content-Type': contentType,\n 'X-Content-Type-Options': 'nosniff',\n },\n });\n}\n"],"mappings":";AAAA,MAAM,qBAAqB;AAC3B,MAAM,0BAA0B,MAAM;AACtC,MAAM,8BAA8B,IAAI,IAAI;CAC1C;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,eAAsB,qBAAqB,SAAoC;CAC7E,MAAM,OAAO,QAAQ,MAAM,CAAC,aAAa;AACzC,KAAI,CAAC,mBAAmB,KAAK,KAAK,CAChC,QAAO,SAAS,KAAK;EAAE,IAAI;EAAO,OAAO;EAAyB,EAAE,EAAE,QAAQ,KAAK,CAAC;CAEtF,MAAM,WAAW,MAAM,MAAM,kCAAkC,mBAAmB,KAAK,IAAI;EACzF,SAAS,EAAE,QAAQ,oDAAoD;EACvE,UAAU;EACV,QAAQ,YAAY,QAAQ,IAAM;EACnC,CAAC;AACF,KAAI,CAAC,SAAS,GACZ,QAAO,SAAS,KAAK;EAAE,IAAI;EAAO,OAAO;EAAkC,EAAE,EAAE,QAAQ,KAAK,CAAC;CAE/F,MAAM,cAAc,SAAS,QAAQ,IAAI,eAAe,EAAE,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,aAAa,IAAI;AACjG,KAAI,CAAC,4BAA4B,IAAI,YAAY,CAC/C,QAAO,SAAS,KAAK;EAAE,IAAI;EAAO,OAAO;EAA6C,EAAE,EAAE,QAAQ,KAAK,CAAC;AAG1G,KADuB,OAAO,SAAS,QAAQ,IAAI,iBAAiB,IAAI,IACtD,GAAG,wBACnB,QAAO,SAAS,KAAK;EAAE,IAAI;EAAO,OAAO;EAAgC,EAAE,EAAE,QAAQ,KAAK,CAAC;CAE7F,MAAM,OAAO,MAAM,SAAS,aAAa;AACzC,KAAI,KAAK,aAAa,wBACpB,QAAO,SAAS,KAAK;EAAE,IAAI;EAAO,OAAO;EAAgC,EAAE,EAAE,QAAQ,KAAK,CAAC;AAE7F,QAAO,IAAI,SAAS,MAAM,EACxB,SAAS;EACP,iBAAiB;EACjB,kBAAkB,OAAO,KAAK,WAAW;EACzC,2BAA2B;EAC3B,gBAAgB;EAChB,0BAA0B;EAC3B,EACF,CAAC"}
@@ -0,0 +1,116 @@
1
+ import type { ToolRouterCreateSessionConfig } from '@composio/core';
2
+ import { CredentialResolver } from '../auth/credentials.js';
3
+ import type { ConnectorActionMetadata, ConnectorConnection, ConnectorInstallationPolicy } from './types.js';
4
+ export declare function resolveComposioApiKey(resolver?: CredentialResolver): Promise<string | null>;
5
+ export declare function assertComposioApiKeyConfigured(resolver?: CredentialResolver): Promise<string>;
6
+ export type ComposioToolkitCatalogItem = {
7
+ slug: string;
8
+ name: string;
9
+ logoUrl?: string;
10
+ isNoAuth: boolean;
11
+ connected: boolean;
12
+ providerConnectionId?: string;
13
+ };
14
+ export type ComposioAuthorizeResult = {
15
+ toolkit: string;
16
+ connectionId: string;
17
+ connectUrl?: string;
18
+ status: string;
19
+ };
20
+ type SessionToolkitResponse = {
21
+ items: Array<{
22
+ slug: string;
23
+ name: string;
24
+ logo?: string;
25
+ isNoAuth: boolean;
26
+ connection?: {
27
+ isActive: boolean;
28
+ connectedAccount?: {
29
+ status: string;
30
+ id: string;
31
+ };
32
+ };
33
+ }>;
34
+ cursor?: string;
35
+ };
36
+ export type ComposioSessionLike = {
37
+ sessionId: string;
38
+ toolkits(options?: {
39
+ toolkits?: string[];
40
+ isConnected?: boolean;
41
+ limit?: number;
42
+ cursor?: string;
43
+ }): Promise<SessionToolkitResponse>;
44
+ authorize(toolkit: string, options?: {
45
+ callbackUrl?: string;
46
+ alias?: string;
47
+ }): Promise<{
48
+ id: string;
49
+ status: string;
50
+ redirectUrl?: string | null;
51
+ }>;
52
+ search(params: {
53
+ query: string;
54
+ toolkits?: string[];
55
+ }): Promise<unknown>;
56
+ execute(toolSlug: string, args?: Record<string, unknown>, options?: {
57
+ account?: string;
58
+ }): Promise<unknown>;
59
+ };
60
+ export type ComposioSessionsClient = {
61
+ sessions: {
62
+ create(userId: string, config?: ToolRouterCreateSessionConfig): Promise<ComposioSessionLike>;
63
+ };
64
+ connectedAccounts: {
65
+ list(query?: {
66
+ userIds?: string[];
67
+ toolkitSlugs?: string[];
68
+ }): Promise<unknown>;
69
+ delete(id: string): Promise<unknown>;
70
+ refresh(id: string): Promise<unknown>;
71
+ };
72
+ };
73
+ export type ComposioSessionContext = {
74
+ principalId: string;
75
+ installationScope?: string;
76
+ toolkits?: string[];
77
+ connectedAccounts?: Record<string, string[]>;
78
+ callbackUrl?: string;
79
+ };
80
+ type ClientFactory = () => Promise<ComposioSessionsClient>;
81
+ /** Convert local identities to stable opaque Composio user IDs without disclosing user data. */
82
+ export declare function createComposioPrincipalId(principalId: string, installationScope?: string): string;
83
+ export declare class ComposioSessionsAdapter {
84
+ private readonly createClient;
85
+ constructor(options?: {
86
+ resolver?: CredentialResolver;
87
+ clientFactory?: ClientFactory;
88
+ });
89
+ createSession(context: ComposioSessionContext): Promise<ComposioSessionLike>;
90
+ listToolkitCatalog(context: Omit<ComposioSessionContext, 'toolkits'>): Promise<ComposioToolkitCatalogItem[]>;
91
+ authorize(context: ComposioSessionContext & {
92
+ toolkit: string;
93
+ installationId?: string;
94
+ alias?: string;
95
+ }): Promise<ComposioAuthorizeResult>;
96
+ syncConnections(context: Pick<ComposioSessionContext, 'principalId' | 'installationScope'>): Promise<ConnectorConnection[]>;
97
+ revokeConnection(connection: ConnectorConnection): Promise<void>;
98
+ refreshConnection(connection: ConnectorConnection): Promise<ConnectorConnection>;
99
+ executeWithPolicy(input: {
100
+ context: ComposioSessionContext;
101
+ installation: ConnectorInstallationPolicy;
102
+ connection?: ConnectorConnection;
103
+ action: ConnectorActionMetadata;
104
+ args?: Record<string, unknown>;
105
+ agentId?: string;
106
+ sessionKey?: string;
107
+ confirmed?: boolean;
108
+ }): Promise<{
109
+ decision: 'allowed';
110
+ result: unknown;
111
+ } | {
112
+ decision: 'denied' | 'confirmation_required';
113
+ reason: string;
114
+ }>;
115
+ }
116
+ export {};
@@ -0,0 +1,296 @@
1
+ import { createLogger } from "../utils/logger/index.js";
2
+ import { init_logger } from "../utils/logger.js";
3
+ import { CredentialResolver, init_credentials } from "../auth/credentials.js";
4
+ import { appendConnectorExecutionAudit, getConnectorInstallation, listConnectorConnections, upsertConnectorConnection } from "../storage/sqlite/connector-repository.js";
5
+ import { evaluateConnectorExecutionPolicy } from "./policy.js";
6
+ import { resolve } from "node:path";
7
+ import { createHash } from "node:crypto";
8
+ import { Composio } from "@composio/core";
9
+ import { PiProvider } from "@composio/experimental";
10
+ //#region src/connectors/composio-sessions.ts
11
+ init_credentials();
12
+ init_logger();
13
+ const log = createLogger("Connectors:ComposioSessions");
14
+ const COMPOSIO_API_KEY_PROVIDER = "connector-composio-api-key";
15
+ async function resolveComposioApiKey(resolver = new CredentialResolver()) {
16
+ return (await resolver.resolveApiKey(COMPOSIO_API_KEY_PROVIDER).catch(() => void 0))?.trim() || process.env.XOPC_COMPOSIO_API_KEY?.trim() || process.env.COMPOSIO_API_KEY?.trim() || null;
17
+ }
18
+ async function assertComposioApiKeyConfigured(resolver = new CredentialResolver()) {
19
+ const apiKey = await resolveComposioApiKey(resolver);
20
+ if (!apiKey) throw new Error("Composio API key is not configured. Install the \"Composio API Key\" connector first.");
21
+ return apiKey;
22
+ }
23
+ function stableHash(value) {
24
+ return createHash("sha256").update(value).digest("hex").slice(0, 24);
25
+ }
26
+ function defaultInstallationScope() {
27
+ const configured = process.env.XOPC_STATE_DIR?.trim() || process.env.XOPC_CONFIG_PATH?.trim();
28
+ return configured ? resolve(configured) : resolve(process.cwd());
29
+ }
30
+ /** Convert local identities to stable opaque Composio user IDs without disclosing user data. */
31
+ function createComposioPrincipalId(principalId, installationScope = defaultInstallationScope()) {
32
+ const normalized = principalId.trim();
33
+ if (!normalized) throw new Error("Connector principalId is required.");
34
+ return `xopc_${stableHash(installationScope)}_${stableHash(normalized)}`;
35
+ }
36
+ function readArray(payload) {
37
+ if (!payload || typeof payload !== "object" || Array.isArray(payload)) return [];
38
+ const record = payload;
39
+ for (const key of [
40
+ "items",
41
+ "data",
42
+ "connected_accounts"
43
+ ]) if (Array.isArray(record[key])) return record[key];
44
+ return [];
45
+ }
46
+ function readString(record, keys) {
47
+ for (const key of keys) {
48
+ const value = record[key];
49
+ if (typeof value === "string" && value.trim()) return value.trim();
50
+ }
51
+ }
52
+ function connectionStatus(value) {
53
+ switch (value?.toUpperCase()) {
54
+ case "ACTIVE": return "active";
55
+ case "INITIATED":
56
+ case "INITIALIZING": return "pending";
57
+ case "EXPIRED": return "expired";
58
+ case "FAILED": return "failed";
59
+ case "REVOKED":
60
+ case "DELETED": return "revoked";
61
+ case "INACTIVE": return "disabled";
62
+ default: return "unknown";
63
+ }
64
+ }
65
+ var ComposioSessionsAdapter = class {
66
+ createClient;
67
+ constructor(options = {}) {
68
+ if (options.clientFactory) {
69
+ this.createClient = options.clientFactory;
70
+ return;
71
+ }
72
+ const resolver = options.resolver ?? new CredentialResolver();
73
+ this.createClient = async () => {
74
+ return new Composio({
75
+ apiKey: await assertComposioApiKeyConfigured(resolver),
76
+ baseURL: process.env.XOPC_COMPOSIO_BASE_URL?.trim() || void 0,
77
+ allowTracking: false,
78
+ dangerouslyAllowAutoUploadDownloadFiles: false,
79
+ fileUploadDirs: false,
80
+ provider: new PiProvider(),
81
+ host: "xopc"
82
+ });
83
+ };
84
+ }
85
+ async createSession(context) {
86
+ const client = await this.createClient();
87
+ const config = {
88
+ manageConnections: {
89
+ enable: true,
90
+ callbackUrl: context.callbackUrl,
91
+ waitForConnections: false
92
+ },
93
+ sandbox: { enable: false },
94
+ multiAccount: {
95
+ enable: true,
96
+ maxAccountsPerToolkit: 5,
97
+ requireExplicitSelection: true
98
+ },
99
+ ...context.toolkits?.length ? { toolkits: { enable: context.toolkits } } : {},
100
+ ...context.connectedAccounts && Object.keys(context.connectedAccounts).length > 0 ? { connectedAccounts: context.connectedAccounts } : {}
101
+ };
102
+ return client.sessions.create(createComposioPrincipalId(context.principalId, context.installationScope), config);
103
+ }
104
+ async listToolkitCatalog(context) {
105
+ const session = await this.createSession(context);
106
+ const items = [];
107
+ let cursor;
108
+ for (let page = 0; page < 20; page++) {
109
+ const response = await session.toolkits({
110
+ limit: 100,
111
+ cursor
112
+ });
113
+ for (const item of response.items) items.push({
114
+ slug: item.slug,
115
+ name: item.name,
116
+ logoUrl: item.logo,
117
+ isNoAuth: item.isNoAuth,
118
+ connected: item.connection?.isActive === true,
119
+ providerConnectionId: item.connection?.connectedAccount?.id
120
+ });
121
+ if (!response.cursor || response.cursor === cursor) break;
122
+ cursor = response.cursor;
123
+ }
124
+ return items;
125
+ }
126
+ async authorize(context) {
127
+ const request = await (await this.createSession({
128
+ ...context,
129
+ toolkits: [context.toolkit]
130
+ })).authorize(context.toolkit, {
131
+ callbackUrl: context.callbackUrl,
132
+ alias: context.alias
133
+ });
134
+ const connectorId = `composio-${context.toolkit}`;
135
+ upsertConnectorConnection({
136
+ id: `composio-${request.id}`,
137
+ installationId: context.installationId && getConnectorInstallation(context.installationId) ? context.installationId : void 0,
138
+ connectorId,
139
+ provider: "composio",
140
+ principalId: context.principalId,
141
+ providerConnectionId: request.id,
142
+ alias: context.alias,
143
+ identity: {},
144
+ status: connectionStatus(request.status),
145
+ isDefault: listConnectorConnections({
146
+ principalId: context.principalId,
147
+ connectorId
148
+ }).length === 0,
149
+ metadata: { toolkit: context.toolkit }
150
+ });
151
+ return {
152
+ toolkit: context.toolkit,
153
+ connectionId: request.id,
154
+ connectUrl: request.redirectUrl ?? void 0,
155
+ status: request.status
156
+ };
157
+ }
158
+ async syncConnections(context) {
159
+ const client = await this.createClient();
160
+ const providerPrincipalId = createComposioPrincipalId(context.principalId, context.installationScope);
161
+ const payload = await client.connectedAccounts.list({ userIds: [providerPrincipalId] });
162
+ const synced = [];
163
+ for (const item of readArray(payload)) {
164
+ if (!item || typeof item !== "object" || Array.isArray(item)) continue;
165
+ const row = item;
166
+ const toolkitRecord = row.toolkit && typeof row.toolkit === "object" && !Array.isArray(row.toolkit) ? row.toolkit : {};
167
+ const providerConnectionId = readString(row, [
168
+ "id",
169
+ "nanoid",
170
+ "connectedAccountId",
171
+ "connected_account_id"
172
+ ]);
173
+ const toolkit = readString(toolkitRecord, ["slug"]) ?? readString(row, ["toolkitSlug", "toolkit_slug"]);
174
+ if (!providerConnectionId || !toolkit) continue;
175
+ const connectorId = `composio-${toolkit}`;
176
+ const existing = listConnectorConnections({
177
+ principalId: context.principalId,
178
+ connectorId
179
+ }).find((connection) => connection.providerConnectionId === providerConnectionId);
180
+ const identity = row.connectionData && typeof row.connectionData === "object" && !Array.isArray(row.connectionData) ? row.connectionData : {};
181
+ synced.push(upsertConnectorConnection({
182
+ id: existing?.id ?? `composio-${providerConnectionId}`,
183
+ installationId: existing?.installationId,
184
+ connectorId,
185
+ provider: "composio",
186
+ principalId: context.principalId,
187
+ providerConnectionId,
188
+ alias: existing?.alias,
189
+ identity,
190
+ status: connectionStatus(readString(row, ["status"])),
191
+ isDefault: existing?.isDefault ?? false,
192
+ connectedAt: readString(row, ["createdAt", "created_at"]),
193
+ lastError: readString(row, ["lastError", "last_error"]),
194
+ metadata: {
195
+ toolkit,
196
+ providerPrincipalId
197
+ }
198
+ }));
199
+ }
200
+ return synced;
201
+ }
202
+ async revokeConnection(connection) {
203
+ await (await this.createClient()).connectedAccounts.delete(connection.providerConnectionId);
204
+ upsertConnectorConnection({
205
+ ...connection,
206
+ status: "revoked",
207
+ isDefault: false,
208
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
209
+ });
210
+ }
211
+ async refreshConnection(connection) {
212
+ await (await this.createClient()).connectedAccounts.refresh(connection.providerConnectionId);
213
+ const synced = await this.syncConnections({ principalId: connection.principalId });
214
+ return synced.find((candidate) => candidate.id === connection.id) ?? synced.find((candidate) => candidate.providerConnectionId === connection.providerConnectionId) ?? connection;
215
+ }
216
+ async executeWithPolicy(input) {
217
+ const evaluation = evaluateConnectorExecutionPolicy({
218
+ installation: input.installation,
219
+ action: input.action,
220
+ agentId: input.agentId,
221
+ connectionId: input.connection?.id,
222
+ confirmed: input.confirmed
223
+ });
224
+ if (evaluation.decision !== "allowed") {
225
+ appendConnectorExecutionAudit({
226
+ installationId: input.installation.id,
227
+ connectionId: input.connection?.id,
228
+ connectorId: input.installation.connectorId,
229
+ principalId: input.context.principalId,
230
+ agentId: input.agentId,
231
+ sessionKey: input.sessionKey,
232
+ actionId: input.action.actionId,
233
+ scope: input.action.scope,
234
+ decision: evaluation.decision,
235
+ resultStatus: "not_executed"
236
+ });
237
+ return {
238
+ decision: evaluation.decision,
239
+ reason: evaluation.reason
240
+ };
241
+ }
242
+ const startedAt = Date.now();
243
+ try {
244
+ const toolkit = input.action.toolkit;
245
+ const connectedAccounts = toolkit && input.connection ? { [toolkit]: [input.connection.providerConnectionId] } : input.context.connectedAccounts;
246
+ const result = await (await this.createSession({
247
+ ...input.context,
248
+ connectedAccounts
249
+ })).execute(input.action.actionId, input.args ?? {}, input.connection ? { account: input.connection.providerConnectionId } : void 0);
250
+ appendConnectorExecutionAudit({
251
+ installationId: input.installation.id,
252
+ connectionId: input.connection?.id,
253
+ connectorId: input.installation.connectorId,
254
+ principalId: input.context.principalId,
255
+ agentId: input.agentId,
256
+ sessionKey: input.sessionKey,
257
+ actionId: input.action.actionId,
258
+ scope: input.action.scope,
259
+ decision: "allowed",
260
+ resultStatus: "success",
261
+ durationMs: Date.now() - startedAt
262
+ });
263
+ return {
264
+ decision: "allowed",
265
+ result
266
+ };
267
+ } catch (err) {
268
+ const errorCode = err && typeof err === "object" && "code" in err ? String(err.code) : void 0;
269
+ appendConnectorExecutionAudit({
270
+ installationId: input.installation.id,
271
+ connectionId: input.connection?.id,
272
+ connectorId: input.installation.connectorId,
273
+ principalId: input.context.principalId,
274
+ agentId: input.agentId,
275
+ sessionKey: input.sessionKey,
276
+ actionId: input.action.actionId,
277
+ scope: input.action.scope,
278
+ decision: "allowed",
279
+ resultStatus: "error",
280
+ durationMs: Date.now() - startedAt,
281
+ errorCode
282
+ });
283
+ log.warn({
284
+ err,
285
+ connectorId: input.installation.connectorId,
286
+ actionId: input.action.actionId,
287
+ phase: "execute"
288
+ }, "Composio connector action failed");
289
+ throw err;
290
+ }
291
+ }
292
+ };
293
+ //#endregion
294
+ export { ComposioSessionsAdapter, assertComposioApiKeyConfigured, createComposioPrincipalId, resolveComposioApiKey };
295
+
296
+ //# sourceMappingURL=composio-sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composio-sessions.js","names":["listStoredConnectorConnections"],"sources":["../../../src/connectors/composio-sessions.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport { resolve } from 'node:path';\n\nimport { Composio } from '@composio/core';\nimport type { ToolRouterCreateSessionConfig } from '@composio/core';\nimport { PiProvider } from '@composio/experimental';\n\nimport { CredentialResolver } from '../auth/credentials.js';\nimport {\n appendConnectorExecutionAudit,\n getConnectorInstallation,\n listConnectorConnections as listStoredConnectorConnections,\n upsertConnectorConnection,\n} from '../storage/sqlite/connector-repository.js';\nimport { createLogger } from '../utils/logger.js';\nimport { evaluateConnectorExecutionPolicy } from './policy.js';\nimport type {\n ConnectorActionMetadata,\n ConnectorConnection,\n ConnectorInstallationPolicy,\n} from './types.js';\n\nconst log = createLogger('Connectors:ComposioSessions');\nconst COMPOSIO_API_KEY_PROVIDER = 'connector-composio-api-key';\n\nexport async function resolveComposioApiKey(resolver = new CredentialResolver()): Promise<string | null> {\n const stored = await resolver.resolveApiKey(COMPOSIO_API_KEY_PROVIDER).catch(() => undefined);\n return stored?.trim() || process.env.XOPC_COMPOSIO_API_KEY?.trim() || process.env.COMPOSIO_API_KEY?.trim() || null;\n}\n\nexport async function assertComposioApiKeyConfigured(resolver = new CredentialResolver()): Promise<string> {\n const apiKey = await resolveComposioApiKey(resolver);\n if (!apiKey) {\n throw new Error('Composio API key is not configured. Install the \"Composio API Key\" connector first.');\n }\n return apiKey;\n}\n\nexport type ComposioToolkitCatalogItem = {\n slug: string;\n name: string;\n logoUrl?: string;\n isNoAuth: boolean;\n connected: boolean;\n providerConnectionId?: string;\n};\n\nexport type ComposioAuthorizeResult = {\n toolkit: string;\n connectionId: string;\n connectUrl?: string;\n status: string;\n};\n\ntype SessionToolkitResponse = {\n items: Array<{\n slug: string;\n name: string;\n logo?: string;\n isNoAuth: boolean;\n connection?: {\n isActive: boolean;\n connectedAccount?: { status: string; id: string };\n };\n }>;\n cursor?: string;\n};\n\nexport type ComposioSessionLike = {\n sessionId: string;\n toolkits(options?: { toolkits?: string[]; isConnected?: boolean; limit?: number; cursor?: string }): Promise<SessionToolkitResponse>;\n authorize(toolkit: string, options?: { callbackUrl?: string; alias?: string }): Promise<{\n id: string;\n status: string;\n redirectUrl?: string | null;\n }>;\n search(params: { query: string; toolkits?: string[] }): Promise<unknown>;\n execute(toolSlug: string, args?: Record<string, unknown>, options?: { account?: string }): Promise<unknown>;\n};\n\nexport type ComposioSessionsClient = {\n sessions: {\n create(userId: string, config?: ToolRouterCreateSessionConfig): Promise<ComposioSessionLike>;\n };\n connectedAccounts: {\n list(query?: { userIds?: string[]; toolkitSlugs?: string[] }): Promise<unknown>;\n delete(id: string): Promise<unknown>;\n refresh(id: string): Promise<unknown>;\n };\n};\n\nexport type ComposioSessionContext = {\n principalId: string;\n installationScope?: string;\n toolkits?: string[];\n connectedAccounts?: Record<string, string[]>;\n callbackUrl?: string;\n};\n\ntype ClientFactory = () => Promise<ComposioSessionsClient>;\n\nfunction stableHash(value: string): string {\n return createHash('sha256').update(value).digest('hex').slice(0, 24);\n}\n\nfunction defaultInstallationScope(): string {\n const configured = process.env.XOPC_STATE_DIR?.trim() || process.env.XOPC_CONFIG_PATH?.trim();\n return configured ? resolve(configured) : resolve(process.cwd());\n}\n\n/** Convert local identities to stable opaque Composio user IDs without disclosing user data. */\nexport function createComposioPrincipalId(principalId: string, installationScope = defaultInstallationScope()): string {\n const normalized = principalId.trim();\n if (!normalized) throw new Error('Connector principalId is required.');\n return `xopc_${stableHash(installationScope)}_${stableHash(normalized)}`;\n}\n\nfunction readArray(payload: unknown): unknown[] {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) return [];\n const record = payload as Record<string, unknown>;\n for (const key of ['items', 'data', 'connected_accounts']) {\n if (Array.isArray(record[key])) return record[key] as unknown[];\n }\n return [];\n}\n\nfunction readString(record: Record<string, unknown>, keys: string[]): string | undefined {\n for (const key of keys) {\n const value = record[key];\n if (typeof value === 'string' && value.trim()) return value.trim();\n }\n return undefined;\n}\n\nfunction connectionStatus(value: string | undefined): ConnectorConnection['status'] {\n switch (value?.toUpperCase()) {\n case 'ACTIVE': return 'active';\n case 'INITIATED':\n case 'INITIALIZING': return 'pending';\n case 'EXPIRED': return 'expired';\n case 'FAILED': return 'failed';\n case 'REVOKED':\n case 'DELETED': return 'revoked';\n case 'INACTIVE': return 'disabled';\n default: return 'unknown';\n }\n}\n\nexport class ComposioSessionsAdapter {\n private readonly createClient: ClientFactory;\n\n constructor(options: { resolver?: CredentialResolver; clientFactory?: ClientFactory } = {}) {\n if (options.clientFactory) {\n this.createClient = options.clientFactory;\n return;\n }\n const resolver = options.resolver ?? new CredentialResolver();\n this.createClient = async () => {\n const apiKey = await assertComposioApiKeyConfigured(resolver);\n return new Composio({\n apiKey,\n baseURL: process.env.XOPC_COMPOSIO_BASE_URL?.trim() || undefined,\n allowTracking: false,\n dangerouslyAllowAutoUploadDownloadFiles: false,\n fileUploadDirs: false,\n provider: new PiProvider(),\n host: 'xopc',\n }) as unknown as ComposioSessionsClient;\n };\n }\n\n async createSession(context: ComposioSessionContext): Promise<ComposioSessionLike> {\n const client = await this.createClient();\n const config: ToolRouterCreateSessionConfig = {\n manageConnections: {\n enable: true,\n callbackUrl: context.callbackUrl,\n waitForConnections: false,\n },\n sandbox: { enable: false },\n multiAccount: {\n enable: true,\n maxAccountsPerToolkit: 5,\n requireExplicitSelection: true,\n },\n ...(context.toolkits?.length ? { toolkits: { enable: context.toolkits } } : {}),\n ...(context.connectedAccounts && Object.keys(context.connectedAccounts).length > 0\n ? { connectedAccounts: context.connectedAccounts }\n : {}),\n };\n return client.sessions.create(\n createComposioPrincipalId(context.principalId, context.installationScope),\n config,\n );\n }\n\n async listToolkitCatalog(context: Omit<ComposioSessionContext, 'toolkits'>): Promise<ComposioToolkitCatalogItem[]> {\n const session = await this.createSession(context);\n const items: ComposioToolkitCatalogItem[] = [];\n let cursor: string | undefined;\n for (let page = 0; page < 20; page++) {\n const response = await session.toolkits({ limit: 100, cursor });\n for (const item of response.items) {\n items.push({\n slug: item.slug,\n name: item.name,\n logoUrl: item.logo,\n isNoAuth: item.isNoAuth,\n connected: item.connection?.isActive === true,\n providerConnectionId: item.connection?.connectedAccount?.id,\n });\n }\n if (!response.cursor || response.cursor === cursor) break;\n cursor = response.cursor;\n }\n return items;\n }\n\n async authorize(\n context: ComposioSessionContext & { toolkit: string; installationId?: string; alias?: string },\n ): Promise<ComposioAuthorizeResult> {\n const session = await this.createSession({ ...context, toolkits: [context.toolkit] });\n const request = await session.authorize(context.toolkit, {\n callbackUrl: context.callbackUrl,\n alias: context.alias,\n });\n const connectorId = `composio-${context.toolkit}`;\n upsertConnectorConnection({\n id: `composio-${request.id}`,\n installationId: context.installationId && getConnectorInstallation(context.installationId)\n ? context.installationId\n : undefined,\n connectorId,\n provider: 'composio',\n principalId: context.principalId,\n providerConnectionId: request.id,\n alias: context.alias,\n identity: {},\n status: connectionStatus(request.status),\n isDefault: listStoredConnectorConnections({ principalId: context.principalId, connectorId }).length === 0,\n metadata: { toolkit: context.toolkit },\n });\n return {\n toolkit: context.toolkit,\n connectionId: request.id,\n connectUrl: request.redirectUrl ?? undefined,\n status: request.status,\n };\n }\n\n async syncConnections(context: Pick<ComposioSessionContext, 'principalId' | 'installationScope'>): Promise<ConnectorConnection[]> {\n const client = await this.createClient();\n const providerPrincipalId = createComposioPrincipalId(context.principalId, context.installationScope);\n const payload = await client.connectedAccounts.list({ userIds: [providerPrincipalId] });\n const synced: ConnectorConnection[] = [];\n for (const item of readArray(payload)) {\n if (!item || typeof item !== 'object' || Array.isArray(item)) continue;\n const row = item as Record<string, unknown>;\n const toolkitRecord = row.toolkit && typeof row.toolkit === 'object' && !Array.isArray(row.toolkit)\n ? row.toolkit as Record<string, unknown>\n : {};\n const providerConnectionId = readString(row, ['id', 'nanoid', 'connectedAccountId', 'connected_account_id']);\n const toolkit = readString(toolkitRecord, ['slug']) ?? readString(row, ['toolkitSlug', 'toolkit_slug']);\n if (!providerConnectionId || !toolkit) continue;\n const connectorId = `composio-${toolkit}`;\n const existing = listStoredConnectorConnections({ principalId: context.principalId, connectorId })\n .find((connection) => connection.providerConnectionId === providerConnectionId);\n const identity = row.connectionData && typeof row.connectionData === 'object' && !Array.isArray(row.connectionData)\n ? row.connectionData as Record<string, unknown>\n : {};\n synced.push(upsertConnectorConnection({\n id: existing?.id ?? `composio-${providerConnectionId}`,\n installationId: existing?.installationId,\n connectorId,\n provider: 'composio',\n principalId: context.principalId,\n providerConnectionId,\n alias: existing?.alias,\n identity,\n status: connectionStatus(readString(row, ['status'])),\n isDefault: existing?.isDefault ?? false,\n connectedAt: readString(row, ['createdAt', 'created_at']),\n lastError: readString(row, ['lastError', 'last_error']),\n metadata: { toolkit, providerPrincipalId },\n }));\n }\n return synced;\n }\n\n async revokeConnection(connection: ConnectorConnection): Promise<void> {\n const client = await this.createClient();\n await client.connectedAccounts.delete(connection.providerConnectionId);\n upsertConnectorConnection({\n ...connection,\n status: 'revoked',\n isDefault: false,\n updatedAt: new Date().toISOString(),\n });\n }\n\n async refreshConnection(connection: ConnectorConnection): Promise<ConnectorConnection> {\n const client = await this.createClient();\n await client.connectedAccounts.refresh(connection.providerConnectionId);\n const synced = await this.syncConnections({ principalId: connection.principalId });\n return synced.find((candidate) => candidate.id === connection.id)\n ?? synced.find((candidate) => candidate.providerConnectionId === connection.providerConnectionId)\n ?? connection;\n }\n\n async executeWithPolicy(input: {\n context: ComposioSessionContext;\n installation: ConnectorInstallationPolicy;\n connection?: ConnectorConnection;\n action: ConnectorActionMetadata;\n args?: Record<string, unknown>;\n agentId?: string;\n sessionKey?: string;\n confirmed?: boolean;\n }): Promise<{ decision: 'allowed'; result: unknown } | { decision: 'denied' | 'confirmation_required'; reason: string }> {\n const evaluation = evaluateConnectorExecutionPolicy({\n installation: input.installation,\n action: input.action,\n agentId: input.agentId,\n connectionId: input.connection?.id,\n confirmed: input.confirmed,\n });\n if (evaluation.decision !== 'allowed') {\n appendConnectorExecutionAudit({\n installationId: input.installation.id,\n connectionId: input.connection?.id,\n connectorId: input.installation.connectorId,\n principalId: input.context.principalId,\n agentId: input.agentId,\n sessionKey: input.sessionKey,\n actionId: input.action.actionId,\n scope: input.action.scope,\n decision: evaluation.decision,\n resultStatus: 'not_executed',\n });\n return { decision: evaluation.decision, reason: evaluation.reason };\n }\n\n const startedAt = Date.now();\n try {\n const toolkit = input.action.toolkit;\n const connectedAccounts = toolkit && input.connection\n ? { [toolkit]: [input.connection.providerConnectionId] }\n : input.context.connectedAccounts;\n const session = await this.createSession({ ...input.context, connectedAccounts });\n const result = await session.execute(\n input.action.actionId,\n input.args ?? {},\n input.connection ? { account: input.connection.providerConnectionId } : undefined,\n );\n appendConnectorExecutionAudit({\n installationId: input.installation.id,\n connectionId: input.connection?.id,\n connectorId: input.installation.connectorId,\n principalId: input.context.principalId,\n agentId: input.agentId,\n sessionKey: input.sessionKey,\n actionId: input.action.actionId,\n scope: input.action.scope,\n decision: 'allowed',\n resultStatus: 'success',\n durationMs: Date.now() - startedAt,\n });\n return { decision: 'allowed', result };\n } catch (err) {\n const errorCode = err && typeof err === 'object' && 'code' in err ? String((err as { code?: unknown }).code) : undefined;\n appendConnectorExecutionAudit({\n installationId: input.installation.id,\n connectionId: input.connection?.id,\n connectorId: input.installation.connectorId,\n principalId: input.context.principalId,\n agentId: input.agentId,\n sessionKey: input.sessionKey,\n actionId: input.action.actionId,\n scope: input.action.scope,\n decision: 'allowed',\n resultStatus: 'error',\n durationMs: Date.now() - startedAt,\n errorCode,\n });\n log.warn(\n { err, connectorId: input.installation.connectorId, actionId: input.action.actionId, phase: 'execute' },\n 'Composio connector action failed',\n );\n throw err;\n }\n }\n}\n"],"mappings":"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"}
@@ -6,5 +6,22 @@ export type ComposioTriggerArchiveEntry = {
6
6
  trigger?: string;
7
7
  payload: unknown;
8
8
  };
9
+ export declare function verifyComposioWebhook(input: {
10
+ body: string;
11
+ webhookId: string;
12
+ webhookTimestamp: string;
13
+ signature: string;
14
+ secret: string;
15
+ nowMs?: number;
16
+ toleranceSeconds?: number;
17
+ }): unknown;
18
+ export declare function normalizeComposioTriggerPayload(payload: unknown, webhookId?: string): {
19
+ id: string;
20
+ type: string;
21
+ toolkit?: string;
22
+ trigger?: string;
23
+ data: Record<string, unknown>;
24
+ };
25
+ export declare function applyComposioConnectionLifecycleEvent(payload: unknown): void;
9
26
  export declare function appendComposioTriggerEvent(config: Config, payload: unknown): Promise<ComposioTriggerArchiveEntry>;
10
27
  export declare function listComposioTriggerEvents(config: Config, limit?: number): Promise<ComposioTriggerArchiveEntry[]>;
@@ -1,6 +1,7 @@
1
+ import { listConnectorConnections, upsertConnectorConnection } from "../storage/sqlite/connector-repository.js";
1
2
  import { getWorkspacePath } from "../config/workspace-path-helpers.js";
2
3
  import { dirname, join } from "node:path";
3
- import crypto from "node:crypto";
4
+ import crypto, { createHmac, timingSafeEqual } from "node:crypto";
4
5
  import { appendFile, mkdir, readFile } from "node:fs/promises";
5
6
  //#region src/connectors/composio-triggers.ts
6
7
  function archivePath(config) {
@@ -9,17 +10,59 @@ function archivePath(config) {
9
10
  function readString(value) {
10
11
  return typeof value === "string" && value.trim() ? value.trim() : void 0;
11
12
  }
13
+ function verifyComposioWebhook(input) {
14
+ if (!input.secret || !input.webhookId || !input.webhookTimestamp || !input.signature) throw new Error("Missing Composio webhook signature fields.");
15
+ const timestampMs = Number(input.webhookTimestamp) * 1e3;
16
+ const toleranceMs = (input.toleranceSeconds ?? 300) * 1e3;
17
+ if (!Number.isFinite(timestampMs) || Math.abs((input.nowMs ?? Date.now()) - timestampMs) > toleranceMs) throw new Error("Composio webhook timestamp is outside the allowed window.");
18
+ const expected = createHmac("sha256", input.secret).update(`${input.webhookId}.${input.webhookTimestamp}.${input.body}`).digest("base64");
19
+ const received = input.signature.split(",").at(-1)?.trim() ?? "";
20
+ const expectedBuffer = Buffer.from(expected);
21
+ const receivedBuffer = Buffer.from(received);
22
+ if (expectedBuffer.length !== receivedBuffer.length || !timingSafeEqual(expectedBuffer, receivedBuffer)) throw new Error("Invalid Composio webhook signature.");
23
+ return JSON.parse(input.body);
24
+ }
25
+ function normalizeComposioTriggerPayload(payload, webhookId) {
26
+ const row = payload && typeof payload === "object" && !Array.isArray(payload) ? payload : {};
27
+ const metadata = row.metadata && typeof row.metadata === "object" && !Array.isArray(row.metadata) ? row.metadata : {};
28
+ const data = row.data && typeof row.data === "object" && !Array.isArray(row.data) ? row.data : {};
29
+ const toolkitRecord = metadata.toolkit && typeof metadata.toolkit === "object" && !Array.isArray(metadata.toolkit) ? metadata.toolkit : {};
30
+ return {
31
+ id: webhookId ?? readString(row.id ?? row.eventId ?? row.event_id) ?? crypto.randomUUID(),
32
+ type: readString(row.type) ?? "composio.trigger.message",
33
+ toolkit: readString(metadata.toolkit_slug ?? toolkitRecord.slug ?? row.toolkit ?? row.toolkit_slug),
34
+ trigger: readString(metadata.trigger_slug ?? row.trigger ?? row.triggerName ?? row.trigger_name),
35
+ data
36
+ };
37
+ }
38
+ function applyComposioConnectionLifecycleEvent(payload) {
39
+ const normalized = normalizeComposioTriggerPayload(payload);
40
+ if (normalized.type !== "composio.connected_account.expired" && normalized.type !== "composio.connected_account.deleted") return;
41
+ const providerConnectionId = readString(normalized.data.id ?? normalized.data.nanoid ?? normalized.data.connected_account_id);
42
+ if (!providerConnectionId) return;
43
+ const connection = listConnectorConnections().find((candidate) => candidate.provider === "composio" && candidate.providerConnectionId === providerConnectionId);
44
+ if (!connection) return;
45
+ upsertConnectorConnection({
46
+ ...connection,
47
+ status: normalized.type.endsWith(".deleted") ? "revoked" : "expired",
48
+ isDefault: false,
49
+ lastError: normalized.type.endsWith(".deleted") ? "Connection was removed in Composio." : "Connection expired and requires authorization."
50
+ });
51
+ }
12
52
  async function appendComposioTriggerEvent(config, payload) {
13
53
  const record = payload && typeof payload === "object" && !Array.isArray(payload) ? payload : {};
54
+ const normalized = normalizeComposioTriggerPayload(payload);
14
55
  const entry = {
15
56
  at: (/* @__PURE__ */ new Date()).toISOString(),
16
- id: readString(record.id ?? record.eventId ?? record.event_id) ?? crypto.randomUUID(),
17
- toolkit: readString(record.toolkit ?? record.toolkit_slug ?? record.appName ?? record.app_name),
18
- trigger: readString(record.trigger ?? record.triggerName ?? record.trigger_name ?? record.type),
57
+ id: normalized.id,
58
+ toolkit: normalized.toolkit ?? readString(record.appName ?? record.app_name),
59
+ trigger: normalized.trigger ?? normalized.type,
19
60
  payload
20
61
  };
21
62
  const path = archivePath(config);
22
63
  await mkdir(dirname(path), { recursive: true });
64
+ const existing = (await listComposioTriggerEvents(config, 500)).find((candidate) => candidate.id === entry.id);
65
+ if (existing) return existing;
23
66
  await appendFile(path, `${JSON.stringify(entry)}\n`, "utf8");
24
67
  return entry;
25
68
  }
@@ -27,6 +70,6 @@ async function listComposioTriggerEvents(config, limit = 50) {
27
70
  return (await readFile(archivePath(config), "utf8").catch(() => "")).split("\n").filter(Boolean).slice(-Math.max(1, Math.min(limit, 500))).map((line) => JSON.parse(line)).reverse();
28
71
  }
29
72
  //#endregion
30
- export { appendComposioTriggerEvent, listComposioTriggerEvents };
73
+ export { appendComposioTriggerEvent, applyComposioConnectionLifecycleEvent, listComposioTriggerEvents, normalizeComposioTriggerPayload, verifyComposioWebhook };
31
74
 
32
75
  //# sourceMappingURL=composio-triggers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"composio-triggers.js","names":[],"sources":["../../../src/connectors/composio-triggers.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport { mkdir, appendFile, readFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\n\nimport type { Config } from '../config/schema.js';\nimport { getWorkspacePath } from '../config/workspace-path-helpers.js';\n\nexport type ComposioTriggerArchiveEntry = {\n at: string;\n id: string;\n toolkit?: string;\n trigger?: string;\n payload: unknown;\n};\n\nfunction archivePath(config: Config): string {\n const workspace = getWorkspacePath(config) || './workspace';\n return join(workspace, 'state', 'connectors', 'composio-triggers.jsonl');\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nexport async function appendComposioTriggerEvent(config: Config, payload: unknown): Promise<ComposioTriggerArchiveEntry> {\n const record = payload && typeof payload === 'object' && !Array.isArray(payload) ? payload as Record<string, unknown> : {};\n const entry: ComposioTriggerArchiveEntry = {\n at: new Date().toISOString(),\n id: readString(record.id ?? record.eventId ?? record.event_id) ?? crypto.randomUUID(),\n toolkit: readString(record.toolkit ?? record.toolkit_slug ?? record.appName ?? record.app_name),\n trigger: readString(record.trigger ?? record.triggerName ?? record.trigger_name ?? record.type),\n payload,\n };\n const path = archivePath(config);\n await mkdir(dirname(path), { recursive: true });\n await appendFile(path, `${JSON.stringify(entry)}\\n`, 'utf8');\n return entry;\n}\n\nexport async function listComposioTriggerEvents(config: Config, limit = 50): Promise<ComposioTriggerArchiveEntry[]> {\n const path = archivePath(config);\n const text = await readFile(path, 'utf8').catch(() => '');\n return text\n .split('\\n')\n .filter(Boolean)\n .slice(-Math.max(1, Math.min(limit, 500)))\n .map((line) => JSON.parse(line) as ComposioTriggerArchiveEntry)\n .reverse();\n}\n"],"mappings":";;;;;AAeA,SAAS,YAAY,QAAwB;AAE3C,QAAO,KADW,iBAAiB,OAAO,IAAI,eACvB,SAAS,cAAc,0BAA0B;;AAG1E,SAAS,WAAW,OAAoC;AACtD,QAAO,OAAO,UAAU,YAAY,MAAM,MAAM,GAAG,MAAM,MAAM,GAAG,KAAA;;AAGpE,eAAsB,2BAA2B,QAAgB,SAAwD;CACvH,MAAM,SAAS,WAAW,OAAO,YAAY,YAAY,CAAC,MAAM,QAAQ,QAAQ,GAAG,UAAqC,EAAE;CAC1H,MAAM,QAAqC;EACzC,qBAAI,IAAI,MAAM,EAAC,aAAa;EAC5B,IAAI,WAAW,OAAO,MAAM,OAAO,WAAW,OAAO,SAAS,IAAI,OAAO,YAAY;EACrF,SAAS,WAAW,OAAO,WAAW,OAAO,gBAAgB,OAAO,WAAW,OAAO,SAAS;EAC/F,SAAS,WAAW,OAAO,WAAW,OAAO,eAAe,OAAO,gBAAgB,OAAO,KAAK;EAC/F;EACD;CACD,MAAM,OAAO,YAAY,OAAO;AAChC,OAAM,MAAM,QAAQ,KAAK,EAAE,EAAE,WAAW,MAAM,CAAC;AAC/C,OAAM,WAAW,MAAM,GAAG,KAAK,UAAU,MAAM,CAAC,KAAK,OAAO;AAC5D,QAAO;;AAGT,eAAsB,0BAA0B,QAAgB,QAAQ,IAA4C;AAGlH,SAAO,MADY,SADN,YAAY,OACO,EAAE,OAAO,CAAC,YAAY,GAAG,EAEtD,MAAM,KAAK,CACX,OAAO,QAAQ,CACf,MAAM,CAAC,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,IAAI,CAAC,CAAC,CACzC,KAAK,SAAS,KAAK,MAAM,KAAK,CAAgC,CAC9D,SAAS"}
1
+ {"version":3,"file":"composio-triggers.js","names":[],"sources":["../../../src/connectors/composio-triggers.ts"],"sourcesContent":["import crypto, { createHmac, timingSafeEqual } from 'node:crypto';\nimport { mkdir, appendFile, readFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\n\nimport type { Config } from '../config/schema.js';\nimport { getWorkspacePath } from '../config/workspace-path-helpers.js';\nimport { listConnectorConnections, upsertConnectorConnection } from '../storage/sqlite/connector-repository.js';\n\nexport type ComposioTriggerArchiveEntry = {\n at: string;\n id: string;\n toolkit?: string;\n trigger?: string;\n payload: unknown;\n};\n\nfunction archivePath(config: Config): string {\n const workspace = getWorkspacePath(config) || './workspace';\n return join(workspace, 'state', 'connectors', 'composio-triggers.jsonl');\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.trim() ? value.trim() : undefined;\n}\n\nexport function verifyComposioWebhook(input: {\n body: string;\n webhookId: string;\n webhookTimestamp: string;\n signature: string;\n secret: string;\n nowMs?: number;\n toleranceSeconds?: number;\n}): unknown {\n if (!input.secret || !input.webhookId || !input.webhookTimestamp || !input.signature) {\n throw new Error('Missing Composio webhook signature fields.');\n }\n const timestampMs = Number(input.webhookTimestamp) * 1000;\n const toleranceMs = (input.toleranceSeconds ?? 300) * 1000;\n if (!Number.isFinite(timestampMs) || Math.abs((input.nowMs ?? Date.now()) - timestampMs) > toleranceMs) {\n throw new Error('Composio webhook timestamp is outside the allowed window.');\n }\n const expected = createHmac('sha256', input.secret)\n .update(`${input.webhookId}.${input.webhookTimestamp}.${input.body}`)\n .digest('base64');\n const received = input.signature.split(',').at(-1)?.trim() ?? '';\n const expectedBuffer = Buffer.from(expected);\n const receivedBuffer = Buffer.from(received);\n if (expectedBuffer.length !== receivedBuffer.length || !timingSafeEqual(expectedBuffer, receivedBuffer)) {\n throw new Error('Invalid Composio webhook signature.');\n }\n return JSON.parse(input.body) as unknown;\n}\n\nexport function normalizeComposioTriggerPayload(payload: unknown, webhookId?: string): {\n id: string;\n type: string;\n toolkit?: string;\n trigger?: string;\n data: Record<string, unknown>;\n} {\n const row = payload && typeof payload === 'object' && !Array.isArray(payload) ? payload as Record<string, unknown> : {};\n const metadata = row.metadata && typeof row.metadata === 'object' && !Array.isArray(row.metadata)\n ? row.metadata as Record<string, unknown>\n : {};\n const data = row.data && typeof row.data === 'object' && !Array.isArray(row.data)\n ? row.data as Record<string, unknown>\n : {};\n const toolkitRecord = metadata.toolkit && typeof metadata.toolkit === 'object' && !Array.isArray(metadata.toolkit)\n ? metadata.toolkit as Record<string, unknown>\n : {};\n return {\n id: webhookId ?? readString(row.id ?? row.eventId ?? row.event_id) ?? crypto.randomUUID(),\n type: readString(row.type) ?? 'composio.trigger.message',\n toolkit: readString(metadata.toolkit_slug ?? toolkitRecord.slug ?? row.toolkit ?? row.toolkit_slug),\n trigger: readString(metadata.trigger_slug ?? row.trigger ?? row.triggerName ?? row.trigger_name),\n data,\n };\n}\n\nexport function applyComposioConnectionLifecycleEvent(payload: unknown): void {\n const normalized = normalizeComposioTriggerPayload(payload);\n if (normalized.type !== 'composio.connected_account.expired' && normalized.type !== 'composio.connected_account.deleted') return;\n const providerConnectionId = readString(normalized.data.id ?? normalized.data.nanoid ?? normalized.data.connected_account_id);\n if (!providerConnectionId) return;\n const connection = listConnectorConnections().find((candidate) => (\n candidate.provider === 'composio' && candidate.providerConnectionId === providerConnectionId\n ));\n if (!connection) return;\n upsertConnectorConnection({\n ...connection,\n status: normalized.type.endsWith('.deleted') ? 'revoked' : 'expired',\n isDefault: false,\n lastError: normalized.type.endsWith('.deleted') ? 'Connection was removed in Composio.' : 'Connection expired and requires authorization.',\n });\n}\n\nexport async function appendComposioTriggerEvent(config: Config, payload: unknown): Promise<ComposioTriggerArchiveEntry> {\n const record = payload && typeof payload === 'object' && !Array.isArray(payload) ? payload as Record<string, unknown> : {};\n const normalized = normalizeComposioTriggerPayload(payload);\n const entry: ComposioTriggerArchiveEntry = {\n at: new Date().toISOString(),\n id: normalized.id,\n toolkit: normalized.toolkit ?? readString(record.appName ?? record.app_name),\n trigger: normalized.trigger ?? normalized.type,\n payload,\n };\n const path = archivePath(config);\n await mkdir(dirname(path), { recursive: true });\n const recent = await listComposioTriggerEvents(config, 500);\n const existing = recent.find((candidate) => candidate.id === entry.id);\n if (existing) return existing;\n await appendFile(path, `${JSON.stringify(entry)}\\n`, 'utf8');\n return entry;\n}\n\nexport async function listComposioTriggerEvents(config: Config, limit = 50): Promise<ComposioTriggerArchiveEntry[]> {\n const path = archivePath(config);\n const text = await readFile(path, 'utf8').catch(() => '');\n return text\n .split('\\n')\n .filter(Boolean)\n .slice(-Math.max(1, Math.min(limit, 500)))\n .map((line) => JSON.parse(line) as ComposioTriggerArchiveEntry)\n .reverse();\n}\n"],"mappings":"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"}