@xopcai/xopc 0.0.113 → 0.0.115
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/feishu/src/outbound/media-load.js +1 -1
- package/dist/extensions/feishu/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
- package/dist/extensions/telegram/src/inbound-processor.js +1 -1
- package/dist/extensions/telegram/src/plugin.js +1 -1
- package/dist/extensions/telegram/src/routing-integration.js +2 -2
- package/dist/extensions/telegram/src/update-offset-store.js +1 -1
- package/dist/extensions/telegram/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/api/api.js +2 -2
- package/dist/extensions/weixin/src/auth/accounts.js +1 -1
- package/dist/extensions/weixin/src/cdn/upload.js +1 -1
- package/dist/extensions/weixin/src/media/data-url.js +1 -1
- package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
- package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/extensions/weixin/src/plugin.js +1 -1
- package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
- package/dist/extensions/weixin/src/workflow-progress.js +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CBlklyNr.js → agent-avatar-dicebear-DVnBfANm.js} +1 -1
- package/dist/gateway/static/root/assets/agent-browser-settings-page-DPXc4hz8.js +6 -0
- package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-CTJ0YnRQ.js +1 -0
- package/dist/gateway/static/root/assets/agents-zJXQfJ_W.js +71 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-28E_WfMe.js → app-management-settings-panel-DzGbdr04.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-Do1z0XgJ.js → appearance-settings-BQpPSTHD.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-CPjfyzSD.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-BAFlsov_.js → archive-plugin-CXu-Csep.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-V3qGPC3x.js → attachment-load-BAjgOoGY.js} +1 -1
- package/dist/gateway/static/root/assets/{binary-plugins-DT8NvA6W.js → binary-plugins-BSBgB2hO.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-CdLMEcHd.js → block-editor-BpXw9TTR.js} +3 -3
- package/dist/gateway/static/root/assets/channels-settings-BbPUpzWB.js +1 -0
- package/dist/gateway/static/root/assets/{config-api-Bf5mjpu7.js → config-api-NOoPiIYz.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-settings-CAXYMOdp.js +2 -0
- package/dist/gateway/static/root/assets/{cron-api--pAB_rps.js → cron-api-C9BOqAXd.js} +1 -1
- package/dist/gateway/static/root/assets/cron-page-DuUbBeKI.js +3 -0
- package/dist/gateway/static/root/assets/{dreaming-settings-6UZE1FSK.js → dreaming-settings-DQ4DtiK1.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-BGhE7msg.js → extension-debug-page-D9kgUHCc.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-CvpI45WG.js → extension-page-CGyhXqzR.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-DAmR5FUe.js → extension-settings-page-DL8Xquqd.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-NZmjSXLl.js → fetch-D0VXA932.js} +1 -1
- package/dist/gateway/static/root/assets/{format-interval-label-qhth3BMV.js → format-interval-label-Be8SmgUw.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-CaXBt-9R.js → gateway-config-api-C-xjn__h.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-DphpbLBc.js → gateway-settings-BMPwIjKI.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-Be1omjh3.js → gateway-startup-retry-DERUH61L.js} +1 -1
- package/dist/gateway/static/root/assets/goal-detail-page-BJsyjJnF.js +1 -0
- package/dist/gateway/static/root/assets/goals-config-api-BPmqWk90.js +1 -0
- package/dist/gateway/static/root/assets/goals-page-BerDgIhw.js +2 -0
- package/dist/gateway/static/root/assets/goals-settings-ByTjeAto.js +1 -0
- package/dist/gateway/static/root/assets/{heartbeat-config-api-BzO6G4fD.js → heartbeat-config-api-Bfdzr8oV.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-DCST9-du.js → heartbeat-settings-TbHgcjTn.js} +1 -1
- package/dist/gateway/static/root/assets/index-AkTrf6Pb.js +122 -0
- package/dist/gateway/static/root/assets/index-fh5sXTj9.css +1 -0
- package/dist/gateway/static/root/assets/{interval-presets-DJmshV8n.js → interval-presets-utKbuCRY.js} +1 -1
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-9AUUlQ5Q.js → keyboard-shortcuts-settings-CjqS6c6V.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-DGXuPf5B.js +2 -0
- package/dist/gateway/static/root/assets/{markdown-split-CYYELqAr.js → markdown-split-DW8C47iB.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-BEcMR2M8.js → media-plugins-D6HwDhDT.js} +1 -1
- package/dist/gateway/static/root/assets/messages-upgxw6Ub.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-panel-Bot16nn7.js +2 -0
- package/dist/gateway/static/root/assets/note-detail-page-Brlyou8M.js +2 -0
- package/dist/gateway/static/root/assets/{note-image-lightbox-DNAoPcmm.js → note-image-lightbox-pJM35Pz5.js} +1 -1
- package/dist/gateway/static/root/assets/notes-page-DvZ4pwc-.js +1 -0
- package/dist/gateway/static/root/assets/{preview-open-alternatives-BPLz0AIv.js → preview-open-alternatives-CVwHuyN6.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-BZEDmxbZ.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-CrWwWRVK.js → save-bar-controls-Ba-UEk7x.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-CF2sadvN.js → schedule-field-CNN9595U.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-Di5cKjYE.js → schema-form-DnNMmtD5.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-DdGGlsfn.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-DlkEkPf9.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-Chh282jW.js → settings-collapsible-section-CmOz80i5.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-Dq-83cQd.js → settings-form-section-BmK7JJOV.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-DFPTrsPF.js +1 -0
- package/dist/gateway/static/root/assets/setup-status-panel-CYCCfgh4.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-0FXYnSUA.js → share-preview-page-Dp2qGrHC.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-Bff1pGd0.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-CJGKpBur.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-C6ocduTD.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-W1pTcojB.js → system-settings-panel-5jrIEr5b.js} +1 -1
- package/dist/gateway/static/root/assets/{use-agent-defaults-form-BVRvkK7m.js → use-agent-defaults-form-BuiXLIs5.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-CgJibfMM.js → use-channel-catalog-CHlO8J9G.js} +1 -1
- package/dist/gateway/static/root/assets/{use-settings-tab-guard-Bw_qkRQE.js → use-settings-tab-guard-CW5JORnl.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DDoQyghO.js +1 -0
- package/dist/gateway/static/root/assets/{voice-player-store-C7lziaAx.js → voice-player-store-DDDWYHvg.js} +1 -1
- package/dist/gateway/static/root/assets/workflow-page.utils-CKjeEGqx.js +1 -0
- package/dist/gateway/static/root/assets/workflows-page-B604ehHG.js +18 -0
- package/dist/gateway/static/root/index.html +5 -5
- package/dist/gateway/static/root/logo.svg +4 -3
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +8 -0
- package/dist/src/agent/agent-manager.js +63 -28
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/agent-scope.js +1 -1
- package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
- package/dist/src/agent/bootstrap/project-agents-context.d.ts +2 -0
- package/dist/src/agent/bootstrap/project-agents-context.js +32 -0
- package/dist/src/agent/bootstrap/project-agents-context.js.map +1 -0
- package/dist/src/agent/context/workspace-seed.js +2 -2
- package/dist/src/agent/context/workspace-state.js +1 -1
- package/dist/src/agent/context/workspace.js +1 -1
- package/dist/src/agent/embedded/session-tool-result-guard.js +8 -1
- package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
- package/dist/src/agent/goals/checklist-judge.d.ts +1 -0
- package/dist/src/agent/goals/checklist-judge.js +3 -2
- package/dist/src/agent/goals/checklist-judge.js.map +1 -1
- package/dist/src/agent/goals/evaluate-turn.d.ts +1 -1
- package/dist/src/agent/goals/evaluate-turn.js +1 -0
- package/dist/src/agent/goals/evaluate-turn.js.map +1 -1
- package/dist/src/agent/goals/goal-locale.js +2 -2
- package/dist/src/agent/goals/persistent-goal-service.js +2 -4
- package/dist/src/agent/goals/persistent-goal-service.js.map +1 -1
- package/dist/src/agent/goals/post-turn.d.ts +6 -1
- package/dist/src/agent/goals/post-turn.js +15 -6
- package/dist/src/agent/goals/post-turn.js.map +1 -1
- package/dist/src/agent/image/load-image-media.js +2 -2
- package/dist/src/agent/inbound/inbound-loop.js +5 -1
- package/dist/src/agent/inbound/inbound-loop.js.map +1 -1
- package/dist/src/agent/inbound/turn-dispatcher.d.ts +2 -2
- package/dist/src/agent/inbound/turn-dispatcher.js +2 -2
- package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
- package/dist/src/agent/ipc/inbox.js +3 -3
- package/dist/src/agent/ipc/socket.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-materialize.d.ts +27 -0
- package/dist/src/agent/mcp/bundle-mcp-materialize.js +50 -2
- package/dist/src/agent/mcp/bundle-mcp-materialize.js.map +1 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +79 -4
- package/dist/src/agent/mcp/bundle-mcp-runtime.js.map +1 -1
- package/dist/src/agent/mcp/bundle-mcp-types.d.ts +19 -0
- package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
- package/dist/src/agent/mcp/mcp-transport.js +1 -1
- package/dist/src/agent/memory/builtin-memory-store.js +1 -1
- package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
- package/dist/src/agent/memory/dreaming/events.js +1 -1
- package/dist/src/agent/memory/dreaming/last-run.js +1 -1
- package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
- package/dist/src/agent/memory/dreaming/preview.js +1 -1
- package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
- package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
- package/dist/src/agent/memory/dreaming/utils.js +1 -1
- package/dist/src/agent/memory/memory-flush.js +1 -1
- package/dist/src/agent/memory/plugin-discovery.js +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/prompt/memory/index.js +1 -1
- package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
- package/dist/src/agent/reply/post-compaction-context.js +1 -1
- package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
- package/dist/src/agent/sandbox/path-policy.js +2 -2
- package/dist/src/agent/service/btw-query.js +11 -3
- package/dist/src/agent/service/btw-query.js.map +1 -1
- package/dist/src/agent/service/parse-outbound-session-key.js +13 -8
- package/dist/src/agent/service/parse-outbound-session-key.js.map +1 -1
- package/dist/src/agent/service/process-direct-one-shot.d.ts +2 -2
- package/dist/src/agent/service/process-direct-one-shot.js +1 -1
- package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.d.ts +2 -2
- package/dist/src/agent/service/process-direct-streaming.js +1 -1
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service.d.ts +1 -1
- package/dist/src/agent/service.js +13 -9
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/service.types.d.ts +5 -0
- package/dist/src/agent/session/session-inspector.js +1 -1
- package/dist/src/agent/skills/config.js +2 -2
- package/dist/src/agent/skills/filesystem-watcher.js +5 -4
- package/dist/src/agent/skills/filesystem-watcher.js.map +1 -1
- package/dist/src/agent/skills/hub-hash.js +2 -2
- package/dist/src/agent/skills/hub-lock.js +1 -1
- package/dist/src/agent/skills/hub-pull.js +2 -2
- package/dist/src/agent/skills/index.js +4 -3
- package/dist/src/agent/skills/index.js.map +1 -1
- package/dist/src/agent/skills/installer.js +2 -2
- package/dist/src/agent/skills/managed-store.js +1 -1
- package/dist/src/agent/skills/skill-manage-ops.js +3 -2
- package/dist/src/agent/skills/skill-manage-ops.js.map +1 -1
- package/dist/src/agent/skills/skill-manager.js +1 -1
- package/dist/src/agent/skills/skill-view-path.js +1 -1
- package/dist/src/agent/skills/test-framework.js +1 -1
- package/dist/src/agent/skills/types.d.ts +1 -1
- package/dist/src/agent/skills/watcher.js +2 -5
- package/dist/src/agent/skills/watcher.js.map +1 -1
- package/dist/src/agent/skills/workspace-skills-dir.d.ts +1 -0
- package/dist/src/agent/skills/workspace-skills-dir.js +11 -0
- package/dist/src/agent/skills/workspace-skills-dir.js.map +1 -0
- package/dist/src/agent/starter-agents.js +1 -1
- package/dist/src/agent/tool-manuals/browser.d.ts +1 -1
- package/dist/src/agent/tool-manuals/browser.js +62 -3
- package/dist/src/agent/tool-manuals/browser.js.map +1 -1
- package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +4 -1
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +13 -4
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
- package/dist/src/agent/tools/browser/tool/schemas.d.ts +0 -2
- package/dist/src/agent/tools/browser/tool/schemas.js +1 -2
- package/dist/src/agent/tools/browser/tool/schemas.js.map +1 -1
- package/dist/src/agent/tools/dreaming-tool.js +1 -1
- package/dist/src/agent/tools/factory.js +1 -10
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/find.js +1 -1
- package/dist/src/agent/tools/grep.js +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +1 -1
- package/dist/src/agent/tools/skill-manage-tool.js +2 -2
- package/dist/src/agent/tools/skill-manage-tool.js.map +1 -1
- package/dist/src/agent/tools/workflow-tool.js +1 -1
- package/dist/src/agent/workflow/catalog.js +1 -1
- package/dist/src/agent/workflow/snapshot.d.ts +10 -0
- package/dist/src/agent/workflow/snapshot.js +136 -1
- package/dist/src/agent/workflow/snapshot.js.map +1 -1
- package/dist/src/agent/workflow/subagent-runner.js +18 -1
- package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
- package/dist/src/ai-assist/text-assist.js +1 -1
- package/dist/src/auth/credentials.js +2 -2
- package/dist/src/auth/profiles/store.js +2 -2
- package/dist/src/auth/sync-provider-auth.js +1 -1
- package/dist/src/browser/actions/extension-registry-bridge.js +91 -7
- package/dist/src/browser/actions/extension-registry-bridge.js.map +1 -1
- package/dist/src/browser/actions/registry.js +383 -7
- package/dist/src/browser/actions/registry.js.map +1 -1
- package/dist/src/browser/actions/types.d.ts +11 -3
- package/dist/src/browser/cache-dir-policy.js +1 -1
- package/dist/src/browser/cdp-local-launcher.js +2 -2
- package/dist/src/browser/index.js +2 -2
- package/dist/src/browser/pipeline/output.d.ts +18 -16
- package/dist/src/browser/pipeline/output.js +28 -20
- package/dist/src/browser/pipeline/output.js.map +1 -1
- package/dist/src/browser/pipeline/runner.d.ts +7 -14
- package/dist/src/browser/pipeline/runner.js +349 -102
- package/dist/src/browser/pipeline/runner.js.map +1 -1
- package/dist/src/browser/pipeline/schema.d.ts +1 -0
- package/dist/src/browser/pipeline/schema.js +35 -58
- package/dist/src/browser/pipeline/schema.js.map +1 -1
- package/dist/src/browser/pipeline/source.d.ts +2 -0
- package/dist/src/browser/pipeline/source.js +10 -1
- package/dist/src/browser/pipeline/source.js.map +1 -1
- package/dist/src/browser/pipeline/template.d.ts +10 -2
- package/dist/src/browser/pipeline/template.js +50 -8
- package/dist/src/browser/pipeline/template.js.map +1 -1
- package/dist/src/browser/providers/browser-ext-install.js +4 -4
- package/dist/src/browser/providers/cloakbrowser.js +5 -5
- package/dist/src/browser/providers/playwright-doctor.js +1 -1
- package/dist/src/browser/stealth.js +1 -1
- package/dist/src/channels/catalog/channel-catalog-service.d.ts +2 -1
- package/dist/src/channels/catalog/channel-catalog-service.js +133 -16
- package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -1
- package/dist/src/channels/catalog/channel-catalog-types.d.ts +13 -0
- package/dist/src/channels/outbound/persist-store.js +1 -1
- package/dist/src/channels/pairing/allow-from-file.js +1 -1
- package/dist/src/channels/pairing/pairing-store.js +2 -2
- package/dist/src/chat-commands/agent-edit.js +2 -2
- package/dist/src/chat-commands/builtins/config.js +5 -7
- package/dist/src/chat-commands/builtins/config.js.map +1 -1
- package/dist/src/chat-commands/context.d.ts +5 -0
- package/dist/src/chat-commands/context.js +18 -9
- package/dist/src/chat-commands/context.js.map +1 -1
- package/dist/src/chat-commands/index.d.ts +1 -1
- package/dist/src/chat-commands/index.js +2 -2
- package/dist/src/chat-commands/index.js.map +1 -1
- package/dist/src/chat-commands/processor.js +22 -21
- package/dist/src/chat-commands/processor.js.map +1 -1
- package/dist/src/chat-commands/session-key.d.ts +3 -15
- package/dist/src/chat-commands/session-key.js +3 -49
- package/dist/src/chat-commands/session-key.js.map +1 -1
- package/dist/src/chat-commands/types.d.ts +4 -0
- package/dist/src/cli/commands/browser-cli-helpers.js +11 -5
- package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
- package/dist/src/cli/commands/config.js +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.js +14 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
- package/dist/src/cli/commands/doctor/checks/session-integrity.js +8 -8
- package/dist/src/cli/commands/doctor/checks/session-integrity.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
- package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
- package/dist/src/cli/commands/extension-create.js +1 -1
- package/dist/src/cli/commands/extension-dev.js +2 -2
- package/dist/src/cli/commands/extension-marketplace.js +2 -2
- package/dist/src/cli/commands/extension-pack.js +2 -2
- package/dist/src/cli/commands/extension.js +3 -3
- package/dist/src/cli/commands/gateway/logs.js +1 -1
- package/dist/src/cli/commands/image.js +1 -1
- package/dist/src/cli/commands/init.js +2 -2
- package/dist/src/cli/commands/models.js +1 -1
- package/dist/src/cli/commands/skills-test.js +1 -1
- package/dist/src/cli/templates.js +1 -1
- package/dist/src/cli/utils/gateway-client.js +1 -1
- package/dist/src/cli/utils/init-workspace-core.js +2 -2
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/config/agent-typed-models.js +1 -1
- package/dist/src/config/gateway-bind.js +1 -1
- package/dist/src/config/index.js +7 -7
- package/dist/src/config/loader.js +4 -4
- package/dist/src/config/models-json.js +2 -2
- package/dist/src/config/paths-state.js +1 -1
- package/dist/src/config/paths.js +1 -1
- package/dist/src/config/profile.js +1 -1
- package/dist/src/config/reload.js +1 -1
- package/dist/src/config/rules.js +5 -0
- package/dist/src/config/rules.js.map +1 -1
- package/dist/src/config/schema.d.ts +8 -0
- package/dist/src/config/schema.js +7 -0
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/web-patch.d.ts +1 -0
- package/dist/src/config/web-patch.js +1 -0
- package/dist/src/config/web-patch.js.map +1 -1
- package/dist/src/config/workspace-path.js +1 -1
- package/dist/src/connectors/builtin-catalog.js +180 -1
- package/dist/src/connectors/builtin-catalog.js.map +1 -1
- package/dist/src/connectors/health.js +18 -9
- package/dist/src/connectors/health.js.map +1 -1
- package/dist/src/connectors/types.d.ts +19 -0
- package/dist/src/connectors/usage.js +12 -4
- package/dist/src/connectors/usage.js.map +1 -1
- package/dist/src/cron/executor.js +1 -1
- package/dist/src/cron/service.js +1 -1
- package/dist/src/daemon/constants.js +1 -1
- package/dist/src/daemon/install-plan.js +2 -2
- package/dist/src/daemon/launchd.js +2 -2
- package/dist/src/daemon/schtasks.js +2 -2
- package/dist/src/daemon/systemd.js +2 -2
- package/dist/src/extensions/bundle-mcp.js +1 -1
- package/dist/src/extensions/discover-extensions.js +2 -2
- package/dist/src/extensions/health.js +1 -1
- package/dist/src/extensions/install.js +2 -2
- package/dist/src/extensions/loader.js +2 -2
- package/dist/src/extensions/lockfile.js +3 -3
- package/dist/src/extensions/security.js +1 -1
- package/dist/src/extensions/types/tui.d.ts +2 -0
- package/dist/src/extensions/update.js +2 -2
- package/dist/src/gateway/agents-admin.js +2 -2
- package/dist/src/gateway/file-path-classifier.js +2 -2
- package/dist/src/gateway/heartbeat/service.js +13 -1
- package/dist/src/gateway/heartbeat/service.js.map +1 -1
- package/dist/src/gateway/hono/app.js +18 -5
- package/dist/src/gateway/hono/app.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -1
- package/dist/src/gateway/hono/lib/config-payload.js +7 -4
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/lib/extension-store.js +2 -2
- package/dist/src/gateway/hono/lib/static-ui.js +2 -2
- package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +4 -0
- package/dist/src/gateway/hono/middleware/strict-rate-limit.js +19 -5
- package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +1 -1
- package/dist/src/gateway/hono/oauth-async.js +1 -1
- package/dist/src/gateway/hono/routes/agent-stream.js +6 -6
- package/dist/src/gateway/hono/routes/agent-stream.js.map +1 -1
- package/dist/src/gateway/hono/routes/agents.js +1 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
- package/dist/src/gateway/hono/routes/channels.js +18 -14
- package/dist/src/gateway/hono/routes/channels.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +1 -1
- package/dist/src/gateway/hono/routes/config-patch/gateway.js +6 -0
- package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
- package/dist/src/gateway/hono/routes/deps.d.ts +1 -0
- package/dist/src/gateway/hono/routes/dreaming.js +1 -1
- package/dist/src/gateway/hono/routes/goals.js +16 -3
- package/dist/src/gateway/hono/routes/goals.js.map +1 -1
- package/dist/src/gateway/hono/routes/host-fs.js +2 -2
- package/dist/src/gateway/hono/routes/logs.js +1 -0
- package/dist/src/gateway/hono/routes/logs.js.map +1 -1
- package/dist/src/gateway/hono/routes/mcp.js +27 -8
- package/dist/src/gateway/hono/routes/mcp.js.map +1 -1
- package/dist/src/gateway/hono/routes/models.js +1 -1
- package/dist/src/gateway/hono/routes/notes.js +14 -2
- package/dist/src/gateway/hono/routes/notes.js.map +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +62 -4
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/routes/shares.js +1 -1
- package/dist/src/gateway/hono/routes/workflows.js +1 -1
- package/dist/src/gateway/hono/routes/workspace.js +5 -68
- package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
- package/dist/src/gateway/hono/sse.d.ts +2 -2
- package/dist/src/gateway/hono/sse.js +7 -15
- package/dist/src/gateway/hono/sse.js.map +1 -1
- package/dist/src/gateway/lock.js +3 -3
- package/dist/src/gateway/ports.js +1 -1
- package/dist/src/gateway/rate-limit/buckets.d.ts +3 -0
- package/dist/src/gateway/rate-limit/buckets.js +12 -0
- package/dist/src/gateway/rate-limit/buckets.js.map +1 -1
- package/dist/src/gateway/resolve-webchat-session-key.d.ts +2 -6
- package/dist/src/gateway/resolve-webchat-session-key.js +5 -31
- package/dist/src/gateway/resolve-webchat-session-key.js.map +1 -1
- package/dist/src/gateway/service/agent-runner.d.ts +2 -3
- package/dist/src/gateway/service/agent-runner.js +9 -22
- package/dist/src/gateway/service/agent-runner.js.map +1 -1
- package/dist/src/gateway/service/config-coordinator.js +1 -1
- package/dist/src/gateway/service/marketplace-service.js +2 -2
- package/dist/src/gateway/service/run-gateway-agent.js +9 -7
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
- package/dist/src/gateway/service/sessions-api.d.ts +9 -0
- package/dist/src/gateway/service/sessions-api.js +11 -0
- package/dist/src/gateway/service/sessions-api.js.map +1 -1
- package/dist/src/gateway/service.d.ts +1 -1
- package/dist/src/gateway/service.js +23 -9
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/gateway/workspace-file-search.d.ts +9 -0
- package/dist/src/gateway/workspace-file-search.js +76 -0
- package/dist/src/gateway/workspace-file-search.js.map +1 -0
- package/dist/src/gateway/workspace-fs-file-list.js +1 -1
- package/dist/src/goals/goal-notifications.d.ts +2 -0
- package/dist/src/goals/goal-notifications.js +16 -11
- package/dist/src/goals/goal-notifications.js.map +1 -1
- package/dist/src/goals/goal-service.js +1 -6
- package/dist/src/goals/goal-service.js.map +1 -1
- package/dist/src/goals/goal-workflow-judge.js +2 -2
- package/dist/src/i18n/goals-bundle.js +1 -1
- package/dist/src/i18n/index.js +1 -1
- package/dist/src/i18n/share-tool-bundle.js +2 -2
- package/dist/src/infra/brew.js +1 -1
- package/dist/src/infra/package-json.js +1 -1
- package/dist/src/infra/package-update-steps.js +1 -1
- package/dist/src/infra/path-env.js +2 -2
- package/dist/src/infra/restart.js +1 -1
- package/dist/src/infra/stable-node-path.js +1 -1
- package/dist/src/infra/update-check.js +1 -1
- package/dist/src/infra/update-global.js +1 -1
- package/dist/src/infra/update-lock.js +2 -2
- package/dist/src/infra/update-restart.js +1 -1
- package/dist/src/infra/update-runner.js +1 -1
- package/dist/src/infra/update-startup.js +1 -1
- package/dist/src/infra/write-file-atomic.js +2 -2
- package/dist/src/media/store.js +1 -1
- package/dist/src/notes/agent-context.js +1 -1
- package/dist/src/notes/service.js +1 -1
- package/dist/src/notes/store.js +2 -2
- package/dist/src/project-trust/trust-store.js +4 -2
- package/dist/src/project-trust/trust-store.js.map +1 -1
- package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
- package/dist/src/providers/index.js +1 -1
- package/dist/src/providers/model-registry.js +4 -4
- package/dist/src/session/index.d.ts +1 -1
- package/dist/src/session/index.js +2 -2
- package/dist/src/session/init-session-turn.js +7 -10
- package/dist/src/session/init-session-turn.js.map +1 -1
- package/dist/src/session/manager.d.ts +5 -1
- package/dist/src/session/manager.js +5 -2
- package/dist/src/session/manager.js.map +1 -1
- package/dist/src/session/reset-type.d.ts +0 -2
- package/dist/src/session/reset-type.js +3 -9
- package/dist/src/session/reset-type.js.map +1 -1
- package/dist/src/session/resolve-session.js +10 -21
- package/dist/src/session/resolve-session.js.map +1 -1
- package/dist/src/session/session-title.js +2 -2
- package/dist/src/session/store.d.ts +11 -3
- package/dist/src/session/store.js +30 -14
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/types.d.ts +2 -4
- package/dist/src/session/types.js.map +1 -1
- package/dist/src/share/share-auto.js +2 -2
- package/dist/src/share/share-store.js +3 -3
- package/dist/src/share/share-thumbnail.js +2 -2
- package/dist/src/share/share-zip.js +1 -1
- package/dist/src/share/site-share-store.js +3 -3
- package/dist/src/share/site-static-serve.js +1 -1
- package/dist/src/storage/sqlite/connection.js +1 -1
- package/dist/src/storage/sqlite/index.d.ts +2 -2
- package/dist/src/storage/sqlite/index.js +3 -3
- package/dist/src/storage/sqlite/memory-index-repository.js +2 -2
- package/dist/src/storage/sqlite/migrations/010_session_id_identity.sql +30 -0
- package/dist/src/storage/sqlite/migrations/discover.js +1 -1
- package/dist/src/storage/sqlite/migrations/runner.d.ts +2 -2
- package/dist/src/storage/sqlite/migrations/runner.js +5 -5
- package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +2 -2
- package/dist/src/storage/sqlite/row-mappers.d.ts +4 -4
- package/dist/src/storage/sqlite/row-mappers.js +11 -14
- package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
- package/dist/src/storage/sqlite/schema.js +4 -4
- package/dist/src/storage/sqlite/schema.js.map +1 -1
- package/dist/src/storage/sqlite/schema.sql +37 -10
- package/dist/src/storage/sqlite/session-metadata.d.ts +2 -7
- package/dist/src/storage/sqlite/session-metadata.js +18 -72
- package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
- package/dist/src/storage/sqlite/session-repository.d.ts +6 -5
- package/dist/src/storage/sqlite/session-repository.js +34 -40
- package/dist/src/storage/sqlite/session-repository.js.map +1 -1
- package/dist/src/storage/sqlite/transcript-repository.d.ts +2 -2
- package/dist/src/storage/sqlite/transcript-repository.js +52 -52
- package/dist/src/storage/sqlite/transcript-repository.js.map +1 -1
- package/dist/src/tui/backends/embedded-backend.d.ts +18 -4
- package/dist/src/tui/backends/embedded-backend.js +100 -1
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.d.ts +5 -1
- package/dist/src/tui/backends/gateway-sse-backend.js +45 -2
- package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
- package/dist/src/tui/clipboard-image.js +3 -3
- package/dist/src/tui/components/chat-log.d.ts +2 -0
- package/dist/src/tui/components/chat-log.js +19 -0
- package/dist/src/tui/components/chat-log.js.map +1 -1
- package/dist/src/tui/extension-host/autocomplete.d.ts +3 -2
- package/dist/src/tui/extension-host/autocomplete.js +29 -12
- package/dist/src/tui/extension-host/autocomplete.js.map +1 -1
- package/dist/src/tui/extension-host/load-extensions.js +1 -1
- package/dist/src/tui/extension-host/runtime.d.ts +12 -0
- package/dist/src/tui/extension-host/runtime.js +6 -4
- package/dist/src/tui/extension-host/runtime.js.map +1 -1
- package/dist/src/tui/theme-manager.js +1 -1
- package/dist/src/tui/tui-backend.d.ts +23 -0
- package/dist/src/tui/tui-command-formatters.js +4 -4
- package/dist/src/tui/tui-commands.d.ts +16 -3
- package/dist/src/tui/tui-commands.js +134 -27
- package/dist/src/tui/tui-commands.js.map +1 -1
- package/dist/src/tui/tui-file-autocomplete.d.ts +5 -0
- package/dist/src/tui/tui-file-autocomplete.js +26 -0
- package/dist/src/tui/tui-file-autocomplete.js.map +1 -0
- package/dist/src/tui/tui-keybindings-file.js +1 -1
- package/dist/src/tui/tui-picker-overlay.js +1 -1
- package/dist/src/tui/tui-scoped-models.js +2 -2
- package/dist/src/tui/tui-settings.js +1 -1
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/dist/src/tui/tui-startup-text.js +1 -1
- package/dist/src/tui/tui-startup-text.js.map +1 -1
- package/dist/src/tui/tui.js +106 -17
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/tunnel/frpc-binary.js +4 -4
- package/dist/src/tunnel/frpc-config.js +1 -1
- package/dist/src/tunnel/frpc-extract.js +1 -1
- package/dist/src/tunnel/tunnel-state.js +1 -1
- package/dist/src/utils/logger/audit.js +1 -1
- package/dist/src/utils/logger/context.d.ts +2 -2
- package/dist/src/utils/logger/context.js +2 -1
- package/dist/src/utils/logger/context.js.map +1 -1
- package/dist/src/utils/logger/log-store.js +2 -1
- package/dist/src/utils/logger/log-store.js.map +1 -1
- package/dist/src/utils/logger/pino-record.js +3 -0
- package/dist/src/utils/logger/pino-record.js.map +1 -1
- package/dist/src/utils/logger/rotation.js +1 -1
- package/dist/src/utils/logger/streams.js +1 -1
- package/dist/src/utils/logger/types.d.ts +5 -0
- package/dist/src/utils/logger/types.js.map +1 -1
- package/dist/src/voice/tts/audio.js +1 -1
- package/dist/src/voice/tts/providers/edge-speech.js +2 -2
- package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
- package/dist/src/workflows/service/workflow-run-service.js +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js +13 -1
- package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
- package/dist/src/workflows/store/event-store.js +1 -1
- package/dist/src/workflows/store/run-store.js +1 -1
- package/package.json +1 -1
- package/dist/gateway/static/root/assets/agent-browser-settings-page-rGbKc2Hh.js +0 -6
- package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-CtwVbjOA.js +0 -1
- package/dist/gateway/static/root/assets/agents-CCBmGcwc.js +0 -71
- package/dist/gateway/static/root/assets/apps-page-xwCsJS15.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-C044DcYk.js +0 -1
- package/dist/gateway/static/root/assets/connectors-settings-8VEWUOTj.js +0 -2
- package/dist/gateway/static/root/assets/cron-page-DqmNGNOy.js +0 -3
- package/dist/gateway/static/root/assets/goal-detail-page-bv0VRDaf.js +0 -1
- package/dist/gateway/static/root/assets/goals-page-1Ywnt4Cb.js +0 -2
- package/dist/gateway/static/root/assets/goals-settings-ceEBjnfc.js +0 -1
- package/dist/gateway/static/root/assets/index-Cxm6xsps.js +0 -122
- package/dist/gateway/static/root/assets/index-b_R4tKqt.css +0 -1
- package/dist/gateway/static/root/assets/logs-page-B_wrxhee.js +0 -2
- package/dist/gateway/static/root/assets/messages-CkT-lcgP.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-panel-D0JDSbNu.js +0 -2
- package/dist/gateway/static/root/assets/note-detail-page-DpFV-EO6.js +0 -2
- package/dist/gateway/static/root/assets/notes-page-CdkjTch8.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-DSYVAi96.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-CenkcVjF.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-D9sva86V.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-DL35U0x0.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-Ctwbp9Er.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-DIM3JNsr.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-DAlNaNzL.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-CLrHVzAt.js +0 -2
- package/dist/gateway/static/root/assets/voice-api-key-field-vYAO71Gn.js +0 -1
- package/dist/gateway/static/root/assets/workflow-page.utils-sgHjOXOm.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-DYyOTmFx.js +0 -18
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
|
-
import { init_session_key, parseSessionKey } from "../routing/session-key.js";
|
|
4
3
|
import { GoalService } from "./goal-service.js";
|
|
5
4
|
//#region src/goals/goal-notifications.ts
|
|
6
|
-
init_session_key();
|
|
7
5
|
init_logger();
|
|
8
6
|
const log = createLogger("GoalNotifications");
|
|
9
7
|
function eventForQueueStatus(status) {
|
|
@@ -88,7 +86,7 @@ var GoalNotificationService = class {
|
|
|
88
86
|
const policy = this.opts.getConfig().goals?.notifications;
|
|
89
87
|
if (!policy?.enabled) return;
|
|
90
88
|
if (!policy.events.includes(event)) return;
|
|
91
|
-
const targets = this.resolveTargets(event, goal);
|
|
89
|
+
const targets = await this.resolveTargets(event, goal);
|
|
92
90
|
if (targets.length === 0) return;
|
|
93
91
|
const text = formatGoalNotification(event, goal, { queueItem: opts?.queueItem });
|
|
94
92
|
for (const target of targets) {
|
|
@@ -104,18 +102,25 @@ var GoalNotificationService = class {
|
|
|
104
102
|
});
|
|
105
103
|
}
|
|
106
104
|
}
|
|
107
|
-
resolveTargets(event, goal) {
|
|
105
|
+
async resolveTargets(event, goal) {
|
|
108
106
|
const policy = this.opts.getConfig().goals?.notifications;
|
|
109
107
|
if (!policy?.enabled) return [];
|
|
110
108
|
const byKey = /* @__PURE__ */ new Map();
|
|
111
|
-
if (policy.includeLinkedSessions !== false && goal.activeSessionKey) {
|
|
112
|
-
const
|
|
113
|
-
|
|
109
|
+
if (policy.includeLinkedSessions !== false && goal.activeSessionKey && this.opts.getSessionMetadata) {
|
|
110
|
+
const routing = (await this.opts.getSessionMetadata(goal.activeSessionKey).catch((err) => {
|
|
111
|
+
log.warn({
|
|
112
|
+
err,
|
|
113
|
+
sessionKey: goal.activeSessionKey,
|
|
114
|
+
goalId: goal.id
|
|
115
|
+
}, "Failed to load linked session metadata for goal notification");
|
|
116
|
+
return null;
|
|
117
|
+
}))?.routing;
|
|
118
|
+
if (routing && policy.channels.includes(routing.source)) {
|
|
114
119
|
const target = {
|
|
115
|
-
channel:
|
|
116
|
-
chatId:
|
|
117
|
-
accountId:
|
|
118
|
-
...
|
|
120
|
+
channel: routing.source,
|
|
121
|
+
chatId: routing.peerId,
|
|
122
|
+
accountId: routing.accountId,
|
|
123
|
+
...routing.threadId ? { threadId: routing.threadId } : {}
|
|
119
124
|
};
|
|
120
125
|
byKey.set(targetKey(target), target);
|
|
121
126
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"goal-notifications.js","names":[],"sources":["../../../src/goals/goal-notifications.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\nimport { parseSessionKey } from '../routing/session-key.js';\nimport { createLogger } from '../utils/logger.js';\n\nimport { GoalService } from './goal-service.js';\nimport type { GoalWithDetails } from './types.js';\nimport type { GoalQueueItemSnapshot } from './goal-queue-types.js';\n\nconst log = createLogger('GoalNotifications');\n\nexport type GoalNotificationEvent =\n | 'done'\n | 'blocked'\n | 'needs_input'\n | 'queue_failed'\n | 'queue_retry'\n | 'queue_succeeded'\n | 'queue_skipped';\n\nexport interface GoalNotificationTarget {\n channel: string;\n chatId: string;\n accountId?: string;\n threadId?: string | number;\n silent?: boolean;\n}\n\nexport interface GoalNotificationSendInput extends GoalNotificationTarget {\n text: string;\n}\n\nexport interface GoalNotificationServiceOptions {\n getConfig: () => Config;\n send: (input: GoalNotificationSendInput) => Promise<void>;\n}\n\nfunction eventForQueueStatus(status: GoalQueueItemSnapshot['status']): GoalNotificationEvent | null {\n if (status === 'failed') return 'queue_failed';\n if (status === 'retry_waiting') return 'queue_retry';\n if (status === 'succeeded') return 'queue_succeeded';\n if (status === 'skipped') return 'queue_skipped';\n return null;\n}\n\nfunction eventForGoalStatus(status: GoalWithDetails['status']): GoalNotificationEvent | null {\n if (status === 'done' || status === 'blocked' || status === 'needs_input') return status;\n return null;\n}\n\nfunction targetKey(target: GoalNotificationTarget): string {\n return [\n target.channel,\n target.chatId,\n target.accountId ?? '',\n target.threadId ?? '',\n ].join('\\u0000');\n}\n\nfunction formatGoalNotification(event: GoalNotificationEvent, goal: GoalWithDetails, opts?: {\n queueItem?: GoalQueueItemSnapshot;\n}): string {\n const labels: Record<GoalNotificationEvent, string> = {\n done: 'Goal completed',\n blocked: 'Goal blocked',\n needs_input: 'Goal needs input',\n queue_failed: 'Goal run failed',\n queue_retry: 'Goal run retry scheduled',\n queue_succeeded: 'Goal run finished',\n queue_skipped: 'Goal run skipped',\n };\n const lines = [`${labels[event]}: ${goal.title}`];\n if (goal.blockedReason) lines.push(`Reason: ${goal.blockedReason}`);\n if (goal.nextAction) lines.push(`Next: ${goal.nextAction}`);\n if (goal.latestRun?.reason && goal.latestRun.reason !== goal.blockedReason) {\n lines.push(`Run: ${goal.latestRun.reason}`);\n }\n if (opts?.queueItem?.lastError) lines.push(`Queue: ${opts.queueItem.lastError}`);\n const progress = goal.checklist.length\n ? goal.checklist.filter((it) => it.status === 'completed' || it.status === 'impossible').length\n : 0;\n if (goal.checklist.length) lines.push(`Checklist: ${progress}/${goal.checklist.length}`);\n lines.push(`Turns: ${goal.turnsUsed}/${goal.maxTurns}`);\n return lines.join('\\n');\n}\n\nexport class GoalNotificationService {\n private readonly goals = new GoalService();\n private readonly sentKeys = new Set<string>();\n\n constructor(private readonly opts: GoalNotificationServiceOptions) {}\n\n handleGatewayEvent(type: string, payload: unknown): void {\n if (type === 'goal.queue.updated') {\n void this.handleQueueUpdated(payload).catch((err) => {\n log.warn({ err }, 'Goal queue notification failed');\n });\n return;\n }\n if (type === 'goal.status.updated') {\n void this.handleStatusUpdated(payload).catch((err) => {\n log.warn({ err }, 'Goal status notification failed');\n });\n }\n }\n\n private async handleQueueUpdated(payload: unknown): Promise<void> {\n const item = this.parseQueueItem(payload);\n if (!item) return;\n const event = eventForQueueStatus(item.status);\n if (!event) return;\n const goal = this.goals.get(item.goalId);\n if (!goal) return;\n await this.notify(event, goal, { queueItem: item, eventKey: `${item.id}:${item.status}:${item.attempts}` });\n }\n\n private async handleStatusUpdated(payload: unknown): Promise<void> {\n if (!payload || typeof payload !== 'object') return;\n const rec = payload as { goal?: unknown; status?: unknown; goalId?: unknown; previousStatus?: unknown };\n const goal =\n this.isGoal(rec.goal)\n ? rec.goal\n : typeof rec.goalId === 'string'\n ? this.goals.get(rec.goalId)\n : null;\n if (!goal) return;\n const status = typeof rec.status === 'string' ? rec.status : goal.status;\n const event = eventForGoalStatus(status as GoalWithDetails['status']);\n if (!event) return;\n if (rec.previousStatus === status) return;\n await this.notify(event, goal, { eventKey: `${goal.id}:${event}:${goal.updatedAt}` });\n }\n\n private async notify(\n event: GoalNotificationEvent,\n goal: GoalWithDetails,\n opts?: { queueItem?: GoalQueueItemSnapshot; eventKey?: string },\n ): Promise<void> {\n const policy = this.opts.getConfig().goals?.notifications;\n if (!policy?.enabled) return;\n if (!policy.events.includes(event)) return;\n\n const targets = this.resolveTargets(event, goal);\n if (targets.length === 0) return;\n\n const text = formatGoalNotification(event, goal, { queueItem: opts?.queueItem });\n for (const target of targets) {\n const dedupeKey = `${opts?.eventKey ?? `${goal.id}:${event}`}:${targetKey(target)}`;\n if (this.sentKeys.has(dedupeKey)) continue;\n this.sentKeys.add(dedupeKey);\n await this.opts.send({ ...target, text }).catch((err) => {\n this.sentKeys.delete(dedupeKey);\n throw err;\n });\n }\n }\n\n private resolveTargets(event: GoalNotificationEvent, goal: GoalWithDetails): GoalNotificationTarget[] {\n const policy = this.opts.getConfig().goals?.notifications;\n if (!policy?.enabled) return [];\n const byKey = new Map<string, GoalNotificationTarget>();\n\n if (policy.includeLinkedSessions !== false && goal.activeSessionKey) {\n const parsed = parseSessionKey(goal.activeSessionKey);\n const eligible = parsed && policy.channels.includes(parsed.source);\n if (eligible) {\n const target: GoalNotificationTarget = {\n channel: parsed.source,\n chatId: parsed.peerId,\n accountId: parsed.accountId,\n ...(parsed.threadId ? { threadId: parsed.threadId } : {}),\n };\n byKey.set(targetKey(target), target);\n }\n }\n\n for (const target of policy.targets ?? []) {\n const events = target.events;\n if (events && !events.includes(event)) continue;\n const normalized: GoalNotificationTarget = {\n channel: target.channel,\n chatId: target.chatId,\n ...(target.accountId ? { accountId: target.accountId } : {}),\n ...(target.threadId != null ? { threadId: target.threadId } : {}),\n ...(target.silent != null ? { silent: target.silent } : {}),\n };\n byKey.set(targetKey(normalized), normalized);\n }\n\n return [...byKey.values()];\n }\n\n private parseQueueItem(payload: unknown): GoalQueueItemSnapshot | null {\n if (!payload || typeof payload !== 'object') return null;\n const item = (payload as { item?: unknown }).item;\n if (!item || typeof item !== 'object') return null;\n const rec = item as Partial<GoalQueueItemSnapshot>;\n if (typeof rec.id !== 'string' || typeof rec.goalId !== 'string' || typeof rec.status !== 'string') return null;\n return rec as GoalQueueItemSnapshot;\n }\n\n private isGoal(value: unknown): value is GoalWithDetails {\n if (!value || typeof value !== 'object') return false;\n const rec = value as Partial<GoalWithDetails>;\n return typeof rec.id === 'string' && typeof rec.title === 'string' && Array.isArray(rec.checklist);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"goal-notifications.js","names":[],"sources":["../../../src/goals/goal-notifications.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\nimport { createLogger } from '../utils/logger.js';\nimport type { SessionMetadata } from '../session/index.js';\n\nimport { GoalService } from './goal-service.js';\nimport type { GoalWithDetails } from './types.js';\nimport type { GoalQueueItemSnapshot } from './goal-queue-types.js';\n\nconst log = createLogger('GoalNotifications');\n\nexport type GoalNotificationEvent =\n | 'done'\n | 'blocked'\n | 'needs_input'\n | 'queue_failed'\n | 'queue_retry'\n | 'queue_succeeded'\n | 'queue_skipped';\n\nexport interface GoalNotificationTarget {\n channel: string;\n chatId: string;\n accountId?: string;\n threadId?: string | number;\n silent?: boolean;\n}\n\nexport interface GoalNotificationSendInput extends GoalNotificationTarget {\n text: string;\n}\n\nexport interface GoalNotificationServiceOptions {\n getConfig: () => Config;\n getSessionMetadata?: (sessionKey: string) => Promise<SessionMetadata | null>;\n send: (input: GoalNotificationSendInput) => Promise<void>;\n}\n\nfunction eventForQueueStatus(status: GoalQueueItemSnapshot['status']): GoalNotificationEvent | null {\n if (status === 'failed') return 'queue_failed';\n if (status === 'retry_waiting') return 'queue_retry';\n if (status === 'succeeded') return 'queue_succeeded';\n if (status === 'skipped') return 'queue_skipped';\n return null;\n}\n\nfunction eventForGoalStatus(status: GoalWithDetails['status']): GoalNotificationEvent | null {\n if (status === 'done' || status === 'blocked' || status === 'needs_input') return status;\n return null;\n}\n\nfunction targetKey(target: GoalNotificationTarget): string {\n return [\n target.channel,\n target.chatId,\n target.accountId ?? '',\n target.threadId ?? '',\n ].join('\\u0000');\n}\n\nfunction formatGoalNotification(event: GoalNotificationEvent, goal: GoalWithDetails, opts?: {\n queueItem?: GoalQueueItemSnapshot;\n}): string {\n const labels: Record<GoalNotificationEvent, string> = {\n done: 'Goal completed',\n blocked: 'Goal blocked',\n needs_input: 'Goal needs input',\n queue_failed: 'Goal run failed',\n queue_retry: 'Goal run retry scheduled',\n queue_succeeded: 'Goal run finished',\n queue_skipped: 'Goal run skipped',\n };\n const lines = [`${labels[event]}: ${goal.title}`];\n if (goal.blockedReason) lines.push(`Reason: ${goal.blockedReason}`);\n if (goal.nextAction) lines.push(`Next: ${goal.nextAction}`);\n if (goal.latestRun?.reason && goal.latestRun.reason !== goal.blockedReason) {\n lines.push(`Run: ${goal.latestRun.reason}`);\n }\n if (opts?.queueItem?.lastError) lines.push(`Queue: ${opts.queueItem.lastError}`);\n const progress = goal.checklist.length\n ? goal.checklist.filter((it) => it.status === 'completed' || it.status === 'impossible').length\n : 0;\n if (goal.checklist.length) lines.push(`Checklist: ${progress}/${goal.checklist.length}`);\n lines.push(`Turns: ${goal.turnsUsed}/${goal.maxTurns}`);\n return lines.join('\\n');\n}\n\nexport class GoalNotificationService {\n private readonly goals = new GoalService();\n private readonly sentKeys = new Set<string>();\n\n constructor(private readonly opts: GoalNotificationServiceOptions) {}\n\n handleGatewayEvent(type: string, payload: unknown): void {\n if (type === 'goal.queue.updated') {\n void this.handleQueueUpdated(payload).catch((err) => {\n log.warn({ err }, 'Goal queue notification failed');\n });\n return;\n }\n if (type === 'goal.status.updated') {\n void this.handleStatusUpdated(payload).catch((err) => {\n log.warn({ err }, 'Goal status notification failed');\n });\n }\n }\n\n private async handleQueueUpdated(payload: unknown): Promise<void> {\n const item = this.parseQueueItem(payload);\n if (!item) return;\n const event = eventForQueueStatus(item.status);\n if (!event) return;\n const goal = this.goals.get(item.goalId);\n if (!goal) return;\n await this.notify(event, goal, { queueItem: item, eventKey: `${item.id}:${item.status}:${item.attempts}` });\n }\n\n private async handleStatusUpdated(payload: unknown): Promise<void> {\n if (!payload || typeof payload !== 'object') return;\n const rec = payload as { goal?: unknown; status?: unknown; goalId?: unknown; previousStatus?: unknown };\n const goal =\n this.isGoal(rec.goal)\n ? rec.goal\n : typeof rec.goalId === 'string'\n ? this.goals.get(rec.goalId)\n : null;\n if (!goal) return;\n const status = typeof rec.status === 'string' ? rec.status : goal.status;\n const event = eventForGoalStatus(status as GoalWithDetails['status']);\n if (!event) return;\n if (rec.previousStatus === status) return;\n await this.notify(event, goal, { eventKey: `${goal.id}:${event}:${goal.updatedAt}` });\n }\n\n private async notify(\n event: GoalNotificationEvent,\n goal: GoalWithDetails,\n opts?: { queueItem?: GoalQueueItemSnapshot; eventKey?: string },\n ): Promise<void> {\n const policy = this.opts.getConfig().goals?.notifications;\n if (!policy?.enabled) return;\n if (!policy.events.includes(event)) return;\n\n const targets = await this.resolveTargets(event, goal);\n if (targets.length === 0) return;\n\n const text = formatGoalNotification(event, goal, { queueItem: opts?.queueItem });\n for (const target of targets) {\n const dedupeKey = `${opts?.eventKey ?? `${goal.id}:${event}`}:${targetKey(target)}`;\n if (this.sentKeys.has(dedupeKey)) continue;\n this.sentKeys.add(dedupeKey);\n await this.opts.send({ ...target, text }).catch((err) => {\n this.sentKeys.delete(dedupeKey);\n throw err;\n });\n }\n }\n\n private async resolveTargets(event: GoalNotificationEvent, goal: GoalWithDetails): Promise<GoalNotificationTarget[]> {\n const policy = this.opts.getConfig().goals?.notifications;\n if (!policy?.enabled) return [];\n const byKey = new Map<string, GoalNotificationTarget>();\n\n if (policy.includeLinkedSessions !== false && goal.activeSessionKey && this.opts.getSessionMetadata) {\n const metadata = await this.opts.getSessionMetadata(goal.activeSessionKey).catch((err) => {\n log.warn({ err, sessionKey: goal.activeSessionKey, goalId: goal.id }, 'Failed to load linked session metadata for goal notification');\n return null;\n });\n const routing = metadata?.routing;\n const eligible = routing && policy.channels.includes(routing.source);\n if (eligible) {\n const target: GoalNotificationTarget = {\n channel: routing.source,\n chatId: routing.peerId,\n accountId: routing.accountId,\n ...(routing.threadId ? { threadId: routing.threadId } : {}),\n };\n byKey.set(targetKey(target), target);\n }\n }\n\n for (const target of policy.targets ?? []) {\n const events = target.events;\n if (events && !events.includes(event)) continue;\n const normalized: GoalNotificationTarget = {\n channel: target.channel,\n chatId: target.chatId,\n ...(target.accountId ? { accountId: target.accountId } : {}),\n ...(target.threadId != null ? { threadId: target.threadId } : {}),\n ...(target.silent != null ? { silent: target.silent } : {}),\n };\n byKey.set(targetKey(normalized), normalized);\n }\n\n return [...byKey.values()];\n }\n\n private parseQueueItem(payload: unknown): GoalQueueItemSnapshot | null {\n if (!payload || typeof payload !== 'object') return null;\n const item = (payload as { item?: unknown }).item;\n if (!item || typeof item !== 'object') return null;\n const rec = item as Partial<GoalQueueItemSnapshot>;\n if (typeof rec.id !== 'string' || typeof rec.goalId !== 'string' || typeof rec.status !== 'string') return null;\n return rec as GoalQueueItemSnapshot;\n }\n\n private isGoal(value: unknown): value is GoalWithDetails {\n if (!value || typeof value !== 'object') return false;\n const rec = value as Partial<GoalWithDetails>;\n return typeof rec.id === 'string' && typeof rec.title === 'string' && Array.isArray(rec.checklist);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,11 +1,6 @@
|
|
|
1
|
-
import { init_session_key, parseSessionKey } from "../routing/session-key.js";
|
|
2
1
|
import { defaultMaxTurns } from "../agent/goals/state.js";
|
|
3
2
|
import { GoalStore } from "./goal-store.js";
|
|
4
3
|
//#region src/goals/goal-service.ts
|
|
5
|
-
init_session_key();
|
|
6
|
-
function resolveAgentId(sessionKey, fallback = "main") {
|
|
7
|
-
return parseSessionKey(sessionKey)?.agentId ?? fallback;
|
|
8
|
-
}
|
|
9
4
|
function normalizeTitle(title) {
|
|
10
5
|
const t = title.trim();
|
|
11
6
|
if (!t) throw new Error("Goal title is required");
|
|
@@ -28,7 +23,7 @@ var GoalService = class {
|
|
|
28
23
|
return this.store.create({
|
|
29
24
|
title: normalizeTitle(input.title),
|
|
30
25
|
description: input.description,
|
|
31
|
-
agentId: input.agentId ??
|
|
26
|
+
agentId: input.agentId ?? "main",
|
|
32
27
|
sessionKey,
|
|
33
28
|
priority: input.priority,
|
|
34
29
|
deadlineAt: input.deadlineAt,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"goal-service.js","names":[],"sources":["../../../src/goals/goal-service.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\nimport { defaultMaxTurns } from '../agent/goals/state.js';\nimport { parseSessionKey } from '../routing/session-key.js';\nimport { GoalStore } from './goal-store.js';\nimport type {\n CreateGoalInput,\n Goal,\n GoalChecklistAddedBy,\n GoalChecklistStatus,\n GoalJudgeDecision,\n GoalListQuery,\n GoalSource,\n GoalStatus,\n GoalUiLocale,\n GoalWithDetails,\n} from './types.js';\n\nfunction resolveAgentId(sessionKey: string, fallback = 'main'): string {\n return parseSessionKey(sessionKey)?.agentId ?? fallback;\n}\n\nfunction normalizeTitle(title: string): string {\n const t = title.trim();\n if (!t) throw new Error('Goal title is required');\n return t;\n}\n\nfunction toTerminalStatus(verdict: GoalJudgeDecision['verdict']): GoalStatus {\n if (verdict === 'done') return 'done';\n if (verdict === 'blocked') return 'blocked';\n if (verdict === 'needs_input') return 'needs_input';\n return 'active';\n}\n\nexport class GoalService {\n private readonly store: GoalStore;\n\n constructor(store = new GoalStore()) {\n this.store = store;\n }\n\n create(input: Omit<CreateGoalInput, 'maxTurns' | 'agentId'> & {\n maxTurns?: number;\n agentId?: string;\n config?: Config;\n }): Goal {\n const sessionKey = input.sessionKey;\n const cfg = input.config?.goals;\n return this.store.create({\n title: normalizeTitle(input.title),\n description: input.description,\n agentId: input.agentId ?? (sessionKey ? resolveAgentId(sessionKey) : 'main'),\n sessionKey,\n priority: input.priority,\n deadlineAt: input.deadlineAt,\n judgeModelRef: input.judgeModelRef ?? cfg?.judgeModelRef,\n maxTurns: input.maxTurns ?? defaultMaxTurns(cfg),\n uiLocale: input.uiLocale,\n source: input.source,\n });\n }\n\n get(goalId: string): GoalWithDetails | null {\n const goal = this.store.get(goalId);\n if (!goal) return null;\n return {\n ...goal,\n checklist: this.store.listChecklist(goalId),\n latestRun: this.store.listRuns(goalId, 1)[0],\n };\n }\n\n getActiveForSession(sessionKey: string): GoalWithDetails | null {\n const goal = this.store.getActiveForSession(sessionKey);\n return goal ? this.get(goal.id) : null;\n }\n\n list(query: GoalListQuery = {}): GoalWithDetails[] {\n return this.store.list(query).map((goal) => ({\n ...goal,\n checklist: this.store.listChecklist(goal.id),\n latestRun: this.store.listRuns(goal.id, 1)[0],\n }));\n }\n\n update(goalId: string, patch: Partial<Pick<\n Goal,\n | 'title'\n | 'description'\n | 'priority'\n | 'deadlineAt'\n | 'maxTurns'\n | 'judgeModelRef'\n | 'nextAction'\n | 'blockedReason'\n | 'activeSessionKey'\n | 'uiLocale'\n >>): GoalWithDetails | null {\n const normalized: typeof patch = { ...patch };\n if (typeof normalized.title === 'string') {\n normalized.title = normalizeTitle(normalized.title);\n }\n if (typeof normalized.description === 'string') {\n normalized.description = normalized.description.trim() || undefined;\n }\n if (typeof normalized.judgeModelRef === 'string') {\n normalized.judgeModelRef = normalized.judgeModelRef.trim() || undefined;\n }\n if (typeof normalized.nextAction === 'string') {\n normalized.nextAction = normalized.nextAction.trim() || undefined;\n }\n if (typeof normalized.blockedReason === 'string') {\n normalized.blockedReason = normalized.blockedReason.trim() || undefined;\n }\n if (typeof normalized.maxTurns === 'number') {\n normalized.maxTurns = Math.max(1, Math.min(500, Math.floor(normalized.maxTurns)));\n }\n const goal = this.store.update(goalId, normalized);\n return goal ? this.get(goal.id) : null;\n }\n\n setStatus(goalId: string, status: GoalStatus, opts?: { reason?: string }): GoalWithDetails | null {\n const now = Date.now();\n const goal = this.store.update(goalId, {\n status,\n completedAt: status === 'done' ? now : undefined,\n archivedAt: status === 'archived' ? now : undefined,\n blockedReason: status === 'blocked' || status === 'needs_input' ? opts?.reason : undefined,\n });\n return goal ? this.get(goal.id) : null;\n }\n\n pause(goalId: string, reason = 'user-paused'): GoalWithDetails | null {\n const goal = this.store.update(goalId, {\n status: 'paused',\n blockedReason: reason,\n completedAt: undefined,\n archivedAt: undefined,\n });\n return goal ? this.get(goal.id) : null;\n }\n\n resume(goalId: string): GoalWithDetails | null {\n const goal = this.store.update(goalId, {\n status: 'active',\n blockedReason: undefined,\n completedAt: undefined,\n archivedAt: undefined,\n turnsUsed: 0,\n });\n return goal ? this.get(goal.id) : null;\n }\n\n reopen(goalId: string): GoalWithDetails | null {\n const goal = this.store.update(goalId, {\n status: 'active',\n blockedReason: undefined,\n completedAt: undefined,\n archivedAt: undefined,\n turnsUsed: 0,\n });\n return goal ? this.get(goal.id) : null;\n }\n\n complete(goalId: string): GoalWithDetails | null {\n return this.setStatus(goalId, 'done');\n }\n\n archive(goalId: string): GoalWithDetails | null {\n return this.setStatus(goalId, 'archived');\n }\n\n unarchive(goalId: string): GoalWithDetails | null {\n const goal = this.store.update(goalId, {\n status: 'paused',\n archivedAt: undefined,\n completedAt: undefined,\n blockedReason: undefined,\n });\n return goal ? this.get(goal.id) : null;\n }\n\n attachSession(goalId: string, sessionKey: string): GoalWithDetails | null {\n const goal = this.store.update(goalId, { activeSessionKey: sessionKey });\n return goal ? this.get(goal.id) : null;\n }\n\n updateChecklist(goalId: string, op: {\n type: 'add';\n text: string;\n addedBy?: GoalChecklistAddedBy;\n } | {\n type: 'mark';\n itemId: string;\n status: GoalChecklistStatus;\n evidenceSummary?: string;\n } | {\n type: 'remove';\n itemId: string;\n } | {\n type: 'reset';\n }): GoalWithDetails | null {\n if (op.type === 'add') {\n const text = op.text.trim();\n if (!text) throw new Error('Checklist item text is required');\n this.store.addChecklistItem({ goalId, text, addedBy: op.addedBy ?? 'user' });\n } else if (op.type === 'mark') {\n this.store.updateChecklistItem(op.itemId, {\n status: op.status,\n evidenceSummary: op.evidenceSummary,\n });\n } else if (op.type === 'remove') {\n this.store.removeChecklistItem(op.itemId);\n } else {\n this.store.clearChecklist(goalId);\n }\n return this.get(goalId);\n }\n\n recordJudgeDecision(input: {\n goalId: string;\n sessionKey: string;\n source: GoalSource;\n decision: GoalJudgeDecision;\n }): GoalWithDetails | null {\n const goal = this.store.get(input.goalId);\n if (!goal) return null;\n const nextStatus = toTerminalStatus(input.decision.verdict);\n const turnsUsed = goal.turnsUsed + 1;\n const status = turnsUsed >= goal.maxTurns && nextStatus === 'active' ? 'paused' : nextStatus;\n const reason =\n status === 'paused' && turnsUsed >= goal.maxTurns\n ? `turn budget exhausted (${turnsUsed}/${goal.maxTurns})`\n : input.decision.reason;\n\n const run = this.store.appendRun({\n goalId: input.goalId,\n sessionKey: input.sessionKey,\n source: input.source,\n status: 'succeeded',\n finishedAt: Date.now(),\n verdict: input.decision.verdict,\n reason: input.decision.reason,\n nextAction: input.decision.nextAction,\n assistantPreview: input.decision.assistantPreview,\n checklistProgress: input.decision.checklistProgress,\n confidence: input.decision.confidence,\n missingEvidence: input.decision.missingEvidence,\n userQuestion: input.decision.userQuestion,\n completedChecklistItemIds: input.decision.completedChecklistItemIds,\n });\n\n this.store.update(input.goalId, {\n status,\n turnsUsed,\n currentRunId: run.id,\n nextAction: input.decision.nextAction,\n blockedReason: status === 'blocked' || status === 'needs_input' || status === 'paused' ? reason : undefined,\n completedAt: status === 'done' ? Date.now() : undefined,\n });\n\n return this.get(input.goalId);\n }\n\n syncPostTurnState(input: {\n goalId: string;\n sessionKey: string;\n source: GoalSource;\n status: GoalStatus;\n turnsUsed: number;\n maxTurns: number;\n reason?: string;\n nextAction?: string;\n assistantPreview?: string;\n verdict: 'continue' | 'done' | 'blocked' | 'needs_input' | 'decompose';\n confidence?: number;\n missingEvidence?: string[];\n userQuestion?: string;\n completedChecklistItemIds?: string[];\n checklist?: Array<{\n text: string;\n status: 'pending' | 'completed' | 'impossible';\n addedBy: 'user' | 'judge';\n addedAt?: number;\n completedAt?: number;\n evidenceSummary?: string;\n }>;\n }): GoalWithDetails | null {\n const goal = this.store.get(input.goalId);\n if (!goal) return null;\n if (input.checklist) {\n this.store.replaceChecklist(input.goalId, input.checklist);\n }\n const total = input.checklist?.length ?? this.store.listChecklist(input.goalId).length;\n const done = (input.checklist ?? this.store.listChecklist(input.goalId)).filter(\n (it) => it.status === 'completed' || it.status === 'impossible',\n ).length;\n const run = this.store.appendRun({\n goalId: input.goalId,\n sessionKey: input.sessionKey,\n source: input.source,\n status: 'succeeded',\n finishedAt: Date.now(),\n verdict: input.verdict,\n reason: input.reason,\n nextAction: input.nextAction,\n assistantPreview: input.assistantPreview,\n checklistProgress: total > 0 ? { done, total } : undefined,\n confidence: input.confidence,\n missingEvidence: input.missingEvidence,\n userQuestion: input.userQuestion,\n completedChecklistItemIds: input.completedChecklistItemIds,\n });\n for (const item of input.checklist ?? []) {\n if ((item.status === 'completed' || item.status === 'impossible') && item.evidenceSummary?.trim()) {\n this.store.addEvidence({\n goalId: input.goalId,\n runId: run.id,\n kind: 'message',\n title: `Checklist evidence: ${item.text.slice(0, 80)}`,\n summary: item.evidenceSummary.trim(),\n });\n }\n }\n for (const missing of input.missingEvidence ?? []) {\n if (!missing.trim()) continue;\n this.store.addEvidence({\n goalId: input.goalId,\n runId: run.id,\n kind: 'message',\n title: `Missing evidence: ${missing.slice(0, 80)}`,\n summary: missing,\n });\n }\n if (input.userQuestion?.trim()) {\n this.store.addEvidence({\n goalId: input.goalId,\n runId: run.id,\n kind: 'message',\n title: 'User input requested',\n summary: input.userQuestion.trim(),\n });\n }\n this.store.update(input.goalId, {\n status: input.status,\n turnsUsed: input.turnsUsed,\n maxTurns: input.maxTurns,\n currentRunId: run.id,\n nextAction: input.nextAction,\n blockedReason:\n input.status === 'blocked' || input.status === 'needs_input' || input.status === 'paused'\n ? input.reason\n : undefined,\n completedAt: input.status === 'done' ? Date.now() : undefined,\n });\n return this.get(input.goalId);\n }\n\n listRuns(goalId: string, limit?: number) {\n return this.store.listRuns(goalId, limit);\n }\n\n listRunsForSession(sessionKey: string, limit?: number) {\n return this.store.listRunsForSession(sessionKey, limit);\n }\n\n listEvents(goalId: string, limit?: number) {\n return this.store.listEvents(goalId, limit);\n }\n\n addEvidence(input: Parameters<GoalStore['addEvidence']>[0]) {\n return this.store.addEvidence(input);\n }\n\n listEvidence(goalId: string, limit?: number) {\n return this.store.listEvidence(goalId, limit);\n }\n}\n\nexport function normalizeGoalUiLocale(raw: unknown): GoalUiLocale | undefined {\n return raw === 'en' || raw === 'zh' ? raw : undefined;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"goal-service.js","names":[],"sources":["../../../src/goals/goal-service.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\nimport { defaultMaxTurns } from '../agent/goals/state.js';\nimport { GoalStore } from './goal-store.js';\nimport type {\n CreateGoalInput,\n Goal,\n GoalChecklistAddedBy,\n GoalChecklistStatus,\n GoalJudgeDecision,\n GoalListQuery,\n GoalSource,\n GoalStatus,\n GoalUiLocale,\n GoalWithDetails,\n} from './types.js';\n\nfunction normalizeTitle(title: string): string {\n const t = title.trim();\n if (!t) throw new Error('Goal title is required');\n return t;\n}\n\nfunction toTerminalStatus(verdict: GoalJudgeDecision['verdict']): GoalStatus {\n if (verdict === 'done') return 'done';\n if (verdict === 'blocked') return 'blocked';\n if (verdict === 'needs_input') return 'needs_input';\n return 'active';\n}\n\nexport class GoalService {\n private readonly store: GoalStore;\n\n constructor(store = new GoalStore()) {\n this.store = store;\n }\n\n create(input: Omit<CreateGoalInput, 'maxTurns' | 'agentId'> & {\n maxTurns?: number;\n agentId?: string;\n config?: Config;\n }): Goal {\n const sessionKey = input.sessionKey;\n const cfg = input.config?.goals;\n return this.store.create({\n title: normalizeTitle(input.title),\n description: input.description,\n agentId: input.agentId ?? 'main',\n sessionKey,\n priority: input.priority,\n deadlineAt: input.deadlineAt,\n judgeModelRef: input.judgeModelRef ?? cfg?.judgeModelRef,\n maxTurns: input.maxTurns ?? defaultMaxTurns(cfg),\n uiLocale: input.uiLocale,\n source: input.source,\n });\n }\n\n get(goalId: string): GoalWithDetails | null {\n const goal = this.store.get(goalId);\n if (!goal) return null;\n return {\n ...goal,\n checklist: this.store.listChecklist(goalId),\n latestRun: this.store.listRuns(goalId, 1)[0],\n };\n }\n\n getActiveForSession(sessionKey: string): GoalWithDetails | null {\n const goal = this.store.getActiveForSession(sessionKey);\n return goal ? this.get(goal.id) : null;\n }\n\n list(query: GoalListQuery = {}): GoalWithDetails[] {\n return this.store.list(query).map((goal) => ({\n ...goal,\n checklist: this.store.listChecklist(goal.id),\n latestRun: this.store.listRuns(goal.id, 1)[0],\n }));\n }\n\n update(goalId: string, patch: Partial<Pick<\n Goal,\n | 'title'\n | 'description'\n | 'priority'\n | 'deadlineAt'\n | 'maxTurns'\n | 'judgeModelRef'\n | 'nextAction'\n | 'blockedReason'\n | 'activeSessionKey'\n | 'uiLocale'\n >>): GoalWithDetails | null {\n const normalized: typeof patch = { ...patch };\n if (typeof normalized.title === 'string') {\n normalized.title = normalizeTitle(normalized.title);\n }\n if (typeof normalized.description === 'string') {\n normalized.description = normalized.description.trim() || undefined;\n }\n if (typeof normalized.judgeModelRef === 'string') {\n normalized.judgeModelRef = normalized.judgeModelRef.trim() || undefined;\n }\n if (typeof normalized.nextAction === 'string') {\n normalized.nextAction = normalized.nextAction.trim() || undefined;\n }\n if (typeof normalized.blockedReason === 'string') {\n normalized.blockedReason = normalized.blockedReason.trim() || undefined;\n }\n if (typeof normalized.maxTurns === 'number') {\n normalized.maxTurns = Math.max(1, Math.min(500, Math.floor(normalized.maxTurns)));\n }\n const goal = this.store.update(goalId, normalized);\n return goal ? this.get(goal.id) : null;\n }\n\n setStatus(goalId: string, status: GoalStatus, opts?: { reason?: string }): GoalWithDetails | null {\n const now = Date.now();\n const goal = this.store.update(goalId, {\n status,\n completedAt: status === 'done' ? now : undefined,\n archivedAt: status === 'archived' ? now : undefined,\n blockedReason: status === 'blocked' || status === 'needs_input' ? opts?.reason : undefined,\n });\n return goal ? this.get(goal.id) : null;\n }\n\n pause(goalId: string, reason = 'user-paused'): GoalWithDetails | null {\n const goal = this.store.update(goalId, {\n status: 'paused',\n blockedReason: reason,\n completedAt: undefined,\n archivedAt: undefined,\n });\n return goal ? this.get(goal.id) : null;\n }\n\n resume(goalId: string): GoalWithDetails | null {\n const goal = this.store.update(goalId, {\n status: 'active',\n blockedReason: undefined,\n completedAt: undefined,\n archivedAt: undefined,\n turnsUsed: 0,\n });\n return goal ? this.get(goal.id) : null;\n }\n\n reopen(goalId: string): GoalWithDetails | null {\n const goal = this.store.update(goalId, {\n status: 'active',\n blockedReason: undefined,\n completedAt: undefined,\n archivedAt: undefined,\n turnsUsed: 0,\n });\n return goal ? this.get(goal.id) : null;\n }\n\n complete(goalId: string): GoalWithDetails | null {\n return this.setStatus(goalId, 'done');\n }\n\n archive(goalId: string): GoalWithDetails | null {\n return this.setStatus(goalId, 'archived');\n }\n\n unarchive(goalId: string): GoalWithDetails | null {\n const goal = this.store.update(goalId, {\n status: 'paused',\n archivedAt: undefined,\n completedAt: undefined,\n blockedReason: undefined,\n });\n return goal ? this.get(goal.id) : null;\n }\n\n attachSession(goalId: string, sessionKey: string): GoalWithDetails | null {\n const goal = this.store.update(goalId, { activeSessionKey: sessionKey });\n return goal ? this.get(goal.id) : null;\n }\n\n updateChecklist(goalId: string, op: {\n type: 'add';\n text: string;\n addedBy?: GoalChecklistAddedBy;\n } | {\n type: 'mark';\n itemId: string;\n status: GoalChecklistStatus;\n evidenceSummary?: string;\n } | {\n type: 'remove';\n itemId: string;\n } | {\n type: 'reset';\n }): GoalWithDetails | null {\n if (op.type === 'add') {\n const text = op.text.trim();\n if (!text) throw new Error('Checklist item text is required');\n this.store.addChecklistItem({ goalId, text, addedBy: op.addedBy ?? 'user' });\n } else if (op.type === 'mark') {\n this.store.updateChecklistItem(op.itemId, {\n status: op.status,\n evidenceSummary: op.evidenceSummary,\n });\n } else if (op.type === 'remove') {\n this.store.removeChecklistItem(op.itemId);\n } else {\n this.store.clearChecklist(goalId);\n }\n return this.get(goalId);\n }\n\n recordJudgeDecision(input: {\n goalId: string;\n sessionKey: string;\n source: GoalSource;\n decision: GoalJudgeDecision;\n }): GoalWithDetails | null {\n const goal = this.store.get(input.goalId);\n if (!goal) return null;\n const nextStatus = toTerminalStatus(input.decision.verdict);\n const turnsUsed = goal.turnsUsed + 1;\n const status = turnsUsed >= goal.maxTurns && nextStatus === 'active' ? 'paused' : nextStatus;\n const reason =\n status === 'paused' && turnsUsed >= goal.maxTurns\n ? `turn budget exhausted (${turnsUsed}/${goal.maxTurns})`\n : input.decision.reason;\n\n const run = this.store.appendRun({\n goalId: input.goalId,\n sessionKey: input.sessionKey,\n source: input.source,\n status: 'succeeded',\n finishedAt: Date.now(),\n verdict: input.decision.verdict,\n reason: input.decision.reason,\n nextAction: input.decision.nextAction,\n assistantPreview: input.decision.assistantPreview,\n checklistProgress: input.decision.checklistProgress,\n confidence: input.decision.confidence,\n missingEvidence: input.decision.missingEvidence,\n userQuestion: input.decision.userQuestion,\n completedChecklistItemIds: input.decision.completedChecklistItemIds,\n });\n\n this.store.update(input.goalId, {\n status,\n turnsUsed,\n currentRunId: run.id,\n nextAction: input.decision.nextAction,\n blockedReason: status === 'blocked' || status === 'needs_input' || status === 'paused' ? reason : undefined,\n completedAt: status === 'done' ? Date.now() : undefined,\n });\n\n return this.get(input.goalId);\n }\n\n syncPostTurnState(input: {\n goalId: string;\n sessionKey: string;\n source: GoalSource;\n status: GoalStatus;\n turnsUsed: number;\n maxTurns: number;\n reason?: string;\n nextAction?: string;\n assistantPreview?: string;\n verdict: 'continue' | 'done' | 'blocked' | 'needs_input' | 'decompose';\n confidence?: number;\n missingEvidence?: string[];\n userQuestion?: string;\n completedChecklistItemIds?: string[];\n checklist?: Array<{\n text: string;\n status: 'pending' | 'completed' | 'impossible';\n addedBy: 'user' | 'judge';\n addedAt?: number;\n completedAt?: number;\n evidenceSummary?: string;\n }>;\n }): GoalWithDetails | null {\n const goal = this.store.get(input.goalId);\n if (!goal) return null;\n if (input.checklist) {\n this.store.replaceChecklist(input.goalId, input.checklist);\n }\n const total = input.checklist?.length ?? this.store.listChecklist(input.goalId).length;\n const done = (input.checklist ?? this.store.listChecklist(input.goalId)).filter(\n (it) => it.status === 'completed' || it.status === 'impossible',\n ).length;\n const run = this.store.appendRun({\n goalId: input.goalId,\n sessionKey: input.sessionKey,\n source: input.source,\n status: 'succeeded',\n finishedAt: Date.now(),\n verdict: input.verdict,\n reason: input.reason,\n nextAction: input.nextAction,\n assistantPreview: input.assistantPreview,\n checklistProgress: total > 0 ? { done, total } : undefined,\n confidence: input.confidence,\n missingEvidence: input.missingEvidence,\n userQuestion: input.userQuestion,\n completedChecklistItemIds: input.completedChecklistItemIds,\n });\n for (const item of input.checklist ?? []) {\n if ((item.status === 'completed' || item.status === 'impossible') && item.evidenceSummary?.trim()) {\n this.store.addEvidence({\n goalId: input.goalId,\n runId: run.id,\n kind: 'message',\n title: `Checklist evidence: ${item.text.slice(0, 80)}`,\n summary: item.evidenceSummary.trim(),\n });\n }\n }\n for (const missing of input.missingEvidence ?? []) {\n if (!missing.trim()) continue;\n this.store.addEvidence({\n goalId: input.goalId,\n runId: run.id,\n kind: 'message',\n title: `Missing evidence: ${missing.slice(0, 80)}`,\n summary: missing,\n });\n }\n if (input.userQuestion?.trim()) {\n this.store.addEvidence({\n goalId: input.goalId,\n runId: run.id,\n kind: 'message',\n title: 'User input requested',\n summary: input.userQuestion.trim(),\n });\n }\n this.store.update(input.goalId, {\n status: input.status,\n turnsUsed: input.turnsUsed,\n maxTurns: input.maxTurns,\n currentRunId: run.id,\n nextAction: input.nextAction,\n blockedReason:\n input.status === 'blocked' || input.status === 'needs_input' || input.status === 'paused'\n ? input.reason\n : undefined,\n completedAt: input.status === 'done' ? Date.now() : undefined,\n });\n return this.get(input.goalId);\n }\n\n listRuns(goalId: string, limit?: number) {\n return this.store.listRuns(goalId, limit);\n }\n\n listRunsForSession(sessionKey: string, limit?: number) {\n return this.store.listRunsForSession(sessionKey, limit);\n }\n\n listEvents(goalId: string, limit?: number) {\n return this.store.listEvents(goalId, limit);\n }\n\n addEvidence(input: Parameters<GoalStore['addEvidence']>[0]) {\n return this.store.addEvidence(input);\n }\n\n listEvidence(goalId: string, limit?: number) {\n return this.store.listEvidence(goalId, limit);\n }\n}\n\nexport function normalizeGoalUiLocale(raw: unknown): GoalUiLocale | undefined {\n return raw === 'en' || raw === 'zh' ? raw : undefined;\n}\n"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
|
|
1
2
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
3
|
import { init_logger } from "../utils/logger.js";
|
|
3
|
-
import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
|
|
4
|
-
import { resolveGoalUiLocale } from "../agent/goals/goal-locale.js";
|
|
5
4
|
import { renderWorkflowText } from "../agent/workflow/snapshot.js";
|
|
6
5
|
import { GoalService } from "./goal-service.js";
|
|
6
|
+
import { resolveGoalUiLocale } from "../agent/goals/goal-locale.js";
|
|
7
7
|
import { evaluateAfterTurnHermesLike } from "../agent/goals/evaluate-turn.js";
|
|
8
8
|
import { runViewToSnapshot } from "../workflows/service/run-view-to-snapshot.js";
|
|
9
9
|
//#region src/goals/goal-workflow-judge.ts
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { formatI18n } from "./format.js";
|
|
2
|
+
import { serverLocaleOrFallback } from "./locale.js";
|
|
2
3
|
import goals_en_default, { judgeReason } from "./locales/goals.en.js";
|
|
3
4
|
import goals_zh_default from "./locales/goals.zh.js";
|
|
4
|
-
import { serverLocaleOrFallback } from "./locale.js";
|
|
5
5
|
//#region src/i18n/goals-bundle.ts
|
|
6
6
|
/** Canonical English strings for judge parse / API contract (from `goals.en.json`). */
|
|
7
7
|
const JUDGE_REASON_EN = judgeReason;
|
package/dist/src/i18n/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { formatI18n } from "./format.js";
|
|
2
2
|
import { DEFAULT_SERVER_LOCALE, SERVER_LOCALES, isServerLocale, normalizeServerLocale, serverLocaleOrFallback } from "./locale.js";
|
|
3
|
-
import { JUDGE_REASON_EN, goalsChecklistProgressSuffix, goalsContinuationChecklistTemplate, goalsContinuationPlainTemplate, goalsEvaluateCopy, goalsJudgeReason, goalsJudgeResponseLanguageNote, goalsMessages } from "./goals-bundle.js";
|
|
4
3
|
import { resolveToolLocale, shareToolErrorLine, shareToolMessages, shareToolSuccessLines } from "./share-tool-bundle.js";
|
|
4
|
+
import { JUDGE_REASON_EN, goalsChecklistProgressSuffix, goalsContinuationChecklistTemplate, goalsContinuationPlainTemplate, goalsEvaluateCopy, goalsJudgeReason, goalsJudgeResponseLanguageNote, goalsMessages } from "./goals-bundle.js";
|
|
5
5
|
export { DEFAULT_SERVER_LOCALE, JUDGE_REASON_EN, SERVER_LOCALES, formatI18n, goalsChecklistProgressSuffix, goalsContinuationChecklistTemplate, goalsContinuationPlainTemplate, goalsEvaluateCopy, goalsJudgeReason, goalsJudgeResponseLanguageNote, goalsMessages, isServerLocale, normalizeServerLocale, resolveToolLocale, serverLocaleOrFallback, shareToolErrorLine, shareToolMessages, shareToolSuccessLines };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { formatI18n } from "./format.js";
|
|
2
|
-
import { normalizeServerLocale, serverLocaleOrFallback } from "./locale.js";
|
|
3
1
|
import share_tool_en_default from "./locales/share-tool.en.js";
|
|
4
2
|
import share_tool_zh_default from "./locales/share-tool.zh.js";
|
|
3
|
+
import { formatI18n } from "./format.js";
|
|
4
|
+
import { normalizeServerLocale, serverLocaleOrFallback } from "./locale.js";
|
|
5
5
|
//#region src/i18n/share-tool-bundle.ts
|
|
6
6
|
const byLocale = {
|
|
7
7
|
en: share_tool_en_default,
|
package/dist/src/infra/brew.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { readPackageVersion } from "./package-json.js";
|
|
2
2
|
import { XOPC_PACKAGE_NAME, collectInstalledGlobalPackageErrors, globalInstallArgs, globalInstallFallbackArgs, resolveExpectedInstalledVersionFromSpec, resolveGlobalInstallTarget, resolveNpmGlobalPrefixLayoutFromGlobalRoot, resolveNpmGlobalPrefixLayoutFromPrefix } from "./update-global.js";
|
|
3
|
-
import fs from "node:fs/promises";
|
|
4
3
|
import path from "node:path";
|
|
4
|
+
import fs from "node:fs/promises";
|
|
5
5
|
//#region src/infra/package-update-steps.ts
|
|
6
6
|
function formatError(err) {
|
|
7
7
|
return err instanceof Error ? err.message : String(err);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { resolveBrewPathDirs } from "./brew.js";
|
|
2
|
-
import fs from "node:fs";
|
|
3
|
-
import path from "node:path";
|
|
4
2
|
import os from "node:os";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import fs from "node:fs";
|
|
5
5
|
//#region src/infra/path-env.ts
|
|
6
6
|
function isTruthyEnvValue(value) {
|
|
7
7
|
if (!value) return false;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { init_paths_state, resolveStateDir } from "../config/paths-state.js";
|
|
2
2
|
import { createLogger } from "../utils/logger/index.js";
|
|
3
3
|
import { init_logger } from "../utils/logger.js";
|
|
4
|
-
import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
5
4
|
import path from "node:path";
|
|
5
|
+
import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
6
6
|
//#region src/infra/restart.ts
|
|
7
7
|
/**
|
|
8
8
|
* Gateway restart coordination — OpenClaw-aligned SIGUSR1 authorization and restart intent.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { PACKAGE_VERSION, init_package_version } from "../package-version.js";
|
|
2
2
|
import { channelToNpmTag } from "./update-channels.js";
|
|
3
|
-
import { access, readFile } from "node:fs/promises";
|
|
4
3
|
import { dirname, join } from "node:path";
|
|
4
|
+
import { access, readFile } from "node:fs/promises";
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
|
6
6
|
//#region src/infra/update-check.ts
|
|
7
7
|
init_package_version();
|
|
@@ -2,9 +2,9 @@ import { resolveExecPathBinPrepend } from "./path-env.js";
|
|
|
2
2
|
import { readPackageVersion } from "./package-json.js";
|
|
3
3
|
import { applyPathPrepend } from "./path-prepend.js";
|
|
4
4
|
import { createDefaultCommandRunner } from "./run-command.js";
|
|
5
|
+
import path from "node:path";
|
|
5
6
|
import fs from "node:fs";
|
|
6
7
|
import fs$1 from "node:fs/promises";
|
|
7
|
-
import path from "node:path";
|
|
8
8
|
//#region src/infra/update-global.ts
|
|
9
9
|
const XOPC_PACKAGE_NAME = "@xopcai/xopc";
|
|
10
10
|
const GLOBAL_RENAME_PREFIX = ".";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { init_write_file_atomic, writeTextAtomic } from "./write-file-atomic.js";
|
|
2
1
|
import { init_paths_state, resolveUpdateLockPath } from "../config/paths-state.js";
|
|
3
2
|
import { createLogger } from "../utils/logger/index.js";
|
|
4
3
|
import { init_logger } from "../utils/logger.js";
|
|
5
|
-
import {
|
|
4
|
+
import { init_write_file_atomic, writeTextAtomic } from "./write-file-atomic.js";
|
|
6
5
|
import { dirname } from "node:path";
|
|
6
|
+
import { mkdir, readFile, unlink } from "node:fs/promises";
|
|
7
7
|
//#region src/infra/update-lock.ts
|
|
8
8
|
init_write_file_atomic();
|
|
9
9
|
init_paths_state();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { init_paths, resolveConfigPath } from "../config/paths.js";
|
|
2
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
3
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
|
+
import { init_paths, resolveConfigPath } from "../config/paths.js";
|
|
4
4
|
import { init_loader, loadConfig } from "../config/loader.js";
|
|
5
5
|
import { isRestartEnabled } from "../config/commands.flags.js";
|
|
6
6
|
import { resolveGatewayService } from "../daemon/service.js";
|
|
@@ -8,8 +8,8 @@ import { runGlobalPackageUpdateSteps } from "./package-update-steps.js";
|
|
|
8
8
|
import { resolveStableNodePath } from "./stable-node-path.js";
|
|
9
9
|
import { trimLogTail } from "./update-log.js";
|
|
10
10
|
import { maybeRestartGatewayAfterUpdate } from "./update-restart.js";
|
|
11
|
-
import fs from "node:fs/promises";
|
|
12
11
|
import path from "node:path";
|
|
12
|
+
import fs from "node:fs/promises";
|
|
13
13
|
//#region src/infra/update-runner.ts
|
|
14
14
|
const DEFAULT_TIMEOUT_MS = 2700 * 1e3;
|
|
15
15
|
const MAX_LOG_CHARS = 8e3;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { PACKAGE_VERSION, init_package_version } from "../package-version.js";
|
|
2
|
-
import { init_write_file_atomic, writeTextAtomic } from "./write-file-atomic.js";
|
|
3
2
|
import { init_paths_state, resolveUpdateCheckStatePath } from "../config/paths-state.js";
|
|
4
3
|
import { createLogger } from "../utils/logger/index.js";
|
|
5
4
|
import { init_logger } from "../utils/logger.js";
|
|
5
|
+
import { init_write_file_atomic, writeTextAtomic } from "./write-file-atomic.js";
|
|
6
6
|
import { acquireUpdateLock } from "./update-lock.js";
|
|
7
7
|
import { normalizeUpdateChannel } from "./update-channels.js";
|
|
8
8
|
import { compareSemver, detectInstallKind, resolveNpmChannelTag, resolvePackageRoot } from "./update-check.js";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
-
import
|
|
2
|
+
import path from "node:path";
|
|
3
3
|
import { chmodSync, closeSync, copyFileSync, fsyncSync, mkdirSync, openSync, renameSync, rmSync, writeFileSync } from "node:fs";
|
|
4
|
+
import { randomUUID } from "node:crypto";
|
|
4
5
|
import { chmod, copyFile, mkdir, open, rename, rm } from "node:fs/promises";
|
|
5
|
-
import path from "node:path";
|
|
6
6
|
//#region src/infra/write-file-atomic.ts
|
|
7
7
|
/**
|
|
8
8
|
* Durable single-file writes: temp file → fsync → rename to target.
|
package/dist/src/media/store.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { getMediaBucketDir, getMediaDir, isPathInside } from "./paths.js";
|
|
2
2
|
import { buildMediaUri } from "./uri.js";
|
|
3
|
+
import { extname, join, parse } from "node:path";
|
|
3
4
|
import { randomUUID } from "node:crypto";
|
|
4
5
|
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
5
|
-
import { extname, join, parse } from "node:path";
|
|
6
6
|
//#region src/media/store.ts
|
|
7
7
|
/** Default per-file cap for inbound staging (5 MiB). */
|
|
8
8
|
const MEDIA_MAX_BYTES = 5 * 1024 * 1024;
|
|
@@ -7,8 +7,8 @@ import { isSTTAvailable } from "../voice/stt/availability.js";
|
|
|
7
7
|
import "../voice/stt/index.js";
|
|
8
8
|
import { mergeSttConfigFromAppConfig } from "../channels/attachments/voice-stt-webchat.js";
|
|
9
9
|
import { extractDocumentText } from "../document-understanding/extract.js";
|
|
10
|
-
import { readFile } from "node:fs/promises";
|
|
11
10
|
import { extname } from "node:path";
|
|
11
|
+
import { readFile } from "node:fs/promises";
|
|
12
12
|
//#region src/notes/agent-context.ts
|
|
13
13
|
const MAX_NOTE_MARKDOWN_CHARS = 4e4;
|
|
14
14
|
const MAX_TEXT_ATTACHMENT_CHARS = 2e4;
|
|
@@ -6,8 +6,8 @@ import { parseNoteMarkdown } from "./note-markdown.js";
|
|
|
6
6
|
import { NotesStore } from "./store.js";
|
|
7
7
|
import { partitionAttachmentsByReference } from "./note-attachment-sync.js";
|
|
8
8
|
import { buildNoteAgentContextArtifact, getCachedNoteAgentContextArtifact } from "./agent-context.js";
|
|
9
|
-
import { complete } from "@earendil-works/pi-ai";
|
|
10
9
|
import { randomUUID } from "node:crypto";
|
|
10
|
+
import { complete } from "@earendil-works/pi-ai";
|
|
11
11
|
//#region src/notes/service.ts
|
|
12
12
|
init_providers();
|
|
13
13
|
init_logger();
|
package/dist/src/notes/store.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
|
|
2
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
3
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
|
+
import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
|
|
4
4
|
import { requireXopcDatabase } from "../storage/sqlite/connection.js";
|
|
5
5
|
import { buildNoteIndexMeta } from "./note-index-meta.js";
|
|
6
6
|
import { deleteNoteRecord, getNoteRecord, listNoteRecords, upsertNoteRecord } from "../storage/sqlite/notes-repository.js";
|
|
7
7
|
import { deleteNoteAgentContextRecord } from "../storage/sqlite/note-agent-context-repository.js";
|
|
8
8
|
import "../storage/sqlite/index.js";
|
|
9
9
|
import { resolveNoteHistoryDir, resolveNoteMediaDir } from "./paths.js";
|
|
10
|
+
import { join } from "node:path";
|
|
10
11
|
import { randomUUID } from "node:crypto";
|
|
11
12
|
import { mkdir, readFile, readdir, rm, writeFile } from "node:fs/promises";
|
|
12
|
-
import { join } from "node:path";
|
|
13
13
|
//#region src/notes/store.ts
|
|
14
14
|
init_write_file_atomic();
|
|
15
15
|
init_logger();
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { resolveStateDir } from "../config/paths-state.js";
|
|
2
2
|
import { init_paths } from "../config/paths.js";
|
|
3
|
-
import { existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from "node:fs";
|
|
4
|
-
import { dirname, join, resolve } from "node:path";
|
|
5
3
|
import { homedir } from "node:os";
|
|
4
|
+
import { dirname, join, resolve } from "node:path";
|
|
5
|
+
import { existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from "node:fs";
|
|
6
6
|
import lockfile from "proper-lockfile";
|
|
7
7
|
//#region src/project-trust/trust-store.ts
|
|
8
8
|
init_paths();
|
|
@@ -16,6 +16,7 @@ const TRUST_REQUIRING_XOPC_PROJECT_RESOURCES = [
|
|
|
16
16
|
"APPEND_SYSTEM.md",
|
|
17
17
|
"workspace.json"
|
|
18
18
|
];
|
|
19
|
+
const TRUST_REQUIRING_PROJECT_ROOT_RESOURCES = ["AGENTS.md"];
|
|
19
20
|
function canonicalizePath(path) {
|
|
20
21
|
const resolved = resolve(path);
|
|
21
22
|
try {
|
|
@@ -147,6 +148,7 @@ function getProjectTrustOptions(cwd, options = {}) {
|
|
|
147
148
|
function hasTrustRequiringProjectResources(cwd) {
|
|
148
149
|
const userAgentsSkillsDir = join(canonicalizePath(process.env.HOME || homedir()), ".agents", "skills");
|
|
149
150
|
let currentDir = canonicalizePath(cwd);
|
|
151
|
+
if (TRUST_REQUIRING_PROJECT_ROOT_RESOURCES.some((entry) => existsSync(join(currentDir, entry)))) return true;
|
|
150
152
|
const xopcProjectDir = join(currentDir, ".xopc");
|
|
151
153
|
if (TRUST_REQUIRING_XOPC_PROJECT_RESOURCES.some((entry) => existsSync(join(xopcProjectDir, entry)))) return true;
|
|
152
154
|
while (true) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trust-store.js","names":["resolvePath"],"sources":["../../../src/project-trust/trust-store.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join, resolve as resolvePath } from 'node:path';\n\nimport lockfile from 'proper-lockfile';\n\nimport { resolveStateDir } from '../config/paths.js';\n\nexport type ProjectTrustDecision = boolean | null;\n\nexport interface ProjectTrustStoreEntry {\n path: string;\n decision: boolean;\n}\n\nexport interface ProjectTrustUpdate {\n path: string;\n decision: ProjectTrustDecision;\n}\n\nexport interface ProjectTrustOption {\n label: string;\n trusted: boolean;\n updates: ProjectTrustUpdate[];\n savedPath?: string;\n}\n\ntype TrustFile = Record<string, boolean | null | undefined>;\n\nconst TRUST_REQUIRING_XOPC_PROJECT_RESOURCES = [\n 'settings.json',\n 'extensions',\n 'skills',\n 'prompts',\n 'themes',\n 'SYSTEM.md',\n 'APPEND_SYSTEM.md',\n 'workspace.json',\n] as const;\n\nfunction canonicalizePath(path: string): string {\n const resolved = resolvePath(path);\n try {\n return realpathSync.native(resolved);\n } catch {\n return resolved;\n }\n}\n\nfunction normalizeCwd(cwd: string): string {\n return canonicalizePath(cwd);\n}\n\nfunction readTrustFile(path: string): TrustFile {\n if (!existsSync(path)) return {};\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(path, 'utf8'));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n throw new Error(`Failed to read project trust store ${path}: ${errorMessage}`);\n }\n\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw new Error(`Invalid project trust store ${path}: expected an object`);\n }\n\n const data: TrustFile = {};\n for (const [key, value] of Object.entries(parsed)) {\n if (value !== true && value !== false && value !== null) {\n throw new Error(`Invalid project trust store ${path}: value for ${JSON.stringify(key)} must be true, false, or null`);\n }\n data[normalizeCwd(key)] = value;\n }\n return data;\n}\n\nfunction writeTrustFile(path: string, data: TrustFile): void {\n const sorted: TrustFile = {};\n for (const key of Object.keys(data).sort()) {\n const value = data[key];\n if (value === true || value === false || value === null) {\n sorted[key] = value;\n }\n }\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${JSON.stringify(sorted, null, 2)}\\n`, 'utf8');\n}\n\nfunction acquireTrustLockSync(path: string): () => void {\n const trustDir = dirname(path);\n mkdirSync(trustDir, { recursive: true });\n const maxAttempts = 10;\n const delayMs = 20;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return lockfile.lockSync(trustDir, { realpath: false, lockfilePath: `${path}.lock` });\n } catch (err) {\n const code =\n typeof err === 'object' && err !== null && 'code' in err\n ? String((err as { code?: unknown }).code)\n : undefined;\n if (code !== 'ELOCKED' || attempt === maxAttempts) {\n throw err;\n }\n const startedAt = Date.now();\n while (Date.now() - startedAt < delayMs) {\n // Synchronous callers need a tiny bounded wait while another TUI updates trust.json.\n }\n }\n }\n\n throw new Error('Failed to acquire project trust store lock');\n}\n\nfunction withTrustFileLock<T>(path: string, fn: () => T): T {\n const release = acquireTrustLockSync(path);\n try {\n return fn();\n } finally {\n release();\n }\n}\n\nfunction findNearestTrustEntry(data: TrustFile, cwd: string): ProjectTrustStoreEntry | null {\n let currentDir = normalizeCwd(cwd);\n while (true) {\n const value = data[currentDir];\n if (value === true || value === false) {\n return { path: currentDir, decision: value };\n }\n\n const parentDir = dirname(currentDir);\n if (parentDir === currentDir) return null;\n currentDir = parentDir;\n }\n}\n\nexport function resolveProjectTrustStorePath(): string {\n return join(resolveStateDir(), 'trust.json');\n}\n\nexport function getProjectTrustParentPath(cwd: string): string | undefined {\n const trustPath = normalizeCwd(cwd);\n const parentDir = dirname(trustPath);\n return parentDir === trustPath ? undefined : parentDir;\n}\n\nexport function getProjectTrustOptions(\n cwd: string,\n options: { includeSessionOnly?: boolean } = {},\n): ProjectTrustOption[] {\n const trustPath = normalizeCwd(cwd);\n const trustOptions: ProjectTrustOption[] = [\n { label: 'Trust', trusted: true, updates: [{ path: trustPath, decision: true }], savedPath: trustPath },\n ];\n const parentPath = getProjectTrustParentPath(cwd);\n if (parentPath) {\n trustOptions.push({\n label: `Trust parent folder (${parentPath})`,\n trusted: true,\n updates: [\n { path: parentPath, decision: true },\n { path: trustPath, decision: null },\n ],\n savedPath: parentPath,\n });\n }\n if (options.includeSessionOnly) {\n trustOptions.push({ label: 'Trust (this session only)', trusted: true, updates: [] });\n }\n trustOptions.push({\n label: 'Do not trust',\n trusted: false,\n updates: [{ path: trustPath, decision: false }],\n savedPath: trustPath,\n });\n if (options.includeSessionOnly) {\n trustOptions.push({ label: 'Do not trust (this session only)', trusted: false, updates: [] });\n }\n return trustOptions;\n}\n\nexport function hasTrustRequiringProjectResources(cwd: string): boolean {\n const homeDir = canonicalizePath(process.env.HOME || homedir());\n const userAgentsSkillsDir = join(homeDir, '.agents', 'skills');\n let currentDir = canonicalizePath(cwd);\n\n const xopcProjectDir = join(currentDir, '.xopc');\n if (TRUST_REQUIRING_XOPC_PROJECT_RESOURCES.some((entry) => existsSync(join(xopcProjectDir, entry)))) {\n return true;\n }\n\n while (true) {\n const agentsSkillsDir = join(currentDir, '.agents', 'skills');\n if (agentsSkillsDir !== userAgentsSkillsDir && existsSync(agentsSkillsDir)) {\n return true;\n }\n\n const parentDir = dirname(currentDir);\n if (parentDir === currentDir) return false;\n currentDir = parentDir;\n }\n}\n\nexport class ProjectTrustStore {\n constructor(private readonly trustPath: string = resolveProjectTrustStorePath()) {}\n\n getPath(): string {\n return this.trustPath;\n }\n\n get(cwd: string): ProjectTrustDecision {\n return this.getEntry(cwd)?.decision ?? null;\n }\n\n getEntry(cwd: string): ProjectTrustStoreEntry | null {\n return withTrustFileLock(this.trustPath, () => findNearestTrustEntry(readTrustFile(this.trustPath), cwd));\n }\n\n set(cwd: string, decision: ProjectTrustDecision): void {\n this.setMany([{ path: cwd, decision }]);\n }\n\n setMany(decisions: ProjectTrustUpdate[]): void {\n withTrustFileLock(this.trustPath, () => {\n const data = readTrustFile(this.trustPath);\n for (const { path, decision } of decisions) {\n const key = normalizeCwd(path);\n if (decision === null) {\n delete data[key];\n } else {\n data[key] = decision;\n }\n }\n writeTrustFile(this.trustPath, data);\n });\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"trust-store.js","names":["resolvePath"],"sources":["../../../src/project-trust/trust-store.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, realpathSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join, resolve as resolvePath } from 'node:path';\n\nimport lockfile from 'proper-lockfile';\n\nimport { resolveStateDir } from '../config/paths.js';\n\nexport type ProjectTrustDecision = boolean | null;\n\nexport interface ProjectTrustStoreEntry {\n path: string;\n decision: boolean;\n}\n\nexport interface ProjectTrustUpdate {\n path: string;\n decision: ProjectTrustDecision;\n}\n\nexport interface ProjectTrustOption {\n label: string;\n trusted: boolean;\n updates: ProjectTrustUpdate[];\n savedPath?: string;\n}\n\ntype TrustFile = Record<string, boolean | null | undefined>;\n\nconst TRUST_REQUIRING_XOPC_PROJECT_RESOURCES = [\n 'settings.json',\n 'extensions',\n 'skills',\n 'prompts',\n 'themes',\n 'SYSTEM.md',\n 'APPEND_SYSTEM.md',\n 'workspace.json',\n] as const;\n\nconst TRUST_REQUIRING_PROJECT_ROOT_RESOURCES = [\n 'AGENTS.md',\n] as const;\n\nfunction canonicalizePath(path: string): string {\n const resolved = resolvePath(path);\n try {\n return realpathSync.native(resolved);\n } catch {\n return resolved;\n }\n}\n\nfunction normalizeCwd(cwd: string): string {\n return canonicalizePath(cwd);\n}\n\nfunction readTrustFile(path: string): TrustFile {\n if (!existsSync(path)) return {};\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(readFileSync(path, 'utf8'));\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n throw new Error(`Failed to read project trust store ${path}: ${errorMessage}`);\n }\n\n if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {\n throw new Error(`Invalid project trust store ${path}: expected an object`);\n }\n\n const data: TrustFile = {};\n for (const [key, value] of Object.entries(parsed)) {\n if (value !== true && value !== false && value !== null) {\n throw new Error(`Invalid project trust store ${path}: value for ${JSON.stringify(key)} must be true, false, or null`);\n }\n data[normalizeCwd(key)] = value;\n }\n return data;\n}\n\nfunction writeTrustFile(path: string, data: TrustFile): void {\n const sorted: TrustFile = {};\n for (const key of Object.keys(data).sort()) {\n const value = data[key];\n if (value === true || value === false || value === null) {\n sorted[key] = value;\n }\n }\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${JSON.stringify(sorted, null, 2)}\\n`, 'utf8');\n}\n\nfunction acquireTrustLockSync(path: string): () => void {\n const trustDir = dirname(path);\n mkdirSync(trustDir, { recursive: true });\n const maxAttempts = 10;\n const delayMs = 20;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return lockfile.lockSync(trustDir, { realpath: false, lockfilePath: `${path}.lock` });\n } catch (err) {\n const code =\n typeof err === 'object' && err !== null && 'code' in err\n ? String((err as { code?: unknown }).code)\n : undefined;\n if (code !== 'ELOCKED' || attempt === maxAttempts) {\n throw err;\n }\n const startedAt = Date.now();\n while (Date.now() - startedAt < delayMs) {\n // Synchronous callers need a tiny bounded wait while another TUI updates trust.json.\n }\n }\n }\n\n throw new Error('Failed to acquire project trust store lock');\n}\n\nfunction withTrustFileLock<T>(path: string, fn: () => T): T {\n const release = acquireTrustLockSync(path);\n try {\n return fn();\n } finally {\n release();\n }\n}\n\nfunction findNearestTrustEntry(data: TrustFile, cwd: string): ProjectTrustStoreEntry | null {\n let currentDir = normalizeCwd(cwd);\n while (true) {\n const value = data[currentDir];\n if (value === true || value === false) {\n return { path: currentDir, decision: value };\n }\n\n const parentDir = dirname(currentDir);\n if (parentDir === currentDir) return null;\n currentDir = parentDir;\n }\n}\n\nexport function resolveProjectTrustStorePath(): string {\n return join(resolveStateDir(), 'trust.json');\n}\n\nexport function getProjectTrustParentPath(cwd: string): string | undefined {\n const trustPath = normalizeCwd(cwd);\n const parentDir = dirname(trustPath);\n return parentDir === trustPath ? undefined : parentDir;\n}\n\nexport function getProjectTrustOptions(\n cwd: string,\n options: { includeSessionOnly?: boolean } = {},\n): ProjectTrustOption[] {\n const trustPath = normalizeCwd(cwd);\n const trustOptions: ProjectTrustOption[] = [\n { label: 'Trust', trusted: true, updates: [{ path: trustPath, decision: true }], savedPath: trustPath },\n ];\n const parentPath = getProjectTrustParentPath(cwd);\n if (parentPath) {\n trustOptions.push({\n label: `Trust parent folder (${parentPath})`,\n trusted: true,\n updates: [\n { path: parentPath, decision: true },\n { path: trustPath, decision: null },\n ],\n savedPath: parentPath,\n });\n }\n if (options.includeSessionOnly) {\n trustOptions.push({ label: 'Trust (this session only)', trusted: true, updates: [] });\n }\n trustOptions.push({\n label: 'Do not trust',\n trusted: false,\n updates: [{ path: trustPath, decision: false }],\n savedPath: trustPath,\n });\n if (options.includeSessionOnly) {\n trustOptions.push({ label: 'Do not trust (this session only)', trusted: false, updates: [] });\n }\n return trustOptions;\n}\n\nexport function hasTrustRequiringProjectResources(cwd: string): boolean {\n const homeDir = canonicalizePath(process.env.HOME || homedir());\n const userAgentsSkillsDir = join(homeDir, '.agents', 'skills');\n let currentDir = canonicalizePath(cwd);\n\n if (TRUST_REQUIRING_PROJECT_ROOT_RESOURCES.some((entry) => existsSync(join(currentDir, entry)))) {\n return true;\n }\n\n const xopcProjectDir = join(currentDir, '.xopc');\n if (TRUST_REQUIRING_XOPC_PROJECT_RESOURCES.some((entry) => existsSync(join(xopcProjectDir, entry)))) {\n return true;\n }\n\n while (true) {\n const agentsSkillsDir = join(currentDir, '.agents', 'skills');\n if (agentsSkillsDir !== userAgentsSkillsDir && existsSync(agentsSkillsDir)) {\n return true;\n }\n\n const parentDir = dirname(currentDir);\n if (parentDir === currentDir) return false;\n currentDir = parentDir;\n }\n}\n\nexport class ProjectTrustStore {\n constructor(private readonly trustPath: string = resolveProjectTrustStorePath()) {}\n\n getPath(): string {\n return this.trustPath;\n }\n\n get(cwd: string): ProjectTrustDecision {\n return this.getEntry(cwd)?.decision ?? null;\n }\n\n getEntry(cwd: string): ProjectTrustStoreEntry | null {\n return withTrustFileLock(this.trustPath, () => findNearestTrustEntry(readTrustFile(this.trustPath), cwd));\n }\n\n set(cwd: string, decision: ProjectTrustDecision): void {\n this.setMany([{ path: cwd, decision }]);\n }\n\n setMany(decisions: ProjectTrustUpdate[]): void {\n withTrustFileLock(this.trustPath, () => {\n const data = readTrustFile(this.trustPath);\n for (const { path, decision } of decisions) {\n const key = normalizeCwd(path);\n if (decision === null) {\n delete data[key];\n } else {\n data[key] = decision;\n }\n }\n writeTrustFile(this.trustPath, data);\n });\n }\n}\n"],"mappings":";;;;;;;YAMqD;AAuBrD,MAAM,yCAAyC;CAC7C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,MAAM,yCAAyC,CAC7C,YACD;AAED,SAAS,iBAAiB,MAAsB;CAC9C,MAAM,WAAWA,QAAY,KAAK;AAClC,KAAI;AACF,SAAO,aAAa,OAAO,SAAS;SAC9B;AACN,SAAO;;;AAIX,SAAS,aAAa,KAAqB;AACzC,QAAO,iBAAiB,IAAI;;AAG9B,SAAS,cAAc,MAAyB;AAC9C,KAAI,CAAC,WAAW,KAAK,CAAE,QAAO,EAAE;CAEhC,IAAI;AACJ,KAAI;AACF,WAAS,KAAK,MAAM,aAAa,MAAM,OAAO,CAAC;UACxC,KAAK;EACZ,MAAM,eAAe,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AACrE,QAAM,IAAI,MAAM,sCAAsC,KAAK,IAAI,eAAe;;AAGhF,KAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,MAAM,QAAQ,OAAO,CACxE,OAAM,IAAI,MAAM,+BAA+B,KAAK,sBAAsB;CAG5E,MAAM,OAAkB,EAAE;AAC1B,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,EAAE;AACjD,MAAI,UAAU,QAAQ,UAAU,SAAS,UAAU,KACjD,OAAM,IAAI,MAAM,+BAA+B,KAAK,cAAc,KAAK,UAAU,IAAI,CAAC,+BAA+B;AAEvH,OAAK,aAAa,IAAI,IAAI;;AAE5B,QAAO;;AAGT,SAAS,eAAe,MAAc,MAAuB;CAC3D,MAAM,SAAoB,EAAE;AAC5B,MAAK,MAAM,OAAO,OAAO,KAAK,KAAK,CAAC,MAAM,EAAE;EAC1C,MAAM,QAAQ,KAAK;AACnB,MAAI,UAAU,QAAQ,UAAU,SAAS,UAAU,KACjD,QAAO,OAAO;;AAGlB,WAAU,QAAQ,KAAK,EAAE,EAAE,WAAW,MAAM,CAAC;AAC7C,eAAc,MAAM,GAAG,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC,KAAK,OAAO;;AAGrE,SAAS,qBAAqB,MAA0B;CACtD,MAAM,WAAW,QAAQ,KAAK;AAC9B,WAAU,UAAU,EAAE,WAAW,MAAM,CAAC;CACxC,MAAM,cAAc;CACpB,MAAM,UAAU;AAEhB,MAAK,IAAI,UAAU,GAAG,WAAW,aAAa,UAC5C,KAAI;AACF,SAAO,SAAS,SAAS,UAAU;GAAE,UAAU;GAAO,cAAc,GAAG,KAAK;GAAQ,CAAC;UAC9E,KAAK;AAKZ,OAHE,OAAO,QAAQ,YAAY,QAAQ,QAAQ,UAAU,MACjD,OAAQ,IAA2B,KAAK,GACxC,KAAA,OACO,aAAa,YAAY,YACpC,OAAM;EAER,MAAM,YAAY,KAAK,KAAK;AAC5B,SAAO,KAAK,KAAK,GAAG,YAAY;;AAMpC,OAAM,IAAI,MAAM,6CAA6C;;AAG/D,SAAS,kBAAqB,MAAc,IAAgB;CAC1D,MAAM,UAAU,qBAAqB,KAAK;AAC1C,KAAI;AACF,SAAO,IAAI;WACH;AACR,WAAS;;;AAIb,SAAS,sBAAsB,MAAiB,KAA4C;CAC1F,IAAI,aAAa,aAAa,IAAI;AAClC,QAAO,MAAM;EACX,MAAM,QAAQ,KAAK;AACnB,MAAI,UAAU,QAAQ,UAAU,MAC9B,QAAO;GAAE,MAAM;GAAY,UAAU;GAAO;EAG9C,MAAM,YAAY,QAAQ,WAAW;AACrC,MAAI,cAAc,WAAY,QAAO;AACrC,eAAa;;;AAIjB,SAAgB,+BAAuC;AACrD,QAAO,KAAK,iBAAiB,EAAE,aAAa;;AAG9C,SAAgB,0BAA0B,KAAiC;CACzE,MAAM,YAAY,aAAa,IAAI;CACnC,MAAM,YAAY,QAAQ,UAAU;AACpC,QAAO,cAAc,YAAY,KAAA,IAAY;;AAG/C,SAAgB,uBACd,KACA,UAA4C,EAAE,EACxB;CACtB,MAAM,YAAY,aAAa,IAAI;CACnC,MAAM,eAAqC,CACzC;EAAE,OAAO;EAAS,SAAS;EAAM,SAAS,CAAC;GAAE,MAAM;GAAW,UAAU;GAAM,CAAC;EAAE,WAAW;EAAW,CACxG;CACD,MAAM,aAAa,0BAA0B,IAAI;AACjD,KAAI,WACF,cAAa,KAAK;EAChB,OAAO,wBAAwB,WAAW;EAC1C,SAAS;EACT,SAAS,CACP;GAAE,MAAM;GAAY,UAAU;GAAM,EACpC;GAAE,MAAM;GAAW,UAAU;GAAM,CACpC;EACD,WAAW;EACZ,CAAC;AAEJ,KAAI,QAAQ,mBACV,cAAa,KAAK;EAAE,OAAO;EAA6B,SAAS;EAAM,SAAS,EAAE;EAAE,CAAC;AAEvF,cAAa,KAAK;EAChB,OAAO;EACP,SAAS;EACT,SAAS,CAAC;GAAE,MAAM;GAAW,UAAU;GAAO,CAAC;EAC/C,WAAW;EACZ,CAAC;AACF,KAAI,QAAQ,mBACV,cAAa,KAAK;EAAE,OAAO;EAAoC,SAAS;EAAO,SAAS,EAAE;EAAE,CAAC;AAE/F,QAAO;;AAGT,SAAgB,kCAAkC,KAAsB;CAEtE,MAAM,sBAAsB,KADZ,iBAAiB,QAAQ,IAAI,QAAQ,SAAS,CACtB,EAAE,WAAW,SAAS;CAC9D,IAAI,aAAa,iBAAiB,IAAI;AAEtC,KAAI,uCAAuC,MAAM,UAAU,WAAW,KAAK,YAAY,MAAM,CAAC,CAAC,CAC7F,QAAO;CAGT,MAAM,iBAAiB,KAAK,YAAY,QAAQ;AAChD,KAAI,uCAAuC,MAAM,UAAU,WAAW,KAAK,gBAAgB,MAAM,CAAC,CAAC,CACjG,QAAO;AAGT,QAAO,MAAM;EACX,MAAM,kBAAkB,KAAK,YAAY,WAAW,SAAS;AAC7D,MAAI,oBAAoB,uBAAuB,WAAW,gBAAgB,CACxE,QAAO;EAGT,MAAM,YAAY,QAAQ,WAAW;AACrC,MAAI,cAAc,WAAY,QAAO;AACrC,eAAa;;;AAIjB,IAAa,oBAAb,MAA+B;CAC7B,YAAY,YAAqC,8BAA8B,EAAE;AAApD,OAAA,YAAA;;CAE7B,UAAkB;AAChB,SAAO,KAAK;;CAGd,IAAI,KAAmC;AACrC,SAAO,KAAK,SAAS,IAAI,EAAE,YAAY;;CAGzC,SAAS,KAA4C;AACnD,SAAO,kBAAkB,KAAK,iBAAiB,sBAAsB,cAAc,KAAK,UAAU,EAAE,IAAI,CAAC;;CAG3G,IAAI,KAAa,UAAsC;AACrD,OAAK,QAAQ,CAAC;GAAE,MAAM;GAAK;GAAU,CAAC,CAAC;;CAGzC,QAAQ,WAAuC;AAC7C,oBAAkB,KAAK,iBAAiB;GACtC,MAAM,OAAO,cAAc,KAAK,UAAU;AAC1C,QAAK,MAAM,EAAE,MAAM,cAAc,WAAW;IAC1C,MAAM,MAAM,aAAa,KAAK;AAC9B,QAAI,aAAa,KACf,QAAO,KAAK;QAEZ,MAAK,OAAO;;AAGhB,kBAAe,KAAK,WAAW,KAAK;IACpC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
4
3
|
import { dirname, join } from "node:path";
|
|
4
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
5
5
|
//#region src/providers/auth-runtime/auth-profile-store.ts
|
|
6
6
|
/**
|
|
7
7
|
* {@link AuthProfileStore} implementations.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { __esmMin, __exportAll } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { hasProviderAuthOnDiskSync, init_sync_provider_auth } from "../auth/sync-provider-auth.js";
|
|
2
3
|
import { PROVIDER_ENV_MAP, getApiKeyFromEnv, init_env_keys } from "./env-keys.js";
|
|
3
4
|
import { ModelRegistry, getModelRegistry, init_model_registry, prewarmModelRegistry, resetModelRegistry } from "./model-registry.js";
|
|
4
5
|
import { CredentialResolver, hasCredentials, init_credentials, resolveApiKey } from "../auth/credentials.js";
|
|
5
|
-
import { hasProviderAuthOnDiskSync, init_sync_provider_auth } from "../auth/sync-provider-auth.js";
|
|
6
6
|
import { getProviderRegistry, init_plugin_registry } from "./plugin-registry.js";
|
|
7
7
|
import { getModel, getModels, getProviders } from "@earendil-works/pi-ai";
|
|
8
8
|
//#region src/providers/index.ts
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
-
import { init_resolve_config_value, resolveConfigValue, resolveHeaders } from "../config/resolve-config-value.js";
|
|
3
|
-
import { resolveModelsJsonPath } from "../config/paths.js";
|
|
4
|
-
import { getDefaultModelValues, init_models_json, validateModelsConfig } from "../config/models-json.js";
|
|
5
2
|
import { createLogger } from "../utils/logger/index.js";
|
|
6
3
|
import { init_logger } from "../utils/logger.js";
|
|
4
|
+
import { resolveModelsJsonPath } from "../config/paths.js";
|
|
5
|
+
import { init_resolve_config_value, resolveConfigValue, resolveHeaders } from "../config/resolve-config-value.js";
|
|
6
|
+
import { getDefaultModelValues, init_models_json, validateModelsConfig } from "../config/models-json.js";
|
|
7
7
|
import { getApiKeyFromEnv, init_env_keys } from "./env-keys.js";
|
|
8
|
-
import { getModels, getProviders } from "@earendil-works/pi-ai";
|
|
9
8
|
import { existsSync, readFileSync } from "fs";
|
|
9
|
+
import { getModels, getProviders } from "@earendil-works/pi-ai";
|
|
10
10
|
//#region src/providers/model-registry.ts
|
|
11
11
|
/**
|
|
12
12
|
* Model Registry - manages built-in and custom models from models.json
|
|
@@ -10,7 +10,7 @@ export { SessionStatus, type SessionMetadata, type SessionDetail, type SessionLi
|
|
|
10
10
|
export { normalizeCompactionCheckpointId } from './compaction-checkpoints.js';
|
|
11
11
|
export { shouldSkipWebchatInboundByAbortCutoff } from './abort-cutoff.js';
|
|
12
12
|
export { DEFAULT_RESET_AT_HOUR, DEFAULT_RESET_MODE, DEFAULT_IDLE_MINUTES, evaluateSessionFreshness, resolveDailyResetAtMs, resolveSessionResetPolicy, type SessionFreshness, type SessionResetConfig, type SessionResetMode, type SessionResetPolicy, type SessionResetType, } from './reset-policy.js';
|
|
13
|
-
export {
|
|
13
|
+
export { resolveChannelResetConfig, resolveSessionResetType, } from './reset-type.js';
|
|
14
14
|
export { resolveSessionLifecycleTimestamps, type SessionLifecycleEntry } from './lifecycle-timestamps.js';
|
|
15
15
|
export { resolveSession, resolveSessionKeyForRequest, type SessionKeyResolution, type SessionResolution, } from './resolve-session.js';
|
|
16
16
|
export { initSessionTurn, type InitSessionTurnOptions, type InitSessionTurnResult, type SessionResetFn, } from './init-session-turn.js';
|