@xopcai/xopc 0.0.116 → 0.0.117
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 +21 -6
- package/README.zh-CN.md +21 -6
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/demo-memory/src/index.d.ts +6 -0
- package/dist/extensions/demo-memory/src/index.js +132 -0
- package/dist/extensions/demo-memory/src/index.js.map +1 -0
- package/dist/extensions/demo-memory/xopc.extension.json +15 -0
- package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
- package/dist/extensions/feishu/src/schema/config-schema.d.ts +3 -3
- package/dist/extensions/feishu/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
- package/dist/extensions/telegram/src/command-handler.js +1 -2
- package/dist/extensions/telegram/src/command-handler.js.map +1 -1
- package/dist/extensions/telegram/src/config-schema.d.ts +8 -8
- package/dist/extensions/telegram/src/inbound-processor.js +1 -1
- package/dist/extensions/telegram/src/plugin.js +1 -1
- package/dist/extensions/telegram/src/routing-integration.js +2 -2
- package/dist/extensions/telegram/src/update-offset-store.js +1 -1
- package/dist/extensions/telegram/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/api/api.js +2 -2
- package/dist/extensions/weixin/src/auth/accounts.js +1 -1
- package/dist/extensions/weixin/src/cdn/upload.js +1 -1
- package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
- package/dist/extensions/weixin/src/media/data-url.js +1 -1
- package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
- package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/extensions/weixin/src/plugin.js +1 -1
- package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
- package/dist/extensions/weixin/src/workflow-progress.js +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CWM1UU5P.js → agent-avatar-dicebear-BBLhJ2C6.js} +1 -1
- package/dist/gateway/static/root/assets/agents-C6xgagZd.js +71 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-yXSXY_bu.js → app-management-settings-panel-CBpLONvG.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-DjY1P_ug.js → appearance-settings-CGcc54yj.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-DdDx0V4z.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-CytE5j-e.js → archive-plugin-DZsVqMhU.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-BvvrN6rF.js → attachment-load-CIol6JWX.js} +1 -1
- package/dist/gateway/static/root/assets/{binary-plugins-IBWSitnj.js → binary-plugins-B3UauMfp.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-C-wDpsf-.js → block-editor-2HJoFchH.js} +3 -3
- package/dist/gateway/static/root/assets/browser-settings-page-CUOO-PQk.js +8 -0
- package/dist/gateway/static/root/assets/capability-presets-api-XQoMTI0A.js +1 -0
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-CfqF-kGr.js +1 -0
- package/dist/gateway/static/root/assets/{channels-settings-Cd3JbeQ1.js → channels-settings-BYyRzsex.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-DIvEz4NX.js +2 -0
- package/dist/gateway/static/root/assets/cron-api-R41aQCX9.js +1 -0
- package/dist/gateway/static/root/assets/cron-page-D97nFqQD.js +3 -0
- package/dist/gateway/static/root/assets/dreaming-settings-Bceaw1PG.js +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-BAIyjDlq.js → extension-debug-page-DX5WRE_t.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-DEhv2GpC.js → extension-page-Buah7Bw-.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-DOuAxTDW.js → extension-settings-page-DuroLVnf.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-CTsREQIe.js → fetch-B5zdl27C.js} +1 -1
- package/dist/gateway/static/root/assets/{format-interval-label-D35Bfhtx.js → format-interval-label-Dn_QKIqb.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-config-api-gT4ZhE7h.js +1 -0
- package/dist/gateway/static/root/assets/gateway-settings-iISWAZRm.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-C1KAHrd2.js → gateway-startup-retry-B3kL8KGY.js} +1 -1
- package/dist/gateway/static/root/assets/goal-detail-page-DCUROLMQ.js +1 -0
- package/dist/gateway/static/root/assets/{goals-config-api-KnLGpu6h.js → goals-config-api-AR-fVh0P.js} +1 -1
- package/dist/gateway/static/root/assets/goals-page-Cpb21ezg.js +2 -0
- package/dist/gateway/static/root/assets/{goals-settings-DtPtqZi8.js → goals-settings-CPAuFwoD.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-config-api-uKw1f0IG.js → heartbeat-config-api-D7bKFEeO.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-DN9vEj9P.js → heartbeat-settings-CC69vNx0.js} +1 -1
- package/dist/gateway/static/root/assets/index-CwhK8qCh.js +122 -0
- package/dist/gateway/static/root/assets/index-CyfhARL-.css +1 -0
- package/dist/gateway/static/root/assets/{interval-presets-Dq0FXJ65.js → interval-presets-0DtsnxE0.js} +1 -1
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-C9_t4m7t.js → keyboard-shortcuts-settings-BPREtN8B.js} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-SNkWzidV.js → logs-page-DefCgF4o.js} +2 -2
- package/dist/gateway/static/root/assets/{markdown-split-Ca87W8-h.js → markdown-split-ChbR9LGO.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-BAcUjPRJ.js → media-plugins-B82oP80n.js} +1 -1
- package/dist/gateway/static/root/assets/messages-Cf1O9JB0.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-panel-DmKiIihT.js +2 -0
- package/dist/gateway/static/root/assets/note-detail-page-CxxfLRJZ.js +2 -0
- package/dist/gateway/static/root/assets/{note-image-lightbox-hnSX5SSn.js → note-image-lightbox-CDknITM3.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-page-ycsDlkFA.js → notes-page-X2slSx7V.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-CNgM20H5.js → preview-open-alternatives-DV3xQsWB.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-BvmUWqgu.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-CcdjGcfT.js → save-bar-controls-BODCXnvY.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-CYr39z76.js → schedule-field-CgJSCD3B.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-BRAJgZQ2.js → schema-form-qtfEI6QM.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-B0yESuuL.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-q2M8RKOo.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-BhzjeGWi.js → settings-collapsible-section-BHZKjVcS.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-Cz3Pcr9b.js → settings-form-section-5i35D-J1.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-CGozabLD.js +1 -0
- package/dist/gateway/static/root/assets/setup-status-panel-FoOSe6nU.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-DL4y9K5e.js → share-preview-page-B0H63tDv.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-Cy5zWyYQ.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-DaZNFro9.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-CnwtUzvw.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-FD2jxRZ3.js → system-settings-panel-DXs2VmBt.js} +1 -1
- package/dist/gateway/static/root/assets/typed-models-lib-4gPuydz_.js +1 -0
- package/dist/gateway/static/root/assets/{use-channel-catalog-BInPrfR5.js → use-channel-catalog-BCjP_VHb.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DvKiOglO.js +1 -0
- package/dist/gateway/static/root/assets/{voice-player-store-1U3vFppm.js → voice-player-store-BlF9V05n.js} +1 -1
- package/dist/gateway/static/root/assets/workflows-page-CAVZcONQ.js +18 -0
- package/dist/gateway/static/root/index.html +5 -5
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +1 -1
- package/dist/src/agent/agent-manager.js +13 -14
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/agent-scope.js +7 -9
- package/dist/src/agent/agent-scope.js.map +1 -1
- package/dist/src/agent/background-review/coordinator.js +0 -1
- package/dist/src/agent/background-review/coordinator.js.map +1 -1
- package/dist/src/agent/background-review/run-background-review.d.ts +0 -2
- package/dist/src/agent/background-review/run-background-review.js +2 -4
- package/dist/src/agent/background-review/run-background-review.js.map +1 -1
- package/dist/src/agent/background-review/settings.js +8 -7
- package/dist/src/agent/background-review/settings.js.map +1 -1
- package/dist/src/agent/bootstrap/bootstrap-context.d.ts +2 -2
- package/dist/src/agent/bootstrap/bootstrap-context.js +4 -4
- package/dist/src/agent/bootstrap/bootstrap-context.js.map +1 -1
- package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
- package/dist/src/agent/bootstrap/project-agents-context.js +1 -1
- package/dist/src/agent/context/workspace-seed.js +3 -3
- package/dist/src/agent/context/workspace-state.js +1 -1
- package/dist/src/agent/context/workspace.js +1 -1
- package/dist/src/agent/embedded/run-for-session.js +1 -1
- package/dist/src/agent/embedded/run-for-session.js.map +1 -1
- package/dist/src/agent/fallback/candidates.js +6 -3
- package/dist/src/agent/fallback/candidates.js.map +1 -1
- package/dist/src/agent/goals/goal-locale.js +2 -2
- package/dist/src/agent/goals/post-turn.js +3 -3
- package/dist/src/agent/image/generation/runtime-types.d.ts +2 -0
- package/dist/src/agent/image/generation/runtime.js +1 -1
- package/dist/src/agent/image/generation/runtime.js.map +1 -1
- package/dist/src/agent/image/image-helpers.d.ts +1 -1
- package/dist/src/agent/image/image-helpers.js +4 -17
- package/dist/src/agent/image/image-helpers.js.map +1 -1
- package/dist/src/agent/image/image-model-fallback.js +1 -1
- package/dist/src/agent/image/image-model-fallback.js.map +1 -1
- package/dist/src/agent/image/inbound-image-handling.js +1 -1
- package/dist/src/agent/image/inbound-image-handling.js.map +1 -1
- package/dist/src/agent/image/load-image-media.js +2 -2
- package/dist/src/agent/image/tool-model-config.d.ts +1 -1
- package/dist/src/agent/image/tool-model-config.js +2 -2
- package/dist/src/agent/image/tool-model-config.js.map +1 -1
- package/dist/src/agent/ipc/inbox.js +3 -3
- package/dist/src/agent/ipc/socket.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
- package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
- package/dist/src/agent/mcp/mcp-transport.js +1 -1
- package/dist/src/agent/mcp/resolve-embedded-mcp-tools.js +1 -1
- package/dist/src/agent/mcp/resolve-embedded-mcp-tools.js.map +1 -1
- package/dist/src/agent/media-generation/runtime-shared.d.ts +5 -2
- package/dist/src/agent/media-generation/runtime-shared.js +1 -1
- package/dist/src/agent/media-generation/runtime-shared.js.map +1 -1
- package/dist/src/agent/memory/builtin-memory-store.d.ts +2 -0
- package/dist/src/agent/memory/builtin-memory-store.js +5 -1
- package/dist/src/agent/memory/builtin-memory-store.js.map +1 -1
- package/dist/src/agent/memory/builtin-provider.d.ts +31 -9
- package/dist/src/agent/memory/builtin-provider.js +261 -11
- package/dist/src/agent/memory/builtin-provider.js.map +1 -1
- package/dist/src/agent/memory/context-assembler.d.ts +10 -0
- package/dist/src/agent/memory/context-assembler.js +26 -0
- package/dist/src/agent/memory/context-assembler.js.map +1 -0
- package/dist/src/agent/memory/create-memory-manager.js +25 -7
- package/dist/src/agent/memory/create-memory-manager.js.map +1 -1
- package/dist/src/agent/memory/dreaming/config.d.ts +1 -6
- package/dist/src/agent/memory/dreaming/config.js +8 -8
- package/dist/src/agent/memory/dreaming/config.js.map +1 -1
- package/dist/src/agent/memory/dreaming/deep-promotion.d.ts +2 -0
- package/dist/src/agent/memory/dreaming/deep-promotion.js +25 -1
- package/dist/src/agent/memory/dreaming/deep-promotion.js.map +1 -1
- package/dist/src/agent/memory/dreaming/events.js +1 -1
- package/dist/src/agent/memory/dreaming/last-run.js +1 -1
- package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
- package/dist/src/agent/memory/dreaming/preview.js +1 -1
- package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
- package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
- package/dist/src/agent/memory/dreaming/utils.js +1 -1
- package/dist/src/agent/memory/index.d.ts +1 -0
- package/dist/src/agent/memory/index.js +4 -3
- package/dist/src/agent/memory/inject-prefetch.js +6 -2
- package/dist/src/agent/memory/inject-prefetch.js.map +1 -1
- package/dist/src/agent/memory/manager.d.ts +37 -1
- package/dist/src/agent/memory/manager.js +332 -40
- package/dist/src/agent/memory/manager.js.map +1 -1
- package/dist/src/agent/memory/memory-config.js +12 -15
- package/dist/src/agent/memory/memory-config.js.map +1 -1
- package/dist/src/agent/memory/memory-flush.js +1 -1
- package/dist/src/agent/memory/plugin-discovery.d.ts +19 -5
- package/dist/src/agent/memory/plugin-discovery.js +97 -31
- package/dist/src/agent/memory/plugin-discovery.js.map +1 -1
- package/dist/src/agent/memory/provider.d.ts +20 -15
- package/dist/src/agent/memory/stub-memory-provider.d.ts +17 -2
- package/dist/src/agent/memory/stub-memory-provider.js +20 -3
- package/dist/src/agent/memory/stub-memory-provider.js.map +1 -1
- package/dist/src/agent/memory/types.d.ts +136 -0
- package/dist/src/agent/models/manager.d.ts +1 -1
- package/dist/src/agent/models/manager.js +2 -2
- package/dist/src/agent/models/manager.js.map +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.d.ts +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js +2 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +2 -2
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.d.ts +2 -6
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js +2 -8
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js.map +1 -1
- package/dist/src/agent/prompt/memory/index.js +1 -1
- package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
- package/dist/src/agent/reply/post-compaction-context.js +12 -7
- package/dist/src/agent/reply/post-compaction-context.js.map +1 -1
- package/dist/src/agent/reply/startup-context.js +8 -9
- package/dist/src/agent/reply/startup-context.js.map +1 -1
- package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
- package/dist/src/agent/sandbox/path-policy.js +2 -2
- package/dist/src/agent/service/process-direct-streaming.js +1 -4
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service/session-context-report.js +1 -1
- package/dist/src/agent/service/session-context-report.js.map +1 -1
- package/dist/src/agent/service.js +25 -29
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/service.types.d.ts +1 -2
- package/dist/src/agent/session/session-hydrator.js +1 -2
- package/dist/src/agent/session/session-hydrator.js.map +1 -1
- package/dist/src/agent/session/session-inspector.d.ts +1 -1
- package/dist/src/agent/session/session-inspector.js +10 -15
- package/dist/src/agent/session/session-inspector.js.map +1 -1
- package/dist/src/agent/skills/config.js +2 -2
- package/dist/src/agent/skills/filesystem-watcher.js +1 -1
- package/dist/src/agent/skills/hub-hash.js +2 -2
- package/dist/src/agent/skills/hub-lock.js +1 -1
- package/dist/src/agent/skills/hub-pull.js +3 -3
- package/dist/src/agent/skills/index.js +2 -2
- package/dist/src/agent/skills/installer.js +2 -2
- package/dist/src/agent/skills/managed-store.js +1 -1
- package/dist/src/agent/skills/skill-manage-ops.js +1 -1
- package/dist/src/agent/skills/skill-manager.js +1 -1
- package/dist/src/agent/skills/skill-view-path.js +1 -1
- package/dist/src/agent/skills/test-framework.js +1 -1
- package/dist/src/agent/starter-agents.d.ts +1 -3
- package/dist/src/agent/starter-agents.js +14 -22
- package/dist/src/agent/starter-agents.js.map +1 -1
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -2
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
- package/dist/src/agent/tools/curated-memory-tool.d.ts +2 -5
- package/dist/src/agent/tools/curated-memory-tool.js +20 -16
- package/dist/src/agent/tools/curated-memory-tool.js.map +1 -1
- package/dist/src/agent/tools/dreaming-tool.js +1 -1
- package/dist/src/agent/tools/factory.d.ts +0 -4
- package/dist/src/agent/tools/factory.js +19 -58
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/find.js +1 -1
- package/dist/src/agent/tools/grep.js +1 -1
- package/dist/src/agent/tools/image-generate-tool.d.ts +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +20 -15
- package/dist/src/agent/tools/image-generate-tool.js.map +1 -1
- package/dist/src/agent/tools/image-tool.js +1 -3
- package/dist/src/agent/tools/image-tool.js.map +1 -1
- package/dist/src/agent/tools/memory-tool.d.ts +2 -2
- package/dist/src/agent/tools/memory-tool.js +39 -14
- package/dist/src/agent/tools/memory-tool.js.map +1 -1
- package/dist/src/agent/tools/session-search-tool.js +1 -3
- package/dist/src/agent/tools/session-search-tool.js.map +1 -1
- package/dist/src/agent/tools/skill-manage-tool.js +1 -1
- package/dist/src/agent/tools/web-extract.js +6 -5
- package/dist/src/agent/tools/web-extract.js.map +1 -1
- package/dist/src/agent/tools/workflow-tool.js +1 -1
- package/dist/src/agent/workflow/catalog.js +1 -1
- package/dist/src/agent/workflow/subagent-runner.js +1 -3
- package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
- package/dist/src/agent-manifest/index.d.ts +4 -0
- package/dist/src/agent-manifest/index.js +10 -0
- package/dist/src/agent-manifest/index.js.map +1 -0
- package/dist/src/agent-manifest/prompt.d.ts +2 -0
- package/dist/src/agent-manifest/prompt.js +57 -0
- package/dist/src/agent-manifest/prompt.js.map +1 -0
- package/dist/src/agent-manifest/resolver.d.ts +11 -0
- package/dist/src/agent-manifest/resolver.js +93 -0
- package/dist/src/agent-manifest/resolver.js.map +1 -0
- package/dist/src/agent-manifest/schema.d.ts +778 -0
- package/dist/src/agent-manifest/schema.js +267 -0
- package/dist/src/agent-manifest/schema.js.map +1 -0
- package/dist/src/agent-manifest/validator.d.ts +24 -0
- package/dist/src/agent-manifest/validator.js +87 -0
- package/dist/src/agent-manifest/validator.js.map +1 -0
- package/dist/src/agent-runtime/boundary-guard.d.ts +12 -0
- package/dist/src/agent-runtime/boundary-guard.js +23 -0
- package/dist/src/agent-runtime/boundary-guard.js.map +1 -0
- package/dist/src/agent-runtime/index.d.ts +7 -0
- package/dist/src/agent-runtime/index.js +8 -0
- package/dist/src/agent-runtime/memory-runtime.d.ts +21 -0
- package/dist/src/agent-runtime/memory-runtime.js +50 -0
- package/dist/src/agent-runtime/memory-runtime.js.map +1 -0
- package/dist/src/agent-runtime/model-router.d.ts +11 -0
- package/dist/src/agent-runtime/model-router.js +16 -0
- package/dist/src/agent-runtime/model-router.js.map +1 -0
- package/dist/src/agent-runtime/run-trace.d.ts +27 -0
- package/dist/src/agent-runtime/run-trace.js +53 -0
- package/dist/src/agent-runtime/run-trace.js.map +1 -0
- package/dist/src/agent-runtime/runtime-profile.d.ts +24 -0
- package/dist/src/agent-runtime/runtime-profile.js +44 -0
- package/dist/src/agent-runtime/runtime-profile.js.map +1 -0
- package/dist/src/agent-runtime/tool-registry.d.ts +28 -0
- package/dist/src/agent-runtime/tool-registry.js +52 -0
- package/dist/src/agent-runtime/tool-registry.js.map +1 -0
- package/dist/src/agent-runtime/workflow-runtime.d.ts +31 -0
- package/dist/src/agent-runtime/workflow-runtime.js +34 -0
- package/dist/src/agent-runtime/workflow-runtime.js.map +1 -0
- package/dist/src/ai-assist/text-assist.js +1 -1
- package/dist/src/auth/credentials.js +2 -2
- package/dist/src/auth/profiles/store.js +2 -2
- package/dist/src/auth/sync-provider-auth.js +1 -1
- package/dist/src/browser/actions/extension-registry-bridge.js +1 -1
- package/dist/src/browser/actions/extension-registry-bridge.js.map +1 -1
- package/dist/src/browser/actions/registry.js +5 -8
- package/dist/src/browser/actions/registry.js.map +1 -1
- package/dist/src/browser/backend-from-config.d.ts +1 -1
- package/dist/src/browser/backend-from-config.js +50 -71
- package/dist/src/browser/backend-from-config.js.map +1 -1
- package/dist/src/browser/browser-command-timeout.d.ts +0 -1
- package/dist/src/browser/browser-command-timeout.js +3 -7
- package/dist/src/browser/browser-command-timeout.js.map +1 -1
- package/dist/src/browser/cache-dir-policy.js +1 -1
- package/dist/src/browser/cdp-local-launcher.js +2 -2
- package/dist/src/browser/pipeline/source.js +1 -1
- package/dist/src/browser/providers/browser-ext-install.d.ts +2 -12
- package/dist/src/browser/providers/browser-ext-install.js +7 -12
- package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
- package/dist/src/browser/providers/cloakbrowser.js +5 -5
- package/dist/src/browser/providers/playwright-doctor.js +1 -1
- package/dist/src/browser/readiness.js +16 -16
- package/dist/src/browser/readiness.js.map +1 -1
- package/dist/src/browser/schemas.js +1 -1
- package/dist/src/browser/schemas.js.map +1 -1
- package/dist/src/browser/stealth.js +1 -1
- package/dist/src/channels/catalog/channel-catalog-service.js +1 -1
- package/dist/src/channels/outbound/persist-store.js +1 -1
- package/dist/src/channels/pairing/allow-from-file.js +1 -1
- package/dist/src/channels/pairing/pairing-store.js +2 -2
- package/dist/src/chat-commands/agent-edit.js +2 -2
- package/dist/src/chat-commands/builtins/config.js +6 -6
- package/dist/src/chat-commands/builtins/config.js.map +1 -1
- package/dist/src/chat-commands/builtins/thinking.js +16 -42
- package/dist/src/chat-commands/builtins/thinking.js.map +1 -1
- package/dist/src/chat-commands/config-paths.js +1 -1
- package/dist/src/chat-commands/config-paths.js.map +1 -1
- package/dist/src/chat-commands/context.js +3 -4
- package/dist/src/chat-commands/context.js.map +1 -1
- package/dist/src/cli/command-manifest.js +1 -1
- package/dist/src/cli/command-manifest.js.map +1 -1
- package/dist/src/cli/commands/agent.js +3 -1
- package/dist/src/cli/commands/agent.js.map +1 -1
- package/dist/src/cli/commands/agents.js +3 -6
- package/dist/src/cli/commands/agents.js.map +1 -1
- package/dist/src/cli/commands/browser-cli-helpers.js +9 -11
- package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
- package/dist/src/cli/commands/config.js +6 -6
- package/dist/src/cli/commands/config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +2 -18
- package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
- package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
- package/dist/src/cli/commands/extension-create.js +1 -1
- package/dist/src/cli/commands/extension-dev.js +2 -2
- package/dist/src/cli/commands/extension-marketplace.js +2 -2
- package/dist/src/cli/commands/extension-pack.js +2 -2
- package/dist/src/cli/commands/extension.js +3 -3
- package/dist/src/cli/commands/gateway/logs.js +1 -1
- package/dist/src/cli/commands/goal.js +1 -1
- package/dist/src/cli/commands/image.js +13 -372
- package/dist/src/cli/commands/image.js.map +1 -1
- package/dist/src/cli/commands/init.js +2 -2
- package/dist/src/cli/commands/models.js +27 -11
- package/dist/src/cli/commands/models.js.map +1 -1
- package/dist/src/cli/commands/onboard/channels/registry.js.map +1 -1
- package/dist/src/cli/commands/onboard/model.js +20 -22
- package/dist/src/cli/commands/onboard/model.js.map +1 -1
- package/dist/src/cli/commands/onboard.js +1 -1
- package/dist/src/cli/commands/onboard.js.map +1 -1
- package/dist/src/cli/commands/skills-test.js +1 -1
- package/dist/src/cli/templates.js +1 -1
- package/dist/src/cli/utils/gateway-client.js +1 -1
- package/dist/src/cli/utils/init-workspace-core.d.ts +1 -4
- package/dist/src/cli/utils/init-workspace-core.js +9 -8
- package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
- package/dist/src/commands/agents.config.d.ts +0 -1
- package/dist/src/commands/agents.config.js +66 -12
- package/dist/src/commands/agents.config.js.map +1 -1
- package/dist/src/config/agent-profile.d.ts +5 -17
- package/dist/src/config/agent-profile.js +31 -64
- package/dist/src/config/agent-profile.js.map +1 -1
- package/dist/src/config/agent-typed-models.d.ts +1 -1
- package/dist/src/config/agent-typed-models.js +1 -2
- package/dist/src/config/agent-typed-models.js.map +1 -1
- package/dist/src/config/gateway-bind.js +1 -1
- package/dist/src/config/index.js +8 -8
- package/dist/src/config/integration.d.ts +1 -1
- package/dist/src/config/loader.js +4 -4
- package/dist/src/config/models-json.js +2 -2
- package/dist/src/config/paths-state.js +1 -1
- package/dist/src/config/paths.js +1 -1
- package/dist/src/config/profile.js +1 -1
- package/dist/src/config/reload.js +2 -2
- package/dist/src/config/reload.js.map +1 -1
- package/dist/src/config/rules.js +6 -56
- package/dist/src/config/rules.js.map +1 -1
- package/dist/src/config/schema.d.ts +918 -781
- package/dist/src/config/schema.js +154 -423
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/workspace-path.js +1 -1
- package/dist/src/connectors/composio-triggers.js +1 -1
- package/dist/src/cron/executor.js +1 -1
- package/dist/src/cron/index.js +1 -1
- package/dist/src/cron/service.js +2 -2
- package/dist/src/cron/validation.d.ts +3 -3
- package/dist/src/daemon/constants.js +1 -1
- package/dist/src/daemon/install-plan.js +2 -2
- package/dist/src/daemon/launchd.js +2 -2
- package/dist/src/daemon/schtasks.js +2 -2
- package/dist/src/daemon/systemd.js +2 -2
- package/dist/src/extensions/activation-context.js +13 -7
- package/dist/src/extensions/activation-context.js.map +1 -1
- package/dist/src/extensions/bundle-mcp.js +1 -1
- package/dist/src/extensions/discover-extensions.js +2 -2
- package/dist/src/extensions/health.js +1 -1
- package/dist/src/extensions/install.js +2 -2
- package/dist/src/extensions/loader.js +2 -2
- package/dist/src/extensions/lockfile.js +3 -3
- package/dist/src/extensions/security.js +1 -1
- package/dist/src/extensions/update.js +2 -2
- package/dist/src/gateway/agents-admin.d.ts +17 -18
- package/dist/src/gateway/agents-admin.js +125 -90
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/capability-presets-admin.d.ts +56 -0
- package/dist/src/gateway/capability-presets-admin.js +214 -0
- package/dist/src/gateway/capability-presets-admin.js.map +1 -0
- package/dist/src/gateway/file-path-classifier.js +2 -2
- package/dist/src/gateway/hono/lib/agent-model.d.ts +1 -1
- package/dist/src/gateway/hono/lib/agent-model.js +1 -1
- package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +234 -127
- package/dist/src/gateway/hono/lib/config-payload.js +14 -38
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/lib/extension-store.js +2 -2
- package/dist/src/gateway/hono/lib/static-ui.js +2 -2
- package/dist/src/gateway/hono/routes/agents.js +56 -33
- package/dist/src/gateway/hono/routes/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
- package/dist/src/gateway/hono/routes/browser.js +8 -15
- package/dist/src/gateway/hono/routes/browser.js.map +1 -1
- package/dist/src/gateway/hono/routes/capability-presets.d.ts +3 -0
- package/dist/src/gateway/hono/routes/capability-presets.js +145 -0
- package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -0
- package/dist/src/gateway/hono/routes/config-patch/agents.d.ts +1 -17
- package/dist/src/gateway/hono/routes/config-patch/agents.js +2 -443
- package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +7 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
- package/dist/src/gateway/hono/routes/config.js +1 -1
- package/dist/src/gateway/hono/routes/config.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +8 -1
- package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
- package/dist/src/gateway/hono/routes/host-fs.js +2 -2
- package/dist/src/gateway/hono/routes/index.js +2 -0
- package/dist/src/gateway/hono/routes/index.js.map +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/memory.d.ts +3 -0
- package/dist/src/gateway/hono/routes/memory.js +290 -0
- package/dist/src/gateway/hono/routes/memory.js.map +1 -0
- package/dist/src/gateway/hono/routes/models.js +1 -1
- package/dist/src/gateway/hono/routes/shares.js +1 -1
- package/dist/src/gateway/hono/routes/workflows.js +1 -1
- package/dist/src/gateway/hono/routes/workspace.js +2 -2
- package/dist/src/gateway/lock.js +3 -3
- package/dist/src/gateway/ports.js +1 -1
- package/dist/src/gateway/service/config-coordinator.js +1 -1
- package/dist/src/gateway/service/marketplace-service.js +2 -2
- package/dist/src/gateway/service.d.ts +1 -1
- package/dist/src/gateway/service.js +15 -16
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/gateway/workspace-fs-file-list.js +1 -1
- package/dist/src/goals/goal-workflow-judge.js +2 -2
- package/dist/src/i18n/goals-bundle.js +1 -1
- package/dist/src/i18n/index.js +1 -1
- package/dist/src/i18n/share-tool-bundle.js +2 -2
- package/dist/src/infra/brew.js +1 -1
- package/dist/src/infra/package-json.js +1 -1
- package/dist/src/infra/package-update-steps.js +1 -1
- package/dist/src/infra/path-env.js +2 -2
- package/dist/src/infra/restart.js +1 -1
- package/dist/src/infra/stable-node-path.js +1 -1
- package/dist/src/infra/update-check.js +1 -1
- package/dist/src/infra/update-global.js +1 -1
- package/dist/src/infra/update-lock.js +2 -2
- package/dist/src/infra/update-restart.js +1 -1
- package/dist/src/infra/update-runner.js +1 -1
- package/dist/src/infra/update-startup.js +1 -1
- package/dist/src/infra/write-file-atomic.js +2 -2
- package/dist/src/media/store.js +1 -1
- package/dist/src/notes/agent-context.js +3 -3
- package/dist/src/notes/service.js +1 -1
- package/dist/src/notes/store.js +2 -2
- package/dist/src/project-trust/trust-store.js +2 -2
- package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
- package/dist/src/providers/index.d.ts +2 -2
- package/dist/src/providers/index.js +11 -15
- package/dist/src/providers/index.js.map +1 -1
- package/dist/src/providers/model-registry.js +4 -4
- package/dist/src/session/index.js +1 -1
- package/dist/src/session/init-session-turn.js +1 -1
- package/dist/src/session/resolve-session.js +1 -1
- package/dist/src/session/session-title.js +2 -2
- package/dist/src/session/session-workspace.js +7 -2
- package/dist/src/session/session-workspace.js.map +1 -1
- package/dist/src/session/store.js +6 -1
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/thinking-resolve.d.ts +1 -1
- package/dist/src/session/thinking-resolve.js +1 -1
- package/dist/src/session/thinking-resolve.js.map +1 -1
- package/dist/src/share/share-auto.js +2 -2
- package/dist/src/share/share-store.js +3 -3
- package/dist/src/share/share-thumbnail.js +2 -2
- package/dist/src/share/share-zip.js +1 -1
- package/dist/src/share/site-share-store.js +3 -3
- package/dist/src/share/site-static-serve.js +1 -1
- package/dist/src/storage/sqlite/connection.js +2 -2
- package/dist/src/storage/sqlite/index.d.ts +1 -0
- package/dist/src/storage/sqlite/index.js +2 -1
- package/dist/src/storage/sqlite/memory-index-repository.js +2 -2
- package/dist/src/storage/sqlite/memory-records-repository.d.ts +101 -0
- package/dist/src/storage/sqlite/memory-records-repository.js +309 -0
- package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -0
- package/dist/src/storage/sqlite/migrations/012_memory_records.sql +63 -0
- package/dist/src/storage/sqlite/migrations/013_memory_trace_events.sql +21 -0
- package/dist/src/storage/sqlite/migrations/discover.js +1 -1
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +4 -4
- 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 +2 -2
- package/dist/src/storage/sqlite/schema.sql +86 -0
- package/dist/src/tui/backends/embedded-backend.js +7 -5
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/clipboard-image.js +3 -3
- package/dist/src/tui/extension-host/load-extensions.js +1 -1
- package/dist/src/tui/extension-host/load-extensions.js.map +1 -1
- package/dist/src/tui/theme-manager.js +1 -1
- package/dist/src/tui/tui-command-formatters.js +4 -4
- package/dist/src/tui/tui-commands.js +2 -2
- package/dist/src/tui/tui-keybindings-file.js +1 -1
- package/dist/src/tui/tui-scoped-models.js +2 -2
- package/dist/src/tui/tui-settings.js +1 -1
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/dist/src/tui/tui.js +6 -6
- package/dist/src/tunnel/frpc-binary.js +4 -4
- package/dist/src/tunnel/frpc-config.js +1 -1
- package/dist/src/tunnel/frpc-extract.js +1 -1
- package/dist/src/tunnel/tunnel-state.js +1 -1
- package/dist/src/utils/logger/audit.js +1 -1
- package/dist/src/utils/logger/log-store.js +1 -1
- package/dist/src/utils/logger/rotation.js +1 -1
- package/dist/src/utils/logger/streams.js +1 -1
- package/dist/src/voice/tts/audio.js +1 -1
- package/dist/src/voice/tts/providers/edge-speech.js +2 -2
- package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
- package/dist/src/workflows/service/workflow-run-service.js +4 -5
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js +1 -1
- package/dist/src/workflows/store/event-store.js +1 -1
- package/dist/src/workflows/store/run-store.js +1 -1
- package/package.json +3 -2
- package/dist/gateway/static/root/assets/agent-browser-settings-page-D1SyFYeh.js +0 -6
- package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-C9YxgvuI.js +0 -1
- package/dist/gateway/static/root/assets/agents-CteVs3UO.js +0 -71
- package/dist/gateway/static/root/assets/apps-page-CVQ1M8Ax.js +0 -1
- package/dist/gateway/static/root/assets/config-api-C4RAtTKW.js +0 -3
- package/dist/gateway/static/root/assets/connectors-page-MsMa5qBr.js +0 -2
- package/dist/gateway/static/root/assets/cron-api-sJNMqB6P.js +0 -1
- package/dist/gateway/static/root/assets/cron-page-D30CSwkn.js +0 -3
- package/dist/gateway/static/root/assets/dreaming-settings-6fCUWRQf.js +0 -1
- package/dist/gateway/static/root/assets/gateway-config-api-C6989a-W.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-BpF26t91.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-DOjhmRyf.js +0 -1
- package/dist/gateway/static/root/assets/goals-page-Xl9_wrFc.js +0 -2
- package/dist/gateway/static/root/assets/index-C8ytlAF2.js +0 -122
- package/dist/gateway/static/root/assets/index-CVpJW2NS.css +0 -1
- package/dist/gateway/static/root/assets/messages-BqzIDrlr.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-panel-BO4o-GmO.js +0 -2
- package/dist/gateway/static/root/assets/note-detail-page-DLV_XDmT.js +0 -2
- package/dist/gateway/static/root/assets/remote-access-hub-DQpnE8K9.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-BZui7iAY.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-DEfzZ1ax.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-CLuSsu1-.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-Cq4qpXLi.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-B9F3HyYQ.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-Bp9UPPwm.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-BIoBsfSV.js +0 -2
- package/dist/gateway/static/root/assets/use-agent-defaults-form-Cz2_pPzu.js +0 -1
- package/dist/gateway/static/root/assets/use-settings-tab-guard-nuHMmZQv.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-BUIrKb8s.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-qE3SexnO.js +0 -18
|
@@ -2,8 +2,8 @@ import type { Config } from '../../config/schema.js';
|
|
|
2
2
|
import type { EmbeddedContextFile, WorkspaceBootstrapFile } from './types.js';
|
|
3
3
|
export declare const DEFAULT_BOOTSTRAP_MAX_CHARS = 12000;
|
|
4
4
|
export declare const DEFAULT_BOOTSTRAP_TOTAL_MAX_CHARS = 60000;
|
|
5
|
-
export declare function resolveBootstrapMaxChars(
|
|
6
|
-
export declare function resolveBootstrapTotalMaxChars(
|
|
5
|
+
export declare function resolveBootstrapMaxChars(_config?: Config): number;
|
|
6
|
+
export declare function resolveBootstrapTotalMaxChars(_config?: Config): number;
|
|
7
7
|
export declare function buildBootstrapContextFiles(files: WorkspaceBootstrapFile[], opts?: {
|
|
8
8
|
warn?: (message: string) => void;
|
|
9
9
|
maxChars?: number;
|
|
@@ -4,11 +4,11 @@ const DEFAULT_BOOTSTRAP_TOTAL_MAX_CHARS = 6e4;
|
|
|
4
4
|
const MIN_BOOTSTRAP_FILE_BUDGET_CHARS = 64;
|
|
5
5
|
const BOOTSTRAP_HEAD_RATIO = .75;
|
|
6
6
|
const BOOTSTRAP_TAIL_RATIO = .25;
|
|
7
|
-
function resolveBootstrapMaxChars(
|
|
8
|
-
return
|
|
7
|
+
function resolveBootstrapMaxChars(_config) {
|
|
8
|
+
return DEFAULT_BOOTSTRAP_MAX_CHARS;
|
|
9
9
|
}
|
|
10
|
-
function resolveBootstrapTotalMaxChars(
|
|
11
|
-
return
|
|
10
|
+
function resolveBootstrapTotalMaxChars(_config) {
|
|
11
|
+
return DEFAULT_BOOTSTRAP_TOTAL_MAX_CHARS;
|
|
12
12
|
}
|
|
13
13
|
function clampToBudget(content, budget) {
|
|
14
14
|
if (budget <= 0) return "";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap-context.js","names":[],"sources":["../../../../src/agent/bootstrap/bootstrap-context.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport type { EmbeddedContextFile, WorkspaceBootstrapFile } from './types.js';\n\nexport const DEFAULT_BOOTSTRAP_MAX_CHARS = 12_000;\nexport const DEFAULT_BOOTSTRAP_TOTAL_MAX_CHARS = 60_000;\nconst MIN_BOOTSTRAP_FILE_BUDGET_CHARS = 64;\nconst BOOTSTRAP_HEAD_RATIO = 0.75;\nconst BOOTSTRAP_TAIL_RATIO = 0.25;\n\nexport function resolveBootstrapMaxChars(
|
|
1
|
+
{"version":3,"file":"bootstrap-context.js","names":[],"sources":["../../../../src/agent/bootstrap/bootstrap-context.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport type { EmbeddedContextFile, WorkspaceBootstrapFile } from './types.js';\n\nexport const DEFAULT_BOOTSTRAP_MAX_CHARS = 12_000;\nexport const DEFAULT_BOOTSTRAP_TOTAL_MAX_CHARS = 60_000;\nconst MIN_BOOTSTRAP_FILE_BUDGET_CHARS = 64;\nconst BOOTSTRAP_HEAD_RATIO = 0.75;\nconst BOOTSTRAP_TAIL_RATIO = 0.25;\n\nexport function resolveBootstrapMaxChars(_config?: Config): number {\n return DEFAULT_BOOTSTRAP_MAX_CHARS;\n}\n\nexport function resolveBootstrapTotalMaxChars(_config?: Config): number {\n return DEFAULT_BOOTSTRAP_TOTAL_MAX_CHARS;\n}\n\nfunction clampToBudget(content: string, budget: number): string {\n if (budget <= 0) {\n return '';\n }\n if (content.length <= budget) {\n return content;\n }\n if (budget <= 3) {\n return content.slice(0, budget);\n }\n return `${content.slice(0, budget - 1)}…`;\n}\n\nfunction trimBootstrapContent(\n content: string,\n fileName: string,\n maxChars: number,\n): { content: string; truncated: boolean; originalLength: number; maxChars: number } {\n const trimmed = content.trimEnd();\n if (trimmed.length <= maxChars) {\n return { content: trimmed, truncated: false, originalLength: trimmed.length, maxChars };\n }\n\n const markerTemplate = (head: number, tail: number) =>\n `\\n\\n[...truncated ${fileName}: kept ${head}+${tail} of ${trimmed.length} chars...]\\n\\n`;\n let headChars = Math.floor(maxChars * BOOTSTRAP_HEAD_RATIO);\n let tailChars = Math.floor(maxChars * BOOTSTRAP_TAIL_RATIO);\n let marker = markerTemplate(headChars, tailChars);\n let renderedLength = headChars + tailChars + marker.length;\n\n while (renderedLength > maxChars && (headChars > 0 || tailChars > 0)) {\n if (tailChars >= headChars && tailChars > 0) {\n tailChars -= 1;\n } else if (headChars > 0) {\n headChars -= 1;\n } else {\n break;\n }\n marker = markerTemplate(headChars, tailChars);\n renderedLength = headChars + tailChars + marker.length;\n }\n\n const head = trimmed.slice(0, headChars);\n const tail = tailChars > 0 ? trimmed.slice(-tailChars) : '';\n const bounded = `${head}${marker}${tail}`;\n return {\n content: bounded.length > maxChars ? bounded.slice(0, maxChars) : bounded,\n truncated: true,\n originalLength: trimmed.length,\n maxChars,\n };\n}\n\nexport function buildBootstrapContextFiles(\n files: WorkspaceBootstrapFile[],\n opts?: { warn?: (message: string) => void; maxChars?: number; totalMaxChars?: number },\n): EmbeddedContextFile[] {\n const maxChars = opts?.maxChars ?? DEFAULT_BOOTSTRAP_MAX_CHARS;\n const totalMaxChars = Math.max(\n 1,\n Math.floor(opts?.totalMaxChars ?? Math.max(maxChars, DEFAULT_BOOTSTRAP_TOTAL_MAX_CHARS)),\n );\n let remainingTotalChars = totalMaxChars;\n const result: EmbeddedContextFile[] = [];\n\n for (const file of files) {\n if (remainingTotalChars <= 0) {\n break;\n }\n const pathValue = file.path.trim();\n if (!pathValue) {\n opts?.warn?.(`skipping bootstrap file \"${file.name}\" — missing path`);\n continue;\n }\n\n if (file.missing) {\n const missingText = `[MISSING] Expected at: ${pathValue}`;\n const capped = clampToBudget(missingText, remainingTotalChars);\n if (!capped) {\n break;\n }\n remainingTotalChars = Math.max(0, remainingTotalChars - capped.length);\n result.push({ path: pathValue, content: capped });\n continue;\n }\n\n if (remainingTotalChars < MIN_BOOTSTRAP_FILE_BUDGET_CHARS) {\n opts?.warn?.(\n `remaining bootstrap budget is ${remainingTotalChars} chars (<${MIN_BOOTSTRAP_FILE_BUDGET_CHARS}); skipping additional bootstrap files`,\n );\n break;\n }\n\n const fileMaxChars = Math.max(1, Math.min(maxChars, remainingTotalChars));\n const trimmed = trimBootstrapContent(file.content ?? '', file.name, fileMaxChars);\n const contentWithinBudget = clampToBudget(trimmed.content, remainingTotalChars);\n if (!contentWithinBudget) {\n continue;\n }\n if (trimmed.truncated || contentWithinBudget.length < trimmed.content.length) {\n opts?.warn?.(\n `profile bootstrap file ${file.name} is ${trimmed.originalLength} chars (limit ${trimmed.maxChars}); truncating in injected context`,\n );\n }\n remainingTotalChars = Math.max(0, remainingTotalChars - contentWithinBudget.length);\n result.push({ path: pathValue, content: contentWithinBudget });\n }\n\n return result;\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DEFAULT_AGENTS_FILENAME, DEFAULT_HEARTBEAT_FILENAME, DEFAULT_IDENTITY_FILENAME, DEFAULT_MEMORY_FILENAME, DEFAULT_SOUL_FILENAME, DEFAULT_TOOLS_FILENAME, DEFAULT_USER_FILENAME, stripFrontMatter } from "../context/workspace.js";
|
|
2
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
3
2
|
import { join, resolve } from "node:path";
|
|
3
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
4
4
|
//#region src/agent/bootstrap/load-bootstrap-files.ts
|
|
5
5
|
const PROFILE_LOAD_ORDER = [
|
|
6
6
|
DEFAULT_AGENTS_FILENAME,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DEFAULT_AGENTS_FILENAME, stripFrontMatter } from "../context/workspace.js";
|
|
2
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
3
2
|
import { join, resolve } from "node:path";
|
|
3
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
4
4
|
//#region src/agent/bootstrap/project-agents-context.ts
|
|
5
5
|
const PROJECT_AGENTS_MAX_CHARS = 2e4;
|
|
6
6
|
function truncateProjectAgentsContent(content) {
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { init_agent_scope, resolveAgentProfileDir, resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agent-scope.js";
|
|
2
|
-
import { WORKSPACE_FILES, init_paths } from "../../config/paths.js";
|
|
3
2
|
import { createLogger } from "../../utils/logger/index.js";
|
|
4
3
|
import { init_logger } from "../../utils/logger.js";
|
|
4
|
+
import { WORKSPACE_FILES, init_paths } from "../../config/paths.js";
|
|
5
5
|
import { AGENT_PROFILE_MARKDOWN_SYSTEM_FILES } from "./workspace.js";
|
|
6
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
7
6
|
import { dirname, join } from "node:path";
|
|
8
|
-
import {
|
|
7
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
9
8
|
import { execFileSync } from "node:child_process";
|
|
9
|
+
import { fileURLToPath } from "node:url";
|
|
10
10
|
//#region src/agent/context/workspace-seed.ts
|
|
11
11
|
/**
|
|
12
12
|
* Seed profile Markdown files into `agents/<agentId>/profile/` (and optionally `git init` the Markdown workspace).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { FILENAMES, init_paths, resolveWorkspaceStatePath } from "../../config/paths.js";
|
|
2
|
-
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
2
|
import { dirname, join } from "node:path";
|
|
3
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
4
4
|
//#region src/agent/context/workspace-state.ts
|
|
5
5
|
/**
|
|
6
6
|
* Workspace setup metadata in `<markdownWorkspace>/.xopc/workspace.json`
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
3
|
import { parseFrontmatter } from "../../markdown/frontmatter.js";
|
|
4
|
-
import { existsSync, readFileSync } from "fs";
|
|
5
4
|
import { join, resolve } from "path";
|
|
5
|
+
import { existsSync, readFileSync } from "fs";
|
|
6
6
|
//#region src/agent/context/workspace.ts
|
|
7
7
|
/**
|
|
8
8
|
* Agent profile Markdown (filenames, load order, system prompt assembly) and
|
|
@@ -74,7 +74,7 @@ async function runEmbeddedTurnForSession(params) {
|
|
|
74
74
|
}
|
|
75
75
|
async function maybeAutoCompactBeforeTurn(opts) {
|
|
76
76
|
const { sessionKey, sessionStore, agentManager, model, config, onEvent } = opts;
|
|
77
|
-
if ((config?.agents?.defaults?.compaction)?.enabled === false) return;
|
|
77
|
+
if (((config?.agents)?.defaults?.compaction)?.enabled === false) return;
|
|
78
78
|
const contextWindow = model.contextWindow ?? 128e3;
|
|
79
79
|
const messages = await sessionStore.load(sessionKey);
|
|
80
80
|
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\n
|
|
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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"}
|
|
@@ -9,6 +9,10 @@ function getDefaultModelParts(config) {
|
|
|
9
9
|
model: parts[1] || "claude-sonnet-4-5"
|
|
10
10
|
};
|
|
11
11
|
}
|
|
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
|
+
}
|
|
12
16
|
/**
|
|
13
17
|
* Parse model reference string into provider/model parts.
|
|
14
18
|
* Uses the unified implementation from selection.ts.
|
|
@@ -23,9 +27,8 @@ function parseModelRef(raw, defaultProvider) {
|
|
|
23
27
|
}
|
|
24
28
|
function resolveFallbackCandidates(params) {
|
|
25
29
|
const { cfg, provider: inputProvider, model: inputModel, fallbacksOverride } = params;
|
|
26
|
-
const
|
|
27
|
-
const
|
|
28
|
-
const fallbacks = fallbacksOverride ?? modelConfig?.fallbacks;
|
|
30
|
+
const primaryRef = getDefaultModelSync(cfg);
|
|
31
|
+
const fallbacks = fallbacksOverride ?? getConfiguredFallbackRefs(cfg);
|
|
29
32
|
const defaultParts = getDefaultModelParts(cfg);
|
|
30
33
|
const primaryResolved = parseModelRef(primaryRef || getDefaultModelSync(cfg));
|
|
31
34
|
const provider = inputProvider.trim() || primaryResolved?.provider || defaultParts.provider;
|
|
@@ -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\nexport interface FallbackAttempt {\n provider: string;\n model: string;\n error: string;\n reason?: string;\n status?: number;\n code?: string;\n}\n\n// Get default model dynamically\nfunction getDefaultModelParts(config?: Config): { provider: string; model: string } {\n const defaultModel = getDefaultModelSync(config);\n const parts = defaultModel.split('/');\n return {\n provider: parts[0] || 'anthropic',\n model: parts[1] || 'claude-sonnet-4-5',\n };\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
|
|
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\nexport interface FallbackAttempt {\n provider: string;\n model: string;\n error: string;\n reason?: string;\n status?: number;\n code?: string;\n}\n\n// Get default model dynamically\nfunction getDefaultModelParts(config?: Config): { provider: string; model: string } {\n const defaultModel = getDefaultModelSync(config);\n const parts = defaultModel.split('/');\n return {\n provider: parts[0] || 'anthropic',\n model: parts[1] || 'claude-sonnet-4-5',\n };\n}\n\nfunction getConfiguredFallbackRefs(config?: Config): string[] | undefined {\n const legacyModel = (config?.agents as unknown as {\n defaults?: { model?: { fallbacks?: unknown } };\n } | undefined)?.defaults?.model;\n if (\n legacyModel &&\n typeof legacyModel === 'object' &&\n Array.isArray(legacyModel.fallbacks)\n ) {\n return legacyModel.fallbacks.filter((value): value is string => typeof value === 'string');\n }\n return undefined;\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 ?? getConfiguredFallbackRefs(cfg);\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 addCandidate({ provider, model });\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;AAmBpE,SAAS,qBAAqB,QAAsD;CAElF,MAAM,QADe,oBAAoB,OACf,CAAC,MAAM,IAAI;AACrC,QAAO;EACL,UAAU,MAAM,MAAM;EACtB,OAAO,MAAM,MAAM;EACpB;;AAGH,SAAS,0BAA0B,QAAuC;CACxE,MAAM,eAAe,QAAQ,SAEb,UAAU;AAC1B,KACE,eACA,OAAO,gBAAgB,YACvB,MAAM,QAAQ,YAAY,UAAU,CAEpC,QAAO,YAAY,UAAU,QAAQ,UAA2B,OAAO,UAAU,SAAS;;;;;;AAS9F,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,qBAAqB,0BAA0B,IAAI;CAErE,MAAM,eAAe,qBAAqB,IAAI;CAC9C,MAAM,kBAAkB,cAAc,cAAc,oBAAoB,IAAI,CAAC;CAC7E,MAAM,WAAW,cAAc,MAAM,IAAI,iBAAiB,YAAY,aAAa;CACnF,MAAM,QAAQ,WAAW,MAAM,IAAI,iBAAiB,SAAS,aAAa;CAE1E,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,cAAa;EAAE;EAAU;EAAO,CAAC;AAEjC,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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { checklistCounts } from "./checklist-types.js";
|
|
2
|
-
import { renderChecklistPlain } from "./state.js";
|
|
3
1
|
import { formatI18n } from "../../i18n/format.js";
|
|
4
2
|
import { SERVER_LOCALES, isServerLocale, normalizeServerLocale, serverLocaleOrFallback } from "../../i18n/locale.js";
|
|
3
|
+
import { checklistCounts } from "./checklist-types.js";
|
|
4
|
+
import { renderChecklistPlain } from "./state.js";
|
|
5
5
|
import { JUDGE_REASON_EN, goalsChecklistProgressSuffix, goalsContinuationChecklistTemplate, goalsContinuationPlainTemplate, goalsEvaluateCopy, goalsJudgeReason, goalsJudgeResponseLanguageNote } from "../../i18n/goals-bundle.js";
|
|
6
6
|
//#region src/agent/goals/goal-locale.ts
|
|
7
7
|
const GOAL_UI_LOCALES = SERVER_LOCALES;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { createLogger } from "../../utils/logger/index.js";
|
|
2
|
-
import { init_logger } from "../../utils/logger.js";
|
|
3
1
|
import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
|
|
4
|
-
import { resolveGoalUiLocale } from "./goal-locale.js";
|
|
5
2
|
import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
|
|
3
|
+
import { createLogger } from "../../utils/logger/index.js";
|
|
4
|
+
import { init_logger } from "../../utils/logger.js";
|
|
6
5
|
import { GoalService } from "../../goals/goal-service.js";
|
|
6
|
+
import { resolveGoalUiLocale } from "./goal-locale.js";
|
|
7
7
|
import { evaluateAfterTurnHermesLike } from "./evaluate-turn.js";
|
|
8
8
|
import "../../goals/index.js";
|
|
9
9
|
//#region src/agent/goals/post-turn.ts
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* want a single import surface.
|
|
8
8
|
*/
|
|
9
9
|
import type { Config } from '../../../config/schema.js';
|
|
10
|
+
import type { ToolModelConfig } from '../tool-model-config.js';
|
|
10
11
|
import type { AuthProfileStore } from '../../../providers/auth-runtime/index.js';
|
|
11
12
|
import type { FallbackAttempt } from '../../failover-error.js';
|
|
12
13
|
import type { GeneratedImageAsset, ImageGenerationBackground, ImageGenerationIgnoredOverride, ImageGenerationNormalization, ImageGenerationOutputFormat, ImageGenerationProvider, ImageGenerationProviderOptions, ImageGenerationQuality, ImageGenerationResolution, ImageGenerationSourceImage } from './types.js';
|
|
@@ -16,6 +17,7 @@ export interface GenerateImageParams {
|
|
|
16
17
|
prompt: string;
|
|
17
18
|
agentDir?: string;
|
|
18
19
|
authStore?: AuthProfileStore;
|
|
20
|
+
modelConfig?: ToolModelConfig;
|
|
19
21
|
modelOverride?: string;
|
|
20
22
|
count?: number;
|
|
21
23
|
size?: string;
|
|
@@ -21,7 +21,7 @@ async function generateImage(params, deps = {}) {
|
|
|
21
21
|
const getProvider = (id, cfg) => (deps.getProvider ?? getImageGenerationProvider)(id, cfg);
|
|
22
22
|
const candidates = resolveCapabilityModelCandidates({
|
|
23
23
|
cfg: params.cfg,
|
|
24
|
-
modelConfig: params.
|
|
24
|
+
modelConfig: params.modelConfig,
|
|
25
25
|
modelOverride: params.modelOverride,
|
|
26
26
|
parseModelRef: parseImageGenerationModelRef,
|
|
27
27
|
agentDir: params.agentDir,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","names":["listProvidersSummaryFromRegistry"],"sources":["../../../../../src/agent/image/generation/runtime.ts"],"sourcesContent":["import type { Config } from '../../../config/schema.js';\nimport { PROVIDER_ENV_MAP } from '../../../providers/env-keys.js';\nimport { createLogger } from '../../../utils/logger.js';\nimport {\n buildMediaGenerationNormalizationMetadata,\n buildNoCapabilityModelConfiguredMessage,\n recordCapabilityCandidateFailure,\n resolveCapabilityModelCandidates,\n throwCapabilityGenerationFailure,\n type CapabilityProviderCandidate,\n} from '../../media-generation/index.js';\nimport { describeFailoverError, isFailoverError, type FallbackAttempt } from '../../failover-error.js';\nimport { parseImageGenerationModelRef } from './model-ref.js';\nimport { resolveImageGenerationOverrides } from './normalization.js';\nimport {\n getImageGenerationProvider,\n listImageGenerationProviders,\n listImageGenerationProvidersSummary as listProvidersSummaryFromRegistry,\n type ImageGenerationProvider,\n type ImageGenerationProviderSummary,\n} from './provider-registry.js';\nimport type {\n ImageGenerationProviderCapabilities,\n ImageGenerationRequest,\n ImageGenerationSourceImage,\n} from './types.js';\n\n// Side-effect: registers every bundled image-generation provider listed in\n// src/generated/bundled-image-generation-providers.ts (regenerated via\n// `pnpm run generate:bundled-image-providers`). Vendor implementations live\n// under extensions/<vendor>/src/image-generation-provider.ts.\nimport './bundled.js';\n\nexport type {\n GenerateImageParams,\n GenerateImageRuntimeResult,\n ImageGenerationRuntimeDeps,\n} from './runtime-types.js';\n\nimport type {\n GenerateImageParams,\n GenerateImageRuntimeResult,\n ImageGenerationRuntimeDeps,\n} from './runtime-types.js';\n\nconst log = createLogger('ImageGen');\n\n/**\n * Generate one or more images, walking the candidate model list with\n * structured failover. See {@link GenerateImageParams} / {@link GenerateImageRuntimeResult}.\n */\nexport async function generateImage(\n params: GenerateImageParams,\n deps: ImageGenerationRuntimeDeps = {},\n): Promise<GenerateImageRuntimeResult> {\n const listProviders = (cfg?: Config) =>\n (deps.listProviders ?? listImageGenerationProviders)(cfg);\n const getProvider = (id: string, cfg?: Config) =>\n (deps.getProvider ?? getImageGenerationProvider)(id, cfg);\n\n const candidates = resolveCapabilityModelCandidates({\n cfg: params.cfg,\n modelConfig: params.cfg?.agents?.defaults?.imageGenerationModel,\n modelOverride: params.modelOverride,\n parseModelRef: parseImageGenerationModelRef,\n agentDir: params.agentDir,\n listProviders: (cfg) => listProviders(cfg).map(toCapabilityCandidate),\n autoProviderFallback: params.autoProviderFallback,\n });\n\n if (candidates.length === 0) {\n throw new Error(buildNoImageGenerationModelConfiguredMessage(params.cfg, deps));\n }\n\n const attempts: FallbackAttempt[] = [];\n let lastError: unknown;\n\n for (const candidate of candidates) {\n const startedAt = Date.now();\n const provider = getProvider(candidate.provider, params.cfg);\n if (!provider) {\n const errorMessage = `Image generation provider not registered: ${candidate.provider}`;\n attempts.push({\n provider: candidate.provider,\n model: candidate.model,\n error: errorMessage,\n reason: 'config',\n });\n lastError = new Error(errorMessage);\n log.warn(\n { provider: candidate.provider, model: candidate.model, phase: 'candidate_skipped' },\n `image-generation candidate skipped: ${errorMessage}`,\n );\n continue;\n }\n\n try {\n const sanitized = resolveImageGenerationOverrides({\n provider,\n size: params.size,\n aspectRatio: params.aspectRatio,\n resolution: params.resolution,\n quality: params.quality,\n outputFormat: params.outputFormat,\n background: params.background,\n inputImages: params.inputImages,\n });\n\n const request = buildProviderRequest({\n provider,\n candidate,\n params,\n sanitized,\n });\n\n log.debug(\n {\n provider: candidate.provider,\n model: candidate.model,\n phase: 'provider_invoked',\n normalizationCount: sanitized.normalization\n ? Object.keys(sanitized.normalization).length\n : 0,\n ignoredCount: sanitized.ignoredOverrides.length,\n },\n `image-generation provider invoked: ${candidate.provider}/${candidate.model}`,\n );\n\n const result = await provider.generateImage(request);\n if (!result.images?.length) {\n throw new Error('Image generation provider returned no images.');\n }\n\n const normalizationMetadata = buildMediaGenerationNormalizationMetadata({\n normalization: sanitized.normalization as Record<string, unknown> | undefined,\n });\n\n return {\n images: result.images,\n provider: candidate.provider,\n model: result.model ?? candidate.model,\n attempts,\n ...(sanitized.normalization ? { normalization: sanitized.normalization } : {}),\n ignoredOverrides: sanitized.ignoredOverrides,\n metadata: { ...(result.metadata ?? {}), ...normalizationMetadata },\n };\n } catch (err) {\n lastError = err;\n const durationMs = Date.now() - startedAt;\n recordCapabilityCandidateFailure({\n attempts,\n provider: candidate.provider,\n model: candidate.model,\n error: err,\n durationMs,\n });\n const last = attempts[attempts.length - 1];\n const description = isFailoverError(err) ? describeFailoverError(err) : undefined;\n log.warn(\n {\n err,\n provider: candidate.provider,\n model: candidate.model,\n status: last?.status,\n reason: last?.reason,\n durationMs,\n phase: 'candidate_failed',\n attemptCount: attempts.length,\n },\n `image-generation candidate failed: ${candidate.provider}/${candidate.model}: ${\n description ?? last?.error ?? (err instanceof Error ? err.message : String(err))\n }`,\n );\n }\n }\n\n return throwCapabilityGenerationFailure({\n capabilityLabel: 'image generation',\n attempts,\n lastError,\n });\n}\n\nexport function listImageGenerationProvidersSummary(\n cfg?: Config,\n): ImageGenerationProviderSummary[] {\n return listProvidersSummaryFromRegistry(cfg);\n}\n\n// ============================================\n// Helpers\n// ============================================\n\nfunction buildProviderRequest(input: {\n provider: ImageGenerationProvider;\n candidate: { provider: string; model: string };\n params: GenerateImageParams;\n sanitized: ReturnType<typeof resolveImageGenerationOverrides>;\n}): ImageGenerationRequest {\n const { provider, candidate, params, sanitized } = input;\n const inputImages = params.inputImages\n ? cloneInputImages(params.inputImages)\n : undefined;\n return {\n provider: provider.id,\n model: candidate.model,\n prompt: params.prompt,\n ...(params.cfg ? { cfg: params.cfg } : {}),\n ...(params.agentDir ? { agentDir: params.agentDir } : {}),\n ...(params.authStore ? { authStore: params.authStore } : {}),\n ...(typeof params.timeoutMs === 'number' ? { timeoutMs: params.timeoutMs } : {}),\n ...(params.signal ? { signal: params.signal } : {}),\n ...(typeof params.count === 'number' ? { count: params.count } : {}),\n ...(sanitized.size !== undefined ? { size: sanitized.size } : {}),\n ...(sanitized.aspectRatio !== undefined ? { aspectRatio: sanitized.aspectRatio } : {}),\n ...(sanitized.resolution !== undefined ? { resolution: sanitized.resolution } : {}),\n ...(sanitized.quality !== undefined ? { quality: sanitized.quality } : {}),\n ...(sanitized.outputFormat !== undefined ? { outputFormat: sanitized.outputFormat } : {}),\n ...(sanitized.background !== undefined ? { background: sanitized.background } : {}),\n ...(inputImages ? { inputImages } : {}),\n ...(params.providerOptions ? { providerOptions: params.providerOptions } : {}),\n };\n}\n\nfunction cloneInputImages(images: ImageGenerationSourceImage[]): ImageGenerationSourceImage[] {\n return images.map((img) => ({\n buffer: img.buffer,\n mimeType: img.mimeType,\n ...(img.fileName ? { fileName: img.fileName } : {}),\n ...(img.metadata ? { metadata: img.metadata } : {}),\n }));\n}\n\nfunction toCapabilityCandidate(provider: ImageGenerationProvider): CapabilityProviderCandidate {\n return {\n id: provider.id,\n ...(provider.aliases ? { aliases: provider.aliases } : {}),\n defaultModel: provider.defaultModel ?? null,\n models: provider.models ?? [],\n isConfigured: provider.isConfigured,\n };\n}\n\nfunction buildNoImageGenerationModelConfiguredMessage(\n cfg: Config | undefined,\n deps: ImageGenerationRuntimeDeps,\n): string {\n const list = (deps.listProviders ?? listImageGenerationProviders)(cfg);\n return buildNoCapabilityModelConfiguredMessage({\n capabilityLabel: 'image-generation',\n modelConfigKey: 'imageGenerationModel',\n providers: list.map(toCapabilityCandidate),\n getProviderEnvVars: deps.getProviderEnvVars ?? ((id) => PROVIDER_ENV_MAP[id]),\n });\n}\n\n// Re-export the canonical capability type for callers consuming this barrel.\nexport type { ImageGenerationProviderCapabilities };\n// Re-export the provider-registry surface that gateway routes / CLI consume\n// through this single barrel module. NOTE: `listImageGenerationProvidersSummary`\n// is implemented locally above (it overlays cfg-aware `configured` flags), so\n// it must not be re-exported from the registry to avoid a name clash.\nexport {\n getImageGenerationProvider,\n listImageGenerationProviders,\n} from './provider-registry.js';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runtime.js","names":["listProvidersSummaryFromRegistry"],"sources":["../../../../../src/agent/image/generation/runtime.ts"],"sourcesContent":["import type { Config } from '../../../config/schema.js';\nimport { PROVIDER_ENV_MAP } from '../../../providers/env-keys.js';\nimport { createLogger } from '../../../utils/logger.js';\nimport {\n buildMediaGenerationNormalizationMetadata,\n buildNoCapabilityModelConfiguredMessage,\n recordCapabilityCandidateFailure,\n resolveCapabilityModelCandidates,\n throwCapabilityGenerationFailure,\n type CapabilityProviderCandidate,\n} from '../../media-generation/index.js';\nimport { describeFailoverError, isFailoverError, type FallbackAttempt } from '../../failover-error.js';\nimport { parseImageGenerationModelRef } from './model-ref.js';\nimport { resolveImageGenerationOverrides } from './normalization.js';\nimport {\n getImageGenerationProvider,\n listImageGenerationProviders,\n listImageGenerationProvidersSummary as listProvidersSummaryFromRegistry,\n type ImageGenerationProvider,\n type ImageGenerationProviderSummary,\n} from './provider-registry.js';\nimport type {\n ImageGenerationProviderCapabilities,\n ImageGenerationRequest,\n ImageGenerationSourceImage,\n} from './types.js';\n\n// Side-effect: registers every bundled image-generation provider listed in\n// src/generated/bundled-image-generation-providers.ts (regenerated via\n// `pnpm run generate:bundled-image-providers`). Vendor implementations live\n// under extensions/<vendor>/src/image-generation-provider.ts.\nimport './bundled.js';\n\nexport type {\n GenerateImageParams,\n GenerateImageRuntimeResult,\n ImageGenerationRuntimeDeps,\n} from './runtime-types.js';\n\nimport type {\n GenerateImageParams,\n GenerateImageRuntimeResult,\n ImageGenerationRuntimeDeps,\n} from './runtime-types.js';\n\nconst log = createLogger('ImageGen');\n\n/**\n * Generate one or more images, walking the candidate model list with\n * structured failover. See {@link GenerateImageParams} / {@link GenerateImageRuntimeResult}.\n */\nexport async function generateImage(\n params: GenerateImageParams,\n deps: ImageGenerationRuntimeDeps = {},\n): Promise<GenerateImageRuntimeResult> {\n const listProviders = (cfg?: Config) =>\n (deps.listProviders ?? listImageGenerationProviders)(cfg);\n const getProvider = (id: string, cfg?: Config) =>\n (deps.getProvider ?? getImageGenerationProvider)(id, cfg);\n\n const candidates = resolveCapabilityModelCandidates({\n cfg: params.cfg,\n modelConfig: params.modelConfig,\n modelOverride: params.modelOverride,\n parseModelRef: parseImageGenerationModelRef,\n agentDir: params.agentDir,\n listProviders: (cfg) => listProviders(cfg).map(toCapabilityCandidate),\n autoProviderFallback: params.autoProviderFallback,\n });\n\n if (candidates.length === 0) {\n throw new Error(buildNoImageGenerationModelConfiguredMessage(params.cfg, deps));\n }\n\n const attempts: FallbackAttempt[] = [];\n let lastError: unknown;\n\n for (const candidate of candidates) {\n const startedAt = Date.now();\n const provider = getProvider(candidate.provider, params.cfg);\n if (!provider) {\n const errorMessage = `Image generation provider not registered: ${candidate.provider}`;\n attempts.push({\n provider: candidate.provider,\n model: candidate.model,\n error: errorMessage,\n reason: 'config',\n });\n lastError = new Error(errorMessage);\n log.warn(\n { provider: candidate.provider, model: candidate.model, phase: 'candidate_skipped' },\n `image-generation candidate skipped: ${errorMessage}`,\n );\n continue;\n }\n\n try {\n const sanitized = resolveImageGenerationOverrides({\n provider,\n size: params.size,\n aspectRatio: params.aspectRatio,\n resolution: params.resolution,\n quality: params.quality,\n outputFormat: params.outputFormat,\n background: params.background,\n inputImages: params.inputImages,\n });\n\n const request = buildProviderRequest({\n provider,\n candidate,\n params,\n sanitized,\n });\n\n log.debug(\n {\n provider: candidate.provider,\n model: candidate.model,\n phase: 'provider_invoked',\n normalizationCount: sanitized.normalization\n ? Object.keys(sanitized.normalization).length\n : 0,\n ignoredCount: sanitized.ignoredOverrides.length,\n },\n `image-generation provider invoked: ${candidate.provider}/${candidate.model}`,\n );\n\n const result = await provider.generateImage(request);\n if (!result.images?.length) {\n throw new Error('Image generation provider returned no images.');\n }\n\n const normalizationMetadata = buildMediaGenerationNormalizationMetadata({\n normalization: sanitized.normalization as Record<string, unknown> | undefined,\n });\n\n return {\n images: result.images,\n provider: candidate.provider,\n model: result.model ?? candidate.model,\n attempts,\n ...(sanitized.normalization ? { normalization: sanitized.normalization } : {}),\n ignoredOverrides: sanitized.ignoredOverrides,\n metadata: { ...(result.metadata ?? {}), ...normalizationMetadata },\n };\n } catch (err) {\n lastError = err;\n const durationMs = Date.now() - startedAt;\n recordCapabilityCandidateFailure({\n attempts,\n provider: candidate.provider,\n model: candidate.model,\n error: err,\n durationMs,\n });\n const last = attempts[attempts.length - 1];\n const description = isFailoverError(err) ? describeFailoverError(err) : undefined;\n log.warn(\n {\n err,\n provider: candidate.provider,\n model: candidate.model,\n status: last?.status,\n reason: last?.reason,\n durationMs,\n phase: 'candidate_failed',\n attemptCount: attempts.length,\n },\n `image-generation candidate failed: ${candidate.provider}/${candidate.model}: ${\n description ?? last?.error ?? (err instanceof Error ? err.message : String(err))\n }`,\n );\n }\n }\n\n return throwCapabilityGenerationFailure({\n capabilityLabel: 'image generation',\n attempts,\n lastError,\n });\n}\n\nexport function listImageGenerationProvidersSummary(\n cfg?: Config,\n): ImageGenerationProviderSummary[] {\n return listProvidersSummaryFromRegistry(cfg);\n}\n\n// ============================================\n// Helpers\n// ============================================\n\nfunction buildProviderRequest(input: {\n provider: ImageGenerationProvider;\n candidate: { provider: string; model: string };\n params: GenerateImageParams;\n sanitized: ReturnType<typeof resolveImageGenerationOverrides>;\n}): ImageGenerationRequest {\n const { provider, candidate, params, sanitized } = input;\n const inputImages = params.inputImages\n ? cloneInputImages(params.inputImages)\n : undefined;\n return {\n provider: provider.id,\n model: candidate.model,\n prompt: params.prompt,\n ...(params.cfg ? { cfg: params.cfg } : {}),\n ...(params.agentDir ? { agentDir: params.agentDir } : {}),\n ...(params.authStore ? { authStore: params.authStore } : {}),\n ...(typeof params.timeoutMs === 'number' ? { timeoutMs: params.timeoutMs } : {}),\n ...(params.signal ? { signal: params.signal } : {}),\n ...(typeof params.count === 'number' ? { count: params.count } : {}),\n ...(sanitized.size !== undefined ? { size: sanitized.size } : {}),\n ...(sanitized.aspectRatio !== undefined ? { aspectRatio: sanitized.aspectRatio } : {}),\n ...(sanitized.resolution !== undefined ? { resolution: sanitized.resolution } : {}),\n ...(sanitized.quality !== undefined ? { quality: sanitized.quality } : {}),\n ...(sanitized.outputFormat !== undefined ? { outputFormat: sanitized.outputFormat } : {}),\n ...(sanitized.background !== undefined ? { background: sanitized.background } : {}),\n ...(inputImages ? { inputImages } : {}),\n ...(params.providerOptions ? { providerOptions: params.providerOptions } : {}),\n };\n}\n\nfunction cloneInputImages(images: ImageGenerationSourceImage[]): ImageGenerationSourceImage[] {\n return images.map((img) => ({\n buffer: img.buffer,\n mimeType: img.mimeType,\n ...(img.fileName ? { fileName: img.fileName } : {}),\n ...(img.metadata ? { metadata: img.metadata } : {}),\n }));\n}\n\nfunction toCapabilityCandidate(provider: ImageGenerationProvider): CapabilityProviderCandidate {\n return {\n id: provider.id,\n ...(provider.aliases ? { aliases: provider.aliases } : {}),\n defaultModel: provider.defaultModel ?? null,\n models: provider.models ?? [],\n isConfigured: provider.isConfigured,\n };\n}\n\nfunction buildNoImageGenerationModelConfiguredMessage(\n cfg: Config | undefined,\n deps: ImageGenerationRuntimeDeps,\n): string {\n const list = (deps.listProviders ?? listImageGenerationProviders)(cfg);\n return buildNoCapabilityModelConfiguredMessage({\n capabilityLabel: 'image-generation',\n modelConfigKey: 'imageGenerationModel',\n providers: list.map(toCapabilityCandidate),\n getProviderEnvVars: deps.getProviderEnvVars ?? ((id) => PROVIDER_ENV_MAP[id]),\n });\n}\n\n// Re-export the canonical capability type for callers consuming this barrel.\nexport type { ImageGenerationProviderCapabilities };\n// Re-export the provider-registry surface that gateway routes / CLI consume\n// through this single barrel module. NOTE: `listImageGenerationProvidersSummary`\n// is implemented locally above (it overlays cfg-aware `configured` flags), so\n// it must not be re-exported from the registry to avoid a name clash.\nexport {\n getImageGenerationProvider,\n listImageGenerationProviders,\n} from './provider-registry.js';\n"],"mappings":";;;;;;;;;;;eACkE;aACV;AA2CxD,MAAM,MAAM,aAAa,WAAW;;;;;AAMpC,eAAsB,cACpB,QACA,OAAmC,EAAE,EACA;CACrC,MAAM,iBAAiB,SACpB,KAAK,iBAAiB,8BAA8B,IAAI;CAC3D,MAAM,eAAe,IAAY,SAC9B,KAAK,eAAe,4BAA4B,IAAI,IAAI;CAE3D,MAAM,aAAa,iCAAiC;EAClD,KAAK,OAAO;EACZ,aAAa,OAAO;EACpB,eAAe,OAAO;EACtB,eAAe;EACf,UAAU,OAAO;EACjB,gBAAgB,QAAQ,cAAc,IAAI,CAAC,IAAI,sBAAsB;EACrE,sBAAsB,OAAO;EAC9B,CAAC;AAEF,KAAI,WAAW,WAAW,EACxB,OAAM,IAAI,MAAM,6CAA6C,OAAO,KAAK,KAAK,CAAC;CAGjF,MAAM,WAA8B,EAAE;CACtC,IAAI;AAEJ,MAAK,MAAM,aAAa,YAAY;EAClC,MAAM,YAAY,KAAK,KAAK;EAC5B,MAAM,WAAW,YAAY,UAAU,UAAU,OAAO,IAAI;AAC5D,MAAI,CAAC,UAAU;GACb,MAAM,eAAe,6CAA6C,UAAU;AAC5E,YAAS,KAAK;IACZ,UAAU,UAAU;IACpB,OAAO,UAAU;IACjB,OAAO;IACP,QAAQ;IACT,CAAC;AACF,eAAY,IAAI,MAAM,aAAa;AACnC,OAAI,KACF;IAAE,UAAU,UAAU;IAAU,OAAO,UAAU;IAAO,OAAO;IAAqB,EACpF,uCAAuC,eACxC;AACD;;AAGF,MAAI;GACF,MAAM,YAAY,gCAAgC;IAChD;IACA,MAAM,OAAO;IACb,aAAa,OAAO;IACpB,YAAY,OAAO;IACnB,SAAS,OAAO;IAChB,cAAc,OAAO;IACrB,YAAY,OAAO;IACnB,aAAa,OAAO;IACrB,CAAC;GAEF,MAAM,UAAU,qBAAqB;IACnC;IACA;IACA;IACA;IACD,CAAC;AAEF,OAAI,MACF;IACE,UAAU,UAAU;IACpB,OAAO,UAAU;IACjB,OAAO;IACP,oBAAoB,UAAU,gBAC1B,OAAO,KAAK,UAAU,cAAc,CAAC,SACrC;IACJ,cAAc,UAAU,iBAAiB;IAC1C,EACD,sCAAsC,UAAU,SAAS,GAAG,UAAU,QACvE;GAED,MAAM,SAAS,MAAM,SAAS,cAAc,QAAQ;AACpD,OAAI,CAAC,OAAO,QAAQ,OAClB,OAAM,IAAI,MAAM,gDAAgD;GAGlE,MAAM,wBAAwB,0CAA0C,EACtE,eAAe,UAAU,eAC1B,CAAC;AAEF,UAAO;IACL,QAAQ,OAAO;IACf,UAAU,UAAU;IACpB,OAAO,OAAO,SAAS,UAAU;IACjC;IACA,GAAI,UAAU,gBAAgB,EAAE,eAAe,UAAU,eAAe,GAAG,EAAE;IAC7E,kBAAkB,UAAU;IAC5B,UAAU;KAAE,GAAI,OAAO,YAAY,EAAE;KAAG,GAAG;KAAuB;IACnE;WACM,KAAK;AACZ,eAAY;GACZ,MAAM,aAAa,KAAK,KAAK,GAAG;AAChC,oCAAiC;IAC/B;IACA,UAAU,UAAU;IACpB,OAAO,UAAU;IACjB,OAAO;IACP;IACD,CAAC;GACF,MAAM,OAAO,SAAS,SAAS,SAAS;GACxC,MAAM,cAAc,gBAAgB,IAAI,GAAG,sBAAsB,IAAI,GAAG,KAAA;AACxE,OAAI,KACF;IACE;IACA,UAAU,UAAU;IACpB,OAAO,UAAU;IACjB,QAAQ,MAAM;IACd,QAAQ,MAAM;IACd;IACA,OAAO;IACP,cAAc,SAAS;IACxB,EACD,sCAAsC,UAAU,SAAS,GAAG,UAAU,MAAM,IAC1E,eAAe,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,IAElF;;;AAIL,QAAO,iCAAiC;EACtC,iBAAiB;EACjB;EACA;EACD,CAAC;;AAGJ,SAAgB,oCACd,KACkC;AAClC,QAAOA,sCAAiC,IAAI;;AAO9C,SAAS,qBAAqB,OAKH;CACzB,MAAM,EAAE,UAAU,WAAW,QAAQ,cAAc;CACnD,MAAM,cAAc,OAAO,cACvB,iBAAiB,OAAO,YAAY,GACpC,KAAA;AACJ,QAAO;EACL,UAAU,SAAS;EACnB,OAAO,UAAU;EACjB,QAAQ,OAAO;EACf,GAAI,OAAO,MAAM,EAAE,KAAK,OAAO,KAAK,GAAG,EAAE;EACzC,GAAI,OAAO,WAAW,EAAE,UAAU,OAAO,UAAU,GAAG,EAAE;EACxD,GAAI,OAAO,YAAY,EAAE,WAAW,OAAO,WAAW,GAAG,EAAE;EAC3D,GAAI,OAAO,OAAO,cAAc,WAAW,EAAE,WAAW,OAAO,WAAW,GAAG,EAAE;EAC/E,GAAI,OAAO,SAAS,EAAE,QAAQ,OAAO,QAAQ,GAAG,EAAE;EAClD,GAAI,OAAO,OAAO,UAAU,WAAW,EAAE,OAAO,OAAO,OAAO,GAAG,EAAE;EACnE,GAAI,UAAU,SAAS,KAAA,IAAY,EAAE,MAAM,UAAU,MAAM,GAAG,EAAE;EAChE,GAAI,UAAU,gBAAgB,KAAA,IAAY,EAAE,aAAa,UAAU,aAAa,GAAG,EAAE;EACrF,GAAI,UAAU,eAAe,KAAA,IAAY,EAAE,YAAY,UAAU,YAAY,GAAG,EAAE;EAClF,GAAI,UAAU,YAAY,KAAA,IAAY,EAAE,SAAS,UAAU,SAAS,GAAG,EAAE;EACzE,GAAI,UAAU,iBAAiB,KAAA,IAAY,EAAE,cAAc,UAAU,cAAc,GAAG,EAAE;EACxF,GAAI,UAAU,eAAe,KAAA,IAAY,EAAE,YAAY,UAAU,YAAY,GAAG,EAAE;EAClF,GAAI,cAAc,EAAE,aAAa,GAAG,EAAE;EACtC,GAAI,OAAO,kBAAkB,EAAE,iBAAiB,OAAO,iBAAiB,GAAG,EAAE;EAC9E;;AAGH,SAAS,iBAAiB,QAAoE;AAC5F,QAAO,OAAO,KAAK,SAAS;EAC1B,QAAQ,IAAI;EACZ,UAAU,IAAI;EACd,GAAI,IAAI,WAAW,EAAE,UAAU,IAAI,UAAU,GAAG,EAAE;EAClD,GAAI,IAAI,WAAW,EAAE,UAAU,IAAI,UAAU,GAAG,EAAE;EACnD,EAAE;;AAGL,SAAS,sBAAsB,UAAgE;AAC7F,QAAO;EACL,IAAI,SAAS;EACb,GAAI,SAAS,UAAU,EAAE,SAAS,SAAS,SAAS,GAAG,EAAE;EACzD,cAAc,SAAS,gBAAgB;EACvC,QAAQ,SAAS,UAAU,EAAE;EAC7B,cAAc,SAAS;EACxB;;AAGH,SAAS,6CACP,KACA,MACQ;AAER,QAAO,wCAAwC;EAC7C,iBAAiB;EACjB,gBAAgB;EAChB,YAJY,KAAK,iBAAiB,8BAA8B,IAIjD,CAAC,IAAI,sBAAsB;EAC1C,oBAAoB,KAAK,wBAAwB,OAAO,iBAAiB;EAC1E,CAAC"}
|
|
@@ -14,7 +14,7 @@ export declare function coerceImageAssistantText(params: {
|
|
|
14
14
|
provider: string;
|
|
15
15
|
model: string;
|
|
16
16
|
}): string;
|
|
17
|
-
export declare function coerceImageModelConfig(
|
|
17
|
+
export declare function coerceImageModelConfig(_cfg?: Config): ImageModelConfig;
|
|
18
18
|
export declare function applyImageGenerationModelConfigDefaults(cfg: Config | undefined, imageGenerationModelConfig: ToolModelConfig): Config | undefined;
|
|
19
19
|
export declare function resolvePromptAndModelOverride(args: Record<string, unknown>, defaultPrompt: string): {
|
|
20
20
|
prompt: string;
|
|
@@ -25,26 +25,13 @@ function coerceImageAssistantText(params) {
|
|
|
25
25
|
if (text.trim()) return text.trim();
|
|
26
26
|
throw new Error(`Image model returned no text (${params.provider}/${params.model}).`);
|
|
27
27
|
}
|
|
28
|
-
function coerceImageModelConfig(
|
|
29
|
-
return coerceToolModelConfig(
|
|
28
|
+
function coerceImageModelConfig(_cfg) {
|
|
29
|
+
return coerceToolModelConfig(void 0);
|
|
30
30
|
}
|
|
31
31
|
function applyImageGenerationModelConfigDefaults(cfg, imageGenerationModelConfig) {
|
|
32
32
|
if (!cfg) return;
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
return {
|
|
36
|
-
...cfg,
|
|
37
|
-
agents: {
|
|
38
|
-
...cfg.agents,
|
|
39
|
-
defaults: {
|
|
40
|
-
...cfg.agents?.defaults,
|
|
41
|
-
imageGenerationModel: {
|
|
42
|
-
primary,
|
|
43
|
-
...imageGenerationModelConfig.fallbacks?.length ? { fallbacks: imageGenerationModelConfig.fallbacks } : {}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
};
|
|
33
|
+
if (!imageGenerationModelConfig.primary?.trim()) return cfg;
|
|
34
|
+
return cfg;
|
|
48
35
|
}
|
|
49
36
|
function resolvePromptAndModelOverride(args, defaultPrompt) {
|
|
50
37
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-helpers.js","names":[],"sources":["../../../../src/agent/image/image-helpers.ts"],"sourcesContent":["import type { AgentToolResult } from '@earendil-works/pi-agent-core';\nimport type { AssistantMessage } from '@earendil-works/pi-ai';\nimport type { Config } from '../../config/schema.js';\nimport { extractTextContent } from '../context/workspace.js';\nimport type { ImageAttempt } from './image-model-fallback.js';\nimport { coerceToolModelConfig, type ToolModelConfig } from './tool-model-config.js';\n\nexport type ImageModelConfig = ToolModelConfig;\n\nexport function decodeDataUrl(dataUrl: string): {\n buffer: Buffer;\n mimeType: string;\n kind: 'image';\n} {\n const trimmed = dataUrl.trim();\n const match = /^data:([^;,]+);base64,([a-z0-9+/=\\r\\n]+)$/i.exec(trimmed);\n if (!match) {\n throw new Error('Invalid data URL (expected base64 data: URL).');\n }\n const mimeType = (match[1] ?? '').trim().toLowerCase();\n if (!mimeType.startsWith('image/')) {\n throw new Error(`Unsupported data URL type: ${mimeType || 'unknown'}`);\n }\n const b64 = (match[2] ?? '').trim();\n const buffer = Buffer.from(b64, 'base64');\n if (buffer.length === 0) {\n throw new Error('Invalid data URL: empty payload.');\n }\n return { buffer, mimeType, kind: 'image' };\n}\n\nexport function coerceImageAssistantText(params: {\n message: AssistantMessage;\n provider: string;\n model: string;\n}): string {\n const stop = params.message.stopReason;\n const errorMessage = params.message.errorMessage?.trim();\n if (stop === 'error' || stop === 'aborted') {\n throw new Error(\n errorMessage\n ? `Image model failed (${params.provider}/${params.model}): ${errorMessage}`\n : `Image model failed (${params.provider}/${params.model})`,\n );\n }\n if (errorMessage) {\n throw new Error(`Image model failed (${params.provider}/${params.model}): ${errorMessage}`);\n }\n const text = extractTextContent(\n params.message.content as Array<{ type: string; text?: string }>,\n );\n if (text.trim()) {\n return text.trim();\n }\n throw new Error(`Image model returned no text (${params.provider}/${params.model}).`);\n}\n\nexport function coerceImageModelConfig(
|
|
1
|
+
{"version":3,"file":"image-helpers.js","names":[],"sources":["../../../../src/agent/image/image-helpers.ts"],"sourcesContent":["import type { AgentToolResult } from '@earendil-works/pi-agent-core';\nimport type { AssistantMessage } from '@earendil-works/pi-ai';\nimport type { Config } from '../../config/schema.js';\nimport { extractTextContent } from '../context/workspace.js';\nimport type { ImageAttempt } from './image-model-fallback.js';\nimport { coerceToolModelConfig, type ToolModelConfig } from './tool-model-config.js';\n\nexport type ImageModelConfig = ToolModelConfig;\n\nexport function decodeDataUrl(dataUrl: string): {\n buffer: Buffer;\n mimeType: string;\n kind: 'image';\n} {\n const trimmed = dataUrl.trim();\n const match = /^data:([^;,]+);base64,([a-z0-9+/=\\r\\n]+)$/i.exec(trimmed);\n if (!match) {\n throw new Error('Invalid data URL (expected base64 data: URL).');\n }\n const mimeType = (match[1] ?? '').trim().toLowerCase();\n if (!mimeType.startsWith('image/')) {\n throw new Error(`Unsupported data URL type: ${mimeType || 'unknown'}`);\n }\n const b64 = (match[2] ?? '').trim();\n const buffer = Buffer.from(b64, 'base64');\n if (buffer.length === 0) {\n throw new Error('Invalid data URL: empty payload.');\n }\n return { buffer, mimeType, kind: 'image' };\n}\n\nexport function coerceImageAssistantText(params: {\n message: AssistantMessage;\n provider: string;\n model: string;\n}): string {\n const stop = params.message.stopReason;\n const errorMessage = params.message.errorMessage?.trim();\n if (stop === 'error' || stop === 'aborted') {\n throw new Error(\n errorMessage\n ? `Image model failed (${params.provider}/${params.model}): ${errorMessage}`\n : `Image model failed (${params.provider}/${params.model})`,\n );\n }\n if (errorMessage) {\n throw new Error(`Image model failed (${params.provider}/${params.model}): ${errorMessage}`);\n }\n const text = extractTextContent(\n params.message.content as Array<{ type: string; text?: string }>,\n );\n if (text.trim()) {\n return text.trim();\n }\n throw new Error(`Image model returned no text (${params.provider}/${params.model}).`);\n}\n\nexport function coerceImageModelConfig(_cfg?: Config): ImageModelConfig {\n return coerceToolModelConfig(undefined);\n}\n\nexport function applyImageGenerationModelConfigDefaults(\n cfg: Config | undefined,\n imageGenerationModelConfig: ToolModelConfig,\n): Config | undefined {\n if (!cfg) {\n return undefined;\n }\n const primary = imageGenerationModelConfig.primary?.trim();\n if (!primary) {\n return cfg;\n }\n return cfg;\n}\n\nexport function resolvePromptAndModelOverride(\n args: Record<string, unknown>,\n defaultPrompt: string,\n): {\n prompt: string;\n modelOverride?: string;\n} {\n const prompt =\n typeof args.prompt === 'string' && args.prompt.trim() ? args.prompt.trim() : defaultPrompt;\n const modelOverride =\n typeof args.model === 'string' && args.model.trim() ? args.model.trim() : undefined;\n return { prompt, modelOverride };\n}\n\nexport function buildImageToolTextResult(\n result: { text: string; provider: string; model: string; attempts: ImageAttempt[] },\n extraDetails: Record<string, unknown>,\n): AgentToolResult<Record<string, unknown>> {\n return {\n content: [{ type: 'text', text: result.text }],\n details: {\n model: `${result.provider}/${result.model}`,\n ...extraDetails,\n attempts: result.attempts,\n },\n };\n}\n"],"mappings":";;;AASA,SAAgB,cAAc,SAI5B;CACA,MAAM,UAAU,QAAQ,MAAM;CAC9B,MAAM,QAAQ,6CAA6C,KAAK,QAAQ;AACxE,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,gDAAgD;CAElE,MAAM,YAAY,MAAM,MAAM,IAAI,MAAM,CAAC,aAAa;AACtD,KAAI,CAAC,SAAS,WAAW,SAAS,CAChC,OAAM,IAAI,MAAM,8BAA8B,YAAY,YAAY;CAExE,MAAM,OAAO,MAAM,MAAM,IAAI,MAAM;CACnC,MAAM,SAAS,OAAO,KAAK,KAAK,SAAS;AACzC,KAAI,OAAO,WAAW,EACpB,OAAM,IAAI,MAAM,mCAAmC;AAErD,QAAO;EAAE;EAAQ;EAAU,MAAM;EAAS;;AAG5C,SAAgB,yBAAyB,QAI9B;CACT,MAAM,OAAO,OAAO,QAAQ;CAC5B,MAAM,eAAe,OAAO,QAAQ,cAAc,MAAM;AACxD,KAAI,SAAS,WAAW,SAAS,UAC/B,OAAM,IAAI,MACR,eACI,uBAAuB,OAAO,SAAS,GAAG,OAAO,MAAM,KAAK,iBAC5D,uBAAuB,OAAO,SAAS,GAAG,OAAO,MAAM,GAC5D;AAEH,KAAI,aACF,OAAM,IAAI,MAAM,uBAAuB,OAAO,SAAS,GAAG,OAAO,MAAM,KAAK,eAAe;CAE7F,MAAM,OAAO,mBACX,OAAO,QAAQ,QAChB;AACD,KAAI,KAAK,MAAM,CACb,QAAO,KAAK,MAAM;AAEpB,OAAM,IAAI,MAAM,iCAAiC,OAAO,SAAS,GAAG,OAAO,MAAM,IAAI;;AAGvF,SAAgB,uBAAuB,MAAiC;AACtE,QAAO,sBAAsB,KAAA,EAAU;;AAGzC,SAAgB,wCACd,KACA,4BACoB;AACpB,KAAI,CAAC,IACH;AAGF,KAAI,CADY,2BAA2B,SAAS,MAAM,CAExD,QAAO;AAET,QAAO;;AAGT,SAAgB,8BACd,MACA,eAIA;AAKA,QAAO;EAAE,QAHP,OAAO,KAAK,WAAW,YAAY,KAAK,OAAO,MAAM,GAAG,KAAK,OAAO,MAAM,GAAG;EAG9D,eADf,OAAO,KAAK,UAAU,YAAY,KAAK,MAAM,MAAM,GAAG,KAAK,MAAM,MAAM,GAAG,KAAA;EAC5C;;AAGlC,SAAgB,yBACd,QACA,cAC0C;AAC1C,QAAO;EACL,SAAS,CAAC;GAAE,MAAM;GAAQ,MAAM,OAAO;GAAM,CAAC;EAC9C,SAAS;GACP,OAAO,GAAG,OAAO,SAAS,GAAG,OAAO;GACpC,GAAG;GACH,UAAU,OAAO;GAClB;EACF"}
|
|
@@ -21,7 +21,7 @@ async function runWithImageModelFallback(params) {
|
|
|
21
21
|
toolConfig: params.toolConfig,
|
|
22
22
|
modelOverride: params.modelOverride
|
|
23
23
|
});
|
|
24
|
-
if (refs.length === 0) throw new Error("No image model
|
|
24
|
+
if (refs.length === 0) throw new Error("No image-capable model is available.");
|
|
25
25
|
const attempts = [];
|
|
26
26
|
let lastErr;
|
|
27
27
|
for (const modelRef of refs) try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image-model-fallback.js","names":[],"sources":["../../../../src/agent/image/image-model-fallback.ts"],"sourcesContent":["import type { ToolModelConfig } from './tool-model-config.js';\n\nexport type ImageAttempt = { provider: string; model: string; error: string };\n\nfunction collectModelRefs(params: {\n toolConfig: ToolModelConfig;\n modelOverride?: string;\n}): string[] {\n const refs: string[] = [];\n const add = (raw: string | undefined) => {\n const t = raw?.trim();\n if (t?.includes('/')) {\n refs.push(t);\n }\n };\n add(params.modelOverride);\n add(params.toolConfig.primary);\n for (const f of params.toolConfig.fallbacks ?? []) {\n add(f);\n }\n const seen = new Set<string>();\n const out: string[] = [];\n for (const r of refs) {\n if (!seen.has(r)) {\n seen.add(r);\n out.push(r);\n }\n }\n return out;\n}\n\nexport async function runWithImageModelFallback<T>(params: {\n toolConfig: ToolModelConfig;\n modelOverride?: string;\n run: (modelRef: string) => Promise<T>;\n}): Promise<{ result: T; attempts: ImageAttempt[] }> {\n const refs = collectModelRefs({\n toolConfig: params.toolConfig,\n modelOverride: params.modelOverride,\n });\n if (refs.length === 0) {\n throw new Error(\n 'No image model
|
|
1
|
+
{"version":3,"file":"image-model-fallback.js","names":[],"sources":["../../../../src/agent/image/image-model-fallback.ts"],"sourcesContent":["import type { ToolModelConfig } from './tool-model-config.js';\n\nexport type ImageAttempt = { provider: string; model: string; error: string };\n\nfunction collectModelRefs(params: {\n toolConfig: ToolModelConfig;\n modelOverride?: string;\n}): string[] {\n const refs: string[] = [];\n const add = (raw: string | undefined) => {\n const t = raw?.trim();\n if (t?.includes('/')) {\n refs.push(t);\n }\n };\n add(params.modelOverride);\n add(params.toolConfig.primary);\n for (const f of params.toolConfig.fallbacks ?? []) {\n add(f);\n }\n const seen = new Set<string>();\n const out: string[] = [];\n for (const r of refs) {\n if (!seen.has(r)) {\n seen.add(r);\n out.push(r);\n }\n }\n return out;\n}\n\nexport async function runWithImageModelFallback<T>(params: {\n toolConfig: ToolModelConfig;\n modelOverride?: string;\n run: (modelRef: string) => Promise<T>;\n}): Promise<{ result: T; attempts: ImageAttempt[] }> {\n const refs = collectModelRefs({\n toolConfig: params.toolConfig,\n modelOverride: params.modelOverride,\n });\n if (refs.length === 0) {\n throw new Error(\n 'No image-capable model is available.',\n );\n }\n\n const attempts: ImageAttempt[] = [];\n let lastErr: unknown;\n\n for (const modelRef of refs) {\n try {\n const result = await params.run(modelRef);\n return { result, attempts };\n } catch (err) {\n lastErr = err;\n const msg = err instanceof Error ? err.message : String(err);\n const slash = modelRef.indexOf('/');\n attempts.push({\n provider: slash > 0 ? modelRef.slice(0, slash) : modelRef,\n model: slash > 0 ? modelRef.slice(slash + 1) : '',\n error: msg,\n });\n }\n }\n\n const summary = attempts.map((a) => `${a.provider}/${a.model}: ${a.error}`).join(' | ');\n throw new Error(\n `All image models failed (${attempts.length}): ${summary || (lastErr instanceof Error ? lastErr.message : String(lastErr))}`,\n );\n}\n"],"mappings":";AAIA,SAAS,iBAAiB,QAGb;CACX,MAAM,OAAiB,EAAE;CACzB,MAAM,OAAO,QAA4B;EACvC,MAAM,IAAI,KAAK,MAAM;AACrB,MAAI,GAAG,SAAS,IAAI,CAClB,MAAK,KAAK,EAAE;;AAGhB,KAAI,OAAO,cAAc;AACzB,KAAI,OAAO,WAAW,QAAQ;AAC9B,MAAK,MAAM,KAAK,OAAO,WAAW,aAAa,EAAE,CAC/C,KAAI,EAAE;CAER,MAAM,uBAAO,IAAI,KAAa;CAC9B,MAAM,MAAgB,EAAE;AACxB,MAAK,MAAM,KAAK,KACd,KAAI,CAAC,KAAK,IAAI,EAAE,EAAE;AAChB,OAAK,IAAI,EAAE;AACX,MAAI,KAAK,EAAE;;AAGf,QAAO;;AAGT,eAAsB,0BAA6B,QAIE;CACnD,MAAM,OAAO,iBAAiB;EAC5B,YAAY,OAAO;EACnB,eAAe,OAAO;EACvB,CAAC;AACF,KAAI,KAAK,WAAW,EAClB,OAAM,IAAI,MACR,uCACD;CAGH,MAAM,WAA2B,EAAE;CACnC,IAAI;AAEJ,MAAK,MAAM,YAAY,KACrB,KAAI;AAEF,SAAO;GAAE,QAAA,MADY,OAAO,IAAI,SAAS;GACxB;GAAU;UACpB,KAAK;AACZ,YAAU;EACV,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;EAC5D,MAAM,QAAQ,SAAS,QAAQ,IAAI;AACnC,WAAS,KAAK;GACZ,UAAU,QAAQ,IAAI,SAAS,MAAM,GAAG,MAAM,GAAG;GACjD,OAAO,QAAQ,IAAI,SAAS,MAAM,QAAQ,EAAE,GAAG;GAC/C,OAAO;GACR,CAAC;;CAIN,MAAM,UAAU,SAAS,KAAK,MAAM,GAAG,EAAE,SAAS,GAAG,EAAE,MAAM,IAAI,EAAE,QAAQ,CAAC,KAAK,MAAM;AACvF,OAAM,IAAI,MACR,4BAA4B,SAAS,OAAO,KAAK,YAAY,mBAAmB,QAAQ,QAAQ,UAAU,OAAO,QAAQ,IAC1H"}
|
|
@@ -13,7 +13,7 @@ async function resolveInboundImageContentParts(params) {
|
|
|
13
13
|
const fallbacks = toolCfg?.fallbacks ?? [];
|
|
14
14
|
if (!primary) return [{
|
|
15
15
|
type: "text",
|
|
16
|
-
text: `[${params.images.length} image(s) attached;
|
|
16
|
+
text: `[${params.images.length} image(s) attached; no image-capable model is available to describe them.]`
|
|
17
17
|
}];
|
|
18
18
|
try {
|
|
19
19
|
return [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbound-image-handling.js","names":[],"sources":["../../../../src/agent/image/inbound-image-handling.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport { describeImagesWithFallback } from './understanding/runtime.js';\nimport { resolveImageModelConfigForTool } from './tool-model-config.js';\nimport { resolveImageHandlingStrategy } from './vision-detection.js';\n\nexport async function resolveInboundImageContentParts(params: {\n modelRef: string;\n cfg?: Config;\n userTextForContext: string;\n images: Array<{ data: string; mimeType: string }>;\n}): Promise<Array<{ type: 'image'; data: string; mimeType: string } | { type: 'text'; text: string }>> {\n const strategy = resolveImageHandlingStrategy(params.modelRef);\n if (strategy === 'native') {\n return params.images.map((att) => ({\n type: 'image' as const,\n data: att.data,\n mimeType: att.mimeType,\n }));\n }\n\n const toolCfg = resolveImageModelConfigForTool({ cfg: params.cfg });\n const primary = toolCfg?.primary;\n const fallbacks = toolCfg?.fallbacks ?? [];\n\n if (!primary) {\n return [\n {\n type: 'text' as const,\n text: `[${params.images.length} image(s) attached;
|
|
1
|
+
{"version":3,"file":"inbound-image-handling.js","names":[],"sources":["../../../../src/agent/image/inbound-image-handling.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport { describeImagesWithFallback } from './understanding/runtime.js';\nimport { resolveImageModelConfigForTool } from './tool-model-config.js';\nimport { resolveImageHandlingStrategy } from './vision-detection.js';\n\nexport async function resolveInboundImageContentParts(params: {\n modelRef: string;\n cfg?: Config;\n userTextForContext: string;\n images: Array<{ data: string; mimeType: string }>;\n}): Promise<Array<{ type: 'image'; data: string; mimeType: string } | { type: 'text'; text: string }>> {\n const strategy = resolveImageHandlingStrategy(params.modelRef);\n if (strategy === 'native') {\n return params.images.map((att) => ({\n type: 'image' as const,\n data: att.data,\n mimeType: att.mimeType,\n }));\n }\n\n const toolCfg = resolveImageModelConfigForTool({ cfg: params.cfg });\n const primary = toolCfg?.primary;\n const fallbacks = toolCfg?.fallbacks ?? [];\n\n if (!primary) {\n return [\n {\n type: 'text' as const,\n text: `[${params.images.length} image(s) attached; no image-capable model is available to describe them.]`,\n },\n ];\n }\n\n try {\n const buffers = params.images.map((att) => ({\n buffer: Buffer.from(att.data, 'base64'),\n mimeType: att.mimeType,\n }));\n const prompt = params.userTextForContext.trim()\n ? `Describe these images in the context of the user's message: \"${params.userTextForContext}\"`\n : 'Describe these images in detail.';\n const result = await describeImagesWithFallback({\n modelRef: primary,\n fallbacks,\n images: buffers,\n prompt,\n maxTokens: 1024,\n timeoutMs: 30_000,\n });\n return [{ type: 'text' as const, text: `[Image description: ${result.text}]` }];\n } catch (err) {\n return [\n {\n type: 'text' as const,\n text: `[${params.images.length} image(s) attached but could not be described: ${err instanceof Error ? err.message : String(err)}]`,\n },\n ];\n }\n}\n"],"mappings":";;;;AAKA,eAAsB,gCAAgC,QAKiD;AAErG,KADiB,6BAA6B,OAAO,SACzC,KAAK,SACf,QAAO,OAAO,OAAO,KAAK,SAAS;EACjC,MAAM;EACN,MAAM,IAAI;EACV,UAAU,IAAI;EACf,EAAE;CAGL,MAAM,UAAU,+BAA+B,EAAE,KAAK,OAAO,KAAK,CAAC;CACnE,MAAM,UAAU,SAAS;CACzB,MAAM,YAAY,SAAS,aAAa,EAAE;AAE1C,KAAI,CAAC,QACH,QAAO,CACL;EACE,MAAM;EACN,MAAM,IAAI,OAAO,OAAO,OAAO;EAChC,CACF;AAGH,KAAI;AAgBF,SAAO,CAAC;GAAE,MAAM;GAAiB,MAAM,wBAAuB,MARzC,2BAA2B;IAC9C,UAAU;IACV;IACA,QAVc,OAAO,OAAO,KAAK,SAAS;KAC1C,QAAQ,OAAO,KAAK,IAAI,MAAM,SAAS;KACvC,UAAU,IAAI;KACf,EAOgB;IACf,QAPa,OAAO,mBAAmB,MAAM,GAC3C,gEAAgE,OAAO,mBAAmB,KAC1F;IAMF,WAAW;IACX,WAAW;IACZ,CAAC,EACmE,KAAK;GAAI,CAAC;UACxE,KAAK;AACZ,SAAO,CACL;GACE,MAAM;GACN,MAAM,IAAI,OAAO,OAAO,OAAO,iDAAiD,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI,CAAC;GAClI,CACF"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { checkFileSafety } from "../prompt/safety.js";
|
|
2
2
|
import { decodeDataUrl } from "./image-helpers.js";
|
|
3
|
-
import { promises } from "node:fs";
|
|
4
|
-
import path from "node:path";
|
|
5
3
|
import { homedir } from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { promises } from "node:fs";
|
|
6
6
|
//#region src/agent/image/load-image-media.ts
|
|
7
7
|
function expandUser(p) {
|
|
8
8
|
if (p.startsWith("~/") || p === "~") return path.join(homedir(), p.slice(1));
|
|
@@ -14,7 +14,7 @@ export declare function buildToolModelConfigFromCandidates(params: {
|
|
|
14
14
|
candidates: Array<string | null | undefined>;
|
|
15
15
|
}): ToolModelConfig | null;
|
|
16
16
|
/**
|
|
17
|
-
* Effective image understanding model
|
|
17
|
+
* Effective image understanding model inferred from configured providers.
|
|
18
18
|
*/
|
|
19
19
|
export declare function resolveImageModelConfigForTool(params: {
|
|
20
20
|
cfg?: Config;
|
|
@@ -49,10 +49,10 @@ function firstVisionModelRef(provider) {
|
|
|
49
49
|
return m ? `${provider}/${m.id}` : void 0;
|
|
50
50
|
}
|
|
51
51
|
/**
|
|
52
|
-
* Effective image understanding model
|
|
52
|
+
* Effective image understanding model inferred from configured providers.
|
|
53
53
|
*/
|
|
54
54
|
function resolveImageModelConfigForTool(params) {
|
|
55
|
-
const explicit = coerceToolModelConfig(
|
|
55
|
+
const explicit = coerceToolModelConfig(void 0);
|
|
56
56
|
if (hasToolModelConfig(explicit)) return explicit;
|
|
57
57
|
const primary = resolveDefaultModelRef(params.cfg);
|
|
58
58
|
const primaryCandidates = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-model-config.js","names":[],"sources":["../../../../src/agent/image/tool-model-config.ts"],"sourcesContent":["import type { AgentModelConfig, Config } from '../../config/schema.js';\nimport { getAgentDefaultModelRef, parseModelRef } from '../../config/schema.js';\nimport {\n resolveAgentModelFallbackValues,\n resolveAgentModelPrimaryValue,\n} from '../../config/model-input.js';\nimport { getDefaultModelSync, getModelsByProvider, isProviderConfiguredSync } from '../../providers/index.js';\n\nexport type ToolModelConfig = { primary?: string; fallbacks?: string[] };\n\nexport function hasToolModelConfig(model: ToolModelConfig | undefined): boolean {\n return Boolean(\n model?.primary?.trim() || (model?.fallbacks ?? []).some((entry) => entry.trim().length > 0),\n );\n}\n\nexport function resolveDefaultModelRef(cfg?: Config): { provider: string; model: string } {\n const ref = cfg ? getAgentDefaultModelRef(cfg) : undefined;\n if (ref) {\n const p = parseModelRef(ref);\n if (p) {\n return p;\n }\n }\n const fallback = getDefaultModelSync(cfg);\n const p2 = parseModelRef(fallback);\n if (p2) {\n return p2;\n }\n return { provider: 'deepseek', model: 'deepseek-v4-flash' };\n}\n\nexport function coerceToolModelConfig(model?: AgentModelConfig): ToolModelConfig {\n const primary = resolveAgentModelPrimaryValue(model);\n const fallbacks = resolveAgentModelFallbackValues(model);\n return {\n ...(primary?.trim() ? { primary: primary.trim() } : {}),\n ...(fallbacks.length > 0 ? { fallbacks } : {}),\n };\n}\n\nexport function buildToolModelConfigFromCandidates(params: {\n explicit: ToolModelConfig;\n candidates: Array<string | null | undefined>;\n}): ToolModelConfig | null {\n if (hasToolModelConfig(params.explicit)) {\n return params.explicit;\n }\n\n const deduped: string[] = [];\n for (const candidate of params.candidates) {\n const trimmed = candidate?.trim();\n if (!trimmed || !trimmed.includes('/')) {\n continue;\n }\n const provider = trimmed.slice(0, trimmed.indexOf('/')).trim();\n if (!provider || !isProviderConfiguredSync(provider)) {\n continue;\n }\n if (!deduped.includes(trimmed)) {\n deduped.push(trimmed);\n }\n }\n\n if (deduped.length === 0) {\n return null;\n }\n\n return {\n primary: deduped[0],\n ...(deduped.length > 1 ? { fallbacks: deduped.slice(1) } : {}),\n };\n}\n\nfunction firstVisionModelRef(provider: string): string | undefined {\n const m = getModelsByProvider(provider).find((x) => x.input?.includes('image'));\n return m ? `${provider}/${m.id}` : undefined;\n}\n\n/**\n * Effective image understanding model
|
|
1
|
+
{"version":3,"file":"tool-model-config.js","names":[],"sources":["../../../../src/agent/image/tool-model-config.ts"],"sourcesContent":["import type { AgentModelConfig, Config } from '../../config/schema.js';\nimport { getAgentDefaultModelRef, parseModelRef } from '../../config/schema.js';\nimport {\n resolveAgentModelFallbackValues,\n resolveAgentModelPrimaryValue,\n} from '../../config/model-input.js';\nimport { getDefaultModelSync, getModelsByProvider, isProviderConfiguredSync } from '../../providers/index.js';\n\nexport type ToolModelConfig = { primary?: string; fallbacks?: string[] };\n\nexport function hasToolModelConfig(model: ToolModelConfig | undefined): boolean {\n return Boolean(\n model?.primary?.trim() || (model?.fallbacks ?? []).some((entry) => entry.trim().length > 0),\n );\n}\n\nexport function resolveDefaultModelRef(cfg?: Config): { provider: string; model: string } {\n const ref = cfg ? getAgentDefaultModelRef(cfg) : undefined;\n if (ref) {\n const p = parseModelRef(ref);\n if (p) {\n return p;\n }\n }\n const fallback = getDefaultModelSync(cfg);\n const p2 = parseModelRef(fallback);\n if (p2) {\n return p2;\n }\n return { provider: 'deepseek', model: 'deepseek-v4-flash' };\n}\n\nexport function coerceToolModelConfig(model?: AgentModelConfig): ToolModelConfig {\n const primary = resolveAgentModelPrimaryValue(model);\n const fallbacks = resolveAgentModelFallbackValues(model);\n return {\n ...(primary?.trim() ? { primary: primary.trim() } : {}),\n ...(fallbacks.length > 0 ? { fallbacks } : {}),\n };\n}\n\nexport function buildToolModelConfigFromCandidates(params: {\n explicit: ToolModelConfig;\n candidates: Array<string | null | undefined>;\n}): ToolModelConfig | null {\n if (hasToolModelConfig(params.explicit)) {\n return params.explicit;\n }\n\n const deduped: string[] = [];\n for (const candidate of params.candidates) {\n const trimmed = candidate?.trim();\n if (!trimmed || !trimmed.includes('/')) {\n continue;\n }\n const provider = trimmed.slice(0, trimmed.indexOf('/')).trim();\n if (!provider || !isProviderConfiguredSync(provider)) {\n continue;\n }\n if (!deduped.includes(trimmed)) {\n deduped.push(trimmed);\n }\n }\n\n if (deduped.length === 0) {\n return null;\n }\n\n return {\n primary: deduped[0],\n ...(deduped.length > 1 ? { fallbacks: deduped.slice(1) } : {}),\n };\n}\n\nfunction firstVisionModelRef(provider: string): string | undefined {\n const m = getModelsByProvider(provider).find((x) => x.input?.includes('image'));\n return m ? `${provider}/${m.id}` : undefined;\n}\n\n/**\n * Effective image understanding model inferred from configured providers.\n */\nexport function resolveImageModelConfigForTool(params: { cfg?: Config }): ToolModelConfig | null {\n const explicit = coerceToolModelConfig(undefined);\n if (hasToolModelConfig(explicit)) {\n return explicit;\n }\n\n const primary = resolveDefaultModelRef(params.cfg);\n const primaryCandidates: string[] = [];\n const vision = firstVisionModelRef(primary.provider);\n if (vision) {\n primaryCandidates.push(vision);\n }\n if (primary.provider === 'openai') {\n primaryCandidates.push('openai/gpt-4o-mini');\n }\n if (primary.provider === 'anthropic') {\n primaryCandidates.push('anthropic/claude-sonnet-4-5');\n }\n if (primary.provider === 'google') {\n primaryCandidates.push('google/gemini-2.0-flash');\n }\n\n return buildToolModelConfigFromCandidates({\n explicit,\n candidates: [\n ...primaryCandidates,\n firstVisionModelRef('openai') ?? 'openai/gpt-4o-mini',\n firstVisionModelRef('anthropic') ?? 'anthropic/claude-sonnet-4-5',\n ],\n });\n}\n"],"mappings":";;;;aACgF;gBAK8B;AAI9G,SAAgB,mBAAmB,OAA6C;AAC9E,QAAO,QACL,OAAO,SAAS,MAAM,KAAK,OAAO,aAAa,EAAE,EAAE,MAAM,UAAU,MAAM,MAAM,CAAC,SAAS,EAAE,CAC5F;;AAGH,SAAgB,uBAAuB,KAAmD;CACxF,MAAM,MAAM,MAAM,wBAAwB,IAAI,GAAG,KAAA;AACjD,KAAI,KAAK;EACP,MAAM,IAAI,cAAc,IAAI;AAC5B,MAAI,EACF,QAAO;;CAIX,MAAM,KAAK,cADM,oBAAoB,IACJ,CAAC;AAClC,KAAI,GACF,QAAO;AAET,QAAO;EAAE,UAAU;EAAY,OAAO;EAAqB;;AAG7D,SAAgB,sBAAsB,OAA2C;CAC/E,MAAM,UAAU,8BAA8B,MAAM;CACpD,MAAM,YAAY,gCAAgC,MAAM;AACxD,QAAO;EACL,GAAI,SAAS,MAAM,GAAG,EAAE,SAAS,QAAQ,MAAM,EAAE,GAAG,EAAE;EACtD,GAAI,UAAU,SAAS,IAAI,EAAE,WAAW,GAAG,EAAE;EAC9C;;AAGH,SAAgB,mCAAmC,QAGxB;AACzB,KAAI,mBAAmB,OAAO,SAAS,CACrC,QAAO,OAAO;CAGhB,MAAM,UAAoB,EAAE;AAC5B,MAAK,MAAM,aAAa,OAAO,YAAY;EACzC,MAAM,UAAU,WAAW,MAAM;AACjC,MAAI,CAAC,WAAW,CAAC,QAAQ,SAAS,IAAI,CACpC;EAEF,MAAM,WAAW,QAAQ,MAAM,GAAG,QAAQ,QAAQ,IAAI,CAAC,CAAC,MAAM;AAC9D,MAAI,CAAC,YAAY,CAAC,yBAAyB,SAAS,CAClD;AAEF,MAAI,CAAC,QAAQ,SAAS,QAAQ,CAC5B,SAAQ,KAAK,QAAQ;;AAIzB,KAAI,QAAQ,WAAW,EACrB,QAAO;AAGT,QAAO;EACL,SAAS,QAAQ;EACjB,GAAI,QAAQ,SAAS,IAAI,EAAE,WAAW,QAAQ,MAAM,EAAE,EAAE,GAAG,EAAE;EAC9D;;AAGH,SAAS,oBAAoB,UAAsC;CACjE,MAAM,IAAI,oBAAoB,SAAS,CAAC,MAAM,MAAM,EAAE,OAAO,SAAS,QAAQ,CAAC;AAC/E,QAAO,IAAI,GAAG,SAAS,GAAG,EAAE,OAAO,KAAA;;;;;AAMrC,SAAgB,+BAA+B,QAAkD;CAC/F,MAAM,WAAW,sBAAsB,KAAA,EAAU;AACjD,KAAI,mBAAmB,SAAS,CAC9B,QAAO;CAGT,MAAM,UAAU,uBAAuB,OAAO,IAAI;CAClD,MAAM,oBAA8B,EAAE;CACtC,MAAM,SAAS,oBAAoB,QAAQ,SAAS;AACpD,KAAI,OACF,mBAAkB,KAAK,OAAO;AAEhC,KAAI,QAAQ,aAAa,SACvB,mBAAkB,KAAK,qBAAqB;AAE9C,KAAI,QAAQ,aAAa,YACvB,mBAAkB,KAAK,8BAA8B;AAEvD,KAAI,QAAQ,aAAa,SACvB,mBAAkB,KAAK,0BAA0B;AAGnD,QAAO,mCAAmC;EACxC;EACA,YAAY;GACV,GAAG;GACH,oBAAoB,SAAS,IAAI;GACjC,oBAAoB,YAAY,IAAI;GACrC;EACF,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
|
|
2
|
-
import { init_paths, resolveAgentDir } from "../../config/paths.js";
|
|
3
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
4
2
|
import { init_logger } from "../../utils/logger.js";
|
|
5
|
-
import {
|
|
3
|
+
import { init_paths, resolveAgentDir } from "../../config/paths.js";
|
|
4
|
+
import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
|
|
6
5
|
import { join } from "path";
|
|
6
|
+
import { existsSync, watch } from "fs";
|
|
7
7
|
import { mkdir, readFile, readdir, rename } from "fs/promises";
|
|
8
8
|
//#region src/agent/ipc/inbox.ts
|
|
9
9
|
init_write_file_atomic();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { init_paths, resolveSocketPath } from "../../config/paths.js";
|
|
2
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
3
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
+
import { init_paths, resolveSocketPath } from "../../config/paths.js";
|
|
4
4
|
import { isValidIPCMessage } from "./types.js";
|
|
5
5
|
import { dirname } from "path";
|
|
6
6
|
import { mkdir } from "fs/promises";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { init_string_coerce, normalizeLowercaseStringOrEmpty, normalizeOptionalString } from "../../utils/string-coerce.js";
|
|
1
2
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
3
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { init_string_coerce, normalizeLowercaseStringOrEmpty, normalizeOptionalString } from "../../utils/string-coerce.js";
|
|
4
4
|
import { buildSafeToolName, normalizeReservedToolNames } from "./bundle-mcp-names.js";
|
|
5
5
|
import { setPluginToolMeta } from "./mcp-tool-meta.js";
|
|
6
6
|
import crypto from "node:crypto";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { init_string_coerce, normalizeOptionalString } from "../../utils/string-coerce.js";
|
|
1
2
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
3
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { init_string_coerce, normalizeOptionalString } from "../../utils/string-coerce.js";
|
|
4
4
|
import { resolveGlobalSingleton } from "../../utils/global-singleton.js";
|
|
5
5
|
import { sanitizeServerName } from "./bundle-mcp-names.js";
|
|
6
6
|
import { redactSensitiveUrlLikeString } from "../../utils/redact-sensitive-url.js";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { init_string_coerce, normalizeLowercaseStringOrEmpty } from "../../utils/string-coerce.js";
|
|
1
2
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
3
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { init_string_coerce, normalizeLowercaseStringOrEmpty } from "../../utils/string-coerce.js";
|
|
4
4
|
import { resolveXopcMcpTransportAlias } from "../../config/mcp-config-normalize.js";
|
|
5
5
|
import { sanitizeForLog } from "../../utils/sanitize-log.js";
|
|
6
6
|
import { describeHttpMcpServerLaunchConfig, resolveHttpMcpServerLaunchConfig } from "./mcp-http.js";
|