@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
|
@@ -2,11 +2,10 @@ import { validateWorkflowDefinitionInput } from "../domain/validation.js";
|
|
|
2
2
|
import { randomUUID } from "node:crypto";
|
|
3
3
|
//#region src/workflows/draft/workflow-draft-validator.ts
|
|
4
4
|
function parseGeneratedWorkflowDraft(raw) {
|
|
5
|
-
const
|
|
6
|
-
const parsed = JSON.parse(json);
|
|
5
|
+
const parsed = JSON.parse(extractJsonObject(raw));
|
|
7
6
|
return {
|
|
8
7
|
name: normalizeWorkflowName(String(parsed.name ?? "custom_workflow")),
|
|
9
|
-
|
|
8
|
+
graph: normalizeGraph(parsed.graph),
|
|
10
9
|
manifest: normalizeManifest(parsed.manifest),
|
|
11
10
|
explanation: String(parsed.explanation ?? ""),
|
|
12
11
|
assumptions: stringArray(parsed.assumptions),
|
|
@@ -16,22 +15,21 @@ function parseGeneratedWorkflowDraft(raw) {
|
|
|
16
15
|
function buildWorkflowDraftResponse(draft, constraints) {
|
|
17
16
|
const validation = validateWorkflowDefinitionInput({
|
|
18
17
|
name: draft.name,
|
|
19
|
-
|
|
18
|
+
graph: draft.graph
|
|
20
19
|
});
|
|
21
|
-
const lint = lintWorkflowDraft(draft, constraints);
|
|
22
20
|
return {
|
|
23
21
|
draftId: randomUUID(),
|
|
24
22
|
repairAttempts: 0,
|
|
25
23
|
...draft,
|
|
26
24
|
permissionsSummary: summarizePermissions(draft.manifest),
|
|
27
25
|
validation,
|
|
28
|
-
lint,
|
|
26
|
+
lint: lintWorkflowDraft(draft, constraints),
|
|
29
27
|
suggestedInputs: suggestedInputsFromManifest(draft.manifest)
|
|
30
28
|
};
|
|
31
29
|
}
|
|
32
30
|
function lintWorkflowDraft(draft, constraints) {
|
|
33
31
|
const issues = [];
|
|
34
|
-
const { manifest,
|
|
32
|
+
const { manifest, graph } = draft;
|
|
35
33
|
if (!manifest.inputSchema) issues.push({
|
|
36
34
|
severity: "warning",
|
|
37
35
|
code: "missing_input_schema",
|
|
@@ -45,32 +43,27 @@ function lintWorkflowDraft(draft, constraints) {
|
|
|
45
43
|
if (manifest.permissions?.network && constraints?.allowNetwork === false) issues.push({
|
|
46
44
|
severity: "error",
|
|
47
45
|
code: "unsafe_permission",
|
|
48
|
-
message: "Draft requests network access, but network is disabled
|
|
46
|
+
message: "Draft requests network access, but network is disabled."
|
|
49
47
|
});
|
|
50
48
|
if (manifest.permissions?.fileSystem === "write" && constraints?.fileSystem !== "write") issues.push({
|
|
51
49
|
severity: "warning",
|
|
52
50
|
code: "unsafe_permission",
|
|
53
51
|
message: "Draft requests filesystem write access."
|
|
54
52
|
});
|
|
55
|
-
const
|
|
56
|
-
if (constraints?.maxPhases &&
|
|
53
|
+
const phases = new Set(graph.nodes.map((node) => node.phaseId).filter(Boolean));
|
|
54
|
+
if (constraints?.maxPhases && phases.size > constraints.maxPhases) issues.push({
|
|
57
55
|
severity: "warning",
|
|
58
56
|
code: "too_many_agents",
|
|
59
|
-
message: `Draft has ${
|
|
57
|
+
message: `Draft has ${phases.size} phases, above the requested maximum.`
|
|
60
58
|
});
|
|
61
|
-
const
|
|
62
|
-
if (constraints?.maxSubagents &&
|
|
59
|
+
const agents = graph.nodes.filter((node) => node.kind === "agent");
|
|
60
|
+
if (constraints?.maxSubagents && agents.length > constraints.maxSubagents) issues.push({
|
|
63
61
|
severity: "warning",
|
|
64
62
|
code: "too_many_agents",
|
|
65
|
-
message: `Draft
|
|
66
|
-
});
|
|
67
|
-
if (/parallel\s*\([^[]/.test(script)) issues.push({
|
|
68
|
-
severity: "warning",
|
|
69
|
-
code: "unbounded_parallelism",
|
|
70
|
-
message: "parallel() should receive a bounded array of thunks."
|
|
63
|
+
message: `Draft has ${agents.length} agents, above the requested maximum.`
|
|
71
64
|
});
|
|
72
65
|
if (constraints?.allowedTools?.length) {
|
|
73
|
-
const unknown =
|
|
66
|
+
const unknown = agents.flatMap((node) => node.config.toolset ?? []).filter((tool) => !constraints.allowedTools.includes(tool));
|
|
74
67
|
for (const tool of [...new Set(unknown)]) issues.push({
|
|
75
68
|
severity: "warning",
|
|
76
69
|
code: "unknown_tool",
|
|
@@ -89,12 +82,19 @@ function extractJsonObject(raw) {
|
|
|
89
82
|
if (start >= 0 && end > start) return trimmed.slice(start, end + 1);
|
|
90
83
|
throw new Error("Model did not return a JSON object.");
|
|
91
84
|
}
|
|
92
|
-
function
|
|
93
|
-
if (!value || typeof value !== "object" || Array.isArray(value)) return {
|
|
85
|
+
function normalizeGraph(value) {
|
|
86
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return {
|
|
87
|
+
schemaVersion: 1,
|
|
88
|
+
nodes: [],
|
|
89
|
+
edges: []
|
|
90
|
+
};
|
|
94
91
|
return value;
|
|
95
92
|
}
|
|
93
|
+
function normalizeManifest(value) {
|
|
94
|
+
return value && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
95
|
+
}
|
|
96
96
|
function stringArray(value) {
|
|
97
|
-
return Array.isArray(value) ? value.map(
|
|
97
|
+
return Array.isArray(value) ? value.map(String).filter(Boolean) : [];
|
|
98
98
|
}
|
|
99
99
|
function normalizeWorkflowName(value) {
|
|
100
100
|
const normalized = value.trim().toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, "");
|
|
@@ -103,12 +103,12 @@ function normalizeWorkflowName(value) {
|
|
|
103
103
|
function summarizePermissions(manifest) {
|
|
104
104
|
const permissions = manifest.permissions;
|
|
105
105
|
if (!permissions) return ["No explicit permissions requested."];
|
|
106
|
-
const
|
|
107
|
-
if (permissions.tools?.length)
|
|
108
|
-
if (permissions.network != null)
|
|
109
|
-
if (permissions.fileSystem)
|
|
110
|
-
if (permissions.approvalRequired)
|
|
111
|
-
return
|
|
106
|
+
const values = [];
|
|
107
|
+
if (permissions.tools?.length) values.push(`Tools: ${permissions.tools.join(", ")}`);
|
|
108
|
+
if (permissions.network != null) values.push(`Network: ${permissions.network ? "enabled" : "disabled"}`);
|
|
109
|
+
if (permissions.fileSystem) values.push(`Filesystem: ${permissions.fileSystem}`);
|
|
110
|
+
if (permissions.approvalRequired) values.push("Approval required");
|
|
111
|
+
return values.length ? values : ["No explicit permissions requested."];
|
|
112
112
|
}
|
|
113
113
|
function suggestedInputsFromManifest(manifest) {
|
|
114
114
|
const properties = manifest.inputSchema?.properties;
|
|
@@ -119,14 +119,6 @@ function suggestedInputsFromManifest(manifest) {
|
|
|
119
119
|
example: typeof schema.default === "string" ? schema.default : schema.description ?? ""
|
|
120
120
|
}));
|
|
121
121
|
}
|
|
122
|
-
function collectToolsetNames(script) {
|
|
123
|
-
const out = [];
|
|
124
|
-
for (const match of script.matchAll(/toolset\s*:\s*\[([^\]]*)\]/g)) {
|
|
125
|
-
const body = match[1] ?? "";
|
|
126
|
-
for (const item of body.matchAll(/['"]([^'"]+)['"]/g)) out.push(item[1] ?? "");
|
|
127
|
-
}
|
|
128
|
-
return out.filter(Boolean);
|
|
129
|
-
}
|
|
130
122
|
//#endregion
|
|
131
123
|
export { buildWorkflowDraftResponse, lintWorkflowDraft, parseGeneratedWorkflowDraft };
|
|
132
124
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-draft-validator.js","names":[],"sources":["../../../../src/workflows/draft/workflow-draft-validator.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport {
|
|
1
|
+
{"version":3,"file":"workflow-draft-validator.js","names":[],"sources":["../../../../src/workflows/draft/workflow-draft-validator.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type { WorkflowDefinitionManifest, WorkflowGraph } from '../domain/definition.js';\nimport { validateWorkflowDefinitionInput } from '../domain/validation.js';\n\nimport type { GeneratedWorkflowDraft, WorkflowDraftConstraints, WorkflowDraftLintIssue, WorkflowDraftResponse } from './workflow-draft.types.js';\n\nexport function parseGeneratedWorkflowDraft(raw: string): GeneratedWorkflowDraft {\n const parsed = JSON.parse(extractJsonObject(raw)) as Partial<GeneratedWorkflowDraft>;\n return {\n name: normalizeWorkflowName(String(parsed.name ?? 'custom_workflow')),\n graph: normalizeGraph(parsed.graph),\n manifest: normalizeManifest(parsed.manifest),\n explanation: String(parsed.explanation ?? ''),\n assumptions: stringArray(parsed.assumptions),\n risks: stringArray(parsed.risks),\n };\n}\n\nexport function buildWorkflowDraftResponse(draft: GeneratedWorkflowDraft, constraints?: WorkflowDraftConstraints): WorkflowDraftResponse {\n const validation = validateWorkflowDefinitionInput({ name: draft.name, graph: draft.graph });\n return {\n draftId: randomUUID(),\n repairAttempts: 0,\n ...draft,\n permissionsSummary: summarizePermissions(draft.manifest),\n validation,\n lint: lintWorkflowDraft(draft, constraints),\n suggestedInputs: suggestedInputsFromManifest(draft.manifest),\n };\n}\n\nexport function lintWorkflowDraft(draft: GeneratedWorkflowDraft, constraints?: WorkflowDraftConstraints): WorkflowDraftLintIssue[] {\n const issues: WorkflowDraftLintIssue[] = [];\n const { manifest, graph } = draft;\n if (!manifest.inputSchema) issues.push({ severity: 'warning', code: 'missing_input_schema', message: 'Draft does not define an input schema.' });\n if (!manifest.outputSchema) issues.push({ severity: 'warning', code: 'missing_output_schema', message: 'Draft does not define an output schema.' });\n if (manifest.permissions?.network && constraints?.allowNetwork === false) issues.push({ severity: 'error', code: 'unsafe_permission', message: 'Draft requests network access, but network is disabled.' });\n if (manifest.permissions?.fileSystem === 'write' && constraints?.fileSystem !== 'write') issues.push({ severity: 'warning', code: 'unsafe_permission', message: 'Draft requests filesystem write access.' });\n const phases = new Set(graph.nodes.map((node) => node.phaseId).filter(Boolean));\n if (constraints?.maxPhases && phases.size > constraints.maxPhases) issues.push({ severity: 'warning', code: 'too_many_agents', message: `Draft has ${phases.size} phases, above the requested maximum.` });\n const agents = graph.nodes.filter((node) => node.kind === 'agent');\n if (constraints?.maxSubagents && agents.length > constraints.maxSubagents) issues.push({ severity: 'warning', code: 'too_many_agents', message: `Draft has ${agents.length} agents, above the requested maximum.` });\n if (constraints?.allowedTools?.length) {\n const unknown = agents.flatMap((node) => node.config.toolset ?? []).filter((tool) => !constraints.allowedTools!.includes(tool));\n for (const tool of [...new Set(unknown)]) issues.push({ severity: 'warning', code: 'unknown_tool', message: `Tool '${tool}' is outside the requested allowlist.` });\n }\n return issues;\n}\n\nfunction extractJsonObject(raw: string): string {\n const trimmed = raw.trim();\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) return trimmed;\n const fenced = trimmed.match(/```(?:json)?\\s*([\\s\\S]*?)```/i)?.[1]?.trim();\n if (fenced?.startsWith('{')) return fenced;\n const start = trimmed.indexOf('{');\n const end = trimmed.lastIndexOf('}');\n if (start >= 0 && end > start) return trimmed.slice(start, end + 1);\n throw new Error('Model did not return a JSON object.');\n}\n\nfunction normalizeGraph(value: unknown): WorkflowGraph {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return { schemaVersion: 1, nodes: [], edges: [] };\n return value as WorkflowGraph;\n}\n\nfunction normalizeManifest(value: unknown): WorkflowDefinitionManifest {\n return value && typeof value === 'object' && !Array.isArray(value) ? value as WorkflowDefinitionManifest : {};\n}\n\nfunction stringArray(value: unknown): string[] {\n return Array.isArray(value) ? value.map(String).filter(Boolean) : [];\n}\n\nfunction normalizeWorkflowName(value: string): string {\n const normalized = value.trim().toLowerCase().replace(/[^a-z0-9]+/g, '_').replace(/^_+|_+$/g, '');\n return /^[a-z]/.test(normalized) ? normalized : `workflow_${normalized || 'draft'}`;\n}\n\nfunction summarizePermissions(manifest: WorkflowDefinitionManifest): string[] {\n const permissions = manifest.permissions;\n if (!permissions) return ['No explicit permissions requested.'];\n const values: string[] = [];\n if (permissions.tools?.length) values.push(`Tools: ${permissions.tools.join(', ')}`);\n if (permissions.network != null) values.push(`Network: ${permissions.network ? 'enabled' : 'disabled'}`);\n if (permissions.fileSystem) values.push(`Filesystem: ${permissions.fileSystem}`);\n if (permissions.approvalRequired) values.push('Approval required');\n return values.length ? values : ['No explicit permissions requested.'];\n}\n\nfunction suggestedInputsFromManifest(manifest: WorkflowDefinitionManifest): WorkflowDraftResponse['suggestedInputs'] {\n const properties = manifest.inputSchema?.properties;\n if (!properties) return undefined;\n return Object.entries(properties).slice(0, 8).map(([key, schema]) => ({ key, label: typeof schema.title === 'string' ? schema.title : key, example: typeof schema.default === 'string' ? schema.default : schema.description ?? '' }));\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { WorkflowDefinitionManifest } from '../domain/definition.js';
|
|
1
|
+
import type { WorkflowDefinitionManifest, WorkflowGraph } from '../domain/definition.js';
|
|
2
2
|
import type { WorkflowDefinitionValidationResult } from '../domain/validation.js';
|
|
3
3
|
export type WorkflowDraftMode = 'create' | 'improve';
|
|
4
4
|
export interface WorkflowDraftConstraints {
|
|
@@ -14,17 +14,17 @@ export interface CreateWorkflowDraftRequest {
|
|
|
14
14
|
agentId: string;
|
|
15
15
|
language?: 'en' | 'zh';
|
|
16
16
|
mode?: WorkflowDraftMode;
|
|
17
|
-
|
|
17
|
+
existingGraph?: WorkflowGraph;
|
|
18
18
|
constraints?: WorkflowDraftConstraints;
|
|
19
19
|
}
|
|
20
20
|
export interface WorkflowDraftLintIssue {
|
|
21
21
|
severity: 'error' | 'warning';
|
|
22
|
-
code: 'missing_input_schema' | 'missing_output_schema' | 'unsafe_permission' | 'too_many_agents' | 'unknown_tool' | 'weak_phase_names'
|
|
22
|
+
code: 'missing_input_schema' | 'missing_output_schema' | 'unsafe_permission' | 'too_many_agents' | 'unknown_tool' | 'weak_phase_names';
|
|
23
23
|
message: string;
|
|
24
24
|
}
|
|
25
25
|
export interface GeneratedWorkflowDraft {
|
|
26
26
|
name: string;
|
|
27
|
-
|
|
27
|
+
graph: WorkflowGraph;
|
|
28
28
|
manifest: WorkflowDefinitionManifest;
|
|
29
29
|
explanation: string;
|
|
30
30
|
assumptions: string[];
|
|
@@ -18,7 +18,18 @@ function buildTimelineItem(event) {
|
|
|
18
18
|
};
|
|
19
19
|
}
|
|
20
20
|
function isAgentMutationEvent(type) {
|
|
21
|
-
return type === "agent_queued" || type === "agent_started" || type === "agent_step_started" || type === "agent_step_completed" || type === "agent_completed";
|
|
21
|
+
return type === "node_started" || type === "node_completed" || type === "agent_queued" || type === "agent_started" || type === "agent_step_started" || type === "agent_step_completed" || type === "agent_completed";
|
|
22
|
+
}
|
|
23
|
+
function markOpenNodesTerminal(nodes, status, completedAtMs, error) {
|
|
24
|
+
for (const [nodeId, node] of nodes) {
|
|
25
|
+
if (node.status !== "running") continue;
|
|
26
|
+
nodes.set(nodeId, {
|
|
27
|
+
...node,
|
|
28
|
+
status,
|
|
29
|
+
completedAtMs,
|
|
30
|
+
error: status === "error" ? error : node.error
|
|
31
|
+
});
|
|
32
|
+
}
|
|
22
33
|
}
|
|
23
34
|
function markOpenAgentsTerminal(agentIdToAgent, status, completedAtMs, error) {
|
|
24
35
|
for (const [agentId, agent] of agentIdToAgent) {
|
|
@@ -50,6 +61,7 @@ function projectWorkflowRunView(events) {
|
|
|
50
61
|
};
|
|
51
62
|
const phaseIdToPhase = /* @__PURE__ */ new Map();
|
|
52
63
|
const agentIdToAgent = /* @__PURE__ */ new Map();
|
|
64
|
+
const nodeIdToNode = /* @__PURE__ */ new Map();
|
|
53
65
|
const logs = [];
|
|
54
66
|
const artifacts = [];
|
|
55
67
|
const timeline = [];
|
|
@@ -84,10 +96,37 @@ function projectWorkflowRunView(events) {
|
|
|
84
96
|
});
|
|
85
97
|
break;
|
|
86
98
|
}
|
|
99
|
+
case "node_started": {
|
|
100
|
+
const payload = event.payload;
|
|
101
|
+
nodeIdToNode.set(payload.nodeId, {
|
|
102
|
+
id: payload.nodeId,
|
|
103
|
+
kind: payload.kind,
|
|
104
|
+
title: payload.title,
|
|
105
|
+
status: "running",
|
|
106
|
+
startedAtMs: event.createdAtMs
|
|
107
|
+
});
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
case "node_completed": {
|
|
111
|
+
const payload = event.payload;
|
|
112
|
+
const existing = nodeIdToNode.get(payload.nodeId);
|
|
113
|
+
nodeIdToNode.set(payload.nodeId, {
|
|
114
|
+
id: payload.nodeId,
|
|
115
|
+
kind: payload.kind,
|
|
116
|
+
title: payload.title,
|
|
117
|
+
status: payload.status,
|
|
118
|
+
startedAtMs: existing?.startedAtMs,
|
|
119
|
+
completedAtMs: event.createdAtMs,
|
|
120
|
+
resultPreview: payload.resultPreview,
|
|
121
|
+
error: payload.error
|
|
122
|
+
});
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
87
125
|
case "agent_queued": {
|
|
88
126
|
const payload = event.payload;
|
|
89
127
|
agentIdToAgent.set(payload.agentId, {
|
|
90
128
|
id: payload.agentId,
|
|
129
|
+
nodeId: payload.nodeId,
|
|
91
130
|
label: payload.label,
|
|
92
131
|
phaseId: payload.phaseId,
|
|
93
132
|
status: "queued",
|
|
@@ -192,12 +231,14 @@ function projectWorkflowRunView(events) {
|
|
|
192
231
|
run.error = payload.error;
|
|
193
232
|
run.completedAtMs = event.createdAtMs;
|
|
194
233
|
markOpenAgentsTerminal(agentIdToAgent, payload.error?.code === "timeout" ? "skipped" : "error", event.createdAtMs, payload.error?.message);
|
|
234
|
+
markOpenNodesTerminal(nodeIdToNode, payload.error?.code === "timeout" ? "skipped" : "error", event.createdAtMs, payload.error?.message);
|
|
195
235
|
break;
|
|
196
236
|
}
|
|
197
237
|
case "run_cancelled":
|
|
198
238
|
run.status = "cancelled";
|
|
199
239
|
run.completedAtMs = event.createdAtMs;
|
|
200
240
|
markOpenAgentsTerminal(agentIdToAgent, "skipped", event.createdAtMs);
|
|
241
|
+
markOpenNodesTerminal(nodeIdToNode, "skipped", event.createdAtMs);
|
|
201
242
|
break;
|
|
202
243
|
default: break;
|
|
203
244
|
}
|
|
@@ -220,6 +261,7 @@ function projectWorkflowRunView(events) {
|
|
|
220
261
|
};
|
|
221
262
|
}),
|
|
222
263
|
agents,
|
|
264
|
+
nodes: [...nodeIdToNode.values()],
|
|
223
265
|
logs,
|
|
224
266
|
artifacts,
|
|
225
267
|
timeline,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projector.js","names":[],"sources":["../../../../src/workflows/engine/projector.ts"],"sourcesContent":["import type { WorkflowEventEnvelope } from '../domain/event.js';\nimport type {\n WorkflowAgentStatus,\n WorkflowAgentView,\n WorkflowLogEntry,\n WorkflowPhaseStatus,\n WorkflowPhaseView,\n WorkflowRun,\n WorkflowRunView,\n WorkflowTimelineItem,\n} from '../domain/run.js';\nimport { isTerminalWorkflowRunStatus } from '../domain/run.js';\nimport type { WorkflowArtifactRef } from '../domain/result.js';\n\nfunction terminalRunStatus(status: WorkflowRun['status']): boolean {\n return isTerminalWorkflowRunStatus(status);\n}\n\nfunction phaseStatusAfterAgentStatus(agentStatuses: WorkflowAgentStatus[]): WorkflowPhaseStatus {\n if (agentStatuses.some((status) => status === 'running')) {\n return 'running';\n }\n if (agentStatuses.some((status) => status === 'error')) {\n return 'failed';\n }\n if (agentStatuses.length > 0 && agentStatuses.every((status) => status === 'done' || status === 'skipped')) {\n return 'completed';\n }\n return 'pending';\n}\n\nfunction buildTimelineItem(event: WorkflowEventEnvelope): WorkflowTimelineItem {\n return {\n sequence: event.sequence,\n type: event.type,\n title: event.type.replaceAll('_', ' '),\n createdAtMs: event.createdAtMs,\n };\n}\n\nfunction isAgentMutationEvent(type: WorkflowEventEnvelope['type']): boolean {\n return type === 'agent_queued'\n || type === 'agent_started'\n || type === 'agent_step_started'\n || type === 'agent_step_completed'\n || type === 'agent_completed';\n}\n\nfunction markOpenAgentsTerminal(\n agentIdToAgent: Map<string, WorkflowAgentView>,\n status: Extract<WorkflowAgentStatus, 'error' | 'skipped'>,\n completedAtMs: number,\n error?: string,\n): void {\n for (const [agentId, agent] of agentIdToAgent) {\n if (agent.status !== 'queued' && agent.status !== 'running') {\n continue;\n }\n agentIdToAgent.set(agentId, {\n ...agent,\n status,\n currentStep: undefined,\n error: status === 'error' ? error : agent.error,\n completedAtMs,\n steps: agent.steps.map((step) =>\n step.status === 'running'\n ? { ...step, status: 'error', completedAtMs }\n : step,\n ),\n });\n }\n}\n\nexport function projectWorkflowRunView(events: WorkflowEventEnvelope[]): WorkflowRunView | null {\n if (events.length === 0) {\n return null;\n }\n\n const orderedEvents = [...events].sort((left, right) => left.sequence - right.sequence);\n const firstEvent = orderedEvents[0];\n if (firstEvent.type !== 'run_queued') {\n return null;\n }\n\n const firstPayload = firstEvent.payload as { run?: WorkflowRun };\n if (!firstPayload.run) {\n return null;\n }\n\n const run: WorkflowRun = {\n ...firstPayload.run,\n metrics: { ...firstPayload.run.metrics },\n };\n const phaseIdToPhase = new Map<string, WorkflowPhaseView>();\n const agentIdToAgent = new Map<string, WorkflowAgentView>();\n const logs: WorkflowLogEntry[] = [];\n const artifacts: WorkflowArtifactRef[] = [];\n const timeline: WorkflowTimelineItem[] = [];\n\n for (const event of orderedEvents) {\n timeline.push(buildTimelineItem(event));\n\n if (terminalRunStatus(run.status) && isAgentMutationEvent(event.type)) {\n continue;\n }\n\n switch (event.type) {\n case 'run_started': {\n const payload = event.payload as { startedAtMs: number };\n run.status = 'running';\n run.startedAtMs = payload.startedAtMs;\n break;\n }\n case 'phase_started': {\n const payload = event.payload as { phaseId: string; title: string };\n phaseIdToPhase.set(payload.phaseId, {\n id: payload.phaseId,\n title: payload.title,\n status: 'running',\n startedAtMs: event.createdAtMs,\n agentIds: phaseIdToPhase.get(payload.phaseId)?.agentIds ?? [],\n });\n break;\n }\n case 'phase_completed': {\n const payload = event.payload as { phaseId: string };\n const existing = phaseIdToPhase.get(payload.phaseId);\n if (existing) {\n phaseIdToPhase.set(payload.phaseId, {\n ...existing,\n status: 'completed',\n completedAtMs: event.createdAtMs,\n });\n }\n break;\n }\n case 'agent_queued': {\n const payload = event.payload as {\n agentId: string;\n label: string;\n phaseId?: string;\n prompt?: string;\n sessionKey: string;\n invocation?: WorkflowAgentView['invocation'];\n };\n agentIdToAgent.set(payload.agentId, {\n id: payload.agentId,\n label: payload.label,\n phaseId: payload.phaseId,\n status: 'queued',\n prompt: payload.prompt,\n invocation: payload.invocation,\n sessionKey: payload.sessionKey,\n transcriptMessageCount: 0,\n steps: [],\n });\n if (payload.phaseId) {\n const existingPhase = phaseIdToPhase.get(payload.phaseId);\n if (existingPhase && !existingPhase.agentIds.includes(payload.agentId)) {\n phaseIdToPhase.set(payload.phaseId, {\n ...existingPhase,\n agentIds: [...existingPhase.agentIds, payload.agentId],\n });\n }\n }\n break;\n }\n case 'agent_started': {\n const payload = event.payload as { agentId: string };\n const existing = agentIdToAgent.get(payload.agentId);\n if (existing) {\n agentIdToAgent.set(payload.agentId, {\n ...existing,\n status: 'running',\n startedAtMs: event.createdAtMs,\n });\n }\n break;\n }\n case 'agent_step_started': {\n const payload = event.payload as {\n agentId: string;\n stepId: string;\n label: string;\n kind: 'tool' | 'llm' | 'thinking';\n toolName?: string;\n detail?: string;\n };\n const existing = agentIdToAgent.get(payload.agentId);\n if (existing) {\n agentIdToAgent.set(payload.agentId, {\n ...existing,\n currentStep: payload.label,\n transcriptMessageCount: existing.transcriptMessageCount + 1,\n steps: [\n ...existing.steps,\n {\n id: payload.stepId,\n label: payload.label,\n kind: payload.kind,\n toolName: payload.toolName,\n detail: payload.detail,\n status: 'running',\n startedAtMs: event.createdAtMs,\n },\n ],\n });\n }\n break;\n }\n case 'agent_step_completed': {\n const payload = event.payload as {\n agentId: string;\n stepId: string;\n status: 'done' | 'error';\n resultPreview?: string;\n error?: string;\n };\n const existing = agentIdToAgent.get(payload.agentId);\n if (existing) {\n agentIdToAgent.set(payload.agentId, {\n ...existing,\n steps: existing.steps.map((step) =>\n step.id === payload.stepId\n ? {\n ...step,\n status: payload.status,\n resultPreview: payload.resultPreview,\n error: payload.error,\n completedAtMs: event.createdAtMs,\n }\n : step,\n ),\n });\n }\n break;\n }\n case 'agent_completed': {\n const payload = event.payload as {\n agentId: string;\n status: WorkflowAgentStatus;\n resultPreview?: string;\n error?: string;\n };\n const existing = agentIdToAgent.get(payload.agentId);\n if (existing) {\n agentIdToAgent.set(payload.agentId, {\n ...existing,\n status: payload.status,\n currentStep: undefined,\n resultPreview: payload.resultPreview,\n error: payload.error,\n transcriptMessageCount: existing.transcriptMessageCount + 1,\n completedAtMs: event.createdAtMs,\n });\n }\n break;\n }\n case 'log_appended': {\n const payload = event.payload as { message: string };\n logs.push({ sequence: event.sequence, message: payload.message, createdAtMs: event.createdAtMs });\n break;\n }\n case 'artifact_created': {\n const payload = event.payload as { artifact: WorkflowArtifactRef };\n artifacts.push(payload.artifact);\n run.metrics.artifactCount = artifacts.length;\n break;\n }\n case 'run_completed': {\n const payload = event.payload as { result: WorkflowRun['result'] };\n run.status = 'succeeded';\n run.result = payload.result;\n run.completedAtMs = event.createdAtMs;\n break;\n }\n case 'run_failed': {\n const payload = event.payload as { error: WorkflowRun['error'] };\n run.status = payload.error?.code === 'timeout' ? 'timeout' : 'failed';\n run.error = payload.error;\n run.completedAtMs = event.createdAtMs;\n markOpenAgentsTerminal(\n agentIdToAgent,\n payload.error?.code === 'timeout' ? 'skipped' : 'error',\n event.createdAtMs,\n payload.error?.message,\n );\n break;\n }\n case 'run_cancelled': {\n run.status = 'cancelled';\n run.completedAtMs = event.createdAtMs;\n markOpenAgentsTerminal(agentIdToAgent, 'skipped', event.createdAtMs);\n break;\n }\n case 'run_queued':\n default:\n break;\n }\n }\n\n const agents = [...agentIdToAgent.values()];\n run.metrics.agentCount = agents.length;\n run.metrics.doneAgentCount = agents.filter((agent) => agent.status === 'done').length;\n run.metrics.errorAgentCount = agents.filter((agent) => agent.status === 'error').length;\n run.metrics.skippedAgentCount = agents.filter((agent) => agent.status === 'skipped').length;\n run.metrics.artifactCount = artifacts.length;\n if (run.startedAtMs && run.completedAtMs) {\n run.metrics.durationMs = run.completedAtMs - run.startedAtMs;\n }\n\n const phases = [...phaseIdToPhase.values()].map((phase) => {\n if (phase.status === 'completed' || phase.status === 'failed') {\n return phase;\n }\n const phaseAgents = phase.agentIds\n .map((agentId) => agentIdToAgent.get(agentId)?.status)\n .filter((status): status is WorkflowAgentStatus => Boolean(status));\n return { ...phase, status: phaseStatusAfterAgentStatus(phaseAgents) };\n });\n\n return {\n run,\n phases,\n agents,\n logs,\n artifacts,\n timeline,\n controls: {\n canCancel: !terminalRunStatus(run.status),\n canRetry: terminalRunStatus(run.status),\n canArchive: terminalRunStatus(run.status),\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"projector.js","names":[],"sources":["../../../../src/workflows/engine/projector.ts"],"sourcesContent":["import type { WorkflowEventEnvelope } from '../domain/event.js';\nimport type {\n WorkflowAgentStatus,\n WorkflowAgentView,\n WorkflowLogEntry,\n WorkflowNodeView,\n WorkflowPhaseStatus,\n WorkflowPhaseView,\n WorkflowRun,\n WorkflowRunView,\n WorkflowTimelineItem,\n} from '../domain/run.js';\nimport { isTerminalWorkflowRunStatus } from '../domain/run.js';\nimport type { WorkflowArtifactRef } from '../domain/result.js';\n\nfunction terminalRunStatus(status: WorkflowRun['status']): boolean {\n return isTerminalWorkflowRunStatus(status);\n}\n\nfunction phaseStatusAfterAgentStatus(agentStatuses: WorkflowAgentStatus[]): WorkflowPhaseStatus {\n if (agentStatuses.some((status) => status === 'running')) {\n return 'running';\n }\n if (agentStatuses.some((status) => status === 'error')) {\n return 'failed';\n }\n if (agentStatuses.length > 0 && agentStatuses.every((status) => status === 'done' || status === 'skipped')) {\n return 'completed';\n }\n return 'pending';\n}\n\nfunction buildTimelineItem(event: WorkflowEventEnvelope): WorkflowTimelineItem {\n return {\n sequence: event.sequence,\n type: event.type,\n title: event.type.replaceAll('_', ' '),\n createdAtMs: event.createdAtMs,\n };\n}\n\nfunction isAgentMutationEvent(type: WorkflowEventEnvelope['type']): boolean {\n return type === 'node_started'\n || type === 'node_completed'\n || type === 'agent_queued'\n || type === 'agent_started'\n || type === 'agent_step_started'\n || type === 'agent_step_completed'\n || type === 'agent_completed';\n}\n\nfunction markOpenNodesTerminal(nodes: Map<string, WorkflowNodeView>, status: 'error' | 'skipped', completedAtMs: number, error?: string): void {\n for (const [nodeId, node] of nodes) {\n if (node.status !== 'running') continue;\n nodes.set(nodeId, { ...node, status, completedAtMs, error: status === 'error' ? error : node.error });\n }\n}\n\nfunction markOpenAgentsTerminal(\n agentIdToAgent: Map<string, WorkflowAgentView>,\n status: Extract<WorkflowAgentStatus, 'error' | 'skipped'>,\n completedAtMs: number,\n error?: string,\n): void {\n for (const [agentId, agent] of agentIdToAgent) {\n if (agent.status !== 'queued' && agent.status !== 'running') {\n continue;\n }\n agentIdToAgent.set(agentId, {\n ...agent,\n status,\n currentStep: undefined,\n error: status === 'error' ? error : agent.error,\n completedAtMs,\n steps: agent.steps.map((step) =>\n step.status === 'running'\n ? { ...step, status: 'error', completedAtMs }\n : step,\n ),\n });\n }\n}\n\nexport function projectWorkflowRunView(events: WorkflowEventEnvelope[]): WorkflowRunView | null {\n if (events.length === 0) {\n return null;\n }\n\n const orderedEvents = [...events].sort((left, right) => left.sequence - right.sequence);\n const firstEvent = orderedEvents[0];\n if (firstEvent.type !== 'run_queued') {\n return null;\n }\n\n const firstPayload = firstEvent.payload as { run?: WorkflowRun };\n if (!firstPayload.run) {\n return null;\n }\n\n const run: WorkflowRun = {\n ...firstPayload.run,\n metrics: { ...firstPayload.run.metrics },\n };\n const phaseIdToPhase = new Map<string, WorkflowPhaseView>();\n const agentIdToAgent = new Map<string, WorkflowAgentView>();\n const nodeIdToNode = new Map<string, WorkflowNodeView>();\n const logs: WorkflowLogEntry[] = [];\n const artifacts: WorkflowArtifactRef[] = [];\n const timeline: WorkflowTimelineItem[] = [];\n\n for (const event of orderedEvents) {\n timeline.push(buildTimelineItem(event));\n\n if (terminalRunStatus(run.status) && isAgentMutationEvent(event.type)) {\n continue;\n }\n\n switch (event.type) {\n case 'run_started': {\n const payload = event.payload as { startedAtMs: number };\n run.status = 'running';\n run.startedAtMs = payload.startedAtMs;\n break;\n }\n case 'phase_started': {\n const payload = event.payload as { phaseId: string; title: string };\n phaseIdToPhase.set(payload.phaseId, {\n id: payload.phaseId,\n title: payload.title,\n status: 'running',\n startedAtMs: event.createdAtMs,\n agentIds: phaseIdToPhase.get(payload.phaseId)?.agentIds ?? [],\n });\n break;\n }\n case 'phase_completed': {\n const payload = event.payload as { phaseId: string };\n const existing = phaseIdToPhase.get(payload.phaseId);\n if (existing) {\n phaseIdToPhase.set(payload.phaseId, {\n ...existing,\n status: 'completed',\n completedAtMs: event.createdAtMs,\n });\n }\n break;\n }\n case 'node_started': {\n const payload = event.payload as { nodeId: string; kind: string; title: string };\n nodeIdToNode.set(payload.nodeId, { id: payload.nodeId, kind: payload.kind, title: payload.title, status: 'running', startedAtMs: event.createdAtMs });\n break;\n }\n case 'node_completed': {\n const payload = event.payload as { nodeId: string; kind: string; title: string; status: 'done' | 'error' | 'skipped'; resultPreview?: string; error?: string };\n const existing = nodeIdToNode.get(payload.nodeId);\n nodeIdToNode.set(payload.nodeId, {\n id: payload.nodeId,\n kind: payload.kind,\n title: payload.title,\n status: payload.status,\n startedAtMs: existing?.startedAtMs,\n completedAtMs: event.createdAtMs,\n resultPreview: payload.resultPreview,\n error: payload.error,\n });\n break;\n }\n case 'agent_queued': {\n const payload = event.payload as {\n agentId: string;\n nodeId: string;\n label: string;\n phaseId?: string;\n prompt?: string;\n sessionKey: string;\n invocation?: WorkflowAgentView['invocation'];\n };\n agentIdToAgent.set(payload.agentId, {\n id: payload.agentId,\n nodeId: payload.nodeId,\n label: payload.label,\n phaseId: payload.phaseId,\n status: 'queued',\n prompt: payload.prompt,\n invocation: payload.invocation,\n sessionKey: payload.sessionKey,\n transcriptMessageCount: 0,\n steps: [],\n });\n if (payload.phaseId) {\n const existingPhase = phaseIdToPhase.get(payload.phaseId);\n if (existingPhase && !existingPhase.agentIds.includes(payload.agentId)) {\n phaseIdToPhase.set(payload.phaseId, {\n ...existingPhase,\n agentIds: [...existingPhase.agentIds, payload.agentId],\n });\n }\n }\n break;\n }\n case 'agent_started': {\n const payload = event.payload as { agentId: string };\n const existing = agentIdToAgent.get(payload.agentId);\n if (existing) {\n agentIdToAgent.set(payload.agentId, {\n ...existing,\n status: 'running',\n startedAtMs: event.createdAtMs,\n });\n }\n break;\n }\n case 'agent_step_started': {\n const payload = event.payload as {\n agentId: string;\n stepId: string;\n label: string;\n kind: 'tool' | 'llm' | 'thinking';\n toolName?: string;\n detail?: string;\n };\n const existing = agentIdToAgent.get(payload.agentId);\n if (existing) {\n agentIdToAgent.set(payload.agentId, {\n ...existing,\n currentStep: payload.label,\n transcriptMessageCount: existing.transcriptMessageCount + 1,\n steps: [\n ...existing.steps,\n {\n id: payload.stepId,\n label: payload.label,\n kind: payload.kind,\n toolName: payload.toolName,\n detail: payload.detail,\n status: 'running',\n startedAtMs: event.createdAtMs,\n },\n ],\n });\n }\n break;\n }\n case 'agent_step_completed': {\n const payload = event.payload as {\n agentId: string;\n stepId: string;\n status: 'done' | 'error';\n resultPreview?: string;\n error?: string;\n };\n const existing = agentIdToAgent.get(payload.agentId);\n if (existing) {\n agentIdToAgent.set(payload.agentId, {\n ...existing,\n steps: existing.steps.map((step) =>\n step.id === payload.stepId\n ? {\n ...step,\n status: payload.status,\n resultPreview: payload.resultPreview,\n error: payload.error,\n completedAtMs: event.createdAtMs,\n }\n : step,\n ),\n });\n }\n break;\n }\n case 'agent_completed': {\n const payload = event.payload as {\n agentId: string;\n status: WorkflowAgentStatus;\n resultPreview?: string;\n error?: string;\n };\n const existing = agentIdToAgent.get(payload.agentId);\n if (existing) {\n agentIdToAgent.set(payload.agentId, {\n ...existing,\n status: payload.status,\n currentStep: undefined,\n resultPreview: payload.resultPreview,\n error: payload.error,\n transcriptMessageCount: existing.transcriptMessageCount + 1,\n completedAtMs: event.createdAtMs,\n });\n }\n break;\n }\n case 'log_appended': {\n const payload = event.payload as { message: string };\n logs.push({ sequence: event.sequence, message: payload.message, createdAtMs: event.createdAtMs });\n break;\n }\n case 'artifact_created': {\n const payload = event.payload as { artifact: WorkflowArtifactRef };\n artifacts.push(payload.artifact);\n run.metrics.artifactCount = artifacts.length;\n break;\n }\n case 'run_completed': {\n const payload = event.payload as { result: WorkflowRun['result'] };\n run.status = 'succeeded';\n run.result = payload.result;\n run.completedAtMs = event.createdAtMs;\n break;\n }\n case 'run_failed': {\n const payload = event.payload as { error: WorkflowRun['error'] };\n run.status = payload.error?.code === 'timeout' ? 'timeout' : 'failed';\n run.error = payload.error;\n run.completedAtMs = event.createdAtMs;\n markOpenAgentsTerminal(\n agentIdToAgent,\n payload.error?.code === 'timeout' ? 'skipped' : 'error',\n event.createdAtMs,\n payload.error?.message,\n );\n markOpenNodesTerminal(nodeIdToNode, payload.error?.code === 'timeout' ? 'skipped' : 'error', event.createdAtMs, payload.error?.message);\n break;\n }\n case 'run_cancelled': {\n run.status = 'cancelled';\n run.completedAtMs = event.createdAtMs;\n markOpenAgentsTerminal(agentIdToAgent, 'skipped', event.createdAtMs);\n markOpenNodesTerminal(nodeIdToNode, 'skipped', event.createdAtMs);\n break;\n }\n case 'run_queued':\n default:\n break;\n }\n }\n\n const agents = [...agentIdToAgent.values()];\n run.metrics.agentCount = agents.length;\n run.metrics.doneAgentCount = agents.filter((agent) => agent.status === 'done').length;\n run.metrics.errorAgentCount = agents.filter((agent) => agent.status === 'error').length;\n run.metrics.skippedAgentCount = agents.filter((agent) => agent.status === 'skipped').length;\n run.metrics.artifactCount = artifacts.length;\n if (run.startedAtMs && run.completedAtMs) {\n run.metrics.durationMs = run.completedAtMs - run.startedAtMs;\n }\n\n const phases = [...phaseIdToPhase.values()].map((phase) => {\n if (phase.status === 'completed' || phase.status === 'failed') {\n return phase;\n }\n const phaseAgents = phase.agentIds\n .map((agentId) => agentIdToAgent.get(agentId)?.status)\n .filter((status): status is WorkflowAgentStatus => Boolean(status));\n return { ...phase, status: phaseStatusAfterAgentStatus(phaseAgents) };\n });\n\n return {\n run,\n phases,\n agents,\n nodes: [...nodeIdToNode.values()],\n logs,\n artifacts,\n timeline,\n controls: {\n canCancel: !terminalRunStatus(run.status),\n canRetry: terminalRunStatus(run.status),\n canArchive: terminalRunStatus(run.status),\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -3,15 +3,14 @@ import type { WorkflowEventEnvelope } from '../domain/event.js';
|
|
|
3
3
|
import type { WorkflowRun, WorkflowRunMetadata, WorkflowRunSource, WorkflowRunView } from '../domain/run.js';
|
|
4
4
|
import { WorkflowEventStore } from '../store/event-store.js';
|
|
5
5
|
import { WorkflowRunStore } from '../store/run-store.js';
|
|
6
|
-
import type { WorkflowRuntime } from '../runtime/workflow-runtime-port.js';
|
|
6
|
+
import type { WorkflowRuntime, WorkflowRuntimeSubagentRunner } from '../runtime/workflow-runtime-port.js';
|
|
7
7
|
import type { Api, Model } from '@earendil-works/pi-ai';
|
|
8
|
-
import type { WorkflowScriptSubagentRunner } from '../runtime/script-runtime.js';
|
|
9
8
|
import type { WorkflowAgentInvocationSnapshot } from '../domain/index.js';
|
|
10
9
|
export interface WorkflowEngineOptions {
|
|
11
10
|
cwd: string;
|
|
12
11
|
eventStore: WorkflowEventStore;
|
|
13
12
|
runStore: WorkflowRunStore;
|
|
14
|
-
runner:
|
|
13
|
+
runner: WorkflowRuntimeSubagentRunner;
|
|
15
14
|
runtime?: WorkflowRuntime;
|
|
16
15
|
hooks?: WorkflowEngineHook[];
|
|
17
16
|
subagentSessionKeyFactory?: (ctx: {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { workflowStepLabel } from "../../agent/workflow/step-labels.js";
|
|
2
2
|
import { validateWorkflowJsonSchema } from "../domain/schema-validation.js";
|
|
3
|
-
import {
|
|
3
|
+
import { createGraphWorkflowRuntime } from "../runtime/graph-workflow-runtime.js";
|
|
4
4
|
import { randomUUID } from "node:crypto";
|
|
5
5
|
//#region src/workflows/engine/workflow-engine.ts
|
|
6
6
|
var WorkflowEngine = class {
|
|
@@ -55,12 +55,13 @@ var WorkflowEngine = class {
|
|
|
55
55
|
}));
|
|
56
56
|
await appendEvent("run_started", { startedAtMs: Date.now() });
|
|
57
57
|
try {
|
|
58
|
-
const runtimeResult = await withWorkflowTimeout((this.options.runtime ??
|
|
58
|
+
const runtimeResult = await withWorkflowTimeout((this.options.runtime ?? createGraphWorkflowRuntime()).run(definition.graph, {
|
|
59
59
|
runner: this.options.runner,
|
|
60
60
|
resolveModelId: this.options.resolveModelId
|
|
61
61
|
}, {
|
|
62
62
|
cwd: this.options.cwd,
|
|
63
63
|
args: options.input,
|
|
64
|
+
goal: options.goal ?? definition.description,
|
|
64
65
|
signal: options.signal,
|
|
65
66
|
concurrency: options.concurrency ?? definition.defaults.concurrency,
|
|
66
67
|
maxSubagents: options.maxSubagents ?? definition.defaults.maxSubagents,
|
|
@@ -77,6 +78,19 @@ var WorkflowEngine = class {
|
|
|
77
78
|
onLog: (message) => {
|
|
78
79
|
appendEvent("log_appended", { message });
|
|
79
80
|
},
|
|
81
|
+
onNodeStart: (event) => {
|
|
82
|
+
appendEvent("node_started", event);
|
|
83
|
+
},
|
|
84
|
+
onNodeEnd: (event) => {
|
|
85
|
+
appendEvent("node_completed", {
|
|
86
|
+
nodeId: event.nodeId,
|
|
87
|
+
kind: event.kind,
|
|
88
|
+
title: event.title,
|
|
89
|
+
status: event.status,
|
|
90
|
+
resultPreview: previewWorkflowValue(event.result),
|
|
91
|
+
error: event.error
|
|
92
|
+
});
|
|
93
|
+
},
|
|
80
94
|
onAgentQueued: (event) => {
|
|
81
95
|
const agentId = formatRuntimeAgentId(event.id);
|
|
82
96
|
const subagentSessionKey = this.options.subagentSessionKeyFactory?.({
|
|
@@ -95,6 +109,7 @@ var WorkflowEngine = class {
|
|
|
95
109
|
}));
|
|
96
110
|
appendEvent("agent_queued", {
|
|
97
111
|
agentId,
|
|
112
|
+
nodeId: event.nodeId,
|
|
98
113
|
label: event.label,
|
|
99
114
|
phaseId,
|
|
100
115
|
prompt: event.prompt,
|
|
@@ -106,7 +121,10 @@ var WorkflowEngine = class {
|
|
|
106
121
|
const currentStatus = runtimeAgentStatuses.get(event.id);
|
|
107
122
|
if (currentStatus && currentStatus !== "queued" && currentStatus !== "running") return;
|
|
108
123
|
runtimeAgentStatuses.set(event.id, "running");
|
|
109
|
-
appendEvent("agent_started", {
|
|
124
|
+
appendEvent("agent_started", {
|
|
125
|
+
agentId: formatRuntimeAgentId(event.id),
|
|
126
|
+
nodeId: event.nodeId
|
|
127
|
+
});
|
|
110
128
|
},
|
|
111
129
|
onAgentEnd: (event) => {
|
|
112
130
|
const currentStatus = runtimeAgentStatuses.get(event.id);
|
|
@@ -119,6 +137,7 @@ var WorkflowEngine = class {
|
|
|
119
137
|
progressRecorders.delete(event.id);
|
|
120
138
|
appendEvent("agent_completed", {
|
|
121
139
|
agentId,
|
|
140
|
+
nodeId: event.nodeId,
|
|
122
141
|
status: completedStatus,
|
|
123
142
|
resultPreview,
|
|
124
143
|
error: completedStatus === "error" ? "Subagent failed" : void 0
|
|
@@ -148,6 +167,7 @@ var WorkflowEngine = class {
|
|
|
148
167
|
workflowRunId: runId,
|
|
149
168
|
workflowDefinitionId: definition.id,
|
|
150
169
|
workflowAgentId: agentId,
|
|
170
|
+
workflowNodeId: ctx.nodeId,
|
|
151
171
|
workflowAgentLabel: ctx.label
|
|
152
172
|
},
|
|
153
173
|
onProgress: (event) => recorder.onProgress(event)
|
|
@@ -672,7 +692,7 @@ function isWorkflowResultEnvelope(value) {
|
|
|
672
692
|
}
|
|
673
693
|
function requireWorkflowResultEnvelope(value) {
|
|
674
694
|
if (isWorkflowResultEnvelope(value)) return value;
|
|
675
|
-
throw new WorkflowEngineRunError("result_validation_failed", "Workflow
|
|
695
|
+
throw new WorkflowEngineRunError("result_validation_failed", "Workflow output node must return a result envelope with summary and sections.", false);
|
|
676
696
|
}
|
|
677
697
|
function toWorkflowRunError(err, wasAborted, abortReason) {
|
|
678
698
|
if (err instanceof WorkflowEngineRunError) return {
|