@xopcai/xopc 0.0.142 → 0.0.143

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (543) hide show
  1. package/README.md +1 -1
  2. package/dist/browser-ext/manifest.json +1 -1
  3. package/dist/extensions/telegram/xopc.extension.json +1 -1
  4. package/dist/gateway/static/root/assets/activity-center-store-jITiX2vJ.js +1 -0
  5. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BawPxiu5.js → agent-avatar-dicebear-DiME9u_P.js} +1 -1
  6. package/dist/gateway/static/root/assets/agents-DzBXhZXO.js +2 -0
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-81xd1p9R.js → app-management-settings-panel-Cuo7SbUP.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-DYeQsYU8.js → appearance-settings-DUfdNQqk.js} +1 -1
  9. package/dist/gateway/static/root/assets/apps-page-CKuKK5AU.js +1 -0
  10. package/dist/gateway/static/root/assets/{archive-plugin-D_oa7oti.js → archive-plugin-B-Qk6cGr.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-Cd-bwI2N.js → attachment-load-Di6EEbQX.js} +1 -1
  12. package/dist/gateway/static/root/assets/automation-suggestion-card-DGxvRxtO.js +1 -0
  13. package/dist/gateway/static/root/assets/automations-page-D-FF_WKV.js +4 -0
  14. package/dist/gateway/static/root/assets/{binary-plugins-O8svLKWw.js → binary-plugins-ZaOZDH2I.js} +1 -1
  15. package/dist/gateway/static/root/assets/block-editor-BTFhjWfg.js +184 -0
  16. package/dist/gateway/static/root/assets/browser-settings-page-BvKLdEQt.js +8 -0
  17. package/dist/gateway/static/root/assets/{capability-presets-api-dJy1Eqgx.js → capability-presets-api-BU-pVZiZ.js} +1 -1
  18. package/dist/gateway/static/root/assets/capability-presets-settings-panel-DgyeEwzh.js +2 -0
  19. package/dist/gateway/static/root/assets/{channel-recipient-api-Bfuhp2ty.js → channel-recipient-api-DuulnhIj.js} +1 -1
  20. package/dist/gateway/static/root/assets/channels-settings-BbVsdD_I.js +1 -0
  21. package/dist/gateway/static/root/assets/channels-status-swr-B5lVrUsN.js +1 -0
  22. package/dist/gateway/static/root/assets/check-BODqo66o.js +1 -0
  23. package/dist/gateway/static/root/assets/chunk-QUQL4437-DXsxWP7r.js +4 -0
  24. package/dist/gateway/static/root/assets/circle-alert-RzVebuX2.js +1 -0
  25. package/dist/gateway/static/root/assets/connectors-page-B8QqVy3I.js +2 -0
  26. package/dist/gateway/static/root/assets/{desktop-pet-DFMfIb5F.js → desktop-pet---yzVxVR.js} +1 -1
  27. package/dist/gateway/static/root/assets/desktop-pet-settings-Dc3gqBJE.js +1 -0
  28. package/dist/gateway/static/root/assets/{directory-picker-path-field-BrYt1gAr.js → directory-picker-path-field-DCmOGLtK.js} +1 -1
  29. package/dist/gateway/static/root/assets/dreaming-settings-BgT5KZVe.js +3 -0
  30. package/dist/gateway/static/root/assets/{extension-debug-page-Bh630pLD.js → extension-debug-page-ByaKTTq4.js} +1 -1
  31. package/dist/gateway/static/root/assets/extension-page-BmRzHAZr.js +1 -0
  32. package/dist/gateway/static/root/assets/extension-settings-page-JUtwIhbF.js +1 -0
  33. package/dist/gateway/static/root/assets/{fetch-B1WtuprY.js → fetch-8QNN25Sh.js} +1 -1
  34. package/dist/gateway/static/root/assets/{gateway-config-api-De2N821l.js → gateway-config-api-CxicF50_.js} +1 -1
  35. package/dist/gateway/static/root/assets/gateway-settings-Bz2I_EO5.js +1 -0
  36. package/dist/gateway/static/root/assets/{gateway-startup-retry-nEujFSDj.js → gateway-startup-retry-5YBnS9Fj.js} +1 -1
  37. package/dist/gateway/static/root/assets/goal-create-dialog-VcoyuZGN.js +1 -0
  38. package/dist/gateway/static/root/assets/goal-detail-page-Cilkap2G.js +4 -0
  39. package/dist/gateway/static/root/assets/{goals-config-api-DUy3eEse.js → goals-config-api-CwcHRdC0.js} +1 -1
  40. package/dist/gateway/static/root/assets/goals-page-C6eoni4z.js +2 -0
  41. package/dist/gateway/static/root/assets/goals-settings-o4i-qAOS.js +1 -0
  42. package/dist/gateway/static/root/assets/heartbeat-settings-DQQkETX8.js +1 -0
  43. package/dist/gateway/static/root/assets/index-BKRqeRHm.js +257 -0
  44. package/dist/gateway/static/root/assets/index-CphxClbs.css +1 -0
  45. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CVIwwM15.js → keyboard-shortcuts-settings-LT6qB-ua.js} +1 -1
  46. package/dist/gateway/static/root/assets/logs-page-Dli2e3fS.js +7 -0
  47. package/dist/gateway/static/root/assets/{markdown-split-B_6us9j7.js → markdown-split-Dw-yE2-y.js} +1 -1
  48. package/dist/gateway/static/root/assets/{media-plugins-D_fryIyj.js → media-plugins-D9NNNUgE.js} +1 -1
  49. package/dist/gateway/static/root/assets/messages-CzKxM6I4.js +5 -0
  50. package/dist/gateway/static/root/assets/models-hub-panel-DVn2Q1Ik.js +2 -0
  51. package/dist/gateway/static/root/assets/notes-page-CRgbJGgk.js +1 -0
  52. package/dist/gateway/static/root/assets/notes-workbench-BxZRHLWx.js +2 -0
  53. package/dist/gateway/static/root/assets/{page-tabs-D_8jGlqx.js → page-tabs-D4hkWVt_.js} +1 -1
  54. package/dist/gateway/static/root/assets/{preview-open-alternatives-BBLMK8Mp.js → preview-open-alternatives-CIckv0uy.js} +1 -1
  55. package/dist/gateway/static/root/assets/project-detail-page-Doz53xLn.js +1 -0
  56. package/dist/gateway/static/root/assets/projects-page-DoMtcRLg.js +1 -0
  57. package/dist/gateway/static/root/assets/remote-access-hub-BeHVEgrm.js +1 -0
  58. package/dist/gateway/static/root/assets/{save-bar-controls-DVS3FR5r.js → save-bar-controls-B0b42kB2.js} +1 -1
  59. package/dist/gateway/static/root/assets/{schedule-field-D6vKd6-T.js → schedule-field-BtjEkczK.js} +1 -1
  60. package/dist/gateway/static/root/assets/{schema-form-BPy4lbIh.js → schema-form-Bf0bk3i6.js} +1 -1
  61. package/dist/gateway/static/root/assets/sessions-page-Bk4bQsBe.js +1 -0
  62. package/dist/gateway/static/root/assets/settings-advanced-gate-DdFyaRMm.js +1 -0
  63. package/dist/gateway/static/root/assets/{settings-collapsible-section-WzdikxPt.js → settings-collapsible-section-BTKTdTNX.js} +1 -1
  64. package/dist/gateway/static/root/assets/{settings-form-section-CvfzhBV-.js → settings-form-section-DL4P0sAj.js} +1 -1
  65. package/dist/gateway/static/root/assets/{settings-loading-skeleton-BxR-Ulhi.js → settings-loading-skeleton-BV6KFNj4.js} +1 -1
  66. package/dist/gateway/static/root/assets/settings-page-B_4DsX5W.js +1 -0
  67. package/dist/gateway/static/root/assets/{settings-page-layout-CKefvbYi.js → settings-page-layout-CyGlrInB.js} +1 -1
  68. package/dist/gateway/static/root/assets/setup-status-panel-DJ1_MLgX.js +1 -0
  69. package/dist/gateway/static/root/assets/share-preview-page-BQBV7YrV.js +2 -0
  70. package/dist/gateway/static/root/assets/shares-settings-0VuFLBeU.js +1 -0
  71. package/dist/gateway/static/root/assets/skill-reload-api-DO87Ckeo.js +1 -0
  72. package/dist/gateway/static/root/assets/skills-page-D3VdtxAn.js +2 -0
  73. package/dist/gateway/static/root/assets/{system-settings-panel-BokgAgf7.js → system-settings-panel-D85fBBuI.js} +1 -1
  74. package/dist/gateway/static/root/assets/{typed-models-lib-BwHlNL3L.js → typed-models-lib-CwEuYrHX.js} +1 -1
  75. package/dist/gateway/static/root/assets/{use-channel-catalog-DR11ap3A.js → use-channel-catalog-COXIfXcl.js} +1 -1
  76. package/dist/gateway/static/root/assets/user-context-page-m9JVQ73F.js +1 -0
  77. package/dist/gateway/static/root/assets/user-profile-fields-editor-DtQiuY7E.js +1 -0
  78. package/dist/gateway/static/root/assets/user-profile-settings-panel-CWM0fEpb.js +1 -0
  79. package/dist/gateway/static/root/assets/{utils-BKUWB-TT.js → utils--BO6xT3u.js} +1 -1
  80. package/dist/gateway/static/root/assets/voice-api-key-field-LoT3wgZ9.js +1 -0
  81. package/dist/gateway/static/root/assets/with-selector-aYPsXwdl.js +1 -0
  82. package/dist/gateway/static/root/assets/work-item-detail-page-DSTMz_mO.js +1 -0
  83. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-CL_rnAUB.js → workflow-run-setup-panel-B35lJzvm.js} +2 -2
  84. package/dist/gateway/static/root/assets/workflows-page-BfSm9oR8.js +11 -0
  85. package/dist/gateway/static/root/assets/workflows-page-DLioOiRN.css +1 -0
  86. package/dist/gateway/static/root/connector-icons/README.md +11 -0
  87. package/dist/gateway/static/root/connector-icons/airtable.svg +13 -0
  88. package/dist/gateway/static/root/connector-icons/asana.svg +15 -0
  89. package/dist/gateway/static/root/connector-icons/brave-search.svg +1 -0
  90. package/dist/gateway/static/root/connector-icons/clickup.svg +19 -0
  91. package/dist/gateway/static/root/connector-icons/composio.svg +266 -0
  92. package/dist/gateway/static/root/connector-icons/discord.svg +15 -0
  93. package/dist/gateway/static/root/connector-icons/dropbox.svg +152 -0
  94. package/dist/gateway/static/root/connector-icons/excel.svg +56 -0
  95. package/dist/gateway/static/root/connector-icons/fetch.svg +6 -0
  96. package/dist/gateway/static/root/connector-icons/figma.svg +178 -0
  97. package/dist/gateway/static/root/connector-icons/filesystem.svg +6 -0
  98. package/dist/gateway/static/root/connector-icons/github.svg +10 -0
  99. package/dist/gateway/static/root/connector-icons/gmail.svg +3 -0
  100. package/dist/gateway/static/root/connector-icons/google-calendar.svg +3 -0
  101. package/dist/gateway/static/root/connector-icons/google-docs.svg +25 -0
  102. package/dist/gateway/static/root/connector-icons/google-drive.svg +25 -0
  103. package/dist/gateway/static/root/connector-icons/google-sheets.svg +1 -0
  104. package/dist/gateway/static/root/connector-icons/hubspot.svg +142 -0
  105. package/dist/gateway/static/root/connector-icons/jira.svg +15 -0
  106. package/dist/gateway/static/root/connector-icons/linear.svg +5 -0
  107. package/dist/gateway/static/root/connector-icons/memory.svg +5 -0
  108. package/dist/gateway/static/root/connector-icons/microsoft-teams.svg +33 -0
  109. package/dist/gateway/static/root/connector-icons/notion.svg +5 -0
  110. package/dist/gateway/static/root/connector-icons/one-drive.svg +13 -0
  111. package/dist/gateway/static/root/connector-icons/outlook.svg +76 -0
  112. package/dist/gateway/static/root/connector-icons/playwright.svg +9 -0
  113. package/dist/gateway/static/root/connector-icons/salesforce.svg +17 -0
  114. package/dist/gateway/static/root/connector-icons/sequential-thinking.svg +8 -0
  115. package/dist/gateway/static/root/connector-icons/shopify.svg +5 -0
  116. package/dist/gateway/static/root/connector-icons/slack.svg +9 -0
  117. package/dist/gateway/static/root/connector-icons/spotify.svg +43 -0
  118. package/dist/gateway/static/root/connector-icons/stripe.svg +11 -0
  119. package/dist/gateway/static/root/connector-icons/telegram.svg +130 -0
  120. package/dist/gateway/static/root/connector-icons/time.svg +6 -0
  121. package/dist/gateway/static/root/connector-icons/todoist.svg +277 -0
  122. package/dist/gateway/static/root/connector-icons/trello.svg +19 -0
  123. package/dist/gateway/static/root/connector-icons/twitter.svg +128 -0
  124. package/dist/gateway/static/root/connector-icons/whatsapp.svg +61 -0
  125. package/dist/gateway/static/root/connector-icons/youtube.svg +11 -0
  126. package/dist/gateway/static/root/index.html +9 -6
  127. package/dist/package.js +1 -1
  128. package/dist/src/agent/agent-manager.d.ts +2 -0
  129. package/dist/src/agent/agent-manager.js +8 -0
  130. package/dist/src/agent/agent-manager.js.map +1 -1
  131. package/dist/src/agent/background-review/prompts.d.ts +1 -1
  132. package/dist/src/agent/background-review/prompts.js +3 -2
  133. package/dist/src/agent/background-review/prompts.js.map +1 -1
  134. package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
  135. package/dist/src/agent/embedded/xopc-tools-bridge.d.ts +9 -0
  136. package/dist/src/agent/embedded/xopc-tools-bridge.js +71 -3
  137. package/dist/src/agent/embedded/xopc-tools-bridge.js.map +1 -1
  138. package/dist/src/agent/goals/post-turn.js +5 -4
  139. package/dist/src/agent/goals/post-turn.js.map +1 -1
  140. package/dist/src/agent/mcp/mcp-transport.js +4 -1
  141. package/dist/src/agent/mcp/mcp-transport.js.map +1 -1
  142. package/dist/src/agent/memory/context/planner.d.ts +1 -0
  143. package/dist/src/agent/memory/context/planner.js +60 -14
  144. package/dist/src/agent/memory/context/planner.js.map +1 -1
  145. package/dist/src/agent/memory/context/types.d.ts +3 -1
  146. package/dist/src/agent/memory/lifecycle.d.ts +11 -0
  147. package/dist/src/agent/memory/lifecycle.js +50 -0
  148. package/dist/src/agent/memory/lifecycle.js.map +1 -0
  149. package/dist/src/agent/memory/source-origin.d.ts +3 -0
  150. package/dist/src/agent/memory/source-origin.js +19 -0
  151. package/dist/src/agent/memory/source-origin.js.map +1 -0
  152. package/dist/src/agent/memory/understanding/service.js +5 -0
  153. package/dist/src/agent/memory/understanding/service.js.map +1 -1
  154. package/dist/src/agent/memory/user-context-coordinator.js +7 -2
  155. package/dist/src/agent/memory/user-context-coordinator.js.map +1 -1
  156. package/dist/src/agent/prompt/sections/behavior.d.ts +2 -0
  157. package/dist/src/agent/prompt/sections/behavior.js +30 -1
  158. package/dist/src/agent/prompt/sections/behavior.js.map +1 -1
  159. package/dist/src/agent/prompt/sections/tooling.js +1 -1
  160. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  161. package/dist/src/agent/prompt/service-prompt-builder.js +8 -1
  162. package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
  163. package/dist/src/agent/prompt/system-prompt.d.ts +2 -0
  164. package/dist/src/agent/prompt/system-prompt.js +6 -3
  165. package/dist/src/agent/prompt/system-prompt.js.map +1 -1
  166. package/dist/src/agent/service/process-direct-streaming.js +22 -0
  167. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  168. package/dist/src/agent/service.d.ts +2 -0
  169. package/dist/src/agent/service.js +9 -3
  170. package/dist/src/agent/service.js.map +1 -1
  171. package/dist/src/agent/starter-agents.js +1 -1
  172. package/dist/src/agent/starter-agents.js.map +1 -1
  173. package/dist/src/agent/tool-manuals/xopc-use.d.ts +1 -1
  174. package/dist/src/agent/tool-manuals/xopc-use.js +1 -1
  175. package/dist/src/agent/tool-manuals/xopc-use.js.map +1 -1
  176. package/dist/src/agent/tools/composio-tool.d.ts +18 -5
  177. package/dist/src/agent/tools/composio-tool.js +252 -35
  178. package/dist/src/agent/tools/composio-tool.js.map +1 -1
  179. package/dist/src/agent/tools/factory.js +7 -3
  180. package/dist/src/agent/tools/factory.js.map +1 -1
  181. package/dist/src/agent/tools/index.d.ts +1 -1
  182. package/dist/src/agent/tools/index.js +2 -2
  183. package/dist/src/agent/tools/workflow-tool.d.ts +0 -1
  184. package/dist/src/agent/tools/workflow-tool.js +3 -16
  185. package/dist/src/agent/tools/workflow-tool.js.map +1 -1
  186. package/dist/src/agent/workflow/builtins/index.d.ts +2 -28
  187. package/dist/src/agent/workflow/builtins/index.js +226 -41
  188. package/dist/src/agent/workflow/builtins/index.js.map +1 -1
  189. package/dist/src/agent/workflow/catalog.d.ts +32 -34
  190. package/dist/src/agent/workflow/catalog.js +158 -154
  191. package/dist/src/agent/workflow/catalog.js.map +1 -1
  192. package/dist/src/agent/workflow/index.d.ts +4 -6
  193. package/dist/src/agent/workflow/index.js +2 -5
  194. package/dist/src/agent/workflow/snapshot.d.ts +2 -2
  195. package/dist/src/agent/workflow/snapshot.js +2 -2
  196. package/dist/src/agent/workflow/snapshot.js.map +1 -1
  197. package/dist/src/agent/workflow/structured-output-tool.d.ts +2 -2
  198. package/dist/src/agent/workflow/structured-output-tool.js +2 -2
  199. package/dist/src/agent/workflow/structured-output-tool.js.map +1 -1
  200. package/dist/src/agent/workflow/subagent-runner.js +1 -1
  201. package/dist/src/agent/workflow/types.d.ts +31 -26
  202. package/dist/src/agent-manifest/index.d.ts +1 -0
  203. package/dist/src/agent-manifest/index.js +3 -1
  204. package/dist/src/agent-manifest/index.js.map +1 -1
  205. package/dist/src/agent-manifest/preset-chain.d.ts +10 -0
  206. package/dist/src/agent-manifest/preset-chain.js +32 -0
  207. package/dist/src/agent-manifest/preset-chain.js.map +1 -0
  208. package/dist/src/agent-manifest/resolver.js +3 -10
  209. package/dist/src/agent-manifest/resolver.js.map +1 -1
  210. package/dist/src/agent-manifest/schema.d.ts +4 -4
  211. package/dist/src/automations/api/routes.js +13 -1
  212. package/dist/src/automations/api/routes.js.map +1 -1
  213. package/dist/src/automations/domain/validation.d.ts +14 -14
  214. package/dist/src/automations/draft/automation-draft-validator.d.ts +3 -3
  215. package/dist/src/browser/providers/browser-ext-install.d.ts +11 -1
  216. package/dist/src/browser/providers/browser-ext-install.js +39 -14
  217. package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
  218. package/dist/src/capabilities/store-connector.d.ts +0 -1
  219. package/dist/src/capabilities/store-connector.js +3 -5
  220. package/dist/src/capabilities/store-connector.js.map +1 -1
  221. package/dist/src/chat-commands/builtins/review.js +72 -73
  222. package/dist/src/chat-commands/builtins/review.js.map +1 -1
  223. package/dist/src/chat-commands/builtins/workflow.js +9 -54
  224. package/dist/src/chat-commands/builtins/workflow.js.map +1 -1
  225. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  226. package/dist/src/cli/commands/extension-create.js +2 -2
  227. package/dist/src/cli/commands/extension-create.js.map +1 -1
  228. package/dist/src/cli/commands/extension-marketplace.js +42 -36
  229. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  230. package/dist/src/cli/commands/extension-pack.d.ts +6 -0
  231. package/dist/src/cli/commands/extension-pack.js +3 -2
  232. package/dist/src/cli/commands/extension-pack.js.map +1 -1
  233. package/dist/src/commands/agents.config.d.ts +1 -0
  234. package/dist/src/commands/agents.config.js +1 -0
  235. package/dist/src/commands/agents.config.js.map +1 -1
  236. package/dist/src/config/schema.d.ts +6 -6
  237. package/dist/src/config/schema.js +6 -22
  238. package/dist/src/config/schema.js.map +1 -1
  239. package/dist/src/config/web-patch.d.ts +1 -1
  240. package/dist/src/connectors/approval.d.ts +2 -0
  241. package/dist/src/connectors/approval.js +33 -0
  242. package/dist/src/connectors/approval.js.map +1 -0
  243. package/dist/src/connectors/auth-provider-registry.d.ts +9 -0
  244. package/dist/src/connectors/auth-provider-registry.js +17 -0
  245. package/dist/src/connectors/auth-provider-registry.js.map +1 -0
  246. package/dist/src/connectors/builtin-catalog.js +55 -116
  247. package/dist/src/connectors/builtin-catalog.js.map +1 -1
  248. package/dist/src/connectors/catalog.js +7 -2
  249. package/dist/src/connectors/catalog.js.map +1 -1
  250. package/dist/src/connectors/composio-catalog.d.ts +19 -0
  251. package/dist/src/connectors/composio-catalog.js +237 -0
  252. package/dist/src/connectors/composio-catalog.js.map +1 -0
  253. package/dist/src/connectors/composio-logo.d.ts +1 -0
  254. package/dist/src/connectors/composio-logo.js +51 -0
  255. package/dist/src/connectors/composio-logo.js.map +1 -0
  256. package/dist/src/connectors/composio-sessions.d.ts +116 -0
  257. package/dist/src/connectors/composio-sessions.js +296 -0
  258. package/dist/src/connectors/composio-sessions.js.map +1 -0
  259. package/dist/src/connectors/composio-triggers.d.ts +17 -0
  260. package/dist/src/connectors/composio-triggers.js +48 -5
  261. package/dist/src/connectors/composio-triggers.js.map +1 -1
  262. package/dist/src/connectors/composio.d.ts +31 -2
  263. package/dist/src/connectors/composio.js +374 -151
  264. package/dist/src/connectors/composio.js.map +1 -1
  265. package/dist/src/connectors/connector-memory-sync.d.ts +15 -0
  266. package/dist/src/connectors/connector-memory-sync.js +90 -0
  267. package/dist/src/connectors/connector-memory-sync.js.map +1 -0
  268. package/dist/src/connectors/install.js +35 -92
  269. package/dist/src/connectors/install.js.map +1 -1
  270. package/dist/src/connectors/instances.js +6 -2
  271. package/dist/src/connectors/instances.js.map +1 -1
  272. package/dist/src/connectors/integration-strategy.d.ts +3 -0
  273. package/dist/src/connectors/integration-strategy.js +29 -0
  274. package/dist/src/connectors/integration-strategy.js.map +1 -0
  275. package/dist/src/connectors/policy.d.ts +13 -0
  276. package/dist/src/connectors/policy.js +48 -0
  277. package/dist/src/connectors/policy.js.map +1 -0
  278. package/dist/src/connectors/providers.js +1 -1
  279. package/dist/src/connectors/runtime-adapter-registry.d.ts +25 -0
  280. package/dist/src/connectors/runtime-adapter-registry.js +154 -0
  281. package/dist/src/connectors/runtime-adapter-registry.js.map +1 -0
  282. package/dist/src/connectors/types.d.ts +113 -4
  283. package/dist/src/connectors/workflow-preflight.d.ts +20 -0
  284. package/dist/src/connectors/workflow-preflight.js +70 -0
  285. package/dist/src/connectors/workflow-preflight.js.map +1 -0
  286. package/dist/src/extensions/install-transaction.d.ts +16 -0
  287. package/dist/src/extensions/install-transaction.js +76 -0
  288. package/dist/src/extensions/install-transaction.js.map +1 -0
  289. package/dist/src/extensions/install.d.ts +2 -0
  290. package/dist/src/extensions/install.js +23 -1
  291. package/dist/src/extensions/install.js.map +1 -1
  292. package/dist/src/gateway/agents-admin.d.ts +2 -0
  293. package/dist/src/gateway/agents-admin.js +7 -0
  294. package/dist/src/gateway/agents-admin.js.map +1 -1
  295. package/dist/src/gateway/capability-presets-admin.d.ts +11 -0
  296. package/dist/src/gateway/capability-presets-admin.js +11 -4
  297. package/dist/src/gateway/capability-presets-admin.js.map +1 -1
  298. package/dist/src/gateway/chat-stream/mapper.js +17 -0
  299. package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
  300. package/dist/src/gateway/chat-stream/protocol.d.ts +18 -1
  301. package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -3
  302. package/dist/src/gateway/hono/routes/agents.js +3 -0
  303. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  304. package/dist/src/gateway/hono/routes/capability-presets.js +19 -1
  305. package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -1
  306. package/dist/src/gateway/hono/routes/connectors.js +188 -25
  307. package/dist/src/gateway/hono/routes/connectors.js.map +1 -1
  308. package/dist/src/gateway/hono/routes/goals.js +22 -3
  309. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  310. package/dist/src/gateway/hono/routes/home.d.ts +60 -1
  311. package/dist/src/gateway/hono/routes/home.js +244 -18
  312. package/dist/src/gateway/hono/routes/home.js.map +1 -1
  313. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  314. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  315. package/dist/src/gateway/hono/routes/memory.js +14 -1
  316. package/dist/src/gateway/hono/routes/memory.js.map +1 -1
  317. package/dist/src/gateway/hono/routes/projects.js +103 -2
  318. package/dist/src/gateway/hono/routes/projects.js.map +1 -1
  319. package/dist/src/gateway/hono/routes/public-gateway.js +93 -0
  320. package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
  321. package/dist/src/gateway/hono/routes/workflows.js +137 -22
  322. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  323. package/dist/src/gateway/hono/routes/you.d.ts +23 -0
  324. package/dist/src/gateway/hono/routes/you.js +538 -0
  325. package/dist/src/gateway/hono/routes/you.js.map +1 -0
  326. package/dist/src/gateway/hono/sse.d.ts +2 -1
  327. package/dist/src/gateway/hono/sse.js +2 -1
  328. package/dist/src/gateway/hono/sse.js.map +1 -1
  329. package/dist/src/gateway/service/marketplace-service.d.ts +13 -1
  330. package/dist/src/gateway/service/marketplace-service.js +96 -40
  331. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  332. package/dist/src/gateway/service.d.ts +2 -0
  333. package/dist/src/gateway/service.js +7 -1
  334. package/dist/src/gateway/service.js.map +1 -1
  335. package/dist/src/goals/goal-service.d.ts +7 -5
  336. package/dist/src/goals/goal-service.js +25 -13
  337. package/dist/src/goals/goal-service.js.map +1 -1
  338. package/dist/src/goals/goal-store.js +46 -7
  339. package/dist/src/goals/goal-store.js.map +1 -1
  340. package/dist/src/goals/types.d.ts +24 -0
  341. package/dist/src/storage/sqlite/connector-repository.d.ts +49 -0
  342. package/dist/src/storage/sqlite/connector-repository.js +385 -0
  343. package/dist/src/storage/sqlite/connector-repository.js.map +1 -0
  344. package/dist/src/storage/sqlite/index.d.ts +3 -0
  345. package/dist/src/storage/sqlite/index.js +4 -1
  346. package/dist/src/storage/sqlite/migrations/030_connectors.sql +94 -0
  347. package/dist/src/storage/sqlite/migrations/031_connector_approvals.sql +24 -0
  348. package/dist/src/storage/sqlite/migrations/032_connector_webhook_deliveries.sql +15 -0
  349. package/dist/src/storage/sqlite/migrations/033_user_trust_policies.sql +6 -0
  350. package/dist/src/storage/sqlite/migrations/034_allow_global_auto_trust.sql +14 -0
  351. package/dist/src/storage/sqlite/migrations/035_user_profile_prompt_state.sql +7 -0
  352. package/dist/src/storage/sqlite/migrations/036_goal_outcome_metric.sql +12 -0
  353. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  354. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  355. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  356. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  357. package/dist/src/storage/sqlite/schema.js +1 -1
  358. package/dist/src/storage/sqlite/user-profile-setup-repository.d.ts +3 -0
  359. package/dist/src/storage/sqlite/user-profile-setup-repository.js +34 -0
  360. package/dist/src/storage/sqlite/user-profile-setup-repository.js.map +1 -0
  361. package/dist/src/storage/sqlite/user-trust-repository.d.ts +3 -0
  362. package/dist/src/storage/sqlite/user-trust-repository.js +34 -0
  363. package/dist/src/storage/sqlite/user-trust-repository.js.map +1 -0
  364. package/dist/src/tui/components/assistant-message.js +15 -0
  365. package/dist/src/tui/components/assistant-message.js.map +1 -1
  366. package/dist/src/tui/tui-agent-events.js +85 -1
  367. package/dist/src/tui/tui-agent-events.js.map +1 -1
  368. package/dist/src/tui/tui-command-formatters.js +7 -7
  369. package/dist/src/tui/tui-command-formatters.js.map +1 -1
  370. package/dist/src/tui/tui-commands.js +1 -1
  371. package/dist/src/tui/tui-startup-resources.js +1 -1
  372. package/dist/src/user-context/import.d.ts +12 -0
  373. package/dist/src/user-context/import.js +48 -0
  374. package/dist/src/user-context/import.js.map +1 -0
  375. package/dist/src/user-context/profile.d.ts +37 -0
  376. package/dist/src/user-context/profile.js +165 -0
  377. package/dist/src/user-context/profile.js.map +1 -0
  378. package/dist/src/user-context/projection.d.ts +54 -0
  379. package/dist/src/user-context/projection.js +121 -0
  380. package/dist/src/user-context/projection.js.map +1 -0
  381. package/dist/src/user-context/source-recommendations.d.ts +13 -0
  382. package/dist/src/user-context/source-recommendations.js +86 -0
  383. package/dist/src/user-context/source-recommendations.js.map +1 -0
  384. package/dist/src/user-context/trust-policy.d.ts +11 -0
  385. package/dist/src/user-context/trust-policy.js +31 -0
  386. package/dist/src/user-context/trust-policy.js.map +1 -0
  387. package/dist/src/workflows/authoring/index.d.ts +1 -0
  388. package/dist/src/workflows/authoring/index.js +2 -0
  389. package/dist/src/workflows/authoring/workflow-draft-store.d.ts +33 -0
  390. package/dist/src/workflows/authoring/workflow-draft-store.js +74 -0
  391. package/dist/src/workflows/authoring/workflow-draft-store.js.map +1 -0
  392. package/dist/src/workflows/domain/definition-utils.d.ts +6 -4
  393. package/dist/src/workflows/domain/definition-utils.js +28 -26
  394. package/dist/src/workflows/domain/definition-utils.js.map +1 -1
  395. package/dist/src/workflows/domain/definition.d.ts +79 -6
  396. package/dist/src/workflows/domain/event.d.ts +18 -2
  397. package/dist/src/workflows/domain/index.js +3 -3
  398. package/dist/src/workflows/domain/run.d.ts +16 -2
  399. package/dist/src/workflows/domain/run.js.map +1 -1
  400. package/dist/src/workflows/domain/validation.d.ts +9 -5
  401. package/dist/src/workflows/domain/validation.js +183 -40
  402. package/dist/src/workflows/domain/validation.js.map +1 -1
  403. package/dist/src/workflows/draft/workflow-draft-prompt.d.ts +2 -3
  404. package/dist/src/workflows/draft/workflow-draft-prompt.js +31 -73
  405. package/dist/src/workflows/draft/workflow-draft-prompt.js.map +1 -1
  406. package/dist/src/workflows/draft/workflow-draft-service.js +4 -8
  407. package/dist/src/workflows/draft/workflow-draft-service.js.map +1 -1
  408. package/dist/src/workflows/draft/workflow-draft-validator.js +29 -37
  409. package/dist/src/workflows/draft/workflow-draft-validator.js.map +1 -1
  410. package/dist/src/workflows/draft/workflow-draft.types.d.ts +4 -4
  411. package/dist/src/workflows/engine/projector.js +43 -1
  412. package/dist/src/workflows/engine/projector.js.map +1 -1
  413. package/dist/src/workflows/engine/workflow-engine.d.ts +2 -3
  414. package/dist/src/workflows/engine/workflow-engine.js +24 -4
  415. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  416. package/dist/src/workflows/index.js +4 -7
  417. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +1 -9
  418. package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -1
  419. package/dist/src/workflows/runtime/graph-workflow-runtime.d.ts +10 -0
  420. package/dist/src/workflows/runtime/graph-workflow-runtime.js +295 -0
  421. package/dist/src/workflows/runtime/graph-workflow-runtime.js.map +1 -0
  422. package/dist/src/workflows/runtime/index.d.ts +1 -2
  423. package/dist/src/workflows/runtime/index.js +2 -5
  424. package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +5 -8
  425. package/dist/src/workflows/service/workflow-run-service.js +15 -1
  426. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  427. package/dist/src/workflows/service/workflow-run-service.types.d.ts +2 -1
  428. package/package.json +4 -3
  429. package/dist/gateway/static/root/assets/agents-CyvCIHnB.js +0 -2
  430. package/dist/gateway/static/root/assets/apps-page-DK_Vx6nl.js +0 -1
  431. package/dist/gateway/static/root/assets/automation-suggestion-card-B1LV3YYv.js +0 -1
  432. package/dist/gateway/static/root/assets/automations-page-fzrovqhv.js +0 -4
  433. package/dist/gateway/static/root/assets/block-editor-Dhj5f4Bx.js +0 -184
  434. package/dist/gateway/static/root/assets/browser-settings-page-BDn-n-UB.js +0 -8
  435. package/dist/gateway/static/root/assets/capability-presets-settings-panel-Co5ipo_Q.js +0 -1
  436. package/dist/gateway/static/root/assets/channels-settings-BWlpaxg9.js +0 -1
  437. package/dist/gateway/static/root/assets/channels-status-swr-D_jkIZLV.js +0 -1
  438. package/dist/gateway/static/root/assets/connectors-page-BcekbW4q.js +0 -2
  439. package/dist/gateway/static/root/assets/desktop-pet-settings-BJCUuL8Y.js +0 -1
  440. package/dist/gateway/static/root/assets/dreaming-settings-BN1Z2mIo.js +0 -3
  441. package/dist/gateway/static/root/assets/extension-page-B-1KxvVy.js +0 -1
  442. package/dist/gateway/static/root/assets/extension-settings-page-BF9NACI3.js +0 -1
  443. package/dist/gateway/static/root/assets/gateway-settings-DN9sNREz.js +0 -1
  444. package/dist/gateway/static/root/assets/goal-create-dialog-BpoQW8cD.js +0 -1
  445. package/dist/gateway/static/root/assets/goal-detail-page-CBRSPd0b.js +0 -4
  446. package/dist/gateway/static/root/assets/goals-page-BCcBi407.js +0 -2
  447. package/dist/gateway/static/root/assets/goals-settings-pkTXzXkh.js +0 -1
  448. package/dist/gateway/static/root/assets/heartbeat-settings-ezsufgLQ.js +0 -1
  449. package/dist/gateway/static/root/assets/index-B8s8Pq5U.css +0 -1
  450. package/dist/gateway/static/root/assets/index-DcUaXYeb.js +0 -262
  451. package/dist/gateway/static/root/assets/logs-page-DQtTRXtj.js +0 -7
  452. package/dist/gateway/static/root/assets/messages-BXNELNBa.js +0 -3
  453. package/dist/gateway/static/root/assets/models-hub-panel-BP2M9n6Q.js +0 -2
  454. package/dist/gateway/static/root/assets/notes-page-CspveYaO.js +0 -1
  455. package/dist/gateway/static/root/assets/notes-workbench-BHwzJ0OC.js +0 -2
  456. package/dist/gateway/static/root/assets/project-detail-page-Dy3rsobs.js +0 -1
  457. package/dist/gateway/static/root/assets/projects-page-CWKpPE0L.js +0 -1
  458. package/dist/gateway/static/root/assets/remote-access-hub-CqNRyXEo.js +0 -1
  459. package/dist/gateway/static/root/assets/sessions-page-MEME7ivF.js +0 -1
  460. package/dist/gateway/static/root/assets/settings-advanced-gate-JVd0qaSF.js +0 -1
  461. package/dist/gateway/static/root/assets/settings-page-DYEbB1EV.js +0 -1
  462. package/dist/gateway/static/root/assets/setup-status-panel-dWN8BJ3z.js +0 -1
  463. package/dist/gateway/static/root/assets/share-preview-page-D8foINzP.js +0 -2
  464. package/dist/gateway/static/root/assets/shares-settings-Tgbv1s7G.js +0 -1
  465. package/dist/gateway/static/root/assets/skill-reload-api-D_YK0b_Z.js +0 -1
  466. package/dist/gateway/static/root/assets/skills-page-DGytfoZK.js +0 -2
  467. package/dist/gateway/static/root/assets/toast-z0toXu32.js +0 -1
  468. package/dist/gateway/static/root/assets/user-profile-settings-panel-8YtygcJp.js +0 -1
  469. package/dist/gateway/static/root/assets/voice-api-key-field-BVH71EFf.js +0 -1
  470. package/dist/gateway/static/root/assets/work-item-detail-page-JeTE7XNM.js +0 -1
  471. package/dist/gateway/static/root/assets/workflow-start-dialog-_u8Uc1ze.js +0 -1
  472. package/dist/gateway/static/root/assets/workflows-page-ixgk_y1l.js +0 -18
  473. package/dist/src/agent/workflow/builtins/audit-repo.d.ts +0 -13
  474. package/dist/src/agent/workflow/builtins/audit-repo.js +0 -183
  475. package/dist/src/agent/workflow/builtins/audit-repo.js.map +0 -1
  476. package/dist/src/agent/workflow/builtins/client-proposal.d.ts +0 -12
  477. package/dist/src/agent/workflow/builtins/client-proposal.js +0 -164
  478. package/dist/src/agent/workflow/builtins/client-proposal.js.map +0 -1
  479. package/dist/src/agent/workflow/builtins/competitor-scan.d.ts +0 -12
  480. package/dist/src/agent/workflow/builtins/competitor-scan.js +0 -164
  481. package/dist/src/agent/workflow/builtins/competitor-scan.js.map +0 -1
  482. package/dist/src/agent/workflow/builtins/content-draft.d.ts +0 -13
  483. package/dist/src/agent/workflow/builtins/content-draft.js +0 -159
  484. package/dist/src/agent/workflow/builtins/content-draft.js.map +0 -1
  485. package/dist/src/agent/workflow/builtins/content-repurpose.d.ts +0 -11
  486. package/dist/src/agent/workflow/builtins/content-repurpose.js +0 -146
  487. package/dist/src/agent/workflow/builtins/content-repurpose.js.map +0 -1
  488. package/dist/src/agent/workflow/builtins/debug-incident.d.ts +0 -13
  489. package/dist/src/agent/workflow/builtins/debug-incident.js +0 -177
  490. package/dist/src/agent/workflow/builtins/debug-incident.js.map +0 -1
  491. package/dist/src/agent/workflow/builtins/decision-compare.d.ts +0 -13
  492. package/dist/src/agent/workflow/builtins/decision-compare.js +0 -187
  493. package/dist/src/agent/workflow/builtins/decision-compare.js.map +0 -1
  494. package/dist/src/agent/workflow/builtins/implementation-plan.d.ts +0 -12
  495. package/dist/src/agent/workflow/builtins/implementation-plan.js +0 -185
  496. package/dist/src/agent/workflow/builtins/implementation-plan.js.map +0 -1
  497. package/dist/src/agent/workflow/builtins/inbox-triage.d.ts +0 -11
  498. package/dist/src/agent/workflow/builtins/inbox-triage.js +0 -158
  499. package/dist/src/agent/workflow/builtins/inbox-triage.js.map +0 -1
  500. package/dist/src/agent/workflow/builtins/meeting-prep.d.ts +0 -12
  501. package/dist/src/agent/workflow/builtins/meeting-prep.js +0 -152
  502. package/dist/src/agent/workflow/builtins/meeting-prep.js.map +0 -1
  503. package/dist/src/agent/workflow/builtins/multi-perspective-review.d.ts +0 -14
  504. package/dist/src/agent/workflow/builtins/multi-perspective-review.js +0 -171
  505. package/dist/src/agent/workflow/builtins/multi-perspective-review.js.map +0 -1
  506. package/dist/src/agent/workflow/builtins/offer-design.d.ts +0 -12
  507. package/dist/src/agent/workflow/builtins/offer-design.js +0 -170
  508. package/dist/src/agent/workflow/builtins/offer-design.js.map +0 -1
  509. package/dist/src/agent/workflow/builtins/pr-review.d.ts +0 -12
  510. package/dist/src/agent/workflow/builtins/pr-review.js +0 -178
  511. package/dist/src/agent/workflow/builtins/pr-review.js.map +0 -1
  512. package/dist/src/agent/workflow/builtins/release-check.d.ts +0 -11
  513. package/dist/src/agent/workflow/builtins/release-check.js +0 -174
  514. package/dist/src/agent/workflow/builtins/release-check.js.map +0 -1
  515. package/dist/src/agent/workflow/builtins/research.d.ts +0 -13
  516. package/dist/src/agent/workflow/builtins/research.js +0 -188
  517. package/dist/src/agent/workflow/builtins/research.js.map +0 -1
  518. package/dist/src/agent/workflow/builtins/weekly-review.d.ts +0 -12
  519. package/dist/src/agent/workflow/builtins/weekly-review.js +0 -139
  520. package/dist/src/agent/workflow/builtins/weekly-review.js.map +0 -1
  521. package/dist/src/agent/workflow/last-run-memory.d.ts +0 -42
  522. package/dist/src/agent/workflow/last-run-memory.js +0 -60
  523. package/dist/src/agent/workflow/last-run-memory.js.map +0 -1
  524. package/dist/src/agent/workflow/lint.d.ts +0 -38
  525. package/dist/src/agent/workflow/lint.js +0 -74
  526. package/dist/src/agent/workflow/lint.js.map +0 -1
  527. package/dist/src/agent/workflow/meta-locale.d.ts +0 -12
  528. package/dist/src/agent/workflow/meta-locale.js +0 -62
  529. package/dist/src/agent/workflow/meta-locale.js.map +0 -1
  530. package/dist/src/agent/workflow/parser.d.ts +0 -20
  531. package/dist/src/agent/workflow/parser.js +0 -152
  532. package/dist/src/agent/workflow/parser.js.map +0 -1
  533. package/dist/src/agent/workflow/runtime.d.ts +0 -34
  534. package/dist/src/agent/workflow/runtime.js +0 -402
  535. package/dist/src/agent/workflow/runtime.js.map +0 -1
  536. package/dist/src/connectors/oauth.d.ts +0 -22
  537. package/dist/src/connectors/oauth.js +0 -99
  538. package/dist/src/connectors/oauth.js.map +0 -1
  539. package/dist/src/workflows/runtime/script-runtime.d.ts +0 -3
  540. package/dist/src/workflows/runtime/script-runtime.js +0 -3
  541. package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +0 -5
  542. package/dist/src/workflows/runtime/script-workflow-runtime.js +0 -15
  543. package/dist/src/workflows/runtime/script-workflow-runtime.js.map +0 -1
