@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,60 +0,0 @@
|
|
|
1
|
-
//#region src/agent/workflow/last-run-memory.ts
|
|
2
|
-
/**
|
|
3
|
-
* Per-session memory of the most recent workflow script that ran successfully.
|
|
4
|
-
*
|
|
5
|
-
* Purpose: enable `/workflow save <name>` — the user sees a workflow run,
|
|
6
|
-
* likes it, types `/workflow save audit_repo_strict`, and the model-generated
|
|
7
|
-
* script lands in `~/.xopc/workflows/`.
|
|
8
|
-
*
|
|
9
|
-
* Scope decision (KISS):
|
|
10
|
-
* - In-memory only, keyed by sessionKey. Cleared on process restart. OPC is
|
|
11
|
-
* long-lived per session, so the practical window is "from when the user
|
|
12
|
-
* ran the workflow until they save it" — minutes, not days. Persisting
|
|
13
|
-
* across restarts would require either session-store coupling or a separate
|
|
14
|
-
* sidecar file, both bigger than the value.
|
|
15
|
-
* - Records on EVERY successful workflow tool execution, including runs by
|
|
16
|
-
* name (so users can re-save a slightly modified built-in too).
|
|
17
|
-
* - Bounded by a small LRU so a runaway never grows the heap.
|
|
18
|
-
*/
|
|
19
|
-
const DEFAULT_MAX_ENTRIES = 64;
|
|
20
|
-
var LastWorkflowMemoryImpl = class {
|
|
21
|
-
entries = /* @__PURE__ */ new Map();
|
|
22
|
-
constructor(maxEntries = DEFAULT_MAX_ENTRIES) {
|
|
23
|
-
this.maxEntries = maxEntries;
|
|
24
|
-
}
|
|
25
|
-
record(sessionKey, entry) {
|
|
26
|
-
if (!sessionKey) return;
|
|
27
|
-
if (this.entries.has(sessionKey)) this.entries.delete(sessionKey);
|
|
28
|
-
this.entries.set(sessionKey, entry);
|
|
29
|
-
while (this.entries.size > this.maxEntries) {
|
|
30
|
-
const oldestKey = this.entries.keys().next().value;
|
|
31
|
-
if (oldestKey === void 0) break;
|
|
32
|
-
this.entries.delete(oldestKey);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
get(sessionKey) {
|
|
36
|
-
if (!sessionKey) return void 0;
|
|
37
|
-
return this.entries.get(sessionKey);
|
|
38
|
-
}
|
|
39
|
-
clear(sessionKey) {
|
|
40
|
-
if (sessionKey === void 0) this.entries.clear();
|
|
41
|
-
else this.entries.delete(sessionKey);
|
|
42
|
-
}
|
|
43
|
-
/** Visible for tests; do not consume from production code. */
|
|
44
|
-
_size() {
|
|
45
|
-
return this.entries.size;
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
let singleton = null;
|
|
49
|
-
function getLastWorkflowMemory() {
|
|
50
|
-
if (!singleton) singleton = new LastWorkflowMemoryImpl();
|
|
51
|
-
return singleton;
|
|
52
|
-
}
|
|
53
|
-
/** Reset the singleton (tests only). */
|
|
54
|
-
function _resetLastWorkflowMemoryForTests() {
|
|
55
|
-
singleton = null;
|
|
56
|
-
}
|
|
57
|
-
//#endregion
|
|
58
|
-
export { _resetLastWorkflowMemoryForTests, getLastWorkflowMemory };
|
|
59
|
-
|
|
60
|
-
//# sourceMappingURL=last-run-memory.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"last-run-memory.js","names":[],"sources":["../../../../src/agent/workflow/last-run-memory.ts"],"sourcesContent":["/**\n * Per-session memory of the most recent workflow script that ran successfully.\n *\n * Purpose: enable `/workflow save <name>` — the user sees a workflow run,\n * likes it, types `/workflow save audit_repo_strict`, and the model-generated\n * script lands in `~/.xopc/workflows/`.\n *\n * Scope decision (KISS):\n * - In-memory only, keyed by sessionKey. Cleared on process restart. OPC is\n * long-lived per session, so the practical window is \"from when the user\n * ran the workflow until they save it\" — minutes, not days. Persisting\n * across restarts would require either session-store coupling or a separate\n * sidecar file, both bigger than the value.\n * - Records on EVERY successful workflow tool execution, including runs by\n * name (so users can re-save a slightly modified built-in too).\n * - Bounded by a small LRU so a runaway never grows the heap.\n */\n\nconst DEFAULT_MAX_ENTRIES = 64;\n\nexport interface LastWorkflowEntry {\n /** Raw workflow script as the runtime saw it (post-fence-strip, pre-parse). */\n script: string;\n /** meta.name from the script (used to default a save target). */\n metaName: string;\n /** Where the script came from on this run — for save-time UX hints. */\n source: 'name' | 'script';\n /** ms since epoch when recorded — UI uses this for \"ran 2 min ago\". */\n recordedAt: number;\n}\n\nclass LastWorkflowMemoryImpl {\n private readonly entries = new Map<string, LastWorkflowEntry>();\n\n constructor(private readonly maxEntries: number = DEFAULT_MAX_ENTRIES) {}\n\n record(sessionKey: string | undefined, entry: LastWorkflowEntry): void {\n if (!sessionKey) return;\n // Move-to-end semantics: delete then set so iteration order = LRU.\n if (this.entries.has(sessionKey)) this.entries.delete(sessionKey);\n this.entries.set(sessionKey, entry);\n while (this.entries.size > this.maxEntries) {\n const oldestKey = this.entries.keys().next().value;\n if (oldestKey === undefined) break;\n this.entries.delete(oldestKey);\n }\n }\n\n get(sessionKey: string | undefined): LastWorkflowEntry | undefined {\n if (!sessionKey) return undefined;\n return this.entries.get(sessionKey);\n }\n\n clear(sessionKey?: string): void {\n if (sessionKey === undefined) this.entries.clear();\n else this.entries.delete(sessionKey);\n }\n\n /** Visible for tests; do not consume from production code. */\n _size(): number {\n return this.entries.size;\n }\n}\n\nexport type LastWorkflowMemory = LastWorkflowMemoryImpl;\n\nlet singleton: LastWorkflowMemoryImpl | null = null;\n\nexport function getLastWorkflowMemory(): LastWorkflowMemoryImpl {\n if (!singleton) singleton = new LastWorkflowMemoryImpl();\n return singleton;\n}\n\n/** Reset the singleton (tests only). */\nexport function _resetLastWorkflowMemoryForTests(): void {\n singleton = null;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAkBA,MAAM,sBAAsB;AAa5B,IAAM,yBAAN,MAA6B;CAC3B,0BAA2B,IAAI,KAAgC;CAE/D,YAAY,aAAsC,qBAAqB;AAA1C,OAAA,aAAA;;CAE7B,OAAO,YAAgC,OAAgC;AACrE,MAAI,CAAC,WAAY;AAEjB,MAAI,KAAK,QAAQ,IAAI,WAAW,CAAE,MAAK,QAAQ,OAAO,WAAW;AACjE,OAAK,QAAQ,IAAI,YAAY,MAAM;AACnC,SAAO,KAAK,QAAQ,OAAO,KAAK,YAAY;GAC1C,MAAM,YAAY,KAAK,QAAQ,MAAM,CAAC,MAAM,CAAC;AAC7C,OAAI,cAAc,KAAA,EAAW;AAC7B,QAAK,QAAQ,OAAO,UAAU;;;CAIlC,IAAI,YAA+D;AACjE,MAAI,CAAC,WAAY,QAAO,KAAA;AACxB,SAAO,KAAK,QAAQ,IAAI,WAAW;;CAGrC,MAAM,YAA2B;AAC/B,MAAI,eAAe,KAAA,EAAW,MAAK,QAAQ,OAAO;MAC7C,MAAK,QAAQ,OAAO,WAAW;;;CAItC,QAAgB;AACd,SAAO,KAAK,QAAQ;;;AAMxB,IAAI,YAA2C;AAE/C,SAAgB,wBAAgD;AAC9D,KAAI,CAAC,UAAW,aAAY,IAAI,wBAAwB;AACxD,QAAO;;;AAIT,SAAgB,mCAAyC;AACvD,aAAY"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Static lint for workflow scripts.
|
|
3
|
-
*
|
|
4
|
-
* Catches the single most common AI-authoring bug: calling `agent()`,
|
|
5
|
-
* `parallel()`, or `pipeline()` without `await` and then using the returned
|
|
6
|
-
* Promise as if it were a value. The runtime would throw a cryptic TypeError
|
|
7
|
-
* like `results.map is not a function`; this lint converts it into an
|
|
8
|
-
* actionable error before the script ever runs.
|
|
9
|
-
*
|
|
10
|
-
* Rules (per matching CallExpression):
|
|
11
|
-
* Allowed parents
|
|
12
|
-
* - AwaitExpression argument `await parallel(...)`
|
|
13
|
-
* - ReturnStatement argument `return agent(...)` (auto-unwraps)
|
|
14
|
-
* - ExpressionStatement fire-and-forget; pending agents drain
|
|
15
|
-
* - ArrowFunctionExpression expression body `() => agent(...)` (thunk for parallel/pipeline)
|
|
16
|
-
* Anything else (VariableDeclarator init, MemberExpression object, template
|
|
17
|
-
* interpolation, binary/logical operand, call argument, property/array
|
|
18
|
-
* element, ...) is rejected with a teaching message.
|
|
19
|
-
*
|
|
20
|
-
* Out of scope (handled by the runtime):
|
|
21
|
-
* - `parallel([agent(...), agent(...)])` (promises instead of thunks) — caught
|
|
22
|
-
* by the runtime's TypeError ("expects an array of functions, not promises").
|
|
23
|
-
* - Promise-as-value bugs that survive lint (dynamic indirection, late await).
|
|
24
|
-
*/
|
|
25
|
-
import type { Node } from 'acorn';
|
|
26
|
-
type AnyNode = Node & {
|
|
27
|
-
[key: string]: any;
|
|
28
|
-
start: number;
|
|
29
|
-
end: number;
|
|
30
|
-
loc?: {
|
|
31
|
-
start: {
|
|
32
|
-
line: number;
|
|
33
|
-
column: number;
|
|
34
|
-
};
|
|
35
|
-
};
|
|
36
|
-
};
|
|
37
|
-
export declare function lintAwaits(ast: AnyNode): void;
|
|
38
|
-
export {};
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
//#region src/agent/workflow/lint.ts
|
|
2
|
-
const LINT_TARGETS = new Set([
|
|
3
|
-
"agent",
|
|
4
|
-
"parallel",
|
|
5
|
-
"pipeline"
|
|
6
|
-
]);
|
|
7
|
-
function lintAwaits(ast) {
|
|
8
|
-
walk(ast, null, (node, parent) => {
|
|
9
|
-
if (!isLintTarget(node)) return;
|
|
10
|
-
if (isAcceptableParent(parent, node)) return;
|
|
11
|
-
const calleeName = node.callee.name;
|
|
12
|
-
const line = node.loc?.start.line ?? "?";
|
|
13
|
-
throw new Error(formatError(calleeName, line, parent));
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
function isLintTarget(node) {
|
|
17
|
-
if (node.type !== "CallExpression") return false;
|
|
18
|
-
const callee = node.callee;
|
|
19
|
-
if (!callee || callee.type !== "Identifier") return false;
|
|
20
|
-
return LINT_TARGETS.has(callee.name);
|
|
21
|
-
}
|
|
22
|
-
function isAcceptableParent(parent, call) {
|
|
23
|
-
if (!parent) return false;
|
|
24
|
-
switch (parent.type) {
|
|
25
|
-
case "AwaitExpression": return parent.argument === call;
|
|
26
|
-
case "ReturnStatement": return parent.argument === call;
|
|
27
|
-
case "ExpressionStatement": return parent.expression === call;
|
|
28
|
-
case "ArrowFunctionExpression": return parent.expression === true && parent.body === call;
|
|
29
|
-
default: return false;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
function formatError(name, line, parent) {
|
|
33
|
-
const ctx = parentContextHint(parent);
|
|
34
|
-
return [
|
|
35
|
-
`workflow lint error at line ${line}: \`${name}(...)\` returns a Promise but is used without 'await'${ctx ? ` (${ctx})` : ""}.`,
|
|
36
|
-
` ❌ const x = ${name}(...); x.map(...)`,
|
|
37
|
-
` ✅ const x = await ${name}(...); x.map(...)`,
|
|
38
|
-
`Workflow scripts run in an async IIFE — 'await' parallel()/pipeline()/agent() before using their results, or 'return' them directly.`
|
|
39
|
-
].join("\n");
|
|
40
|
-
}
|
|
41
|
-
function parentContextHint(parent) {
|
|
42
|
-
if (!parent) return "";
|
|
43
|
-
switch (parent.type) {
|
|
44
|
-
case "VariableDeclarator": return "assigned to variable";
|
|
45
|
-
case "AssignmentExpression": return "assigned via =";
|
|
46
|
-
case "MemberExpression": return "method/property access on Promise";
|
|
47
|
-
case "TemplateLiteral": return "interpolated in template string";
|
|
48
|
-
case "BinaryExpression":
|
|
49
|
-
case "LogicalExpression": return "used in expression";
|
|
50
|
-
case "ConditionalExpression": return "used as ternary operand";
|
|
51
|
-
case "CallExpression": return "passed as argument";
|
|
52
|
-
case "Property": return "used as object property value";
|
|
53
|
-
case "ArrayExpression": return "placed in array (use a thunk: () => call)";
|
|
54
|
-
case "SpreadElement": return "spread";
|
|
55
|
-
case "IfStatement":
|
|
56
|
-
case "WhileStatement":
|
|
57
|
-
case "DoWhileStatement":
|
|
58
|
-
case "ForStatement": return "used as condition";
|
|
59
|
-
default: return parent.type;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
function walk(node, parent, visit) {
|
|
63
|
-
visit(node, parent);
|
|
64
|
-
for (const value of Object.values(node)) if (Array.isArray(value)) {
|
|
65
|
-
for (const v of value) if (isAstNode(v)) walk(v, node, visit);
|
|
66
|
-
} else if (isAstNode(value)) walk(value, node, visit);
|
|
67
|
-
}
|
|
68
|
-
function isAstNode(value) {
|
|
69
|
-
return !!value && typeof value === "object" && typeof value.type === "string";
|
|
70
|
-
}
|
|
71
|
-
//#endregion
|
|
72
|
-
export { lintAwaits };
|
|
73
|
-
|
|
74
|
-
//# sourceMappingURL=lint.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lint.js","names":[],"sources":["../../../../src/agent/workflow/lint.ts"],"sourcesContent":["/**\n * Static lint for workflow scripts.\n *\n * Catches the single most common AI-authoring bug: calling `agent()`,\n * `parallel()`, or `pipeline()` without `await` and then using the returned\n * Promise as if it were a value. The runtime would throw a cryptic TypeError\n * like `results.map is not a function`; this lint converts it into an\n * actionable error before the script ever runs.\n *\n * Rules (per matching CallExpression):\n * Allowed parents\n * - AwaitExpression argument `await parallel(...)`\n * - ReturnStatement argument `return agent(...)` (auto-unwraps)\n * - ExpressionStatement fire-and-forget; pending agents drain\n * - ArrowFunctionExpression expression body `() => agent(...)` (thunk for parallel/pipeline)\n * Anything else (VariableDeclarator init, MemberExpression object, template\n * interpolation, binary/logical operand, call argument, property/array\n * element, ...) is rejected with a teaching message.\n *\n * Out of scope (handled by the runtime):\n * - `parallel([agent(...), agent(...)])` (promises instead of thunks) — caught\n * by the runtime's TypeError (\"expects an array of functions, not promises\").\n * - Promise-as-value bugs that survive lint (dynamic indirection, late await).\n */\n\nimport type { Node } from 'acorn';\n\ntype AnyNode = Node & {\n [key: string]: any;\n start: number;\n end: number;\n loc?: { start: { line: number; column: number } };\n};\n\nconst LINT_TARGETS = new Set(['agent', 'parallel', 'pipeline']);\n\nexport function lintAwaits(ast: AnyNode): void {\n walk(ast, null, (node, parent) => {\n if (!isLintTarget(node)) return;\n if (isAcceptableParent(parent, node)) return;\n const calleeName = (node.callee as AnyNode).name as string;\n const line = node.loc?.start.line ?? '?';\n throw new Error(formatError(calleeName, line, parent));\n });\n}\n\nfunction isLintTarget(node: AnyNode): boolean {\n if (node.type !== 'CallExpression') return false;\n const callee = node.callee as AnyNode | undefined;\n if (!callee || callee.type !== 'Identifier') return false;\n return LINT_TARGETS.has(callee.name);\n}\n\nfunction isAcceptableParent(parent: AnyNode | null, call: AnyNode): boolean {\n if (!parent) return false;\n switch (parent.type) {\n case 'AwaitExpression':\n return parent.argument === call;\n case 'ReturnStatement':\n return parent.argument === call;\n case 'ExpressionStatement':\n return parent.expression === call;\n case 'ArrowFunctionExpression':\n // `() => agent(...)` — thunk-style body that the runtime invokes/awaits.\n return parent.expression === true && parent.body === call;\n default:\n return false;\n }\n}\n\nfunction formatError(name: string, line: number | string, parent: AnyNode | null): string {\n const ctx = parentContextHint(parent);\n return [\n `workflow lint error at line ${line}: \\`${name}(...)\\` returns a Promise but is used without 'await'${ctx ? ` (${ctx})` : ''}.`,\n ` ❌ const x = ${name}(...); x.map(...)`,\n ` ✅ const x = await ${name}(...); x.map(...)`,\n `Workflow scripts run in an async IIFE — 'await' parallel()/pipeline()/agent() before using their results, or 'return' them directly.`,\n ].join('\\n');\n}\n\nfunction parentContextHint(parent: AnyNode | null): string {\n if (!parent) return '';\n switch (parent.type) {\n case 'VariableDeclarator':\n return 'assigned to variable';\n case 'AssignmentExpression':\n return 'assigned via =';\n case 'MemberExpression':\n return 'method/property access on Promise';\n case 'TemplateLiteral':\n return 'interpolated in template string';\n case 'BinaryExpression':\n case 'LogicalExpression':\n return 'used in expression';\n case 'ConditionalExpression':\n return 'used as ternary operand';\n case 'CallExpression':\n return 'passed as argument';\n case 'Property':\n return 'used as object property value';\n case 'ArrayExpression':\n return 'placed in array (use a thunk: () => ' + 'call)';\n case 'SpreadElement':\n return 'spread';\n case 'IfStatement':\n case 'WhileStatement':\n case 'DoWhileStatement':\n case 'ForStatement':\n return 'used as condition';\n default:\n return parent.type;\n }\n}\n\nfunction walk(\n node: AnyNode,\n parent: AnyNode | null,\n visit: (n: AnyNode, p: AnyNode | null) => void,\n): void {\n visit(node, parent);\n for (const value of Object.values(node)) {\n if (Array.isArray(value)) {\n for (const v of value) {\n if (isAstNode(v)) walk(v, node, visit);\n }\n } else if (isAstNode(value)) {\n walk(value, node, visit);\n }\n }\n}\n\nfunction isAstNode(value: unknown): value is AnyNode {\n return !!value && typeof value === 'object' && typeof (value as AnyNode).type === 'string';\n}\n"],"mappings":";AAkCA,MAAM,eAAe,IAAI,IAAI;CAAC;CAAS;CAAY;CAAW,CAAC;AAE/D,SAAgB,WAAW,KAAoB;AAC7C,MAAK,KAAK,OAAO,MAAM,WAAW;AAChC,MAAI,CAAC,aAAa,KAAK,CAAE;AACzB,MAAI,mBAAmB,QAAQ,KAAK,CAAE;EACtC,MAAM,aAAc,KAAK,OAAmB;EAC5C,MAAM,OAAO,KAAK,KAAK,MAAM,QAAQ;AACrC,QAAM,IAAI,MAAM,YAAY,YAAY,MAAM,OAAO,CAAC;GACtD;;AAGJ,SAAS,aAAa,MAAwB;AAC5C,KAAI,KAAK,SAAS,iBAAkB,QAAO;CAC3C,MAAM,SAAS,KAAK;AACpB,KAAI,CAAC,UAAU,OAAO,SAAS,aAAc,QAAO;AACpD,QAAO,aAAa,IAAI,OAAO,KAAK;;AAGtC,SAAS,mBAAmB,QAAwB,MAAwB;AAC1E,KAAI,CAAC,OAAQ,QAAO;AACpB,SAAQ,OAAO,MAAf;EACE,KAAK,kBACH,QAAO,OAAO,aAAa;EAC7B,KAAK,kBACH,QAAO,OAAO,aAAa;EAC7B,KAAK,sBACH,QAAO,OAAO,eAAe;EAC/B,KAAK,0BAEH,QAAO,OAAO,eAAe,QAAQ,OAAO,SAAS;EACvD,QACE,QAAO;;;AAIb,SAAS,YAAY,MAAc,MAAuB,QAAgC;CACxF,MAAM,MAAM,kBAAkB,OAAO;AACrC,QAAO;EACL,+BAA+B,KAAK,MAAM,KAAK,uDAAuD,MAAM,KAAK,IAAI,KAAK,GAAG;EAC7H,iBAAiB,KAAK;EACtB,uBAAuB,KAAK;EAC5B;EACD,CAAC,KAAK,KAAK;;AAGd,SAAS,kBAAkB,QAAgC;AACzD,KAAI,CAAC,OAAQ,QAAO;AACpB,SAAQ,OAAO,MAAf;EACE,KAAK,qBACH,QAAO;EACT,KAAK,uBACH,QAAO;EACT,KAAK,mBACH,QAAO;EACT,KAAK,kBACH,QAAO;EACT,KAAK;EACL,KAAK,oBACH,QAAO;EACT,KAAK,wBACH,QAAO;EACT,KAAK,iBACH,QAAO;EACT,KAAK,WACH,QAAO;EACT,KAAK,kBACH,QAAO;EACT,KAAK,gBACH,QAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK,eACH,QAAO;EACT,QACE,QAAO,OAAO;;;AAIpB,SAAS,KACP,MACA,QACA,OACM;AACN,OAAM,MAAM,OAAO;AACnB,MAAK,MAAM,SAAS,OAAO,OAAO,KAAK,CACrC,KAAI,MAAM,QAAQ,MAAM;OACjB,MAAM,KAAK,MACd,KAAI,UAAU,EAAE,CAAE,MAAK,GAAG,MAAM,MAAM;YAE/B,UAAU,MAAM,CACzB,MAAK,OAAO,MAAM,MAAM;;AAK9B,SAAS,UAAU,OAAkC;AACnD,QAAO,CAAC,CAAC,SAAS,OAAO,UAAU,YAAY,OAAQ,MAAkB,SAAS"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { WorkflowMeta, WorkflowMetaExamplePrompt, WorkflowMetaLocale } from './types.js';
|
|
2
|
-
export type WorkflowLocaleCode = 'en' | 'zh';
|
|
3
|
-
export declare function normalizeWorkflowLocale(language: string | undefined): WorkflowLocaleCode;
|
|
4
|
-
export interface WorkflowLocalizedCopy {
|
|
5
|
-
description: string;
|
|
6
|
-
whenToUse?: string;
|
|
7
|
-
examplePrompts: WorkflowMetaExamplePrompt[];
|
|
8
|
-
}
|
|
9
|
-
export declare function resolveWorkflowLocalizedCopy(meta: Pick<WorkflowMeta, 'description' | 'whenToUse' | 'examplePrompts' | 'i18n'>, locale: WorkflowLocaleCode): WorkflowLocalizedCopy;
|
|
10
|
-
export declare function validateExamplePrompts(value: unknown, path: string): WorkflowMetaExamplePrompt[] | undefined;
|
|
11
|
-
export declare function validateMetaLocale(value: unknown, path: string): WorkflowMetaLocale;
|
|
12
|
-
export declare function validateMetaI18n(value: unknown): Record<string, WorkflowMetaLocale> | undefined;
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
//#region src/agent/workflow/meta-locale.ts
|
|
2
|
-
function normalizeWorkflowLocale(language) {
|
|
3
|
-
return language === "zh" ? "zh" : "en";
|
|
4
|
-
}
|
|
5
|
-
function resolveWorkflowLocalizedCopy(meta, locale) {
|
|
6
|
-
const bundle = locale !== "en" ? meta.i18n?.[locale] : void 0;
|
|
7
|
-
const examplePrompts = bundle?.examplePrompts && bundle.examplePrompts.length > 0 ? bundle.examplePrompts : meta.examplePrompts ?? [];
|
|
8
|
-
return {
|
|
9
|
-
description: pickNonEmpty(bundle?.description, meta.description),
|
|
10
|
-
whenToUse: pickOptional(bundle?.whenToUse, meta.whenToUse),
|
|
11
|
-
examplePrompts
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
function pickNonEmpty(localized, fallback) {
|
|
15
|
-
const trimmed = localized?.trim();
|
|
16
|
-
return trimmed ? trimmed : fallback;
|
|
17
|
-
}
|
|
18
|
-
function pickOptional(localized, fallback) {
|
|
19
|
-
const trimmed = localized?.trim();
|
|
20
|
-
if (trimmed) return trimmed;
|
|
21
|
-
return fallback?.trim() || void 0;
|
|
22
|
-
}
|
|
23
|
-
function validateExamplePrompts(value, path) {
|
|
24
|
-
if (value === void 0) return void 0;
|
|
25
|
-
if (!Array.isArray(value)) throw new Error(`${path} must be an array`);
|
|
26
|
-
const prompts = [];
|
|
27
|
-
for (let index = 0; index < value.length; index++) {
|
|
28
|
-
const item = value[index];
|
|
29
|
-
if (!item || typeof item !== "object") throw new Error(`${path}[${index}] must be an object`);
|
|
30
|
-
const field = item.field;
|
|
31
|
-
const text = item.text;
|
|
32
|
-
if (typeof field !== "string" || !field.trim()) throw new Error(`${path}[${index}].field must be a non-empty string`);
|
|
33
|
-
if (typeof text !== "string" || !text.trim()) throw new Error(`${path}[${index}].text must be a non-empty string`);
|
|
34
|
-
prompts.push({
|
|
35
|
-
field: field.trim(),
|
|
36
|
-
text: text.trim()
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
return prompts;
|
|
40
|
-
}
|
|
41
|
-
function validateMetaLocale(value, path) {
|
|
42
|
-
if (!value || typeof value !== "object") throw new Error(`${path} must be an object`);
|
|
43
|
-
const record = value;
|
|
44
|
-
if (record.description !== void 0 && (typeof record.description !== "string" || !record.description.trim())) throw new Error(`${path}.description must be a non-empty string`);
|
|
45
|
-
if (record.whenToUse !== void 0 && typeof record.whenToUse !== "string") throw new Error(`${path}.whenToUse must be a string`);
|
|
46
|
-
validateExamplePrompts(record.examplePrompts, `${path}.examplePrompts`);
|
|
47
|
-
return record;
|
|
48
|
-
}
|
|
49
|
-
function validateMetaI18n(value) {
|
|
50
|
-
if (value === void 0) return void 0;
|
|
51
|
-
if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error("meta.i18n must be an object");
|
|
52
|
-
const locales = {};
|
|
53
|
-
for (const [locale, bundle] of Object.entries(value)) {
|
|
54
|
-
if (!/^[a-z]{2}(-[A-Za-z]{2})?$/.test(locale)) throw new Error(`meta.i18n key "${locale}" must be a language tag like "zh" or "en"`);
|
|
55
|
-
locales[locale] = validateMetaLocale(bundle, `meta.i18n.${locale}`);
|
|
56
|
-
}
|
|
57
|
-
return locales;
|
|
58
|
-
}
|
|
59
|
-
//#endregion
|
|
60
|
-
export { normalizeWorkflowLocale, resolveWorkflowLocalizedCopy, validateExamplePrompts, validateMetaI18n, validateMetaLocale };
|
|
61
|
-
|
|
62
|
-
//# sourceMappingURL=meta-locale.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"meta-locale.js","names":[],"sources":["../../../../src/agent/workflow/meta-locale.ts"],"sourcesContent":["import type { WorkflowMeta, WorkflowMetaExamplePrompt, WorkflowMetaLocale } from './types.js';\n\nexport type WorkflowLocaleCode = 'en' | 'zh';\n\nexport function normalizeWorkflowLocale(language: string | undefined): WorkflowLocaleCode {\n return language === 'zh' ? 'zh' : 'en';\n}\n\nexport interface WorkflowLocalizedCopy {\n description: string;\n whenToUse?: string;\n examplePrompts: WorkflowMetaExamplePrompt[];\n}\n\nexport function resolveWorkflowLocalizedCopy(\n meta: Pick<WorkflowMeta, 'description' | 'whenToUse' | 'examplePrompts' | 'i18n'>,\n locale: WorkflowLocaleCode,\n): WorkflowLocalizedCopy {\n const bundle = locale !== 'en' ? meta.i18n?.[locale] : undefined;\n const examplePrompts =\n bundle?.examplePrompts && bundle.examplePrompts.length > 0\n ? bundle.examplePrompts\n : (meta.examplePrompts ?? []);\n return {\n description: pickNonEmpty(bundle?.description, meta.description),\n whenToUse: pickOptional(bundle?.whenToUse, meta.whenToUse),\n examplePrompts,\n };\n}\n\nfunction pickNonEmpty(localized: string | undefined, fallback: string): string {\n const trimmed = localized?.trim();\n return trimmed ? trimmed : fallback;\n}\n\nfunction pickOptional(localized: string | undefined, fallback: string | undefined): string | undefined {\n const trimmed = localized?.trim();\n if (trimmed) return trimmed;\n const fb = fallback?.trim();\n return fb || undefined;\n}\n\nexport function validateExamplePrompts(value: unknown, path: string): WorkflowMetaExamplePrompt[] | undefined {\n if (value === undefined) return undefined;\n if (!Array.isArray(value)) {\n throw new Error(`${path} must be an array`);\n }\n const prompts: WorkflowMetaExamplePrompt[] = [];\n for (let index = 0; index < value.length; index++) {\n const item = value[index];\n if (!item || typeof item !== 'object') {\n throw new Error(`${path}[${index}] must be an object`);\n }\n const field = (item as WorkflowMetaExamplePrompt).field;\n const text = (item as WorkflowMetaExamplePrompt).text;\n if (typeof field !== 'string' || !field.trim()) {\n throw new Error(`${path}[${index}].field must be a non-empty string`);\n }\n if (typeof text !== 'string' || !text.trim()) {\n throw new Error(`${path}[${index}].text must be a non-empty string`);\n }\n prompts.push({ field: field.trim(), text: text.trim() });\n }\n return prompts;\n}\n\nexport function validateMetaLocale(value: unknown, path: string): WorkflowMetaLocale {\n if (!value || typeof value !== 'object') {\n throw new Error(`${path} must be an object`);\n }\n const record = value as WorkflowMetaLocale;\n if (record.description !== undefined && (typeof record.description !== 'string' || !record.description.trim())) {\n throw new Error(`${path}.description must be a non-empty string`);\n }\n if (record.whenToUse !== undefined && typeof record.whenToUse !== 'string') {\n throw new Error(`${path}.whenToUse must be a string`);\n }\n validateExamplePrompts(record.examplePrompts, `${path}.examplePrompts`);\n return record;\n}\n\nexport function validateMetaI18n(value: unknown): Record<string, WorkflowMetaLocale> | undefined {\n if (value === undefined) return undefined;\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('meta.i18n must be an object');\n }\n const locales: Record<string, WorkflowMetaLocale> = {};\n for (const [locale, bundle] of Object.entries(value as Record<string, unknown>)) {\n if (!/^[a-z]{2}(-[A-Za-z]{2})?$/.test(locale)) {\n throw new Error(`meta.i18n key \"${locale}\" must be a language tag like \"zh\" or \"en\"`);\n }\n locales[locale] = validateMetaLocale(bundle, `meta.i18n.${locale}`);\n }\n return locales;\n}\n"],"mappings":";AAIA,SAAgB,wBAAwB,UAAkD;AACxF,QAAO,aAAa,OAAO,OAAO;;AASpC,SAAgB,6BACd,MACA,QACuB;CACvB,MAAM,SAAS,WAAW,OAAO,KAAK,OAAO,UAAU,KAAA;CACvD,MAAM,iBACJ,QAAQ,kBAAkB,OAAO,eAAe,SAAS,IACrD,OAAO,iBACN,KAAK,kBAAkB,EAAE;AAChC,QAAO;EACL,aAAa,aAAa,QAAQ,aAAa,KAAK,YAAY;EAChE,WAAW,aAAa,QAAQ,WAAW,KAAK,UAAU;EAC1D;EACD;;AAGH,SAAS,aAAa,WAA+B,UAA0B;CAC7E,MAAM,UAAU,WAAW,MAAM;AACjC,QAAO,UAAU,UAAU;;AAG7B,SAAS,aAAa,WAA+B,UAAkD;CACrG,MAAM,UAAU,WAAW,MAAM;AACjC,KAAI,QAAS,QAAO;AAEpB,QADW,UAAU,MAAM,IACd,KAAA;;AAGf,SAAgB,uBAAuB,OAAgB,MAAuD;AAC5G,KAAI,UAAU,KAAA,EAAW,QAAO,KAAA;AAChC,KAAI,CAAC,MAAM,QAAQ,MAAM,CACvB,OAAM,IAAI,MAAM,GAAG,KAAK,mBAAmB;CAE7C,MAAM,UAAuC,EAAE;AAC/C,MAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS;EACjD,MAAM,OAAO,MAAM;AACnB,MAAI,CAAC,QAAQ,OAAO,SAAS,SAC3B,OAAM,IAAI,MAAM,GAAG,KAAK,GAAG,MAAM,qBAAqB;EAExD,MAAM,QAAS,KAAmC;EAClD,MAAM,OAAQ,KAAmC;AACjD,MAAI,OAAO,UAAU,YAAY,CAAC,MAAM,MAAM,CAC5C,OAAM,IAAI,MAAM,GAAG,KAAK,GAAG,MAAM,oCAAoC;AAEvE,MAAI,OAAO,SAAS,YAAY,CAAC,KAAK,MAAM,CAC1C,OAAM,IAAI,MAAM,GAAG,KAAK,GAAG,MAAM,mCAAmC;AAEtE,UAAQ,KAAK;GAAE,OAAO,MAAM,MAAM;GAAE,MAAM,KAAK,MAAM;GAAE,CAAC;;AAE1D,QAAO;;AAGT,SAAgB,mBAAmB,OAAgB,MAAkC;AACnF,KAAI,CAAC,SAAS,OAAO,UAAU,SAC7B,OAAM,IAAI,MAAM,GAAG,KAAK,oBAAoB;CAE9C,MAAM,SAAS;AACf,KAAI,OAAO,gBAAgB,KAAA,MAAc,OAAO,OAAO,gBAAgB,YAAY,CAAC,OAAO,YAAY,MAAM,EAC3G,OAAM,IAAI,MAAM,GAAG,KAAK,yCAAyC;AAEnE,KAAI,OAAO,cAAc,KAAA,KAAa,OAAO,OAAO,cAAc,SAChE,OAAM,IAAI,MAAM,GAAG,KAAK,6BAA6B;AAEvD,wBAAuB,OAAO,gBAAgB,GAAG,KAAK,iBAAiB;AACvE,QAAO;;AAGT,SAAgB,iBAAiB,OAAgE;AAC/F,KAAI,UAAU,KAAA,EAAW,QAAO,KAAA;AAChC,KAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,MAAM,CAC7D,OAAM,IAAI,MAAM,8BAA8B;CAEhD,MAAM,UAA8C,EAAE;AACtD,MAAK,MAAM,CAAC,QAAQ,WAAW,OAAO,QAAQ,MAAiC,EAAE;AAC/E,MAAI,CAAC,4BAA4B,KAAK,OAAO,CAC3C,OAAM,IAAI,MAAM,kBAAkB,OAAO,4CAA4C;AAEvF,UAAQ,UAAU,mBAAmB,QAAQ,aAAa,SAAS;;AAErE,QAAO"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Workflow script parser.
|
|
3
|
-
*
|
|
4
|
-
* Responsibilities:
|
|
5
|
-
* 1. Parse the script with acorn (latest ECMA, top-level await + return allowed).
|
|
6
|
-
* 2. Enforce determinism — reject `Date.now()`, `Math.random()`, `new Date()`,
|
|
7
|
-
* `require`, `import`, dynamic eval. This keeps future resume/replay possible
|
|
8
|
-
* and surfaces non-deterministic mistakes early.
|
|
9
|
-
* 3. Require the first statement to be `export const meta = <literal>`, validate
|
|
10
|
-
* the literal shape, and strip that line from the body returned to the runtime.
|
|
11
|
-
*
|
|
12
|
-
* Returning a `{ meta, body }` pair means the runtime can `vm.Script(body)` without
|
|
13
|
-
* any further AST work.
|
|
14
|
-
*/
|
|
15
|
-
import type { WorkflowMeta } from './types.js';
|
|
16
|
-
export interface ParsedWorkflow {
|
|
17
|
-
meta: WorkflowMeta;
|
|
18
|
-
body: string;
|
|
19
|
-
}
|
|
20
|
-
export declare function parseWorkflowScript(script: string): ParsedWorkflow;
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
import { lintAwaits } from "./lint.js";
|
|
2
|
-
import { validateExamplePrompts, validateMetaI18n } from "./meta-locale.js";
|
|
3
|
-
import { parse } from "acorn";
|
|
4
|
-
//#region src/agent/workflow/parser.ts
|
|
5
|
-
/**
|
|
6
|
-
* Workflow script parser.
|
|
7
|
-
*
|
|
8
|
-
* Responsibilities:
|
|
9
|
-
* 1. Parse the script with acorn (latest ECMA, top-level await + return allowed).
|
|
10
|
-
* 2. Enforce determinism — reject `Date.now()`, `Math.random()`, `new Date()`,
|
|
11
|
-
* `require`, `import`, dynamic eval. This keeps future resume/replay possible
|
|
12
|
-
* and surfaces non-deterministic mistakes early.
|
|
13
|
-
* 3. Require the first statement to be `export const meta = <literal>`, validate
|
|
14
|
-
* the literal shape, and strip that line from the body returned to the runtime.
|
|
15
|
-
*
|
|
16
|
-
* Returning a `{ meta, body }` pair means the runtime can `vm.Script(body)` without
|
|
17
|
-
* any further AST work.
|
|
18
|
-
*/
|
|
19
|
-
const NONDETERMINISM_ERROR = "Workflow scripts must be deterministic: Date.now()/Math.random()/new Date() are unavailable. Pass timestamps via args or stamp them after the workflow returns.";
|
|
20
|
-
function parseWorkflowScript(script) {
|
|
21
|
-
let ast;
|
|
22
|
-
try {
|
|
23
|
-
ast = parse(script, {
|
|
24
|
-
ecmaVersion: "latest",
|
|
25
|
-
sourceType: "module",
|
|
26
|
-
allowAwaitOutsideFunction: true,
|
|
27
|
-
allowReturnOutsideFunction: true,
|
|
28
|
-
ranges: false,
|
|
29
|
-
locations: true
|
|
30
|
-
});
|
|
31
|
-
} catch (e) {
|
|
32
|
-
const msg = e instanceof Error ? e.message : String(e);
|
|
33
|
-
throw new Error(`Workflow script parse error: ${msg}`);
|
|
34
|
-
}
|
|
35
|
-
assertDeterministicAst(ast);
|
|
36
|
-
assertNoDangerousImports(ast);
|
|
37
|
-
lintAwaits(ast);
|
|
38
|
-
const first = ast.body?.[0];
|
|
39
|
-
if (first?.type !== "ExportNamedDeclaration") throw new Error("`export const meta = { name, description }` must be the first statement in the script");
|
|
40
|
-
const declaration = first.declaration;
|
|
41
|
-
if (declaration?.type !== "VariableDeclaration" || declaration.kind !== "const") throw new Error("meta export must be `export const meta = ...`");
|
|
42
|
-
if (declaration.declarations.length !== 1) throw new Error("meta export must declare only `meta`");
|
|
43
|
-
const declarator = declaration.declarations[0];
|
|
44
|
-
if (declarator.id?.type !== "Identifier" || declarator.id.name !== "meta") throw new Error("meta export must declare `meta`");
|
|
45
|
-
if (!declarator.init) throw new Error("meta must have a literal value");
|
|
46
|
-
const meta = evaluateLiteral(declarator.init, "meta");
|
|
47
|
-
validateMeta(meta);
|
|
48
|
-
return {
|
|
49
|
-
meta,
|
|
50
|
-
body: script.slice(0, first.start) + script.slice(first.end)
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
function assertDeterministicAst(node) {
|
|
54
|
-
if (isDateNowCall(node) || isMathRandomCall(node) || isNewDateExpression(node)) throw new Error(NONDETERMINISM_ERROR);
|
|
55
|
-
for (const child of astChildren(node)) assertDeterministicAst(child);
|
|
56
|
-
}
|
|
57
|
-
function assertNoDangerousImports(node) {
|
|
58
|
-
if (node.type === "ImportDeclaration" || node.type === "ImportExpression") throw new Error("Workflow scripts cannot use `import` — only the exposed globals (agent, parallel, pipeline, phase, log, args, cwd, budget) are available.");
|
|
59
|
-
if (node.type === "CallExpression") {
|
|
60
|
-
const callee = node.callee;
|
|
61
|
-
if (callee?.type === "Identifier" && (callee.name === "require" || callee.name === "eval")) throw new Error(`Workflow scripts cannot call \`${callee.name}\`.`);
|
|
62
|
-
}
|
|
63
|
-
for (const child of astChildren(node)) assertNoDangerousImports(child);
|
|
64
|
-
}
|
|
65
|
-
function astChildren(node) {
|
|
66
|
-
const children = [];
|
|
67
|
-
for (const value of Object.values(node)) if (Array.isArray(value)) {
|
|
68
|
-
for (const v of value) if (isAstNode(v)) children.push(v);
|
|
69
|
-
} else if (isAstNode(value)) children.push(value);
|
|
70
|
-
return children;
|
|
71
|
-
}
|
|
72
|
-
function isAstNode(value) {
|
|
73
|
-
return !!value && typeof value === "object" && typeof value.type === "string";
|
|
74
|
-
}
|
|
75
|
-
function isDateNowCall(node) {
|
|
76
|
-
return node.type === "CallExpression" && isMemberExpression(node.callee, "Date", "now");
|
|
77
|
-
}
|
|
78
|
-
function isMathRandomCall(node) {
|
|
79
|
-
return node.type === "CallExpression" && isMemberExpression(node.callee, "Math", "random");
|
|
80
|
-
}
|
|
81
|
-
function isNewDateExpression(node) {
|
|
82
|
-
return node.type === "NewExpression" && node.callee?.type === "Identifier" && node.callee.name === "Date";
|
|
83
|
-
}
|
|
84
|
-
function isMemberExpression(node, objectName, propertyName) {
|
|
85
|
-
if (node?.type !== "MemberExpression" || node.object?.type !== "Identifier" || node.object.name !== objectName) return false;
|
|
86
|
-
const prop = node.property;
|
|
87
|
-
if (!node.computed && prop?.type === "Identifier") return prop.name === propertyName;
|
|
88
|
-
if (prop?.type === "Literal" && typeof prop.value === "string") return prop.value === propertyName;
|
|
89
|
-
return false;
|
|
90
|
-
}
|
|
91
|
-
function evaluateLiteral(node, path) {
|
|
92
|
-
switch (node.type) {
|
|
93
|
-
case "ObjectExpression": {
|
|
94
|
-
const out = {};
|
|
95
|
-
for (const prop of node.properties) {
|
|
96
|
-
if (prop.type === "SpreadElement") throw new Error(`spread not allowed in ${path}`);
|
|
97
|
-
if (prop.type !== "Property") throw new Error(`only plain properties allowed in ${path}`);
|
|
98
|
-
if (prop.computed) throw new Error(`computed keys not allowed in ${path}`);
|
|
99
|
-
if (prop.kind !== "init" || prop.method) throw new Error(`methods/accessors not allowed in ${path}`);
|
|
100
|
-
const key = propertyKey(prop.key, path);
|
|
101
|
-
if (key === "__proto__" || key === "constructor" || key === "prototype") throw new Error(`reserved key name not allowed in ${path}: ${key}`);
|
|
102
|
-
out[key] = evaluateLiteral(prop.value, `${path}.${key}`);
|
|
103
|
-
}
|
|
104
|
-
return out;
|
|
105
|
-
}
|
|
106
|
-
case "ArrayExpression": return node.elements.map((element, index) => {
|
|
107
|
-
if (!element) throw new Error(`sparse arrays not allowed in ${path}`);
|
|
108
|
-
if (element.type === "SpreadElement") throw new Error(`spread not allowed in ${path}`);
|
|
109
|
-
return evaluateLiteral(element, `${path}[${index}]`);
|
|
110
|
-
});
|
|
111
|
-
case "Literal": return node.value;
|
|
112
|
-
case "TemplateLiteral":
|
|
113
|
-
if (node.expressions.length > 0) throw new Error(`template interpolation not allowed in ${path}`);
|
|
114
|
-
return node.quasis.map((quasi) => quasi.value.cooked ?? quasi.value.raw).join("");
|
|
115
|
-
case "UnaryExpression":
|
|
116
|
-
if (node.operator === "-" && node.argument?.type === "Literal" && typeof node.argument.value === "number") return -node.argument.value;
|
|
117
|
-
throw new Error(`only negative-number unary allowed in ${path}`);
|
|
118
|
-
default: throw new Error(`non-literal node type in ${path}: ${node.type}`);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
function propertyKey(node, path) {
|
|
122
|
-
if (node.type === "Identifier") return node.name;
|
|
123
|
-
if (node.type === "Literal" && (typeof node.value === "string" || typeof node.value === "number")) return String(node.value);
|
|
124
|
-
throw new Error(`unsupported key type in ${path}: ${node.type}`);
|
|
125
|
-
}
|
|
126
|
-
function validateMeta(meta) {
|
|
127
|
-
if (!meta || typeof meta !== "object") throw new Error("meta must be an object");
|
|
128
|
-
const value = meta;
|
|
129
|
-
if (typeof value.name !== "string" || !value.name.trim()) throw new Error("meta.name must be a non-empty string");
|
|
130
|
-
if (!/^[a-z][a-z0-9_-]*$/.test(value.name)) throw new Error(`meta.name must be lowercase snake_case (got "${value.name}"). Example: "audit_repo".`);
|
|
131
|
-
if (typeof value.description !== "string" || !value.description.trim()) throw new Error("meta.description must be a non-empty string");
|
|
132
|
-
if (value.whenToUse !== void 0 && typeof value.whenToUse !== "string") throw new Error("meta.whenToUse must be a string");
|
|
133
|
-
if (value.phases !== void 0) {
|
|
134
|
-
if (!Array.isArray(value.phases)) throw new Error("meta.phases must be an array");
|
|
135
|
-
for (const phase of value.phases) if (!phase || typeof phase !== "object" || typeof phase.title !== "string") throw new Error("each meta phase must have a title string");
|
|
136
|
-
}
|
|
137
|
-
if (value.tags !== void 0) {
|
|
138
|
-
if (!Array.isArray(value.tags) || value.tags.some((tag) => typeof tag !== "string" || !tag.trim())) throw new Error("meta.tags must be an array of non-empty strings");
|
|
139
|
-
}
|
|
140
|
-
if (value.estimatedAgents !== void 0) {
|
|
141
|
-
const est = value.estimatedAgents;
|
|
142
|
-
if (!est || typeof est !== "object") throw new Error("meta.estimatedAgents must be an object");
|
|
143
|
-
if (typeof est.min !== "number" || typeof est.max !== "number" || !Number.isFinite(est.min) || !Number.isFinite(est.max)) throw new Error("meta.estimatedAgents.min and .max must be finite numbers");
|
|
144
|
-
if (est.min < 1 || est.max < est.min) throw new Error("meta.estimatedAgents requires min >= 1 and max >= min");
|
|
145
|
-
}
|
|
146
|
-
validateExamplePrompts(value.examplePrompts, "meta.examplePrompts");
|
|
147
|
-
validateMetaI18n(value.i18n);
|
|
148
|
-
}
|
|
149
|
-
//#endregion
|
|
150
|
-
export { parseWorkflowScript };
|
|
151
|
-
|
|
152
|
-
//# sourceMappingURL=parser.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","names":[],"sources":["../../../../src/agent/workflow/parser.ts"],"sourcesContent":["/**\n * Workflow script parser.\n *\n * Responsibilities:\n * 1. Parse the script with acorn (latest ECMA, top-level await + return allowed).\n * 2. Enforce determinism — reject `Date.now()`, `Math.random()`, `new Date()`,\n * `require`, `import`, dynamic eval. This keeps future resume/replay possible\n * and surfaces non-deterministic mistakes early.\n * 3. Require the first statement to be `export const meta = <literal>`, validate\n * the literal shape, and strip that line from the body returned to the runtime.\n *\n * Returning a `{ meta, body }` pair means the runtime can `vm.Script(body)` without\n * any further AST work.\n */\n\nimport { parse } from 'acorn';\nimport type { Node } from 'acorn';\n\nimport { lintAwaits } from './lint.js';\nimport { validateExamplePrompts, validateMetaI18n } from './meta-locale.js';\nimport type { WorkflowMeta, WorkflowMetaPhase } from './types.js';\n\ntype AnyNode = Node & { [key: string]: any; start: number; end: number };\n\nconst NONDETERMINISM_ERROR =\n 'Workflow scripts must be deterministic: Date.now()/Math.random()/new Date() are unavailable. ' +\n 'Pass timestamps via args or stamp them after the workflow returns.';\n\nexport interface ParsedWorkflow {\n meta: WorkflowMeta;\n body: string;\n}\n\nexport function parseWorkflowScript(script: string): ParsedWorkflow {\n let ast: AnyNode;\n try {\n ast = parse(script, {\n ecmaVersion: 'latest',\n sourceType: 'module',\n allowAwaitOutsideFunction: true,\n allowReturnOutsideFunction: true,\n ranges: false,\n locations: true,\n }) as AnyNode;\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n throw new Error(`Workflow script parse error: ${msg}`);\n }\n\n assertDeterministicAst(ast);\n assertNoDangerousImports(ast);\n lintAwaits(ast);\n\n const first = ast.body?.[0] as AnyNode | undefined;\n if (first?.type !== 'ExportNamedDeclaration') {\n throw new Error(\n '`export const meta = { name, description }` must be the first statement in the script',\n );\n }\n\n const declaration = first.declaration as AnyNode | null;\n if (declaration?.type !== 'VariableDeclaration' || declaration.kind !== 'const') {\n throw new Error('meta export must be `export const meta = ...`');\n }\n if (declaration.declarations.length !== 1) {\n throw new Error('meta export must declare only `meta`');\n }\n const declarator = declaration.declarations[0] as AnyNode;\n if (declarator.id?.type !== 'Identifier' || declarator.id.name !== 'meta') {\n throw new Error('meta export must declare `meta`');\n }\n if (!declarator.init) {\n throw new Error('meta must have a literal value');\n }\n\n const meta = evaluateLiteral(declarator.init, 'meta');\n validateMeta(meta);\n\n return {\n meta,\n body: script.slice(0, first.start) + script.slice(first.end),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Determinism / safety guards\n// ---------------------------------------------------------------------------\n\nfunction assertDeterministicAst(node: AnyNode): void {\n if (isDateNowCall(node) || isMathRandomCall(node) || isNewDateExpression(node)) {\n throw new Error(NONDETERMINISM_ERROR);\n }\n for (const child of astChildren(node)) {\n assertDeterministicAst(child);\n }\n}\n\nfunction assertNoDangerousImports(node: AnyNode): void {\n if (node.type === 'ImportDeclaration' || node.type === 'ImportExpression') {\n throw new Error(\n \"Workflow scripts cannot use `import` — only the exposed globals (agent, parallel, pipeline, phase, log, args, cwd, budget) are available.\",\n );\n }\n if (node.type === 'CallExpression') {\n const callee = node.callee as AnyNode | undefined;\n if (callee?.type === 'Identifier' && (callee.name === 'require' || callee.name === 'eval')) {\n throw new Error(`Workflow scripts cannot call \\`${callee.name}\\`.`);\n }\n }\n for (const child of astChildren(node)) {\n assertNoDangerousImports(child);\n }\n}\n\nfunction astChildren(node: AnyNode): AnyNode[] {\n const children: AnyNode[] = [];\n for (const value of Object.values(node)) {\n if (Array.isArray(value)) {\n for (const v of value) {\n if (isAstNode(v)) children.push(v);\n }\n } else if (isAstNode(value)) {\n children.push(value);\n }\n }\n return children;\n}\n\nfunction isAstNode(value: unknown): value is AnyNode {\n return !!value && typeof value === 'object' && typeof (value as AnyNode).type === 'string';\n}\n\nfunction isDateNowCall(node: AnyNode): boolean {\n return node.type === 'CallExpression' && isMemberExpression(node.callee, 'Date', 'now');\n}\n\nfunction isMathRandomCall(node: AnyNode): boolean {\n return node.type === 'CallExpression' && isMemberExpression(node.callee, 'Math', 'random');\n}\n\nfunction isNewDateExpression(node: AnyNode): boolean {\n return (\n node.type === 'NewExpression' &&\n (node.callee as AnyNode | undefined)?.type === 'Identifier' &&\n (node.callee as AnyNode).name === 'Date'\n );\n}\n\nfunction isMemberExpression(\n node: AnyNode | undefined,\n objectName: string,\n propertyName: string,\n): boolean {\n if (\n node?.type !== 'MemberExpression' ||\n (node.object as AnyNode | undefined)?.type !== 'Identifier' ||\n (node.object as AnyNode).name !== objectName\n ) {\n return false;\n }\n const prop = node.property as AnyNode | undefined;\n if (!node.computed && prop?.type === 'Identifier') return prop.name === propertyName;\n if (prop?.type === 'Literal' && typeof prop.value === 'string') return prop.value === propertyName;\n return false;\n}\n\n// ---------------------------------------------------------------------------\n// Literal evaluator (meta must be a pure literal)\n// ---------------------------------------------------------------------------\n\nfunction evaluateLiteral(node: AnyNode, path: string): any {\n switch (node.type) {\n case 'ObjectExpression': {\n const out: Record<string, unknown> = {};\n for (const prop of node.properties as AnyNode[]) {\n if (prop.type === 'SpreadElement') {\n throw new Error(`spread not allowed in ${path}`);\n }\n if (prop.type !== 'Property') {\n throw new Error(`only plain properties allowed in ${path}`);\n }\n if (prop.computed) {\n throw new Error(`computed keys not allowed in ${path}`);\n }\n if (prop.kind !== 'init' || prop.method) {\n throw new Error(`methods/accessors not allowed in ${path}`);\n }\n const key = propertyKey(prop.key as AnyNode, path);\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n throw new Error(`reserved key name not allowed in ${path}: ${key}`);\n }\n out[key] = evaluateLiteral(prop.value as AnyNode, `${path}.${key}`);\n }\n return out;\n }\n case 'ArrayExpression':\n return (node.elements as Array<AnyNode | null>).map((element, index) => {\n if (!element) throw new Error(`sparse arrays not allowed in ${path}`);\n if (element.type === 'SpreadElement') {\n throw new Error(`spread not allowed in ${path}`);\n }\n return evaluateLiteral(element, `${path}[${index}]`);\n });\n case 'Literal':\n return node.value;\n case 'TemplateLiteral':\n if (node.expressions.length > 0) {\n throw new Error(`template interpolation not allowed in ${path}`);\n }\n return node.quasis\n .map((quasi: AnyNode) => quasi.value.cooked ?? quasi.value.raw)\n .join('');\n case 'UnaryExpression':\n if (\n node.operator === '-' &&\n node.argument?.type === 'Literal' &&\n typeof node.argument.value === 'number'\n ) {\n return -node.argument.value;\n }\n throw new Error(`only negative-number unary allowed in ${path}`);\n default:\n throw new Error(`non-literal node type in ${path}: ${node.type}`);\n }\n}\n\nfunction propertyKey(node: AnyNode, path: string): string {\n if (node.type === 'Identifier') return node.name;\n if (node.type === 'Literal' && (typeof node.value === 'string' || typeof node.value === 'number')) {\n return String(node.value);\n }\n throw new Error(`unsupported key type in ${path}: ${node.type}`);\n}\n\nfunction validateMeta(meta: unknown): asserts meta is WorkflowMeta {\n if (!meta || typeof meta !== 'object') {\n throw new Error('meta must be an object');\n }\n const value = meta as WorkflowMeta;\n if (typeof value.name !== 'string' || !value.name.trim()) {\n throw new Error('meta.name must be a non-empty string');\n }\n if (!/^[a-z][a-z0-9_-]*$/.test(value.name)) {\n throw new Error(\n `meta.name must be lowercase snake_case (got \"${value.name}\"). Example: \"audit_repo\".`,\n );\n }\n if (typeof value.description !== 'string' || !value.description.trim()) {\n throw new Error('meta.description must be a non-empty string');\n }\n if (value.whenToUse !== undefined && typeof value.whenToUse !== 'string') {\n throw new Error('meta.whenToUse must be a string');\n }\n if (value.phases !== undefined) {\n if (!Array.isArray(value.phases)) {\n throw new Error('meta.phases must be an array');\n }\n for (const phase of value.phases) {\n if (!phase || typeof phase !== 'object' || typeof (phase as WorkflowMetaPhase).title !== 'string') {\n throw new Error('each meta phase must have a title string');\n }\n }\n }\n if (value.tags !== undefined) {\n if (!Array.isArray(value.tags) || value.tags.some((tag) => typeof tag !== 'string' || !tag.trim())) {\n throw new Error('meta.tags must be an array of non-empty strings');\n }\n }\n if (value.estimatedAgents !== undefined) {\n const est = value.estimatedAgents;\n if (!est || typeof est !== 'object') {\n throw new Error('meta.estimatedAgents must be an object');\n }\n if (typeof est.min !== 'number' || typeof est.max !== 'number' || !Number.isFinite(est.min) || !Number.isFinite(est.max)) {\n throw new Error('meta.estimatedAgents.min and .max must be finite numbers');\n }\n if (est.min < 1 || est.max < est.min) {\n throw new Error('meta.estimatedAgents requires min >= 1 and max >= min');\n }\n }\n validateExamplePrompts(value.examplePrompts, 'meta.examplePrompts');\n validateMetaI18n(value.i18n);\n}\n"],"mappings":"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"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Sandboxed workflow runtime.
|
|
3
|
-
*
|
|
4
|
-
* Parses the script via {@link parseWorkflowScript} (which strips the `meta`
|
|
5
|
-
* export), wraps the remaining body in an async IIFE, and runs it inside a
|
|
6
|
-
* Node `vm` context with a curated set of globals:
|
|
7
|
-
*
|
|
8
|
-
* - `agent(prompt, opts)` — spawns a subagent through the injected
|
|
9
|
-
* {@link SubagentRunner} and returns its result (string, or schema-validated
|
|
10
|
-
* object). Failures resolve to `null`.
|
|
11
|
-
* - `parallel(thunks)` — concurrent fan-out; thunks (not promises!) so the
|
|
12
|
-
* limiter sees each agent() call.
|
|
13
|
-
* - `pipeline(items, ...stages)` — per-item sequential stages, items run
|
|
14
|
-
* concurrently (no stage barrier). Each stage receives
|
|
15
|
-
* `(prevResult, originalItem, index)`. A stage that throws drops that item
|
|
16
|
-
* to `null` and skips remaining stages.
|
|
17
|
-
* - `phase(title)` — marks the current phase; surfaces through `onPhase`.
|
|
18
|
-
* - `log(message)` — appends to the workflow log.
|
|
19
|
-
* - `budget` — `{ total, spent(), remaining() }` for self-pacing scripts.
|
|
20
|
-
* - `args`, `cwd`, `process.cwd()`.
|
|
21
|
-
*
|
|
22
|
-
* The runtime is the only code that touches `vm`. It exposes no IO surface,
|
|
23
|
-
* carries no LLM dependency, and is fully driven by injected callbacks — that
|
|
24
|
-
* means the workflow tool, tests, and any future runner share one runtime.
|
|
25
|
-
*/
|
|
26
|
-
import type { Api, Model } from '@earendil-works/pi-ai';
|
|
27
|
-
import type { SubagentRunner, WorkflowRunOptions, WorkflowRunResult } from './types.js';
|
|
28
|
-
export interface RunWorkflowDeps {
|
|
29
|
-
runner: SubagentRunner;
|
|
30
|
-
/** Resolve a model ref (`provider/model` or configured typed id) to a {@link Model}. Throws on unknown ref. */
|
|
31
|
-
resolveModelId?: (modelId: string) => Model<Api>;
|
|
32
|
-
}
|
|
33
|
-
export declare function runWorkflow<T = unknown>(script: string, deps: RunWorkflowDeps, options: WorkflowRunOptions): Promise<WorkflowRunResult<T>>;
|
|
34
|
-
export { emptySnapshotFor } from './snapshot-empty.js';
|