@xopcai/xopc 0.0.142 → 0.0.144
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 +1 -1
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/feishu/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
- package/dist/extensions/telegram/src/inbound-processor.js +1 -1
- package/dist/extensions/telegram/src/plugin.js +1 -1
- package/dist/extensions/telegram/src/routing-integration.js +2 -2
- package/dist/extensions/telegram/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/api/api.js +1 -1
- package/dist/extensions/weixin/src/plugin.js +1 -1
- package/dist/extensions/weixin/src/workflow-progress.js +1 -1
- package/dist/gateway/static/root/assets/activity-center-store-jITiX2vJ.js +1 -0
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BawPxiu5.js → agent-avatar-dicebear-EAVnrCAs.js} +1 -1
- package/dist/gateway/static/root/assets/agents-5rTuJOtT.js +2 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-81xd1p9R.js → app-management-settings-panel-Bu568NpC.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-DYeQsYU8.js → appearance-settings-DSkm9bp_.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-DWetalKp.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-D_oa7oti.js → archive-plugin-C99N0vV6.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-Cd-bwI2N.js → attachment-load-CHTDqME5.js} +1 -1
- package/dist/gateway/static/root/assets/automation-suggestion-card-CBt6U3-S.js +1 -0
- package/dist/gateway/static/root/assets/automations-page-ICUfxeOz.js +4 -0
- package/dist/gateway/static/root/assets/{binary-plugins-O8svLKWw.js → binary-plugins-BRtxOLlM.js} +1 -1
- package/dist/gateway/static/root/assets/block-editor-CUlXfgXd.js +184 -0
- package/dist/gateway/static/root/assets/browser-settings-page-D7Bj4MKi.js +8 -0
- package/dist/gateway/static/root/assets/{capability-presets-api-dJy1Eqgx.js → capability-presets-api-Bg1ntFSD.js} +1 -1
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-C-8I-Ktn.js +2 -0
- package/dist/gateway/static/root/assets/{channel-recipient-api-Bfuhp2ty.js → channel-recipient-api-DuulnhIj.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-Dm5EqQyK.js +1 -0
- package/dist/gateway/static/root/assets/channels-status-swr-B5lVrUsN.js +1 -0
- package/dist/gateway/static/root/assets/check-BODqo66o.js +1 -0
- package/dist/gateway/static/root/assets/chunk-QUQL4437-DXsxWP7r.js +4 -0
- package/dist/gateway/static/root/assets/circle-alert-RzVebuX2.js +1 -0
- package/dist/gateway/static/root/assets/connectors-page-BOzjh-OK.js +2 -0
- package/dist/gateway/static/root/assets/{desktop-pet-DFMfIb5F.js → desktop-pet-C-Drhqyk.js} +1 -1
- package/dist/gateway/static/root/assets/desktop-pet-settings-CRGiolqF.js +1 -0
- package/dist/gateway/static/root/assets/{directory-picker-path-field-BrYt1gAr.js → directory-picker-path-field-Dw1L3M84.js} +1 -1
- package/dist/gateway/static/root/assets/dist-SwiI0Xu3.js +1 -0
- package/dist/gateway/static/root/assets/dreaming-settings-CF21cbjo.js +3 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-Bh630pLD.js → extension-debug-page-Dcl8LJG_.js} +1 -1
- package/dist/gateway/static/root/assets/extension-page-i_BXmO_x.js +1 -0
- package/dist/gateway/static/root/assets/extension-settings-page-CWIi7xsn.js +1 -0
- package/dist/gateway/static/root/assets/{fetch-B1WtuprY.js → fetch-8QNN25Sh.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-De2N821l.js → gateway-config-api-2sLP2kkA.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-settings-DMHiZc-2.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-nEujFSDj.js → gateway-startup-retry-5YBnS9Fj.js} +1 -1
- package/dist/gateway/static/root/assets/goal-create-dialog-CAODVDiA.js +1 -0
- package/dist/gateway/static/root/assets/goal-detail-page-_d4DjmeX.js +4 -0
- package/dist/gateway/static/root/assets/{goals-config-api-DUy3eEse.js → goals-config-api-B4qeLKQS.js} +1 -1
- package/dist/gateway/static/root/assets/goals-page-lgsop664.js +2 -0
- package/dist/gateway/static/root/assets/goals-settings-Dx_1ZNgb.js +1 -0
- package/dist/gateway/static/root/assets/heartbeat-settings-DeTseEk_.js +1 -0
- package/dist/gateway/static/root/assets/index-CphxClbs.css +1 -0
- package/dist/gateway/static/root/assets/index-VWvztcst.js +257 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CVIwwM15.js → keyboard-shortcuts-settings-BpwpMmlk.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-9_hbTg3j.js +7 -0
- package/dist/gateway/static/root/assets/{markdown-split-B_6us9j7.js → markdown-split-BTRFTK0w.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-D_fryIyj.js → media-plugins-BABfIZPU.js} +1 -1
- package/dist/gateway/static/root/assets/messages-CzKxM6I4.js +5 -0
- package/dist/gateway/static/root/assets/models-hub-panel-B1CUvZxh.js +2 -0
- package/dist/gateway/static/root/assets/notes-page-88QBHW9a.js +1 -0
- package/dist/gateway/static/root/assets/notes-workbench-CerZOeLW.js +2 -0
- package/dist/gateway/static/root/assets/{page-tabs-D_8jGlqx.js → page-tabs-je95DZOf.js} +1 -1
- package/dist/gateway/static/root/assets/{preview-open-alternatives-BBLMK8Mp.js → preview-open-alternatives-BJbwi7Rc.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-BmrApldl.js +1 -0
- package/dist/gateway/static/root/assets/projects-page-tTn-k76N.js +1 -0
- package/dist/gateway/static/root/assets/remote-access-hub-DeA2-pOi.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-DVS3FR5r.js → save-bar-controls-qWMQ9mod.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-D6vKd6-T.js → schedule-field-kxd270Gs.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-BPy4lbIh.js → schema-form-DLnD-MuD.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-D4kvvcL1.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-CI1OG4gq.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-WzdikxPt.js → settings-collapsible-section-DQprvu5J.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-CvfzhBV-.js → settings-form-section-Cqq7Y98y.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-loading-skeleton-BxR-Ulhi.js → settings-loading-skeleton-b6rXULL5.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-BtBVz3cX.js +1 -0
- package/dist/gateway/static/root/assets/{settings-page-layout-CKefvbYi.js → settings-page-layout-BNJbtklV.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-cmclUJzS.js +1 -0
- package/dist/gateway/static/root/assets/share-preview-page--zO-A1W1.js +2 -0
- package/dist/gateway/static/root/assets/shares-settings-DNJvqA67.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-DWr_0Xgn.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-DEGsTbJx.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-BokgAgf7.js → system-settings-panel-Cq9J7i7v.js} +1 -1
- package/dist/gateway/static/root/assets/{typed-models-lib-BwHlNL3L.js → typed-models-lib-CdSwi1gT.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-DR11ap3A.js → use-channel-catalog-COXIfXcl.js} +1 -1
- package/dist/gateway/static/root/assets/user-context-page-C-V73ZaJ.js +1 -0
- package/dist/gateway/static/root/assets/user-profile-fields-editor-B1cxoGkh.js +1 -0
- package/dist/gateway/static/root/assets/user-profile-settings-panel-B8hlamVB.js +1 -0
- package/dist/gateway/static/root/assets/{utils-BKUWB-TT.js → utils-Dx01V8qF.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DGpIUelZ.js +1 -0
- package/dist/gateway/static/root/assets/with-selector-aYPsXwdl.js +1 -0
- package/dist/gateway/static/root/assets/work-item-detail-page-fzWTxF26.js +1 -0
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-CL_rnAUB.js → workflow-run-setup-panel-Dt_x8LGg.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-Bg02zEUh.js +11 -0
- package/dist/gateway/static/root/assets/workflows-page-DLioOiRN.css +1 -0
- package/dist/gateway/static/root/connector-icons/README.md +11 -0
- package/dist/gateway/static/root/connector-icons/airtable.svg +13 -0
- package/dist/gateway/static/root/connector-icons/asana.svg +15 -0
- package/dist/gateway/static/root/connector-icons/brave-search.svg +1 -0
- package/dist/gateway/static/root/connector-icons/clickup.svg +19 -0
- package/dist/gateway/static/root/connector-icons/composio.svg +266 -0
- package/dist/gateway/static/root/connector-icons/discord.svg +15 -0
- package/dist/gateway/static/root/connector-icons/dropbox.svg +152 -0
- package/dist/gateway/static/root/connector-icons/excel.svg +56 -0
- package/dist/gateway/static/root/connector-icons/fetch.svg +6 -0
- package/dist/gateway/static/root/connector-icons/figma.svg +178 -0
- package/dist/gateway/static/root/connector-icons/filesystem.svg +6 -0
- package/dist/gateway/static/root/connector-icons/github.svg +10 -0
- package/dist/gateway/static/root/connector-icons/gmail.svg +3 -0
- package/dist/gateway/static/root/connector-icons/google-calendar.svg +3 -0
- package/dist/gateway/static/root/connector-icons/google-docs.svg +25 -0
- package/dist/gateway/static/root/connector-icons/google-drive.svg +25 -0
- package/dist/gateway/static/root/connector-icons/google-sheets.svg +1 -0
- package/dist/gateway/static/root/connector-icons/hubspot.svg +142 -0
- package/dist/gateway/static/root/connector-icons/jira.svg +15 -0
- package/dist/gateway/static/root/connector-icons/linear.svg +5 -0
- package/dist/gateway/static/root/connector-icons/memory.svg +5 -0
- package/dist/gateway/static/root/connector-icons/microsoft-teams.svg +33 -0
- package/dist/gateway/static/root/connector-icons/notion.svg +5 -0
- package/dist/gateway/static/root/connector-icons/one-drive.svg +13 -0
- package/dist/gateway/static/root/connector-icons/outlook.svg +76 -0
- package/dist/gateway/static/root/connector-icons/playwright.svg +9 -0
- package/dist/gateway/static/root/connector-icons/salesforce.svg +17 -0
- package/dist/gateway/static/root/connector-icons/sequential-thinking.svg +8 -0
- package/dist/gateway/static/root/connector-icons/shopify.svg +5 -0
- package/dist/gateway/static/root/connector-icons/slack.svg +9 -0
- package/dist/gateway/static/root/connector-icons/spotify.svg +43 -0
- package/dist/gateway/static/root/connector-icons/stripe.svg +11 -0
- package/dist/gateway/static/root/connector-icons/telegram.svg +130 -0
- package/dist/gateway/static/root/connector-icons/time.svg +6 -0
- package/dist/gateway/static/root/connector-icons/todoist.svg +277 -0
- package/dist/gateway/static/root/connector-icons/trello.svg +19 -0
- package/dist/gateway/static/root/connector-icons/twitter.svg +128 -0
- package/dist/gateway/static/root/connector-icons/whatsapp.svg +61 -0
- package/dist/gateway/static/root/connector-icons/youtube.svg +11 -0
- package/dist/gateway/static/root/index.html +10 -7
- package/dist/package.js +1 -1
- package/dist/src/activity/emitter.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +2 -0
- package/dist/src/agent/agent-manager.js +12 -4
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/background-review/prompts.d.ts +1 -1
- package/dist/src/agent/background-review/prompts.js +3 -2
- package/dist/src/agent/background-review/prompts.js.map +1 -1
- package/dist/src/agent/code-intelligence/binary.js +1 -1
- package/dist/src/agent/context/project-context.js +2 -2
- package/dist/src/agent/context/workspace-seed.js +2 -2
- package/dist/src/agent/embedded/run-for-session.js +1 -1
- package/dist/src/agent/embedded/session-tool-result-guard.js +1 -1
- package/dist/src/agent/embedded/xopc-tools-bridge.d.ts +9 -0
- package/dist/src/agent/embedded/xopc-tools-bridge.js +71 -3
- package/dist/src/agent/embedded/xopc-tools-bridge.js.map +1 -1
- package/dist/src/agent/goals/post-turn.js +7 -6
- package/dist/src/agent/goals/post-turn.js.map +1 -1
- package/dist/src/agent/ipc/bus.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 +5 -2
- package/dist/src/agent/mcp/mcp-transport.js.map +1 -1
- package/dist/src/agent/memory/context/planner.d.ts +1 -0
- package/dist/src/agent/memory/context/planner.js +60 -14
- package/dist/src/agent/memory/context/planner.js.map +1 -1
- package/dist/src/agent/memory/context/types.d.ts +3 -1
- package/dist/src/agent/memory/lifecycle.d.ts +11 -0
- package/dist/src/agent/memory/lifecycle.js +50 -0
- package/dist/src/agent/memory/lifecycle.js.map +1 -0
- package/dist/src/agent/memory/plugin-discovery.js +1 -1
- package/dist/src/agent/memory/source-origin.d.ts +3 -0
- package/dist/src/agent/memory/source-origin.js +19 -0
- package/dist/src/agent/memory/source-origin.js.map +1 -0
- package/dist/src/agent/memory/understanding/service.js +5 -0
- package/dist/src/agent/memory/understanding/service.js.map +1 -1
- package/dist/src/agent/memory/user-context-coordinator.js +7 -2
- package/dist/src/agent/memory/user-context-coordinator.js.map +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js +1 -1
- package/dist/src/agent/prompt/sections/behavior.d.ts +2 -0
- package/dist/src/agent/prompt/sections/behavior.js +30 -1
- package/dist/src/agent/prompt/sections/behavior.js.map +1 -1
- package/dist/src/agent/prompt/sections/tooling.js +1 -1
- package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
- package/dist/src/agent/prompt/service-prompt-builder.js +8 -1
- package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
- package/dist/src/agent/prompt/system-prompt.d.ts +2 -0
- package/dist/src/agent/prompt/system-prompt.js +6 -3
- package/dist/src/agent/prompt/system-prompt.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.js +22 -0
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service.d.ts +2 -0
- package/dist/src/agent/service.js +12 -6
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/session/session-inspector.js +2 -2
- package/dist/src/agent/skills/hub-pull.js +1 -1
- package/dist/src/agent/starter-agents.js +1 -1
- package/dist/src/agent/starter-agents.js.map +1 -1
- package/dist/src/agent/tool-manuals/xopc-use.d.ts +1 -1
- package/dist/src/agent/tool-manuals/xopc-use.js +1 -1
- package/dist/src/agent/tool-manuals/xopc-use.js.map +1 -1
- package/dist/src/agent/tools/composio-tool.d.ts +18 -5
- package/dist/src/agent/tools/composio-tool.js +252 -35
- package/dist/src/agent/tools/composio-tool.js.map +1 -1
- package/dist/src/agent/tools/factory.js +7 -3
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/goal-tool.js +2 -2
- package/dist/src/agent/tools/index.d.ts +1 -1
- package/dist/src/agent/tools/index.js +2 -2
- package/dist/src/agent/tools/workflow-tool.d.ts +0 -1
- package/dist/src/agent/tools/workflow-tool.js +4 -17
- package/dist/src/agent/tools/workflow-tool.js.map +1 -1
- package/dist/src/agent/tools/xopc-use-tool.js +1 -1
- package/dist/src/agent/workflow/builtins/index.d.ts +2 -28
- package/dist/src/agent/workflow/builtins/index.js +226 -41
- package/dist/src/agent/workflow/builtins/index.js.map +1 -1
- package/dist/src/agent/workflow/catalog.d.ts +32 -34
- package/dist/src/agent/workflow/catalog.js +158 -154
- package/dist/src/agent/workflow/catalog.js.map +1 -1
- package/dist/src/agent/workflow/index.d.ts +4 -6
- package/dist/src/agent/workflow/index.js +2 -5
- package/dist/src/agent/workflow/snapshot.d.ts +2 -2
- package/dist/src/agent/workflow/snapshot.js +2 -2
- package/dist/src/agent/workflow/snapshot.js.map +1 -1
- package/dist/src/agent/workflow/structured-output-tool.d.ts +2 -2
- package/dist/src/agent/workflow/structured-output-tool.js +2 -2
- package/dist/src/agent/workflow/structured-output-tool.js.map +1 -1
- package/dist/src/agent/workflow/subagent-runner.js +1 -1
- package/dist/src/agent/workflow/types.d.ts +31 -26
- package/dist/src/agent/workspace-runtime/registry.js +2 -2
- package/dist/src/agent-manifest/index.d.ts +1 -0
- package/dist/src/agent-manifest/index.js +3 -1
- package/dist/src/agent-manifest/index.js.map +1 -1
- package/dist/src/agent-manifest/preset-chain.d.ts +10 -0
- package/dist/src/agent-manifest/preset-chain.js +32 -0
- package/dist/src/agent-manifest/preset-chain.js.map +1 -0
- package/dist/src/agent-manifest/resolver.js +3 -10
- package/dist/src/agent-manifest/resolver.js.map +1 -1
- package/dist/src/agent-manifest/schema.d.ts +4 -4
- package/dist/src/automations/api/routes.js +14 -2
- package/dist/src/automations/api/routes.js.map +1 -1
- package/dist/src/automations/domain/validation.d.ts +14 -14
- package/dist/src/automations/draft/automation-draft-validator.d.ts +3 -3
- package/dist/src/automations/service/action-executor.js +2 -2
- package/dist/src/browser/cdp-local-launcher.js +1 -1
- package/dist/src/browser/providers/browser-ext-install.d.ts +11 -1
- package/dist/src/browser/providers/browser-ext-install.js +42 -17
- package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
- package/dist/src/browser/providers/cloakbrowser.js +2 -2
- package/dist/src/browser/providers/playwright-doctor.js +1 -1
- package/dist/src/browser/stealth.js +1 -1
- package/dist/src/capabilities/store-connector.d.ts +0 -1
- package/dist/src/capabilities/store-connector.js +4 -6
- package/dist/src/capabilities/store-connector.js.map +1 -1
- package/dist/src/chat-commands/agent-edit.js +1 -1
- package/dist/src/chat-commands/builtins/config.js +1 -1
- package/dist/src/chat-commands/builtins/goal.js +2 -2
- package/dist/src/chat-commands/builtins/review.js +72 -73
- package/dist/src/chat-commands/builtins/review.js.map +1 -1
- package/dist/src/chat-commands/builtins/workflow.js +9 -54
- package/dist/src/chat-commands/builtins/workflow.js.map +1 -1
- package/dist/src/chat-commands/context.js +1 -1
- package/dist/src/cli/commands/agent.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +2 -2
- package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
- package/dist/src/cli/commands/extension-create.js +2 -2
- package/dist/src/cli/commands/extension-create.js.map +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +43 -37
- package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
- package/dist/src/cli/commands/extension-pack.d.ts +6 -0
- package/dist/src/cli/commands/extension-pack.js +4 -3
- package/dist/src/cli/commands/extension-pack.js.map +1 -1
- package/dist/src/cli/commands/goal.js +2 -2
- package/dist/src/cli/commands/init.js +1 -1
- package/dist/src/cli/commands/project.js +3 -3
- package/dist/src/commands/agents.config.d.ts +1 -0
- package/dist/src/commands/agents.config.js +1 -0
- package/dist/src/commands/agents.config.js.map +1 -1
- package/dist/src/config/gateway-bind.js +1 -1
- package/dist/src/config/index.js +1 -1
- package/dist/src/config/loader.js +1 -1
- package/dist/src/config/models-json.js +1 -1
- package/dist/src/config/schema.d.ts +6 -6
- package/dist/src/config/schema.js +6 -22
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/web-patch.d.ts +1 -1
- package/dist/src/connectors/approval.d.ts +2 -0
- package/dist/src/connectors/approval.js +33 -0
- package/dist/src/connectors/approval.js.map +1 -0
- package/dist/src/connectors/auth-provider-registry.d.ts +9 -0
- package/dist/src/connectors/auth-provider-registry.js +17 -0
- package/dist/src/connectors/auth-provider-registry.js.map +1 -0
- package/dist/src/connectors/builtin-catalog.js +55 -116
- package/dist/src/connectors/builtin-catalog.js.map +1 -1
- package/dist/src/connectors/catalog.js +7 -2
- package/dist/src/connectors/catalog.js.map +1 -1
- package/dist/src/connectors/composio-catalog.d.ts +19 -0
- package/dist/src/connectors/composio-catalog.js +237 -0
- package/dist/src/connectors/composio-catalog.js.map +1 -0
- package/dist/src/connectors/composio-logo.d.ts +1 -0
- package/dist/src/connectors/composio-logo.js +51 -0
- package/dist/src/connectors/composio-logo.js.map +1 -0
- package/dist/src/connectors/composio-sessions.d.ts +116 -0
- package/dist/src/connectors/composio-sessions.js +296 -0
- package/dist/src/connectors/composio-sessions.js.map +1 -0
- package/dist/src/connectors/composio-triggers.d.ts +17 -0
- package/dist/src/connectors/composio-triggers.js +48 -5
- package/dist/src/connectors/composio-triggers.js.map +1 -1
- package/dist/src/connectors/composio.d.ts +31 -2
- package/dist/src/connectors/composio.js +374 -151
- package/dist/src/connectors/composio.js.map +1 -1
- package/dist/src/connectors/connector-memory-sync.d.ts +15 -0
- package/dist/src/connectors/connector-memory-sync.js +90 -0
- package/dist/src/connectors/connector-memory-sync.js.map +1 -0
- package/dist/src/connectors/install.js +35 -92
- package/dist/src/connectors/install.js.map +1 -1
- package/dist/src/connectors/instances.js +6 -2
- package/dist/src/connectors/instances.js.map +1 -1
- package/dist/src/connectors/integration-strategy.d.ts +3 -0
- package/dist/src/connectors/integration-strategy.js +29 -0
- package/dist/src/connectors/integration-strategy.js.map +1 -0
- package/dist/src/connectors/policy.d.ts +13 -0
- package/dist/src/connectors/policy.js +48 -0
- package/dist/src/connectors/policy.js.map +1 -0
- package/dist/src/connectors/providers.js +1 -1
- package/dist/src/connectors/runtime-adapter-registry.d.ts +25 -0
- package/dist/src/connectors/runtime-adapter-registry.js +154 -0
- package/dist/src/connectors/runtime-adapter-registry.js.map +1 -0
- package/dist/src/connectors/types.d.ts +113 -4
- package/dist/src/connectors/workflow-preflight.d.ts +20 -0
- package/dist/src/connectors/workflow-preflight.js +70 -0
- package/dist/src/connectors/workflow-preflight.js.map +1 -0
- package/dist/src/daemon/launchd.js +1 -1
- package/dist/src/daemon/systemd.js +1 -1
- package/dist/src/extensions/discover-extensions.js +1 -1
- package/dist/src/extensions/install-transaction.d.ts +16 -0
- package/dist/src/extensions/install-transaction.js +76 -0
- package/dist/src/extensions/install-transaction.js.map +1 -0
- package/dist/src/extensions/install.d.ts +2 -0
- package/dist/src/extensions/install.js +23 -1
- package/dist/src/extensions/install.js.map +1 -1
- package/dist/src/extensions/loader.js +2 -2
- package/dist/src/gateway/agents-admin.d.ts +2 -0
- package/dist/src/gateway/agents-admin.js +7 -0
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/capability-presets-admin.d.ts +11 -0
- package/dist/src/gateway/capability-presets-admin.js +11 -4
- package/dist/src/gateway/capability-presets-admin.js.map +1 -1
- package/dist/src/gateway/chat-stream/mapper.js +17 -0
- package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
- package/dist/src/gateway/chat-stream/protocol.d.ts +18 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -3
- package/dist/src/gateway/hono/lib/static-ui.js +1 -1
- package/dist/src/gateway/hono/routes/agents.js +3 -0
- package/dist/src/gateway/hono/routes/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/capability-presets.js +19 -1
- package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -1
- package/dist/src/gateway/hono/routes/connectors.js +188 -25
- package/dist/src/gateway/hono/routes/connectors.js.map +1 -1
- package/dist/src/gateway/hono/routes/goals.js +22 -3
- package/dist/src/gateway/hono/routes/goals.js.map +1 -1
- package/dist/src/gateway/hono/routes/home.d.ts +60 -1
- package/dist/src/gateway/hono/routes/home.js +244 -18
- package/dist/src/gateway/hono/routes/home.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.js +17 -4
- package/dist/src/gateway/hono/routes/memory.js.map +1 -1
- package/dist/src/gateway/hono/routes/projects.js +106 -5
- package/dist/src/gateway/hono/routes/projects.js.map +1 -1
- package/dist/src/gateway/hono/routes/public-gateway.js +93 -0
- package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
- package/dist/src/gateway/hono/routes/workflows.js +137 -22
- package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
- package/dist/src/gateway/hono/routes/you.d.ts +23 -0
- package/dist/src/gateway/hono/routes/you.js +538 -0
- package/dist/src/gateway/hono/routes/you.js.map +1 -0
- package/dist/src/gateway/hono/sse.d.ts +2 -1
- package/dist/src/gateway/hono/sse.js +2 -1
- package/dist/src/gateway/hono/sse.js.map +1 -1
- package/dist/src/gateway/lock.js +1 -1
- package/dist/src/gateway/ports.js +1 -1
- package/dist/src/gateway/service/marketplace-service.d.ts +13 -1
- package/dist/src/gateway/service/marketplace-service.js +96 -40
- package/dist/src/gateway/service/marketplace-service.js.map +1 -1
- package/dist/src/gateway/service.d.ts +2 -0
- package/dist/src/gateway/service.js +13 -7
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/goals/goal-service.d.ts +7 -5
- package/dist/src/goals/goal-service.js +25 -13
- package/dist/src/goals/goal-service.js.map +1 -1
- package/dist/src/goals/goal-store.js +46 -7
- package/dist/src/goals/goal-store.js.map +1 -1
- package/dist/src/goals/goal-workflow-judge.js +1 -1
- package/dist/src/goals/types.d.ts +24 -0
- package/dist/src/infra/ports.js +1 -1
- package/dist/src/infra/ssh-tunnel.js +1 -1
- package/dist/src/infra/update-check.js +1 -1
- package/dist/src/migrations/runner.js +1 -1
- package/dist/src/notes/service.js +3 -3
- package/dist/src/notes/store.js +1 -1
- package/dist/src/projects/project-service.js +1 -1
- package/dist/src/projects/workspace.js +1 -1
- package/dist/src/routing/agent-session-key.js +1 -1
- package/dist/src/routing/resolve-route.js +1 -1
- package/dist/src/routing/resolve-tui-session-key.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/store.js +1 -1
- package/dist/src/storage/sqlite/connection.js +1 -1
- package/dist/src/storage/sqlite/connector-repository.d.ts +49 -0
- package/dist/src/storage/sqlite/connector-repository.js +385 -0
- package/dist/src/storage/sqlite/connector-repository.js.map +1 -0
- package/dist/src/storage/sqlite/index.d.ts +3 -0
- package/dist/src/storage/sqlite/index.js +4 -1
- package/dist/src/storage/sqlite/migrations/030_connectors.sql +94 -0
- package/dist/src/storage/sqlite/migrations/031_connector_approvals.sql +24 -0
- package/dist/src/storage/sqlite/migrations/032_connector_webhook_deliveries.sql +15 -0
- package/dist/src/storage/sqlite/migrations/033_user_trust_policies.sql +6 -0
- package/dist/src/storage/sqlite/migrations/034_allow_global_auto_trust.sql +14 -0
- package/dist/src/storage/sqlite/migrations/035_user_profile_prompt_state.sql +7 -0
- package/dist/src/storage/sqlite/migrations/036_goal_outcome_metric.sql +12 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
- package/dist/src/storage/sqlite/row-mappers.js +1 -1
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/user-profile-setup-repository.d.ts +3 -0
- package/dist/src/storage/sqlite/user-profile-setup-repository.js +34 -0
- package/dist/src/storage/sqlite/user-profile-setup-repository.js.map +1 -0
- package/dist/src/storage/sqlite/user-trust-repository.d.ts +3 -0
- package/dist/src/storage/sqlite/user-trust-repository.js +34 -0
- package/dist/src/storage/sqlite/user-trust-repository.js.map +1 -0
- package/dist/src/tui/backends/embedded-backend.js +4 -4
- package/dist/src/tui/clipboard-image.js +1 -1
- package/dist/src/tui/components/assistant-message.js +15 -0
- package/dist/src/tui/components/assistant-message.js.map +1 -1
- package/dist/src/tui/tui-agent-events.js +85 -1
- package/dist/src/tui/tui-agent-events.js.map +1 -1
- package/dist/src/tui/tui-command-formatters.js +9 -9
- package/dist/src/tui/tui-command-formatters.js.map +1 -1
- package/dist/src/tui/tui-commands.js +4 -4
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/dist/src/tui/tui.js +1 -1
- package/dist/src/user-context/import.d.ts +12 -0
- package/dist/src/user-context/import.js +48 -0
- package/dist/src/user-context/import.js.map +1 -0
- package/dist/src/user-context/profile.d.ts +37 -0
- package/dist/src/user-context/profile.js +165 -0
- package/dist/src/user-context/profile.js.map +1 -0
- package/dist/src/user-context/projection.d.ts +54 -0
- package/dist/src/user-context/projection.js +121 -0
- package/dist/src/user-context/projection.js.map +1 -0
- package/dist/src/user-context/source-recommendations.d.ts +13 -0
- package/dist/src/user-context/source-recommendations.js +86 -0
- package/dist/src/user-context/source-recommendations.js.map +1 -0
- package/dist/src/user-context/trust-policy.d.ts +11 -0
- package/dist/src/user-context/trust-policy.js +31 -0
- package/dist/src/user-context/trust-policy.js.map +1 -0
- package/dist/src/utils/index.js +1 -1
- package/dist/src/utils/logger/index.js +1 -1
- package/dist/src/utils/logger.js +1 -1
- package/dist/src/work-items/work-item-service.js +1 -1
- package/dist/src/workflows/authoring/index.d.ts +1 -0
- package/dist/src/workflows/authoring/index.js +2 -0
- package/dist/src/workflows/authoring/workflow-draft-store.d.ts +33 -0
- package/dist/src/workflows/authoring/workflow-draft-store.js +74 -0
- package/dist/src/workflows/authoring/workflow-draft-store.js.map +1 -0
- package/dist/src/workflows/domain/definition-utils.d.ts +6 -4
- package/dist/src/workflows/domain/definition-utils.js +28 -26
- package/dist/src/workflows/domain/definition-utils.js.map +1 -1
- package/dist/src/workflows/domain/definition.d.ts +79 -6
- package/dist/src/workflows/domain/event.d.ts +18 -2
- package/dist/src/workflows/domain/index.js +3 -3
- package/dist/src/workflows/domain/run.d.ts +16 -2
- package/dist/src/workflows/domain/run.js.map +1 -1
- package/dist/src/workflows/domain/validation.d.ts +9 -5
- package/dist/src/workflows/domain/validation.js +183 -40
- package/dist/src/workflows/domain/validation.js.map +1 -1
- package/dist/src/workflows/draft/workflow-draft-prompt.d.ts +2 -3
- package/dist/src/workflows/draft/workflow-draft-prompt.js +31 -73
- package/dist/src/workflows/draft/workflow-draft-prompt.js.map +1 -1
- package/dist/src/workflows/draft/workflow-draft-service.js +5 -9
- package/dist/src/workflows/draft/workflow-draft-service.js.map +1 -1
- package/dist/src/workflows/draft/workflow-draft-validator.js +29 -37
- package/dist/src/workflows/draft/workflow-draft-validator.js.map +1 -1
- package/dist/src/workflows/draft/workflow-draft.types.d.ts +4 -4
- package/dist/src/workflows/engine/projector.js +43 -1
- package/dist/src/workflows/engine/projector.js.map +1 -1
- package/dist/src/workflows/engine/workflow-engine.d.ts +2 -3
- package/dist/src/workflows/engine/workflow-engine.js +24 -4
- package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
- package/dist/src/workflows/index.js +4 -7
- package/dist/src/workflows/registry/catalog-workflow-definition-registry.js +1 -9
- package/dist/src/workflows/registry/catalog-workflow-definition-registry.js.map +1 -1
- package/dist/src/workflows/runtime/graph-workflow-runtime.d.ts +10 -0
- package/dist/src/workflows/runtime/graph-workflow-runtime.js +295 -0
- package/dist/src/workflows/runtime/graph-workflow-runtime.js.map +1 -0
- package/dist/src/workflows/runtime/index.d.ts +1 -2
- package/dist/src/workflows/runtime/index.js +2 -5
- package/dist/src/workflows/runtime/workflow-runtime-port.d.ts +5 -8
- package/dist/src/workflows/service/workflow-run-service.js +15 -1
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
- package/dist/src/workflows/service/workflow-run-service.types.d.ts +2 -1
- package/dist/src/workflows/service/workflow-session-bridge.js +3 -3
- package/package.json +5 -4
- package/dist/gateway/static/root/assets/agents-CyvCIHnB.js +0 -2
- package/dist/gateway/static/root/assets/apps-page-DK_Vx6nl.js +0 -1
- package/dist/gateway/static/root/assets/automation-suggestion-card-B1LV3YYv.js +0 -1
- package/dist/gateway/static/root/assets/automations-page-fzrovqhv.js +0 -4
- package/dist/gateway/static/root/assets/block-editor-Dhj5f4Bx.js +0 -184
- package/dist/gateway/static/root/assets/browser-settings-page-BDn-n-UB.js +0 -8
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-Co5ipo_Q.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-BWlpaxg9.js +0 -1
- package/dist/gateway/static/root/assets/channels-status-swr-D_jkIZLV.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-BcekbW4q.js +0 -2
- package/dist/gateway/static/root/assets/desktop-pet-settings-BJCUuL8Y.js +0 -1
- package/dist/gateway/static/root/assets/dist-Mys7eFJ5.js +0 -1
- package/dist/gateway/static/root/assets/dreaming-settings-BN1Z2mIo.js +0 -3
- package/dist/gateway/static/root/assets/extension-page-B-1KxvVy.js +0 -1
- package/dist/gateway/static/root/assets/extension-settings-page-BF9NACI3.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-DN9sNREz.js +0 -1
- package/dist/gateway/static/root/assets/goal-create-dialog-BpoQW8cD.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-CBRSPd0b.js +0 -4
- package/dist/gateway/static/root/assets/goals-page-BCcBi407.js +0 -2
- package/dist/gateway/static/root/assets/goals-settings-pkTXzXkh.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-ezsufgLQ.js +0 -1
- package/dist/gateway/static/root/assets/index-B8s8Pq5U.css +0 -1
- package/dist/gateway/static/root/assets/index-DcUaXYeb.js +0 -262
- package/dist/gateway/static/root/assets/logs-page-DQtTRXtj.js +0 -7
- package/dist/gateway/static/root/assets/messages-BXNELNBa.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-panel-BP2M9n6Q.js +0 -2
- package/dist/gateway/static/root/assets/notes-page-CspveYaO.js +0 -1
- package/dist/gateway/static/root/assets/notes-workbench-BHwzJ0OC.js +0 -2
- package/dist/gateway/static/root/assets/project-detail-page-Dy3rsobs.js +0 -1
- package/dist/gateway/static/root/assets/projects-page-CWKpPE0L.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CqNRyXEo.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-MEME7ivF.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-JVd0qaSF.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-DYEbB1EV.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-dWN8BJ3z.js +0 -1
- package/dist/gateway/static/root/assets/share-preview-page-D8foINzP.js +0 -2
- package/dist/gateway/static/root/assets/shares-settings-Tgbv1s7G.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-D_YK0b_Z.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-DGytfoZK.js +0 -2
- package/dist/gateway/static/root/assets/toast-z0toXu32.js +0 -1
- package/dist/gateway/static/root/assets/user-profile-settings-panel-8YtygcJp.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-BVH71EFf.js +0 -1
- package/dist/gateway/static/root/assets/work-item-detail-page-JeTE7XNM.js +0 -1
- package/dist/gateway/static/root/assets/workflow-start-dialog-_u8Uc1ze.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-ixgk_y1l.js +0 -18
- package/dist/src/agent/workflow/builtins/audit-repo.d.ts +0 -13
- package/dist/src/agent/workflow/builtins/audit-repo.js +0 -183
- package/dist/src/agent/workflow/builtins/audit-repo.js.map +0 -1
- package/dist/src/agent/workflow/builtins/client-proposal.d.ts +0 -12
- package/dist/src/agent/workflow/builtins/client-proposal.js +0 -164
- package/dist/src/agent/workflow/builtins/client-proposal.js.map +0 -1
- package/dist/src/agent/workflow/builtins/competitor-scan.d.ts +0 -12
- package/dist/src/agent/workflow/builtins/competitor-scan.js +0 -164
- package/dist/src/agent/workflow/builtins/competitor-scan.js.map +0 -1
- package/dist/src/agent/workflow/builtins/content-draft.d.ts +0 -13
- package/dist/src/agent/workflow/builtins/content-draft.js +0 -159
- package/dist/src/agent/workflow/builtins/content-draft.js.map +0 -1
- package/dist/src/agent/workflow/builtins/content-repurpose.d.ts +0 -11
- package/dist/src/agent/workflow/builtins/content-repurpose.js +0 -146
- package/dist/src/agent/workflow/builtins/content-repurpose.js.map +0 -1
- package/dist/src/agent/workflow/builtins/debug-incident.d.ts +0 -13
- package/dist/src/agent/workflow/builtins/debug-incident.js +0 -177
- package/dist/src/agent/workflow/builtins/debug-incident.js.map +0 -1
- package/dist/src/agent/workflow/builtins/decision-compare.d.ts +0 -13
- package/dist/src/agent/workflow/builtins/decision-compare.js +0 -187
- package/dist/src/agent/workflow/builtins/decision-compare.js.map +0 -1
- package/dist/src/agent/workflow/builtins/implementation-plan.d.ts +0 -12
- package/dist/src/agent/workflow/builtins/implementation-plan.js +0 -185
- package/dist/src/agent/workflow/builtins/implementation-plan.js.map +0 -1
- package/dist/src/agent/workflow/builtins/inbox-triage.d.ts +0 -11
- package/dist/src/agent/workflow/builtins/inbox-triage.js +0 -158
- package/dist/src/agent/workflow/builtins/inbox-triage.js.map +0 -1
- package/dist/src/agent/workflow/builtins/meeting-prep.d.ts +0 -12
- package/dist/src/agent/workflow/builtins/meeting-prep.js +0 -152
- package/dist/src/agent/workflow/builtins/meeting-prep.js.map +0 -1
- package/dist/src/agent/workflow/builtins/multi-perspective-review.d.ts +0 -14
- package/dist/src/agent/workflow/builtins/multi-perspective-review.js +0 -171
- package/dist/src/agent/workflow/builtins/multi-perspective-review.js.map +0 -1
- package/dist/src/agent/workflow/builtins/offer-design.d.ts +0 -12
- package/dist/src/agent/workflow/builtins/offer-design.js +0 -170
- package/dist/src/agent/workflow/builtins/offer-design.js.map +0 -1
- package/dist/src/agent/workflow/builtins/pr-review.d.ts +0 -12
- package/dist/src/agent/workflow/builtins/pr-review.js +0 -178
- package/dist/src/agent/workflow/builtins/pr-review.js.map +0 -1
- package/dist/src/agent/workflow/builtins/release-check.d.ts +0 -11
- package/dist/src/agent/workflow/builtins/release-check.js +0 -174
- package/dist/src/agent/workflow/builtins/release-check.js.map +0 -1
- package/dist/src/agent/workflow/builtins/research.d.ts +0 -13
- package/dist/src/agent/workflow/builtins/research.js +0 -188
- package/dist/src/agent/workflow/builtins/research.js.map +0 -1
- package/dist/src/agent/workflow/builtins/weekly-review.d.ts +0 -12
- package/dist/src/agent/workflow/builtins/weekly-review.js +0 -139
- package/dist/src/agent/workflow/builtins/weekly-review.js.map +0 -1
- package/dist/src/agent/workflow/last-run-memory.d.ts +0 -42
- package/dist/src/agent/workflow/last-run-memory.js +0 -60
- package/dist/src/agent/workflow/last-run-memory.js.map +0 -1
- package/dist/src/agent/workflow/lint.d.ts +0 -38
- package/dist/src/agent/workflow/lint.js +0 -74
- package/dist/src/agent/workflow/lint.js.map +0 -1
- package/dist/src/agent/workflow/meta-locale.d.ts +0 -12
- package/dist/src/agent/workflow/meta-locale.js +0 -62
- package/dist/src/agent/workflow/meta-locale.js.map +0 -1
- package/dist/src/agent/workflow/parser.d.ts +0 -20
- package/dist/src/agent/workflow/parser.js +0 -152
- package/dist/src/agent/workflow/parser.js.map +0 -1
- package/dist/src/agent/workflow/runtime.d.ts +0 -34
- package/dist/src/agent/workflow/runtime.js +0 -402
- package/dist/src/agent/workflow/runtime.js.map +0 -1
- package/dist/src/connectors/oauth.d.ts +0 -22
- package/dist/src/connectors/oauth.js +0 -99
- package/dist/src/connectors/oauth.js.map +0 -1
- package/dist/src/workflows/runtime/script-runtime.d.ts +0 -3
- package/dist/src/workflows/runtime/script-runtime.js +0 -3
- package/dist/src/workflows/runtime/script-workflow-runtime.d.ts +0 -5
- package/dist/src/workflows/runtime/script-workflow-runtime.js +0 -15
- package/dist/src/workflows/runtime/script-workflow-runtime.js.map +0 -1
|
@@ -1,200 +1,204 @@
|
|
|
1
1
|
import { init_paths_state, resolveStateDir } from "../../config/paths-state.js";
|
|
2
|
+
import { buildWorkflowDefinition } from "../../workflows/domain/definition-utils.js";
|
|
3
|
+
import { validateWorkflowGraph } from "../../workflows/domain/validation.js";
|
|
2
4
|
import { BUILTIN_WORKFLOWS } from "./builtins/index.js";
|
|
3
|
-
import { parseWorkflowScript } from "./parser.js";
|
|
4
5
|
import { join } from "node:path";
|
|
5
|
-
import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, unlinkSync, writeFileSync } from "node:fs";
|
|
6
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync, unlinkSync, writeFileSync } from "node:fs";
|
|
7
|
+
import { randomUUID } from "node:crypto";
|
|
6
8
|
//#region src/agent/workflow/catalog.ts
|
|
7
|
-
/**
|
|
8
|
-
* Catalog for named workflows.
|
|
9
|
-
*
|
|
10
|
-
* Resolution order (built-ins are starting points, user workflows win):
|
|
11
|
-
* 1. `~/.xopc/workflows/<name>/workflow.js` (+ optional `manifest.json`)
|
|
12
|
-
* 2. `~/.xopc/workflows/<name>.js` (or `<name>.workflow.js`)
|
|
13
|
-
* 3. {@link BUILTIN_WORKFLOWS}
|
|
14
|
-
*
|
|
15
|
-
* The user dir is discovered via {@link resolveStateDir}, so `XOPC_STATE_DIR`
|
|
16
|
-
* overrides apply automatically (matches how skills / extensions are wired).
|
|
17
|
-
*
|
|
18
|
-
* Listing is filesystem-cheap (single `readdir`) and runs synchronously — the
|
|
19
|
-
* `/workflows` slash command is interactive and should return immediately.
|
|
20
|
-
*
|
|
21
|
-
* Validation: on load we re-parse the script to make sure `meta.name` matches
|
|
22
|
-
* the filename. This prevents copy-pasted scripts from being silently
|
|
23
|
-
* mis-addressed when invoked by name.
|
|
24
|
-
*/
|
|
25
9
|
init_paths_state();
|
|
26
10
|
const NAME_RE = /^[a-z][a-z0-9_-]*$/;
|
|
27
11
|
function createWorkflowCatalog(opts = {}) {
|
|
28
12
|
const userDir = opts.userDir ?? defaultUserDir();
|
|
13
|
+
const loadUser = (name) => {
|
|
14
|
+
const path = join(userDir, `${name}.json`);
|
|
15
|
+
if (!existsSync(path)) return null;
|
|
16
|
+
const parsed = JSON.parse(readFileSync(path, "utf-8"));
|
|
17
|
+
assertStoredDefinition(parsed, name, path);
|
|
18
|
+
return parsed;
|
|
19
|
+
};
|
|
29
20
|
const list = () => {
|
|
30
|
-
const
|
|
31
|
-
for (const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
estimatedAgents: meta?.estimatedAgents
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
for (const entry of safeListUserEntries(userDir)) {
|
|
44
|
-
const meta = safeMeta(readScript(entry.path));
|
|
45
|
-
const manifest = readManifest(entry.manifestPath);
|
|
46
|
-
entries.set(entry.name, {
|
|
47
|
-
name: entry.name,
|
|
48
|
-
source: "user",
|
|
49
|
-
path: entry.path,
|
|
50
|
-
description: manifest?.description ?? meta?.description ?? "(unparseable)",
|
|
51
|
-
title: manifest?.title,
|
|
52
|
-
version: manifest?.version,
|
|
53
|
-
whenToUse: manifest?.whenToUse ?? meta?.whenToUse,
|
|
54
|
-
tags: manifest?.tags ?? meta?.tags,
|
|
55
|
-
estimatedAgents: meta?.estimatedAgents
|
|
21
|
+
const definitions = /* @__PURE__ */ new Map();
|
|
22
|
+
for (const definition of BUILTIN_WORKFLOWS) definitions.set(definition.name, {
|
|
23
|
+
definition,
|
|
24
|
+
path: null
|
|
25
|
+
});
|
|
26
|
+
for (const name of listUserNames(userDir)) try {
|
|
27
|
+
const definition = loadUser(name);
|
|
28
|
+
if (definition) definitions.set(name, {
|
|
29
|
+
definition,
|
|
30
|
+
path: join(userDir, `${name}.json`)
|
|
56
31
|
});
|
|
57
|
-
}
|
|
58
|
-
return [...
|
|
32
|
+
} catch {}
|
|
33
|
+
return [...definitions.values()].map(({ definition, path }) => toCatalogEntry(definition, path)).sort((left, right) => left.name.localeCompare(right.name));
|
|
59
34
|
};
|
|
60
35
|
const load = (name) => {
|
|
61
36
|
requireValidName(name);
|
|
62
|
-
const
|
|
63
|
-
if (
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
return {
|
|
68
|
-
name,
|
|
69
|
-
source: "user",
|
|
70
|
-
script,
|
|
71
|
-
meta,
|
|
72
|
-
path: userEntry.path,
|
|
73
|
-
manifest: readManifest(userEntry.manifestPath)
|
|
74
|
-
};
|
|
75
|
-
}
|
|
76
|
-
const builtin = BUILTIN_WORKFLOWS.find((b) => b.name === name);
|
|
77
|
-
if (builtin) {
|
|
78
|
-
const { meta } = parseWorkflowScript(builtin.script);
|
|
79
|
-
ensureMetaNameMatches(meta, name, "<builtin>");
|
|
80
|
-
return {
|
|
81
|
-
name,
|
|
82
|
-
source: "builtin",
|
|
83
|
-
script: builtin.script,
|
|
84
|
-
meta,
|
|
85
|
-
path: null
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
throw new Error(`workflow not found: ${name}. Drop a script at ${join(userDir, `${name}.js`)} or pick one of: ${list().map((e) => e.name).join(", ")}`);
|
|
37
|
+
const user = loadUser(name);
|
|
38
|
+
if (user) return structuredClone(user);
|
|
39
|
+
const builtin = BUILTIN_WORKFLOWS.find((definition) => definition.name === name);
|
|
40
|
+
if (builtin) return structuredClone(builtin);
|
|
41
|
+
throw new Error(`workflow not found: ${name}`);
|
|
89
42
|
};
|
|
90
|
-
const save = (
|
|
43
|
+
const save = (input) => {
|
|
44
|
+
const name = input.name.trim();
|
|
91
45
|
requireValidName(name);
|
|
92
|
-
const
|
|
93
|
-
if (
|
|
46
|
+
const validation = validateWorkflowGraph(input.graph);
|
|
47
|
+
if (!validation.valid) throw new Error(validation.errors.map((issue) => issue.message).join(" "));
|
|
48
|
+
const existing = loadUser(name);
|
|
49
|
+
const builtin = BUILTIN_WORKFLOWS.find((definition) => definition.name === name);
|
|
50
|
+
if (input.intent === "create" && (existing || builtin)) throw new WorkflowNameConflictError(name, existing?.revision ?? builtin?.revision ?? 0);
|
|
51
|
+
if (input.expectedRevision !== void 0 && input.expectedRevision !== (existing?.revision ?? 0)) throw new WorkflowRevisionConflictError(existing?.revision ?? 0);
|
|
52
|
+
const definition = buildWorkflowDefinition({
|
|
53
|
+
name,
|
|
54
|
+
source: "user",
|
|
55
|
+
graph: input.graph,
|
|
56
|
+
manifest: input.manifest,
|
|
57
|
+
revision: (existing?.revision ?? 0) + 1,
|
|
58
|
+
createdAtMs: existing?.metadata.createdAtMs
|
|
59
|
+
});
|
|
94
60
|
if (!existsSync(userDir)) mkdirSync(userDir, { recursive: true });
|
|
95
|
-
const path = join(userDir, `${name}.
|
|
96
|
-
|
|
97
|
-
|
|
61
|
+
const path = join(userDir, `${name}.json`);
|
|
62
|
+
const revisionsDir = join(userDir, ".revisions", name);
|
|
63
|
+
mkdirSync(revisionsDir, { recursive: true });
|
|
64
|
+
writeJsonAtomic(join(revisionsDir, `${definition.revision}.json`), definition);
|
|
65
|
+
writeJsonAtomic(path, definition);
|
|
66
|
+
return {
|
|
67
|
+
path,
|
|
68
|
+
definition
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
const listRevisions = (name) => {
|
|
72
|
+
requireValidName(name);
|
|
73
|
+
const dir = join(userDir, ".revisions", name);
|
|
74
|
+
if (!existsSync(dir)) return [];
|
|
75
|
+
return readdirSync(dir).filter((file) => /^\d+\.json$/.test(file)).map((file) => {
|
|
76
|
+
try {
|
|
77
|
+
const definition = JSON.parse(readFileSync(join(dir, file), "utf-8"));
|
|
78
|
+
assertStoredDefinition(definition, name, join(dir, file));
|
|
79
|
+
return {
|
|
80
|
+
revision: definition.revision,
|
|
81
|
+
title: definition.title,
|
|
82
|
+
contentHash: definition.contentHash,
|
|
83
|
+
createdAtMs: definition.metadata.updatedAtMs
|
|
84
|
+
};
|
|
85
|
+
} catch {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
}).filter((item) => item !== null).sort((left, right) => right.revision - left.revision);
|
|
89
|
+
};
|
|
90
|
+
const loadRevision = (name, revision) => {
|
|
91
|
+
requireValidName(name);
|
|
92
|
+
if (!Number.isSafeInteger(revision) || revision < 1) throw new Error("invalid workflow revision");
|
|
93
|
+
const path = join(userDir, ".revisions", name, `${revision}.json`);
|
|
94
|
+
if (!existsSync(path)) throw new Error(`workflow revision not found: ${name}@${revision}`);
|
|
95
|
+
const definition = JSON.parse(readFileSync(path, "utf-8"));
|
|
96
|
+
assertStoredDefinition(definition, name, path);
|
|
97
|
+
return structuredClone(definition);
|
|
98
|
+
};
|
|
99
|
+
const restore = (name, revision, expectedRevision) => {
|
|
100
|
+
const selected = loadRevision(name, revision);
|
|
101
|
+
return save({
|
|
102
|
+
name,
|
|
103
|
+
graph: selected.graph,
|
|
104
|
+
manifest: definitionToManifest(selected),
|
|
105
|
+
expectedRevision
|
|
106
|
+
});
|
|
98
107
|
};
|
|
99
108
|
const remove = (name) => {
|
|
100
109
|
requireValidName(name);
|
|
101
|
-
const
|
|
102
|
-
if (!
|
|
103
|
-
unlinkSync(
|
|
110
|
+
const path = join(userDir, `${name}.json`);
|
|
111
|
+
if (!existsSync(path)) return false;
|
|
112
|
+
unlinkSync(path);
|
|
113
|
+
const revisionsDir = join(userDir, ".revisions", name);
|
|
114
|
+
if (existsSync(revisionsDir)) rmSync(revisionsDir, {
|
|
115
|
+
recursive: true,
|
|
116
|
+
force: true
|
|
117
|
+
});
|
|
104
118
|
return true;
|
|
105
119
|
};
|
|
106
120
|
return {
|
|
107
121
|
list,
|
|
108
122
|
load,
|
|
109
123
|
save,
|
|
124
|
+
listRevisions,
|
|
125
|
+
loadRevision,
|
|
126
|
+
restore,
|
|
110
127
|
remove,
|
|
111
128
|
userDir
|
|
112
129
|
};
|
|
113
130
|
}
|
|
131
|
+
var WorkflowRevisionConflictError = class extends Error {
|
|
132
|
+
constructor(currentRevision) {
|
|
133
|
+
super(`workflow revision conflict; current revision is ${currentRevision}`);
|
|
134
|
+
this.currentRevision = currentRevision;
|
|
135
|
+
this.name = "WorkflowRevisionConflictError";
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
var WorkflowNameConflictError = class extends Error {
|
|
139
|
+
constructor(workflowName, currentRevision) {
|
|
140
|
+
super(`workflow name already exists: ${workflowName}`);
|
|
141
|
+
this.workflowName = workflowName;
|
|
142
|
+
this.currentRevision = currentRevision;
|
|
143
|
+
this.name = "WorkflowNameConflictError";
|
|
144
|
+
}
|
|
145
|
+
};
|
|
114
146
|
function defaultUserDir() {
|
|
115
147
|
return join(resolveStateDir(), "workflows");
|
|
116
148
|
}
|
|
117
|
-
function
|
|
149
|
+
function listUserNames(dir) {
|
|
118
150
|
try {
|
|
119
|
-
if (!existsSync(dir)) return [];
|
|
120
|
-
|
|
121
|
-
const entries = [];
|
|
122
|
-
for (const file of readdirSync(dir)) {
|
|
123
|
-
const full = join(dir, file);
|
|
124
|
-
if (statSync(full).isDirectory()) {
|
|
125
|
-
const workflowPath = join(full, "workflow.js");
|
|
126
|
-
if (existsSync(workflowPath) && isValidName(file)) entries.push({
|
|
127
|
-
name: file,
|
|
128
|
-
path: workflowPath,
|
|
129
|
-
manifestPath: join(full, "manifest.json")
|
|
130
|
-
});
|
|
131
|
-
continue;
|
|
132
|
-
}
|
|
133
|
-
if (!/\.(js|workflow\.js)$/i.test(file)) continue;
|
|
134
|
-
const name = stripExt(file);
|
|
135
|
-
if (!isValidName(name)) continue;
|
|
136
|
-
entries.push({
|
|
137
|
-
name,
|
|
138
|
-
path: full
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
return entries;
|
|
151
|
+
if (!existsSync(dir) || !statSync(dir).isDirectory()) return [];
|
|
152
|
+
return readdirSync(dir).filter((file) => file.endsWith(".json")).map((file) => file.slice(0, -5)).filter((name) => NAME_RE.test(name));
|
|
142
153
|
} catch {
|
|
143
154
|
return [];
|
|
144
155
|
}
|
|
145
156
|
}
|
|
146
|
-
function
|
|
147
|
-
|
|
148
|
-
if (
|
|
149
|
-
name,
|
|
150
|
-
path: dirWorkflowPath,
|
|
151
|
-
manifestPath: join(dir, name, "manifest.json")
|
|
152
|
-
};
|
|
153
|
-
for (const candidate of [`${name}.js`, `${name}.workflow.js`]) {
|
|
154
|
-
const full = join(dir, candidate);
|
|
155
|
-
if (existsSync(full)) return {
|
|
156
|
-
name,
|
|
157
|
-
path: full
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
return null;
|
|
157
|
+
function assertStoredDefinition(value, name, path) {
|
|
158
|
+
if (!value || typeof value !== "object" || value.name !== name || value.metadata?.source !== "user") throw new Error(`invalid workflow definition: ${path}`);
|
|
159
|
+
if (!validateWorkflowGraph(value.graph).valid) throw new Error(`invalid workflow graph: ${path}`);
|
|
161
160
|
}
|
|
162
|
-
function
|
|
163
|
-
return
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
}
|
|
175
|
-
function safeMeta(script) {
|
|
176
|
-
try {
|
|
177
|
-
return parseWorkflowScript(script).meta;
|
|
178
|
-
} catch {
|
|
179
|
-
return null;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
function stripExt(filename) {
|
|
183
|
-
return filename.replace(/\.workflow\.js$/i, "").replace(/\.js$/i, "");
|
|
184
|
-
}
|
|
185
|
-
function isValidName(name) {
|
|
186
|
-
return NAME_RE.test(name);
|
|
161
|
+
function toCatalogEntry(definition, path) {
|
|
162
|
+
return {
|
|
163
|
+
name: definition.name,
|
|
164
|
+
source: definition.metadata.source,
|
|
165
|
+
path,
|
|
166
|
+
description: definition.description,
|
|
167
|
+
title: definition.title,
|
|
168
|
+
version: definition.version,
|
|
169
|
+
revision: definition.revision,
|
|
170
|
+
whenToUse: definition.metadata.whenToUse,
|
|
171
|
+
tags: definition.metadata.tags,
|
|
172
|
+
estimatedAgents: definition.metadata.estimatedAgents
|
|
173
|
+
};
|
|
187
174
|
}
|
|
188
175
|
function requireValidName(name) {
|
|
189
|
-
if (!
|
|
176
|
+
if (!NAME_RE.test(name)) throw new Error(`invalid workflow name "${name}"; use lowercase letters, numbers, underscores, or hyphens`);
|
|
190
177
|
}
|
|
191
|
-
function
|
|
192
|
-
|
|
178
|
+
function writeJsonAtomic(path, value) {
|
|
179
|
+
const temporaryPath = `${path}.${randomUUID()}.tmp`;
|
|
180
|
+
writeFileSync(temporaryPath, `${JSON.stringify(value, null, 2)}\n`, "utf-8");
|
|
181
|
+
renameSync(temporaryPath, path);
|
|
193
182
|
}
|
|
194
|
-
function
|
|
195
|
-
return
|
|
183
|
+
function definitionToManifest(definition) {
|
|
184
|
+
return {
|
|
185
|
+
title: definition.title,
|
|
186
|
+
description: definition.description,
|
|
187
|
+
version: definition.version,
|
|
188
|
+
inputSchema: definition.inputSchema,
|
|
189
|
+
outputSchema: definition.outputSchema,
|
|
190
|
+
defaults: definition.defaults,
|
|
191
|
+
tags: definition.metadata.tags,
|
|
192
|
+
whenToUse: definition.metadata.whenToUse,
|
|
193
|
+
estimatedAgents: definition.metadata.estimatedAgents,
|
|
194
|
+
examplePrompts: definition.metadata.examplePrompts,
|
|
195
|
+
i18n: definition.metadata.i18n,
|
|
196
|
+
permissions: definition.permissions,
|
|
197
|
+
resources: definition.resources,
|
|
198
|
+
connectors: definition.connectors
|
|
199
|
+
};
|
|
196
200
|
}
|
|
197
201
|
//#endregion
|
|
198
|
-
export { createWorkflowCatalog, defaultUserDir };
|
|
202
|
+
export { WorkflowNameConflictError, WorkflowRevisionConflictError, createWorkflowCatalog, defaultUserDir };
|
|
199
203
|
|
|
200
204
|
//# sourceMappingURL=catalog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.js","names":[],"sources":["../../../../src/agent/workflow/catalog.ts"],"sourcesContent":["/**\n * Catalog for named workflows.\n *\n * Resolution order (built-ins are starting points, user workflows win):\n * 1. `~/.xopc/workflows/<name>/workflow.js` (+ optional `manifest.json`)\n * 2. `~/.xopc/workflows/<name>.js` (or `<name>.workflow.js`)\n * 3. {@link BUILTIN_WORKFLOWS}\n *\n * The user dir is discovered via {@link resolveStateDir}, so `XOPC_STATE_DIR`\n * overrides apply automatically (matches how skills / extensions are wired).\n *\n * Listing is filesystem-cheap (single `readdir`) and runs synchronously — the\n * `/workflows` slash command is interactive and should return immediately.\n *\n * Validation: on load we re-parse the script to make sure `meta.name` matches\n * the filename. This prevents copy-pasted scripts from being silently\n * mis-addressed when invoked by name.\n */\n\nimport {\n existsSync,\n mkdirSync,\n readdirSync,\n readFileSync,\n statSync,\n unlinkSync,\n writeFileSync,\n} from 'node:fs';\nimport { join } from 'node:path';\n\nimport type { WorkflowDefinitionManifest } from '../../workflows/domain/definition.js';\n\nimport { resolveStateDir } from '../../config/paths-state.js';\n\nimport { BUILTIN_WORKFLOWS } from './builtins/index.js';\nimport { parseWorkflowScript } from './parser.js';\nimport type { WorkflowMeta } from './types.js';\n\nexport type WorkflowSource = 'user' | 'builtin';\n\nexport interface CatalogEntry {\n name: string;\n source: WorkflowSource;\n /** Absolute path for user entries; null for built-ins (in-memory). */\n path: string | null;\n description: string;\n title?: string;\n version?: string;\n whenToUse?: string;\n tags?: string[];\n estimatedAgents?: { min: number; max: number };\n}\n\nexport interface LoadedWorkflow {\n name: string;\n source: WorkflowSource;\n script: string;\n meta: WorkflowMeta;\n path: string | null;\n manifest?: WorkflowDefinitionManifest;\n}\n\nexport interface WorkflowCatalog {\n list(): CatalogEntry[];\n /** Load a named workflow. Throws if missing or meta.name disagrees with filename. */\n load(name: string): LoadedWorkflow;\n /** Save a script as a user workflow. Throws if the script fails to parse. */\n save(name: string, script: string): { path: string };\n /** Remove a user workflow. No-op if absent. Built-ins are never removed. */\n remove(name: string): boolean;\n /** Absolute path to the user workflows directory (created lazily on save). */\n userDir: string;\n}\n\nconst NAME_RE = /^[a-z][a-z0-9_-]*$/;\n\nexport function createWorkflowCatalog(opts: { userDir?: string } = {}): WorkflowCatalog {\n const userDir = opts.userDir ?? defaultUserDir();\n\n const list = (): CatalogEntry[] => {\n const entries = new Map<string, CatalogEntry>();\n for (const b of BUILTIN_WORKFLOWS) {\n const meta = safeMeta(b.script);\n entries.set(b.name, {\n name: b.name,\n source: 'builtin',\n path: null,\n description: meta?.description ?? '(unparseable)',\n whenToUse: meta?.whenToUse,\n tags: meta?.tags,\n estimatedAgents: meta?.estimatedAgents,\n });\n }\n for (const entry of safeListUserEntries(userDir)) {\n const meta = safeMeta(readScript(entry.path));\n const manifest = readManifest(entry.manifestPath);\n // User wins on collision.\n entries.set(entry.name, {\n name: entry.name,\n source: 'user',\n path: entry.path,\n description: manifest?.description ?? meta?.description ?? '(unparseable)',\n title: manifest?.title,\n version: manifest?.version,\n whenToUse: manifest?.whenToUse ?? meta?.whenToUse,\n tags: manifest?.tags ?? meta?.tags,\n estimatedAgents: meta?.estimatedAgents,\n });\n }\n return [...entries.values()].sort((a, b) => a.name.localeCompare(b.name));\n };\n\n const load = (name: string): LoadedWorkflow => {\n requireValidName(name);\n const userEntry = findUserEntry(userDir, name);\n if (userEntry) {\n const script = readScript(userEntry.path);\n const { meta } = parseWorkflowScript(script);\n ensureMetaNameMatches(meta, name, userEntry.path);\n return {\n name,\n source: 'user',\n script,\n meta,\n path: userEntry.path,\n manifest: readManifest(userEntry.manifestPath),\n };\n }\n const builtin = BUILTIN_WORKFLOWS.find((b) => b.name === name);\n if (builtin) {\n const { meta } = parseWorkflowScript(builtin.script);\n ensureMetaNameMatches(meta, name, '<builtin>');\n return { name, source: 'builtin', script: builtin.script, meta, path: null };\n }\n throw new Error(\n `workflow not found: ${name}. Drop a script at ${join(userDir, `${name}.js`)} or pick one of: ${list()\n .map((e) => e.name)\n .join(', ')}`,\n );\n };\n\n const save = (name: string, script: string): { path: string } => {\n requireValidName(name);\n const { meta } = parseWorkflowScript(script);\n if (meta.name !== name) {\n throw new Error(\n `meta.name \"${meta.name}\" does not match save name \"${name}\". Adjust one to match the other.`,\n );\n }\n if (!existsSync(userDir)) {\n mkdirSync(userDir, { recursive: true });\n }\n const path = join(userDir, `${name}.js`);\n writeFileSync(path, normalizeNewlines(script), 'utf-8');\n return { path };\n };\n\n const remove = (name: string): boolean => {\n requireValidName(name);\n const userEntry = findUserEntry(userDir, name);\n if (!userEntry) return false;\n unlinkSync(userEntry.path);\n return true;\n };\n\n return { list, load, save, remove, userDir };\n}\n\n// ---------------------------------------------------------------------------\n\nexport function defaultUserDir(): string {\n return join(resolveStateDir(), 'workflows');\n}\n\ninterface UserWorkflowEntry {\n name: string;\n path: string;\n manifestPath?: string;\n}\n\nfunction safeListUserEntries(dir: string): UserWorkflowEntry[] {\n try {\n if (!existsSync(dir)) return [];\n const st = statSync(dir);\n if (!st.isDirectory()) return [];\n const entries: UserWorkflowEntry[] = [];\n for (const file of readdirSync(dir)) {\n const full = join(dir, file);\n const fileStat = statSync(full);\n if (fileStat.isDirectory()) {\n const workflowPath = join(full, 'workflow.js');\n if (existsSync(workflowPath) && isValidName(file)) {\n entries.push({ name: file, path: workflowPath, manifestPath: join(full, 'manifest.json') });\n }\n continue;\n }\n if (!/\\.(js|workflow\\.js)$/i.test(file)) continue;\n const name = stripExt(file);\n if (!isValidName(name)) continue;\n entries.push({ name, path: full });\n }\n return entries;\n } catch {\n return [];\n }\n}\n\nfunction findUserEntry(dir: string, name: string): UserWorkflowEntry | null {\n const dirWorkflowPath = join(dir, name, 'workflow.js');\n if (existsSync(dirWorkflowPath)) {\n return { name, path: dirWorkflowPath, manifestPath: join(dir, name, 'manifest.json') };\n }\n for (const candidate of [`${name}.js`, `${name}.workflow.js`]) {\n const full = join(dir, candidate);\n if (existsSync(full)) return { name, path: full };\n }\n return null;\n}\n\nfunction readScript(path: string): string {\n return readFileSync(path, 'utf-8');\n}\n\nfunction readManifest(path: string | undefined): WorkflowDefinitionManifest | undefined {\n if (!path || !existsSync(path)) return undefined;\n try {\n const value = JSON.parse(readFileSync(path, 'utf-8')) as WorkflowDefinitionManifest;\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\n return value;\n } catch {\n return undefined;\n }\n}\n\nfunction safeMeta(script: string): WorkflowMeta | null {\n try {\n return parseWorkflowScript(script).meta;\n } catch {\n return null;\n }\n}\n\nfunction stripExt(filename: string): string {\n return filename.replace(/\\.workflow\\.js$/i, '').replace(/\\.js$/i, '');\n}\n\nfunction isValidName(name: string): boolean {\n return NAME_RE.test(name);\n}\n\nfunction requireValidName(name: string): void {\n if (!isValidName(name)) {\n throw new Error(`invalid workflow name \"${name}\". Use lowercase snake_case, e.g. \"audit_repo\".`);\n }\n}\n\nfunction ensureMetaNameMatches(meta: WorkflowMeta, name: string, locator: string): void {\n if (meta.name !== name) {\n throw new Error(\n `workflow ${locator}: meta.name \"${meta.name}\" disagrees with addressable name \"${name}\". ` +\n 'Rename the file or the meta.name to match.',\n );\n }\n}\n\nfunction normalizeNewlines(s: string): string {\n return s.endsWith('\\n') ? s : `${s}\\n`;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"catalog.js","names":[],"sources":["../../../../src/agent/workflow/catalog.ts"],"sourcesContent":["import { existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, statSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { randomUUID } from 'node:crypto';\nimport { join } from 'node:path';\n\nimport type { WorkflowDefinition, WorkflowDefinitionManifest, WorkflowGraph } from '../../workflows/domain/definition.js';\nimport { buildWorkflowDefinition } from '../../workflows/domain/definition-utils.js';\nimport { validateWorkflowGraph } from '../../workflows/domain/validation.js';\nimport { resolveStateDir } from '../../config/paths-state.js';\n\nimport { BUILTIN_WORKFLOWS } from './builtins/index.js';\n\nexport type WorkflowSource = 'user' | 'builtin';\n\nexport interface CatalogEntry {\n name: string;\n source: WorkflowSource;\n path: string | null;\n description: string;\n title: string;\n version: string;\n revision: number;\n whenToUse?: string;\n tags?: string[];\n estimatedAgents?: { min: number; max: number };\n}\n\nexport interface SaveWorkflowInput {\n name: string;\n graph: WorkflowGraph;\n manifest?: WorkflowDefinitionManifest;\n expectedRevision?: number;\n intent?: 'create' | 'update';\n}\n\nexport interface WorkflowRevisionSummary {\n revision: number;\n title: string;\n contentHash?: string;\n createdAtMs: number;\n}\n\nexport interface WorkflowCatalog {\n list(): CatalogEntry[];\n load(name: string): WorkflowDefinition;\n save(input: SaveWorkflowInput): { path: string; definition: WorkflowDefinition };\n listRevisions(name: string): WorkflowRevisionSummary[];\n loadRevision(name: string, revision: number): WorkflowDefinition;\n restore(name: string, revision: number, expectedRevision: number): { path: string; definition: WorkflowDefinition };\n remove(name: string): boolean;\n userDir: string;\n}\n\nconst NAME_RE = /^[a-z][a-z0-9_-]*$/;\n\nexport function createWorkflowCatalog(opts: { userDir?: string } = {}): WorkflowCatalog {\n const userDir = opts.userDir ?? defaultUserDir();\n\n const loadUser = (name: string): WorkflowDefinition | null => {\n const path = join(userDir, `${name}.json`);\n if (!existsSync(path)) return null;\n const parsed = JSON.parse(readFileSync(path, 'utf-8')) as WorkflowDefinition;\n assertStoredDefinition(parsed, name, path);\n return parsed;\n };\n\n const list = (): CatalogEntry[] => {\n const definitions = new Map<string, { definition: WorkflowDefinition; path: string | null }>();\n for (const definition of BUILTIN_WORKFLOWS) definitions.set(definition.name, { definition, path: null });\n for (const name of listUserNames(userDir)) {\n try {\n const definition = loadUser(name);\n if (definition) definitions.set(name, { definition, path: join(userDir, `${name}.json`) });\n } catch {\n // Invalid files are not addressable workflows.\n }\n }\n return [...definitions.values()]\n .map(({ definition, path }) => toCatalogEntry(definition, path))\n .sort((left, right) => left.name.localeCompare(right.name));\n };\n\n const load = (name: string): WorkflowDefinition => {\n requireValidName(name);\n const user = loadUser(name);\n if (user) return structuredClone(user);\n const builtin = BUILTIN_WORKFLOWS.find((definition) => definition.name === name);\n if (builtin) return structuredClone(builtin);\n throw new Error(`workflow not found: ${name}`);\n };\n\n const save = (input: SaveWorkflowInput): { path: string; definition: WorkflowDefinition } => {\n const name = input.name.trim();\n requireValidName(name);\n const validation = validateWorkflowGraph(input.graph);\n if (!validation.valid) throw new Error(validation.errors.map((issue) => issue.message).join(' '));\n const existing = loadUser(name);\n const builtin = BUILTIN_WORKFLOWS.find((definition) => definition.name === name);\n if (input.intent === 'create' && (existing || builtin)) {\n throw new WorkflowNameConflictError(name, existing?.revision ?? builtin?.revision ?? 0);\n }\n if (input.expectedRevision !== undefined && input.expectedRevision !== (existing?.revision ?? 0)) {\n throw new WorkflowRevisionConflictError(existing?.revision ?? 0);\n }\n const definition = buildWorkflowDefinition({\n name,\n source: 'user',\n graph: input.graph,\n manifest: input.manifest,\n revision: (existing?.revision ?? 0) + 1,\n createdAtMs: existing?.metadata.createdAtMs,\n });\n if (!existsSync(userDir)) mkdirSync(userDir, { recursive: true });\n const path = join(userDir, `${name}.json`);\n const revisionsDir = join(userDir, '.revisions', name);\n mkdirSync(revisionsDir, { recursive: true });\n writeJsonAtomic(join(revisionsDir, `${definition.revision}.json`), definition);\n writeJsonAtomic(path, definition);\n return { path, definition };\n };\n\n const listRevisions = (name: string): WorkflowRevisionSummary[] => {\n requireValidName(name);\n const dir = join(userDir, '.revisions', name);\n if (!existsSync(dir)) return [];\n return readdirSync(dir)\n .filter((file) => /^\\d+\\.json$/.test(file))\n .map((file): WorkflowRevisionSummary | null => {\n try {\n const definition = JSON.parse(readFileSync(join(dir, file), 'utf-8')) as WorkflowDefinition;\n assertStoredDefinition(definition, name, join(dir, file));\n return { revision: definition.revision, title: definition.title, contentHash: definition.contentHash, createdAtMs: definition.metadata.updatedAtMs };\n } catch {\n return null;\n }\n })\n .filter((item): item is WorkflowRevisionSummary => item !== null)\n .sort((left, right) => right.revision - left.revision);\n };\n\n const loadRevision = (name: string, revision: number): WorkflowDefinition => {\n requireValidName(name);\n if (!Number.isSafeInteger(revision) || revision < 1) throw new Error('invalid workflow revision');\n const path = join(userDir, '.revisions', name, `${revision}.json`);\n if (!existsSync(path)) throw new Error(`workflow revision not found: ${name}@${revision}`);\n const definition = JSON.parse(readFileSync(path, 'utf-8')) as WorkflowDefinition;\n assertStoredDefinition(definition, name, path);\n return structuredClone(definition);\n };\n\n const restore = (name: string, revision: number, expectedRevision: number) => {\n const selected = loadRevision(name, revision);\n return save({ name, graph: selected.graph, manifest: definitionToManifest(selected), expectedRevision });\n };\n\n const remove = (name: string): boolean => {\n requireValidName(name);\n const path = join(userDir, `${name}.json`);\n if (!existsSync(path)) return false;\n unlinkSync(path);\n const revisionsDir = join(userDir, '.revisions', name);\n if (existsSync(revisionsDir)) rmSync(revisionsDir, { recursive: true, force: true });\n return true;\n };\n\n return { list, load, save, listRevisions, loadRevision, restore, remove, userDir };\n}\n\nexport class WorkflowRevisionConflictError extends Error {\n constructor(readonly currentRevision: number) {\n super(`workflow revision conflict; current revision is ${currentRevision}`);\n this.name = 'WorkflowRevisionConflictError';\n }\n}\n\nexport class WorkflowNameConflictError extends Error {\n constructor(readonly workflowName: string, readonly currentRevision: number) {\n super(`workflow name already exists: ${workflowName}`);\n this.name = 'WorkflowNameConflictError';\n }\n}\n\nexport function defaultUserDir(): string {\n return join(resolveStateDir(), 'workflows');\n}\n\nfunction listUserNames(dir: string): string[] {\n try {\n if (!existsSync(dir) || !statSync(dir).isDirectory()) return [];\n return readdirSync(dir)\n .filter((file) => file.endsWith('.json'))\n .map((file) => file.slice(0, -5))\n .filter((name) => NAME_RE.test(name));\n } catch {\n return [];\n }\n}\n\nfunction assertStoredDefinition(value: WorkflowDefinition, name: string, path: string): void {\n if (!value || typeof value !== 'object' || value.name !== name || value.metadata?.source !== 'user') {\n throw new Error(`invalid workflow definition: ${path}`);\n }\n const validation = validateWorkflowGraph(value.graph);\n if (!validation.valid) throw new Error(`invalid workflow graph: ${path}`);\n}\n\nfunction toCatalogEntry(definition: WorkflowDefinition, path: string | null): CatalogEntry {\n return {\n name: definition.name,\n source: definition.metadata.source,\n path,\n description: definition.description,\n title: definition.title,\n version: definition.version,\n revision: definition.revision,\n whenToUse: definition.metadata.whenToUse,\n tags: definition.metadata.tags,\n estimatedAgents: definition.metadata.estimatedAgents,\n };\n}\n\nfunction requireValidName(name: string): void {\n if (!NAME_RE.test(name)) throw new Error(`invalid workflow name \"${name}\"; use lowercase letters, numbers, underscores, or hyphens`);\n}\n\nfunction writeJsonAtomic(path: string, value: unknown): void {\n const temporaryPath = `${path}.${randomUUID()}.tmp`;\n writeFileSync(temporaryPath, `${JSON.stringify(value, null, 2)}\\n`, 'utf-8');\n renameSync(temporaryPath, path);\n}\n\nfunction definitionToManifest(definition: WorkflowDefinition): WorkflowDefinitionManifest {\n return {\n title: definition.title,\n description: definition.description,\n version: definition.version,\n inputSchema: definition.inputSchema,\n outputSchema: definition.outputSchema,\n defaults: definition.defaults,\n tags: definition.metadata.tags,\n whenToUse: definition.metadata.whenToUse,\n estimatedAgents: definition.metadata.estimatedAgents,\n examplePrompts: definition.metadata.examplePrompts,\n i18n: definition.metadata.i18n,\n permissions: definition.permissions,\n resources: definition.resources,\n connectors: definition.connectors,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
export { applySubagentProgress } from './agent-progress.js';
|
|
2
|
-
export { BUILTIN_WORKFLOWS
|
|
3
|
-
export { createWorkflowCatalog, defaultUserDir, type CatalogEntry, type
|
|
4
|
-
export { getLastWorkflowMemory, _resetLastWorkflowMemoryForTests, type LastWorkflowEntry, type LastWorkflowMemory, } from './last-run-memory.js';
|
|
2
|
+
export { BUILTIN_WORKFLOWS } from './builtins/index.js';
|
|
3
|
+
export { createWorkflowCatalog, defaultUserDir, type CatalogEntry, type SaveWorkflowInput, type WorkflowCatalog, type WorkflowSource, } from './catalog.js';
|
|
5
4
|
export type { ChannelProgressCapability, WorkflowProgressMode, WorkflowProgressPostInput, WorkflowProgressPostResult, } from './channel-capability.js';
|
|
6
|
-
export { parseWorkflowScript, type ParsedWorkflow } from './parser.js';
|
|
7
5
|
export { WorkflowProgressBroker, getWorkflowProgressBroker, _resetWorkflowProgressBrokerForTests, type BrokerListenerHandle, type SessionBusLike, } from './progress-broker.js';
|
|
8
|
-
export { emptySnapshotFor
|
|
6
|
+
export { emptySnapshotFor } from './snapshot-empty.js';
|
|
9
7
|
export { createWorkflowSnapshot, previewValue, recomputeCounts, renderWorkflowText, type RenderOptions, } from './snapshot.js';
|
|
10
8
|
export { createStructuredOutputTool, STRUCTURED_OUTPUT_TOOL_NAME, type CreateStructuredOutputToolOptions, type StructuredOutputCapture, } from './structured-output-tool.js';
|
|
11
9
|
export { DelegateSubagentRunner, type DelegateSubagentRunnerDeps, } from './subagent-runner.js';
|
|
12
|
-
export type {
|
|
10
|
+
export type { JsonSchema, SubagentRunner, SubagentRunOptions, SubagentProgressEvent, WorkflowAgentSnapshot, WorkflowAgentStatus, WorkflowAgentStep, WorkflowRunOptions, WorkflowRunResult, WorkflowSnapshot, WorkflowSnapshotDefinition, } from './types.js';
|
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import { emptySnapshotFor } from "./snapshot-empty.js";
|
|
2
2
|
import { createWorkflowSnapshot, previewValue, recomputeCounts, renderWorkflowText } from "./snapshot.js";
|
|
3
|
-
import { applySubagentProgress } from "./agent-progress.js";
|
|
4
3
|
import { BUILTIN_WORKFLOWS } from "./builtins/index.js";
|
|
5
|
-
import { parseWorkflowScript } from "./parser.js";
|
|
6
4
|
import { createWorkflowCatalog, defaultUserDir } from "./catalog.js";
|
|
7
|
-
import {
|
|
5
|
+
import { applySubagentProgress } from "./agent-progress.js";
|
|
8
6
|
import { WorkflowProgressBroker, _resetWorkflowProgressBrokerForTests, getWorkflowProgressBroker } from "./progress-broker.js";
|
|
9
|
-
import { runWorkflow } from "./runtime.js";
|
|
10
7
|
import { STRUCTURED_OUTPUT_TOOL_NAME, createStructuredOutputTool } from "./structured-output-tool.js";
|
|
11
8
|
import { DelegateSubagentRunner } from "./subagent-runner.js";
|
|
12
|
-
export { BUILTIN_WORKFLOWS, DelegateSubagentRunner, STRUCTURED_OUTPUT_TOOL_NAME, WorkflowProgressBroker,
|
|
9
|
+
export { BUILTIN_WORKFLOWS, DelegateSubagentRunner, STRUCTURED_OUTPUT_TOOL_NAME, WorkflowProgressBroker, _resetWorkflowProgressBrokerForTests, applySubagentProgress, createStructuredOutputTool, createWorkflowCatalog, createWorkflowSnapshot, defaultUserDir, emptySnapshotFor, getWorkflowProgressBroker, previewValue, recomputeCounts, renderWorkflowText };
|
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
* a text rendering through `onUpdate` — keeping TUI / Gateway / IM consumers in
|
|
7
7
|
* lock-step from a single source of truth.
|
|
8
8
|
*/
|
|
9
|
-
import type {
|
|
10
|
-
export declare function createWorkflowSnapshot(
|
|
9
|
+
import type { WorkflowSnapshotDefinition, WorkflowSnapshot } from './types.js';
|
|
10
|
+
export declare function createWorkflowSnapshot(definition: WorkflowSnapshotDefinition): WorkflowSnapshot;
|
|
11
11
|
export declare function recomputeCounts(snapshot: WorkflowSnapshot): void;
|
|
12
12
|
export interface RenderOptions {
|
|
13
13
|
maxAgentsPerPhase?: number;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { emptySnapshotFor } from "./snapshot-empty.js";
|
|
2
2
|
//#region src/agent/workflow/snapshot.ts
|
|
3
|
-
function createWorkflowSnapshot(
|
|
4
|
-
return emptySnapshotFor(
|
|
3
|
+
function createWorkflowSnapshot(definition) {
|
|
4
|
+
return emptySnapshotFor(definition.name, definition.description, definition.phases?.map((phase) => phase.title));
|
|
5
5
|
}
|
|
6
6
|
function recomputeCounts(snapshot) {
|
|
7
7
|
let running = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"snapshot.js","names":[],"sources":["../../../../src/agent/workflow/snapshot.ts"],"sourcesContent":["/**\n * Workflow progress snapshot model + text renderers.\n *\n * The runtime emits per-event callbacks (`onPhase`, `onAgentStart`, `onAgentEnd`,\n * `onLog`). The workflow tool wraps those callbacks to mutate a snapshot and push\n * a text rendering through `onUpdate` — keeping TUI / Gateway / IM consumers in\n * lock-step from a single source of truth.\n */\n\nimport type {\n WorkflowAgentSnapshot,\n WorkflowAgentStatus,\n WorkflowMeta,\n WorkflowSnapshot,\n} from './types.js';\nimport { emptySnapshotFor } from './snapshot-empty.js';\n\nexport function createWorkflowSnapshot(meta: WorkflowMeta): WorkflowSnapshot {\n return emptySnapshotFor(\n meta.name,\n meta.description,\n meta.phases?.map((p) => p.title),\n );\n}\n\nexport function recomputeCounts(snapshot: WorkflowSnapshot): void {\n let running = 0;\n let done = 0;\n let error = 0;\n let skipped = 0;\n for (const agent of snapshot.agents) {\n switch (agent.status) {\n case 'running':\n running++;\n break;\n case 'done':\n done++;\n break;\n case 'error':\n error++;\n break;\n case 'skipped':\n skipped++;\n break;\n }\n }\n snapshot.agentCount = snapshot.agents.length;\n snapshot.runningCount = running;\n snapshot.doneCount = done;\n snapshot.errorCount = error;\n snapshot.skippedCount = skipped;\n}\n\nexport interface RenderOptions {\n maxAgentsPerPhase?: number;\n maxLogs?: number;\n showResultPreviews?: boolean;\n}\n\nexport type WorkflowPanelStatus =\n | 'queued'\n | 'running'\n | 'succeeded'\n | 'failed'\n | 'cancelled'\n | 'timeout'\n | string;\n\nexport interface WorkflowPanelOptions {\n status?: WorkflowPanelStatus;\n maxActiveAgents?: number;\n maxRecentAgents?: number;\n maxErrors?: number;\n nowMs?: number;\n}\n\nexport function renderWorkflowText(\n snapshot: WorkflowSnapshot,\n completed = false,\n options: RenderOptions = {},\n): string {\n const maxAgentsPerPhase = options.maxAgentsPerPhase ?? 6;\n const maxLogs = options.maxLogs ?? 2;\n const showPreviews = options.showResultPreviews ?? false;\n\n const state = stateSuffix(snapshot);\n const header = completed\n ? `◆ workflow ✓ ${snapshot.name} (${snapshot.doneCount}/${snapshot.agentCount} done${state})`\n : `◆ workflow: ${snapshot.name} (${snapshot.doneCount}/${snapshot.agentCount} done${state})`;\n const lines = [header];\n\n const phaseNames = uniqueOrdered([\n ...snapshot.phases,\n ...(snapshot.currentPhase ? [snapshot.currentPhase] : []),\n ...snapshot.agents.map((a) => a.phase).filter((p): p is string => Boolean(p)),\n ]);\n const rendered = new Set<WorkflowAgentSnapshot>();\n\n for (const phase of phaseNames) {\n const agents = snapshot.agents.filter((a) => a.phase === phase);\n if (agents.length === 0 && snapshot.currentPhase !== phase) continue;\n for (const a of agents) rendered.add(a);\n\n const counts = countAgents(agents);\n const completeHere = agents.length > 0 && counts.done + counts.error + counts.skipped === agents.length;\n const marker =\n counts.running > 0 || (!completeHere && snapshot.currentPhase === phase)\n ? '▶'\n : completeHere\n ? '✓'\n : ' ';\n\n const tail =\n (counts.running ? ` · ${counts.running} running` : '') +\n (counts.error ? ` · ${counts.error} errors` : '') +\n (counts.skipped ? ` · ${counts.skipped} skipped` : '');\n lines.push(` ${marker} ${phase} ${counts.done}/${agents.length}${tail}`);\n\n const visible = agents.slice(-maxAgentsPerPhase);\n for (const agent of visible) {\n const previewText = showPreviews && agent.resultPreview ? ` — ${agent.resultPreview}` : '';\n lines.push(\n ` #${agent.id} ${statusIcon(agent.status)} ${shorten(agent.label, 56)}${previewText}`,\n );\n }\n if (agents.length > visible.length) {\n lines.push(` … ${agents.length - visible.length} earlier agents`);\n }\n }\n\n const unphased = snapshot.agents.filter((a) => !rendered.has(a));\n if (unphased.length > 0) {\n lines.push(' unphased');\n for (const agent of unphased.slice(-maxAgentsPerPhase)) {\n const previewText = showPreviews && agent.resultPreview ? ` — ${agent.resultPreview}` : '';\n lines.push(\n ` #${agent.id} ${statusIcon(agent.status)} ${shorten(agent.label, 56)}${previewText}`,\n );\n }\n }\n\n const visibleLogs = snapshot.logs.slice(-maxLogs);\n if (visibleLogs.length > 0) {\n lines.push('');\n for (const log of visibleLogs) {\n lines.push(` log: ${shorten(log, 80)}`);\n }\n }\n return lines.join('\\n');\n}\n\nexport function previewValue(value: unknown, max = 80): string {\n if (value === null || value === undefined) return '';\n const text = typeof value === 'string' ? value : safeStringify(value);\n if (!text) return '';\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n\nexport function renderWorkflowPanel(\n snapshot: WorkflowSnapshot,\n options: WorkflowPanelOptions = {},\n): string {\n const status = options.status ?? inferPanelStatus(snapshot);\n const activeAgents = snapshot.agents.filter((agent) => agent.status === 'running');\n const queuedAgents = snapshot.agents.filter((agent) => agent.status === 'queued');\n const activeLimit = options.maxActiveAgents ?? 4;\n const recentLimit = options.maxRecentAgents ?? 4;\n const durationText = formatDuration(resolveElapsedMs(snapshot, options.nowMs));\n const counts = formatRunCounts(snapshot);\n\n const lines = [\n `◆ ${snapshot.name} ${statusText(status)} ${counts}${durationText ? ` ${durationText}` : ''}`,\n ];\n\n const phaseLines = renderPanelPhaseLines(snapshot);\n if (phaseLines.length > 0) {\n lines.push('', 'Phase', ...phaseLines);\n }\n\n const visibleActive = activeAgents.length > 0 ? activeAgents : queuedAgents;\n if (visibleActive.length > 0) {\n lines.push('', activeAgents.length > 0 ? 'Active' : 'Queued');\n for (const agent of visibleActive.slice(0, activeLimit)) {\n lines.push(...renderActiveAgentLines(agent));\n }\n if (visibleActive.length > activeLimit) {\n lines.push(` … ${visibleActive.length - activeLimit} more`);\n }\n }\n\n const recent = recentCompletedAgents(snapshot).slice(0, recentLimit);\n if (recent.length > 0) {\n lines.push('', 'Recent');\n for (const agent of recent) {\n lines.push(renderRecentAgentLine(agent));\n }\n }\n\n const errors = snapshot.agents.filter((agent) => agent.status === 'error' || agent.error);\n if (errors.length > 0) {\n lines.push('', 'Errors');\n for (const agent of errors.slice(0, options.maxErrors ?? 3)) {\n lines.push(\n ` ✗ #${agent.id} ${shorten(agent.label, 28)}${\n agent.error ? `: ${shorten(agent.error, 96)}` : ''\n }`,\n );\n }\n if (errors.length > (options.maxErrors ?? 3)) {\n lines.push(` … ${errors.length - (options.maxErrors ?? 3)} more`);\n }\n }\n\n return lines.join('\\n');\n}\n\nexport function renderWorkflowFinalSummary(\n snapshot: WorkflowSnapshot,\n options: WorkflowPanelOptions = {},\n): string {\n const status = options.status ?? inferPanelStatus(snapshot);\n const durationText = formatDuration(resolveElapsedMs(snapshot, options.nowMs));\n const lines = [\n `◆ ${snapshot.name} ${statusText(status)} ${formatRunCounts(snapshot)}${durationText ? ` ${durationText}` : ''}`,\n ];\n\n const result = previewValue(snapshot.result, 280);\n if (result) {\n lines.push('', 'Result', ` ${result}`);\n } else {\n const fallback = recentCompletedAgents(snapshot)\n .map((agent) => agent.resultPreview)\n .find((value): value is string => Boolean(value));\n if (fallback) {\n lines.push('', 'Result', ` ${shorten(fallback, 280)}`);\n }\n }\n\n const errors = snapshot.agents.filter((agent) => agent.status === 'error' || agent.error);\n if (errors.length > 0) {\n lines.push('', 'Errors');\n for (const agent of errors.slice(0, options.maxErrors ?? 5)) {\n lines.push(\n ` ✗ #${agent.id} ${shorten(agent.label, 32)}${\n agent.error ? `: ${shorten(agent.error, 120)}` : ''\n }`,\n );\n }\n }\n\n const recent = recentCompletedAgents(snapshot).slice(0, options.maxRecentAgents ?? 5);\n if (recent.length > 0) {\n lines.push('', 'Completed');\n for (const agent of recent) {\n lines.push(renderRecentAgentLine(agent));\n }\n }\n\n return lines.join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n\nfunction countAgents(agents: WorkflowAgentSnapshot[]) {\n let done = 0;\n let running = 0;\n let error = 0;\n let skipped = 0;\n for (const a of agents) {\n if (a.status === 'done') done++;\n else if (a.status === 'running') running++;\n else if (a.status === 'error') error++;\n else if (a.status === 'skipped') skipped++;\n }\n return { done, running, error, skipped };\n}\n\nfunction statusIcon(status: WorkflowAgentStatus): string {\n switch (status) {\n case 'queued':\n return '○';\n case 'running':\n return '●';\n case 'done':\n return '✓';\n case 'error':\n return '✗';\n case 'skipped':\n return '-';\n }\n}\n\nfunction statusText(status: WorkflowPanelStatus): string {\n switch (status) {\n case 'queued':\n return 'queued';\n case 'running':\n return 'running';\n case 'succeeded':\n return '✓ completed';\n case 'failed':\n return '✗ failed';\n case 'cancelled':\n return 'cancelled';\n case 'timeout':\n return 'timeout';\n default:\n return String(status || 'running');\n }\n}\n\nfunction inferPanelStatus(snapshot: WorkflowSnapshot): WorkflowPanelStatus {\n if (snapshot.errorCount > 0) return 'failed';\n if (snapshot.runningCount > 0) return 'running';\n if (snapshot.doneCount + snapshot.skippedCount >= snapshot.agentCount && snapshot.agentCount > 0) {\n return 'succeeded';\n }\n return 'queued';\n}\n\nfunction formatRunCounts(snapshot: WorkflowSnapshot): string {\n const parts = [`${snapshot.doneCount}/${snapshot.agentCount} done`];\n if (snapshot.runningCount > 0) parts.push(`${snapshot.runningCount} running`);\n if (snapshot.errorCount > 0) parts.push(`${snapshot.errorCount} errors`);\n if (snapshot.skippedCount > 0) parts.push(`${snapshot.skippedCount} skipped`);\n return parts.join(' · ');\n}\n\nfunction resolveElapsedMs(snapshot: WorkflowSnapshot, nowMs = Date.now()): number | undefined {\n if (snapshot.durationMs != null) return snapshot.durationMs;\n const starts = snapshot.agents\n .map((agent) => agent.startedAtMs)\n .filter((value): value is number => typeof value === 'number' && Number.isFinite(value));\n if (starts.length === 0) return undefined;\n return Math.max(0, nowMs - Math.min(...starts));\n}\n\nfunction formatDuration(ms: number | undefined): string {\n if (ms == null || !Number.isFinite(ms)) return '';\n const totalSeconds = Math.max(0, Math.floor(ms / 1000));\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n if (minutes < 60) return `${minutes}:${String(seconds).padStart(2, '0')}`;\n const hours = Math.floor(minutes / 60);\n const restMinutes = minutes % 60;\n return `${hours}:${String(restMinutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;\n}\n\nfunction renderPanelPhaseLines(snapshot: WorkflowSnapshot): string[] {\n const phaseNames = uniqueOrdered([\n ...snapshot.phases,\n ...(snapshot.currentPhase ? [snapshot.currentPhase] : []),\n ...snapshot.agents.map((a) => a.phase).filter((p): p is string => Boolean(p)),\n ]);\n const out: string[] = [];\n for (const phase of phaseNames) {\n const agents = snapshot.agents.filter((agent) => agent.phase === phase);\n const counts = countAgents(agents);\n const complete = agents.length > 0 && counts.done + counts.error + counts.skipped === agents.length;\n const marker =\n counts.running > 0 || (!complete && snapshot.currentPhase === phase)\n ? '▶'\n : complete\n ? '✓'\n : '○';\n const tail = [\n counts.running > 0 ? `${counts.running} running` : '',\n counts.error > 0 ? `${counts.error} errors` : '',\n counts.skipped > 0 ? `${counts.skipped} skipped` : '',\n ].filter(Boolean).join(' · ');\n out.push(` ${marker} ${phase} ${counts.done}/${agents.length}${tail ? ` · ${tail}` : ''}`);\n }\n return out;\n}\n\nfunction renderActiveAgentLines(agent: WorkflowAgentSnapshot): string[] {\n const step = agent.currentStep || latestStepSummary(agent);\n const iteration =\n agent.iteration != null && agent.maxIterations != null\n ? ` [${agent.iteration}/${agent.maxIterations}]`\n : '';\n const head = ` ${agent.status === 'running' ? '●' : '○'} #${agent.id} ${shorten(agent.label, 32)}${iteration}`;\n return step ? [head, ` ${shorten(step, 96)}`] : [head];\n}\n\nfunction renderRecentAgentLine(agent: WorkflowAgentSnapshot): string {\n const preview = agent.error || agent.resultPreview || latestStepResult(agent);\n return ` ${statusIcon(agent.status)} #${agent.id} ${shorten(agent.label, 32)}${\n preview ? ` — ${shorten(preview, 96)}` : ''\n }`;\n}\n\nfunction recentCompletedAgents(snapshot: WorkflowSnapshot): WorkflowAgentSnapshot[] {\n return [...snapshot.agents]\n .filter((agent) => agent.status === 'done' || agent.status === 'error' || agent.status === 'skipped')\n .reverse();\n}\n\nfunction latestStepSummary(agent: WorkflowAgentSnapshot): string {\n const step =\n [...(agent.steps ?? [])].reverse().find((entry) => entry.status === 'running') ??\n agent.steps?.[agent.steps.length - 1];\n if (!step) return '';\n return step.detail ? `${step.label}: ${step.detail}` : step.label;\n}\n\nfunction latestStepResult(agent: WorkflowAgentSnapshot): string {\n const step = [...(agent.steps ?? [])].reverse().find((entry) => entry.resultPreview || entry.error);\n return step?.error || step?.resultPreview || '';\n}\n\nfunction stateSuffix(snapshot: WorkflowSnapshot): string {\n if (snapshot.errorCount > 0) return `, ${snapshot.errorCount} errors`;\n if (snapshot.skippedCount > 0) return `, ${snapshot.skippedCount} skipped`;\n if (snapshot.runningCount > 0) return `, ${snapshot.runningCount} running`;\n return '';\n}\n\nfunction uniqueOrdered(values: string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const v of values) {\n if (!seen.has(v)) {\n seen.add(v);\n out.push(v);\n }\n }\n return out;\n}\n\nfunction shorten(value: string, max: number): string {\n const text = value.replace(/\\s+/g, ' ').trim();\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n"],"mappings":";;AAiBA,SAAgB,uBAAuB,MAAsC;AAC3E,QAAO,iBACL,KAAK,MACL,KAAK,aACL,KAAK,QAAQ,KAAK,MAAM,EAAE,MAAM,CACjC;;AAGH,SAAgB,gBAAgB,UAAkC;CAChE,IAAI,UAAU;CACd,IAAI,OAAO;CACX,IAAI,QAAQ;CACZ,IAAI,UAAU;AACd,MAAK,MAAM,SAAS,SAAS,OAC3B,SAAQ,MAAM,QAAd;EACE,KAAK;AACH;AACA;EACF,KAAK;AACH;AACA;EACF,KAAK;AACH;AACA;EACF,KAAK;AACH;AACA;;AAGN,UAAS,aAAa,SAAS,OAAO;AACtC,UAAS,eAAe;AACxB,UAAS,YAAY;AACrB,UAAS,aAAa;AACtB,UAAS,eAAe;;AA0B1B,SAAgB,mBACd,UACA,YAAY,OACZ,UAAyB,EAAE,EACnB;CACR,MAAM,oBAAoB,QAAQ,qBAAqB;CACvD,MAAM,UAAU,QAAQ,WAAW;CACnC,MAAM,eAAe,QAAQ,sBAAsB;CAEnD,MAAM,QAAQ,YAAY,SAAS;CAInC,MAAM,QAAQ,CAHC,YACX,gBAAgB,SAAS,KAAK,IAAI,SAAS,UAAU,GAAG,SAAS,WAAW,OAAO,MAAM,KACzF,eAAe,SAAS,KAAK,IAAI,SAAS,UAAU,GAAG,SAAS,WAAW,OAAO,MAAM,GACtE;CAEtB,MAAM,aAAa,cAAc;EAC/B,GAAG,SAAS;EACZ,GAAI,SAAS,eAAe,CAAC,SAAS,aAAa,GAAG,EAAE;EACxD,GAAG,SAAS,OAAO,KAAK,MAAM,EAAE,MAAM,CAAC,QAAQ,MAAmB,QAAQ,EAAE,CAAC;EAC9E,CAAC;CACF,MAAM,2BAAW,IAAI,KAA4B;AAEjD,MAAK,MAAM,SAAS,YAAY;EAC9B,MAAM,SAAS,SAAS,OAAO,QAAQ,MAAM,EAAE,UAAU,MAAM;AAC/D,MAAI,OAAO,WAAW,KAAK,SAAS,iBAAiB,MAAO;AAC5D,OAAK,MAAM,KAAK,OAAQ,UAAS,IAAI,EAAE;EAEvC,MAAM,SAAS,YAAY,OAAO;EAClC,MAAM,eAAe,OAAO,SAAS,KAAK,OAAO,OAAO,OAAO,QAAQ,OAAO,YAAY,OAAO;EACjG,MAAM,SACJ,OAAO,UAAU,KAAM,CAAC,gBAAgB,SAAS,iBAAiB,QAC9D,MACA,eACE,MACA;EAER,MAAM,QACH,OAAO,UAAU,MAAM,OAAO,QAAQ,YAAY,OAClD,OAAO,QAAQ,MAAM,OAAO,MAAM,WAAW,OAC7C,OAAO,UAAU,MAAM,OAAO,QAAQ,YAAY;AACrD,QAAM,KAAK,KAAK,OAAO,GAAG,MAAM,GAAG,OAAO,KAAK,GAAG,OAAO,SAAS,OAAO;EAEzE,MAAM,UAAU,OAAO,MAAM,CAAC,kBAAkB;AAChD,OAAK,MAAM,SAAS,SAAS;GAC3B,MAAM,cAAc,gBAAgB,MAAM,gBAAgB,MAAM,MAAM,kBAAkB;AACxF,SAAM,KACJ,QAAQ,MAAM,GAAG,GAAG,WAAW,MAAM,OAAO,CAAC,GAAG,QAAQ,MAAM,OAAO,GAAG,GAAG,cAC5E;;AAEH,MAAI,OAAO,SAAS,QAAQ,OAC1B,OAAM,KAAK,SAAS,OAAO,SAAS,QAAQ,OAAO,iBAAiB;;CAIxE,MAAM,WAAW,SAAS,OAAO,QAAQ,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC;AAChE,KAAI,SAAS,SAAS,GAAG;AACvB,QAAM,KAAK,aAAa;AACxB,OAAK,MAAM,SAAS,SAAS,MAAM,CAAC,kBAAkB,EAAE;GACtD,MAAM,cAAc,gBAAgB,MAAM,gBAAgB,MAAM,MAAM,kBAAkB;AACxF,SAAM,KACJ,QAAQ,MAAM,GAAG,GAAG,WAAW,MAAM,OAAO,CAAC,GAAG,QAAQ,MAAM,OAAO,GAAG,GAAG,cAC5E;;;CAIL,MAAM,cAAc,SAAS,KAAK,MAAM,CAAC,QAAQ;AACjD,KAAI,YAAY,SAAS,GAAG;AAC1B,QAAM,KAAK,GAAG;AACd,OAAK,MAAM,OAAO,YAChB,OAAM,KAAK,UAAU,QAAQ,KAAK,GAAG,GAAG;;AAG5C,QAAO,MAAM,KAAK,KAAK;;AAGzB,SAAgB,aAAa,OAAgB,MAAM,IAAY;AAC7D,KAAI,UAAU,QAAQ,UAAU,KAAA,EAAW,QAAO;CAClD,MAAM,OAAO,OAAO,UAAU,WAAW,QAAQ,cAAc,MAAM;AACrE,KAAI,CAAC,KAAM,QAAO;AAClB,QAAO,KAAK,SAAS,MAAM,GAAG,KAAK,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK;;AAG5D,SAAgB,oBACd,UACA,UAAgC,EAAE,EAC1B;CACR,MAAM,SAAS,QAAQ,UAAU,iBAAiB,SAAS;CAC3D,MAAM,eAAe,SAAS,OAAO,QAAQ,UAAU,MAAM,WAAW,UAAU;CAClF,MAAM,eAAe,SAAS,OAAO,QAAQ,UAAU,MAAM,WAAW,SAAS;CACjF,MAAM,cAAc,QAAQ,mBAAmB;CAC/C,MAAM,cAAc,QAAQ,mBAAmB;CAC/C,MAAM,eAAe,eAAe,iBAAiB,UAAU,QAAQ,MAAM,CAAC;CAC9E,MAAM,SAAS,gBAAgB,SAAS;CAExC,MAAM,QAAQ,CACZ,KAAK,SAAS,KAAK,GAAG,WAAW,OAAO,CAAC,GAAG,SAAS,eAAe,IAAI,iBAAiB,KAC1F;CAED,MAAM,aAAa,sBAAsB,SAAS;AAClD,KAAI,WAAW,SAAS,EACtB,OAAM,KAAK,IAAI,SAAS,GAAG,WAAW;CAGxC,MAAM,gBAAgB,aAAa,SAAS,IAAI,eAAe;AAC/D,KAAI,cAAc,SAAS,GAAG;AAC5B,QAAM,KAAK,IAAI,aAAa,SAAS,IAAI,WAAW,SAAS;AAC7D,OAAK,MAAM,SAAS,cAAc,MAAM,GAAG,YAAY,CACrD,OAAM,KAAK,GAAG,uBAAuB,MAAM,CAAC;AAE9C,MAAI,cAAc,SAAS,YACzB,OAAM,KAAK,OAAO,cAAc,SAAS,YAAY,OAAO;;CAIhE,MAAM,SAAS,sBAAsB,SAAS,CAAC,MAAM,GAAG,YAAY;AACpE,KAAI,OAAO,SAAS,GAAG;AACrB,QAAM,KAAK,IAAI,SAAS;AACxB,OAAK,MAAM,SAAS,OAClB,OAAM,KAAK,sBAAsB,MAAM,CAAC;;CAI5C,MAAM,SAAS,SAAS,OAAO,QAAQ,UAAU,MAAM,WAAW,WAAW,MAAM,MAAM;AACzF,KAAI,OAAO,SAAS,GAAG;AACrB,QAAM,KAAK,IAAI,SAAS;AACxB,OAAK,MAAM,SAAS,OAAO,MAAM,GAAG,QAAQ,aAAa,EAAE,CACzD,OAAM,KACJ,QAAQ,MAAM,GAAG,GAAG,QAAQ,MAAM,OAAO,GAAG,GAC1C,MAAM,QAAQ,KAAK,QAAQ,MAAM,OAAO,GAAG,KAAK,KAEnD;AAEH,MAAI,OAAO,UAAU,QAAQ,aAAa,GACxC,OAAM,KAAK,OAAO,OAAO,UAAU,QAAQ,aAAa,GAAG,OAAO;;AAItE,QAAO,MAAM,KAAK,KAAK;;AAGzB,SAAgB,2BACd,UACA,UAAgC,EAAE,EAC1B;CACR,MAAM,SAAS,QAAQ,UAAU,iBAAiB,SAAS;CAC3D,MAAM,eAAe,eAAe,iBAAiB,UAAU,QAAQ,MAAM,CAAC;CAC9E,MAAM,QAAQ,CACZ,KAAK,SAAS,KAAK,GAAG,WAAW,OAAO,CAAC,GAAG,gBAAgB,SAAS,GAAG,eAAe,IAAI,iBAAiB,KAC7G;CAED,MAAM,SAAS,aAAa,SAAS,QAAQ,IAAI;AACjD,KAAI,OACF,OAAM,KAAK,IAAI,UAAU,KAAK,SAAS;MAClC;EACL,MAAM,WAAW,sBAAsB,SAAS,CAC7C,KAAK,UAAU,MAAM,cAAc,CACnC,MAAM,UAA2B,QAAQ,MAAM,CAAC;AACnD,MAAI,SACF,OAAM,KAAK,IAAI,UAAU,KAAK,QAAQ,UAAU,IAAI,GAAG;;CAI3D,MAAM,SAAS,SAAS,OAAO,QAAQ,UAAU,MAAM,WAAW,WAAW,MAAM,MAAM;AACzF,KAAI,OAAO,SAAS,GAAG;AACrB,QAAM,KAAK,IAAI,SAAS;AACxB,OAAK,MAAM,SAAS,OAAO,MAAM,GAAG,QAAQ,aAAa,EAAE,CACzD,OAAM,KACJ,QAAQ,MAAM,GAAG,GAAG,QAAQ,MAAM,OAAO,GAAG,GAC1C,MAAM,QAAQ,KAAK,QAAQ,MAAM,OAAO,IAAI,KAAK,KAEpD;;CAIL,MAAM,SAAS,sBAAsB,SAAS,CAAC,MAAM,GAAG,QAAQ,mBAAmB,EAAE;AACrF,KAAI,OAAO,SAAS,GAAG;AACrB,QAAM,KAAK,IAAI,YAAY;AAC3B,OAAK,MAAM,SAAS,OAClB,OAAM,KAAK,sBAAsB,MAAM,CAAC;;AAI5C,QAAO,MAAM,KAAK,KAAK;;AAKzB,SAAS,YAAY,QAAiC;CACpD,IAAI,OAAO;CACX,IAAI,UAAU;CACd,IAAI,QAAQ;CACZ,IAAI,UAAU;AACd,MAAK,MAAM,KAAK,OACd,KAAI,EAAE,WAAW,OAAQ;UAChB,EAAE,WAAW,UAAW;UACxB,EAAE,WAAW,QAAS;UACtB,EAAE,WAAW,UAAW;AAEnC,QAAO;EAAE;EAAM;EAAS;EAAO;EAAS;;AAG1C,SAAS,WAAW,QAAqC;AACvD,SAAQ,QAAR;EACE,KAAK,SACH,QAAO;EACT,KAAK,UACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,KAAK,UACH,QAAO;;;AAIb,SAAS,WAAW,QAAqC;AACvD,SAAQ,QAAR;EACE,KAAK,SACH,QAAO;EACT,KAAK,UACH,QAAO;EACT,KAAK,YACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,KAAK,YACH,QAAO;EACT,KAAK,UACH,QAAO;EACT,QACE,QAAO,OAAO,UAAU,UAAU;;;AAIxC,SAAS,iBAAiB,UAAiD;AACzE,KAAI,SAAS,aAAa,EAAG,QAAO;AACpC,KAAI,SAAS,eAAe,EAAG,QAAO;AACtC,KAAI,SAAS,YAAY,SAAS,gBAAgB,SAAS,cAAc,SAAS,aAAa,EAC7F,QAAO;AAET,QAAO;;AAGT,SAAS,gBAAgB,UAAoC;CAC3D,MAAM,QAAQ,CAAC,GAAG,SAAS,UAAU,GAAG,SAAS,WAAW,OAAO;AACnE,KAAI,SAAS,eAAe,EAAG,OAAM,KAAK,GAAG,SAAS,aAAa,UAAU;AAC7E,KAAI,SAAS,aAAa,EAAG,OAAM,KAAK,GAAG,SAAS,WAAW,SAAS;AACxE,KAAI,SAAS,eAAe,EAAG,OAAM,KAAK,GAAG,SAAS,aAAa,UAAU;AAC7E,QAAO,MAAM,KAAK,MAAM;;AAG1B,SAAS,iBAAiB,UAA4B,QAAQ,KAAK,KAAK,EAAsB;AAC5F,KAAI,SAAS,cAAc,KAAM,QAAO,SAAS;CACjD,MAAM,SAAS,SAAS,OACrB,KAAK,UAAU,MAAM,YAAY,CACjC,QAAQ,UAA2B,OAAO,UAAU,YAAY,OAAO,SAAS,MAAM,CAAC;AAC1F,KAAI,OAAO,WAAW,EAAG,QAAO,KAAA;AAChC,QAAO,KAAK,IAAI,GAAG,QAAQ,KAAK,IAAI,GAAG,OAAO,CAAC;;AAGjD,SAAS,eAAe,IAAgC;AACtD,KAAI,MAAM,QAAQ,CAAC,OAAO,SAAS,GAAG,CAAE,QAAO;CAC/C,MAAM,eAAe,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,IAAK,CAAC;CACvD,MAAM,UAAU,KAAK,MAAM,eAAe,GAAG;CAC7C,MAAM,UAAU,eAAe;AAC/B,KAAI,UAAU,GAAI,QAAO,GAAG,QAAQ,GAAG,OAAO,QAAQ,CAAC,SAAS,GAAG,IAAI;CACvE,MAAM,QAAQ,KAAK,MAAM,UAAU,GAAG;CACtC,MAAM,cAAc,UAAU;AAC9B,QAAO,GAAG,MAAM,GAAG,OAAO,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,OAAO,QAAQ,CAAC,SAAS,GAAG,IAAI;;AAG7F,SAAS,sBAAsB,UAAsC;CACnE,MAAM,aAAa,cAAc;EAC/B,GAAG,SAAS;EACZ,GAAI,SAAS,eAAe,CAAC,SAAS,aAAa,GAAG,EAAE;EACxD,GAAG,SAAS,OAAO,KAAK,MAAM,EAAE,MAAM,CAAC,QAAQ,MAAmB,QAAQ,EAAE,CAAC;EAC9E,CAAC;CACF,MAAM,MAAgB,EAAE;AACxB,MAAK,MAAM,SAAS,YAAY;EAC9B,MAAM,SAAS,SAAS,OAAO,QAAQ,UAAU,MAAM,UAAU,MAAM;EACvE,MAAM,SAAS,YAAY,OAAO;EAClC,MAAM,WAAW,OAAO,SAAS,KAAK,OAAO,OAAO,OAAO,QAAQ,OAAO,YAAY,OAAO;EAC7F,MAAM,SACJ,OAAO,UAAU,KAAM,CAAC,YAAY,SAAS,iBAAiB,QAC1D,MACA,WACE,MACA;EACR,MAAM,OAAO;GACX,OAAO,UAAU,IAAI,GAAG,OAAO,QAAQ,YAAY;GACnD,OAAO,QAAQ,IAAI,GAAG,OAAO,MAAM,WAAW;GAC9C,OAAO,UAAU,IAAI,GAAG,OAAO,QAAQ,YAAY;GACpD,CAAC,OAAO,QAAQ,CAAC,KAAK,MAAM;AAC7B,MAAI,KAAK,KAAK,OAAO,GAAG,MAAM,GAAG,OAAO,KAAK,GAAG,OAAO,SAAS,OAAO,MAAM,SAAS,KAAK;;AAE7F,QAAO;;AAGT,SAAS,uBAAuB,OAAwC;CACtE,MAAM,OAAO,MAAM,eAAe,kBAAkB,MAAM;CAC1D,MAAM,YACJ,MAAM,aAAa,QAAQ,MAAM,iBAAiB,OAC9C,KAAK,MAAM,UAAU,GAAG,MAAM,cAAc,KAC5C;CACN,MAAM,OAAO,KAAK,MAAM,WAAW,YAAY,MAAM,IAAI,IAAI,MAAM,GAAG,GAAG,QAAQ,MAAM,OAAO,GAAG,GAAG;AACpG,QAAO,OAAO,CAAC,MAAM,QAAQ,QAAQ,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK;;AAG5D,SAAS,sBAAsB,OAAsC;CACnE,MAAM,UAAU,MAAM,SAAS,MAAM,iBAAiB,iBAAiB,MAAM;AAC7E,QAAO,KAAK,WAAW,MAAM,OAAO,CAAC,IAAI,MAAM,GAAG,GAAG,QAAQ,MAAM,OAAO,GAAG,GAC3E,UAAU,MAAM,QAAQ,SAAS,GAAG,KAAK;;AAI7C,SAAS,sBAAsB,UAAqD;AAClF,QAAO,CAAC,GAAG,SAAS,OAAO,CACxB,QAAQ,UAAU,MAAM,WAAW,UAAU,MAAM,WAAW,WAAW,MAAM,WAAW,UAAU,CACpG,SAAS;;AAGd,SAAS,kBAAkB,OAAsC;CAC/D,MAAM,OACJ,CAAC,GAAI,MAAM,SAAS,EAAE,CAAE,CAAC,SAAS,CAAC,MAAM,UAAU,MAAM,WAAW,UAAU,IAC9E,MAAM,QAAQ,MAAM,MAAM,SAAS;AACrC,KAAI,CAAC,KAAM,QAAO;AAClB,QAAO,KAAK,SAAS,GAAG,KAAK,MAAM,IAAI,KAAK,WAAW,KAAK;;AAG9D,SAAS,iBAAiB,OAAsC;CAC9D,MAAM,OAAO,CAAC,GAAI,MAAM,SAAS,EAAE,CAAE,CAAC,SAAS,CAAC,MAAM,UAAU,MAAM,iBAAiB,MAAM,MAAM;AACnG,QAAO,MAAM,SAAS,MAAM,iBAAiB;;AAG/C,SAAS,YAAY,UAAoC;AACvD,KAAI,SAAS,aAAa,EAAG,QAAO,KAAK,SAAS,WAAW;AAC7D,KAAI,SAAS,eAAe,EAAG,QAAO,KAAK,SAAS,aAAa;AACjE,KAAI,SAAS,eAAe,EAAG,QAAO,KAAK,SAAS,aAAa;AACjE,QAAO;;AAGT,SAAS,cAAc,QAA4B;CACjD,MAAM,uBAAO,IAAI,KAAa;CAC9B,MAAM,MAAgB,EAAE;AACxB,MAAK,MAAM,KAAK,OACd,KAAI,CAAC,KAAK,IAAI,EAAE,EAAE;AAChB,OAAK,IAAI,EAAE;AACX,MAAI,KAAK,EAAE;;AAGf,QAAO;;AAGT,SAAS,QAAQ,OAAe,KAAqB;CACnD,MAAM,OAAO,MAAM,QAAQ,QAAQ,IAAI,CAAC,MAAM;AAC9C,QAAO,KAAK,SAAS,MAAM,GAAG,KAAK,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK;;AAG5D,SAAS,cAAc,OAAwB;AAC7C,KAAI;AACF,SAAO,KAAK,UAAU,MAAM;SACtB;AACN,SAAO,OAAO,MAAM"}
|
|
1
|
+
{"version":3,"file":"snapshot.js","names":[],"sources":["../../../../src/agent/workflow/snapshot.ts"],"sourcesContent":["/**\n * Workflow progress snapshot model + text renderers.\n *\n * The runtime emits per-event callbacks (`onPhase`, `onAgentStart`, `onAgentEnd`,\n * `onLog`). The workflow tool wraps those callbacks to mutate a snapshot and push\n * a text rendering through `onUpdate` — keeping TUI / Gateway / IM consumers in\n * lock-step from a single source of truth.\n */\n\nimport type {\n WorkflowAgentSnapshot,\n WorkflowAgentStatus,\n WorkflowSnapshotDefinition,\n WorkflowSnapshot,\n} from './types.js';\nimport { emptySnapshotFor } from './snapshot-empty.js';\n\nexport function createWorkflowSnapshot(definition: WorkflowSnapshotDefinition): WorkflowSnapshot {\n return emptySnapshotFor(\n definition.name,\n definition.description,\n definition.phases?.map((phase) => phase.title),\n );\n}\n\nexport function recomputeCounts(snapshot: WorkflowSnapshot): void {\n let running = 0;\n let done = 0;\n let error = 0;\n let skipped = 0;\n for (const agent of snapshot.agents) {\n switch (agent.status) {\n case 'running':\n running++;\n break;\n case 'done':\n done++;\n break;\n case 'error':\n error++;\n break;\n case 'skipped':\n skipped++;\n break;\n }\n }\n snapshot.agentCount = snapshot.agents.length;\n snapshot.runningCount = running;\n snapshot.doneCount = done;\n snapshot.errorCount = error;\n snapshot.skippedCount = skipped;\n}\n\nexport interface RenderOptions {\n maxAgentsPerPhase?: number;\n maxLogs?: number;\n showResultPreviews?: boolean;\n}\n\nexport type WorkflowPanelStatus =\n | 'queued'\n | 'running'\n | 'succeeded'\n | 'failed'\n | 'cancelled'\n | 'timeout'\n | string;\n\nexport interface WorkflowPanelOptions {\n status?: WorkflowPanelStatus;\n maxActiveAgents?: number;\n maxRecentAgents?: number;\n maxErrors?: number;\n nowMs?: number;\n}\n\nexport function renderWorkflowText(\n snapshot: WorkflowSnapshot,\n completed = false,\n options: RenderOptions = {},\n): string {\n const maxAgentsPerPhase = options.maxAgentsPerPhase ?? 6;\n const maxLogs = options.maxLogs ?? 2;\n const showPreviews = options.showResultPreviews ?? false;\n\n const state = stateSuffix(snapshot);\n const header = completed\n ? `◆ workflow ✓ ${snapshot.name} (${snapshot.doneCount}/${snapshot.agentCount} done${state})`\n : `◆ workflow: ${snapshot.name} (${snapshot.doneCount}/${snapshot.agentCount} done${state})`;\n const lines = [header];\n\n const phaseNames = uniqueOrdered([\n ...snapshot.phases,\n ...(snapshot.currentPhase ? [snapshot.currentPhase] : []),\n ...snapshot.agents.map((a) => a.phase).filter((p): p is string => Boolean(p)),\n ]);\n const rendered = new Set<WorkflowAgentSnapshot>();\n\n for (const phase of phaseNames) {\n const agents = snapshot.agents.filter((a) => a.phase === phase);\n if (agents.length === 0 && snapshot.currentPhase !== phase) continue;\n for (const a of agents) rendered.add(a);\n\n const counts = countAgents(agents);\n const completeHere = agents.length > 0 && counts.done + counts.error + counts.skipped === agents.length;\n const marker =\n counts.running > 0 || (!completeHere && snapshot.currentPhase === phase)\n ? '▶'\n : completeHere\n ? '✓'\n : ' ';\n\n const tail =\n (counts.running ? ` · ${counts.running} running` : '') +\n (counts.error ? ` · ${counts.error} errors` : '') +\n (counts.skipped ? ` · ${counts.skipped} skipped` : '');\n lines.push(` ${marker} ${phase} ${counts.done}/${agents.length}${tail}`);\n\n const visible = agents.slice(-maxAgentsPerPhase);\n for (const agent of visible) {\n const previewText = showPreviews && agent.resultPreview ? ` — ${agent.resultPreview}` : '';\n lines.push(\n ` #${agent.id} ${statusIcon(agent.status)} ${shorten(agent.label, 56)}${previewText}`,\n );\n }\n if (agents.length > visible.length) {\n lines.push(` … ${agents.length - visible.length} earlier agents`);\n }\n }\n\n const unphased = snapshot.agents.filter((a) => !rendered.has(a));\n if (unphased.length > 0) {\n lines.push(' unphased');\n for (const agent of unphased.slice(-maxAgentsPerPhase)) {\n const previewText = showPreviews && agent.resultPreview ? ` — ${agent.resultPreview}` : '';\n lines.push(\n ` #${agent.id} ${statusIcon(agent.status)} ${shorten(agent.label, 56)}${previewText}`,\n );\n }\n }\n\n const visibleLogs = snapshot.logs.slice(-maxLogs);\n if (visibleLogs.length > 0) {\n lines.push('');\n for (const log of visibleLogs) {\n lines.push(` log: ${shorten(log, 80)}`);\n }\n }\n return lines.join('\\n');\n}\n\nexport function previewValue(value: unknown, max = 80): string {\n if (value === null || value === undefined) return '';\n const text = typeof value === 'string' ? value : safeStringify(value);\n if (!text) return '';\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n\nexport function renderWorkflowPanel(\n snapshot: WorkflowSnapshot,\n options: WorkflowPanelOptions = {},\n): string {\n const status = options.status ?? inferPanelStatus(snapshot);\n const activeAgents = snapshot.agents.filter((agent) => agent.status === 'running');\n const queuedAgents = snapshot.agents.filter((agent) => agent.status === 'queued');\n const activeLimit = options.maxActiveAgents ?? 4;\n const recentLimit = options.maxRecentAgents ?? 4;\n const durationText = formatDuration(resolveElapsedMs(snapshot, options.nowMs));\n const counts = formatRunCounts(snapshot);\n\n const lines = [\n `◆ ${snapshot.name} ${statusText(status)} ${counts}${durationText ? ` ${durationText}` : ''}`,\n ];\n\n const phaseLines = renderPanelPhaseLines(snapshot);\n if (phaseLines.length > 0) {\n lines.push('', 'Phase', ...phaseLines);\n }\n\n const visibleActive = activeAgents.length > 0 ? activeAgents : queuedAgents;\n if (visibleActive.length > 0) {\n lines.push('', activeAgents.length > 0 ? 'Active' : 'Queued');\n for (const agent of visibleActive.slice(0, activeLimit)) {\n lines.push(...renderActiveAgentLines(agent));\n }\n if (visibleActive.length > activeLimit) {\n lines.push(` … ${visibleActive.length - activeLimit} more`);\n }\n }\n\n const recent = recentCompletedAgents(snapshot).slice(0, recentLimit);\n if (recent.length > 0) {\n lines.push('', 'Recent');\n for (const agent of recent) {\n lines.push(renderRecentAgentLine(agent));\n }\n }\n\n const errors = snapshot.agents.filter((agent) => agent.status === 'error' || agent.error);\n if (errors.length > 0) {\n lines.push('', 'Errors');\n for (const agent of errors.slice(0, options.maxErrors ?? 3)) {\n lines.push(\n ` ✗ #${agent.id} ${shorten(agent.label, 28)}${\n agent.error ? `: ${shorten(agent.error, 96)}` : ''\n }`,\n );\n }\n if (errors.length > (options.maxErrors ?? 3)) {\n lines.push(` … ${errors.length - (options.maxErrors ?? 3)} more`);\n }\n }\n\n return lines.join('\\n');\n}\n\nexport function renderWorkflowFinalSummary(\n snapshot: WorkflowSnapshot,\n options: WorkflowPanelOptions = {},\n): string {\n const status = options.status ?? inferPanelStatus(snapshot);\n const durationText = formatDuration(resolveElapsedMs(snapshot, options.nowMs));\n const lines = [\n `◆ ${snapshot.name} ${statusText(status)} ${formatRunCounts(snapshot)}${durationText ? ` ${durationText}` : ''}`,\n ];\n\n const result = previewValue(snapshot.result, 280);\n if (result) {\n lines.push('', 'Result', ` ${result}`);\n } else {\n const fallback = recentCompletedAgents(snapshot)\n .map((agent) => agent.resultPreview)\n .find((value): value is string => Boolean(value));\n if (fallback) {\n lines.push('', 'Result', ` ${shorten(fallback, 280)}`);\n }\n }\n\n const errors = snapshot.agents.filter((agent) => agent.status === 'error' || agent.error);\n if (errors.length > 0) {\n lines.push('', 'Errors');\n for (const agent of errors.slice(0, options.maxErrors ?? 5)) {\n lines.push(\n ` ✗ #${agent.id} ${shorten(agent.label, 32)}${\n agent.error ? `: ${shorten(agent.error, 120)}` : ''\n }`,\n );\n }\n }\n\n const recent = recentCompletedAgents(snapshot).slice(0, options.maxRecentAgents ?? 5);\n if (recent.length > 0) {\n lines.push('', 'Completed');\n for (const agent of recent) {\n lines.push(renderRecentAgentLine(agent));\n }\n }\n\n return lines.join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n\nfunction countAgents(agents: WorkflowAgentSnapshot[]) {\n let done = 0;\n let running = 0;\n let error = 0;\n let skipped = 0;\n for (const a of agents) {\n if (a.status === 'done') done++;\n else if (a.status === 'running') running++;\n else if (a.status === 'error') error++;\n else if (a.status === 'skipped') skipped++;\n }\n return { done, running, error, skipped };\n}\n\nfunction statusIcon(status: WorkflowAgentStatus): string {\n switch (status) {\n case 'queued':\n return '○';\n case 'running':\n return '●';\n case 'done':\n return '✓';\n case 'error':\n return '✗';\n case 'skipped':\n return '-';\n }\n}\n\nfunction statusText(status: WorkflowPanelStatus): string {\n switch (status) {\n case 'queued':\n return 'queued';\n case 'running':\n return 'running';\n case 'succeeded':\n return '✓ completed';\n case 'failed':\n return '✗ failed';\n case 'cancelled':\n return 'cancelled';\n case 'timeout':\n return 'timeout';\n default:\n return String(status || 'running');\n }\n}\n\nfunction inferPanelStatus(snapshot: WorkflowSnapshot): WorkflowPanelStatus {\n if (snapshot.errorCount > 0) return 'failed';\n if (snapshot.runningCount > 0) return 'running';\n if (snapshot.doneCount + snapshot.skippedCount >= snapshot.agentCount && snapshot.agentCount > 0) {\n return 'succeeded';\n }\n return 'queued';\n}\n\nfunction formatRunCounts(snapshot: WorkflowSnapshot): string {\n const parts = [`${snapshot.doneCount}/${snapshot.agentCount} done`];\n if (snapshot.runningCount > 0) parts.push(`${snapshot.runningCount} running`);\n if (snapshot.errorCount > 0) parts.push(`${snapshot.errorCount} errors`);\n if (snapshot.skippedCount > 0) parts.push(`${snapshot.skippedCount} skipped`);\n return parts.join(' · ');\n}\n\nfunction resolveElapsedMs(snapshot: WorkflowSnapshot, nowMs = Date.now()): number | undefined {\n if (snapshot.durationMs != null) return snapshot.durationMs;\n const starts = snapshot.agents\n .map((agent) => agent.startedAtMs)\n .filter((value): value is number => typeof value === 'number' && Number.isFinite(value));\n if (starts.length === 0) return undefined;\n return Math.max(0, nowMs - Math.min(...starts));\n}\n\nfunction formatDuration(ms: number | undefined): string {\n if (ms == null || !Number.isFinite(ms)) return '';\n const totalSeconds = Math.max(0, Math.floor(ms / 1000));\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n if (minutes < 60) return `${minutes}:${String(seconds).padStart(2, '0')}`;\n const hours = Math.floor(minutes / 60);\n const restMinutes = minutes % 60;\n return `${hours}:${String(restMinutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;\n}\n\nfunction renderPanelPhaseLines(snapshot: WorkflowSnapshot): string[] {\n const phaseNames = uniqueOrdered([\n ...snapshot.phases,\n ...(snapshot.currentPhase ? [snapshot.currentPhase] : []),\n ...snapshot.agents.map((a) => a.phase).filter((p): p is string => Boolean(p)),\n ]);\n const out: string[] = [];\n for (const phase of phaseNames) {\n const agents = snapshot.agents.filter((agent) => agent.phase === phase);\n const counts = countAgents(agents);\n const complete = agents.length > 0 && counts.done + counts.error + counts.skipped === agents.length;\n const marker =\n counts.running > 0 || (!complete && snapshot.currentPhase === phase)\n ? '▶'\n : complete\n ? '✓'\n : '○';\n const tail = [\n counts.running > 0 ? `${counts.running} running` : '',\n counts.error > 0 ? `${counts.error} errors` : '',\n counts.skipped > 0 ? `${counts.skipped} skipped` : '',\n ].filter(Boolean).join(' · ');\n out.push(` ${marker} ${phase} ${counts.done}/${agents.length}${tail ? ` · ${tail}` : ''}`);\n }\n return out;\n}\n\nfunction renderActiveAgentLines(agent: WorkflowAgentSnapshot): string[] {\n const step = agent.currentStep || latestStepSummary(agent);\n const iteration =\n agent.iteration != null && agent.maxIterations != null\n ? ` [${agent.iteration}/${agent.maxIterations}]`\n : '';\n const head = ` ${agent.status === 'running' ? '●' : '○'} #${agent.id} ${shorten(agent.label, 32)}${iteration}`;\n return step ? [head, ` ${shorten(step, 96)}`] : [head];\n}\n\nfunction renderRecentAgentLine(agent: WorkflowAgentSnapshot): string {\n const preview = agent.error || agent.resultPreview || latestStepResult(agent);\n return ` ${statusIcon(agent.status)} #${agent.id} ${shorten(agent.label, 32)}${\n preview ? ` — ${shorten(preview, 96)}` : ''\n }`;\n}\n\nfunction recentCompletedAgents(snapshot: WorkflowSnapshot): WorkflowAgentSnapshot[] {\n return [...snapshot.agents]\n .filter((agent) => agent.status === 'done' || agent.status === 'error' || agent.status === 'skipped')\n .reverse();\n}\n\nfunction latestStepSummary(agent: WorkflowAgentSnapshot): string {\n const step =\n [...(agent.steps ?? [])].reverse().find((entry) => entry.status === 'running') ??\n agent.steps?.[agent.steps.length - 1];\n if (!step) return '';\n return step.detail ? `${step.label}: ${step.detail}` : step.label;\n}\n\nfunction latestStepResult(agent: WorkflowAgentSnapshot): string {\n const step = [...(agent.steps ?? [])].reverse().find((entry) => entry.resultPreview || entry.error);\n return step?.error || step?.resultPreview || '';\n}\n\nfunction stateSuffix(snapshot: WorkflowSnapshot): string {\n if (snapshot.errorCount > 0) return `, ${snapshot.errorCount} errors`;\n if (snapshot.skippedCount > 0) return `, ${snapshot.skippedCount} skipped`;\n if (snapshot.runningCount > 0) return `, ${snapshot.runningCount} running`;\n return '';\n}\n\nfunction uniqueOrdered(values: string[]): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const v of values) {\n if (!seen.has(v)) {\n seen.add(v);\n out.push(v);\n }\n }\n return out;\n}\n\nfunction shorten(value: string, max: number): string {\n const text = value.replace(/\\s+/g, ' ').trim();\n return text.length > max ? `${text.slice(0, max - 1)}…` : text;\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `structured_output` — terminating tool used to capture a subagent's final result.
|
|
3
3
|
*
|
|
4
|
-
* Injected into a
|
|
5
|
-
* structured
|
|
4
|
+
* Injected into a workflow agent node only when its output schema requires
|
|
5
|
+
* structured data. The subagent is instructed
|
|
6
6
|
* to invoke this tool exactly once with its final result; the tool sets
|
|
7
7
|
* `terminate: true` so the agent loop stops without paying for an extra
|
|
8
8
|
* assistant turn.
|
|
@@ -3,8 +3,8 @@ import Ajv from "ajv";
|
|
|
3
3
|
/**
|
|
4
4
|
* `structured_output` — terminating tool used to capture a subagent's final result.
|
|
5
5
|
*
|
|
6
|
-
* Injected into a
|
|
7
|
-
* structured
|
|
6
|
+
* Injected into a workflow agent node only when its output schema requires
|
|
7
|
+
* structured data. The subagent is instructed
|
|
8
8
|
* to invoke this tool exactly once with its final result; the tool sets
|
|
9
9
|
* `terminate: true` so the agent loop stops without paying for an extra
|
|
10
10
|
* assistant turn.
|