@xopcai/xopc 0.0.223 → 0.0.225

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 (197) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/demo-memory/src/index.js +10 -1
  3. package/dist/extensions/telegram/xopc.extension.json +1 -1
  4. package/dist/gateway/static/root/assets/{activity-store--GBciH10.js → activity-store-CtTYnku4.js} +1 -1
  5. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-C93T3FLD.js → agent-avatar-dicebear-dizuqu_4.js} +1 -1
  6. package/dist/gateway/static/root/assets/agents-DeEEFZJ4.js +68 -0
  7. package/dist/gateway/static/root/assets/{api-HoIz_ija.js → api-CLRMz2BT.js} +1 -1
  8. package/dist/gateway/static/root/assets/{app-management-settings-panel-Bhl8Xluk.js → app-management-settings-panel-Cnk-DtQh.js} +1 -1
  9. package/dist/gateway/static/root/assets/{appearance-settings-CywEN-kG.js → appearance-settings-wP0rogVI.js} +1 -1
  10. package/dist/gateway/static/root/assets/{apps-page-BZY09nuJ.js → apps-page-Db5YNHVM.js} +1 -1
  11. package/dist/gateway/static/root/assets/{archive-plugin-CteCVsBP.js → archive-plugin-Cpzsm-DM.js} +1 -1
  12. package/dist/gateway/static/root/assets/{attachment-load-CbNE_EPd.js → attachment-load-Bd2OOoEK.js} +1 -1
  13. package/dist/gateway/static/root/assets/{automations-page-Bcqk6tOx.js → automations-page-DNqhguyk.js} +1 -1
  14. package/dist/gateway/static/root/assets/automations-workspace-CNT05YTb.js +6 -0
  15. package/dist/gateway/static/root/assets/{binary-plugins-M_i3WS5M.js → binary-plugins-Dcma5HdI.js} +1 -1
  16. package/dist/gateway/static/root/assets/{block-editor-eg9LEH2o.js → block-editor-D-B8ThwK.js} +3 -3
  17. package/dist/gateway/static/root/assets/{browser-settings-page-kKwbvzjj.js → browser-settings-page-UbDj3LIq.js} +3 -3
  18. package/dist/gateway/static/root/assets/{browser-workflow-inputs-1UZ0vnIy.js → browser-workflow-inputs-BAPZIXrs.js} +1 -1
  19. package/dist/gateway/static/root/assets/{browser-workflows-page-D8ATQqZ5.js → browser-workflows-page-DHtaSKEh.js} +1 -1
  20. package/dist/gateway/static/root/assets/capabilities-settings-panel-CiO152QS.js +7 -0
  21. package/dist/gateway/static/root/assets/{capability-presets-api-yNqTIuyd.js → capability-presets-api-zsZQ7im3.js} +1 -1
  22. package/dist/gateway/static/root/assets/{capability-presets-settings-panel-CgdRkwnk.js → capability-presets-settings-panel-Bc_hRwfL.js} +2 -2
  23. package/dist/gateway/static/root/assets/{channel-recipient-api-krezGsKc.js → channel-recipient-api-Cp8iaaXp.js} +1 -1
  24. package/dist/gateway/static/root/assets/channels-settings-CFW7zBoT.js +1 -0
  25. package/dist/gateway/static/root/assets/channels-status-swr-5rNVq7iI.js +1 -0
  26. package/dist/gateway/static/root/assets/{chat-terminal-dock-DQ5bB4Su.js → chat-terminal-dock-Dr6Rq2ln.js} +1 -1
  27. package/dist/gateway/static/root/assets/connectors-page-DLBr5nre.js +2 -0
  28. package/dist/gateway/static/root/assets/{cron-expression-CEwPkdhh.js → cron-expression-BiXrpzmo.js} +1 -1
  29. package/dist/gateway/static/root/assets/{date-picker-DDAxTir8.js → date-picker-BPuRtwKt.js} +1 -1
  30. package/dist/gateway/static/root/assets/{dependency-picker-CYVoSZwI.js → dependency-picker-BNC_W7wI.js} +1 -1
  31. package/dist/gateway/static/root/assets/{desktop-pet-CrNKfW_c.js → desktop-pet-DzOpt5nI.js} +1 -1
  32. package/dist/gateway/static/root/assets/{desktop-pet-settings-C06PaB46.js → desktop-pet-settings-BW0brCvH.js} +1 -1
  33. package/dist/gateway/static/root/assets/{directory-picker-path-field--D7laeLF.js → directory-picker-path-field-Baml0uTS.js} +1 -1
  34. package/dist/gateway/static/root/assets/{extension-debug-page-Dn4Px9KQ.js → extension-debug-page-CBXyKmfS.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-page-DzLf3fMQ.js → extension-page-BBhcr_SZ.js} +1 -1
  36. package/dist/gateway/static/root/assets/{extension-settings-page-DIchwtvB.js → extension-settings-page-4rwWpN9_.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-config-api-SmTGLhqK.js → gateway-config-api-Dg-BlBe4.js} +1 -1
  38. package/dist/gateway/static/root/assets/{gateway-config-swr-yUxMMVjK.js → gateway-config-swr-Du0MvK9s.js} +1 -1
  39. package/dist/gateway/static/root/assets/{gateway-settings-yCDkOYzA.js → gateway-settings-BOuYZOYe.js} +1 -1
  40. package/dist/gateway/static/root/assets/{gateway-startup-retry-9mrsL84j.js → gateway-startup-retry-JbjcHCaN.js} +1 -1
  41. package/dist/gateway/static/root/assets/{heartbeat-settings-CquIULHX.js → heartbeat-settings-Dq4YAlSx.js} +1 -1
  42. package/dist/gateway/static/root/assets/home-page-BIXkO0Ck.js +1 -0
  43. package/dist/gateway/static/root/assets/{image-generation-api-CgFAGDi8.js → image-generation-api-G2tfPvKP.js} +1 -1
  44. package/dist/gateway/static/root/assets/index-Csccu8sa.js +74 -0
  45. package/dist/gateway/static/root/assets/index-D3_xSYKd.css +2 -0
  46. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-DI2To7yl.js → keyboard-shortcuts-settings-L1Vtxgp9.js} +1 -1
  47. package/dist/gateway/static/root/assets/local-app-workbench-page-D-eacBcO.js +2 -0
  48. package/dist/gateway/static/root/assets/{local-apps-page-CSEJsQ1F.js → local-apps-page--thlkBLS.js} +1 -1
  49. package/dist/gateway/static/root/assets/{locale-store-CPylQjH9.js → locale-store-DqJz-cOR.js} +1 -1
  50. package/dist/gateway/static/root/assets/logs-page-BRCglHvd.js +2 -0
  51. package/dist/gateway/static/root/assets/{management-settings-CgyaIyuk.js → management-settings-p55fR4XO.js} +1 -1
  52. package/dist/gateway/static/root/assets/{markdown-split-paG9qap9.js → markdown-split-DwMcRlBR.js} +1 -1
  53. package/dist/gateway/static/root/assets/{markdown-view-CUsob4Pz.js → markdown-view-CTB9u15e.js} +1 -1
  54. package/dist/gateway/static/root/assets/{media-plugins-0Q-c_QIy.js → media-plugins-O6H3GZn7.js} +1 -1
  55. package/dist/gateway/static/root/assets/{messages-B82nsi9k.js → messages-CeydamsI.js} +3 -3
  56. package/dist/gateway/static/root/assets/{notes-api-CfKZYrBC.js → notes-api-CrjQbmk1.js} +1 -1
  57. package/dist/gateway/static/root/assets/{notes-page-Bvb-ycX_.js → notes-page-miO9ig9C.js} +1 -1
  58. package/dist/gateway/static/root/assets/notes-workbench-_13lmvmF.js +4 -0
  59. package/dist/gateway/static/root/assets/{product-open-page-DrvBwAns.js → product-open-page-BOu07nXf.js} +1 -1
  60. package/dist/gateway/static/root/assets/project-detail-page-BStRkOQr.js +1 -0
  61. package/dist/gateway/static/root/assets/projects-page-CY03RxVr.js +1 -0
  62. package/dist/gateway/static/root/assets/{registry-api-B_5D8epF.js → registry-api-Bf_HDLUJ.js} +1 -1
  63. package/dist/gateway/static/root/assets/remote-access-hub-B19llkld.js +1 -0
  64. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-DKjdN4Lr.js → runtime-tools-settings-panel-DthuRqUH.js} +1 -1
  65. package/dist/gateway/static/root/assets/{schema-form-DskqaNqC.js → schema-form-8W8PhXxa.js} +1 -1
  66. package/dist/gateway/static/root/assets/sessions-page-BDA2qbTd.js +1 -0
  67. package/dist/gateway/static/root/assets/settings-advanced-gate-BONIDX4v.js +1 -0
  68. package/dist/gateway/static/root/assets/{settings-form-section-CZlMvHA9.js → settings-form-section-CrsKGYiG.js} +1 -1
  69. package/dist/gateway/static/root/assets/{settings-loading-skeleton-DS6lcAg9.js → settings-loading-skeleton-WJtI0AAq.js} +1 -1
  70. package/dist/gateway/static/root/assets/{settings-page-oE5J9tsV.js → settings-page-PCjwRF47.js} +1 -1
  71. package/dist/gateway/static/root/assets/{setup-status-panel-C7oFCIqD.js → setup-status-panel-D65CwlNC.js} +1 -1
  72. package/dist/gateway/static/root/assets/{share-preview-page-CPFAj8NE.js → share-preview-page-BGtvLLeZ.js} +1 -1
  73. package/dist/gateway/static/root/assets/shares-settings-CdzVKrBl.js +1 -0
  74. package/dist/gateway/static/root/assets/skill-reload-api-CsRWid5h.js +1 -0
  75. package/dist/gateway/static/root/assets/{skills-page-Bh4gFi8e.js → skills-page-C_npyryI.js} +1 -1
  76. package/dist/gateway/static/root/assets/{skills-page.utils-BQaUWP9z.js → skills-page.utils-C46Sd78k.js} +1 -1
  77. package/dist/gateway/static/root/assets/{system-settings-panel-COAZoh_O.js → system-settings-panel-DomTLwki.js} +1 -1
  78. package/dist/gateway/static/root/assets/task-detail-page-B6YFX7kK.js +1 -0
  79. package/dist/gateway/static/root/assets/{theme-store-BN-32Fz5.js → theme-store-Ce7wq__X.js} +1 -1
  80. package/dist/gateway/static/root/assets/{use-autosave-BAkToU15.js → use-autosave-Do9mCRcY.js} +1 -1
  81. package/dist/gateway/static/root/assets/{user-context-page-Br5wgARM.js → user-context-page-CiCQA40E.js} +1 -1
  82. package/dist/gateway/static/root/assets/{voice-api-key-field-CC4z9-ux.js → voice-api-key-field-Bc5p-0tX.js} +1 -1
  83. package/dist/gateway/static/root/assets/{work-discovery-overlay-dLVUYSSE.js → work-discovery-overlay-BieqsmT1.js} +1 -1
  84. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-BYU5-0KF.js → workflow-run-setup-panel-DVj8iYvm.js} +2 -2
  85. package/dist/gateway/static/root/assets/workflows-page-AG04TTuH.js +5 -0
  86. package/dist/gateway/static/root/index.html +11 -11
  87. package/dist/package.js +1 -1
  88. package/dist/src/agent/embedded/run-turn.js +2 -0
  89. package/dist/src/agent/mcp/bundle-mcp-config.d.ts +9 -1
  90. package/dist/src/agent/mcp/bundle-mcp-config.js +11 -15
  91. package/dist/src/agent/mcp/embedded-mcp.d.ts +1 -1
  92. package/dist/src/agent/mcp/index.d.ts +1 -0
  93. package/dist/src/agent/mcp/index.js +7 -1
  94. package/dist/src/agent/mcp/mcp-http.d.ts +4 -0
  95. package/dist/src/agent/mcp/mcp-http.js +25 -1
  96. package/dist/src/agent/mcp/mcp-transport-config.d.ts +4 -0
  97. package/dist/src/agent/mcp/mcp-transport-config.js +1 -0
  98. package/dist/src/agent/mcp/mcp-transport.d.ts +7 -1
  99. package/dist/src/agent/mcp/mcp-transport.js +38 -11
  100. package/dist/src/agent/mcp/oauth/index.d.ts +6 -0
  101. package/dist/src/agent/mcp/oauth/index.js +6 -0
  102. package/dist/src/agent/mcp/oauth/mcp-oauth-errors.d.ts +5 -0
  103. package/dist/src/agent/mcp/oauth/mcp-oauth-errors.js +14 -0
  104. package/dist/src/agent/mcp/oauth/mcp-oauth-manager.d.ts +25 -0
  105. package/dist/src/agent/mcp/oauth/mcp-oauth-manager.js +219 -0
  106. package/dist/src/agent/mcp/oauth/mcp-oauth-provider.d.ts +33 -0
  107. package/dist/src/agent/mcp/oauth/mcp-oauth-provider.js +103 -0
  108. package/dist/src/agent/mcp/oauth/mcp-oauth-session.d.ts +29 -0
  109. package/dist/src/agent/mcp/oauth/mcp-oauth-session.js +169 -0
  110. package/dist/src/agent/mcp/oauth/mcp-oauth-store.d.ts +9 -0
  111. package/dist/src/agent/mcp/oauth/mcp-oauth-store.js +79 -0
  112. package/dist/src/agent/mcp/oauth/mcp-oauth-types.d.ts +22 -0
  113. package/dist/src/agent/mcp/oauth/mcp-oauth-types.js +1 -0
  114. package/dist/src/agent/memory/builtin-provider.js +23 -4
  115. package/dist/src/agent/memory/compaction-promotion.d.ts +18 -0
  116. package/dist/src/agent/memory/compaction-promotion.js +211 -0
  117. package/dist/src/agent/memory/context/types.d.ts +5 -0
  118. package/dist/src/agent/memory/manager.d.ts +3 -0
  119. package/dist/src/agent/memory/manager.js +12 -2
  120. package/dist/src/agent/memory/trusted-recall.d.ts +7 -0
  121. package/dist/src/agent/memory/trusted-recall.js +53 -0
  122. package/dist/src/agent/memory/turn-provenance.d.ts +14 -0
  123. package/dist/src/agent/memory/turn-provenance.js +60 -0
  124. package/dist/src/agent/memory/types.d.ts +18 -3
  125. package/dist/src/agent/memory/user-context-coordinator.js +57 -6
  126. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +2 -0
  127. package/dist/src/agent/tools/memory-tool.js +5 -1
  128. package/dist/src/capabilities/store-connector.js +99 -10
  129. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  130. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  131. package/dist/src/config/config-mutation.d.ts +14 -0
  132. package/dist/src/config/config-mutation.js +33 -0
  133. package/dist/src/config/index.js +3 -3
  134. package/dist/src/config/paths.d.ts +2 -0
  135. package/dist/src/config/paths.js +5 -1
  136. package/dist/src/config/schema.d.ts +17 -0
  137. package/dist/src/config/schema.js +26 -2
  138. package/dist/src/connectors/auth-provider-registry.d.ts +1 -1
  139. package/dist/src/connectors/auth-provider-registry.js +23 -2
  140. package/dist/src/connectors/install.js +3 -3
  141. package/dist/src/connectors/instances.d.ts +2 -1
  142. package/dist/src/connectors/instances.js +15 -5
  143. package/dist/src/connectors/materialize.d.ts +1 -0
  144. package/dist/src/connectors/materialize.js +9 -1
  145. package/dist/src/connectors/runtime-adapter-registry.js +1 -0
  146. package/dist/src/connectors/types.d.ts +4 -1
  147. package/dist/src/extensions/connector-dependencies.d.ts +10 -0
  148. package/dist/src/extensions/connector-dependencies.js +65 -0
  149. package/dist/src/extensions/install.js +27 -0
  150. package/dist/src/extensions/normalize-manifest.js +1 -0
  151. package/dist/src/extensions/types/manifest.d.ts +2 -0
  152. package/dist/src/gateway/heartbeat/service.js +1 -1
  153. package/dist/src/gateway/hono/routes/capabilities.js +8 -8
  154. package/dist/src/gateway/hono/routes/connectors.js +87 -55
  155. package/dist/src/gateway/hono/routes/mcp.js +77 -5
  156. package/dist/src/gateway/hono/routes/voice.js +1 -1
  157. package/dist/src/gateway/run-loop.js +3 -0
  158. package/dist/src/gateway/server.d.ts +3 -0
  159. package/dist/src/gateway/server.js +30 -5
  160. package/dist/src/heartbeat/index.js +1 -1
  161. package/dist/src/infra/update-restart.js +1 -1
  162. package/dist/src/knowledge/connected-knowledge-pipeline.js +26 -4
  163. package/dist/src/session/store.js +27 -0
  164. package/dist/src/storage/sqlite/memory-records-repository.d.ts +9 -1
  165. package/dist/src/storage/sqlite/memory-records-repository.js +40 -6
  166. package/dist/src/storage/sqlite/migrations/134_memory_provenance.sql +18 -0
  167. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  168. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  169. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  170. package/dist/src/storage/sqlite/schema.js +1 -1
  171. package/dist/src/user-context/planner.js +8 -3
  172. package/dist/src/voice/stt/transcribe-core.js +17 -1
  173. package/dist/src/voice/stt/types.d.ts +1 -1
  174. package/package.json +3 -3
  175. package/dist/gateway/static/root/assets/agents-Ba4XF0Im.js +0 -68
  176. package/dist/gateway/static/root/assets/automations-workspace-DtI6vsMf.js +0 -6
  177. package/dist/gateway/static/root/assets/capabilities-settings-panel-CZRcis8B.js +0 -7
  178. package/dist/gateway/static/root/assets/channels-settings-DETCY0Ku.js +0 -1
  179. package/dist/gateway/static/root/assets/channels-status-swr-DMxB7slL.js +0 -1
  180. package/dist/gateway/static/root/assets/connectors-page-D9D92u28.js +0 -2
  181. package/dist/gateway/static/root/assets/home-page-COSGBh4c.js +0 -1
  182. package/dist/gateway/static/root/assets/index-5XkDWH_Q.css +0 -2
  183. package/dist/gateway/static/root/assets/index-wnDPGRTi.js +0 -74
  184. package/dist/gateway/static/root/assets/local-app-workbench-page-CAF5SZXv.js +0 -2
  185. package/dist/gateway/static/root/assets/logs-page-D1KFPHL1.js +0 -2
  186. package/dist/gateway/static/root/assets/notes-workbench-DelxGBof.js +0 -4
  187. package/dist/gateway/static/root/assets/project-detail-page-C2EnYXEQ.js +0 -1
  188. package/dist/gateway/static/root/assets/projects-page-BiMPU6Oa.js +0 -1
  189. package/dist/gateway/static/root/assets/remote-access-hub-CpbNivVs.js +0 -1
  190. package/dist/gateway/static/root/assets/sessions-page-BxKtzsKI.js +0 -1
  191. package/dist/gateway/static/root/assets/settings-advanced-gate-BfBKMMUx.js +0 -1
  192. package/dist/gateway/static/root/assets/shares-settings-B46DWZK4.js +0 -1
  193. package/dist/gateway/static/root/assets/skill-reload-api-CyKolUZ-.js +0 -1
  194. package/dist/gateway/static/root/assets/task-detail-page-CXkhprf-.js +0 -1
  195. package/dist/gateway/static/root/assets/workflows-page-CJ24a1HM.js +0 -5
  196. package/dist/src/extensions/bundle-mcp.d.ts +0 -18
  197. package/dist/src/extensions/bundle-mcp.js +0 -69
