@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
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
//#region src/agent-runtime/run-trace.ts
|
|
3
|
+
function stableJson(value) {
|
|
4
|
+
if (Array.isArray(value)) return `[${value.map(stableJson).join(",")}]`;
|
|
5
|
+
if (value && typeof value === "object") return `{${Object.entries(value).toSorted(([a], [b]) => a.localeCompare(b)).map(([key, child]) => `${JSON.stringify(key)}:${stableJson(child)}`).join(",")}}`;
|
|
6
|
+
return JSON.stringify(value);
|
|
7
|
+
}
|
|
8
|
+
function hashEffectiveManifest(manifest) {
|
|
9
|
+
return createHash("sha256").update(stableJson(manifest)).digest("hex");
|
|
10
|
+
}
|
|
11
|
+
function createAgentRunTrace(params) {
|
|
12
|
+
const startedAt = (params.now ?? /* @__PURE__ */ new Date()).toISOString();
|
|
13
|
+
const runId = randomUUID();
|
|
14
|
+
return {
|
|
15
|
+
id: runId,
|
|
16
|
+
agentId: params.agentId,
|
|
17
|
+
status: "running",
|
|
18
|
+
effectiveManifestHash: hashEffectiveManifest(params.manifest),
|
|
19
|
+
startedAt,
|
|
20
|
+
events: [{
|
|
21
|
+
id: randomUUID(),
|
|
22
|
+
runId,
|
|
23
|
+
type: "run.started",
|
|
24
|
+
payload: { agentId: params.agentId },
|
|
25
|
+
createdAt: startedAt
|
|
26
|
+
}]
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function appendAgentRunEvent(trace, type, payload, now = /* @__PURE__ */ new Date()) {
|
|
30
|
+
if (trace.status !== "running") throw new Error(`Cannot append event to ${trace.status} run`);
|
|
31
|
+
return {
|
|
32
|
+
...trace,
|
|
33
|
+
events: [...trace.events, {
|
|
34
|
+
id: randomUUID(),
|
|
35
|
+
runId: trace.id,
|
|
36
|
+
type,
|
|
37
|
+
payload,
|
|
38
|
+
createdAt: now.toISOString()
|
|
39
|
+
}]
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function finishAgentRunTrace(trace, status, payload = {}, now = /* @__PURE__ */ new Date()) {
|
|
43
|
+
if (trace.status !== "running") throw new Error(`Cannot finish ${trace.status} run`);
|
|
44
|
+
return {
|
|
45
|
+
...appendAgentRunEvent(trace, status === "failed" ? "run.failed" : "run.completed", payload, now),
|
|
46
|
+
status,
|
|
47
|
+
endedAt: now.toISOString()
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
//#endregion
|
|
51
|
+
export { appendAgentRunEvent, createAgentRunTrace, finishAgentRunTrace, hashEffectiveManifest };
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=run-trace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-trace.js","names":[],"sources":["../../../src/agent-runtime/run-trace.ts"],"sourcesContent":["import { createHash, randomUUID } from 'node:crypto';\n\nimport type { EffectiveAgentManifest } from '../agent-manifest/schema.js';\n\nexport type AgentRunStatus = 'running' | 'completed' | 'failed' | 'cancelled';\n\nexport type AgentRunEventType =\n | 'run.started'\n | 'model.selected'\n | 'tool.called'\n | 'memory.read'\n | 'memory.write.checked'\n | 'workflow.selected'\n | 'boundary.checked'\n | 'run.completed'\n | 'run.failed';\n\nexport interface AgentRunEvent {\n id: string;\n runId: string;\n type: AgentRunEventType;\n payload: Record<string, unknown>;\n createdAt: string;\n}\n\nexport interface AgentRunTrace {\n id: string;\n agentId: string;\n status: AgentRunStatus;\n effectiveManifestHash: string;\n startedAt: string;\n endedAt?: string;\n events: AgentRunEvent[];\n}\n\nfunction stableJson(value: unknown): string {\n if (Array.isArray(value)) {\n return `[${value.map(stableJson).join(',')}]`;\n }\n if (value && typeof value === 'object') {\n return `{${Object.entries(value as Record<string, unknown>)\n .toSorted(([a], [b]) => a.localeCompare(b))\n .map(([key, child]) => `${JSON.stringify(key)}:${stableJson(child)}`)\n .join(',')}}`;\n }\n return JSON.stringify(value);\n}\n\nexport function hashEffectiveManifest(manifest: EffectiveAgentManifest): string {\n return createHash('sha256').update(stableJson(manifest)).digest('hex');\n}\n\nexport function createAgentRunTrace(params: {\n agentId: string;\n manifest: EffectiveAgentManifest;\n now?: Date;\n}): AgentRunTrace {\n const startedAt = (params.now ?? new Date()).toISOString();\n const runId = randomUUID();\n return {\n id: runId,\n agentId: params.agentId,\n status: 'running',\n effectiveManifestHash: hashEffectiveManifest(params.manifest),\n startedAt,\n events: [\n {\n id: randomUUID(),\n runId,\n type: 'run.started',\n payload: { agentId: params.agentId },\n createdAt: startedAt,\n },\n ],\n };\n}\n\nexport function appendAgentRunEvent(\n trace: AgentRunTrace,\n type: AgentRunEventType,\n payload: Record<string, unknown>,\n now = new Date(),\n): AgentRunTrace {\n if (trace.status !== 'running') {\n throw new Error(`Cannot append event to ${trace.status} run`);\n }\n return {\n ...trace,\n events: [\n ...trace.events,\n {\n id: randomUUID(),\n runId: trace.id,\n type,\n payload,\n createdAt: now.toISOString(),\n },\n ],\n };\n}\n\nexport function finishAgentRunTrace(\n trace: AgentRunTrace,\n status: Exclude<AgentRunStatus, 'running'>,\n payload: Record<string, unknown> = {},\n now = new Date(),\n): AgentRunTrace {\n if (trace.status !== 'running') {\n throw new Error(`Cannot finish ${trace.status} run`);\n }\n const eventType: AgentRunEventType = status === 'failed' ? 'run.failed' : 'run.completed';\n const next = appendAgentRunEvent(trace, eventType, payload, now);\n return {\n ...next,\n status,\n endedAt: now.toISOString(),\n };\n}\n"],"mappings":";;AAmCA,SAAS,WAAW,OAAwB;AAC1C,KAAI,MAAM,QAAQ,MAAM,CACtB,QAAO,IAAI,MAAM,IAAI,WAAW,CAAC,KAAK,IAAI,CAAC;AAE7C,KAAI,SAAS,OAAO,UAAU,SAC5B,QAAO,IAAI,OAAO,QAAQ,MAAiC,CACxD,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC,CAC1C,KAAK,CAAC,KAAK,WAAW,GAAG,KAAK,UAAU,IAAI,CAAC,GAAG,WAAW,MAAM,GAAG,CACpE,KAAK,IAAI,CAAC;AAEf,QAAO,KAAK,UAAU,MAAM;;AAG9B,SAAgB,sBAAsB,UAA0C;AAC9E,QAAO,WAAW,SAAS,CAAC,OAAO,WAAW,SAAS,CAAC,CAAC,OAAO,MAAM;;AAGxE,SAAgB,oBAAoB,QAIlB;CAChB,MAAM,aAAa,OAAO,uBAAO,IAAI,MAAM,EAAE,aAAa;CAC1D,MAAM,QAAQ,YAAY;AAC1B,QAAO;EACL,IAAI;EACJ,SAAS,OAAO;EAChB,QAAQ;EACR,uBAAuB,sBAAsB,OAAO,SAAS;EAC7D;EACA,QAAQ,CACN;GACE,IAAI,YAAY;GAChB;GACA,MAAM;GACN,SAAS,EAAE,SAAS,OAAO,SAAS;GACpC,WAAW;GACZ,CACF;EACF;;AAGH,SAAgB,oBACd,OACA,MACA,SACA,sBAAM,IAAI,MAAM,EACD;AACf,KAAI,MAAM,WAAW,UACnB,OAAM,IAAI,MAAM,0BAA0B,MAAM,OAAO,MAAM;AAE/D,QAAO;EACL,GAAG;EACH,QAAQ,CACN,GAAG,MAAM,QACT;GACE,IAAI,YAAY;GAChB,OAAO,MAAM;GACb;GACA;GACA,WAAW,IAAI,aAAa;GAC7B,CACF;EACF;;AAGH,SAAgB,oBACd,OACA,QACA,UAAmC,EAAE,EACrC,sBAAM,IAAI,MAAM,EACD;AACf,KAAI,MAAM,WAAW,UACnB,OAAM,IAAI,MAAM,iBAAiB,MAAM,OAAO,MAAM;AAItD,QAAO;EACL,GAFW,oBAAoB,OADI,WAAW,WAAW,eAAe,iBACvB,SAAS,IAEnD;EACP;EACA,SAAS,IAAI,aAAa;EAC3B"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type EffectiveAgentManifest } from '../agent-manifest/index.js';
|
|
2
|
+
import { checkBoundary } from './boundary-guard.js';
|
|
3
|
+
import { type MemoryRuntime } from './memory-runtime.js';
|
|
4
|
+
import { resolveModelRole } from './model-router.js';
|
|
5
|
+
import { type RuntimeToolRegistry, type ToolCatalogEntry } from './tool-registry.js';
|
|
6
|
+
import { type WorkflowCatalogEntry, type WorkflowResolution, type WorkflowValidationIssue } from './workflow-runtime.js';
|
|
7
|
+
export interface AgentRuntimeProfile<TTool = unknown> {
|
|
8
|
+
manifest: EffectiveAgentManifest;
|
|
9
|
+
promptSections: {
|
|
10
|
+
capability: string;
|
|
11
|
+
};
|
|
12
|
+
tools: RuntimeToolRegistry<TTool>;
|
|
13
|
+
memory: MemoryRuntime;
|
|
14
|
+
resolveModel: (role?: string) => ReturnType<typeof resolveModelRole>;
|
|
15
|
+
checkBoundary: (action: string, detail?: string) => ReturnType<typeof checkBoundary>;
|
|
16
|
+
resolveWorkflow: (intent?: string) => WorkflowResolution;
|
|
17
|
+
validateWorkflow: (workflow: WorkflowCatalogEntry) => WorkflowValidationIssue[];
|
|
18
|
+
}
|
|
19
|
+
export interface BuildAgentRuntimeProfileParams<TTool = unknown> {
|
|
20
|
+
manifest: EffectiveAgentManifest;
|
|
21
|
+
toolCatalog: Iterable<ToolCatalogEntry<TTool>>;
|
|
22
|
+
workflowCatalog?: Iterable<WorkflowCatalogEntry>;
|
|
23
|
+
}
|
|
24
|
+
export declare function buildAgentRuntimeProfile<TTool = unknown>(params: BuildAgentRuntimeProfileParams<TTool>): AgentRuntimeProfile<TTool>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { buildAgentManifestPromptSection } from "../agent-manifest/prompt.js";
|
|
2
|
+
import "../agent-manifest/index.js";
|
|
3
|
+
import { checkBoundary } from "./boundary-guard.js";
|
|
4
|
+
import { resolveModelRole } from "./model-router.js";
|
|
5
|
+
import { buildRuntimeToolRegistry } from "./tool-registry.js";
|
|
6
|
+
import { buildMemoryRuntime } from "./memory-runtime.js";
|
|
7
|
+
import { resolveWorkflow, validateWorkflowForRuntime } from "./workflow-runtime.js";
|
|
8
|
+
//#region src/agent-runtime/runtime-profile.ts
|
|
9
|
+
function buildAgentRuntimeProfile(params) {
|
|
10
|
+
const workflowCatalog = [...params.workflowCatalog ?? []];
|
|
11
|
+
const tools = buildRuntimeToolRegistry({
|
|
12
|
+
manifest: params.manifest,
|
|
13
|
+
catalog: params.toolCatalog
|
|
14
|
+
});
|
|
15
|
+
return {
|
|
16
|
+
manifest: params.manifest,
|
|
17
|
+
promptSections: { capability: buildAgentManifestPromptSection(params.manifest) },
|
|
18
|
+
tools,
|
|
19
|
+
memory: buildMemoryRuntime(params.manifest),
|
|
20
|
+
resolveModel: (role) => resolveModelRole({
|
|
21
|
+
manifest: params.manifest,
|
|
22
|
+
role
|
|
23
|
+
}),
|
|
24
|
+
checkBoundary: (action, detail) => checkBoundary({
|
|
25
|
+
manifest: params.manifest,
|
|
26
|
+
action,
|
|
27
|
+
detail
|
|
28
|
+
}),
|
|
29
|
+
resolveWorkflow: (intent) => resolveWorkflow({
|
|
30
|
+
manifest: params.manifest,
|
|
31
|
+
catalog: workflowCatalog,
|
|
32
|
+
intent
|
|
33
|
+
}),
|
|
34
|
+
validateWorkflow: (workflow) => validateWorkflowForRuntime({
|
|
35
|
+
manifest: params.manifest,
|
|
36
|
+
workflow,
|
|
37
|
+
tools
|
|
38
|
+
})
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//#endregion
|
|
42
|
+
export { buildAgentRuntimeProfile };
|
|
43
|
+
|
|
44
|
+
//# sourceMappingURL=runtime-profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-profile.js","names":[],"sources":["../../../src/agent-runtime/runtime-profile.ts"],"sourcesContent":["import {\n buildAgentManifestPromptSection,\n type EffectiveAgentManifest,\n} from '../agent-manifest/index.js';\nimport { checkBoundary } from './boundary-guard.js';\nimport { buildMemoryRuntime, type MemoryRuntime } from './memory-runtime.js';\nimport { resolveModelRole } from './model-router.js';\nimport {\n buildRuntimeToolRegistry,\n type RuntimeToolRegistry,\n type ToolCatalogEntry,\n} from './tool-registry.js';\nimport {\n resolveWorkflow,\n validateWorkflowForRuntime,\n type WorkflowCatalogEntry,\n type WorkflowResolution,\n type WorkflowValidationIssue,\n} from './workflow-runtime.js';\n\nexport interface AgentRuntimeProfile<TTool = unknown> {\n manifest: EffectiveAgentManifest;\n promptSections: {\n capability: string;\n };\n tools: RuntimeToolRegistry<TTool>;\n memory: MemoryRuntime;\n resolveModel: (role?: string) => ReturnType<typeof resolveModelRole>;\n checkBoundary: (action: string, detail?: string) => ReturnType<typeof checkBoundary>;\n resolveWorkflow: (intent?: string) => WorkflowResolution;\n validateWorkflow: (workflow: WorkflowCatalogEntry) => WorkflowValidationIssue[];\n}\n\nexport interface BuildAgentRuntimeProfileParams<TTool = unknown> {\n manifest: EffectiveAgentManifest;\n toolCatalog: Iterable<ToolCatalogEntry<TTool>>;\n workflowCatalog?: Iterable<WorkflowCatalogEntry>;\n}\n\nexport function buildAgentRuntimeProfile<TTool = unknown>(\n params: BuildAgentRuntimeProfileParams<TTool>,\n): AgentRuntimeProfile<TTool> {\n const workflowCatalog = [...(params.workflowCatalog ?? [])];\n const tools = buildRuntimeToolRegistry({\n manifest: params.manifest,\n catalog: params.toolCatalog,\n });\n return {\n manifest: params.manifest,\n promptSections: {\n capability: buildAgentManifestPromptSection(params.manifest),\n },\n tools,\n memory: buildMemoryRuntime(params.manifest),\n resolveModel: (role?: string) => resolveModelRole({ manifest: params.manifest, role }),\n checkBoundary: (action: string, detail?: string) => checkBoundary({ manifest: params.manifest, action, detail }),\n resolveWorkflow: (intent?: string) => resolveWorkflow({ manifest: params.manifest, catalog: workflowCatalog, intent }),\n validateWorkflow: (workflow: WorkflowCatalogEntry) =>\n validateWorkflowForRuntime({ manifest: params.manifest, workflow, tools }),\n };\n}\n"],"mappings":";;;;;;;;AAuCA,SAAgB,yBACd,QAC4B;CAC5B,MAAM,kBAAkB,CAAC,GAAI,OAAO,mBAAmB,EAAE,CAAE;CAC3D,MAAM,QAAQ,yBAAyB;EACrC,UAAU,OAAO;EACjB,SAAS,OAAO;EACjB,CAAC;AACF,QAAO;EACL,UAAU,OAAO;EACjB,gBAAgB,EACd,YAAY,gCAAgC,OAAO,SAAS,EAC7D;EACD;EACA,QAAQ,mBAAmB,OAAO,SAAS;EAC3C,eAAe,SAAkB,iBAAiB;GAAE,UAAU,OAAO;GAAU;GAAM,CAAC;EACtF,gBAAgB,QAAgB,WAAoB,cAAc;GAAE,UAAU,OAAO;GAAU;GAAQ;GAAQ,CAAC;EAChH,kBAAkB,WAAoB,gBAAgB;GAAE,UAAU,OAAO;GAAU,SAAS;GAAiB;GAAQ,CAAC;EACtH,mBAAmB,aACjB,2BAA2B;GAAE,UAAU,OAAO;GAAU;GAAU;GAAO,CAAC;EAC7E"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { EffectiveAgentManifest, ToolPolicy } from '../agent-manifest/schema.js';
|
|
2
|
+
export interface ToolCatalogEntry<TTool = unknown> {
|
|
3
|
+
name: string;
|
|
4
|
+
category: 'file' | 'web' | 'code' | 'memory' | 'communication' | 'automation' | 'mcp' | 'other';
|
|
5
|
+
risk: 'low' | 'medium' | 'high';
|
|
6
|
+
supportsConfirm: boolean;
|
|
7
|
+
supportsDryRun?: boolean;
|
|
8
|
+
scopes?: Array<'readonly' | 'workspace' | 'unrestricted'>;
|
|
9
|
+
tool: TTool;
|
|
10
|
+
}
|
|
11
|
+
export interface RuntimeToolEntry<TTool = unknown> {
|
|
12
|
+
name: string;
|
|
13
|
+
policy: ToolPolicy;
|
|
14
|
+
catalog: ToolCatalogEntry<TTool>;
|
|
15
|
+
requiresConfirmation: boolean;
|
|
16
|
+
tool: TTool;
|
|
17
|
+
}
|
|
18
|
+
export interface BuildRuntimeToolRegistryParams<TTool = unknown> {
|
|
19
|
+
manifest: EffectiveAgentManifest;
|
|
20
|
+
catalog: Iterable<ToolCatalogEntry<TTool>>;
|
|
21
|
+
}
|
|
22
|
+
export interface RuntimeToolRegistry<TTool = unknown> {
|
|
23
|
+
tools: RuntimeToolEntry<TTool>[];
|
|
24
|
+
denied: string[];
|
|
25
|
+
missing: string[];
|
|
26
|
+
warnings: string[];
|
|
27
|
+
}
|
|
28
|
+
export declare function buildRuntimeToolRegistry<TTool = unknown>(params: BuildRuntimeToolRegistryParams<TTool>): RuntimeToolRegistry<TTool>;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
//#region src/agent-runtime/tool-registry.ts
|
|
2
|
+
function scopeSupported(entry, policy) {
|
|
3
|
+
if (!policy.scope) return true;
|
|
4
|
+
return !entry.scopes || entry.scopes.includes(policy.scope);
|
|
5
|
+
}
|
|
6
|
+
function buildRuntimeToolRegistry(params) {
|
|
7
|
+
const byName = new Map([...params.catalog].map((entry) => [entry.name, entry]));
|
|
8
|
+
const tools = [];
|
|
9
|
+
const denied = [];
|
|
10
|
+
const missing = [];
|
|
11
|
+
const warnings = [];
|
|
12
|
+
for (const [name, policy] of Object.entries(params.manifest.tools.builtin)) {
|
|
13
|
+
if (policy.mode === "deny") {
|
|
14
|
+
denied.push(name);
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
const entry = byName.get(name);
|
|
18
|
+
if (!entry) {
|
|
19
|
+
missing.push(name);
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
if (policy.mode === "confirm" && !entry.supportsConfirm) {
|
|
23
|
+
warnings.push(`tool "${name}" requires confirmation but does not support a confirm wrapper`);
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
if (!scopeSupported(entry, policy)) {
|
|
27
|
+
warnings.push(`tool "${name}" does not support scope "${policy.scope}"`);
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
tools.push({
|
|
31
|
+
name,
|
|
32
|
+
policy,
|
|
33
|
+
catalog: entry,
|
|
34
|
+
requiresConfirmation: policy.mode === "confirm",
|
|
35
|
+
tool: entry.tool
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
tools.sort((a, b) => a.name.localeCompare(b.name));
|
|
39
|
+
denied.sort();
|
|
40
|
+
missing.sort();
|
|
41
|
+
warnings.sort();
|
|
42
|
+
return {
|
|
43
|
+
tools,
|
|
44
|
+
denied,
|
|
45
|
+
missing,
|
|
46
|
+
warnings
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//#endregion
|
|
50
|
+
export { buildRuntimeToolRegistry };
|
|
51
|
+
|
|
52
|
+
//# sourceMappingURL=tool-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-registry.js","names":[],"sources":["../../../src/agent-runtime/tool-registry.ts"],"sourcesContent":["import type { EffectiveAgentManifest, ToolPolicy } from '../agent-manifest/schema.js';\n\nexport interface ToolCatalogEntry<TTool = unknown> {\n name: string;\n category: 'file' | 'web' | 'code' | 'memory' | 'communication' | 'automation' | 'mcp' | 'other';\n risk: 'low' | 'medium' | 'high';\n supportsConfirm: boolean;\n supportsDryRun?: boolean;\n scopes?: Array<'readonly' | 'workspace' | 'unrestricted'>;\n tool: TTool;\n}\n\nexport interface RuntimeToolEntry<TTool = unknown> {\n name: string;\n policy: ToolPolicy;\n catalog: ToolCatalogEntry<TTool>;\n requiresConfirmation: boolean;\n tool: TTool;\n}\n\nexport interface BuildRuntimeToolRegistryParams<TTool = unknown> {\n manifest: EffectiveAgentManifest;\n catalog: Iterable<ToolCatalogEntry<TTool>>;\n}\n\nexport interface RuntimeToolRegistry<TTool = unknown> {\n tools: RuntimeToolEntry<TTool>[];\n denied: string[];\n missing: string[];\n warnings: string[];\n}\n\nfunction scopeSupported(entry: ToolCatalogEntry, policy: ToolPolicy): boolean {\n if (!policy.scope) return true;\n return !entry.scopes || entry.scopes.includes(policy.scope);\n}\n\nexport function buildRuntimeToolRegistry<TTool = unknown>(\n params: BuildRuntimeToolRegistryParams<TTool>,\n): RuntimeToolRegistry<TTool> {\n const byName = new Map([...params.catalog].map((entry) => [entry.name, entry]));\n const tools: RuntimeToolEntry<TTool>[] = [];\n const denied: string[] = [];\n const missing: string[] = [];\n const warnings: string[] = [];\n\n for (const [name, policy] of Object.entries(params.manifest.tools.builtin)) {\n if (policy.mode === 'deny') {\n denied.push(name);\n continue;\n }\n const entry = byName.get(name);\n if (!entry) {\n missing.push(name);\n continue;\n }\n if (policy.mode === 'confirm' && !entry.supportsConfirm) {\n warnings.push(`tool \"${name}\" requires confirmation but does not support a confirm wrapper`);\n continue;\n }\n if (!scopeSupported(entry, policy)) {\n warnings.push(`tool \"${name}\" does not support scope \"${policy.scope}\"`);\n continue;\n }\n tools.push({\n name,\n policy,\n catalog: entry,\n requiresConfirmation: policy.mode === 'confirm',\n tool: entry.tool,\n });\n }\n\n tools.sort((a, b) => a.name.localeCompare(b.name));\n denied.sort();\n missing.sort();\n warnings.sort();\n\n return { tools, denied, missing, warnings };\n}\n"],"mappings":";AAgCA,SAAS,eAAe,OAAyB,QAA6B;AAC5E,KAAI,CAAC,OAAO,MAAO,QAAO;AAC1B,QAAO,CAAC,MAAM,UAAU,MAAM,OAAO,SAAS,OAAO,MAAM;;AAG7D,SAAgB,yBACd,QAC4B;CAC5B,MAAM,SAAS,IAAI,IAAI,CAAC,GAAG,OAAO,QAAQ,CAAC,KAAK,UAAU,CAAC,MAAM,MAAM,MAAM,CAAC,CAAC;CAC/E,MAAM,QAAmC,EAAE;CAC3C,MAAM,SAAmB,EAAE;CAC3B,MAAM,UAAoB,EAAE;CAC5B,MAAM,WAAqB,EAAE;AAE7B,MAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,OAAO,SAAS,MAAM,QAAQ,EAAE;AAC1E,MAAI,OAAO,SAAS,QAAQ;AAC1B,UAAO,KAAK,KAAK;AACjB;;EAEF,MAAM,QAAQ,OAAO,IAAI,KAAK;AAC9B,MAAI,CAAC,OAAO;AACV,WAAQ,KAAK,KAAK;AAClB;;AAEF,MAAI,OAAO,SAAS,aAAa,CAAC,MAAM,iBAAiB;AACvD,YAAS,KAAK,SAAS,KAAK,gEAAgE;AAC5F;;AAEF,MAAI,CAAC,eAAe,OAAO,OAAO,EAAE;AAClC,YAAS,KAAK,SAAS,KAAK,4BAA4B,OAAO,MAAM,GAAG;AACxE;;AAEF,QAAM,KAAK;GACT;GACA;GACA,SAAS;GACT,sBAAsB,OAAO,SAAS;GACtC,MAAM,MAAM;GACb,CAAC;;AAGJ,OAAM,MAAM,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,KAAK,CAAC;AAClD,QAAO,MAAM;AACb,SAAQ,MAAM;AACd,UAAS,MAAM;AAEf,QAAO;EAAE;EAAO;EAAQ;EAAS;EAAU"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { EffectiveAgentManifest } from '../agent-manifest/schema.js';
|
|
2
|
+
import type { RuntimeToolRegistry } from './tool-registry.js';
|
|
3
|
+
export interface WorkflowPhaseDefinition {
|
|
4
|
+
id: string;
|
|
5
|
+
modelRole?: string;
|
|
6
|
+
requiredTools?: string[];
|
|
7
|
+
}
|
|
8
|
+
export interface WorkflowCatalogEntry {
|
|
9
|
+
id: string;
|
|
10
|
+
description?: string;
|
|
11
|
+
phases: WorkflowPhaseDefinition[];
|
|
12
|
+
}
|
|
13
|
+
export interface ResolveWorkflowParams {
|
|
14
|
+
manifest: EffectiveAgentManifest;
|
|
15
|
+
catalog: Iterable<WorkflowCatalogEntry>;
|
|
16
|
+
intent?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface WorkflowResolution {
|
|
19
|
+
workflow?: WorkflowCatalogEntry;
|
|
20
|
+
reason: string;
|
|
21
|
+
}
|
|
22
|
+
export interface WorkflowValidationIssue {
|
|
23
|
+
path: string;
|
|
24
|
+
message: string;
|
|
25
|
+
}
|
|
26
|
+
export declare function resolveWorkflow(params: ResolveWorkflowParams): WorkflowResolution;
|
|
27
|
+
export declare function validateWorkflowForRuntime(params: {
|
|
28
|
+
manifest: EffectiveAgentManifest;
|
|
29
|
+
workflow: WorkflowCatalogEntry;
|
|
30
|
+
tools: RuntimeToolRegistry;
|
|
31
|
+
}): WorkflowValidationIssue[];
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
//#region src/agent-runtime/workflow-runtime.ts
|
|
2
|
+
function resolveWorkflow(params) {
|
|
3
|
+
const catalog = new Map([...params.catalog].map((workflow) => [workflow.id, workflow]));
|
|
4
|
+
const intent = params.intent?.trim().toLowerCase();
|
|
5
|
+
const suggested = intent ? params.manifest.workflows.suggested?.find((entry) => entry.intent.toLowerCase() === intent) : void 0;
|
|
6
|
+
const id = suggested?.workflow ?? params.manifest.workflows.default;
|
|
7
|
+
if (!id) return { reason: "no workflow configured" };
|
|
8
|
+
if (params.manifest.workflows.allowed && !params.manifest.workflows.allowed.includes(id)) return { reason: `workflow "${id}" is not allowed by manifest` };
|
|
9
|
+
const workflow = catalog.get(id);
|
|
10
|
+
if (!workflow) return { reason: `workflow "${id}" is not in the workflow catalog` };
|
|
11
|
+
return {
|
|
12
|
+
workflow,
|
|
13
|
+
reason: suggested ? `matched intent "${suggested.intent}"` : "using default workflow"
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function validateWorkflowForRuntime(params) {
|
|
17
|
+
const issues = [];
|
|
18
|
+
const availableTools = new Set(params.tools.tools.map((entry) => entry.name));
|
|
19
|
+
for (const [phaseIndex, phase] of params.workflow.phases.entries()) {
|
|
20
|
+
if (phase.modelRole && !params.manifest.models.roles[phase.modelRole]) issues.push({
|
|
21
|
+
path: `phases.${phaseIndex}.modelRole`,
|
|
22
|
+
message: `model role "${phase.modelRole}" is not configured`
|
|
23
|
+
});
|
|
24
|
+
for (const toolName of phase.requiredTools ?? []) if (!availableTools.has(toolName)) issues.push({
|
|
25
|
+
path: `phases.${phaseIndex}.requiredTools`,
|
|
26
|
+
message: `required tool "${toolName}" is not available at runtime`
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
return issues;
|
|
30
|
+
}
|
|
31
|
+
//#endregion
|
|
32
|
+
export { resolveWorkflow, validateWorkflowForRuntime };
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=workflow-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-runtime.js","names":[],"sources":["../../../src/agent-runtime/workflow-runtime.ts"],"sourcesContent":["import type { EffectiveAgentManifest } from '../agent-manifest/schema.js';\nimport type { RuntimeToolRegistry } from './tool-registry.js';\n\nexport interface WorkflowPhaseDefinition {\n id: string;\n modelRole?: string;\n requiredTools?: string[];\n}\n\nexport interface WorkflowCatalogEntry {\n id: string;\n description?: string;\n phases: WorkflowPhaseDefinition[];\n}\n\nexport interface ResolveWorkflowParams {\n manifest: EffectiveAgentManifest;\n catalog: Iterable<WorkflowCatalogEntry>;\n intent?: string;\n}\n\nexport interface WorkflowResolution {\n workflow?: WorkflowCatalogEntry;\n reason: string;\n}\n\nexport interface WorkflowValidationIssue {\n path: string;\n message: string;\n}\n\nexport function resolveWorkflow(params: ResolveWorkflowParams): WorkflowResolution {\n const catalog = new Map([...params.catalog].map((workflow) => [workflow.id, workflow]));\n const intent = params.intent?.trim().toLowerCase();\n const suggested = intent\n ? params.manifest.workflows.suggested?.find((entry) => entry.intent.toLowerCase() === intent)\n : undefined;\n const id = suggested?.workflow ?? params.manifest.workflows.default;\n if (!id) {\n return { reason: 'no workflow configured' };\n }\n if (params.manifest.workflows.allowed && !params.manifest.workflows.allowed.includes(id)) {\n return { reason: `workflow \"${id}\" is not allowed by manifest` };\n }\n const workflow = catalog.get(id);\n if (!workflow) {\n return { reason: `workflow \"${id}\" is not in the workflow catalog` };\n }\n return {\n workflow,\n reason: suggested ? `matched intent \"${suggested.intent}\"` : 'using default workflow',\n };\n}\n\nexport function validateWorkflowForRuntime(params: {\n manifest: EffectiveAgentManifest;\n workflow: WorkflowCatalogEntry;\n tools: RuntimeToolRegistry;\n}): WorkflowValidationIssue[] {\n const issues: WorkflowValidationIssue[] = [];\n const availableTools = new Set(params.tools.tools.map((entry) => entry.name));\n for (const [phaseIndex, phase] of params.workflow.phases.entries()) {\n if (phase.modelRole && !params.manifest.models.roles[phase.modelRole]) {\n issues.push({\n path: `phases.${phaseIndex}.modelRole`,\n message: `model role \"${phase.modelRole}\" is not configured`,\n });\n }\n for (const toolName of phase.requiredTools ?? []) {\n if (!availableTools.has(toolName)) {\n issues.push({\n path: `phases.${phaseIndex}.requiredTools`,\n message: `required tool \"${toolName}\" is not available at runtime`,\n });\n }\n }\n }\n return issues;\n}\n"],"mappings":";AA+BA,SAAgB,gBAAgB,QAAmD;CACjF,MAAM,UAAU,IAAI,IAAI,CAAC,GAAG,OAAO,QAAQ,CAAC,KAAK,aAAa,CAAC,SAAS,IAAI,SAAS,CAAC,CAAC;CACvF,MAAM,SAAS,OAAO,QAAQ,MAAM,CAAC,aAAa;CAClD,MAAM,YAAY,SACd,OAAO,SAAS,UAAU,WAAW,MAAM,UAAU,MAAM,OAAO,aAAa,KAAK,OAAO,GAC3F,KAAA;CACJ,MAAM,KAAK,WAAW,YAAY,OAAO,SAAS,UAAU;AAC5D,KAAI,CAAC,GACH,QAAO,EAAE,QAAQ,0BAA0B;AAE7C,KAAI,OAAO,SAAS,UAAU,WAAW,CAAC,OAAO,SAAS,UAAU,QAAQ,SAAS,GAAG,CACtF,QAAO,EAAE,QAAQ,aAAa,GAAG,+BAA+B;CAElE,MAAM,WAAW,QAAQ,IAAI,GAAG;AAChC,KAAI,CAAC,SACH,QAAO,EAAE,QAAQ,aAAa,GAAG,mCAAmC;AAEtE,QAAO;EACL;EACA,QAAQ,YAAY,mBAAmB,UAAU,OAAO,KAAK;EAC9D;;AAGH,SAAgB,2BAA2B,QAIb;CAC5B,MAAM,SAAoC,EAAE;CAC5C,MAAM,iBAAiB,IAAI,IAAI,OAAO,MAAM,MAAM,KAAK,UAAU,MAAM,KAAK,CAAC;AAC7E,MAAK,MAAM,CAAC,YAAY,UAAU,OAAO,SAAS,OAAO,SAAS,EAAE;AAClE,MAAI,MAAM,aAAa,CAAC,OAAO,SAAS,OAAO,MAAM,MAAM,WACzD,QAAO,KAAK;GACV,MAAM,UAAU,WAAW;GAC3B,SAAS,eAAe,MAAM,UAAU;GACzC,CAAC;AAEJ,OAAK,MAAM,YAAY,MAAM,iBAAiB,EAAE,CAC9C,KAAI,CAAC,eAAe,IAAI,SAAS,CAC/B,QAAO,KAAK;GACV,MAAM,UAAU,WAAW;GAC3B,SAAS,kBAAkB,SAAS;GACrC,CAAC;;AAIR,QAAO"}
|
|
@@ -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 { getApiKey, getDefaultModelSync, init_providers, resolveModel } from "../providers/index.js";
|
|
4
|
-
import { getAssistantMessageErrorReason, stripCodeFences } from "../agent/goals/judge.js";
|
|
5
4
|
import { createExtensionAwareStreamFn } from "../providers/extension-stream-bridge.js";
|
|
5
|
+
import { getAssistantMessageErrorReason, stripCodeFences } from "../agent/goals/judge.js";
|
|
6
6
|
//#region src/ai-assist/text-assist.ts
|
|
7
7
|
init_providers();
|
|
8
8
|
init_logger();
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
-
import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
|
|
3
|
-
import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveCredentialsDir, resolveOAuthPath } from "../config/paths.js";
|
|
4
2
|
import { createLogger } from "../utils/logger/index.js";
|
|
5
3
|
import { init_logger } from "../utils/logger.js";
|
|
4
|
+
import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveCredentialsDir, resolveOAuthPath } from "../config/paths.js";
|
|
5
|
+
import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
|
|
6
6
|
import { getApiKeyFromEnv, init_env_keys } from "../providers/env-keys.js";
|
|
7
7
|
import { dirname, join } from "path";
|
|
8
8
|
import { mkdir, readFile, readdir, rm } from "fs/promises";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
|
|
2
1
|
import { init_paths, resolveCredentialsDir } from "../../config/paths.js";
|
|
3
|
-
import {
|
|
2
|
+
import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
|
|
4
3
|
import path from "node:path";
|
|
4
|
+
import { chmodSync, existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
5
5
|
//#region src/auth/profiles/store.ts
|
|
6
6
|
/**
|
|
7
7
|
* Auth Profile Store
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
|
|
2
3
|
import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveOAuthPath } from "../config/paths.js";
|
|
3
4
|
import { init_loader, loadConfig } from "../config/loader.js";
|
|
4
|
-
import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
|
|
5
5
|
import { existsSync, readFileSync } from "node:fs";
|
|
6
6
|
//#region src/auth/sync-provider-auth.ts
|
|
7
7
|
/**
|
|
@@ -59,7 +59,7 @@ async function runExtensionRegistryAction(name, ctx, args) {
|
|
|
59
59
|
const ext = ctx.manager.getExtensionProvider();
|
|
60
60
|
if (!ext) return fail(name, "NO_EXTENSION", "Extension backend not connected");
|
|
61
61
|
const timeout = toMs(ctx);
|
|
62
|
-
const allowPrivate =
|
|
62
|
+
const allowPrivate = false;
|
|
63
63
|
switch (name) {
|
|
64
64
|
case "open":
|
|
65
65
|
case "navigate": {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension-registry-bridge.js","names":["d"],"sources":["../../../../src/browser/actions/extension-registry-bridge.ts"],"sourcesContent":["/**\n * Runs browser registry actions against the Chrome Extension bridge (no Playwright page).\n */\n\nimport { assertBrowserUrlAllowed, checkPostRedirectUrl, containsApiKeyPattern } from '../url-policy.js';\nimport { checkWebsiteBlocklist } from '../../agent/tools/url-safety.js';\nimport { resolveBrowserCommandTimeoutMs } from '../browser-command-timeout.js';\nimport { truncateSnapshotAtBoundary } from '../snapshot-helpers.js';\nimport { isTruthyValue, resolvePath, valueContains } from '../pipeline/template.js';\n\nimport type { BrowserActionContext, BrowserActionResult } from './types.js';\n\nconst DEFAULT_SNAPSHOT_MAX = 30_000;\nconst AUTO_SNAPSHOT_MAX = 8_000;\n\nfunction toMs(ctx: BrowserActionContext): number {\n return resolveBrowserCommandTimeoutMs(ctx.config);\n}\n\nfunction ok(action: string, text: string, data?: unknown, artifacts?: BrowserActionResult['artifacts']): BrowserActionResult {\n return { ok: true, action, text, data, artifacts };\n}\n\nfunction fail(action: string, code: string, message: string, diagnostics?: BrowserActionResult['diagnostics']): BrowserActionResult {\n return { ok: false, action, error: { code, message }, diagnostics };\n}\n\nfunction pipelineLast(ctx: BrowserActionContext): unknown {\n return ctx.pipeline?.last;\n}\n\nfunction valueFromArgs(ctx: BrowserActionContext, args: Record<string, unknown>): unknown {\n if ('value' in args) return args.value;\n if (typeof args.path === 'string') return resolvePath(pipelineLast(ctx), args.path);\n return pipelineLast(ctx);\n}\n\nfunction compareValues(a: unknown, b: unknown): number {\n const av = typeof a === 'number' ? a : String(a ?? '');\n const bv = typeof b === 'number' ? b : String(b ?? '');\n if (av < bv) return -1;\n if (av > bv) return 1;\n return 0;\n}\n\nfunction formatAxSnapshot(data: unknown, maxLen: number): string {\n const d = data as { nodes?: Array<{ role?: string; name?: string }> } | undefined;\n const nodes = d?.nodes ?? [];\n if (nodes.length === 0) return '(empty snapshot)';\n const lines = nodes.map((n) => `${n.role ?? '?'}: ${n.name ?? ''}`);\n let text = lines.join('\\n');\n if (text.length > maxLen) text = truncateSnapshotAtBoundary(text, maxLen);\n return text;\n}\n\nexport async function runExtensionRegistryAction(\n name: string,\n ctx: BrowserActionContext,\n args: Record<string, unknown>,\n): Promise<BrowserActionResult> {\n if (ctx.signal?.aborted) {\n return fail(name, 'ABORTED', 'Operation was aborted');\n }\n const ext = ctx.manager.getExtensionProvider();\n if (!ext) {\n return fail(name, 'NO_EXTENSION', 'Extension backend not connected');\n }\n\n const timeout = toMs(ctx);\n const allowPrivate = ctx.config?.agents?.defaults?.browser?.allowPrivateUrls === true;\n\n switch (name) {\n case 'open':\n case 'navigate': {\n const url = String(args.url ?? '');\n if (!url) return fail(name, 'MISSING_URL', 'url is required');\n if (containsApiKeyPattern(url)) return fail(name, 'BLOCKED', 'URL contains API key/token');\n const block = checkWebsiteBlocklist(url, ctx.config?.tools?.web?.blocklist);\n if (block) return fail(name, 'BLOCKED', block.message);\n assertBrowserUrlAllowed(url, { allowPrivateUrls: allowPrivate });\n\n const r = await ext.sendCommand('navigate', { url }, { timeout });\n if (!r.ok) return fail(name, 'NAVIGATE_FAILED', r.error ?? 'navigate failed');\n\n const data = r.data as { url?: string; title?: string } | undefined;\n const finalUrl = data?.url ?? url;\n const title = data?.title ?? '';\n\n if (finalUrl && finalUrl !== url) {\n const redirectBlock = checkPostRedirectUrl(finalUrl, { allowPrivateUrls: allowPrivate });\n if (redirectBlock) {\n await ext.sendCommand('navigate', { url: 'about:blank' }, { timeout: Math.min(10_000, timeout) }).catch(() => {});\n return fail(name, 'REDIRECT_BLOCKED', redirectBlock);\n }\n }\n\n let snapshot = '';\n try {\n const snap = await ext.sendCommand('snapshot', {}, { timeout });\n if (snap.ok && snap.data) {\n snapshot = formatAxSnapshot(snap.data, AUTO_SNAPSHOT_MAX);\n }\n } catch {\n /* non-fatal */\n }\n\n const text = `Navigated to: ${title}\\nURL: ${finalUrl}${snapshot ? `\\n--- Page Snapshot ---\\n${snapshot}` : ''}`;\n return ok(name, text, { url: finalUrl, title });\n }\n\n case 'state':\n case 'snapshot': {\n const maxLen = typeof args.maxLength === 'number' ? args.maxLength : DEFAULT_SNAPSHOT_MAX;\n if (args.selector && String(args.selector).trim()) {\n return fail(name, 'NOT_SUPPORTED', 'selector-scoped state is not supported with the Chrome Extension backend');\n }\n const r = await ext.sendCommand('snapshot', {}, { timeout });\n if (!r.ok) return fail(name, 'SNAPSHOT_FAILED', r.error ?? 'snapshot failed');\n const body = formatAxSnapshot(r.data, maxLen);\n const data = r.data as { url?: string; title?: string } | undefined;\n const header = data?.url ? `URL: ${data.url}\\nTitle: ${data.title ?? ''}\\n\\n` : '';\n return ok(name, `${header}--- Page Snapshot ---\\n${body}`, { length: body.length });\n }\n\n case 'click': {\n const selector = args.selector as string | undefined;\n const text = args.text as string | undefined;\n const role = args.role as string | undefined;\n if (role?.trim()) {\n return fail(name, 'NOT_SUPPORTED', 'role-based click is not supported with the Chrome Extension backend; use selector or text');\n }\n const n = (Boolean(selector?.trim()) ? 1 : 0) + (Boolean(text?.trim()) ? 1 : 0);\n if (n !== 1) {\n return fail(name, 'INVALID_ARGS', 'Provide exactly one of: selector, text');\n }\n const r = await ext.sendCommand('click', { selector: selector?.trim(), text: text?.trim() }, { timeout });\n if (!r.ok) return fail(name, 'CLICK_FAILED', r.error ?? 'click failed');\n return ok(name, 'Click succeeded.');\n }\n\n case 'type':\n case 'input': {\n const selector = args.selector as string | undefined;\n const label = args.label as string | undefined;\n if (label?.trim() && !selector?.trim()) {\n return fail(name, 'NOT_SUPPORTED', 'label-based typing is not supported with the Chrome Extension backend; use selector');\n }\n const text = String(args.text ?? '');\n if (!text) return fail(name, 'MISSING_TEXT', 'text is required');\n const r = await ext.sendCommand(\n 'type',\n { selector: selector?.trim(), text, pressEnter: args.pressEnter === true },\n { timeout },\n );\n if (!r.ok) return fail(name, 'TYPE_FAILED', r.error ?? 'type failed');\n return ok(name, 'Typed into field.');\n }\n\n case 'scroll': {\n const direction = (args.direction as string) ?? 'down';\n const amount = typeof args.amount === 'number' ? args.amount : 500;\n const deltaY = direction === 'down' ? amount : -amount;\n const r = await ext.sendCommand('scroll', { deltaY }, { timeout });\n if (!r.ok) return fail(name, 'SCROLL_FAILED', r.error ?? 'scroll failed');\n return ok(name, `Scrolled ${direction} by ${amount}px.`);\n }\n\n case 'back': {\n const r = await ext.sendCommand('back', {}, { timeout });\n if (!r.ok) return fail(name, 'BACK_FAILED', r.error ?? 'back failed');\n const data = r.data as { url?: string; title?: string } | undefined;\n return ok(name, `Navigated back to: ${data?.title ?? ''}\\nURL: ${data?.url ?? ''}`, { url: data?.url, title: data?.title });\n }\n\n case 'screenshot': {\n const fullPage = args.full_page === true || args.fullPage === true;\n const path = args.path as string | undefined;\n const selector = args.selector as string | undefined;\n if (selector?.trim()) {\n return fail(name, 'NOT_SUPPORTED', 'selector-scoped screenshots are not supported with the Chrome Extension backend');\n }\n const r = await ext.sendCommand('screenshot', { fullPage }, { timeout });\n if (!r.ok) return fail(name, 'SCREENSHOT_FAILED', r.error ?? 'screenshot failed');\n const b64 = (r.data as { base64?: string } | undefined)?.base64;\n if (!b64) return fail(name, 'SCREENSHOT_FAILED', 'no image data');\n const artifact = { type: 'screenshot' as const, path, data: b64, mimeType: 'image/png' };\n const approxBytes = Math.floor((b64.length * 3) / 4);\n return ok(name, `Screenshot captured (~${approxBytes} bytes).`, { bytes: approxBytes }, [artifact]);\n }\n\n case 'keys':\n case 'press': {\n const key = String(args.key ?? '');\n if (!key) return fail(name, 'MISSING_KEY', 'key is required');\n const r = await ext.sendCommand('keys', { key }, { timeout });\n if (!r.ok) return fail(name, 'PRESS_FAILED', r.error ?? 'keys failed');\n return ok(name, `Pressed key: ${key}`);\n }\n\n case 'console':\n case 'eval':\n case 'evaluate': {\n const js =\n (args.javascript as string) ?? (args.expression as string) ?? (args.code as string) ?? '';\n if (!js.trim()) return fail(name, 'MISSING_JS', 'javascript expression is required');\n const r = await ext.sendCommand('evaluate', { expression: js }, { timeout });\n if (!r.ok) return fail(name, 'EVAL_FAILED', r.error ?? 'evaluate failed');\n const result = (r.data as { result?: unknown } | undefined)?.result;\n const serialized = result === undefined ? 'undefined' : JSON.stringify(result, null, 2);\n const text =\n serialized.length > DEFAULT_SNAPSHOT_MAX\n ? `${serialized.slice(0, DEFAULT_SNAPSHOT_MAX)}\\n... (truncated)`\n : serialized;\n return ok(name, text, result);\n }\n\n case 'images': {\n const selector = args.selector as string | undefined;\n const maxImages = typeof args.maxImages === 'number' ? args.maxImages : 20;\n const expr = `(() => {\n const sel = ${JSON.stringify(selector?.trim() || null)};\n const max = ${JSON.stringify(maxImages)};\n const d = globalThis.document;\n const root = sel ? d.querySelector(sel) : d;\n if (!root) return [];\n const imgs = Array.from(root.querySelectorAll('img'));\n return imgs.slice(0, max).map((img) => ({\n src: String(img.src ?? ''),\n alt: String(img.alt ?? ''),\n width: Number(img.naturalWidth ?? 0),\n height: Number(img.naturalHeight ?? 0),\n }));\n })()`;\n const r = await ext.sendCommand('evaluate', { expression: expr }, { timeout });\n if (!r.ok) return fail(name, 'IMAGES_FAILED', r.error ?? 'evaluate failed');\n const images = (r.data as { result?: unknown[] } | undefined)?.result as\n | Array<{ src: string; alt: string; width: number; height: number }>\n | undefined;\n if (!images || images.length === 0) return ok(name, 'No images found on the page.', []);\n const lines = images.map(\n (img, i) => `${i + 1}. ${img.alt || '(no alt)'} — ${img.width}×${img.height}\\n ${img.src}`,\n );\n return ok(name, `Found ${images.length} image(s):\\n${lines.join('\\n')}`, images);\n }\n\n case 'dialog': {\n const action = args.action as string;\n if (action !== 'accept' && action !== 'dismiss') {\n return fail(name, 'INVALID_ACTION', 'action must be \"accept\" or \"dismiss\"');\n }\n const r = await ext.sendCommand('dialog', { accept: action === 'accept' }, { timeout });\n if (!r.ok) return fail(name, 'DIALOG_FAILED', r.error ?? 'dialog failed');\n return ok(name, `Dialog ${action}ed.`);\n }\n\n case 'close': {\n return ok(name, 'Browser page closed.');\n }\n\n case 'wait': {\n const selector = args.selector as string | undefined;\n const text = args.text as string | undefined;\n const timeoutMs = typeof args.timeout_ms === 'number' ? args.timeout_ms : timeout;\n if (text?.trim()) {\n return fail(name, 'NOT_SUPPORTED', 'text-based wait is not supported with the Chrome Extension backend; use selector or ms');\n }\n const extArgs: Record<string, unknown> = {};\n if (selector?.trim()) {\n extArgs.selector = selector.trim();\n } else {\n extArgs.ms = typeof args.ms === 'number' ? args.ms : 1000;\n }\n const r = await ext.sendCommand('wait', extArgs, { timeout: timeoutMs });\n if (!r.ok) return fail(name, 'WAIT_TIMEOUT', r.error ?? 'wait failed');\n return ok(name, 'Wait completed.');\n }\n\n case 'wait_for_timeout': {\n const ms = typeof args.ms === 'number' ? args.ms : typeof args.timeout_ms === 'number' ? args.timeout_ms : 1000;\n const r = await ext.sendCommand('wait', { ms }, { timeout: ms + 1000 });\n if (!r.ok) return fail(name, 'WAIT_TIMEOUT', r.error ?? 'wait failed');\n return ok(name, `Waited ${ms}ms.`);\n }\n\n case 'output':\n return ok(name, 'Output captured.', valueFromArgs(ctx, args));\n\n case 'assert': {\n const actual = valueFromArgs(ctx, args);\n if ('equals' in args && JSON.stringify(actual) !== JSON.stringify(args.equals)) {\n return fail(name, 'ASSERTION_FAILED', `Expected value to equal ${JSON.stringify(args.equals)}`);\n }\n if ('contains' in args && !valueContains(actual, args.contains)) {\n return fail(name, 'ASSERTION_FAILED', `Expected value to contain ${JSON.stringify(args.contains)}`);\n }\n if (args.truthy === true && !isTruthyValue(actual)) {\n return fail(name, 'ASSERTION_FAILED', 'Expected value to be truthy');\n }\n if (args.exists === true && (actual === undefined || actual === null || actual === '')) {\n return fail(name, 'ASSERTION_FAILED', 'Expected value to exist');\n }\n return ok(name, 'Assertion passed.');\n }\n\n case 'select': {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n const path = String(args.path ?? args.value ?? '');\n const value = path ? resolvePath(source, path) : source;\n return ok(name, typeof value === 'string' ? value : JSON.stringify(value, null, 2), value);\n }\n\n case 'map': {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n if (!Array.isArray(source)) return fail(name, 'INVALID_INPUT', 'map input must be an array');\n const path = String(args.path ?? '');\n const value = path ? source.map((item) => resolvePath(item, path)) : source;\n return ok(name, JSON.stringify(value, null, 2), value);\n }\n\n case 'filter': {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n if (!Array.isArray(source)) return fail(name, 'INVALID_INPUT', 'filter input must be an array');\n const path = String(args.path ?? '');\n const value = source.filter((item) => {\n const itemValue = path ? resolvePath(item, path) : item;\n if ('equals' in args) return JSON.stringify(itemValue) === JSON.stringify(args.equals);\n if ('contains' in args) return valueContains(itemValue, args.contains);\n return isTruthyValue(itemValue);\n });\n return ok(name, JSON.stringify(value, null, 2), value);\n }\n\n case 'sort': {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n if (!Array.isArray(source)) return fail(name, 'INVALID_INPUT', 'sort input must be an array');\n const path = String(args.path ?? '');\n const direction = String(args.direction ?? 'asc');\n const value = [...source].sort((a, b) => {\n const cmp = compareValues(path ? resolvePath(a, path) : a, path ? resolvePath(b, path) : b);\n return direction === 'desc' ? -cmp : cmp;\n });\n return ok(name, JSON.stringify(value, null, 2), value);\n }\n\n case 'limit': {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n if (!Array.isArray(source)) return fail(name, 'INVALID_INPUT', 'limit input must be an array');\n const count = Math.max(0, Number(args.count ?? args.limit ?? 10));\n const offset = Math.max(0, Number(args.offset ?? 0));\n const value = source.slice(offset, offset + count);\n return ok(name, JSON.stringify(value, null, 2), value);\n }\n\n case 'network_start':\n case 'network_events':\n case 'network_stop':\n case 'cdp':\n case 'wait_for_navigation':\n case 'wait_for_function':\n case 'wait_for_network_idle':\n case 'element_text':\n case 'element_attribute':\n case 'bounding_box':\n case 'set_input_files':\n case 'cookies':\n case 'get_cookies':\n case 'add_cookies':\n case 'clear_cookies':\n case 'tabs':\n case 'list_tabs':\n case 'new_tab':\n case 'switch_tab':\n case 'fetch':\n case 'collect':\n case 'tap':\n return fail(name, 'NOT_SUPPORTED', `Action \"${name}\" is not available with the Chrome Extension backend`);\n\n default:\n return fail(name, 'UNKNOWN_ACTION', `Unknown browser action: ${name}`);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extension-registry-bridge.js","names":["d"],"sources":["../../../../src/browser/actions/extension-registry-bridge.ts"],"sourcesContent":["/**\n * Runs browser registry actions against the Chrome Extension bridge (no Playwright page).\n */\n\nimport { assertBrowserUrlAllowed, checkPostRedirectUrl, containsApiKeyPattern } from '../url-policy.js';\nimport { checkWebsiteBlocklist } from '../../agent/tools/url-safety.js';\nimport { resolveBrowserCommandTimeoutMs } from '../browser-command-timeout.js';\nimport { truncateSnapshotAtBoundary } from '../snapshot-helpers.js';\nimport { isTruthyValue, resolvePath, valueContains } from '../pipeline/template.js';\n\nimport type { BrowserActionContext, BrowserActionResult } from './types.js';\n\nconst DEFAULT_SNAPSHOT_MAX = 30_000;\nconst AUTO_SNAPSHOT_MAX = 8_000;\n\nfunction toMs(ctx: BrowserActionContext): number {\n return resolveBrowserCommandTimeoutMs(ctx.config);\n}\n\nfunction ok(action: string, text: string, data?: unknown, artifacts?: BrowserActionResult['artifacts']): BrowserActionResult {\n return { ok: true, action, text, data, artifacts };\n}\n\nfunction fail(action: string, code: string, message: string, diagnostics?: BrowserActionResult['diagnostics']): BrowserActionResult {\n return { ok: false, action, error: { code, message }, diagnostics };\n}\n\nfunction pipelineLast(ctx: BrowserActionContext): unknown {\n return ctx.pipeline?.last;\n}\n\nfunction valueFromArgs(ctx: BrowserActionContext, args: Record<string, unknown>): unknown {\n if ('value' in args) return args.value;\n if (typeof args.path === 'string') return resolvePath(pipelineLast(ctx), args.path);\n return pipelineLast(ctx);\n}\n\nfunction compareValues(a: unknown, b: unknown): number {\n const av = typeof a === 'number' ? a : String(a ?? '');\n const bv = typeof b === 'number' ? b : String(b ?? '');\n if (av < bv) return -1;\n if (av > bv) return 1;\n return 0;\n}\n\nfunction formatAxSnapshot(data: unknown, maxLen: number): string {\n const d = data as { nodes?: Array<{ role?: string; name?: string }> } | undefined;\n const nodes = d?.nodes ?? [];\n if (nodes.length === 0) return '(empty snapshot)';\n const lines = nodes.map((n) => `${n.role ?? '?'}: ${n.name ?? ''}`);\n let text = lines.join('\\n');\n if (text.length > maxLen) text = truncateSnapshotAtBoundary(text, maxLen);\n return text;\n}\n\nexport async function runExtensionRegistryAction(\n name: string,\n ctx: BrowserActionContext,\n args: Record<string, unknown>,\n): Promise<BrowserActionResult> {\n if (ctx.signal?.aborted) {\n return fail(name, 'ABORTED', 'Operation was aborted');\n }\n const ext = ctx.manager.getExtensionProvider();\n if (!ext) {\n return fail(name, 'NO_EXTENSION', 'Extension backend not connected');\n }\n\n const timeout = toMs(ctx);\n const allowPrivate = false;\n\n switch (name) {\n case 'open':\n case 'navigate': {\n const url = String(args.url ?? '');\n if (!url) return fail(name, 'MISSING_URL', 'url is required');\n if (containsApiKeyPattern(url)) return fail(name, 'BLOCKED', 'URL contains API key/token');\n const block = checkWebsiteBlocklist(url, ctx.config?.tools?.web?.blocklist);\n if (block) return fail(name, 'BLOCKED', block.message);\n assertBrowserUrlAllowed(url, { allowPrivateUrls: allowPrivate });\n\n const r = await ext.sendCommand('navigate', { url }, { timeout });\n if (!r.ok) return fail(name, 'NAVIGATE_FAILED', r.error ?? 'navigate failed');\n\n const data = r.data as { url?: string; title?: string } | undefined;\n const finalUrl = data?.url ?? url;\n const title = data?.title ?? '';\n\n if (finalUrl && finalUrl !== url) {\n const redirectBlock = checkPostRedirectUrl(finalUrl, { allowPrivateUrls: allowPrivate });\n if (redirectBlock) {\n await ext.sendCommand('navigate', { url: 'about:blank' }, { timeout: Math.min(10_000, timeout) }).catch(() => {});\n return fail(name, 'REDIRECT_BLOCKED', redirectBlock);\n }\n }\n\n let snapshot = '';\n try {\n const snap = await ext.sendCommand('snapshot', {}, { timeout });\n if (snap.ok && snap.data) {\n snapshot = formatAxSnapshot(snap.data, AUTO_SNAPSHOT_MAX);\n }\n } catch {\n /* non-fatal */\n }\n\n const text = `Navigated to: ${title}\\nURL: ${finalUrl}${snapshot ? `\\n--- Page Snapshot ---\\n${snapshot}` : ''}`;\n return ok(name, text, { url: finalUrl, title });\n }\n\n case 'state':\n case 'snapshot': {\n const maxLen = typeof args.maxLength === 'number' ? args.maxLength : DEFAULT_SNAPSHOT_MAX;\n if (args.selector && String(args.selector).trim()) {\n return fail(name, 'NOT_SUPPORTED', 'selector-scoped state is not supported with the Chrome Extension backend');\n }\n const r = await ext.sendCommand('snapshot', {}, { timeout });\n if (!r.ok) return fail(name, 'SNAPSHOT_FAILED', r.error ?? 'snapshot failed');\n const body = formatAxSnapshot(r.data, maxLen);\n const data = r.data as { url?: string; title?: string } | undefined;\n const header = data?.url ? `URL: ${data.url}\\nTitle: ${data.title ?? ''}\\n\\n` : '';\n return ok(name, `${header}--- Page Snapshot ---\\n${body}`, { length: body.length });\n }\n\n case 'click': {\n const selector = args.selector as string | undefined;\n const text = args.text as string | undefined;\n const role = args.role as string | undefined;\n if (role?.trim()) {\n return fail(name, 'NOT_SUPPORTED', 'role-based click is not supported with the Chrome Extension backend; use selector or text');\n }\n const n = (Boolean(selector?.trim()) ? 1 : 0) + (Boolean(text?.trim()) ? 1 : 0);\n if (n !== 1) {\n return fail(name, 'INVALID_ARGS', 'Provide exactly one of: selector, text');\n }\n const r = await ext.sendCommand('click', { selector: selector?.trim(), text: text?.trim() }, { timeout });\n if (!r.ok) return fail(name, 'CLICK_FAILED', r.error ?? 'click failed');\n return ok(name, 'Click succeeded.');\n }\n\n case 'type':\n case 'input': {\n const selector = args.selector as string | undefined;\n const label = args.label as string | undefined;\n if (label?.trim() && !selector?.trim()) {\n return fail(name, 'NOT_SUPPORTED', 'label-based typing is not supported with the Chrome Extension backend; use selector');\n }\n const text = String(args.text ?? '');\n if (!text) return fail(name, 'MISSING_TEXT', 'text is required');\n const r = await ext.sendCommand(\n 'type',\n { selector: selector?.trim(), text, pressEnter: args.pressEnter === true },\n { timeout },\n );\n if (!r.ok) return fail(name, 'TYPE_FAILED', r.error ?? 'type failed');\n return ok(name, 'Typed into field.');\n }\n\n case 'scroll': {\n const direction = (args.direction as string) ?? 'down';\n const amount = typeof args.amount === 'number' ? args.amount : 500;\n const deltaY = direction === 'down' ? amount : -amount;\n const r = await ext.sendCommand('scroll', { deltaY }, { timeout });\n if (!r.ok) return fail(name, 'SCROLL_FAILED', r.error ?? 'scroll failed');\n return ok(name, `Scrolled ${direction} by ${amount}px.`);\n }\n\n case 'back': {\n const r = await ext.sendCommand('back', {}, { timeout });\n if (!r.ok) return fail(name, 'BACK_FAILED', r.error ?? 'back failed');\n const data = r.data as { url?: string; title?: string } | undefined;\n return ok(name, `Navigated back to: ${data?.title ?? ''}\\nURL: ${data?.url ?? ''}`, { url: data?.url, title: data?.title });\n }\n\n case 'screenshot': {\n const fullPage = args.full_page === true || args.fullPage === true;\n const path = args.path as string | undefined;\n const selector = args.selector as string | undefined;\n if (selector?.trim()) {\n return fail(name, 'NOT_SUPPORTED', 'selector-scoped screenshots are not supported with the Chrome Extension backend');\n }\n const r = await ext.sendCommand('screenshot', { fullPage }, { timeout });\n if (!r.ok) return fail(name, 'SCREENSHOT_FAILED', r.error ?? 'screenshot failed');\n const b64 = (r.data as { base64?: string } | undefined)?.base64;\n if (!b64) return fail(name, 'SCREENSHOT_FAILED', 'no image data');\n const artifact = { type: 'screenshot' as const, path, data: b64, mimeType: 'image/png' };\n const approxBytes = Math.floor((b64.length * 3) / 4);\n return ok(name, `Screenshot captured (~${approxBytes} bytes).`, { bytes: approxBytes }, [artifact]);\n }\n\n case 'keys':\n case 'press': {\n const key = String(args.key ?? '');\n if (!key) return fail(name, 'MISSING_KEY', 'key is required');\n const r = await ext.sendCommand('keys', { key }, { timeout });\n if (!r.ok) return fail(name, 'PRESS_FAILED', r.error ?? 'keys failed');\n return ok(name, `Pressed key: ${key}`);\n }\n\n case 'console':\n case 'eval':\n case 'evaluate': {\n const js =\n (args.javascript as string) ?? (args.expression as string) ?? (args.code as string) ?? '';\n if (!js.trim()) return fail(name, 'MISSING_JS', 'javascript expression is required');\n const r = await ext.sendCommand('evaluate', { expression: js }, { timeout });\n if (!r.ok) return fail(name, 'EVAL_FAILED', r.error ?? 'evaluate failed');\n const result = (r.data as { result?: unknown } | undefined)?.result;\n const serialized = result === undefined ? 'undefined' : JSON.stringify(result, null, 2);\n const text =\n serialized.length > DEFAULT_SNAPSHOT_MAX\n ? `${serialized.slice(0, DEFAULT_SNAPSHOT_MAX)}\\n... (truncated)`\n : serialized;\n return ok(name, text, result);\n }\n\n case 'images': {\n const selector = args.selector as string | undefined;\n const maxImages = typeof args.maxImages === 'number' ? args.maxImages : 20;\n const expr = `(() => {\n const sel = ${JSON.stringify(selector?.trim() || null)};\n const max = ${JSON.stringify(maxImages)};\n const d = globalThis.document;\n const root = sel ? d.querySelector(sel) : d;\n if (!root) return [];\n const imgs = Array.from(root.querySelectorAll('img'));\n return imgs.slice(0, max).map((img) => ({\n src: String(img.src ?? ''),\n alt: String(img.alt ?? ''),\n width: Number(img.naturalWidth ?? 0),\n height: Number(img.naturalHeight ?? 0),\n }));\n })()`;\n const r = await ext.sendCommand('evaluate', { expression: expr }, { timeout });\n if (!r.ok) return fail(name, 'IMAGES_FAILED', r.error ?? 'evaluate failed');\n const images = (r.data as { result?: unknown[] } | undefined)?.result as\n | Array<{ src: string; alt: string; width: number; height: number }>\n | undefined;\n if (!images || images.length === 0) return ok(name, 'No images found on the page.', []);\n const lines = images.map(\n (img, i) => `${i + 1}. ${img.alt || '(no alt)'} — ${img.width}×${img.height}\\n ${img.src}`,\n );\n return ok(name, `Found ${images.length} image(s):\\n${lines.join('\\n')}`, images);\n }\n\n case 'dialog': {\n const action = args.action as string;\n if (action !== 'accept' && action !== 'dismiss') {\n return fail(name, 'INVALID_ACTION', 'action must be \"accept\" or \"dismiss\"');\n }\n const r = await ext.sendCommand('dialog', { accept: action === 'accept' }, { timeout });\n if (!r.ok) return fail(name, 'DIALOG_FAILED', r.error ?? 'dialog failed');\n return ok(name, `Dialog ${action}ed.`);\n }\n\n case 'close': {\n return ok(name, 'Browser page closed.');\n }\n\n case 'wait': {\n const selector = args.selector as string | undefined;\n const text = args.text as string | undefined;\n const timeoutMs = typeof args.timeout_ms === 'number' ? args.timeout_ms : timeout;\n if (text?.trim()) {\n return fail(name, 'NOT_SUPPORTED', 'text-based wait is not supported with the Chrome Extension backend; use selector or ms');\n }\n const extArgs: Record<string, unknown> = {};\n if (selector?.trim()) {\n extArgs.selector = selector.trim();\n } else {\n extArgs.ms = typeof args.ms === 'number' ? args.ms : 1000;\n }\n const r = await ext.sendCommand('wait', extArgs, { timeout: timeoutMs });\n if (!r.ok) return fail(name, 'WAIT_TIMEOUT', r.error ?? 'wait failed');\n return ok(name, 'Wait completed.');\n }\n\n case 'wait_for_timeout': {\n const ms = typeof args.ms === 'number' ? args.ms : typeof args.timeout_ms === 'number' ? args.timeout_ms : 1000;\n const r = await ext.sendCommand('wait', { ms }, { timeout: ms + 1000 });\n if (!r.ok) return fail(name, 'WAIT_TIMEOUT', r.error ?? 'wait failed');\n return ok(name, `Waited ${ms}ms.`);\n }\n\n case 'output':\n return ok(name, 'Output captured.', valueFromArgs(ctx, args));\n\n case 'assert': {\n const actual = valueFromArgs(ctx, args);\n if ('equals' in args && JSON.stringify(actual) !== JSON.stringify(args.equals)) {\n return fail(name, 'ASSERTION_FAILED', `Expected value to equal ${JSON.stringify(args.equals)}`);\n }\n if ('contains' in args && !valueContains(actual, args.contains)) {\n return fail(name, 'ASSERTION_FAILED', `Expected value to contain ${JSON.stringify(args.contains)}`);\n }\n if (args.truthy === true && !isTruthyValue(actual)) {\n return fail(name, 'ASSERTION_FAILED', 'Expected value to be truthy');\n }\n if (args.exists === true && (actual === undefined || actual === null || actual === '')) {\n return fail(name, 'ASSERTION_FAILED', 'Expected value to exist');\n }\n return ok(name, 'Assertion passed.');\n }\n\n case 'select': {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n const path = String(args.path ?? args.value ?? '');\n const value = path ? resolvePath(source, path) : source;\n return ok(name, typeof value === 'string' ? value : JSON.stringify(value, null, 2), value);\n }\n\n case 'map': {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n if (!Array.isArray(source)) return fail(name, 'INVALID_INPUT', 'map input must be an array');\n const path = String(args.path ?? '');\n const value = path ? source.map((item) => resolvePath(item, path)) : source;\n return ok(name, JSON.stringify(value, null, 2), value);\n }\n\n case 'filter': {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n if (!Array.isArray(source)) return fail(name, 'INVALID_INPUT', 'filter input must be an array');\n const path = String(args.path ?? '');\n const value = source.filter((item) => {\n const itemValue = path ? resolvePath(item, path) : item;\n if ('equals' in args) return JSON.stringify(itemValue) === JSON.stringify(args.equals);\n if ('contains' in args) return valueContains(itemValue, args.contains);\n return isTruthyValue(itemValue);\n });\n return ok(name, JSON.stringify(value, null, 2), value);\n }\n\n case 'sort': {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n if (!Array.isArray(source)) return fail(name, 'INVALID_INPUT', 'sort input must be an array');\n const path = String(args.path ?? '');\n const direction = String(args.direction ?? 'asc');\n const value = [...source].sort((a, b) => {\n const cmp = compareValues(path ? resolvePath(a, path) : a, path ? resolvePath(b, path) : b);\n return direction === 'desc' ? -cmp : cmp;\n });\n return ok(name, JSON.stringify(value, null, 2), value);\n }\n\n case 'limit': {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n if (!Array.isArray(source)) return fail(name, 'INVALID_INPUT', 'limit input must be an array');\n const count = Math.max(0, Number(args.count ?? args.limit ?? 10));\n const offset = Math.max(0, Number(args.offset ?? 0));\n const value = source.slice(offset, offset + count);\n return ok(name, JSON.stringify(value, null, 2), value);\n }\n\n case 'network_start':\n case 'network_events':\n case 'network_stop':\n case 'cdp':\n case 'wait_for_navigation':\n case 'wait_for_function':\n case 'wait_for_network_idle':\n case 'element_text':\n case 'element_attribute':\n case 'bounding_box':\n case 'set_input_files':\n case 'cookies':\n case 'get_cookies':\n case 'add_cookies':\n case 'clear_cookies':\n case 'tabs':\n case 'list_tabs':\n case 'new_tab':\n case 'switch_tab':\n case 'fetch':\n case 'collect':\n case 'tap':\n return fail(name, 'NOT_SUPPORTED', `Action \"${name}\" is not available with the Chrome Extension backend`);\n\n default:\n return fail(name, 'UNKNOWN_ACTION', `Unknown browser action: ${name}`);\n }\n}\n"],"mappings":"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"}
|
|
@@ -16,14 +16,11 @@ function toMs(ctx) {
|
|
|
16
16
|
return resolveBrowserCommandTimeoutMs(ctx.config);
|
|
17
17
|
}
|
|
18
18
|
/** Whether humanize mode is active for this context (local/cdp/cloakbrowser only). */
|
|
19
|
-
function isHumanizeEnabled(
|
|
20
|
-
|
|
21
|
-
if (!browser?.humanize) return false;
|
|
22
|
-
if (browser.backend === "extension") return false;
|
|
23
|
-
return true;
|
|
19
|
+
function isHumanizeEnabled(_ctx) {
|
|
20
|
+
return false;
|
|
24
21
|
}
|
|
25
|
-
function humanPreset(
|
|
26
|
-
return
|
|
22
|
+
function humanPreset(_ctx) {
|
|
23
|
+
return "default";
|
|
27
24
|
}
|
|
28
25
|
async function ariaSnapshot(page, selector, maxLength, timeoutMs) {
|
|
29
26
|
const loc = selector?.trim() ? page.locator(selector.trim()).first() : page.locator("body");
|
|
@@ -109,7 +106,7 @@ function matchesNetworkPattern(url, pattern) {
|
|
|
109
106
|
const navigateAction = async (ctx, args) => {
|
|
110
107
|
const url = String(args.url ?? "");
|
|
111
108
|
if (!url) return fail("navigate", "MISSING_URL", "url is required");
|
|
112
|
-
const allowPrivate =
|
|
109
|
+
const allowPrivate = false;
|
|
113
110
|
if (containsApiKeyPattern(url)) return fail("navigate", "BLOCKED", "URL contains API key/token");
|
|
114
111
|
const block = checkWebsiteBlocklist(url, ctx.config?.tools?.web?.blocklist);
|
|
115
112
|
if (block) return fail("navigate", "BLOCKED", block.message);
|