@xopcai/xopc 0.0.208 → 0.0.210

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 (182) 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/{activity-store-D0mYZqhc.js → activity-store-JLmEb1p0.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-MWLQWL_i.js → agent-avatar-dicebear-CI1zQfzY.js} +1 -1
  5. package/dist/gateway/static/root/assets/agents-DqGMj3QJ.js +68 -0
  6. package/dist/gateway/static/root/assets/{api-DZA1yVzM.js → api-C6MmWfcb.js} +1 -1
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-B2X6quAF.js → app-management-settings-panel-Cd02GGpV.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-BZW-c38q.js → appearance-settings-Db-h2I3G.js} +1 -1
  9. package/dist/gateway/static/root/assets/apps-page-BT7F4WBI.js +1 -0
  10. package/dist/gateway/static/root/assets/{archive-plugin-CK-gsjsJ.js → archive-plugin-CMHzJT2a.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-EJGP4rCw.js → attachment-load-BzhI2LoH.js} +1 -1
  12. package/dist/gateway/static/root/assets/automations-page-CwOXGV9z.js +6 -0
  13. package/dist/gateway/static/root/assets/{binary-plugins-Tbss_4P-.js → binary-plugins-DsUeHvZO.js} +1 -1
  14. package/dist/gateway/static/root/assets/{block-editor-C-dOWigw.js → block-editor-CFfsIeZ4.js} +47 -47
  15. package/dist/gateway/static/root/assets/{browser-settings-page-NlvDyMwD.js → browser-settings-page-CyRLhCod.js} +4 -4
  16. package/dist/gateway/static/root/assets/{browser-workflow-inputs-DW06Zo1N.js → browser-workflow-inputs-BiWghvJ0.js} +1 -1
  17. package/dist/gateway/static/root/assets/{browser-workflows-page-B6RnRGwm.js → browser-workflows-page-DPLdT6Zn.js} +1 -1
  18. package/dist/gateway/static/root/assets/capabilities-settings-panel-jRKcS7lZ.js +7 -0
  19. package/dist/gateway/static/root/assets/{capability-presets-api-Cc3BtQar.js → capability-presets-api-CTxGFvsS.js} +1 -1
  20. package/dist/gateway/static/root/assets/{capability-presets-settings-panel-D0loEbzq.js → capability-presets-settings-panel-B3bKdtwU.js} +2 -2
  21. package/dist/gateway/static/root/assets/{channel-recipient-api-BvZO5FaO.js → channel-recipient-api-BklVUOxC.js} +1 -1
  22. package/dist/gateway/static/root/assets/channels-settings-yZBWH02s.js +1 -0
  23. package/dist/gateway/static/root/assets/channels-status-swr-C3zlimZd.js +1 -0
  24. package/dist/gateway/static/root/assets/chat-terminal-dock-0F4Jmma2.js +36 -0
  25. package/dist/gateway/static/root/assets/{connectors-api-CUl6_EQJ.js → connectors-api-BvIZ51ty.js} +1 -1
  26. package/dist/gateway/static/root/assets/connectors-page-OX4KvUkA.js +2 -0
  27. package/dist/gateway/static/root/assets/{cron-expression-BD9MgoE_.js → cron-expression-BHmwaMbO.js} +1 -1
  28. package/dist/gateway/static/root/assets/{date-picker-ChqNmoxw.js → date-picker-fj_pPCv5.js} +1 -1
  29. package/dist/gateway/static/root/assets/{dependency-picker-CDUmFs6H.js → dependency-picker-DsWvwOv-.js} +1 -1
  30. package/dist/gateway/static/root/assets/{desktop-pet-D61gqxaD.js → desktop-pet-mjkF0Xxh.js} +1 -1
  31. package/dist/gateway/static/root/assets/{desktop-pet-settings-QvuJvIX_.js → desktop-pet-settings-ClwUpRYu.js} +1 -1
  32. package/dist/gateway/static/root/assets/{directory-picker-path-field-DvXMvDNY.js → directory-picker-path-field-OkqRFyRL.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-debug-page-DMdVTAQ3.js → extension-debug-page-DC69wplH.js} +1 -1
  34. package/dist/gateway/static/root/assets/{extension-page-BNzxZtaK.js → extension-page-DCtk6zdJ.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-settings-page-DoEfyizU.js → extension-settings-page-Bkm4zzv-.js} +1 -1
  36. package/dist/gateway/static/root/assets/{gateway-config-api-o7AKvthC.js → gateway-config-api-Dr_NQt7v.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-config-swr-BQbkUP5X.js → gateway-config-swr-CEfv8N1J.js} +1 -1
  38. package/dist/gateway/static/root/assets/gateway-settings-V1XVxjHa.js +1 -0
  39. package/dist/gateway/static/root/assets/{gateway-startup-retry-DIgdpHgk.js → gateway-startup-retry-B8hebJ7s.js} +1 -1
  40. package/dist/gateway/static/root/assets/{heartbeat-settings-UZAn1aAQ.js → heartbeat-settings-CWUBAQrE.js} +1 -1
  41. package/dist/gateway/static/root/assets/home-page-D57cYRd3.js +1 -0
  42. package/dist/gateway/static/root/assets/index-DJ7HSgKs.js +85 -0
  43. package/dist/gateway/static/root/assets/index-PNBFdxHb.css +2 -0
  44. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-4xaM3jjU.js → keyboard-shortcuts-settings-DCQvf05d.js} +1 -1
  45. package/dist/gateway/static/root/assets/{local-app-workbench-page-D9bguWRo.js → local-app-workbench-page-BbAiMZE1.js} +2 -2
  46. package/dist/gateway/static/root/assets/{local-apps-page-C1xDicdr.js → local-apps-page-B3Ugd0my.js} +1 -1
  47. package/dist/gateway/static/root/assets/{locale-store-pByvK12G.js → locale-store-hDBVeG3G.js} +1 -1
  48. package/dist/gateway/static/root/assets/{logs-page-Gr-nE4nW.js → logs-page-nXdF3wOT.js} +1 -1
  49. package/dist/gateway/static/root/assets/{management-settings-D1XdHm7v.js → management-settings-C-S5Llq3.js} +1 -1
  50. package/dist/gateway/static/root/assets/{markdown-split-B_Ijq1Fr.js → markdown-split-DuVq37Uh.js} +1 -1
  51. package/dist/gateway/static/root/assets/{markdown-view-CyJlGUxB.js → markdown-view-D8eO_6h3.js} +1 -1
  52. package/dist/gateway/static/root/assets/{media-plugins-CXXNRROJ.js → media-plugins-C1V6pkX3.js} +1 -1
  53. package/dist/gateway/static/root/assets/messages-1qg_hOOd.js +3 -0
  54. package/dist/gateway/static/root/assets/{notes-page-rkePB4CB.js → notes-page-Dn71ZV8c.js} +1 -1
  55. package/dist/gateway/static/root/assets/notes-workbench-BYPoZeRw.js +4 -0
  56. package/dist/gateway/static/root/assets/{page-tabs-gw-RMQCV.js → page-tabs-B5a5aSoS.js} +1 -1
  57. package/dist/gateway/static/root/assets/{preview-open-alternatives-B8aMScJ2.js → preview-open-alternatives-5041AIBX.js} +1 -1
  58. package/dist/gateway/static/root/assets/{product-open-page-CjcpkWAz.js → product-open-page-7UkouFQU.js} +1 -1
  59. package/dist/gateway/static/root/assets/project-detail-page-D27nOKbo.js +1 -0
  60. package/dist/gateway/static/root/assets/{projects-page-DPRxKGbs.js → projects-page-CdB5cJJ-.js} +1 -1
  61. package/dist/gateway/static/root/assets/remote-access-hub-DFoZ3UNS.js +1 -0
  62. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-Ch5qq86o.js → runtime-tools-settings-panel-DvaXzHYS.js} +1 -1
  63. package/dist/gateway/static/root/assets/{schema-form-DHYWYUFt.js → schema-form-Dlxl_5X0.js} +1 -1
  64. package/dist/gateway/static/root/assets/sessions-page-C1cbIcJ7.js +1 -0
  65. package/dist/gateway/static/root/assets/settings-advanced-gate-DnXRlQXS.js +1 -0
  66. package/dist/gateway/static/root/assets/{settings-form-section-DlzZx0-i.js → settings-form-section-CSaiuuer.js} +1 -1
  67. package/dist/gateway/static/root/assets/{settings-loading-skeleton-BVLhreQi.js → settings-loading-skeleton-H3mJwt3r.js} +1 -1
  68. package/dist/gateway/static/root/assets/{settings-page-BJU-kUnN.js → settings-page-Cs7zA4BS.js} +1 -1
  69. package/dist/gateway/static/root/assets/setup-status-panel-CwgMODfJ.js +1 -0
  70. package/dist/gateway/static/root/assets/{share-preview-page-hvIuZXMe.js → share-preview-page-Bdpw5m7M.js} +1 -1
  71. package/dist/gateway/static/root/assets/shares-settings-hlUgIkrp.js +1 -0
  72. package/dist/gateway/static/root/assets/skill-reload-api-DR31B_Gz.js +1 -0
  73. package/dist/gateway/static/root/assets/{skills-page-Dlvuh7D-.js → skills-page-Bup3Lg1Z.js} +1 -1
  74. package/dist/gateway/static/root/assets/{skills-page.utils-B6ddOpnf.js → skills-page.utils-D22ORR21.js} +1 -1
  75. package/dist/gateway/static/root/assets/{system-settings-panel-BdbCAyoA.js → system-settings-panel-GmtWsfjB.js} +1 -1
  76. package/dist/gateway/static/root/assets/task-detail-page-CTKDpxhf.js +1 -0
  77. package/dist/gateway/static/root/assets/{theme-store-BtdGacMI.js → theme-store-CtY8RwMX.js} +1 -1
  78. package/dist/gateway/static/root/assets/{typed-models-lib-CL6qHYJA.js → typed-models-lib-C2aOdlEA.js} +1 -1
  79. package/dist/gateway/static/root/assets/{use-autosave-DysNnqCS.js → use-autosave-DOj5i8d_.js} +1 -1
  80. package/dist/gateway/static/root/assets/{user-context-page-Bwg4KV8B.js → user-context-page-keJJYpix.js} +1 -1
  81. package/dist/gateway/static/root/assets/{voice-api-key-field-UEsO9Jr-.js → voice-api-key-field-5WfurWYa.js} +1 -1
  82. package/dist/gateway/static/root/assets/{work-discovery-overlay-B9disASf.js → work-discovery-overlay-D5_MH3n3.js} +1 -1
  83. package/dist/gateway/static/root/assets/{work-discovery-page-CmPfOfHl.js → work-discovery-page-BcvBiebt.js} +1 -1
  84. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-A0zTQHFQ.js → workflow-run-setup-panel-bBA8LinI.js} +1 -1
  85. package/dist/gateway/static/root/assets/workflows-page-Cz2VpWdj.js +5 -0
  86. package/dist/gateway/static/root/index.html +9 -9
  87. package/dist/package.js +1 -1
  88. package/dist/src/agent/agent-manager.js +2 -2
  89. package/dist/src/agent/background-review/coordinator.d.ts +1 -1
  90. package/dist/src/agent/background-review/coordinator.js +4 -5
  91. package/dist/src/agent/background-review/run-background-review.js +0 -1
  92. package/dist/src/agent/background-review/settings.d.ts +1 -2
  93. package/dist/src/agent/background-review/settings.js +3 -4
  94. package/dist/src/agent/external-tools/composio-provider.js +8 -4
  95. package/dist/src/agent/memory/builtin-provider.js +1 -1
  96. package/dist/src/agent/memory/create-memory-manager.js +1 -1
  97. package/dist/src/agent/memory/manager.js +2 -0
  98. package/dist/src/agent/memory/sensitivity.js +1 -1
  99. package/dist/src/agent/memory/understanding/service.js +43 -19
  100. package/dist/src/agent/memory/user-context-coordinator.js +1 -1
  101. package/dist/src/agent-runtime/index.js +1 -1
  102. package/dist/src/agent-runtime/runtime-profile.js +1 -1
  103. package/dist/src/automations/domain/validation.d.ts +7 -7
  104. package/dist/src/automations/draft/automation-draft-validator.d.ts +2 -2
  105. package/dist/src/connectors/auth-provider-registry.d.ts +2 -1
  106. package/dist/src/connectors/auth-provider-registry.js +5 -2
  107. package/dist/src/connectors/composio-sessions.d.ts +38 -0
  108. package/dist/src/connectors/composio-sessions.js +64 -6
  109. package/dist/src/connectors/composio.d.ts +4 -1
  110. package/dist/src/connectors/composio.js +26 -4
  111. package/dist/src/connectors/runtime-adapter-registry.js +14 -1
  112. package/dist/src/gateway/heartbeat/service.js +1 -1
  113. package/dist/src/gateway/hono/routes/agent-stream.js +4 -1
  114. package/dist/src/gateway/hono/routes/connectors.js +15 -2
  115. package/dist/src/gateway/hono/routes/session-input-handler.d.ts +60 -0
  116. package/dist/src/gateway/hono/routes/session-input-handler.js +75 -1
  117. package/dist/src/gateway/service/agent-runner.d.ts +9 -1
  118. package/dist/src/gateway/service/agent-runner.js +9 -0
  119. package/dist/src/gateway/service/session-input-coordinator.d.ts +12 -0
  120. package/dist/src/gateway/service/session-input-coordinator.js +64 -6
  121. package/dist/src/gateway/service.d.ts +8 -0
  122. package/dist/src/gateway/service.js +8 -5
  123. package/dist/src/heartbeat/index.js +1 -1
  124. package/dist/src/retrieval/audit.d.ts +1 -0
  125. package/dist/src/retrieval/audit.js +8 -0
  126. package/dist/src/retrieval/candidateFusion.d.ts +5 -0
  127. package/dist/src/retrieval/candidateFusion.js +20 -0
  128. package/dist/src/retrieval/queryProfile.d.ts +16 -0
  129. package/dist/src/retrieval/queryProfile.js +66 -0
  130. package/dist/src/retrieval/textFeatures.d.ts +5 -0
  131. package/dist/src/retrieval/textFeatures.js +71 -0
  132. package/dist/src/session/client-history.d.ts +1 -0
  133. package/dist/src/session/client-history.js +4 -0
  134. package/dist/src/session/index.js +1 -1
  135. package/dist/src/session/store.js +1 -1
  136. package/dist/src/storage/sqlite/fts.d.ts +0 -4
  137. package/dist/src/storage/sqlite/fts.js +2 -49
  138. package/dist/src/storage/sqlite/index.d.ts +3 -2
  139. package/dist/src/storage/sqlite/index.js +6 -5
  140. package/dist/src/storage/sqlite/memory-records-repository.js +60 -38
  141. package/dist/src/storage/sqlite/row-mappers.js +2 -2
  142. package/dist/src/storage/sqlite/session-repository.js +2 -2
  143. package/dist/src/storage/sqlite/session-turn-replace-repository.d.ts +34 -0
  144. package/dist/src/storage/sqlite/session-turn-replace-repository.js +110 -0
  145. package/dist/src/storage/sqlite/transcript-repository.js +1 -1
  146. package/dist/src/storage/sqlite/user-context-quality-repository.d.ts +7 -0
  147. package/dist/src/storage/sqlite/user-context-quality-repository.js +25 -1
  148. package/dist/src/storage/sqlite/user-context-repository.d.ts +4 -0
  149. package/dist/src/storage/sqlite/user-context-repository.js +29 -3
  150. package/dist/src/tasks/home-query-service.d.ts +3 -1
  151. package/dist/src/tasks/home-query-service.js +73 -70
  152. package/dist/src/tui/backends/embedded-backend.js +1 -1
  153. package/dist/src/user-context/planner.d.ts +1 -0
  154. package/dist/src/user-context/planner.js +16 -29
  155. package/dist/src/user-context/retriever.d.ts +15 -0
  156. package/dist/src/user-context/retriever.js +65 -0
  157. package/dist/src/user-context/scope.d.ts +7 -0
  158. package/dist/src/user-context/scope.js +9 -0
  159. package/package.json +1 -1
  160. package/dist/gateway/static/root/assets/agents-Bl8FQZxW.js +0 -68
  161. package/dist/gateway/static/root/assets/apps-page-CRUgTO10.js +0 -1
  162. package/dist/gateway/static/root/assets/automations-page-DrSwolhG.js +0 -6
  163. package/dist/gateway/static/root/assets/capabilities-settings-panel-BWXUznw5.js +0 -7
  164. package/dist/gateway/static/root/assets/channels-settings-CcivCw8U.js +0 -1
  165. package/dist/gateway/static/root/assets/channels-status-swr-DkHAD2Zn.js +0 -1
  166. package/dist/gateway/static/root/assets/chat-terminal-dock-DVedGAeX.js +0 -36
  167. package/dist/gateway/static/root/assets/connectors-page-DlBSlfkv.js +0 -2
  168. package/dist/gateway/static/root/assets/gateway-settings-TO5YYZ9a.js +0 -1
  169. package/dist/gateway/static/root/assets/home-page-CRJDpy5E.js +0 -3
  170. package/dist/gateway/static/root/assets/index-BSjP0Wsx.css +0 -2
  171. package/dist/gateway/static/root/assets/index-C2ZYFBGL.js +0 -85
  172. package/dist/gateway/static/root/assets/messages-yG5P43Q9.js +0 -3
  173. package/dist/gateway/static/root/assets/notes-workbench-CpbD4XG2.js +0 -4
  174. package/dist/gateway/static/root/assets/project-detail-page-GvSYDbjR.js +0 -1
  175. package/dist/gateway/static/root/assets/remote-access-hub-WIzeu-gB.js +0 -1
  176. package/dist/gateway/static/root/assets/sessions-page-2XEJM0YE.js +0 -1
  177. package/dist/gateway/static/root/assets/settings-advanced-gate-g1GThZ0O.js +0 -1
  178. package/dist/gateway/static/root/assets/setup-status-panel-C6qj2L-q.js +0 -1
  179. package/dist/gateway/static/root/assets/shares-settings-BBpE1bep.js +0 -1
  180. package/dist/gateway/static/root/assets/skill-reload-api-DXORBJNk.js +0 -1
  181. package/dist/gateway/static/root/assets/task-detail-page-DC0hc8hp.js +0 -1
  182. package/dist/gateway/static/root/assets/workflows-page-DhQNh7W6.js +0 -5
