@xopcai/xopc 0.0.155 → 0.0.157

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/action-boundary-settings-panel-zQ_w0sPl.js +1 -0
  4. package/dist/gateway/static/root/assets/{activity-store-Btmg10yU.js → activity-store-CddlQHam.js} +1 -1
  5. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-pdlJJov8.js → agent-avatar-dicebear-DOfTopIk.js} +1 -1
  6. package/dist/gateway/static/root/assets/agents-RZNd9xMI.js +2 -0
  7. package/dist/gateway/static/root/assets/{api-GGYxPxVF.js → api-NUlcaaV9.js} +1 -1
  8. package/dist/gateway/static/root/assets/{app-management-settings-panel-BU9oSmtJ.js → app-management-settings-panel-J0-z_uc1.js} +1 -1
  9. package/dist/gateway/static/root/assets/{appearance-settings-B2chSkbj.js → appearance-settings-CMaQOx2C.js} +1 -1
  10. package/dist/gateway/static/root/assets/apps-page-BOeTZgdL.js +1 -0
  11. package/dist/gateway/static/root/assets/{archive-plugin-BC83GwY1.js → archive-plugin-BVwE70GV.js} +1 -1
  12. package/dist/gateway/static/root/assets/{attachment-load-DWSH5325.js → attachment-load-aj5U56K9.js} +1 -1
  13. package/dist/gateway/static/root/assets/{automation-suggestion-card-Bc25f4wz.js → automation-suggestion-card-CKz8rxAb.js} +1 -1
  14. package/dist/gateway/static/root/assets/automations-page-wYN1N-Il.js +6 -0
  15. package/dist/gateway/static/root/assets/{binary-plugins-Kgu5yX35.js → binary-plugins-Ie6owbEw.js} +1 -1
  16. package/dist/gateway/static/root/assets/{block-editor-B9gJmzdE.js → block-editor-BaDrd5GJ.js} +31 -31
  17. package/dist/gateway/static/root/assets/browser-settings-page-DD3djQtX.js +8 -0
  18. package/dist/gateway/static/root/assets/{capability-presets-api-6z36IfIC.js → capability-presets-api-BjO4YD-O.js} +1 -1
  19. package/dist/gateway/static/root/assets/{capability-presets-settings-panel-Bqzl2UZ9.js → capability-presets-settings-panel-bwezWQpF.js} +2 -2
  20. package/dist/gateway/static/root/assets/{channel-recipient-api-DEkm4HRd.js → channel-recipient-api-BisDU_DH.js} +1 -1
  21. package/dist/gateway/static/root/assets/channels-settings-Bohv9YRy.js +1 -0
  22. package/dist/gateway/static/root/assets/channels-status-swr-h3VHD5Uq.js +1 -0
  23. package/dist/gateway/static/root/assets/{connector-logo-DPriINR1.js → connector-logo-DGjjzBIH.js} +1 -1
  24. package/dist/gateway/static/root/assets/connectors-page-LIAkMlN-.js +2 -0
  25. package/dist/gateway/static/root/assets/{desktop-pet-CG91Su8E.js → desktop-pet-CoQ4Edck.js} +1 -1
  26. package/dist/gateway/static/root/assets/{desktop-pet-settings-DUzETFxq.js → desktop-pet-settings--sjUYeNX.js} +1 -1
  27. package/dist/gateway/static/root/assets/{directory-picker-path-field-XNbI2wM7.js → directory-picker-path-field-CpmfFDx3.js} +1 -1
  28. package/dist/gateway/static/root/assets/{dreaming-settings-BsLa5Nr8.js → dreaming-settings-D7rRROE7.js} +3 -3
  29. package/dist/gateway/static/root/assets/{extension-debug-page-C-5Nyrdu.js → extension-debug-page-BzqW3ssG.js} +1 -1
  30. package/dist/gateway/static/root/assets/{extension-page-BEocT43y.js → extension-page-CKDbBzVR.js} +1 -1
  31. package/dist/gateway/static/root/assets/{extension-settings-page--XOHrL-O.js → extension-settings-page-DjNMSdRz.js} +1 -1
  32. package/dist/gateway/static/root/assets/{gateway-config-api-DZrNmiR3.js → gateway-config-api-CUEAZEld.js} +1 -1
  33. package/dist/gateway/static/root/assets/{gateway-settings-DfBvlqb2.js → gateway-settings-h1wWBrxD.js} +1 -1
  34. package/dist/gateway/static/root/assets/{gateway-startup-retry-Cc5dxiD_.js → gateway-startup-retry-CbMPgpHX.js} +1 -1
  35. package/dist/gateway/static/root/assets/goal-create-dialog-xfO0R5Bx.js +1 -0
  36. package/dist/gateway/static/root/assets/goal-detail-page-CVVKF2hY.js +4 -0
  37. package/dist/gateway/static/root/assets/{goals-config-api-Cdghd3f3.js → goals-config-api-C-Vq8VR9.js} +1 -1
  38. package/dist/gateway/static/root/assets/goals-page-W666NFIU.js +2 -0
  39. package/dist/gateway/static/root/assets/{goals-settings-CvOdikU6.js → goals-settings-DVrTDWYS.js} +1 -1
  40. package/dist/gateway/static/root/assets/{heartbeat-settings-CvaxjdV_.js → heartbeat-settings-Dv8qA4E7.js} +1 -1
  41. package/dist/gateway/static/root/assets/{index-C4HpPu1y.js → index-DHRxn7Sy.js} +61 -64
  42. package/dist/gateway/static/root/assets/index-gpwk8Nro.css +1 -0
  43. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BVt0deH6.js → keyboard-shortcuts-settings-DEKtMZbg.js} +1 -1
  44. package/dist/gateway/static/root/assets/local-app-workbench-page-y5WmNSyZ.js +2 -0
  45. package/dist/gateway/static/root/assets/{local-apps-page-C0HGfwao.js → local-apps-page-DQT2lZk7.js} +1 -1
  46. package/dist/gateway/static/root/assets/{locale-store-Dt0pSudQ.js → locale-store-d9Cylz62.js} +1 -1
  47. package/dist/gateway/static/root/assets/logs-page-DMQaC4Jn.js +7 -0
  48. package/dist/gateway/static/root/assets/{markdown-split-CjVg43Kl.js → markdown-split-Cp6NxQJr.js} +1 -1
  49. package/dist/gateway/static/root/assets/{media-plugins-D-LkrsY6.js → media-plugins-Dv1cQK2J.js} +1 -1
  50. package/dist/gateway/static/root/assets/{messages-CqXpNawC.js → messages-Bwu1tG3T.js} +4 -4
  51. package/dist/gateway/static/root/assets/models-hub-panel-CoYDJvX_.js +2 -0
  52. package/dist/gateway/static/root/assets/{notes-page-BsoNcBQ3.js → notes-page-CePZ2we1.js} +1 -1
  53. package/dist/gateway/static/root/assets/notes-workbench-C9B-7EsK.js +4 -0
  54. package/dist/gateway/static/root/assets/{page-tabs-C9OfBAT6.js → page-tabs-C1jBfKTZ.js} +1 -1
  55. package/dist/gateway/static/root/assets/{preview-open-alternatives-BCrigyTS.js → preview-open-alternatives-Cl9anbg0.js} +1 -1
  56. package/dist/gateway/static/root/assets/project-detail-page-DG_P8S7e.js +1 -0
  57. package/dist/gateway/static/root/assets/projects-page-C1pro-bG.js +1 -0
  58. package/dist/gateway/static/root/assets/remote-access-hub-DDj6t0SQ.js +1 -0
  59. package/dist/gateway/static/root/assets/{save-bar-controls-CnyZMYdJ.js → save-bar-controls-CWu_o1ta.js} +1 -1
  60. package/dist/gateway/static/root/assets/{schedule-field-Bez97_Ou.js → schedule-field-DuZbqL7X.js} +1 -1
  61. package/dist/gateway/static/root/assets/{schema-form-DbKY5jSv.js → schema-form-Bixut-2d.js} +1 -1
  62. package/dist/gateway/static/root/assets/sessions-page-C1aZFTTX.js +1 -0
  63. package/dist/gateway/static/root/assets/settings-advanced-gate-CwRP1Nsl.js +1 -0
  64. package/dist/gateway/static/root/assets/{settings-collapsible-section-4f60Dgw-.js → settings-collapsible-section-C_7lCtCp.js} +1 -1
  65. package/dist/gateway/static/root/assets/{settings-form-section-CCQ7MjdZ.js → settings-form-section-D0DPTbO0.js} +1 -1
  66. package/dist/gateway/static/root/assets/{settings-loading-skeleton-CQhjhb0F.js → settings-loading-skeleton-tN-9u8dj.js} +1 -1
  67. package/dist/gateway/static/root/assets/settings-page-C2L9g3kd.js +1 -0
  68. package/dist/gateway/static/root/assets/{settings-page-layout-C7sfPFaM.js → settings-page-layout-CBUOPmx_.js} +1 -1
  69. package/dist/gateway/static/root/assets/setup-status-panel-DFjG5i48.js +1 -0
  70. package/dist/gateway/static/root/assets/{share-preview-page-DeErzPeg.js → share-preview-page-BiSh0nLu.js} +1 -1
  71. package/dist/gateway/static/root/assets/shares-settings-Bh2T05Hp.js +1 -0
  72. package/dist/gateway/static/root/assets/skill-reload-api-ppRtNzpM.js +1 -0
  73. package/dist/gateway/static/root/assets/skills-page-Dnw1xKKm.js +2 -0
  74. package/dist/gateway/static/root/assets/{system-settings-panel-Dk1ZhfpM.js → system-settings-panel-h7uqbQ-n.js} +1 -1
  75. package/dist/gateway/static/root/assets/{theme-store-Cd_gY2Cb.js → theme-store-DjYRaF0J.js} +1 -1
  76. package/dist/gateway/static/root/assets/{typed-models-lib-fe1xAgdw.js → typed-models-lib-BkqBD32C.js} +1 -1
  77. package/dist/gateway/static/root/assets/{use-channel-catalog-Cbo3s1uh.js → use-channel-catalog-DiWtF12K.js} +1 -1
  78. package/dist/gateway/static/root/assets/user-context-page-09T5O8lO.js +1 -0
  79. package/dist/gateway/static/root/assets/voice-api-key-field-C4770AsA.js +1 -0
  80. package/dist/gateway/static/root/assets/work-discovery-page-D__GQy1R.js +1 -0
  81. package/dist/gateway/static/root/assets/work-item-detail-page-CAIgG4im.js +1 -0
  82. package/dist/gateway/static/root/assets/work-page-CkZvIUpT.js +1 -0
  83. package/dist/gateway/static/root/assets/workflow-run-setup-panel-qqixrSRL.js +3 -0
  84. package/dist/gateway/static/root/assets/workflows-page-THxdPWzb.js +11 -0
  85. package/dist/gateway/static/root/connector-icons/local-files.svg +6 -0
  86. package/dist/gateway/static/root/index.html +7 -7
  87. package/dist/package.js +1 -1
  88. package/dist/src/agent/agent-manager.js +63 -61
  89. package/dist/src/agent/embedded/xopc-auth-storage.js +1 -1
  90. package/dist/src/agent/tools/factory.js +2 -2
  91. package/dist/src/agent/tools/session-search-tool.d.ts +2 -2
  92. package/dist/src/agent/tools/session-search-tool.js +8 -19
  93. package/dist/src/config/agent-profile.js +1 -1
  94. package/dist/src/config/config-surface.d.ts +0 -26
  95. package/dist/src/connectors/builtin-catalog.js +90 -248
  96. package/dist/src/connectors/composio-catalog.js +28 -1
  97. package/dist/src/connectors/composio-sessions.js +1 -1
  98. package/dist/src/connectors/composio.d.ts +1 -0
  99. package/dist/src/connectors/composio.js +8 -1
  100. package/dist/src/connectors/connector-memory-sync.d.ts +10 -0
  101. package/dist/src/connectors/connector-memory-sync.js +184 -38
  102. package/dist/src/connectors/integration-strategy.js +65 -8
  103. package/dist/src/connectors/memory-sync-coordinator.d.ts +28 -0
  104. package/dist/src/connectors/memory-sync-coordinator.js +162 -0
  105. package/dist/src/connectors/memory-sync-profile.d.ts +13 -0
  106. package/dist/src/connectors/memory-sync-profile.js +73 -0
  107. package/dist/src/connectors/runtime-adapter-registry.js +17 -4
  108. package/dist/src/connectors/runtime-status.d.ts +9 -0
  109. package/dist/src/connectors/runtime-status.js +68 -0
  110. package/dist/src/connectors/types.d.ts +2 -0
  111. package/dist/src/gateway/agents-admin.js +1 -1
  112. package/dist/src/gateway/hono/routes/connectors.js +138 -12
  113. package/dist/src/gateway/hono/routes/public-gateway.js +1 -0
  114. package/dist/src/gateway/service.d.ts +2 -0
  115. package/dist/src/gateway/service.js +14 -0
  116. package/dist/src/knowledge/index.d.ts +2 -0
  117. package/dist/src/knowledge/index.js +3 -1
  118. package/dist/src/knowledge/ingestion-service.js +40 -3
  119. package/dist/src/knowledge/local-folder-adapter.d.ts +7 -0
  120. package/dist/src/knowledge/local-folder-adapter.js +86 -0
  121. package/dist/src/knowledge/people-graph.d.ts +28 -0
  122. package/dist/src/knowledge/people-graph.js +126 -0
  123. package/dist/src/knowledge/types.d.ts +2 -0
  124. package/dist/src/user-context/projection.d.ts +2 -0
  125. package/dist/src/user-context/projection.js +12 -2
  126. package/package.json +1 -1
  127. package/dist/gateway/static/root/assets/agents-NDjTqOIb.js +0 -2
  128. package/dist/gateway/static/root/assets/apps-page-DHvwQknj.js +0 -1
  129. package/dist/gateway/static/root/assets/automations-page-32U6mfy-.js +0 -6
  130. package/dist/gateway/static/root/assets/browser-settings-page-CTWycuu_.js +0 -8
  131. package/dist/gateway/static/root/assets/channels-settings-DdelF9BQ.js +0 -1
  132. package/dist/gateway/static/root/assets/channels-status-swr-CBgr61Zt.js +0 -1
  133. package/dist/gateway/static/root/assets/connectors-page-CO3ASIfE.js +0 -2
  134. package/dist/gateway/static/root/assets/goal-create-dialog-BRVB5I7f.js +0 -1
  135. package/dist/gateway/static/root/assets/goal-detail-page-Drdz_llY.js +0 -4
  136. package/dist/gateway/static/root/assets/goals-page-CEh2UTzg.js +0 -2
  137. package/dist/gateway/static/root/assets/index-DjvInkv6.css +0 -1
  138. package/dist/gateway/static/root/assets/local-app-workbench-page-Dcmb1Ruc.js +0 -2
  139. package/dist/gateway/static/root/assets/logs-page-BWdV-HsP.js +0 -7
  140. package/dist/gateway/static/root/assets/models-hub-panel-Du41WFC6.js +0 -2
  141. package/dist/gateway/static/root/assets/notes-workbench-VeU2xG2r.js +0 -4
  142. package/dist/gateway/static/root/assets/project-detail-page-B9QsnXWV.js +0 -1
  143. package/dist/gateway/static/root/assets/projects-page-BbplZbzF.js +0 -1
  144. package/dist/gateway/static/root/assets/remote-access-hub-CfbuqKDd.js +0 -1
  145. package/dist/gateway/static/root/assets/sessions-page-CSQLpHd4.js +0 -1
  146. package/dist/gateway/static/root/assets/settings-advanced-gate-C25HTTPK.js +0 -1
  147. package/dist/gateway/static/root/assets/settings-page-BZb-E5vI.js +0 -1
  148. package/dist/gateway/static/root/assets/setup-status-panel-B1FSxWQ3.js +0 -1
  149. package/dist/gateway/static/root/assets/shares-settings-DDg5dL3k.js +0 -1
  150. package/dist/gateway/static/root/assets/skill-reload-api-B-ocgAT-.js +0 -1
  151. package/dist/gateway/static/root/assets/skills-page-CtO4i9ds.js +0 -2
  152. package/dist/gateway/static/root/assets/user-context-page-CqtVqiYz.js +0 -1
  153. package/dist/gateway/static/root/assets/user-profile-fields-editor-DcnCOHwp.js +0 -1
  154. package/dist/gateway/static/root/assets/user-profile-settings-panel-CTWZR6nV.js +0 -1
  155. package/dist/gateway/static/root/assets/utils-BDzZMJls.js +0 -1
  156. package/dist/gateway/static/root/assets/voice-api-key-field-C9Psto-d.js +0 -1
  157. package/dist/gateway/static/root/assets/work-discovery-page-CNVeagdJ.js +0 -1
  158. package/dist/gateway/static/root/assets/work-item-detail-page-DKSNc1SH.js +0 -1
  159. package/dist/gateway/static/root/assets/work-page-Bwbg1Ht-.js +0 -1
  160. package/dist/gateway/static/root/assets/workflow-run-setup-panel-ZKbrdYmp.js +0 -3
  161. package/dist/gateway/static/root/assets/workflows-page-DBHqpZ76.js +0 -11
  162. package/dist/gateway/static/root/connector-icons/brave-search.svg +0 -1
  163. package/dist/gateway/static/root/connector-icons/fetch.svg +0 -6
  164. package/dist/gateway/static/root/connector-icons/memory.svg +0 -5
  165. package/dist/gateway/static/root/connector-icons/playwright.svg +0 -9
  166. package/dist/gateway/static/root/connector-icons/sequential-thinking.svg +0 -8
  167. package/dist/gateway/static/root/connector-icons/time.svg +0 -6
