@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.
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/demo-memory/src/index.js +10 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{activity-store--GBciH10.js → activity-store-CtTYnku4.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-C93T3FLD.js → agent-avatar-dicebear-dizuqu_4.js} +1 -1
- package/dist/gateway/static/root/assets/agents-DeEEFZJ4.js +68 -0
- package/dist/gateway/static/root/assets/{api-HoIz_ija.js → api-CLRMz2BT.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-Bhl8Xluk.js → app-management-settings-panel-Cnk-DtQh.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-CywEN-kG.js → appearance-settings-wP0rogVI.js} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-BZY09nuJ.js → apps-page-Db5YNHVM.js} +1 -1
- package/dist/gateway/static/root/assets/{archive-plugin-CteCVsBP.js → archive-plugin-Cpzsm-DM.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-CbNE_EPd.js → attachment-load-Bd2OOoEK.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-Bcqk6tOx.js → automations-page-DNqhguyk.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-CNT05YTb.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-M_i3WS5M.js → binary-plugins-Dcma5HdI.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-eg9LEH2o.js → block-editor-D-B8ThwK.js} +3 -3
- package/dist/gateway/static/root/assets/{browser-settings-page-kKwbvzjj.js → browser-settings-page-UbDj3LIq.js} +3 -3
- package/dist/gateway/static/root/assets/{browser-workflow-inputs-1UZ0vnIy.js → browser-workflow-inputs-BAPZIXrs.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-workflows-page-D8ATQqZ5.js → browser-workflows-page-DHtaSKEh.js} +1 -1
- package/dist/gateway/static/root/assets/capabilities-settings-panel-CiO152QS.js +7 -0
- package/dist/gateway/static/root/assets/{capability-presets-api-yNqTIuyd.js → capability-presets-api-zsZQ7im3.js} +1 -1
- package/dist/gateway/static/root/assets/{capability-presets-settings-panel-CgdRkwnk.js → capability-presets-settings-panel-Bc_hRwfL.js} +2 -2
- package/dist/gateway/static/root/assets/{channel-recipient-api-krezGsKc.js → channel-recipient-api-Cp8iaaXp.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-CFW7zBoT.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-5rNVq7iI.js +1 -0
- package/dist/gateway/static/root/assets/{chat-terminal-dock-DQ5bB4Su.js → chat-terminal-dock-Dr6Rq2ln.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-DLBr5nre.js +2 -0
- package/dist/gateway/static/root/assets/{cron-expression-CEwPkdhh.js → cron-expression-BiXrpzmo.js} +1 -1
- package/dist/gateway/static/root/assets/{date-picker-DDAxTir8.js → date-picker-BPuRtwKt.js} +1 -1
- package/dist/gateway/static/root/assets/{dependency-picker-CYVoSZwI.js → dependency-picker-BNC_W7wI.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-CrNKfW_c.js → desktop-pet-DzOpt5nI.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-C06PaB46.js → desktop-pet-settings-BW0brCvH.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field--D7laeLF.js → directory-picker-path-field-Baml0uTS.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-Dn4Px9KQ.js → extension-debug-page-CBXyKmfS.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-DzLf3fMQ.js → extension-page-BBhcr_SZ.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-DIchwtvB.js → extension-settings-page-4rwWpN9_.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-SmTGLhqK.js → gateway-config-api-Dg-BlBe4.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-yUxMMVjK.js → gateway-config-swr-Du0MvK9s.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-yCDkOYzA.js → gateway-settings-BOuYZOYe.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-9mrsL84j.js → gateway-startup-retry-JbjcHCaN.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-CquIULHX.js → heartbeat-settings-Dq4YAlSx.js} +1 -1
- package/dist/gateway/static/root/assets/home-page-BIXkO0Ck.js +1 -0
- package/dist/gateway/static/root/assets/{image-generation-api-CgFAGDi8.js → image-generation-api-G2tfPvKP.js} +1 -1
- package/dist/gateway/static/root/assets/index-Csccu8sa.js +74 -0
- package/dist/gateway/static/root/assets/index-D3_xSYKd.css +2 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-DI2To7yl.js → keyboard-shortcuts-settings-L1Vtxgp9.js} +1 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-D-eacBcO.js +2 -0
- package/dist/gateway/static/root/assets/{local-apps-page-CSEJsQ1F.js → local-apps-page--thlkBLS.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-CPylQjH9.js → locale-store-DqJz-cOR.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-BRCglHvd.js +2 -0
- package/dist/gateway/static/root/assets/{management-settings-CgyaIyuk.js → management-settings-p55fR4XO.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-split-paG9qap9.js → markdown-split-DwMcRlBR.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-view-CUsob4Pz.js → markdown-view-CTB9u15e.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-0Q-c_QIy.js → media-plugins-O6H3GZn7.js} +1 -1
- package/dist/gateway/static/root/assets/{messages-B82nsi9k.js → messages-CeydamsI.js} +3 -3
- package/dist/gateway/static/root/assets/{notes-api-CfKZYrBC.js → notes-api-CrjQbmk1.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-page-Bvb-ycX_.js → notes-page-miO9ig9C.js} +1 -1
- package/dist/gateway/static/root/assets/notes-workbench-_13lmvmF.js +4 -0
- package/dist/gateway/static/root/assets/{product-open-page-DrvBwAns.js → product-open-page-BOu07nXf.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-BStRkOQr.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-CY03RxVr.js +1 -0
- package/dist/gateway/static/root/assets/{registry-api-B_5D8epF.js → registry-api-Bf_HDLUJ.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-B19llkld.js +1 -0
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-DKjdN4Lr.js → runtime-tools-settings-panel-DthuRqUH.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-DskqaNqC.js → schema-form-8W8PhXxa.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-BDA2qbTd.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-BONIDX4v.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-CZlMvHA9.js → settings-form-section-CrsKGYiG.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-DS6lcAg9.js → settings-loading-skeleton-WJtI0AAq.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-oE5J9tsV.js → settings-page-PCjwRF47.js} +1 -1
- package/dist/gateway/static/root/assets/{setup-status-panel-C7oFCIqD.js → setup-status-panel-D65CwlNC.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-CPFAj8NE.js → share-preview-page-BGtvLLeZ.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-CdzVKrBl.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-CsRWid5h.js +1 -0
- package/dist/gateway/static/root/assets/{skills-page-Bh4gFi8e.js → skills-page-C_npyryI.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page.utils-BQaUWP9z.js → skills-page.utils-C46Sd78k.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-COAZoh_O.js → system-settings-panel-DomTLwki.js} +1 -1
- package/dist/gateway/static/root/assets/task-detail-page-B6YFX7kK.js +1 -0
- package/dist/gateway/static/root/assets/{theme-store-BN-32Fz5.js → theme-store-Ce7wq__X.js} +1 -1
- package/dist/gateway/static/root/assets/{use-autosave-BAkToU15.js → use-autosave-Do9mCRcY.js} +1 -1
- package/dist/gateway/static/root/assets/{user-context-page-Br5wgARM.js → user-context-page-CiCQA40E.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-CC4z9-ux.js → voice-api-key-field-Bc5p-0tX.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-dLVUYSSE.js → work-discovery-overlay-BieqsmT1.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-BYU5-0KF.js → workflow-run-setup-panel-DVj8iYvm.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-AG04TTuH.js +5 -0
- package/dist/gateway/static/root/index.html +11 -11
- package/dist/package.js +1 -1
- package/dist/src/agent/embedded/run-turn.js +2 -0
- package/dist/src/agent/mcp/bundle-mcp-config.d.ts +9 -1
- package/dist/src/agent/mcp/bundle-mcp-config.js +11 -15
- package/dist/src/agent/mcp/embedded-mcp.d.ts +1 -1
- package/dist/src/agent/mcp/index.d.ts +1 -0
- package/dist/src/agent/mcp/index.js +7 -1
- package/dist/src/agent/mcp/mcp-http.d.ts +4 -0
- package/dist/src/agent/mcp/mcp-http.js +25 -1
- package/dist/src/agent/mcp/mcp-transport-config.d.ts +4 -0
- package/dist/src/agent/mcp/mcp-transport-config.js +1 -0
- package/dist/src/agent/mcp/mcp-transport.d.ts +7 -1
- package/dist/src/agent/mcp/mcp-transport.js +38 -11
- package/dist/src/agent/mcp/oauth/index.d.ts +6 -0
- package/dist/src/agent/mcp/oauth/index.js +6 -0
- package/dist/src/agent/mcp/oauth/mcp-oauth-errors.d.ts +5 -0
- package/dist/src/agent/mcp/oauth/mcp-oauth-errors.js +14 -0
- package/dist/src/agent/mcp/oauth/mcp-oauth-manager.d.ts +25 -0
- package/dist/src/agent/mcp/oauth/mcp-oauth-manager.js +219 -0
- package/dist/src/agent/mcp/oauth/mcp-oauth-provider.d.ts +33 -0
- package/dist/src/agent/mcp/oauth/mcp-oauth-provider.js +103 -0
- package/dist/src/agent/mcp/oauth/mcp-oauth-session.d.ts +29 -0
- package/dist/src/agent/mcp/oauth/mcp-oauth-session.js +169 -0
- package/dist/src/agent/mcp/oauth/mcp-oauth-store.d.ts +9 -0
- package/dist/src/agent/mcp/oauth/mcp-oauth-store.js +79 -0
- package/dist/src/agent/mcp/oauth/mcp-oauth-types.d.ts +22 -0
- package/dist/src/agent/mcp/oauth/mcp-oauth-types.js +1 -0
- package/dist/src/agent/memory/builtin-provider.js +23 -4
- package/dist/src/agent/memory/compaction-promotion.d.ts +18 -0
- package/dist/src/agent/memory/compaction-promotion.js +211 -0
- package/dist/src/agent/memory/context/types.d.ts +5 -0
- package/dist/src/agent/memory/manager.d.ts +3 -0
- package/dist/src/agent/memory/manager.js +12 -2
- package/dist/src/agent/memory/trusted-recall.d.ts +7 -0
- package/dist/src/agent/memory/trusted-recall.js +53 -0
- package/dist/src/agent/memory/turn-provenance.d.ts +14 -0
- package/dist/src/agent/memory/turn-provenance.js +60 -0
- package/dist/src/agent/memory/types.d.ts +18 -3
- package/dist/src/agent/memory/user-context-coordinator.js +57 -6
- package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +2 -0
- package/dist/src/agent/tools/memory-tool.js +5 -1
- package/dist/src/capabilities/store-connector.js +99 -10
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
- package/dist/src/config/config-mutation.d.ts +14 -0
- package/dist/src/config/config-mutation.js +33 -0
- package/dist/src/config/index.js +3 -3
- package/dist/src/config/paths.d.ts +2 -0
- package/dist/src/config/paths.js +5 -1
- package/dist/src/config/schema.d.ts +17 -0
- package/dist/src/config/schema.js +26 -2
- package/dist/src/connectors/auth-provider-registry.d.ts +1 -1
- package/dist/src/connectors/auth-provider-registry.js +23 -2
- package/dist/src/connectors/install.js +3 -3
- package/dist/src/connectors/instances.d.ts +2 -1
- package/dist/src/connectors/instances.js +15 -5
- package/dist/src/connectors/materialize.d.ts +1 -0
- package/dist/src/connectors/materialize.js +9 -1
- package/dist/src/connectors/runtime-adapter-registry.js +1 -0
- package/dist/src/connectors/types.d.ts +4 -1
- package/dist/src/extensions/connector-dependencies.d.ts +10 -0
- package/dist/src/extensions/connector-dependencies.js +65 -0
- package/dist/src/extensions/install.js +27 -0
- package/dist/src/extensions/normalize-manifest.js +1 -0
- package/dist/src/extensions/types/manifest.d.ts +2 -0
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/hono/routes/capabilities.js +8 -8
- package/dist/src/gateway/hono/routes/connectors.js +87 -55
- package/dist/src/gateway/hono/routes/mcp.js +77 -5
- package/dist/src/gateway/hono/routes/voice.js +1 -1
- package/dist/src/gateway/run-loop.js +3 -0
- package/dist/src/gateway/server.d.ts +3 -0
- package/dist/src/gateway/server.js +30 -5
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/infra/update-restart.js +1 -1
- package/dist/src/knowledge/connected-knowledge-pipeline.js +26 -4
- package/dist/src/session/store.js +27 -0
- package/dist/src/storage/sqlite/memory-records-repository.d.ts +9 -1
- package/dist/src/storage/sqlite/memory-records-repository.js +40 -6
- package/dist/src/storage/sqlite/migrations/134_memory_provenance.sql +18 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/user-context/planner.js +8 -3
- package/dist/src/voice/stt/transcribe-core.js +17 -1
- package/dist/src/voice/stt/types.d.ts +1 -1
- package/package.json +3 -3
- package/dist/gateway/static/root/assets/agents-Ba4XF0Im.js +0 -68
- package/dist/gateway/static/root/assets/automations-workspace-DtI6vsMf.js +0 -6
- package/dist/gateway/static/root/assets/capabilities-settings-panel-CZRcis8B.js +0 -7
- package/dist/gateway/static/root/assets/channels-settings-DETCY0Ku.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-DMxB7slL.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-D9D92u28.js +0 -2
- package/dist/gateway/static/root/assets/home-page-COSGBh4c.js +0 -1
- package/dist/gateway/static/root/assets/index-5XkDWH_Q.css +0 -2
- package/dist/gateway/static/root/assets/index-wnDPGRTi.js +0 -74
- package/dist/gateway/static/root/assets/local-app-workbench-page-CAF5SZXv.js +0 -2
- package/dist/gateway/static/root/assets/logs-page-D1KFPHL1.js +0 -2
- package/dist/gateway/static/root/assets/notes-workbench-DelxGBof.js +0 -4
- package/dist/gateway/static/root/assets/project-detail-page-C2EnYXEQ.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-BiMPU6Oa.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CpbNivVs.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-BxKtzsKI.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-BfBKMMUx.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-B46DWZK4.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-CyKolUZ-.js +0 -1
- package/dist/gateway/static/root/assets/task-detail-page-CXkhprf-.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-CJ24a1HM.js +0 -5
- package/dist/src/extensions/bundle-mcp.d.ts +0 -18
- 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"
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
}
|