@@ -0,0 +1,48 @@
1
+ //#region src/connectors/policy.ts
2
+ const SCOPE_ORDER = {
3
+ read: 1,
4
+ write: 2,
5
+ admin: 3
6
+ };
7
+ function requiresConfirmation(policy, scope) {
8
+ if (policy === "always") return true;
9
+ if (policy === "writes") return scope === "write" || scope === "admin";
10
+ if (policy === "admin") return scope === "admin";
11
+ return false;
12
+ }
13
+ /** Evaluate every local policy layer before an external connector action is called. */
14
+ function evaluateConnectorExecutionPolicy(input) {
15
+ const { installation, action } = input;
16
+ if (!installation.enabled) return {
17
+ decision: "denied",
18
+ reason: "Connector is disabled."
19
+ };
20
+ if (installation.allowedAgentIds.length > 0 && (!input.agentId || !installation.allowedAgentIds.includes(input.agentId))) return {
21
+ decision: "denied",
22
+ reason: "Agent is not allowed to use this connector."
23
+ };
24
+ if (installation.selectedConnectionIds.length > 0 && (!input.connectionId || !installation.selectedConnectionIds.includes(input.connectionId))) return {
25
+ decision: "denied",
26
+ reason: "Connection is not allowed by this connector policy."
27
+ };
28
+ if (SCOPE_ORDER[installation.maxScope] < SCOPE_ORDER[action.scope]) return {
29
+ decision: "denied",
30
+ reason: `Action requires ${action.scope} scope; connector allows ${installation.maxScope}.`
31
+ };
32
+ if (!action.curated && installation.maxScope !== "admin") return {
33
+ decision: "denied",
34
+ reason: "Unverified connector actions require admin scope."
35
+ };
36
+ if (!input.confirmed && requiresConfirmation(installation.confirmationPolicy, action.scope)) return {
37
+ decision: "confirmation_required",
38
+ reason: `Action requires ${action.scope} confirmation.`
39
+ };
40
+ return {
41
+ decision: "allowed",
42
+ reason: "Connector policy allows this action."
43
+ };
44
+ }
45
+ //#endregion
46
+ export { evaluateConnectorExecutionPolicy };
47
+
48
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","names":[],"sources":["../../../src/connectors/policy.ts"],"sourcesContent":["import type {\n ConnectorActionMetadata,\n ConnectorExecutionDecision,\n ConnectorInstallationPolicy,\n ConnectorScope,\n} from './types.js';\n\nconst SCOPE_ORDER: Record<ConnectorScope, number> = {\n read: 1,\n write: 2,\n admin: 3,\n};\n\nexport type ConnectorPolicyEvaluation = {\n decision: ConnectorExecutionDecision;\n reason: string;\n};\n\nfunction requiresConfirmation(\n policy: ConnectorInstallationPolicy['confirmationPolicy'],\n scope: ConnectorScope,\n): boolean {\n if (policy === 'always') return true;\n if (policy === 'writes') return scope === 'write' || scope === 'admin';\n if (policy === 'admin') return scope === 'admin';\n return false;\n}\n\n/** Evaluate every local policy layer before an external connector action is called. */\nexport function evaluateConnectorExecutionPolicy(input: {\n installation: ConnectorInstallationPolicy;\n action: Pick<ConnectorActionMetadata, 'scope' | 'curated'>;\n agentId?: string;\n connectionId?: string;\n confirmed?: boolean;\n}): ConnectorPolicyEvaluation {\n const { installation, action } = input;\n if (!installation.enabled) {\n return { decision: 'denied', reason: 'Connector is disabled.' };\n }\n if (\n installation.allowedAgentIds.length > 0 &&\n (!input.agentId || !installation.allowedAgentIds.includes(input.agentId))\n ) {\n return { decision: 'denied', reason: 'Agent is not allowed to use this connector.' };\n }\n if (\n installation.selectedConnectionIds.length > 0 &&\n (!input.connectionId || !installation.selectedConnectionIds.includes(input.connectionId))\n ) {\n return { decision: 'denied', reason: 'Connection is not allowed by this connector policy.' };\n }\n if (SCOPE_ORDER[installation.maxScope] < SCOPE_ORDER[action.scope]) {\n return {\n decision: 'denied',\n reason: `Action requires ${action.scope} scope; connector allows ${installation.maxScope}.`,\n };\n }\n if (!action.curated && installation.maxScope !== 'admin') {\n return {\n decision: 'denied',\n reason: 'Unverified connector actions require admin scope.',\n };\n }\n if (!input.confirmed && requiresConfirmation(installation.confirmationPolicy, action.scope)) {\n return {\n decision: 'confirmation_required',\n reason: `Action requires ${action.scope} confirmation.`,\n };\n }\n return { decision: 'allowed', reason: 'Connector policy allows this action.' };\n}\n"],"mappings":";AAOA,MAAM,cAA8C;CAClD,MAAM;CACN,OAAO;CACP,OAAO;CACR;AAOD,SAAS,qBACP,QACA,OACS;AACT,KAAI,WAAW,SAAU,QAAO;AAChC,KAAI,WAAW,SAAU,QAAO,UAAU,WAAW,UAAU;AAC/D,KAAI,WAAW,QAAS,QAAO,UAAU;AACzC,QAAO;;;AAIT,SAAgB,iCAAiC,OAMnB;CAC5B,MAAM,EAAE,cAAc,WAAW;AACjC,KAAI,CAAC,aAAa,QAChB,QAAO;EAAE,UAAU;EAAU,QAAQ;EAA0B;AAEjE,KACE,aAAa,gBAAgB,SAAS,MACrC,CAAC,MAAM,WAAW,CAAC,aAAa,gBAAgB,SAAS,MAAM,QAAQ,EAExE,QAAO;EAAE,UAAU;EAAU,QAAQ;EAA+C;AAEtF,KACE,aAAa,sBAAsB,SAAS,MAC3C,CAAC,MAAM,gBAAgB,CAAC,aAAa,sBAAsB,SAAS,MAAM,aAAa,EAExF,QAAO;EAAE,UAAU;EAAU,QAAQ;EAAuD;AAE9F,KAAI,YAAY,aAAa,YAAY,YAAY,OAAO,OAC1D,QAAO;EACL,UAAU;EACV,QAAQ,mBAAmB,OAAO,MAAM,2BAA2B,aAAa,SAAS;EAC1F;AAEH,KAAI,CAAC,OAAO,WAAW,aAAa,aAAa,QAC/C,QAAO;EACL,UAAU;EACV,QAAQ;EACT;AAEH,KAAI,CAAC,MAAM,aAAa,qBAAqB,aAAa,oBAAoB,OAAO,MAAM,CACzF,QAAO;EACL,UAAU;EACV,QAAQ,mBAAmB,OAAO,MAAM;EACzC;AAEH,QAAO;EAAE,UAAU;EAAW,QAAQ;EAAwC"}
@@ -1,5 +1,5 @@
1
- import { COMPOSIO_CONNECTORS } from "./composio.js";
2
1
  import { BUILTIN_CONNECTORS } from "./builtin-catalog.js";