@@ -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,5 +1,5 @@
1
- import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveAgentDir, resolveAgentProfileDir, resolveAgentWorkspaceDir, resolveDefaultAgentId, resolveUserPath, validateAgentIdForNewAgent } from "../agent/agent-scope.js";
2
1
  import { resolveEffectiveAgentManifest } from "../agent-manifest/resolver.js";
2
+ import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveAgentDir, resolveAgentProfileDir, resolveAgentWorkspaceDir, resolveDefaultAgentId, resolveUserPath, validateAgentIdForNewAgent } from "../agent/agent-scope.js";
3
3
  import { resolveEffectiveAgentProfile } from "../config/agent-profile.js";
4
4
  import { WORKSPACE_FILES, init_paths, resolveUserProfilePath } from "../config/paths.js";
5
5
  import { AGENT_PROFILE_MARKDOWN_SYSTEM_FILES, REQUIRED_AGENT_PROFILE_MARKDOWN_FILE_SET } from "../agent/context/workspace.js";
@@ -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,16 @@ 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 { syncComposioResultToMemory } from "../../../connectors/connector-memory-sync.js";
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";
21
+ import { getComposioMemorySyncProfile, updateComposioMemorySyncProfile } from "../../../connectors/memory-sync-profile.js";
22
+ import { projectComposioRuntimeStatus } from "../../../connectors/runtime-status.js";
17
23
  import { isConnectorRegistrySource, listConnectorRegistries, searchConnectorRegistries } from "../../../connectors/registries/search.js";