@@ -1430,6 +1430,10 @@ export declare const TuiConfigSchema: z.ZodDefault<z.ZodObject<{
1430
1430
  defaultAgent: z.ZodOptional<z.ZodString>;
1431
1431
  }, z.core.$strict>>;
1432
1432
  export type TuiConfig = z.infer<typeof TuiConfigSchema>;
1433
+ export declare const McpOAuthConfigSchema: z.ZodObject<{
1434
+ type: z.ZodLiteral<"oauth">;
1435
+ clientId: z.ZodOptional<z.ZodString>;
1436
+ }, z.core.$strict>;
1433
1437
  export declare const McpServerSchema: z.ZodObject<{
1434
1438
  command: z.ZodOptional<z.ZodString>;
1435
1439
  args: z.ZodOptional<z.ZodArray<z.ZodString>>;
@@ -1452,6 +1456,10 @@ export declare const McpServerSchema: z.ZodObject<{
1452
1456
  fieldKey: z.ZodString;
1453
1457
  }, z.core.$strip>;
1454
1458
  }, z.core.$strip>]>>>;
1459
+ auth: z.ZodOptional<z.ZodObject<{
1460
+ type: z.ZodLiteral<"oauth">;
1461
+ clientId: z.ZodOptional<z.ZodString>;
1462
+ }, z.core.$strict>>;
1455
1463
  connectionTimeoutMs: z.ZodOptional<z.ZodNumber>;