@@ -1,5 +1,6 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
+ import { retrievalQueryAuditValue } from "../../retrieval/audit.js";
3
4
  import { setKnowledgeSourceItemSynthesisStatus } from "../../storage/sqlite/knowledge-repository.js";
4
5
  import { appendMemoryTraceEvent } from "../../storage/sqlite/memory-records-repository.js";
5
6
  import "../../storage/sqlite/index.js";
@@ -475,6 +476,7 @@ function writeTargetForRecord(request) {
475
476
  function sanitizeTraceRequest(request) {
476
477
  if (!request || typeof request !== "object") return request;
477
478
  const copy = { ...request };
479
+ if (typeof copy.query === "string") copy.query = retrievalQueryAuditValue(copy.query);
478
480
  if (typeof copy.content === "string" && copy.content.length > 500) copy.content = `${copy.content.slice(0, 500)}…`;
479
481
  return copy;
480
482
  }
@@ -5,7 +5,7 @@ function inferMemorySensitivity(content) {
5
5
  return /家庭|住址|生日|健康|关系|family|address|birthday|health/i.test(content) ? "personal" : "normal";
6
6
  }
7
7
  function redactSensitiveMemoryText(content) {
8
- return content.replace(/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g, "[REDACTED PRIVATE KEY]").replace(/\b(api[_-]?key|access[_-]?key|token|password|secret|credential|private[_-]?key|bearer)\b\s*[:=]?\s*[^\s,;]+/gi, "$1=[REDACTED]").replace(/(密钥|密码|令牌|私钥)\s*[::=]?\s*[^\s,;]+/g, "$1=[REDACTED]").replace(/\b(?:sk|gh[opsu]|xox[abprs])-[a-z0-9_-]{8,}\b/gi, "[REDACTED TOKEN]").replace(/\bAKIA[A-Z0-9]{12,}\b/g, "[REDACTED ACCESS KEY]");
8
+ return content.replace(/-----BEGIN [A-Z ]*PRIVATE KEY-----[\s\S]*?-----END [A-Z ]*PRIVATE KEY-----/g, "[REDACTED PRIVATE KEY]").replace(/\b(api[_-]?key|access[_-]?key|token|password|secret|credential|private[_-]?key|bearer)\b\s*[:=]?\s*[^\s,;]+/gi, "$1=[REDACTED]").replace(/(密钥|密码|令牌|私钥)\s*[::=]?\s*[^\s,;]+/g, "$1=[REDACTED]").replace(/\b(?:sk|gh[opsu]|xox[abprs])-[a-z0-9_-]{8,}\b/gi, "[REDACTED TOKEN]").replace(/\bAKIA[A-Z0-9]{12,}\b/g, "[REDACTED ACCESS KEY]").replace(/\b(ssn|social security|bank account|credit card|medical record)\b(?:\s+(?:is|number))?\s*[:=]?\s*[^\s,;]+/gi, "$1=[REDACTED]").replace(/(身份证|银行卡|信用卡|医疗记录)\s*(?:是|号码)?\s*[::=]?\s*[^\s,;]+/g, "$1=[REDACTED]");
9
9
  }
10
10
  //#endregion
11
11
  export { inferMemorySensitivity, redactSensitiveMemoryText };
@@ -103,31 +103,63 @@ var UserUnderstandingService = class {
103
103
  rejected: 0,
104
104
  createdRecords: []
105
105
  };
106
+ const safeCandidates = candidates.filter((candidate) => {
107
+ const content = normalizeContent(candidate.content);
108
+ const sensitivity = effectiveSensitivity(candidate.sensitivity, content);
109
+ return sensitivity !== "secret" && sensitivity !== "regulated";
110
+ });
111
+ if (!safeCandidates.length) return {
112
+ proposed: candidates.length,
113
+ created: 0,
114
+ deduplicated: 0,
115
+ rejected: candidates.length,
116
+ createdRecords: []
117
+ };
106
118
  const evidence = createContextEvidence({
107
119
  sourceType: "conversation",
108
120
  sourceRef: params.sessionKey ? `session:${params.sessionKey}:turn:${params.turnId ?? "unknown"}` : `turn:${params.turnId ?? "unknown"}`,
109
- redactedExcerpt: redactSensitiveMemoryText(params.userContent).slice(0, MAX_CANDIDATE_CHARS),
121
+ redactedExcerpt: redactSensitiveMemoryText(safeCandidates.map((candidate) => candidate.content).join("\n")).slice(0, MAX_CANDIDATE_CHARS),
110
122
  trustLevel: "owner",
111
123
  observedAt: Date.now()
112
124
  });
125
+ const result = await this.applyCandidates(safeCandidates, {
126
+ sessionKey: params.sessionKey,
127
+ workspaceId: params.workspaceId,
128
+ projectId: params.projectId,
129
+ evidenceIds: [evidence.id],
130
+ reviewSource: "turn",
131
+ supersedesRecordIds: params.correctionTargetRecordIds
132
+ });
113
133
  return {
114
- ...await this.applyCandidates(candidates, {
115
- sessionKey: params.sessionKey,
116
- workspaceId: params.workspaceId,
117
- projectId: params.projectId,
118
- evidenceIds: [evidence.id],
119
- reviewSource: "turn",
120
- supersedesRecordIds: params.correctionTargetRecordIds
121
- }),
134
+ ...result,
135
+ proposed: candidates.length,
136
+ rejected: result.rejected + candidates.length - safeCandidates.length,
122
137
  sourceItemId: evidence.id
123
138
  };
124
139
  }
