@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap-files.js","names":[],"sources":["../../../../src/agent/bootstrap/bootstrap-files.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport { DEFAULT_HEARTBEAT_FILENAME } from '../context/workspace.js';\nimport {\n getOrLoadBootstrapFiles,\n markBootstrapContextInjected,\n wasBootstrapContextInjected,\n} from './bootstrap-cache.js';\nimport {\n buildBootstrapContextFiles,\n resolveBootstrapMaxChars,\n resolveBootstrapTotalMaxChars,\n} from './bootstrap-context.js';\nimport { filterBootstrapFilesForSession } from './filter-bootstrap-files.js';\nimport { loadProfileBootstrapFiles } from './load-bootstrap-files.js';\nimport type { EmbeddedContextFile, WorkspaceBootstrapFile } from './types.js';\n\nexport { clearAllBootstrapSnapshots, clearBootstrapSnapshot } from './bootstrap-cache.js';\n\nfunction filterHeartbeatBootstrapFile(\n files: WorkspaceBootstrapFile[],\n exclude: boolean,\n): WorkspaceBootstrapFile[] {\n if (!exclude) {\n return files;\n }\n return files.filter((file) => file.name !== DEFAULT_HEARTBEAT_FILENAME);\n}\n\nexport function resolveBootstrapFilesSync(params: {\n profileDir: string;\n sessionKey?: string;\n excludeHeartbeat?: boolean;\n}): WorkspaceBootstrapFile[] {\n const rawFiles = loadProfileBootstrapFiles(params.profileDir);\n const filtered = filterBootstrapFilesForSession(rawFiles, params.sessionKey);\n return filterHeartbeatBootstrapFile(filtered, params.excludeHeartbeat ?? false);\n}\n\nexport async function resolveBootstrapFilesForRun(params: {\n profileDir: string;\n sessionKey?: string;\n excludeHeartbeat?: boolean;\n warn?: (message: string) => void;\n}): Promise<WorkspaceBootstrapFile[]> {\n const sessionKey = params.sessionKey;\n const rawFiles = sessionKey\n ? await getOrLoadBootstrapFiles({\n profileDir: params.profileDir,\n sessionKey,\n })\n : loadProfileBootstrapFiles(params.profileDir);\n const filtered = filterBootstrapFilesForSession(rawFiles, sessionKey);\n return filterHeartbeatBootstrapFile(filtered, params.excludeHeartbeat ?? false);\n}\n\nexport function resolveBootstrapContextSync(params: {\n profileDir: string;\n config?: Config;\n sessionKey?: string;\n excludeHeartbeat?: boolean;\n contextInjection?: 'always' | 'continuation-skip' | 'never';\n}): {\n bootstrapFiles: WorkspaceBootstrapFile[];\n contextFiles: EmbeddedContextFile[];\n} {\n const mode = params.contextInjection ?? 'always';\n if (mode === 'never') {\n return { bootstrapFiles: [], contextFiles: [] };\n }\n if (\n mode === 'continuation-skip' &&\n params.sessionKey &&\n wasBootstrapContextInjected(params.sessionKey)\n ) {\n return { bootstrapFiles: [], contextFiles: [] };\n }\n const bootstrapFiles = resolveBootstrapFilesSync(params);\n const contextFiles = buildBootstrapContextFiles(bootstrapFiles, {\n maxChars: resolveBootstrapMaxChars(params.config),\n totalMaxChars: resolveBootstrapTotalMaxChars(params.config),\n });\n if (mode === 'continuation-skip' && params.sessionKey && contextFiles.length > 0) {\n markBootstrapContextInjected(params.sessionKey);\n }\n return { bootstrapFiles, contextFiles };\n}\n\nexport async function resolveBootstrapContextForRun(params: {\n profileDir: string;\n config?: Config;\n sessionKey?: string;\n excludeHeartbeat?: boolean;\n contextInjection?: 'always' | 'continuation-skip' | 'never';\n warn?: (message: string) => void;\n}): Promise<{\n bootstrapFiles: WorkspaceBootstrapFile[];\n contextFiles: EmbeddedContextFile[];\n}> {\n const mode = params.contextInjection ?? 'always';\n if (mode === 'never') {\n return { bootstrapFiles: [], contextFiles: [] };\n }\n if (\n mode === 'continuation-skip' &&\n params.sessionKey &&\n wasBootstrapContextInjected(params.sessionKey)\n ) {\n return { bootstrapFiles: [], contextFiles: [] };\n }\n const bootstrapFiles = await resolveBootstrapFilesForRun(params);\n const contextFiles = buildBootstrapContextFiles(bootstrapFiles, {\n maxChars: resolveBootstrapMaxChars(params.config),\n totalMaxChars: resolveBootstrapTotalMaxChars(params.config),\n warn: params.warn,\n });\n if (mode === 'continuation-skip' && params.sessionKey && contextFiles.length > 0) {\n markBootstrapContextInjected(params.sessionKey);\n }\n return { bootstrapFiles, contextFiles };\n}\n"],"mappings":";;;;;;AAkBA,SAAS,6BACP,OACA,SAC0B;AAC1B,KAAI,CAAC,QACH,QAAO;AAET,QAAO,MAAM,QAAQ,SAAS,KAAK,SAAS,2BAA2B;;AAGzE,SAAgB,0BAA0B,
|
|
1
|
+
{"version":3,"file":"bootstrap-files.js","names":[],"sources":["../../../../src/agent/bootstrap/bootstrap-files.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport { DEFAULT_HEARTBEAT_FILENAME } from '../context/workspace.js';\nimport {\n getOrLoadBootstrapFiles,\n markBootstrapContextInjected,\n wasBootstrapContextInjected,\n} from './bootstrap-cache.js';\nimport {\n buildBootstrapContextFiles,\n resolveBootstrapMaxChars,\n resolveBootstrapTotalMaxChars,\n} from './bootstrap-context.js';\nimport { filterBootstrapFilesForSession } from './filter-bootstrap-files.js';\nimport { loadProfileBootstrapFiles, loadUserProfileBootstrapFile } from './load-bootstrap-files.js';\nimport type { EmbeddedContextFile, WorkspaceBootstrapFile } from './types.js';\n\nexport { clearAllBootstrapSnapshots, clearBootstrapSnapshot } from './bootstrap-cache.js';\n\nfunction filterHeartbeatBootstrapFile(\n files: WorkspaceBootstrapFile[],\n exclude: boolean,\n): WorkspaceBootstrapFile[] {\n if (!exclude) {\n return files;\n }\n return files.filter((file) => file.name !== DEFAULT_HEARTBEAT_FILENAME);\n}\n\nexport function resolveBootstrapFilesSync(params: {\n profileDir: string;\n userProfilePath?: string;\n sessionKey?: string;\n excludeHeartbeat?: boolean;\n}): WorkspaceBootstrapFile[] {\n const rawFiles = [\n ...loadUserProfileBootstrapFile(params.userProfilePath),\n ...loadProfileBootstrapFiles(params.profileDir),\n ];\n const filtered = filterBootstrapFilesForSession(rawFiles, params.sessionKey);\n return filterHeartbeatBootstrapFile(filtered, params.excludeHeartbeat ?? false);\n}\n\nexport async function resolveBootstrapFilesForRun(params: {\n profileDir: string;\n userProfilePath?: string;\n sessionKey?: string;\n excludeHeartbeat?: boolean;\n warn?: (message: string) => void;\n}): Promise<WorkspaceBootstrapFile[]> {\n const sessionKey = params.sessionKey;\n const rawFiles = sessionKey\n ? await getOrLoadBootstrapFiles({\n profileDir: params.profileDir,\n userProfilePath: params.userProfilePath,\n sessionKey,\n })\n : [\n ...loadUserProfileBootstrapFile(params.userProfilePath),\n ...loadProfileBootstrapFiles(params.profileDir),\n ];\n const filtered = filterBootstrapFilesForSession(rawFiles, sessionKey);\n return filterHeartbeatBootstrapFile(filtered, params.excludeHeartbeat ?? false);\n}\n\nexport function resolveBootstrapContextSync(params: {\n profileDir: string;\n userProfilePath?: string;\n config?: Config;\n sessionKey?: string;\n excludeHeartbeat?: boolean;\n contextInjection?: 'always' | 'continuation-skip' | 'never';\n}): {\n bootstrapFiles: WorkspaceBootstrapFile[];\n contextFiles: EmbeddedContextFile[];\n} {\n const mode = params.contextInjection ?? 'always';\n if (mode === 'never') {\n return { bootstrapFiles: [], contextFiles: [] };\n }\n if (\n mode === 'continuation-skip' &&\n params.sessionKey &&\n wasBootstrapContextInjected(params.sessionKey)\n ) {\n return { bootstrapFiles: [], contextFiles: [] };\n }\n const bootstrapFiles = resolveBootstrapFilesSync(params);\n const contextFiles = buildBootstrapContextFiles(bootstrapFiles, {\n maxChars: resolveBootstrapMaxChars(params.config),\n totalMaxChars: resolveBootstrapTotalMaxChars(params.config),\n });\n if (mode === 'continuation-skip' && params.sessionKey && contextFiles.length > 0) {\n markBootstrapContextInjected(params.sessionKey);\n }\n return { bootstrapFiles, contextFiles };\n}\n\nexport async function resolveBootstrapContextForRun(params: {\n profileDir: string;\n userProfilePath?: string;\n config?: Config;\n sessionKey?: string;\n excludeHeartbeat?: boolean;\n contextInjection?: 'always' | 'continuation-skip' | 'never';\n warn?: (message: string) => void;\n}): Promise<{\n bootstrapFiles: WorkspaceBootstrapFile[];\n contextFiles: EmbeddedContextFile[];\n}> {\n const mode = params.contextInjection ?? 'always';\n if (mode === 'never') {\n return { bootstrapFiles: [], contextFiles: [] };\n }\n if (\n mode === 'continuation-skip' &&\n params.sessionKey &&\n wasBootstrapContextInjected(params.sessionKey)\n ) {\n return { bootstrapFiles: [], contextFiles: [] };\n }\n const bootstrapFiles = await resolveBootstrapFilesForRun(params);\n const contextFiles = buildBootstrapContextFiles(bootstrapFiles, {\n maxChars: resolveBootstrapMaxChars(params.config),\n totalMaxChars: resolveBootstrapTotalMaxChars(params.config),\n warn: params.warn,\n });\n if (mode === 'continuation-skip' && params.sessionKey && contextFiles.length > 0) {\n markBootstrapContextInjected(params.sessionKey);\n }\n return { bootstrapFiles, contextFiles };\n}\n"],"mappings":";;;;;;AAkBA,SAAS,6BACP,OACA,SAC0B;AAC1B,KAAI,CAAC,QACH,QAAO;AAET,QAAO,MAAM,QAAQ,SAAS,KAAK,SAAS,2BAA2B;;AAGzE,SAAgB,0BAA0B,QAKb;AAM3B,QAAO,6BADU,+BAA+B,CAH9C,GAAG,6BAA6B,OAAO,gBAAgB,EACvD,GAAG,0BAA0B,OAAO,WAAW,CAEO,EAAE,OAAO,WACrB,EAAE,OAAO,oBAAoB,MAAM;;AAGjF,eAAsB,4BAA4B,QAMZ;CACpC,MAAM,aAAa,OAAO;AAY1B,QAAO,6BADU,+BAVA,aACb,MAAM,wBAAwB;EAC5B,YAAY,OAAO;EACnB,iBAAiB,OAAO;EACxB;EACD,CAAC,GACF,CACE,GAAG,6BAA6B,OAAO,gBAAgB,EACvD,GAAG,0BAA0B,OAAO,WAAW,CAChD,EACqD,WACd,EAAE,OAAO,oBAAoB,MAAM;;AAGjF,SAAgB,4BAA4B,QAU1C;CACA,MAAM,OAAO,OAAO,oBAAoB;AACxC,KAAI,SAAS,QACX,QAAO;EAAE,gBAAgB,EAAE;EAAE,cAAc,EAAE;EAAE;AAEjD,KACE,SAAS,uBACT,OAAO,cACP,4BAA4B,OAAO,WAAW,CAE9C,QAAO;EAAE,gBAAgB,EAAE;EAAE,cAAc,EAAE;EAAE;CAEjD,MAAM,iBAAiB,0BAA0B,OAAO;CACxD,MAAM,eAAe,2BAA2B,gBAAgB;EAC9D,UAAU,yBAAyB,OAAO,OAAO;EACjD,eAAe,8BAA8B,OAAO,OAAO;EAC5D,CAAC;AACF,KAAI,SAAS,uBAAuB,OAAO,cAAc,aAAa,SAAS,EAC7E,8BAA6B,OAAO,WAAW;AAEjD,QAAO;EAAE;EAAgB;EAAc;;AAGzC,eAAsB,8BAA8B,QAWjD;CACD,MAAM,OAAO,OAAO,oBAAoB;AACxC,KAAI,SAAS,QACX,QAAO;EAAE,gBAAgB,EAAE;EAAE,cAAc,EAAE;EAAE;AAEjD,KACE,SAAS,uBACT,OAAO,cACP,4BAA4B,OAAO,WAAW,CAE9C,QAAO;EAAE,gBAAgB,EAAE;EAAE,cAAc,EAAE;EAAE;CAEjD,MAAM,iBAAiB,MAAM,4BAA4B,OAAO;CAChE,MAAM,eAAe,2BAA2B,gBAAgB;EAC9D,UAAU,yBAAyB,OAAO,OAAO;EACjD,eAAe,8BAA8B,OAAO,OAAO;EAC3D,MAAM,OAAO;EACd,CAAC;AACF,KAAI,SAAS,uBAAuB,OAAO,cAAc,aAAa,SAAS,EAC7E,8BAA6B,OAAO,WAAW;AAEjD,QAAO;EAAE;EAAgB;EAAc"}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { isCronSessionKey, isSubagentSessionKey } from "../../routing/session-key-utils.js";
|
|
2
2
|
import { init_session_key } from "../../routing/session-key.js";
|
|
3
|
-
import {
|
|
3
|
+
import { USER_PROFILE_FILENAME, init_paths } from "../../config/paths.js";
|
|
4
|
+
import { DEFAULT_AGENTS_FILENAME, DEFAULT_IDENTITY_FILENAME, DEFAULT_SOUL_FILENAME, DEFAULT_TOOLS_FILENAME } from "../context/workspace.js";
|
|
4
5
|
//#region src/agent/bootstrap/filter-bootstrap-files.ts
|
|
6
|
+
init_paths();
|
|
5
7
|
init_session_key();
|
|
6
8
|
const MINIMAL_BOOTSTRAP_ALLOWLIST = new Set([
|
|
7
9
|
DEFAULT_AGENTS_FILENAME,
|
|
8
10
|
DEFAULT_TOOLS_FILENAME,
|
|
9
11
|
DEFAULT_SOUL_FILENAME,
|
|
10
12
|
DEFAULT_IDENTITY_FILENAME,
|
|
11
|
-
|
|
13
|
+
USER_PROFILE_FILENAME
|
|
12
14
|
]);
|
|
13
15
|
/** Subagent and cron sessions omit MEMORY.md and other heavy profile files. */
|
|
14
16
|
function filterBootstrapFilesForSession(files, sessionKey) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter-bootstrap-files.js","names":[],"sources":["../../../../src/agent/bootstrap/filter-bootstrap-files.ts"],"sourcesContent":["import { isCronSessionKey, isSubagentSessionKey } from '../../routing/session-key.js';\nimport {\n DEFAULT_AGENTS_FILENAME,\n DEFAULT_IDENTITY_FILENAME,\n DEFAULT_SOUL_FILENAME,\n DEFAULT_TOOLS_FILENAME,\n
|
|
1
|
+
{"version":3,"file":"filter-bootstrap-files.js","names":[],"sources":["../../../../src/agent/bootstrap/filter-bootstrap-files.ts"],"sourcesContent":["import { USER_PROFILE_FILENAME } from '../../config/paths.js';\nimport { isCronSessionKey, isSubagentSessionKey } from '../../routing/session-key.js';\nimport {\n DEFAULT_AGENTS_FILENAME,\n DEFAULT_IDENTITY_FILENAME,\n DEFAULT_SOUL_FILENAME,\n DEFAULT_TOOLS_FILENAME,\n} from '../context/workspace.js';\nimport type { WorkspaceBootstrapFile } from './types.js';\n\nconst MINIMAL_BOOTSTRAP_ALLOWLIST = new Set<string>([\n DEFAULT_AGENTS_FILENAME,\n DEFAULT_TOOLS_FILENAME,\n DEFAULT_SOUL_FILENAME,\n DEFAULT_IDENTITY_FILENAME,\n USER_PROFILE_FILENAME,\n]);\n\n/** Subagent and cron sessions omit MEMORY.md and other heavy profile files. */\nexport function filterBootstrapFilesForSession(\n files: WorkspaceBootstrapFile[],\n sessionKey?: string,\n): WorkspaceBootstrapFile[] {\n if (!sessionKey || (!isSubagentSessionKey(sessionKey) && !isCronSessionKey(sessionKey))) {\n return files;\n }\n return files.filter((file) => MINIMAL_BOOTSTRAP_ALLOWLIST.has(file.name));\n}\n"],"mappings":";;;;;YAA8D;kBACwB;AAStF,MAAM,8BAA8B,IAAI,IAAY;CAClD;CACA;CACA;CACA;CACA;CACD,CAAC;;AAGF,SAAgB,+BACd,OACA,YAC0B;AAC1B,KAAI,CAAC,cAAe,CAAC,qBAAqB,WAAW,IAAI,CAAC,iBAAiB,WAAW,CACpF,QAAO;AAET,QAAO,MAAM,QAAQ,SAAS,4BAA4B,IAAI,KAAK,KAAK,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { WorkspaceBootstrapFile } from './types.js';
|
|
2
|
+
export declare function loadUserProfileBootstrapFile(userProfilePath: string | undefined): WorkspaceBootstrapFile[];
|
|
2
3
|
/**
|
|
3
4
|
* Load bootstrap profile Markdown from `agents/<id>/profile/`.
|
|
4
|
-
*
|
|
5
|
+
* Required files emit missing markers; optional files are omitted when absent.
|
|
5
6
|
*/
|
|
6
7
|
export declare function loadProfileBootstrapFiles(profileDir: string): WorkspaceBootstrapFile[];
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { USER_PROFILE_FILENAME, init_paths } from "../../config/paths.js";
|
|
2
|
+
import { DEFAULT_AGENTS_FILENAME, DEFAULT_HEARTBEAT_FILENAME, DEFAULT_IDENTITY_FILENAME, DEFAULT_MEMORY_FILENAME, DEFAULT_SOUL_FILENAME, DEFAULT_TOOLS_FILENAME, REQUIRED_AGENT_PROFILE_MARKDOWN_FILE_SET, stripFrontMatter } from "../context/workspace.js";
|
|
2
3
|
import { join, resolve } from "node:path";
|
|
3
4
|
import { existsSync, readFileSync } from "node:fs";
|
|
4
5
|
//#region src/agent/bootstrap/load-bootstrap-files.ts
|
|
6
|
+
init_paths();
|
|
5
7
|
const PROFILE_LOAD_ORDER = [
|
|
6
8
|
DEFAULT_AGENTS_FILENAME,
|
|
7
9
|
DEFAULT_SOUL_FILENAME,
|
|
8
10
|
DEFAULT_TOOLS_FILENAME,
|
|
9
11
|
DEFAULT_IDENTITY_FILENAME,
|
|
10
|
-
DEFAULT_USER_FILENAME,
|
|
11
12
|
DEFAULT_HEARTBEAT_FILENAME,
|
|
12
13
|
DEFAULT_MEMORY_FILENAME
|
|
13
14
|
];
|
|
@@ -19,26 +20,26 @@ function readProfileFile(filePath) {
|
|
|
19
20
|
return null;
|
|
20
21
|
}
|
|
21
22
|
}
|
|
23
|
+
function loadUserProfileBootstrapFile(userProfilePath) {
|
|
24
|
+
if (!userProfilePath) return [];
|
|
25
|
+
const filePath = resolve(userProfilePath);
|
|
26
|
+
const content = readProfileFile(filePath);
|
|
27
|
+
return content !== null ? [{
|
|
28
|
+
name: USER_PROFILE_FILENAME,
|
|
29
|
+
path: filePath,
|
|
30
|
+
content,
|
|
31
|
+
missing: false
|
|
32
|
+
}] : [];
|
|
33
|
+
}
|
|
22
34
|
/**
|
|
23
35
|
* Load bootstrap profile Markdown from `agents/<id>/profile/`.
|
|
24
|
-
*
|
|
36
|
+
* Required files emit missing markers; optional files are omitted when absent.
|
|
25
37
|
*/
|
|
26
38
|
function loadProfileBootstrapFiles(profileDir) {
|
|
27
39
|
const resolvedDir = resolve(profileDir);
|
|
28
40
|
const result = [];
|
|
29
41
|
for (const name of PROFILE_LOAD_ORDER) {
|
|
30
42
|
const filePath = join(resolvedDir, name);
|
|
31
|
-
if (name === "MEMORY.md") {
|
|
32
|
-
const content = readProfileFile(filePath);
|
|
33
|
-
if (content === null) continue;
|
|
34
|
-
result.push({
|
|
35
|
-
name,
|
|
36
|
-
path: filePath,
|
|
37
|
-
content,
|
|
38
|
-
missing: false
|
|
39
|
-
});
|
|
40
|
-
continue;
|
|
41
|
-
}
|
|
42
43
|
const content = readProfileFile(filePath);
|
|
43
44
|
if (content !== null) result.push({
|
|
44
45
|
name,
|
|
@@ -46,7 +47,7 @@ function loadProfileBootstrapFiles(profileDir) {
|
|
|
46
47
|
content,
|
|
47
48
|
missing: false
|
|
48
49
|
});
|
|
49
|
-
else result.push({
|
|
50
|
+
else if (REQUIRED_AGENT_PROFILE_MARKDOWN_FILE_SET.has(name)) result.push({
|
|
50
51
|
name,
|
|
51
52
|
path: filePath,
|
|
52
53
|
missing: true
|
|
@@ -55,6 +56,6 @@ function loadProfileBootstrapFiles(profileDir) {
|
|
|
55
56
|
return result;
|
|
56
57
|
}
|
|
57
58
|
//#endregion
|
|
58
|
-
export { loadProfileBootstrapFiles };
|
|
59
|
+
export { loadProfileBootstrapFiles, loadUserProfileBootstrapFile };
|
|
59
60
|
|
|
60
61
|
//# sourceMappingURL=load-bootstrap-files.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-bootstrap-files.js","names":[],"sources":["../../../../src/agent/bootstrap/load-bootstrap-files.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\n\nimport { stripFrontMatter } from '../context/workspace.js';\nimport {\n DEFAULT_AGENTS_FILENAME,\n DEFAULT_HEARTBEAT_FILENAME,\n DEFAULT_IDENTITY_FILENAME,\n DEFAULT_MEMORY_FILENAME,\n DEFAULT_SOUL_FILENAME,\n DEFAULT_TOOLS_FILENAME,\n
|
|
1
|
+
{"version":3,"file":"load-bootstrap-files.js","names":[],"sources":["../../../../src/agent/bootstrap/load-bootstrap-files.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\n\nimport { USER_PROFILE_FILENAME } from '../../config/paths.js';\nimport { stripFrontMatter } from '../context/workspace.js';\nimport {\n DEFAULT_AGENTS_FILENAME,\n DEFAULT_HEARTBEAT_FILENAME,\n DEFAULT_IDENTITY_FILENAME,\n DEFAULT_MEMORY_FILENAME,\n DEFAULT_SOUL_FILENAME,\n DEFAULT_TOOLS_FILENAME,\n REQUIRED_AGENT_PROFILE_MARKDOWN_FILE_SET,\n} from '../context/workspace.js';\nimport type { BootstrapFileName, WorkspaceBootstrapFile } from './types.js';\n\nconst PROFILE_LOAD_ORDER: BootstrapFileName[] = [\n DEFAULT_AGENTS_FILENAME,\n DEFAULT_SOUL_FILENAME,\n DEFAULT_TOOLS_FILENAME,\n DEFAULT_IDENTITY_FILENAME,\n DEFAULT_HEARTBEAT_FILENAME,\n DEFAULT_MEMORY_FILENAME,\n];\n\nfunction readProfileFile(filePath: string): string | null {\n if (!existsSync(filePath)) {\n return null;\n }\n try {\n return stripFrontMatter(readFileSync(filePath, 'utf-8'));\n } catch {\n return null;\n }\n}\n\nexport function loadUserProfileBootstrapFile(userProfilePath: string | undefined): WorkspaceBootstrapFile[] {\n if (!userProfilePath) {\n return [];\n }\n const filePath = resolve(userProfilePath);\n const content = readProfileFile(filePath);\n return content !== null\n ? [{ name: USER_PROFILE_FILENAME, path: filePath, content, missing: false }]\n : [];\n}\n\n/**\n * Load bootstrap profile Markdown from `agents/<id>/profile/`.\n * Required files emit missing markers; optional files are omitted when absent.\n */\nexport function loadProfileBootstrapFiles(profileDir: string): WorkspaceBootstrapFile[] {\n const resolvedDir = resolve(profileDir);\n const result: WorkspaceBootstrapFile[] = [];\n\n for (const name of PROFILE_LOAD_ORDER) {\n const filePath = join(resolvedDir, name);\n\n const content = readProfileFile(filePath);\n if (content !== null) {\n result.push({ name, path: filePath, content, missing: false });\n } else if (REQUIRED_AGENT_PROFILE_MARKDOWN_FILE_SET.has(name)) {\n result.push({ name, path: filePath, missing: true });\n }\n }\n\n return result;\n}\n"],"mappings":";;;;;YAG8D;AAa9D,MAAM,qBAA0C;CAC9C;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAS,gBAAgB,UAAiC;AACxD,KAAI,CAAC,WAAW,SAAS,CACvB,QAAO;AAET,KAAI;AACF,SAAO,iBAAiB,aAAa,UAAU,QAAQ,CAAC;SAClD;AACN,SAAO;;;AAIX,SAAgB,6BAA6B,iBAA+D;AAC1G,KAAI,CAAC,gBACH,QAAO,EAAE;CAEX,MAAM,WAAW,QAAQ,gBAAgB;CACzC,MAAM,UAAU,gBAAgB,SAAS;AACzC,QAAO,YAAY,OACf,CAAC;EAAE,MAAM;EAAuB,MAAM;EAAU;EAAS,SAAS;EAAO,CAAC,GAC1E,EAAE;;;;;;AAOR,SAAgB,0BAA0B,YAA8C;CACtF,MAAM,cAAc,QAAQ,WAAW;CACvC,MAAM,SAAmC,EAAE;AAE3C,MAAK,MAAM,QAAQ,oBAAoB;EACrC,MAAM,WAAW,KAAK,aAAa,KAAK;EAExC,MAAM,UAAU,gBAAgB,SAAS;AACzC,MAAI,YAAY,KACd,QAAO,KAAK;GAAE;GAAM,MAAM;GAAU;GAAS,SAAS;GAAO,CAAC;WACrD,yCAAyC,IAAI,KAAK,CAC3D,QAAO,KAAK;GAAE;GAAM,MAAM;GAAU,SAAS;GAAM,CAAC;;AAIxD,QAAO"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { AgentProfileMarkdownFilename } from '../context/workspace.js';
|
|
2
|
-
export type BootstrapFileName = AgentProfileMarkdownFilename;
|
|
2
|
+
export type BootstrapFileName = AgentProfileMarkdownFilename | 'PROFILE.md';
|
|
3
3
|
export type WorkspaceBootstrapFile = {
|
|
4
4
|
name: BootstrapFileName;
|
|
5
5
|
path: string;
|
|
@@ -11,7 +11,7 @@ This workspace is the agent's working area. Treat it as user-owned state.
|
|
|
11
11
|
|
|
12
12
|
## Startup Context
|
|
13
13
|
|
|
14
|
-
Use runtime-provided startup context first. It may already include profile files such as `SOUL.md`, `IDENTITY.md`, `
|
|
14
|
+
Use runtime-provided startup context first. It may already include the global user profile and profile files such as `SOUL.md`, `IDENTITY.md`, `TOOLS.md`, `AGENTS.md`, `HEARTBEAT.md`, and `MEMORY.md`.
|
|
15
15
|
|
|
16
16
|
Do not manually reread startup files unless:
|
|
17
17
|
|
|
@@ -8,14 +8,16 @@ export declare const DEFAULT_AGENTS_FILENAME = "AGENTS.md";
|
|
|
8
8
|
export declare const DEFAULT_SOUL_FILENAME = "SOUL.md";
|
|
9
9
|
export declare const DEFAULT_TOOLS_FILENAME = "TOOLS.md";
|
|
10
10
|
export declare const DEFAULT_IDENTITY_FILENAME = "IDENTITY.md";
|
|
11
|
-
export declare const DEFAULT_USER_FILENAME = "USER.md";
|
|
12
11
|
export declare const DEFAULT_HEARTBEAT_FILENAME = "HEARTBEAT.md";
|
|
13
12
|
export declare const DEFAULT_MEMORY_FILENAME = "MEMORY.md";
|
|
14
|
-
export type AgentProfileMarkdownFilename = typeof DEFAULT_AGENTS_FILENAME | typeof DEFAULT_SOUL_FILENAME | typeof DEFAULT_TOOLS_FILENAME | typeof DEFAULT_IDENTITY_FILENAME | typeof
|
|
13
|
+
export type AgentProfileMarkdownFilename = typeof DEFAULT_AGENTS_FILENAME | typeof DEFAULT_SOUL_FILENAME | typeof DEFAULT_TOOLS_FILENAME | typeof DEFAULT_IDENTITY_FILENAME | typeof DEFAULT_HEARTBEAT_FILENAME | typeof DEFAULT_MEMORY_FILENAME;
|
|
15
14
|
/**
|
|
16
15
|
* Order for loading profile Markdown files into the system prompt (persona / user before repo guide, etc.).
|
|
17
16
|
*/
|
|
18
17
|
export declare const AGENT_PROFILE_MARKDOWN_SYSTEM_FILES: readonly AgentProfileMarkdownFilename[];
|
|
18
|
+
/** Files that should be surfaced when missing. Other profile files are optional overlays. */
|
|
19
|
+
export declare const REQUIRED_AGENT_PROFILE_MARKDOWN_FILES: readonly AgentProfileMarkdownFilename[];
|
|
20
|
+
export declare const REQUIRED_AGENT_PROFILE_MARKDOWN_FILE_SET: ReadonlySet<string>;
|
|
19
21
|
export interface WorkspaceProfileMarkdownFile {
|
|
20
22
|
name: AgentProfileMarkdownFilename;
|
|
21
23
|
path: string;
|
|
@@ -16,7 +16,6 @@ const DEFAULT_AGENTS_FILENAME = "AGENTS.md";
|
|
|
16
16
|
const DEFAULT_SOUL_FILENAME = "SOUL.md";
|
|
17
17
|
const DEFAULT_TOOLS_FILENAME = "TOOLS.md";
|
|
18
18
|
const DEFAULT_IDENTITY_FILENAME = "IDENTITY.md";
|
|
19
|
-
const DEFAULT_USER_FILENAME = "USER.md";
|
|
20
19
|
const DEFAULT_HEARTBEAT_FILENAME = "HEARTBEAT.md";
|
|
21
20
|
const DEFAULT_MEMORY_FILENAME = "MEMORY.md";
|
|
22
21
|
/**
|
|
@@ -25,12 +24,14 @@ const DEFAULT_MEMORY_FILENAME = "MEMORY.md";
|
|
|
25
24
|
const AGENT_PROFILE_MARKDOWN_SYSTEM_FILES = [
|
|
26
25
|
DEFAULT_SOUL_FILENAME,
|
|
27
26
|
DEFAULT_IDENTITY_FILENAME,
|
|
28
|
-
DEFAULT_USER_FILENAME,
|
|
29
27
|
DEFAULT_TOOLS_FILENAME,
|
|
30
28
|
DEFAULT_AGENTS_FILENAME,
|
|
31
29
|
DEFAULT_HEARTBEAT_FILENAME,
|
|
32
30
|
DEFAULT_MEMORY_FILENAME
|
|
33
31
|
];
|
|
32
|
+
/** Files that should be surfaced when missing. Other profile files are optional overlays. */
|
|
33
|
+
const REQUIRED_AGENT_PROFILE_MARKDOWN_FILES = [DEFAULT_SOUL_FILENAME, DEFAULT_IDENTITY_FILENAME];
|
|
34
|
+
const REQUIRED_AGENT_PROFILE_MARKDOWN_FILE_SET = new Set(REQUIRED_AGENT_PROFILE_MARKDOWN_FILES);
|
|
34
35
|
/**
|
|
35
36
|
* Strip YAML front matter from markdown content.
|
|
36
37
|
*/
|
|
@@ -118,7 +119,7 @@ function loadProfileMarkdownFiles(profileDir) {
|
|
|
118
119
|
err
|
|
119
120
|
}, "Failed to load profile Markdown file");
|
|
120
121
|
}
|
|
121
|
-
else {
|
|
122
|
+
else if (REQUIRED_AGENT_PROFILE_MARKDOWN_FILE_SET.has(filename)) {
|
|
122
123
|
const hint = join(profileDir, filename);
|
|
123
124
|
files.push({
|
|
124
125
|
name: filename,
|
|
@@ -165,6 +166,6 @@ function extractThinkingFromAssistantMessage(message) {
|
|
|
165
166
|
return typeof t === "string" ? t : "";
|
|
166
167
|
}
|
|
167
168
|
//#endregion
|
|
168
|
-
export { AGENT_PROFILE_MARKDOWN_SYSTEM_FILES, DEFAULT_AGENTS_FILENAME, DEFAULT_HEARTBEAT_FILENAME, DEFAULT_IDENTITY_FILENAME, DEFAULT_MEMORY_FILENAME, DEFAULT_SOUL_FILENAME, DEFAULT_TOOLS_FILENAME,
|
|
169
|
+
export { AGENT_PROFILE_MARKDOWN_SYSTEM_FILES, DEFAULT_AGENTS_FILENAME, DEFAULT_HEARTBEAT_FILENAME, DEFAULT_IDENTITY_FILENAME, DEFAULT_MEMORY_FILENAME, DEFAULT_SOUL_FILENAME, DEFAULT_TOOLS_FILENAME, PROFILE_MARKDOWN_MAX_CHARS, REQUIRED_AGENT_PROFILE_MARKDOWN_FILES, REQUIRED_AGENT_PROFILE_MARKDOWN_FILE_SET, extractTextContent, extractThinkingContent, extractThinkingFromAssistantMessage, loadProfileMarkdownFiles, stripFrontMatter, toWorkspaceProfileMarkdownFile, truncateProfileMarkdownContent };
|
|
169
170
|
|
|
170
171
|
//# sourceMappingURL=workspace.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.js","names":[],"sources":["../../../../src/agent/context/workspace.ts"],"sourcesContent":["/**\n * Agent profile Markdown (filenames, load order, system prompt assembly) and\n * small helpers for message content extraction.\n *\n * Canonical on-disk root: `agents/<agentId>/profile/`.\n */\n\nimport { readFileSync, existsSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { createLogger } from '../../utils/logger.js';\nimport { parseFrontmatter } from '../../markdown/frontmatter.js';\n\nconst log = createLogger('Workspace');\n\n// =============================================================================\n// Profile Markdown filenames & types (SOUL.md, IDENTITY.md, … under `profile/`)\n// =============================================================================\n\nexport const DEFAULT_AGENTS_FILENAME = 'AGENTS.md';\nexport const DEFAULT_SOUL_FILENAME = 'SOUL.md';\nexport const DEFAULT_TOOLS_FILENAME = 'TOOLS.md';\nexport const DEFAULT_IDENTITY_FILENAME = 'IDENTITY.md';\nexport const DEFAULT_USER_FILENAME = 'USER.md';\nexport const DEFAULT_HEARTBEAT_FILENAME = 'HEARTBEAT.md';\nexport const DEFAULT_MEMORY_FILENAME = 'MEMORY.md';\n\nexport type AgentProfileMarkdownFilename =\n | typeof DEFAULT_AGENTS_FILENAME\n | typeof DEFAULT_SOUL_FILENAME\n | typeof DEFAULT_TOOLS_FILENAME\n | typeof DEFAULT_IDENTITY_FILENAME\n | typeof DEFAULT_USER_FILENAME\n | typeof DEFAULT_HEARTBEAT_FILENAME\n | typeof DEFAULT_MEMORY_FILENAME;\n\n/**\n * Order for loading profile Markdown files into the system prompt (persona / user before repo guide, etc.).\n */\nexport const AGENT_PROFILE_MARKDOWN_SYSTEM_FILES: readonly AgentProfileMarkdownFilename[] = [\n DEFAULT_SOUL_FILENAME,\n DEFAULT_IDENTITY_FILENAME,\n DEFAULT_USER_FILENAME,\n DEFAULT_TOOLS_FILENAME,\n DEFAULT_AGENTS_FILENAME,\n DEFAULT_HEARTBEAT_FILENAME,\n DEFAULT_MEMORY_FILENAME,\n];\n\nexport interface WorkspaceProfileMarkdownFile {\n name: AgentProfileMarkdownFilename;\n path: string;\n content?: string;\n missing: boolean;\n}\n\n/**\n * Strip YAML front matter from markdown content.\n */\nexport function stripFrontMatter(content: string): string {\n return parseFrontmatter(content).content;\n}\n\n// =============================================================================\n// Load & truncate profile Markdown for system prompt\n// =============================================================================\n\n/** Maximum characters to inject from workspace files into system prompt */\nexport const PROFILE_MARKDOWN_MAX_CHARS = 20_000;\n\n/** Profile Markdown truncation: fraction of `maxChars` kept from the start of the file */\nconst HEAD_TRUNCATION_RATIO = 0.7;\n/** Profile Markdown truncation: fraction of `maxChars` kept from the end of the file */\nconst TAIL_TRUNCATION_RATIO = 0.2;\n\nexport interface TruncateResult {\n content: string;\n truncated: boolean;\n originalLength: number;\n}\n\n/**\n * Truncate workspace file content to prevent token overflow.\n * Keeps head (HEAD_TRUNCATION_RATIO, 70%) and tail (TAIL_TRUNCATION_RATIO, 20%) with a\n * truncation marker in between; the remainder is reserved for the marker.\n */\nexport function truncateProfileMarkdownContent(content: string, maxChars: number): TruncateResult {\n const trimmed = content.trimEnd();\n if (trimmed.length <= maxChars) {\n return {\n content: trimmed,\n truncated: false,\n originalLength: trimmed.length,\n };\n }\n\n const headChars = Math.floor(maxChars * HEAD_TRUNCATION_RATIO);\n const tailChars = Math.floor(maxChars * TAIL_TRUNCATION_RATIO);\n const head = trimmed.slice(0, headChars);\n const tail = trimmed.slice(-tailChars);\n\n const marker = [\n '',\n '[...content truncated, read the full file for complete content...]',\n `...(truncated: kept ${headChars}+${tailChars} chars of ${trimmed.length})...`,\n '',\n ].join('\\n');\n\n return {\n content: head + marker + tail,\n truncated: true,\n originalLength: trimmed.length,\n };\n}\n\nexport interface ProfileMarkdownFile {\n name: AgentProfileMarkdownFilename;\n path?: string;\n content: string;\n missing?: boolean;\n}\n\n/**\n * Convert {@link ProfileMarkdownFile} to {@link WorkspaceProfileMarkdownFile} (adds required path field).\n * @param pathFallbackDir — used when `file.path` is absent (e.g. canonical `profile/` root).\n */\nexport function toWorkspaceProfileMarkdownFile(file: ProfileMarkdownFile, pathFallbackDir: string): {\n name: AgentProfileMarkdownFilename;\n path: string;\n content?: string;\n missing: boolean;\n} {\n return {\n name: file.name,\n path: file.path || join(pathFallbackDir, file.name),\n content: file.missing ? undefined : file.content,\n missing: file.missing ?? false,\n };\n}\n\n/**\n * Load profile Markdown from `profileDir` (`agents/<agentId>/profile/`).\n */\nexport function loadProfileMarkdownFiles(profileDir: string): ProfileMarkdownFile[] {\n const files: ProfileMarkdownFile[] = [];\n let loadedCount = 0;\n let missingCount = 0;\n\n for (const filename of AGENT_PROFILE_MARKDOWN_SYSTEM_FILES) {\n const filePath = join(profileDir, filename);\n\n if (existsSync(filePath)) {\n try {\n let content = readFileSync(filePath, 'utf-8');\n\n content = stripFrontMatter(content);\n\n const result = truncateProfileMarkdownContent(content, PROFILE_MARKDOWN_MAX_CHARS);\n\n if (result.content) {\n files.push({\n name: filename,\n content: result.content,\n path: resolve(filePath),\n });\n loadedCount++;\n\n if (result.truncated) {\n log.warn(\n {\n file: filename,\n originalLength: result.originalLength,\n keptLength: result.content.length,\n },\n 'Profile Markdown truncated in system prompt (too long)',\n );\n } else {\n log.debug({ file: filename, path: filePath }, 'Profile Markdown file loaded');\n }\n }\n } catch (err) {\n log.warn({ file: filename, err }, 'Failed to load profile Markdown file');\n }\n } else {\n const hint = join(profileDir, filename);\n files.push({\n name: filename,\n content: `[MISSING] Create this file at: ${hint}`,\n missing: true,\n path: resolve(hint),\n });\n missingCount++;\n log.debug({ file: filename }, 'Profile Markdown file missing');\n }\n }\n\n log.debug({ loaded: loadedCount, missing: missingCount, profileDir }, 'Profile Markdown scan done');\n\n return files;\n}\n\n// =============================================================================\n// Message content helpers\n// =============================================================================\n\n/**\n * Extract text content from agent message content array\n */\nexport function extractTextContent(\n content: Array<{ type: string; text?: string }>\n): string {\n return content\n .filter((c) => c.type === 'text')\n .map((c) => c.text || '')\n .join('');\n}\n\nconst THINKING_BLOCK_TYPES = new Set(['thinking', 'thinking_delta', 'redacted_thinking']);\n\n/**\n * Concatenate thinking / reasoning content blocks from assistant message.content.\n * pi-ai may use `thinking` or `text` on `type: \"thinking\"` blocks.\n */\nexport function extractThinkingContent(\n content: Array<{ type: string; thinking?: string; text?: string }> | undefined\n): string {\n if (!Array.isArray(content)) return '';\n return content\n .filter((c) => THINKING_BLOCK_TYPES.has(c.type))\n .map((c) => (typeof c.thinking === 'string' ? c.thinking : c.text) || '')\n .join('');\n}\n\n/**\n * Extended thinking on the assistant message (e.g. Anthropic reasoning / pi-ai reasoning_details).\n */\nexport function extractThinkingFromAssistantMessage(\n message: { role?: string; reasoning_details?: { thinking?: string } } | undefined\n): string {\n if (!message || message.role !== 'assistant') return '';\n const t = message.reasoning_details?.thinking;\n return typeof t === 'string' ? t : '';\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"workspace.js","names":[],"sources":["../../../../src/agent/context/workspace.ts"],"sourcesContent":["/**\n * Agent profile Markdown (filenames, load order, system prompt assembly) and\n * small helpers for message content extraction.\n *\n * Canonical on-disk root: `agents/<agentId>/profile/`.\n */\n\nimport { readFileSync, existsSync } from 'fs';\nimport { join, resolve } from 'path';\nimport { createLogger } from '../../utils/logger.js';\nimport { parseFrontmatter } from '../../markdown/frontmatter.js';\n\nconst log = createLogger('Workspace');\n\n// =============================================================================\n// Profile Markdown filenames & types (SOUL.md, IDENTITY.md, … under `profile/`)\n// =============================================================================\n\nexport const DEFAULT_AGENTS_FILENAME = 'AGENTS.md';\nexport const DEFAULT_SOUL_FILENAME = 'SOUL.md';\nexport const DEFAULT_TOOLS_FILENAME = 'TOOLS.md';\nexport const DEFAULT_IDENTITY_FILENAME = 'IDENTITY.md';\nexport const DEFAULT_HEARTBEAT_FILENAME = 'HEARTBEAT.md';\nexport const DEFAULT_MEMORY_FILENAME = 'MEMORY.md';\n\nexport type AgentProfileMarkdownFilename =\n | typeof DEFAULT_AGENTS_FILENAME\n | typeof DEFAULT_SOUL_FILENAME\n | typeof DEFAULT_TOOLS_FILENAME\n | typeof DEFAULT_IDENTITY_FILENAME\n | typeof DEFAULT_HEARTBEAT_FILENAME\n | typeof DEFAULT_MEMORY_FILENAME;\n\n/**\n * Order for loading profile Markdown files into the system prompt (persona / user before repo guide, etc.).\n */\nexport const AGENT_PROFILE_MARKDOWN_SYSTEM_FILES: readonly AgentProfileMarkdownFilename[] = [\n DEFAULT_SOUL_FILENAME,\n DEFAULT_IDENTITY_FILENAME,\n DEFAULT_TOOLS_FILENAME,\n DEFAULT_AGENTS_FILENAME,\n DEFAULT_HEARTBEAT_FILENAME,\n DEFAULT_MEMORY_FILENAME,\n];\n\n/** Files that should be surfaced when missing. Other profile files are optional overlays. */\nexport const REQUIRED_AGENT_PROFILE_MARKDOWN_FILES: readonly AgentProfileMarkdownFilename[] = [\n DEFAULT_SOUL_FILENAME,\n DEFAULT_IDENTITY_FILENAME,\n];\n\nexport const REQUIRED_AGENT_PROFILE_MARKDOWN_FILE_SET: ReadonlySet<string> = new Set(\n REQUIRED_AGENT_PROFILE_MARKDOWN_FILES,\n);\n\nexport interface WorkspaceProfileMarkdownFile {\n name: AgentProfileMarkdownFilename;\n path: string;\n content?: string;\n missing: boolean;\n}\n\n/**\n * Strip YAML front matter from markdown content.\n */\nexport function stripFrontMatter(content: string): string {\n return parseFrontmatter(content).content;\n}\n\n// =============================================================================\n// Load & truncate profile Markdown for system prompt\n// =============================================================================\n\n/** Maximum characters to inject from workspace files into system prompt */\nexport const PROFILE_MARKDOWN_MAX_CHARS = 20_000;\n\n/** Profile Markdown truncation: fraction of `maxChars` kept from the start of the file */\nconst HEAD_TRUNCATION_RATIO = 0.7;\n/** Profile Markdown truncation: fraction of `maxChars` kept from the end of the file */\nconst TAIL_TRUNCATION_RATIO = 0.2;\n\nexport interface TruncateResult {\n content: string;\n truncated: boolean;\n originalLength: number;\n}\n\n/**\n * Truncate workspace file content to prevent token overflow.\n * Keeps head (HEAD_TRUNCATION_RATIO, 70%) and tail (TAIL_TRUNCATION_RATIO, 20%) with a\n * truncation marker in between; the remainder is reserved for the marker.\n */\nexport function truncateProfileMarkdownContent(content: string, maxChars: number): TruncateResult {\n const trimmed = content.trimEnd();\n if (trimmed.length <= maxChars) {\n return {\n content: trimmed,\n truncated: false,\n originalLength: trimmed.length,\n };\n }\n\n const headChars = Math.floor(maxChars * HEAD_TRUNCATION_RATIO);\n const tailChars = Math.floor(maxChars * TAIL_TRUNCATION_RATIO);\n const head = trimmed.slice(0, headChars);\n const tail = trimmed.slice(-tailChars);\n\n const marker = [\n '',\n '[...content truncated, read the full file for complete content...]',\n `...(truncated: kept ${headChars}+${tailChars} chars of ${trimmed.length})...`,\n '',\n ].join('\\n');\n\n return {\n content: head + marker + tail,\n truncated: true,\n originalLength: trimmed.length,\n };\n}\n\nexport interface ProfileMarkdownFile {\n name: AgentProfileMarkdownFilename;\n path?: string;\n content: string;\n missing?: boolean;\n}\n\n/**\n * Convert {@link ProfileMarkdownFile} to {@link WorkspaceProfileMarkdownFile} (adds required path field).\n * @param pathFallbackDir — used when `file.path` is absent (e.g. canonical `profile/` root).\n */\nexport function toWorkspaceProfileMarkdownFile(file: ProfileMarkdownFile, pathFallbackDir: string): {\n name: AgentProfileMarkdownFilename;\n path: string;\n content?: string;\n missing: boolean;\n} {\n return {\n name: file.name,\n path: file.path || join(pathFallbackDir, file.name),\n content: file.missing ? undefined : file.content,\n missing: file.missing ?? false,\n };\n}\n\n/**\n * Load profile Markdown from `profileDir` (`agents/<agentId>/profile/`).\n */\nexport function loadProfileMarkdownFiles(profileDir: string): ProfileMarkdownFile[] {\n const files: ProfileMarkdownFile[] = [];\n let loadedCount = 0;\n let missingCount = 0;\n\n for (const filename of AGENT_PROFILE_MARKDOWN_SYSTEM_FILES) {\n const filePath = join(profileDir, filename);\n\n if (existsSync(filePath)) {\n try {\n let content = readFileSync(filePath, 'utf-8');\n\n content = stripFrontMatter(content);\n\n const result = truncateProfileMarkdownContent(content, PROFILE_MARKDOWN_MAX_CHARS);\n\n if (result.content) {\n files.push({\n name: filename,\n content: result.content,\n path: resolve(filePath),\n });\n loadedCount++;\n\n if (result.truncated) {\n log.warn(\n {\n file: filename,\n originalLength: result.originalLength,\n keptLength: result.content.length,\n },\n 'Profile Markdown truncated in system prompt (too long)',\n );\n } else {\n log.debug({ file: filename, path: filePath }, 'Profile Markdown file loaded');\n }\n }\n } catch (err) {\n log.warn({ file: filename, err }, 'Failed to load profile Markdown file');\n }\n } else if (REQUIRED_AGENT_PROFILE_MARKDOWN_FILE_SET.has(filename)) {\n const hint = join(profileDir, filename);\n files.push({\n name: filename,\n content: `[MISSING] Create this file at: ${hint}`,\n missing: true,\n path: resolve(hint),\n });\n missingCount++;\n log.debug({ file: filename }, 'Profile Markdown file missing');\n }\n }\n\n log.debug({ loaded: loadedCount, missing: missingCount, profileDir }, 'Profile Markdown scan done');\n\n return files;\n}\n\n// =============================================================================\n// Message content helpers\n// =============================================================================\n\n/**\n * Extract text content from agent message content array\n */\nexport function extractTextContent(\n content: Array<{ type: string; text?: string }>\n): string {\n return content\n .filter((c) => c.type === 'text')\n .map((c) => c.text || '')\n .join('');\n}\n\nconst THINKING_BLOCK_TYPES = new Set(['thinking', 'thinking_delta', 'redacted_thinking']);\n\n/**\n * Concatenate thinking / reasoning content blocks from assistant message.content.\n * pi-ai may use `thinking` or `text` on `type: \"thinking\"` blocks.\n */\nexport function extractThinkingContent(\n content: Array<{ type: string; thinking?: string; text?: string }> | undefined\n): string {\n if (!Array.isArray(content)) return '';\n return content\n .filter((c) => THINKING_BLOCK_TYPES.has(c.type))\n .map((c) => (typeof c.thinking === 'string' ? c.thinking : c.text) || '')\n .join('');\n}\n\n/**\n * Extended thinking on the assistant message (e.g. Anthropic reasoning / pi-ai reasoning_details).\n */\nexport function extractThinkingFromAssistantMessage(\n message: { role?: string; reasoning_details?: { thinking?: string } } | undefined\n): string {\n if (!message || message.role !== 'assistant') return '';\n const t = message.reasoning_details?.thinking;\n return typeof t === 'string' ? t : '';\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { resolveEffectiveAgentManifestForSession } from "../../config/agent-profile.js";
|
|
1
2
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
3
|
import { init_logger } from "../../utils/logger.js";
|
|
4
|
+
import { init_providers, resolveModel } from "../../providers/index.js";
|
|
3
5
|
import { resolveAgentTurnTimeoutMs } from "../orchestration/run-agent-turn-with-timeout.js";
|
|
4
6
|
import { runXopcEmbeddedTurn } from "./run-turn.js";
|
|
5
7
|
import { applyStartupContextToUserMessage } from "../reply/apply-turn-user-enrichment.js";
|
|
@@ -7,6 +9,7 @@ import { mergeTurnTools, resolveEmbeddedMcpToolsForTurn } from "../mcp/resolve-e
|
|
|
7
9
|
import crypto from "node:crypto";
|
|
8
10
|
//#region src/agent/embedded/run-for-session.ts
|
|
9
11
|
init_logger();
|
|
12
|
+
init_providers();
|
|
10
13
|
const log = createLogger("EmbeddedTurnForSession");
|
|
11
14
|
async function runEmbeddedTurnForSession(params) {
|
|
12
15
|
const { sessionKey, agentManager, modelManager, sessionStore, userMessage } = params;
|
|
@@ -51,22 +54,108 @@ async function runEmbeddedTurnForSession(params) {
|
|
|
51
54
|
});
|
|
52
55
|
const turnTools = mergeTurnTools(tools, mcpResolved.tools);
|
|
53
56
|
try {
|
|
54
|
-
|
|
57
|
+
const candidates = typeof mm.getFallbackCandidatesForSession === "function" ? mm.getFallbackCandidatesForSession(sessionKey) : [];
|
|
58
|
+
const candidateModelRefs = candidates.length > 0 ? candidates.map((candidate) => `${candidate.provider}/${candidate.model}`) : [modelRef];
|
|
59
|
+
log.info({
|
|
55
60
|
sessionKey,
|
|
56
61
|
runId,
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
62
|
+
primaryModelRef: candidateModelRefs[0],
|
|
63
|
+
candidateModelRefs
|
|
64
|
+
}, "Agent model fallback candidates resolved");
|
|
65
|
+
let lastResult;
|
|
66
|
+
let lastError;
|
|
67
|
+
const primaryModelRef = candidateModelRefs[0] ?? modelRef;
|
|
68
|
+
const beforeLen = Array.isArray(agent.state?.messages) ? agent.state.messages.length : void 0;
|
|
69
|
+
for (let i = 0; i < candidateModelRefs.length; i++) {
|
|
70
|
+
const candidateModelRef = candidateModelRefs[i] ?? modelRef;
|
|
71
|
+
const isFallbackAttempt = i > 0;
|
|
72
|
+
let candidateModel = model;
|
|
73
|
+
if (candidateModelRef !== modelRef) try {
|
|
74
|
+
candidateModel = resolveModel(candidateModelRef);
|
|
75
|
+
} catch (err) {
|
|
76
|
+
lastError = err;
|
|
77
|
+
log.warn({
|
|
78
|
+
err,
|
|
79
|
+
sessionKey,
|
|
80
|
+
runId,
|
|
81
|
+
modelRef: candidateModelRef,
|
|
82
|
+
attempt: i + 1,
|
|
83
|
+
total: candidateModelRefs.length
|
|
84
|
+
}, "Skipping model fallback candidate (resolve failed)");
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (typeof mm.applyResolvedModel === "function") mm.applyResolvedModel(agent, candidateModel, candidateModelRef);
|
|
88
|
+
agentManager.setModelForSession(sessionKey, candidateModelRef);
|
|
89
|
+
if (isFallbackAttempt) log.info({
|
|
90
|
+
sessionKey,
|
|
91
|
+
runId,
|
|
92
|
+
primaryModelRef,
|
|
93
|
+
fallbackModelRef: candidateModelRef,
|
|
94
|
+
attempt: i + 1,
|
|
95
|
+
total: candidateModelRefs.length
|
|
96
|
+
}, "Agent model fallback started");
|
|
97
|
+
try {
|
|
98
|
+
const turnResult = await runXopcEmbeddedTurn({
|
|
99
|
+
sessionKey,
|
|
100
|
+
runId,
|
|
101
|
+
userMessage: userMessageForTurn,
|
|
102
|
+
images: params.llmImages,
|
|
103
|
+
model: candidateModel,
|
|
104
|
+
modelRef: candidateModelRef,
|
|
105
|
+
tools: turnTools,
|
|
106
|
+
systemPrompt,
|
|
107
|
+
thinkingLevel,
|
|
108
|
+
workspaceDir,
|
|
109
|
+
sessionStore,
|
|
110
|
+
timeoutMs: resolveAgentTurnTimeoutMs(config),
|
|
111
|
+
abortSignal: params.abortSignal,
|
|
112
|
+
onEvent: params.onEvent
|
|
113
|
+
});
|
|
114
|
+
if (turnResult.ok) {
|
|
115
|
+
if (isFallbackAttempt) log.info({
|
|
116
|
+
sessionKey,
|
|
117
|
+
runId,
|
|
118
|
+
primaryModelRef,
|
|
119
|
+
fallbackModelRef: candidateModelRef,
|
|
120
|
+
attempt: i + 1,
|
|
121
|
+
total: candidateModelRefs.length
|
|
122
|
+
}, "Agent model fallback succeeded");
|
|
123
|
+
return turnResult;
|
|
124
|
+
}
|
|
125
|
+
lastResult = turnResult;
|
|
126
|
+
const hasNextCandidate = i + 1 < candidateModelRefs.length;
|
|
127
|
+
log.warn({
|
|
128
|
+
sessionKey,
|
|
129
|
+
runId,
|
|
130
|
+
modelRef: candidateModelRef,
|
|
131
|
+
attempt: i + 1,
|
|
132
|
+
total: candidateModelRefs.length,
|
|
133
|
+
hasNextCandidate,
|
|
134
|
+
errorMessage: turnResult.errorMessage
|
|
135
|
+
}, hasNextCandidate ? "Agent model turn failed, trying fallback" : "Agent model turn failed, no fallback remains");
|
|
136
|
+
} catch (err) {
|
|
137
|
+
lastError = err;
|
|
138
|
+
if (err instanceof DOMException && err.name === "AbortError") throw err;
|
|
139
|
+
const hasNextCandidate = i + 1 < candidateModelRefs.length;
|
|
140
|
+
log.warn({
|
|
141
|
+
err,
|
|
142
|
+
sessionKey,
|
|
143
|
+
runId,
|
|
144
|
+
modelRef: candidateModelRef,
|
|
145
|
+
attempt: i + 1,
|
|
146
|
+
total: candidateModelRefs.length,
|
|
147
|
+
hasNextCandidate
|
|
148
|
+
}, hasNextCandidate ? "Agent model call threw, trying fallback" : "Agent model call threw, no fallback remains");
|
|
149
|
+
}
|
|
150
|
+
if (beforeLen !== void 0 && Array.isArray(agent.state?.messages)) agent.state.messages = agent.state.messages.slice(0, beforeLen);
|
|
151
|
+
}
|
|
152
|
+
if (lastResult) return lastResult;
|
|
153
|
+
if (lastError instanceof Error) throw lastError;
|
|
154
|
+
if (lastError != null) throw new Error(String(lastError));
|
|
155
|
+
return {
|
|
156
|
+
ok: false,
|
|
157
|
+
errorMessage: "No model candidates available"
|
|
158
|
+
};
|
|
70
159
|
} finally {
|
|
71
160
|
await mcpResolved.dispose().catch(() => {});
|
|
72
161
|
}
|
|
@@ -74,7 +163,9 @@ async function runEmbeddedTurnForSession(params) {
|
|
|
74
163
|
}
|
|
75
164
|
async function maybeAutoCompactBeforeTurn(opts) {
|
|
76
165
|
const { sessionKey, sessionStore, agentManager, model, config, onEvent } = opts;
|
|
77
|
-
if (
|
|
166
|
+
if (config) try {
|
|
167
|
+
if (resolveEffectiveAgentManifestForSession(config, sessionKey).memory.retention?.compaction === false) return;
|
|
168
|
+
} catch {}
|
|
78
169
|
const contextWindow = model.contextWindow ?? 128e3;
|
|
79
170
|
const messages = await sessionStore.load(sessionKey);
|
|
80
171
|
const prep = sessionStore.prepareCompaction(sessionKey, messages, contextWindow);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-for-session.js","names":[],"sources":["../../../../src/agent/embedded/run-for-session.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport type { AgentMessage, ThinkingLevel } from '@earendil-works/pi-agent-core';\n\nimport type { Config } from '../../config/schema.js';\nimport type { AgentInstanceGateway } from '../agent-instance-gateway.js';\nimport type { ModelManager } from '../models/index.js';\nimport type { SessionStore } from '../../session/store.js';\nimport { resolveAgentTurnTimeoutMs } from '../orchestration/run-agent-turn-with-timeout.js';\nimport { runXopcEmbeddedTurn } from './run-turn.js';\nimport type { EmbeddedStreamEvent, RunXopcEmbeddedTurnParams, RunXopcEmbeddedTurnResult } from './types.js';\nimport { applyStartupContextToUserMessage } from '../reply/apply-turn-user-enrichment.js';\nimport {\n mergeTurnTools,\n resolveEmbeddedMcpToolsForTurn,\n} from '../mcp/resolve-embedded-mcp-tools.js';\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('EmbeddedTurnForSession');\n\nexport type RunEmbeddedForSessionParams = {\n sessionKey: string;\n runId?: string;\n userMessage: AgentMessage;\n llmImages?: import('@earendil-works/pi-ai').ImageContent[];\n sessionStore: SessionStore;\n agentManager: AgentInstanceGateway;\n modelManager: ModelManager;\n thinkingOverride?: string | null;\n abortSignal?: AbortSignal;\n onEvent?: (event: EmbeddedStreamEvent) => void;\n getConfig?: () => Config | undefined;\n beforeTurn?: () => void | Promise<void>;\n afterTurn?: (userPlain: string) => void | Promise<void>;\n startupAction?: 'new' | 'reset';\n forceStartupContext?: boolean;\n applyStartupContext?: boolean;\n /** When true, dispose session MCP runtime after this turn completes. */\n cleanupBundleMcpOnRunEnd?: boolean;\n};\n\nexport async function runEmbeddedTurnForSession(\n params: RunEmbeddedForSessionParams,\n): Promise<RunXopcEmbeddedTurnResult> {\n const { sessionKey, agentManager, modelManager, sessionStore, userMessage } = params;\n const runId = params.runId ?? crypto.randomUUID();\n\n await params.beforeTurn?.();\n\n const agent = (agentManager as any).getOrCreateAgent(sessionKey) as {\n state: {\n tools: RunXopcEmbeddedTurnParams['tools'];\n systemPrompt?: string;\n thinkingLevel?: ThinkingLevel;\n };\n };\n const mm = modelManager as any;\n await mm.applyModelForSession(agent, sessionKey);\n\n const modelRef = String(mm.getModelForSession(sessionKey));\n agentManager.setModelForSession(sessionKey, modelRef);\n const model = mm.getResolvedModelForSession(sessionKey) as RunXopcEmbeddedTurnParams['model'];\n const tools = agent.state.tools;\n const systemPrompt = agent.state.systemPrompt ?? '';\n const thinkingLevel = (params.thinkingOverride as ThinkingLevel | undefined) ?? agent.state.thinkingLevel;\n const workspaceDir = agentManager.getResolvedWorkspaceForSession(sessionKey);\n const config = params.getConfig?.();\n\n // --- Pre-turn automatic compaction ---\n await maybeAutoCompactBeforeTurn({\n sessionKey,\n sessionStore,\n agentManager,\n model,\n config,\n onEvent: params.onEvent,\n });\n\n let userMessageForTurn = userMessage;\n if (params.applyStartupContext !== false) {\n userMessageForTurn = await applyStartupContextToUserMessage({\n userMessage,\n sessionKey,\n workspaceDir,\n cfg: config,\n sessionStore,\n startupAction: params.startupAction,\n force: params.forceStartupContext,\n });\n }\n\n const result = await (async () => {\n const mcpResolved = await resolveEmbeddedMcpToolsForTurn({\n sessionKey,\n workspaceDir,\n cfg: config,\n baseTools: tools,\n cleanupOnTurnEnd: params.cleanupBundleMcpOnRunEnd === true,\n });\n const turnTools = mergeTurnTools(tools, mcpResolved.tools);\n try {\n return await runXopcEmbeddedTurn({\n sessionKey,\n runId,\n userMessage: userMessageForTurn,\n images: params.llmImages,\n model,\n modelRef,\n tools: turnTools,\n systemPrompt,\n thinkingLevel,\n workspaceDir,\n sessionStore,\n timeoutMs: resolveAgentTurnTimeoutMs(config),\n abortSignal: params.abortSignal,\n onEvent: params.onEvent,\n });\n } finally {\n await mcpResolved.dispose().catch(() => {});\n }\n })();\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Pre-turn automatic compaction\n// ---------------------------------------------------------------------------\n\nasync function maybeAutoCompactBeforeTurn(opts: {\n sessionKey: string;\n sessionStore: SessionStore;\n agentManager: AgentInstanceGateway;\n model: RunXopcEmbeddedTurnParams['model'];\n config: Config | undefined;\n onEvent?: (event: EmbeddedStreamEvent) => void;\n}): Promise<void> {\n const { sessionKey, sessionStore, agentManager, model, config, onEvent } = opts;\n const compaction = (config?.agents as unknown as {\n defaults?: { compaction?: { enabled?: boolean } };\n } | undefined)?.defaults?.compaction;\n if (compaction?.enabled === false) {\n return;\n }\n\n const contextWindow = (model as { contextWindow?: number }).contextWindow ?? 128_000;\n const messages = await sessionStore.load(sessionKey);\n const prep = sessionStore.prepareCompaction(sessionKey, messages, contextWindow);\n\n if (!prep.needsCompaction) {\n return;\n }\n\n log.info(\n { sessionKey, reason: prep.stats?.reason, usagePercent: prep.stats?.usagePercent, contextWindow },\n 'Pre-turn auto-compaction triggered',\n );\n\n onEvent?.({\n type: 'compaction',\n status: 'started',\n tokensBefore: prep.stats?.usagePercent != null\n ? Math.round((prep.stats.usagePercent as number) * contextWindow)\n : undefined,\n });\n\n try {\n const result = await sessionStore.compact(sessionKey, messages, contextWindow);\n\n if (result.compacted) {\n // Evict the cached agent so the next turn reloads from the compacted transcript\n agentManager.removeAgent(sessionKey);\n\n log.info(\n { sessionKey, tokensBefore: result.tokensBefore, tokensAfter: result.tokensAfter },\n 'Pre-turn auto-compaction completed',\n );\n\n onEvent?.({\n type: 'compaction',\n status: 'completed',\n tokensBefore: result.tokensBefore,\n tokensAfter: result.tokensAfter,\n summary: result.summary.length > 200 ? `${result.summary.slice(0, 200)}…` : result.summary,\n });\n } else {\n onEvent?.({ type: 'compaction', status: 'skipped' });\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n log.warn({ err, sessionKey }, `Pre-turn auto-compaction failed: ${errorMessage}`);\n // Non-fatal: let the turn proceed even if compaction fails\n onEvent?.({ type: 'compaction', status: 'skipped' });\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"run-for-session.js","names":[],"sources":["../../../../src/agent/embedded/run-for-session.ts"],"sourcesContent":["import crypto from 'node:crypto';\nimport type { AgentMessage, ThinkingLevel } from '@earendil-works/pi-agent-core';\n\nimport type { Config } from '../../config/schema.js';\nimport type { AgentInstanceGateway } from '../agent-instance-gateway.js';\nimport type { ModelManager } from '../models/index.js';\nimport type { SessionStore } from '../../session/store.js';\nimport { resolveAgentTurnTimeoutMs } from '../orchestration/run-agent-turn-with-timeout.js';\nimport { runXopcEmbeddedTurn } from './run-turn.js';\nimport type { EmbeddedStreamEvent, RunXopcEmbeddedTurnParams, RunXopcEmbeddedTurnResult } from './types.js';\nimport { applyStartupContextToUserMessage } from '../reply/apply-turn-user-enrichment.js';\nimport { resolveEffectiveAgentManifestForSession } from '../../config/agent-profile.js';\nimport {\n mergeTurnTools,\n resolveEmbeddedMcpToolsForTurn,\n} from '../mcp/resolve-embedded-mcp-tools.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { resolveModel } from '../../providers/index.js';\n\nconst log = createLogger('EmbeddedTurnForSession');\n\nexport type RunEmbeddedForSessionParams = {\n sessionKey: string;\n runId?: string;\n userMessage: AgentMessage;\n llmImages?: import('@earendil-works/pi-ai').ImageContent[];\n sessionStore: SessionStore;\n agentManager: AgentInstanceGateway;\n modelManager: ModelManager;\n thinkingOverride?: string | null;\n abortSignal?: AbortSignal;\n onEvent?: (event: EmbeddedStreamEvent) => void;\n getConfig?: () => Config | undefined;\n beforeTurn?: () => void | Promise<void>;\n afterTurn?: (userPlain: string) => void | Promise<void>;\n startupAction?: 'new' | 'reset';\n forceStartupContext?: boolean;\n applyStartupContext?: boolean;\n /** When true, dispose session MCP runtime after this turn completes. */\n cleanupBundleMcpOnRunEnd?: boolean;\n};\n\nexport async function runEmbeddedTurnForSession(\n params: RunEmbeddedForSessionParams,\n): Promise<RunXopcEmbeddedTurnResult> {\n const { sessionKey, agentManager, modelManager, sessionStore, userMessage } = params;\n const runId = params.runId ?? crypto.randomUUID();\n\n await params.beforeTurn?.();\n\n const agent = (agentManager as any).getOrCreateAgent(sessionKey) as {\n state: {\n tools: RunXopcEmbeddedTurnParams['tools'];\n systemPrompt?: string;\n thinkingLevel?: ThinkingLevel;\n };\n };\n const mm = modelManager as any;\n await mm.applyModelForSession(agent, sessionKey);\n\n const modelRef = String(mm.getModelForSession(sessionKey));\n agentManager.setModelForSession(sessionKey, modelRef);\n const model = mm.getResolvedModelForSession(sessionKey) as RunXopcEmbeddedTurnParams['model'];\n const tools = agent.state.tools;\n const systemPrompt = agent.state.systemPrompt ?? '';\n const thinkingLevel = (params.thinkingOverride as ThinkingLevel | undefined) ?? agent.state.thinkingLevel;\n const workspaceDir = agentManager.getResolvedWorkspaceForSession(sessionKey);\n const config = params.getConfig?.();\n\n // --- Pre-turn automatic compaction ---\n await maybeAutoCompactBeforeTurn({\n sessionKey,\n sessionStore,\n agentManager,\n model,\n config,\n onEvent: params.onEvent,\n });\n\n let userMessageForTurn = userMessage;\n if (params.applyStartupContext !== false) {\n userMessageForTurn = await applyStartupContextToUserMessage({\n userMessage,\n sessionKey,\n workspaceDir,\n cfg: config,\n sessionStore,\n startupAction: params.startupAction,\n force: params.forceStartupContext,\n });\n }\n\n const result = await (async () => {\n const mcpResolved = await resolveEmbeddedMcpToolsForTurn({\n sessionKey,\n workspaceDir,\n cfg: config,\n baseTools: tools,\n cleanupOnTurnEnd: params.cleanupBundleMcpOnRunEnd === true,\n });\n const turnTools = mergeTurnTools(tools, mcpResolved.tools);\n try {\n const candidates = typeof mm.getFallbackCandidatesForSession === 'function'\n ? mm.getFallbackCandidatesForSession(sessionKey)\n : [];\n const candidateModelRefs = candidates.length > 0\n ? candidates.map((candidate: { provider: string; model: string }) => `${candidate.provider}/${candidate.model}`)\n : [modelRef];\n log.info(\n { sessionKey, runId, primaryModelRef: candidateModelRefs[0], candidateModelRefs },\n 'Agent model fallback candidates resolved',\n );\n\n let lastResult: RunXopcEmbeddedTurnResult | undefined;\n let lastError: unknown;\n const primaryModelRef = candidateModelRefs[0] ?? modelRef;\n const beforeLen = Array.isArray((agent as any).state?.messages)\n ? (agent as any).state.messages.length\n : undefined;\n\n for (let i = 0; i < candidateModelRefs.length; i++) {\n const candidateModelRef = candidateModelRefs[i] ?? modelRef;\n const isFallbackAttempt = i > 0;\n let candidateModel = model;\n if (candidateModelRef !== modelRef) {\n try {\n candidateModel = resolveModel(candidateModelRef) as RunXopcEmbeddedTurnParams['model'];\n } catch (err) {\n lastError = err;\n log.warn(\n { err, sessionKey, runId, modelRef: candidateModelRef, attempt: i + 1, total: candidateModelRefs.length },\n 'Skipping model fallback candidate (resolve failed)',\n );\n continue;\n }\n }\n\n if (typeof mm.applyResolvedModel === 'function') {\n mm.applyResolvedModel(agent, candidateModel, candidateModelRef);\n }\n agentManager.setModelForSession(sessionKey, candidateModelRef);\n\n if (isFallbackAttempt) {\n log.info(\n {\n sessionKey,\n runId,\n primaryModelRef,\n fallbackModelRef: candidateModelRef,\n attempt: i + 1,\n total: candidateModelRefs.length,\n },\n 'Agent model fallback started',\n );\n }\n\n try {\n const turnResult = await runXopcEmbeddedTurn({\n sessionKey,\n runId,\n userMessage: userMessageForTurn,\n images: params.llmImages,\n model: candidateModel,\n modelRef: candidateModelRef,\n tools: turnTools,\n systemPrompt,\n thinkingLevel,\n workspaceDir,\n sessionStore,\n timeoutMs: resolveAgentTurnTimeoutMs(config),\n abortSignal: params.abortSignal,\n onEvent: params.onEvent,\n });\n\n if (turnResult.ok) {\n if (isFallbackAttempt) {\n log.info(\n {\n sessionKey,\n runId,\n primaryModelRef,\n fallbackModelRef: candidateModelRef,\n attempt: i + 1,\n total: candidateModelRefs.length,\n },\n 'Agent model fallback succeeded',\n );\n }\n return turnResult;\n }\n\n lastResult = turnResult;\n const hasNextCandidate = i + 1 < candidateModelRefs.length;\n log.warn(\n {\n sessionKey,\n runId,\n modelRef: candidateModelRef,\n attempt: i + 1,\n total: candidateModelRefs.length,\n hasNextCandidate,\n errorMessage: turnResult.errorMessage,\n },\n hasNextCandidate\n ? 'Agent model turn failed, trying fallback'\n : 'Agent model turn failed, no fallback remains',\n );\n } catch (err) {\n lastError = err;\n if (err instanceof DOMException && err.name === 'AbortError') {\n throw err;\n }\n const hasNextCandidate = i + 1 < candidateModelRefs.length;\n log.warn(\n { err, sessionKey, runId, modelRef: candidateModelRef, attempt: i + 1, total: candidateModelRefs.length, hasNextCandidate },\n hasNextCandidate\n ? 'Agent model call threw, trying fallback'\n : 'Agent model call threw, no fallback remains',\n );\n }\n\n if (beforeLen !== undefined && Array.isArray((agent as any).state?.messages)) {\n (agent as any).state.messages = (agent as any).state.messages.slice(0, beforeLen);\n }\n }\n\n if (lastResult) return lastResult;\n if (lastError instanceof Error) throw lastError;\n if (lastError != null) throw new Error(String(lastError));\n return { ok: false, errorMessage: 'No model candidates available' };\n } finally {\n await mcpResolved.dispose().catch(() => {});\n }\n })();\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// Pre-turn automatic compaction\n// ---------------------------------------------------------------------------\n\nasync function maybeAutoCompactBeforeTurn(opts: {\n sessionKey: string;\n sessionStore: SessionStore;\n agentManager: AgentInstanceGateway;\n model: RunXopcEmbeddedTurnParams['model'];\n config: Config | undefined;\n onEvent?: (event: EmbeddedStreamEvent) => void;\n}): Promise<void> {\n const { sessionKey, sessionStore, agentManager, model, config, onEvent } = opts;\n if (config) {\n try {\n const manifest = resolveEffectiveAgentManifestForSession(config, sessionKey);\n if (manifest.memory.retention?.compaction === false) {\n return;\n }\n } catch {\n // Keep compaction enabled when manifest resolution is unavailable.\n }\n }\n\n const contextWindow = (model as { contextWindow?: number }).contextWindow ?? 128_000;\n const messages = await sessionStore.load(sessionKey);\n const prep = sessionStore.prepareCompaction(sessionKey, messages, contextWindow);\n\n if (!prep.needsCompaction) {\n return;\n }\n\n log.info(\n { sessionKey, reason: prep.stats?.reason, usagePercent: prep.stats?.usagePercent, contextWindow },\n 'Pre-turn auto-compaction triggered',\n );\n\n onEvent?.({\n type: 'compaction',\n status: 'started',\n tokensBefore: prep.stats?.usagePercent != null\n ? Math.round((prep.stats.usagePercent as number) * contextWindow)\n : undefined,\n });\n\n try {\n const result = await sessionStore.compact(sessionKey, messages, contextWindow);\n\n if (result.compacted) {\n // Evict the cached agent so the next turn reloads from the compacted transcript\n agentManager.removeAgent(sessionKey);\n\n log.info(\n { sessionKey, tokensBefore: result.tokensBefore, tokensAfter: result.tokensAfter },\n 'Pre-turn auto-compaction completed',\n );\n\n onEvent?.({\n type: 'compaction',\n status: 'completed',\n tokensBefore: result.tokensBefore,\n tokensAfter: result.tokensAfter,\n summary: result.summary.length > 200 ? `${result.summary.slice(0, 200)}…` : result.summary,\n });\n } else {\n onEvent?.({ type: 'compaction', status: 'skipped' });\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : String(err);\n log.warn({ err, sessionKey }, `Pre-turn auto-compaction failed: ${errorMessage}`);\n // Non-fatal: let the turn proceed even if compaction fails\n onEvent?.({ type: 'compaction', status: 'skipped' });\n }\n}\n"],"mappings":"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"}
|
|
@@ -3,14 +3,6 @@ export interface ModelCandidate {
|
|
|
3
3
|
provider: string;
|
|
4
4
|
model: string;
|
|
5
5
|
}
|
|
6
|
-
export interface FallbackAttempt {
|
|
7
|
-
provider: string;
|
|
8
|
-
model: string;
|
|
9
|
-
error: string;
|
|
10
|
-
reason?: string;
|
|
11
|
-
status?: number;
|
|
12
|
-
code?: string;
|
|
13
|
-
}
|
|
14
6
|
export declare function resolveFallbackCandidates(params: {
|
|
15
7
|
cfg: Config | undefined;
|
|
16
8
|
provider: string;
|
|
@@ -3,16 +3,15 @@ import { normalizeProviderId, parseModelRef as parseModelRef$1 } from "../models
|
|
|
3
3
|
//#region src/agent/fallback/candidates.ts
|
|
4
4
|
init_providers();
|
|
5
5
|
function getDefaultModelParts(config) {
|
|
6
|
-
const
|
|
6
|
+
const defaultModel = getDefaultModelSync(config);
|
|
7
|
+
if (!defaultModel) return null;
|
|
8
|
+
const parts = defaultModel.split("/");
|
|
9
|
+
if (!parts[0] || !parts[1]) return null;
|
|
7
10
|
return {
|
|
8
|
-
provider: parts[0]
|
|
9
|
-
model: parts[1]
|
|
11
|
+
provider: parts[0],
|
|
12
|
+
model: parts[1]
|
|
10
13
|
};
|
|
11
14
|
}
|
|
12
|
-
function getConfiguredFallbackRefs(config) {
|
|
13
|
-
const legacyModel = (config?.agents)?.defaults?.model;
|
|
14
|
-
if (legacyModel && typeof legacyModel === "object" && Array.isArray(legacyModel.fallbacks)) return legacyModel.fallbacks.filter((value) => typeof value === "string");
|
|
15
|
-
}
|
|
16
15
|
/**
|
|
17
16
|
* Parse model reference string into provider/model parts.
|
|
18
17
|
* Uses the unified implementation from selection.ts.
|
|
@@ -28,11 +27,11 @@ function parseModelRef(raw, defaultProvider) {
|
|
|
28
27
|
function resolveFallbackCandidates(params) {
|
|
29
28
|
const { cfg, provider: inputProvider, model: inputModel, fallbacksOverride } = params;
|
|
30
29
|
const primaryRef = getDefaultModelSync(cfg);
|
|
31
|
-
const fallbacks = fallbacksOverride
|
|
30
|
+
const fallbacks = fallbacksOverride;
|
|
32
31
|
const defaultParts = getDefaultModelParts(cfg);
|
|
33
32
|
const primaryResolved = parseModelRef(primaryRef || getDefaultModelSync(cfg));
|
|
34
|
-
const provider = inputProvider.trim() || primaryResolved?.provider || defaultParts
|
|
35
|
-
const model = inputModel.trim() || primaryResolved?.model || defaultParts
|
|
33
|
+
const provider = inputProvider.trim() || primaryResolved?.provider || defaultParts?.provider || "";
|
|
34
|
+
const model = inputModel.trim() || primaryResolved?.model || defaultParts?.model || "";
|
|
36
35
|
const candidates = [];
|
|
37
36
|
const seen = /* @__PURE__ */ new Set();
|
|
38
37
|
const addCandidate = (c) => {
|
|
@@ -42,7 +41,7 @@ function resolveFallbackCandidates(params) {
|
|
|
42
41
|
seen.add(key);
|
|
43
42
|
candidates.push(c);
|
|
44
43
|
};
|
|
45
|
-
addCandidate({
|
|
44
|
+
if (provider && model) addCandidate({
|
|
46
45
|
provider,
|
|
47
46
|
model
|
|
48
47
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"candidates.js","names":["parseModelRefUtil"],"sources":["../../../../src/agent/fallback/candidates.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport { isProviderConfiguredSync } from '../../providers/index.js';\nimport { getDefaultModelSync } from '../../providers/index.js';\nimport { parseModelRef as parseModelRefUtil, normalizeProviderId } from '../models/selection.js';\n\nexport interface ModelCandidate {\n provider: string;\n model: string;\n}\n\
|
|
1
|
+
{"version":3,"file":"candidates.js","names":["parseModelRefUtil"],"sources":["../../../../src/agent/fallback/candidates.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport { isProviderConfiguredSync } from '../../providers/index.js';\nimport { getDefaultModelSync } from '../../providers/index.js';\nimport { parseModelRef as parseModelRefUtil, normalizeProviderId } from '../models/selection.js';\n\nexport interface ModelCandidate {\n provider: string;\n model: string;\n}\n\nfunction getDefaultModelParts(config?: Config): ModelCandidate | null {\n const defaultModel = getDefaultModelSync(config);\n if (!defaultModel) return null;\n const parts = defaultModel.split('/');\n if (!parts[0] || !parts[1]) return null;\n return { provider: parts[0], model: parts[1] };\n}\n\n/**\n * Parse model reference string into provider/model parts.\n * Uses the unified implementation from selection.ts.\n */\nfunction parseModelRef(raw: string, defaultProvider?: string): ModelCandidate | null {\n const result = parseModelRefUtil(raw, defaultProvider);\n if (!result) return null;\n return {\n provider: normalizeProviderId(result.provider),\n model: result.model,\n };\n}\n\nexport function resolveFallbackCandidates(params: {\n cfg: Config | undefined;\n provider: string;\n model: string;\n fallbacksOverride?: string[];\n}): ModelCandidate[] {\n const { cfg, provider: inputProvider, model: inputModel, fallbacksOverride } = params;\n\n const primaryRef = getDefaultModelSync(cfg);\n const fallbacks = fallbacksOverride;\n\n const defaultParts = getDefaultModelParts(cfg);\n const primaryResolved = parseModelRef(primaryRef || getDefaultModelSync(cfg));\n const provider = inputProvider.trim() || primaryResolved?.provider || defaultParts?.provider || '';\n const model = inputModel.trim() || primaryResolved?.model || defaultParts?.model || '';\n\n const candidates: ModelCandidate[] = [];\n const seen = new Set<string>();\n\n const addCandidate = (c: ModelCandidate) => {\n const key = `${c.provider}/${c.model}`.toLowerCase();\n if (seen.has(key)) return;\n // Skip providers that are not configured (no API key)\n if (!isProviderConfiguredSync(c.provider)) return;\n seen.add(key);\n candidates.push(c);\n };\n\n if (provider && model) {\n addCandidate({ provider, model });\n }\n\n if (fallbacks) {\n for (const fb of fallbacks) {\n const resolved = parseModelRef(fb, provider);\n if (resolved) addCandidate(resolved);\n }\n }\n\n if (!fallbacksOverride && primaryResolved) {\n addCandidate(primaryResolved);\n }\n\n return candidates;\n}\n"],"mappings":";;;gBACoE;AASpE,SAAS,qBAAqB,QAAwC;CACpE,MAAM,eAAe,oBAAoB,OAAO;AAChD,KAAI,CAAC,aAAc,QAAO;CAC1B,MAAM,QAAQ,aAAa,MAAM,IAAI;AACrC,KAAI,CAAC,MAAM,MAAM,CAAC,MAAM,GAAI,QAAO;AACnC,QAAO;EAAE,UAAU,MAAM;EAAI,OAAO,MAAM;EAAI;;;;;;AAOhD,SAAS,cAAc,KAAa,iBAAiD;CACnF,MAAM,SAASA,gBAAkB,KAAK,gBAAgB;AACtD,KAAI,CAAC,OAAQ,QAAO;AACpB,QAAO;EACL,UAAU,oBAAoB,OAAO,SAAS;EAC9C,OAAO,OAAO;EACf;;AAGH,SAAgB,0BAA0B,QAKrB;CACnB,MAAM,EAAE,KAAK,UAAU,eAAe,OAAO,YAAY,sBAAsB;CAE/E,MAAM,aAAa,oBAAoB,IAAI;CAC3C,MAAM,YAAY;CAElB,MAAM,eAAe,qBAAqB,IAAI;CAC9C,MAAM,kBAAkB,cAAc,cAAc,oBAAoB,IAAI,CAAC;CAC7E,MAAM,WAAW,cAAc,MAAM,IAAI,iBAAiB,YAAY,cAAc,YAAY;CAChG,MAAM,QAAQ,WAAW,MAAM,IAAI,iBAAiB,SAAS,cAAc,SAAS;CAEpF,MAAM,aAA+B,EAAE;CACvC,MAAM,uBAAO,IAAI,KAAa;CAE9B,MAAM,gBAAgB,MAAsB;EAC1C,MAAM,MAAM,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ,aAAa;AACpD,MAAI,KAAK,IAAI,IAAI,CAAE;AAEnB,MAAI,CAAC,yBAAyB,EAAE,SAAS,CAAE;AAC3C,OAAK,IAAI,IAAI;AACb,aAAW,KAAK,EAAE;;AAGpB,KAAI,YAAY,MACd,cAAa;EAAE;EAAU;EAAO,CAAC;AAGnC,KAAI,UACF,MAAK,MAAM,MAAM,WAAW;EAC1B,MAAM,WAAW,cAAc,IAAI,SAAS;AAC5C,MAAI,SAAU,cAAa,SAAS;;AAIxC,KAAI,CAAC,qBAAqB,gBACxB,cAAa,gBAAgB;AAG/B,QAAO"}
|
package/dist/src/agent/index.js
CHANGED
|
@@ -5,10 +5,10 @@ import { AgentInbox } from "./ipc/inbox.js";
|
|
|
5
5
|
import { AgentBus } from "./ipc/bus.js";
|
|
6
6
|
import { AgentSocketClient, AgentSocketServer, isSocketAvailable } from "./ipc/socket.js";
|
|
7
7
|
import "./ipc/index.js";
|
|
8
|
+
import { AgentService } from "./service.js";
|
|
8
9
|
import { resolveTranscriptPolicy } from "./transcript/transcript-policy.js";
|
|
9
10
|
import { dropThinkingBlocks } from "./transcript/thinking.js";
|
|
10
11
|
import { applySessionTranscriptHygiene, applySessionTranscriptHygieneForPersistence, applySessionTranscriptHygieneWithPolicy, resolvePolicyForModel, tryApplySessionTranscriptHygiene, tryApplySessionTranscriptHygieneForPersistence } from "./transcript/transcript-hygiene.js";
|
|
11
|
-
import { AgentService } from "./service.js";
|
|
12
12
|
import { stripToolMessages } from "./transcript/strip-tool-messages.js";
|
|
13
13
|
import "./transcript/index.js";
|
|
14
14
|
export { AgentBus, AgentInbox, AgentService, AgentSocketClient, AgentSocketServer, applySessionTranscriptHygiene, applySessionTranscriptHygieneForPersistence, applySessionTranscriptHygieneWithPolicy, createResponseMessage, createSignalMessage, createTaskMessage, dropThinkingBlocks, extractToolCallsFromAssistant, extractToolResultId, isSocketAvailable, isValidIPCMessage, makeMissingToolResult, repairToolUseResultPairing, resolvePolicyForModel, resolveTranscriptPolicy, sanitizeToolCallId, sanitizeToolCallIdsForCloudCodeAssist, sanitizeToolCallInputs, sanitizeToolUseResultPairing, stripToolMessages, stripToolResultDetails, tryApplySessionTranscriptHygiene, tryApplySessionTranscriptHygieneForPersistence };
|
|
@@ -8,8 +8,6 @@ export interface CompactionHandlerConfig {
|
|
|
8
8
|
}
|
|
9
9
|
export declare class CompactionLifecycleHandler implements LifecycleHandler<LLMResponsePayload> {
|
|
10
10
|
readonly name = "CompactionLifecycleHandler";
|
|
11
|
-
|
|
12
|
-
constructor(config?: Partial<CompactionHandlerConfig>);
|
|
11
|
+
constructor(_config?: Partial<CompactionHandlerConfig>);
|
|
13
12
|
handle(event: LifecycleEventData<LLMResponsePayload>, _context: AgentContext): Promise<void>;
|
|
14
|
-
private shouldCompact;
|
|
15
13
|
}
|