1456
1464
  requestTimeoutMs: z.ZodOptional<z.ZodNumber>;
1457
1465
  }, z.core.$catchall<z.ZodUnknown>>;
@@ -1478,12 +1486,17 @@ export declare const McpConfigSchema: z.ZodOptional<z.ZodObject<{
1478
1486
  fieldKey: z.ZodString;
1479
1487
  }, z.core.$strip>;
1480
1488
  }, z.core.$strip>]>>>;
1489
+ auth: z.ZodOptional<z.ZodObject<{
1490
+ type: z.ZodLiteral<"oauth">;
1491
+ clientId: z.ZodOptional<z.ZodString>;
1492
+ }, z.core.$strict>>;
1481
1493
  connectionTimeoutMs: z.ZodOptional<z.ZodNumber>;
1482
1494
  requestTimeoutMs: z.ZodOptional<z.ZodNumber>;
1483
1495
  }, z.core.$catchall<z.ZodUnknown>>>>;
1484
1496
  sessionIdleTtlMs: z.ZodOptional<z.ZodNumber>;
1485
1497
  }, z.core.$strict>>;
1486
1498
  export type McpServerConfig = z.infer<typeof McpServerSchema>;
1499
+ export type McpOAuthConfig = z.infer<typeof McpOAuthConfigSchema>;
1487
1500
  export type McpConfig = z.infer<typeof McpConfigSchema>;
