@xopcai/xopc 0.0.309 → 0.0.311
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{activity-store-XKNYlFUI.js → activity-store-DVUTs1fk.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-1S2TFECE.js → agent-avatar-dicebear-zKINl7UH.js} +1 -1
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-D2ePZKdY.js +1 -0
- package/dist/gateway/static/root/assets/{agents-CPqUMtCL.js → agents-BiD9STyv.js} +1 -1
- package/dist/gateway/static/root/assets/{api-BEUEE4f2.js → api-_aHQA8bd.js} +1 -1
- package/dist/gateway/static/root/assets/{app-link-BiBXVEvp.js → app-link-wamYbNUl.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-CgVBSqzu.js → app-management-settings-panel-C94LAxyt.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-CoWdCokb.js → appearance-settings-CP01zHvC.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-B7DmSJQj.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-C3ZA6LRS.js → archive-plugin-SwWFt5MT.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-CdgS6_zy.js → attachment-load-DdTFml9l.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-BtHL2hpg.js → automations-page-Kmr5WVFp.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-bkijiu-Y.js +7 -0
- package/dist/gateway/static/root/assets/{binary-plugins-CiDhtq_H.js → binary-plugins-47UTtDNq.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-Br00T83w.js → block-editor-DvzZkMG8.js} +3 -3
- package/dist/gateway/static/root/assets/{browser-automation-inputs-D2tILykA.js → browser-automation-inputs-C611KRBx.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-automations-page-BVuEmryB.js → browser-automations-page-DrUKNL9X.js} +2 -2
- package/dist/gateway/static/root/assets/browser-settings-page-Dhf_MWCf.js +3 -0
- package/dist/gateway/static/root/assets/capabilities-settings-panel-BCubrDf8.js +8 -0
- package/dist/gateway/static/root/assets/channels-settings-e4T1DEfN.js +1 -0
- package/dist/gateway/static/root/assets/{chat-terminal-dock-JsMtzDao.js → chat-terminal-dock-Bg_m7HUE.js} +2 -2
- package/dist/gateway/static/root/assets/{chunk-KS7C4IRE-Cq1tE_3b.js → chunk-KS7C4IRE-BMYIfy9x.js} +2 -2
- package/dist/gateway/static/root/assets/computer-settings-page-CosCmVsT.js +1 -0
- package/dist/gateway/static/root/assets/{connector-service-page-DZFNUTiN.js → connector-service-page-BL-hSR7_.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-C0WWxnxJ.js +2 -0
- package/dist/gateway/static/root/assets/date-picker-DqYFVasF.js +1 -0
- package/dist/gateway/static/root/assets/{dependency-picker-B-BcuG1y.js → dependency-picker-DCyyFLKp.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-CdBBhhdY.js → desktop-pet-CFnnpRA_.js} +1 -1
- package/dist/gateway/static/root/assets/desktop-pet-settings-U5wWRH4c.js +1 -0
- package/dist/gateway/static/root/assets/device-pairing-wizard-BhHxvFO1.js +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-BFp5eKtY.js → extension-debug-page-DA8WJ3-E.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-DL3vyyH6.js → extension-page-C2BIB88m.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-BXtvdAsY.js → extension-settings-page-kpYo979N.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-xAOGtenO.js → gateway-config-swr-DUDX42qY.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-realtime-BuaTsMSi.js → gateway-realtime-CGOW0-b4.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-D4um_sV7.js +1 -0
- package/dist/gateway/static/root/assets/gateway-settings-CE9t1yTa.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-BwDxKHd4.js → gateway-startup-retry-Cf8OxlvY.js} +1 -1
- package/dist/gateway/static/root/assets/home-page-C7Ezx8Du.js +1 -0
- package/dist/gateway/static/root/assets/{image-generation-api-wGMeI_yW.js → image-generation-api-D2YorS--.js} +1 -1
- package/dist/gateway/static/root/assets/{imports-page-zexFT5Rq.js → imports-page-NPk698vI.js} +1 -1
- package/dist/gateway/static/root/assets/index-1wIKA-kM.css +1 -0
- package/dist/gateway/static/root/assets/index-DxYitLp8.js +79 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CutG9zLh.js → keyboard-shortcuts-settings-BhreF0_O.js} +1 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-CPmynb3x.js +2 -0
- package/dist/gateway/static/root/assets/{local-apps-page-CJy6I7Dt.js → local-apps-page-DOZZBdqj.js} +1 -1
- package/dist/gateway/static/root/assets/{locale-store-DPZ79W1-.js → locale-store-DA0Z5jM_.js} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-egGcPHNi.js → logs-page-M8kz26yo.js} +2 -2
- package/dist/gateway/static/root/assets/{management-settings-BQhIOELc.js → management-settings-JLqHYQvY.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-view-p2P5hP1U.js → markdown-view-BDpcjR_Z.js} +1 -1
- package/dist/gateway/static/root/assets/markdown-view-DSjfHfaW.css +1 -0
- package/dist/gateway/static/root/assets/{media-plugins-CsBylqlN.js → media-plugins-B75SWUJd.js} +1 -1
- package/dist/gateway/static/root/assets/messages-4BtQKYlM.js +3 -0
- package/dist/gateway/static/root/assets/note-detail-panel-B_Ft0M32.js +5 -0
- package/dist/gateway/static/root/assets/notes-page-C32mxSD-.js +8 -0
- package/dist/gateway/static/root/assets/{page-tabs-ChQ4jJFs.js → page-tabs-CMlQUzT6.js} +1 -1
- package/dist/gateway/static/root/assets/{popover-select-9i-ZtHXL.js → popover-select-B-GDnZO9.js} +1 -1
- package/dist/gateway/static/root/assets/preview-open-alternatives-cZ2hszQT.js +1 -0
- package/dist/gateway/static/root/assets/{product-open-page-BADxWEdP.js → product-open-page-CPoSbglF.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-DYttWua0.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-D46drWbl.js +1 -0
- package/dist/gateway/static/root/assets/{registry-api-B_e_nZSN.js → registry-api-C0DCx3wv.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-C9n9Nuhi.js +1 -0
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-D-pwiIyp.js → runtime-tools-settings-panel-bMLWRApp.js} +2 -2
- package/dist/gateway/static/root/assets/scenes-page-Dw3hmHAr.js +1 -0
- package/dist/gateway/static/root/assets/{schema-form-IWmb05DX.js → schema-form-UVJV_7AS.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-C8P6ff91.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-whpUsAy3.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-B0veRBZs.js → settings-form-section-BqzOqonM.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-DQ9RJ8-b.js +1 -0
- package/dist/gateway/static/root/assets/settings-page-layout-D3Spald3.js +1 -0
- package/dist/gateway/static/root/assets/{settings-shell-layer-context-DCp6ykjQ.js → settings-shell-layer-context-BTQUDoJ2.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-C8u601m8.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-CirpgkfD.js → share-preview-page-BcgYzA7y.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-Bv-2rZ8e.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-LM-cgWUS.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-ggmb7rCW.js +2 -0
- package/dist/gateway/static/root/assets/{skills-page.utils-B42mpWKV.js → skills-page.utils-ADABzrtk.js} +1 -1
- package/dist/gateway/static/root/assets/system-settings-panel-DfkcW_Za.js +1 -0
- package/dist/gateway/static/root/assets/task-detail-page-DC4yqDFd.js +1 -0
- package/dist/gateway/static/root/assets/{theme-store-BFbj_2Tu.js → theme-store-CegIlB8d.js} +1 -1
- package/dist/gateway/static/root/assets/tunnel-api-CTuwTdMm.js +1 -0
- package/dist/gateway/static/root/assets/use-autosave-5ZDd9XKh.js +1 -0
- package/dist/gateway/static/root/assets/user-model-page-BFKFhdZ0.js +2 -0
- package/dist/gateway/static/root/assets/{voice-api-key-field-BZbKQ8HT.js → voice-api-key-field-D3urfd-n.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-config-api-SKCeQLrH.js → voice-config-api-DTyMdGOR.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-BRVTTXNG.js → work-discovery-overlay-JzM3Ylbs.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-D2kuwv5e.js → workflow-run-setup-panel-Bn2CtRdB.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-BiCmt98A.js +6 -0
- package/dist/gateway/static/root/connector-icons/SOURCES.md +0 -2
- package/dist/gateway/static/root/index.html +17 -20
- package/dist/gateway/static/root/notification-sw.js +1 -1
- package/dist/package.js +1 -1
- package/dist/packages/gateway-contract/src/notifications.js +12 -11
- package/dist/packages/gateway-contract/src/proactive.js +6 -6
- package/dist/packages/gateway-contract/src/project-monitoring.js +4 -4
- package/dist/packages/gateway-contract/src/project-operating.js +1 -4
- package/dist/src/agent/agent-manager.d.ts +2 -6
- package/dist/src/agent/agent-manager.js +2 -1
- package/dist/src/agent/background-review/run-background-review.js +1 -1
- package/dist/src/agent/commands/command-registry.js +1 -1
- package/dist/src/agent/context/execution-scope.js +1 -1
- package/dist/src/agent/external-tools/cliProvider.d.ts +47 -0
- package/dist/src/agent/external-tools/cliProvider.js +317 -0
- package/dist/src/agent/external-tools/composio-provider.js +3 -3
- package/dist/src/agent/external-tools/gateway-tools.js +8 -2
- package/dist/src/agent/external-tools/index.js +6 -0
- package/dist/src/agent/external-tools/service.js +1 -1
- package/dist/src/agent/external-tools/types.d.ts +1 -1
- package/dist/src/agent/external-tools/types.js +1 -0
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
- package/dist/src/agent/mcp/oauth/mcp-oauth-manager.js +1 -1
- package/dist/src/agent/memory/turn-provenance.js +2 -1
- package/dist/src/agent/service/parse-outbound-session-key.js +1 -1
- package/dist/src/agent/service.js +1 -0
- package/dist/src/agent/service.types.d.ts +2 -0
- package/dist/src/agent/tools/factory.d.ts +2 -0
- package/dist/src/agent/tools/factory.js +3 -2
- package/dist/src/agent/tools/search/providers/xopc-cloud.d.ts +20 -0
- package/dist/src/agent/tools/search/providers/xopc-cloud.js +56 -0
- package/dist/src/agent/tools/search/registry.d.ts +4 -2
- package/dist/src/agent/tools/search/registry.js +5 -3
- package/dist/src/agent/tools/xopc-use-tool.d.ts +4 -2
- package/dist/src/agent/tools/xopc-use-tool.js +46 -43
- package/dist/src/automations/service/automation-service.d.ts +0 -4
- package/dist/src/automations/service/automation-service.js +0 -31
- package/dist/src/capabilities/store-connector.js +46 -0
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/project.js +1 -1
- package/dist/src/config/schema.d.ts +4 -4
- package/dist/src/config/schema.js +2 -12
- package/dist/src/config/web-patch.js +0 -5
- package/dist/src/connectors/account-selection.d.ts +14 -0
- package/dist/src/connectors/account-selection.js +26 -0
- package/dist/src/connectors/china-catalog.js +93 -226
- package/dist/src/connectors/cli/adapterRegistry.d.ts +4 -0
- package/dist/src/connectors/cli/adapterRegistry.js +26 -0
- package/dist/src/connectors/cli/adapters/lark.d.ts +2 -0
- package/dist/src/connectors/cli/adapters/lark.js +143 -0
- package/dist/src/connectors/cli/adapters/larkShortcuts.d.ts +3 -0
- package/dist/src/connectors/cli/adapters/larkShortcuts.js +64 -0
- package/dist/src/connectors/cli/adapters/wecom.d.ts +2 -0
- package/dist/src/connectors/cli/adapters/wecom.js +97 -0
- package/dist/src/connectors/cli/adapters/wps365/bundle.js +575 -0
- package/dist/src/connectors/cli/adapters/wps365.d.ts +2 -0
- package/dist/src/connectors/cli/adapters/wps365.js +115 -0
- package/dist/src/connectors/cli/assets.d.ts +3 -0
- package/dist/src/connectors/cli/assets.js +44 -0
- package/dist/src/connectors/cli/authorization.d.ts +16 -0
- package/dist/src/connectors/cli/authorization.js +184 -0
- package/dist/src/connectors/cli/distributions.d.ts +4 -0
- package/dist/src/connectors/cli/distributions.js +69 -0
- package/dist/src/connectors/cli/installer.d.ts +5 -0
- package/dist/src/connectors/cli/installer.js +102 -0
- package/dist/src/connectors/cli/lifecycle.d.ts +1 -0
- package/dist/src/connectors/cli/lifecycle.js +19 -0
- package/dist/src/connectors/cli/process.d.ts +18 -0
- package/dist/src/connectors/cli/process.js +100 -0
- package/dist/src/connectors/cli/protocol.d.ts +10 -0
- package/dist/src/connectors/cli/protocol.js +63 -0
- package/dist/src/connectors/cli/runtime.d.ts +10 -0
- package/dist/src/connectors/cli/runtime.js +93 -0
- package/dist/src/connectors/cli/store.d.ts +35 -0
- package/dist/src/connectors/cli/store.js +121 -0
- package/dist/src/connectors/cli/types.d.ts +73 -0
- package/dist/src/connectors/composio-backends.js +1 -1
- package/dist/src/connectors/composio-sessions.d.ts +1 -0
- package/dist/src/connectors/composio-sessions.js +8 -3
- package/dist/src/connectors/composio.js +1 -1
- package/dist/src/connectors/connection-candidates.js +22 -3
- package/dist/src/connectors/connection-recovery-service.d.ts +1 -0
- package/dist/src/connectors/connection-recovery-service.js +53 -8
- package/dist/src/connectors/health.js +52 -0
- package/dist/src/connectors/instances.js +5 -1
- package/dist/src/connectors/lifecycle.js +2 -0
- package/dist/src/connectors/principal.js +2 -1
- package/dist/src/connectors/runtime-adapter-registry.js +31 -0
- package/dist/src/connectors/types.d.ts +13 -1
- package/dist/src/connectors/usage.js +1 -1
- package/dist/src/connectors/workflow-preflight.js +8 -4
- package/dist/src/extensions/install.js +1 -1
- package/dist/src/gateway/hono/app.d.ts +2 -0
- package/dist/src/gateway/hono/app.js +4 -2
- package/dist/src/gateway/hono/lib/config-payload.d.ts +0 -15
- package/dist/src/gateway/hono/lib/config-payload.js +0 -11
- package/dist/src/gateway/hono/routes/cli-connectors.d.ts +3 -0
- package/dist/src/gateway/hono/routes/cli-connectors.js +219 -0
- package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +2 -2
- package/dist/src/gateway/hono/routes/config-patch/gateway.js +0 -59
- package/dist/src/gateway/hono/routes/config.js +0 -16
- package/dist/src/gateway/hono/routes/connectors.js +21 -22
- package/dist/src/gateway/hono/routes/deps.d.ts +2 -0
- package/dist/src/gateway/hono/routes/lazy-bundles.js +4 -17
- package/dist/src/gateway/hono/routes/projects.js +1 -1
- package/dist/src/gateway/hono/routes/public-gateway.js +0 -1
- package/dist/src/gateway/hono/routes/scenes.d.ts +3 -0
- package/dist/src/gateway/hono/routes/scenes.js +142 -0
- package/dist/src/gateway/hono/routes/tasks.js +0 -46
- package/dist/src/gateway/hono/routes/user-model.js +54 -1
- package/dist/src/gateway/scenes/browserNotifications.d.ts +4 -0
- package/dist/src/gateway/scenes/browserNotifications.js +54 -0
- package/dist/src/gateway/scenes/host.d.ts +34 -0
- package/dist/src/gateway/scenes/host.js +129 -0
- package/dist/src/gateway/scenes/mailContext.d.ts +32 -0
- package/dist/src/gateway/scenes/mailContext.js +235 -0
- package/dist/src/gateway/security/gateway-scopes.js +0 -4
- package/dist/src/gateway/security/index.js +1 -1
- package/dist/src/gateway/service/config-coordinator.d.ts +1 -10
- package/dist/src/gateway/service/config-coordinator.js +0 -16
- package/dist/src/gateway/service/run-gateway-agent.js +1 -1
- package/dist/src/gateway/service.d.ts +4 -25
- package/dist/src/gateway/service.js +44 -99
- package/dist/src/gateway/session-context-summary.js +2 -1
- package/dist/src/heartbeat/index.js +1 -1
- package/dist/src/infra/unhandled-rejections.js +1 -1
- package/dist/src/migrations/runner.js +1 -4
- package/dist/src/notifications/browser-endpoint.d.ts +2 -0
- package/dist/src/notifications/browser-endpoint.js +13 -0
- package/dist/src/notifications/browserSubscriptions.d.ts +20 -0
- package/dist/src/notifications/browserSubscriptions.js +59 -0
- package/dist/src/notifications/browserTransport.d.ts +9 -0
- package/dist/src/notifications/browserTransport.js +64 -0
- package/dist/src/notifications/dispatch.d.ts +46 -0
- package/dist/src/notifications/dispatch.js +109 -0
- package/dist/src/notifications/domain-delivery.d.ts +21 -0
- package/dist/src/notifications/planner.js +0 -36
- package/dist/src/notifications/quietHours.d.ts +6 -0
- package/dist/src/notifications/quietHours.js +23 -0
- package/dist/src/notifications/resultOutbox.d.ts +23 -0
- package/dist/src/notifications/resultOutbox.js +49 -0
- package/dist/src/notifications/service.d.ts +18 -4
- package/dist/src/notifications/service.js +42 -61
- package/dist/src/notifications/store.d.ts +2 -1
- package/dist/src/notifications/store.js +7 -8
- package/dist/src/projects/project-service.d.ts +1 -4
- package/dist/src/projects/project-service.js +2 -30
- package/dist/src/projects/workspace.js +1 -1
- package/dist/src/providers/model-catalog-persistence.js +19 -1
- package/dist/src/providers/model-catalog-store.js +1 -0
- package/dist/src/providers/model-catalog-types.d.ts +17 -0
- package/dist/src/providers/xopc-cloud-model-source.js +27 -0
- package/dist/src/scenes/agentExecutor.d.ts +8 -0
- package/dist/src/scenes/agentExecutor.js +63 -0
- package/dist/src/scenes/contracts.d.ts +118 -0
- package/dist/src/scenes/contracts.js +145 -0
- package/dist/src/scenes/execution.d.ts +56 -0
- package/dist/src/scenes/execution.js +168 -0
- package/dist/src/scenes/httpServices.d.ts +34 -0
- package/dist/src/scenes/inbox.d.ts +16 -0
- package/dist/src/scenes/inbox.js +68 -0
- package/dist/src/scenes/mailContext.d.ts +20 -0
- package/dist/src/scenes/mailContext.js +106 -0
- package/dist/src/scenes/mailObservations.d.ts +20 -0
- package/dist/src/scenes/mailObservations.js +107 -0
- package/dist/src/scenes/maintenance.d.ts +3 -0
- package/dist/src/scenes/maintenance.js +24 -0
- package/dist/src/scenes/metrics.d.ts +35 -0
- package/dist/src/scenes/metrics.js +94 -0
- package/dist/src/scenes/notificationEligibility.d.ts +17 -0
- package/dist/src/scenes/notificationEligibility.js +72 -0
- package/dist/src/scenes/notificationPublication.d.ts +7 -0
- package/dist/src/scenes/notificationPublication.js +43 -0
- package/dist/src/scenes/preferences.d.ts +40 -0
- package/dist/src/scenes/preferences.js +108 -0
- package/dist/src/scenes/readiness.d.ts +7 -0
- package/dist/src/scenes/readiness.js +20 -0
- package/dist/src/scenes/repository.d.ts +174 -0
- package/dist/src/scenes/repository.js +740 -0
- package/dist/src/scenes/resultNotifications.d.ts +17 -0
- package/dist/src/scenes/resultNotifications.js +204 -0
- package/dist/src/scenes/runtime.d.ts +25 -0
- package/dist/src/scenes/runtime.js +101 -0
- package/dist/src/scenes/schedule.d.ts +9 -0
- package/dist/src/scenes/schedule.js +45 -0
- package/dist/src/scenes/service.d.ts +29 -0
- package/dist/src/scenes/service.js +116 -0
- package/dist/src/scenes/templates.d.ts +64 -0
- package/dist/src/scenes/templates.js +76 -0
- package/dist/src/scenes/userNotes.d.ts +10 -0
- package/dist/src/scenes/userNotes.js +34 -0
- package/dist/src/session/resolve-session.js +2 -1
- package/dist/src/session/store.js +2 -1
- package/dist/src/share/share-config.js +0 -5
- package/dist/src/share/site-share-config.js +0 -5
- package/dist/src/storage/sqlite/connection-wait-repository.js +20 -7
- package/dist/src/storage/sqlite/connection.js +1 -1
- package/dist/src/storage/sqlite/connector-account-repository.js +1 -0
- package/dist/src/storage/sqlite/connector-sync-policy-repository.d.ts +0 -4
- package/dist/src/storage/sqlite/connector-sync-policy-repository.js +3 -17
- package/dist/src/storage/sqlite/conversation-repository.js +2 -1
- package/dist/src/storage/sqlite/index.js +2 -1
- package/dist/src/storage/sqlite/migrations/187_cli_connectors.sql +34 -0
- package/dist/src/storage/sqlite/migrations/188_scene_storage.sql +2 -0
- package/dist/src/storage/sqlite/migrations/189_scene_source_health.sql +8 -0
- package/dist/src/storage/sqlite/migrations/conversation-backup.d.ts +2 -0
- package/dist/src/storage/sqlite/migrations/conversation-backup.js +7 -3
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +20 -44
- package/dist/src/storage/sqlite/migrations/scene-reset.d.ts +5 -0
- package/dist/src/storage/sqlite/migrations/scene-reset.js +40 -0
- package/dist/src/storage/sqlite/scenes-schema.d.ts +8 -0
- package/dist/src/storage/sqlite/scenes-schema.js +61 -0
- package/dist/src/storage/sqlite/schema.js +4 -10
- package/dist/src/storage/sqlite/schemas/notifications.sql +65 -0
- package/dist/src/storage/sqlite/schemas/scenes.sql +212 -0
- package/dist/src/storage/sqlite/session-read-repository.d.ts +8 -0
- package/dist/src/storage/sqlite/session-read-repository.js +35 -0
- package/dist/src/storage/sqlite/session-repository.d.ts +1 -1
- package/dist/src/storage/sqlite/session-repository.js +2 -25
- package/dist/src/storage/sqlite/sql-assets.d.ts +2 -0
- package/dist/src/storage/sqlite/sql-assets.js +18 -0
- package/dist/src/storage/sqlite/transaction.d.ts +2 -0
- package/dist/src/storage/sqlite/transaction.js +20 -1
- package/dist/src/tasks/home-query-service.d.ts +0 -2
- package/dist/src/tasks/home-query-service.js +13 -43
- package/dist/src/tasks/index.d.ts +0 -1
- package/dist/src/tasks/index.js +4 -5
- package/dist/src/tasks/project-operating-view-service.js +1 -4
- package/dist/src/tui/backends/embedded-backend.js +1 -1
- package/dist/src/tui/tui-commands.js +1 -1
- package/dist/src/user-model/goals.d.ts +10 -0
- package/dist/src/user-model/goals.js +29 -1
- package/dist/src/user-model/index.js +2 -2
- package/dist/src/voice/realtime/memory-context.js +2 -1
- package/dist/src/workflows/service/workflow-run-service.js +1 -1
- package/package.json +4 -2
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-f0-YFMUz.js +0 -1
- package/dist/gateway/static/root/assets/api-CN4id43t.js +0 -1
- package/dist/gateway/static/root/assets/apps-page-CexHOcWg.js +0 -1
- package/dist/gateway/static/root/assets/automations-workspace-onJPfmO6.js +0 -6
- package/dist/gateway/static/root/assets/browser-settings-page-BgVTyPFY.js +0 -3
- package/dist/gateway/static/root/assets/capabilities-settings-panel-Dra8wj1S.js +0 -8
- package/dist/gateway/static/root/assets/channels-settings-CkxiMDJ4.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-Dtder4G_.js +0 -1
- package/dist/gateway/static/root/assets/computer-settings-page-DHerePwo.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-cl9ZrV4D.js +0 -2
- package/dist/gateway/static/root/assets/cron-expression-DAhdv_Xv.js +0 -2
- package/dist/gateway/static/root/assets/date-picker-PacO1m3a.js +0 -1
- package/dist/gateway/static/root/assets/desktop-pet-settings-Gy03NgMI.js +0 -1
- package/dist/gateway/static/root/assets/device-pairing-wizard-aV25nKag.js +0 -1
- package/dist/gateway/static/root/assets/external-link-DjqjBmc3.js +0 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-BG95uGVW.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-Dcr2Ikeh.js +0 -1
- package/dist/gateway/static/root/assets/globe-DSSGFWFn.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-DOy3alvT.js +0 -1
- package/dist/gateway/static/root/assets/home-page-CDm3dGVy.js +0 -1
- package/dist/gateway/static/root/assets/index-D-vczw_0.css +0 -1
- package/dist/gateway/static/root/assets/index-DJo4DimT.js +0 -79
- package/dist/gateway/static/root/assets/loader-circle-CifKLtgG.js +0 -1
- package/dist/gateway/static/root/assets/local-app-workbench-page-CwLvTwjn.js +0 -2
- package/dist/gateway/static/root/assets/markdown-view-Y68dCxuc.css +0 -1
- package/dist/gateway/static/root/assets/messages-BiYTyLJr.js +0 -3
- package/dist/gateway/static/root/assets/note-detail-panel-c2k5Uz6X.js +0 -5
- package/dist/gateway/static/root/assets/notes-page-BLQWJMhf.js +0 -8
- package/dist/gateway/static/root/assets/preview-open-alternatives-9B5W7nVE.js +0 -1
- package/dist/gateway/static/root/assets/proactive-page-iOjI0d_e.js +0 -1
- package/dist/gateway/static/root/assets/project-detail-page-BcxbQn2M.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-BuSvld0O.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CFS8LQKW.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-DZjc__ok.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-C1SM5B93.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-CxRWyWYe.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-layout-X1x-2Cp9.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-D9Rl7Tec.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-CwCThBs0.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-DG6VGbOX.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-BdRJ2vnL.js +0 -2
- package/dist/gateway/static/root/assets/system-settings-panel-DXIZpAvU.js +0 -1
- package/dist/gateway/static/root/assets/task-detail-page-QXo9LJly.js +0 -1
- package/dist/gateway/static/root/assets/tunnel-api-Db2guRdW.js +0 -1
- package/dist/gateway/static/root/assets/use-autosave-DDY9qoXZ.js +0 -1
- package/dist/gateway/static/root/assets/user-model-page-CzPmMkaO.js +0 -2
- package/dist/gateway/static/root/assets/workflows-page-CQXtiYtq.js +0 -6
- package/dist/gateway/static/root/connector-icons/wps-calendar.svg +0 -14
- package/dist/gateway/static/root/connector-icons/wps-mail.svg +0 -7
- package/dist/src/connectors/source-change-publisher.d.ts +0 -17
- package/dist/src/connectors/source-change-publisher.js +0 -151
- package/dist/src/gateway/heartbeat/check-store.d.ts +0 -18
- package/dist/src/gateway/heartbeat/check-store.js +0 -74
- package/dist/src/gateway/heartbeat/index.d.ts +0 -1
- package/dist/src/gateway/heartbeat/index.js +0 -2
- package/dist/src/gateway/heartbeat/service.d.ts +0 -55
- package/dist/src/gateway/heartbeat/service.js +0 -228
- package/dist/src/gateway/hono/routes/proactive-control.d.ts +0 -3
- package/dist/src/gateway/hono/routes/proactive-control.js +0 -135
- package/dist/src/gateway/hono/routes/proactive.d.ts +0 -4
- package/dist/src/gateway/hono/routes/proactive.js +0 -164
- package/dist/src/gateway/hono/routes/workspace.d.ts +0 -3
- package/dist/src/gateway/hono/routes/workspace.js +0 -62
- package/dist/src/gateway/workspace-heartbeat-path.d.ts +0 -3
- package/dist/src/gateway/workspace-heartbeat-path.js +0 -14
- package/dist/src/migrations/conversation-routing-config.d.ts +0 -2
- package/dist/src/migrations/conversation-routing-config.js +0 -42
- package/dist/src/notifications/proactive-channel.d.ts +0 -8
- package/dist/src/notifications/proactive-channel.js +0 -60
- package/dist/src/notifications/proactive-policy.d.ts +0 -3
- package/dist/src/notifications/proactive-policy.js +0 -35
- package/dist/src/notifications/web-push.d.ts +0 -19
- package/dist/src/notifications/web-push.js +0 -185
- package/dist/src/proactive/actions/service.d.ts +0 -1
- package/dist/src/proactive/actions/service.js +0 -82
- package/dist/src/proactive/events/envelope.d.ts +0 -2
- package/dist/src/proactive/events/envelope.js +0 -54
- package/dist/src/proactive/events/product-event-bridge.d.ts +0 -7
- package/dist/src/proactive/events/product-event-bridge.js +0 -87
- package/dist/src/proactive/events/publisher.d.ts +0 -4
- package/dist/src/proactive/events/repository.d.ts +0 -9
- package/dist/src/proactive/events/repository.js +0 -63
- package/dist/src/proactive/events/types.d.ts +0 -44
- package/dist/src/proactive/events/types.js +0 -15
- package/dist/src/proactive/execution/agent-executor.d.ts +0 -21
- package/dist/src/proactive/execution/agent-executor.js +0 -125
- package/dist/src/proactive/execution/authorization.d.ts +0 -7
- package/dist/src/proactive/execution/authorization.js +0 -71
- package/dist/src/proactive/execution/context.d.ts +0 -49
- package/dist/src/proactive/execution/context.js +0 -408
- package/dist/src/proactive/execution/insight.d.ts +0 -14
- package/dist/src/proactive/execution/insight.js +0 -132
- package/dist/src/proactive/execution/repository.d.ts +0 -28
- package/dist/src/proactive/execution/repository.js +0 -211
- package/dist/src/proactive/execution/types.d.ts +0 -80
- package/dist/src/proactive/execution/worker.d.ts +0 -15
- package/dist/src/proactive/execution/worker.js +0 -146
- package/dist/src/proactive/experience.d.ts +0 -89
- package/dist/src/proactive/experience.js +0 -195
- package/dist/src/proactive/follow-ups.d.ts +0 -128
- package/dist/src/proactive/follow-ups.js +0 -182
- package/dist/src/proactive/inbox/cards.d.ts +0 -21
- package/dist/src/proactive/inbox/cards.js +0 -276
- package/dist/src/proactive/inbox/delivery.d.ts +0 -6
- package/dist/src/proactive/inbox/delivery.js +0 -54
- package/dist/src/proactive/inbox/digest.d.ts +0 -8
- package/dist/src/proactive/inbox/digest.js +0 -123
- package/dist/src/proactive/inbox/lifecycle.d.ts +0 -4
- package/dist/src/proactive/inbox/lifecycle.js +0 -62
- package/dist/src/proactive/inbox/notification-policy.d.ts +0 -1
- package/dist/src/proactive/inbox/notification-policy.js +0 -25
- package/dist/src/proactive/inbox/repository.d.ts +0 -25
- package/dist/src/proactive/inbox/repository.js +0 -244
- package/dist/src/proactive/inbox/service.d.ts +0 -23
- package/dist/src/proactive/inbox/service.js +0 -46
- package/dist/src/proactive/inbox/types.d.ts +0 -64
- package/dist/src/proactive/inbox/worker.d.ts +0 -13
- package/dist/src/proactive/inbox/worker.js +0 -71
- package/dist/src/proactive/index.d.ts +0 -20
- package/dist/src/proactive/index.js +0 -14
- package/dist/src/proactive/mail-thread.d.ts +0 -13
- package/dist/src/proactive/mail-thread.js +0 -55
- package/dist/src/proactive/maintenance.d.ts +0 -4
- package/dist/src/proactive/maintenance.js +0 -28
- package/dist/src/proactive/metrics.d.ts +0 -10
- package/dist/src/proactive/metrics.js +0 -28
- package/dist/src/proactive/policy/presence.d.ts +0 -2
- package/dist/src/proactive/policy/presence.js +0 -30
- package/dist/src/proactive/policy/service.d.ts +0 -54
- package/dist/src/proactive/policy/service.js +0 -123
- package/dist/src/proactive/routing/batch-repository.d.ts +0 -27
- package/dist/src/proactive/routing/batch-repository.js +0 -57
- package/dist/src/proactive/routing/matcher.d.ts +0 -5
- package/dist/src/proactive/routing/matcher.js +0 -57
- package/dist/src/proactive/routing/types.d.ts +0 -44
- package/dist/src/proactive/routing/types.js +0 -1
- package/dist/src/proactive/scenarios/control.d.ts +0 -52
- package/dist/src/proactive/scenarios/control.js +0 -75
- package/dist/src/proactive/scenarios/prompt-composer.d.ts +0 -14
- package/dist/src/proactive/scenarios/prompt-composer.js +0 -26
- package/dist/src/proactive/scenarios/repository.d.ts +0 -23
- package/dist/src/proactive/scenarios/repository.js +0 -174
- package/dist/src/proactive/scenarios/service.d.ts +0 -15
- package/dist/src/proactive/scenarios/service.js +0 -26
- package/dist/src/proactive/scenarios/types.d.ts +0 -43
- package/dist/src/proactive/scenarios/types.js +0 -1
- package/dist/src/proactive/service.d.ts +0 -25
- package/dist/src/proactive/service.js +0 -78
- package/dist/src/proactive/source-freshness.d.ts +0 -8
- package/dist/src/proactive/source-freshness.js +0 -28
- package/dist/src/proactive/status.d.ts +0 -2
- package/dist/src/proactive/status.js +0 -22
- package/dist/src/proactive/temporal/schedule.d.ts +0 -3
- package/dist/src/proactive/temporal/schedule.js +0 -68
- package/dist/src/proactive/temporal/worker.d.ts +0 -17
- package/dist/src/proactive/temporal/worker.js +0 -129
- package/dist/src/tasks/project-monitoring-service.d.ts +0 -32
- package/dist/src/tasks/project-monitoring-service.js +0 -118
- /package/dist/src/{proactive/execution → connectors/cli}/types.js +0 -0
- /package/dist/src/{proactive/events/publisher.js → notifications/domain-delivery.js} +0 -0
- /package/dist/src/{proactive/inbox/types.js → scenes/httpServices.js} +0 -0
|
@@ -1,244 +0,0 @@
|
|
|
1
|
-
import { getSqliteDatabase, init_transaction, runSqliteWriteTransaction } from "../../storage/sqlite/transaction.js";
|
|
2
|
-
import { insightSourcesAuthorized, insightSourcesChanged } from "../execution/authorization.js";
|
|
3
|
-
import { effectiveProactivePolicy } from "../policy/service.js";
|
|
4
|
-
import { decideProactiveDisposition, nextQuietHoursEnd, proactiveDispositionReason } from "../../tasks/project-monitoring-service.js";
|
|
5
|
-
import { randomUUID } from "node:crypto";
|
|
6
|
-
//#region src/proactive/inbox/repository.ts
|
|
7
|
-
init_transaction();
|
|
8
|
-
const s = (row, key) => String(row[key]);
|
|
9
|
-
function itemFromRow(row) {
|
|
10
|
-
const attentionKind = row.action_status === "completed" ? "receipt" : row.decision_json || row.action_status === "approval_required" ? "decision" : "information";
|
|
11
|
-
return {
|
|
12
|
-
id: s(row, "inbox_item_id"),
|
|
13
|
-
insightId: s(row, "insight_id"),
|
|
14
|
-
subscriptionId: s(row, "subscription_id"),
|
|
15
|
-
withdrawnAt: row.withdrawn_at ? s(row, "withdrawn_at") : void 0,
|
|
16
|
-
correlationKey: row.correlation_key ? s(row, "correlation_key") : void 0,
|
|
17
|
-
revision: Number(row.revision),
|
|
18
|
-
notificationRevision: Number(row.notification_revision),
|
|
19
|
-
...row.actionable_until ? { actionableUntil: s(row, "actionable_until") } : {},
|
|
20
|
-
...row.expires_at ? { expiresAt: s(row, "expires_at") } : {},
|
|
21
|
-
status: s(row, "status"),
|
|
22
|
-
...row.snoozed_until ? { snoozedUntil: s(row, "snoozed_until") } : {},
|
|
23
|
-
...row.resolution ? { resolution: s(row, "resolution") } : {},
|
|
24
|
-
createdAt: s(row, "created_at"),
|
|
25
|
-
updatedAt: s(row, "updated_at"),
|
|
26
|
-
insight: {
|
|
27
|
-
scenarioKey: s(row, "scenario_key"),
|
|
28
|
-
title: s(row, "title"),
|
|
29
|
-
summary: s(row, "summary"),
|
|
30
|
-
...row.artifact_json ? { artifact: JSON.parse(s(row, "artifact_json")) } : {},
|
|
31
|
-
whyNow: s(row, "why_now"),
|
|
32
|
-
impact: s(row, "impact"),
|
|
33
|
-
recommendation: s(row, "recommendation"),
|
|
34
|
-
workDone: s(row, "work_done"),
|
|
35
|
-
...row.decision_json ? { decision: JSON.parse(s(row, "decision_json")) } : {},
|
|
36
|
-
...row.proposed_action_json ? { proposedAction: JSON.parse(s(row, "proposed_action_json")) } : {},
|
|
37
|
-
disposition: s(row, "disposition"),
|
|
38
|
-
dispositionReason: s(row, "disposition_reason"),
|
|
39
|
-
...row.action_status ? { actionStatus: s(row, "action_status") } : {},
|
|
40
|
-
...row.action_result_json ? { actionResult: JSON.parse(s(row, "action_result_json")) } : {},
|
|
41
|
-
...row.action_error ? { actionError: s(row, "action_error") } : {},
|
|
42
|
-
urgency: s(row, "urgency"),
|
|
43
|
-
confidence: Number(row.confidence),
|
|
44
|
-
valueScore: Number(row.value_score),
|
|
45
|
-
evidenceIds: JSON.parse(s(row, "evidence_ids_json")),
|
|
46
|
-
attentionKind
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
const SELECT_ITEM = `SELECT i.*, x.subscription_id, x.scenario_key, x.title, x.summary, x.why_now, x.impact, x.recommendation,
|
|
51
|
-
x.work_done, x.artifact_json, x.decision_json, x.proposed_action_json, x.disposition, x.disposition_reason,
|
|
52
|
-
x.action_status, x.action_result_json, x.action_error, x.urgency, x.confidence, x.value_score, x.evidence_ids_json FROM proactive_inbox_items i
|
|
53
|
-
JOIN proactive_insights x ON x.insight_id = i.insight_id`;
|
|
54
|
-
function projectInsightsToInbox(now = /* @__PURE__ */ new Date()) {
|
|
55
|
-
return runSqliteWriteTransaction((db) => {
|
|
56
|
-
const missing = db.prepare(`SELECT x.insight_id, x.subscription_id, x.scenario_key, x.urgency, x.confidence, x.value_score, x.decision_json,
|
|
57
|
-
x.proposed_action_json, b.aggregation_key, p.project_id, p.mode, p.quiet_hours_json,
|
|
58
|
-
p.allowed_actions_json, p.confidence_threshold FROM proactive_insights x
|
|
59
|
-
JOIN proactive_runs r ON r.run_id = x.run_id
|
|
60
|
-
JOIN proactive_signal_batches b ON b.batch_id = r.batch_id
|
|
61
|
-
LEFT JOIN project_monitoring_policies p
|
|
62
|
-
ON b.aggregation_key = 'project:' || p.project_id
|
|
63
|
-
WHERE x.disposition IS NULL ORDER BY x.created_at`).all();
|
|
64
|
-
let projected = 0;
|
|
65
|
-
for (const row of missing) {
|
|
66
|
-
if (!insightSourcesAuthorized(String(row.insight_id)) || insightSourcesChanged(String(row.insight_id))) {
|
|
67
|
-
db.prepare("UPDATE proactive_insights SET disposition = 'record_silently', disposition_reason = 'Source changed before delivery' WHERE insight_id = ?").run(String(row.insight_id));
|
|
68
|
-
continue;
|
|
69
|
-
}
|
|
70
|
-
if (!effectiveProactivePolicy(String(row.subscription_id), now).enabled) {
|
|
71
|
-
db.prepare("UPDATE proactive_insights SET disposition = 'record_silently', disposition_reason = 'Proactive subscription paused' WHERE insight_id = ?").run(String(row.insight_id));
|
|
72
|
-
continue;
|
|
73
|
-
}
|
|
74
|
-
const aggregationKey = String(row.aggregation_key);
|
|
75
|
-
const projectId = aggregationKey.startsWith("project:") ? aggregationKey.slice(8) : void 0;
|
|
76
|
-
const policy = projectId ? row.project_id ? {
|
|
77
|
-
projectId,
|
|
78
|
-
mode: String(row.mode),
|
|
79
|
-
...row.quiet_hours_json ? { quietHours: JSON.parse(String(row.quiet_hours_json)) } : {},
|
|
80
|
-
allowedActions: JSON.parse(String(row.allowed_actions_json)),
|
|
81
|
-
confidenceThreshold: Number(row.confidence_threshold),
|
|
82
|
-
scenarios: [],
|
|
83
|
-
configured: true
|
|
84
|
-
} : {
|
|
85
|
-
projectId,
|
|
86
|
-
mode: "observe",
|
|
87
|
-
allowedActions: [],
|
|
88
|
-
confidenceThreshold: .75,
|
|
89
|
-
scenarios: [],
|
|
90
|
-
configured: false
|
|
91
|
-
} : {
|
|
92
|
-
projectId: "",
|
|
93
|
-
mode: "ask_before_action",
|
|
94
|
-
allowedActions: [],
|
|
95
|
-
confidenceThreshold: 0,
|
|
96
|
-
scenarios: [],
|
|
97
|
-
configured: false
|
|
98
|
-
};
|
|
99
|
-
const action = row.proposed_action_json ? JSON.parse(String(row.proposed_action_json)) : void 0;
|
|
100
|
-
const dispositionInput = {
|
|
101
|
-
confidence: Number(row.confidence),
|
|
102
|
-
valueScore: Number(row.value_score),
|
|
103
|
-
risk: action?.risk ?? "low",
|
|
104
|
-
...action ? { actionId: action.id } : {},
|
|
105
|
-
requiresApproval: !action && Boolean(row.decision_json)
|
|
106
|
-
};
|
|
107
|
-
const requestedDisposition = action && !projectId ? "show_in_work" : decideProactiveDisposition(policy, dispositionInput);
|
|
108
|
-
const disposition = requestedDisposition === "record_silently" && Number(row.confidence) >= policy.confidenceThreshold ? action && projectId ? "request_approval" : "show_in_work" : requestedDisposition;
|
|
109
|
-
const reason = action && !projectId ? "Proposed project action cannot run outside a project scope" : proactiveDispositionReason(policy, dispositionInput, disposition);
|
|
110
|
-
const actionStatus = action ? disposition === "auto_execute" ? "pending" : disposition === "request_approval" ? "approval_required" : disposition === "show_in_work" ? "not_authorized" : null : null;
|
|
111
|
-
const nowIso = now.toISOString();
|
|
112
|
-
db.prepare(`UPDATE proactive_insights SET disposition = ?, disposition_reason = ?, action_status = ?,
|
|
113
|
-
disposition_at = ?, action_updated_at = ? WHERE insight_id = ? AND disposition IS NULL`).run(disposition, reason, actionStatus, nowIso, actionStatus ? nowIso : null, String(row.insight_id));
|
|
114
|
-
if (disposition === "record_silently") continue;
|
|
115
|
-
const previous = db.prepare(`SELECT i.inbox_item_id, i.expires_at, x.urgency, x.decision_json,
|
|
116
|
-
o.delivered_at FROM proactive_inbox_items i JOIN proactive_insights x USING(insight_id)
|
|
117
|
-
JOIN proactive_runs r USING(run_id) JOIN proactive_signal_batches b USING(batch_id)
|
|
118
|
-
LEFT JOIN proactive_delivery_outbox o USING(inbox_item_id)
|
|
119
|
-
WHERE x.subscription_id = ? AND x.scenario_key = ? AND b.aggregation_key = ?
|
|
120
|
-
AND i.withdrawn_at IS NULL AND i.status IN ('unread', 'read', 'snoozed') AND (i.expires_at IS NULL OR i.expires_at > ? OR x.scenario_key = 'meeting_preparation')
|
|
121
|
-
AND (x.action_status IS NULL OR x.action_status IN ('not_authorized', 'rejected', 'failed'))
|
|
122
|
-
AND x.artifact_edited_at IS NULL
|
|
123
|
-
ORDER BY i.updated_at DESC LIMIT 1`).get(String(row.subscription_id), String(row.scenario_key), aggregationKey, nowIso);
|
|
124
|
-
const id = previous?.inbox_item_id ?? randomUUID();
|
|
125
|
-
const urgencyRank = {
|
|
126
|
-
low: 0,
|
|
127
|
-
medium: 1,
|
|
128
|
-
high: 2,
|
|
129
|
-
critical: 3
|
|
130
|
-
};
|
|
131
|
-
const materialChange = previous && ((urgencyRank[String(row.urgency)] ?? 0) > (urgencyRank[previous.urgency] ?? 0) || row.decision_json !== previous.decision_json || previous.expires_at && previous.expires_at <= nowIso);
|
|
132
|
-
if (previous) db.prepare(`UPDATE proactive_inbox_items SET insight_id = ?, updated_at = ?,
|
|
133
|
-
status = CASE WHEN ? THEN 'unread' ELSE status END, notification_revision = notification_revision + ? WHERE inbox_item_id = ?`).run(String(row.insight_id), nowIso, materialChange ? 1 : 0, materialChange ? 1 : 0, id);
|
|
134
|
-
else db.prepare(`INSERT INTO proactive_inbox_items (inbox_item_id, insight_id, status, created_at, updated_at)
|
|
135
|
-
VALUES (?, ?, 'unread', ?, ?)`).run(id, String(row.insight_id), nowIso, nowIso);
|
|
136
|
-
{
|
|
137
|
-
const meeting = db.prepare(`SELECT e.payload_json FROM proactive_events e
|
|
138
|
-
JOIN proactive_batch_events be ON be.event_id = e.event_id
|
|
139
|
-
JOIN proactive_runs r ON r.batch_id = be.batch_id JOIN proactive_insights x ON x.run_id = r.run_id
|
|
140
|
-
WHERE x.insight_id = ? AND e.type = 'connected_source.calendar_window.v1' ORDER BY e.occurred_at DESC LIMIT 1`).get(String(row.insight_id));
|
|
141
|
-
const meetingStart = meeting ? JSON.parse(meeting.payload_json).meetingStartsAt : void 0;
|
|
142
|
-
const expiresAt = typeof meetingStart === "string" && Number.isFinite(Date.parse(meetingStart)) ? meetingStart : new Date(now.getTime() + 7 * 864e5).toISOString();
|
|
143
|
-
db.prepare("UPDATE proactive_inbox_items SET expires_at = ?, actionable_until = ? WHERE inbox_item_id = ?").run(expiresAt, typeof meetingStart === "string" ? meetingStart : null, id);
|
|
144
|
-
}
|
|
145
|
-
const quietEnd = nextQuietHoursEnd(policy.quietHours, now)?.getTime() ?? now.getTime();
|
|
146
|
-
const cooldownEnd = previous?.delivered_at ? Date.parse(previous.delivered_at) + 4 * 36e5 : now.getTime();
|
|
147
|
-
const nextAttemptAt = new Date(Math.max(quietEnd, cooldownEnd)).toISOString();
|
|
148
|
-
if (previous && !materialChange) {
|
|
149
|
-
projected += 1;
|
|
150
|
-
continue;
|
|
151
|
-
}
|
|
152
|
-
db.prepare(`INSERT INTO proactive_delivery_outbox (delivery_id, inbox_item_id, status, attempt, next_attempt_at, created_at, updated_at)
|
|
153
|
-
VALUES (?, ?, 'pending', 0, ?, ?, ?)
|
|
154
|
-
ON CONFLICT(inbox_item_id) DO UPDATE SET delivery_id = excluded.delivery_id, status = 'pending', attempt = 0, next_attempt_at = excluded.next_attempt_at, lease_expires_at = NULL, updated_at = excluded.updated_at`).run(randomUUID(), id, nextAttemptAt, nowIso, nowIso);
|
|
155
|
-
projected += 1;
|
|
156
|
-
}
|
|
157
|
-
return projected;
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
function wakeSnoozedItems(now = /* @__PURE__ */ new Date()) {
|
|
161
|
-
return Number(runSqliteWriteTransaction((db) => db.prepare(`UPDATE proactive_inbox_items SET status = 'unread', snoozed_until = NULL, updated_at = ?
|
|
162
|
-
WHERE status = 'snoozed' AND snoozed_until <= ?`).run(now.toISOString(), now.toISOString()).changes));
|
|
163
|
-
}
|
|
164
|
-
function listInbox(input = {}) {
|
|
165
|
-
const limit = Math.min(200, Math.max(1, input.limit ?? 50));
|
|
166
|
-
return (input.status ? getSqliteDatabase().prepare(`${SELECT_ITEM} WHERE i.status = ? ORDER BY i.updated_at DESC LIMIT ?`).all(input.status, limit) : getSqliteDatabase().prepare(`${SELECT_ITEM} ORDER BY i.updated_at DESC LIMIT ?`).all(limit)).map(itemFromRow).filter((item) => !item.withdrawnAt && insightSourcesAuthorized(item.insightId));
|
|
167
|
-
}
|
|
168
|
-
function getInboxItem(id) {
|
|
169
|
-
const row = getSqliteDatabase().prepare(`${SELECT_ITEM} WHERE i.inbox_item_id = ?`).get(id);
|
|
170
|
-
return row ? itemFromRow(row) : null;
|
|
171
|
-
}
|
|
172
|
-
function transitionInboxItem(id, input, now = /* @__PURE__ */ new Date()) {
|
|
173
|
-
if (input.status === "snoozed" && (!input.snoozedUntil || !Number.isFinite(Date.parse(input.snoozedUntil)) || Date.parse(input.snoozedUntil) <= now.getTime())) throw new Error("snoozedUntil must be in the future");
|
|
174
|
-
if (input.status === "resolved" && !input.resolution?.trim()) throw new Error("resolution is required");
|
|
175
|
-
runSqliteWriteTransaction((db) => {
|
|
176
|
-
const current = getInboxItem(id);
|
|
177
|
-
if (!current || current.withdrawnAt || !insightSourcesAuthorized(current.insightId)) throw new Error("Inbox item not found");
|
|
178
|
-
if ((current.status === "resolved" || current.expiresAt && Date.parse(current.expiresAt) <= now.getTime()) && input.status !== "resolved") throw new Error("Card is no longer actionable");
|
|
179
|
-
if (db.prepare(`UPDATE proactive_inbox_items SET status = ?, snoozed_until = ?, resolution = ?, updated_at = ? WHERE inbox_item_id = ?`).run(input.status, input.status === "snoozed" ? input.snoozedUntil : null, input.status === "resolved" ? input.resolution.trim() : null, now.toISOString(), id).changes !== 1) throw new Error("Inbox item not found");
|
|
180
|
-
});
|
|
181
|
-
return getInboxItem(id);
|
|
182
|
-
}
|
|
183
|
-
function recordDecision(id, choice, note = "", now = /* @__PURE__ */ new Date()) {
|
|
184
|
-
if (!choice.trim()) throw new Error("choice is required");
|
|
185
|
-
const activeItem = getInboxItem(id);
|
|
186
|
-
if (!activeItem || activeItem.withdrawnAt || !insightSourcesAuthorized(activeItem.insightId)) throw new Error("Inbox item not found");
|
|
187
|
-
if (activeItem?.expiresAt && Date.parse(activeItem.expiresAt) <= now.getTime()) throw new Error("Card expired");
|
|
188
|
-
if (choice === "approve" && activeItem?.subscriptionId && !effectiveProactivePolicy(activeItem.subscriptionId, now).enabled) throw new Error("Subscription paused");
|
|
189
|
-
runSqliteWriteTransaction((db) => {
|
|
190
|
-
const row = db.prepare(`SELECT i.status, x.decision_json, x.action_status FROM proactive_inbox_items i
|
|
191
|
-
JOIN proactive_insights x ON x.insight_id = i.insight_id WHERE i.inbox_item_id = ?`).get(id);
|
|
192
|
-
if (!row) throw new Error("Inbox item not found");
|
|
193
|
-
if (row.status === "resolved") throw new Error("Inbox item is already resolved");
|
|
194
|
-
if (!row.decision_json) throw new Error("Inbox item does not require a decision");
|
|
195
|
-
if (row.action_status && row.action_status !== "approval_required") throw new Error("Action is no longer awaiting approval");
|
|
196
|
-
if (!JSON.parse(row.decision_json).options.some((option) => option.id === choice.trim())) throw new Error("choice is not a valid decision option");
|
|
197
|
-
db.prepare("INSERT INTO proactive_decisions (decision_id, inbox_item_id, choice, note, created_at) VALUES (?, ?, ?, ?, ?)").run(randomUUID(), id, choice.trim().slice(0, 200), note.trim().slice(0, 2e3), now.toISOString());
|
|
198
|
-
db.prepare("UPDATE proactive_inbox_items SET status = 'resolved', resolution = ?, updated_at = ? WHERE inbox_item_id = ?").run(choice.trim().slice(0, 200), now.toISOString(), id);
|
|
199
|
-
if (row.action_status === "approval_required") db.prepare(`UPDATE proactive_insights SET action_status = ?, action_updated_at = ?
|
|
200
|
-
WHERE insight_id = (SELECT insight_id FROM proactive_inbox_items WHERE inbox_item_id = ?)
|
|
201
|
-
AND action_status = 'approval_required'`).run(choice === "approve" ? "pending" : "rejected", now.toISOString(), id);
|
|
202
|
-
});
|
|
203
|
-
return getInboxItem(id);
|
|
204
|
-
}
|
|
205
|
-
function recordFeedback(id, rating, note = "", now = /* @__PURE__ */ new Date()) {
|
|
206
|
-
runSqliteWriteTransaction((db) => {
|
|
207
|
-
if (!db.prepare("SELECT 1 FROM proactive_inbox_items WHERE inbox_item_id = ?").get(id)) throw new Error("Inbox item not found");
|
|
208
|
-
db.prepare("INSERT INTO proactive_feedback (feedback_id, inbox_item_id, rating, note, created_at) VALUES (?, ?, ?, ?, ?)").run(randomUUID(), id, rating, note.trim().slice(0, 2e3), now.toISOString());
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
function getInboxSubscriptionId(id) {
|
|
212
|
-
const item = getSqliteDatabase().prepare(`${SELECT_ITEM} WHERE i.inbox_item_id = ?`).get(id);
|
|
213
|
-
if (!item) throw new Error("Inbox item not found");
|
|
214
|
-
return s(item, "subscription_id");
|
|
215
|
-
}
|
|
216
|
-
function claimDelivery(now = /* @__PURE__ */ new Date()) {
|
|
217
|
-
return runSqliteWriteTransaction((db) => {
|
|
218
|
-
const row = db.prepare(`SELECT delivery_id, inbox_item_id, attempt FROM proactive_delivery_outbox
|
|
219
|
-
WHERE status IN ('pending', 'retryable') AND next_attempt_at <= ? ORDER BY created_at LIMIT 1`).get(now.toISOString());
|
|
220
|
-
if (!row) return null;
|
|
221
|
-
db.prepare(`UPDATE proactive_delivery_outbox SET status = 'delivering', attempt = attempt + 1, lease_expires_at = ?, updated_at = ? WHERE delivery_id = ?`).run(new Date(now.getTime() + 6e4).toISOString(), now.toISOString(), s(row, "delivery_id"));
|
|
222
|
-
return {
|
|
223
|
-
id: s(row, "delivery_id"),
|
|
224
|
-
item: getInboxItem(s(row, "inbox_item_id")),
|
|
225
|
-
attempt: Number(row.attempt) + 1
|
|
226
|
-
};
|
|
227
|
-
});
|
|
228
|
-
}
|
|
229
|
-
function finishDelivery(id, error, attempt = 1, now = /* @__PURE__ */ new Date()) {
|
|
230
|
-
runSqliteWriteTransaction((db) => {
|
|
231
|
-
const retry = Boolean(error) && attempt < 5;
|
|
232
|
-
db.prepare(`UPDATE proactive_delivery_outbox SET status = ?, next_attempt_at = ?, lease_expires_at = NULL,
|
|
233
|
-
error_message = ?, delivered_at = ?, updated_at = ? WHERE delivery_id = ? AND status = 'delivering' AND attempt = ?`).run(error ? retry ? "retryable" : "failed" : "delivered", retry ? new Date(now.getTime() + attempt * 3e4).toISOString() : now.toISOString(), error ? String(error instanceof Error ? error.message : error).slice(0, 1e3) : null, error ? null : now.toISOString(), now.toISOString(), id, attempt);
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
function recoverExpiredDeliveries(now = /* @__PURE__ */ new Date()) {
|
|
237
|
-
return Number(runSqliteWriteTransaction((db) => db.prepare(`UPDATE proactive_delivery_outbox SET status = 'retryable', next_attempt_at = ?, lease_expires_at = NULL, updated_at = ?
|
|
238
|
-
WHERE status = 'delivering' AND lease_expires_at <= ?`).run(now.toISOString(), now.toISOString(), now.toISOString()).changes));
|
|
239
|
-
}
|
|
240
|
-
function deferDelivery(id, attempt, retryAt) {
|
|
241
|
-
getSqliteDatabase().prepare("UPDATE proactive_delivery_outbox SET status = 'pending', attempt = attempt - 1, next_attempt_at = ?, lease_expires_at = NULL WHERE delivery_id = ? AND status = 'delivering' AND attempt = ?").run(retryAt, id, attempt);
|
|
242
|
-
}
|
|
243
|
-
//#endregion
|
|
244
|
-
export { claimDelivery, deferDelivery, finishDelivery, getInboxItem, getInboxSubscriptionId, listInbox, projectInsightsToInbox, recordDecision, recordFeedback, recoverExpiredDeliveries, transitionInboxItem, wakeSnoozedItems };
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { listInbox, projectInsightsToInbox, recordFeedback, wakeSnoozedItems } from './repository.js';
|
|
2
|
-
import type { InboxStatus } from './types.js';
|
|
3
|
-
export declare class ProactiveInboxService {
|
|
4
|
-
list: typeof listInbox;
|
|
5
|
-
project: typeof projectInsightsToInbox;
|
|
6
|
-
wakeSnoozed: typeof wakeSnoozedItems;
|
|
7
|
-
feedback: typeof recordFeedback;
|
|
8
|
-
decide(id: string, choice: string, note?: string): import("./types.js").InboxItem;
|
|
9
|
-
instruct(id: string, instruction: string): {
|
|
10
|
-
followUpId: string;
|
|
11
|
-
revision: number;
|
|
12
|
-
revisionId?: undefined;
|
|
13
|
-
} | {
|
|
14
|
-
revisionId: string;
|
|
15
|
-
followUpId?: undefined;
|
|
16
|
-
revision?: undefined;
|
|
17
|
-
};
|
|
18
|
-
transition(id: string, input: {
|
|
19
|
-
status: InboxStatus;
|
|
20
|
-
snoozedUntil?: string;
|
|
21
|
-
resolution?: string;
|
|
22
|
-
}): import("./types.js").InboxItem;
|
|
23
|
-
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { getSqliteDatabase, init_transaction } from "../../storage/sqlite/transaction.js";
|
|
2
|
-
import { publishInstructionFeedback } from "../scenarios/repository.js";
|
|
3
|
-
import { requireMailFollowUp, updateMailFollowUp } from "../follow-ups.js";
|
|
4
|
-
import { executePendingProactiveActions } from "../actions/service.js";
|
|
5
|
-
import { getInboxItem, getInboxSubscriptionId, listInbox, projectInsightsToInbox, recordDecision, recordFeedback, transitionInboxItem, wakeSnoozedItems } from "./repository.js";
|
|
6
|
-
//#region src/proactive/inbox/service.ts
|
|
7
|
-
init_transaction();
|
|
8
|
-
var ProactiveInboxService = class {
|
|
9
|
-
list = listInbox;
|
|
10
|
-
project = projectInsightsToInbox;
|
|
11
|
-
wakeSnoozed = wakeSnoozedItems;
|
|
12
|
-
feedback = recordFeedback;
|
|
13
|
-
decide(id, choice, note = "") {
|
|
14
|
-
const item = recordDecision(id, choice, note);
|
|
15
|
-
if (choice === "approve") executePendingProactiveActions();
|
|
16
|
-
return getInboxItem(id) ?? item;
|
|
17
|
-
}
|
|
18
|
-
instruct(id, instruction) {
|
|
19
|
-
const row = getSqliteDatabase().prepare(`SELECT s.workspace_id, c.content_json FROM proactive_inbox_items i
|
|
20
|
-
JOIN proactive_insights x USING(insight_id) JOIN proactive_runs r USING(run_id)
|
|
21
|
-
JOIN proactive_scenario_subscriptions s ON s.subscription_id = x.subscription_id
|
|
22
|
-
JOIN proactive_context_snapshots c ON c.snapshot_id = r.context_snapshot_id WHERE i.inbox_item_id = ?`).get(id);
|
|
23
|
-
const followId = row && JSON.parse(row.content_json).follow_up?.followUpId;
|
|
24
|
-
if (row && followId) {
|
|
25
|
-
const follow = requireMailFollowUp(row.workspace_id, followId);
|
|
26
|
-
const updated = updateMailFollowUp(row.workspace_id, follow.id, {
|
|
27
|
-
expectedRevision: follow.revision,
|
|
28
|
-
instructions: `${follow.instructions}\n${instruction}`
|
|
29
|
-
});
|
|
30
|
-
return {
|
|
31
|
-
followUpId: updated.id,
|
|
32
|
-
revision: updated.revision
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
return { revisionId: publishInstructionFeedback({
|
|
36
|
-
subscriptionId: getInboxSubscriptionId(id),
|
|
37
|
-
inboxItemId: id,
|
|
38
|
-
instruction
|
|
39
|
-
}).id };
|
|
40
|
-
}
|
|
41
|
-
transition(id, input) {
|
|
42
|
-
return transitionInboxItem(id, input);
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
//#endregion
|
|
46
|
-
export { ProactiveInboxService };
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import type { ProactiveArtifact } from '@xopcai/gateway-contract';
|
|
2
|
-
export type InboxStatus = 'unread' | 'read' | 'snoozed' | 'resolved';
|
|
3
|
-
export interface InboxItem {
|
|
4
|
-
id: string;
|
|
5
|
-
insightId: string;
|
|
6
|
-
subscriptionId?: string;
|
|
7
|
-
revision?: number;
|
|
8
|
-
notificationRevision?: number;
|
|
9
|
-
expiresAt?: string;
|
|
10
|
-
actionableUntil?: string;
|
|
11
|
-
withdrawnAt?: string;
|
|
12
|
-
correlationKey?: string;
|
|
13
|
-
status: InboxStatus;
|
|
14
|
-
snoozedUntil?: string;
|
|
15
|
-
resolution?: string;
|
|
16
|
-
createdAt: string;
|
|
17
|
-
updatedAt: string;
|
|
18
|
-
insight: {
|
|
19
|
-
artifact?: ProactiveArtifact;
|
|
20
|
-
scenarioKey: string;
|
|
21
|
-
title: string;
|
|
22
|
-
summary: string;
|
|
23
|
-
whyNow: string;
|
|
24
|
-
impact: string;
|
|
25
|
-
recommendation: string;
|
|
26
|
-
workDone: string;
|
|
27
|
-
decision?: {
|
|
28
|
-
question: string;
|
|
29
|
-
options: Array<{
|
|
30
|
-
id: string;
|
|
31
|
-
label: string;
|
|
32
|
-
consequence: string;
|
|
33
|
-
}>;
|
|
34
|
-
};
|
|
35
|
-
proposedAction?: {
|
|
36
|
-
id: 'create_project_task';
|
|
37
|
-
risk: 'low';
|
|
38
|
-
rationale: string;
|
|
39
|
-
input: {
|
|
40
|
-
title: string;
|
|
41
|
-
objective: string;
|
|
42
|
-
};
|
|
43
|
-
};
|
|
44
|
-
disposition: 'show_in_work' | 'request_approval' | 'auto_execute';
|
|
45
|
-
dispositionReason: string;
|
|
46
|
-
actionStatus?: 'not_authorized' | 'approval_required' | 'pending' | 'executing' | 'completed' | 'rejected' | 'failed';
|
|
47
|
-
actionResult?: Record<string, unknown>;
|
|
48
|
-
actionError?: string;
|
|
49
|
-
urgency: 'low' | 'medium' | 'high' | 'critical';
|
|
50
|
-
confidence: number;
|
|
51
|
-
valueScore: number;
|
|
52
|
-
evidenceIds: string[];
|
|
53
|
-
attentionKind: 'information' | 'decision' | 'receipt';
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
export interface InboxDelivery {
|
|
57
|
-
inboxItem: InboxItem;
|
|
58
|
-
deliveryId: string;
|
|
59
|
-
}
|
|
60
|
-
export interface InboxDeliveryAdapter {
|
|
61
|
-
deliver(delivery: InboxDelivery): Promise<void | {
|
|
62
|
-
retryAt: string;
|
|
63
|
-
}>;
|
|
64
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { InboxDeliveryAdapter } from './types.js';
|
|
2
|
-
export declare class ProactiveInboxWorker {
|
|
3
|
-
private readonly delivery;
|
|
4
|
-
private readonly intervalMs;
|
|
5
|
-
private timer?;
|
|
6
|
-
private running;
|
|
7
|
-
private waiters;
|
|
8
|
-
private lastMaintenanceAt;
|
|
9
|
-
constructor(delivery: InboxDeliveryAdapter, intervalMs?: number);
|
|
10
|
-
start(): void;
|
|
11
|
-
stop(): Promise<void>;
|
|
12
|
-
tick(): Promise<void>;
|
|
13
|
-
}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { createLogger } from "../../utils/logger/index.js";
|
|
2
|
-
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { reconcileCards } from "./lifecycle.js";
|
|
4
|
-
import { executePendingProactiveActions } from "../actions/service.js";
|
|
5
|
-
import { claimDelivery, deferDelivery, finishDelivery, projectInsightsToInbox, recoverExpiredDeliveries, wakeSnoozedItems } from "./repository.js";
|
|
6
|
-
import { pruneProactiveHistory } from "../maintenance.js";
|
|
7
|
-
//#region src/proactive/inbox/worker.ts
|
|
8
|
-
init_logger();
|
|
9
|
-
const log = createLogger("ProactiveInboxWorker");
|
|
10
|
-
var ProactiveInboxWorker = class {
|
|
11
|
-
timer;
|
|
12
|
-
running = false;
|
|
13
|
-
waiters = [];
|
|
14
|
-
lastMaintenanceAt = 0;
|
|
15
|
-
constructor(delivery, intervalMs = 3e3) {
|
|
16
|
-
this.delivery = delivery;
|
|
17
|
-
this.intervalMs = intervalMs;
|
|
18
|
-
}
|
|
19
|
-
start() {
|
|
20
|
-
if (this.timer) return;
|
|
21
|
-
this.timer = setInterval(() => void this.tick(), this.intervalMs);
|
|
22
|
-
this.timer.unref();
|
|
23
|
-
this.tick();
|
|
24
|
-
}
|
|
25
|
-
async stop() {
|
|
26
|
-
if (this.timer) clearInterval(this.timer);
|
|
27
|
-
this.timer = void 0;
|
|
28
|
-
if (this.running) await new Promise((resolve) => this.waiters.push(resolve));
|
|
29
|
-
}
|
|
30
|
-
async tick() {
|
|
31
|
-
if (this.running) return;
|
|
32
|
-
this.running = true;
|
|
33
|
-
try {
|
|
34
|
-
const now = Date.now();
|
|
35
|
-
if (now - this.lastMaintenanceAt >= 60 * 6e4) {
|
|
36
|
-
pruneProactiveHistory(new Date(now));
|
|
37
|
-
this.lastMaintenanceAt = now;
|
|
38
|
-
}
|
|
39
|
-
reconcileCards();
|
|
40
|
-
projectInsightsToInbox();
|
|
41
|
-
executePendingProactiveActions();
|
|
42
|
-
wakeSnoozedItems();
|
|
43
|
-
recoverExpiredDeliveries();
|
|
44
|
-
const claim = claimDelivery();
|
|
45
|
-
if (!claim) return;
|
|
46
|
-
try {
|
|
47
|
-
const result = await this.delivery.deliver({
|
|
48
|
-
deliveryId: claim.id,
|
|
49
|
-
inboxItem: claim.item
|
|
50
|
-
});
|
|
51
|
-
if (result && result.retryAt) {
|
|
52
|
-
deferDelivery(claim.id, claim.attempt, result.retryAt);
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
finishDelivery(claim.id, void 0, claim.attempt);
|
|
56
|
-
} catch (error) {
|
|
57
|
-
finishDelivery(claim.id, error, claim.attempt);
|
|
58
|
-
log.warn({
|
|
59
|
-
err: error,
|
|
60
|
-
deliveryId: claim.id,
|
|
61
|
-
inboxItemId: claim.item.id
|
|
62
|
-
}, "Proactive inbox delivery failed");
|
|
63
|
-
}
|
|
64
|
-
} finally {
|
|
65
|
-
this.running = false;
|
|
66
|
-
for (const resolve of this.waiters.splice(0)) resolve();
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
};
|
|
70
|
-
//#endregion
|
|
71
|
-
export { ProactiveInboxWorker };
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
export { normalizeEventEnvelope } from './events/envelope.js';
|
|
2
|
-
export { mapProductEventToProactive } from './events/product-event-bridge.js';
|
|
3
|
-
export type { EventEnvelope, PublishEventInput, PublishedEvent } from './events/types.js';
|
|
4
|
-
export type { ProactiveSignalPublisher } from './events/publisher.js';
|
|
5
|
-
export { matchesCondition, matchScenario } from './routing/matcher.js';
|
|
6
|
-
export type { EventCondition, ScenarioRoute } from './routing/types.js';
|
|
7
|
-
export type { SignalBatch } from './routing/batch-repository.js';
|
|
8
|
-
export { ProactiveEventService } from './service.js';
|
|
9
|
-
export { pruneProactiveHistory } from './maintenance.js';
|
|
10
|
-
export { ProactiveScenarioService } from './scenarios/service.js';
|
|
11
|
-
export type { PromptRevision, ScenarioDefinition, ScenarioSubscription } from './scenarios/types.js';
|
|
12
|
-
export { AutomationStateContextProvider, ConnectedSourceContextProvider, ContextProviderRegistry, EventBatchContextProvider, InternalObjectContextProvider, MeetingWorkspaceContextProvider, ProjectStateContextProvider, UserModelContextProvider, } from './execution/context.js';
|
|
13
|
-
export { ReadonlyProactiveAgentExecutor } from './execution/agent-executor.js';
|
|
14
|
-
export { listInsights } from './execution/repository.js';
|
|
15
|
-
export { ProactiveWorker } from './execution/worker.js';
|
|
16
|
-
export { ProactiveTemporalWorker, type TemporalTickResult } from './temporal/worker.js';
|
|
17
|
-
export type { ContextProvider, ContextSnapshot, InsightCandidate, ProactiveAgentExecutor, ProactiveInsight, ResolvedContext, } from './execution/types.js';
|
|
18
|
-
export { ProactiveInboxService } from './inbox/service.js';
|
|
19
|
-
export { ProactiveInboxWorker } from './inbox/worker.js';
|
|
20
|
-
export type { InboxDelivery, InboxDeliveryAdapter, InboxItem, InboxStatus } from './inbox/types.js';
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { ProactiveScenarioService } from "./scenarios/service.js";
|
|
2
|
-
import { normalizeEventEnvelope } from "./events/envelope.js";
|
|
3
|
-
import { matchScenario, matchesCondition } from "./routing/matcher.js";
|
|
4
|
-
import { ProactiveEventService } from "./service.js";
|
|
5
|
-
import { ProactiveInboxService } from "./inbox/service.js";
|
|
6
|
-
import { mapProductEventToProactive } from "./events/product-event-bridge.js";
|
|
7
|
-
import { pruneProactiveHistory } from "./maintenance.js";
|
|
8
|
-
import { AutomationStateContextProvider, ConnectedSourceContextProvider, ContextProviderRegistry, EventBatchContextProvider, InternalObjectContextProvider, MeetingWorkspaceContextProvider, ProjectStateContextProvider, UserModelContextProvider } from "./execution/context.js";
|
|
9
|
-
import { ReadonlyProactiveAgentExecutor } from "./execution/agent-executor.js";
|
|
10
|
-
import { listInsights } from "./execution/repository.js";
|
|
11
|
-
import { ProactiveWorker } from "./execution/worker.js";
|
|
12
|
-
import { ProactiveTemporalWorker } from "./temporal/worker.js";
|
|
13
|
-
import { ProactiveInboxWorker } from "./inbox/worker.js";
|
|
14
|
-
export { AutomationStateContextProvider, ConnectedSourceContextProvider, ContextProviderRegistry, EventBatchContextProvider, InternalObjectContextProvider, MeetingWorkspaceContextProvider, ProactiveEventService, ProactiveInboxService, ProactiveInboxWorker, ProactiveScenarioService, ProactiveTemporalWorker, ProactiveWorker, ProjectStateContextProvider, ReadonlyProactiveAgentExecutor, UserModelContextProvider, listInsights, mapProductEventToProactive, matchScenario, matchesCondition, normalizeEventEnvelope, pruneProactiveHistory };
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export declare function emailFields(text: string | undefined | null): {
|
|
2
|
-
threadId?: string;
|
|
3
|
-
subject?: string;
|
|
4
|
-
sender?: string;
|
|
5
|
-
labels?: string[];
|
|
6
|
-
};
|
|
7
|
-
/** Thread identity includes the account and collection; provider thread IDs are not globally unique. */
|
|
8
|
-
export declare function readMailThread(sourceItemId: string): {
|
|
9
|
-
origin: import("../knowledge/types.js").KnowledgeSourceItem;
|
|
10
|
-
items: import("../knowledge/types.js").KnowledgeSourceItem[];
|
|
11
|
-
threadKey: string;
|
|
12
|
-
fingerprint: string;
|
|
13
|
-
};
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { getSqliteDatabase, init_transaction } from "../storage/sqlite/transaction.js";
|
|
2
|
-
import { getKnowledgeSourceItem } from "../storage/sqlite/knowledge-repository.js";
|
|
3
|
-
import { createHash } from "node:crypto";
|
|
4
|
-
//#region src/proactive/mail-thread.ts
|
|
5
|
-
init_transaction();
|
|
6
|
-
function emailFields(text) {
|
|
7
|
-
try {
|
|
8
|
-
const value = JSON.parse(text ?? "{}");
|
|
9
|
-
if (!value || typeof value !== "object" || Array.isArray(value)) return {};
|
|
10
|
-
const row = value;
|
|
11
|
-
return {
|
|
12
|
-
...typeof row.threadId === "string" ? { threadId: row.threadId } : {},
|
|
13
|
-
...typeof row.subject === "string" ? { subject: row.subject } : {},
|
|
14
|
-
...typeof row.sender === "string" ? { sender: row.sender } : {},
|
|
15
|
-
...Array.isArray(row.labels) ? { labels: row.labels.filter((label) => typeof label === "string") } : {}
|
|
16
|
-
};
|
|
17
|
-
} catch {
|
|
18
|
-
return {};
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
/** Thread identity includes the account and collection; provider thread IDs are not globally unique. */
|
|
22
|
-
function readMailThread(sourceItemId) {
|
|
23
|
-
const origin = getKnowledgeSourceItem(sourceItemId);
|
|
24
|
-
if (!origin || origin.deletedAt || origin.itemType !== "email") return null;
|
|
25
|
-
const threadId = emailFields(origin.normalizedText)?.threadId;
|
|
26
|
-
if (typeof threadId !== "string" || !threadId.trim()) return null;
|
|
27
|
-
if (emailFields(origin.normalizedText).labels?.some((label) => [
|
|
28
|
-
"DRAFT",
|
|
29
|
-
"TRASH",
|
|
30
|
-
"SPAM"
|
|
31
|
-
].includes(label))) return null;
|
|
32
|
-
const items = getSqliteDatabase().prepare(`SELECT item_id FROM knowledge_source_items
|
|
33
|
-
WHERE source_instance_id = ? AND collection_scope = ? AND item_type = 'email' AND deleted_at IS NULL
|
|
34
|
-
AND json_extract(CASE WHEN json_valid(normalized_text) THEN normalized_text ELSE '{}' END, '$.threadId') = ?
|
|
35
|
-
AND json_extract(metadata_json, '$.connectionId') = ?
|
|
36
|
-
AND NOT EXISTS (SELECT 1 FROM json_each(CASE WHEN json_valid(normalized_text) THEN normalized_text ELSE '{}' END, '$.labels') WHERE value IN ('DRAFT', 'TRASH', 'SPAM'))
|
|
37
|
-
ORDER BY occurred_at DESC, item_id DESC LIMIT 30`).all(origin.sourceInstanceId, origin.collectionScope, threadId, String(origin.metadata.connectionId)).map((row) => getKnowledgeSourceItem(row.item_id)).reverse();
|
|
38
|
-
return {
|
|
39
|
-
origin,
|
|
40
|
-
items,
|
|
41
|
-
threadKey: createHash("sha256").update(JSON.stringify([
|
|
42
|
-
origin.sourceInstanceId,
|
|
43
|
-
origin.collectionScope,
|
|
44
|
-
origin.metadata.connectionId,
|
|
45
|
-
threadId
|
|
46
|
-
])).digest("hex"),
|
|
47
|
-
fingerprint: createHash("sha256").update(JSON.stringify(items.map((item) => [
|
|
48
|
-
item.id,
|
|
49
|
-
item.contentHash,
|
|
50
|
-
item.occurredAt
|
|
51
|
-
]))).digest("hex")
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
//#endregion
|
|
55
|
-
export { emailFields, readMailThread };
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { init_transaction, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
|
|
2
|
-
//#region src/proactive/maintenance.ts
|
|
3
|
-
init_transaction();
|
|
4
|
-
const RETENTION_DAYS = 90;
|
|
5
|
-
function pruneProactiveHistory(now = /* @__PURE__ */ new Date()) {
|
|
6
|
-
const cutoff = (/* @__PURE__ */ new Date(now.getTime() - RETENTION_DAYS * 24 * 60 * 6e4)).toISOString();
|
|
7
|
-
return runSqliteWriteTransaction((db) => {
|
|
8
|
-
const batches = db.prepare(`DELETE FROM proactive_signal_batches
|
|
9
|
-
WHERE updated_at < ? AND status IN ('processed', 'ignored', 'failed_permanent', 'expired')`).run(cutoff).changes;
|
|
10
|
-
const events = db.prepare(`DELETE FROM proactive_events
|
|
11
|
-
WHERE observed_at < ? AND NOT EXISTS (
|
|
12
|
-
SELECT 1 FROM proactive_batch_events batch_event
|
|
13
|
-
WHERE batch_event.event_id = proactive_events.event_id
|
|
14
|
-
)`).run(cutoff).changes;
|
|
15
|
-
db.prepare("DELETE FROM proactive_notification_budget WHERE created_at < ?").run(cutoff);
|
|
16
|
-
db.prepare("DELETE FROM proactive_presence WHERE expires_at <= ?").run(now.getTime());
|
|
17
|
-
db.prepare("DELETE FROM proactive_delivery_decisions WHERE created_at < ?").run(cutoff);
|
|
18
|
-
db.prepare("DELETE FROM proactive_push_probes WHERE created_at < ?").run(Date.parse(cutoff));
|
|
19
|
-
db.prepare("DELETE FROM proactive_digest_queue WHERE consumed_at < ?").run(cutoff);
|
|
20
|
-
db.prepare("DELETE FROM proactive_digests WHERE created_at < ?").run(cutoff);
|
|
21
|
-
return {
|
|
22
|
-
batches: Number(batches),
|
|
23
|
-
events: Number(events)
|
|
24
|
-
};
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
//#endregion
|
|
28
|
-
export { pruneProactiveHistory };
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export declare function proactiveMetrics(workspace: string, now?: number): {
|
|
2
|
-
usage: Record<string, import("node:sqlite").SQLOutputValue>;
|
|
3
|
-
since: string;
|
|
4
|
-
cards: Record<string, import("node:sqlite").SQLOutputValue>;
|
|
5
|
-
feedback: Record<string, import("node:sqlite").SQLOutputValue>[];
|
|
6
|
-
interruptions: Record<string, import("node:sqlite").SQLOutputValue>[];
|
|
7
|
-
runs: Record<string, import("node:sqlite").SQLOutputValue>[];
|
|
8
|
-
browser: Record<string, import("node:sqlite").SQLOutputValue>[];
|
|
9
|
-
telegram: Record<string, import("node:sqlite").SQLOutputValue>[];
|
|
10
|
-
};
|