2
+ import { COMPOSIO_CONNECTORS } from "./composio.js";
3
3
  //#region src/connectors/providers.ts
4
4
  const builtinConnectorProvider = {
5
5
  id: "builtin",
@@ -0,0 +1,25 @@
1
+ import type { CredentialResolver } from '../auth/credentials.js';
2
+ import type { Config } from '../config/schema.js';
3
+ import type { ConnectorDefinition, ConnectorInstallInput, ConnectorInstance, ConnectorRuntimeDefinition } from './types.js';
4
+ export type ConnectorRuntimeInstallContext = {
5
+ config: Config;
6
+ definition: ConnectorDefinition;
7
+ input: ConnectorInstallInput;
8
+ resolver: CredentialResolver;
9
+ };
10
+ export type ConnectorRuntimeUninstallContext = {
11
+ config: Config;
12
+ definition: ConnectorDefinition;
13
+ instance: ConnectorInstance;
14
+ };
15
+ export type ConnectorRuntimeUpdateContext = ConnectorRuntimeInstallContext & {
16
+ instanceId: string;
17
+ };
18
+ export type ConnectorRuntimeAdapter = {
19
+ type: ConnectorRuntimeDefinition['type'];
20
+ install(context: ConnectorRuntimeInstallContext): Promise<ConnectorInstance>;
21
+ uninstall(context: ConnectorRuntimeUninstallContext): void;
22
+ update?(context: ConnectorRuntimeUpdateContext): ConnectorInstance;
23
+ };
24
+ export declare function registerConnectorRuntimeAdapter(adapter: ConnectorRuntimeAdapter): void;
25
+ export declare function getConnectorRuntimeAdapter(type: ConnectorRuntimeDefinition['type']): ConnectorRuntimeAdapter;
@@ -0,0 +1,154 @@
1
+ import { isXopcDatabaseOpen } from "../storage/sqlite/connection.js";
2
+ import { deleteConnectorInstallation, getConnectorInstallation, upsertConnectorInstallation } from "../storage/sqlite/connector-repository.js";
3
+ import "../storage/sqlite/index.js";
4
+ import { assertComposioApiKeyConfigured } from "./composio-sessions.js";
5
+ import { saveComposioApiKey } from "./composio.js";
6
+ import { saveConnectorSecrets } from "./secret-store.js";
7
+ import { isManagedConnectorServer, materializeConnectorMcpServer } from "./materialize.js";
8
+ import { appendConnectorAuditRecord } from "./usage.js";
9
+ import { listConnectorInstances } from "./instances.js";
10
+ //#region src/connectors/runtime-adapter-registry.ts
11
+ const adapters = /* @__PURE__ */ new Map();
12
+ function registerConnectorRuntimeAdapter(adapter) {
13
+ if (adapters.has(adapter.type)) throw new Error(`Connector runtime adapter is already registered: ${adapter.type}`);
14
+ adapters.set(adapter.type, adapter);
15
+ }
16
+ function installedInstance(config, instanceId, connectorId) {
17
+ const instance = listConnectorInstances(config).find((candidate) => candidate.instanceId === instanceId);
18
+ if (!instance) throw new Error(`Connector "${connectorId}" was installed but could not be resolved.`);
19
+ return instance;
20
+ }
21
+ function installRecord(config, definition, extra = {}) {
22
+ const instanceId = definition.id;
23
+ config.connectors = config.connectors ?? {};
24
+ config.connectors.instances = {
25
+ ...config.connectors.instances ?? {},
26
+ [instanceId]: {
27
+ xopcConnector: {
28
+ managed: true,
29
+ connectorId: definition.id,
30
+ version: definition.version,
31
+ enabled: true,
32
+ displayName: definition.displayName,
33
+ source: definition.source,
34
+ artifactSha256: definition.provenance?.sha256
35
+ },
36
+ runtime: definition.runtime,
37
+ ...extra
38
+ }
39
+ };
40
+ return installedInstance(config, instanceId, definition.id);
41
+ }
42
+ function uninstallRecord(config, instanceId) {
43
+ if (!config.connectors?.instances?.[instanceId]) throw new Error(`Connector instance not found: ${instanceId}`);
44
+ const nextInstances = { ...config.connectors?.instances ?? {} };
45
+ delete nextInstances[instanceId];
46
+ config.connectors = {
47
+ ...config.connectors ?? {},
48
+ instances: nextInstances
49
+ };
50
+ }
51
+ registerConnectorRuntimeAdapter({
52
+ type: "mcp",
53
+ async install({ config, definition, input, resolver }) {
54
+ if (definition.runtime.type !== "mcp") throw new Error(`Invalid MCP connector definition: ${definition.id}`);
55
+ const { serverId, server } = materializeConnectorMcpServer(definition, input);
56
+ const existingServer = config.mcp?.servers?.[serverId];
57
+ if (existingServer && !isManagedConnectorServer(existingServer)) throw new Error(`MCP server "${serverId}" already exists and is not managed by Connectors.`);
58
+ await saveConnectorSecrets(definition, input, resolver);
59
+ config.mcp = config.mcp ?? {};
60
+ config.mcp.servers = {
61
+ ...config.mcp.servers ?? {},
62
+ [serverId]: server
63
+ };
64
+ const instance = installedInstance(config, serverId, definition.id);
65
+ appendConnectorAuditRecord(config, serverId, { action: "installed" });
66
+ return instance;
67
+ },
68
+ uninstall({ config, instance }) {
69
+ const server = config.mcp?.servers?.[instance.instanceId];
70
+ if (!server || !isManagedConnectorServer(server)) throw new Error(`MCP server "${instance.instanceId}" is not managed by Connectors.`);
71
+ appendConnectorAuditRecord(config, instance.instanceId, { action: "removed" });
72
+ const nextServers = { ...config.mcp?.servers ?? {} };
73
+ delete nextServers[instance.instanceId];
74
+ config.mcp = {
75
+ ...config.mcp ?? {},
76
+ servers: nextServers
77
+ };
78
+ },
79
+ update({ config, definition, input, instanceId }) {
80
+ if (definition.runtime.type !== "mcp") throw new Error(`Invalid MCP connector definition: ${definition.id}`);
81
+ const existingServer = config.mcp?.servers?.[instanceId];
82
+ if (!existingServer || !isManagedConnectorServer(existingServer)) throw new Error(`MCP server "${instanceId}" is not managed by Connectors.`);
83
+ if ((definition.setup.secrets ?? []).length > 0) throw new Error("Connectors with secrets must be reinstalled to change configuration.");
84
+ const { serverId, server } = materializeConnectorMcpServer(definition, input);
85
+ if (serverId !== instanceId) throw new Error(`Connector config update cannot change server id from "${instanceId}" to "${serverId}".`);
86
+ config.mcp = config.mcp ?? {};
87
+ config.mcp.servers = {
88
+ ...config.mcp.servers ?? {},
89
+ [serverId]: {
90
+ ...server,
91
+ xopcConnector: {
92
+ ...existingServer.xopcConnector,
93
+ ...server.xopcConnector,
94
+ enabled: existingServer.xopcConnector.enabled,
95
+ lastConnectedAt: existingServer.xopcConnector.lastConnectedAt,
96
+ lastError: existingServer.xopcConnector.lastError
97
+ }
98
+ }
99
+ };
100
+ return installedInstance(config, serverId, definition.id);
101
+ }
102
+ });
103
+ registerConnectorRuntimeAdapter({
104
+ type: "composio",
105
+ async install({ config, definition, input, resolver }) {
106
+ if (definition.runtime.type !== "composio") throw new Error(`Invalid Composio connector definition: ${definition.id}`);
107
+ if (definition.runtime.role === "credential") await saveComposioApiKey(input, resolver);
108
+ if (definition.runtime.role === "toolkit") await assertComposioApiKeyConfigured(resolver);
109
+ const instance = installRecord(config, definition, definition.runtime.role === "toolkit" ? { scope: "read" } : {});
110
+ if (definition.runtime.role === "toolkit" && isXopcDatabaseOpen()) {
111
+ const installationId = `${definition.id}-local-owner`;
112
+ const existing = getConnectorInstallation(installationId);
113
+ upsertConnectorInstallation({
114
+ id: installationId,
115
+ connectorId: definition.id,
116
+ principalId: "local-owner",
117
+ enabled: true,
118
+ allowedAgentIds: existing?.allowedAgentIds ?? [],
119
+ maxScope: "read",
120
+ confirmationPolicy: existing?.confirmationPolicy ?? "writes",
121
+ selectedConnectionIds: existing?.selectedConnectionIds ?? [],
122
+ createdAt: existing?.createdAt
123
+ });
124
+ }
125
+ return instance;
126
+ },
127
+ uninstall({ config, definition, instance }) {
128
+ if (definition.runtime.type !== "composio") throw new Error(`Invalid Composio connector definition: ${definition.id}`);
129
+ uninstallRecord(config, instance.instanceId);
130
+ if (definition.runtime.role === "toolkit" && isXopcDatabaseOpen()) deleteConnectorInstallation(`${definition.id}-local-owner`);
131
+ }
132
+ });
133
+ for (const type of [
134
+ "channel",
135
+ "nativeTool",
136
+ "memorySource"
137
+ ]) registerConnectorRuntimeAdapter({
138
+ type,
139
+ async install({ config, definition }) {
140
+ return installRecord(config, definition);
141
+ },
142
+ uninstall({ config, instance }) {
143
+ uninstallRecord(config, instance.instanceId);
144
+ }
145
+ });
146
+ function getConnectorRuntimeAdapter(type) {
147
+ const adapter = adapters.get(type);
148
+ if (!adapter) throw new Error(`Unknown connector runtime adapter: ${type}`);
149
+ return adapter;
150
+ }
151
+ //#endregion
152
+ export { getConnectorRuntimeAdapter, registerConnectorRuntimeAdapter };
153
+
154
+ //# sourceMappingURL=runtime-adapter-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-adapter-registry.js","names":[],"sources":["../../../src/connectors/runtime-adapter-registry.ts"],"sourcesContent":["import type { CredentialResolver } from '../auth/credentials.js';\nimport type { Config } from '../config/schema.js';\nimport {\n deleteConnectorInstallation,\n getConnectorInstallation,\n isXopcDatabaseOpen,\n upsertConnectorInstallation,\n} from '../storage/sqlite/index.js';\nimport { saveComposioApiKey } from './composio.js';\nimport { assertComposioApiKeyConfigured } from './composio-sessions.js';\nimport { listConnectorInstances } from './instances.js';\nimport { isManagedConnectorServer, materializeConnectorMcpServer } from './materialize.js';\nimport { saveConnectorSecrets } from './secret-store.js';\nimport { appendConnectorAuditRecord } from './usage.js';\nimport type {\n ConnectorDefinition,\n ConnectorInstallInput,\n ConnectorInstance,\n ConnectorRuntimeDefinition,\n} from './types.js';\n\nexport type ConnectorRuntimeInstallContext = {\n config: Config;\n definition: ConnectorDefinition;\n input: ConnectorInstallInput;\n resolver: CredentialResolver;\n};\n\nexport type ConnectorRuntimeUninstallContext = {\n config: Config;\n definition: ConnectorDefinition;\n instance: ConnectorInstance;\n};\n\nexport type ConnectorRuntimeUpdateContext = ConnectorRuntimeInstallContext & { instanceId: string };\n\nexport type ConnectorRuntimeAdapter = {\n type: ConnectorRuntimeDefinition['type'];\n install(context: ConnectorRuntimeInstallContext): Promise<ConnectorInstance>;\n uninstall(context: ConnectorRuntimeUninstallContext): void;\n update?(context: ConnectorRuntimeUpdateContext): ConnectorInstance;\n};\n\nconst adapters = new Map<ConnectorRuntimeDefinition['type'], ConnectorRuntimeAdapter>();\n\nexport function registerConnectorRuntimeAdapter(adapter: ConnectorRuntimeAdapter): void {\n if (adapters.has(adapter.type)) throw new Error(`Connector runtime adapter is already registered: ${adapter.type}`);\n adapters.set(adapter.type, adapter);\n}\n\nfunction installedInstance(config: Config, instanceId: string, connectorId: string): ConnectorInstance {\n const instance = listConnectorInstances(config).find((candidate) => candidate.instanceId === instanceId);\n if (!instance) throw new Error(`Connector \"${connectorId}\" was installed but could not be resolved.`);\n return instance;\n}\n\nfunction installRecord(config: Config, definition: ConnectorDefinition, extra: Record<string, unknown> = {}): ConnectorInstance {\n const instanceId = definition.id;\n config.connectors = config.connectors ?? {};\n config.connectors.instances = {\n ...(config.connectors.instances ?? {}),\n [instanceId]: {\n xopcConnector: {\n managed: true,\n connectorId: definition.id,\n version: definition.version,\n enabled: true,\n displayName: definition.displayName,\n source: definition.source,\n artifactSha256: definition.provenance?.sha256,\n },\n runtime: definition.runtime,\n ...extra,\n },\n };\n return installedInstance(config, instanceId, definition.id);\n}\n\nfunction uninstallRecord(config: Config, instanceId: string): void {\n const record = config.connectors?.instances?.[instanceId];\n if (!record) throw new Error(`Connector instance not found: ${instanceId}`);\n const nextInstances = { ...(config.connectors?.instances ?? {}) };\n delete nextInstances[instanceId];\n config.connectors = { ...(config.connectors ?? {}), instances: nextInstances };\n}\n\nregisterConnectorRuntimeAdapter({\n type: 'mcp',\n async install({ config, definition, input, resolver }) {\n if (definition.runtime.type !== 'mcp') throw new Error(`Invalid MCP connector definition: ${definition.id}`);\n const { serverId, server } = materializeConnectorMcpServer(definition, input);\n const existingServer = config.mcp?.servers?.[serverId];\n if (existingServer && !isManagedConnectorServer(existingServer)) {\n throw new Error(`MCP server \"${serverId}\" already exists and is not managed by Connectors.`);\n }\n await saveConnectorSecrets(definition, input, resolver);\n config.mcp = config.mcp ?? {};\n config.mcp.servers = { ...(config.mcp.servers ?? {}), [serverId]: server };\n const instance = installedInstance(config, serverId, definition.id);\n appendConnectorAuditRecord(config, serverId, { action: 'installed' });\n return instance;\n },\n uninstall({ config, instance }) {\n const server = config.mcp?.servers?.[instance.instanceId];\n if (!server || !isManagedConnectorServer(server)) {\n throw new Error(`MCP server \"${instance.instanceId}\" is not managed by Connectors.`);\n }\n appendConnectorAuditRecord(config, instance.instanceId, { action: 'removed' });\n const nextServers = { ...(config.mcp?.servers ?? {}) };\n delete nextServers[instance.instanceId];\n config.mcp = { ...(config.mcp ?? {}), servers: nextServers };\n },\n update({ config, definition, input, instanceId }) {\n if (definition.runtime.type !== 'mcp') throw new Error(`Invalid MCP connector definition: ${definition.id}`);\n const existingServer = config.mcp?.servers?.[instanceId];\n if (!existingServer || !isManagedConnectorServer(existingServer)) {\n throw new Error(`MCP server \"${instanceId}\" is not managed by Connectors.`);\n }\n if ((definition.setup.secrets ?? []).length > 0) {\n throw new Error('Connectors with secrets must be reinstalled to change configuration.');\n }\n const { serverId, server } = materializeConnectorMcpServer(definition, input);\n if (serverId !== instanceId) {\n throw new Error(`Connector config update cannot change server id from \"${instanceId}\" to \"${serverId}\".`);\n }\n config.mcp = config.mcp ?? {};\n config.mcp.servers = {\n ...(config.mcp.servers ?? {}),\n [serverId]: {\n ...server,\n xopcConnector: {\n ...existingServer.xopcConnector,\n ...(server.xopcConnector as Record<string, unknown>),\n enabled: existingServer.xopcConnector.enabled,\n lastConnectedAt: existingServer.xopcConnector.lastConnectedAt,\n lastError: existingServer.xopcConnector.lastError,\n },\n },\n };\n return installedInstance(config, serverId, definition.id);\n },\n});\n\nregisterConnectorRuntimeAdapter({\n type: 'composio',\n async install({ config, definition, input, resolver }) {\n if (definition.runtime.type !== 'composio') throw new Error(`Invalid Composio connector definition: ${definition.id}`);\n if (definition.runtime.role === 'credential') await saveComposioApiKey(input, resolver);\n if (definition.runtime.role === 'toolkit') await assertComposioApiKeyConfigured(resolver);\n const instance = installRecord(\n config,\n definition,\n definition.runtime.role === 'toolkit' ? { scope: 'read' } : {},\n );\n if (definition.runtime.role === 'toolkit' && isXopcDatabaseOpen()) {\n const installationId = `${definition.id}-local-owner`;\n const existing = getConnectorInstallation(installationId);\n upsertConnectorInstallation({\n id: installationId,\n connectorId: definition.id,\n principalId: 'local-owner',\n enabled: true,\n allowedAgentIds: existing?.allowedAgentIds ?? [],\n maxScope: 'read',\n confirmationPolicy: existing?.confirmationPolicy ?? 'writes',\n selectedConnectionIds: existing?.selectedConnectionIds ?? [],\n createdAt: existing?.createdAt,\n });\n }\n return instance;\n },\n uninstall({ config, definition, instance }) {\n if (definition.runtime.type !== 'composio') throw new Error(`Invalid Composio connector definition: ${definition.id}`);\n uninstallRecord(config, instance.instanceId);\n if (definition.runtime.role === 'toolkit' && isXopcDatabaseOpen()) {\n deleteConnectorInstallation(`${definition.id}-local-owner`);\n }\n },\n});\n\nfor (const type of ['channel', 'nativeTool', 'memorySource'] as const) {\n registerConnectorRuntimeAdapter({\n type,\n async install({ config, definition }) {\n return installRecord(config, definition);\n },\n uninstall({ config, instance }) {\n uninstallRecord(config, instance.instanceId);\n },\n });\n}\n\nexport function getConnectorRuntimeAdapter(type: ConnectorRuntimeDefinition['type']): ConnectorRuntimeAdapter {\n const adapter = adapters.get(type);\n if (!adapter) throw new Error(`Unknown connector runtime adapter: ${type}`);\n return adapter;\n}\n"],"mappings":";;;;;;;;;;AA2CA,MAAM,2BAAW,IAAI,KAAkE;AAEvF,SAAgB,gCAAgC,SAAwC;AACtF,KAAI,SAAS,IAAI,QAAQ,KAAK,CAAE,OAAM,IAAI,MAAM,oDAAoD,QAAQ,OAAO;AACnH,UAAS,IAAI,QAAQ,MAAM,QAAQ;;AAGrC,SAAS,kBAAkB,QAAgB,YAAoB,aAAwC;CACrG,MAAM,WAAW,uBAAuB,OAAO,CAAC,MAAM,cAAc,UAAU,eAAe,WAAW;AACxG,KAAI,CAAC,SAAU,OAAM,IAAI,MAAM,cAAc,YAAY,4CAA4C;AACrG,QAAO;;AAGT,SAAS,cAAc,QAAgB,YAAiC,QAAiC,EAAE,EAAqB;CAC9H,MAAM,aAAa,WAAW;AAC9B,QAAO,aAAa,OAAO,cAAc,EAAE;AAC3C,QAAO,WAAW,YAAY;EAC5B,GAAI,OAAO,WAAW,aAAa,EAAE;GACpC,aAAa;GACZ,eAAe;IACb,SAAS;IACT,aAAa,WAAW;IACxB,SAAS,WAAW;IACpB,SAAS;IACT,aAAa,WAAW;IACxB,QAAQ,WAAW;IACnB,gBAAgB,WAAW,YAAY;IACxC;GACD,SAAS,WAAW;GACpB,GAAG;GACJ;EACF;AACD,QAAO,kBAAkB,QAAQ,YAAY,WAAW,GAAG;;AAG7D,SAAS,gBAAgB,QAAgB,YAA0B;AAEjE,KAAI,CADW,OAAO,YAAY,YAAY,YACjC,OAAM,IAAI,MAAM,iCAAiC,aAAa;CAC3E,MAAM,gBAAgB,EAAE,GAAI,OAAO,YAAY,aAAa,EAAE,EAAG;AACjE,QAAO,cAAc;AACrB,QAAO,aAAa;EAAE,GAAI,OAAO,cAAc,EAAE;EAAG,WAAW;EAAe;;AAGhF,gCAAgC;CAC9B,MAAM;CACN,MAAM,QAAQ,EAAE,QAAQ,YAAY,OAAO,YAAY;AACrD,MAAI,WAAW,QAAQ,SAAS,MAAO,OAAM,IAAI,MAAM,qCAAqC,WAAW,KAAK;EAC5G,MAAM,EAAE,UAAU,WAAW,8BAA8B,YAAY,MAAM;EAC7E,MAAM,iBAAiB,OAAO,KAAK,UAAU;AAC7C,MAAI,kBAAkB,CAAC,yBAAyB,eAAe,CAC7D,OAAM,IAAI,MAAM,eAAe,SAAS,oDAAoD;AAE9F,QAAM,qBAAqB,YAAY,OAAO,SAAS;AACvD,SAAO,MAAM,OAAO,OAAO,EAAE;AAC7B,SAAO,IAAI,UAAU;GAAE,GAAI,OAAO,IAAI,WAAW,EAAE;IAAI,WAAW;GAAQ;EAC1E,MAAM,WAAW,kBAAkB,QAAQ,UAAU,WAAW,GAAG;AACnE,6BAA2B,QAAQ,UAAU,EAAE,QAAQ,aAAa,CAAC;AACrE,SAAO;;CAET,UAAU,EAAE,QAAQ,YAAY;EAC9B,MAAM,SAAS,OAAO,KAAK,UAAU,SAAS;AAC9C,MAAI,CAAC,UAAU,CAAC,yBAAyB,OAAO,CAC9C,OAAM,IAAI,MAAM,eAAe,SAAS,WAAW,iCAAiC;AAEtF,6BAA2B,QAAQ,SAAS,YAAY,EAAE,QAAQ,WAAW,CAAC;EAC9E,MAAM,cAAc,EAAE,GAAI,OAAO,KAAK,WAAW,EAAE,EAAG;AACtD,SAAO,YAAY,SAAS;AAC5B,SAAO,MAAM;GAAE,GAAI,OAAO,OAAO,EAAE;GAAG,SAAS;GAAa;;CAE9D,OAAO,EAAE,QAAQ,YAAY,OAAO,cAAc;AAChD,MAAI,WAAW,QAAQ,SAAS,MAAO,OAAM,IAAI,MAAM,qCAAqC,WAAW,KAAK;EAC5G,MAAM,iBAAiB,OAAO,KAAK,UAAU;AAC7C,MAAI,CAAC,kBAAkB,CAAC,yBAAyB,eAAe,CAC9D,OAAM,IAAI,MAAM,eAAe,WAAW,iCAAiC;AAE7E,OAAK,WAAW,MAAM,WAAW,EAAE,EAAE,SAAS,EAC5C,OAAM,IAAI,MAAM,uEAAuE;EAEzF,MAAM,EAAE,UAAU,WAAW,8BAA8B,YAAY,MAAM;AAC7E,MAAI,aAAa,WACf,OAAM,IAAI,MAAM,yDAAyD,WAAW,QAAQ,SAAS,IAAI;AAE3G,SAAO,MAAM,OAAO,OAAO,EAAE;AAC7B,SAAO,IAAI,UAAU;GACnB,GAAI,OAAO,IAAI,WAAW,EAAE;IAC3B,WAAW;IACV,GAAG;IACH,eAAe;KACb,GAAG,eAAe;KAClB,GAAI,OAAO;KACX,SAAS,eAAe,cAAc;KACtC,iBAAiB,eAAe,cAAc;KAC9C,WAAW,eAAe,cAAc;KACzC;IACF;GACF;AACD,SAAO,kBAAkB,QAAQ,UAAU,WAAW,GAAG;;CAE5D,CAAC;AAEF,gCAAgC;CAC9B,MAAM;CACN,MAAM,QAAQ,EAAE,QAAQ,YAAY,OAAO,YAAY;AACrD,MAAI,WAAW,QAAQ,SAAS,WAAY,OAAM,IAAI,MAAM,0CAA0C,WAAW,KAAK;AACtH,MAAI,WAAW,QAAQ,SAAS,aAAc,OAAM,mBAAmB,OAAO,SAAS;AACvF,MAAI,WAAW,QAAQ,SAAS,UAAW,OAAM,+BAA+B,SAAS;EACzF,MAAM,WAAW,cACf,QACA,YACA,WAAW,QAAQ,SAAS,YAAY,EAAE,OAAO,QAAQ,GAAG,EAAE,CAC/D;AACD,MAAI,WAAW,QAAQ,SAAS,aAAa,oBAAoB,EAAE;GACjE,MAAM,iBAAiB,GAAG,WAAW,GAAG;GACxC,MAAM,WAAW,yBAAyB,eAAe;AACzD,+BAA4B;IAC1B,IAAI;IACJ,aAAa,WAAW;IACxB,aAAa;IACb,SAAS;IACT,iBAAiB,UAAU,mBAAmB,EAAE;IAChD,UAAU;IACV,oBAAoB,UAAU,sBAAsB;IACpD,uBAAuB,UAAU,yBAAyB,EAAE;IAC5D,WAAW,UAAU;IACtB,CAAC;;AAEJ,SAAO;;CAET,UAAU,EAAE,QAAQ,YAAY,YAAY;AAC1C,MAAI,WAAW,QAAQ,SAAS,WAAY,OAAM,IAAI,MAAM,0CAA0C,WAAW,KAAK;AACtH,kBAAgB,QAAQ,SAAS,WAAW;AAC5C,MAAI,WAAW,QAAQ,SAAS,aAAa,oBAAoB,CAC/D,6BAA4B,GAAG,WAAW,GAAG,cAAc;;CAGhE,CAAC;AAEF,KAAK,MAAM,QAAQ;CAAC;CAAW;CAAc;CAAe,CAC1D,iCAAgC;CAC9B;CACA,MAAM,QAAQ,EAAE,QAAQ,cAAc;AACpC,SAAO,cAAc,QAAQ,WAAW;;CAE1C,UAAU,EAAE,QAAQ,YAAY;AAC9B,kBAAgB,QAAQ,SAAS,WAAW;;CAE/C,CAAC;AAGJ,SAAgB,2BAA2B,MAAmE;CAC5G,MAAM,UAAU,SAAS,IAAI,KAAK;AAClC,KAAI,CAAC,QAAS,OAAM,IAAI,MAAM,sCAAsC,OAAO;AAC3E,QAAO"}
@@ -2,12 +2,38 @@ export type ConnectorKind = 'mcp' | 'cli' | 'http' | 'channel' | 'browser' | 'ex
2
2
  export type ConnectorCategory = 'code' | 'docs' | 'browser' | 'data' | 'automation' | 'custom';
3
3
  export type ConnectorCapability = 'tools' | 'resources' | 'prompts' | 'context' | 'channel' | 'events' | 'ui' | 'memory_source' | 'workflows' | 'auth.apiKey' | 'auth.oauth' | 'runtime.mcp.stdio' | 'runtime.mcp.sse' | 'runtime.mcp.streamableHttp';
4
4
  export type ConnectorAuthMode = 'none' | 'apiKey' | 'oauth';
5
+ export type ConnectorAuthDefinition = {
6
+ mode: 'none';
7
+ } | {
8
+ mode: 'apiKey';
9
+ } | {
10
+ mode: 'oauth';
11
+ provider: string;
12
+ };
13
+ export type ConnectorScope = 'read' | 'write' | 'admin';
14
+ export type ConnectorVerificationLevel = 'verified' | 'beta' | 'experimental';
15
+ export type ConnectorBranding = {
16
+ logoUrl?: string;
17
+ source?: 'builtin' | 'composio-catalog' | 'registry' | 'extension' | 'custom';
18
+ backgroundColor?: string;
19
+ fetchedAt?: string;
20
+ };
21
+ export type ConnectorConfirmationPolicy = 'always' | 'writes' | 'admin' | 'never';
5
22
  export type ConnectorPermissions = {
6
23
  data?: string[];
7
24
  networkDomains?: string[];
8
25
  localExec?: boolean;
9
26
  filesystem?: string[];
10
27
  };
28
+ export type ConnectorIntegrationStrategy = {
29
+ lane: 'native' | 'mcp' | 'composio';
30
+ workload: 'core' | 'high_frequency' | 'long_tail';
31
+ preferred: boolean;
32
+ alternative?: {
33
+ kind: 'channel' | 'connector';
34
+ id: string;
35
+ };
36
+ };
11
37
  export type ConnectorSecretReference = {
12
38
  xopcSecretRef: {
13
39
  provider: string;
@@ -45,6 +71,7 @@ export type ConnectorRuntimeDefinition = {
45
71
  } | {
46
72
  type: 'composio';
47
73
  toolkit: string;
74
+ role: 'credential' | 'toolkit';
48
75
  } | {
49
76
  type: 'nativeTool';
50
77
  toolsetId: string;
@@ -62,20 +89,97 @@ export type ConnectorDefinition = {
62
89
  source: 'builtin' | 'extension' | 'custom' | 'registry' | 'store';
63
90
  capabilities: ConnectorCapability[];
64
91
  tags?: string[];
65
- auth: {
66
- mode: ConnectorAuthMode;
67
- };
92
+ branding?: ConnectorBranding;
93
+ verificationLevel?: ConnectorVerificationLevel;
94
+ auth: ConnectorAuthDefinition;
68
95
  setup: {
69
96
  secrets?: ConnectorSecretField[];
70
97
  config?: ConnectorConfigField[];
71
98
  };
72
99
  runtime: ConnectorRuntimeDefinition;
73
100
  permissions?: ConnectorPermissions;
101
+ integrationStrategy?: ConnectorIntegrationStrategy;
74
102
  provenance?: {
75
103
  packageName: string;
76
104
  sha256: string;
77
105
  };
78
106
  };
107
+ export type ConnectorInstallationPolicy = {
108
+ id: string;
109
+ connectorId: string;
110
+ principalId: string;
111
+ enabled: boolean;
112
+ allowedAgentIds: string[];
113
+ maxScope: ConnectorScope;
114
+ confirmationPolicy: ConnectorConfirmationPolicy;
115
+ selectedConnectionIds: string[];
116
+ createdAt: string;
117
+ updatedAt: string;
118
+ };
119
+ export type ConnectorConnectionStatus = 'pending' | 'active' | 'expired' | 'failed' | 'revoked' | 'disabled' | 'unknown';
120
+ export type ConnectorConnection = {
121
+ id: string;
122
+ installationId?: string;
123
+ connectorId: string;
124
+ provider: string;
125
+ principalId: string;
126
+ providerConnectionId: string;
127
+ alias?: string;
128
+ identity: Record<string, unknown>;
129
+ status: ConnectorConnectionStatus;
130
+ isDefault: boolean;
131
+ connectedAt?: string;
132
+ expiresAt?: string;
133
+ lastError?: string;
134
+ metadata: Record<string, unknown>;
135
+ createdAt: string;
136
+ updatedAt: string;
137
+ };
138
+ export type ConnectorActionMetadata = {
139
+ connectorId: string;
140
+ actionId: string;
141
+ toolkit?: string;
142
+ scope: ConnectorScope;
143
+ curated: boolean;
144
+ inputSchema?: unknown;
145
+ schemaVersion?: string;
146
+ cachedAt: string;
147
+ };
148
+ export type ConnectorExecutionDecision = 'allowed' | 'denied' | 'confirmation_required';
149
+ export type ConnectorExecutionAuditRecord = {
150
+ id: string;
151
+ installationId?: string;
152
+ connectionId?: string;
153
+ connectorId: string;
154
+ principalId: string;
155
+ agentId?: string;
156
+ sessionKey?: string;
157
+ actionId: string;
158
+ scope: ConnectorScope;
159
+ decision: ConnectorExecutionDecision;
160
+ resultStatus: 'success' | 'error' | 'not_executed';
161
+ durationMs?: number;
162
+ errorCode?: string;
163
+ createdAt: string;
164
+ };
165
+ export type ConnectorApprovalStatus = 'pending' | 'approved' | 'denied' | 'expired' | 'consumed';
166
+ export type ConnectorApprovalRecord = {
167
+ id: string;
168
+ principalId: string;
169
+ connectorId: string;
170
+ connectionId?: string;
171
+ agentId?: string;
172
+ sessionKey?: string;
173
+ actionId: string;
174
+ scope: ConnectorScope;
175
+ argumentsHash: string;
176
+ argumentsPreview: Record<string, unknown>;
177
+ status: ConnectorApprovalStatus;
178
+ expiresAt: string;
179
+ createdAt: string;
180
+ decidedAt?: string;
181
+ consumedAt?: string;
182
+ };
79
183
  export type ConnectorInstallInput = {
80
184
  secrets?: Record<string, unknown>;
81
185
  config?: Record<string, unknown>;
@@ -112,7 +216,12 @@ export type ConnectorInstance = {
112
216
  type: 'mcp';
113
217
  serverId: string;
114
218
  } | {
115
- type: 'channel' | 'composio' | 'nativeTool' | 'memorySource';
219
+ type: 'composio';
220
+ id: string;
221
+ toolkit: string;
222
+ role: 'credential' | 'toolkit';
223
+ } | {
224
+ type: 'channel' | 'nativeTool' | 'memorySource';
116
225
  id: string;
117
226
  };
118
227
  usage: ConnectorUsageRecord;
@@ -0,0 +1,20 @@
1
+ import type { Config } from '../config/schema.js';
2
+ import type { WorkflowDefinition } from '../workflows/domain/definition.js';
3
+ export type ConnectorPreflightIssueCode = 'not_installed' | 'disabled' | 'agent_not_allowed' | 'scope_too_narrow' | 'connection_missing' | 'reauthorization_required';
4
+ export type ConnectorPreflightIssue = {
5
+ connectorId: string;
6
+ code: ConnectorPreflightIssueCode;
7
+ message: string;
8
+ recoveryPath: string;
9
+ };
10
+ export type ConnectorPreflightResult = {
11
+ ok: boolean;
12
+ issues: ConnectorPreflightIssue[];
13
+ optionalIssues: ConnectorPreflightIssue[];
14
+ };
15
+ export declare function preflightWorkflowConnectors(input: {
16
+ definition: WorkflowDefinition;
17
+ config: Config;
18
+ agentId: string;
19
+ principalId?: string;
20
+ }): ConnectorPreflightResult;
@@ -0,0 +1,70 @@
1
+ import { getConnectorInstallation, listConnectorConnections } from "../storage/sqlite/connector-repository.js";
2
+ import { getComposioToolkitScope } from "./composio.js";
3
+ import { getConnectorDefinition } from "./catalog.js";
4
+ import { listConnectorInstances } from "./instances.js";
5
+ //#region src/connectors/workflow-preflight.ts
6
+ const SCOPE_ORDER = {
7
+ read: 1,
8
+ write: 2,
9
+ admin: 3
10
+ };
11
+ function issue(requirement, code, message) {
12
+ return {
13
+ connectorId: requirement.connectorId,
14
+ code,
15
+ message,
16
+ recoveryPath: `/connectors?connector=${encodeURIComponent(requirement.connectorId)}`
17
+ };
18
+ }
19
+ function preflightWorkflowConnectors(input) {
20
+ const principalId = input.principalId ?? "local-owner";
21
+ const instances = listConnectorInstances(input.config);
22
+ const issues = [];
23
+ const optionalIssues = [];
24
+ const add = (requirement, value) => {
25
+ (requirement.optional ? optionalIssues : issues).push(value);
26
+ };
27
+ for (const requirement of input.definition.connectors ?? []) {
28
+ const instance = instances.find((candidate) => candidate.connectorId === requirement.connectorId);
29
+ if (!instance) {
30
+ add(requirement, issue(requirement, "not_installed", `${requirement.connectorId} is not installed.`));
31
+ continue;
32
+ }
33
+ if (!instance.enabled) {
34
+ add(requirement, issue(requirement, "disabled", `${requirement.connectorId} is disabled.`));
35
+ continue;
36
+ }
37
+ const definition = getConnectorDefinition(requirement.connectorId);
38
+ if (definition?.runtime.type !== "composio" || definition.runtime.role !== "toolkit") continue;
39
+ const toolkit = definition.runtime.toolkit;
40
+ const installation = getConnectorInstallation(`${requirement.connectorId}-${principalId}`);
41
+ if (installation?.allowedAgentIds.length && !installation.allowedAgentIds.includes(input.agentId)) {
42
+ add(requirement, issue(requirement, "agent_not_allowed", `${input.agentId} is not allowed to use ${requirement.connectorId}.`));
43
+ continue;
44
+ }
45
+ const allowedScope = installation?.maxScope ?? getComposioToolkitScope(input.config, toolkit);
46
+ const requiredScope = requirement.scope ?? "read";
47
+ if (SCOPE_ORDER[allowedScope] < SCOPE_ORDER[requiredScope]) {
48
+ add(requirement, issue(requirement, "scope_too_narrow", `${requirement.connectorId} requires ${requiredScope} scope but allows ${allowedScope}.`));
49
+ continue;
50
+ }
51
+ if (requirement.connectionRequired === false) continue;
52
+ const connections = listConnectorConnections({
53
+ principalId,
54
+ connectorId: requirement.connectorId
55
+ });
56
+ const selected = installation?.selectedConnectionIds.length ? connections.filter((connection) => installation.selectedConnectionIds.includes(connection.id)) : connections;
57
+ if (selected.some((connection) => connection.status === "active")) continue;
58
+ const needsAuthorization = selected.some((connection) => connection.status === "expired" || connection.status === "failed");
59
+ add(requirement, issue(requirement, needsAuthorization ? "reauthorization_required" : "connection_missing", needsAuthorization ? `${requirement.connectorId} needs to be reconnected.` : `${requirement.connectorId} has no active account connection.`));
60
+ }
61
+ return {
62
+ ok: issues.length === 0,
63
+ issues,
64
+ optionalIssues
65
+ };
66
+ }
67
+ //#endregion
68
+ export { preflightWorkflowConnectors };
69
+
70
+ //# sourceMappingURL=workflow-preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-preflight.js","names":[],"sources":["../../../src/connectors/workflow-preflight.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\nimport { listConnectorConnections, getConnectorInstallation } from '../storage/sqlite/connector-repository.js';\nimport type { WorkflowConnectorRequirement, WorkflowDefinition } from '../workflows/domain/definition.js';\nimport { getComposioToolkitScope } from './composio.js';\nimport { getConnectorDefinition } from './catalog.js';\nimport { listConnectorInstances } from './instances.js';\nimport type { ConnectorScope } from './types.js';\n\nexport type ConnectorPreflightIssueCode =\n | 'not_installed'\n | 'disabled'\n | 'agent_not_allowed'\n | 'scope_too_narrow'\n | 'connection_missing'\n | 'reauthorization_required';\n\nexport type ConnectorPreflightIssue = {\n connectorId: string;\n code: ConnectorPreflightIssueCode;\n message: string;\n recoveryPath: string;\n};\n\nexport type ConnectorPreflightResult = {\n ok: boolean;\n issues: ConnectorPreflightIssue[];\n optionalIssues: ConnectorPreflightIssue[];\n};\n\nconst SCOPE_ORDER: Record<ConnectorScope, number> = { read: 1, write: 2, admin: 3 };\n\nfunction issue(requirement: WorkflowConnectorRequirement, code: ConnectorPreflightIssueCode, message: string): ConnectorPreflightIssue {\n return {\n connectorId: requirement.connectorId,\n code,\n message,\n recoveryPath: `/connectors?connector=${encodeURIComponent(requirement.connectorId)}`,\n };\n}\n\nexport function preflightWorkflowConnectors(input: {\n definition: WorkflowDefinition;\n config: Config;\n agentId: string;\n principalId?: string;\n}): ConnectorPreflightResult {\n const principalId = input.principalId ?? 'local-owner';\n const instances = listConnectorInstances(input.config);\n const issues: ConnectorPreflightIssue[] = [];\n const optionalIssues: ConnectorPreflightIssue[] = [];\n const add = (requirement: WorkflowConnectorRequirement, value: ConnectorPreflightIssue): void => {\n (requirement.optional ? optionalIssues : issues).push(value);\n };\n\n for (const requirement of input.definition.connectors ?? []) {\n const instance = instances.find((candidate) => candidate.connectorId === requirement.connectorId);\n if (!instance) {\n add(requirement, issue(requirement, 'not_installed', `${requirement.connectorId} is not installed.`));\n continue;\n }\n if (!instance.enabled) {\n add(requirement, issue(requirement, 'disabled', `${requirement.connectorId} is disabled.`));\n continue;\n }\n const definition = getConnectorDefinition(requirement.connectorId);\n if (definition?.runtime.type !== 'composio' || definition.runtime.role !== 'toolkit') continue;\n\n const toolkit = definition.runtime.toolkit;\n const installation = getConnectorInstallation(`${requirement.connectorId}-${principalId}`);\n if (installation?.allowedAgentIds.length && !installation.allowedAgentIds.includes(input.agentId)) {\n add(requirement, issue(requirement, 'agent_not_allowed', `${input.agentId} is not allowed to use ${requirement.connectorId}.`));\n continue;\n }\n const allowedScope = installation?.maxScope ?? getComposioToolkitScope(input.config, toolkit);\n const requiredScope = requirement.scope ?? 'read';\n if (SCOPE_ORDER[allowedScope] < SCOPE_ORDER[requiredScope]) {\n add(requirement, issue(requirement, 'scope_too_narrow', `${requirement.connectorId} requires ${requiredScope} scope but allows ${allowedScope}.`));\n continue;\n }\n if (requirement.connectionRequired === false) continue;\n const connections = listConnectorConnections({ principalId, connectorId: requirement.connectorId });\n const selected = installation?.selectedConnectionIds.length\n ? connections.filter((connection) => installation.selectedConnectionIds.includes(connection.id))\n : connections;\n if (selected.some((connection) => connection.status === 'active')) continue;\n const needsAuthorization = selected.some((connection) => connection.status === 'expired' || connection.status === 'failed');\n add(requirement, issue(\n requirement,\n needsAuthorization ? 'reauthorization_required' : 'connection_missing',\n needsAuthorization\n ? `${requirement.connectorId} needs to be reconnected.`\n : `${requirement.connectorId} has no active account connection.`,\n ));\n }\n return { ok: issues.length === 0, issues, optionalIssues };\n}\n"],"mappings":";;;;;AA6BA,MAAM,cAA8C;CAAE,MAAM;CAAG,OAAO;CAAG,OAAO;CAAG;AAEnF,SAAS,MAAM,aAA2C,MAAmC,SAA0C;AACrI,QAAO;EACL,aAAa,YAAY;EACzB;EACA;EACA,cAAc,yBAAyB,mBAAmB,YAAY,YAAY;EACnF;;AAGH,SAAgB,4BAA4B,OAKf;CAC3B,MAAM,cAAc,MAAM,eAAe;CACzC,MAAM,YAAY,uBAAuB,MAAM,OAAO;CACtD,MAAM,SAAoC,EAAE;CAC5C,MAAM,iBAA4C,EAAE;CACpD,MAAM,OAAO,aAA2C,UAAyC;AAC/F,GAAC,YAAY,WAAW,iBAAiB,QAAQ,KAAK,MAAM;;AAG9D,MAAK,MAAM,eAAe,MAAM,WAAW,cAAc,EAAE,EAAE;EAC3D,MAAM,WAAW,UAAU,MAAM,cAAc,UAAU,gBAAgB,YAAY,YAAY;AACjG,MAAI,CAAC,UAAU;AACb,OAAI,aAAa,MAAM,aAAa,iBAAiB,GAAG,YAAY,YAAY,oBAAoB,CAAC;AACrG;;AAEF,MAAI,CAAC,SAAS,SAAS;AACrB,OAAI,aAAa,MAAM,aAAa,YAAY,GAAG,YAAY,YAAY,eAAe,CAAC;AAC3F;;EAEF,MAAM,aAAa,uBAAuB,YAAY,YAAY;AAClE,MAAI,YAAY,QAAQ,SAAS,cAAc,WAAW,QAAQ,SAAS,UAAW;EAEtF,MAAM,UAAU,WAAW,QAAQ;EACnC,MAAM,eAAe,yBAAyB,GAAG,YAAY,YAAY,GAAG,cAAc;AAC1F,MAAI,cAAc,gBAAgB,UAAU,CAAC,aAAa,gBAAgB,SAAS,MAAM,QAAQ,EAAE;AACjG,OAAI,aAAa,MAAM,aAAa,qBAAqB,GAAG,MAAM,QAAQ,yBAAyB,YAAY,YAAY,GAAG,CAAC;AAC/H;;EAEF,MAAM,eAAe,cAAc,YAAY,wBAAwB,MAAM,QAAQ,QAAQ;EAC7F,MAAM,gBAAgB,YAAY,SAAS;AAC3C,MAAI,YAAY,gBAAgB,YAAY,gBAAgB;AAC1D,OAAI,aAAa,MAAM,aAAa,oBAAoB,GAAG,YAAY,YAAY,YAAY,cAAc,oBAAoB,aAAa,GAAG,CAAC;AAClJ;;AAEF,MAAI,YAAY,uBAAuB,MAAO;EAC9C,MAAM,cAAc,yBAAyB;GAAE;GAAa,aAAa,YAAY;GAAa,CAAC;EACnG,MAAM,WAAW,cAAc,sBAAsB,SACjD,YAAY,QAAQ,eAAe,aAAa,sBAAsB,SAAS,WAAW,GAAG,CAAC,GAC9F;AACJ,MAAI,SAAS,MAAM,eAAe,WAAW,WAAW,SAAS,CAAE;EACnE,MAAM,qBAAqB,SAAS,MAAM,eAAe,WAAW,WAAW,aAAa,WAAW,WAAW,SAAS;AAC3H,MAAI,aAAa,MACf,aACA,qBAAqB,6BAA6B,sBAClD,qBACI,GAAG,YAAY,YAAY,6BAC3B,GAAG,YAAY,YAAY,oCAChC,CAAC;;AAEJ,QAAO;EAAE,IAAI,OAAO,WAAW;EAAG;EAAQ;EAAgB"}
@@ -0,0 +1,16 @@
1
+ export interface StagedExtensionInstall {
2
+ extensionId: string;
3
+ stagingRoot: string;
4
+ stagedExtensionDir: string;
5
+ targetDir: string;
6
+ backupDir?: string;
7
+ committed: boolean;
8
+ }
9
+ /** Extract, validate, install dependencies, and import-check an extension away from its live path. */
10
+ export declare function stageExtensionStoreZip(buffer: Buffer, extensionsDir: string): Promise<StagedExtensionInstall>;
11
+ /** Move a staged extension into its live path, preserving the previous version for rollback. */
12
+ export declare function commitStagedExtensionInstall(state: StagedExtensionInstall, overwrite: boolean): void;
13
+ /** Restore the previous live extension, or remove a newly committed install. */
14
+ export declare function rollbackStagedExtensionInstall(state: StagedExtensionInstall): void;
15
+ /** Delete the preserved previous version after every durable metadata write succeeds. */
16
+ export declare function finalizeStagedExtensionInstall(state: StagedExtensionInstall): void;
@@ -0,0 +1,76 @@
1
+ import { installExtensionFromStoreZip } from "./install.js";
2
+ import { join } from "node:path";
3
+ import { existsSync, mkdirSync, mkdtempSync, readFileSync, renameSync, rmSync } from "node:fs";
4
+ import { pathToFileURL } from "node:url";
5
+ //#region src/extensions/install-transaction.ts
6
+ /** Extract, validate, install dependencies, and import-check an extension away from its live path. */
7
+ async function stageExtensionStoreZip(buffer, extensionsDir) {
8
+ mkdirSync(extensionsDir, { recursive: true });
9
+ const stagingRoot = mkdtempSync(join(extensionsDir, ".xopc-install-"));
10
+ try {
11
+ const result = await installExtensionFromStoreZip(buffer, stagingRoot);
12
+ if (!result.ok || !result.extensionId || !result.targetDir) throw new Error(result.error ?? "Extension staging failed");
13
+ const manifestPath = join(result.targetDir, "xopc.extension.json");
14
+ const manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
15
+ if (!manifest.main) throw new Error("Extension manifest must declare main");
16
+ const mainUrl = pathToFileURL(join(result.targetDir, manifest.main));
17
+ mainUrl.searchParams.set("xopcInstallCheck", `${Date.now()}-${Math.random()}`);
18
+ await import(mainUrl.href);
19
+ return {
20
+ extensionId: result.extensionId,
21
+ stagingRoot,
22
+ stagedExtensionDir: result.targetDir,
23
+ targetDir: join(extensionsDir, result.extensionId),
24
+ committed: false
25
+ };
26
+ } catch (err) {
27
+ rmSync(stagingRoot, {
28
+ recursive: true,
29
+ force: true
30
+ });
31
+ throw err;
32
+ }
33
+ }
34
+ /** Move a staged extension into its live path, preserving the previous version for rollback. */
35
+ function commitStagedExtensionInstall(state, overwrite) {
36
+ if (existsSync(state.targetDir)) {
37
+ if (!overwrite) throw new Error(`Extension already exists at ${state.targetDir}. Use overwrite to replace it.`);
38
+ state.backupDir = join(state.stagingRoot, "previous");
39
+ renameSync(state.targetDir, state.backupDir);
40
+ }
41
+ try {
42
+ renameSync(state.stagedExtensionDir, state.targetDir);
43
+ state.committed = true;
44
+ } catch (err) {
45
+ if (state.backupDir && existsSync(state.backupDir) && !existsSync(state.targetDir)) {
46
+ renameSync(state.backupDir, state.targetDir);
47
+ state.backupDir = void 0;
48
+ }
49
+ throw err;
50
+ }
51
+ }
52
+ /** Restore the previous live extension, or remove a newly committed install. */
53
+ function rollbackStagedExtensionInstall(state) {
54
+ if (state.committed && existsSync(state.targetDir)) rmSync(state.targetDir, {
55
+ recursive: true,
56
+ force: true
57
+ });
58
+ if (state.backupDir && existsSync(state.backupDir)) renameSync(state.backupDir, state.targetDir);
59
+ state.committed = false;
60
+ rmSync(state.stagingRoot, {
61
+ recursive: true,
62
+ force: true
63
+ });
64
+ }
65
+ /** Delete the preserved previous version after every durable metadata write succeeds. */
66
+ function finalizeStagedExtensionInstall(state) {
67
+ rmSync(state.stagingRoot, {
68
+ recursive: true,
69
+ force: true
70
+ });
71
+ state.backupDir = void 0;
72
+ }
73
+ //#endregion
74
+ export { commitStagedExtensionInstall, finalizeStagedExtensionInstall, rollbackStagedExtensionInstall, stageExtensionStoreZip };
75
+
76
+ //# sourceMappingURL=install-transaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-transaction.js","names":[],"sources":["../../../src/extensions/install-transaction.ts"],"sourcesContent":["import {\n existsSync,\n mkdirSync,\n mkdtempSync,\n readFileSync,\n renameSync,\n rmSync,\n} from 'node:fs';\nimport { join } from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport { installExtensionFromStoreZip } from './install.js';\n\ninterface ExtensionManifestEntry {\n id?: string;\n main?: string;\n}\n\nexport interface StagedExtensionInstall {\n extensionId: string;\n stagingRoot: string;\n stagedExtensionDir: string;\n targetDir: string;\n backupDir?: string;\n committed: boolean;\n}\n\n/** Extract, validate, install dependencies, and import-check an extension away from its live path. */\nexport async function stageExtensionStoreZip(\n buffer: Buffer,\n extensionsDir: string,\n): Promise<StagedExtensionInstall> {\n mkdirSync(extensionsDir, { recursive: true });\n const stagingRoot = mkdtempSync(join(extensionsDir, '.xopc-install-'));\n\n try {\n const result = await installExtensionFromStoreZip(buffer, stagingRoot);\n if (!result.ok || !result.extensionId || !result.targetDir) {\n throw new Error(result.error ?? 'Extension staging failed');\n }\n\n const manifestPath = join(result.targetDir, 'xopc.extension.json');\n const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as ExtensionManifestEntry;\n if (!manifest.main) {\n throw new Error('Extension manifest must declare main');\n }\n\n const mainUrl = pathToFileURL(join(result.targetDir, manifest.main));\n mainUrl.searchParams.set('xopcInstallCheck', `${Date.now()}-${Math.random()}`);\n await import(mainUrl.href);\n\n return {\n extensionId: result.extensionId,\n stagingRoot,\n stagedExtensionDir: result.targetDir,\n targetDir: join(extensionsDir, result.extensionId),\n committed: false,\n };\n } catch (err) {\n rmSync(stagingRoot, { recursive: true, force: true });\n throw err;\n }\n}\n\n/** Move a staged extension into its live path, preserving the previous version for rollback. */\nexport function commitStagedExtensionInstall(\n state: StagedExtensionInstall,\n overwrite: boolean,\n): void {\n if (existsSync(state.targetDir)) {\n if (!overwrite) {\n throw new Error(`Extension already exists at ${state.targetDir}. Use overwrite to replace it.`);\n }\n state.backupDir = join(state.stagingRoot, 'previous');\n renameSync(state.targetDir, state.backupDir);\n }\n\n try {\n renameSync(state.stagedExtensionDir, state.targetDir);\n state.committed = true;\n } catch (err) {\n if (state.backupDir && existsSync(state.backupDir) && !existsSync(state.targetDir)) {\n renameSync(state.backupDir, state.targetDir);\n state.backupDir = undefined;\n }\n throw err;\n }\n}\n\n/** Restore the previous live extension, or remove a newly committed install. */\nexport function rollbackStagedExtensionInstall(state: StagedExtensionInstall): void {\n if (state.committed && existsSync(state.targetDir)) {\n rmSync(state.targetDir, { recursive: true, force: true });\n }\n if (state.backupDir && existsSync(state.backupDir)) {\n renameSync(state.backupDir, state.targetDir);\n }\n state.committed = false;\n rmSync(state.stagingRoot, { recursive: true, force: true });\n}\n\n/** Delete the preserved previous version after every durable metadata write succeeds. */\nexport function finalizeStagedExtensionInstall(state: StagedExtensionInstall): void {\n rmSync(state.stagingRoot, { recursive: true, force: true });\n state.backupDir = undefined;\n}\n"],"mappings":";;;;;;AA4BA,eAAsB,uBACpB,QACA,eACiC;AACjC,WAAU,eAAe,EAAE,WAAW,MAAM,CAAC;CAC7C,MAAM,cAAc,YAAY,KAAK,eAAe,iBAAiB,CAAC;AAEtE,KAAI;EACF,MAAM,SAAS,MAAM,6BAA6B,QAAQ,YAAY;AACtE,MAAI,CAAC,OAAO,MAAM,CAAC,OAAO,eAAe,CAAC,OAAO,UAC/C,OAAM,IAAI,MAAM,OAAO,SAAS,2BAA2B;EAG7D,MAAM,eAAe,KAAK,OAAO,WAAW,sBAAsB;EAClE,MAAM,WAAW,KAAK,MAAM,aAAa,cAAc,OAAO,CAAC;AAC/D,MAAI,CAAC,SAAS,KACZ,OAAM,IAAI,MAAM,uCAAuC;EAGzD,MAAM,UAAU,cAAc,KAAK,OAAO,WAAW,SAAS,KAAK,CAAC;AACpE,UAAQ,aAAa,IAAI,oBAAoB,GAAG,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,GAAG;AAC9E,QAAM,OAAO,QAAQ;AAErB,SAAO;GACL,aAAa,OAAO;GACpB;GACA,oBAAoB,OAAO;GAC3B,WAAW,KAAK,eAAe,OAAO,YAAY;GAClD,WAAW;GACZ;UACM,KAAK;AACZ,SAAO,aAAa;GAAE,WAAW;GAAM,OAAO;GAAM,CAAC;AACrD,QAAM;;;;AAKV,SAAgB,6BACd,OACA,WACM;AACN,KAAI,WAAW,MAAM,UAAU,EAAE;AAC/B,MAAI,CAAC,UACH,OAAM,IAAI,MAAM,+BAA+B,MAAM,UAAU,gCAAgC;AAEjG,QAAM,YAAY,KAAK,MAAM,aAAa,WAAW;AACrD,aAAW,MAAM,WAAW,MAAM,UAAU;;AAG9C,KAAI;AACF,aAAW,MAAM,oBAAoB,MAAM,UAAU;AACrD,QAAM,YAAY;UACX,KAAK;AACZ,MAAI,MAAM,aAAa,WAAW,MAAM,UAAU,IAAI,CAAC,WAAW,MAAM,UAAU,EAAE;AAClF,cAAW,MAAM,WAAW,MAAM,UAAU;AAC5C,SAAM,YAAY,KAAA;;AAEpB,QAAM;;;;AAKV,SAAgB,+BAA+B,OAAqC;AAClF,KAAI,MAAM,aAAa,WAAW,MAAM,UAAU,CAChD,QAAO,MAAM,WAAW;EAAE,WAAW;EAAM,OAAO;EAAM,CAAC;AAE3D,KAAI,MAAM,aAAa,WAAW,MAAM,UAAU,CAChD,YAAW,MAAM,WAAW,MAAM,UAAU;AAE9C,OAAM,YAAY;AAClB,QAAO,MAAM,aAAa;EAAE,WAAW;EAAM,OAAO;EAAM,CAAC;;;AAI7D,SAAgB,+BAA+B,OAAqC;AAClF,QAAO,MAAM,aAAa;EAAE,WAAW;EAAM,OAAO;EAAM,CAAC;AAC3D,OAAM,YAAY,KAAA"}