1488
1501
  export declare const ConnectorsConfigSchema: z.ZodOptional<z.ZodObject<{
1489
1502
  instances: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodRecord<z.ZodString, z.ZodUnknown>>>;
@@ -2331,6 +2344,10 @@ export declare const ConfigSchema: z.ZodDefault<z.ZodObject<{
2331
2344
  fieldKey: z.ZodString;
2332
2345
  }, z.core.$strip>;
2333
2346
  }, z.core.$strip>]>>>;
2347
+ auth: z.ZodOptional<z.ZodObject<{
2348
+ type: z.ZodLiteral<"oauth">;
2349
+ clientId: z.ZodOptional<z.ZodString>;
2350
+ }, z.core.$strict>>;
2334
2351
  connectionTimeoutMs: z.ZodOptional<z.ZodNumber>;
2335
2352
  requestTimeoutMs: z.ZodOptional<z.ZodNumber>;
2336
2353
  }, z.core.$catchall<z.ZodUnknown>>>>;
@@ -64,7 +64,7 @@ function parseModelRef(ref) {
64
64
  model: trimmed.slice(idx + 1).trim()
65
65
  };
66
66
  }
67
- var AgentModelRefSchema, AgentImageGenerationModelSchema, AgentTypedModelRoleSchema, AgentTypedModelRolesSchema, AgentModelsSchema, AgentsConfigSchema, BrowserCloudConfigSchema, BrowserExtensionConfigSchema, BrowserCloakConfigSchema, BrowserConfigSchema, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, SessionDmScopeSchema, SessionStorageConfigSchema, SessionResetModeSchema, SessionResetConfigSchema, SessionResetByTypeSchema, SessionScopeSchema, SessionConfigSchema, ChannelsConfigSchema, SearchProviderEntrySchema, WebSearchConfigSchema, WebsiteBlocklistSchema, WebToolsConfigSchema, ToolsConfigSchema, RuntimePreferenceSchema, RuntimeProvisionSchema, LanguageRuntimeSchema, DEFAULT_RUNTIME_TOOLS_CONFIG, RuntimeToolsConfigSchema, GatewayAuthRateLimitSchema, GatewaySecuritySchema, GatewayTrustedProxySchema, GatewayAuthSchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayRemoteSchema, GatewayTlsSchema, GatewayModeSchema, HeartbeatConfigSchema, GatewayChannelConnectDeferModeSchema, TunnelConsentSchema, TunnelConfigSchema, WorkspaceImportConfigSchema, WorkspaceConfigSchema, GatewayBindModeSchema, GatewayWebchatConfigSchema, GatewayConfigSchema, ModelsDevConfigSchema, ModelCatalogConfigSchema, SttProviderConfigCatchallSchema, STTProviderConfigSchema, STTFallbackConfigSchema, MediaUnderstandingCapabilitiesSchema, MediaUnderstandingModelSchema, STTConfigSchema, TtsProviderConfigCatchallSchema, TTSProviderConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSEdgeConfigSchema, TTSSummarizationConfigSchema, TTSConfigSchema, VoiceRefinementConfigSchema, VoiceConfigSchema, MessagesConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, ProviderAzureConfigSchema, ProviderRequestOverridesSchema, ProviderAuthConfigSchema, ProvidersConfigSchema, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, UpdateAutoConfigSchema, UpdateConfigSchema, CommandsConfigSchema, TuiConfigSchema, McpHttpUrlSchema, ConnectorSecretReferenceSchema, McpConfigScalarSchema, McpServerSchema, McpConfigSchema, ConnectorsConfigSchema, ExperimentalConfigSchema, ConfigSchema;
67
+ var AgentModelRefSchema, AgentImageGenerationModelSchema, AgentTypedModelRoleSchema, AgentTypedModelRolesSchema, AgentModelsSchema, AgentsConfigSchema, BrowserCloudConfigSchema, BrowserExtensionConfigSchema, BrowserCloakConfigSchema, BrowserConfigSchema, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, SessionDmScopeSchema, SessionStorageConfigSchema, SessionResetModeSchema, SessionResetConfigSchema, SessionResetByTypeSchema, SessionScopeSchema, SessionConfigSchema, ChannelsConfigSchema, SearchProviderEntrySchema, WebSearchConfigSchema, WebsiteBlocklistSchema, WebToolsConfigSchema, ToolsConfigSchema, RuntimePreferenceSchema, RuntimeProvisionSchema, LanguageRuntimeSchema, DEFAULT_RUNTIME_TOOLS_CONFIG, RuntimeToolsConfigSchema, GatewayAuthRateLimitSchema, GatewaySecuritySchema, GatewayTrustedProxySchema, GatewayAuthSchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayRemoteSchema, GatewayTlsSchema, GatewayModeSchema, HeartbeatConfigSchema, GatewayChannelConnectDeferModeSchema, TunnelConsentSchema, TunnelConfigSchema, WorkspaceImportConfigSchema, WorkspaceConfigSchema, GatewayBindModeSchema, GatewayWebchatConfigSchema, GatewayConfigSchema, ModelsDevConfigSchema, ModelCatalogConfigSchema, SttProviderConfigCatchallSchema, STTProviderConfigSchema, STTFallbackConfigSchema, MediaUnderstandingCapabilitiesSchema, MediaUnderstandingModelSchema, STTConfigSchema, TtsProviderConfigCatchallSchema, TTSProviderConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSEdgeConfigSchema, TTSSummarizationConfigSchema, TTSConfigSchema, VoiceRefinementConfigSchema, VoiceConfigSchema, MessagesConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, ProviderAzureConfigSchema, ProviderRequestOverridesSchema, ProviderAuthConfigSchema, ProvidersConfigSchema, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, UpdateAutoConfigSchema, UpdateConfigSchema, CommandsConfigSchema, TuiConfigSchema, McpHttpUrlSchema, ConnectorSecretReferenceSchema, McpConfigScalarSchema, McpOAuthConfigSchema, McpServerSchema, McpConfigSchema, ConnectorsConfigSchema, ExperimentalConfigSchema, ConfigSchema;
68
68
  var init_schema = __esmMin((() => {
69
69
  init_schema$1();
70
70
  init_preset_chain();
@@ -970,6 +970,11 @@ defaultAgent: z.string().min(1).optional() }).strict().default({});
970
970
  z.boolean(),
971
971
  ConnectorSecretReferenceSchema
972
972
  ]);
973
+ McpOAuthConfigSchema = z.object({
974
+ type: z.literal("oauth"),
975
+ /** Optional public client id for authorization servers without dynamic registration. */
976
+ clientId: z.string().min(1).optional()
977
+ }).strict();
973
978
  McpServerSchema = z.object({
974
979
  command: z.string().optional(),
975
980
  args: z.array(z.string()).optional(),
@@ -979,6 +984,7 @@ defaultAgent: z.string().min(1).optional() }).strict().default({});
979
984
  url: McpHttpUrlSchema.optional(),
