@xopcai/xopc 0.0.156 → 0.0.158
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/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/action-boundary-settings-panel-2p1f4-KA.js +1 -0
- package/dist/gateway/static/root/assets/{activity-store-Cp7IGk68.js → activity-store-C-57rvkX.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-H8Kj8Gpi.js → agent-avatar-dicebear-BIl6X2b_.js} +1 -1
- package/dist/gateway/static/root/assets/agents-bnkKH9EI.js +2 -0
- package/dist/gateway/static/root/assets/{api-DtJCVPiu.js → api-BjcBIV2O.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-DKTEVSpf.js → app-management-settings-panel-CZxw161D.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-BQjvBNo5.js → appearance-settings-CRXNlDhH.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-l4ripRNG.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-BrGMwlAE.js → archive-plugin-CpVshjXu.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-24BvpEL4.js → attachment-load-M9WqqJnQ.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-suggestion-card-CWWKtdDT.js → automation-suggestion-card-CYMsAsYf.js} +1 -1
- package/dist/gateway/static/root/assets/automations-page-Kny7tLiF.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-C1E7_cKL.js → binary-plugins-Cjn3zb4u.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-BVnHG0U5.js → block-editor-BPKdquaV.js} +31 -31
- package/dist/gateway/static/root/assets/browser-settings-page-vr1tXAab.js +8 -0
- package/dist/gateway/static/root/assets/{capability-presets-api-DyXFKny9.js → capability-presets-api-Bzkcsyzn.js} +1 -1
- package/dist/gateway/static/root/assets/{capability-presets-settings-panel-luTMJl0D.js → capability-presets-settings-panel-D4rH4Dax.js} +2 -2
- package/dist/gateway/static/root/assets/{channel-recipient-api-Bo9KEXO4.js → channel-recipient-api-CFqrSi5K.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-Tlhbi5eh.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-vooEF4lG.js +1 -0
- package/dist/gateway/static/root/assets/{connector-logo-B7ECwA6W.js → connector-logo-ljPKdYKh.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-_XfvjXoY.js +2 -0
- package/dist/gateway/static/root/assets/{desktop-pet-C4J-TrDl.js → desktop-pet-DKUlAgm7.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-CsGZynhi.js → desktop-pet-settings-aWWzjdza.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field-DDn1H6qY.js → directory-picker-path-field-Dmy1035j.js} +1 -1
- package/dist/gateway/static/root/assets/{dreaming-settings-jJjiYe0n.js → dreaming-settings-tT4WkBkd.js} +3 -3
- package/dist/gateway/static/root/assets/{extension-debug-page-CQVct2lF.js → extension-debug-page-CL79q8AH.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-sUEY0_Yl.js → extension-page-hq80wkFI.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-zpScIWDQ.js → extension-settings-page-BV-9GDfT.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-B-GwICsA.js → gateway-config-api-CFqoN2NW.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-settings-DzR-kM91.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-CJUiuchE.js → gateway-startup-retry-cxQ94qMm.js} +1 -1
- package/dist/gateway/static/root/assets/{goal-create-dialog-Cvd9nymX.js → goal-create-dialog-BLjHRtqe.js} +1 -1
- package/dist/gateway/static/root/assets/goal-detail-page-BRxeujXh.js +4 -0
- package/dist/gateway/static/root/assets/{goals-config-api-DKkSo21W.js → goals-config-api--qJ4qlRq.js} +1 -1
- package/dist/gateway/static/root/assets/goals-page-BaZ3aw4u.js +2 -0
- package/dist/gateway/static/root/assets/{goals-settings-CtRqc0fv.js → goals-settings-h7x9h5lb.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-BT-TLTst.js → heartbeat-settings-71IhhM3s.js} +1 -1
- package/dist/gateway/static/root/assets/{index-Din3Cw4v.js → index-EXa_i6BT.js} +61 -64
- package/dist/gateway/static/root/assets/index-gpwk8Nro.css +1 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-DJtVjIjb.js → keyboard-shortcuts-settings-BZGmHvLu.js} +1 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-lUpd6lSo.js +2 -0
- package/dist/gateway/static/root/assets/{local-apps-page-BgG--iAa.js → local-apps-page-CiLqrMIh.js} +1 -1
- package/dist/gateway/static/root/assets/locale-store-C_M71MK9.js +1 -0
- package/dist/gateway/static/root/assets/logs-page-FPDTmcWe.js +7 -0
- package/dist/gateway/static/root/assets/{markdown-split-CYzbIIru.js → markdown-split-r1HPWfCU.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-MIPDILS2.js → media-plugins-D74kd3hn.js} +1 -1
- package/dist/gateway/static/root/assets/{messages-DEhbxGef.js → messages-BuT0SR1R.js} +4 -4
- package/dist/gateway/static/root/assets/models-hub-panel-BXrdePhv.js +2 -0
- package/dist/gateway/static/root/assets/{notes-page-DImgR3qC.js → notes-page-Dgu02514.js} +1 -1
- package/dist/gateway/static/root/assets/notes-workbench-D-EAhXv1.js +4 -0
- package/dist/gateway/static/root/assets/{page-tabs--KgaLen_.js → page-tabs-hinRdDy3.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-C_HbjDSi.js → preview-open-alternatives-C7fw3oGy.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-BjpB1wrp.js +1 -0
- package/dist/gateway/static/root/assets/{projects-page-D9Ic-jH8.js → projects-page-BxyjqOfC.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-BFv6Upke.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-CjZo14GS.js → save-bar-controls-C3aU8-vO.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-RXap283_.js → schedule-field-DjegExFD.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-Cxma8ta1.js → schema-form-DLubnsql.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-BX4DH8J7.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-CJ9MbRP8.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-BCj-CWDz.js → settings-collapsible-section-3syQHsNR.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-BcNg8gHj.js → settings-form-section-D4DCZzKg.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-BdebKuIQ.js → settings-loading-skeleton-c5K85ylS.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-DNiDlaRq.js +1 -0
- package/dist/gateway/static/root/assets/{settings-page-layout-CunTdv0L.js → settings-page-layout-iTRY1Hy-.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-BH4xQKM9.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-mr4J9NTO.js → share-preview-page-B88Afrhe.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-B6kKkvOb.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-DtjS-nUK.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-CQEoPv0u.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-DVhTcFLH.js → system-settings-panel-DtpTq837.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-JwXJZwqx.js → theme-store-C8ohIHhw.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-DRyUSUIv.js → typed-models-lib-ndEnUP3b.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-CNubDrIo.js → use-channel-catalog-BWzou5ar.js} +1 -1
- package/dist/gateway/static/root/assets/user-context-page-Dn2T3itn.js +1 -0
- package/dist/gateway/static/root/assets/voice-api-key-field-wtWc3SfN.js +1 -0
- package/dist/gateway/static/root/assets/work-discovery-page-Ckxhj66e.js +1 -0
- package/dist/gateway/static/root/assets/work-item-detail-page-_1QgGPNw.js +1 -0
- package/dist/gateway/static/root/assets/work-page-BPdf2iuv.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-KZDzIdFk.js → workflow-run-setup-panel-ukmpkj66.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-DdKTx0Hs.js +11 -0
- package/dist/gateway/static/root/connector-icons/local-files.svg +6 -0
- package/dist/gateway/static/root/index.html +7 -7
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.js +63 -61
- package/dist/src/agent/embedded/xopc-auth-storage.js +1 -1
- package/dist/src/agent/tools/factory.js +2 -2
- package/dist/src/agent/tools/session-search-tool.d.ts +2 -2
- package/dist/src/agent/tools/session-search-tool.js +8 -19
- package/dist/src/config/config-surface.d.ts +0 -26
- package/dist/src/connectors/builtin-catalog.js +90 -248
- package/dist/src/connectors/catalog.js +2 -3
- package/dist/src/connectors/composio-catalog.d.ts +11 -1
- package/dist/src/connectors/composio-catalog.js +65 -8
- package/dist/src/connectors/composio-sessions.js +1 -1
- package/dist/src/connectors/composio.d.ts +1 -0
- package/dist/src/connectors/composio.js +10 -2
- package/dist/src/connectors/connector-memory-sync.d.ts +10 -0
- package/dist/src/connectors/connector-memory-sync.js +184 -38
- package/dist/src/connectors/integration-strategy.js +65 -8
- package/dist/src/connectors/memory-sync-coordinator.d.ts +28 -0
- package/dist/src/connectors/memory-sync-coordinator.js +162 -0
- package/dist/src/connectors/memory-sync-profile.d.ts +13 -0
- package/dist/src/connectors/memory-sync-profile.js +73 -0
- package/dist/src/connectors/runtime-adapter-registry.js +17 -4
- package/dist/src/connectors/runtime-status.d.ts +9 -0
- package/dist/src/connectors/runtime-status.js +68 -0
- package/dist/src/connectors/types.d.ts +2 -0
- package/dist/src/gateway/hono/routes/connectors.js +146 -32
- package/dist/src/gateway/hono/routes/public-gateway.js +1 -0
- package/dist/src/gateway/service.d.ts +2 -0
- package/dist/src/gateway/service.js +14 -0
- package/dist/src/knowledge/index.d.ts +2 -0
- package/dist/src/knowledge/index.js +3 -1
- package/dist/src/knowledge/ingestion-service.js +40 -3
- package/dist/src/knowledge/local-folder-adapter.d.ts +7 -0
- package/dist/src/knowledge/local-folder-adapter.js +86 -0
- package/dist/src/knowledge/people-graph.d.ts +28 -0
- package/dist/src/knowledge/people-graph.js +126 -0
- package/dist/src/knowledge/types.d.ts +2 -0
- package/dist/src/storage/sqlite/connector-repository.d.ts +1 -0
- package/dist/src/storage/sqlite/connector-repository.js +12 -1
- package/dist/src/storage/sqlite/index.d.ts +1 -1
- package/dist/src/storage/sqlite/index.js +2 -2
- package/dist/src/user-context/projection.d.ts +2 -0
- package/dist/src/user-context/projection.js +12 -2
- package/package.json +3 -3
- package/dist/gateway/static/root/assets/agents-D7b7yNXE.js +0 -2
- package/dist/gateway/static/root/assets/apps-page-DF2hU_jf.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-D48WJ6FM.js +0 -6
- package/dist/gateway/static/root/assets/browser-settings-page-4oWDtsXg.js +0 -8
- package/dist/gateway/static/root/assets/channels-settings-QSUco4Eu.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-DsSwOeqP.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-CNmHHcQy.js +0 -2
- package/dist/gateway/static/root/assets/gateway-settings-C93_Ybce.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-YH6hr32Q.js +0 -4
- package/dist/gateway/static/root/assets/goals-page-BZudny4c.js +0 -2
- package/dist/gateway/static/root/assets/index-hESUzOFP.css +0 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-BAUIuHgn.js +0 -2
- package/dist/gateway/static/root/assets/locale-store-DKx7Iqah.js +0 -1
- package/dist/gateway/static/root/assets/logs-page-DsoUv7ZF.js +0 -7
- package/dist/gateway/static/root/assets/models-hub-panel-Be8EL_eL.js +0 -2
- package/dist/gateway/static/root/assets/notes-workbench-C-7KD7v9.js +0 -4
- package/dist/gateway/static/root/assets/project-detail-page-CZKnDVLl.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-X8McfeZv.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-DS1ZDVHz.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-CcD1GwQy.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-D8exfzMK.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-XjT8cddX.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-BCMbZehJ.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-DBJyFDEb.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-DMqHx2h0.js +0 -2
- package/dist/gateway/static/root/assets/user-context-page-Dz5_Hxm8.js +0 -1
- package/dist/gateway/static/root/assets/user-profile-fields-editor-Dd9HhS4K.js +0 -1
- package/dist/gateway/static/root/assets/user-profile-settings-panel-BESvOafB.js +0 -1
- package/dist/gateway/static/root/assets/utils-BAhKxTKq.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DUGVoBoX.js +0 -1
- package/dist/gateway/static/root/assets/work-discovery-page-B3bY5klN.js +0 -1
- package/dist/gateway/static/root/assets/work-item-detail-page-zQi6iH0Q.js +0 -1
- package/dist/gateway/static/root/assets/work-page-y0B5nTmy.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-C95f1Mae.js +0 -11
- package/dist/gateway/static/root/connector-icons/brave-search.svg +0 -1
- package/dist/gateway/static/root/connector-icons/fetch.svg +0 -6
- package/dist/gateway/static/root/connector-icons/memory.svg +0 -5
- package/dist/gateway/static/root/connector-icons/playwright.svg +0 -9
- package/dist/gateway/static/root/connector-icons/sequential-thinking.svg +0 -8
- package/dist/gateway/static/root/connector-icons/time.svg +0 -6
- package/dist/src/connectors/registries/modelscope.d.ts +0 -2
- package/dist/src/connectors/registries/modelscope.js +0 -228
- package/dist/src/connectors/registries/official-mcp.d.ts +0 -2
- package/dist/src/connectors/registries/official-mcp.js +0 -140
- package/dist/src/connectors/registries/search.d.ts +0 -12
- package/dist/src/connectors/registries/search.js +0 -87
- package/dist/src/connectors/registries/smithery.d.ts +0 -2
- package/dist/src/connectors/registries/smithery.js +0 -97
- package/dist/src/connectors/registries/types.d.ts +0 -20
- package/dist/src/connectors/registries/types.js +0 -1
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ConnectorConnection, ConnectorInstance } from './types.js';
|
|
2
|
+
export type ComposioRuntimeProbe = {
|
|
3
|
+
connectorId: string;
|
|
4
|
+
checkedAt: string;
|
|
5
|
+
toolCount?: number;
|
|
6
|
+
error?: string;
|
|
7
|
+
connectionError?: boolean;
|
|
8
|
+
};
|
|
9
|
+
export declare function projectComposioRuntimeStatus(instances: ConnectorInstance[], connections: ConnectorConnection[], probes: ComposioRuntimeProbe[]): ConnectorInstance[];
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
//#region src/connectors/runtime-status.ts
|
|
2
|
+
function projectComposioRuntimeStatus(instances, connections, probes) {
|
|
3
|
+
const probeByConnectorId = new Map(probes.map((probe) => [probe.connectorId, probe]));
|
|
4
|
+
return instances.map((instance) => {
|
|
5
|
+
if (instance.materialized.type !== "composio" || instance.materialized.role !== "toolkit" || !instance.enabled) return instance;
|
|
6
|
+
const relevant = connections.filter((connection) => connection.provider === "composio" && connection.connectorId === instance.connectorId && connection.status !== "revoked");
|
|
7
|
+
const active = relevant.filter((connection) => connection.status === "active");
|
|
8
|
+
const probe = probeByConnectorId.get(instance.connectorId);
|
|
9
|
+
const lastConnectedAt = active.flatMap((connection) => connection.connectedAt ? [connection.connectedAt] : []).sort().at(-1) ?? instance.lastConnectedAt;
|
|
10
|
+
if (active.length > 0 && probe && !probe.error && (probe.toolCount ?? 0) > 0) return {
|
|
11
|
+
...instance,
|
|
12
|
+
status: "connected",
|
|
13
|
+
connectionStatus: "connected",
|
|
14
|
+
authStatus: "connected",
|
|
15
|
+
lastConnectedAt,
|
|
16
|
+
lastError: void 0,
|
|
17
|
+
usage: {
|
|
18
|
+
...instance.usage,
|
|
19
|
+
lastHealthCheckAt: probe.checkedAt,
|
|
20
|
+
lastHealthStatus: "ok",
|
|
21
|
+
lastToolCount: probe.toolCount
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
if (active.length > 0 && probe) {
|
|
25
|
+
const error = probe.error ?? "The connection did not expose any usable tools.";
|
|
26
|
+
return {
|
|
27
|
+
...instance,
|
|
28
|
+
status: "degraded",
|
|
29
|
+
connectionStatus: probe.connectionError ? "error" : "connected",
|
|
30
|
+
authStatus: "connected",
|
|
31
|
+
lastConnectedAt,
|
|
32
|
+
lastError: error,
|
|
33
|
+
usage: {
|
|
34
|
+
...instance.usage,
|
|
35
|
+
lastHealthCheckAt: probe.checkedAt,
|
|
36
|
+
lastHealthStatus: probe.connectionError ? "network_failed" : "tools_list_failed",
|
|
37
|
+
lastToolCount: probe.toolCount ?? 0
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
if (relevant.some((connection) => connection.status === "pending")) return {
|
|
42
|
+
...instance,
|
|
43
|
+
status: "connecting",
|
|
44
|
+
connectionStatus: "connecting",
|
|
45
|
+
authStatus: "unknown"
|
|
46
|
+
};
|
|
47
|
+
if (relevant.some((connection) => connection.status === "expired")) return {
|
|
48
|
+
...instance,
|
|
49
|
+
status: "unauthorized",
|
|
50
|
+
connectionStatus: "unauthorized",
|
|
51
|
+
authStatus: "expired"
|
|
52
|
+
};
|
|
53
|
+
if (relevant.some((connection) => connection.status === "failed")) return {
|
|
54
|
+
...instance,
|
|
55
|
+
status: "failed",
|
|
56
|
+
connectionStatus: "error",
|
|
57
|
+
authStatus: "unauthorized"
|
|
58
|
+
};
|
|
59
|
+
return {
|
|
60
|
+
...instance,
|
|
61
|
+
status: "not_configured",
|
|
62
|
+
connectionStatus: "disconnected",
|
|
63
|
+
authStatus: "missing"
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
//#endregion
|
|
68
|
+
export { projectComposioRuntimeStatus };
|
|
@@ -12,6 +12,7 @@ export type ConnectorAuthDefinition = {
|
|
|
12
12
|
};
|
|
13
13
|
export type ConnectorScope = 'read' | 'write' | 'admin';
|
|
14
14
|
export type ConnectorVerificationLevel = 'verified' | 'beta' | 'experimental';
|
|
15
|
+
export type ConnectorBenefit = 'understand' | 'act' | 'reach';
|
|
15
16
|
export type ConnectorBranding = {
|
|
16
17
|
logoUrl?: string;
|
|
17
18
|
source?: 'builtin' | 'composio-catalog' | 'registry' | 'extension' | 'custom';
|
|
@@ -88,6 +89,7 @@ export type ConnectorDefinition = {
|
|
|
88
89
|
kind: ConnectorKind;
|
|
89
90
|
source: 'builtin' | 'extension' | 'custom' | 'registry' | 'store';
|
|
90
91
|
capabilities: ConnectorCapability[];
|
|
92
|
+
benefits?: ConnectorBenefit[];
|
|
91
93
|
tags?: string[];
|
|
92
94
|
branding?: ConnectorBranding;
|
|
93
95
|
verificationLevel?: ConnectorVerificationLevel;
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { decideConnectorApproval, getConnectorApproval, listConnectorApprovals } from "../../../storage/sqlite/connector-repository.js";
|
|
1
|
+
import { decideConnectorApproval, getConnectorApproval, listConnectorApprovals, listConnectorConnections } from "../../../storage/sqlite/connector-repository.js";
|
|
2
2
|
import "../../../storage/sqlite/index.js";
|
|
3
|
+
import { init_agent_scope, resolveDefaultAgentId } from "../../../agent/agent-scope.js";
|
|
4
|
+
import { resolveComposioApiKey } from "../../../connectors/composio-sessions.js";
|
|
3
5
|
import { listComposioConnectorCatalog } from "../../../connectors/composio-catalog.js";
|
|
4
6
|
import { createConnectorSetupSecretRequest, submitConnectorSetupSecret } from "../../../connectors/setup-secrets.js";
|
|
5
|
-
import { executeComposioTool, getComposioInstallationPolicy, getComposioToolkitScope, inspectComposioConnectorHealth, listComposioConnections, listComposioTools, refreshComposioConnection, revokeComposioConnection, setComposioToolkitScope, updateComposioConnection, updateComposioInstallationPolicy } from "../../../connectors/composio.js";
|
|
7
|
+
import { configureComposioApiKey, executeComposioTool, getComposioInstallationPolicy, getComposioToolkitScope, inspectComposioConnectorHealth, listComposioConnections, listComposioTools, refreshComposioConnection, revokeComposioConnection, setComposioToolkitScope, updateComposioConnection, updateComposioInstallationPolicy } from "../../../connectors/composio.js";
|
|
6
8
|
import { listConnectorProviders } from "../../../connectors/providers.js";
|
|
7
9
|
import { getConnectorDefinition, listConnectorCatalog } from "../../../connectors/catalog.js";
|
|
8
10
|
import { recordConnectorHealthUsage } from "../../../connectors/usage.js";
|
|
@@ -11,11 +13,15 @@ import { installConnector, installConnectorDefinition, uninstallConnector, updat
|
|
|
11
13
|
import { startConnectorAuthorization } from "../../../connectors/auth-provider-registry.js";
|
|
12
14
|
import { composioLogoResponse } from "../../../connectors/composio-logo.js";
|
|
13
15
|
import { appendComposioTriggerEvent, listComposioTriggerEvents } from "../../../connectors/composio-triggers.js";
|
|
14
|
-
import {
|
|
16
|
+
import { buildConnectedPeopleGraph } from "../../../knowledge/people-graph.js";
|
|
17
|
+
import "../../../knowledge/index.js";
|
|
18
|
+
import { syncComposioResultToMemory, syncLocalFolderToMemory } from "../../../connectors/connector-memory-sync.js";
|
|
15
19
|
import { previewConnectorDefinition, testConnectorInstance } from "../../../connectors/health.js";
|
|
16
20
|
import { setConnectorEnabled } from "../../../connectors/lifecycle.js";
|
|
17
|
-
import {
|
|
21
|
+
import { getComposioMemorySyncProfile, updateComposioMemorySyncProfile } from "../../../connectors/memory-sync-profile.js";
|
|
22
|
+
import { projectComposioRuntimeStatus } from "../../../connectors/runtime-status.js";
|
|
18
23
|
//#region src/gateway/hono/routes/connectors.ts
|
|
24
|
+
init_agent_scope();
|
|
19
25
|
function errorMessage(error) {
|
|
20
26
|
return error instanceof Error ? error.message : String(error);
|
|
21
27
|
}
|
|
@@ -29,34 +35,49 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
29
35
|
providers: listConnectorProviders().map((provider) => ({
|
|
30
36
|
id: provider.id,
|
|
31
37
|
displayName: provider.displayName
|
|
32
|
-
}))
|
|
33
|
-
registries: listConnectorRegistries()
|
|
38
|
+
}))
|
|
34
39
|
}
|
|
35
40
|
});
|
|
36
41
|
});
|
|
37
|
-
authenticated.get("/api/connectors/installed", (c) => {
|
|
42
|
+
authenticated.get("/api/connectors/installed", async (c) => {
|
|
38
43
|
const config = service.currentConfig;
|
|
39
|
-
|
|
44
|
+
const instances = listConnectorInstances(config);
|
|
45
|
+
const composioInstances = instances.filter((instance) => instance.materialized.type === "composio" && instance.materialized.role === "toolkit");
|
|
46
|
+
if (composioInstances.length === 0) return c.json({
|
|
40
47
|
ok: true,
|
|
41
|
-
payload: { instances
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
authenticated.get("/api/connectors/registry/search", async (c) => {
|
|
45
|
-
const query = c.req.query("q") ?? c.req.query("query") ?? "";
|
|
46
|
-
const sourceParam = c.req.query("source") ?? "all";
|
|
47
|
-
const results = await searchConnectorRegistries({
|
|
48
|
-
query,
|
|
49
|
-
source: sourceParam !== "all" && isConnectorRegistrySource(sourceParam) ? sourceParam : "all",
|
|
50
|
-
page: Number(c.req.query("page") ?? "1"),
|
|
51
|
-
pageSize: Number(c.req.query("pageSize") ?? "24"),
|
|
52
|
-
browse: c.req.query("browse") === "1" || c.req.query("browse") === "true"
|
|
48
|
+
payload: { instances }
|
|
53
49
|
});
|
|
50
|
+
const checkedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
51
|
+
let connectionError;
|
|
52
|
+
try {
|
|
53
|
+
await listComposioConnections();
|
|
54
|
+
} catch (error) {
|
|
55
|
+
connectionError = errorMessage(error);
|
|
56
|
+
}
|
|
57
|
+
const probes = await Promise.all([...new Map(composioInstances.map((instance) => [instance.connectorId, instance])).values()].map(async (instance) => {
|
|
58
|
+
try {
|
|
59
|
+
const tools = await listComposioTools(instance.materialized.type === "composio" ? instance.materialized.toolkit : "", config);
|
|
60
|
+
return {
|
|
61
|
+
connectorId: instance.connectorId,
|
|
62
|
+
checkedAt,
|
|
63
|
+
toolCount: tools.length,
|
|
64
|
+
...connectionError ? {
|
|
65
|
+
error: connectionError,
|
|
66
|
+
connectionError: true
|
|
67
|
+
} : {}
|
|
68
|
+
};
|
|
69
|
+
} catch (error) {
|
|
70
|
+
return {
|
|
71
|
+
connectorId: instance.connectorId,
|
|
72
|
+
checkedAt,
|
|
73
|
+
error: errorMessage(error)
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}));
|
|
77
|
+
const connections = listConnectorConnections({ principalId: "local-owner" });
|
|
54
78
|
return c.json({
|
|
55
79
|
ok: true,
|
|
56
|
-
payload: {
|
|
57
|
-
results,
|
|
58
|
-
connectors: results.flatMap((result) => result.connectors)
|
|
59
|
-
}
|
|
80
|
+
payload: { instances: projectComposioRuntimeStatus(instances, connections, probes) }
|
|
60
81
|
});
|
|
61
82
|
});
|
|
62
83
|
authenticated.post("/api/connectors/setup/request-secret", strictRateLimitMiddleware, async (c) => {
|
|
@@ -147,9 +168,17 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
147
168
|
authenticated.get("/api/connectors/composio/catalog", async (c) => {
|
|
148
169
|
try {
|
|
149
170
|
const refresh = c.req.query("refresh") === "1" || c.req.query("refresh") === "true";
|
|
171
|
+
const verificationParam = c.req.query("verification");
|
|
172
|
+
const verification = verificationParam === "verified" || verificationParam === "experimental" ? verificationParam : "all";
|
|
150
173
|
return c.json({
|
|
151
174
|
ok: true,
|
|
152
|
-
payload: await listComposioConnectorCatalog({
|
|
175
|
+
payload: await listComposioConnectorCatalog({
|
|
176
|
+
refresh,
|
|
177
|
+
verification,
|
|
178
|
+
query: c.req.query("q") ?? "",
|
|
179
|
+
page: Number(c.req.query("page") ?? "1"),
|
|
180
|
+
pageSize: Number(c.req.query("pageSize") ?? "24")
|
|
181
|
+
})
|
|
153
182
|
});
|
|
154
183
|
} catch (error) {
|
|
155
184
|
return c.json({
|
|
@@ -246,6 +275,7 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
246
275
|
const body = await c.req.json().catch(() => ({}));
|
|
247
276
|
try {
|
|
248
277
|
const event = await appendComposioTriggerEvent(service.currentConfig, body);
|
|
278
|
+
service.requestConnectorMemorySync(event.toolkit);
|
|
249
279
|
return c.json({
|
|
250
280
|
ok: true,
|
|
251
281
|
payload: { event }
|
|
@@ -272,6 +302,54 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
272
302
|
}, 400);
|
|
273
303
|
}
|
|
274
304
|
});
|
|
305
|
+
authenticated.get("/api/connectors/people", (c) => {
|
|
306
|
+
const query = c.req.query("q") ?? "";
|
|
307
|
+
const limit = Number(c.req.query("limit") ?? "100");
|
|
308
|
+
return c.json({
|
|
309
|
+
ok: true,
|
|
310
|
+
payload: buildConnectedPeopleGraph({
|
|
311
|
+
query,
|
|
312
|
+
limit
|
|
313
|
+
})
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
authenticated.get("/api/connectors/:id/memory-sync-profile", (c) => {
|
|
317
|
+
const profile = getComposioMemorySyncProfile(service.currentConfig, c.req.param("id"));
|
|
318
|
+
return c.json({
|
|
319
|
+
ok: true,
|
|
320
|
+
payload: { profile: profile ?? null }
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
authenticated.patch("/api/connectors/:id/memory-sync-profile", strictRateLimitMiddleware, async (c) => {
|
|
324
|
+
const body = await c.req.json().catch(() => ({}));
|
|
325
|
+
const row = body && typeof body === "object" && !Array.isArray(body) ? body : {};
|
|
326
|
+
try {
|
|
327
|
+
const config = service.currentConfig;
|
|
328
|
+
const profile = updateComposioMemorySyncProfile(config, c.req.param("id"), {
|
|
329
|
+
enabled: row.enabled === true,
|
|
330
|
+
actionId: typeof row.actionId === "string" ? row.actionId : "",
|
|
331
|
+
arguments: row.arguments && typeof row.arguments === "object" && !Array.isArray(row.arguments) ? row.arguments : {},
|
|
332
|
+
agentId: typeof row.agentId === "string" ? row.agentId : "",
|
|
333
|
+
connectionId: typeof row.connectionId === "string" ? row.connectionId : void 0,
|
|
334
|
+
intervalMinutes: Number(row.intervalMinutes),
|
|
335
|
+
triggerSync: row.triggerSync !== false
|
|
336
|
+
});
|
|
337
|
+
const saved = await service.saveConfig(config);
|
|
338
|
+
if (!saved.saved) return c.json({
|
|
339
|
+
ok: false,
|
|
340
|
+
error: saved.error
|
|
341
|
+
}, 500);
|
|
342
|
+
return c.json({
|
|
343
|
+
ok: true,
|
|
344
|
+
payload: { profile }
|
|
345
|
+
});
|
|
346
|
+
} catch (error) {
|
|
347
|
+
return c.json({
|
|
348
|
+
ok: false,
|
|
349
|
+
error: errorMessage(error)
|
|
350
|
+
}, 400);
|
|
351
|
+
}
|
|
352
|
+
});
|
|
275
353
|
authenticated.get("/api/connectors/:id", (c) => {
|
|
276
354
|
const connectorId = c.req.param("id");
|
|
277
355
|
const connector = getConnectorDefinition(connectorId);
|
|
@@ -321,15 +399,28 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
321
399
|
const body = await c.req.json().catch(() => ({}));
|
|
322
400
|
const row = body && typeof body === "object" && !Array.isArray(body) ? body : {};
|
|
323
401
|
const actionId = typeof row.actionId === "string" ? row.actionId.trim() : "";
|
|
324
|
-
const
|
|
325
|
-
|
|
326
|
-
ok: false,
|
|
327
|
-
error: "actionId and agentId are required."
|
|
328
|
-
}, 400);
|
|
402
|
+
const config = service.currentConfig;
|
|
403
|
+
const agentId = typeof row.agentId === "string" && row.agentId.trim() ? row.agentId.trim() : resolveDefaultAgentId(config);
|
|
329
404
|
try {
|
|
405
|
+
const connectorId = c.req.param("id");
|
|
406
|
+
if (getConnectorDefinition(connectorId)?.runtime.type === "memorySource") {
|
|
407
|
+
const result = await syncLocalFolderToMemory({
|
|
408
|
+
config,
|
|
409
|
+
connectorId,
|
|
410
|
+
agentId
|
|
411
|
+
});
|
|
412
|
+
return c.json({
|
|
413
|
+
ok: true,
|
|
414
|
+
payload: result
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
if (!actionId) return c.json({
|
|
418
|
+
ok: false,
|
|
419
|
+
error: "actionId is required for Composio memory sync."
|
|
420
|
+
}, 400);
|
|
330
421
|
const result = await syncComposioResultToMemory({
|
|
331
|
-
config
|
|
332
|
-
connectorId
|
|
422
|
+
config,
|
|
423
|
+
connectorId,
|
|
333
424
|
actionId,
|
|
334
425
|
agentId,
|
|
335
426
|
connectionId: typeof row.connectionId === "string" ? row.connectionId : void 0,
|
|
@@ -463,6 +554,29 @@ function registerConnectorRoutes(authenticated, deps) {
|
|
|
463
554
|
}, 400);
|
|
464
555
|
}
|
|
465
556
|
});
|
|
557
|
+
authenticated.get("/api/connectors/composio/setup-status", async (c) => {
|
|
558
|
+
const configured = Boolean(await resolveComposioApiKey());
|
|
559
|
+
return c.json({
|
|
560
|
+
ok: true,
|
|
561
|
+
payload: { configured }
|
|
562
|
+
});
|
|
563
|
+
});
|
|
564
|
+
authenticated.post("/api/connectors/composio/setup", strictRateLimitMiddleware, async (c) => {
|
|
565
|
+
const body = await c.req.json().catch(() => ({}));
|
|
566
|
+
const apiKey = body && typeof body === "object" && !Array.isArray(body) ? String(body.apiKey ?? "") : "";
|
|
567
|
+
try {
|
|
568
|
+
await configureComposioApiKey(apiKey);
|
|
569
|
+
return c.json({
|
|
570
|
+
ok: true,
|
|
571
|
+
payload: { configured: true }
|
|
572
|
+
});
|
|
573
|
+
} catch (error) {
|
|
574
|
+
return c.json({
|
|
575
|
+
ok: false,
|
|
576
|
+
error: errorMessage(error)
|
|
577
|
+
}, 400);
|
|
578
|
+
}
|
|
579
|
+
});
|
|
466
580
|
authenticated.post("/api/connectors/:id/install", strictRateLimitMiddleware, async (c) => {
|
|
467
581
|
const connectorId = c.req.param("id");
|
|
468
582
|
const body = await c.req.json().catch(() => ({}));
|
|
@@ -70,6 +70,7 @@ function registerPublicGatewayRoutes(app, service) {
|
|
|
70
70
|
const normalized = normalizeComposioTriggerPayload(archivedPayload, webhookId);
|
|
71
71
|
applyComposioConnectionLifecycleEvent(archivedPayload);
|
|
72
72
|
const event = await appendComposioTriggerEvent(service.currentConfig, archivedPayload);
|
|
73
|
+
service.requestConnectorMemorySync(normalized.toolkit);
|
|
73
74
|
const runs = await service.automationServiceInstance.triggerEvent({
|
|
74
75
|
type: `connector.${normalized.trigger ?? normalized.type}`,
|
|
75
76
|
source: normalized.toolkit ? `composio:${normalized.toolkit}` : "composio",
|
|
@@ -57,6 +57,7 @@ export declare class GatewayService {
|
|
|
57
57
|
private goalNotifications;
|
|
58
58
|
private mobileNotifications;
|
|
59
59
|
private connectorSupervisor;
|
|
60
|
+
private connectorMemorySyncCoordinator;
|
|
60
61
|
private connectedKnowledgeCoordinator;
|
|
61
62
|
private stopAutomationProductEventBridge;
|
|
62
63
|
private stopSessionTranscriptAutomationEvents;
|
|
@@ -199,6 +200,7 @@ export declare class GatewayService {
|
|
|
199
200
|
requestHeartbeatNow(opts?: {
|
|
200
201
|
reason?: string;
|
|
201
202
|
}): void;
|
|
203
|
+
requestConnectorMemorySync(toolkit?: string): void;
|
|
202
204
|
/**
|
|
203
205
|
* Register graceful shutdown used after spawning a replacement gateway process (foreground CLI server).
|
|
204
206
|
*/
|
|
@@ -44,6 +44,7 @@ import { getWorkspacePath } from "../config/workspace-path-helpers.js";
|
|
|
44
44
|
import "../config/index.js";
|
|
45
45
|
import { startConnectedKnowledgeCoordinator } from "../knowledge/coordinator.js";
|
|
46
46
|
import "../knowledge/index.js";
|
|
47
|
+
import { startConnectorMemorySyncCoordinator } from "../connectors/memory-sync-coordinator.js";
|
|
47
48
|
import { startConnectorSupervisor } from "../connectors/supervisor.js";
|
|
48
49
|
import { assertGatewayAuthConfigured, extractToken, resolveGatewayAuth, validateToken } from "./auth.js";
|
|
49
50
|
import { reconcileDreamingAutomations } from "./dreaming-automation-reconciler.js";
|
|
@@ -136,6 +137,7 @@ var GatewayService = class {
|
|
|
136
137
|
goalNotifications = null;
|
|
137
138
|
mobileNotifications = null;
|
|
138
139
|
connectorSupervisor = null;
|
|
140
|
+
connectorMemorySyncCoordinator = null;
|
|
139
141
|
connectedKnowledgeCoordinator = null;
|
|
140
142
|
stopAutomationProductEventBridge = null;
|
|
141
143
|
stopSessionTranscriptAutomationEvents = null;
|
|
@@ -683,6 +685,10 @@ var GatewayService = class {
|
|
|
683
685
|
getConfig: () => this.config,
|
|
684
686
|
saveConfig: (cfg) => this.saveConfig(cfg)
|
|
685
687
|
});
|
|
688
|
+
this.connectorMemorySyncCoordinator = startConnectorMemorySyncCoordinator({
|
|
689
|
+
getConfig: () => this.config,
|
|
690
|
+
resolveAgentId: () => resolveDefaultAgentId(this.config)
|
|
691
|
+
});
|
|
686
692
|
this.connectedKnowledgeCoordinator = startConnectedKnowledgeCoordinator({ resolvePipelineOptions: () => ({
|
|
687
693
|
agentId: resolveDefaultAgentId(this.config),
|
|
688
694
|
workspaceId: this.currentWorkspacePath
|
|
@@ -806,6 +812,8 @@ var GatewayService = class {
|
|
|
806
812
|
this.heartbeatService?.stop();
|
|
807
813
|
this.connectorSupervisor?.stop();
|
|
808
814
|
this.connectorSupervisor = null;
|
|
815
|
+
this.connectorMemorySyncCoordinator?.stop();
|
|
816
|
+
this.connectorMemorySyncCoordinator = null;
|
|
809
817
|
this.connectedKnowledgeCoordinator?.stop();
|
|
810
818
|
this.connectedKnowledgeCoordinator = null;
|
|
811
819
|
if (this.browserExtensionRelease) {
|
|
@@ -1045,6 +1053,12 @@ var GatewayService = class {
|
|
|
1045
1053
|
requestHeartbeatNow(opts) {
|
|
1046
1054
|
this.heartbeatService?.requestNow({ reason: opts?.reason ?? "manual" });
|
|
1047
1055
|
}
|
|
1056
|
+
requestConnectorMemorySync(toolkit) {
|
|
1057
|
+
this.connectorMemorySyncCoordinator?.runNow({
|
|
1058
|
+
toolkit,
|
|
1059
|
+
force: true
|
|
1060
|
+
});
|
|
1061
|
+
}
|
|
1048
1062
|
/**
|
|
1049
1063
|
* Register graceful shutdown used after spawning a replacement gateway process (foreground CLI server).
|
|
1050
1064
|
*/
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { KnowledgeIngestionService, SqliteKnowledgeSourceStateStore } from "./ingestion-service.js";
|
|
2
2
|
import { ConnectedKnowledgePipeline } from "./connected-knowledge-pipeline.js";
|
|
3
3
|
import { startConnectedKnowledgeCoordinator } from "./coordinator.js";
|
|
4
|
-
|
|
4
|
+
import { LocalFolderKnowledgeSourceAdapter } from "./local-folder-adapter.js";
|
|
5
|
+
import { buildConnectedPeopleGraph } from "./people-graph.js";
|
|
6
|
+
export { ConnectedKnowledgePipeline, KnowledgeIngestionService, LocalFolderKnowledgeSourceAdapter, SqliteKnowledgeSourceStateStore, buildConnectedPeopleGraph, startConnectedKnowledgeCoordinator };
|
|
@@ -1,9 +1,44 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
|
-
import { finishKnowledgeSyncRun, getKnowledgeSourceCursor, setKnowledgeSourceCursor, startKnowledgeSyncRun, upsertKnowledgeSourceItems } from "../storage/sqlite/knowledge-repository.js";
|
|
3
|
+
import { finishKnowledgeSyncRun, getKnowledgeSourceCursor, listKnowledgeSourceItems, setKnowledgeSourceCursor, startKnowledgeSyncRun, upsertKnowledgeSourceItems } from "../storage/sqlite/knowledge-repository.js";
|
|
4
4
|
//#region src/knowledge/ingestion-service.ts
|
|
5
5
|
init_logger();
|
|
6
6
|
const log = createLogger("KnowledgeIngestion");
|
|
7
|
+
function deletionInputs(instanceId, snapshotExternalIds) {
|
|
8
|
+
if (!snapshotExternalIds) return [];
|
|
9
|
+
const seen = new Set(snapshotExternalIds);
|
|
10
|
+
const deletedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
11
|
+
const missing = [];
|
|
12
|
+
for (let offset = 0;; offset += 500) {
|
|
13
|
+
const page = listKnowledgeSourceItems({
|
|
14
|
+
sourceInstanceId: instanceId,
|
|
15
|
+
limit: 500,
|
|
16
|
+
offset
|
|
17
|
+
});
|
|
18
|
+
for (const item of page) {
|
|
19
|
+
if (seen.has(item.externalId)) continue;
|
|
20
|
+
missing.push({
|
|
21
|
+
id: item.id,
|
|
22
|
+
sourceInstanceId: item.sourceInstanceId,
|
|
23
|
+
externalId: item.externalId,
|
|
24
|
+
itemType: item.itemType,
|
|
25
|
+
authorRole: item.authorRole,
|
|
26
|
+
occurredAt: item.occurredAt,
|
|
27
|
+
sourceUpdatedAt: item.sourceUpdatedAt,
|
|
28
|
+
contentHash: item.contentHash,
|
|
29
|
+
normalizedText: item.normalizedText,
|
|
30
|
+
payloadRef: item.payloadRef,
|
|
31
|
+
metadata: item.metadata,
|
|
32
|
+
sensitivity: item.sensitivity,
|
|
33
|
+
retentionClass: item.retentionClass,
|
|
34
|
+
synthesisPipeline: item.synthesisPipeline,
|
|
35
|
+
deletedAt
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
if (page.length < 500) break;
|
|
39
|
+
}
|
|
40
|
+
return missing;
|
|
41
|
+
}
|
|
7
42
|
var SqliteKnowledgeSourceStateStore = class {
|
|
8
43
|
getCursor(instanceId) {
|
|
9
44
|
return getKnowledgeSourceCursor(instanceId);
|
|
@@ -62,7 +97,8 @@ var KnowledgeIngestionService = class {
|
|
|
62
97
|
windowStart: params.windowStart,
|
|
63
98
|
signal
|
|
64
99
|
});
|
|
65
|
-
const
|
|
100
|
+
const tombstones = deletionInputs(params.instanceId, pulled.snapshotExternalIds);
|
|
101
|
+
const stored = upsertKnowledgeSourceItems([...pulled.items, ...tombstones]);
|
|
66
102
|
this.state.setCursor(params.instanceId, pulled.nextCursor);
|
|
67
103
|
const completed = finishKnowledgeSyncRun({
|
|
68
104
|
runId: run.id,
|
|
@@ -78,7 +114,8 @@ var KnowledgeIngestionService = class {
|
|
|
78
114
|
sourceInstanceId: params.instanceId,
|
|
79
115
|
itemsSeen: pulled.items.length,
|
|
80
116
|
itemsCreated: stored.created,
|
|
81
|
-
itemsUpdated: stored.updated
|
|
117
|
+
itemsUpdated: stored.updated,
|
|
118
|
+
itemsDeleted: tombstones.length
|
|
82
119
|
}, "Knowledge source sync completed");
|
|
83
120
|
return completed;
|
|
84
121
|
} catch (err) {
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { KnowledgePullInput, KnowledgePullResult, KnowledgeSourceAdapter } from './types.js';
|
|
2
|
+
export declare class LocalFolderKnowledgeSourceAdapter implements KnowledgeSourceAdapter {
|
|
3
|
+
private readonly rootPath;
|
|
4
|
+
readonly kind = "local-folder";
|
|
5
|
+
constructor(rootPath: string);
|
|
6
|
+
pull(input: KnowledgePullInput): Promise<KnowledgePullResult>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { extname, relative, resolve, sep } from "node:path";
|
|
2
|
+
import { createHash } from "node:crypto";
|
|
3
|
+
import { readFile, readdir, realpath, stat } from "node:fs/promises";
|
|
4
|
+
//#region src/knowledge/local-folder-adapter.ts
|
|
5
|
+
const SUPPORTED_EXTENSIONS = new Set([
|
|
6
|
+
".md",
|
|
7
|
+
".mdx",
|
|
8
|
+
".txt",
|
|
9
|
+
".json",
|
|
10
|
+
".yaml",
|
|
11
|
+
".yml",
|
|
12
|
+
".csv",
|
|
13
|
+
".tsv"
|
|
14
|
+
]);
|
|
15
|
+
const IGNORED_DIRECTORIES = new Set([
|
|
16
|
+
".git",
|
|
17
|
+
".svn",
|
|
18
|
+
"node_modules"
|
|
19
|
+
]);
|
|
20
|
+
const MAX_FILES = 2e3;
|
|
21
|
+
const MAX_FILE_BYTES = 2 * 1024 * 1024;
|
|
22
|
+
var LocalFolderKnowledgeSourceAdapter = class {
|
|
23
|
+
kind = "local-folder";
|
|
24
|
+
constructor(rootPath) {
|
|
25
|
+
this.rootPath = rootPath;
|
|
26
|
+
}
|
|
27
|
+
async pull(input) {
|
|
28
|
+
const scanStartedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
29
|
+
const root = await realpath(resolve(this.rootPath));
|
|
30
|
+
if (!(await stat(root)).isDirectory()) throw new Error(`Local knowledge source is not a directory: ${root}`);
|
|
31
|
+
const cursorMs = input.cursor ? Date.parse(input.cursor) : NaN;
|
|
32
|
+
const windowMs = input.windowStart ? Date.parse(input.windowStart) : NaN;
|
|
33
|
+
const changedAfter = Math.max(Number.isFinite(cursorMs) ? cursorMs : 0, Number.isFinite(windowMs) ? windowMs : 0);
|
|
34
|
+
const paths = [];
|
|
35
|
+
const warnings = [];
|
|
36
|
+
const walk = async (directory) => {
|
|
37
|
+
if (input.signal.aborted) throw input.signal.reason ?? /* @__PURE__ */ new Error("Local folder sync aborted.");
|
|
38
|
+
for (const entry of await readdir(directory, { withFileTypes: true })) {
|
|
39
|
+
if (paths.length >= MAX_FILES) return;
|
|
40
|
+
if (entry.isSymbolicLink()) continue;
|
|
41
|
+
const path = resolve(directory, entry.name);
|
|
42
|
+
if (entry.isDirectory()) {
|
|
43
|
+
if (!IGNORED_DIRECTORIES.has(entry.name)) await walk(path);
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (entry.isFile() && SUPPORTED_EXTENSIONS.has(extname(entry.name).toLowerCase())) paths.push(path);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
await walk(root);
|
|
50
|
+
if (paths.length >= MAX_FILES) warnings.push(`Local folder sync was limited to ${MAX_FILES} files.`);
|
|
51
|
+
const items = [];
|
|
52
|
+
for (const path of paths) {
|
|
53
|
+
if (input.signal.aborted) throw input.signal.reason ?? /* @__PURE__ */ new Error("Local folder sync aborted.");
|
|
54
|
+
const fileStat = await stat(path);
|
|
55
|
+
if (fileStat.size > MAX_FILE_BYTES || fileStat.mtimeMs <= changedAfter) continue;
|
|
56
|
+
const canonicalPath = await realpath(path);
|
|
57
|
+
if (canonicalPath !== root && !canonicalPath.startsWith(`${root}${sep}`)) continue;
|
|
58
|
+
const normalizedText = await readFile(canonicalPath, "utf8");
|
|
59
|
+
const externalId = relative(root, canonicalPath).split(sep).join("/");
|
|
60
|
+
items.push({
|
|
61
|
+
sourceInstanceId: input.instanceId,
|
|
62
|
+
externalId,
|
|
63
|
+
itemType: "local_file",
|
|
64
|
+
authorRole: "user",
|
|
65
|
+
sourceUpdatedAt: fileStat.mtime.toISOString(),
|
|
66
|
+
contentHash: createHash("sha256").update(normalizedText).digest("hex"),
|
|
67
|
+
normalizedText,
|
|
68
|
+
metadata: {
|
|
69
|
+
path: externalId,
|
|
70
|
+
rootPath: root
|
|
71
|
+
},
|
|
72
|
+
sensitivity: "personal",
|
|
73
|
+
retentionClass: "durable",
|
|
74
|
+
synthesisPipeline: "connected_knowledge"
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
items,
|
|
79
|
+
nextCursor: scanStartedAt,
|
|
80
|
+
warnings,
|
|
81
|
+
snapshotExternalIds: paths.length < MAX_FILES ? paths.map((path) => relative(root, path).split(sep).join("/")) : void 0
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
//#endregion
|
|
86
|
+
export { LocalFolderKnowledgeSourceAdapter };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export type ConnectedPersonNode = {
|
|
2
|
+
id: string;
|
|
3
|
+
label: string;
|
|
4
|
+
names: string[];
|
|
5
|
+
emails: string[];
|
|
6
|
+
usernames: string[];
|
|
7
|
+
roles: string[];
|
|
8
|
+
mentionCount: number;
|
|
9
|
+
lastObservedAt: string;
|
|
10
|
+
};
|
|
11
|
+
export type ConnectedPersonSourceEdge = {
|
|
12
|
+
personId: string;
|
|
13
|
+
sourceInstanceId: string;
|
|
14
|
+
connectorId?: string;
|
|
15
|
+
toolkit?: string;
|
|
16
|
+
mentionCount: number;
|
|
17
|
+
lastObservedAt: string;
|
|
18
|
+
};
|
|
19
|
+
export type ConnectedPeopleGraph = {
|
|
20
|
+
people: ConnectedPersonNode[];
|
|
21
|
+
sourceEdges: ConnectedPersonSourceEdge[];
|
|
22
|
+
scannedItems: number;
|
|
23
|
+
truncated: boolean;
|
|
24
|
+
};
|
|
25
|
+
export declare function buildConnectedPeopleGraph(options?: {
|
|
26
|
+
query?: string;
|
|
27
|
+
limit?: number;
|
|
28
|
+
}): ConnectedPeopleGraph;
|