125
140
  async applyCandidates(candidates, context) {
126
141
  let created = 0;
127
142
  let deduplicated = 0;
128
- let rejected = 0;
129
143
  const createdRecords = [];
130
144
  const correctionTarget = context.supersedesRecordIds?.length === 1 ? context.supersedesRecordIds[0] : void 0;
145
+ const eligible = candidates.slice(0, 10).map((candidate) => {
146
+ const content = normalizeContent(candidate.content);
147
+ return {
148
+ candidate,
149
+ content,
150
+ sensitivity: effectiveSensitivity(candidate.sensitivity, content),
151
+ scope: scopeForCandidate(candidate, context),
152
+ key: candidate.canonicalKey ?? canonicalUnderstandingKey(candidate.kind, content)
153
+ };
154
+ }).filter(({ candidate, content, sensitivity, scope, key }) => content.length >= 4 && candidate.confidence >= .55 && sensitivity !== "secret" && sensitivity !== "regulated" && !isUnderstandingSuppressed(key, scope));
155
+ let rejected = candidates.length - eligible.length;
156
+ if (!eligible.length) return {
157
+ proposed: candidates.length,
158
+ created,
159
+ deduplicated,
160
+ rejected,
161
+ createdRecords
162
+ };
131
163
  const evidenceIds = [...new Set(context.evidenceIds ?? [])];
132
164
  const sourceItemIds = [context.sourceItemId, ...context.sourceItemIds ?? []].filter((value) => Boolean(value));
133
165
  for (const sourceItemId of [...new Set(sourceItemIds)]) {
@@ -141,15 +173,7 @@ var UserUnderstandingService = class {
141
173
  });
142
174
  evidenceIds.push(evidence.id);
143
175
  }
