@xopcai/xopc 0.0.344 → 0.0.345
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/dist/assets/{auth-BsvblhQz.js → auth-CFiOJ_rf.js} +1 -1
- package/dist/browser-ext/dist/background.js +1 -1
- package/dist/browser-ext/dist/sidepanel.html +1 -1
- package/dist/browser-ext/dist/sidepanel.js +1 -1
- 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-DRFs0Jjv.js → agent-avatar-dicebear-DzTpItp_.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-C9J-ILd0.js → agent-defaults-settings-panel-B1al6YWa.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-plugin-dialog-CGstiK5S.js → agent-plugin-dialog-DSoB0gnd.js} +1 -1
- package/dist/gateway/static/root/assets/{agents-DS-CV-xB.js → agents-CwRQCefk.js} +6 -6
- package/dist/gateway/static/root/assets/{agents-admin-api-BTYHoqlW.js → agents-admin-api-Dlw9XxYa.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-znCRRKVF.js → app-management-settings-panel-CLHHHWYO.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-DSUujN-S.js → appearance-settings-CDHVSJLa.js} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-7uOjQp30.js → apps-page-d6fHnMl5.js} +1 -1
- package/dist/gateway/static/root/assets/{archive-plugin-DV01jcWu.js → archive-plugin-D_nLN0ho.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-D_Ts5PDI.js → automations-page-CU8i_OF1.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-workspace-Dg7IuWeB.js → automations-workspace-FUZW78oM.js} +1 -1
- package/dist/gateway/static/root/assets/{binary-plugins-CEoIySYJ.js → binary-plugins-cOFd2Nir.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-4bv_tjfg.js → block-editor-BJiU5Z4T.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-automation-inputs-UYRx7nE_.js → browser-automation-inputs-C9W2EklQ.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-automations-page-EtXgro_V.js → browser-automations-page-Ccv2YZy3.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-settings-page-Bf45sjmd.js → browser-settings-page-Da1ldGha.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-B-2wxCUQ.js → capabilities-Co9ZxHHB.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-page-YjIv97Sw.js → capabilities-page-DVg7nuOv.js} +2 -2
- package/dist/gateway/static/root/assets/{capabilities-settings-panel-Ch2iNnfI.js → capabilities-settings-panel-C5pn_cxD.js} +1 -1
- package/dist/gateway/static/root/assets/{capability-header-actions-DJKC0sss.js → capability-header-actions-BTKmmXDt.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-BWZmepe_.js → channels-DW8nOovI.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-terminal-dock-DLBqdgS-.js → chat-terminal-dock-CP8Y9yw4.js} +1 -1
- package/dist/gateway/static/root/assets/computer-settings-page-d2HeneXw.js +1 -0
- package/dist/gateway/static/root/assets/{connector-service-page-CYE4gX1g.js → connector-service-page-DurvkNyY.js} +1 -1
- package/dist/gateway/static/root/assets/{connectors-page-dJDZx96_.js → connectors-page-InzpTQdx.js} +1 -1
- package/dist/gateway/static/root/assets/{date-picker-BM9HDlUj.js → date-picker-C66v8-Yb.js} +1 -1
- package/dist/gateway/static/root/assets/{dependency-picker-BybqITjG.js → dependency-picker-DdI7qT11.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-CYoJiTna.js → desktop-pet-BNApFzEs.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-CXcTdFHs.js → desktop-pet-settings-CzlyUvVW.js} +1 -1
- package/dist/gateway/static/root/assets/{device-pairing-wizard-DnkRc3SQ.js → device-pairing-wizard-kGWh--bQ.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field-BNC2UnEM.js → directory-picker-path-field-C_dseFuW.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-CHU0dr2j.js → extension-debug-page-Bm_VpS_w.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-DXjPSQIh.js → extension-page-BwoZPA_b.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-DqFNPQsx.js → extension-settings-page-zk5g1zeU.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-DcE8n_ZS.js → gateway-config-swr-ukBQYwfH.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-realtime-DvNfXjan.js +1 -0
- package/dist/gateway/static/root/assets/gateway-realtime-store-DGQMXjfI.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-settings-BJVKTwIx.js → gateway-settings-ys3GodI9.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-CCPlq9Lk.js → gateway-startup-retry-CVpOj205.js} +1 -1
- package/dist/gateway/static/root/assets/{home-page-B2imtrmi.js → home-page-DCch7Wli.js} +1 -1
- package/dist/gateway/static/root/assets/{image-generation-api-D1Uh-05P.js → image-generation-api-zxx0qG9z.js} +1 -1
- package/dist/gateway/static/root/assets/{imports-page-CsypWC3J.js → imports-page-B_FXRx3e.js} +1 -1
- package/dist/gateway/static/root/assets/index-CmBebI78.js +106 -0
- package/dist/gateway/static/root/assets/index-y6kxoLV2.css +1 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CSzm05SM.js → keyboard-shortcuts-settings-G6jipaPk.js} +1 -1
- package/dist/gateway/static/root/assets/{local-app-workbench-page-BulzWHzC.js → local-app-workbench-page-DBk6VCUD.js} +1 -1
- package/dist/gateway/static/root/assets/{local-apps-page-BQ2QlJNH.js → local-apps-page-JTCwJwFQ.js} +1 -1
- package/dist/gateway/static/root/assets/{local-session-drafts-D9DeB55u.js → local-session-drafts-Dt_Yx7kq.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-B0WmWiCo.js → locale-store-B008NR-f.js} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-harzpOPJ.js → logs-page-BSY86BVu.js} +1 -1
- package/dist/gateway/static/root/assets/{management-settings-BXKeyT_O.js → management-settings-DVawGOeE.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-view-CSADmLmZ.js → markdown-view-BjDzimRP.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-CMe8YQ8l.js → media-plugins-CkAqQ2Tl.js} +1 -1
- package/dist/gateway/static/root/assets/messages-aVTaD9Mj.js +3 -0
- package/dist/gateway/static/root/assets/{note-detail-panel-DD9n9tnf.js → note-detail-panel-Cm-tLgD2.js} +3 -3
- package/dist/gateway/static/root/assets/{notes-page-B5NcvMau.js → notes-page-CYI52sAi.js} +1 -1
- package/dist/gateway/static/root/assets/{page-context-capture-button-BwFIuZqk.js → page-context-capture-button-DZEkVWnp.js} +1 -1
- package/dist/gateway/static/root/assets/{page-tabs-DH4JI3t_.js → page-tabs-CDZsjC4h.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-D3Wsh5jh.js → preview-open-alternatives-Cx5BFcNM.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-iigCUM2g.js → product-open-page-B-5PABzZ.js} +1 -1
- package/dist/gateway/static/root/assets/{project-detail-page-C19aDnSV.js → project-detail-page-cDOhoUoN.js} +1 -1
- package/dist/gateway/static/root/assets/{projects-page-aWOL4_py.js → projects-page-CiM0TnYn.js} +1 -1
- package/dist/gateway/static/root/assets/{registry-api-Bw0ZkSav.js → registry-api-EPj5O77m.js} +1 -1
- package/dist/gateway/static/root/assets/{remote-access-hub-CGLJFrLG.js → remote-access-hub-CieyswCw.js} +1 -1
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-ArGdQMYT.js → runtime-tools-settings-panel-AVqU_pNz.js} +1 -1
- package/dist/gateway/static/root/assets/{scenes-page-WB5cZttQ.js → scenes-page-CRoeeOsQ.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-Bzga2Tq0.js → schema-form-6rX3xac-.js} +1 -1
- package/dist/gateway/static/root/assets/session-api-D5BlAIge.js +1 -0
- package/dist/gateway/static/root/assets/session-manager-DcFS0yfO.js +16 -0
- package/dist/gateway/static/root/assets/{sessions-page-DCs83Gg-.js → sessions-page-CcLgWmnz.js} +1 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-t9xHuUNo.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-DMchToFl.js → settings-form-section-D4yLlpSo.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-Dh-S9_GO.js → settings-page-CiuxRfw3.js} +1 -1
- package/dist/gateway/static/root/assets/{setup-status-panel-kFPkdt3z.js → setup-status-panel-C5mzr9U_.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-CrVC0BzQ.js → share-preview-page-sZ5BzkSM.js} +1 -1
- package/dist/gateway/static/root/assets/{shares-settings-ZesbsEGA.js → shares-settings-Hk3h-pmX.js} +1 -1
- package/dist/gateway/static/root/assets/{skill-api-Deb8HqtR.js → skill-api-D7yidXQV.js} +1 -1
- package/dist/gateway/static/root/assets/skill-reload-api-hmT7uaZI.js +1 -0
- package/dist/gateway/static/root/assets/{skills-page-Bgs9jaCc.js → skills-page-D2ABIJZ8.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-CwD47-_i.js → system-settings-panel-DlmGH7bX.js} +1 -1
- package/dist/gateway/static/root/assets/task-detail-page-CB-LT_2z.js +1 -0
- package/dist/gateway/static/root/assets/{tasks-QQJXsiER.js → tasks-BH8_WMUF.js} +1 -1
- package/dist/gateway/static/root/assets/{tunnel-api-DtL__Vgg.js → tunnel-api-D3M3MUBJ.js} +1 -1
- package/dist/gateway/static/root/assets/{usage-page-DZ01CsLl.js → usage-page-YtsLilis.js} +1 -1
- package/dist/gateway/static/root/assets/{use-autosave-XBFnwLd0.js → use-autosave-CWMidLRt.js} +1 -1
- package/dist/gateway/static/root/assets/{user-model-page-ByACaDBG.js → user-model-page-Cjy2mA_0.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-NaIj9rQC.js → voice-api-key-field-C4OR4RzY.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-config-api-st1q4lqP.js → voice-config-api-BnnUzr07.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-D418eqa5.js → work-discovery-overlay-C53YDtCc.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-CSXIidqw.js → workflow-run-setup-panel-CoaJDAAq.js} +1 -1
- package/dist/gateway/static/root/assets/{workflows-page-nGttfQ1r.js → workflows-page-EQdAkdTP.js} +1 -1
- package/dist/gateway/static/root/index.html +16 -16
- package/dist/package.js +1 -1
- package/dist/packages/endpoint-tools-protocol/src/index.js +2 -1
- package/dist/packages/gateway-contract/src/sessions.js +11 -0
- package/dist/packages/gateway-contract/src/tasks.js +1 -0
- package/dist/src/agent/agent-manager.js +4 -4
- package/dist/src/agent/background-review/run-background-review.js +1 -1
- package/dist/src/agent/bootstrap/filter-bootstrap-files.js +1 -1
- package/dist/src/agent/external-tools/endpoint-provider.js +2 -2
- package/dist/src/agent/image/tool-model-config.js +1 -1
- package/dist/src/agent/service/direct-turn-helpers.js +2 -2
- package/dist/src/agent/service/process-direct-streaming.js +16 -2
- package/dist/src/agent/service.js +2 -2
- package/dist/src/agent/tasks/task-judge-service.d.ts +1 -0
- package/dist/src/agent/tasks/task-judge-service.js +55 -33
- package/dist/src/agent/tool-manuals/computer.d.ts +1 -1
- package/dist/src/agent/tool-manuals/computer.js +2 -2
- package/dist/src/agent/tool-manuals/xopc-use.d.ts +1 -1
- package/dist/src/agent/tool-manuals/xopc-use.js +28 -2
- package/dist/src/agent/tools/computer-use-tool.d.ts +0 -2
- package/dist/src/agent/tools/computer-use-tool.js +31 -19
- package/dist/src/agent/tools/factory.js +2 -3
- package/dist/src/agent/tools/xopc-use-tool.js +180 -9
- package/dist/src/agent-catalog/capabilities.js +2 -2
- package/dist/src/auth/credentials.js +1 -1
- package/dist/src/auth/oauth-provider-lock.js +1 -1
- package/dist/src/auth/sync-provider-auth.js +1 -1
- package/dist/src/automations/capabilities/drafts.js +1 -1
- package/dist/src/bootstrap/application-state.js +1 -1
- package/dist/src/capabilities/runtime/dispatcher.d.ts +2 -0
- package/dist/src/capabilities/runtime/dispatcher.js +1 -1
- package/dist/src/capabilities/runtime/product.js +1 -1
- package/dist/src/chat-commands/agent-edit.js +1 -1
- package/dist/src/chat-commands/builtins/config.js +1 -1
- package/dist/src/cli/commands/agent.js +1 -1
- package/dist/src/cli/commands/agents.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/models.js +1 -1
- package/dist/src/cli/commands/onboard/model.js +2 -2
- package/dist/src/cli/utils/init-workspace-core.js +1 -1
- package/dist/src/computer/broker.d.ts +6 -0
- package/dist/src/computer/broker.js +14 -0
- package/dist/src/computer/errors.js +2 -1
- package/dist/src/computer/model-adapter.js +3 -3
- package/dist/src/config/index.js +4 -4
- package/dist/src/config/loader.js +2 -2
- package/dist/src/config/models-json.js +1 -1
- package/dist/src/config/schema.js +1 -1
- package/dist/src/extensions/agent-plugins/validation.js +1 -1
- package/dist/src/gateway/agents-admin.js +2 -2
- package/dist/src/gateway/chat-stream/mapper.d.ts +3 -0
- package/dist/src/gateway/chat-stream/mapper.js +5 -1
- package/dist/src/gateway/chat-stream/protocol.d.ts +3 -0
- package/dist/src/gateway/file-path-classifier.js +1 -1
- package/dist/src/gateway/hono/lib/config-payload.js +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +2 -2
- package/dist/src/gateway/hono/routes/models.js +1 -1
- package/dist/src/gateway/hono/routes/notes.js +2 -2
- package/dist/src/gateway/hono/routes/projects.js +2 -2
- package/dist/src/gateway/hono/routes/session-input-handler.d.ts +2 -2
- package/dist/src/gateway/hono/routes/session-input-handler.js +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +19 -2
- package/dist/src/gateway/hono/routes/tasks.js +94 -1
- package/dist/src/gateway/image-generation-setup.js +2 -2
- package/dist/src/gateway/lock.js +1 -1
- package/dist/src/gateway/service/active-execution.js +1 -1
- package/dist/src/gateway/service/run-gateway-agent.js +5 -1
- package/dist/src/gateway/service/session-input-coordinator.d.ts +1 -1
- package/dist/src/gateway/service.d.ts +2 -1
- package/dist/src/gateway/service.js +72 -8
- package/dist/src/gateway/session-context-summary.js +17 -0
- package/dist/src/gateway/xopc-cloud-capability-setup.js +1 -1
- package/dist/src/home-intelligence/host.js +2 -2
- package/dist/src/local-apps/service.js +1 -1
- package/dist/src/providers/model-catalog-persistence.js +1 -1
- package/dist/src/session/client-history.d.ts +7 -1
- package/dist/src/session/client-history.js +51 -1
- package/dist/src/session/store.js +10 -2
- package/dist/src/session/types.d.ts +1 -0
- package/dist/src/storage/sqlite/index.d.ts +1 -1
- package/dist/src/storage/sqlite/index.js +2 -2
- package/dist/src/storage/sqlite/migrations/224_task_origin_links.sql +8 -0
- package/dist/src/storage/sqlite/migrations/225_task_collaboration.sql +32 -0
- package/dist/src/storage/sqlite/migrations/226_task_main_updates.sql +9 -0
- package/dist/src/storage/sqlite/migrations/227_task_main_update_decisions.sql +8 -0
- package/dist/src/storage/sqlite/migrations/228_task_main_agent_links.sql +14 -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/schema.js +1 -1
- package/dist/src/storage/sqlite/session-input-repository.d.ts +9 -0
- package/dist/src/storage/sqlite/session-input-repository.js +28 -1
- package/dist/src/storage/sqlite/session-repository.js +11 -0
- package/dist/src/tasks/capabilities/read.js +2 -2
- package/dist/src/tasks/capabilities/write.js +2 -0
- package/dist/src/tasks/index.js +2 -2
- package/dist/src/tasks/task-application-service.js +19 -1
- package/dist/src/tasks/task-collaboration-delivery.d.ts +9 -0
- package/dist/src/tasks/task-collaboration-delivery.js +100 -0
- package/dist/src/tasks/task-collaboration-repository.d.ts +52 -0
- package/dist/src/tasks/task-collaboration-repository.js +151 -0
- package/dist/src/tasks/task-context-assembler.d.ts +2 -0
- package/dist/src/tasks/task-context-assembler.js +23 -1
- package/dist/src/tasks/task-main-agent-repository.d.ts +10 -0
- package/dist/src/tasks/task-main-agent-repository.js +30 -0
- package/dist/src/tasks/task-main-update-decision-service.d.ts +21 -0
- package/dist/src/tasks/task-main-update-decision-service.js +118 -0
- package/dist/src/tasks/task-main-update-delivery.d.ts +16 -0
- package/dist/src/tasks/task-main-update-delivery.js +64 -0
- package/dist/src/tasks/task-main-update-input.d.ts +20 -0
- package/dist/src/tasks/task-main-update-input.js +37 -0
- package/dist/src/tasks/task-orchestration-metrics.d.ts +17 -0
- package/dist/src/tasks/task-orchestration-metrics.js +61 -0
- package/dist/src/tasks/task-origin-repository.d.ts +14 -0
- package/dist/src/tasks/task-origin-repository.js +29 -0
- package/dist/src/tasks/task-run-dispatcher.d.ts +3 -0
- package/dist/src/tasks/task-run-dispatcher.js +65 -7
- package/dist/src/tasks/task-run-repository.d.ts +2 -0
- package/dist/src/tasks/task-run-repository.js +12 -1
- package/dist/src/tasks/task-sidebar-hierarchy.d.ts +14 -0
- package/dist/src/tasks/task-sidebar-hierarchy.js +49 -0
- package/dist/src/tui/backends/embedded-backend.js +3 -3
- package/dist/src/tui/chat-history.js +8 -0
- package/dist/src/tui/tui-commands.js +1 -1
- package/dist/src/tui/tui-session-snapshot.js +4 -3
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/dist/src/tui/tui.js +1 -1
- package/dist/src/voice/realtime/agentBroker.d.ts +4 -0
- package/dist/src/voice/realtime/agentBroker.js +9 -3
- package/dist/src/voice/realtime/agentEngine.js +47 -13
- package/dist/src/voice/realtime/engine.d.ts +5 -0
- package/dist/src/voice/realtime/omniEngine.js +66 -12
- package/dist/src/voice/realtime/persona-context.js +1 -1
- package/dist/src/voice/realtime/playback-echo.js +2 -0
- package/dist/src/voice/realtime/runtime.d.ts +6 -0
- package/dist/src/voice/realtime/runtime.js +12 -0
- package/dist/src/voice/realtime/turnPolicy.d.ts +1 -0
- package/dist/src/voice/realtime/turnPolicy.js +3 -0
- package/package.json +3 -3
- package/dist/gateway/static/root/assets/computer-settings-page-CciQtKpz.js +0 -1
- package/dist/gateway/static/root/assets/gateway-realtime-BeUJkjA3.js +0 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-C-8wwbt_.js +0 -1
- package/dist/gateway/static/root/assets/index-Ca6iqaCn.css +0 -1
- package/dist/gateway/static/root/assets/index-DqQgdJHd.js +0 -106
- package/dist/gateway/static/root/assets/messages-CTKYRqR-.js +0 -3
- package/dist/gateway/static/root/assets/session-api-BY3dAGBn.js +0 -1
- package/dist/gateway/static/root/assets/session-manager-D10sD8IN.js +0 -16
- package/dist/gateway/static/root/assets/settings-advanced-gate-yIwyFL-A.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-DvWOrc3C.js +0 -1
- package/dist/gateway/static/root/assets/task-detail-page-DFEM3Xbj.js +0 -1
|
@@ -10,20 +10,21 @@ import { getSqliteDatabase, init_transaction } from "../storage/sqlite/transacti
|
|
|
10
10
|
import { getBrowserTabBindingById, init_browser_tab_binding_repository } from "../storage/sqlite/browser-tab-binding-repository.js";
|
|
11
11
|
import { findSessionInput, init_session_input_repository, insertSessionInput } from "../storage/sqlite/session-input-repository.js";
|
|
12
12
|
import { TaskRepository } from "../tasks/task-repository.js";
|
|
13
|
+
import { TaskRunRepository, init_task_run_repository } from "../tasks/task-run-repository.js";
|
|
13
14
|
import { init_changes, notifyUserContextChange } from "../user-context/changes.js";
|
|
14
15
|
import { getSessionMetadata } from "../storage/sqlite/session-read-repository.js";
|
|
15
16
|
import { init_session_repository, listSessionMetadata, patchSessionMetadata } from "../storage/sqlite/session-repository.js";
|
|
16
17
|
import { getSessionConfig, init_config_repository } from "../storage/sqlite/config-repository.js";
|
|
17
18
|
import { init_sqlite } from "../storage/sqlite/index.js";
|
|
18
19
|
import { normalizeAgentId } from "../agent-catalog/id.js";
|
|
19
|
-
import { init_agent_scope, listAgentEntries, resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agent/agent-scope.js";
|
|
20
|
-
import { init_paths, resolveConfigPath, resolveExtensionsDir } from "../config/paths.js";
|
|
21
20
|
import { init_config, resolveKnowledgeReadPolicy } from "../user-context/config.js";
|
|
22
21
|
import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
|
|
22
|
+
import { init_agent_scope, listAgentEntries, resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agent/agent-scope.js";
|
|
23
23
|
import { init_agent_session_key, resolveAgentMainConversationId } from "../routing/agent-session-key.js";
|
|
24
24
|
import { init_session_key, resolveConversationId, sanitizeSegment } from "../routing/session-key.js";
|
|
25
25
|
import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
|
|
26
26
|
import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
|
|
27
|
+
import { init_paths, resolveConfigPath, resolveExtensionsDir } from "../config/paths.js";
|
|
27
28
|
import { prewarmModelRegistry } from "../providers/model-registry.js";
|
|
28
29
|
import { init_providers, providers_exports } from "../providers/index.js";
|
|
29
30
|
import { AI_USAGE_RETENTION_MS, markStaleAiUsageEventsUnknown, pruneAiUsageEvents } from "../storage/sqlite/ai-usage-repository.js";
|
|
@@ -87,10 +88,6 @@ import { DiscussionSealer } from "../discussions/sealer.js";
|
|
|
87
88
|
import "../discussions/index.js";
|
|
88
89
|
import { EndpointToolRuntime } from "../endpoint-tools/runtime.js";
|
|
89
90
|
import "../endpoint-tools/index.js";
|
|
90
|
-
import { HomeCapabilityPreflightService } from "../home-intelligence/capability-preflight.js";
|
|
91
|
-
import { HomeAdviceGenerator } from "../home-intelligence/generator.js";
|
|
92
|
-
import { HomeIntelligenceHost } from "../home-intelligence/host.js";
|
|
93
|
-
import { HomeSnapshotBuilder } from "../home-intelligence/snapshot.js";
|
|
94
91
|
import { assertGatewayAuthConfigured, extractToken, resolveGatewayAuth, validateToken } from "./auth.js";
|
|
95
92
|
import { prepareAutomationAgentSession } from "./automation-agent-session.js";
|
|
96
93
|
import { stopTailscaleExposure } from "./tailscale-lifecycle.js";
|
|
@@ -146,8 +143,16 @@ import { reconcileMemoryMaintenanceAutomations } from "./memory-maintenance-auto
|
|
|
146
143
|
import { GatewayReadiness } from "./startup-readiness.js";
|
|
147
144
|
import { createGatewayStartupTrace } from "./startup-trace.js";
|
|
148
145
|
import { GatewaySceneHost } from "./scenes/host.js";
|
|
146
|
+
import { TaskCollaborationDelivery } from "../tasks/task-collaboration-delivery.js";
|
|
147
|
+
import { TaskMainUpdateDelivery } from "../tasks/task-main-update-delivery.js";
|
|
148
|
+
import { TaskMainUpdateDecisionService } from "../tasks/task-main-update-decision-service.js";
|
|
149
|
+
import { selectTaskMainUpdateAttempt, submitAndConfirmTaskMainUpdate } from "../tasks/task-main-update-input.js";
|
|
149
150
|
import { checkAppContextAccess, prepareAppContext } from "./service/app-context-access.js";
|
|
150
151
|
import { applyAutomaticVoiceLanguage, inferProductLanguageFromEnvironment, initializeVoiceDefaults } from "../voice/language-profile.js";
|
|
152
|
+
import { HomeAdviceGenerator } from "../home-intelligence/generator.js";
|
|
153
|
+
import { HomeIntelligenceHost } from "../home-intelligence/host.js";
|
|
154
|
+
import { HomeSnapshotBuilder } from "../home-intelligence/snapshot.js";
|
|
155
|
+
import { HomeCapabilityPreflightService } from "../home-intelligence/capability-preflight.js";
|
|
151
156
|
import crypto from "node:crypto";
|
|
152
157
|
//#region src/gateway/service.ts
|
|
153
158
|
init_session_repository();
|
|
@@ -163,6 +168,7 @@ init_logger();
|
|
|
163
168
|
init_log_stream();
|
|
164
169
|
init_paths();
|
|
165
170
|
init_package_version();
|
|
171
|
+
init_task_run_repository();
|
|
166
172
|
init_resolve_route();
|
|
167
173
|
init_session_key();
|
|
168
174
|
init_sqlite();
|
|
@@ -763,7 +769,7 @@ var GatewayService = class {
|
|
|
763
769
|
this.ensureAgentService();
|
|
764
770
|
return;
|
|
765
771
|
}
|
|
766
|
-
const clientMessageId =
|
|
772
|
+
const clientMessageId = new TaskRunRepository().nextAgentInputClientMessageId(runId);
|
|
767
773
|
const session = await this.sessionIndex.getSessionMetadata(conversationId);
|
|
768
774
|
if (!session) throw new Error("Task session is unavailable");
|
|
769
775
|
insertSessionInput({
|
|
@@ -804,6 +810,19 @@ var GatewayService = class {
|
|
|
804
810
|
this.projects.flushCommittedEffects();
|
|
805
811
|
this._workDiscovery?.dispatchProjectUnderstanding();
|
|
806
812
|
this.dispatchTaskEvents();
|
|
813
|
+
await new TaskCollaborationDelivery().drain(async (input) => {
|
|
814
|
+
const state = this.agentRunner.inputs.snapshot(input.conversationId);
|
|
815
|
+
return (await this.agentRunner.submitSessionInput({
|
|
816
|
+
conversationId: input.conversationId,
|
|
817
|
+
clientMessageId: input.clientMessageId,
|
|
818
|
+
delivery: state.activeRunId ? "steer" : "next",
|
|
819
|
+
content: input.content,
|
|
820
|
+
origin: {
|
|
821
|
+
type: "system",
|
|
822
|
+
source: "workflow"
|
|
823
|
+
}
|
|
824
|
+
})).ok;
|
|
825
|
+
});
|
|
807
826
|
this.createTaskRunDispatcher().dispatch();
|
|
808
827
|
await this.createWorkflowRunService().dispatchTaskRuns();
|
|
809
828
|
}, (err) => {
|
|
@@ -814,8 +833,53 @@ var GatewayService = class {
|
|
|
814
833
|
phase: "task_run_dispatch"
|
|
815
834
|
}, `Task dispatch failed: ${errorMessage}`);
|
|
816
835
|
});
|
|
836
|
+
taskMainUpdateDispatch = createBackgroundTask(async () => {
|
|
837
|
+
await new TaskMainUpdateDelivery().drain({
|
|
838
|
+
isAvailable: (conversationId) => {
|
|
839
|
+
const state = this.agentRunner.inputs.snapshot(conversationId);
|
|
840
|
+
return !state.activeRunId && state.inputs.every((item) => item.status === "interrupted") && (!this.voiceRealtime.hasConversation(conversationId) || this.voiceRealtime.canOfferTaskUpdate(conversationId));
|
|
841
|
+
},
|
|
842
|
+
decide: (input) => new TaskMainUpdateDecisionService({
|
|
843
|
+
getModelRef: (conversationId) => this.ensureAgentService().getModelForSession(conversationId),
|
|
844
|
+
loadHistory: (conversationId) => this.sessionIndex.loadMessages(conversationId)
|
|
845
|
+
}).decide(input),
|
|
846
|
+
submitAndConfirm: (input) => {
|
|
847
|
+
if (this.voiceRealtime.hasConversation(input.conversationId)) {
|
|
848
|
+
const attempt = selectTaskMainUpdateAttempt(input.conversationId, input.clientMessageId, findSessionInput);
|
|
849
|
+
if (attempt.kind === "completed") return Promise.resolve(true);
|
|
850
|
+
if (attempt.kind !== "new" || !attempt.clientMessageId) return Promise.resolve(false);
|
|
851
|
+
return this.voiceRealtime.offerTaskUpdate({
|
|
852
|
+
...input,
|
|
853
|
+
clientMessageId: attempt.clientMessageId
|
|
854
|
+
});
|
|
855
|
+
}
|
|
856
|
+
return submitAndConfirmTaskMainUpdate(input, {
|
|
857
|
+
findInput: findSessionInput,
|
|
858
|
+
submit: async (message) => {
|
|
859
|
+
return (await this.agentRunner.submitSessionInput({
|
|
860
|
+
...message,
|
|
861
|
+
delivery: "next",
|
|
862
|
+
origin: {
|
|
863
|
+
type: "system",
|
|
864
|
+
source: "task_update"
|
|
865
|
+
}
|
|
866
|
+
})).ok;
|
|
867
|
+
},
|
|
868
|
+
waitForCompletion: (conversationId, clientMessageId) => this.agentRunner.inputs.waitForCompletion(conversationId, clientMessageId)
|
|
869
|
+
});
|
|
870
|
+
}
|
|
871
|
+
});
|
|
872
|
+
}, (err) => {
|
|
873
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
874
|
+
log.error({
|
|
875
|
+
err,
|
|
876
|
+
errorMessage,
|
|
877
|
+
phase: "task_main_update_dispatch"
|
|
878
|
+
}, `Main Agent update dispatch failed: ${errorMessage}`);
|
|
879
|
+
});
|
|
817
880
|
dispatchTaskRuns() {
|
|
818
881
|
this.taskRunDispatch();
|
|
882
|
+
this.taskMainUpdateDispatch();
|
|
819
883
|
}
|
|
820
884
|
async ensureTaskConversation(taskId, options = {}) {
|
|
821
885
|
const task = new TaskRepository().require(taskId);
|
|
@@ -1864,7 +1928,7 @@ var GatewayService = class {
|
|
|
1864
1928
|
});
|
|
1865
1929
|
}
|
|
1866
1930
|
if (event.type.startsWith("task.")) this.emit(event.type, event.payload);
|
|
1867
|
-
if (this.config.userContext.homeIntelligence.refreshOnContextChange && (event.type.startsWith("task.") || event.type.startsWith("project."))) {
|
|
1931
|
+
if (this.config.userContext.homeIntelligence.refreshOnContextChange && (event.type.startsWith("task.") && event.type !== "task.collaboration_entry_added" || event.type.startsWith("project."))) {
|
|
1868
1932
|
const payload = event.payload;
|
|
1869
1933
|
const objectId = event.type.startsWith("task.") ? payload.taskId : payload.projectId;
|
|
1870
1934
|
const revision = payload.version ?? payload.revision ?? "unknown";
|
|
@@ -11,6 +11,8 @@ import { getExecutionEnvironmentForSession } from "../execution-environments/sub
|
|
|
11
11
|
import { effectiveWorkspacePathForSession } from "../session/session-workspace.js";
|
|
12
12
|
import { ProjectStore } from "../projects/project-store.js";
|
|
13
13
|
import { runExec } from "../infra/exec.js";
|
|
14
|
+
import { TaskCollaborationRepository } from "../tasks/task-collaboration-repository.js";
|
|
15
|
+
import { TaskOriginRepository } from "../tasks/task-origin-repository.js";
|
|
14
16
|
import { isSessionSourceBinding } from "../agent/source-context/types.js";
|
|
15
17
|
import { realpath, stat } from "node:fs/promises";
|
|
16
18
|
//#region src/gateway/session-context-summary.ts
|
|
@@ -106,6 +108,21 @@ async function getSessionContextSummary(config, conversationId, scopes) {
|
|
|
106
108
|
phase: task.phase
|
|
107
109
|
};
|
|
108
110
|
else if (taskId) unavailable("work");
|
|
111
|
+
const delegated = new TaskOriginRepository().list(conversationId, 20);
|
|
112
|
+
const board = new TaskCollaborationRepository();
|
|
113
|
+
summary.work.delegatedTasks = delegated.items.map((item) => {
|
|
114
|
+
const latest = board.latest(item.id);
|
|
115
|
+
return {
|
|
116
|
+
...item,
|
|
117
|
+
title: item.title.slice(0, 240),
|
|
118
|
+
...latest ? { latestUpdate: {
|
|
119
|
+
kind: latest.kind,
|
|
120
|
+
body: latest.body.slice(0, 400),
|
|
121
|
+
createdAt: latest.createdAt
|
|
122
|
+
} } : {}
|
|
123
|
+
};
|
|
124
|
+
});
|
|
125
|
+
summary.work.delegatedTaskCount = delegated.total;
|
|
109
126
|
} catch (err) {
|
|
110
127
|
unavailable("work", err);
|
|
111
128
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AgentCatalogRepository, init_repository } from "../agent-catalog/repository.js";
|
|
2
|
-
import { AgentCatalogService } from "../agent-catalog/service.js";
|
|
3
2
|
import { getModelCatalogStore, init_model_catalog_store } from "../providers/model-catalog-store.js";
|
|
4
3
|
import { compareCatalogModels } from "../providers/model-catalog-ranking.js";
|
|
4
|
+
import { AgentCatalogService } from "../agent-catalog/service.js";
|
|
5
5
|
import { prepareUpdateGlobalDefaults } from "./global-defaults-admin.js";
|
|
6
6
|
//#region src/gateway/xopc-cloud-capability-setup.ts
|
|
7
7
|
init_repository();
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
|
+
import { HomeAdviceBudgetExceededError } from "./generator.js";
|
|
3
4
|
import { homePatternKey } from "./strategy.js";
|
|
5
|
+
import { HomeAdvicePolicy } from "./policy.js";
|
|
4
6
|
import { HomeIntelligenceRepository } from "./repository.js";
|
|
5
7
|
import { HomeOpportunityApplicationService } from "./application-service.js";
|
|
6
|
-
import { HomeAdvicePolicy } from "./policy.js";
|
|
7
|
-
import { HomeAdviceBudgetExceededError } from "./generator.js";
|
|
8
8
|
import { buildHomeOpportunityNotification } from "./notification.js";
|
|
9
9
|
import { createHash } from "node:crypto";
|
|
10
10
|
//#region src/home-intelligence/host.ts
|
|
@@ -5,10 +5,10 @@ import { currentOperationId, init_operation_context } from "../infra/operation-c
|
|
|
5
5
|
import { afterSqliteCommit, init_transaction, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
|
|
6
6
|
import { ExtensionCapabilityBindingsSchema, extensionCapabilityPermissions } from "../../packages/gateway-contract/src/extension-capabilities.js";
|
|
7
7
|
import { init_src } from "../../packages/gateway-contract/src/index.js";
|
|
8
|
-
import { CapabilityError } from "../capabilities/runtime/errors.js";
|
|
9
8
|
import { init_paths, resolveExtensionsDir } from "../config/paths.js";
|
|
10
9
|
import { LocalAppStore } from "./store.js";
|
|
11
10
|
import { slugifyProjectName } from "../projects/project-store.js";
|
|
11
|
+
import { CapabilityError } from "../capabilities/runtime/errors.js";
|
|
12
12
|
import { DomainOutboxDispatcher } from "../infra/domain-outbox-dispatcher.js";
|
|
13
13
|
import { validateLocalAppCapabilityContracts } from "./capabilities/contracts.js";
|
|
14
14
|
import { buildLocalAppFixGuidance } from "./fix-guidance.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { init_paths_state, resolveXopcCloudCatalogCachePath } from "../config/paths-state.js";
|
|
3
|
-
import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
|
|
4
3
|
import { ComputerProfileSchema, init_src } from "../../packages/computer-control-contract/src/index.js";
|
|
4
|
+
import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
|
|
5
5
|
import { voiceManifestSchema } from "../../packages/realtime-protocol/src/voice-catalog.js";
|
|
6
6
|
import { init_voice } from "../../packages/realtime-protocol/src/voice.js";
|
|
7
7
|
import { readFileSync, rmSync } from "node:fs";
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import { type TurnOutcome, type UserTurnDocument } from '@xopcai/gateway-contract';
|
|
2
2
|
import type { Message } from './types.js';
|
|
3
|
+
import type { TaskUpdateTrigger } from '../storage/sqlite/session-input-repository.js';
|
|
3
4
|
import type { TranscriptStoredRow } from './session-context-for-llm.js';
|
|
4
5
|
/** Transcript row for TUI and HTTP clients (flattened from persisted session messages). */
|
|
5
6
|
export interface ClientHistoryMessage {
|
|
6
7
|
id?: string;
|
|
7
8
|
turnId?: string;
|
|
8
|
-
|
|
9
|
+
/** A background Agent turn starts a new visible assistant bubble without a visible user row. */
|
|
10
|
+
startsNewBubble?: boolean;
|
|
11
|
+
role: 'user' | 'assistant' | 'system' | 'task';
|
|
9
12
|
content: string;
|
|
13
|
+
taskTrigger?: TaskUpdateTrigger;
|
|
10
14
|
displayIndex?: number;
|
|
11
15
|
rawContent?: string | unknown[];
|
|
12
16
|
/** Persisted inbound attachment metadata used by chat clients to reload media. */
|
|
@@ -81,4 +85,6 @@ export declare function transcriptRowsToClientHistory(rows: TranscriptStoredRow[
|
|
|
81
85
|
startRowNumber?: number;
|
|
82
86
|
endRowNumber?: number;
|
|
83
87
|
rowNumberOffset?: number;
|
|
88
|
+
startsNewBubbleTurnIds?: ReadonlySet<string>;
|
|
89
|
+
taskUpdateTriggers?: ReadonlyMap<string, TaskUpdateTrigger>;
|
|
84
90
|
}): ClientHistoryMessage[];
|
|
@@ -5,6 +5,24 @@ import { stripRuntimeContextFromUserMessage } from "./user-message-display.js";
|
|
|
5
5
|
import { buildTranscriptOutline } from "./transcript-outline.js";
|
|
6
6
|
//#region src/session/client-history.ts
|
|
7
7
|
init_src();
|
|
8
|
+
function taskTriggerFromMetadata(metadata) {
|
|
9
|
+
if (!metadata || typeof metadata !== "object" || Array.isArray(metadata)) return void 0;
|
|
10
|
+
const value = metadata.taskTrigger;
|
|
11
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return void 0;
|
|
12
|
+
const trigger = value;
|
|
13
|
+
if (typeof trigger.entryId !== "string" || typeof trigger.taskId !== "string" || typeof trigger.taskTitle !== "string" || !trigger.taskTitle.trim() || ![
|
|
14
|
+
"progress",
|
|
15
|
+
"question",
|
|
16
|
+
"result",
|
|
17
|
+
"failure"
|
|
18
|
+
].includes(String(trigger.kind))) return void 0;
|
|
19
|
+
return {
|
|
20
|
+
entryId: trigger.entryId,
|
|
21
|
+
taskId: trigger.taskId,
|
|
22
|
+
taskTitle: trigger.taskTitle,
|
|
23
|
+
kind: trigger.kind
|
|
24
|
+
};
|
|
25
|
+
}
|
|
8
26
|
function sourceContextDisplayMetadata(metadata) {
|
|
9
27
|
if (!metadata || typeof metadata !== "object" || Array.isArray(metadata)) return void 0;
|
|
10
28
|
const record = metadata;
|
|
@@ -143,9 +161,23 @@ function messagesToClientHistory(messages, opts) {
|
|
|
143
161
|
const slice = opts?.limit !== void 0 && messages.length > opts.limit ? messages.slice(-opts.limit) : messages;
|
|
144
162
|
const results = collectToolResults(slice);
|
|
145
163
|
const out = [];
|
|
164
|
+
const hiddenTurnIds = new Set(slice.flatMap((message) => message.metadata?.hiddenFromClient === true && typeof message.turnId === "string" ? [message.turnId] : []));
|
|
165
|
+
const assistantTurnIds = new Set(slice.filter((message) => message.role === "assistant").map((message) => message.turnId).filter((turnId) => Boolean(turnId)));
|
|
146
166
|
for (const m of slice) {
|
|
147
167
|
if (m.role === "tool" || m.role === "toolResult") continue;
|
|
148
168
|
if (m.role === "user" || m.role === "system") {
|
|
169
|
+
if (m.metadata?.hiddenFromClient === true) {
|
|
170
|
+
const turnId = m.turnId;
|
|
171
|
+
const trigger = turnId && assistantTurnIds.has(turnId) ? taskTriggerFromMetadata(m.metadata) : void 0;
|
|
172
|
+
if (trigger) out.push({
|
|
173
|
+
role: "task",
|
|
174
|
+
turnId,
|
|
175
|
+
content: "",
|
|
176
|
+
taskTrigger: trigger,
|
|
177
|
+
timestamp: parseTimestamp(m.timestamp)
|
|
178
|
+
});
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
149
181
|
const text = flattenMessageContent(m.content);
|
|
150
182
|
out.push({
|
|
151
183
|
role: m.role,
|
|
@@ -163,6 +195,7 @@ function messagesToClientHistory(messages, opts) {
|
|
|
163
195
|
out.push({
|
|
164
196
|
role: "assistant",
|
|
165
197
|
...typeof m.turnId === "string" ? { turnId: m.turnId } : {},
|
|
198
|
+
...typeof m.turnId === "string" && hiddenTurnIds.has(m.turnId) ? { startsNewBubble: true } : {},
|
|
166
199
|
content: text,
|
|
167
200
|
timestamp: parseTimestamp(m.timestamp),
|
|
168
201
|
toolCalls
|
|
@@ -368,7 +401,9 @@ function transcriptRowsToClientHistory(rows, opts) {
|
|
|
368
401
|
const startIndex = hasRowWindow ? Math.max(0, Math.trunc(opts?.startRowNumber ?? 1) - 1) : opts?.limit !== void 0 && rows.length > opts.limit ? rows.length - opts.limit : 0;
|
|
369
402
|
const endIndex = hasRowWindow ? Math.max(startIndex, Math.min(rows.length, Math.trunc(opts?.endRowNumber ?? rows.length))) : rows.length;
|
|
370
403
|
const slice = hasRowWindow ? rows.slice(startIndex, endIndex) : opts?.limit !== void 0 && rows.length > opts.limit ? rows.slice(-opts.limit) : rows;
|
|
371
|
-
const
|
|
404
|
+
const messages = slice.map(asHistoryMessageRow).filter((row) => row !== null);
|
|
405
|
+
const results = collectHistoryToolResults(messages);
|
|
406
|
+
const assistantTurnIds = new Set(messages.filter((message) => message.role === "assistant").map((message) => message.turnId).filter((turnId) => Boolean(turnId)));
|
|
372
407
|
const out = [];
|
|
373
408
|
const reviewTraceToolById = /* @__PURE__ */ new Map();
|
|
374
409
|
for (const [offset, row] of slice.entries()) {
|
|
@@ -472,6 +507,20 @@ function transcriptRowsToClientHistory(rows, opts) {
|
|
|
472
507
|
if (!messageRow) continue;
|
|
473
508
|
if (messageRow.role === "tool" || messageRow.role === "toolResult") continue;
|
|
474
509
|
if (messageRow.role === "user" || messageRow.role === "system") {
|
|
510
|
+
if (messageRow.metadata?.hiddenFromClient === true) {
|
|
511
|
+
const trigger = messageRow.turnId && assistantTurnIds.has(messageRow.turnId) ? taskTriggerFromMetadata(messageRow.metadata) ?? opts?.taskUpdateTriggers?.get(messageRow.turnId) : void 0;
|
|
512
|
+
if (trigger) out.push({
|
|
513
|
+
id,
|
|
514
|
+
turnId: messageRow.turnId,
|
|
515
|
+
role: "task",
|
|
516
|
+
kind: "message",
|
|
517
|
+
content: "",
|
|
518
|
+
taskTrigger: trigger,
|
|
519
|
+
timestamp: parseTimestampValue(messageRow.timestamp),
|
|
520
|
+
...displayIndex !== void 0 ? { displayIndex } : {}
|
|
521
|
+
});
|
|
522
|
+
continue;
|
|
523
|
+
}
|
|
475
524
|
out.push({
|
|
476
525
|
id,
|
|
477
526
|
...messageRow.turnId ? { turnId: messageRow.turnId } : {},
|
|
@@ -489,6 +538,7 @@ function transcriptRowsToClientHistory(rows, opts) {
|
|
|
489
538
|
out.push({
|
|
490
539
|
id,
|
|
491
540
|
...messageRow.turnId ? { turnId: messageRow.turnId } : {},
|
|
541
|
+
...messageRow.turnId && opts?.startsNewBubbleTurnIds?.has(messageRow.turnId) ? { startsNewBubble: true } : {},
|
|
492
542
|
role: "assistant",
|
|
493
543
|
kind: "message",
|
|
494
544
|
content: flattenMessageContent(messageRow.content ?? ""),
|
|
@@ -3,6 +3,7 @@ import { createLogger } from "../utils/logger/index.js";
|
|
|
3
3
|
import { init_logger } from "../utils/logger.js";
|
|
4
4
|
import { requireXopcDatabase } from "../storage/sqlite/connection.js";
|
|
5
5
|
import { runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
|
|
6
|
+
import { listTaskUpdateRunIds, listTaskUpdateTriggers } from "../storage/sqlite/session-input-repository.js";
|
|
6
7
|
import { buildSessionContextForLlm, buildSessionDisplayMessages, init_session_context_for_llm, isRuntimeOnlyTranscriptMessage, isTranscriptCompactionEntry, mergeLlmMessagesPreservingContextRows, transcriptRowsFromJsonArray } from "./session-context-for-llm.js";
|
|
7
8
|
import "./types.js";
|
|
8
9
|
import { estimateTokensFromMessages } from "../storage/sqlite/row-mappers.js";
|
|
@@ -192,7 +193,11 @@ var SessionStore = class {
|
|
|
192
193
|
});
|
|
193
194
|
const endIndex = hasBeforeCursor ? Math.min(page.total, Math.max(0, parsedBefore)) : Math.max(0, page.total - offset);
|
|
194
195
|
const startIndex = Math.max(0, endIndex - page.rows.length);
|
|
195
|
-
const history = transcriptRowsToClientHistory(page.rows, {
|
|
196
|
+
const history = transcriptRowsToClientHistory(page.rows, {
|
|
197
|
+
rowNumberOffset: startIndex,
|
|
198
|
+
startsNewBubbleTurnIds: listTaskUpdateRunIds(key),
|
|
199
|
+
taskUpdateTriggers: listTaskUpdateTriggers(key)
|
|
200
|
+
});
|
|
196
201
|
const messages = options.compact ? compactHistory(history) : history;
|
|
197
202
|
const session = {
|
|
198
203
|
...metadata,
|
|
@@ -632,7 +637,10 @@ var SessionStore = class {
|
|
|
632
637
|
}
|
|
633
638
|
async findInSession(key, query, limit) {
|
|
634
639
|
if (!await this.getMetadata(key)) return null;
|
|
635
|
-
return findSessionMessages(transcriptRowsToClientHistory(await this.loadTranscriptRows(key)
|
|
640
|
+
return findSessionMessages(transcriptRowsToClientHistory(await this.loadTranscriptRows(key), {
|
|
641
|
+
startsNewBubbleTurnIds: listTaskUpdateRunIds(key),
|
|
642
|
+
taskUpdateTriggers: listTaskUpdateTriggers(key)
|
|
643
|
+
}), query, limit);
|
|
636
644
|
}
|
|
637
645
|
recallSession(key, query, options) {
|
|
638
646
|
requireXopcDatabase();
|
|
@@ -142,6 +142,7 @@ export interface SessionDetail extends SessionMetadata {
|
|
|
142
142
|
}
|
|
143
143
|
/** Session list query parameters */
|
|
144
144
|
export interface SessionListQuery extends SessionDiscoveryQuery {
|
|
145
|
+
rootConversationsOnly?: boolean;
|
|
145
146
|
status?: SessionStatus | SessionStatus[];
|
|
146
147
|
/** Single `sourceChannel`, or comma-separated list (e.g. `telegram,weixin`). */
|
|
147
148
|
channel?: string;
|
|
@@ -14,7 +14,7 @@ export { claimContextExtractionRun, finishContextExtractionRun, getContextExtrac
|
|
|
14
14
|
export { createCollaborationRule, getCollaborationRule, listCollaborationRules, setCollaborationRuleStatus, type CollaborationRule, } from './collaboration-rule-repository.js';
|
|
15
15
|
export { createContextEvidence, type ContextEvidence } from './context-evidence-repository.js';
|
|
16
16
|
export { getUserPerson, getUserPeopleIndexState, listUserPeople, mergeUserPeople, replaceUserPeopleIndex, summarizeUserPeople, updateUserPerson, } from './user-people-repository.js';
|
|
17
|
-
export { cancelQueuedSessionInput, claimNextSessionInput, findSessionInput, finishSessionInputRun, getSessionInputState, getSessionInputById, insertSessionInput, listActiveSessionInputExecutions, listActiveSessionInputRuns, mutateQueuedSessionInput, recoverSessionInputState, setSessionInputStatus, type SessionInput, type SessionInputDelivery, type SessionInputPayload, type SessionInputState, type SessionInputStatus, } from './session-input-repository.js';
|
|
17
|
+
export { cancelQueuedSessionInput, claimNextSessionInput, findSessionInput, finishSessionInputRun, getSessionInputState, getSessionInputById, insertSessionInput, listActiveSessionInputExecutions, listActiveSessionInputRuns, listTaskUpdateRunIds, listTaskUpdateTriggers, mutateQueuedSessionInput, recoverSessionInputState, setSessionInputStatus, type SessionInput, type SessionInputDelivery, type SessionInputPayload, type SessionInputState, type TaskUpdateTrigger, type SessionInputStatus, } from './session-input-repository.js';
|
|
18
18
|
export { consumeClarificationApproval, consumeClarificationResume, createClarificationWait, getActiveClarification, getClarification, getClarificationResumeInput, getClarificationSnapshot, isClarificationSuspended, resolveClarification, supersedeActiveClarification, type CreateClarificationInput, type ResolveClarificationInput, type ResolveClarificationResult, } from './clarification-wait-repository.js';
|
|
19
19
|
export { replaceLatestSessionTurnAndQueueInput, validateLatestSessionTurnTarget, type ReplaceLatestSessionTurnInput, type ReplaceLatestSessionTurnResult, } from './session-turn-replace-repository.js';
|
|
20
20
|
export { acknowledgeHomeAttention, isHomeAttentionAcknowledged, type HomeAttentionSubjectKind, } from './home-attention-repository.js';
|
|
@@ -17,7 +17,7 @@ import { claimContextExtractionRun, finishContextExtractionRun, getContextExtrac
|
|
|
17
17
|
import { createCollaborationRule, getCollaborationRule, init_collaboration_rule_repository, listCollaborationRules, setCollaborationRuleStatus } from "./collaboration-rule-repository.js";
|
|
18
18
|
import { createContextEvidence, init_context_evidence_repository } from "./context-evidence-repository.js";
|
|
19
19
|
import { getUserPeopleIndexState, getUserPerson, init_user_people_repository, listUserPeople, mergeUserPeople, replaceUserPeopleIndex, summarizeUserPeople, updateUserPerson } from "./user-people-repository.js";
|
|
20
|
-
import { cancelQueuedSessionInput, claimNextSessionInput, findSessionInput, finishSessionInputRun, getSessionInputById, getSessionInputState, init_session_input_repository, insertSessionInput, listActiveSessionInputExecutions, listActiveSessionInputRuns, mutateQueuedSessionInput, recoverSessionInputState, setSessionInputStatus } from "./session-input-repository.js";
|
|
20
|
+
import { cancelQueuedSessionInput, claimNextSessionInput, findSessionInput, finishSessionInputRun, getSessionInputById, getSessionInputState, init_session_input_repository, insertSessionInput, listActiveSessionInputExecutions, listActiveSessionInputRuns, listTaskUpdateRunIds, listTaskUpdateTriggers, mutateQueuedSessionInput, recoverSessionInputState, setSessionInputStatus } from "./session-input-repository.js";
|
|
21
21
|
import { consumeClarificationApproval, consumeClarificationResume, createClarificationWait, getActiveClarification, getClarification, getClarificationResumeInput, getClarificationSnapshot, init_clarification_wait_repository, isClarificationSuspended, resolveClarification, supersedeActiveClarification } from "./clarification-wait-repository.js";
|
|
22
22
|
import { buildDefaultSessionMetadata, init_session_metadata } from "./session-metadata.js";
|
|
23
23
|
import { buildGlobalSessionStats, classifyStoredRow, estimateTokensFromMessages, extractFtsContent, init_row_mappers, metadataToSessionInsert, sessionConfigRowToConfig, sessionRowToMetadata, transcriptEntryRowToStoredRow } from "./row-mappers.js";
|
|
@@ -87,4 +87,4 @@ var init_sqlite = __esmMin((() => {
|
|
|
87
87
|
}));
|
|
88
88
|
//#endregion
|
|
89
89
|
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, 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 };
|
|
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 };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
CREATE TABLE IF NOT EXISTS task_origin_links (
|
|
2
|
+
task_id TEXT PRIMARY KEY REFERENCES tasks(task_id) ON DELETE CASCADE,
|
|
3
|
+
conversation_id TEXT NOT NULL REFERENCES sessions(conversation_id) ON DELETE CASCADE,
|
|
4
|
+
created_at INTEGER NOT NULL
|
|
5
|
+
);
|
|
6
|
+
|
|
7
|
+
CREATE INDEX IF NOT EXISTS idx_task_origin_links_conversation
|
|
8
|
+
ON task_origin_links(conversation_id, created_at DESC);
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
CREATE TABLE task_collaboration_entries (
|
|
2
|
+
entry_id TEXT PRIMARY KEY,
|
|
3
|
+
task_id TEXT NOT NULL REFERENCES tasks(task_id) ON DELETE CASCADE,
|
|
4
|
+
task_run_id TEXT REFERENCES task_runs(run_id) ON DELETE SET NULL,
|
|
5
|
+
assignment_epoch INTEGER,
|
|
6
|
+
sequence INTEGER NOT NULL,
|
|
7
|
+
author_kind TEXT NOT NULL CHECK (author_kind IN ('main_agent', 'worker_agent', 'user', 'system')),
|
|
8
|
+
author_id TEXT NOT NULL,
|
|
9
|
+
kind TEXT NOT NULL CHECK (kind IN ('progress', 'question', 'answer', 'instruction', 'ack', 'result', 'failure')),
|
|
10
|
+
body TEXT NOT NULL CHECK (length(body) BETWEEN 1 AND 8000),
|
|
11
|
+
causation_id TEXT,
|
|
12
|
+
idempotency_key TEXT NOT NULL,
|
|
13
|
+
created_at INTEGER NOT NULL,
|
|
14
|
+
UNIQUE (task_id, sequence),
|
|
15
|
+
UNIQUE (task_id, idempotency_key)
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
CREATE INDEX idx_task_collaboration_task_sequence
|
|
19
|
+
ON task_collaboration_entries(task_id, sequence);
|
|
20
|
+
|
|
21
|
+
CREATE TABLE task_collaboration_deliveries (
|
|
22
|
+
entry_id TEXT PRIMARY KEY REFERENCES task_collaboration_entries(entry_id) ON DELETE CASCADE,
|
|
23
|
+
status TEXT NOT NULL CHECK (status IN ('pending', 'delivered', 'confirmed', 'stale')),
|
|
24
|
+
conversation_id TEXT,
|
|
25
|
+
assignment_epoch INTEGER,
|
|
26
|
+
client_message_id TEXT NOT NULL UNIQUE,
|
|
27
|
+
attempts INTEGER NOT NULL DEFAULT 0,
|
|
28
|
+
updated_at INTEGER NOT NULL
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
CREATE INDEX idx_task_collaboration_deliveries_pending
|
|
32
|
+
ON task_collaboration_deliveries(status, updated_at);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
CREATE TABLE task_main_update_deliveries (
|
|
2
|
+
entry_id TEXT PRIMARY KEY REFERENCES task_collaboration_entries(entry_id) ON DELETE CASCADE,
|
|
3
|
+
conversation_id TEXT NOT NULL REFERENCES sessions(conversation_id) ON DELETE CASCADE,
|
|
4
|
+
status TEXT NOT NULL CHECK (status IN ('pending', 'delivered')),
|
|
5
|
+
updated_at INTEGER NOT NULL
|
|
6
|
+
);
|
|
7
|
+
|
|
8
|
+
CREATE INDEX idx_task_main_update_deliveries_pending
|
|
9
|
+
ON task_main_update_deliveries(status, updated_at);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
CREATE TABLE task_main_agent_links (
|
|
2
|
+
task_id TEXT PRIMARY KEY REFERENCES tasks(task_id) ON DELETE CASCADE,
|
|
3
|
+
agent_id TEXT NOT NULL,
|
|
4
|
+
origin_conversation_id TEXT,
|
|
5
|
+
created_at INTEGER NOT NULL
|
|
6
|
+
);
|
|
7
|
+
|
|
8
|
+
CREATE INDEX idx_task_main_agent_links_agent_created
|
|
9
|
+
ON task_main_agent_links(agent_id, created_at DESC);
|
|
10
|
+
|
|
11
|
+
INSERT INTO task_main_agent_links (task_id, agent_id, origin_conversation_id, created_at)
|
|
12
|
+
SELECT origin.task_id, session.agent_id, origin.conversation_id, origin.created_at
|
|
13
|
+
FROM task_origin_links origin
|
|
14
|
+
JOIN sessions session ON session.conversation_id = origin.conversation_id;
|
|
@@ -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 = 228;
|
|
7
7
|
export declare function resolveMigrationsDir(override?: string): string;
|
|
8
8
|
/**
|
|
9
9
|
* Apply sequential SQL migrations from (currentVersion + 1) through targetVersion.
|
|
@@ -57,7 +57,7 @@ function applySingleMigration(db, migration, discardOldScenes = false) {
|
|
|
57
57
|
*/
|
|
58
58
|
function applyPendingMigrations(db, options = {}) {
|
|
59
59
|
db.function("xopc_operation_id", () => currentOperationId() ?? null);
|
|
60
|
-
const targetVersion = options.targetVersion ??
|
|
60
|
+
const targetVersion = options.targetVersion ?? 228;
|
|
61
61
|
let currentVersion = readSchemaVersion(db);
|
|
62
62
|
if (currentVersion > targetVersion) throw new DatabaseSchemaTooNewError(currentVersion, targetVersion);
|
|
63
63
|
if (!options.migrationsDir && currentVersion < 165) throw new DatabaseSchemaTooOldError(currentVersion, 165);
|
|
@@ -95,7 +95,7 @@ function applyPendingMigrations(db, options = {}) {
|
|
|
95
95
|
}
|
|
96
96
|
/** Inspect schema version without mutating the database. */
|
|
97
97
|
function inspectSchemaMigrationStatus(db, options = {}) {
|
|
98
|
-
const appVersion = options.targetVersion ??
|
|
98
|
+
const appVersion = options.targetVersion ?? 228;
|
|
99
99
|
const dbVersion = readSchemaVersion(db);
|
|
100
100
|
if (dbVersion > appVersion) return {
|
|
101
101
|
dbVersion,
|
|
@@ -137,7 +137,7 @@ var init_runner = __esmMin((() => {
|
|
|
137
137
|
init_errors();
|
|
138
138
|
log = createLogger("Sqlite:Migrations");
|
|
139
139
|
XOPC_DB_BASELINE_SCHEMA_VERSION = 165;
|
|
140
|
-
XOPC_DB_SCHEMA_VERSION =
|
|
140
|
+
XOPC_DB_SCHEMA_VERSION = 228;
|
|
141
141
|
}));
|
|
142
142
|
//#endregion
|
|
143
143
|
init_runner();
|
|
@@ -53,6 +53,15 @@ export declare function listActiveSessionInputRuns(): Array<{
|
|
|
53
53
|
conversationId: string;
|
|
54
54
|
runId: string;
|
|
55
55
|
}>;
|
|
56
|
+
export declare function listTaskUpdateRunIds(conversationId: string): Set<string>;
|
|
57
|
+
export type TaskUpdateTrigger = {
|
|
58
|
+
entryId: string;
|
|
59
|
+
taskId: string;
|
|
60
|
+
taskTitle: string;
|
|
61
|
+
kind: 'progress' | 'question' | 'result' | 'failure';
|
|
62
|
+
};
|
|
63
|
+
/** Safe, user-facing provenance for task update turns; worker text stays on the board. */
|
|
64
|
+
export declare function listTaskUpdateTriggers(conversationId: string): Map<string, TaskUpdateTrigger>;
|
|
56
65
|
/** Durable active runs with the claimed input metadata needed by runtime policy surfaces. */
|
|
57
66
|
export declare function listActiveSessionInputExecutions(): Array<{
|
|
58
67
|
conversationId: string;
|
|
@@ -67,6 +67,33 @@ function listActiveSessionInputRuns() {
|
|
|
67
67
|
runId: row.active_run_id
|
|
68
68
|
}));
|
|
69
69
|
}
|
|
70
|
+
function listTaskUpdateRunIds(conversationId) {
|
|
71
|
+
const rows = getSqliteDatabase().prepare(`SELECT run_id FROM session_inputs
|
|
72
|
+
WHERE conversation_id = ? AND run_id IS NOT NULL
|
|
73
|
+
AND json_extract(origin_json, '$.type') = 'system'
|
|
74
|
+
AND json_extract(origin_json, '$.source') = 'task_update'`).all(conversationId);
|
|
75
|
+
return new Set(rows.map((row) => row.run_id));
|
|
76
|
+
}
|
|
77
|
+
/** Safe, user-facing provenance for task update turns; worker text stays on the board. */
|
|
78
|
+
function listTaskUpdateTriggers(conversationId) {
|
|
79
|
+
const rows = getSqliteDatabase().prepare(`SELECT input.run_id, entry.entry_id, entry.task_id,
|
|
80
|
+
task.title AS task_title, entry.kind
|
|
81
|
+
FROM session_inputs input
|
|
82
|
+
JOIN task_collaboration_entries entry ON entry.entry_id =
|
|
83
|
+
substr(input.client_message_id, length('task-main-update:') + 1, 36)
|
|
84
|
+
JOIN tasks task ON task.task_id = entry.task_id
|
|
85
|
+
WHERE input.conversation_id = ? AND input.run_id IS NOT NULL
|
|
86
|
+
AND input.client_message_id LIKE 'task-main-update:%'
|
|
87
|
+
AND json_extract(input.origin_json, '$.type') = 'system'
|
|
88
|
+
AND json_extract(input.origin_json, '$.source') = 'task_update'
|
|
89
|
+
AND entry.kind IN ('progress', 'question', 'result', 'failure')`).all(conversationId);
|
|
90
|
+
return new Map(rows.map((row) => [row.run_id, {
|
|
91
|
+
entryId: row.entry_id,
|
|
92
|
+
taskId: row.task_id,
|
|
93
|
+
taskTitle: row.task_title,
|
|
94
|
+
kind: row.kind
|
|
95
|
+
}]));
|
|
96
|
+
}
|
|
70
97
|
/** Durable active runs with the claimed input metadata needed by runtime policy surfaces. */
|
|
71
98
|
function listActiveSessionInputExecutions() {
|
|
72
99
|
return getSqliteDatabase().prepare(`SELECT runtime.conversation_id, runtime.active_run_id,
|
|
@@ -211,4 +238,4 @@ var init_session_input_repository = __esmMin((() => {
|
|
|
211
238
|
}));
|
|
212
239
|
//#endregion
|
|
213
240
|
init_session_input_repository();
|
|
214
|
-
export { SessionInstanceChangedError, bumpSessionInputRevision, cancelQueuedSessionInput, claimNextSessionInput, findSessionInput, finishSessionInputRun, getSessionInputById, getSessionInputState, init_session_input_repository, insertSessionInput, listActiveSessionInputExecutions, listActiveSessionInputRuns, mutateQueuedSessionInput, recoverSessionInputState, setSessionInputStatus };
|
|
241
|
+
export { SessionInstanceChangedError, bumpSessionInputRevision, cancelQueuedSessionInput, claimNextSessionInput, findSessionInput, finishSessionInputRun, getSessionInputById, getSessionInputState, init_session_input_repository, insertSessionInput, listActiveSessionInputExecutions, listActiveSessionInputRuns, listTaskUpdateRunIds, listTaskUpdateTriggers, mutateQueuedSessionInput, recoverSessionInputState, setSessionInputStatus };
|