@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
|
@@ -13,8 +13,9 @@ import { listConnectorProviders } from "../../../connectors/providers.js";
|
|
|
13
13
|
import { getConnectorDefinition, listConnectorCatalog } from "../../../connectors/catalog.js";
|
|
14
14
|
import { listUnderstandingSourceGrants, revokeUnderstandingSourceGrant } from "../../../user-context/sources/repository.js";
|
|
15
15
|
import { recordConnectorHealthUsage } from "../../../connectors/usage.js";
|
|
16
|
-
import { getConnectorInstance, listConnectorInstances } from "../../../connectors/instances.js";
|
|
16
|
+
import { getConnectorInstance, getInstalledConnectorDefinition, listConnectorInstances } from "../../../connectors/instances.js";
|
|
17
17
|
import { installConnector, installConnectorDefinition, uninstallConnector, updateConnectorConfig } from "../../../connectors/install.js";
|
|
18
|
+
import { getMcpOAuthManager } from "../../../agent/mcp/oauth/mcp-oauth-manager.js";
|
|
18
19
|
import { startConnectorAuthorization } from "../../../connectors/auth-provider-registry.js";
|
|
19
20
|
import { composioLogoResponse } from "../../../connectors/composio-logo.js";
|
|
20
21
|
import { inspectManagedComposioStatus } from "../../../connectors/composio-managed-client.js";
|
|
@@ -25,6 +26,7 @@ import { ingestLocalFolderSource } from "../../../connectors/connected-source-in
|
|
|
25
26
|
import { previewConnectorDefinition, testConnectorInstance } from "../../../connectors/health.js";
|
|
26
27
|
import { setConnectorEnabled } from "../../../connectors/lifecycle.js";
|
|
27
28
|
import { projectComposioConnectionStatus } from "../../../connectors/runtime-status.js";
|
|
29
|
+
import { ConfigPersistenceError, persistConfigMutation } from "../../../config/config-mutation.js";
|
|
28
30
|
//#region src/gateway/hono/routes/connectors.ts
|
|
29
31
|
init_agent_scope();
|
|
30
32
|
function errorMessage(error) {
|
|
@@ -48,9 +50,39 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
48
50
|
}
|
|
49
51
|
});
|
|
50
52
|
});
|
|
51
|
-
authenticated.get("/api/connectors/installed", (c) => {
|
|
53
|
+
authenticated.get("/api/connectors/installed", async (c) => {
|
|
52
54
|
const config = service.currentConfig;
|
|
53
|
-
const instances = listConnectorInstances(config)
|
|
55
|
+
const instances = await Promise.all(listConnectorInstances(config).map(async (instance) => {
|
|
56
|
+
if (!instance.enabled || instance.materialized.type !== "mcp") return instance;
|
|
57
|
+
const server = config.mcp?.servers?.[instance.materialized.serverId];
|
|
58
|
+
if (!server) return instance;
|
|
59
|
+
const oauth = await getMcpOAuthManager().status(instance.materialized.serverId, server);
|
|
60
|
+
if (!oauth.configured) return instance;
|
|
61
|
+
if (oauth.status === "connected") return {
|
|
62
|
+
...instance,
|
|
63
|
+
authStatus: "connected",
|
|
64
|
+
connectionStatus: "connected"
|
|
65
|
+
};
|
|
66
|
+
if (oauth.status === "authorizing") return {
|
|
67
|
+
...instance,
|
|
68
|
+
status: "connecting",
|
|
69
|
+
authStatus: "unknown",
|
|
70
|
+
connectionStatus: "connecting"
|
|
71
|
+
};
|
|
72
|
+
if (oauth.status === "error") return {
|
|
73
|
+
...instance,
|
|
74
|
+
status: "failed",
|
|
75
|
+
authStatus: "unauthorized",
|
|
76
|
+
connectionStatus: "error",
|
|
77
|
+
lastError: oauth.session?.error ?? instance.lastError
|
|
78
|
+
};
|
|
79
|
+
return {
|
|
80
|
+
...instance,
|
|
81
|
+
status: "unauthorized",
|
|
82
|
+
authStatus: "missing",
|
|
83
|
+
connectionStatus: "disconnected"
|
|
84
|
+
};
|
|
85
|
+
}));
|
|
54
86
|
const connections = listConnectorConnections({ principalId: "local-owner" });
|
|
55
87
|
return c.json({
|
|
56
88
|
ok: true,
|
|
@@ -348,12 +380,11 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
348
380
|
}, 400);
|
|
349
381
|
const config = service.currentConfig;
|
|
350
382
|
try {
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
}, 500);
|
|
383
|
+
await persistConfigMutation({
|
|
384
|
+
config,
|
|
385
|
+
mutate: () => setComposioToolkitScope(config, toolkit, scope),
|
|
386
|
+
save: () => service.saveConfig(config)
|
|
387
|
+
});
|
|
357
388
|
return c.json({
|
|
358
389
|
ok: true,
|
|
359
390
|
payload: {
|
|
@@ -365,7 +396,7 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
365
396
|
return c.json({
|
|
366
397
|
ok: false,
|
|
367
398
|
error: errorMessage(error)
|
|
368
|
-
}, 400);
|
|
399
|
+
}, error instanceof ConfigPersistenceError ? 500 : 400);
|
|
369
400
|
}
|
|
370
401
|
});
|
|
371
402
|
authenticated.post("/api/connectors/composio/tools/:slug/execute", strictRateLimitMiddleware, async (c) => {
|
|
@@ -573,14 +604,16 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
573
604
|
});
|
|
574
605
|
});
|
|
575
606
|
authenticated.post("/api/connectors/:id/auth/start", strictRateLimitMiddleware, async (c) => {
|
|
576
|
-
const
|
|
577
|
-
const
|
|
607
|
+
const connectorOrInstanceId = c.req.param("id");
|
|
608
|
+
const config = service.currentConfig;
|
|
609
|
+
const instance = getConnectorInstance(config, connectorOrInstanceId);
|
|
610
|
+
const connector = instance ? getInstalledConnectorDefinition(config, instance.instanceId) : getConnectorDefinition(connectorOrInstanceId);
|
|
578
611
|
if (!connector) return c.json({
|
|
579
612
|
ok: false,
|
|
580
|
-
error: `Unknown connector: ${
|
|
613
|
+
error: `Unknown connector: ${connectorOrInstanceId}`
|
|
581
614
|
}, 404);
|
|
582
615
|
try {
|
|
583
|
-
const authorization = await startConnectorAuthorization(connector,
|
|
616
|
+
const authorization = await startConnectorAuthorization(connector, config, instance?.instanceId);
|
|
584
617
|
return c.json({
|
|
585
618
|
ok: true,
|
|
586
619
|
payload: { authorization }
|
|
@@ -628,12 +661,11 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
628
661
|
const registryDefinition = body && typeof body === "object" && !Array.isArray(body) && body.definition && typeof body.definition === "object" && !Array.isArray(body.definition) ? body.definition : void 0;
|
|
629
662
|
const config = service.currentConfig;
|
|
630
663
|
try {
|
|
631
|
-
const instance =
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
}, 500);
|
|
664
|
+
const instance = await persistConfigMutation({
|
|
665
|
+
config,
|
|
666
|
+
mutate: () => registryDefinition?.id === connectorId ? installConnectorDefinition(config, registryDefinition, input) : installConnector(config, connectorId, input),
|
|
667
|
+
save: () => service.saveConfig(config)
|
|
668
|
+
});
|
|
637
669
|
return c.json({
|
|
638
670
|
ok: true,
|
|
639
671
|
payload: { instance }
|
|
@@ -642,7 +674,7 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
642
674
|
return c.json({
|
|
643
675
|
ok: false,
|
|
644
676
|
error: errorMessage(error)
|
|
645
|
-
}, 400);
|
|
677
|
+
}, error instanceof ConfigPersistenceError ? 500 : 400);
|
|
646
678
|
}
|
|
647
679
|
});
|
|
648
680
|
authenticated.post("/api/connectors/:id/test", async (c) => {
|
|
@@ -659,12 +691,11 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
659
691
|
}, 400);
|
|
660
692
|
try {
|
|
661
693
|
const result = await testConnectorInstance(config, instance.materialized.serverId);
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
}, 500);
|
|
694
|
+
await persistConfigMutation({
|
|
695
|
+
config,
|
|
696
|
+
mutate: () => recordConnectorHealthUsage(config, instance.instanceId, result),
|
|
697
|
+
save: () => service.saveConfig(config)
|
|
698
|
+
});
|
|
668
699
|
return c.json({
|
|
669
700
|
ok: true,
|
|
670
701
|
payload: result
|
|
@@ -701,12 +732,11 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
701
732
|
const input = body && typeof body === "object" && !Array.isArray(body) ? body : {};
|
|
702
733
|
const config = service.currentConfig;
|
|
703
734
|
try {
|
|
704
|
-
const instance =
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
}, 500);
|
|
735
|
+
const instance = await persistConfigMutation({
|
|
736
|
+
config,
|
|
737
|
+
mutate: () => updateConnectorConfig(config, instanceId, input),
|
|
738
|
+
save: () => service.saveConfig(config)
|
|
739
|
+
});
|
|
710
740
|
return c.json({
|
|
711
741
|
ok: true,
|
|
712
742
|
payload: { instance }
|
|
@@ -715,19 +745,18 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
715
745
|
return c.json({
|
|
716
746
|
ok: false,
|
|
717
747
|
error: errorMessage(error)
|
|
718
|
-
}, 400);
|
|
748
|
+
}, error instanceof ConfigPersistenceError ? 500 : 400);
|
|
719
749
|
}
|
|
720
750
|
});
|
|
721
751
|
authenticated.post("/api/connectors/:id/enable", strictRateLimitMiddleware, async (c) => {
|
|
722
752
|
const instanceId = c.req.param("id");
|
|
723
753
|
const config = service.currentConfig;
|
|
724
754
|
try {
|
|
725
|
-
const instance =
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
}, 500);
|
|
755
|
+
const instance = await persistConfigMutation({
|
|
756
|
+
config,
|
|
757
|
+
mutate: () => setConnectorEnabled(config, instanceId, true),
|
|
758
|
+
save: () => service.saveConfig(config)
|
|
759
|
+
});
|
|
731
760
|
return c.json({
|
|
732
761
|
ok: true,
|
|
733
762
|
payload: { instance }
|
|
@@ -736,19 +765,18 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
736
765
|
return c.json({
|
|
737
766
|
ok: false,
|
|
738
767
|
error: errorMessage(error)
|
|
739
|
-
}, 400);
|
|
768
|
+
}, error instanceof ConfigPersistenceError ? 500 : 400);
|
|
740
769
|
}
|
|
741
770
|
});
|
|
742
771
|
authenticated.post("/api/connectors/:id/disable", strictRateLimitMiddleware, async (c) => {
|
|
743
772
|
const instanceId = c.req.param("id");
|
|
744
773
|
const config = service.currentConfig;
|
|
745
774
|
try {
|
|
746
|
-
const instance =
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
}, 500);
|
|
775
|
+
const instance = await persistConfigMutation({
|
|
776
|
+
config,
|
|
777
|
+
mutate: () => setConnectorEnabled(config, instanceId, false),
|
|
778
|
+
save: () => service.saveConfig(config)
|
|
779
|
+
});
|
|
752
780
|
return c.json({
|
|
753
781
|
ok: true,
|
|
754
782
|
payload: { instance }
|
|
@@ -757,19 +785,23 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
757
785
|
return c.json({
|
|
758
786
|
ok: false,
|
|
759
787
|
error: errorMessage(error)
|
|
760
|
-
}, 400);
|
|
788
|
+
}, error instanceof ConfigPersistenceError ? 500 : 400);
|
|
761
789
|
}
|
|
762
790
|
});
|
|
763
791
|
authenticated.delete("/api/connectors/:id", strictRateLimitMiddleware, async (c) => {
|
|
764
792
|
const instanceId = c.req.param("id");
|
|
765
793
|
const config = service.currentConfig;
|
|
766
794
|
try {
|
|
767
|
-
const
|
|
768
|
-
const
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
795
|
+
const definition = getInstalledConnectorDefinition(config, instanceId);
|
|
796
|
+
const installed = getConnectorInstance(config, instanceId);
|
|
797
|
+
const serverId = installed?.materialized.type === "mcp" ? installed.materialized.serverId : void 0;
|
|
798
|
+
const rawServer = serverId ? config.mcp?.servers?.[serverId] : void 0;
|
|
799
|
+
if (definition?.auth.mode === "oauth" && definition.runtime.type === "mcp" && rawServer) await getMcpOAuthManager().disconnect(serverId, rawServer);
|
|
800
|
+
const instance = await persistConfigMutation({
|
|
801
|
+
config,
|
|
802
|
+
mutate: () => uninstallConnector(config, instanceId),
|
|
803
|
+
save: () => service.saveConfig(config)
|
|
804
|
+
});
|
|
773
805
|
return c.json({
|
|
774
806
|
ok: true,
|
|
775
807
|
payload: { instance }
|
|
@@ -778,7 +810,7 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
778
810
|
return c.json({
|
|
779
811
|
ok: false,
|
|
780
812
|
error: errorMessage(error)
|
|
781
|
-
}, 400);
|
|
813
|
+
}, error instanceof ConfigPersistenceError ? 500 : 400);
|
|
782
814
|
}
|
|
783
815
|
});
|
|
784
816
|
}
|
|
@@ -2,21 +2,31 @@ import { canonicalizeConfiguredMcpServer, normalizeConfiguredMcpServers } from "
|
|
|
2
2
|
import { loadMergedBundleMcpConfig } from "../../../agent/mcp/bundle-mcp-config.js";
|
|
3
3
|
import { isManagedConnectorServer } from "../../../connectors/materialize.js";
|
|
4
4
|
import { getWorkspacePath } from "../../../config/workspace-path-helpers.js";
|
|
5
|
+
import { getMcpOAuthManager } from "../../../agent/mcp/oauth/mcp-oauth-manager.js";
|
|
5
6
|
import { listBundleMcpServerCapabilitiesForGateway, listBundleMcpServerToolsForGateway } from "../../../agent/mcp/bundle-mcp-gateway.js";
|
|
6
7
|
//#region src/gateway/hono/routes/mcp.ts
|
|
7
8
|
function registerMcpRoutes(authenticated, deps) {
|
|
8
|
-
|
|
9
|
+
const resolveServer = (id) => {
|
|
10
|
+
const cfg = deps.service.currentConfig;
|
|
11
|
+
return loadMergedBundleMcpConfig({
|
|
12
|
+
workspaceDir: getWorkspacePath(cfg) || "./workspace",
|
|
13
|
+
cfg
|
|
14
|
+
}).config.mcpServers[id];
|
|
15
|
+
};
|
|
16
|
+
authenticated.get("/api/mcp/servers", async (c) => {
|
|
9
17
|
const cfg = deps.service.currentConfig;
|
|
10
18
|
const merged = loadMergedBundleMcpConfig({
|
|
11
19
|
workspaceDir: getWorkspacePath(cfg) || "./workspace",
|
|
12
20
|
cfg
|
|
13
21
|
});
|
|
14
22
|
const configured = normalizeConfiguredMcpServers(cfg.mcp?.servers);
|
|
15
|
-
const
|
|
23
|
+
const oauthManager = getMcpOAuthManager();
|
|
24
|
+
const servers = await Promise.all(Object.entries(configured).map(async ([id, server]) => ({
|
|
16
25
|
id,
|
|
17
26
|
managed: isManagedConnectorServer(server),
|
|
18
|
-
connectorId: isManagedConnectorServer(server) ? server.xopcConnector.connectorId : void 0
|
|
19
|
-
|
|
27
|
+
connectorId: isManagedConnectorServer(server) ? server.xopcConnector.connectorId : void 0,
|
|
28
|
+
oauth: await oauthManager.status(id, server)
|
|
29
|
+
})));
|
|
20
30
|
return c.json({
|
|
21
31
|
ok: true,
|
|
22
32
|
payload: {
|
|
@@ -26,6 +36,62 @@ function registerMcpRoutes(authenticated, deps) {
|
|
|
26
36
|
}
|
|
27
37
|
});
|
|
28
38
|
});
|
|
39
|
+
authenticated.get("/api/mcp/servers/:id/oauth", async (c) => {
|
|
40
|
+
const id = c.req.param("id");
|
|
41
|
+
const server = resolveServer(id);
|
|
42
|
+
if (!server) return c.json({
|
|
43
|
+
ok: false,
|
|
44
|
+
error: `Unknown MCP server: ${id}`
|
|
45
|
+
}, 404);
|
|
46
|
+
return c.json({
|
|
47
|
+
ok: true,
|
|
48
|
+
payload: await getMcpOAuthManager().status(id, server)
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
authenticated.post("/api/mcp/servers/:id/oauth/start", deps.strictRateLimitMiddleware, async (c) => {
|
|
52
|
+
const id = c.req.param("id");
|
|
53
|
+
const server = resolveServer(id);
|
|
54
|
+
if (!server) return c.json({
|
|
55
|
+
ok: false,
|
|
56
|
+
error: `Unknown MCP server: ${id}`
|
|
57
|
+
}, 404);
|
|
58
|
+
try {
|
|
59
|
+
const payload = await getMcpOAuthManager().start({
|
|
60
|
+
serverId: id,
|
|
61
|
+
rawServer: server,
|
|
62
|
+
cfg: deps.service.currentConfig
|
|
63
|
+
});
|
|
64
|
+
return c.json({
|
|
65
|
+
ok: true,
|
|
66
|
+
payload
|
|
67
|
+
});
|
|
68
|
+
} catch (err) {
|
|
69
|
+
return c.json({
|
|
70
|
+
ok: false,
|
|
71
|
+
error: err instanceof Error ? err.message : String(err)
|
|
72
|
+
}, 400);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
authenticated.delete("/api/mcp/servers/:id/oauth", deps.strictRateLimitMiddleware, async (c) => {
|
|
76
|
+
const id = c.req.param("id");
|
|
77
|
+
const server = resolveServer(id);
|
|
78
|
+
if (!server) return c.json({
|
|
79
|
+
ok: false,
|
|
80
|
+
error: `Unknown MCP server: ${id}`
|
|
81
|
+
}, 404);
|
|
82
|
+
try {
|
|
83
|
+
const payload = await getMcpOAuthManager().disconnect(id, server);
|
|
84
|
+
return c.json({
|
|
85
|
+
ok: true,
|
|
86
|
+
payload
|
|
87
|
+
});
|
|
88
|
+
} catch (err) {
|
|
89
|
+
return c.json({
|
|
90
|
+
ok: false,
|
|
91
|
+
error: err instanceof Error ? err.message : String(err)
|
|
92
|
+
}, 400);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
29
95
|
authenticated.get("/api/mcp/servers/:id/tools", async (c) => {
|
|
30
96
|
const id = c.req.param("id");
|
|
31
97
|
const cfg = deps.service.currentConfig;
|
|
@@ -79,11 +145,17 @@ function registerMcpRoutes(authenticated, deps) {
|
|
|
79
145
|
workspaceDir,
|
|
80
146
|
cfg
|
|
81
147
|
}).config.mcpServers;
|
|
82
|
-
|
|
148
|
+
const knownServer = inlineServer ?? servers[id] ?? mergedServers[id];
|
|
149
|
+
if (!knownServer) return c.json({
|
|
83
150
|
ok: false,
|
|
84
151
|
error: `Unknown MCP server: ${id}`
|
|
85
152
|
}, 404);
|
|
86
153
|
try {
|
|
154
|
+
const oauth = await getMcpOAuthManager().status(id, knownServer);
|
|
155
|
+
if (oauth.configured && oauth.status !== "connected") return c.json({
|
|
156
|
+
ok: false,
|
|
157
|
+
error: oauth.session?.error ?? "MCP server authorization is required"
|
|
158
|
+
}, 409);
|
|
87
159
|
const capabilities = await listBundleMcpServerCapabilitiesForGateway({
|
|
88
160
|
workspaceDir,
|
|
89
161
|
cfg: inlineServer ? {
|
|
@@ -14,8 +14,8 @@ import "../../../voice/stt/index.js";
|
|
|
14
14
|
import { listSttProvidersForApi } from "../../../voice/stt/list-providers.js";
|
|
15
15
|
import "../../../voice/tts/index.js";
|
|
16
16
|
import { createGatewayRouteLogger } from "../lib/route-logger.js";
|
|
17
|
-
import { listLocalVoiceModelStatuses, removeLocalVoiceModel, startLocalVoiceModelInstall } from "../../../voice/local/model-manager.js";
|
|
18
17
|
import { listTtsProvidersForApi } from "../../../voice/tts/list-providers.js";
|
|
18
|
+
import { listLocalVoiceModelStatuses, removeLocalVoiceModel, startLocalVoiceModelInstall } from "../../../voice/local/model-manager.js";
|
|
19
19
|
//#region src/gateway/hono/routes/voice.ts
|
|
20
20
|
init_providers();
|
|
21
21
|
const log = createGatewayRouteLogger("Voice");
|
|
@@ -67,6 +67,9 @@ async function runGatewayLoop(opts) {
|
|
|
67
67
|
forceCloseRequested = true;
|
|
68
68
|
console.warn(`[GatewayRunLoop] Received ${signal} again; force closing connections`);
|
|
69
69
|
server?.forceCloseConnections();
|
|
70
|
+
} else if (signal === "SIGINT" || signal === "SIGTERM") {
|
|
71
|
+
console.warn(`[GatewayRunLoop] Received ${signal} again; force exiting`);
|
|
72
|
+
exitProcess(0);
|
|
70
73
|
}
|
|
71
74
|
return;
|
|
72
75
|
}
|
|
@@ -14,6 +14,8 @@ export interface GatewayServerConfig {
|
|
|
14
14
|
export declare class GatewayServer {
|
|
15
15
|
private server?;
|
|
16
16
|
private extraServers;
|
|
17
|
+
private readonly serverSockets;
|
|
18
|
+
private stopPromise;
|
|
17
19
|
private config;
|
|
18
20
|
private service;
|
|
19
21
|
constructor(config: GatewayServerConfig);
|
|
@@ -23,6 +25,7 @@ export declare class GatewayServer {
|
|
|
23
25
|
restartExpectedMs?: number | null;
|
|
24
26
|
}): Promise<void>;
|
|
25
27
|
stop(): Promise<void>;
|
|
28
|
+
private stopInternal;
|
|
26
29
|
forceCloseConnections(): void;
|
|
27
30
|
get isRunning(): boolean;
|
|
28
31
|
get serviceInstance(): GatewayService;
|
|
@@ -10,6 +10,8 @@ ensureXopcCliOnPath();
|
|
|
10
10
|
var GatewayServer = class {
|
|
11
11
|
server;
|
|
12
12
|
extraServers = [];
|
|
13
|
+
serverSockets = /* @__PURE__ */ new Map();
|
|
14
|
+
stopPromise = null;
|
|
13
15
|
config;
|
|
14
16
|
service;
|
|
15
17
|
constructor(config) {
|
|
@@ -57,7 +59,14 @@ var GatewayServer = class {
|
|
|
57
59
|
});
|
|
58
60
|
const primaryHost = listenHosts[0] ?? bindHost;
|
|
59
61
|
const attachUpgrade = (server) => {
|
|
60
|
-
|
|
62
|
+
const inner = server;
|
|
63
|
+
const sockets = /* @__PURE__ */ new Set();
|
|
64
|
+
this.serverSockets.set(server, sockets);
|
|
65
|
+
inner.on("connection", (socket) => {
|
|
66
|
+
sockets.add(socket);
|
|
67
|
+
socket.once("close", () => sockets.delete(socket));
|
|
68
|
+
});
|
|
69
|
+
inner.on("upgrade", (req, socket, head) => {
|
|
61
70
|
try {
|
|
62
71
|
if (this.service.realtime.handleUpgrade(req, socket, head)) return;
|
|
63
72
|
if (handleSiteShareUpgrade(this.service, req, socket, head)) return;
|
|
@@ -98,11 +107,20 @@ var GatewayServer = class {
|
|
|
98
107
|
await this.stop();
|
|
99
108
|
}
|
|
100
109
|
async stop() {
|
|
110
|
+
if (this.stopPromise) return this.stopPromise;
|
|
111
|
+
this.stopPromise = this.stopInternal();
|
|
112
|
+
return this.stopPromise;
|
|
113
|
+
}
|
|
114
|
+
async stopInternal() {
|
|
101
115
|
console.log("[GatewayServer] Stopping gateway server...");
|
|
116
|
+
const forceCloseServer = (server) => {
|
|
117
|
+
server.closeAllConnections?.();
|
|
118
|
+
for (const socket of this.serverSockets.get(server) ?? []) socket.destroy();
|
|
119
|
+
};
|
|
102
120
|
const closeServer = async (server) => {
|
|
103
121
|
if (!server) return;
|
|
104
122
|
const forceClose = setTimeout(() => {
|
|
105
|
-
server
|
|
123
|
+
forceCloseServer(server);
|
|
106
124
|
}, 2e3);
|
|
107
125
|
await new Promise((resolve) => {
|
|
108
126
|
server.close(() => {
|
|
@@ -111,16 +129,23 @@ var GatewayServer = class {
|
|
|
111
129
|
});
|
|
112
130
|
});
|
|
113
131
|
};
|
|
114
|
-
|
|
132
|
+
const primaryServer = this.server;
|
|
133
|
+
const extraServers = this.extraServers;
|
|
134
|
+
const closePromises = [closeServer(primaryServer), ...extraServers.map(closeServer)];
|
|
135
|
+
const activeServers = [primaryServer, ...extraServers].filter((server) => server !== void 0);
|
|
136
|
+
await this.service.stop();
|
|
137
|
+
for (const server of activeServers) forceCloseServer(server);
|
|
138
|
+
await Promise.all(closePromises);
|
|
139
|
+
for (const server of activeServers) this.serverSockets.delete(server);
|
|
115
140
|
this.server = void 0;
|
|
116
|
-
for (const extra of this.extraServers) await closeServer(extra);
|
|
117
141
|
this.extraServers = [];
|
|
118
|
-
await this.service.stop();
|
|
119
142
|
console.log("[GatewayServer] Gateway server stopped");
|
|
120
143
|
}
|
|
121
144
|
forceCloseConnections() {
|
|
122
145
|
const close = (server) => {
|
|
146
|
+
if (!server) return;
|
|
123
147
|
server?.closeAllConnections?.();
|
|
148
|
+
for (const socket of this.serverSockets.get(server) ?? []) socket.destroy();
|
|
124
149
|
};
|
|
125
150
|
close(this.server);
|
|
126
151
|
for (const extra of this.extraServers) close(extra);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DEFAULT_ACK_MAX_CHARS, HEARTBEAT_OK, NO_REPLY, shouldSilence, stripHeartbeatToken } from "./tokens.js";
|
|
2
|
+
import { appendCronEventLines } from "./event-prompt.js";
|
|
2
3
|
import { isWithinActiveHours } from "./active-hours.js";
|
|
3
4
|
import { isHeartbeatContentEmpty } from "./content-check.js";
|
|
4
|
-
import { appendCronEventLines } from "./event-prompt.js";
|
|
5
5
|
import { createHeartbeatWake } from "./wake.js";
|
|
6
6
|
export { DEFAULT_ACK_MAX_CHARS, HEARTBEAT_OK, NO_REPLY, appendCronEventLines, createHeartbeatWake, isHeartbeatContentEmpty, isWithinActiveHours, shouldSilence, stripHeartbeatToken };
|
|
@@ -2,8 +2,8 @@ import { createLogger } from "../utils/logger/index.js";
|
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
3
|
import { init_paths, resolveConfigPath } from "../config/paths.js";
|
|
4
4
|
import { init_loader, loadConfig } from "../config/loader.js";
|
|
5
|
-
import { isRestartEnabled } from "../config/commands.flags.js";
|
|
6
5
|
import { resolveGatewayService } from "../daemon/service.js";
|
|
6
|
+
import { isRestartEnabled } from "../config/commands.flags.js";
|
|
7
7
|
import { authorizeGatewaySigusr1Restart, writeGatewayRestartIntentSync } from "./restart.js";
|
|
8
8
|
import { findVerifiedGatewayListenerPidsOnPortSync, signalVerifiedGatewayPidSync } from "./gateway-processes.js";
|
|
9
9
|
import { refreshGatewayServiceAfterUpdate } from "./update-service-refresh.js";
|
|
@@ -87,7 +87,14 @@ var ConnectedKnowledgePipeline = class {
|
|
|
87
87
|
expiresAt: existing.expiresAt,
|
|
88
88
|
canonicalKey: existing.canonicalKey,
|
|
89
89
|
supersedesRecordId: existing.supersedesRecordId,
|
|
90
|
-
conflictGroupId: existing.conflictGroupId
|
|
90
|
+
conflictGroupId: existing.conflictGroupId,
|
|
91
|
+
originClass: existing.provenance.originClass,
|
|
92
|
+
sessionKind: existing.provenance.sessionKind,
|
|
93
|
+
observedAt: existing.provenance.observedAt,
|
|
94
|
+
sourceSessionId: existing.provenance.sourceSessionId,
|
|
95
|
+
sourceTurnId: existing.provenance.sourceTurnId,
|
|
96
|
+
supersedesKey: existing.provenance.supersedesKey,
|
|
97
|
+
derivedFromRecalledContext: existing.provenance.derivedFromRecalledContext
|
|
91
98
|
});
|
|
92
99
|
completeKnowledgeSourceItemSynthesis({
|
|
93
100
|
itemId: item.id,
|
|
@@ -141,7 +148,11 @@ var ConnectedKnowledgePipeline = class {
|
|
|
141
148
|
confidence: .78,
|
|
142
149
|
observedAt: item.occurredAt ?? item.sourceUpdatedAt
|
|
143
150
|
}],
|
|
144
|
-
validFrom: item.occurredAt ?? item.sourceUpdatedAt
|
|
151
|
+
validFrom: item.occurredAt ?? item.sourceUpdatedAt,
|
|
152
|
+
originClass: "untrusted",
|
|
153
|
+
sessionKind: "background",
|
|
154
|
+
observedAt: item.occurredAt ?? item.sourceUpdatedAt ?? item.updatedAt,
|
|
155
|
+
derivedFromRecalledContext: false
|
|
145
156
|
});
|
|
146
157
|
attachMemoryEvidence({
|
|
147
158
|
recordId: record.id,
|
|
@@ -238,7 +249,14 @@ var ConnectedKnowledgePipeline = class {
|
|
|
238
249
|
validTo: (/* @__PURE__ */ new Date()).toISOString(),
|
|
239
250
|
reviewAfter: existing.reviewAfter,
|
|
240
251
|
expiresAt: existing.expiresAt,
|
|
241
|
-
canonicalKey: existing.canonicalKey
|
|
252
|
+
canonicalKey: existing.canonicalKey,
|
|
253
|
+
originClass: existing.provenance.originClass,
|
|
254
|
+
sessionKind: existing.provenance.sessionKind,
|
|
255
|
+
observedAt: existing.provenance.observedAt,
|
|
256
|
+
sourceSessionId: existing.provenance.sourceSessionId,
|
|
257
|
+
sourceTurnId: existing.provenance.sourceTurnId,
|
|
258
|
+
supersedesKey: existing.provenance.supersedesKey,
|
|
259
|
+
derivedFromRecalledContext: existing.provenance.derivedFromRecalledContext
|
|
242
260
|
});
|
|
243
261
|
return false;
|
|
244
262
|
}
|
|
@@ -282,7 +300,11 @@ var ConnectedKnowledgePipeline = class {
|
|
|
282
300
|
confidence: .72,
|
|
283
301
|
observedAt: item.occurredAt ?? item.sourceUpdatedAt
|
|
284
302
|
})),
|
|
285
|
-
validFrom: `${day}T00:00:00.000Z
|
|
303
|
+
validFrom: `${day}T00:00:00.000Z`,
|
|
304
|
+
originClass: "untrusted",
|
|
305
|
+
sessionKind: "background",
|
|
306
|
+
observedAt: items.map((item) => item.occurredAt ?? item.sourceUpdatedAt ?? item.updatedAt).sort().at(-1),
|
|
307
|
+
derivedFromRecalledContext: false
|
|
286
308
|
});
|
|
287
309
|
deleteMemoryEvidenceForRecord(summary.id, "derived_from");
|
|
288
310
|
for (const item of items) attachMemoryEvidence({
|
|
@@ -4,6 +4,7 @@ import { init_logger } from "../utils/logger.js";
|
|
|
4
4
|
import { requireXopcDatabase } from "../storage/sqlite/connection.js";
|
|
5
5
|
import { buildSessionContextForLlm, buildSessionDisplayMessages, isRuntimeOnlyTranscriptMessage, isTranscriptCompactionEntry, mergeLlmMessagesPreservingContextRows, transcriptRowsFromJsonArray } from "./session-context-for-llm.js";
|
|
6
6
|
import "./types.js";
|
|
7
|
+
import { init_agent_session_key, resolveAgentIdFromSessionKey } from "../routing/agent-session-key.js";
|
|
7
8
|
import { estimateTokensFromMessages } from "../storage/sqlite/row-mappers.js";
|
|
8
9
|
import { deleteSessionRecord, ensureSessionRecord, findSessionKeyBySessionId, getGlobalSessionStats, getSessionMetadata, listSessionMetadata, listSessionsByAgent, patchSessionMetadata, resetSessionRecord } from "../storage/sqlite/session-repository.js";
|
|
9
10
|
import { appendCompactionBoundaryIfUnchanged, appendTranscriptEntry, listCompactionBoundaries, loadCompactionSourceSnapshot, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRowsForSession, paginateTranscriptMessages, replaceTranscriptRows, restoreBeforeCompactionBoundary, searchSessionTranscript } from "../storage/sqlite/transcript-repository.js";
|
|
@@ -12,12 +13,14 @@ import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.
|
|
|
12
13
|
import { readPostCompactionContext } from "../agent/reply/post-compaction-context.js";
|
|
13
14
|
import { SessionCompactor } from "../agent/memory/compaction.js";
|
|
14
15
|
import { resolveCompactionPolicy } from "../agent/memory/compaction-policy.js";
|
|
16
|
+
import { promoteCompactionLedger } from "../agent/memory/compaction-promotion.js";
|
|
15
17
|
import { SlidingWindow } from "../agent/memory/window.js";
|
|
16
18
|
import { isAppendOnlyLlmTranscriptMessage } from "./transcript-stats.js";
|
|
17
19
|
import { transcriptRowsToClientHistory } from "./client-history.js";
|
|
18
20
|
import { computeTranscriptUserRoundDeleteRange } from "./user-round-delete.js";
|
|
19
21
|
//#region src/session/store.ts
|
|
20
22
|
init_paths_state();
|
|
23
|
+
init_agent_session_key();
|
|
21
24
|
init_logger();
|
|
22
25
|
const log = createLogger("SessionStore");
|
|
23
26
|
const INDEX_VERSION = "1.0";
|
|
@@ -455,6 +458,30 @@ var SessionStore = class {
|
|
|
455
458
|
tokensBefore: result.tokensBefore,
|
|
456
459
|
tokensAfter: result.tokensAfter
|
|
457
460
|
})) throw new Error(`Session changed while compaction was running: ${key}`);
|
|
461
|
+
try {
|
|
462
|
+
const metadata = getSessionMetadata(key);
|
|
463
|
+
const promoted = promoteCompactionLedger({
|
|
464
|
+
sessionKey: key,
|
|
465
|
+
sessionId: expectedSnapshot.sessionId,
|
|
466
|
+
sourceAgentId: resolveAgentIdFromSessionKey(key),
|
|
467
|
+
workspaceId: this.resolveWorkspaceCwd(key),
|
|
468
|
+
projectId: metadata?.projectId,
|
|
469
|
+
handover: result.handover,
|
|
470
|
+
audit: result.audit,
|
|
471
|
+
sourceEntries: expectedSnapshot.entries
|
|
472
|
+
});
|
|
473
|
+
log.info({
|
|
474
|
+
sessionKey: key,
|
|
475
|
+
episodicCount: promoted.episodicRecordIds.length,
|
|
476
|
+
durableCount: promoted.durableRecordIds.length,
|
|
477
|
+
rejectedCount: promoted.rejectedRecordIds.length
|
|
478
|
+
}, "Compaction ledger memory promotion completed");
|
|
479
|
+
} catch (err) {
|
|
480
|
+
log.warn({
|
|
481
|
+
err,
|
|
482
|
+
sessionKey: key
|
|
483
|
+
}, "Compaction ledger memory promotion failed");
|
|
484
|
+
}
|
|
458
485
|
log.info({
|
|
459
486
|
key,
|
|
460
487
|
tokensBefore: result.tokensBefore,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { MemoryDisclosurePolicy, MemoryDurability, MemoryExplicitness, MemoryKind, MemoryRecord, MemorySensitivity, MemorySearchResult, MemorySignal, MemoryStatus } from '../../agent/memory/types.js';
|
|
1
|
+
import type { MemoryDisclosurePolicy, MemoryDurability, MemoryExplicitness, MemoryKind, MemoryOriginClass, MemoryRecord, MemorySessionKind, MemorySensitivity, MemorySearchResult, MemorySignal, MemoryStatus } from '../../agent/memory/types.js';
|
|
2
2
|
export interface UpsertMemoryRecordInput {
|
|
3
3
|
id?: string;
|
|
4
4
|
providerId: string;
|
|
@@ -26,6 +26,13 @@ export interface UpsertMemoryRecordInput {
|
|
|
26
26
|
expiresAt?: string;
|
|
27
27
|
supersedesRecordId?: string;
|
|
28
28
|
conflictGroupId?: string;
|
|
29
|
+
originClass?: MemoryOriginClass;
|
|
30
|
+
sessionKind?: MemorySessionKind;
|
|
31
|
+
observedAt?: string;
|
|
32
|
+
sourceSessionId?: string;
|
|
33
|
+
sourceTurnId?: string;
|
|
34
|
+
supersedesKey?: string;
|
|
35
|
+
derivedFromRecalledContext?: boolean;
|
|
29
36
|
nowMs?: number;
|
|
30
37
|
}
|
|
31
38
|
export interface ListMemoryRecordsOptions {
|
|
@@ -73,6 +80,7 @@ export interface SearchMemoryRecordsOptions {
|
|
|
73
80
|
statuses?: MemoryStatus[];
|
|
74
81
|
maxResults?: number;
|
|
75
82
|
minScore?: number;
|
|
83
|
+
trustedOnly?: boolean;
|
|
76
84
|
}
|
|
77
85
|
export interface AppendMemorySignalInput {
|
|
78
86
|
signal: MemorySignal;
|