@xopcai/xopc 0.0.385 → 0.0.386
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/{agent-avatar-dicebear-Cb9eaXxR.js → agent-avatar-dicebear-D-86VOlb.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-DEV-xtgm.js → agent-defaults-settings-panel-SmeUVHY8.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-plugin-dialog-DXKc3Luj.js → agent-plugin-dialog-BVT3wXq5.js} +1 -1
- package/dist/gateway/static/root/assets/{agents-DcNxwpJQ.js → agents-D7rLQFhX.js} +3 -3
- package/dist/gateway/static/root/assets/{app-management-settings-panel-X5i0Tz7_.js → app-management-settings-panel-CUR7n5iP.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-CmHHzquT.js → appearance-settings-BCotSGep.js} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-ChFA4Zp0.js → apps-page-hk0bo9LT.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-BFqsIqOI.js → automations-page-CqxuUwox.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-workspace-Blfak-fT.js → automations-workspace-11_Z69pr.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-CpOLG3Co.js → block-editor-eldB84Mj.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-automations-page-BSbTJ9j2.js → browser-automations-page-D4TaUPYT.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-settings-page-BUlILJrB.js → browser-settings-page-BXRlxeGV.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-XFwwUNU3.js → capabilities-BkKgImWi.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-2Do3eKMM.js → capabilities-DVj9n65C.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-page-CeRdkwRf.js → capabilities-page-CyYlueEd.js} +2 -2
- package/dist/gateway/static/root/assets/{capabilities-settings-panel-S-cKsGja.js → capabilities-settings-panel-uVEgfvo0.js} +1 -1
- package/dist/gateway/static/root/assets/{capability-header-actions-6w8pQhnn.js → capability-header-actions-BXv0xu56.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-DfNTGBmp.js → channels-fNb3SOzm.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-terminal-dock-DnoQHpDc.js → chat-terminal-dock-CnLtparQ.js} +1 -1
- package/dist/gateway/static/root/assets/{computer-settings-page-7yliE7sG.js → computer-settings-page-xM0AnOlP.js} +1 -1
- package/dist/gateway/static/root/assets/{connector-service-page-DOLAUFSW.js → connector-service-page-CdG2WUb6.js} +1 -1
- package/dist/gateway/static/root/assets/{connectors-page-DAsn97XG.js → connectors-page-BRd08GH6.js} +1 -1
- package/dist/gateway/static/root/assets/constants-CpWu0oHS.js +1 -0
- package/dist/gateway/static/root/assets/{date-picker-DNDqr4Fk.js → date-picker-DIBbE-O8.js} +1 -1
- package/dist/gateway/static/root/assets/{dependency-picker-B5oG7RgE.js → dependency-picker-DDD8zokD.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-K7kUCX1O.js → desktop-pet-KlF390Xn.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-KgOAuqSh.js → desktop-pet-settings-CgqQMKDC.js} +1 -1
- package/dist/gateway/static/root/assets/{device-pairing-wizard-DvqniZDm.js → device-pairing-wizard-BR6isfG2.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field-BmOguLDl.js → directory-picker-path-field-vPQsW05P.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-DtHNy4TE.js → extension-debug-page-ZHLPrLbH.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-DSSuMQxp.js → extension-page-DJ42KFRN.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-provider-nbgU7xBS.js → extension-provider-6IcsyNaV.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-DSd__mNd.js → extension-settings-page-D7-5v0V4.js} +1 -1
- package/dist/gateway/static/root/assets/{fallback-models-D7bjbiwZ.js → fallback-models-DnYn7qOV.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-hSXGWumL.js → gateway-settings-Bwe3JWX-.js} +1 -1
- package/dist/gateway/static/root/assets/{highlighted-body-KQOG7T2V-C7xJwE61.js → highlighted-body-KQOG7T2V-DefTxF3q.js} +1 -1
- package/dist/gateway/static/root/assets/{home-page-DJNmlMfH.js → home-page-BtSy2hRV.js} +1 -1
- package/dist/gateway/static/root/assets/{imports-page-BufZPzGE.js → imports-page-CTdBYZib.js} +1 -1
- package/dist/gateway/static/root/assets/{index-K8SXDtxr.js → index-B08iR7fT.js} +9 -9
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-B8pPP5RF.js → keyboard-shortcuts-settings-CXKp57O_.js} +1 -1
- package/dist/gateway/static/root/assets/{local-app-workbench-page-zEtvE7pJ.js → local-app-workbench-page-DzD_OzGY.js} +1 -1
- package/dist/gateway/static/root/assets/{local-apps-page-Bli7e_eg.js → local-apps-page-B0E0vttg.js} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-BimZk3R4.js → logs-page-eL4fYcMl.js} +1 -1
- package/dist/gateway/static/root/assets/{management-settings-5Y4COyU9.js → management-settings-DSpjodMC.js} +1 -1
- package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-BTrk2wWv.js +1 -0
- package/dist/gateway/static/root/assets/{note-detail-panel-KLDPLVg7.js → note-detail-panel-CsY5tQp5.js} +3 -3
- package/dist/gateway/static/root/assets/{notes-page-DST0oPXD.js → notes-page-D09LjNoj.js} +1 -1
- package/dist/gateway/static/root/assets/{page-context-capture-button-Bmed83-6.js → page-context-capture-button-DO-aP3D9.js} +1 -1
- package/dist/gateway/static/root/assets/{personal-page-BG4Ystrm.js → personal-page-E8F2aGNB.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-CXkYP9xE.js → product-open-page-aUoA-uPw.js} +1 -1
- package/dist/gateway/static/root/assets/{product-preview-content-DjmupQSq.js → product-preview-content-B-cz-pIV.js} +1 -1
- package/dist/gateway/static/root/assets/{project-detail-page-CzBmV0P6.js → project-detail-page-WhefAh8E.js} +1 -1
- package/dist/gateway/static/root/assets/{projects-page-DByqe5Em.js → projects-page-CyqAs0tO.js} +1 -1
- package/dist/gateway/static/root/assets/{remote-access-hub-DTjj-odF.js → remote-access-hub-BwhRGL6m.js} +1 -1
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-B_ptn3T8.js → runtime-tools-settings-panel-o26dmPNq.js} +1 -1
- package/dist/gateway/static/root/assets/{scenes-page-wkua4l5y.js → scenes-page-D_e19kv_.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-VvOSM84Y.js → schema-form-DLLdqUC3.js} +1 -1
- package/dist/gateway/static/root/assets/{send-session-input-BCAF-Ikt.js → send-session-input-2I-nFJcE.js} +1 -1
- package/dist/gateway/static/root/assets/session-manager-Co5ozD0l.js +16 -0
- package/dist/gateway/static/root/assets/{sessions-page-D06XwYAT.js → sessions-page-DX6INsiS.js} +1 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-C4_gW1vw.js +1 -0
- package/dist/gateway/static/root/assets/{settings-page-C-6BJdb1.js → settings-page-Bc_zxxRu.js} +1 -1
- package/dist/gateway/static/root/assets/{setup-status-panel-L0JSG0K-.js → setup-status-panel-FpF_cPPr.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-nJ2FWAEP.js → share-preview-page-BOCcPBqQ.js} +1 -1
- package/dist/gateway/static/root/assets/{shares-settings-BbgAUM3v.js → shares-settings-CInxjxgJ.js} +1 -1
- package/dist/gateway/static/root/assets/{skill-api-BFU1tPyw.js → skill-api-Bjd8WAA4.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page-DZw6el4o.js → skills-page-8CKS3Oo2.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-DshSGWNg.js → system-settings-panel-BgQdsrNw.js} +1 -1
- package/dist/gateway/static/root/assets/task-detail-page-BnG5ehZ6.js +2 -0
- package/dist/gateway/static/root/assets/task-expandable-content-BCuc70Vc.js +1 -0
- package/dist/gateway/static/root/assets/{tasks-DJIeIk9C.js → tasks-PuIUgF9L.js} +1 -1
- package/dist/gateway/static/root/assets/{tunnel-api-DFDXwWnU.js → tunnel-api-CY7MoDGf.js} +1 -1
- package/dist/gateway/static/root/assets/{usage-page-2RJLg54s.js → usage-page-s8Sv_PIG.js} +1 -1
- package/dist/gateway/static/root/assets/{use-composer-attachments-BFP3k6oC.js → use-composer-attachments-D0S2iZF4.js} +1 -1
- package/dist/gateway/static/root/assets/{use-file-preview-expanded-B1BiTQNS.js → use-file-preview-expanded-BElqELib.js} +1 -1
- package/dist/gateway/static/root/assets/{user-model-page-y1gjGYPI.js → user-model-page-CyWrEtHY.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-Ch-KfpCF.js → work-discovery-overlay-DmZXLs1v.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-CTu297Hc.js → workflow-run-setup-panel-BdLOzHm4.js} +1 -1
- package/dist/gateway/static/root/assets/{workflows-page-CRZXG_rm.js → workflows-page-Cx3I3AV5.js} +1 -1
- package/dist/gateway/static/root/assets/{workspace-api-Xr3wz8T3.js → workspace-api-Du7-xJ0q.js} +2 -2
- package/dist/gateway/static/root/assets/{xopc-cloud-account-card-hEfjVjnc.js → xopc-cloud-account-card-D8B136vW.js} +1 -1
- package/dist/gateway/static/root/index.html +11 -11
- package/dist/package.js +1 -1
- package/dist/packages/gateway-contract/src/index.js +2 -0
- package/dist/packages/gateway-contract/src/task-research-result.js +89 -0
- package/dist/packages/gateway-contract/src/tasks.js +7 -1
- package/dist/packages/gateway-contract/src/turn-outcome.js +3 -0
- package/dist/src/agent/child-agent-factory.d.ts +4 -1
- package/dist/src/agent/child-agent-factory.js +86 -12
- package/dist/src/agent/context/connection-objective-context.d.ts +1 -0
- package/dist/src/agent/context/connection-objective-context.js +33 -0
- package/dist/src/agent/data-acquisition/service.js +41 -6
- package/dist/src/agent/data-acquisition/types.d.ts +2 -0
- package/dist/src/agent/embedded/agent-profile-context.d.ts +7 -0
- package/dist/src/agent/embedded/agent-profile-context.js +92 -0
- package/dist/src/agent/embedded/run-for-session.js +5 -2
- package/dist/src/agent/embedded/run-turn.js +19 -6
- package/dist/src/agent/embedded/runs.d.ts +9 -2
- package/dist/src/agent/embedded/runs.js +30 -7
- package/dist/src/agent/embedded/session-runner.js +5 -2
- package/dist/src/agent/embedded/types.d.ts +4 -0
- package/dist/src/agent/external-tools/gateway-tools.js +7 -3
- package/dist/src/agent/orchestration/agent-run-supervisor.js +2 -1
- package/dist/src/agent/orchestration/agent-turn-policy.js +5 -1
- package/dist/src/agent/orchestration/delegation-budget.d.ts +7 -1
- package/dist/src/agent/orchestration/delegation-budget.js +17 -9
- package/dist/src/agent/orchestration/research-checkpoint.d.ts +56 -0
- package/dist/src/agent/orchestration/research-checkpoint.js +64 -0
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.d.ts +3 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js +15 -2
- package/dist/src/agent/orchestration/run-termination.d.ts +12 -0
- package/dist/src/agent/orchestration/run-termination.js +24 -0
- package/dist/src/agent/orchestration/turn-recovery.d.ts +4 -1
- package/dist/src/agent/orchestration/turn-recovery.js +19 -3
- package/dist/src/agent/prompt/sections/agent-identity.js +12 -7
- package/dist/src/agent/prompt/sections/messaging-runtime.js +1 -1
- package/dist/src/agent/prompt/sections/project-context.js +1 -1
- package/dist/src/agent/prompt/sections/response-language.d.ts +1 -1
- package/dist/src/agent/prompt/sections/response-language.js +6 -2
- package/dist/src/agent/prompt/subagent-context.js +1 -1
- package/dist/src/agent/prompt/system-prompt.js +4 -6
- package/dist/src/agent/tasks/task-judge-service.js +3 -1
- package/dist/src/agent/tools/apply-patch.js +1 -1
- package/dist/src/agent/tools/delegate-tool.js +216 -121
- package/dist/src/agent/tools/delegation-policy.js +13 -1
- package/dist/src/agent/tools/factory.js +2 -0
- package/dist/src/agent/tools/index.d.ts +1 -0
- package/dist/src/agent/tools/index.js +2 -1
- package/dist/src/agent/tools/language-diagnostics.js +1 -1
- package/dist/src/agent/tools/personal-request-tool.js +8 -13
- package/dist/src/agent/tools/personal-task-tool.d.ts +1 -2
- package/dist/src/agent/tools/personal-task-tool.js +9 -8
- package/dist/src/agent/tools/publish-artifacts.js +1 -1
- package/dist/src/agent/tools/research-checkpoint-tool.d.ts +3 -0
- package/dist/src/agent/tools/research-checkpoint-tool.js +28 -0
- package/dist/src/agent/tools/review-workspace.js +1 -1
- package/dist/src/agent/tools/search/cache.d.ts +20 -0
- package/dist/src/agent/tools/search/cache.js +19 -0
- package/dist/src/agent/tools/search/errors.d.ts +19 -0
- package/dist/src/agent/tools/search/errors.js +69 -0
- package/dist/src/agent/tools/search/providers/bing-api.js +2 -1
- package/dist/src/agent/tools/search/providers/bing-html.js +2 -1
- package/dist/src/agent/tools/search/providers/brave.js +2 -1
- package/dist/src/agent/tools/search/providers/duckduckgo-html.js +2 -1
- package/dist/src/agent/tools/search/providers/searxng.js +2 -1
- package/dist/src/agent/tools/search/providers/tavily.js +2 -1
- package/dist/src/agent/tools/search/providers/xopc-cloud.d.ts +1 -0
- package/dist/src/agent/tools/search/providers/xopc-cloud.js +7 -2
- package/dist/src/agent/tools/search/registry.d.ts +21 -5
- package/dist/src/agent/tools/search/registry.js +252 -25
- package/dist/src/agent/tools/search/types.d.ts +25 -0
- package/dist/src/agent/tools/task-result-tool.d.ts +2 -0
- package/dist/src/agent/tools/task-result-tool.js +73 -0
- package/dist/src/agent/tools/web.d.ts +16 -2
- package/dist/src/agent/tools/web.js +74 -29
- package/dist/src/agent/tools/xopc-use-tool.js +2 -2
- package/dist/src/automations/capabilities/write.d.ts +4 -4
- package/dist/src/automations/domain/validation.d.ts +8 -8
- package/dist/src/automations/draft/automation-draft-validator.d.ts +2 -2
- package/dist/src/browser/automations/schema.d.ts +2 -2
- package/dist/src/browser/automations/service.d.ts +2 -2
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/config/index.js +2 -2
- package/dist/src/config/schema.d.ts +1 -0
- package/dist/src/config/schema.js +4 -1
- package/dist/src/connectors/connection-recovery-service.d.ts +3 -1
- package/dist/src/connectors/connection-recovery-service.js +66 -5
- package/dist/src/discussions/action-tasks.d.ts +2 -2
- package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
- package/dist/src/gateway/hono/routes/projects.js +1 -1
- package/dist/src/gateway/hono/routes/session-input-handler.d.ts +16 -0
- package/dist/src/gateway/hono/routes/tasks.js +1 -1
- package/dist/src/gateway/service/agent-runner.d.ts +2 -0
- package/dist/src/gateway/service/agent-runner.js +30 -17
- package/dist/src/gateway/service/run-gateway-agent.js +12 -1
- package/dist/src/gateway/service/session-input-coordinator.d.ts +10 -1
- package/dist/src/gateway/service/session-input-coordinator.js +213 -26
- package/dist/src/gateway/service.d.ts +1 -0
- package/dist/src/gateway/service.js +9 -7
- package/dist/src/gateway/session-context-summary.js +1 -1
- package/dist/src/personal-agent/prompts.js +4 -1
- package/dist/src/personal-agent/reply-composer.d.ts +1 -0
- package/dist/src/personal-agent/reply-composer.js +70 -12
- package/dist/src/personal-agent/reply-style.d.ts +1 -1
- package/dist/src/personal-agent/reply-style.js +1 -0
- package/dist/src/personal-agent/repository.d.ts +1 -1
- package/dist/src/personal-agent/repository.js +1 -1
- package/dist/src/personal-agent/request-repository.d.ts +2 -0
- package/dist/src/personal-agent/request-service.d.ts +4 -0
- package/dist/src/personal-agent/request-service.js +90 -19
- package/dist/src/personal-agent/result-file-links.d.ts +3 -0
- package/dist/src/personal-agent/result-file-links.js +21 -0
- package/dist/src/personal-agent/task-cancel.js +85 -35
- package/dist/src/scenes/taskFollowUp/service.d.ts +15 -5
- package/dist/src/session/session-context-for-llm.js +2 -2
- package/dist/src/session/store.d.ts +3 -1
- package/dist/src/session/store.js +13 -3
- package/dist/src/storage/sqlite/connection-wait-repository.d.ts +5 -2
- package/dist/src/storage/sqlite/connection-wait-repository.js +42 -17
- package/dist/src/storage/sqlite/index.d.ts +1 -0
- package/dist/src/storage/sqlite/index.js +3 -1
- package/dist/src/storage/sqlite/migrations/250_research_checkpoints.sql +15 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/research-checkpoint-repository.d.ts +24 -0
- package/dist/src/storage/sqlite/research-checkpoint-repository.js +91 -0
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/session-creation-repository.js +3 -2
- package/dist/src/storage/sqlite/session-input-repository.d.ts +16 -0
- package/dist/src/storage/sqlite/session-input-repository.js +41 -7
- package/dist/src/tasks/capabilities/management.d.ts +2 -2
- package/dist/src/tasks/capabilities/relations.d.ts +7 -7
- package/dist/src/tasks/capabilities/write.d.ts +2 -2
- package/dist/src/tasks/index.js +1 -1
- package/dist/src/tasks/task-allocation-service.d.ts +2 -0
- package/dist/src/tasks/task-allocation-service.js +43 -2
- package/dist/src/tasks/task-application-service.js +2 -2
- package/dist/src/tasks/task-context-assembler.js +6 -1
- package/dist/src/tasks/task-continuation.d.ts +1 -0
- package/dist/src/tasks/task-continuation.js +1 -0
- package/dist/src/tasks/task-contract-planner.d.ts +1 -0
- package/dist/src/tasks/task-contract-planner.js +22 -15
- package/dist/src/tasks/task-model-call.d.ts +7 -0
- package/dist/src/tasks/task-model-call.js +35 -0
- package/dist/src/tasks/task-research-repair.d.ts +19 -0
- package/dist/src/tasks/task-research-repair.js +75 -0
- package/dist/src/tasks/task-research-result.d.ts +85 -0
- package/dist/src/tasks/task-research-result.js +394 -0
- package/dist/src/tasks/task-result-delivery-repository.js +13 -2
- package/dist/src/tasks/task-result-delivery-service.js +1 -1
- package/dist/src/tasks/task-run-coordinator.js +69 -15
- package/dist/src/tasks/task-run-dispatcher.js +1 -0
- package/dist/src/tasks/task-run-repository.d.ts +5 -0
- package/dist/src/tasks/task-run-repository.js +88 -1
- package/package.json +9 -5
- package/dist/gateway/static/root/assets/constants-Dy8Gw0sF.js +0 -1
- package/dist/gateway/static/root/assets/mermaid-MCJ5UELQ-DBRj4-1-.js +0 -1
- package/dist/gateway/static/root/assets/session-manager-_yy4bxhT.js +0 -16
- package/dist/gateway/static/root/assets/settings-advanced-gate-DoAHy1wj.js +0 -1
- package/dist/gateway/static/root/assets/task-detail-page-CfZhq4XZ.js +0 -2
- package/dist/gateway/static/root/assets/task-expandable-content-CF6Bj-Qa.js +0 -1
|
@@ -73,7 +73,7 @@ function requireSessionConnection(input) {
|
|
|
73
73
|
const origin = originId ? getSessionInputById(input.conversationId, originId) : void 0;
|
|
74
74
|
const originRunId = input.origin?.runId ?? runtime.activeRunId;
|
|
75
75
|
if (!transcriptId || !origin || !originRunId || origin.expectedTranscriptId && origin.expectedTranscriptId !== transcriptId) throw new Error("Connection recovery requires a queued chat execution.");
|
|
76
|
-
const resumed = origin.payload ? getConnectionWait(origin.payload.waitId) : void 0;
|
|
76
|
+
const resumed = origin.kind === "connection_resume" && origin.payload ? getConnectionWait(origin.payload.waitId) : void 0;
|
|
77
77
|
if (resumed?.resolution === "skipped") return { status: "skipped" };
|
|
78
78
|
const active = getActiveConnectionWait(input.conversationId);
|
|
79
79
|
if (active) {
|
|
@@ -162,11 +162,23 @@ function requireSessionConnection(input) {
|
|
|
162
162
|
};
|
|
163
163
|
});
|
|
164
164
|
}
|
|
165
|
+
/** Pending messages may revise the goal; controls cannot become a competing model execution. */
|
|
166
|
+
function interruptedConnectionMessage(wait) {
|
|
167
|
+
return getSessionInputState(wait.conversationId).inputs.find((input) => input.status === "interrupted" && input.kind === "message" && input.payload?.connectionBarrier && input.payload.waitId === wait.id && input.payload.objectiveRevision === wait.objectiveRevision);
|
|
168
|
+
}
|
|
169
|
+
function hasPendingConnectionMessages(wait, includeControls = false) {
|
|
170
|
+
return Boolean(interruptedConnectionMessage(wait)) || getSessionInputState(wait.conversationId).inputs.some((input) => input.id !== wait.originInputId && input.kind === "message" && (includeControls || !input.payload?.connectionAction) && [
|
|
171
|
+
"queued",
|
|
172
|
+
"running",
|
|
173
|
+
"injecting"
|
|
174
|
+
].includes(input.status));
|
|
175
|
+
}
|
|
165
176
|
/** The input and the wait transition commit together, using the existing queue's unique key. */
|
|
166
177
|
function queueConnectionResolution(wait, resolution, resolvePersonal) {
|
|
167
178
|
return runSqliteWriteTransaction(() => {
|
|
168
179
|
const current = getConnectionWait(wait.id);
|
|
169
180
|
if (!current || current.version !== wait.version || current.status !== "open") throw new Error("WAIT_CHANGED");
|
|
181
|
+
if (resolution === "continued" && hasPendingConnectionMessages(wait)) return current;
|
|
170
182
|
if (resolvePersonal?.(wait, resolution)) return updateConnectionWait({
|
|
171
183
|
...wait,
|
|
172
184
|
status: "closed",
|
|
@@ -212,8 +224,9 @@ function queueConnectionResolution(wait, resolution, resolvePersonal) {
|
|
|
212
224
|
function consumeConnectionResume(input) {
|
|
213
225
|
if (input.kind !== "connection_resume") return true;
|
|
214
226
|
return runSqliteWriteTransaction(() => {
|
|
215
|
-
const wait = input.payload ? getConnectionWait(input.payload.waitId) : void 0;
|
|
227
|
+
const wait = input.kind === "connection_resume" && input.payload ? getConnectionWait(input.payload.waitId) : void 0;
|
|
216
228
|
if (!wait || wait.status !== "queued" || wait.queuedInputId !== input.id || wait.objectiveRevision !== input.payload?.objectiveRevision) return false;
|
|
229
|
+
if (hasPendingConnectionMessages(wait, true)) return false;
|
|
217
230
|
if (readCurrentTranscriptId(getSqliteDatabase(), input.conversationId) !== wait.transcriptId) return false;
|
|
218
231
|
if (wait.taskRunId) {
|
|
219
232
|
const runs = new TaskRunRepository();
|
|
@@ -289,7 +302,7 @@ function connectionBindings(conversationId) {
|
|
|
289
302
|
const state = getSessionInputState(conversationId);
|
|
290
303
|
const input = state.activeInputId ? getSessionInputById(conversationId, state.activeInputId) : void 0;
|
|
291
304
|
if (!input) return [];
|
|
292
|
-
const wait = input.payload ? getConnectionWait(input.payload.waitId) : void 0;
|
|
305
|
+
const wait = input.kind === "connection_resume" && input.payload ? getConnectionWait(input.payload.waitId) : void 0;
|
|
293
306
|
const stored = getSqliteDatabase().prepare(`SELECT connector_id, account_id FROM connector_objective_accounts
|
|
294
307
|
WHERE conversation_id = ? AND transcript_id = ? AND objective_id = ?`).all(conversationId, readCurrentTranscriptId(getSqliteDatabase(), conversationId) ?? "", wait?.objectiveId ?? input.id);
|
|
295
308
|
return (wait?.needs ?? stored.map((row) => ({
|
|
@@ -317,7 +330,7 @@ function connectorObjectiveScope(conversationId) {
|
|
|
317
330
|
const input = state.activeInputId ? getSessionInputById(conversationId, state.activeInputId) : void 0;
|
|
318
331
|
if (!input) return void 0;
|
|
319
332
|
const active = getActiveConnectionWait(conversationId);
|
|
320
|
-
const wait = input.payload ? getConnectionWait(input.payload.waitId) : active?.originInputId === input.id ? active : void 0;
|
|
333
|
+
const wait = input.kind === "connection_resume" && input.payload ? getConnectionWait(input.payload.waitId) : active?.originInputId === input.id ? active : void 0;
|
|
321
334
|
return JSON.stringify([
|
|
322
335
|
readCurrentTranscriptId(getSqliteDatabase(), conversationId),
|
|
323
336
|
wait?.objectiveId ?? input.id,
|
|
@@ -329,7 +342,7 @@ function bindObjectiveAccount(conversationId, connectorId, accountId) {
|
|
|
329
342
|
const state = getSessionInputState(conversationId);
|
|
330
343
|
const input = state.activeInputId ? getSessionInputById(conversationId, state.activeInputId) : void 0;
|
|
331
344
|
if (!input) return;
|
|
332
|
-
const wait = input.payload ? getConnectionWait(input.payload.waitId) : void 0;
|
|
345
|
+
const wait = input.kind === "connection_resume" && input.payload ? getConnectionWait(input.payload.waitId) : void 0;
|
|
333
346
|
db.prepare(`INSERT OR IGNORE INTO connector_objective_accounts
|
|
334
347
|
(conversation_id, transcript_id, objective_id, connector_id, account_id) VALUES (?, ?, ?, ?, ?)`).run(conversationId, readCurrentTranscriptId(db, conversationId) ?? "", wait?.objectiveId ?? input.id, connectorId, accountId);
|
|
335
348
|
}
|
|
@@ -337,7 +350,7 @@ function connectionBinding(conversationId, connectorId) {
|
|
|
337
350
|
const matches = connectionBindings(conversationId).filter((need) => need.target.type === "connector" && need.target.connectorId === connectorId);
|
|
338
351
|
return matches.length === 1 ? matches[0].connectionId : void 0;
|
|
339
352
|
}
|
|
340
|
-
/**
|
|
353
|
+
/** Explicit objective changes invalidate an outstanding auto-resume intent. */
|
|
341
354
|
function invalidateConnectionResumeIntent(conversationId) {
|
|
342
355
|
const wait = getActiveConnectionWait(conversationId);
|
|
343
356
|
if (!wait) return;
|
|
@@ -385,26 +398,38 @@ function reviseCurrentConnectionObjective(conversationId, summary) {
|
|
|
385
398
|
reviewRequired: true,
|
|
386
399
|
objectiveRevision: wait.objectiveRevision + 1
|
|
387
400
|
}, wait.version);
|
|
401
|
+
getSqliteDatabase().prepare(`UPDATE session_inputs SET payload_json = json_set(payload_json, '$.objectiveRevision', ?),
|
|
402
|
+
version = version + 1, updated_at_ms = ? WHERE conversation_id = ? AND kind = 'message'
|
|
403
|
+
AND status IN ('queued','running','injecting') AND json_extract(payload_json, '$.connectionBarrier') = 1
|
|
404
|
+
AND json_extract(payload_json, '$.waitId') = ?`).run(wait.objectiveRevision + 1, Date.now(), conversationId, wait.id);
|
|
388
405
|
});
|
|
389
406
|
publishConnectionWait(conversationId);
|
|
390
407
|
}
|
|
391
|
-
function cancelConnectionObjective(conversationId) {
|
|
392
|
-
const
|
|
408
|
+
function cancelConnectionObjective(conversationId, expectedWaitId, expectedObjectiveRevision) {
|
|
409
|
+
const runtime = getSessionInputState(conversationId);
|
|
410
|
+
const executing = runtime.activeInputId ? getSessionInputById(conversationId, runtime.activeInputId) : void 0;
|
|
411
|
+
const wait = getActiveConnectionWait(conversationId) ?? (expectedWaitId && executing?.kind === "connection_resume" && executing.payload?.waitId === expectedWaitId ? getConnectionWait(expectedWaitId) : void 0);
|
|
393
412
|
if (!wait) return;
|
|
413
|
+
if (expectedWaitId && wait.id !== expectedWaitId) return;
|
|
414
|
+
if (expectedObjectiveRevision !== void 0 && wait.objectiveRevision !== expectedObjectiveRevision) return;
|
|
394
415
|
runSqliteWriteTransaction(() => {
|
|
395
416
|
if (wait.queuedInputId) setSessionInputStatus(wait.queuedInputId, "cancelled");
|
|
396
417
|
const personalRequest = personalRequestForWait(wait.id);
|
|
397
418
|
const runs = new TaskRunRepository();
|
|
398
|
-
const
|
|
419
|
+
const personalTaskWait = personalRequest?.taskId ? getSqliteDatabase().prepare(`SELECT task_run_id FROM task_waits
|
|
420
|
+
WHERE task_id = ? AND json_extract(condition_json, '$.connectionWaitId') = ? LIMIT 1`).get(personalRequest.taskId, wait.id) : void 0;
|
|
421
|
+
const taskRunId = wait.taskRunId ?? personalRequest?.parameters.taskRunId ?? personalTaskWait?.task_run_id;
|
|
399
422
|
if (taskRunId) {
|
|
400
423
|
const run = runs.get(taskRunId);
|
|
401
|
-
if (run
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
424
|
+
if (run && [
|
|
425
|
+
"queued",
|
|
426
|
+
"running",
|
|
427
|
+
"waiting",
|
|
428
|
+
"verifying",
|
|
429
|
+
"cancelled"
|
|
430
|
+
].includes(run.status)) {
|
|
431
|
+
runs.resolveCancelledRunWaits(run.id, { kind: "system" });
|
|
432
|
+
if (run.status !== "cancelled") runs.finalize({
|
|
408
433
|
runId: run.id,
|
|
409
434
|
expectedVersion: run.version,
|
|
410
435
|
receipt: {
|
|
@@ -534,4 +559,4 @@ var init_connection_wait_repository = __esmMin((() => {
|
|
|
534
559
|
}));
|
|
535
560
|
//#endregion
|
|
536
561
|
init_connection_wait_repository();
|
|
537
|
-
export { bindObjectiveAccount, cancelConnectionObjective, connectionBinding, connectionBindings, connectorObjectiveScope, consumeConnectionResume, getActiveConnectionWait, getConnectionResumeInput, getConnectionWait, init_connection_wait_repository, invalidateConnectionResumeIntent, isConnectionSuspended, listConnectionWaitsToCheck, onConnectionWaitChanged, publishConnectionWait, queueConnectionResolution, reconcileConnectionWaits, requireSessionConnection, reviseCurrentConnectionObjective, updateConnectionWait };
|
|
562
|
+
export { bindObjectiveAccount, cancelConnectionObjective, connectionBinding, connectionBindings, connectorObjectiveScope, consumeConnectionResume, getActiveConnectionWait, getConnectionResumeInput, getConnectionWait, hasPendingConnectionMessages, init_connection_wait_repository, interruptedConnectionMessage, invalidateConnectionResumeIntent, isConnectionSuspended, listConnectionWaitsToCheck, onConnectionWaitChanged, publishConnectionWait, queueConnectionResolution, reconcileConnectionWaits, requireSessionConnection, reviseCurrentConnectionObjective, updateConnectionWait };
|
|
@@ -38,3 +38,4 @@ export { appendConnectorExecutionAudit, claimConnectorWebhookDelivery, completeC
|
|
|
38
38
|
export { getConnectorAccount, listConnectorAccounts, refreshConnectorAccountCurrent, reconcileConnectorAccount, } from './connector-account-repository.js';
|
|
39
39
|
export { getConnectorSyncPolicy, getConnectorSyncPolicyForConnection, listConnectorSyncPolicies, upsertConnectorSyncPolicy, type ConnectorSyncPolicy, } from './connector-sync-policy-repository.js';
|
|
40
40
|
export { getUserTrustPolicy, setUserTrustPolicy, } from './user-trust-repository.js';
|
|
41
|
+
export { createResearchCheckpoint, getResearchCheckpoint, claimResearchCheckpoint, saveResearchCheckpoint, recordResearchEvidence, recordResearchSearch, finishResearchCheckpoint, type StoredResearchCheckpoint, } from './research-checkpoint-repository.js';
|
|
@@ -42,6 +42,7 @@ import { deleteSessionConfig, getSessionConfig, hasSessionConfig, init_config_re
|
|
|
42
42
|
import { createObjectLinkRecord, deleteObjectLinkRecord, getActivityEventRecord, init_activity_repository, listActivityRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, recordActivityEvent } from "./activity-repository.js";
|
|
43
43
|
import { getConnectorSyncPolicy, getConnectorSyncPolicyForConnection, init_connector_sync_policy_repository, listConnectorSyncPolicies, upsertConnectorSyncPolicy } from "./connector-sync-policy-repository.js";
|
|
44
44
|
import { getUserTrustPolicy, init_user_trust_repository, setUserTrustPolicy } from "./user-trust-repository.js";
|
|
45
|
+
import { claimResearchCheckpoint, createResearchCheckpoint, finishResearchCheckpoint, getResearchCheckpoint, init_research_checkpoint_repository, recordResearchEvidence, recordResearchSearch, saveResearchCheckpoint } from "./research-checkpoint-repository.js";
|
|
45
46
|
//#region src/storage/sqlite/index.ts
|
|
46
47
|
var init_sqlite = __esmMin((() => {
|
|
47
48
|
init_paths();
|
|
@@ -84,7 +85,8 @@ var init_sqlite = __esmMin((() => {
|
|
|
84
85
|
init_connector_account_repository();
|
|
85
86
|
init_connector_sync_policy_repository();
|
|
86
87
|
init_user_trust_repository();
|
|
88
|
+
init_research_checkpoint_repository();
|
|
87
89
|
}));
|
|
88
90
|
//#endregion
|
|
89
91
|
init_sqlite();
|
|
90
|
-
export { COMPOSER_INPUT_HISTORY_LIMIT, DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, DatabaseSchemaTooOldError, SCHEMA_META_SCHEMA_VERSION_KEY, SidebarLayoutConflictError, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION, acknowledgeHomeAttention, appendCompactionBoundaryIfUnchanged, appendComposerInputHistory, appendConnectorExecutionAudit, appendMediaToAssistantTranscriptEntry, appendTranscriptEntry, applyPendingMigrations, authenticateDeviceAccessToken, bindEndpointPrincipal, buildDefaultSessionMetadata, buildGlobalSessionStats, buildRefreshProofMessage, cancelQueuedSessionInput, claimConnectorWebhookDelivery, claimContextExtractionRun, claimKnowledgeSourceItems, claimNextConnectorLearningJob, claimNextSessionInput, classifyStoredRow, clearComposerInputHistory, clearGatewayIdentityForTest, closeXopcDatabase, completeConnectorWebhookDelivery, completeKnowledgeSourceItemSynthesis, consumeClarificationApproval, consumeClarificationResume, consumeConnectorApproval, countKnowledgeSourceItems, createClarificationWait, createCollaborationRule, createConnectorApproval, createContextEvidence, createDevice, createDevicePairingSetup, createEndpointPrincipal, createObjectLinkRecord, 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, getSessionConfig, getSessionInputById, getSessionInputState, getSessionMetadata, getSessionTaskPlan, getSidebarLayout, getSqliteDatabase, getUserPeopleIndexState, getUserPerson, getUserTrustPolicy, getXopcDatabase, hasSessionConfig, incrementSessionStatsOnAppend, init_sqlite, insertSessionInput, inspectSchemaMigrationStatus, isClarificationSuspended, isDevicePairingSetupActive, isHomeAttentionAcknowledged, isXopcDatabaseOpen, issueDeviceTokenPair, listActiveSessionInputExecutions, listActiveSessionInputRuns, listActivityRecords, listCachedConnectorCatalogEntries, listCollaborationRules, listCompactionBoundaries, listComposerInputHistory, listConnectorAccounts, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, listConnectorLearningJobs, listConnectorSyncPolicies, listContextExtractionOutputs, listContextExtractionRuns, listDevices, listEndpointPrincipals, listEndpointToolInvocationAuditPage, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listNoteRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, listTaskUpdateRunIds, listTaskUpdateTriggers, listUserPeople, loadCompactionSourceSnapshot, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRows, loadTranscriptRowsForSession, mergeUserPeople, metadataToSessionInsert, mutateQueuedSessionInput, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, pruneBoundedKnowledgeSourceItems, readSchemaVersion, readSchemaVersionForTest, reconcileConnectorAccount, recordActivityEvent, recoverSessionInputState, recoverStaleConnectorLearningJobs, refreshConnectorAccountCurrent, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, replaceLatestSessionTurnAndQueueInput, replaceSidebarLayout, 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, sortBySidebarLayout, startEndpointToolInvocationAudit, startKnowledgeSyncRun, summarizeUserPeople, supersedeActiveClarification, touchEndpointPrincipal, transcriptEntryRowToStoredRow, updateConnectorLearningJob, updateInteractionStateFromMessage, updateSessionConfig, updateSessionStats, updateUserPerson, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation, upsertConnectorSyncPolicy, upsertKnowledgeSourceItems, upsertNoteAgentContextRecord, upsertNoteRecord, validateLatestSessionTurnTarget };
|
|
92
|
+
export { COMPOSER_INPUT_HISTORY_LIMIT, DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, DatabaseSchemaTooOldError, SCHEMA_META_SCHEMA_VERSION_KEY, SidebarLayoutConflictError, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION, acknowledgeHomeAttention, appendCompactionBoundaryIfUnchanged, appendComposerInputHistory, appendConnectorExecutionAudit, appendMediaToAssistantTranscriptEntry, appendTranscriptEntry, applyPendingMigrations, authenticateDeviceAccessToken, bindEndpointPrincipal, buildDefaultSessionMetadata, buildGlobalSessionStats, buildRefreshProofMessage, cancelQueuedSessionInput, claimConnectorWebhookDelivery, claimContextExtractionRun, claimKnowledgeSourceItems, claimNextConnectorLearningJob, claimNextSessionInput, claimResearchCheckpoint, classifyStoredRow, clearComposerInputHistory, clearGatewayIdentityForTest, closeXopcDatabase, completeConnectorWebhookDelivery, completeKnowledgeSourceItemSynthesis, consumeClarificationApproval, consumeClarificationResume, consumeConnectorApproval, countKnowledgeSourceItems, createClarificationWait, createCollaborationRule, createConnectorApproval, createContextEvidence, createDevice, createDevicePairingSetup, createEndpointPrincipal, createObjectLinkRecord, createResearchCheckpoint, 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, finishResearchCheckpoint, 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, getResearchCheckpoint, getSessionConfig, getSessionInputById, getSessionInputState, getSessionMetadata, getSessionTaskPlan, getSidebarLayout, getSqliteDatabase, getUserPeopleIndexState, getUserPerson, getUserTrustPolicy, getXopcDatabase, hasSessionConfig, incrementSessionStatsOnAppend, init_sqlite, insertSessionInput, inspectSchemaMigrationStatus, isClarificationSuspended, isDevicePairingSetupActive, isHomeAttentionAcknowledged, isXopcDatabaseOpen, issueDeviceTokenPair, listActiveSessionInputExecutions, listActiveSessionInputRuns, listActivityRecords, listCachedConnectorCatalogEntries, listCollaborationRules, listCompactionBoundaries, listComposerInputHistory, listConnectorAccounts, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, listConnectorLearningJobs, listConnectorSyncPolicies, listContextExtractionOutputs, listContextExtractionRuns, listDevices, listEndpointPrincipals, listEndpointToolInvocationAuditPage, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listNoteRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, listTaskUpdateRunIds, listTaskUpdateTriggers, listUserPeople, loadCompactionSourceSnapshot, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRows, loadTranscriptRowsForSession, mergeUserPeople, metadataToSessionInsert, mutateQueuedSessionInput, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, pruneBoundedKnowledgeSourceItems, readSchemaVersion, readSchemaVersionForTest, reconcileConnectorAccount, recordActivityEvent, recordResearchEvidence, recordResearchSearch, recoverSessionInputState, recoverStaleConnectorLearningJobs, refreshConnectorAccountCurrent, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, replaceLatestSessionTurnAndQueueInput, replaceSidebarLayout, replaceTranscriptRows, replaceUserPeopleIndex, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveClarification, resolveMigrationsDir, resolveSessionAgentId, resolveXopcDatabasePath, restoreBeforeCompactionBoundary, revokeDevice, revokeEndpointPrincipal, rotateDeviceRefreshToken, runSqliteWriteTransaction, saveResearchCheckpoint, searchSessionTranscript, sessionConfigRowToConfig, sessionRowToMetadata, setBrowserTabBinding, setCollaborationRuleStatus, setConnectorLearningPaused, setEndpointSessionBinding, setInteractionState, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, setSessionConfig, setSessionInputStatus, setSessionTaskPlan, setUserTrustPolicy, signGatewayPayload, sortBySidebarLayout, startEndpointToolInvocationAudit, startKnowledgeSyncRun, summarizeUserPeople, supersedeActiveClarification, touchEndpointPrincipal, transcriptEntryRowToStoredRow, updateConnectorLearningJob, updateInteractionStateFromMessage, updateSessionConfig, updateSessionStats, updateUserPerson, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation, upsertConnectorSyncPolicy, upsertKnowledgeSourceItems, upsertNoteAgentContextRecord, upsertNoteRecord, validateLatestSessionTurnTarget };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
CREATE TABLE research_checkpoints (
|
|
2
|
+
id TEXT PRIMARY KEY,
|
|
3
|
+
conversation_id TEXT NOT NULL REFERENCES sessions(conversation_id) ON DELETE CASCADE,
|
|
4
|
+
workspace TEXT NOT NULL,
|
|
5
|
+
goal TEXT NOT NULL,
|
|
6
|
+
checkpoint_json TEXT NOT NULL CHECK(json_valid(checkpoint_json)),
|
|
7
|
+
status TEXT NOT NULL CHECK(status IN ('running','partial','completed','failed','cancelled')),
|
|
8
|
+
attempts INTEGER NOT NULL DEFAULT 0,
|
|
9
|
+
stop_reason TEXT,
|
|
10
|
+
summary TEXT NOT NULL DEFAULT '',
|
|
11
|
+
lease_token TEXT,
|
|
12
|
+
lease_expires_at INTEGER,
|
|
13
|
+
updated_at INTEGER NOT NULL
|
|
14
|
+
);
|
|
15
|
+
CREATE INDEX research_checkpoints_conversation ON research_checkpoints(conversation_id, updated_at);
|
|
@@ -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 = 250;
|
|
7
7
|
export declare function resolveMigrationsDir(override?: string): string;
|
|
8
8
|
/**
|
|
9
9
|
* Apply sequential SQL migrations from (currentVersion + 1) through targetVersion.
|
|
@@ -59,7 +59,7 @@ function applySingleMigration(db, migration, discardOldScenes = false) {
|
|
|
59
59
|
function applyPendingMigrations(db, options = {}) {
|
|
60
60
|
db.function("xopc_memory_search_text", { deterministic: true }, (value) => memorySearchText(String(value ?? "")));
|
|
61
61
|
db.function("xopc_operation_id", () => currentOperationId() ?? null);
|
|
62
|
-
const targetVersion = options.targetVersion ??
|
|
62
|
+
const targetVersion = options.targetVersion ?? 250;
|
|
63
63
|
let currentVersion = readSchemaVersion(db);
|
|
64
64
|
if (currentVersion > targetVersion) throw new DatabaseSchemaTooNewError(currentVersion, targetVersion);
|
|
65
65
|
if (!options.migrationsDir && currentVersion < 165) throw new DatabaseSchemaTooOldError(currentVersion, 165);
|
|
@@ -97,7 +97,7 @@ function applyPendingMigrations(db, options = {}) {
|
|
|
97
97
|
}
|
|
98
98
|
/** Inspect schema version without mutating the database. */
|
|
99
99
|
function inspectSchemaMigrationStatus(db, options = {}) {
|
|
100
|
-
const appVersion = options.targetVersion ??
|
|
100
|
+
const appVersion = options.targetVersion ?? 250;
|
|
101
101
|
const dbVersion = readSchemaVersion(db);
|
|
102
102
|
if (dbVersion > appVersion) return {
|
|
103
103
|
dbVersion,
|
|
@@ -140,7 +140,7 @@ var init_runner = __esmMin((() => {
|
|
|
140
140
|
init_errors();
|
|
141
141
|
log = createLogger("Sqlite:Migrations");
|
|
142
142
|
XOPC_DB_BASELINE_SCHEMA_VERSION = 165;
|
|
143
|
-
XOPC_DB_SCHEMA_VERSION =
|
|
143
|
+
XOPC_DB_SCHEMA_VERSION = 250;
|
|
144
144
|
}));
|
|
145
145
|
//#endregion
|
|
146
146
|
init_runner();
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { SearchCacheEntry } from '../../agent/tools/search/cache.js';
|
|
2
|
+
import { type ResearchCheckpoint, type ResearchCheckpointUpdate, type ResearchEvidence } from '../../agent/orchestration/research-checkpoint.js';
|
|
3
|
+
export interface StoredResearchCheckpoint {
|
|
4
|
+
id: string;
|
|
5
|
+
conversationId: string;
|
|
6
|
+
workspace: string;
|
|
7
|
+
goal: string;
|
|
8
|
+
checkpoint: ResearchCheckpoint;
|
|
9
|
+
status: 'running' | 'partial' | 'completed' | 'failed' | 'cancelled';
|
|
10
|
+
attempts: number;
|
|
11
|
+
stopReason?: string;
|
|
12
|
+
summary: string;
|
|
13
|
+
leaseToken?: string;
|
|
14
|
+
leaseExpiresAt?: number;
|
|
15
|
+
}
|
|
16
|
+
export declare function getResearchCheckpoint(id: string, conversationId: string, workspace: string): StoredResearchCheckpoint | undefined;
|
|
17
|
+
export declare function createResearchCheckpoint(conversationId: string, workspace: string, goal: string): StoredResearchCheckpoint;
|
|
18
|
+
/** Lease ownership fences late tool callbacks and competing resume requests. */
|
|
19
|
+
export declare function claimResearchCheckpoint(record: StoredResearchCheckpoint, timeoutMs: number, now?: number): StoredResearchCheckpoint;
|
|
20
|
+
export declare function saveResearchCheckpoint(record: StoredResearchCheckpoint, update: ResearchCheckpointUpdate): ResearchCheckpoint;
|
|
21
|
+
export declare function recordResearchEvidence(record: StoredResearchCheckpoint, evidence: ResearchEvidence): void;
|
|
22
|
+
export declare function finishResearchCheckpoint(record: StoredResearchCheckpoint, status: StoredResearchCheckpoint['status'], stopReason: string, summary: string): void;
|
|
23
|
+
/** Keep successful public search results with the same task lease and a bounded envelope. */
|
|
24
|
+
export declare function recordResearchSearch(record: StoredResearchCheckpoint, entry: SearchCacheEntry): void;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { getSqliteDatabase, init_transaction, runSqliteWriteTransaction } from "./transaction.js";
|
|
3
|
+
import { init_research_checkpoint, mergeResearchCheckpoint } from "../../agent/orchestration/research-checkpoint.js";
|
|
4
|
+
import { randomUUID } from "node:crypto";
|
|
5
|
+
//#region src/storage/sqlite/research-checkpoint-repository.ts
|
|
6
|
+
function decode(row) {
|
|
7
|
+
return {
|
|
8
|
+
id: row.id,
|
|
9
|
+
conversationId: row.conversation_id,
|
|
10
|
+
workspace: row.workspace,
|
|
11
|
+
goal: row.goal,
|
|
12
|
+
checkpoint: JSON.parse(row.checkpoint_json),
|
|
13
|
+
status: row.status,
|
|
14
|
+
attempts: row.attempts,
|
|
15
|
+
stopReason: row.stop_reason ?? void 0,
|
|
16
|
+
summary: row.summary,
|
|
17
|
+
leaseToken: row.lease_token ?? void 0,
|
|
18
|
+
leaseExpiresAt: row.lease_expires_at ?? void 0
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function getResearchCheckpoint(id, conversationId, workspace) {
|
|
22
|
+
const row = getSqliteDatabase().prepare("SELECT * FROM research_checkpoints WHERE id = ? AND conversation_id = ? AND workspace = ?").get(id, conversationId, workspace);
|
|
23
|
+
return row ? decode(row) : void 0;
|
|
24
|
+
}
|
|
25
|
+
function createResearchCheckpoint(conversationId, workspace, goal) {
|
|
26
|
+
const id = randomUUID();
|
|
27
|
+
const checkpoint = {
|
|
28
|
+
findings: [],
|
|
29
|
+
evidence: [],
|
|
30
|
+
nextSteps: [goal.slice(0, 500)]
|
|
31
|
+
};
|
|
32
|
+
runSqliteWriteTransaction((db) => db.prepare(`INSERT INTO research_checkpoints
|
|
33
|
+
(id, conversation_id, workspace, goal, checkpoint_json, status, updated_at) VALUES (?, ?, ?, ?, ?, 'partial', ?)`).run(id, conversationId, workspace, goal, JSON.stringify(checkpoint), Date.now()));
|
|
34
|
+
return getResearchCheckpoint(id, conversationId, workspace);
|
|
35
|
+
}
|
|
36
|
+
/** Lease ownership fences late tool callbacks and competing resume requests. */
|
|
37
|
+
function claimResearchCheckpoint(record, timeoutMs, now = Date.now()) {
|
|
38
|
+
return runSqliteWriteTransaction((db) => {
|
|
39
|
+
const token = randomUUID();
|
|
40
|
+
if (!db.prepare(`UPDATE research_checkpoints SET status = 'running', attempts = attempts + 1,
|
|
41
|
+
lease_token = ?, lease_expires_at = ?, updated_at = ? WHERE id = ? AND conversation_id = ? AND workspace = ?
|
|
42
|
+
AND status != 'completed' AND (lease_token IS NULL OR lease_expires_at <= ?)`).run(token, now + timeoutMs, now, record.id, record.conversationId, record.workspace, now).changes) throw new Error("Research checkpoint is complete or already running");
|
|
43
|
+
return getResearchCheckpoint(record.id, record.conversationId, record.workspace);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function mutate(record, transform) {
|
|
47
|
+
return runSqliteWriteTransaction((db) => {
|
|
48
|
+
const current = getResearchCheckpoint(record.id, record.conversationId, record.workspace);
|
|
49
|
+
if (!current || !record.leaseToken || current.leaseToken !== record.leaseToken || current.status !== "running" || (current.leaseExpiresAt ?? 0) <= Date.now()) throw new Error("Research checkpoint lease expired");
|
|
50
|
+
const checkpoint = transform(current.checkpoint);
|
|
51
|
+
db.prepare("UPDATE research_checkpoints SET checkpoint_json = ?, updated_at = ? WHERE id = ? AND lease_token = ?").run(JSON.stringify(checkpoint), Date.now(), record.id, record.leaseToken);
|
|
52
|
+
return checkpoint;
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
function saveResearchCheckpoint(record, update) {
|
|
56
|
+
return mutate(record, (current) => mergeResearchCheckpoint(current, update));
|
|
57
|
+
}
|
|
58
|
+
function recordResearchEvidence(record, evidence) {
|
|
59
|
+
mutate(record, (current) => ({
|
|
60
|
+
...current,
|
|
61
|
+
evidence: [...current.evidence.filter((item) => item.toolCallId !== evidence.toolCallId || item.runId !== evidence.runId), {
|
|
62
|
+
...evidence,
|
|
63
|
+
excerpt: evidence.excerpt.slice(0, 2e3)
|
|
64
|
+
}].slice(-30)
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
function finishResearchCheckpoint(record, status, stopReason, summary) {
|
|
68
|
+
if (!runSqliteWriteTransaction((db) => db.prepare(`UPDATE research_checkpoints SET status = ?, stop_reason = ?, summary = ?,
|
|
69
|
+
lease_token = NULL, lease_expires_at = NULL, updated_at = ? WHERE id = ? AND lease_token = ?`).run(status, stopReason, summary.slice(0, 8e3), Date.now(), record.id, record.leaseToken ?? "")).changes) throw new Error("Research checkpoint lease was replaced");
|
|
70
|
+
}
|
|
71
|
+
/** Keep successful public search results with the same task lease and a bounded envelope. */
|
|
72
|
+
function recordResearchSearch(record, entry) {
|
|
73
|
+
mutate(record, (current) => {
|
|
74
|
+
const searches = [...(current.searches ?? []).filter((item) => item.key !== entry.key), entry].slice(-20);
|
|
75
|
+
while (searches.length && JSON.stringify({
|
|
76
|
+
...current,
|
|
77
|
+
searches
|
|
78
|
+
}).length > 2e5) searches.shift();
|
|
79
|
+
return {
|
|
80
|
+
...current,
|
|
81
|
+
searches
|
|
82
|
+
};
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
var init_research_checkpoint_repository = __esmMin((() => {
|
|
86
|
+
init_research_checkpoint();
|
|
87
|
+
init_transaction();
|
|
88
|
+
}));
|
|
89
|
+
//#endregion
|
|
90
|
+
init_research_checkpoint_repository();
|
|
91
|
+
export { claimResearchCheckpoint, createResearchCheckpoint, finishResearchCheckpoint, getResearchCheckpoint, init_research_checkpoint_repository, recordResearchEvidence, recordResearchSearch, saveResearchCheckpoint };
|
|
@@ -3,7 +3,7 @@ import { sessionCommandIdentity } from "../../../packages/gateway-contract/src/s
|
|
|
3
3
|
import { init_src } from "../../../packages/gateway-contract/src/index.js";
|
|
4
4
|
import { init_session_input_repository, insertSessionInput } from "./session-input-repository.js";
|
|
5
5
|
import { init_clarification_wait_repository, supersedeActiveClarification } from "./clarification-wait-repository.js";
|
|
6
|
-
import {
|
|
6
|
+
import { cancelConnectionObjective, init_connection_wait_repository } from "./connection-wait-repository.js";
|
|
7
7
|
import { getSessionMetadata } from "./session-read-repository.js";
|
|
8
8
|
import { init_session_repository } from "./session-repository.js";
|
|
9
9
|
import { init_config_repository, setSessionConfig } from "./config-repository.js";
|
|
@@ -113,7 +113,8 @@ function acceptSessionCommand(input) {
|
|
|
113
113
|
expectedTranscriptId: transcriptId
|
|
114
114
|
});
|
|
115
115
|
if (inputId) {
|
|
116
|
-
|
|
116
|
+
const control = input.preparedInput?.payload;
|
|
117
|
+
if (control?.connectionAction === "cancel") cancelConnectionObjective(conversationId, control.waitId, control.objectiveRevision);
|
|
117
118
|
supersedeActiveClarification(conversationId);
|
|
118
119
|
}
|
|
119
120
|
const receipt = {
|
|
@@ -8,10 +8,26 @@ export type SessionInputPayload = {
|
|
|
8
8
|
waitId: string;
|
|
9
9
|
objectiveRevision: number;
|
|
10
10
|
resolution: 'continued' | 'skipped';
|
|
11
|
+
connectionAction?: never;
|
|
12
|
+
connectionBarrier?: never;
|
|
11
13
|
} | {
|
|
12
14
|
waitId: string;
|
|
13
15
|
objectiveRevision: number;
|
|
14
16
|
resolution: 'answered' | 'agent_decide' | 'cancelled';
|
|
17
|
+
connectionAction?: never;
|
|
18
|
+
connectionBarrier?: never;
|
|
19
|
+
} | {
|
|
20
|
+
waitId: string;
|
|
21
|
+
objectiveRevision: number;
|
|
22
|
+
connectionAction: 'continue' | 'cancel';
|
|
23
|
+
resolution?: never;
|
|
24
|
+
connectionBarrier?: never;
|
|
25
|
+
} | {
|
|
26
|
+
waitId: string;
|
|
27
|
+
objectiveRevision: number;
|
|
28
|
+
connectionBarrier: true;
|
|
29
|
+
connectionAction?: never;
|
|
30
|
+
resolution?: never;
|
|
15
31
|
};
|
|
16
32
|
export type SessionInput = {
|
|
17
33
|
id: string;
|
|
@@ -152,23 +152,39 @@ function claimNextSessionInput(conversationId, runId, expectedInputId) {
|
|
|
152
152
|
version = version + 1, updated_at_ms = ? WHERE conversation_id = ? AND status = 'queued'
|
|
153
153
|
AND expected_transcript_id IS NOT NULL AND expected_transcript_id IS NOT ?`).run(Date.now(), conversationId, readCurrentTranscriptId(db, conversationId)).changes) bumpSessionInputRevision(db, conversationId);
|
|
154
154
|
const row = db.prepare(`${SELECT_INPUTS} WHERE conversation_id = ? AND effective_delivery = 'next'
|
|
155
|
-
AND status = 'queued'
|
|
155
|
+
AND status = 'queued' AND (kind != 'connection_resume' OR NOT EXISTS (
|
|
156
|
+
SELECT 1 FROM session_inputs barrier WHERE barrier.conversation_id = session_inputs.conversation_id
|
|
157
|
+
AND barrier.status = 'interrupted' AND barrier.kind = 'message'
|
|
158
|
+
AND json_extract(barrier.payload_json, '$.connectionBarrier') = 1
|
|
159
|
+
AND json_extract(barrier.payload_json, '$.waitId') = json_extract(session_inputs.payload_json, '$.waitId')
|
|
160
|
+
AND json_extract(barrier.payload_json, '$.objectiveRevision') = json_extract(session_inputs.payload_json, '$.objectiveRevision')
|
|
161
|
+
)) ORDER BY CASE WHEN kind = 'connection_resume' THEN 1 ELSE 0 END,
|
|
162
|
+
interrupt_requested DESC, position, created_at_ms, id LIMIT 1`).get(conversationId);
|
|
156
163
|
if (!row) return void 0;
|
|
157
164
|
if (expectedInputId && row.id !== expectedInputId) return void 0;
|
|
158
165
|
const now = Date.now();
|
|
166
|
+
if (row.kind === "message" && !JSON.parse(row.payload_json ?? "{}").connectionAction) db.prepare(`UPDATE session_inputs SET payload_json = COALESCE((
|
|
167
|
+
SELECT json_object('waitId', wait.id, 'objectiveRevision', json_extract(wait.data_json, '$.objectiveRevision'), 'connectionBarrier', json('true'))
|
|
168
|
+
FROM session_connection_waits wait WHERE wait.conversation_id = session_inputs.conversation_id
|
|
169
|
+
AND wait.transcript_id = ? AND wait.status IN ('open','queued')
|
|
170
|
+
AND (session_inputs.payload_json IS NULL OR wait.id = json_extract(session_inputs.payload_json, '$.waitId'))
|
|
171
|
+
AND session_inputs.id != json_extract(wait.data_json, '$.originInputId') LIMIT 1
|
|
172
|
+
), payload_json) WHERE id = ?`).run(readCurrentTranscriptId(db, conversationId), row.id);
|
|
159
173
|
db.prepare(`UPDATE session_inputs SET status = 'running', run_id = ?, version = version + 1,
|
|
160
174
|
updated_at_ms = ? WHERE id = ?`).run(runId, now, row.id);
|
|
161
175
|
db.prepare(`UPDATE session_input_runtime SET active_run_id = ?, active_input_id = ?,
|
|
162
176
|
revision = revision + 1, updated_at_ms = ? WHERE conversation_id = ?`).run(runId, row.id, now, conversationId);
|
|
163
177
|
const claimed = mapInput(db.prepare(`${SELECT_INPUTS} WHERE id = ?`).get(row.id));
|
|
164
178
|
const hasMaterial = (value) => Boolean(value.attachments_json && JSON.parse(value.attachments_json).length || value.context_snapshots_json && JSON.parse(value.context_snapshots_json).length);
|
|
165
|
-
if (row.interrupt_requested && !hasMaterial(row)) {
|
|
179
|
+
if (row.interrupt_requested && !claimed.payload?.connectionAction && !hasMaterial(row)) {
|
|
166
180
|
const pending = db.prepare(`${SELECT_INPUTS} WHERE conversation_id = ? AND status = 'queued'
|
|
167
181
|
ORDER BY interrupt_requested DESC, position, created_at_ms, id LIMIT 10`).all(conversationId);
|
|
168
182
|
for (const next of pending) {
|
|
169
|
-
if (!next.interrupt_requested || next.kind !== "message" || hasMaterial(next) || next.thinking !== row.thinking || next.expected_transcript_id !== row.expected_transcript_id || next.origin_json !== row.origin_json || next.created_at_ms - row.created_at_ms > 500 || claimed.content.length + next.content.length > 64e3) break;
|
|
183
|
+
if (!next.interrupt_requested || next.kind !== "message" || JSON.parse(next.payload_json ?? "{}").connectionAction || hasMaterial(next) || next.thinking !== row.thinking || next.expected_transcript_id !== row.expected_transcript_id || next.origin_json !== row.origin_json || next.created_at_ms - row.created_at_ms > 500 || claimed.content.length + next.content.length > 64e3) break;
|
|
184
|
+
const nextPayload = JSON.parse(next.payload_json ?? "{}");
|
|
185
|
+
if (claimed.payload?.connectionBarrier && nextPayload?.waitId && nextPayload.waitId !== claimed.payload.waitId) break;
|
|
170
186
|
db.prepare(`UPDATE session_inputs SET status = 'injecting', effective_delivery = 'steer', target_run_id = ?,
|
|
171
|
-
version = version + 1, updated_at_ms = ? WHERE id = ?`).run(runId, now, next.id);
|
|
187
|
+
payload_json = ?, version = version + 1, updated_at_ms = ? WHERE id = ?`).run(runId, claimed.payload?.connectionBarrier ? JSON.stringify(claimed.payload) : next.payload_json, now, next.id);
|
|
172
188
|
claimed.content += `\n\n${next.content}`;
|
|
173
189
|
}
|
|
174
190
|
}
|
|
@@ -210,9 +226,12 @@ function mutateQueuedSessionInput(input) {
|
|
|
210
226
|
ordered.splice(Math.max(0, Math.min(input.position, ordered.length)), 0, row);
|
|
211
227
|
const stmt = db.prepare(`UPDATE session_inputs SET position = ?, version = version + 1, updated_at_ms = ? WHERE id = ?`);
|
|
212
228
|
ordered.forEach((item, index) => stmt.run(index + 1, now, item.id));
|
|
213
|
-
} else
|
|
214
|
-
|
|
215
|
-
|
|
229
|
+
} else {
|
|
230
|
+
const clearControl = Boolean(row.payload_json && JSON.parse(row.payload_json).connectionAction && (input.content !== void 0 && input.content !== row.content || input.attachments?.length || input.contextSnapshots?.length));
|
|
231
|
+
db.prepare(`UPDATE session_inputs SET content = ?, attachments_json = ?, context_refs_json = ?,
|
|
232
|
+
context_snapshots_json = ?, thinking = ?, payload_json = ?, version = version + 1,
|
|
233
|
+
updated_at_ms = ? WHERE id = ?`).run(input.content ?? row.content, input.attachments ? JSON.stringify(input.attachments) : row.attachments_json, input.contextRefs ? JSON.stringify(input.contextRefs) : row.context_refs_json, input.contextSnapshots ? JSON.stringify(input.contextSnapshots) : row.context_snapshots_json, input.thinking ?? row.thinking, clearControl ? null : row.payload_json, now, input.id);
|
|
234
|
+
}
|
|
216
235
|
bumpSessionInputRevision(db, input.conversationId);
|
|
217
236
|
return true;
|
|
218
237
|
});
|
|
@@ -230,8 +249,23 @@ function recoverSessionInputState() {
|
|
|
230
249
|
return runSqliteWriteTransaction((db) => {
|
|
231
250
|
const keys = db.prepare(`SELECT DISTINCT conversation_id FROM session_inputs WHERE status IN ('queued','running','injecting')`).all();
|
|
232
251
|
const now = Date.now();
|
|
252
|
+
db.prepare(`UPDATE session_inputs SET payload_json = (
|
|
253
|
+
SELECT json_object('waitId', wait.id, 'objectiveRevision', json_extract(wait.data_json, '$.objectiveRevision'), 'connectionBarrier', json('true'))
|
|
254
|
+
FROM session_connection_waits wait JOIN sessions session ON session.active_transcript_id = wait.transcript_id
|
|
255
|
+
WHERE wait.conversation_id = session_inputs.conversation_id AND wait.status IN ('open','queued')
|
|
256
|
+
AND (session_inputs.payload_json IS NULL OR wait.id = json_extract(session_inputs.payload_json, '$.waitId'))
|
|
257
|
+
AND (session_inputs.expected_transcript_id IS NULL OR session_inputs.expected_transcript_id = wait.transcript_id)
|
|
258
|
+
AND session_inputs.id != json_extract(wait.data_json, '$.originInputId')
|
|
259
|
+
AND (json_extract(session_inputs.payload_json, '$.connectionBarrier') = 1
|
|
260
|
+
OR session_inputs.created_at_ms >= json_extract(wait.data_json, '$.createdAt')) LIMIT 1
|
|
261
|
+
) WHERE kind = 'message' AND status IN ('running','injecting')
|
|
262
|
+
AND (payload_json IS NULL OR json_extract(payload_json, '$.connectionBarrier') = 1)`).run();
|
|
233
263
|
db.prepare(`UPDATE session_inputs SET status = 'interrupted', error = 'Gateway restarted during delivery',
|
|
234
264
|
version = version + 1, updated_at_ms = ? WHERE status IN ('running','injecting')`).run(now);
|
|
265
|
+
db.prepare(`UPDATE session_inputs SET status = 'queued', error = NULL, version = version + 1,
|
|
266
|
+
updated_at_ms = ? WHERE status = 'interrupted' AND kind = 'message'
|
|
267
|
+
AND error = 'Gateway restarted during delivery'
|
|
268
|
+
AND json_extract(payload_json, '$.connectionAction') IN ('continue','cancel')`).run(now);
|
|
235
269
|
db.prepare(`UPDATE session_input_runtime SET active_run_id = NULL, active_input_id = NULL,
|
|
236
270
|
revision = revision + 1, updated_at_ms = ?`).run(now);
|
|
237
271
|
return keys.map((row) => row.conversation_id);
|
|
@@ -7,10 +7,10 @@ export declare const TaskEditOutputSchema: z.ZodObject<{
|
|
|
7
7
|
title: z.ZodString;
|
|
8
8
|
body: z.ZodOptional<z.ZodString>;
|
|
9
9
|
phase: z.ZodEnum<{
|
|
10
|
+
review: "review";
|
|
10
11
|
backlog: "backlog";
|
|
11
12
|
ready: "ready";
|
|
12
13
|
active: "active";
|
|
13
|
-
review: "review";
|
|
14
14
|
closed: "closed";
|
|
15
15
|
}>;
|
|
16
16
|
resolution: z.ZodOptional<z.ZodEnum<{
|
|
@@ -78,10 +78,10 @@ export declare const TaskDeleteOutputSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
|
78
78
|
title: z.ZodString;
|
|
79
79
|
body: z.ZodOptional<z.ZodString>;
|
|
80
80
|
phase: z.ZodEnum<{
|
|
81
|
+
review: "review";
|
|
81
82
|
backlog: "backlog";
|
|
82
83
|
ready: "ready";
|
|
83
84
|
active: "active";
|
|
84
|
-
review: "review";
|
|
85
85
|
closed: "closed";
|
|
86
86
|
}>;
|
|
87
87
|
resolution: z.ZodOptional<z.ZodEnum<{
|
|
@@ -7,10 +7,10 @@ export declare const TaskDependenciesOutputSchema: z.ZodObject<{
|
|
|
7
7
|
title: z.ZodString;
|
|
8
8
|
body: z.ZodOptional<z.ZodString>;
|
|
9
9
|
phase: z.ZodEnum<{
|
|
10
|
+
review: "review";
|
|
10
11
|
backlog: "backlog";
|
|
11
12
|
ready: "ready";
|
|
12
13
|
active: "active";
|
|
13
|
-
review: "review";
|
|
14
14
|
closed: "closed";
|
|
15
15
|
}>;
|
|
16
16
|
resolution: z.ZodOptional<z.ZodEnum<{
|
|
@@ -74,10 +74,10 @@ export declare const TaskDependenciesOutputSchema: z.ZodObject<{
|
|
|
74
74
|
id: z.ZodString;
|
|
75
75
|
title: z.ZodString;
|
|
76
76
|
phase: z.ZodEnum<{
|
|
77
|
+
review: "review";
|
|
77
78
|
backlog: "backlog";
|
|
78
79
|
ready: "ready";
|
|
79
80
|
active: "active";
|
|
80
|
-
review: "review";
|
|
81
81
|
closed: "closed";
|
|
82
82
|
}>;
|
|
83
83
|
resolution: z.ZodOptional<z.ZodEnum<{
|
|
@@ -119,10 +119,10 @@ export declare const TaskDependenciesOutputSchema: z.ZodObject<{
|
|
|
119
119
|
id: z.ZodString;
|
|
120
120
|
title: z.ZodString;
|
|
121
121
|
phase: z.ZodEnum<{
|
|
122
|
+
review: "review";
|
|
122
123
|
backlog: "backlog";
|
|
123
124
|
ready: "ready";
|
|
124
125
|
active: "active";
|
|
125
|
-
review: "review";
|
|
126
126
|
closed: "closed";
|
|
127
127
|
}>;
|
|
128
128
|
resolution: z.ZodOptional<z.ZodEnum<{
|
|
@@ -174,15 +174,15 @@ export declare const TaskContextMutationOutputSchema: z.ZodObject<{
|
|
|
174
174
|
task: "task";
|
|
175
175
|
file: "file";
|
|
176
176
|
memory: "memory";
|
|
177
|
-
document: "document";
|
|
178
177
|
url: "url";
|
|
178
|
+
document: "document";
|
|
179
179
|
source: "source";
|
|
180
180
|
artifact: "artifact";
|
|
181
181
|
}>;
|
|
182
182
|
targetId: z.ZodString;
|
|
183
183
|
role: z.ZodEnum<{
|
|
184
|
-
evidence: "evidence";
|
|
185
184
|
input: "input";
|
|
185
|
+
evidence: "evidence";
|
|
186
186
|
deliverable: "deliverable";
|
|
187
187
|
reference: "reference";
|
|
188
188
|
constraint: "constraint";
|
|
@@ -211,15 +211,15 @@ export declare const TaskContextMutationOutputSchema: z.ZodObject<{
|
|
|
211
211
|
task: "task";
|
|
212
212
|
file: "file";
|
|
213
213
|
memory: "memory";
|
|
214
|
-
document: "document";
|
|
215
214
|
url: "url";
|
|
215
|
+
document: "document";
|
|
216
216
|
source: "source";
|
|
217
217
|
artifact: "artifact";
|
|
218
218
|
}>;
|
|
219
219
|
targetId: z.ZodString;
|
|
220
220
|
role: z.ZodEnum<{
|
|
221
|
-
evidence: "evidence";
|
|
222
221
|
input: "input";
|
|
222
|
+
evidence: "evidence";
|
|
223
223
|
deliverable: "deliverable";
|
|
224
224
|
reference: "reference";
|
|
225
225
|
constraint: "constraint";
|
|
@@ -11,10 +11,10 @@ export declare const TaskMutationOutputSchema: z.ZodDiscriminatedUnion<[z.ZodObj
|
|
|
11
11
|
title: z.ZodString;
|
|
12
12
|
body: z.ZodOptional<z.ZodString>;
|
|
13
13
|
phase: z.ZodEnum<{
|
|
14
|
+
review: "review";
|
|
14
15
|
backlog: "backlog";
|
|
15
16
|
ready: "ready";
|
|
16
17
|
active: "active";
|
|
17
|
-
review: "review";
|
|
18
18
|
closed: "closed";
|
|
19
19
|
}>;
|
|
20
20
|
resolution: z.ZodOptional<z.ZodEnum<{
|
|
@@ -134,10 +134,10 @@ export declare const TaskMutationOutputSchema: z.ZodDiscriminatedUnion<[z.ZodObj
|
|
|
134
134
|
title: z.ZodString;
|
|
135
135
|
body: z.ZodOptional<z.ZodString>;
|
|
136
136
|
phase: z.ZodEnum<{
|
|
137
|
+
review: "review";
|
|
137
138
|
backlog: "backlog";
|
|
138
139
|
ready: "ready";
|
|
139
140
|
active: "active";
|
|
140
|
-
review: "review";
|
|
141
141
|
closed: "closed";
|
|
142
142
|
}>;
|
|
143
143
|
resolution: z.ZodOptional<z.ZodEnum<{
|