18
24
  //#region src/gateway/hono/routes/connectors.ts
25
+ init_agent_scope();
19
26
  function errorMessage(error) {
20
27
  return error instanceof Error ? error.message : String(error);
21
28
  }
@@ -34,11 +41,45 @@ function registerConnectorRoutes(authenticated, deps) {
34
41
  }
35
42
  });
36
43
  });
37
- authenticated.get("/api/connectors/installed", (c) => {
44
+ authenticated.get("/api/connectors/installed", async (c) => {
38
45
  const config = service.currentConfig;
46
+ const instances = listConnectorInstances(config);
47
+ const composioInstances = instances.filter((instance) => instance.materialized.type === "composio" && instance.materialized.role === "toolkit");
48
+ if (composioInstances.length === 0) return c.json({
49
+ ok: true,
50
+ payload: { instances }
51
+ });
52
+ const checkedAt = (/* @__PURE__ */ new Date()).toISOString();
53
+ let connectionError;
54
+ try {
55
+ await listComposioConnections();
56
+ } catch (error) {
57
+ connectionError = errorMessage(error);
58
+ }
59
+ const probes = await Promise.all([...new Map(composioInstances.map((instance) => [instance.connectorId, instance])).values()].map(async (instance) => {
60
+ try {
61
+ const tools = await listComposioTools(instance.materialized.type === "composio" ? instance.materialized.toolkit : "", config);
62
+ return {
63
+ connectorId: instance.connectorId,
64
+ checkedAt,
65
+ toolCount: tools.length,
66
+ ...connectionError ? {
67
+ error: connectionError,
68
+ connectionError: true
69
+ } : {}
70
+ };
71
+ } catch (error) {
72
+ return {
73
+ connectorId: instance.connectorId,
74
+ checkedAt,
75
+ error: errorMessage(error)
76
+ };
77
+ }
78
+ }));
79
+ const connections = listConnectorConnections({ principalId: "local-owner" });
39
80
  return c.json({
40
81
  ok: true,
41
- payload: { instances: listConnectorInstances(config) }
82
+ payload: { instances: projectComposioRuntimeStatus(instances, connections, probes) }
42
83
  });
43
84
  });
44
85
  authenticated.get("/api/connectors/registry/search", async (c) => {
@@ -246,6 +287,7 @@ function registerConnectorRoutes(authenticated, deps) {
246
287
  const body = await c.req.json().catch(() => ({}));
247
288
  try {
248
289
  const event = await appendComposioTriggerEvent(service.currentConfig, body);
290
+ service.requestConnectorMemorySync(event.toolkit);
249
291
  return c.json({
250
292
  ok: true,
251
293
  payload: { event }
@@ -272,6 +314,54 @@ function registerConnectorRoutes(authenticated, deps) {
272
314
  }, 400);
273
315
  }
274
316
  });
317
+ authenticated.get("/api/connectors/people", (c) => {
318
+ const query = c.req.query("q") ?? "";
319
+ const limit = Number(c.req.query("limit") ?? "100");
320
+ return c.json({
321
+ ok: true,
322
+ payload: buildConnectedPeopleGraph({
323
+ query,
324
+ limit
325
+ })
326
+ });
327
+ });
328
+ authenticated.get("/api/connectors/:id/memory-sync-profile", (c) => {
329
+ const profile = getComposioMemorySyncProfile(service.currentConfig, c.req.param("id"));
330
+ return c.json({
331
+ ok: true,
332
+ payload: { profile: profile ?? null }
333
+ });
334
+ });
335
+ authenticated.patch("/api/connectors/:id/memory-sync-profile", strictRateLimitMiddleware, async (c) => {
336
+ const body = await c.req.json().catch(() => ({}));
337
+ const row = body && typeof body === "object" && !Array.isArray(body) ? body : {};
338
+ try {
339
+ const config = service.currentConfig;
340
+ const profile = updateComposioMemorySyncProfile(config, c.req.param("id"), {
341
+ enabled: row.enabled === true,
342
+ actionId: typeof row.actionId === "string" ? row.actionId : "",
343
+ arguments: row.arguments && typeof row.arguments === "object" && !Array.isArray(row.arguments) ? row.arguments : {},
344
+ agentId: typeof row.agentId === "string" ? row.agentId : "",
345
+ connectionId: typeof row.connectionId === "string" ? row.connectionId : void 0,
346
+ intervalMinutes: Number(row.intervalMinutes),
347
+ triggerSync: row.triggerSync !== false
348
+ });
349
+ const saved = await service.saveConfig(config);
350
+ if (!saved.saved) return c.json({
351
+ ok: false,
352
+ error: saved.error
353
+ }, 500);
354
+ return c.json({
355
+ ok: true,
356
+ payload: { profile }
357
+ });
358
+ } catch (error) {
359
+ return c.json({
360
+ ok: false,
361
+ error: errorMessage(error)
362
+ }, 400);
363
+ }
364
+ });
275
365
  authenticated.get("/api/connectors/:id", (c) => {
276
366
  const connectorId = c.req.param("id");
277
367
  const connector = getConnectorDefinition(connectorId);
@@ -321,15 +411,28 @@ function registerConnectorRoutes(authenticated, deps) {
321
411
  const body = await c.req.json().catch(() => ({}));
322
412
  const row = body && typeof body === "object" && !Array.isArray(body) ? body : {};
323
413
  const actionId = typeof row.actionId === "string" ? row.actionId.trim() : "";
324
- const agentId = typeof row.agentId === "string" ? row.agentId.trim() : "";
325
- if (!actionId || !agentId) return c.json({
326
- ok: false,
327
- error: "actionId and agentId are required."
328
- }, 400);
414
+ const config = service.currentConfig;
415
+ const agentId = typeof row.agentId === "string" && row.agentId.trim() ? row.agentId.trim() : resolveDefaultAgentId(config);
329
416
  try {
417
+ const connectorId = c.req.param("id");
418
+ if (getConnectorDefinition(connectorId)?.runtime.type === "memorySource") {
419
+ const result = await syncLocalFolderToMemory({
420
+ config,
421
+ connectorId,
422
+ agentId
423
+ });
424
+ return c.json({
425
+ ok: true,
426
+ payload: result
427
+ });
428
+ }
429
+ if (!actionId) return c.json({
430
+ ok: false,
431
+ error: "actionId is required for Composio memory sync."
432
+ }, 400);
330
433
  const result = await syncComposioResultToMemory({
331
- config: service.currentConfig,
332
- connectorId: c.req.param("id"),
434
+ config,
435
+ connectorId,
333
436
  actionId,
334
437
  agentId,
335
438
  connectionId: typeof row.connectionId === "string" ? row.connectionId : void 0,
@@ -463,6 +566,29 @@ function registerConnectorRoutes(authenticated, deps) {
463
566
  }, 400);
464
567
  }
465
568
  });
569
+ authenticated.get("/api/connectors/composio/setup-status", async (c) => {
570
+ const configured = Boolean(await resolveComposioApiKey());
571
+ return c.json({
572
+ ok: true,
573
+ payload: { configured }
574
+ });
575
+ });
576
+ authenticated.post("/api/connectors/composio/setup", strictRateLimitMiddleware, async (c) => {
577
+ const body = await c.req.json().catch(() => ({}));
578
+ const apiKey = body && typeof body === "object" && !Array.isArray(body) ? String(body.apiKey ?? "") : "";
579
+ try {
580
+ await configureComposioApiKey(apiKey);
581
+ return c.json({
582
+ ok: true,
583
+ payload: { configured: true }
584
+ });
585
+ } catch (error) {
586
+ return c.json({
587
+ ok: false,
588
+ error: errorMessage(error)
589
+ }, 400);
590
+ }
591
+ });
466
592
  authenticated.post("/api/connectors/:id/install", strictRateLimitMiddleware, async (c) => {
467
593
  const connectorId = c.req.param("id");
468
594
  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
  */
@@ -2,3 +2,5 @@ export * from './types.js';
2
2
  export * from './ingestion-service.js';
3
3
  export * from './connected-knowledge-pipeline.js';
4
4
  export * from './coordinator.js';
5
+ export * from './local-folder-adapter.js';
6
+ export * from './people-graph.js';
@@ -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
- export { ConnectedKnowledgePipeline, KnowledgeIngestionService, SqliteKnowledgeSourceStateStore, startConnectedKnowledgeCoordinator };
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 stored = upsertKnowledgeSourceItems(pulled.items);
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;