144
- for (const candidate of candidates.slice(0, 10)) {
145
- const content = normalizeContent(candidate.content);
146
- const sensitivity = effectiveSensitivity(candidate.sensitivity, content);
147
- const scope = scopeForCandidate(candidate, context);
148
- const key = candidate.canonicalKey ?? canonicalUnderstandingKey(candidate.kind, content);
149
- if (content.length < 4 || candidate.confidence < .55 || sensitivity === "secret" || sensitivity === "regulated" || isUnderstandingSuppressed(key, scope)) {
150
- rejected += 1;
151
- continue;
152
- }
176
+ for (const { candidate, content, sensitivity, scope, key } of eligible) {
153
177
  const duplicate = findDuplicateUnderstanding(listUnderstandings(), {
154
178
  kind: candidate.kind,
155
179
  statement: content,
@@ -43,8 +43,8 @@ var UserContextCoordinator = class {
43
43
  consentRequests: [],
44
44
  estimatedTokens: 0
45
45
  });
46
- const config = this.options.getConfig();
47
46
  if (!this.options.isEnabledForSession(sessionKey)) return empty();
47
+ const config = this.options.getConfig();
48
48
  if (!isPrivateSession(sessionKey)) return empty();
49
49
  const userQuery = extractAgentUserPlainText(userMessage);
50
50
  const taskContext = assembleTaskContext(sessionKey, userQuery);
@@ -1,7 +1,7 @@
1
- import { buildMemoryRuntime } from "./memory-runtime.js";
2
1
  import { checkBoundary } from "./boundary-guard.js";
3
2
  import { resolveModelRole } from "./model-router.js";
4
3
  import { buildRuntimeToolRegistry } from "./tool-registry.js";
4
+ import { buildMemoryRuntime } from "./memory-runtime.js";
5
5
  import { resolveWorkflow, validateWorkflowForRuntime } from "./workflow-runtime.js";
6
6
  import { buildAgentRuntimeProfile } from "./runtime-profile.js";
7
7
  import { appendAgentRunEvent, createAgentRunTrace, finishAgentRunTrace, hashEffectiveManifest } from "./run-trace.js";
@@ -1,9 +1,9 @@
1
1
  import { buildAgentManifestPromptSection } from "../agent-manifest/prompt.js";
2
2
  import "../agent-manifest/index.js";
3
- import { buildMemoryRuntime } from "./memory-runtime.js";
4
3
  import { checkBoundary } from "./boundary-guard.js";
5
4
  import { resolveModelRole } from "./model-router.js";
6
5
  import { buildRuntimeToolRegistry } from "./tool-registry.js";
6
+ import { buildMemoryRuntime } from "./memory-runtime.js";
7
7
  import { resolveWorkflow, validateWorkflowForRuntime } from "./workflow-runtime.js";
8
8
  //#region src/agent-runtime/runtime-profile.ts
9
9
  function buildAgentRuntimeProfile(params) {
@@ -117,8 +117,8 @@ export declare const AutomationActionSchema: z.ZodDiscriminatedUnion<[z.ZodObjec
117
117
  type: z.ZodLiteral<"add_wait">;
118
118
  wait: z.ZodObject<{
119
119
  kind: z.ZodEnum<{
120
- paused: "paused";
121
120
  approval: "approval";
121
+ paused: "paused";
122
122
  dependency: "dependency";
123
123
  user_input: "user_input";
124
124
  external_event: "external_event";
@@ -294,8 +294,8 @@ export declare const AutomationSchema: z.ZodObject<{
294
294
  type: z.ZodLiteral<"add_wait">;
295
295
  wait: z.ZodObject<{
296
296
  kind: z.ZodEnum<{
297
- paused: "paused";
298
297
  approval: "approval";
298
+ paused: "paused";
299
299
  dependency: "dependency";
300
300
  user_input: "user_input";
301
301
  external_event: "external_event";
@@ -341,8 +341,8 @@ export declare const AutomationSchema: z.ZodObject<{
341
341
  continuous: "continuous";
342
342
  }>>;
343
343
  notificationPolicy: z.ZodDefault<z.ZodEnum<{
344
- none: "none";
345
344
  all: "all";
345
+ none: "none";
346
346
  attention: "attention";
347
347
  }>>;
348
348
  completionWebhookUrl: z.ZodPreprocess<z.ZodOptional<z.ZodString>>;
@@ -456,8 +456,8 @@ export declare const CreateAutomationSchema: z.ZodObject<{
456
456
  type: z.ZodLiteral<"add_wait">;
457
457
  wait: z.ZodObject<{
458
458
  kind: z.ZodEnum<{
459
- paused: "paused";
460
459
  approval: "approval";
460
+ paused: "paused";
461
461
  dependency: "dependency";
462
462
  user_input: "user_input";
463
463
  external_event: "external_event";
@@ -536,8 +536,8 @@ export declare const CreateAutomationSchema: z.ZodObject<{
536
536
  continuous: "continuous";
537
537
  }>>;
538
538
  notificationPolicy: z.ZodDefault<z.ZodEnum<{
539
- none: "none";
540
539
  all: "all";
540
+ none: "none";
541
541
  attention: "attention";
542
542
  }>>;
543
543
  completionWebhookUrl: z.ZodPreprocess<z.ZodOptional<z.ZodString>>;
@@ -645,8 +645,8 @@ export declare const UpdateAutomationSchema: z.ZodObject<{
645
645
  type: z.ZodLiteral<"add_wait">;
646
646
  wait: z.ZodObject<{
647
647
  kind: z.ZodEnum<{
648
- paused: "paused";
649
648
  approval: "approval";
649
+ paused: "paused";
650
650
  dependency: "dependency";
651
651
  user_input: "user_input";
652
652
  external_event: "external_event";
@@ -741,8 +741,8 @@ export declare const UpdateAutomationSchema: z.ZodObject<{
741
741
  continuous: "continuous";
742
742
  }>>>;
743
743
  notificationPolicy: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
744
- none: "none";
745
744
  all: "all";
745
+ none: "none";
746
746
  attention: "attention";
747
747
  }>>>;
748
748
  completionWebhookUrl: z.ZodOptional<z.ZodPreprocess<z.ZodOptional<z.ZodString>>>;
@@ -12,7 +12,7 @@ export declare function buildAutomationDraftResponse(draft: GeneratedAutomationD
12
12
  automation: {
13
13
  name: string;
14
14
  conversationMode: "new_session" | "continuous";
15
- notificationPolicy: "none" | "all" | "attention";
15
+ notificationPolicy: "all" | "none" | "attention";
16
16
  projectId?: string;
17
17
  action?: {
18
18
  kind: "agent";
@@ -79,7 +79,7 @@ export declare function buildAutomationDraftResponse(draft: GeneratedAutomationD
79
79
  } | {
80
80
  type: "add_wait";
81
81
  wait: {
82
- kind: "paused" | "approval" | "dependency" | "user_input" | "external_event" | "scheduled_time" | "retry_backoff";
82
+ kind: "approval" | "paused" | "dependency" | "user_input" | "external_event" | "scheduled_time" | "retry_backoff";
83
83
  reason: string;
84
84
  condition: Record<string, unknown>;
85
85
  resumeAt?: number;
@@ -1,3 +1,4 @@
1
+ import type { Config } from '../config/schema.js';
1
2
  import type { ConnectorDefinition } from './types.js';
2
3
  export type ConnectorAuthStartResult = {
3
4
  connectorId: string;
@@ -6,4 +7,4 @@ export type ConnectorAuthStartResult = {
6
7
  authorizationUrl?: string;
7
8
  connectionId?: string;
8
9
  };
9
- export declare function startConnectorAuthorization(definition: ConnectorDefinition): Promise<ConnectorAuthStartResult>;
10
+ export declare function startConnectorAuthorization(definition: ConnectorDefinition, config?: Config): Promise<ConnectorAuthStartResult>;
@@ -1,8 +1,11 @@
1
1
  import { startComposioAuthorize } from "./composio.js";
2
+ import { getConnectorInstance } from "./instances.js";
2
3
  //#region src/connectors/auth-provider-registry.ts
3
- async function startConnectorAuthorization(definition) {
4
+ async function startConnectorAuthorization(definition, config) {
4
5
  if (definition.auth.mode !== "oauth" || definition.auth.provider !== "composio" || definition.runtime.type !== "composio" || definition.runtime.role !== "toolkit") throw new Error(`Connector "${definition.id}" does not support Composio authorization.`);
5
- const authorization = await startComposioAuthorize(definition.id, definition.runtime.toolkit);
6
+ const configuredAuthConfigId = config ? getConnectorInstance(config, definition.id)?.config?.authConfigId : void 0;
7
+ const authConfigId = typeof configuredAuthConfigId === "string" && configuredAuthConfigId.trim() ? configuredAuthConfigId.trim() : void 0;
8
+ const authorization = await startComposioAuthorize(definition.id, definition.runtime.toolkit, void 0, authConfigId);
6
9
  return {
7
10
  connectorId: definition.id,
8
11
  provider: "composio",
@@ -17,6 +17,20 @@ export type ComposioAuthorizeResult = {
17
17
  connectUrl?: string;
18
18
  status: string;
19
19
  };
20
+ export type ComposioAuthConfigOption = {
21
+ id: string;
22
+ name: string;
23
+ status: 'ENABLED' | 'DISABLED';
24
+ authScheme?: string;
25
+ isComposioManaged: boolean;
26
+ isEnabledForToolRouter: boolean;
27
+ };
28
+ export type ComposioToolkitAuthState = {
29
+ toolkit: string;
30
+ managedAuthAvailable: boolean;
31
+ requiresCustomAuthConfig: boolean;
32
+ authConfigs: ComposioAuthConfigOption[];
33
+ };
20
34
  type SessionToolkitResponse = {
21
35
  items: Array<{
22
36
  slug: string;
@@ -69,12 +83,34 @@ export type ComposioSessionsClient = {
69
83
  delete(id: string): Promise<unknown>;
70
84
  refresh(id: string): Promise<unknown>;
71
85
  };
86
+ authConfigs?: {
87
+ list(query?: {
88
+ toolkit?: string;
89
+ showDisabled?: boolean;
90
+ }): Promise<{
91
+ items: Array<{
92
+ id: string;
93
+ name: string;
94
+ status: 'ENABLED' | 'DISABLED';
95
+ authScheme?: string;
96
+ isComposioManaged?: boolean;
97
+ isEnabledForToolRouter?: boolean;
98
+ }>;
99
+ }>;
100
+ };
101
+ toolkits?: {
102
+ get(slug: string): Promise<{
103
+ composioManagedAuthSchemes?: string[];
104
+ authConfigDetails?: unknown[];
105
+ }>;
106
+ };
72
107
  };
73
108
  export type ComposioSessionContext = {
74
109
  principalId: string;
75
110
  installationScope?: string;
76
111
  providerPrincipalId?: string;
77
112
  toolkits?: string[];
113
+ authConfigs?: Record<string, string>;
78
114
  connectedAccounts?: Record<string, string[]>;
79
115
  callbackUrl?: string;
80
116
  };
@@ -88,9 +124,11 @@ export declare class ComposioSessionsAdapter {
88
124
  clientFactory?: ClientFactory;
89
125
  });
90
126
  createSession(context: ComposioSessionContext): Promise<ComposioSessionLike>;
127
+ getToolkitAuthState(toolkit: string): Promise<ComposioToolkitAuthState>;
91
128
  listToolkitCatalog(context: Omit<ComposioSessionContext, 'toolkits'>): Promise<ComposioToolkitCatalogItem[]>;
92
129
  authorize(context: ComposioSessionContext & {
93
130
  toolkit: string;
131
+ authConfigId?: string;
94
132
  installationId?: string;
95
133
  alias?: string;
96
134
  }): Promise<ComposioAuthorizeResult>;
@@ -63,6 +63,25 @@ function connectionStatus(value) {
63
63
  default: return "unknown";
64
64
  }
65
65
  }
66
+ function errorChainMessage(error) {
67
+ const messages = [];
68
+ const visited = /* @__PURE__ */ new Set();
69
+ let current = error;
70
+ while (current && !visited.has(current)) {
71
+ visited.add(current);
72
+ if (current instanceof Error) messages.push(current.message);
73
+ else if (typeof current === "string") messages.push(current);
74
+ if (!current || typeof current !== "object" || !("cause" in current)) break;
75
+ current = current.cause;
76
+ }
77
+ return messages.join(" ");
78
+ }
79
+ function missingAuthConfigMessage(error, toolkit, authConfigId) {
80
+ const message = errorChainMessage(error);
81
+ if (!message.includes("require auth configs") && !message.includes("cannot be auto-created")) return null;
82
+ if (authConfigId) return `The Composio auth config "${authConfigId}" is not available for toolkit "${toolkit}". Make sure it is enabled for Tool Router and belongs to the same Composio project as the configured API key.`;
83
+ return `The Composio toolkit "${toolkit}" requires a custom auth config. Create one in the Composio dashboard, enable it for Tool Router, then select it in the connector settings.`;
84
+ }
66
85
  var ComposioSessionsAdapter = class {
67
86
  createClient;
68
87
  constructor(options = {}) {
@@ -106,10 +125,36 @@ var ComposioSessionsAdapter = class {
106
125
  requireExplicitSelection: true
107
126
  },
108
127
  ...context.toolkits?.length ? { toolkits: { enable: context.toolkits } } : {},
128
+ ...context.authConfigs && Object.keys(context.authConfigs).length > 0 ? { authConfigs: context.authConfigs } : {},
109
129
  ...context.connectedAccounts && Object.keys(context.connectedAccounts).length > 0 ? { connectedAccounts: context.connectedAccounts } : {}
110
130
  };
111
131
  return client.sessions.create(context.providerPrincipalId ?? createComposioPrincipalId(context.principalId, context.installationScope), config);
112
132
  }
133
+ async getToolkitAuthState(toolkit) {
134
+ const normalizedToolkit = toolkit.trim().toLowerCase();
135
+ if (!normalizedToolkit) throw new Error("Composio toolkit is required.");
136
+ const client = await this.createClient();
137
+ if (!client.authConfigs || !client.toolkits) throw new Error("The installed Composio runtime does not support auth config discovery.");
138
+ const [toolkitDetails, authConfigList] = await Promise.all([client.toolkits.get(normalizedToolkit), client.authConfigs.list({
139
+ toolkit: normalizedToolkit,
140
+ showDisabled: true
141
+ })]);
142
+ const managedAuthAvailable = (toolkitDetails.composioManagedAuthSchemes?.length ?? 0) > 0;
143
+ const authConfigs = authConfigList.items.map((item) => ({
144
+ id: item.id,
145
+ name: item.name,
146
+ status: item.status,
147
+ authScheme: item.authScheme,
148
+ isComposioManaged: item.isComposioManaged === true,
149
+ isEnabledForToolRouter: item.isEnabledForToolRouter !== false
150
+ }));
151
+ return {
152
+ toolkit: normalizedToolkit,
153
+ managedAuthAvailable,
154
+ requiresCustomAuthConfig: !managedAuthAvailable && (toolkitDetails.authConfigDetails?.length ?? 0) > 0,
155
+ authConfigs
156
+ };
157
+ }
113
158
  async listToolkitCatalog(context) {
114
159
  const session = await this.createSession(context);
115
160
  const items = [];
@@ -134,11 +179,20 @@ var ComposioSessionsAdapter = class {
134
179
  }
135
180
  async authorize(context) {
136
181
  const providerPrincipalId = createComposioPrincipalId(context.principalId, context.installationScope);
137
- const request = await (await this.createSession({
138
- ...context,
139
- providerPrincipalId,
140
- toolkits: [context.toolkit]
141
- })).authorize(context.toolkit, {
182
+ let session;
183
+ try {
184
+ session = await this.createSession({
185
+ ...context,
186
+ providerPrincipalId,
187
+ toolkits: [context.toolkit],
188
+ ...context.authConfigId ? { authConfigs: { [context.toolkit]: context.authConfigId } } : {}
189
+ });
190
+ } catch (error) {
191
+ const actionableMessage = missingAuthConfigMessage(error, context.toolkit, context.authConfigId);
192
+ if (actionableMessage) throw new Error(actionableMessage, { cause: error });
193
+ throw error;
194
+ }
195
+ const request = await session.authorize(context.toolkit, {
142
196
  callbackUrl: context.callbackUrl,
143
197
  alias: context.alias
144
198
  });
@@ -159,7 +213,8 @@ var ComposioSessionsAdapter = class {
159
213
  }).length === 0,
160
214
  metadata: {
161
215
  toolkit: context.toolkit,
162
- providerPrincipalId
216
+ providerPrincipalId,
217
+ ...context.authConfigId ? { authConfigId: context.authConfigId } : {}
163
218
  }
164
219
  });
165
220
  return {
@@ -207,6 +262,7 @@ var ComposioSessionsAdapter = class {
207
262
  connectedAt: readString(row, ["createdAt", "created_at"]),
208
263
  lastError: readString(row, ["lastError", "last_error"]),
209
264
  metadata: {
265
+ ...existing?.metadata,
210
266
  toolkit,
211
267
  providerPrincipalId
212
268
  }
@@ -266,10 +322,12 @@ var ComposioSessionsAdapter = class {
266
322
  const toolkit = input.action.toolkit;
267
323
  const connectedAccounts = toolkit && input.connection ? { [toolkit]: [input.connection.providerConnectionId] } : input.context.connectedAccounts;
268
324
  const providerPrincipalId = input.connection?.metadata.providerPrincipalId;
325
+ const connectionAuthConfigId = input.connection?.metadata.authConfigId;
269
326
  if (input.connection && (typeof providerPrincipalId !== "string" || !providerPrincipalId.trim())) throw new Error("Connected account is missing its provider identity. Reconnect the account and try again.");
270
327
  const result = await (await this.createSession({
271
328
  ...input.context,
272
329
  connectedAccounts,
330
+ ...toolkit && typeof connectionAuthConfigId === "string" && connectionAuthConfigId.trim() ? { authConfigs: { [toolkit]: connectionAuthConfigId.trim() } } : {},
273
331
  ...typeof providerPrincipalId === "string" ? { providerPrincipalId } : {}
274
332
  })).execute(input.action.actionId, input.args ?? {}, input.connection ? { account: input.connection.providerConnectionId } : void 0);
275
333
  appendConnectorExecutionAudit({
@@ -1,5 +1,6 @@
1
1
  import { CredentialResolver } from '../auth/credentials.js';
2
2
  import type { Config } from '../config/schema.js';
3
+ import { type ComposioToolkitAuthState } from './composio-sessions.js';
3
4
  import type { ConnectorConfirmationPolicy, ConnectorDefinition, ConnectorInstallationPolicy } from './types.js';
4
5
  export type ComposioConnection = {
5
6
  id: string;
@@ -38,6 +39,7 @@ export type ComposioConnectorHealth = {
38
39
  recovery: 'none' | 'connect' | 'reconnect' | 'retry';
39
40
  errorCode?: 'missing_credential' | 'unauthorized' | 'forbidden' | 'network' | 'timeout' | 'provider_error';
40
41
  };
42
+ export declare function getConfiguredComposioAuthConfigs(config: Config | undefined, toolkits: string[]): Record<string, string>;
41
43
  export declare function toolkitFromComposioSlug(slug: string): string | undefined;
42
44
  export declare function scopeForComposioAction(slug: string): {
43
45
  toolkit?: string;
@@ -64,6 +66,7 @@ export declare function saveComposioApiKey(input: {
64
66
  export declare function configureComposioApiKey(apiKey: string, resolver?: CredentialResolver): Promise<void>;
65
67
  export declare function listComposioConnections(resolver?: CredentialResolver): Promise<ComposioConnection[]>;
66
68
  export declare function inspectComposioConnectorHealth(toolkit: string, resolver?: CredentialResolver): Promise<ComposioConnectorHealth>;
69
+ export declare function getComposioToolkitAuthState(toolkit: string, resolver?: CredentialResolver): Promise<ComposioToolkitAuthState>;
67
70
  export declare function getComposioInstallationPolicy(config: Config | undefined, toolkit: string): ConnectorInstallationPolicy;
68
71
  export declare function updateComposioInstallationPolicy(config: Config | undefined, toolkit: string, patch: {
69
72
  allowedAgentIds?: string[];
@@ -76,7 +79,7 @@ export declare function updateComposioConnection(id: string, patch: {
76
79
  }): ComposioConnection;
77
80
  export declare function refreshComposioConnection(id: string, resolver?: CredentialResolver): Promise<void>;
78
81
  export declare function revokeComposioConnection(id: string, resolver?: CredentialResolver): Promise<void>;
79
- export declare function startComposioAuthorize(connectorId: string, toolkit: string, resolver?: CredentialResolver): Promise<{
82
+ export declare function startComposioAuthorize(connectorId: string, toolkit: string, resolver?: CredentialResolver, authConfigId?: string): Promise<{
80
83
  toolkit: string;
81
84
  connectUrl: string;
82
85
  connectionId?: string;
@@ -174,6 +174,22 @@ function toolkitFromConnectionMetadata(connection) {
174
174
  function normalizeToolkit(toolkit) {
175
175
  return toolkit.trim().toLowerCase().replace(/[^a-z0-9_]+/g, "");
176
176
  }
177
+ function getConfiguredComposioAuthConfigs(config, toolkits) {
178
+ const requested = new Set(toolkits.map(normalizeToolkit));
179
+ return Object.values(config?.connectors?.instances ?? {}).reduce((result, record) => {
180
+ if (!record || typeof record !== "object" || Array.isArray(record)) return result;
181
+ const row = record;
182
+ const runtime = row.runtime;
183
+ const marker = row.xopcConnector;
184
+ if (!runtime || typeof runtime !== "object" || Array.isArray(runtime) || runtime.type !== "composio" || runtime.role !== "toolkit" || typeof runtime.toolkit !== "string" || !marker || typeof marker !== "object" || Array.isArray(marker)) return result;
185
+ const toolkit = normalizeToolkit(runtime.toolkit);
186
+ if (!requested.has(toolkit)) return result;
187
+ const configValue = marker.config;
188
+ const authConfigId = configValue && typeof configValue === "object" && !Array.isArray(configValue) ? configValue.authConfigId : void 0;
189
+ if (typeof authConfigId === "string" && authConfigId.trim()) result[toolkit] = authConfigId.trim();
190
+ return result;
191
+ }, {});
192
+ }
177
193
  function toolkitFromComposioSlug(slug) {
178
194
  const upper = slug.trim().toUpperCase();
179
195
  if (!upper) return void 0;
@@ -399,6 +415,9 @@ async function inspectComposioConnectorHealth(toolkit, resolver = new Credential
399
415
  };
400
416
  }
401
417
  }
418
+ async function getComposioToolkitAuthState(toolkit, resolver = new CredentialResolver()) {
419
+ return new ComposioSessionsAdapter({ resolver }).getToolkitAuthState(normalizeToolkit(toolkit));
420
+ }
402
421
  function classifyComposioHealthError(error) {
403
422
  const message = error instanceof Error ? error.message : String(error);
404
423
  if (/api key is not configured|missing.*api key/i.test(message)) return {
@@ -473,11 +492,12 @@ async function revokeComposioConnection(id, resolver = new CredentialResolver())
473
492
  await new ComposioSessionsAdapter({ resolver }).revokeConnection(connection);
474
493
  if (connection.accountId) refreshConnectorAccountCurrent(connection.accountId);
475
494
  }
476
- async function startComposioAuthorize(connectorId, toolkit, resolver = new CredentialResolver()) {
495
+ async function startComposioAuthorize(connectorId, toolkit, resolver = new CredentialResolver(), authConfigId) {
477
496
  const normalizedToolkit = normalizeToolkit(toolkit);
478
497
  const authorization = await new ComposioSessionsAdapter({ resolver }).authorize({
479
498
  principalId: LOCAL_OWNER_PRINCIPAL,
480
499
  toolkit: normalizedToolkit,
500
+ authConfigId,
481
501
  installationId: getConnectorInstallation(`${connectorId}-${LOCAL_OWNER_PRINCIPAL}`)?.id
482
502
  });
483
503
  if (!authorization.connectUrl) throw new Error("Composio authorize did not return a connect URL.");
@@ -491,7 +511,8 @@ async function listComposioTools(toolkit, config, resolver = new CredentialResol
491
511
  const normalizedToolkit = normalizeToolkit(toolkit);
492
512
  const payload = await (await new ComposioSessionsAdapter({ resolver }).createSession({
493
513
  principalId: LOCAL_OWNER_PRINCIPAL,
494
- toolkits: [normalizedToolkit]
514
+ toolkits: [normalizedToolkit],
515
+ authConfigs: getConfiguredComposioAuthConfigs(config, [normalizedToolkit])
495
516
  })).search({
496
517
  query: `List the available ${normalizedToolkit} actions and their exact input contracts.`,
497
518
  toolkits: [normalizedToolkit]
@@ -551,7 +572,8 @@ async function executeComposioTool(params, resolver = new CredentialResolver())
551
572
  const result = await new ComposioSessionsAdapter({ resolver }).executeWithPolicy({
552
573
  context: {
553
574
  principalId: LOCAL_OWNER_PRINCIPAL,
554
- toolkits: [allowed.toolkit]
575
+ toolkits: [allowed.toolkit],
576
+ authConfigs: getConfiguredComposioAuthConfigs(params.config, [allowed.toolkit])
555
577
  },
556
578
  installation,
557
579
  connection,
@@ -570,4 +592,4 @@ async function executeComposioTool(params, resolver = new CredentialResolver())
570
592
  return result.result;
571
593
  }
572
594
  //#endregion
573
- export { COMPOSIO_CONNECTORS, canUseComposioAction, configureComposioApiKey, executeComposioTool, getComposioInstallationPolicy, getComposioToolkitScope, inspectComposioConnectorHealth, isComposioActionAllowedByCatalog, listComposioConnections, listComposioTools, refreshComposioConnection, revokeComposioConnection, saveComposioApiKey, scopeForComposioAction, setComposioToolkitScope, startComposioAuthorize, toolkitFromComposioSlug, updateComposioConnection, updateComposioInstallationPolicy };
595
+ export { COMPOSIO_CONNECTORS, canUseComposioAction, configureComposioApiKey, executeComposioTool, getComposioInstallationPolicy, getComposioToolkitAuthState, getComposioToolkitScope, getConfiguredComposioAuthConfigs, inspectComposioConnectorHealth, isComposioActionAllowedByCatalog, listComposioConnections, listComposioTools, refreshComposioConnection, revokeComposioConnection, saveComposioApiKey, scopeForComposioAction, setComposioToolkitScope, startComposioAuthorize, toolkitFromComposioSlug, updateComposioConnection, updateComposioInstallationPolicy };
@@ -107,7 +107,7 @@ registerConnectorRuntimeAdapter({
107
107
  if (definition.runtime.type !== "composio") throw new Error(`Invalid Composio connector definition: ${definition.id}`);
108
108
  if (definition.runtime.role === "credential") await saveComposioApiKey(input, resolver);
109
109
  if (definition.runtime.role === "toolkit") await assertComposioApiKeyConfigured(resolver);
110
- const instance = installRecord(config, definition, definition.runtime.role === "toolkit" ? { scope: "read" } : {});
110
+ const instance = installRecord(config, definition, definition.runtime.role === "toolkit" ? { scope: "read" } : {}, definition.runtime.role === "toolkit" ? { config: input.config ?? {} } : {});
111
111
  if (definition.runtime.role === "toolkit" && isXopcDatabaseOpen()) {
112
112
  const installationId = `${definition.id}-local-owner`;
113
113
  const existing = getConnectorInstallation(installationId);
@@ -129,6 +129,19 @@ registerConnectorRuntimeAdapter({
129
129
  if (definition.runtime.type !== "composio") throw new Error(`Invalid Composio connector definition: ${definition.id}`);
130
130
  uninstallRecord(config, instance.instanceId);
131
131
  if (definition.runtime.role === "toolkit" && isXopcDatabaseOpen()) deleteConnectorInstallation(`${definition.id}-local-owner`);
132
+ },
133
+ update({ config, definition, input, instanceId }) {
134
+ if (definition.runtime.type !== "composio" || definition.runtime.role !== "toolkit") throw new Error(`Invalid Composio toolkit definition: ${definition.id}`);
135
+ const record = config.connectors?.instances?.[instanceId];
136
+ const marker = record?.xopcConnector;
137
+ if (!marker || typeof marker !== "object" || Array.isArray(marker)) throw new Error(`Connector instance not found: ${instanceId}`);
138
+ const markerRecord = marker;
139
+ if (markerRecord.managed !== true) throw new Error(`Connector instance not found: ${instanceId}`);
140
+ record.xopcConnector = {
141
+ ...markerRecord,
142
+ config: input.config ?? {}
143
+ };
144
+ return installedInstance(config, instanceId, definition.id);
132
145
  }
133
146
  });
134
147
  for (const type of [
@@ -1,9 +1,9 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
3
  import { shouldSilence, stripHeartbeatToken } from "../../heartbeat/tokens.js";
4
+ import { appendCronEventLines } from "../../heartbeat/event-prompt.js";
4
5
  import { isWithinActiveHours } from "../../heartbeat/active-hours.js";
5
6
  import { isHeartbeatContentEmpty } from "../../heartbeat/content-check.js";
6
- import { appendCronEventLines } from "../../heartbeat/event-prompt.js";
7
7
  import { createHeartbeatWake } from "../../heartbeat/wake.js";
8
8
  import { resolveHeartbeatMdPath } from "../workspace-heartbeat-path.js";
9
9
  import { readFile } from "fs/promises";
@@ -1,5 +1,5 @@
1
1
  import { validateWebchatAttachments, validateWebchatContent } from "../../chat-limits.js";
2
- import { submitSessionInput } from "./session-input-handler.js";
2
+ import { replaceLatestSessionTurn, submitSessionInput } from "./session-input-handler.js";
3
3
  //#region src/gateway/hono/routes/agent-stream.ts
4
4
  function registerAgentStreamRoutes(authenticated, deps) {
5
5
  const { service, chatRateLimitMiddleware } = deps;
@@ -36,6 +36,9 @@ function registerAgentStreamRoutes(authenticated, deps) {
36
36
  authenticated.post("/api/sessions/:sessionKey/inputs", chatRateLimitMiddleware, async (c) => {
37
37
  return submitSessionInput(c, deps, (c.req.param("sessionKey") ?? "").trim());
38
38
  });
39
+ authenticated.post("/api/sessions/:sessionKey/turns/:turnId/replace", chatRateLimitMiddleware, async (c) => {
40
+ return replaceLatestSessionTurn(c, deps, (c.req.param("sessionKey") ?? "").trim(), (c.req.param("turnId") ?? "").trim());
41
+ });
39
42
  authenticated.patch("/api/sessions/:sessionKey/inputs/:inputId", chatRateLimitMiddleware, async (c) => {
40
43
  const sessionKey = (c.req.param("sessionKey") ?? "").trim();
41
44
  const inputId = c.req.param("inputId")?.trim() ?? "";