980
985
  transport: z.enum(["sse", "streamable-http"]).optional(),
981
986
  headers: z.record(z.string(), McpConfigScalarSchema).optional(),
987
+ auth: McpOAuthConfigSchema.optional(),
982
988
  connectionTimeoutMs: z.number().finite().positive().optional(),
983
989
  requestTimeoutMs: z.number().finite().positive().optional()
984
990
  }).catchall(z.unknown()).superRefine((value, ctx) => {
@@ -988,6 +994,24 @@ defaultAgent: z.string().min(1).optional() }).strict().default({});
988
994
  code: "custom",
989
995
  message: "MCP server cannot define both command and url"
990
996
  });
997
+ if (value.auth && !hasUrl) ctx.addIssue({
998
+ code: "custom",
999
+ path: ["auth"],
1000
+ message: "MCP OAuth requires an HTTP server URL"
1001
+ });
1002
+ if (value.auth && value.transport === "sse") ctx.addIssue({
1003
+ code: "custom",
1004
+ path: ["auth"],
1005
+ message: "MCP OAuth currently supports streamable HTTP only"
1006
+ });
1007
+ if (value.auth && value.headers) {
1008
+ const authorizationHeader = Object.keys(value.headers).find((key) => key.toLowerCase() === "authorization");
1009
+ if (authorizationHeader) ctx.addIssue({
1010
+ code: "custom",
1011
+ path: ["headers", authorizationHeader],
1012
+ message: "MCP OAuth cannot be combined with a static Authorization header"
1013
+ });
1014
+ }
991
1015
  });
992
1016
  McpConfigSchema = z.object({
993
1017
  servers: z.record(z.string(), McpServerSchema).optional(),
@@ -1148,4 +1172,4 @@ workDiscoveryOnboarding: z.boolean().default(true) }).strict().default({ workDis
1148
1172
  }));
1149
1173
  //#endregion
1150
1174
  init_schema();
1151
- export { AgentImageGenerationModelSchema, AgentModelRefSchema, AgentModelsSchema, AgentTypedModelRoleSchema, AgentsConfigSchema, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, BrowserConfigSchema, ChannelsConfigSchema, CommandsConfigSchema, ConfigSchema, ConnectorsConfigSchema, ExperimentalConfigSchema, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, GatewayAuthRateLimitSchema, GatewayAuthSchema, GatewayBindModeSchema, GatewayChannelConnectDeferModeSchema, GatewayConfigSchema, GatewayModeSchema, GatewayRemoteSchema, GatewaySecuritySchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayTlsSchema, GatewayTrustedProxySchema, GatewayWebchatConfigSchema, HeartbeatConfigSchema, McpConfigSchema, McpServerSchema, MediaUnderstandingCapabilitiesSchema, MediaUnderstandingModelSchema, MessagesConfigSchema, ModelCatalogConfigSchema, ModelsDevConfigSchema, ProviderAuthConfigSchema, ProviderAzureConfigSchema, ProviderRequestOverridesSchema, ProvidersConfigSchema, RuntimeToolsConfigSchema, STTConfigSchema, STTFallbackConfigSchema, STTProviderConfigSchema, SearchProviderEntrySchema, SessionConfigSchema, SessionDmScopeSchema, SessionResetByTypeSchema, SessionResetConfigSchema, SessionResetModeSchema, SessionScopeSchema, SessionStorageConfigSchema, TTSConfigSchema, TTSEdgeConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSProviderConfigSchema, TTSSummarizationConfigSchema, TelegramAccountConfigSchema, TelegramConfigSchema, TelegramGroupConfigSchema, TelegramTopicConfigSchema, ToolsConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, TuiConfigSchema, TunnelConfigSchema, TunnelConsentSchema, UpdateAutoConfigSchema, UpdateConfigSchema, VoiceConfigSchema, VoiceRefinementConfigSchema, WebSearchConfigSchema, WebToolsConfigSchema, WebsiteBlocklistSchema, WeixinAccountConfigSchema, WeixinConfigSchema, WorkspaceConfigSchema, WorkspaceImportConfigSchema, getAgentDefaultImageGenerationModelConfig, getAgentDefaultImageModelConfig, getAgentDefaultModelRef, init_schema, parseModelRef };
1175
+ export { AgentImageGenerationModelSchema, AgentModelRefSchema, AgentModelsSchema, AgentTypedModelRoleSchema, AgentsConfigSchema, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, BrowserConfigSchema, ChannelsConfigSchema, CommandsConfigSchema, ConfigSchema, ConnectorsConfigSchema, ExperimentalConfigSchema, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, GatewayAuthRateLimitSchema, GatewayAuthSchema, GatewayBindModeSchema, GatewayChannelConnectDeferModeSchema, GatewayConfigSchema, GatewayModeSchema, GatewayRemoteSchema, GatewaySecuritySchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayTlsSchema, GatewayTrustedProxySchema, GatewayWebchatConfigSchema, HeartbeatConfigSchema, McpConfigSchema, McpOAuthConfigSchema, McpServerSchema, MediaUnderstandingCapabilitiesSchema, MediaUnderstandingModelSchema, MessagesConfigSchema, ModelCatalogConfigSchema, ModelsDevConfigSchema, ProviderAuthConfigSchema, ProviderAzureConfigSchema, ProviderRequestOverridesSchema, ProvidersConfigSchema, RuntimeToolsConfigSchema, STTConfigSchema, STTFallbackConfigSchema, STTProviderConfigSchema, SearchProviderEntrySchema, SessionConfigSchema, SessionDmScopeSchema, SessionResetByTypeSchema, SessionResetConfigSchema, SessionResetModeSchema, SessionScopeSchema, SessionStorageConfigSchema, TTSConfigSchema, TTSEdgeConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSProviderConfigSchema, TTSSummarizationConfigSchema, TelegramAccountConfigSchema, TelegramConfigSchema, TelegramGroupConfigSchema, TelegramTopicConfigSchema, ToolsConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, TuiConfigSchema, TunnelConfigSchema, TunnelConsentSchema, UpdateAutoConfigSchema, UpdateConfigSchema, VoiceConfigSchema, VoiceRefinementConfigSchema, WebSearchConfigSchema, WebToolsConfigSchema, WebsiteBlocklistSchema, WeixinAccountConfigSchema, WeixinConfigSchema, WorkspaceConfigSchema, WorkspaceImportConfigSchema, getAgentDefaultImageGenerationModelConfig, getAgentDefaultImageModelConfig, getAgentDefaultModelRef, init_schema, parseModelRef };
@@ -7,4 +7,4 @@ export type ConnectorAuthStartResult = {
7
7
  authorizationUrl?: string;
8
8
  connectionId?: string;
9
9
  };
10
- export declare function startConnectorAuthorization(definition: ConnectorDefinition, config?: Config): Promise<ConnectorAuthStartResult>;
10
+ export declare function startConnectorAuthorization(definition: ConnectorDefinition, config?: Config, instanceId?: string): Promise<ConnectorAuthStartResult>;
@@ -1,8 +1,29 @@
1
1
  import { startComposioAuthorize } from "./composio.js";
2
+ import { isManagedConnectorServer } from "./materialize.js";
2
3
  import { getConnectorInstance } from "./instances.js";
4
+ import { getMcpOAuthManager } from "../agent/mcp/oauth/mcp-oauth-manager.js";
3
5
  //#region src/connectors/auth-provider-registry.ts
