@xopcai/xopc 0.0.117 → 0.0.119
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/README.md +26 -24
- package/README.zh-CN.md +46 -42
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BBLhJ2C6.js → agent-avatar-dicebear-CU8J6zou.js} +1 -1
- package/dist/gateway/static/root/assets/agents-B0hkpLhP.js +2 -0
- package/dist/gateway/static/root/assets/app-management-settings-panel-B9vfYoEr.js +1 -0
- package/dist/gateway/static/root/assets/appearance-settings-ClOzIO24.js +1 -0
- package/dist/gateway/static/root/assets/{apps-page-DdDx0V4z.js → apps-page-DU0dz9Zo.js} +1 -1
- package/dist/gateway/static/root/assets/{archive-plugin-DZsVqMhU.js → archive-plugin-BkVIgZzA.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-CIol6JWX.js → attachment-load-CaCMWh1D.js} +1 -1
- package/dist/gateway/static/root/assets/automation-suggestion-card-DhGDpKP3.js +1 -0
- package/dist/gateway/static/root/assets/automations-page-CTedroVo.js +1 -0
- package/dist/gateway/static/root/assets/{binary-plugins-B3UauMfp.js → binary-plugins-B4TO_bsn.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-2HJoFchH.js → block-editor-DJRWwWNI.js} +6 -6
- package/dist/gateway/static/root/assets/browser-settings-page-FCDwOOBK.js +8 -0
- package/dist/gateway/static/root/assets/capability-presets-api-Befi89CL.js +1 -0
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-_G8eb2vJ.js +1 -0
- package/dist/gateway/static/root/assets/channel-recipient-api-BNSuJb5f.js +1 -0
- package/dist/gateway/static/root/assets/channels-settings-C3d5JBJX.js +1 -0
- package/dist/gateway/static/root/assets/cn-BQ_8x0bT.js +1 -0
- package/dist/gateway/static/root/assets/connectors-page-yaUNvt5u.js +2 -0
- package/dist/gateway/static/root/assets/cron-expression-B3B1eqnr.js +2 -0
- package/dist/gateway/static/root/assets/dreaming-settings-DNrdg1Ve.js +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-DX5WRE_t.js → extension-debug-page-DYh402XV.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-Buah7Bw-.js → extension-page-Cr_TizrN.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-DuroLVnf.js → extension-settings-page-BU1KoKRj.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-B5zdl27C.js → fetch-Y7AEX4H3.js} +1 -1
- package/dist/gateway/static/root/assets/format-cron-label-arqgGlVV.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-config-api-gT4ZhE7h.js → gateway-config-api-RbMmAOpX.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-settings-C79wkXef.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-B3kL8KGY.js → gateway-startup-retry-DiD_Tx4N.js} +1 -1
- package/dist/gateway/static/root/assets/goal-detail-page-9paXuHdo.js +1 -0
- package/dist/gateway/static/root/assets/{goals-config-api-AR-fVh0P.js → goals-config-api-DqxVi0p5.js} +1 -1
- package/dist/gateway/static/root/assets/{goals-page-Cpb21ezg.js → goals-page-CS0R-Af2.js} +2 -2
- package/dist/gateway/static/root/assets/goals-settings-CSuzZ8Ae.js +1 -0
- package/dist/gateway/static/root/assets/heartbeat-settings-DXPaYJm3.js +1 -0
- package/dist/gateway/static/root/assets/index-BoKafJIZ.js +191 -0
- package/dist/gateway/static/root/assets/index-CArhCcYn.css +1 -0
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-Dvg53qnd.js +1 -0
- package/dist/gateway/static/root/assets/{logs-page-DefCgF4o.js → logs-page-DLXPcksQ.js} +2 -2
- package/dist/gateway/static/root/assets/{markdown-split-ChbR9LGO.js → markdown-split-CpHxbtWJ.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-B82oP80n.js → media-plugins-SFPQRSxq.js} +1 -1
- package/dist/gateway/static/root/assets/messages-CrDHEbss.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-panel-BDF2iyRk.js +2 -0
- package/dist/gateway/static/root/assets/note-detail-page-CSb_hwig.js +2 -0
- package/dist/gateway/static/root/assets/{note-image-lightbox-CDknITM3.js → note-image-lightbox-BUYURRgn.js} +1 -1
- package/dist/gateway/static/root/assets/notes-page-BsIBSFyZ.js +1 -0
- package/dist/gateway/static/root/assets/{preview-open-alternatives-DV3xQsWB.js → preview-open-alternatives-BHz9iWYA.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CwzSovcS.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-BODCXnvY.js → save-bar-controls-CefkOlRg.js} +1 -1
- package/dist/gateway/static/root/assets/schedule-field-CmTRoOcE.js +1 -0
- package/dist/gateway/static/root/assets/{schema-form-qtfEI6QM.js → schema-form-FMKv1vGu.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-PHmX-NmA.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-BRAeKJN4.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-BHZKjVcS.js → settings-collapsible-section-BouO6JTi.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-5i35D-J1.js → settings-form-section-D-4lBl6X.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-KKrbFjy8.js +1 -0
- package/dist/gateway/static/root/assets/settings-page-layout-BJ4Gsef5.js +1 -0
- package/dist/gateway/static/root/assets/setup-status-panel-CrUjHPQo.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-B0H63tDv.js → share-preview-page-BDy2btRN.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-B18OBmH5.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-C28-2uKQ.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-Bm2ebkwl.js +2 -0
- package/dist/gateway/static/root/assets/system-settings-panel-CRngrlnZ.js +1 -0
- package/dist/gateway/static/root/assets/typed-models-lib-BltBc0b-.js +1 -0
- package/dist/gateway/static/root/assets/{use-channel-catalog-BCjP_VHb.js → use-channel-catalog-CjN-51e6.js} +1 -1
- package/dist/gateway/static/root/assets/user-profile-settings-panel-DJ1dKwZy.js +1 -0
- package/dist/gateway/static/root/assets/utils-B5M5-YvK.js +1 -0
- package/dist/gateway/static/root/assets/voice-api-key-field-CeEevm7z.js +1 -0
- package/dist/gateway/static/root/assets/{voice-player-store-BlF9V05n.js → voice-player-store-B7ykUlHM.js} +1 -1
- package/dist/gateway/static/root/assets/workflow-run-setup-panel-C4PzUQjB.js +3 -0
- package/dist/gateway/static/root/assets/workflows-page-BL84_-Ky.js +18 -0
- package/dist/gateway/static/root/index.html +6 -7
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +4 -5
- package/dist/src/agent/agent-manager.js +6 -9
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/agent-scope.js +0 -2
- package/dist/src/agent/agent-scope.js.map +1 -1
- package/dist/src/agent/background-review/prompts.d.ts +2 -2
- package/dist/src/agent/background-review/prompts.js +2 -2
- package/dist/src/agent/background-review/prompts.js.map +1 -1
- package/dist/src/agent/background-review/settings.d.ts +1 -1
- package/dist/src/agent/background-review/settings.js +7 -8
- package/dist/src/agent/background-review/settings.js.map +1 -1
- package/dist/src/agent/bootstrap/bootstrap-cache.d.ts +1 -0
- package/dist/src/agent/bootstrap/bootstrap-cache.js +4 -3
- package/dist/src/agent/bootstrap/bootstrap-cache.js.map +1 -1
- package/dist/src/agent/bootstrap/bootstrap-files.d.ts +4 -0
- package/dist/src/agent/bootstrap/bootstrap-files.js +4 -3
- package/dist/src/agent/bootstrap/bootstrap-files.js.map +1 -1
- package/dist/src/agent/bootstrap/filter-bootstrap-files.js +4 -2
- package/dist/src/agent/bootstrap/filter-bootstrap-files.js.map +1 -1
- package/dist/src/agent/bootstrap/load-bootstrap-files.d.ts +2 -1
- package/dist/src/agent/bootstrap/load-bootstrap-files.js +17 -16
- package/dist/src/agent/bootstrap/load-bootstrap-files.js.map +1 -1
- package/dist/src/agent/bootstrap/types.d.ts +1 -1
- package/dist/src/agent/context/workspace-templates/AGENTS.md +1 -1
- package/dist/src/agent/context/workspace.d.ts +4 -2
- package/dist/src/agent/context/workspace.js +5 -4
- package/dist/src/agent/context/workspace.js.map +1 -1
- package/dist/src/agent/embedded/run-for-session.js +106 -15
- package/dist/src/agent/embedded/run-for-session.js.map +1 -1
- package/dist/src/agent/fallback/candidates.d.ts +0 -8
- package/dist/src/agent/fallback/candidates.js +10 -11
- package/dist/src/agent/fallback/candidates.js.map +1 -1
- package/dist/src/agent/index.js +1 -1
- package/dist/src/agent/lifecycle/handlers/compaction.d.ts +1 -3
- package/dist/src/agent/lifecycle/handlers/compaction.js +1 -16
- package/dist/src/agent/lifecycle/handlers/compaction.js.map +1 -1
- package/dist/src/agent/lifecycle/progress.d.ts +0 -1
- package/dist/src/agent/lifecycle/progress.js +1 -6
- package/dist/src/agent/lifecycle/progress.js.map +1 -1
- package/dist/src/agent/lifecycle/timeout-wrapper.d.ts +1 -2
- package/dist/src/agent/lifecycle/timeout-wrapper.js +1 -7
- package/dist/src/agent/lifecycle/timeout-wrapper.js.map +1 -1
- package/dist/src/agent/memory/builtin-memory-store.d.ts +4 -2
- package/dist/src/agent/memory/builtin-memory-store.js +11 -6
- package/dist/src/agent/memory/builtin-memory-store.js.map +1 -1
- package/dist/src/agent/memory/builtin-provider.js +36 -7
- package/dist/src/agent/memory/builtin-provider.js.map +1 -1
- package/dist/src/agent/memory/candidate-extractor.d.ts +6 -0
- package/dist/src/agent/memory/candidate-extractor.js +60 -0
- package/dist/src/agent/memory/candidate-extractor.js.map +1 -0
- package/dist/src/agent/memory/manager.d.ts +2 -1
- package/dist/src/agent/memory/manager.js +27 -3
- package/dist/src/agent/memory/manager.js.map +1 -1
- package/dist/src/agent/memory/memory-config.js +3 -0
- package/dist/src/agent/memory/memory-config.js.map +1 -1
- package/dist/src/agent/memory/prefetch-coordinator.js.map +1 -1
- package/dist/src/agent/memory/types.d.ts +27 -4
- package/dist/src/agent/middleware/self-verify.d.ts +0 -1
- package/dist/src/agent/middleware/self-verify.js +0 -2
- package/dist/src/agent/middleware/self-verify.js.map +1 -1
- package/dist/src/agent/models/index.d.ts +1 -1
- package/dist/src/agent/models/manager.d.ts +4 -20
- package/dist/src/agent/models/manager.js +9 -126
- package/dist/src/agent/models/manager.js.map +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.d.ts +0 -4
- package/dist/src/agent/orchestration/agent-orchestrator.js +1 -9
- package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
- package/dist/src/agent/prompt/memory/index.d.ts +4 -2
- package/dist/src/agent/prompt/memory/index.js +18 -12
- package/dist/src/agent/prompt/memory/index.js.map +1 -1
- package/dist/src/agent/prompt/sections/memory-skills.js +1 -1
- package/dist/src/agent/prompt/sections/memory-skills.js.map +1 -1
- package/dist/src/agent/prompt/sections/tooling.js +2 -2
- package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
- package/dist/src/agent/prompt/service-prompt-builder.d.ts +0 -1
- package/dist/src/agent/prompt/service-prompt-builder.js +4 -31
- package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
- package/dist/src/agent/prompt/subagent-context.js +1 -1
- package/dist/src/agent/prompt/subagent-context.js.map +1 -1
- package/dist/src/agent/prompt/types.d.ts +1 -1
- package/dist/src/agent/reply/post-compaction-context.js +1 -3
- package/dist/src/agent/reply/post-compaction-context.js.map +1 -1
- package/dist/src/agent/reply/startup-context.js +1 -5
- package/dist/src/agent/reply/startup-context.js.map +1 -1
- package/dist/src/agent/service.d.ts +4 -12
- package/dist/src/agent/service.js +10 -48
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/service.types.d.ts +2 -2
- package/dist/src/agent/session/session-config-service.d.ts +11 -11
- package/dist/src/agent/session/session-config-service.js +14 -14
- package/dist/src/agent/session/session-config-service.js.map +1 -1
- package/dist/src/agent/session/session-inspector.js +3 -2
- package/dist/src/agent/session/session-inspector.js.map +1 -1
- package/dist/src/agent/starter-agents.js +12 -12
- package/dist/src/agent/starter-agents.js.map +1 -1
- package/dist/src/agent/tools/automation-tool.d.ts +14 -0
- package/dist/src/agent/tools/automation-tool.js +102 -0
- package/dist/src/agent/tools/automation-tool.js.map +1 -0
- package/dist/src/agent/tools/curated-memory-tool.js +57 -2
- package/dist/src/agent/tools/curated-memory-tool.js.map +1 -1
- package/dist/src/agent/tools/delegate-tool.js +1 -1
- package/dist/src/agent/tools/delegate-tool.js.map +1 -1
- package/dist/src/agent/tools/factory.d.ts +3 -3
- package/dist/src/agent/tools/factory.js +2 -2
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/index.d.ts +1 -1
- package/dist/src/agent/tools/index.js +2 -2
- package/dist/src/agent/tools/web-extract.js +6 -8
- package/dist/src/agent/tools/web-extract.js.map +1 -1
- package/dist/src/agent-manifest/index.js +2 -2
- package/dist/src/agent-manifest/resolver.d.ts +4 -2
- package/dist/src/agent-manifest/resolver.js +6 -3
- package/dist/src/agent-manifest/resolver.js.map +1 -1
- package/dist/src/agent-manifest/schema.d.ts +238 -0
- package/dist/src/agent-manifest/schema.js +16 -5
- package/dist/src/agent-manifest/schema.js.map +1 -1
- package/dist/src/agent-manifest/validator.d.ts +3 -2
- package/dist/src/agent-manifest/validator.js +2 -1
- package/dist/src/agent-manifest/validator.js.map +1 -1
- package/dist/src/ai-assist/text-assist.d.ts +1 -1
- package/dist/src/ai-assist/text-assist.js +56 -0
- package/dist/src/ai-assist/text-assist.js.map +1 -1
- package/dist/src/auth/profiles/store.js.map +1 -1
- package/dist/src/automations/api/routes.d.ts +3 -0
- package/dist/src/automations/api/routes.js +193 -0
- package/dist/src/automations/api/routes.js.map +1 -0
- package/dist/src/automations/domain/index.d.ts +3 -0
- package/dist/src/automations/domain/index.js +3 -0
- package/dist/src/automations/domain/schedule.d.ts +4 -0
- package/dist/src/automations/domain/schedule.js +37 -0
- package/dist/src/automations/domain/schedule.js.map +1 -0
- package/dist/src/automations/domain/types.d.ts +160 -0
- package/dist/src/automations/domain/validation.d.ts +370 -0
- package/dist/src/automations/domain/validation.js +149 -0
- package/dist/src/automations/domain/validation.js.map +1 -0
- package/dist/src/automations/draft/automation-draft-prompt.d.ts +26 -0
- package/dist/src/automations/draft/automation-draft-prompt.js +127 -0
- package/dist/src/automations/draft/automation-draft-prompt.js.map +1 -0
- package/dist/src/automations/draft/automation-draft-service.d.ts +12 -0
- package/dist/src/automations/draft/automation-draft-service.js +135 -0
- package/dist/src/automations/draft/automation-draft-service.js.map +1 -0
- package/dist/src/automations/draft/automation-draft-validator.d.ts +99 -0
- package/dist/src/automations/draft/automation-draft-validator.js +105 -0
- package/dist/src/automations/draft/automation-draft-validator.js.map +1 -0
- package/dist/src/automations/draft/automation-draft.types.d.ts +40 -0
- package/dist/src/automations/draft/index.d.ts +3 -0
- package/dist/src/automations/draft/index.js +3 -0
- package/dist/src/automations/index.d.ts +3 -0
- package/dist/src/automations/index.js +8 -0
- package/dist/src/automations/product-events.d.ts +5 -0
- package/dist/src/automations/product-events.js +21 -0
- package/dist/src/automations/product-events.js.map +1 -0
- package/dist/src/automations/service/action-executor.d.ts +9 -0
- package/dist/src/automations/service/action-executor.js +157 -0
- package/dist/src/automations/service/action-executor.js.map +1 -0
- package/dist/src/automations/service/automation-service.d.ts +54 -0
- package/dist/src/automations/service/automation-service.js +404 -0
- package/dist/src/automations/service/automation-service.js.map +1 -0
- package/dist/src/automations/service/index.d.ts +2 -0
- package/dist/src/automations/service/index.js +3 -0
- package/dist/src/automations/storage/automation-repository.d.ts +6 -0
- package/dist/src/automations/storage/automation-repository.js +61 -0
- package/dist/src/automations/storage/automation-repository.js.map +1 -0
- package/dist/src/automations/storage/automation-run-repository.d.ts +17 -0
- package/dist/src/automations/storage/automation-run-repository.js +130 -0
- package/dist/src/automations/storage/automation-run-repository.js.map +1 -0
- package/dist/src/automations/storage/index.d.ts +2 -0
- package/dist/src/automations/storage/index.js +3 -0
- package/dist/src/channels/pipeline.d.ts +1 -1
- package/dist/src/channels/pipeline.js.map +1 -1
- package/dist/src/channels/plugin-types.d.ts +3 -0
- package/dist/src/chat-commands/agent-edit.js +0 -1
- package/dist/src/chat-commands/agent-edit.js.map +1 -1
- package/dist/src/chat-commands/builtins/model.js +2 -2
- package/dist/src/chat-commands/builtins/model.js.map +1 -1
- package/dist/src/chat-commands/builtins/thinking.js.map +1 -1
- package/dist/src/cli/command-catalog.js +0 -39
- package/dist/src/cli/command-catalog.js.map +1 -1
- package/dist/src/cli/command-loaders.js +0 -1
- package/dist/src/cli/command-loaders.js.map +1 -1
- package/dist/src/cli/command-manifest.d.ts +1 -1
- package/dist/src/cli/command-manifest.js +1 -5
- package/dist/src/cli/command-manifest.js.map +1 -1
- package/dist/src/cli/commands/agents.js +7 -6
- package/dist/src/cli/commands/agents.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/doctor/checks/{cron-health.d.ts → migrations.d.ts} +1 -1
- package/dist/src/cli/commands/doctor/checks/migrations.js +40 -0
- package/dist/src/cli/commands/doctor/checks/migrations.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -0
- package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/workspace-status.js +0 -1
- package/dist/src/cli/commands/doctor/checks/workspace-status.js.map +1 -1
- package/dist/src/cli/commands/doctor/flow.js +2 -2
- package/dist/src/cli/commands/doctor/flow.js.map +1 -1
- package/dist/src/cli/commands/gateway/call.js +2 -2
- package/dist/src/cli/commands/gateway/call.js.map +1 -1
- package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
- package/dist/src/cli/commands/gateway/run-foreground.js +4 -2
- package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
- package/dist/src/cli/commands/init.js +33 -14
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/models.js +13 -31
- package/dist/src/cli/commands/models.js.map +1 -1
- package/dist/src/cli/commands/onboard/model.js +17 -10
- package/dist/src/cli/commands/onboard/model.js.map +1 -1
- package/dist/src/cli/commands/onboard.js +2 -2
- package/dist/src/cli/commands/onboard.js.map +1 -1
- package/dist/src/cli/commands/tui.js +26 -4
- package/dist/src/cli/commands/tui.js.map +1 -1
- package/dist/src/cli/index.d.ts +1 -0
- package/dist/src/cli/index.js +10 -5
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/registry.js +1 -1
- package/dist/src/cli/registry.js.map +1 -1
- package/dist/src/cli/templates.d.ts +1 -1
- package/dist/src/cli/templates.js +1 -11
- package/dist/src/cli/templates.js.map +1 -1
- package/dist/src/cli/utils/init-workspace-core.js +2 -0
- package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
- package/dist/src/commands/agents.config.d.ts +9 -0
- package/dist/src/commands/agents.config.js +42 -12
- package/dist/src/commands/agents.config.js.map +1 -1
- package/dist/src/config/agent-profile.js +5 -3
- package/dist/src/config/agent-profile.js.map +1 -1
- package/dist/src/config/agent-typed-models.js +3 -5
- package/dist/src/config/agent-typed-models.js.map +1 -1
- package/dist/src/config/config-surface.d.ts +3 -0
- package/dist/src/config/index.d.ts +0 -1
- package/dist/src/config/index.js +3 -3
- package/dist/src/config/index.js.map +1 -1
- package/dist/src/config/paths.d.ts +8 -10
- package/dist/src/config/paths.js +16 -16
- package/dist/src/config/paths.js.map +1 -1
- package/dist/src/config/profile.js +0 -1
- package/dist/src/config/profile.js.map +1 -1
- package/dist/src/config/rules.js +0 -5
- package/dist/src/config/rules.js.map +1 -1
- package/dist/src/config/schema.d.ts +45 -44
- package/dist/src/config/schema.js +68 -52
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/web-patch.d.ts +0 -12
- package/dist/src/config/web-patch.js +2 -29
- package/dist/src/config/web-patch.js.map +1 -1
- package/dist/src/extensions/api.d.ts +2 -0
- package/dist/src/extensions/api.js +10 -0
- package/dist/src/extensions/api.js.map +1 -1
- package/dist/src/extensions/extension-registry-impl.d.ts +4 -1
- package/dist/src/extensions/extension-registry-impl.js +8 -0
- package/dist/src/extensions/extension-registry-impl.js.map +1 -1
- package/dist/src/extensions/loader.d.ts +3 -3
- package/dist/src/extensions/loader.js +3 -3
- package/dist/src/extensions/loader.js.map +1 -1
- package/dist/src/extensions/sdk/testing.d.ts +2 -0
- package/dist/src/extensions/sdk/testing.js +7 -0
- package/dist/src/extensions/sdk/testing.js.map +1 -1
- package/dist/src/extensions/types/core.d.ts +10 -1
- package/dist/src/extensions/types/index.d.ts +1 -1
- package/dist/src/extensions/types/{phase4.d.ts → registration.d.ts} +2 -2
- package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
- package/dist/src/gateway/agent-builtin-tools.js +1 -1
- package/dist/src/gateway/agent-builtin-tools.js.map +1 -1
- package/dist/src/gateway/agents-admin.d.ts +8 -0
- package/dist/src/gateway/agents-admin.js +63 -34
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/capability-presets-admin.d.ts +1 -0
- package/dist/src/gateway/capability-presets-admin.js +19 -10
- package/dist/src/gateway/capability-presets-admin.js.map +1 -1
- package/dist/src/gateway/chat-stream/mapper.js +9 -2
- package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
- package/dist/src/gateway/dreaming-automation-reconciler.d.ts +11 -0
- package/dist/src/gateway/dreaming-automation-reconciler.js +105 -0
- package/dist/src/gateway/dreaming-automation-reconciler.js.map +1 -0
- package/dist/src/gateway/global-defaults-admin.d.ts +36 -0
- package/dist/src/gateway/global-defaults-admin.js +146 -0
- package/dist/src/gateway/global-defaults-admin.js.map +1 -0
- package/dist/src/gateway/heartbeat/service.d.ts +0 -2
- package/dist/src/gateway/heartbeat/service.js +0 -7
- package/dist/src/gateway/heartbeat/service.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +5 -6
- package/dist/src/gateway/hono/lib/config-payload.js +2 -2
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/routes/agents.js +33 -1
- package/dist/src/gateway/hono/routes/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/commands-skills.js +4 -5
- package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +12 -6
- package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +27 -37
- package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
- package/dist/src/gateway/hono/routes/global-defaults.d.ts +3 -0
- package/dist/src/gateway/hono/routes/global-defaults.js +61 -0
- package/dist/src/gateway/hono/routes/global-defaults.js.map +1 -0
- package/dist/src/gateway/hono/routes/home.d.ts +2 -2
- package/dist/src/gateway/hono/routes/home.js +34 -25
- package/dist/src/gateway/hono/routes/home.js.map +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +21 -9
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/memory.js +75 -4
- package/dist/src/gateway/hono/routes/memory.js.map +1 -1
- package/dist/src/gateway/hono/routes/migrations.d.ts +3 -0
- package/dist/src/gateway/hono/routes/migrations.js +35 -0
- package/dist/src/gateway/hono/routes/migrations.js.map +1 -0
- package/dist/src/gateway/hono/routes/models.js +1 -1
- package/dist/src/gateway/hono/routes/public-gateway.js +2 -1
- package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +14 -0
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/run-loop.js +2 -0
- package/dist/src/gateway/run-loop.js.map +1 -1
- package/dist/src/gateway/security/operator-scopes.js +5 -1
- package/dist/src/gateway/security/operator-scopes.js.map +1 -1
- package/dist/src/gateway/service/config-coordinator.d.ts +4 -4
- package/dist/src/gateway/service/config-coordinator.js +14 -8
- package/dist/src/gateway/service/config-coordinator.js.map +1 -1
- package/dist/src/gateway/service/marketplace-service.d.ts +4 -4
- package/dist/src/gateway/service/marketplace-service.js +11 -7
- package/dist/src/gateway/service/marketplace-service.js.map +1 -1
- package/dist/src/gateway/service/sessions-api.d.ts +2 -1
- package/dist/src/gateway/service/sessions-api.js +6 -1
- package/dist/src/gateway/service/sessions-api.js.map +1 -1
- package/dist/src/gateway/service.d.ts +7 -3
- package/dist/src/gateway/service.js +61 -27
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/goals/goal-service.js +45 -4
- package/dist/src/goals/goal-service.js.map +1 -1
- package/dist/src/infra/update-restart.js +1 -1
- package/dist/src/migrations/config/default-capability-preset.d.ts +10 -0
- package/dist/src/migrations/config/default-capability-preset.js +135 -0
- package/dist/src/migrations/config/default-capability-preset.js.map +1 -0
- package/dist/src/migrations/index.d.ts +4 -0
- package/dist/src/migrations/index.js +4 -0
- package/dist/src/migrations/registry.d.ts +8 -0
- package/dist/src/migrations/registry.js +18 -0
- package/dist/src/migrations/registry.js.map +1 -0
- package/dist/src/migrations/runner.d.ts +17 -0
- package/dist/src/migrations/runner.js +191 -0
- package/dist/src/migrations/runner.js.map +1 -0
- package/dist/src/migrations/types.d.ts +34 -0
- package/dist/src/notes/service.js +27 -2
- package/dist/src/notes/service.js.map +1 -1
- package/dist/src/providers/index.d.ts +4 -5
- package/dist/src/providers/index.js +16 -16
- package/dist/src/providers/index.js.map +1 -1
- package/dist/src/providers/model-registry.d.ts +0 -1
- package/dist/src/providers/model-registry.js +0 -3
- package/dist/src/providers/model-registry.js.map +1 -1
- package/dist/src/routing/resolve-tui-session-key.d.ts +3 -0
- package/dist/src/routing/resolve-tui-session-key.js +14 -3
- package/dist/src/routing/resolve-tui-session-key.js.map +1 -1
- package/dist/src/session/session-workspace.js +2 -7
- package/dist/src/session/session-workspace.js.map +1 -1
- package/dist/src/session/store.js +0 -5
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/transcript-outline.d.ts +47 -0
- package/dist/src/session/transcript-outline.js +481 -0
- package/dist/src/session/transcript-outline.js.map +1 -0
- package/dist/src/storage/sqlite/index.d.ts +1 -3
- package/dist/src/storage/sqlite/index.js +2 -4
- package/dist/src/storage/sqlite/memory-index-repository.d.ts +1 -0
- package/dist/src/storage/sqlite/memory-index-repository.js +15 -14
- package/dist/src/storage/sqlite/memory-index-repository.js.map +1 -1
- package/dist/src/storage/sqlite/memory-records-repository.d.ts +44 -1
- package/dist/src/storage/sqlite/memory-records-repository.js +164 -20
- package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/014_memory_record_governance.sql +10 -0
- package/dist/src/storage/sqlite/migrations/015_memory_trace_feedback.sql +4 -0
- package/dist/src/storage/sqlite/migrations/016_automations.sql +47 -0
- package/dist/src/storage/sqlite/migrations/017_automation_run_events.sql +14 -0
- package/dist/src/storage/sqlite/migrations/018_automation_safety.sql +1 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/schema.sql +56 -46
- package/dist/src/tui/backends/embedded-backend.d.ts +9 -0
- package/dist/src/tui/backends/embedded-backend.js +55 -27
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.d.ts +4 -0
- package/dist/src/tui/backends/gateway-sse-backend.js +30 -3
- package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
- package/dist/src/tui/components/tui-header.d.ts +0 -1
- package/dist/src/tui/components/tui-header.js +3 -8
- package/dist/src/tui/components/tui-header.js.map +1 -1
- package/dist/src/tui/tui-backend.d.ts +4 -0
- package/dist/src/tui/tui-commands.d.ts +5 -0
- package/dist/src/tui/tui-commands.js +43 -0
- package/dist/src/tui/tui-commands.js.map +1 -1
- package/dist/src/tui/tui-startup-resources.js +2 -1
- package/dist/src/tui/tui-startup-resources.js.map +1 -1
- package/dist/src/tui/tui-startup-text.js +12 -12
- package/dist/src/tui/tui-startup-text.js.map +1 -1
- package/dist/src/tui/tui-transcript-tree.d.ts +1 -1
- package/dist/src/tui/tui-transcript-tree.js +17 -257
- package/dist/src/tui/tui-transcript-tree.js.map +1 -1
- package/dist/src/tui/tui-types.d.ts +2 -0
- package/dist/src/tui/tui-types.js.map +1 -1
- package/dist/src/tui/tui.js +11 -3
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/workflows/domain/index.js +1 -1
- package/dist/src/workflows/domain/run.d.ts +7 -7
- package/dist/src/workflows/domain/run.js.map +1 -1
- package/dist/src/workflows/index.js +2 -2
- package/dist/src/workflows/service/workflow-run-service.d.ts +2 -0
- package/dist/src/workflows/service/workflow-run-service.js +31 -9
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
- package/dist/src/workflows/service/workflow-run-service.types.d.ts +1 -1
- package/package.json +4 -2
- package/dist/gateway/static/root/assets/agents-C6xgagZd.js +0 -71
- package/dist/gateway/static/root/assets/app-management-settings-panel-CBpLONvG.js +0 -1
- package/dist/gateway/static/root/assets/appearance-settings-CGcc54yj.js +0 -1
- package/dist/gateway/static/root/assets/browser-settings-page-CUOO-PQk.js +0 -8
- package/dist/gateway/static/root/assets/capability-presets-api-XQoMTI0A.js +0 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-CfqF-kGr.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-BYyRzsex.js +0 -1
- package/dist/gateway/static/root/assets/cn-JdwAhgNB.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-DIvEz4NX.js +0 -2
- package/dist/gateway/static/root/assets/createLucideIcon-DPHK1VkS.js +0 -1
- package/dist/gateway/static/root/assets/cron-api-R41aQCX9.js +0 -1
- package/dist/gateway/static/root/assets/cron-dreaming-jobs-nCMWCf0p.js +0 -1
- package/dist/gateway/static/root/assets/cron-page-D97nFqQD.js +0 -3
- package/dist/gateway/static/root/assets/dreaming-settings-Bceaw1PG.js +0 -1
- package/dist/gateway/static/root/assets/format-cron-label-BsotZDO5.js +0 -2
- package/dist/gateway/static/root/assets/format-interval-label-Dn_QKIqb.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-iISWAZRm.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-DCUROLMQ.js +0 -1
- package/dist/gateway/static/root/assets/goals-settings-CPAuFwoD.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-config-api-D7bKFEeO.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-CC69vNx0.js +0 -1
- package/dist/gateway/static/root/assets/index-CwhK8qCh.js +0 -122
- package/dist/gateway/static/root/assets/index-CyfhARL-.css +0 -1
- package/dist/gateway/static/root/assets/interval-presets-0DtsnxE0.js +0 -1
- package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-BPREtN8B.js +0 -1
- package/dist/gateway/static/root/assets/messages-Cf1O9JB0.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-panel-DmKiIihT.js +0 -2
- package/dist/gateway/static/root/assets/note-detail-page-CxxfLRJZ.js +0 -2
- package/dist/gateway/static/root/assets/notes-page-X2slSx7V.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-BvmUWqgu.js +0 -1
- package/dist/gateway/static/root/assets/schedule-field-CgJSCD3B.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-B0yESuuL.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-q2M8RKOo.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-CGozabLD.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-FoOSe6nU.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-Cy5zWyYQ.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-DaZNFro9.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-CnwtUzvw.js +0 -2
- package/dist/gateway/static/root/assets/system-settings-panel-DXs2VmBt.js +0 -1
- package/dist/gateway/static/root/assets/typed-models-lib-4gPuydz_.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DvKiOglO.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-CAVZcONQ.js +0 -18
- package/dist/src/agent/context/workspace-templates/USER.md +0 -24
- package/dist/src/agent/fallback/error.d.ts +0 -22
- package/dist/src/agent/fallback/error.js +0 -32
- package/dist/src/agent/fallback/error.js.map +0 -1
- package/dist/src/agent/fallback/index.d.ts +0 -5
- package/dist/src/agent/fallback/index.js +0 -9
- package/dist/src/agent/fallback/index.js.map +0 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +0 -29
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +0 -76
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +0 -1
- package/dist/src/agent/service/reconcile-dreaming-cron.d.ts +0 -6
- package/dist/src/agent/service/reconcile-dreaming-cron.js +0 -84
- package/dist/src/agent/service/reconcile-dreaming-cron.js.map +0 -1
- package/dist/src/agent/tools/cronjob-tool.d.ts +0 -29
- package/dist/src/agent/tools/cronjob-tool.js +0 -274
- package/dist/src/agent/tools/cronjob-tool.js.map +0 -1
- package/dist/src/cli/commands/cron-cli.d.ts +0 -2
- package/dist/src/cli/commands/cron-cli.js +0 -15
- package/dist/src/cli/commands/cron-cli.js.map +0 -1
- package/dist/src/cli/commands/cron.d.ts +0 -4
- package/dist/src/cli/commands/cron.js +0 -188
- package/dist/src/cli/commands/cron.js.map +0 -1
- package/dist/src/cli/commands/doctor/checks/cron-health.js +0 -35
- package/dist/src/cli/commands/doctor/checks/cron-health.js.map +0 -1
- package/dist/src/cron/execution-types.d.ts +0 -42
- package/dist/src/cron/executor.d.ts +0 -67
- package/dist/src/cron/executor.js +0 -669
- package/dist/src/cron/executor.js.map +0 -1
- package/dist/src/cron/index.d.ts +0 -7
- package/dist/src/cron/index.js +0 -7
- package/dist/src/cron/job-content.d.ts +0 -5
- package/dist/src/cron/job-content.js +0 -15
- package/dist/src/cron/job-content.js.map +0 -1
- package/dist/src/cron/run-log-store.d.ts +0 -12
- package/dist/src/cron/run-log-store.js +0 -58
- package/dist/src/cron/run-log-store.js.map +0 -1
- package/dist/src/cron/schedule.d.ts +0 -10
- package/dist/src/cron/schedule.js +0 -85
- package/dist/src/cron/schedule.js.map +0 -1
- package/dist/src/cron/service.d.ts +0 -58
- package/dist/src/cron/service.js +0 -419
- package/dist/src/cron/service.js.map +0 -1
- package/dist/src/cron/types.d.ts +0 -183
- package/dist/src/cron/validation.d.ts +0 -500
- package/dist/src/cron/validation.js +0 -192
- package/dist/src/cron/validation.js.map +0 -1
- package/dist/src/cron/workflow-run-completion.d.ts +0 -23
- package/dist/src/cron/workflow-run-completion.js +0 -72
- package/dist/src/cron/workflow-run-completion.js.map +0 -1
- package/dist/src/extensions/types/phase4.js +0 -1
- package/dist/src/gateway/hono/routes/cron.d.ts +0 -3
- package/dist/src/gateway/hono/routes/cron.js +0 -109
- package/dist/src/gateway/hono/routes/cron.js.map +0 -1
- package/dist/src/storage/sqlite/cron-job-repository.d.ts +0 -6
- package/dist/src/storage/sqlite/cron-job-repository.js +0 -70
- package/dist/src/storage/sqlite/cron-job-repository.js.map +0 -1
- package/dist/src/storage/sqlite/cron-run-repository.d.ts +0 -5
- package/dist/src/storage/sqlite/cron-run-repository.js +0 -96
- package/dist/src/storage/sqlite/cron-run-repository.js.map +0 -1
- /package/dist/src/{cron → automations/domain}/types.js +0 -0
- /package/dist/src/{config/defaults.d.ts → automations/draft/automation-draft.types.js} +0 -0
- /package/dist/src/{config/defaults.js → extensions/types/registration.js} +0 -0
- /package/dist/src/{cron/execution-types.js → migrations/types.js} +0 -0
|
@@ -4,22 +4,14 @@
|
|
|
4
4
|
* Handles model selection, switching, and automatic fallback
|
|
5
5
|
* when a provider fails.
|
|
6
6
|
*/
|
|
7
|
-
import { Agent
|
|
7
|
+
import { Agent } from '@earendil-works/pi-agent-core';
|
|
8
8
|
import type { Model, Api } from '@earendil-works/pi-ai';
|
|
9
9
|
import { type Config } from '../../config/schema.js';
|
|
10
|
-
import { type ModelCandidate } from '../fallback/
|
|
10
|
+
import { type ModelCandidate } from '../fallback/candidates.js';
|
|
11
11
|
export interface ModelManagerConfig {
|
|
12
12
|
defaultModel?: string;
|
|
13
13
|
config?: Config;
|
|
14
14
|
}
|
|
15
|
-
export interface RunResult {
|
|
16
|
-
content: string | null;
|
|
17
|
-
usage?: {
|
|
18
|
-
prompt_tokens: number;
|
|
19
|
-
completion_tokens: number;
|
|
20
|
-
total_tokens: number;
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
15
|
export declare class ModelManager {
|
|
24
16
|
private defaultModel;
|
|
25
17
|
private config?;
|
|
@@ -28,12 +20,8 @@ export declare class ModelManager {
|
|
|
28
20
|
private sessionModels;
|
|
29
21
|
/** Baseline model from `agents.list` / defaults merge when the session agent is created. */
|
|
30
22
|
private sessionProfileDefaults;
|
|
31
|
-
private
|
|
23
|
+
private sessionProfileFallbacks;
|
|
32
24
|
constructor(config?: ModelManagerConfig);
|
|
33
|
-
/**
|
|
34
|
-
* Set channel manager reference for accessing session-specific settings
|
|
35
|
-
*/
|
|
36
|
-
setChannelManager(channelManager: any): void;
|
|
37
25
|
/**
|
|
38
26
|
* Apply updated config so default model and failover metadata match disk/runtime config.
|
|
39
27
|
*/
|
|
@@ -42,7 +30,7 @@ export declare class ModelManager {
|
|
|
42
30
|
* Set the config-derived default model for a session (from effective agent profile).
|
|
43
31
|
* Cleared by {@link updateFromConfig} or {@link clearSessionProfileDefault}.
|
|
44
32
|
*/
|
|
45
|
-
setSessionProfileDefault(sessionKey: string, modelRef: string): void;
|
|
33
|
+
setSessionProfileDefault(sessionKey: string, modelRef: string, fallbacks?: string[]): void;
|
|
46
34
|
clearSessionProfileDefault(sessionKey: string): void;
|
|
47
35
|
/**
|
|
48
36
|
* Get current model name
|
|
@@ -78,10 +66,6 @@ export declare class ModelManager {
|
|
|
78
66
|
* Apply a resolved pi-ai model and sync {@link currentModelName} / {@link currentProvider}.
|
|
79
67
|
*/
|
|
80
68
|
applyResolvedModel(agent: Agent, model: Model<Api>, modelRef: string): void;
|
|
81
|
-
/**
|
|
82
|
-
* Run the agent with automatic model fallback on failure.
|
|
83
|
-
*/
|
|
84
|
-
runWithFallback(agent: Agent, sessionKey: string, userMessage: AgentMessage, provider: string, model: string): Promise<RunResult>;
|
|
85
69
|
/**
|
|
86
70
|
* Find model by reference (provider/modelId)
|
|
87
71
|
*/
|
|
@@ -2,28 +2,13 @@ import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
|
|
|
2
2
|
import { createLogger } from "../../utils/logger/index.js";
|
|
3
3
|
import { init_logger } from "../../utils/logger.js";
|
|
4
4
|
import { getAllModels, getDefaultModelSync, init_providers, resolveModel } from "../../providers/index.js";
|
|
5
|
-
import { resolveAgentTurnTimeoutMs, runAgentTurnWithTimeout } from "../orchestration/run-agent-turn-with-timeout.js";
|
|
6
|
-
import { isAssistantTurnAborted, isAssistantTurnFailed, maybeRetryTurnAfterTransientLlmFailure } from "../orchestration/llm-turn-retry.js";
|
|
7
|
-
import { describeFailoverError, isFailoverError } from "../fallback/error.js";
|
|
8
5
|
import { parseModelRef } from "./selection.js";
|
|
9
6
|
import { resolveFallbackCandidates } from "../fallback/candidates.js";
|
|
10
|
-
import "../fallback/index.js";
|
|
11
7
|
//#region src/agent/models/manager.ts
|
|
12
8
|
init_schema();
|
|
13
9
|
init_logger();
|
|
14
10
|
init_providers();
|
|
15
11
|
const log = createLogger("ModelManager");
|
|
16
|
-
/**
|
|
17
|
-
* Get the last assistant content from agent messages
|
|
18
|
-
*/
|
|
19
|
-
function getLastAssistantContent(agent) {
|
|
20
|
-
const messages = agent.state.messages;
|
|
21
|
-
for (let i = messages.length - 1; i >= 0; i--) {
|
|
22
|
-
const msg = messages[i];
|
|
23
|
-
if (msg.role === "assistant") return msg.content.filter((c) => c.type === "text").map((c) => c.text || "").join("");
|
|
24
|
-
}
|
|
25
|
-
return null;
|
|
26
|
-
}
|
|
27
12
|
var ModelManager = class {
|
|
28
13
|
defaultModel;
|
|
29
14
|
config;
|
|
@@ -32,7 +17,7 @@ var ModelManager = class {
|
|
|
32
17
|
sessionModels = /* @__PURE__ */ new Map();
|
|
33
18
|
/** Baseline model from `agents.list` / defaults merge when the session agent is created. */
|
|
34
19
|
sessionProfileDefaults = /* @__PURE__ */ new Map();
|
|
35
|
-
|
|
20
|
+
sessionProfileFallbacks = /* @__PURE__ */ new Map();
|
|
36
21
|
constructor(config = {}) {
|
|
37
22
|
this.config = config.config;
|
|
38
23
|
this.defaultModel = config.defaultModel || getDefaultModelSync(config.config);
|
|
@@ -40,12 +25,6 @@ var ModelManager = class {
|
|
|
40
25
|
this.currentProvider = this.defaultModel.split("/")[0] || "anthropic";
|
|
41
26
|
}
|
|
42
27
|
/**
|
|
43
|
-
* Set channel manager reference for accessing session-specific settings
|
|
44
|
-
*/
|
|
45
|
-
setChannelManager(channelManager) {
|
|
46
|
-
this.channelManager = channelManager;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
28
|
* Apply updated config so default model and failover metadata match disk/runtime config.
|
|
50
29
|
*/
|
|
51
30
|
updateFromConfig(config) {
|
|
@@ -53,16 +32,21 @@ var ModelManager = class {
|
|
|
53
32
|
const ref = getAgentDefaultModelRef(config);
|
|
54
33
|
this.defaultModel = ref ? ref : getDefaultModelSync(config);
|
|
55
34
|
this.sessionProfileDefaults.clear();
|
|
35
|
+
this.sessionProfileFallbacks.clear();
|
|
56
36
|
}
|
|
57
37
|
/**
|
|
58
38
|
* Set the config-derived default model for a session (from effective agent profile).
|
|
59
39
|
* Cleared by {@link updateFromConfig} or {@link clearSessionProfileDefault}.
|
|
60
40
|
*/
|
|
61
|
-
setSessionProfileDefault(sessionKey, modelRef) {
|
|
41
|
+
setSessionProfileDefault(sessionKey, modelRef, fallbacks = []) {
|
|
62
42
|
this.sessionProfileDefaults.set(sessionKey, modelRef);
|
|
43
|
+
const cleanFallbacks = fallbacks.map((ref) => ref.trim()).filter(Boolean);
|
|
44
|
+
if (cleanFallbacks.length > 0) this.sessionProfileFallbacks.set(sessionKey, cleanFallbacks);
|
|
45
|
+
else this.sessionProfileFallbacks.delete(sessionKey);
|
|
63
46
|
}
|
|
64
47
|
clearSessionProfileDefault(sessionKey) {
|
|
65
48
|
this.sessionProfileDefaults.delete(sessionKey);
|
|
49
|
+
this.sessionProfileFallbacks.delete(sessionKey);
|
|
66
50
|
}
|
|
67
51
|
/**
|
|
68
52
|
* Get current model name
|
|
@@ -156,7 +140,8 @@ var ModelManager = class {
|
|
|
156
140
|
return resolveFallbackCandidates({
|
|
157
141
|
cfg: this.config,
|
|
158
142
|
provider: parsed.provider,
|
|
159
|
-
model: parsed.model
|
|
143
|
+
model: parsed.model,
|
|
144
|
+
fallbacksOverride: this.sessionModels.has(sessionKey) ? void 0 : this.sessionProfileFallbacks.get(sessionKey)
|
|
160
145
|
});
|
|
161
146
|
}
|
|
162
147
|
/**
|
|
@@ -168,108 +153,6 @@ var ModelManager = class {
|
|
|
168
153
|
this.currentProvider = model.provider || "unknown";
|
|
169
154
|
}
|
|
170
155
|
/**
|
|
171
|
-
* Run the agent with automatic model fallback on failure.
|
|
172
|
-
*/
|
|
173
|
-
async runWithFallback(agent, sessionKey, userMessage, provider, model) {
|
|
174
|
-
const candidates = resolveFallbackCandidates({
|
|
175
|
-
cfg: this.config ?? void 0,
|
|
176
|
-
provider,
|
|
177
|
-
model
|
|
178
|
-
});
|
|
179
|
-
let lastError;
|
|
180
|
-
for (let i = 0; i < candidates.length; i++) {
|
|
181
|
-
const candidate = candidates[i];
|
|
182
|
-
const modelRef = `${candidate.provider}/${candidate.model}`;
|
|
183
|
-
let candidateModel;
|
|
184
|
-
try {
|
|
185
|
-
candidateModel = resolveModel(modelRef);
|
|
186
|
-
} catch {
|
|
187
|
-
log.warn({
|
|
188
|
-
provider: candidate.provider,
|
|
189
|
-
model: candidate.model
|
|
190
|
-
}, "Fallback model not found");
|
|
191
|
-
continue;
|
|
192
|
-
}
|
|
193
|
-
log.info({
|
|
194
|
-
attempt: i + 1,
|
|
195
|
-
total: candidates.length,
|
|
196
|
-
provider: candidate.provider,
|
|
197
|
-
model: candidate.model
|
|
198
|
-
}, "Attempting model");
|
|
199
|
-
const beforeLen = agent.state.messages.length;
|
|
200
|
-
try {
|
|
201
|
-
this.applyResolvedModel(agent, candidateModel, modelRef);
|
|
202
|
-
const runTurn = async () => {
|
|
203
|
-
await agent.prompt(userMessage);
|
|
204
|
-
await agent.waitForIdle();
|
|
205
|
-
await maybeRetryTurnAfterTransientLlmFailure(agent, {
|
|
206
|
-
sessionKey,
|
|
207
|
-
log
|
|
208
|
-
});
|
|
209
|
-
};
|
|
210
|
-
await runAgentTurnWithTimeout(agent, runTurn, resolveAgentTurnTimeoutMs(this.config));
|
|
211
|
-
if (isAssistantTurnAborted(agent)) {
|
|
212
|
-
const usage = agent.state.lastUsage;
|
|
213
|
-
return {
|
|
214
|
-
content: getLastAssistantContent(agent),
|
|
215
|
-
usage
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
if (!isAssistantTurnFailed(agent)) {
|
|
219
|
-
const usage = agent.state.lastUsage;
|
|
220
|
-
log.info({
|
|
221
|
-
provider: candidate.provider,
|
|
222
|
-
model: candidate.model,
|
|
223
|
-
success: true
|
|
224
|
-
}, "Model call completed");
|
|
225
|
-
return {
|
|
226
|
-
content: getLastAssistantContent(agent),
|
|
227
|
-
usage
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
|
-
lastError = /* @__PURE__ */ new Error(`Assistant turn failed: ${modelRef}`);
|
|
231
|
-
log.warn({
|
|
232
|
-
attempt: i + 1,
|
|
233
|
-
sessionKey,
|
|
234
|
-
modelRef
|
|
235
|
-
}, "Model turn failed after retries, trying fallback");
|
|
236
|
-
} catch (err) {
|
|
237
|
-
lastError = err;
|
|
238
|
-
if (err instanceof DOMException && err.name === "AbortError") {
|
|
239
|
-
log.info({ sessionKey }, "User aborted model call");
|
|
240
|
-
throw err;
|
|
241
|
-
}
|
|
242
|
-
const errorDetails = {
|
|
243
|
-
attempt: i + 1,
|
|
244
|
-
provider: candidate.provider,
|
|
245
|
-
model: candidate.model,
|
|
246
|
-
errorMessage: err instanceof Error ? err.message : String(err)
|
|
247
|
-
};
|
|
248
|
-
if (isFailoverError(err)) {
|
|
249
|
-
const described = describeFailoverError(err);
|
|
250
|
-
log.warn({
|
|
251
|
-
...errorDetails,
|
|
252
|
-
...described
|
|
253
|
-
}, "Model call failed, trying fallback");
|
|
254
|
-
} else log.warn(errorDetails, "Model call failed, trying fallback");
|
|
255
|
-
}
|
|
256
|
-
agent.state.messages = agent.state.messages.slice(0, beforeLen);
|
|
257
|
-
}
|
|
258
|
-
if (lastError) {
|
|
259
|
-
const em = lastError instanceof Error ? lastError.message : String(lastError);
|
|
260
|
-
const attemptedModelRefs = candidates.map((c) => `${c.provider}/${c.model}`);
|
|
261
|
-
log.error({
|
|
262
|
-
err: lastError instanceof Error ? lastError : void 0,
|
|
263
|
-
errorMessage: em,
|
|
264
|
-
attemptedCandidates: candidates.length,
|
|
265
|
-
attemptedModelRefs,
|
|
266
|
-
sessionKey
|
|
267
|
-
}, `All model candidates failed (${candidates.length} refs): ${em}`);
|
|
268
|
-
throw lastError instanceof Error ? lastError : new Error(String(lastError));
|
|
269
|
-
}
|
|
270
|
-
return { content: null };
|
|
271
|
-
}
|
|
272
|
-
/**
|
|
273
156
|
* Find model by reference (provider/modelId)
|
|
274
157
|
*/
|
|
275
158
|
findByRef(ref) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","names":["getAllModelsFromProviders"],"sources":["../../../../src/agent/models/manager.ts"],"sourcesContent":["/**\n * Model management module\n * \n * Handles model selection, switching, and automatic fallback\n * when a provider fails.\n */\n\nimport { Agent, type AgentMessage } from '@earendil-works/pi-agent-core';\nimport type { Model, Api } from '@earendil-works/pi-ai';\nimport { type Config, getAgentDefaultModelRef } from '../../config/schema.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { resolveModel, getAllModels as getAllModelsFromProviders, getDefaultModelSync } from '../../providers/index.js';\nimport {\n isFailoverError,\n describeFailoverError,\n resolveFallbackCandidates,\n type ModelCandidate,\n} from '../fallback/index.js';\nimport { parseModelRef } from './selection.js';\nimport {\n isAssistantTurnAborted,\n isAssistantTurnFailed,\n maybeRetryTurnAfterTransientLlmFailure,\n} from '../orchestration/llm-turn-retry.js';\nimport {\n resolveAgentTurnTimeoutMs,\n runAgentTurnWithTimeout,\n} from '../orchestration/run-agent-turn-with-timeout.js';\n\nconst log = createLogger('ModelManager');\n\nexport interface ModelManagerConfig {\n defaultModel?: string;\n config?: Config;\n}\n\nexport interface RunResult {\n content: string | null;\n usage?: {\n prompt_tokens: number;\n completion_tokens: number;\n total_tokens: number;\n };\n}\n\n/**\n * Get the last assistant content from agent messages\n */\nfunction getLastAssistantContent(agent: Agent): string | null {\n const messages = agent.state.messages;\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (msg.role === 'assistant') {\n return msg.content\n .filter((c) => c.type === 'text')\n .map((c) => c.text || '')\n .join('');\n }\n }\n return null;\n}\n\nexport class ModelManager {\n private defaultModel: string;\n private config?: Config;\n private currentModelName: string;\n private currentProvider: string;\n private sessionModels: Map<string, string> = new Map();\n /** Baseline model from `agents.list` / defaults merge when the session agent is created. */\n private sessionProfileDefaults: Map<string, string> = new Map();\n private channelManager?: any;\n\n constructor(config: ModelManagerConfig = {}) {\n this.config = config.config;\n this.defaultModel = config.defaultModel || getDefaultModelSync(config.config);\n this.currentModelName = this.defaultModel;\n this.currentProvider = this.defaultModel.split('/')[0] || 'anthropic';\n }\n\n /**\n * Set channel manager reference for accessing session-specific settings\n */\n setChannelManager(channelManager: any): void {\n this.channelManager = channelManager;\n }\n\n /**\n * Apply updated config so default model and failover metadata match disk/runtime config.\n */\n updateFromConfig(config: Config): void {\n this.config = config;\n const ref = getAgentDefaultModelRef(config);\n this.defaultModel = ref ? ref : getDefaultModelSync(config);\n this.sessionProfileDefaults.clear();\n }\n\n /**\n * Set the config-derived default model for a session (from effective agent profile).\n * Cleared by {@link updateFromConfig} or {@link clearSessionProfileDefault}.\n */\n setSessionProfileDefault(sessionKey: string, modelRef: string): void {\n this.sessionProfileDefaults.set(sessionKey, modelRef);\n }\n\n clearSessionProfileDefault(sessionKey: string): void {\n this.sessionProfileDefaults.delete(sessionKey);\n }\n\n /**\n * Get current model name\n */\n getCurrentModel(): string {\n return this.currentModelName;\n }\n\n /**\n * Get current provider\n */\n getCurrentProvider(): string {\n return this.currentProvider;\n }\n\n /**\n * Switch model for a specific session\n */\n async switchModelForSession(sessionKey: string, modelId: string): Promise<boolean> {\n try {\n resolveModel(modelId);\n this.sessionModels.set(sessionKey, modelId);\n log.info({ sessionKey, modelId }, 'Model switched for session');\n return true;\n } catch (err) {\n log.error({ err, sessionKey, modelId }, 'Failed to switch model');\n return false;\n }\n }\n\n /** Drop in-memory session override so the global default is used again. */\n clearSessionModelOverride(sessionKey: string): void {\n this.sessionModels.delete(sessionKey);\n }\n\n /**\n * Resolved pi-ai model for session (for transcript policy, tools, etc.)\n */\n getResolvedModelForSession(sessionKey: string): Model<Api> {\n return resolveModel(this.getModelForSession(sessionKey));\n }\n\n /**\n * Get model for session, checking session override first\n */\n getModelForSession(sessionKey: string): string {\n const sessionModel = this.sessionModels.get(sessionKey);\n if (sessionModel) {\n return sessionModel;\n }\n\n const profileDefault = this.sessionProfileDefaults.get(sessionKey);\n if (profileDefault) {\n return profileDefault;\n }\n\n return this.defaultModel;\n }\n\n /**\n * Apply model to agent if different from current\n */\n async applyModelForSession(agent: Agent, sessionKey: string): Promise<void> {\n const targetModelId = this.getModelForSession(sessionKey);\n\n let found: Model<Api>;\n try {\n found = resolveModel(targetModelId);\n } catch (err) {\n log.error({ err, sessionKey, modelId: targetModelId }, 'Failed to apply model');\n return;\n }\n\n const sm = agent.state.model as Model<Api> | undefined;\n if (sm && sm.provider === found.provider && sm.id === found.id) {\n this.currentModelName = targetModelId;\n this.currentProvider = found.provider || 'unknown';\n return;\n }\n\n agent.state.model = found;\n this.currentModelName = targetModelId;\n this.currentProvider = found.provider || 'unknown';\n\n log.info({ sessionKey, modelId: targetModelId }, 'Applied model for session');\n }\n\n /**\n * Ordered model candidates for the session.\n */\n getFallbackCandidatesForSession(sessionKey: string): ModelCandidate[] {\n const ref = this.getModelForSession(sessionKey);\n const parsed = parseModelRef(ref);\n if (!parsed) {\n return [];\n }\n return resolveFallbackCandidates({\n cfg: this.config,\n provider: parsed.provider,\n model: parsed.model,\n });\n }\n\n /**\n * Apply a resolved pi-ai model and sync {@link currentModelName} / {@link currentProvider}.\n */\n applyResolvedModel(agent: Agent, model: Model<Api>, modelRef: string): void {\n agent.state.model = model;\n this.currentModelName = modelRef;\n this.currentProvider = model.provider || 'unknown';\n }\n\n /**\n * Run the agent with automatic model fallback on failure.\n */\n async runWithFallback(\n agent: Agent,\n sessionKey: string,\n userMessage: AgentMessage,\n provider: string,\n model: string\n ): Promise<RunResult> {\n const candidates = resolveFallbackCandidates({\n cfg: this.config ?? undefined,\n provider,\n model,\n });\n\n let lastError: unknown;\n\n for (let i = 0; i < candidates.length; i++) {\n const candidate = candidates[i];\n const modelRef = `${candidate.provider}/${candidate.model}`;\n\n let candidateModel: Model<Api>;\n try {\n candidateModel = resolveModel(modelRef);\n } catch {\n log.warn({ provider: candidate.provider, model: candidate.model }, 'Fallback model not found');\n continue;\n }\n\n log.info(\n { attempt: i + 1, total: candidates.length, provider: candidate.provider, model: candidate.model },\n 'Attempting model',\n );\n\n const beforeLen = agent.state.messages.length;\n\n try {\n this.applyResolvedModel(agent, candidateModel, modelRef);\n\n const runTurn = async () => {\n await agent.prompt(userMessage);\n await agent.waitForIdle();\n await maybeRetryTurnAfterTransientLlmFailure(agent, { sessionKey, log });\n };\n\n await runAgentTurnWithTimeout(agent, runTurn, resolveAgentTurnTimeoutMs(this.config));\n\n if (isAssistantTurnAborted(agent)) {\n const usage = (agent.state as { lastUsage?: RunResult['usage'] }).lastUsage;\n return { content: getLastAssistantContent(agent), usage };\n }\n\n if (!isAssistantTurnFailed(agent)) {\n const usage = (agent.state as { lastUsage?: RunResult['usage'] }).lastUsage;\n log.info(\n { provider: candidate.provider, model: candidate.model, success: true },\n 'Model call completed',\n );\n return { content: getLastAssistantContent(agent), usage };\n }\n\n lastError = new Error(`Assistant turn failed: ${modelRef}`);\n log.warn(\n { attempt: i + 1, sessionKey, modelRef },\n 'Model turn failed after retries, trying fallback',\n );\n } catch (err) {\n lastError = err;\n if (err instanceof DOMException && err.name === 'AbortError') {\n log.info({ sessionKey }, 'User aborted model call');\n throw err;\n }\n\n const errorDetails = {\n attempt: i + 1,\n provider: candidate.provider,\n model: candidate.model,\n errorMessage: err instanceof Error ? err.message : String(err),\n };\n\n if (isFailoverError(err)) {\n const described = describeFailoverError(err);\n log.warn({ ...errorDetails, ...described }, 'Model call failed, trying fallback');\n } else {\n log.warn(errorDetails, 'Model call failed, trying fallback');\n }\n }\n\n agent.state.messages = agent.state.messages.slice(0, beforeLen);\n }\n\n if (lastError) {\n const em = lastError instanceof Error ? lastError.message : String(lastError);\n const attemptedModelRefs = candidates.map((c) => `${c.provider}/${c.model}`);\n log.error(\n {\n err: lastError instanceof Error ? lastError : undefined,\n errorMessage: em,\n attemptedCandidates: candidates.length,\n attemptedModelRefs,\n sessionKey,\n },\n `All model candidates failed (${candidates.length} refs): ${em}`,\n );\n throw lastError instanceof Error ? lastError : new Error(String(lastError));\n }\n\n return { content: null };\n }\n\n /**\n * Find model by reference (provider/modelId)\n */\n findByRef(ref: string): Model<Api> | undefined {\n try {\n return resolveModel(ref);\n } catch {\n return undefined;\n }\n }\n\n /**\n * Find model by provider and ID\n */\n find(provider: string, modelId: string): Model<Api> | undefined {\n try {\n return resolveModel(`${provider}/${modelId}`);\n } catch {\n return undefined;\n }\n }\n\n /**\n * Get all available models\n */\n getAllModels(): readonly Model<Api>[] {\n return getAllModelsFromProviders();\n }\n\n /**\n * Get models grouped by provider\n */\n getModelsByProvider(): Map<string, Model<Api>[]> {\n const all = this.getAllModels();\n const grouped = new Map<string, Model<Api>[]>();\n for (const model of all) {\n const list = grouped.get(model.provider) ?? [];\n list.push(model);\n grouped.set(model.provider, list);\n }\n return grouped;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"manager.js","names":["getAllModelsFromProviders"],"sources":["../../../../src/agent/models/manager.ts"],"sourcesContent":["/**\n * Model management module\n * \n * Handles model selection, switching, and automatic fallback\n * when a provider fails.\n */\n\nimport { Agent } from '@earendil-works/pi-agent-core';\nimport type { Model, Api } from '@earendil-works/pi-ai';\nimport { type Config, getAgentDefaultModelRef } from '../../config/schema.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { resolveModel, getAllModels as getAllModelsFromProviders, getDefaultModelSync } from '../../providers/index.js';\nimport { resolveFallbackCandidates, type ModelCandidate } from '../fallback/candidates.js';\nimport { parseModelRef } from './selection.js';\n\nconst log = createLogger('ModelManager');\n\nexport interface ModelManagerConfig {\n defaultModel?: string;\n config?: Config;\n}\n\nexport class ModelManager {\n private defaultModel: string;\n private config?: Config;\n private currentModelName: string;\n private currentProvider: string;\n private sessionModels: Map<string, string> = new Map();\n /** Baseline model from `agents.list` / defaults merge when the session agent is created. */\n private sessionProfileDefaults: Map<string, string> = new Map();\n private sessionProfileFallbacks: Map<string, string[]> = new Map();\n\n constructor(config: ModelManagerConfig = {}) {\n this.config = config.config;\n this.defaultModel = config.defaultModel || getDefaultModelSync(config.config);\n this.currentModelName = this.defaultModel;\n this.currentProvider = this.defaultModel.split('/')[0] || 'anthropic';\n }\n\n /**\n * Apply updated config so default model and failover metadata match disk/runtime config.\n */\n updateFromConfig(config: Config): void {\n this.config = config;\n const ref = getAgentDefaultModelRef(config);\n this.defaultModel = ref ? ref : getDefaultModelSync(config);\n this.sessionProfileDefaults.clear();\n this.sessionProfileFallbacks.clear();\n }\n\n /**\n * Set the config-derived default model for a session (from effective agent profile).\n * Cleared by {@link updateFromConfig} or {@link clearSessionProfileDefault}.\n */\n setSessionProfileDefault(sessionKey: string, modelRef: string, fallbacks: string[] = []): void {\n this.sessionProfileDefaults.set(sessionKey, modelRef);\n const cleanFallbacks = fallbacks.map((ref) => ref.trim()).filter(Boolean);\n if (cleanFallbacks.length > 0) {\n this.sessionProfileFallbacks.set(sessionKey, cleanFallbacks);\n } else {\n this.sessionProfileFallbacks.delete(sessionKey);\n }\n }\n\n clearSessionProfileDefault(sessionKey: string): void {\n this.sessionProfileDefaults.delete(sessionKey);\n this.sessionProfileFallbacks.delete(sessionKey);\n }\n\n /**\n * Get current model name\n */\n getCurrentModel(): string {\n return this.currentModelName;\n }\n\n /**\n * Get current provider\n */\n getCurrentProvider(): string {\n return this.currentProvider;\n }\n\n /**\n * Switch model for a specific session\n */\n async switchModelForSession(sessionKey: string, modelId: string): Promise<boolean> {\n try {\n resolveModel(modelId);\n this.sessionModels.set(sessionKey, modelId);\n log.info({ sessionKey, modelId }, 'Model switched for session');\n return true;\n } catch (err) {\n log.error({ err, sessionKey, modelId }, 'Failed to switch model');\n return false;\n }\n }\n\n /** Drop in-memory session override so the global default is used again. */\n clearSessionModelOverride(sessionKey: string): void {\n this.sessionModels.delete(sessionKey);\n }\n\n /**\n * Resolved pi-ai model for session (for transcript policy, tools, etc.)\n */\n getResolvedModelForSession(sessionKey: string): Model<Api> {\n return resolveModel(this.getModelForSession(sessionKey));\n }\n\n /**\n * Get model for session, checking session override first\n */\n getModelForSession(sessionKey: string): string {\n const sessionModel = this.sessionModels.get(sessionKey);\n if (sessionModel) {\n return sessionModel;\n }\n\n const profileDefault = this.sessionProfileDefaults.get(sessionKey);\n if (profileDefault) {\n return profileDefault;\n }\n\n return this.defaultModel;\n }\n\n /**\n * Apply model to agent if different from current\n */\n async applyModelForSession(agent: Agent, sessionKey: string): Promise<void> {\n const targetModelId = this.getModelForSession(sessionKey);\n\n let found: Model<Api>;\n try {\n found = resolveModel(targetModelId);\n } catch (err) {\n log.error({ err, sessionKey, modelId: targetModelId }, 'Failed to apply model');\n return;\n }\n\n const sm = agent.state.model as Model<Api> | undefined;\n if (sm && sm.provider === found.provider && sm.id === found.id) {\n this.currentModelName = targetModelId;\n this.currentProvider = found.provider || 'unknown';\n return;\n }\n\n agent.state.model = found;\n this.currentModelName = targetModelId;\n this.currentProvider = found.provider || 'unknown';\n\n log.info({ sessionKey, modelId: targetModelId }, 'Applied model for session');\n }\n\n /**\n * Ordered model candidates for the session.\n */\n getFallbackCandidatesForSession(sessionKey: string): ModelCandidate[] {\n const ref = this.getModelForSession(sessionKey);\n const parsed = parseModelRef(ref);\n if (!parsed) {\n return [];\n }\n return resolveFallbackCandidates({\n cfg: this.config,\n provider: parsed.provider,\n model: parsed.model,\n fallbacksOverride: this.sessionModels.has(sessionKey)\n ? undefined\n : this.sessionProfileFallbacks.get(sessionKey),\n });\n }\n\n /**\n * Apply a resolved pi-ai model and sync {@link currentModelName} / {@link currentProvider}.\n */\n applyResolvedModel(agent: Agent, model: Model<Api>, modelRef: string): void {\n agent.state.model = model;\n this.currentModelName = modelRef;\n this.currentProvider = model.provider || 'unknown';\n }\n\n /**\n * Find model by reference (provider/modelId)\n */\n findByRef(ref: string): Model<Api> | undefined {\n try {\n return resolveModel(ref);\n } catch {\n return undefined;\n }\n }\n\n /**\n * Find model by provider and ID\n */\n find(provider: string, modelId: string): Model<Api> | undefined {\n try {\n return resolveModel(`${provider}/${modelId}`);\n } catch {\n return undefined;\n }\n }\n\n /**\n * Get all available models\n */\n getAllModels(): readonly Model<Api>[] {\n return getAllModelsFromProviders();\n }\n\n /**\n * Get models grouped by provider\n */\n getModelsByProvider(): Map<string, Model<Api>[]> {\n const all = this.getAllModels();\n const grouped = new Map<string, Model<Api>[]>();\n for (const model of all) {\n const list = grouped.get(model.provider) ?? [];\n list.push(model);\n grouped.set(model.provider, list);\n }\n return grouped;\n }\n}\n"],"mappings":"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"}
|
|
@@ -46,15 +46,11 @@ export declare class AgentOrchestrator {
|
|
|
46
46
|
private agentManager;
|
|
47
47
|
private sessionStore;
|
|
48
48
|
private modelManager;
|
|
49
|
-
private eventHandler;
|
|
50
49
|
private feedbackCoordinator;
|
|
51
50
|
private sessionConfigStore;
|
|
52
51
|
private sessionHydrator;
|
|
53
52
|
private getThinkingDefault;
|
|
54
53
|
private getThinkingDefaultForSession?;
|
|
55
|
-
private workspaceRoot;
|
|
56
|
-
private getWorkspaceRootForSession?;
|
|
57
|
-
private getAgentInternalStorageRootForSession;
|
|
58
54
|
private enqueueAutoTitle?;
|
|
59
55
|
private getConfig?;
|
|
60
56
|
private onEmbeddedStreamEvent?;
|
|
@@ -19,15 +19,11 @@ var AgentOrchestrator = class {
|
|
|
19
19
|
agentManager;
|
|
20
20
|
sessionStore;
|
|
21
21
|
modelManager;
|
|
22
|
-
eventHandler;
|
|
23
22
|
feedbackCoordinator;
|
|
24
23
|
sessionConfigStore;
|
|
25
24
|
sessionHydrator;
|
|
26
25
|
getThinkingDefault;
|
|
27
26
|
getThinkingDefaultForSession;
|
|
28
|
-
workspaceRoot;
|
|
29
|
-
getWorkspaceRootForSession;
|
|
30
|
-
getAgentInternalStorageRootForSession;
|
|
31
27
|
enqueueAutoTitle;
|
|
32
28
|
getConfig;
|
|
33
29
|
onEmbeddedStreamEvent;
|
|
@@ -36,15 +32,11 @@ var AgentOrchestrator = class {
|
|
|
36
32
|
this.agentManager = config.agentManager;
|
|
37
33
|
this.sessionStore = config.sessionStore;
|
|
38
34
|
this.modelManager = config.modelManager;
|
|
39
|
-
this.eventHandler = config.eventHandler;
|
|
40
35
|
this.feedbackCoordinator = config.feedbackCoordinator;
|
|
41
36
|
this.sessionConfigStore = config.sessionConfigStore;
|
|
42
37
|
this.sessionHydrator = config.sessionHydrator;
|
|
43
38
|
this.getThinkingDefault = config.getThinkingDefault;
|
|
44
39
|
this.getThinkingDefaultForSession = config.getThinkingDefaultForSession;
|
|
45
|
-
this.workspaceRoot = config.workspaceRoot;
|
|
46
|
-
this.getWorkspaceRootForSession = config.getWorkspaceRootForSession;
|
|
47
|
-
this.getAgentInternalStorageRootForSession = config.getAgentInternalStorageRootForSession ?? ((sk) => this.getWorkspaceRootForSession?.(sk) ?? this.workspaceRoot);
|
|
48
40
|
this.enqueueAutoTitle = config.enqueueAutoTitle;
|
|
49
41
|
this.getConfig = config.getConfig;
|
|
50
42
|
this.onEmbeddedStreamEvent = config.onEmbeddedStreamEvent;
|
|
@@ -57,7 +49,7 @@ var AgentOrchestrator = class {
|
|
|
57
49
|
const { sessionKey } = context;
|
|
58
50
|
log.debug({ sessionKey }, "Processing message through agent orchestrator");
|
|
59
51
|
await this.sessionHydrator.workspace(sessionKey);
|
|
60
|
-
if (typeof msg.content === "string" && (sessionKey.startsWith("cron:") || context.channel === "cron")) {
|
|
52
|
+
if (typeof msg.content === "string" && (sessionKey.startsWith("cron:") || sessionKey.includes(":cron:") || sessionKey.includes(":automation:") || context.channel === "cron" || context.channel === "automation")) {
|
|
61
53
|
const content = msg.content;
|
|
62
54
|
if (content.includes("__xopc_memory_dreaming_sweep__") || content.includes("__xopc_memory_dreaming_light_sweep__") || content.includes("__xopc_memory_dreaming_rem_sweep__")) {
|
|
63
55
|
const workspaceDir = this.agentManager.getResolvedWorkspaceForSession(sessionKey);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-orchestrator.js","names":[],"sources":["../../../../src/agent/orchestration/agent-orchestrator.ts"],"sourcesContent":["/**\n * Agent Orchestrator - Coordinates Agent execution flow\n *\n * Manages the complete agent execution pipeline from message processing\n * to response generation.\n */\n\nimport type { Config } from '../../config/schema.js';\nimport type { InboundMessage } from '../../infra/bus/index.js';\nimport type { SessionConfigStore, SessionStore } from '../../session/index.js';\nimport type { SessionHydrator } from '../session/index.js';\nimport { resolveEffectiveThinkingLevel } from '../../session/thinking-resolve.js';\nimport type { ThinkLevel } from '../transcript/thinking-types.js';\nimport type { ModelManager } from '../models/index.js';\nimport type { SessionContext } from '../session/session-context.js';\nimport type { AgentEventHandler } from './agent-event-handler.js';\nimport type { FeedbackCoordinator } from '../feedback/feedback-coordinator.js';\nimport type { AgentManager } from '../agent-manager.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { extractAgentUserPlainText } from '../memory/user-message-text.js';\nimport { abortEmbeddedRun } from '../embedded/runs.js';\nimport { runEmbeddedTurnForSession } from '../embedded/run-for-session.js';\nimport type { EmbeddedStreamEvent } from '../embedded/types.js';\nimport { persistInboundAttachments } from '../../channels/attachments/inbound-persist.js';\nimport {\n buildTranscriptUserMessage,\n clearPendingTranscriptUserMessage,\n hydrateUserTurnForLlm,\n setPendingTranscriptUserMessage,\n} from '../inbound/attachment-pipeline.js';\nimport {\n DREAMING_SWEEP_TOKEN,\n DREAMING_LIGHT_SWEEP_TOKEN,\n DREAMING_REM_SWEEP_TOKEN,\n} from '../memory/dreaming/constants.js';\nimport { resolveDreamingConfig } from '../memory/dreaming/config.js';\nimport { runDreamingDeepPromotion } from '../memory/dreaming/deep-promotion.js';\nimport { appendDreamingEvent, type DreamingEvent } from '../memory/dreaming/events.js';\nimport { runLightSweep } from '../memory/dreaming/light-sweep.js';\nimport { runRemPatterns } from '../memory/dreaming/rem-patterns.js';\n\nconst log = createLogger('AgentOrchestrator');\n\nexport interface AgentOrchestratorConfig {\n agentManager: AgentManager;\n sessionStore: SessionStore;\n modelManager: ModelManager;\n eventHandler: AgentEventHandler;\n feedbackCoordinator: FeedbackCoordinator;\n sessionConfigStore: SessionConfigStore;\n /** Per-session hydration (workspace override + model override) before the agent runs. */\n sessionHydrator: SessionHydrator;\n getThinkingDefault: () => ThinkLevel | undefined;\n /** Per-session default from merged `agents.list` / defaults (optional). */\n getThinkingDefaultForSession?: (sessionKey: string) => ThinkLevel | undefined;\n /** Default workspace root when no per-session resolver is set. */\n workspaceRoot: string;\n /** Per-agent workspace root for attachments (optional; defaults to `workspaceRoot`). */\n getWorkspaceRootForSession?: (sessionKey: string) => string;\n /** Agent home (`…/agents/<id>/`) for inbound/TTS files — keeps internal state out of the markdown workspace. */\n getAgentInternalStorageRootForSession?: (sessionKey: string) => string;\n /** Fire-and-forget after full session persist (e.g. LLM session title); not called from mid-turn snapshots. */\n enqueueAutoTitle?: (sessionKey: string) => void;\n /** For per-turn timeout. */\n getConfig?: () => Config | undefined;\n /** Channel streaming: token/tool events from pi embedded session. */\n onEmbeddedStreamEvent?: (sessionKey: string, event: EmbeddedStreamEvent) => void;\n /** Called after a successful embedded turn with assistant plain text. */\n onEmbeddedTurnComplete?: (sessionKey: string, lastAssistantText?: string) => void;\n}\n\nexport class AgentOrchestrator {\n private agentManager: AgentManager;\n private sessionStore: SessionStore;\n private modelManager: ModelManager;\n private eventHandler: AgentEventHandler;\n private feedbackCoordinator: FeedbackCoordinator;\n private sessionConfigStore: SessionConfigStore;\n private sessionHydrator: SessionHydrator;\n private getThinkingDefault: () => ThinkLevel | undefined;\n private getThinkingDefaultForSession?: (sessionKey: string) => ThinkLevel | undefined;\n private workspaceRoot: string;\n private getWorkspaceRootForSession?: (sessionKey: string) => string;\n private getAgentInternalStorageRootForSession: (sessionKey: string) => string;\n private enqueueAutoTitle?: (sessionKey: string) => void;\n private getConfig?: () => Config | undefined;\n private onEmbeddedStreamEvent?: (sessionKey: string, event: EmbeddedStreamEvent) => void;\n private onEmbeddedTurnComplete?: (sessionKey: string, lastAssistantText?: string) => void;\n\n constructor(config: AgentOrchestratorConfig) {\n this.agentManager = config.agentManager;\n this.sessionStore = config.sessionStore;\n this.modelManager = config.modelManager;\n this.eventHandler = config.eventHandler;\n this.feedbackCoordinator = config.feedbackCoordinator;\n this.sessionConfigStore = config.sessionConfigStore;\n this.sessionHydrator = config.sessionHydrator;\n this.getThinkingDefault = config.getThinkingDefault;\n this.getThinkingDefaultForSession = config.getThinkingDefaultForSession;\n this.workspaceRoot = config.workspaceRoot;\n this.getWorkspaceRootForSession = config.getWorkspaceRootForSession;\n this.getAgentInternalStorageRootForSession =\n config.getAgentInternalStorageRootForSession ??\n ((sk) => this.getWorkspaceRootForSession?.(sk) ?? this.workspaceRoot);\n this.enqueueAutoTitle = config.enqueueAutoTitle;\n this.getConfig = config.getConfig;\n this.onEmbeddedStreamEvent = config.onEmbeddedStreamEvent;\n this.onEmbeddedTurnComplete = config.onEmbeddedTurnComplete;\n }\n\n /**\n * Process a message through the agent orchestration pipeline\n */\n async process(msg: InboundMessage, context: SessionContext): Promise<void> {\n const { sessionKey } = context;\n\n log.debug({ sessionKey }, 'Processing message through agent orchestrator');\n\n await this.sessionHydrator.workspace(sessionKey);\n\n // Dreaming: short-circuit cron-triggered sweep tokens into maintenance runs.\n // This avoids spending LLM tokens for scheduled memory consolidation.\n if (\n typeof msg.content === 'string' &&\n (sessionKey.startsWith('cron:') || context.channel === 'cron')\n ) {\n const content = msg.content;\n const isDreamingSweep =\n content.includes(DREAMING_SWEEP_TOKEN) ||\n content.includes(DREAMING_LIGHT_SWEEP_TOKEN) ||\n content.includes(DREAMING_REM_SWEEP_TOKEN);\n\n if (isDreamingSweep) {\n const workspaceDir = this.agentManager.getResolvedWorkspaceForSession(sessionKey);\n const resolved = resolveDreamingConfig(this.getConfig?.());\n const t0 = Date.now();\n\n if (content.includes(DREAMING_LIGHT_SWEEP_TOKEN)) {\n const result = await runLightSweep({ workspaceDir, config: resolved.phases.light });\n const event: DreamingEvent = {\n timestamp: new Date().toISOString(), phase: 'light',\n ok: result.ok, reason: result.reason, durationMs: Date.now() - t0,\n scannedEntries: result.scannedEntries, newSignals: result.newSignals, deduped: result.deduped,\n };\n await appendDreamingEvent(workspaceDir, event);\n } else if (content.includes(DREAMING_REM_SWEEP_TOKEN)) {\n const result = await runRemPatterns({ workspaceDir, config: resolved.phases.rem });\n const event: DreamingEvent = {\n timestamp: new Date().toISOString(), phase: 'rem',\n ok: result.ok, reason: result.reason, durationMs: Date.now() - t0,\n patternsDiscovered: result.patternsDiscovered, entriesAnalyzed: result.entriesAnalyzed,\n };\n await appendDreamingEvent(workspaceDir, event);\n } else {\n const result = await runDreamingDeepPromotion({\n workspaceDir,\n config: resolved.phases.deep,\n memoryManager: this.agentManager.getMemoryManagerForSession(sessionKey),\n });\n const event: DreamingEvent = {\n timestamp: new Date().toISOString(), phase: 'deep',\n ok: result.ok, reason: result.reason, durationMs: Date.now() - t0,\n candidates: result.candidates, applied: result.applied,\n };\n await appendDreamingEvent(workspaceDir, event);\n }\n return;\n }\n }\n\n try {\n await this.sessionHydrator.model(sessionKey);\n\n const channelSystemPrompt =\n typeof context.metadata?.channelSystemPrompt === 'string'\n ? context.metadata.channelSystemPrompt.trim()\n : '';\n if (channelSystemPrompt) {\n this.agentManager.getOrCreateAgent(sessionKey);\n this.agentManager.applyTurnChannelSystemPrompt(sessionKey, channelSystemPrompt);\n }\n\n const thinkingDefault =\n this.getThinkingDefaultForSession?.(sessionKey) ?? this.getThinkingDefault();\n const thinkingLevel = await resolveEffectiveThinkingLevel(\n this.sessionConfigStore,\n sessionKey,\n null,\n thinkingDefault,\n );\n this.agentManager.setThinkingLevel(sessionKey, thinkingLevel);\n\n const persistedAttachments = await persistInboundAttachments(msg.attachments);\n const modelRef = this.modelManager.getModelForSession(sessionKey);\n const userMessage = await buildTranscriptUserMessage({\n text: msg.content,\n prepared: persistedAttachments,\n sessionKey,\n modelRef,\n config: this.getConfig?.(),\n agentManager: this.agentManager,\n });\n setPendingTranscriptUserMessage(sessionKey, userMessage);\n\n const userPlainForMemory = extractAgentUserPlainText(userMessage);\n const userMessageForModel = await this.agentManager.applyMemoryPrefetchToUserMessage(\n userMessage,\n sessionKey,\n );\n\n const llmTurn = await hydrateUserTurnForLlm({\n message: userMessage,\n modelRef,\n });\n\n this.feedbackCoordinator.startTask();\n\n const turnResult = await (async () => {\n try {\n return await runEmbeddedTurnForSession({\n sessionKey,\n userMessage: userMessageForModel,\n llmImages: llmTurn.images,\n sessionStore: this.sessionStore,\n agentManager: this.agentManager,\n modelManager: this.modelManager,\n thinkingOverride: thinkingLevel,\n getConfig: this.getConfig,\n beforeTurn: () => this.agentManager.beginBackgroundReviewUserTurn(sessionKey),\n onEvent: (event) => this.onEmbeddedStreamEvent?.(sessionKey, event),\n });\n } finally {\n clearPendingTranscriptUserMessage(sessionKey, userMessage);\n }\n })();\n\n this.agentManager.afterAgentTurn(sessionKey, userPlainForMemory);\n this.agentManager.scheduleBackgroundReviewAfterUserTurn(sessionKey);\n\n if (turnResult.ok) {\n this.onEmbeddedTurnComplete?.(sessionKey, turnResult.lastAssistantText);\n this.enqueueAutoTitle?.(sessionKey);\n } else if (turnResult.errorMessage) {\n log.warn({ sessionKey, errorMessage: turnResult.errorMessage }, 'Embedded inbound turn failed');\n }\n\n this.feedbackCoordinator.endTask();\n\n } catch (error) {\n log.error({ err: error, sessionKey }, 'Error in agent orchestration');\n this.feedbackCoordinator.endTask();\n throw error;\n }\n }\n\n /**\n * Get the current agent model ID\n */\n getCurrentModel(): string {\n return this.modelManager.getCurrentModel();\n }\n\n /**\n * Check if agent is currently processing for a session\n */\n isProcessing(sessionKey: string): boolean {\n const agent = this.agentManager.getAgent(sessionKey);\n if (!agent) {\n return false;\n }\n return agent.state.messages.length > 0;\n }\n\n /**\n * Abort current agent execution for a session\n */\n abort(sessionKey: string): void {\n void abortEmbeddedRun(sessionKey);\n const agent = this.agentManager.getAgent(sessionKey);\n agent?.abort();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;aAkBqD;AAuBrD,MAAM,MAAM,aAAa,oBAAoB;AA8B7C,IAAa,oBAAb,MAA+B;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA,YAAY,QAAiC;AAC3C,OAAK,eAAe,OAAO;AAC3B,OAAK,eAAe,OAAO;AAC3B,OAAK,eAAe,OAAO;AAC3B,OAAK,eAAe,OAAO;AAC3B,OAAK,sBAAsB,OAAO;AAClC,OAAK,qBAAqB,OAAO;AACjC,OAAK,kBAAkB,OAAO;AAC9B,OAAK,qBAAqB,OAAO;AACjC,OAAK,+BAA+B,OAAO;AAC3C,OAAK,gBAAgB,OAAO;AAC5B,OAAK,6BAA6B,OAAO;AACzC,OAAK,wCACH,OAAO,2CACL,OAAO,KAAK,6BAA6B,GAAG,IAAI,KAAK;AACzD,OAAK,mBAAmB,OAAO;AAC/B,OAAK,YAAY,OAAO;AACxB,OAAK,wBAAwB,OAAO;AACpC,OAAK,yBAAyB,OAAO;;;;;CAMvC,MAAM,QAAQ,KAAqB,SAAwC;EACzE,MAAM,EAAE,eAAe;AAEvB,MAAI,MAAM,EAAE,YAAY,EAAE,gDAAgD;AAE1E,QAAM,KAAK,gBAAgB,UAAU,WAAW;AAIhD,MACE,OAAO,IAAI,YAAY,aACtB,WAAW,WAAW,QAAQ,IAAI,QAAQ,YAAY,SACvD;GACA,MAAM,UAAU,IAAI;AAMpB,OAJE,QAAQ,SAAA,iCAA8B,IACtC,QAAQ,SAAA,uCAAoC,IAC5C,QAAQ,SAAA,qCAAkC,EAEvB;IACnB,MAAM,eAAe,KAAK,aAAa,+BAA+B,WAAW;IACjF,MAAM,WAAW,sBAAsB,KAAK,aAAa,CAAC;IAC1D,MAAM,KAAK,KAAK,KAAK;AAErB,QAAI,QAAQ,SAAA,uCAAoC,EAAE;KAChD,MAAM,SAAS,MAAM,cAAc;MAAE;MAAc,QAAQ,SAAS,OAAO;MAAO,CAAC;AAMnF,WAAM,oBAAoB,cAAc;MAJtC,4BAAW,IAAI,MAAM,EAAC,aAAa;MAAE,OAAO;MAC5C,IAAI,OAAO;MAAI,QAAQ,OAAO;MAAQ,YAAY,KAAK,KAAK,GAAG;MAC/D,gBAAgB,OAAO;MAAgB,YAAY,OAAO;MAAY,SAAS,OAAO;MAE3C,CAAC;eACrC,QAAQ,SAAA,qCAAkC,EAAE;KACrD,MAAM,SAAS,MAAM,eAAe;MAAE;MAAc,QAAQ,SAAS,OAAO;MAAK,CAAC;AAMlF,WAAM,oBAAoB,cAAc;MAJtC,4BAAW,IAAI,MAAM,EAAC,aAAa;MAAE,OAAO;MAC5C,IAAI,OAAO;MAAI,QAAQ,OAAO;MAAQ,YAAY,KAAK,KAAK,GAAG;MAC/D,oBAAoB,OAAO;MAAoB,iBAAiB,OAAO;MAE5B,CAAC;WACzC;KACL,MAAM,SAAS,MAAM,yBAAyB;MAC5C;MACA,QAAQ,SAAS,OAAO;MACxB,eAAe,KAAK,aAAa,2BAA2B,WAAW;MACxE,CAAC;AAMF,WAAM,oBAAoB,cAAc;MAJtC,4BAAW,IAAI,MAAM,EAAC,aAAa;MAAE,OAAO;MAC5C,IAAI,OAAO;MAAI,QAAQ,OAAO;MAAQ,YAAY,KAAK,KAAK,GAAG;MAC/D,YAAY,OAAO;MAAY,SAAS,OAAO;MAEJ,CAAC;;AAEhD;;;AAIJ,MAAI;AACF,SAAM,KAAK,gBAAgB,MAAM,WAAW;GAE5C,MAAM,sBACJ,OAAO,QAAQ,UAAU,wBAAwB,WAC7C,QAAQ,SAAS,oBAAoB,MAAM,GAC3C;AACN,OAAI,qBAAqB;AACvB,SAAK,aAAa,iBAAiB,WAAW;AAC9C,SAAK,aAAa,6BAA6B,YAAY,oBAAoB;;GAGjF,MAAM,kBACJ,KAAK,+BAA+B,WAAW,IAAI,KAAK,oBAAoB;GAC9E,MAAM,gBAAgB,MAAM,8BAC1B,KAAK,oBACL,YACA,MACA,gBACD;AACD,QAAK,aAAa,iBAAiB,YAAY,cAAc;GAE7D,MAAM,uBAAuB,MAAM,0BAA0B,IAAI,YAAY;GAC7E,MAAM,WAAW,KAAK,aAAa,mBAAmB,WAAW;GACjE,MAAM,cAAc,MAAM,2BAA2B;IACnD,MAAM,IAAI;IACV,UAAU;IACV;IACA;IACA,QAAQ,KAAK,aAAa;IAC1B,cAAc,KAAK;IACpB,CAAC;AACF,mCAAgC,YAAY,YAAY;GAExD,MAAM,qBAAqB,0BAA0B,YAAY;GACjE,MAAM,sBAAsB,MAAM,KAAK,aAAa,iCAClD,aACA,WACD;GAED,MAAM,UAAU,MAAM,sBAAsB;IAC1C,SAAS;IACT;IACD,CAAC;AAEF,QAAK,oBAAoB,WAAW;GAEpC,MAAM,aAAa,OAAO,YAAY;AACpC,QAAI;AACF,YAAO,MAAM,0BAA0B;MACrC;MACA,aAAa;MACb,WAAW,QAAQ;MACnB,cAAc,KAAK;MACnB,cAAc,KAAK;MACnB,cAAc,KAAK;MACnB,kBAAkB;MAClB,WAAW,KAAK;MAChB,kBAAkB,KAAK,aAAa,8BAA8B,WAAW;MAC7E,UAAU,UAAU,KAAK,wBAAwB,YAAY,MAAM;MACpE,CAAC;cACM;AACR,uCAAkC,YAAY,YAAY;;OAE1D;AAEJ,QAAK,aAAa,eAAe,YAAY,mBAAmB;AAChE,QAAK,aAAa,sCAAsC,WAAW;AAEnE,OAAI,WAAW,IAAI;AACjB,SAAK,yBAAyB,YAAY,WAAW,kBAAkB;AACvE,SAAK,mBAAmB,WAAW;cAC1B,WAAW,aACpB,KAAI,KAAK;IAAE;IAAY,cAAc,WAAW;IAAc,EAAE,+BAA+B;AAGjG,QAAK,oBAAoB,SAAS;WAE3B,OAAO;AACd,OAAI,MAAM;IAAE,KAAK;IAAO;IAAY,EAAE,+BAA+B;AACrE,QAAK,oBAAoB,SAAS;AAClC,SAAM;;;;;;CAOV,kBAA0B;AACxB,SAAO,KAAK,aAAa,iBAAiB;;;;;CAM5C,aAAa,YAA6B;EACxC,MAAM,QAAQ,KAAK,aAAa,SAAS,WAAW;AACpD,MAAI,CAAC,MACH,QAAO;AAET,SAAO,MAAM,MAAM,SAAS,SAAS;;;;;CAMvC,MAAM,YAA0B;AACzB,mBAAiB,WAAW;AACnB,OAAK,aAAa,SAAS,WACpC,EAAE,OAAO"}
|
|
1
|
+
{"version":3,"file":"agent-orchestrator.js","names":[],"sources":["../../../../src/agent/orchestration/agent-orchestrator.ts"],"sourcesContent":["/**\n * Agent Orchestrator - Coordinates Agent execution flow\n *\n * Manages the complete agent execution pipeline from message processing\n * to response generation.\n */\n\nimport type { Config } from '../../config/schema.js';\nimport type { InboundMessage } from '../../infra/bus/index.js';\nimport type { SessionConfigStore, SessionStore } from '../../session/index.js';\nimport type { SessionHydrator } from '../session/index.js';\nimport { resolveEffectiveThinkingLevel } from '../../session/thinking-resolve.js';\nimport type { ThinkLevel } from '../transcript/thinking-types.js';\nimport type { ModelManager } from '../models/index.js';\nimport type { SessionContext } from '../session/session-context.js';\nimport type { AgentEventHandler } from './agent-event-handler.js';\nimport type { FeedbackCoordinator } from '../feedback/feedback-coordinator.js';\nimport type { AgentManager } from '../agent-manager.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { extractAgentUserPlainText } from '../memory/user-message-text.js';\nimport { abortEmbeddedRun } from '../embedded/runs.js';\nimport { runEmbeddedTurnForSession } from '../embedded/run-for-session.js';\nimport type { EmbeddedStreamEvent } from '../embedded/types.js';\nimport { persistInboundAttachments } from '../../channels/attachments/inbound-persist.js';\nimport {\n buildTranscriptUserMessage,\n clearPendingTranscriptUserMessage,\n hydrateUserTurnForLlm,\n setPendingTranscriptUserMessage,\n} from '../inbound/attachment-pipeline.js';\nimport {\n DREAMING_SWEEP_TOKEN,\n DREAMING_LIGHT_SWEEP_TOKEN,\n DREAMING_REM_SWEEP_TOKEN,\n} from '../memory/dreaming/constants.js';\nimport { resolveDreamingConfig } from '../memory/dreaming/config.js';\nimport { runDreamingDeepPromotion } from '../memory/dreaming/deep-promotion.js';\nimport { appendDreamingEvent, type DreamingEvent } from '../memory/dreaming/events.js';\nimport { runLightSweep } from '../memory/dreaming/light-sweep.js';\nimport { runRemPatterns } from '../memory/dreaming/rem-patterns.js';\n\nconst log = createLogger('AgentOrchestrator');\n\nexport interface AgentOrchestratorConfig {\n agentManager: AgentManager;\n sessionStore: SessionStore;\n modelManager: ModelManager;\n eventHandler: AgentEventHandler;\n feedbackCoordinator: FeedbackCoordinator;\n sessionConfigStore: SessionConfigStore;\n /** Per-session hydration (workspace override + model override) before the agent runs. */\n sessionHydrator: SessionHydrator;\n getThinkingDefault: () => ThinkLevel | undefined;\n /** Per-session default from merged `agents.list` / defaults (optional). */\n getThinkingDefaultForSession?: (sessionKey: string) => ThinkLevel | undefined;\n /** Default workspace root when no per-session resolver is set. */\n workspaceRoot: string;\n /** Per-agent workspace root for attachments (optional; defaults to `workspaceRoot`). */\n getWorkspaceRootForSession?: (sessionKey: string) => string;\n /** Agent home (`…/agents/<id>/`) for inbound/TTS files — keeps internal state out of the markdown workspace. */\n getAgentInternalStorageRootForSession?: (sessionKey: string) => string;\n /** Fire-and-forget after full session persist (e.g. LLM session title); not called from mid-turn snapshots. */\n enqueueAutoTitle?: (sessionKey: string) => void;\n /** For per-turn timeout. */\n getConfig?: () => Config | undefined;\n /** Channel streaming: token/tool events from pi embedded session. */\n onEmbeddedStreamEvent?: (sessionKey: string, event: EmbeddedStreamEvent) => void;\n /** Called after a successful embedded turn with assistant plain text. */\n onEmbeddedTurnComplete?: (sessionKey: string, lastAssistantText?: string) => void;\n}\n\nexport class AgentOrchestrator {\n private agentManager: AgentManager;\n private sessionStore: SessionStore;\n private modelManager: ModelManager;\n private feedbackCoordinator: FeedbackCoordinator;\n private sessionConfigStore: SessionConfigStore;\n private sessionHydrator: SessionHydrator;\n private getThinkingDefault: () => ThinkLevel | undefined;\n private getThinkingDefaultForSession?: (sessionKey: string) => ThinkLevel | undefined;\n private enqueueAutoTitle?: (sessionKey: string) => void;\n private getConfig?: () => Config | undefined;\n private onEmbeddedStreamEvent?: (sessionKey: string, event: EmbeddedStreamEvent) => void;\n private onEmbeddedTurnComplete?: (sessionKey: string, lastAssistantText?: string) => void;\n\n constructor(config: AgentOrchestratorConfig) {\n this.agentManager = config.agentManager;\n this.sessionStore = config.sessionStore;\n this.modelManager = config.modelManager;\n this.feedbackCoordinator = config.feedbackCoordinator;\n this.sessionConfigStore = config.sessionConfigStore;\n this.sessionHydrator = config.sessionHydrator;\n this.getThinkingDefault = config.getThinkingDefault;\n this.getThinkingDefaultForSession = config.getThinkingDefaultForSession;\n this.enqueueAutoTitle = config.enqueueAutoTitle;\n this.getConfig = config.getConfig;\n this.onEmbeddedStreamEvent = config.onEmbeddedStreamEvent;\n this.onEmbeddedTurnComplete = config.onEmbeddedTurnComplete;\n }\n\n /**\n * Process a message through the agent orchestration pipeline\n */\n async process(msg: InboundMessage, context: SessionContext): Promise<void> {\n const { sessionKey } = context;\n\n log.debug({ sessionKey }, 'Processing message through agent orchestrator');\n\n await this.sessionHydrator.workspace(sessionKey);\n\n // Dreaming: short-circuit scheduled maintenance tokens into local runs.\n // This avoids spending LLM tokens for scheduled memory consolidation.\n if (\n typeof msg.content === 'string' &&\n (\n sessionKey.startsWith('cron:') ||\n sessionKey.includes(':cron:') ||\n sessionKey.includes(':automation:') ||\n context.channel === 'cron' ||\n context.channel === 'automation'\n )\n ) {\n const content = msg.content;\n const isDreamingSweep =\n content.includes(DREAMING_SWEEP_TOKEN) ||\n content.includes(DREAMING_LIGHT_SWEEP_TOKEN) ||\n content.includes(DREAMING_REM_SWEEP_TOKEN);\n\n if (isDreamingSweep) {\n const workspaceDir = this.agentManager.getResolvedWorkspaceForSession(sessionKey);\n const resolved = resolveDreamingConfig(this.getConfig?.());\n const t0 = Date.now();\n\n if (content.includes(DREAMING_LIGHT_SWEEP_TOKEN)) {\n const result = await runLightSweep({ workspaceDir, config: resolved.phases.light });\n const event: DreamingEvent = {\n timestamp: new Date().toISOString(), phase: 'light',\n ok: result.ok, reason: result.reason, durationMs: Date.now() - t0,\n scannedEntries: result.scannedEntries, newSignals: result.newSignals, deduped: result.deduped,\n };\n await appendDreamingEvent(workspaceDir, event);\n } else if (content.includes(DREAMING_REM_SWEEP_TOKEN)) {\n const result = await runRemPatterns({ workspaceDir, config: resolved.phases.rem });\n const event: DreamingEvent = {\n timestamp: new Date().toISOString(), phase: 'rem',\n ok: result.ok, reason: result.reason, durationMs: Date.now() - t0,\n patternsDiscovered: result.patternsDiscovered, entriesAnalyzed: result.entriesAnalyzed,\n };\n await appendDreamingEvent(workspaceDir, event);\n } else {\n const result = await runDreamingDeepPromotion({\n workspaceDir,\n config: resolved.phases.deep,\n memoryManager: this.agentManager.getMemoryManagerForSession(sessionKey),\n });\n const event: DreamingEvent = {\n timestamp: new Date().toISOString(), phase: 'deep',\n ok: result.ok, reason: result.reason, durationMs: Date.now() - t0,\n candidates: result.candidates, applied: result.applied,\n };\n await appendDreamingEvent(workspaceDir, event);\n }\n return;\n }\n }\n\n try {\n await this.sessionHydrator.model(sessionKey);\n\n const channelSystemPrompt =\n typeof context.metadata?.channelSystemPrompt === 'string'\n ? context.metadata.channelSystemPrompt.trim()\n : '';\n if (channelSystemPrompt) {\n this.agentManager.getOrCreateAgent(sessionKey);\n this.agentManager.applyTurnChannelSystemPrompt(sessionKey, channelSystemPrompt);\n }\n\n const thinkingDefault =\n this.getThinkingDefaultForSession?.(sessionKey) ?? this.getThinkingDefault();\n const thinkingLevel = await resolveEffectiveThinkingLevel(\n this.sessionConfigStore,\n sessionKey,\n null,\n thinkingDefault,\n );\n this.agentManager.setThinkingLevel(sessionKey, thinkingLevel);\n\n const persistedAttachments = await persistInboundAttachments(msg.attachments);\n const modelRef = this.modelManager.getModelForSession(sessionKey);\n const userMessage = await buildTranscriptUserMessage({\n text: msg.content,\n prepared: persistedAttachments,\n sessionKey,\n modelRef,\n config: this.getConfig?.(),\n agentManager: this.agentManager,\n });\n setPendingTranscriptUserMessage(sessionKey, userMessage);\n\n const userPlainForMemory = extractAgentUserPlainText(userMessage);\n const userMessageForModel = await this.agentManager.applyMemoryPrefetchToUserMessage(\n userMessage,\n sessionKey,\n );\n\n const llmTurn = await hydrateUserTurnForLlm({\n message: userMessage,\n modelRef,\n });\n\n this.feedbackCoordinator.startTask();\n\n const turnResult = await (async () => {\n try {\n return await runEmbeddedTurnForSession({\n sessionKey,\n userMessage: userMessageForModel,\n llmImages: llmTurn.images,\n sessionStore: this.sessionStore,\n agentManager: this.agentManager,\n modelManager: this.modelManager,\n thinkingOverride: thinkingLevel,\n getConfig: this.getConfig,\n beforeTurn: () => this.agentManager.beginBackgroundReviewUserTurn(sessionKey),\n onEvent: (event) => this.onEmbeddedStreamEvent?.(sessionKey, event),\n });\n } finally {\n clearPendingTranscriptUserMessage(sessionKey, userMessage);\n }\n })();\n\n this.agentManager.afterAgentTurn(sessionKey, userPlainForMemory);\n this.agentManager.scheduleBackgroundReviewAfterUserTurn(sessionKey);\n\n if (turnResult.ok) {\n this.onEmbeddedTurnComplete?.(sessionKey, turnResult.lastAssistantText);\n this.enqueueAutoTitle?.(sessionKey);\n } else if (turnResult.errorMessage) {\n log.warn({ sessionKey, errorMessage: turnResult.errorMessage }, 'Embedded inbound turn failed');\n }\n\n this.feedbackCoordinator.endTask();\n\n } catch (error) {\n log.error({ err: error, sessionKey }, 'Error in agent orchestration');\n this.feedbackCoordinator.endTask();\n throw error;\n }\n }\n\n /**\n * Get the current agent model ID\n */\n getCurrentModel(): string {\n return this.modelManager.getCurrentModel();\n }\n\n /**\n * Check if agent is currently processing for a session\n */\n isProcessing(sessionKey: string): boolean {\n const agent = this.agentManager.getAgent(sessionKey);\n if (!agent) {\n return false;\n }\n return agent.state.messages.length > 0;\n }\n\n /**\n * Abort current agent execution for a session\n */\n abort(sessionKey: string): void {\n void abortEmbeddedRun(sessionKey);\n const agent = this.agentManager.getAgent(sessionKey);\n agent?.abort();\n }\n}\n"],"mappings":"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"}
|
|
@@ -7,12 +7,14 @@ interface MemoryMatch {
|
|
|
7
7
|
export interface MemorySearchOptions {
|
|
8
8
|
maxResults?: number;
|
|
9
9
|
minScore?: number;
|
|
10
|
-
/** Absolute path to agent-scoped curated memories dir (MEMORY.md
|
|
10
|
+
/** Absolute path to agent-scoped curated memories dir (MEMORY.md). */
|
|
11
11
|
memoriesDir?: string;
|
|
12
|
+
/** Absolute path to global user memory (`~/.xopc/user/MEMORY.md`). */
|
|
13
|
+
userMemoryPath?: string;
|
|
12
14
|
agentId?: string;
|
|
13
15
|
}
|
|
14
16
|
export declare function memorySearch(baseDir: string, query: string, options?: MemorySearchOptions): Promise<MemoryMatch[]>;
|
|
15
|
-
export declare function memoryGet(baseDir: string, path: string, from?: number, lines?: number, memoriesDir?: string): {
|
|
17
|
+
export declare function memoryGet(baseDir: string, path: string, from?: number, lines?: number, memoriesDir?: string, userMemoryPath?: string): {
|
|
16
18
|
content: string;
|
|
17
19
|
lineNumbers: {
|
|
18
20
|
start: number;
|
|
@@ -8,7 +8,8 @@ import { existsSync, readFileSync } from "fs";
|
|
|
8
8
|
//#region src/agent/prompt/memory/index.ts
|
|
9
9
|
init_logger();
|
|
10
10
|
const log = createLogger("MemorySearch");
|
|
11
|
-
const
|
|
11
|
+
const AGENT_MEMORY_FILENAME = "MEMORY.md";
|
|
12
|
+
const USER_MEMORY_DISPLAY_PATH = "user/MEMORY.md";
|
|
12
13
|
function ensureMemoryDatabase() {
|
|
13
14
|
requireXopcDatabase();
|
|
14
15
|
}
|
|
@@ -16,7 +17,7 @@ function fallbackMemorySearch(baseDir, query, options) {
|
|
|
16
17
|
const normalizedQuery = query.trim().toLowerCase();
|
|
17
18
|
if (!normalizedQuery) return [];
|
|
18
19
|
const memoriesDir = options.memoriesDir;
|
|
19
|
-
const candidatePaths = [...memoriesDir ? [
|
|
20
|
+
const candidatePaths = [...[...memoriesDir ? [join(memoriesDir, AGENT_MEMORY_FILENAME)].filter((path) => existsSync(path)) : [], ...options.userMemoryPath && existsSync(options.userMemoryPath) ? [options.userMemoryPath] : []], join(baseDir, "MEMORY.md")].filter((path) => existsSync(path));
|
|
20
21
|
const matches = [];
|
|
21
22
|
for (const path of candidatePaths) {
|
|
22
23
|
const lines = readFileSync(path, "utf-8").split("\n");
|
|
@@ -25,7 +26,7 @@ function fallbackMemorySearch(baseDir, query, options) {
|
|
|
25
26
|
if (!line.toLowerCase().includes(normalizedQuery)) continue;
|
|
26
27
|
const score = 1;
|
|
27
28
|
if (score < options.minScore) continue;
|
|
28
|
-
const file = memoriesDir && path.startsWith(memoriesDir) ? path.slice(memoriesDir.length).replace(/^[/\\]/, "") : relative(baseDir, path).replace(/\\/g, "/");
|
|
29
|
+
const file = options.userMemoryPath && path === options.userMemoryPath ? USER_MEMORY_DISPLAY_PATH : memoriesDir && path.startsWith(memoriesDir) ? path.slice(memoriesDir.length).replace(/^[/\\]/, "") : relative(baseDir, path).replace(/\\/g, "/");
|
|
29
30
|
matches.push({
|
|
30
31
|
file,
|
|
31
32
|
lines: line,
|
|
@@ -37,14 +38,15 @@ function fallbackMemorySearch(baseDir, query, options) {
|
|
|
37
38
|
return matches.slice(0, options.maxResults);
|
|
38
39
|
}
|
|
39
40
|
async function memorySearch(baseDir, query, options = {}) {
|
|
40
|
-
const { maxResults = 5, minScore = .3, memoriesDir, agentId } = options;
|
|
41
|
+
const { maxResults = 5, minScore = .3, memoriesDir, userMemoryPath, agentId } = options;
|
|
41
42
|
const resolvedAgentId = agentId ?? resolveAgentIdFromMemoriesDir(memoriesDir);
|
|
42
43
|
try {
|
|
43
44
|
ensureMemoryDatabase();
|
|
44
45
|
syncMemoryIndex({
|
|
45
46
|
agentId: resolvedAgentId,
|
|
46
47
|
workspaceDir: baseDir,
|
|
47
|
-
memoriesDir
|
|
48
|
+
memoriesDir,
|
|
49
|
+
userMemoryPath
|
|
48
50
|
});
|
|
49
51
|
return searchMemoryIndex({
|
|
50
52
|
agentId: resolvedAgentId,
|
|
@@ -67,17 +69,21 @@ async function memorySearch(baseDir, query, options = {}) {
|
|
|
67
69
|
return fallbackMemorySearch(baseDir, query, {
|
|
68
70
|
maxResults,
|
|
69
71
|
minScore,
|
|
70
|
-
memoriesDir
|
|
72
|
+
memoriesDir,
|
|
73
|
+
userMemoryPath
|
|
71
74
|
});
|
|
72
75
|
}
|
|
73
76
|
}
|
|
74
|
-
function memoryGet(baseDir, path, from, lines, memoriesDir) {
|
|
77
|
+
function memoryGet(baseDir, path, from, lines, memoriesDir, userMemoryPath) {
|
|
75
78
|
let fullPath = path.startsWith("/") ? path : join(baseDir, path);
|
|
76
|
-
if (!existsSync(fullPath)
|
|
77
|
-
const
|
|
78
|
-
if (
|
|
79
|
-
|
|
80
|
-
if (
|
|
79
|
+
if (!existsSync(fullPath)) {
|
|
80
|
+
const normalized = path.replace(/\\/g, "/");
|
|
81
|
+
if (normalized === USER_MEMORY_DISPLAY_PATH && userMemoryPath && existsSync(userMemoryPath)) fullPath = userMemoryPath;
|
|
82
|
+
else if (memoriesDir) {
|
|
83
|
+
if ((normalized.split("/").pop() ?? normalized) === AGENT_MEMORY_FILENAME) {
|
|
84
|
+
const candidatePath = join(memoriesDir, AGENT_MEMORY_FILENAME);
|
|
85
|
+
if (existsSync(candidatePath)) fullPath = candidatePath;
|
|
86
|
+
}
|
|
81
87
|
}
|
|
82
88
|
}
|
|
83
89
|
if (!existsSync(fullPath)) return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../../src/agent/prompt/memory/index.ts"],"sourcesContent":["// Memory Search - FTS-backed recall with markdown file reads for snippets\nimport { readFileSync, existsSync } from 'fs';\nimport { join, relative } from 'path';\n\nimport { createLogger } from '../../../utils/logger.js';\nimport {\n requireXopcDatabase,\n resolveAgentIdFromMemoriesDir,\n searchMemoryIndex,\n syncMemoryIndex,\n} from '../../../storage/sqlite/index.js';\n\nconst log = createLogger('MemorySearch');\n\n// =============================================================================\n// Types (Internal)\n// =============================================================================\n\ninterface MemoryMatch {\n file: string;\n lines: string;\n score: number;\n lineNumbers: number[];\n}\n\nexport interface MemorySearchOptions {\n maxResults?: number;\n minScore?: number;\n /** Absolute path to agent-scoped curated memories dir (MEMORY.md
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../../src/agent/prompt/memory/index.ts"],"sourcesContent":["// Memory Search - FTS-backed recall with markdown file reads for snippets\nimport { readFileSync, existsSync } from 'fs';\nimport { join, relative } from 'path';\n\nimport { createLogger } from '../../../utils/logger.js';\nimport {\n requireXopcDatabase,\n resolveAgentIdFromMemoriesDir,\n searchMemoryIndex,\n syncMemoryIndex,\n} from '../../../storage/sqlite/index.js';\n\nconst log = createLogger('MemorySearch');\n\n// =============================================================================\n// Types (Internal)\n// =============================================================================\n\ninterface MemoryMatch {\n file: string;\n lines: string;\n score: number;\n lineNumbers: number[];\n}\n\nexport interface MemorySearchOptions {\n maxResults?: number;\n minScore?: number;\n /** Absolute path to agent-scoped curated memories dir (MEMORY.md). */\n memoriesDir?: string;\n /** Absolute path to global user memory (`~/.xopc/user/MEMORY.md`). */\n userMemoryPath?: string;\n agentId?: string;\n}\n\nconst AGENT_MEMORY_FILENAME = 'MEMORY.md';\nconst USER_MEMORY_DISPLAY_PATH = 'user/MEMORY.md';\n\nfunction ensureMemoryDatabase(): void {\n requireXopcDatabase();\n}\n\nfunction fallbackMemorySearch(\n baseDir: string,\n query: string,\n options: Required<Pick<MemorySearchOptions, 'maxResults' | 'minScore'>> &\n Pick<MemorySearchOptions, 'memoriesDir' | 'userMemoryPath'>,\n): MemoryMatch[] {\n const normalizedQuery = query.trim().toLowerCase();\n if (!normalizedQuery) return [];\n\n const memoriesDir = options.memoriesDir;\n const curatedPaths = [\n ...(memoriesDir ? [join(memoriesDir, AGENT_MEMORY_FILENAME)].filter((path) => existsSync(path)) : []),\n ...(options.userMemoryPath && existsSync(options.userMemoryPath) ? [options.userMemoryPath] : []),\n ];\n const candidatePaths = [...curatedPaths, join(baseDir, 'MEMORY.md')].filter((path) => existsSync(path));\n\n const matches: MemoryMatch[] = [];\n for (const path of candidatePaths) {\n const content = readFileSync(path, 'utf-8');\n const lines = content.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (!line.toLowerCase().includes(normalizedQuery)) continue;\n const score = 1;\n if (score < options.minScore) continue;\n const file =\n options.userMemoryPath && path === options.userMemoryPath\n ? USER_MEMORY_DISPLAY_PATH\n : memoriesDir && path.startsWith(memoriesDir)\n ? path.slice(memoriesDir.length).replace(/^[/\\\\]/, '')\n : relative(baseDir, path).replace(/\\\\/g, '/');\n matches.push({ file, lines: line, score, lineNumbers: [i + 1] });\n }\n }\n\n return matches.slice(0, options.maxResults);\n}\n\n// =============================================================================\n// Main Search Function (Exported)\n// =============================================================================\n\nexport async function memorySearch(\n baseDir: string,\n query: string,\n options: MemorySearchOptions = {},\n): Promise<MemoryMatch[]> {\n const { maxResults = 5, minScore = 0.3, memoriesDir, userMemoryPath, agentId } = options;\n const resolvedAgentId = agentId ?? resolveAgentIdFromMemoriesDir(memoriesDir);\n\n try {\n ensureMemoryDatabase();\n syncMemoryIndex({ agentId: resolvedAgentId, workspaceDir: baseDir, memoriesDir, userMemoryPath });\n const hits = searchMemoryIndex({\n agentId: resolvedAgentId,\n query,\n maxResults,\n minScore,\n });\n return hits.map((hit) => ({\n file: hit.path,\n lines: hit.lines,\n score: hit.score,\n lineNumbers: hit.lineNumbers,\n }));\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n log.warn({ err, errorMessage: em, agentId: resolvedAgentId }, `Memory FTS search failed: ${em}`);\n return fallbackMemorySearch(baseDir, query, { maxResults, minScore, memoriesDir, userMemoryPath });\n }\n}\n\n// =============================================================================\n// Memory Get (Read Snippet) (Exported)\n// =============================================================================\n\nexport function memoryGet(\n baseDir: string,\n path: string,\n from?: number,\n lines?: number,\n memoriesDir?: string,\n userMemoryPath?: string,\n): { content: string; lineNumbers: { start: number; end: number } } | null {\n let fullPath = path.startsWith('/') ? path : join(baseDir, path);\n\n if (!existsSync(fullPath)) {\n const normalized = path.replace(/\\\\/g, '/');\n if (normalized === USER_MEMORY_DISPLAY_PATH && userMemoryPath && existsSync(userMemoryPath)) {\n fullPath = userMemoryPath;\n } else if (memoriesDir) {\n const segments = normalized.split('/');\n const filename = segments.pop() ?? normalized;\n if (filename === AGENT_MEMORY_FILENAME) {\n const candidatePath = join(memoriesDir, AGENT_MEMORY_FILENAME);\n if (existsSync(candidatePath)) {\n fullPath = candidatePath;\n }\n }\n }\n }\n\n if (!existsSync(fullPath)) {\n return null;\n }\n\n const content = readFileSync(fullPath, 'utf-8');\n const allLines = content.split('\\n');\n\n const start = from || 1;\n const count = lines || 10;\n const end = Math.min(start + count - 1, allLines.length);\n\n const snippet = allLines.slice(start - 1, end).join('\\n');\n\n return {\n content: snippet,\n lineNumbers: { start, end },\n };\n}\n"],"mappings":";;;;;;;;aAIwD;AAQxD,MAAM,MAAM,aAAa,eAAe;AAuBxC,MAAM,wBAAwB;AAC9B,MAAM,2BAA2B;AAEjC,SAAS,uBAA6B;AACpC,sBAAqB;;AAGvB,SAAS,qBACP,SACA,OACA,SAEe;CACf,MAAM,kBAAkB,MAAM,MAAM,CAAC,aAAa;AAClD,KAAI,CAAC,gBAAiB,QAAO,EAAE;CAE/B,MAAM,cAAc,QAAQ;CAK5B,MAAM,iBAAiB,CAAC,GAAG,CAHzB,GAAI,cAAc,CAAC,KAAK,aAAa,sBAAsB,CAAC,CAAC,QAAQ,SAAS,WAAW,KAAK,CAAC,GAAG,EAAE,EACpG,GAAI,QAAQ,kBAAkB,WAAW,QAAQ,eAAe,GAAG,CAAC,QAAQ,eAAe,GAAG,EAAE,CAE3D,EAAE,KAAK,SAAS,YAAY,CAAC,CAAC,QAAQ,SAAS,WAAW,KAAK,CAAC;CAEvG,MAAM,UAAyB,EAAE;AACjC,MAAK,MAAM,QAAQ,gBAAgB;EAEjC,MAAM,QADU,aAAa,MAAM,QACd,CAAC,MAAM,KAAK;AACjC,OAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;GACrC,MAAM,OAAO,MAAM;AACnB,OAAI,CAAC,KAAK,aAAa,CAAC,SAAS,gBAAgB,CAAE;GACnD,MAAM,QAAQ;AACd,OAAI,QAAQ,QAAQ,SAAU;GAC9B,MAAM,OACJ,QAAQ,kBAAkB,SAAS,QAAQ,iBACvC,2BACA,eAAe,KAAK,WAAW,YAAY,GACzC,KAAK,MAAM,YAAY,OAAO,CAAC,QAAQ,UAAU,GAAG,GACpD,SAAS,SAAS,KAAK,CAAC,QAAQ,OAAO,IAAI;AACnD,WAAQ,KAAK;IAAE;IAAM,OAAO;IAAM;IAAO,aAAa,CAAC,IAAI,EAAE;IAAE,CAAC;;;AAIpE,QAAO,QAAQ,MAAM,GAAG,QAAQ,WAAW;;AAO7C,eAAsB,aACpB,SACA,OACA,UAA+B,EAAE,EACT;CACxB,MAAM,EAAE,aAAa,GAAG,WAAW,IAAK,aAAa,gBAAgB,YAAY;CACjF,MAAM,kBAAkB,WAAW,8BAA8B,YAAY;AAE7E,KAAI;AACF,wBAAsB;AACtB,kBAAgB;GAAE,SAAS;GAAiB,cAAc;GAAS;GAAa;GAAgB,CAAC;AAOjG,SANa,kBAAkB;GAC7B,SAAS;GACT;GACA;GACA;GACD,CACU,CAAC,KAAK,SAAS;GACxB,MAAM,IAAI;GACV,OAAO,IAAI;GACX,OAAO,IAAI;GACX,aAAa,IAAI;GAClB,EAAE;UACI,KAAK;EACZ,MAAM,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC3D,MAAI,KAAK;GAAE;GAAK,cAAc;GAAI,SAAS;GAAiB,EAAE,6BAA6B,KAAK;AAChG,SAAO,qBAAqB,SAAS,OAAO;GAAE;GAAY;GAAU;GAAa;GAAgB,CAAC;;;AAQtG,SAAgB,UACd,SACA,MACA,MACA,OACA,aACA,gBACyE;CACzE,IAAI,WAAW,KAAK,WAAW,IAAI,GAAG,OAAO,KAAK,SAAS,KAAK;AAEhE,KAAI,CAAC,WAAW,SAAS,EAAE;EACzB,MAAM,aAAa,KAAK,QAAQ,OAAO,IAAI;AAC3C,MAAI,eAAe,4BAA4B,kBAAkB,WAAW,eAAe,CACzF,YAAW;WACF;QACQ,WAAW,MAAM,IACT,CAAC,KAAK,IAAI,gBAClB,uBAAuB;IACtC,MAAM,gBAAgB,KAAK,aAAa,sBAAsB;AAC9D,QAAI,WAAW,cAAc,CAC3B,YAAW;;;;AAMnB,KAAI,CAAC,WAAW,SAAS,CACvB,QAAO;CAIT,MAAM,WADU,aAAa,UAAU,QACf,CAAC,MAAM,KAAK;CAEpC,MAAM,QAAQ,QAAQ;CAEtB,MAAM,MAAM,KAAK,IAAI,SADP,SAAS,MACc,GAAG,SAAS,OAAO;AAIxD,QAAO;EACL,SAHc,SAAS,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,KAGlC;EAChB,aAAa;GAAE;GAAO;GAAK;EAC5B"}
|
|
@@ -24,7 +24,7 @@ function buildMemorySection(params) {
|
|
|
24
24
|
"",
|
|
25
25
|
"- **Daily notes:** `memory/YYYY-MM-DD.md` — raw logs (runtime may preload recent days on /new or reset)",
|
|
26
26
|
"- **Long-term:** profile `MEMORY.md` — curated memories in Project Context when present",
|
|
27
|
-
"- **Curated store:** agent home `memories/MEMORY.md` and `
|
|
27
|
+
"- **Curated store:** agent home `memories/MEMORY.md` and global `user/MEMORY.md` — use `curated_memory` for live read/write",
|
|
28
28
|
"",
|
|
29
29
|
"### Writing to Memory",
|
|
30
30
|
"",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-skills.js","names":[],"sources":["../../../../../src/agent/prompt/sections/memory-skills.ts"],"sourcesContent":["import type { MemoryCitationsMode } from '../types.js';\n\nexport function buildMemorySection(params: {\n availableTools: Set<string>;\n citationsMode?: MemoryCitationsMode;\n hasProfileMemory?: boolean;\n includeMemorySection?: boolean;\n}): string {\n if (params.includeMemorySection === false) {\n return '';\n }\n const hasMemoryTools =\n params.availableTools.has('memory_search') ||\n params.availableTools.has('memory_get') ||\n params.availableTools.has('curated_memory');\n if (!hasMemoryTools && !params.hasProfileMemory) {\n return '';\n }\n\n const citationsMode = params.citationsMode ?? 'on';\n const citationInstruction =\n citationsMode === 'off'\n ? 'Citations are disabled: do not mention file paths or line numbers in replies.'\n : citationsMode === 'source-only'\n ? 'Citations: mention file path when it helps (e.g., Source: MEMORY.md).'\n : 'Citations: include Source: <path#line> when it helps the user verify memory snippets.';\n\n const toolLines: string[] = [];\n if (params.availableTools.has('memory_search')) {\n toolLines.push('1. Run `memory_search` on profile MEMORY.md and workspace `memory/*.md`');\n }\n if (params.availableTools.has('session_search')) {\n toolLines.push(\n `${toolLines.length + 1}. For **other chat sessions** / cross-session history, use \\`session_search\\` with keywords (or omit \\`query\\` to list recent sessions)`,\n );\n }\n if (params.availableTools.has('memory_get')) {\n toolLines.push(`${toolLines.length + 1}. Use \\`memory_get\\` to pull only the needed lines from files`);\n }\n if (params.availableTools.has('curated_memory')) {\n toolLines.push(\n `${toolLines.length + 1}. For structured curated notes under agent home \\`memories/\\`, use \\`curated_memory\\``,\n );\n }\n toolLines.push(`${toolLines.length + 1}. If low confidence after search, say you checked`);\n\n return [\n '## Memory Recall',\n '',\n citationInstruction,\n '',\n 'Startup profile files (SOUL, USER, MEMORY, etc.) are already in Project Context above when injected. Do not re-read them unless the user asks or you need lines beyond what was injected.',\n '',\n 'Before answering anything about prior work, decisions, dates, people, preferences, or todos:',\n ...toolLines,\n '',\n '### Memory Files',\n '',\n '- **Daily notes:** `memory/YYYY-MM-DD.md` — raw logs (runtime may preload recent days on /new or reset)',\n '- **Long-term:** profile `MEMORY.md` — curated memories in Project Context when present',\n '- **Curated store:** agent home `memories/MEMORY.md` and `
|
|
1
|
+
{"version":3,"file":"memory-skills.js","names":[],"sources":["../../../../../src/agent/prompt/sections/memory-skills.ts"],"sourcesContent":["import type { MemoryCitationsMode } from '../types.js';\n\nexport function buildMemorySection(params: {\n availableTools: Set<string>;\n citationsMode?: MemoryCitationsMode;\n hasProfileMemory?: boolean;\n includeMemorySection?: boolean;\n}): string {\n if (params.includeMemorySection === false) {\n return '';\n }\n const hasMemoryTools =\n params.availableTools.has('memory_search') ||\n params.availableTools.has('memory_get') ||\n params.availableTools.has('curated_memory');\n if (!hasMemoryTools && !params.hasProfileMemory) {\n return '';\n }\n\n const citationsMode = params.citationsMode ?? 'on';\n const citationInstruction =\n citationsMode === 'off'\n ? 'Citations are disabled: do not mention file paths or line numbers in replies.'\n : citationsMode === 'source-only'\n ? 'Citations: mention file path when it helps (e.g., Source: MEMORY.md).'\n : 'Citations: include Source: <path#line> when it helps the user verify memory snippets.';\n\n const toolLines: string[] = [];\n if (params.availableTools.has('memory_search')) {\n toolLines.push('1. Run `memory_search` on profile MEMORY.md and workspace `memory/*.md`');\n }\n if (params.availableTools.has('session_search')) {\n toolLines.push(\n `${toolLines.length + 1}. For **other chat sessions** / cross-session history, use \\`session_search\\` with keywords (or omit \\`query\\` to list recent sessions)`,\n );\n }\n if (params.availableTools.has('memory_get')) {\n toolLines.push(`${toolLines.length + 1}. Use \\`memory_get\\` to pull only the needed lines from files`);\n }\n if (params.availableTools.has('curated_memory')) {\n toolLines.push(\n `${toolLines.length + 1}. For structured curated notes under agent home \\`memories/\\`, use \\`curated_memory\\``,\n );\n }\n toolLines.push(`${toolLines.length + 1}. If low confidence after search, say you checked`);\n\n return [\n '## Memory Recall',\n '',\n citationInstruction,\n '',\n 'Startup profile files (SOUL, USER, MEMORY, etc.) are already in Project Context above when injected. Do not re-read them unless the user asks or you need lines beyond what was injected.',\n '',\n 'Before answering anything about prior work, decisions, dates, people, preferences, or todos:',\n ...toolLines,\n '',\n '### Memory Files',\n '',\n '- **Daily notes:** `memory/YYYY-MM-DD.md` — raw logs (runtime may preload recent days on /new or reset)',\n '- **Long-term:** profile `MEMORY.md` — curated memories in Project Context when present',\n '- **Curated store:** agent home `memories/MEMORY.md` and global `user/MEMORY.md` — use `curated_memory` for live read/write',\n '',\n '### Writing to Memory',\n '',\n '- **Declarative vs procedural:** Save facts and preferences via workspace memory files and/or `curated_memory`. Save reusable task playbooks with `skill_manage` as skills.',\n '- **Memory is limited** — if you want to remember something, WRITE IT TO A FILE',\n '- When someone says \"remember this\" → update `memory/YYYY-MM-DD.md` or relevant file',\n '- **Text > Brain**',\n ].join('\\n');\n}\n\nexport function buildExternalMemorySection(text: string | undefined): string {\n const t = text?.trim();\n if (!t) {\n return '';\n }\n return `## External memory provider\\n\\n${t}`;\n}\n\nexport function buildSkillsSection(hasSkillTools: boolean): string {\n if (!hasSkillTools) {\n return '';\n }\n\n return [\n '## Skills (mandatory)',\n 'Before replying: scan <available_skills> <description> entries.',\n '- If exactly one skill clearly applies: use `skill_view(name)` to load its SKILL.md, then follow it.',\n '- If multiple could apply: choose the most specific one, then load/follow it.',\n '- If none clearly apply: do not load any SKILL.md.',\n 'Constraints: never load more than one skill up front; only load after selecting.',\n '- When a skill drives external API writes, assume rate limits: prefer fewer larger writes, avoid tight one-item loops, serialize bursts when possible, and respect 429/Retry-After.',\n '',\n '**Division of labor with memory:** Skills = **procedural** workflows; memory / `curated_memory` = **declarative** facts and preferences.',\n ].join('\\n');\n}\n"],"mappings":";AAEA,SAAgB,mBAAmB,QAKxB;AACT,KAAI,OAAO,yBAAyB,MAClC,QAAO;AAMT,KAAI,EAHF,OAAO,eAAe,IAAI,gBAAgB,IAC1C,OAAO,eAAe,IAAI,aAAa,IACvC,OAAO,eAAe,IAAI,iBAAiB,KACtB,CAAC,OAAO,iBAC7B,QAAO;CAGT,MAAM,gBAAgB,OAAO,iBAAiB;CAC9C,MAAM,sBACJ,kBAAkB,QACd,kFACA,kBAAkB,gBAChB,0EACA;CAER,MAAM,YAAsB,EAAE;AAC9B,KAAI,OAAO,eAAe,IAAI,gBAAgB,CAC5C,WAAU,KAAK,0EAA0E;AAE3F,KAAI,OAAO,eAAe,IAAI,iBAAiB,CAC7C,WAAU,KACR,GAAG,UAAU,SAAS,EAAE,yIACzB;AAEH,KAAI,OAAO,eAAe,IAAI,aAAa,CACzC,WAAU,KAAK,GAAG,UAAU,SAAS,EAAE,+DAA+D;AAExG,KAAI,OAAO,eAAe,IAAI,iBAAiB,CAC7C,WAAU,KACR,GAAG,UAAU,SAAS,EAAE,uFACzB;AAEH,WAAU,KAAK,GAAG,UAAU,SAAS,EAAE,mDAAmD;AAE1F,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK;;AAGd,SAAgB,2BAA2B,MAAkC;CAC3E,MAAM,IAAI,MAAM,MAAM;AACtB,KAAI,CAAC,EACH,QAAO;AAET,QAAO,kCAAkC;;AAG3C,SAAgB,mBAAmB,eAAgC;AACjE,KAAI,CAAC,cACH,QAAO;AAGT,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK"}
|