@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.
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{activity-store-D0mYZqhc.js → activity-store-JLmEb1p0.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-MWLQWL_i.js → agent-avatar-dicebear-CI1zQfzY.js} +1 -1
- package/dist/gateway/static/root/assets/agents-DqGMj3QJ.js +68 -0
- package/dist/gateway/static/root/assets/{api-DZA1yVzM.js → api-C6MmWfcb.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-B2X6quAF.js → app-management-settings-panel-Cd02GGpV.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-BZW-c38q.js → appearance-settings-Db-h2I3G.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-BT7F4WBI.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-CK-gsjsJ.js → archive-plugin-CMHzJT2a.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-EJGP4rCw.js → attachment-load-BzhI2LoH.js} +1 -1
- package/dist/gateway/static/root/assets/automations-page-CwOXGV9z.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-Tbss_4P-.js → binary-plugins-DsUeHvZO.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-C-dOWigw.js → block-editor-CFfsIeZ4.js} +47 -47
- package/dist/gateway/static/root/assets/{browser-settings-page-NlvDyMwD.js → browser-settings-page-CyRLhCod.js} +4 -4
- package/dist/gateway/static/root/assets/{browser-workflow-inputs-DW06Zo1N.js → browser-workflow-inputs-BiWghvJ0.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-workflows-page-B6RnRGwm.js → browser-workflows-page-DPLdT6Zn.js} +1 -1
- package/dist/gateway/static/root/assets/capabilities-settings-panel-jRKcS7lZ.js +7 -0
- package/dist/gateway/static/root/assets/{capability-presets-api-Cc3BtQar.js → capability-presets-api-CTxGFvsS.js} +1 -1
- package/dist/gateway/static/root/assets/{capability-presets-settings-panel-D0loEbzq.js → capability-presets-settings-panel-B3bKdtwU.js} +2 -2
- package/dist/gateway/static/root/assets/{channel-recipient-api-BvZO5FaO.js → channel-recipient-api-BklVUOxC.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-yZBWH02s.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-C3zlimZd.js +1 -0
- package/dist/gateway/static/root/assets/chat-terminal-dock-0F4Jmma2.js +36 -0
- package/dist/gateway/static/root/assets/{connectors-api-CUl6_EQJ.js → connectors-api-BvIZ51ty.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-OX4KvUkA.js +2 -0
- package/dist/gateway/static/root/assets/{cron-expression-BD9MgoE_.js → cron-expression-BHmwaMbO.js} +1 -1
- package/dist/gateway/static/root/assets/{date-picker-ChqNmoxw.js → date-picker-fj_pPCv5.js} +1 -1
- package/dist/gateway/static/root/assets/{dependency-picker-CDUmFs6H.js → dependency-picker-DsWvwOv-.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-D61gqxaD.js → desktop-pet-mjkF0Xxh.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-QvuJvIX_.js → desktop-pet-settings-ClwUpRYu.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field-DvXMvDNY.js → directory-picker-path-field-OkqRFyRL.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-DMdVTAQ3.js → extension-debug-page-DC69wplH.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-BNzxZtaK.js → extension-page-DCtk6zdJ.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-DoEfyizU.js → extension-settings-page-Bkm4zzv-.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-o7AKvthC.js → gateway-config-api-Dr_NQt7v.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-BQbkUP5X.js → gateway-config-swr-CEfv8N1J.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-settings-V1XVxjHa.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-DIgdpHgk.js → gateway-startup-retry-B8hebJ7s.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-UZAn1aAQ.js → heartbeat-settings-CWUBAQrE.js} +1 -1
- package/dist/gateway/static/root/assets/home-page-D57cYRd3.js +1 -0
- package/dist/gateway/static/root/assets/index-DJ7HSgKs.js +85 -0
- package/dist/gateway/static/root/assets/index-PNBFdxHb.css +2 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-4xaM3jjU.js → keyboard-shortcuts-settings-DCQvf05d.js} +1 -1
- package/dist/gateway/static/root/assets/{local-app-workbench-page-D9bguWRo.js → local-app-workbench-page-BbAiMZE1.js} +2 -2
- package/dist/gateway/static/root/assets/{local-apps-page-C1xDicdr.js → local-apps-page-B3Ugd0my.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-pByvK12G.js → locale-store-hDBVeG3G.js} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-Gr-nE4nW.js → logs-page-nXdF3wOT.js} +1 -1
- package/dist/gateway/static/root/assets/{management-settings-D1XdHm7v.js → management-settings-C-S5Llq3.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-split-B_Ijq1Fr.js → markdown-split-DuVq37Uh.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-view-CyJlGUxB.js → markdown-view-D8eO_6h3.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-CXXNRROJ.js → media-plugins-C1V6pkX3.js} +1 -1
- package/dist/gateway/static/root/assets/messages-1qg_hOOd.js +3 -0
- package/dist/gateway/static/root/assets/{notes-page-rkePB4CB.js → notes-page-Dn71ZV8c.js} +1 -1
- package/dist/gateway/static/root/assets/notes-workbench-BYPoZeRw.js +4 -0
- package/dist/gateway/static/root/assets/{page-tabs-gw-RMQCV.js → page-tabs-B5a5aSoS.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-B8aMScJ2.js → preview-open-alternatives-5041AIBX.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-CjcpkWAz.js → product-open-page-7UkouFQU.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-D27nOKbo.js +1 -0
- package/dist/gateway/static/root/assets/{projects-page-DPRxKGbs.js → projects-page-CdB5cJJ-.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-DFoZ3UNS.js +1 -0
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-Ch5qq86o.js → runtime-tools-settings-panel-DvaXzHYS.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-DHYWYUFt.js → schema-form-Dlxl_5X0.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-C1cbIcJ7.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-DnXRlQXS.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-DlzZx0-i.js → settings-form-section-CSaiuuer.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-BVLhreQi.js → settings-loading-skeleton-H3mJwt3r.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-BJU-kUnN.js → settings-page-Cs7zA4BS.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-CwgMODfJ.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-hvIuZXMe.js → share-preview-page-Bdpw5m7M.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-hlUgIkrp.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-DR31B_Gz.js +1 -0
- package/dist/gateway/static/root/assets/{skills-page-Dlvuh7D-.js → skills-page-Bup3Lg1Z.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page.utils-B6ddOpnf.js → skills-page.utils-D22ORR21.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-BdbCAyoA.js → system-settings-panel-GmtWsfjB.js} +1 -1
- package/dist/gateway/static/root/assets/task-detail-page-CTKDpxhf.js +1 -0
- package/dist/gateway/static/root/assets/{theme-store-BtdGacMI.js → theme-store-CtY8RwMX.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-CL6qHYJA.js → typed-models-lib-C2aOdlEA.js} +1 -1
- package/dist/gateway/static/root/assets/{use-autosave-DysNnqCS.js → use-autosave-DOj5i8d_.js} +1 -1
- package/dist/gateway/static/root/assets/{user-context-page-Bwg4KV8B.js → user-context-page-keJJYpix.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-UEsO9Jr-.js → voice-api-key-field-5WfurWYa.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-B9disASf.js → work-discovery-overlay-D5_MH3n3.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-page-CmPfOfHl.js → work-discovery-page-BcvBiebt.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-A0zTQHFQ.js → workflow-run-setup-panel-bBA8LinI.js} +1 -1
- package/dist/gateway/static/root/assets/workflows-page-Cz2VpWdj.js +5 -0
- package/dist/gateway/static/root/index.html +9 -9
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.js +2 -2
- package/dist/src/agent/background-review/coordinator.d.ts +1 -1
- package/dist/src/agent/background-review/coordinator.js +4 -5
- package/dist/src/agent/background-review/run-background-review.js +0 -1
- package/dist/src/agent/background-review/settings.d.ts +1 -2
- package/dist/src/agent/background-review/settings.js +3 -4
- package/dist/src/agent/external-tools/composio-provider.js +8 -4
- package/dist/src/agent/memory/builtin-provider.js +1 -1
- package/dist/src/agent/memory/create-memory-manager.js +1 -1
- package/dist/src/agent/memory/manager.js +2 -0
- package/dist/src/agent/memory/sensitivity.js +1 -1
- package/dist/src/agent/memory/understanding/service.js +43 -19
- package/dist/src/agent/memory/user-context-coordinator.js +1 -1
- package/dist/src/agent-runtime/index.js +1 -1
- package/dist/src/agent-runtime/runtime-profile.js +1 -1
- package/dist/src/automations/domain/validation.d.ts +7 -7
- package/dist/src/automations/draft/automation-draft-validator.d.ts +2 -2
- package/dist/src/connectors/auth-provider-registry.d.ts +2 -1
- package/dist/src/connectors/auth-provider-registry.js +5 -2
- package/dist/src/connectors/composio-sessions.d.ts +38 -0
- package/dist/src/connectors/composio-sessions.js +64 -6
- package/dist/src/connectors/composio.d.ts +4 -1
- package/dist/src/connectors/composio.js +26 -4
- package/dist/src/connectors/runtime-adapter-registry.js +14 -1
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/hono/routes/agent-stream.js +4 -1
- package/dist/src/gateway/hono/routes/connectors.js +15 -2
- package/dist/src/gateway/hono/routes/session-input-handler.d.ts +60 -0
- package/dist/src/gateway/hono/routes/session-input-handler.js +75 -1
- package/dist/src/gateway/service/agent-runner.d.ts +9 -1
- package/dist/src/gateway/service/agent-runner.js +9 -0
- package/dist/src/gateway/service/session-input-coordinator.d.ts +12 -0
- package/dist/src/gateway/service/session-input-coordinator.js +64 -6
- package/dist/src/gateway/service.d.ts +8 -0
- package/dist/src/gateway/service.js +8 -5
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/retrieval/audit.d.ts +1 -0
- package/dist/src/retrieval/audit.js +8 -0
- package/dist/src/retrieval/candidateFusion.d.ts +5 -0
- package/dist/src/retrieval/candidateFusion.js +20 -0
- package/dist/src/retrieval/queryProfile.d.ts +16 -0
- package/dist/src/retrieval/queryProfile.js +66 -0
- package/dist/src/retrieval/textFeatures.d.ts +5 -0
- package/dist/src/retrieval/textFeatures.js +71 -0
- package/dist/src/session/client-history.d.ts +1 -0
- package/dist/src/session/client-history.js +4 -0
- package/dist/src/session/index.js +1 -1
- package/dist/src/session/store.js +1 -1
- package/dist/src/storage/sqlite/fts.d.ts +0 -4
- package/dist/src/storage/sqlite/fts.js +2 -49
- package/dist/src/storage/sqlite/index.d.ts +3 -2
- package/dist/src/storage/sqlite/index.js +6 -5
- package/dist/src/storage/sqlite/memory-records-repository.js +60 -38
- package/dist/src/storage/sqlite/row-mappers.js +2 -2
- package/dist/src/storage/sqlite/session-repository.js +2 -2
- package/dist/src/storage/sqlite/session-turn-replace-repository.d.ts +34 -0
- package/dist/src/storage/sqlite/session-turn-replace-repository.js +110 -0
- package/dist/src/storage/sqlite/transcript-repository.js +1 -1
- package/dist/src/storage/sqlite/user-context-quality-repository.d.ts +7 -0
- package/dist/src/storage/sqlite/user-context-quality-repository.js +25 -1
- package/dist/src/storage/sqlite/user-context-repository.d.ts +4 -0
- package/dist/src/storage/sqlite/user-context-repository.js +29 -3
- package/dist/src/tasks/home-query-service.d.ts +3 -1
- package/dist/src/tasks/home-query-service.js +73 -70
- package/dist/src/tui/backends/embedded-backend.js +1 -1
- package/dist/src/user-context/planner.d.ts +1 -0
- package/dist/src/user-context/planner.js +16 -29
- package/dist/src/user-context/retriever.d.ts +15 -0
- package/dist/src/user-context/retriever.js +65 -0
- package/dist/src/user-context/scope.d.ts +7 -0
- package/dist/src/user-context/scope.js +9 -0
- package/package.json +1 -1
- package/dist/gateway/static/root/assets/agents-Bl8FQZxW.js +0 -68
- package/dist/gateway/static/root/assets/apps-page-CRUgTO10.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-DrSwolhG.js +0 -6
- package/dist/gateway/static/root/assets/capabilities-settings-panel-BWXUznw5.js +0 -7
- package/dist/gateway/static/root/assets/channels-settings-CcivCw8U.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-DkHAD2Zn.js +0 -1
- package/dist/gateway/static/root/assets/chat-terminal-dock-DVedGAeX.js +0 -36
- package/dist/gateway/static/root/assets/connectors-page-DlBSlfkv.js +0 -2
- package/dist/gateway/static/root/assets/gateway-settings-TO5YYZ9a.js +0 -1
- package/dist/gateway/static/root/assets/home-page-CRJDpy5E.js +0 -3
- package/dist/gateway/static/root/assets/index-BSjP0Wsx.css +0 -2
- package/dist/gateway/static/root/assets/index-C2ZYFBGL.js +0 -85
- package/dist/gateway/static/root/assets/messages-yG5P43Q9.js +0 -3
- package/dist/gateway/static/root/assets/notes-workbench-CpbD4XG2.js +0 -4
- package/dist/gateway/static/root/assets/project-detail-page-GvSYDbjR.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-WIzeu-gB.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-2XEJM0YE.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-g1GThZ0O.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-C6qj2L-q.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-BBpE1bep.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-DXORBJNk.js +0 -1
- package/dist/gateway/static/root/assets/task-detail-page-DC0hc8hp.js +0 -1
- 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(
|
|
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
|
-
...
|
|
115
|
-
|
|
116
|
-
|
|
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
|
|
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: "
|
|
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: "
|
|
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
|
|
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
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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() ?? "";
|