@xopcai/xopc 0.0.306 → 0.0.307
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-DLtim-_I.js → activity-store-wgSB2HYK.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-iQXtiilH.js → agent-avatar-dicebear-CZeQo09T.js} +1 -1
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-BPsRb9Ck.js +1 -0
- package/dist/gateway/static/root/assets/agents-BlrHMbRx.js +1 -0
- package/dist/gateway/static/root/assets/{api-DfSU0-lD.js → api-BKHmTb0w.js} +1 -1
- package/dist/gateway/static/root/assets/api-DFOlahZv.js +1 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-BpYFKz7B.js → app-management-settings-panel-Bzw4fQP8.js} +1 -1
- package/dist/gateway/static/root/assets/appearance-settings-8GZpUXva.js +1 -0
- package/dist/gateway/static/root/assets/apps-page-BkQQtIxH.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-BxOvZ-ZX.js → archive-plugin-CQ2NaoHb.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-B0FzTMAJ.js → attachment-load-BFi1H7yJ.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-BpXuPaPg.js → automations-page-CDBXcii_.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-CUpiTTiY.js +6 -0
- package/dist/gateway/static/root/assets/{binary-plugins-BP7wfpqy.js → binary-plugins-D07eWmOx.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-oMLvdnOQ.js → block-editor-CtVnjyYU.js} +3 -3
- package/dist/gateway/static/root/assets/{browser-automation-inputs-DTxSZ00u.js → browser-automation-inputs-BzkJog8e.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-automations-page-IbJnwEY4.js → browser-automations-page-DyrSbDdG.js} +2 -2
- package/dist/gateway/static/root/assets/browser-settings-page-CqTxLpil.js +3 -0
- package/dist/gateway/static/root/assets/capabilities-settings-panel-BZ_-pnS6.js +8 -0
- package/dist/gateway/static/root/assets/channels-settings-DAD9qE3J.js +1 -0
- package/dist/gateway/static/root/assets/{channels-status-swr-D2AmAoty.js → channels-status-swr-B2JwuTjG.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-terminal-dock-B-yI3Mi1.js → chat-terminal-dock-B62SZdAo.js} +1 -1
- package/dist/gateway/static/root/assets/{computer-settings-page-CWx_jnng.js → computer-settings-page-ClSresNq.js} +1 -1
- package/dist/gateway/static/root/assets/connector-service-page-CPqVmNvx.js +1 -0
- package/dist/gateway/static/root/assets/connectors-page-BUQyg3CW.js +2 -0
- package/dist/gateway/static/root/assets/{cron-expression-DMRRL4Zg.js → cron-expression-CTMi_tql.js} +1 -1
- package/dist/gateway/static/root/assets/{date-picker-BSwL0e6E.js → date-picker-B71AJK50.js} +1 -1
- package/dist/gateway/static/root/assets/{dependency-picker-BQTspLzC.js → dependency-picker-DlyGK-kA.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-C3lFxDF6.js → desktop-pet-DGkbTE8_.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-Y8pjpXFE.js → desktop-pet-settings-BY8r9j66.js} +1 -1
- package/dist/gateway/static/root/assets/device-pairing-wizard-DzRrgd59.js +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-CVGiGVcR.js → extension-debug-page-L8Mm1n3A.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-g3JtCP_y.js → extension-page-CFc4vSNU.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-CjpoKV1f.js → extension-settings-page-B5zWyHr3.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-BSvXXpKM.js → gateway-config-swr-B6wHa6ZI.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-realtime-BDCpS7U1.js → gateway-realtime-B53R0CA4.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-BLDgrJ30.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-settings-CYG9WCZn.js → gateway-settings-D7qmTH4R.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-Caf8g3sC.js → gateway-startup-retry-DRzGnEV-.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-Cl834-SS.js → heartbeat-settings-Glsl3X5b.js} +1 -1
- package/dist/gateway/static/root/assets/home-page-s9hDQ8Hc.js +1 -0
- package/dist/gateway/static/root/assets/{image-generation-api-BwEWBUVC.js → image-generation-api-Ck_pyDom.js} +1 -1
- package/dist/gateway/static/root/assets/{imports-page-CoMlgSIA.js → imports-page-ByBX7ome.js} +1 -1
- package/dist/gateway/static/root/assets/{index-Do9MltC4.js → index-RBCkv8a_.js} +48 -48
- package/dist/gateway/static/root/assets/index-cFU4S35z.css +1 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CNq5D4pe.js → keyboard-shortcuts-settings-C45RlO8a.js} +1 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-DP0x2jpR.js +2 -0
- package/dist/gateway/static/root/assets/{local-apps-page-DQnRA598.js → local-apps-page-C_AQc2bI.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-D16nmbaN.js → locale-store-msTfRK8P.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-DvM8Pyok.js +2 -0
- package/dist/gateway/static/root/assets/{management-settings-DKcO5fQ-.js → management-settings-D1uwSutV.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-view-DCp4BlZP.js → markdown-view-BInabSKf.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-Cy64sn_C.js → media-plugins-C4mhf13f.js} +1 -1
- package/dist/gateway/static/root/assets/{messages-C-9oo69N.js → messages-F74LVAiU.js} +3 -3
- package/dist/gateway/static/root/assets/note-detail-panel-D35sErp2.js +5 -0
- package/dist/gateway/static/root/assets/notes-page-8jCDklDn.js +8 -0
- package/dist/gateway/static/root/assets/{page-tabs-CgEoHSVT.js → page-tabs-1go_BtX1.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-Ck2uKTbf.js → preview-open-alternatives-DmoSC0j1.js} +1 -1
- package/dist/gateway/static/root/assets/{proactive-page-Dr1mCJhZ.js → proactive-page-xAjKTIID.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-DbZvJ5GE.js → product-open-page-gmi5LLwM.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-BUMQHy_N.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-DT-Mt7XR.js +1 -0
- package/dist/gateway/static/root/assets/{registry-api-DcQdwpPu.js → registry-api-BSWtko7U.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-Clz3byir.js +1 -0
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-CPwdgWKo.js → runtime-tools-settings-panel-ClkOoxDl.js} +2 -2
- package/dist/gateway/static/root/assets/{schema-form-8psK4cFO.js → schema-form-BuEmLiaU.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-tQRwktKm.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-DqWg9XS5.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-D_Gsz5rl.js → settings-form-section-Dor39QON.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-C_Tj_mkZ.js → settings-page-Xj-yvIc8.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-BB_sMB7P.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-B_M_oPsT.js → share-preview-page-BFWZoXdm.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-oDALm4b6.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-DmwelnfK.js +1 -0
- package/dist/gateway/static/root/assets/{skills-page-DYgwzl5B.js → skills-page-BE9JXz4U.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page.utils-Cuh6s2HM.js → skills-page.utils-Ii8qeXhs.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-aassGyNb.js → system-settings-panel-Di6OSO-0.js} +1 -1
- package/dist/gateway/static/root/assets/task-detail-page-D1AWszc7.js +1 -0
- package/dist/gateway/static/root/assets/theme-store-1SZ-HFHX.js +1 -0
- package/dist/gateway/static/root/assets/{tunnel-api-DJYcPWIV.js → tunnel-api-DDOlOYlj.js} +1 -1
- package/dist/gateway/static/root/assets/{use-autosave-QGYG7oMZ.js → use-autosave-CQ8uWNnB.js} +1 -1
- package/dist/gateway/static/root/assets/user-model-page-C00i4ea0.js +2 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-D1s0gIRW.js → voice-api-key-field-COTzshjL.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-config-api-D2goEn5e.js → voice-config-api-DgJML_uM.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-DkFW9aJ6.js → work-discovery-overlay-_URrXbi4.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-BYToUPUY.js → workflow-run-setup-panel-CALs-1nd.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-BUiBjz6m.js +6 -0
- package/dist/gateway/static/root/channel-icons/feishu.svg +6 -12
- package/dist/gateway/static/root/connector-icons/SOURCES.md +12 -0
- package/dist/gateway/static/root/connector-icons/dingtalk-mark.svg +1 -0
- package/dist/gateway/static/root/connector-icons/tencent-meeting-mark.svg +37 -0
- package/dist/gateway/static/root/connector-icons/wps-calendar.svg +14 -0
- package/dist/gateway/static/root/connector-icons/wps-docs.svg +14 -0
- package/dist/gateway/static/root/connector-icons/wps-mail.svg +7 -0
- package/dist/gateway/static/root/index.html +12 -12
- package/dist/package.js +1 -1
- package/dist/src/agent/external-tools/composio-provider.js +83 -20
- package/dist/src/agent/external-tools/gateway-tools.js +2 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
- package/dist/src/agent/mcp/oauth/mcp-oauth-manager.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/gateway/lifecycle.js +2 -2
- package/dist/src/cli/commands/update.js +1 -1
- package/dist/src/config/schema.d.ts +12 -0
- package/dist/src/config/schema.js +4 -2
- package/dist/src/connectors/account-access.d.ts +4 -0
- package/dist/src/connectors/account-access.js +23 -0
- package/dist/src/connectors/approval-resume.d.ts +4 -0
- package/dist/src/connectors/approval-resume.js +23 -0
- package/dist/src/connectors/auth-provider-registry.d.ts +1 -0
- package/dist/src/connectors/auth-provider-registry.js +2 -1
- package/dist/src/connectors/authorization-attempts.d.ts +21 -0
- package/dist/src/connectors/authorization-attempts.js +33 -0
- package/dist/src/connectors/builtin-catalog.js +1 -3
- package/dist/src/connectors/catalog.js +2 -1
- package/dist/src/connectors/china-catalog.d.ts +2 -0
- package/dist/src/connectors/china-catalog.js +430 -0
- package/dist/src/connectors/composio-backends.d.ts +26 -0
- package/dist/src/connectors/composio-backends.js +65 -0
- package/dist/src/connectors/composio-catalog.js +2 -1
- package/dist/src/connectors/composio-managed-client.js +3 -1
- package/dist/src/connectors/composio-managed-events.js +5 -2
- package/dist/src/connectors/composio-session-types.d.ts +2 -0
- package/dist/src/connectors/composio-sessions.d.ts +11 -2
- package/dist/src/connectors/composio-sessions.js +137 -35
- package/dist/src/connectors/composio-triggers.js +4 -2
- package/dist/src/connectors/composio.d.ts +11 -8
- package/dist/src/connectors/composio.js +68 -84
- package/dist/src/connectors/connected-source-ingestion.js +4 -3
- package/dist/src/connectors/connection-recovery-service.js +25 -13
- package/dist/src/connectors/connector-identity.d.ts +2 -0
- package/dist/src/connectors/connector-identity.js +18 -5
- package/dist/src/connectors/content-enrichment.js +1 -1
- package/dist/src/connectors/instances.js +1 -7
- package/dist/src/connectors/learning-coordinator.js +4 -3
- package/dist/src/connectors/materialize.js +14 -1
- package/dist/src/connectors/policy.d.ts +1 -1
- package/dist/src/connectors/policy.js +1 -1
- package/dist/src/connectors/principal.js +24 -3
- package/dist/src/connectors/providers.d.ts +1 -0
- package/dist/src/connectors/providers.js +14 -2
- package/dist/src/connectors/runtime-adapter-registry.js +4 -9
- package/dist/src/connectors/secret-store.d.ts +4 -1
- package/dist/src/connectors/secret-store.js +7 -3
- package/dist/src/connectors/source-change-publisher.js +4 -2
- package/dist/src/connectors/types.d.ts +16 -11
- package/dist/src/connectors/workflow-preflight.d.ts +2 -1
- package/dist/src/connectors/workflow-preflight.js +20 -3
- package/dist/src/gateway/hono/routes/connectors.js +208 -17
- package/dist/src/gateway/hono/routes/context-sources.js +1 -1
- package/dist/src/gateway/hono/routes/home.js +4 -1
- package/dist/src/gateway/hono/routes/imports.js +1 -1
- package/dist/src/gateway/hono/routes/local-apps.js +1 -1
- package/dist/src/gateway/hono/routes/mcp.js +1 -1
- package/dist/src/gateway/hono/routes/update.js +2 -2
- package/dist/src/gateway/index.js +1 -1
- package/dist/src/gateway/run-loop.js +1 -1
- package/dist/src/gateway/service.js +10 -10
- package/dist/src/infra/gateway-processes.js +1 -1
- package/dist/src/infra/update-restart.js +2 -2
- package/dist/src/infra/update-runner.js +2 -2
- package/dist/src/infra/update-startup.js +1 -1
- package/dist/src/proactive/follow-ups.js +2 -1
- package/dist/src/storage/sqlite/connection-wait-repository.d.ts +3 -0
- package/dist/src/storage/sqlite/connection-wait-repository.js +63 -2
- package/dist/src/storage/sqlite/connector-account-repository.d.ts +6 -0
- package/dist/src/storage/sqlite/connector-account-repository.js +35 -7
- package/dist/src/storage/sqlite/connector-repository.js +15 -10
- package/dist/src/storage/sqlite/connector-sync-policy-repository.js +1 -1
- package/dist/src/storage/sqlite/index.js +4 -2
- package/dist/src/storage/sqlite/migrations/182_connector_account_policies.sql +92 -0
- package/dist/src/storage/sqlite/migrations/183_connector_backend_consistency.sql +20 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +7 -7
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/tasks/home-query-service.js +3 -3
- package/dist/src/tui/backends/gateway-realtime-backend.js +1 -1
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/dist/src/workflows/domain/definition.d.ts +1 -0
- package/dist/src/workflows/domain/validation.js +1 -1
- package/dist/src/workflows/service/workflow-run-service.js +14 -0
- package/dist/src/workflows/service/workflow-session-bridge.d.ts +1 -0
- package/dist/src/workflows/service/workflow-session-bridge.js +1 -0
- package/package.json +3 -3
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-CxOv4ivK.js +0 -1
- package/dist/gateway/static/root/assets/agents-DzKx7z3k.js +0 -1
- package/dist/gateway/static/root/assets/api-gpHh07OL.js +0 -1
- package/dist/gateway/static/root/assets/appearance-settings-BQfR5vrq.js +0 -1
- package/dist/gateway/static/root/assets/apps-page-BceB7JHZ.js +0 -1
- package/dist/gateway/static/root/assets/automations-workspace-Cn_p8zY_.js +0 -6
- package/dist/gateway/static/root/assets/browser-settings-page-CCUO3G23.js +0 -3
- package/dist/gateway/static/root/assets/capabilities-settings-panel-BjMb5H2_.js +0 -8
- package/dist/gateway/static/root/assets/channels-settings-P22-_i13.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-BLgPORmH.js +0 -2
- package/dist/gateway/static/root/assets/device-pairing-wizard-DM4_GMzo.js +0 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-BGmP1obI.js +0 -1
- package/dist/gateway/static/root/assets/home-page-CB_XVtIM.js +0 -1
- package/dist/gateway/static/root/assets/index-CI37dTAn.css +0 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-BxQlEje6.js +0 -2
- package/dist/gateway/static/root/assets/logs-page-CT5GrcMs.js +0 -2
- package/dist/gateway/static/root/assets/note-detail-panel-5dc3LKTL.js +0 -5
- package/dist/gateway/static/root/assets/notes-page-AbwxgXuG.js +0 -8
- package/dist/gateway/static/root/assets/project-detail-page-DnE1zI1c.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-BD0nLYxk.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-TYuE6A3S.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-BcWDQQFX.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-DzGQX6Hq.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-CE2X89qN.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-BL4H9Iym.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-WMKIgUOp.js +0 -1
- package/dist/gateway/static/root/assets/task-detail-page-BjeRslap.js +0 -1
- package/dist/gateway/static/root/assets/theme-store-RUBQBsFP.js +0 -1
- package/dist/gateway/static/root/assets/user-model-page-PrRsd4go.js +0 -2
- package/dist/gateway/static/root/assets/workflows-page-Z8iZe9YP.js +0 -6
|
@@ -6,6 +6,9 @@ import { getSqliteDatabase, init_transaction, runSqliteWriteTransaction } from "
|
|
|
6
6
|
import { init_session_instance_repository, readCurrentTranscriptId } from "./session-instance-repository.js";
|
|
7
7
|
import { bumpSessionInputRevision, getSessionInputById, getSessionInputState, init_session_input_repository, insertSessionInput, setSessionInputStatus } from "./session-input-repository.js";
|
|
8
8
|
import { TaskRunRepository, init_task_run_repository } from "../../tasks/task-run-repository.js";
|
|
9
|
+
import { getConnectorAccount, init_connector_account_repository } from "./connector-account-repository.js";
|
|
10
|
+
import { getConnectorConnection, init_connector_repository } from "./connector-repository.js";
|
|
11
|
+
import { getSessionMetadata, init_session_repository } from "./session-repository.js";
|
|
9
12
|
import { randomUUID } from "node:crypto";
|
|
10
13
|
import { EventEmitter } from "node:events";
|
|
11
14
|
//#region src/storage/sqlite/connection-wait-repository.ts
|
|
@@ -222,9 +225,64 @@ function consumeConnectionResume(input) {
|
|
|
222
225
|
}
|
|
223
226
|
function connectionBindings(conversationId) {
|
|
224
227
|
if (!isXopcDatabaseOpen()) return [];
|
|
228
|
+
let metadata = getSessionMetadata(conversationId);
|
|
229
|
+
if (metadata?.sessionType === "workflow-subagent" && metadata.parentConversationId) metadata = getSessionMetadata(metadata.parentConversationId);
|
|
230
|
+
const workflowAccounts = metadata?.sessionType === "workflow-run" ? metadata.customData?.connectorAccounts : void 0;
|
|
231
|
+
if (workflowAccounts && typeof workflowAccounts === "object" && !Array.isArray(workflowAccounts)) return Object.entries(workflowAccounts).flatMap(([connectorId, ids]) => Array.isArray(ids) ? ids.flatMap((id) => {
|
|
232
|
+
if (typeof id !== "string") return [];
|
|
233
|
+
const account = getConnectorAccount(id);
|
|
234
|
+
return [{
|
|
235
|
+
key: `${connectorId}:${id}`,
|
|
236
|
+
connectorId,
|
|
237
|
+
accountId: id,
|
|
238
|
+
connectionId: account?.currentConnectionId,
|
|
239
|
+
label: account?.label ?? connectorId,
|
|
240
|
+
capabilities: []
|
|
241
|
+
}];
|
|
242
|
+
}) : []);
|
|
225
243
|
const state = getSessionInputState(conversationId);
|
|
226
244
|
const input = state.activeInputId ? getSessionInputById(conversationId, state.activeInputId) : void 0;
|
|
227
|
-
|
|
245
|
+
if (!input) return [];
|
|
246
|
+
const wait = input.payload ? getConnectionWait(input.payload.waitId) : void 0;
|
|
247
|
+
const stored = getSqliteDatabase().prepare(`SELECT connector_id, account_id FROM connector_objective_accounts
|
|
248
|
+
WHERE conversation_id = ? AND transcript_id = ? AND objective_id = ?`).all(conversationId, readCurrentTranscriptId(getSqliteDatabase(), conversationId) ?? "", wait?.objectiveId ?? input.id);
|
|
249
|
+
return (wait?.needs ?? stored.map((row) => ({
|
|
250
|
+
key: `${row.connector_id}:${row.account_id}`,
|
|
251
|
+
connectorId: row.connector_id,
|
|
252
|
+
accountId: row.account_id,
|
|
253
|
+
label: getConnectorAccount(row.account_id)?.label ?? row.connector_id,
|
|
254
|
+
capabilities: []
|
|
255
|
+
}))).map((need) => {
|
|
256
|
+
const accountId = need.accountId ?? (need.connectionId ? getConnectorConnection(need.connectionId)?.accountId : void 0);
|
|
257
|
+
const account = accountId ? getConnectorAccount(accountId) : void 0;
|
|
258
|
+
return {
|
|
259
|
+
...need,
|
|
260
|
+
accountId,
|
|
261
|
+
connectionId: account?.currentConnectionId ?? need.connectionId
|
|
262
|
+
};
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
/** Changes to the objective or transcript invalidate an outstanding action approval. */
|
|
266
|
+
function connectorObjectiveScope(conversationId) {
|
|
267
|
+
const state = getSessionInputState(conversationId);
|
|
268
|
+
const input = state.activeInputId ? getSessionInputById(conversationId, state.activeInputId) : void 0;
|
|
269
|
+
if (!input) return void 0;
|
|
270
|
+
const active = getActiveConnectionWait(conversationId);
|
|
271
|
+
const wait = input.payload ? getConnectionWait(input.payload.waitId) : active?.originInputId === input.id ? active : void 0;
|
|
272
|
+
return JSON.stringify([
|
|
273
|
+
readCurrentTranscriptId(getSqliteDatabase(), conversationId),
|
|
274
|
+
wait?.objectiveId ?? input.id,
|
|
275
|
+
wait?.objectiveRevision ?? 0
|
|
276
|
+
]);
|
|
277
|
+
}
|
|
278
|
+
function bindObjectiveAccount(conversationId, connectorId, accountId) {
|
|
279
|
+
const db = getSqliteDatabase();
|
|
280
|
+
const state = getSessionInputState(conversationId);
|
|
281
|
+
const input = state.activeInputId ? getSessionInputById(conversationId, state.activeInputId) : void 0;
|
|
282
|
+
if (!input) return;
|
|
283
|
+
const wait = input.payload ? getConnectionWait(input.payload.waitId) : void 0;
|
|
284
|
+
db.prepare(`INSERT OR IGNORE INTO connector_objective_accounts
|
|
285
|
+
(conversation_id, transcript_id, objective_id, connector_id, account_id) VALUES (?, ?, ?, ?, ?)`).run(conversationId, readCurrentTranscriptId(db, conversationId) ?? "", wait?.objectiveId ?? input.id, connectorId, accountId);
|
|
228
286
|
}
|
|
229
287
|
function connectionBinding(conversationId, connectorId) {
|
|
230
288
|
const matches = connectionBindings(conversationId).filter((need) => need.connectorId === connectorId);
|
|
@@ -334,15 +392,18 @@ function listConnectionWaitsToCheck() {
|
|
|
334
392
|
}
|
|
335
393
|
var log, events;
|
|
336
394
|
var init_connection_wait_repository = __esmMin((() => {
|
|
395
|
+
init_connector_account_repository();
|
|
396
|
+
init_connector_repository();
|
|
337
397
|
init_logger();
|
|
338
398
|
init_task_run_repository();
|
|
339
399
|
init_connection();
|
|
340
400
|
init_transaction();
|
|
341
401
|
init_session_instance_repository();
|
|
402
|
+
init_session_repository();
|
|
342
403
|
init_session_input_repository();
|
|
343
404
|
log = createLogger("Connectors:Wait");
|
|
344
405
|
events = new EventEmitter();
|
|
345
406
|
}));
|
|
346
407
|
//#endregion
|
|
347
408
|
init_connection_wait_repository();
|
|
348
|
-
export { cancelConnectionObjective, connectionBinding, connectionBindings, consumeConnectionResume, getActiveConnectionWait, getConnectionResumeInput, getConnectionWait, init_connection_wait_repository, invalidateConnectionResumeIntent, isConnectionSuspended, listConnectionWaitsToCheck, onConnectionWaitChanged, publishConnectionWait, queueConnectionResolution, requireSessionConnection, reviseCurrentConnectionObjective, updateConnectionWait };
|
|
409
|
+
export { bindObjectiveAccount, cancelConnectionObjective, connectionBinding, connectionBindings, connectorObjectiveScope, consumeConnectionResume, getActiveConnectionWait, getConnectionResumeInput, getConnectionWait, init_connection_wait_repository, invalidateConnectionResumeIntent, isConnectionSuspended, listConnectionWaitsToCheck, onConnectionWaitChanged, publishConnectionWait, queueConnectionResolution, requireSessionConnection, reviseCurrentConnectionObjective, updateConnectionWait };
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import type { ConnectorAccount } from '../../connectors/types.js';
|
|
2
2
|
export declare function getConnectorAccount(id: string): ConnectorAccount | undefined;
|
|
3
|
+
export declare function updateConnectorAccount(id: string, patch: {
|
|
4
|
+
label?: string;
|
|
5
|
+
enabled?: boolean;
|
|
6
|
+
allowedAgentIds?: string[] | null;
|
|
7
|
+
}): ConnectorAccount;
|
|
3
8
|
export declare function listConnectorAccounts(options?: {
|
|
4
9
|
principalId?: string;
|
|
5
10
|
connectorId?: string;
|
|
@@ -7,6 +12,7 @@ export declare function listConnectorAccounts(options?: {
|
|
|
7
12
|
export declare function refreshConnectorAccountCurrent(accountId: string): ConnectorAccount | undefined;
|
|
8
13
|
export declare function reconcileConnectorAccount(input: {
|
|
9
14
|
connectionId: string;
|
|
15
|
+
backendId?: string;
|
|
10
16
|
identityKey: string;
|
|
11
17
|
identity: Record<string, unknown>;
|
|
12
18
|
}): ConnectorAccount;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
|
|
1
2
|
import { getSqliteDatabase, init_transaction, runSqliteWriteTransaction } from "./transaction.js";
|
|
2
3
|
//#region src/storage/sqlite/connector-account-repository.ts
|
|
3
|
-
init_transaction();
|
|
4
4
|
function parseIdentity(value) {
|
|
5
5
|
try {
|
|
6
6
|
const parsed = JSON.parse(value);
|
|
@@ -15,8 +15,12 @@ function fromRow(row) {
|
|
|
15
15
|
connectorId: row.connector_id,
|
|
16
16
|
principalId: row.principal_id,
|
|
17
17
|
identityKey: row.identity_key ?? void 0,
|
|
18
|
+
backendId: row.backend_id ?? void 0,
|
|
18
19
|
identity: parseIdentity(row.identity_json),
|
|
19
20
|
currentConnectionId: row.current_connection_id ?? void 0,
|
|
21
|
+
label: row.label ?? void 0,
|
|
22
|
+
enabled: row.enabled === 1,
|
|
23
|
+
allowedAgentIds: row.allowed_agent_ids_json === null ? null : JSON.parse(row.allowed_agent_ids_json),
|
|
20
24
|
createdAt: row.created_at,
|
|
21
25
|
updatedAt: row.updated_at
|
|
22
26
|
};
|
|
@@ -74,6 +78,13 @@ function getConnectorAccount(id) {
|
|
|
74
78
|
const row = getSqliteDatabase().prepare("SELECT * FROM connector_accounts WHERE id = ?").get(id);
|
|
75
79
|
return row ? fromRow(row) : void 0;
|
|
76
80
|
}
|
|
81
|
+
function updateConnectorAccount(id, patch) {
|
|
82
|
+
const account = getConnectorAccount(id);
|
|
83
|
+
if (!account) throw new Error("Connector account not found.");
|
|
84
|
+
getSqliteDatabase().prepare(`UPDATE connector_accounts
|
|
85
|
+
SET label = ?, enabled = ?, allowed_agent_ids_json = ?, updated_at = ? WHERE id = ?`).run(patch.label === void 0 ? account.label ?? null : patch.label.trim() || null, patch.enabled ?? account.enabled ? 1 : 0, patch.allowedAgentIds === void 0 ? account.allowedAgentIds === null ? null : JSON.stringify(account.allowedAgentIds) : patch.allowedAgentIds === null ? null : JSON.stringify([...new Set(patch.allowedAgentIds)]), (/* @__PURE__ */ new Date()).toISOString(), id);
|
|
86
|
+
return getConnectorAccount(id);
|
|
87
|
+
}
|
|
77
88
|
function listConnectorAccounts(options = {}) {
|
|
78
89
|
const clauses = [];
|
|
79
90
|
const values = [];
|
|
@@ -109,13 +120,26 @@ function refreshConnectorAccountCurrent(accountId) {
|
|
|
109
120
|
function reconcileConnectorAccount(input) {
|
|
110
121
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
111
122
|
return getConnectorAccount(runSqliteWriteTransaction((db) => {
|
|
112
|
-
const connection = db.prepare(
|
|
123
|
+
const connection = db.prepare(`SELECT c.account_id, c.connector_id, c.principal_id, a.backend_id FROM connector_connections c
|
|
124
|
+
JOIN connector_accounts a ON a.id = c.account_id WHERE c.id = ?`).get(input.connectionId);
|
|
113
125
|
if (!connection?.account_id) throw new Error(`Connector connection not found: ${input.connectionId}`);
|
|
114
126
|
const targetId = db.prepare(`
|
|
115
127
|
SELECT id FROM connector_accounts
|
|
116
|
-
WHERE principal_id = ? AND connector_id = ? AND identity_key = ?
|
|
117
|
-
`).get(connection.principal_id, connection.connector_id, input.identityKey)?.id ?? connection.account_id;
|
|
128
|
+
WHERE principal_id = ? AND connector_id = ? AND identity_key = ? AND backend_id IS ?
|
|
129
|
+
`).get(connection.principal_id, connection.connector_id, input.identityKey, input.backendId ?? connection.backend_id)?.id ?? connection.account_id;
|
|
118
130
|
if (targetId !== connection.account_id) {
|
|
131
|
+
db.prepare(`UPDATE connector_installations SET selected_account_ids_json = (
|
|
132
|
+
SELECT json_group_array(DISTINCT CASE WHEN value = ? THEN ? ELSE value END)
|
|
133
|
+
FROM json_each(connector_installations.selected_account_ids_json))
|
|
134
|
+
WHERE json_type(selected_account_ids_json) = 'array'
|
|
135
|
+
AND EXISTS (SELECT 1 FROM json_each(selected_account_ids_json) WHERE value = ?)`).run(connection.account_id, targetId, connection.account_id);
|
|
136
|
+
db.prepare(`INSERT OR IGNORE INTO connector_objective_accounts
|
|
137
|
+
SELECT conversation_id, transcript_id, objective_id, connector_id, ?
|
|
138
|
+
FROM connector_objective_accounts WHERE account_id = ?`).run(targetId, connection.account_id);
|
|
139
|
+
const source = getConnectorAccount(connection.account_id);
|
|
140
|
+
const target = getConnectorAccount(targetId);
|
|
141
|
+
const agents = source.allowedAgentIds === null ? target.allowedAgentIds : target.allowedAgentIds === null ? source.allowedAgentIds : target.allowedAgentIds.filter((id) => source.allowedAgentIds.includes(id));
|
|
142
|
+
db.prepare(`UPDATE connector_accounts SET enabled = ?, allowed_agent_ids_json = ?, label = COALESCE(label, ?) WHERE id = ?`).run(source.enabled && target.enabled ? 1 : 0, agents === null ? null : JSON.stringify(agents), source.label ?? null, targetId);
|
|
119
143
|
mergeAccountSourceData(db, connection.connector_id, connection.account_id, targetId);
|
|
120
144
|
if (db.prepare("SELECT 1 FROM connector_sync_policies WHERE account_id = ?").get(targetId)) db.prepare("DELETE FROM connector_sync_policies WHERE account_id = ?").run(connection.account_id);
|
|
121
145
|
else db.prepare("UPDATE connector_sync_policies SET account_id = ? WHERE account_id = ?").run(targetId, connection.account_id);
|
|
@@ -133,11 +157,15 @@ function reconcileConnectorAccount(input) {
|
|
|
133
157
|
if (!primary) throw new Error(`Connector account has no authorizations: ${targetId}`);
|
|
134
158
|
db.prepare(`
|
|
135
159
|
UPDATE connector_accounts
|
|
136
|
-
SET identity_key = ?, identity_json = ?, current_connection_id = ?, updated_at = ?
|
|
160
|
+
SET identity_key = ?, identity_json = ?, current_connection_id = ?, updated_at = ?, backend_id = ?
|
|
137
161
|
WHERE id = ?
|
|
138
|
-
`).run(input.identityKey, JSON.stringify(input.identity), primary.id, now, targetId);
|
|
162
|
+
`).run(input.identityKey, JSON.stringify(input.identity), primary.id, now, input.backendId ?? connection.backend_id, targetId);
|
|
139
163
|
return targetId;
|
|
140
164
|
}));
|
|
141
165
|
}
|
|
166
|
+
var init_connector_account_repository = __esmMin((() => {
|
|
167
|
+
init_transaction();
|
|
168
|
+
}));
|
|
142
169
|
//#endregion
|
|
143
|
-
|
|
170
|
+
init_connector_account_repository();
|
|
171
|
+
export { getConnectorAccount, init_connector_account_repository, listConnectorAccounts, reconcileConnectorAccount, refreshConnectorAccountCurrent, updateConnectorAccount };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
|
|
1
2
|
import { getSqliteDatabase, init_transaction, runSqliteWriteTransaction } from "./transaction.js";
|
|
2
3
|
import { randomUUID } from "node:crypto";
|
|
3
4
|
//#region src/storage/sqlite/connector-repository.ts
|
|
4
|
-
init_transaction();
|
|
5
5
|
function parseStringArray(value) {
|
|
6
6
|
try {
|
|
7
7
|
const parsed = JSON.parse(value);
|
|
@@ -27,7 +27,7 @@ function installationFromRow(row) {
|
|
|
27
27
|
allowedAgentIds: parseStringArray(row.allowed_agent_ids_json),
|
|
28
28
|
maxScope: row.max_scope,
|
|
29
29
|
confirmationPolicy: row.confirmation_policy,
|
|
30
|
-
|
|
30
|
+
selectedAccountIds: row.selected_account_ids_json === "null" ? null : parseStringArray(row.selected_account_ids_json),
|
|
31
31
|
createdAt: row.created_at,
|
|
32
32
|
updatedAt: row.updated_at
|
|
33
33
|
};
|
|
@@ -101,6 +101,7 @@ function catalogFromRow(row) {
|
|
|
101
101
|
function approvalFromRow(row) {
|
|
102
102
|
return {
|
|
103
103
|
id: row.id,
|
|
104
|
+
waitId: row.wait_id ?? void 0,
|
|
104
105
|
principalId: row.principal_id,
|
|
105
106
|
connectorId: row.connector_id,
|
|
106
107
|
connectionId: row.connection_id ?? void 0,
|
|
@@ -129,9 +130,9 @@ function createConnectorApproval(input) {
|
|
|
129
130
|
INSERT INTO connector_approvals (
|
|
130
131
|
id, principal_id, connector_id, connection_id, agent_id, conversation_id, action_id,
|
|
131
132
|
scope, arguments_hash, arguments_preview_json, status, expires_at, created_at,
|
|
132
|
-
decided_at, consumed_at
|
|
133
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
134
|
-
`).run(record.id, record.principalId, record.connectorId, record.connectionId ?? null, record.agentId ?? null, record.conversationId ?? null, record.actionId, record.scope, record.argumentsHash, JSON.stringify(record.argumentsPreview), record.status, record.expiresAt, record.createdAt, record.decidedAt ?? null, record.consumedAt ?? null);
|
|
133
|
+
decided_at, consumed_at, wait_id
|
|
134
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
135
|
+
`).run(record.id, record.principalId, record.connectorId, record.connectionId ?? null, record.agentId ?? null, record.conversationId ?? null, record.actionId, record.scope, record.argumentsHash, JSON.stringify(record.argumentsPreview), record.status, record.expiresAt, record.createdAt, record.decidedAt ?? null, record.consumedAt ?? null, record.waitId ?? null);
|
|
135
136
|
});
|
|
136
137
|
return record;
|
|
137
138
|
}
|
|
@@ -223,7 +224,7 @@ function upsertConnectorInstallation(input) {
|
|
|
223
224
|
db.prepare(`
|
|
224
225
|
INSERT INTO connector_installations (
|
|
225
226
|
id, connector_id, principal_id, enabled, allowed_agent_ids_json, max_scope,
|
|
226
|
-
confirmation_policy,
|
|
227
|
+
confirmation_policy, selected_account_ids_json, created_at, updated_at
|
|
227
228
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
228
229
|
ON CONFLICT(id) DO UPDATE SET
|
|
229
230
|
connector_id = excluded.connector_id,
|
|
@@ -232,9 +233,9 @@ function upsertConnectorInstallation(input) {
|
|
|
232
233
|
allowed_agent_ids_json = excluded.allowed_agent_ids_json,
|
|
233
234
|
max_scope = excluded.max_scope,
|
|
234
235
|
confirmation_policy = excluded.confirmation_policy,
|
|
235
|
-
|
|
236
|
+
selected_account_ids_json = excluded.selected_account_ids_json,
|
|
236
237
|
updated_at = excluded.updated_at
|
|
237
|
-
`).run(input.id, input.connectorId, input.principalId, input.enabled ? 1 : 0, JSON.stringify(input.allowedAgentIds), input.maxScope, input.confirmationPolicy, JSON.stringify(input.
|
|
238
|
+
`).run(input.id, input.connectorId, input.principalId, input.enabled ? 1 : 0, JSON.stringify(input.allowedAgentIds), input.maxScope, input.confirmationPolicy, JSON.stringify(input.selectedAccountIds), input.createdAt ?? now, input.updatedAt ?? now);
|
|
238
239
|
return getConnectorInstallation(input.id);
|
|
239
240
|
});
|
|
240
241
|
}
|
|
@@ -251,7 +252,7 @@ function deleteConnectorInstallation(id) {
|
|
|
251
252
|
function upsertConnectorConnection(input) {
|
|
252
253
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
253
254
|
return runSqliteWriteTransaction((db) => {
|
|
254
|
-
const accountId = input.accountId ?? `account:${input.id}`;
|
|
255
|
+
const accountId = db.prepare("SELECT account_id FROM connector_connections WHERE id = ?").get(input.id)?.account_id ?? input.accountId ?? `account:${input.id}`;
|
|
255
256
|
db.prepare(`
|
|
256
257
|
INSERT INTO connector_accounts (
|
|
257
258
|
id, connector_id, principal_id, identity_json, current_connection_id, created_at, updated_at
|
|
@@ -400,5 +401,9 @@ function releaseConnectorWebhookDelivery(id, error) {
|
|
|
400
401
|
`).run(message.slice(0, 500), id);
|
|
401
402
|
});
|
|
402
403
|
}
|
|
404
|
+
var init_connector_repository = __esmMin((() => {
|
|
405
|
+
init_transaction();
|
|
406
|
+
}));
|
|
403
407
|
//#endregion
|
|
404
|
-
|
|
408
|
+
init_connector_repository();
|
|
409
|
+
export { appendConnectorExecutionAudit, claimConnectorWebhookDelivery, completeConnectorWebhookDelivery, consumeConnectorApproval, createConnectorApproval, decideConnectorApproval, deleteConnectorConnection, deleteConnectorInstallation, getCachedConnectorCatalogEntry, getConnectorApproval, getConnectorConnection, getConnectorInstallation, init_connector_repository, listCachedConnectorCatalogEntries, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation };
|
|
@@ -53,7 +53,7 @@ function upsertConnectorSyncPolicy(input) {
|
|
|
53
53
|
interval_minutes = excluded.interval_minutes,
|
|
54
54
|
allowed_scenario_keys_json = excluded.allowed_scenario_keys_json,
|
|
55
55
|
revision = connector_sync_policies.revision + 1,
|
|
56
|
-
updated_at = excluded.updated_at`).run(input.accountId, input.scanEnabled ?? current?.scanEnabled ??
|
|
56
|
+
updated_at = excluded.updated_at`).run(input.accountId, input.scanEnabled ?? current?.scanEnabled ?? false ? 1 : 0, input.proactiveEnabled ?? current?.proactiveEnabled ?? false ? 1 : 0, intervalMinutes, JSON.stringify(allowedScenarioKeys), now);
|
|
57
57
|
});
|
|
58
58
|
return getConnectorSyncPolicy(input.accountId);
|
|
59
59
|
}
|
|
@@ -28,6 +28,8 @@ import { COMPOSER_INPUT_HISTORY_LIMIT, appendComposerInputHistory, clearComposer
|
|
|
28
28
|
import { bindEndpointPrincipal, createEndpointPrincipal, getEndpointPrincipal, listEndpointPrincipals, revokeEndpointPrincipal, touchEndpointPrincipal } from "./endpoint-principal-repository.js";
|
|
29
29
|
import { finishEndpointToolInvocationAudit, listEndpointToolInvocationAudits, startEndpointToolInvocationAudit } from "./endpoint-tool-invocation-repository.js";
|
|
30
30
|
import { getInteractionState, setInteractionState, updateInteractionStateFromMessage } from "./interaction-state-repository.js";
|
|
31
|
+
import { getConnectorAccount, init_connector_account_repository, listConnectorAccounts, reconcileConnectorAccount, refreshConnectorAccountCurrent } from "./connector-account-repository.js";
|
|
32
|
+
import { appendConnectorExecutionAudit, claimConnectorWebhookDelivery, completeConnectorWebhookDelivery, consumeConnectorApproval, createConnectorApproval, decideConnectorApproval, deleteConnectorConnection, deleteConnectorInstallation, getCachedConnectorCatalogEntry, getConnectorApproval, getConnectorConnection, getConnectorInstallation, init_connector_repository, listCachedConnectorCatalogEntries, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation } from "./connector-repository.js";
|
|
31
33
|
import { deleteSessionRecord, ensureSessionRecord, findConversationIdByTranscriptId, getCurrentTranscriptId, getGlobalSessionStats, getSessionMetadata, getSessionPersistedLevels, incrementSessionStatsOnAppend, init_session_repository, listSessionMetadata, listSessionsByAgent, patchSessionMetadata, resetSessionRecord, resolveSessionAgentId, updateSessionStats } from "./session-repository.js";
|
|
32
34
|
import { getSessionTaskPlan, setSessionTaskPlan } from "./session-task-plan-repository.js";
|
|
33
35
|
import { buildRelationshipPrompt, getRelationshipSettings, isProactiveSupportAllowed, updateRelationshipSettings } from "./relationship-settings-repository.js";
|
|
@@ -37,8 +39,6 @@ import { deleteNoteAgentContextRecord, getNoteAgentContextRecord, upsertNoteAgen
|
|
|
37
39
|
import { claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, countKnowledgeSourceItems, deleteKnowledgeSourceItems, finishKnowledgeSyncRun, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, pruneBoundedKnowledgeSourceItems, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, startKnowledgeSyncRun, upsertKnowledgeSourceItems } from "./knowledge-repository.js";
|
|
38
40
|
import { deleteSessionConfig, getSessionConfig, hasSessionConfig, setSessionConfig, updateSessionConfig } from "./config-repository.js";
|
|
39
41
|
import { createObjectLinkRecord, deleteObjectLinkRecord, getActivityEventRecord, listActivityRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, recordActivityEvent } from "./activity-repository.js";
|
|
40
|
-
import { appendConnectorExecutionAudit, claimConnectorWebhookDelivery, completeConnectorWebhookDelivery, consumeConnectorApproval, createConnectorApproval, decideConnectorApproval, deleteConnectorConnection, deleteConnectorInstallation, getCachedConnectorCatalogEntry, getConnectorApproval, getConnectorConnection, getConnectorInstallation, listCachedConnectorCatalogEntries, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation } from "./connector-repository.js";
|
|
41
|
-
import { getConnectorAccount, listConnectorAccounts, reconcileConnectorAccount, refreshConnectorAccountCurrent } from "./connector-account-repository.js";
|
|
42
42
|
import { getConnectorSyncPolicy, getConnectorSyncPolicyForConnection, listConnectorSyncPolicies, upsertConnectorSyncPolicy } from "./connector-sync-policy-repository.js";
|
|
43
43
|
import { getUserTrustPolicy, setUserTrustPolicy } from "./user-trust-repository.js";
|
|
44
44
|
//#region src/storage/sqlite/index.ts
|
|
@@ -53,5 +53,7 @@ init_session_input_repository();
|
|
|
53
53
|
init_session_metadata();
|
|
54
54
|
init_row_mappers();
|
|
55
55
|
init_session_repository();
|
|
56
|
+
init_connector_repository();
|
|
57
|
+
init_connector_account_repository();
|
|
56
58
|
//#endregion
|
|
57
59
|
export { COMPOSER_INPUT_HISTORY_LIMIT, DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, DatabaseSchemaTooOldError, SCHEMA_META_SCHEMA_VERSION_KEY, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION, acknowledgeHomeAttention, appendCompactionBoundaryIfUnchanged, appendComposerInputHistory, appendConnectorExecutionAudit, appendMediaToAssistantTranscriptEntry, appendTranscriptEntry, applyPendingMigrations, authenticateDeviceAccessToken, bindEndpointPrincipal, buildDefaultSessionMetadata, buildGlobalSessionStats, buildRefreshProofMessage, buildRelationshipPrompt, cancelQueuedSessionInput, claimConnectorWebhookDelivery, claimContextExtractionRun, claimKnowledgeSourceItems, claimNextConnectorLearningJob, claimNextSessionInput, classifyStoredRow, clearComposerInputHistory, clearGatewayIdentityForTest, closeTemporalAssertions, closeXopcDatabase, completeConnectorWebhookDelivery, completeKnowledgeSourceItemSynthesis, consumeClarificationApproval, consumeClarificationResume, consumeConnectorApproval, countKnowledgeSourceItems, createClarificationWait, createCollaborationRule, createConnectorApproval, createContextEvidence, createDevice, createDevicePairingSetup, createEndpointPrincipal, createObjectLinkRecord, createTemporalAssertion, decideConnectorApproval, deleteBrowserTabBinding, deleteBrowserTabBindingsByEndpoint, deleteBrowserTabBindingsByPrincipal, deleteConnectorConnection, deleteConnectorInstallation, deleteEndpointSessionBinding, deleteEndpointSessionBindingsByPrincipal, deleteKnowledgeSourceItems, deleteNoteAgentContextRecord, deleteNoteRecord, deleteObjectLinkRecord, deleteSessionConfig, deleteSessionRecord, discoverSqlMigrations, enqueueConnectorLearningJob, ensureSessionRecord, ensureXopcDatabaseSchema, estimateTokensFromMessages, extractFtsContent, findConversationIdByTranscriptId, findLatestAssistantTranscriptEntryId, findSessionInput, finishContextExtractionRun, finishEndpointToolInvocationAudit, finishKnowledgeSyncRun, finishSessionInputRun, getActiveClarification, getActivityEventRecord, getBrowserTabBinding, getBrowserTabBindingById, getCachedConnectorCatalogEntry, getClarification, getClarificationResumeInput, getClarificationSnapshot, getCollaborationRule, getConnectorAccount, getConnectorApproval, getConnectorConnection, getConnectorInstallation, getConnectorSyncPolicy, getConnectorSyncPolicyForConnection, getContextExtractionRun, getCurrentTranscriptId, getDevice, getEndpointPrincipal, getEndpointSessionBinding, getGlobalSessionStats, getInteractionState, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, getNoteAgentContextRecord, getNoteRecord, getOrCreateGatewayIdentity, getRelationshipSettings, getSessionConfig, getSessionInputById, getSessionInputState, getSessionMetadata, getSessionPersistedLevels, getSessionTaskPlan, getSqliteDatabase, getUserPeopleIndexState, getUserPerson, getUserTrustPolicy, getXopcDatabase, hasIndependentExtractionOutput, hasSessionConfig, incrementSessionStatsOnAppend, insertSessionInput, inspectSchemaMigrationStatus, isClarificationSuspended, isDevicePairingSetupActive, isHomeAttentionAcknowledged, isProactiveSupportAllowed, isXopcDatabaseOpen, issueDeviceTokenPair, linkContextObjects, listActiveSessionInputRuns, listActivityRecords, listCachedConnectorCatalogEntries, listCollaborationRules, listCompactionBoundaries, listComposerInputHistory, listConnectorAccounts, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, listConnectorLearningJobs, listConnectorSyncPolicies, listContextExtractionOutputs, listContextExtractionRuns, listContextObjectRelations, listDevices, listEndpointPrincipals, listEndpointToolInvocationAudits, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listNoteRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, listTemporalAssertions, listUserPeople, loadCompactionSourceSnapshot, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRows, loadTranscriptRowsForSession, mergeUserPeople, metadataToSessionInsert, mutateQueuedSessionInput, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, pruneBoundedKnowledgeSourceItems, readSchemaVersion, readSchemaVersionForTest, reconcileConnectorAccount, recordActivityEvent, recoverSessionInputState, recoverStaleConnectorLearningJobs, refreshConnectorAccountCurrent, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, replaceLatestSessionTurnAndQueueInput, replaceTranscriptRows, replaceUserPeopleIndex, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveClarification, resolveMigrationsDir, resolveSessionAgentId, resolveXopcDatabasePath, restoreBeforeCompactionBoundary, revokeDevice, revokeEndpointPrincipal, rotateDeviceRefreshToken, runSqliteWriteTransaction, searchSessionTranscript, sessionConfigRowToConfig, sessionRowToMetadata, setBrowserTabBinding, setCollaborationRuleStatus, setConnectorLearningPaused, setEndpointSessionBinding, setInteractionState, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, setSessionConfig, setSessionInputStatus, setSessionTaskPlan, setUserTrustPolicy, signGatewayPayload, startEndpointToolInvocationAudit, startKnowledgeSyncRun, summarizeUserPeople, supersedeActiveClarification, touchEndpointPrincipal, transcriptEntryRowToStoredRow, updateConnectorLearningJob, updateInteractionStateFromMessage, updateRelationshipSettings, updateSessionConfig, updateSessionStats, updateUserPerson, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation, upsertConnectorSyncPolicy, upsertKnowledgeSourceItems, upsertNoteAgentContextRecord, upsertNoteRecord, validateLatestSessionTurnTarget };
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
ALTER TABLE connector_installations RENAME COLUMN selected_connection_ids_json TO selected_account_ids_json;
|
|
2
|
+
UPDATE connector_installations
|
|
3
|
+
SET selected_account_ids_json = CASE
|
|
4
|
+
WHEN json_array_length(selected_account_ids_json) = 0 THEN 'null'
|
|
5
|
+
ELSE (
|
|
6
|
+
SELECT json_group_array(DISTINCT c.account_id)
|
|
7
|
+
FROM json_each(connector_installations.selected_account_ids_json) selected
|
|
8
|
+
JOIN connector_connections c ON c.id = selected.value
|
|
9
|
+
WHERE c.principal_id = connector_installations.principal_id
|
|
10
|
+
AND c.connector_id = connector_installations.connector_id
|
|
11
|
+
AND c.account_id IS NOT NULL
|
|
12
|
+
)
|
|
13
|
+
END;
|
|
14
|
+
|
|
15
|
+
ALTER TABLE connector_accounts ADD COLUMN label TEXT;
|
|
16
|
+
ALTER TABLE connector_accounts ADD COLUMN enabled INTEGER NOT NULL DEFAULT 1;
|
|
17
|
+
ALTER TABLE connector_accounts ADD COLUMN allowed_agent_ids_json TEXT;
|
|
18
|
+
UPDATE connector_accounts SET label = (
|
|
19
|
+
SELECT alias FROM connector_connections WHERE account_id = connector_accounts.id
|
|
20
|
+
AND alias IS NOT NULL ORDER BY is_default DESC, updated_at DESC LIMIT 1
|
|
21
|
+
);
|
|
22
|
+
|
|
23
|
+
CREATE TABLE connector_backends (
|
|
24
|
+
id TEXT PRIMARY KEY,
|
|
25
|
+
mode TEXT NOT NULL CHECK(mode IN ('managed', 'byok')),
|
|
26
|
+
label TEXT NOT NULL,
|
|
27
|
+
credential_ref TEXT,
|
|
28
|
+
credential_source TEXT NOT NULL DEFAULT 'stored' CHECK(credential_source IN ('stored','environment')),
|
|
29
|
+
verified_at TEXT,
|
|
30
|
+
active INTEGER NOT NULL DEFAULT 0,
|
|
31
|
+
created_at TEXT NOT NULL
|
|
32
|
+
);
|
|
33
|
+
CREATE UNIQUE INDEX idx_connector_backend_active ON connector_backends(active) WHERE active = 1;
|
|
34
|
+
ALTER TABLE connector_accounts ADD COLUMN backend_id TEXT;
|
|
35
|
+
DROP INDEX idx_connector_accounts_identity;
|
|
36
|
+
CREATE UNIQUE INDEX idx_connector_accounts_identity
|
|
37
|
+
ON connector_accounts(principal_id, backend_id, connector_id, identity_key)
|
|
38
|
+
WHERE identity_key IS NOT NULL;
|
|
39
|
+
|
|
40
|
+
CREATE TABLE connector_objective_accounts (
|
|
41
|
+
conversation_id TEXT NOT NULL,
|
|
42
|
+
transcript_id TEXT NOT NULL,
|
|
43
|
+
objective_id TEXT NOT NULL,
|
|
44
|
+
connector_id TEXT NOT NULL,
|
|
45
|
+
account_id TEXT NOT NULL REFERENCES connector_accounts(id) ON DELETE CASCADE,
|
|
46
|
+
PRIMARY KEY(conversation_id, transcript_id, objective_id, connector_id, account_id)
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
-- Provider IDs are scoped to a backend, not the whole installation.
|
|
50
|
+
CREATE TABLE connector_connections_next (
|
|
51
|
+
id TEXT PRIMARY KEY,
|
|
52
|
+
installation_id TEXT REFERENCES connector_installations(id) ON DELETE SET NULL,
|
|
53
|
+
connector_id TEXT NOT NULL,
|
|
54
|
+
provider TEXT NOT NULL,
|
|
55
|
+
principal_id TEXT NOT NULL,
|
|
56
|
+
provider_connection_id TEXT NOT NULL,
|
|
57
|
+
alias TEXT,
|
|
58
|
+
identity_json TEXT NOT NULL DEFAULT '{}',
|
|
59
|
+
status TEXT NOT NULL DEFAULT 'unknown' CHECK(status IN ('pending','active','expired','failed','revoked','disabled','unknown')),
|
|
60
|
+
is_default INTEGER NOT NULL DEFAULT 0 CHECK(is_default IN (0,1)),
|
|
61
|
+
connected_at TEXT,
|
|
62
|
+
expires_at TEXT,
|
|
63
|
+
last_error TEXT,
|
|
64
|
+
metadata_json TEXT NOT NULL DEFAULT '{}',
|
|
65
|
+
created_at TEXT NOT NULL,
|
|
66
|
+
updated_at TEXT NOT NULL,
|
|
67
|
+
account_id TEXT REFERENCES connector_accounts(id) ON DELETE CASCADE
|
|
68
|
+
);
|
|
69
|
+
INSERT INTO connector_connections_next SELECT * FROM connector_connections;
|
|
70
|
+
DROP TABLE connector_connections;
|
|
71
|
+
ALTER TABLE connector_connections_next RENAME TO connector_connections;
|
|
72
|
+
CREATE INDEX idx_connector_connections_principal ON connector_connections(principal_id, connector_id, status);
|
|
73
|
+
CREATE INDEX idx_connector_connections_account ON connector_connections(account_id);
|
|
74
|
+
CREATE UNIQUE INDEX idx_connector_connections_provider_backend
|
|
75
|
+
ON connector_connections(provider, COALESCE(json_extract(metadata_json, '$.backendId'), ''), provider_connection_id);
|
|
76
|
+
|
|
77
|
+
CREATE TABLE connector_authorization_attempts (
|
|
78
|
+
id TEXT PRIMARY KEY,
|
|
79
|
+
principal_id TEXT NOT NULL,
|
|
80
|
+
connector_id TEXT NOT NULL,
|
|
81
|
+
backend_id TEXT,
|
|
82
|
+
connection_id TEXT NOT NULL REFERENCES connector_connections(id) ON DELETE CASCADE,
|
|
83
|
+
expected_account_id TEXT,
|
|
84
|
+
authorization_url TEXT,
|
|
85
|
+
status TEXT NOT NULL CHECK(status IN ('awaiting_user','succeeded','failed','expired')),
|
|
86
|
+
expires_at INTEGER NOT NULL,
|
|
87
|
+
created_at INTEGER NOT NULL
|
|
88
|
+
);
|
|
89
|
+
CREATE INDEX idx_connector_authorization_attempt_scope ON connector_authorization_attempts(principal_id,connector_id,created_at);
|
|
90
|
+
CREATE TABLE connector_runtime_identity (id INTEGER PRIMARY KEY CHECK(id = 1), installation_id TEXT NOT NULL);
|
|
91
|
+
INSERT INTO connector_runtime_identity VALUES(1, lower(hex(randomblob(16))));
|
|
92
|
+
ALTER TABLE connector_approvals ADD COLUMN wait_id TEXT;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
-- Repair only accounts whose authorizations agree on one known backend.
|
|
2
|
+
-- Identity collisions are reconciled transactionally by the next provider sync.
|
|
3
|
+
WITH candidates AS (
|
|
4
|
+
SELECT c.account_id, MIN(json_extract(c.metadata_json, '$.backendId')) AS backend_id
|
|
5
|
+
FROM connector_connections c
|
|
6
|
+
GROUP BY c.account_id
|
|
7
|
+
HAVING COUNT(DISTINCT json_extract(c.metadata_json, '$.backendId')) = 1
|
|
8
|
+
AND COUNT(json_extract(c.metadata_json, '$.backendId')) = COUNT(*)
|
|
9
|
+
)
|
|
10
|
+
UPDATE connector_accounts AS account
|
|
11
|
+
SET backend_id = (SELECT backend_id FROM candidates WHERE account_id = account.id)
|
|
12
|
+
WHERE account.backend_id IS NULL
|
|
13
|
+
AND EXISTS (SELECT 1 FROM candidates JOIN connector_backends backend ON backend.id = candidates.backend_id WHERE candidates.account_id = account.id)
|
|
14
|
+
AND NOT EXISTS (
|
|
15
|
+
SELECT 1 FROM connector_accounts other JOIN candidates ON candidates.account_id = account.id
|
|
16
|
+
WHERE other.id <> account.id
|
|
17
|
+
AND COALESCE(other.backend_id, (SELECT backend_id FROM candidates WHERE account_id = other.id)) = candidates.backend_id
|
|
18
|
+
AND other.principal_id = account.principal_id AND other.connector_id = account.connector_id
|
|
19
|
+
AND other.identity_key = account.identity_key
|
|
20
|
+
);
|
|
@@ -3,7 +3,7 @@ import type { ApplyMigrationsOptions } from './types.js';
|
|
|
3
3
|
/** Baseline schema version applied from schema.sql on first open. */
|
|
4
4
|
export declare const XOPC_DB_BASELINE_SCHEMA_VERSION = 165;
|
|
5
5
|
/** Latest schema version this release supports (increment when adding migrations). */
|
|
6
|
-
export declare const XOPC_DB_SCHEMA_VERSION =
|
|
6
|
+
export declare const XOPC_DB_SCHEMA_VERSION = 183;
|
|
7
7
|
export declare function resolveMigrationsDir(override?: string): string;
|
|
8
8
|
/**
|
|
9
9
|
* Apply sequential SQL migrations from (currentVersion + 1) through targetVersion.
|
|
@@ -35,16 +35,16 @@ function applySingleMigration(db, migration) {
|
|
|
35
35
|
targetVersion: migration.targetVersion,
|
|
36
36
|
file: migration.filename
|
|
37
37
|
}, "Applying SQLite migration");
|
|
38
|
-
const
|
|
38
|
+
const rebuildParentTable = migration.targetVersion === 179 || migration.targetVersion === 182;
|
|
39
39
|
const foreignKeysEnabled = Number(db.prepare("PRAGMA foreign_keys").get()?.foreign_keys) === 1;
|
|
40
|
-
if (
|
|
40
|
+
if (rebuildParentTable) db.exec("PRAGMA foreign_keys = OFF");
|
|
41
41
|
let transactionStarted = false;
|
|
42
42
|
try {
|
|
43
43
|
db.exec("BEGIN IMMEDIATE");
|
|
44
44
|
transactionStarted = true;
|
|
45
45
|
db.exec(migration.sql);
|
|
46
46
|
const summary = migration.targetVersion === 178 ? migrateConversationUuids(db) : void 0;
|
|
47
|
-
if (
|
|
47
|
+
if (rebuildParentTable && db.prepare("PRAGMA foreign_key_check").all().length > 0) throw new Error("Parent table migration would violate foreign key integrity");
|
|
48
48
|
setSchemaVersion(db, migration.targetVersion);
|
|
49
49
|
db.exec("COMMIT");
|
|
50
50
|
return summary;
|
|
@@ -55,7 +55,7 @@ function applySingleMigration(db, migration) {
|
|
|
55
55
|
const em = error instanceof Error ? error.message : String(error);
|
|
56
56
|
throw new Error(`SQLite migration to v${migration.targetVersion} (${migration.filename}) failed: ${em}`, { cause: error });
|
|
57
57
|
} finally {
|
|
58
|
-
if (
|
|
58
|
+
if (rebuildParentTable && foreignKeysEnabled) db.exec("PRAGMA foreign_keys = ON");
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
/**
|
|
@@ -63,7 +63,7 @@ function applySingleMigration(db, migration) {
|
|
|
63
63
|
* Each step runs in its own transaction and updates schema_meta on success.
|
|
64
64
|
*/
|
|
65
65
|
function applyPendingMigrations(db, options = {}) {
|
|
66
|
-
const targetVersion = options.targetVersion ??
|
|
66
|
+
const targetVersion = options.targetVersion ?? 183;
|
|
67
67
|
let currentVersion = readSchemaVersion(db);
|
|
68
68
|
if (currentVersion > targetVersion) throw new DatabaseSchemaTooNewError(currentVersion, targetVersion);
|
|
69
69
|
if (!options.migrationsDir && currentVersion < 165) throw new DatabaseSchemaTooOldError(currentVersion, 165);
|
|
@@ -118,7 +118,7 @@ function applyPendingMigrations(db, options = {}) {
|
|
|
118
118
|
}
|
|
119
119
|
/** Inspect schema version without mutating the database. */
|
|
120
120
|
function inspectSchemaMigrationStatus(db, options = {}) {
|
|
121
|
-
const appVersion = options.targetVersion ??
|
|
121
|
+
const appVersion = options.targetVersion ?? 183;
|
|
122
122
|
const dbVersion = readSchemaVersion(db);
|
|
123
123
|
if (dbVersion > appVersion) return {
|
|
124
124
|
dbVersion,
|
|
@@ -157,7 +157,7 @@ var init_runner = __esmMin((() => {
|
|
|
157
157
|
init_errors();
|
|
158
158
|
log = createLogger("Sqlite:Migrations");
|
|
159
159
|
XOPC_DB_BASELINE_SCHEMA_VERSION = 165;
|
|
160
|
-
XOPC_DB_SCHEMA_VERSION =
|
|
160
|
+
XOPC_DB_SCHEMA_VERSION = 183;
|
|
161
161
|
MODULE_DIR = dirname(fileURLToPath(import.meta.url));
|
|
162
162
|
}));
|
|
163
163
|
//#endregion
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { isHomeAttentionAcknowledged } from "../storage/sqlite/home-attention-repository.js";
|
|
2
|
-
import { getRelationshipSettings } from "../storage/sqlite/relationship-settings-repository.js";
|
|
3
2
|
import { listConnectorApprovals } from "../storage/sqlite/connector-repository.js";
|
|
3
|
+
import { getRelationshipSettings } from "../storage/sqlite/relationship-settings-repository.js";
|
|
4
4
|
import "../storage/sqlite/index.js";
|
|
5
5
|
import { TaskRepository } from "./task-repository.js";
|
|
6
6
|
import { TaskReadModelProjector } from "./task-read-model-projector.js";
|
|
@@ -362,10 +362,10 @@ var HomeQueryService = class {
|
|
|
362
362
|
id: `connector-approval:${approval.id}`,
|
|
363
363
|
kind: "connector_approval",
|
|
364
364
|
title: approval.actionId,
|
|
365
|
-
detail: `${approval.connectorId} · ${approval.scope}`,
|
|
365
|
+
detail: `${approval.connectorId} · ${approval.scope}\n${JSON.stringify(approval.argumentsPreview).slice(0, 1600)}`,
|
|
366
366
|
reason: "approval_required",
|
|
367
367
|
urgency: "now",
|
|
368
|
-
href: "/connectors",
|
|
368
|
+
href: approval.conversationId ? `/chat/${encodeURIComponent(approval.conversationId)}` : "/connectors",
|
|
369
369
|
updatedAt: Date.parse(approval.createdAt),
|
|
370
370
|
response: {
|
|
371
371
|
kind: "connector_approval",
|
|
@@ -3,8 +3,8 @@ import { init_logger } from "../../utils/logger.js";
|
|
|
3
3
|
import { transcriptRowsToClientHistory } from "../../session/client-history.js";
|
|
4
4
|
import { parseModelRef } from "../../agent/models/selection.js";
|
|
5
5
|
import { prependEnvelopeTimestamp } from "../../channels/envelope-timestamp.js";
|
|
6
|
-
import { RealtimeClient } from "../../../packages/realtime-client/src/index.js";
|
|
7
6
|
import { gatewayCredentialAuthorization } from "../../gateway/credential.js";
|
|
7
|
+
import { RealtimeClient } from "../../../packages/realtime-client/src/index.js";
|
|
8
8
|
import { buildTuiTranscriptTree, transcriptTreeEntryIdToRowNumber } from "../tui-transcript-tree.js";
|
|
9
9
|
import { computeTuiSessionStats } from "../tui-session-stats.js";
|
|
10
10
|
import { createRequire } from "node:module";
|
|
@@ -2,10 +2,10 @@ import { resolveStateDir } from "../config/paths-state.js";
|
|
|
2
2
|
import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
|
|
3
3
|
import { init_paths, resolveAgentProfileDir, resolveBundledSkillsDir } from "../config/paths.js";
|
|
4
4
|
import { resolveBootstrapFilesSync } from "../agent/bootstrap/bootstrap-files.js";
|
|
5
|
+
import { listConnectorInstances } from "../connectors/instances.js";
|
|
5
6
|
import { createSkillConfigManager, isSkillEnabled } from "../agent/skills/config.js";
|
|
6
7
|
import { loadSkills } from "../agent/skills/index.js";
|
|
7
8
|
import { createWorkflowCatalog } from "../agent/workflow/catalog.js";
|
|
8
|
-
import { listConnectorInstances } from "../connectors/instances.js";
|
|
9
9
|
import { getWorkspacePath } from "../config/workspace-path-helpers.js";
|
|
10
10
|
import "../config/index.js";
|
|
11
11
|
import { basename } from "node:path";
|
|
@@ -121,7 +121,7 @@ function validateManifest(value, errors) {
|
|
|
121
121
|
field: "manifest.resources"
|
|
122
122
|
});
|
|
123
123
|
}
|
|
124
|
-
if (value.connectors !== void 0 && (!Array.isArray(value.connectors) || value.connectors.some((connector) => !isRecord(connector) || typeof connector.connectorId !== "string" || connector.scope !== void 0 && ![
|
|
124
|
+
if (value.connectors !== void 0 && (!Array.isArray(value.connectors) || value.connectors.some((connector) => !isRecord(connector) || typeof connector.connectorId !== "string" || connector.accountIds !== void 0 && (!Array.isArray(connector.accountIds) || connector.accountIds.length === 0 || connector.accountIds.some((id) => typeof id !== "string" || !id.trim()) || new Set(connector.accountIds).size !== connector.accountIds.length) || connector.scope !== void 0 && ![
|
|
125
125
|
"read",
|
|
126
126
|
"write",
|
|
127
127
|
"admin"
|
|
@@ -195,6 +195,7 @@ var WorkflowRunService = class {
|
|
|
195
195
|
agentId: params.agentId,
|
|
196
196
|
definitionId: params.definitionId,
|
|
197
197
|
definitionTitle: definition.title,
|
|
198
|
+
connectorAccounts: connectorPreflight.accounts,
|
|
198
199
|
triggerSource: params.source.kind,
|
|
199
200
|
goal,
|
|
200
201
|
parentConversationId: params.parentConversationId,
|
|
@@ -386,8 +387,21 @@ var WorkflowRunService = class {
|
|
|
386
387
|
httpStatus: 400
|
|
387
388
|
};
|
|
388
389
|
}
|
|
390
|
+
const replayConnectors = preflightWorkflowConnectors({
|
|
391
|
+
definition,
|
|
392
|
+
config: this.options.service.currentConfig,
|
|
393
|
+
agentId: params.agentId
|
|
394
|
+
});
|
|
395
|
+
if (!replayConnectors.ok) return {
|
|
396
|
+
ok: false,
|
|
397
|
+
code: "connector_preflight_failed",
|
|
398
|
+
message: replayConnectors.issues.map((issue) => issue.message).join(" "),
|
|
399
|
+
httpStatus: 409,
|
|
400
|
+
details: replayConnectors
|
|
401
|
+
};
|
|
389
402
|
const { conversationId } = await this.options.sessionBridge.prepareRunSession({
|
|
390
403
|
runId: replayRunId,
|
|
404
|
+
connectorAccounts: replayConnectors.accounts,
|
|
391
405
|
agentId: params.agentId,
|
|
392
406
|
definitionId: existing.run.definitionId,
|
|
393
407
|
definitionTitle: `${definition.title} replay`,
|
|
@@ -11,6 +11,7 @@ export interface PrepareWorkflowRunSessionParams {
|
|
|
11
11
|
parentConversationId?: string;
|
|
12
12
|
projectId?: string;
|
|
13
13
|
triggerSource?: string;
|
|
14
|
+
connectorAccounts?: Record<string, string[]>;
|
|
14
15
|
}
|
|
15
16
|
export interface PrepareWorkflowRunSessionResult {
|
|
16
17
|
conversationId: string;
|
|
@@ -48,6 +48,7 @@ var WorkflowSessionBridge = class {
|
|
|
48
48
|
workflowRunId: params.runId,
|
|
49
49
|
workflowDefinitionId: params.definitionId,
|
|
50
50
|
workflowGoal: params.goal,
|
|
51
|
+
connectorAccounts: params.connectorAccounts ?? {},
|
|
51
52
|
deferVisibilityUntilOutput: true,
|
|
52
53
|
...params.triggerSource ? { triggerSource: params.triggerSource } : {},
|
|
53
54
|
...params.parentConversationId ? { parentConversationId: params.parentConversationId } : {}
|