4
- async function startConnectorAuthorization(definition, config) {
5
- if (definition.auth.mode !== "oauth" || definition.auth.provider !== "composio" || definition.runtime.type !== "composio" || definition.runtime.role !== "toolkit") throw new Error(`Connector "${definition.id}" does not support Composio authorization.`);
6
+ async function startConnectorAuthorization(definition, config, instanceId) {
7
+ if (definition.auth.mode !== "oauth") throw new Error(`Connector "${definition.id}" does not use OAuth.`);
8
+ if (definition.runtime.type === "mcp") {
9
+ if (!config) throw new Error("Connector configuration is required for MCP authorization.");
10
+ const serverId = instanceId ?? definition.runtime.serverId;
11
+ const server = config.mcp?.servers?.[serverId];
12
+ if (!server) throw new Error(`Connector MCP server not found: ${serverId}`);
13
+ if (!isManagedConnectorServer(server) || server.xopcConnector.connectorId !== definition.id) throw new Error(`MCP server "${serverId}" is not managed by connector "${definition.id}".`);
14
+ const status = await getMcpOAuthManager().start({
15
+ serverId,
16
+ rawServer: server,
17
+ cfg: config
18
+ });
19
+ return {
20
+ connectorId: definition.id,
21
+ provider: "mcp",
22
+ status: status.status,
23
+ authorizationUrl: status.session?.authorizationUrl
24
+ };
25
+ }
26
+ if (definition.auth.provider !== "composio" || definition.runtime.type !== "composio" || definition.runtime.role !== "toolkit") throw new Error(`Connector "${definition.id}" does not support OAuth authorization.`);
6
27
  const configuredAuthConfigId = config ? getConnectorInstance(config, definition.id)?.config?.authConfigId : void 0;
7
28
  const authConfigId = typeof configuredAuthConfigId === "string" && configuredAuthConfigId.trim() ? configuredAuthConfigId.trim() : void 0;
8
29
  const authorization = await startComposioAuthorize(definition.id, definition.runtime.toolkit, void 0, authConfigId);
@@ -1,7 +1,7 @@
1
1
  import { CredentialResolver, init_credentials } from "../auth/credentials.js";
2
2
  import { assertPreferredConnectorStrategy } from "./integration-strategy.js";
3
3
  import { getConnectorDefinition } from "./catalog.js";
4
- import { getConnectorInstance } from "./instances.js";
4
+ import { getConnectorInstance, getInstalledConnectorDefinition } from "./instances.js";
5
5
  import { getConnectorRuntimeAdapter } from "./runtime-adapter-registry.js";
6
6
  //#region src/connectors/install.ts
7
7
  init_credentials();
@@ -22,7 +22,7 @@ async function installConnector(config, connectorId, input, resolver = new Crede
22
22
  function updateConnectorConfig(config, instanceId, input) {
23
23
  const instance = getConnectorInstance(config, instanceId);
24
24
  if (!instance) throw new Error(`Connector instance not found: ${instanceId}`);
25
- const definition = getConnectorDefinition(instance.connectorId);
25
+ const definition = getInstalledConnectorDefinition(config, instanceId);
26
26
  if (!definition) throw new Error(`Unknown connector: ${instance.connectorId}`);
27
27
  const adapter = getConnectorRuntimeAdapter(definition.runtime.type);
28
28
  if (!adapter.update) throw new Error(`Connector type "${definition.runtime.type}" does not support config updates.`);
@@ -40,7 +40,7 @@ function uninstallConnector(config, instanceId) {
40
40
  if (config.mcp?.servers?.[instanceId] || config.connectors?.instances?.[instanceId]) throw new Error(`Connector instance "${instanceId}" is not managed by Connectors.`);
41
41
  throw new Error(`Connector instance not found: ${instanceId}`);
42
42
  }
43
- const definition = getConnectorDefinition(instance.connectorId);
43
+ const definition = getInstalledConnectorDefinition(config, instanceId);
44
44
  if (!definition) throw new Error(`Unknown connector: ${instance.connectorId}`);
45
45
  getConnectorRuntimeAdapter(definition.runtime.type).uninstall({
46
46
  config,
@@ -1,4 +1,5 @@
1
1
  import type { Config } from '../config/schema.js';
2
- import type { ConnectorInstance } from './types.js';
2
+ import type { ConnectorDefinition, ConnectorInstance } from './types.js';
3
3
  export declare function listConnectorInstances(config: Config): ConnectorInstance[];
4
4
  export declare function getConnectorInstance(config: Config, instanceId: string): ConnectorInstance | undefined;
5
+ export declare function getInstalledConnectorDefinition(config: Config, instanceId: string): ConnectorDefinition | undefined;
@@ -1,5 +1,5 @@
1
1
  import { getConnectorDefinition } from "./catalog.js";
2
- import { isManagedConnectorServer } from "./materialize.js";
2
+ import { connectorDefinitionFromManagedMarker, isManagedConnectorServer } from "./materialize.js";
3
3
  import { getConnectorAuditFromMarker, getConnectorUsageFromMarker } from "./usage.js";
4
4
  //#region src/connectors/instances.ts
5
5
  function readMarkerConfig(marker) {
@@ -9,7 +9,7 @@ function readMarkerConfig(marker) {
9
9
  }
10
10
  function secretStatusForServer(server) {
11
11
  const marker = server.xopcConnector;
12
- const definition = marker?.connectorId ? getConnectorDefinition(marker.connectorId) : void 0;
12
+ const definition = connectorDefinitionFromManagedMarker(marker) ?? (marker?.connectorId ? getConnectorDefinition(marker.connectorId) : void 0);
13
13
  const env = server.env && typeof server.env === "object" && !Array.isArray(server.env) ? server.env : {};
14
14
  const status = {};
15
15
  for (const secret of definition?.setup.secrets ?? []) {
@@ -24,7 +24,7 @@ function connectorInstanceFromRecord(instanceId, record) {
24
24
  const markerRecord = marker;
25
25
  if (markerRecord.managed !== true || typeof markerRecord.connectorId !== "string") return [];
26
26
  const connectorId = markerRecord.connectorId;
27
- const definition = getConnectorDefinition(connectorId);
27
+ const definition = connectorDefinitionFromManagedMarker(markerRecord) ?? getConnectorDefinition(connectorId);
28
28
  const runtime = record.runtime && typeof record.runtime === "object" && !Array.isArray(record.runtime) ? record.runtime : {};
29
29
  const runtimeType = runtime.type;
30
30
  if (runtimeType !== "composio" && runtimeType !== "channel" && runtimeType !== "nativeTool" && runtimeType !== "memorySource") return [];
@@ -66,7 +66,7 @@ function listConnectorInstances(config) {
66
66
  const mcpInstances = Object.entries(servers).flatMap(([serverId, server]) => {
67
67
  if (!isManagedConnectorServer(server)) return [];
68
68
  const connectorId = server.xopcConnector.connectorId;
69
- const definition = getConnectorDefinition(connectorId);
69
+ const definition = connectorDefinitionFromManagedMarker(server.xopcConnector) ?? getConnectorDefinition(connectorId);
70
70
  const enabled = server.xopcConnector.enabled !== false;
71
71
  const usage = getConnectorUsageFromMarker(server.xopcConnector);
72
72
  const lastHealthStatus = usage.lastHealthStatus;
@@ -99,5 +99,15 @@ function listConnectorInstances(config) {
99
99
  function getConnectorInstance(config, instanceId) {
100
100
  return listConnectorInstances(config).find((instance) => instance.instanceId === instanceId);
101
101
  }
102
+ function getInstalledConnectorDefinition(config, instanceId) {
103
+ const server = config.mcp?.servers?.[instanceId];
104
+ if (server && isManagedConnectorServer(server)) return connectorDefinitionFromManagedMarker(server.xopcConnector) ?? getConnectorDefinition(server.xopcConnector.connectorId);
105
+ const record = config.connectors?.instances?.[instanceId];
106
+ if (record && typeof record === "object" && !Array.isArray(record)) {
107
+ const marker = record.xopcConnector;
108
+ const connectorId = marker && typeof marker === "object" && !Array.isArray(marker) ? marker.connectorId : void 0;
109
+ return connectorDefinitionFromManagedMarker(marker) ?? (typeof connectorId === "string" ? getConnectorDefinition(connectorId) : void 0);
110
+ }
111
+ }
102
112
  //#endregion
103
- export { getConnectorInstance, listConnectorInstances };
113
+ export { getConnectorInstance, getInstalledConnectorDefinition, listConnectorInstances };
@@ -4,6 +4,7 @@ export declare function materializeConnectorMcpServer(definition: ConnectorDefin
4
4
  serverId: string;
5
5
  server: Record<string, unknown>;
6
6
  };
7
+ export declare function connectorDefinitionFromManagedMarker(marker: unknown): ConnectorDefinition | undefined;
7
8
  export declare function isManagedConnectorServer(server: unknown): server is Record<string, unknown> & {
8
9
  xopcConnector: ManagedConnectorMarker;
9
10
  };
@@ -56,6 +56,7 @@ function materializeConnectorMcpServer(definition, input) {
56
56
  displayName: definition.displayName,
57
57
  source: definition.source,
58
58
  artifactSha256: definition.provenance?.sha256,
59
+ definition,
59
60
  ...input.config && Object.keys(input.config).length > 0 ? { config: input.config } : {}
60
61
  };
61
62
  const server = {
@@ -69,10 +70,17 @@ function materializeConnectorMcpServer(definition, input) {
69
70
  server
70
71
  };
71
72
  }
73
+ function connectorDefinitionFromManagedMarker(marker) {
74
+ if (!marker || typeof marker !== "object" || Array.isArray(marker)) return void 0;
75
+ const definition = marker.definition;
76
+ if (!definition || typeof definition !== "object" || Array.isArray(definition)) return void 0;
77
+ const record = definition;
78
+ return typeof record.id === "string" && typeof record.version === "string" && record.runtime ? record : void 0;
79
+ }
72
80
  function isManagedConnectorServer(server) {
73
81
  if (!server || typeof server !== "object" || Array.isArray(server)) return false;
74
82
  const marker = server.xopcConnector;
75
83
  return Boolean(marker && typeof marker === "object" && !Array.isArray(marker) && marker.managed === true && typeof marker.connectorId === "string");
76
84
  }
77
85
  //#endregion
78
- export { assertValidConnectorServerId, isManagedConnectorServer, materializeConnectorMcpServer };
86
+ export { assertValidConnectorServerId, connectorDefinitionFromManagedMarker, isManagedConnectorServer, materializeConnectorMcpServer };
@@ -32,6 +32,7 @@ function installRecord(config, definition, extra = {}, markerExtra = {}) {
32
32
  displayName: definition.displayName,
33
33
  source: definition.source,
34
34
  artifactSha256: definition.provenance?.sha256,
35
+ definition,
35
36
  ...markerExtra
36
37
  },
37
38
  runtime: definition.runtime,
@@ -8,7 +8,8 @@ export type ConnectorAuthDefinition = {
8
8
  mode: 'apiKey';
9
9
  } | {
10
10
  mode: 'oauth';
11
- provider: string;
11
+ provider?: string;
12
+ clientId?: string;
12
13
  };
13
14
  export type ConnectorScope = 'read' | 'write' | 'admin';
14
15
  export type ConnectorVerificationLevel = 'verified' | 'beta' | 'experimental';
@@ -289,4 +290,6 @@ export type ManagedConnectorMarker = {
289
290
  config?: Record<string, unknown>;
290
291
  source?: ConnectorDefinition['source'];
291
292
  artifactSha256?: string;
293
+ /** Immutable install-time snapshot used for update, health, and uninstall after restart. */
294
+ definition?: ConnectorDefinition;
292
295
  };
@@ -0,0 +1,10 @@
1
+ import type { Config } from '../config/schema.js';
2
+ export type ExtensionConnectorDiagnostic = {
3
+ extensionId: string;
4
+ connectorId: string;
5
+ message: string;
6
+ };
7
+ export declare function inspectExtensionConnectorDependencies(params: {
8
+ cfg?: Config;
9
+ roots?: string[];
10
+ }): ExtensionConnectorDiagnostic[];
@@ -0,0 +1,65 @@
1
+ import { init_paths, resolveBundledExtensionsDir, resolveExtensionsDir } from "../config/paths.js";
2
+ import { isRecord } from "../utils/is-record.js";
3
+ import { join } from "node:path";
4
+ import { existsSync, readFileSync, readdirSync } from "node:fs";
5
+ //#region src/extensions/connector-dependencies.ts
6
+ init_paths();
7
+ function isExtensionEnabled(extensionId, cfg) {
8
+ const disabled = cfg?.extensions?.disabled;
9
+ if (Array.isArray(disabled) && disabled.includes(extensionId)) return false;
10
+ const enabled = cfg?.extensions?.enabled;
11
+ return !Array.isArray(enabled) || enabled.length === 0 || enabled.includes(extensionId);
12
+ }
13
+ function enabledConnectorIds(cfg) {
14
+ const ids = /* @__PURE__ */ new Set();
15
+ for (const server of Object.values(cfg?.mcp?.servers ?? {})) {
16
+ if (!isRecord(server) || !isRecord(server.xopcConnector)) continue;
17
+ if (server.xopcConnector.managed === true && server.xopcConnector.enabled !== false && typeof server.xopcConnector.connectorId === "string") ids.add(server.xopcConnector.connectorId);
18
+ }
19
+ for (const instance of Object.values(cfg?.connectors?.instances ?? {})) {
20
+ if (!isRecord(instance) || !isRecord(instance.xopcConnector)) continue;
21
+ if (instance.xopcConnector.managed === true && instance.xopcConnector.enabled !== false && typeof instance.xopcConnector.connectorId === "string") ids.add(instance.xopcConnector.connectorId);
22
+ }
23
+ return ids;
24
+ }
25
+ function scanRoot(params) {
26
+ if (!existsSync(params.root)) return;
27
+ for (const entry of readdirSync(params.root, { withFileTypes: true })) {
28
+ if (!entry.isDirectory() || params.seenExtensions.has(entry.name) || !isExtensionEnabled(entry.name, params.cfg)) continue;
29
+ const manifestPath = join(params.root, entry.name, "xopc.extension.json");
30
+ if (!existsSync(manifestPath)) continue;
31
+ params.seenExtensions.add(entry.name);
32
+ let manifest;
33
+ try {
34
+ manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
35
+ } catch {
36
+ continue;
37
+ }
38
+ if (!isRecord(manifest) || !Array.isArray(manifest.connectorDependencies)) continue;
39
+ const dependencies = [...new Set(manifest.connectorDependencies.filter((value) => typeof value === "string").map((value) => value.trim()).filter(Boolean))];
40
+ for (const connectorId of dependencies) {
41
+ if (params.installed.has(connectorId)) continue;
42
+ params.diagnostics.push({
43
+ extensionId: entry.name,
44
+ connectorId,
45
+ message: `Extension "${entry.name}" requires enabled Connector "${connectorId}". Install and connect it from the Connector Store.`
46
+ });
47
+ }
48
+ }
49
+ }
50
+ function inspectExtensionConnectorDependencies(params) {
51
+ const diagnostics = [];
52
+ const installed = enabledConnectorIds(params.cfg);
53
+ const seenExtensions = /* @__PURE__ */ new Set();
54
+ const roots = params.roots ?? [resolveExtensionsDir(), resolveBundledExtensionsDir()].filter((root) => Boolean(root));
55
+ for (const root of roots) scanRoot({
56
+ root,
57
+ cfg: params.cfg,
58
+ installed,
59
+ seenExtensions,
60
+ diagnostics
61
+ });
62
+ return diagnostics;
63
+ }
64
+ //#endregion
65
+ export { inspectExtensionConnectorDependencies };
@@ -172,6 +172,24 @@ function isSafeZipPath(name) {
172
172
  for (const p of normalized.split("/")) if (p === "..") return false;
173
173
  return true;
174
174
  }
175
+ function findEmbeddedMcpConfig(root) {
176
+ for (const entry of readdirSync(root, { withFileTypes: true })) {
177
+ if (entry.isSymbolicLink()) continue;
178
+ const path = join(root, entry.name);
179
+ if (entry.isFile() && entry.name.toLowerCase() === ".mcp.json") return path;
180
+ if (entry.isDirectory()) {
181
+ const nested = findEmbeddedMcpConfig(path);
182
+ if (nested) return nested;
183
+ }
184
+ }
185
+ }
186
+ function validateConnectorDependencies(value) {
187
+ if (value === void 0) return void 0;
188
+ if (!Array.isArray(value) || value.some((item) => typeof item !== "string")) return "Extension connectorDependencies must be an array of unique Connector ids";
189
+ const dependencies = value;
190
+ const validId = /^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$/;
191
+ if (dependencies.some((id) => !validId.test(id)) || new Set(dependencies).size !== dependencies.length) return "Extension connectorDependencies must be an array of unique Connector ids";
192
+ }
175
193
  function isIgnorableZipEntry(name) {
176
194
  const n = name.replace(/\\/g, "/");
177
195
  if (n.startsWith("__MACOSX/")) return true;
@@ -448,6 +466,15 @@ async function installFromDirectory(sourceDir, extensionsDir) {
448
466
  ok: false,
449
467
  error: "Extension must include xopc.extension.json"
450
468
  };
469
+ if (findEmbeddedMcpConfig(sourceDir)) return {
470
+ ok: false,
471
+ error: "Extensions must declare connectorDependencies instead of embedding .mcp.json"
472
+ };
473
+ const connectorDependencyError = validateConnectorDependencies(manifest.connectorDependencies);
474
+ if (connectorDependencyError) return {
475
+ ok: false,
476
+ error: connectorDependencyError
477
+ };
451
478
  if (!manifest.engines?.xopc) return {
452
479
  ok: false,
453
480
  error: "Extension manifest must declare engines.xopc"
@@ -130,6 +130,7 @@ function normalizeExtensionManifest(raw) {
130
130
  main: typeof raw.main === "string" ? raw.main : void 0,
131
131
  configSchema: isRecord(raw.configSchema) ? raw.configSchema : void 0,
132
132
  dependencies: isRecord(raw.dependencies) ? raw.dependencies : void 0,
133
+ connectorDependencies: Array.isArray(raw.connectorDependencies) ? [...new Set(raw.connectorDependencies.filter((value) => typeof value === "string").map((value) => value.trim()).filter(Boolean))] : void 0,
133
134
  enabledByDefault: typeof raw.enabledByDefault === "boolean" ? raw.enabledByDefault : void 0,
134
135
  providers: Array.isArray(raw.providers) ? raw.providers.filter((x) => typeof x === "string") : void 0,
135
136
  speechProviders: Array.isArray(raw.speechProviders) ? raw.speechProviders.filter((x) => typeof x === "string") : void 0,
@@ -20,6 +20,8 @@ export interface ExtensionManifest {
20
20
  main?: string;
21
21
  configSchema?: Record<string, unknown>;
22
22
  dependencies?: Record<string, string>;
23
+ /** Connector ids that must already be installed and enabled. Extensions never embed MCP server configuration. */
24
+ connectorDependencies?: string[];
23
25
  enabledByDefault?: boolean;
24
26
  providers?: string[];
25
27
  /** Speech/TTS provider ids implemented by this extension. */
@@ -1,9 +1,9 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
3
  import { shouldSilence, stripHeartbeatToken } from "../../heartbeat/tokens.js";
4
+ import { appendCronEventLines } from "../../heartbeat/event-prompt.js";
4
5
  import { isWithinActiveHours } from "../../heartbeat/active-hours.js";
5
6
  import { isHeartbeatContentEmpty } from "../../heartbeat/content-check.js";
6
- import { appendCronEventLines } from "../../heartbeat/event-prompt.js";
7
7
  import { createHeartbeatWake } from "../../heartbeat/wake.js";
8
8
  import { resolveHeartbeatMdPath } from "../workspace-heartbeat-path.js";
9
9
  import { readFile } from "fs/promises";
@@ -1,4 +1,5 @@
1
1
  import { getStoreConnectorInstallPlan, installStoreConnector, listStoreConnectors } from "../../../capabilities/store-connector.js";
2
+ import { ConfigPersistenceError, persistConfigMutation } from "../../../config/config-mutation.js";
2
3
  //#region src/gateway/hono/routes/capabilities.ts
3
4
  function errorMessage(error) {
4
5
  return error instanceof Error ? error.message : String(error);
@@ -50,14 +51,13 @@ function registerCapabilityRoutes(authenticated, deps) {
50
51
  authenticated.post("/api/capabilities/connectors/:name/install", strictRateLimitMiddleware, async (c) => {
51
52
  const body = await c.req.json().catch(() => ({}));
52
53
  const input = body && typeof body === "object" && !Array.isArray(body) ? body : {};
54
+ const config = service.currentConfig;
53
55
  try {
54
- const config = service.currentConfig;
55
- const { instance, plan } = await installStoreConnector(config, c.req.param("name"), input, optionalVersion(body));
56
- const saved = await service.saveConfig(config);
57
- if (!saved.saved) return c.json({
58
- ok: false,
59
- error: saved.error ?? "Failed to save connector configuration."
60
- }, 500);
56
+ const { instance, plan } = await persistConfigMutation({
57
+ config,
58
+ mutate: () => installStoreConnector(config, c.req.param("name"), input, optionalVersion(body)),
59
+ save: () => service.saveConfig(config)
60
+ });
61
61
  return c.json({
62
62
  ok: true,
63
63
  payload: {
@@ -69,7 +69,7 @@ function registerCapabilityRoutes(authenticated, deps) {
69
69
  return c.json({
70
70
  ok: false,
71
71
  error: errorMessage(error)
72
- }, 400);
72
+ }, error instanceof ConfigPersistenceError ? 500 : 400);
73
73
  }
74
74
  });
75
75
  }