@travisliu/open-dynamic-workflow 0.3.0
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/CHANGELOG.md +20 -0
- package/LICENSE +21 -0
- package/README.md +312 -0
- package/dist/agents/antigravity-cli.d.ts +19 -0
- package/dist/agents/antigravity-cli.js +177 -0
- package/dist/agents/antigravity-cli.js.map +1 -0
- package/dist/agents/codex-exec.d.ts +12 -0
- package/dist/agents/codex-exec.js +283 -0
- package/dist/agents/codex-exec.js.map +1 -0
- package/dist/agents/execute-agent.d.ts +21 -0
- package/dist/agents/execute-agent.js +593 -0
- package/dist/agents/execute-agent.js.map +1 -0
- package/dist/agents/execution-types.d.ts +20 -0
- package/dist/agents/execution-types.js +2 -0
- package/dist/agents/execution-types.js.map +1 -0
- package/dist/agents/gemini-cli.d.ts +14 -0
- package/dist/agents/gemini-cli.js +176 -0
- package/dist/agents/gemini-cli.js.map +1 -0
- package/dist/agents/github-copilot-cli.d.ts +16 -0
- package/dist/agents/github-copilot-cli.js +256 -0
- package/dist/agents/github-copilot-cli.js.map +1 -0
- package/dist/agents/mock-adapter.d.ts +12 -0
- package/dist/agents/mock-adapter.js +66 -0
- package/dist/agents/mock-adapter.js.map +1 -0
- package/dist/agents/model-args.d.ts +2 -0
- package/dist/agents/model-args.js +15 -0
- package/dist/agents/model-args.js.map +1 -0
- package/dist/agents/opencode-cli.d.ts +22 -0
- package/dist/agents/opencode-cli.js +245 -0
- package/dist/agents/opencode-cli.js.map +1 -0
- package/dist/agents/pi-coding-agent.d.ts +31 -0
- package/dist/agents/pi-coding-agent.js +317 -0
- package/dist/agents/pi-coding-agent.js.map +1 -0
- package/dist/agents/process-runner.d.ts +2 -0
- package/dist/agents/process-runner.js +130 -0
- package/dist/agents/process-runner.js.map +1 -0
- package/dist/agents/provider-health.d.ts +3 -0
- package/dist/agents/provider-health.js +30 -0
- package/dist/agents/provider-health.js.map +1 -0
- package/dist/agents/registry.d.ts +12 -0
- package/dist/agents/registry.js +45 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/agents/resolve-model.d.ts +11 -0
- package/dist/agents/resolve-model.js +30 -0
- package/dist/agents/resolve-model.js.map +1 -0
- package/dist/agents/types.d.ts +2 -0
- package/dist/agents/types.js +2 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/artifacts/call-cache.d.ts +117 -0
- package/dist/artifacts/call-cache.js +449 -0
- package/dist/artifacts/call-cache.js.map +1 -0
- package/dist/artifacts/logs.d.ts +13 -0
- package/dist/artifacts/logs.js +24 -0
- package/dist/artifacts/logs.js.map +1 -0
- package/dist/artifacts/manifest.d.ts +18 -0
- package/dist/artifacts/manifest.js +29 -0
- package/dist/artifacts/manifest.js.map +1 -0
- package/dist/artifacts/run-store.d.ts +22 -0
- package/dist/artifacts/run-store.js +148 -0
- package/dist/artifacts/run-store.js.map +1 -0
- package/dist/bin/open-dynamic-workflow.d.ts +2 -0
- package/dist/bin/open-dynamic-workflow.js +45 -0
- package/dist/bin/open-dynamic-workflow.js.map +1 -0
- package/dist/cli/args.d.ts +36 -0
- package/dist/cli/args.js +68 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +9 -0
- package/dist/cli/commands/doctor.js +109 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/init.d.ts +23 -0
- package/dist/cli/commands/init.js +147 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/list.d.ts +12 -0
- package/dist/cli/commands/list.js +65 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/resume.d.ts +5 -0
- package/dist/cli/commands/resume.js +81 -0
- package/dist/cli/commands/resume.js.map +1 -0
- package/dist/cli/commands/run.d.ts +18 -0
- package/dist/cli/commands/run.js +318 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +14 -0
- package/dist/cli/commands/validate.js +66 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +169 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init/defaults.d.ts +12 -0
- package/dist/cli/init/defaults.js +54 -0
- package/dist/cli/init/defaults.js.map +1 -0
- package/dist/cli/init/planner.d.ts +10 -0
- package/dist/cli/init/planner.js +163 -0
- package/dist/cli/init/planner.js.map +1 -0
- package/dist/cli/init/prompts.d.ts +15 -0
- package/dist/cli/init/prompts.js +83 -0
- package/dist/cli/init/prompts.js.map +1 -0
- package/dist/cli/init/providers.d.ts +13 -0
- package/dist/cli/init/providers.js +100 -0
- package/dist/cli/init/providers.js.map +1 -0
- package/dist/cli/init/renderer.d.ts +8 -0
- package/dist/cli/init/renderer.js +84 -0
- package/dist/cli/init/renderer.js.map +1 -0
- package/dist/cli/init/smoke-test.d.ts +15 -0
- package/dist/cli/init/smoke-test.js +47 -0
- package/dist/cli/init/smoke-test.js.map +1 -0
- package/dist/cli/init/summary.d.ts +11 -0
- package/dist/cli/init/summary.js +65 -0
- package/dist/cli/init/summary.js.map +1 -0
- package/dist/cli/init/types.d.ts +81 -0
- package/dist/cli/init/types.js +2 -0
- package/dist/cli/init/types.js.map +1 -0
- package/dist/cli/init/writer.d.ts +3 -0
- package/dist/cli/init/writer.js +57 -0
- package/dist/cli/init/writer.js.map +1 -0
- package/dist/cli/package-info.d.ts +1 -0
- package/dist/cli/package-info.js +13 -0
- package/dist/cli/package-info.js.map +1 -0
- package/dist/cli/paths.d.ts +2 -0
- package/dist/cli/paths.js +8 -0
- package/dist/cli/paths.js.map +1 -0
- package/dist/cli/print.d.ts +22 -0
- package/dist/cli/print.js +48 -0
- package/dist/cli/print.js.map +1 -0
- package/dist/config/defaults.d.ts +3 -0
- package/dist/config/defaults.js +116 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/load.d.ts +10 -0
- package/dist/config/load.js +72 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/merge.d.ts +10 -0
- package/dist/config/merge.js +58 -0
- package/dist/config/merge.js.map +1 -0
- package/dist/config/schema.d.ts +2 -0
- package/dist/config/schema.js +236 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/types.d.ts +93 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/discovery/collect-files.d.ts +10 -0
- package/dist/discovery/collect-files.js +189 -0
- package/dist/discovery/collect-files.js.map +1 -0
- package/dist/discovery/definition-call.d.ts +10 -0
- package/dist/discovery/definition-call.js +37 -0
- package/dist/discovery/definition-call.js.map +1 -0
- package/dist/discovery/diagnostics.d.ts +17 -0
- package/dist/discovery/diagnostics.js +32 -0
- package/dist/discovery/diagnostics.js.map +1 -0
- package/dist/discovery/directories.d.ts +8 -0
- package/dist/discovery/directories.js +32 -0
- package/dist/discovery/directories.js.map +1 -0
- package/dist/discovery/duplicate-detector.d.ts +8 -0
- package/dist/discovery/duplicate-detector.js +40 -0
- package/dist/discovery/duplicate-detector.js.map +1 -0
- package/dist/discovery/extract-agent.d.ts +2 -0
- package/dist/discovery/extract-agent.js +166 -0
- package/dist/discovery/extract-agent.js.map +1 -0
- package/dist/discovery/extract-tool.d.ts +2 -0
- package/dist/discovery/extract-tool.js +188 -0
- package/dist/discovery/extract-tool.js.map +1 -0
- package/dist/discovery/extract-workflow.d.ts +2 -0
- package/dist/discovery/extract-workflow.js +180 -0
- package/dist/discovery/extract-workflow.js.map +1 -0
- package/dist/discovery/file-patterns.d.ts +3 -0
- package/dist/discovery/file-patterns.js +93 -0
- package/dist/discovery/file-patterns.js.map +1 -0
- package/dist/discovery/index.d.ts +7 -0
- package/dist/discovery/index.js +8 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/schema-summary.d.ts +13 -0
- package/dist/discovery/schema-summary.js +37 -0
- package/dist/discovery/schema-summary.js.map +1 -0
- package/dist/discovery/service.d.ts +4 -0
- package/dist/discovery/service.js +135 -0
- package/dist/discovery/service.js.map +1 -0
- package/dist/discovery/static-values.d.ts +13 -0
- package/dist/discovery/static-values.js +68 -0
- package/dist/discovery/static-values.js.map +1 -0
- package/dist/discovery/types.d.ts +95 -0
- package/dist/discovery/types.js +2 -0
- package/dist/discovery/types.js.map +1 -0
- package/dist/doctors/public.d.ts +15 -0
- package/dist/doctors/public.js +2 -0
- package/dist/doctors/public.js.map +1 -0
- package/dist/errors/codes.d.ts +53 -0
- package/dist/errors/codes.js +53 -0
- package/dist/errors/codes.js.map +1 -0
- package/dist/errors/exit-codes.d.ts +13 -0
- package/dist/errors/exit-codes.js +72 -0
- package/dist/errors/exit-codes.js.map +1 -0
- package/dist/errors/list-errors.d.ts +4 -0
- package/dist/errors/list-errors.js +11 -0
- package/dist/errors/list-errors.js.map +1 -0
- package/dist/errors/serialize.d.ts +2 -0
- package/dist/errors/serialize.js +38 -0
- package/dist/errors/serialize.js.map +1 -0
- package/dist/errors/types.d.ts +15 -0
- package/dist/errors/types.js +13 -0
- package/dist/errors/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestration/cancellation.d.ts +13 -0
- package/dist/orchestration/cancellation.js +41 -0
- package/dist/orchestration/cancellation.js.map +1 -0
- package/dist/orchestration/event-bus.d.ts +24 -0
- package/dist/orchestration/event-bus.js +50 -0
- package/dist/orchestration/event-bus.js.map +1 -0
- package/dist/orchestration/fail-fast.d.ts +8 -0
- package/dist/orchestration/fail-fast.js +21 -0
- package/dist/orchestration/fail-fast.js.map +1 -0
- package/dist/orchestration/scheduler.d.ts +37 -0
- package/dist/orchestration/scheduler.js +330 -0
- package/dist/orchestration/scheduler.js.map +1 -0
- package/dist/orchestration/tool-limiter.d.ts +10 -0
- package/dist/orchestration/tool-limiter.js +62 -0
- package/dist/orchestration/tool-limiter.js.map +1 -0
- package/dist/output/events.d.ts +290 -0
- package/dist/output/events.js +10 -0
- package/dist/output/events.js.map +1 -0
- package/dist/output/failed-artifacts.d.ts +5 -0
- package/dist/output/failed-artifacts.js +62 -0
- package/dist/output/failed-artifacts.js.map +1 -0
- package/dist/output/json-reporter.d.ts +13 -0
- package/dist/output/json-reporter.js +31 -0
- package/dist/output/json-reporter.js.map +1 -0
- package/dist/output/jsonl-reporter.d.ts +12 -0
- package/dist/output/jsonl-reporter.js +29 -0
- package/dist/output/jsonl-reporter.js.map +1 -0
- package/dist/output/list-json-reporter.d.ts +9 -0
- package/dist/output/list-json-reporter.js +22 -0
- package/dist/output/list-json-reporter.js.map +1 -0
- package/dist/output/list-jsonl-reporter.d.ts +9 -0
- package/dist/output/list-jsonl-reporter.js +43 -0
- package/dist/output/list-jsonl-reporter.js.map +1 -0
- package/dist/output/list-pretty-reporter.d.ts +13 -0
- package/dist/output/list-pretty-reporter.js +120 -0
- package/dist/output/list-pretty-reporter.js.map +1 -0
- package/dist/output/list-reporter.d.ts +14 -0
- package/dist/output/list-reporter.js +20 -0
- package/dist/output/list-reporter.js.map +1 -0
- package/dist/output/pretty-format.d.ts +19 -0
- package/dist/output/pretty-format.js +75 -0
- package/dist/output/pretty-format.js.map +1 -0
- package/dist/output/pretty-renderer.d.ts +2 -0
- package/dist/output/pretty-renderer.js +97 -0
- package/dist/output/pretty-renderer.js.map +1 -0
- package/dist/output/pretty-reporter.d.ts +14 -0
- package/dist/output/pretty-reporter.js +155 -0
- package/dist/output/pretty-reporter.js.map +1 -0
- package/dist/output/pretty-view-builder.d.ts +26 -0
- package/dist/output/pretty-view-builder.js +374 -0
- package/dist/output/pretty-view-builder.js.map +1 -0
- package/dist/output/pretty-view.d.ts +85 -0
- package/dist/output/pretty-view.js +6 -0
- package/dist/output/pretty-view.js.map +1 -0
- package/dist/output/reporter.d.ts +34 -0
- package/dist/output/reporter.js +24 -0
- package/dist/output/reporter.js.map +1 -0
- package/dist/output/verbose-formatter.d.ts +6 -0
- package/dist/output/verbose-formatter.js +137 -0
- package/dist/output/verbose-formatter.js.map +1 -0
- package/dist/pipeline/artifacts.d.ts +6 -0
- package/dist/pipeline/artifacts.js +44 -0
- package/dist/pipeline/artifacts.js.map +1 -0
- package/dist/pipeline/concurrency.d.ts +11 -0
- package/dist/pipeline/concurrency.js +60 -0
- package/dist/pipeline/concurrency.js.map +1 -0
- package/dist/pipeline/context.d.ts +15 -0
- package/dist/pipeline/context.js +17 -0
- package/dist/pipeline/context.js.map +1 -0
- package/dist/pipeline/events.d.ts +10 -0
- package/dist/pipeline/events.js +83 -0
- package/dist/pipeline/events.js.map +1 -0
- package/dist/pipeline/id.d.ts +10 -0
- package/dist/pipeline/id.js +61 -0
- package/dist/pipeline/id.js.map +1 -0
- package/dist/pipeline/item-streaming.d.ts +3 -0
- package/dist/pipeline/item-streaming.js +122 -0
- package/dist/pipeline/item-streaming.js.map +1 -0
- package/dist/pipeline/results.d.ts +10 -0
- package/dist/pipeline/results.js +88 -0
- package/dist/pipeline/results.js.map +1 -0
- package/dist/pipeline/run.d.ts +10 -0
- package/dist/pipeline/run.js +93 -0
- package/dist/pipeline/run.js.map +1 -0
- package/dist/pipeline/stage-barrier.d.ts +3 -0
- package/dist/pipeline/stage-barrier.js +135 -0
- package/dist/pipeline/stage-barrier.js.map +1 -0
- package/dist/pipeline/stage-runner.d.ts +13 -0
- package/dist/pipeline/stage-runner.js +185 -0
- package/dist/pipeline/stage-runner.js.map +1 -0
- package/dist/pipeline/summary.d.ts +12 -0
- package/dist/pipeline/summary.js +24 -0
- package/dist/pipeline/summary.js.map +1 -0
- package/dist/pipeline/types.d.ts +92 -0
- package/dist/pipeline/types.js +2 -0
- package/dist/pipeline/types.js.map +1 -0
- package/dist/pipeline/validate.d.ts +11 -0
- package/dist/pipeline/validate.js +139 -0
- package/dist/pipeline/validate.js.map +1 -0
- package/dist/runtime/public.d.ts +3 -0
- package/dist/runtime/public.js +4 -0
- package/dist/runtime/public.js.map +1 -0
- package/dist/security/env.d.ts +38 -0
- package/dist/security/env.js +186 -0
- package/dist/security/env.js.map +1 -0
- package/dist/security/metadata.d.ts +6 -0
- package/dist/security/metadata.js +41 -0
- package/dist/security/metadata.js.map +1 -0
- package/dist/shared-agents/context.d.ts +2 -0
- package/dist/shared-agents/context.js +5 -0
- package/dist/shared-agents/context.js.map +1 -0
- package/dist/shared-agents/define-agent.d.ts +3 -0
- package/dist/shared-agents/define-agent.js +15 -0
- package/dist/shared-agents/define-agent.js.map +1 -0
- package/dist/shared-agents/execute.d.ts +24 -0
- package/dist/shared-agents/execute.js +63 -0
- package/dist/shared-agents/execute.js.map +1 -0
- package/dist/shared-agents/index.d.ts +5 -0
- package/dist/shared-agents/index.js +6 -0
- package/dist/shared-agents/index.js.map +1 -0
- package/dist/shared-agents/load.d.ts +8 -0
- package/dist/shared-agents/load.js +141 -0
- package/dist/shared-agents/load.js.map +1 -0
- package/dist/shared-agents/registry.d.ts +8 -0
- package/dist/shared-agents/registry.js +25 -0
- package/dist/shared-agents/registry.js.map +1 -0
- package/dist/shared-agents/render.d.ts +11 -0
- package/dist/shared-agents/render.js +31 -0
- package/dist/shared-agents/render.js.map +1 -0
- package/dist/shared-agents/resolver.d.ts +7 -0
- package/dist/shared-agents/resolver.js +22 -0
- package/dist/shared-agents/resolver.js.map +1 -0
- package/dist/shared-agents/types.d.ts +33 -0
- package/dist/shared-agents/types.js +2 -0
- package/dist/shared-agents/types.js.map +1 -0
- package/dist/shared-agents/validate.d.ts +7 -0
- package/dist/shared-agents/validate.js +223 -0
- package/dist/shared-agents/validate.js.map +1 -0
- package/dist/structured/extract-json.d.ts +11 -0
- package/dist/structured/extract-json.js +79 -0
- package/dist/structured/extract-json.js.map +1 -0
- package/dist/structured/normalize-agent-output.d.ts +18 -0
- package/dist/structured/normalize-agent-output.js +89 -0
- package/dist/structured/normalize-agent-output.js.map +1 -0
- package/dist/structured/structured-output.d.ts +14 -0
- package/dist/structured/structured-output.js +51 -0
- package/dist/structured/structured-output.js.map +1 -0
- package/dist/structured/validate-json.d.ts +13 -0
- package/dist/structured/validate-json.js +32 -0
- package/dist/structured/validate-json.js.map +1 -0
- package/dist/tools/artifacts.d.ts +8 -0
- package/dist/tools/artifacts.js +31 -0
- package/dist/tools/artifacts.js.map +1 -0
- package/dist/tools/define-tool.d.ts +10 -0
- package/dist/tools/define-tool.js +24 -0
- package/dist/tools/define-tool.js.map +1 -0
- package/dist/tools/executor-types.d.ts +40 -0
- package/dist/tools/executor-types.js +2 -0
- package/dist/tools/executor-types.js.map +1 -0
- package/dist/tools/executor.d.ts +23 -0
- package/dist/tools/executor.js +455 -0
- package/dist/tools/executor.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.js +5 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/load.d.ts +7 -0
- package/dist/tools/load.js +133 -0
- package/dist/tools/load.js.map +1 -0
- package/dist/tools/registry.d.ts +9 -0
- package/dist/tools/registry.js +97 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/serialization.d.ts +11 -0
- package/dist/tools/serialization.js +68 -0
- package/dist/tools/serialization.js.map +1 -0
- package/dist/tools/validate.d.ts +18 -0
- package/dist/tools/validate.js +55 -0
- package/dist/tools/validate.js.map +1 -0
- package/dist/types/agent.d.ts +136 -0
- package/dist/types/agent.js +2 -0
- package/dist/types/agent.js.map +1 -0
- package/dist/types/artifacts.d.ts +88 -0
- package/dist/types/artifacts.js +2 -0
- package/dist/types/artifacts.js.map +1 -0
- package/dist/types/common.d.ts +15 -0
- package/dist/types/common.js +2 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/config.d.ts +119 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/errors.d.ts +21 -0
- package/dist/types/errors.js +50 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/events.d.ts +4 -0
- package/dist/types/events.js +2 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.js +12 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/process.d.ts +20 -0
- package/dist/types/process.js +2 -0
- package/dist/types/process.js.map +1 -0
- package/dist/types/reporter.d.ts +1 -0
- package/dist/types/reporter.js +2 -0
- package/dist/types/reporter.js.map +1 -0
- package/dist/types/scheduler.d.ts +30 -0
- package/dist/types/scheduler.js +2 -0
- package/dist/types/scheduler.js.map +1 -0
- package/dist/types/tool.d.ts +129 -0
- package/dist/types/tool.js +2 -0
- package/dist/types/tool.js.map +1 -0
- package/dist/types/workflow.d.ts +127 -0
- package/dist/types/workflow.js +2 -0
- package/dist/types/workflow.js.map +1 -0
- package/dist/workflow/discovery.d.ts +15 -0
- package/dist/workflow/discovery.js +134 -0
- package/dist/workflow/discovery.js.map +1 -0
- package/dist/workflow/dsl.d.ts +13 -0
- package/dist/workflow/dsl.js +683 -0
- package/dist/workflow/dsl.js.map +1 -0
- package/dist/workflow/errors.d.ts +18 -0
- package/dist/workflow/errors.js +33 -0
- package/dist/workflow/errors.js.map +1 -0
- package/dist/workflow/invocation-artifacts.d.ts +42 -0
- package/dist/workflow/invocation-artifacts.js +114 -0
- package/dist/workflow/invocation-artifacts.js.map +1 -0
- package/dist/workflow/invocation-manager.d.ts +31 -0
- package/dist/workflow/invocation-manager.js +516 -0
- package/dist/workflow/invocation-manager.js.map +1 -0
- package/dist/workflow/invocation-types.d.ts +63 -0
- package/dist/workflow/invocation-types.js +15 -0
- package/dist/workflow/invocation-types.js.map +1 -0
- package/dist/workflow/json.d.ts +10 -0
- package/dist/workflow/json.js +117 -0
- package/dist/workflow/json.js.map +1 -0
- package/dist/workflow/load.d.ts +2 -0
- package/dist/workflow/load.js +18 -0
- package/dist/workflow/load.js.map +1 -0
- package/dist/workflow/parse.d.ts +2 -0
- package/dist/workflow/parse.js +135 -0
- package/dist/workflow/parse.js.map +1 -0
- package/dist/workflow/registry.d.ts +18 -0
- package/dist/workflow/registry.js +55 -0
- package/dist/workflow/registry.js.map +1 -0
- package/dist/workflow/resolve-target.d.ts +45 -0
- package/dist/workflow/resolve-target.js +162 -0
- package/dist/workflow/resolve-target.js.map +1 -0
- package/dist/workflow/runtime.d.ts +46 -0
- package/dist/workflow/runtime.js +398 -0
- package/dist/workflow/runtime.js.map +1 -0
- package/dist/workflow/sandbox.d.ts +14 -0
- package/dist/workflow/sandbox.js +79 -0
- package/dist/workflow/sandbox.js.map +1 -0
- package/dist/workflow/scope.d.ts +18 -0
- package/dist/workflow/scope.js +108 -0
- package/dist/workflow/scope.js.map +1 -0
- package/dist/workflow/types.d.ts +65 -0
- package/dist/workflow/types.js +2 -0
- package/dist/workflow/types.js.map +1 -0
- package/dist/workflow/validate.d.ts +28 -0
- package/dist/workflow/validate.js +1059 -0
- package/dist/workflow/validate.js.map +1 -0
- package/dist/workflow/workflow-call.d.ts +12 -0
- package/dist/workflow/workflow-call.js +61 -0
- package/dist/workflow/workflow-call.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { ErrorCode } from "../errors/codes.js";
|
|
2
|
+
import { OpenDynamicWorkflowError } from "../errors/types.js";
|
|
3
|
+
import { sanitizeMetadata } from "../security/metadata.js";
|
|
4
|
+
import { normalizeSharedAgentContext } from "./context.js";
|
|
5
|
+
import { withToolForbidden } from "../workflow/scope.js";
|
|
6
|
+
import { renderAgentPrompt } from "./render.js";
|
|
7
|
+
import { resolveSharedAgent } from "./resolver.js";
|
|
8
|
+
/**
|
|
9
|
+
* Executes a shared agent by resolving it, validating context, and executing its run() method.
|
|
10
|
+
*/
|
|
11
|
+
export async function executeSharedAgent(input, deps) {
|
|
12
|
+
const entry = resolveSharedAgent(deps.registry, input.sharedAgentId);
|
|
13
|
+
const { definition } = entry;
|
|
14
|
+
const context = normalizeSharedAgentContext(definition, input.context);
|
|
15
|
+
const runtimeObj = {
|
|
16
|
+
agent: (innerInput) => {
|
|
17
|
+
const enrichedInput = {
|
|
18
|
+
...innerInput,
|
|
19
|
+
label: innerInput.label || entry.id,
|
|
20
|
+
metadata: {
|
|
21
|
+
...sanitizeMetadata(definition.metadata || {}),
|
|
22
|
+
...innerInput.metadata,
|
|
23
|
+
sharedAgentId: entry.id,
|
|
24
|
+
sharedAgentSource: "registry",
|
|
25
|
+
...(input.pipeline ?? {}),
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
return deps.agent(enrichedInput);
|
|
29
|
+
},
|
|
30
|
+
log: deps.log,
|
|
31
|
+
signal: deps.signal,
|
|
32
|
+
runId: deps.runId,
|
|
33
|
+
cwd: deps.cwd,
|
|
34
|
+
artifactsDir: deps.artifactsDir,
|
|
35
|
+
renderAgentPrompt: (customContext) => {
|
|
36
|
+
if (!("agentPrompt" in definition) || typeof definition.agentPrompt !== "string") {
|
|
37
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_PROMPT_RENDER_FAILED, "Cannot render agent prompt because 'agentPrompt' is not defined in this shared agent.");
|
|
38
|
+
}
|
|
39
|
+
if (!customContext || typeof customContext !== "object") {
|
|
40
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_PROMPT_RENDER_FAILED, "Context passed to renderAgentPrompt must be an object.");
|
|
41
|
+
}
|
|
42
|
+
const declaredFields = new Set(Object.keys(definition.inputSchema?.properties || {}));
|
|
43
|
+
return renderAgentPrompt({
|
|
44
|
+
agentPrompt: definition.agentPrompt,
|
|
45
|
+
context: customContext,
|
|
46
|
+
declaredFields,
|
|
47
|
+
strictVariables: deps.config.sharedAgents?.strictPromptTemplateVariables ?? true,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
if (input.pipeline !== undefined) {
|
|
52
|
+
runtimeObj.pipeline = input.pipeline;
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
return await withToolForbidden("shared-agent-definition", async () => {
|
|
56
|
+
return await definition.run(context, runtimeObj);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_RUNTIME_FAILED, `Shared agent '${entry.id}' runtime execution failed: ${err.message}`, { cause: err });
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=execute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/shared-agents/execute.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAG9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAwBnD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAA8B,EAC9B,IAA4B;IAE5B,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IACrE,MAAM,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC;IAE7B,MAAM,OAAO,GAAG,2BAA2B,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAEvE,MAAM,UAAU,GAAuB;QACrC,KAAK,EAAE,CAAC,UAAU,EAAE,EAAE;YACpB,MAAM,aAAa,GAAyB;gBAC1C,GAAG,UAAU;gBACb,KAAK,EAAE,UAAU,CAAC,KAAK,IAAI,KAAK,CAAC,EAAE;gBACnC,QAAQ,EAAE;oBACR,GAAG,gBAAgB,CAAC,UAAU,CAAC,QAAQ,IAAI,EAAE,CAAC;oBAC9C,GAAG,UAAU,CAAC,QAAQ;oBACtB,aAAa,EAAE,KAAK,CAAC,EAAE;oBACvB,iBAAiB,EAAE,UAAU;oBAC7B,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;iBAC1B;aACF,CAAC;YACF,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACnC,CAAC;QACD,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,iBAAiB,EAAE,CAAC,aAAsB,EAAE,EAAE;YAC5C,IAAI,CAAC,CAAC,aAAa,IAAI,UAAU,CAAC,IAAI,OAAO,UAAU,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;gBACjF,MAAM,IAAI,wBAAwB,CAChC,SAAS,CAAC,iCAAiC,EAC3C,uFAAuF,CACxF,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,aAAa,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;gBACxD,MAAM,IAAI,wBAAwB,CAChC,SAAS,CAAC,iCAAiC,EAC3C,wDAAwD,CACzD,CAAC;YACJ,CAAC;YACD,MAAM,cAAc,GAAG,IAAI,GAAG,CAC5B,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,UAAU,IAAI,EAAE,CAAC,CACtD,CAAC;YACF,OAAO,iBAAiB,CAAC;gBACvB,WAAW,EAAE,UAAU,CAAC,WAAW;gBACnC,OAAO,EAAE,aAAwC;gBACjD,cAAc;gBACd,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,6BAA6B,IAAI,IAAI;aACjF,CAAC,CAAC;QACL,CAAC;KACF,CAAC;IACF,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACjC,UAAU,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IACvC,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,iBAAiB,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;YACnE,OAAO,MAAM,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,IAAI,wBAAwB,CAChC,SAAS,CAAC,2BAA2B,EACrC,iBAAiB,KAAK,CAAC,EAAE,+BAA+B,GAAG,CAAC,OAAO,EAAE,EACrE,EAAE,KAAK,EAAE,GAAG,EAAE,CACf,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export { defineAgent, isDefinedSharedAgent } from "./define-agent.js";
|
|
3
|
+
export { SharedAgentRegistry } from "./registry.js";
|
|
4
|
+
export { loadSharedAgentRegistry, type LoadSharedAgentRegistryInput, } from "./load.js";
|
|
5
|
+
export { validateSharedAgentDefinition, validateSharedAgentSource, type SharedAgentValidationOptions, } from "./validate.js";
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from "./types.js";
|
|
2
|
+
export { defineAgent, isDefinedSharedAgent } from "./define-agent.js";
|
|
3
|
+
export { SharedAgentRegistry } from "./registry.js";
|
|
4
|
+
export { loadSharedAgentRegistry, } from "./load.js";
|
|
5
|
+
export { validateSharedAgentDefinition, validateSharedAgentSource, } from "./validate.js";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shared-agents/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EACL,uBAAuB,GAExB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,6BAA6B,EAC7B,yBAAyB,GAE1B,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { SharedAgentRegistry } from "./registry.js";
|
|
2
|
+
export interface LoadSharedAgentRegistryInput {
|
|
3
|
+
cwd: string;
|
|
4
|
+
dir?: string;
|
|
5
|
+
maxDefinitions?: number;
|
|
6
|
+
strictPromptTemplateVariables?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function loadSharedAgentRegistry(input: LoadSharedAgentRegistryInput): Promise<SharedAgentRegistry>;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { readFile, readdir, stat, realpath } from "node:fs/promises";
|
|
2
|
+
import { resolve, relative, join, extname } from "node:path";
|
|
3
|
+
import * as vm from "node:vm";
|
|
4
|
+
import * as ts from "typescript";
|
|
5
|
+
import { ErrorCode } from "../errors/codes.js";
|
|
6
|
+
import { OpenDynamicWorkflowError } from "../errors/types.js";
|
|
7
|
+
import { SharedAgentRegistry } from "./registry.js";
|
|
8
|
+
import { validateSharedAgentDefinition, validateSharedAgentSource } from "./validate.js";
|
|
9
|
+
import { isDefinedSharedAgent } from "./define-agent.js";
|
|
10
|
+
const SUPPORTED_EXTENSIONS = [".ts", ".js", ".mjs", ".cjs"];
|
|
11
|
+
export async function loadSharedAgentRegistry(input) {
|
|
12
|
+
const registry = new SharedAgentRegistry();
|
|
13
|
+
const realCwd = await realpath(resolve(input.cwd));
|
|
14
|
+
const maxDefinitions = input.maxDefinitions ?? 100;
|
|
15
|
+
const discoveredFiles = [];
|
|
16
|
+
if (input.dir) {
|
|
17
|
+
const absolutePath = resolve(realCwd, input.dir);
|
|
18
|
+
try {
|
|
19
|
+
const entries = await readdir(absolutePath, { withFileTypes: true });
|
|
20
|
+
const sortedNames = entries.map(e => e.name).sort();
|
|
21
|
+
for (const name of sortedNames) {
|
|
22
|
+
const fullPath = join(absolutePath, name);
|
|
23
|
+
const entry = entries.find(e => e.name === name);
|
|
24
|
+
let isFile = entry.isFile();
|
|
25
|
+
if (entry.isSymbolicLink()) {
|
|
26
|
+
const realTarget = await realpath(fullPath);
|
|
27
|
+
const relativeToCwd = relative(realCwd, realTarget);
|
|
28
|
+
const relativeToDir = relative(absolutePath, realTarget);
|
|
29
|
+
if (relativeToCwd.startsWith("..") && relativeToDir.startsWith("..")) {
|
|
30
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_SECURITY_POLICY_VIOLATION, `Shared agent symlink '${fullPath}' points outside the workspace.`);
|
|
31
|
+
}
|
|
32
|
+
const targetStat = await stat(realTarget);
|
|
33
|
+
isFile = targetStat.isFile();
|
|
34
|
+
}
|
|
35
|
+
if (isFile && SUPPORTED_EXTENSIONS.includes(extname(name))) {
|
|
36
|
+
discoveredFiles.push(fullPath);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
if (err instanceof OpenDynamicWorkflowError)
|
|
42
|
+
throw err;
|
|
43
|
+
// Ignore missing files/dirs if they were part of the default paths
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (discoveredFiles.length > maxDefinitions) {
|
|
47
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_INVALID_DEFINITION, `Discovered ${discoveredFiles.length} shared agent definitions, which exceeds the limit of ${maxDefinitions}.`);
|
|
48
|
+
}
|
|
49
|
+
for (const filePath of discoveredFiles) {
|
|
50
|
+
const ext = extname(filePath);
|
|
51
|
+
const sourceText = await readFile(filePath, "utf8");
|
|
52
|
+
let definition;
|
|
53
|
+
if (SUPPORTED_EXTENSIONS.includes(ext)) {
|
|
54
|
+
validateSharedAgentSource(sourceText, filePath);
|
|
55
|
+
let codeToRun = sourceText;
|
|
56
|
+
if (ext === ".ts" || ext === ".js" || ext === ".mjs") {
|
|
57
|
+
codeToRun = transpileTs(sourceText, filePath);
|
|
58
|
+
}
|
|
59
|
+
definition = evaluateJsDefinition(codeToRun, filePath);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
const validatedDefinition = validateSharedAgentDefinition(definition, filePath, {
|
|
65
|
+
strictPromptTemplateVariables: input.strictPromptTemplateVariables ?? true,
|
|
66
|
+
});
|
|
67
|
+
registry.register({
|
|
68
|
+
id: validatedDefinition.id,
|
|
69
|
+
sourcePath: filePath,
|
|
70
|
+
definition: validatedDefinition,
|
|
71
|
+
validatedAt: new Date().toISOString(),
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return registry;
|
|
75
|
+
}
|
|
76
|
+
function evaluateJsDefinition(sourceText, filePath) {
|
|
77
|
+
let captured = undefined;
|
|
78
|
+
const moduleExports = {};
|
|
79
|
+
const sandbox = {
|
|
80
|
+
defineAgent: (def) => {
|
|
81
|
+
captured = def;
|
|
82
|
+
// Apply the marker so isDefinedSharedAgent(result) will pass
|
|
83
|
+
const SHARED_AGENT_MARKER = Symbol.for("open-dynamic-workflow.sharedAgentDefinition");
|
|
84
|
+
Object.defineProperty(def, SHARED_AGENT_MARKER, {
|
|
85
|
+
value: true,
|
|
86
|
+
enumerable: false,
|
|
87
|
+
configurable: false
|
|
88
|
+
});
|
|
89
|
+
return def;
|
|
90
|
+
},
|
|
91
|
+
console: {
|
|
92
|
+
log: () => { },
|
|
93
|
+
error: () => { },
|
|
94
|
+
warn: () => { },
|
|
95
|
+
},
|
|
96
|
+
exports: moduleExports,
|
|
97
|
+
module: { exports: moduleExports },
|
|
98
|
+
require: (mod) => {
|
|
99
|
+
if (mod.includes("define-agent") || mod.includes("open-dynamic-workflow")) {
|
|
100
|
+
return {
|
|
101
|
+
defineAgent: sandbox.defineAgent,
|
|
102
|
+
default: sandbox.defineAgent
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
throw new Error(`Cannot require module ${mod}`);
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
let codeToRun = sourceText;
|
|
109
|
+
if (codeToRun.includes("export default")) {
|
|
110
|
+
codeToRun = codeToRun.replace("export default", "sandboxDefault = ");
|
|
111
|
+
}
|
|
112
|
+
const context = vm.createContext(sandbox);
|
|
113
|
+
try {
|
|
114
|
+
const script = new vm.Script(codeToRun, { filename: filePath });
|
|
115
|
+
script.runInContext(context, { timeout: 250 });
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_RUNTIME_FAILED, `Failed to evaluate shared agent ${filePath}: ${err.message}`);
|
|
119
|
+
}
|
|
120
|
+
const result = sandbox.sandboxDefault || sandbox.module.exports.default;
|
|
121
|
+
if (!isDefinedSharedAgent(result)) {
|
|
122
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_INVALID_DEFINITION, `Shared agent file ${filePath} does not export a valid definition using defineAgent() as the default export.`);
|
|
123
|
+
}
|
|
124
|
+
return result;
|
|
125
|
+
}
|
|
126
|
+
function transpileTs(sourceText, filePath) {
|
|
127
|
+
try {
|
|
128
|
+
const transpile = ts.default?.transpileModule ?? ts.transpileModule;
|
|
129
|
+
const result = transpile(sourceText, {
|
|
130
|
+
compilerOptions: {
|
|
131
|
+
target: ts.ScriptTarget?.ES2022 ?? 9, // ES2022 is 9 in TypeScript ScriptTarget enum
|
|
132
|
+
module: ts.ModuleKind?.CommonJS ?? 1, // CommonJS is 1
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
return result.outputText;
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_RUNTIME_FAILED, `TypeScript transpilation failed for ${filePath}: ${err.message}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=load.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load.js","sourceRoot":"","sources":["../../src/shared-agents/load.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SharedAgentRegistryEntry } from "./types.js";
|
|
2
|
+
export declare class SharedAgentRegistry {
|
|
3
|
+
private readonly entries;
|
|
4
|
+
register(entry: SharedAgentRegistryEntry): void;
|
|
5
|
+
get(id: string): SharedAgentRegistryEntry | undefined;
|
|
6
|
+
has(id: string): boolean;
|
|
7
|
+
list(): SharedAgentRegistryEntry[];
|
|
8
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ErrorCode } from "../errors/codes.js";
|
|
2
|
+
import { OpenDynamicWorkflowError } from "../errors/types.js";
|
|
3
|
+
export class SharedAgentRegistry {
|
|
4
|
+
entries = new Map();
|
|
5
|
+
register(entry) {
|
|
6
|
+
if (typeof entry.id !== "string" || entry.id.trim() === "") {
|
|
7
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_INVALID_DEFINITION, `Shared agent in ${entry.sourcePath} must declare a non-empty id.`);
|
|
8
|
+
}
|
|
9
|
+
const existing = this.entries.get(entry.id);
|
|
10
|
+
if (existing) {
|
|
11
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_DUPLICATE_ID, `Duplicate shared agent id '${entry.id}' in ${existing.sourcePath} and ${entry.sourcePath}.`);
|
|
12
|
+
}
|
|
13
|
+
this.entries.set(entry.id, entry);
|
|
14
|
+
}
|
|
15
|
+
get(id) {
|
|
16
|
+
return this.entries.get(id);
|
|
17
|
+
}
|
|
18
|
+
has(id) {
|
|
19
|
+
return this.entries.has(id);
|
|
20
|
+
}
|
|
21
|
+
list() {
|
|
22
|
+
return Array.from(this.entries.values());
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/shared-agents/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAG9D,MAAM,OAAO,mBAAmB;IACb,OAAO,GAAG,IAAI,GAAG,EAAoC,CAAC;IAEvE,QAAQ,CAAC,KAA+B;QACtC,IAAI,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,IAAI,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC3D,MAAM,IAAI,wBAAwB,CAChC,SAAS,CAAC,+BAA+B,EACzC,mBAAmB,KAAK,CAAC,UAAU,+BAA+B,CACnE,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC5C,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,IAAI,wBAAwB,CAChC,SAAS,CAAC,yBAAyB,EACnC,8BAA8B,KAAK,CAAC,EAAE,QAAQ,QAAQ,CAAC,UAAU,QAAQ,KAAK,CAAC,UAAU,GAAG,CAC7F,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,GAAG,CAAC,EAAU;QACZ,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI;QACF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;CACF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface RenderAgentPromptInput {
|
|
2
|
+
agentPrompt: string;
|
|
3
|
+
context: Record<string, unknown>;
|
|
4
|
+
declaredFields: Set<string>;
|
|
5
|
+
strictVariables: boolean;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Renders a declarative agentPrompt template by interpolating variables from context.
|
|
9
|
+
* Supports only simple {{name}} interpolation.
|
|
10
|
+
*/
|
|
11
|
+
export declare function renderAgentPrompt(input: RenderAgentPromptInput): string;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { ErrorCode } from "../errors/codes.js";
|
|
2
|
+
import { OpenDynamicWorkflowError } from "../errors/types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Renders a declarative agentPrompt template by interpolating variables from context.
|
|
5
|
+
* Supports only simple {{name}} interpolation.
|
|
6
|
+
*/
|
|
7
|
+
export function renderAgentPrompt(input) {
|
|
8
|
+
const rendered = input.agentPrompt.replace(/\{\{\s*([A-Za-z_][A-Za-z0-9_]*)\s*\}\}/g, (_match, key) => {
|
|
9
|
+
if (!input.declaredFields.has(key)) {
|
|
10
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_UNDECLARED_PROMPT_VARIABLE, `agentPrompt references undeclared context field '${key}'.`);
|
|
11
|
+
}
|
|
12
|
+
const value = input.context[key];
|
|
13
|
+
if (value === undefined) {
|
|
14
|
+
if (input.strictVariables) {
|
|
15
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_PROMPT_RENDER_FAILED, `agentPrompt variable '${key}' was not provided.`);
|
|
16
|
+
}
|
|
17
|
+
return "";
|
|
18
|
+
}
|
|
19
|
+
return typeof value === "string" ? value : JSON.stringify(value);
|
|
20
|
+
});
|
|
21
|
+
// Reject unclosed tokens or expression-like templates by checking the template structure (excluding valid tokens)
|
|
22
|
+
const templateWithoutValidTokens = input.agentPrompt.replace(/\{\{\s*[A-Za-z_][A-Za-z0-9_]*\s*\}\}/g, "");
|
|
23
|
+
if (templateWithoutValidTokens.includes("{{") || templateWithoutValidTokens.includes("}}")) {
|
|
24
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_PROMPT_RENDER_FAILED, "agentPrompt contains unclosed tokens or unsupported expression-like templates.");
|
|
25
|
+
}
|
|
26
|
+
if (rendered.trim() === "") {
|
|
27
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_PROMPT_RENDER_FAILED, "Rendered prompt must be non-empty.");
|
|
28
|
+
}
|
|
29
|
+
return rendered;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/shared-agents/render.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAS9D;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAA6B;IAC7D,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,CACxC,yCAAyC,EACzC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QACd,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,wBAAwB,CAChC,SAAS,CAAC,uCAAuC,EACjD,oDAAoD,GAAG,IAAI,CAC5D,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;gBAC1B,MAAM,IAAI,wBAAwB,CAChC,SAAS,CAAC,iCAAiC,EAC3C,yBAAyB,GAAG,qBAAqB,CAClD,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACnE,CAAC,CACF,CAAC;IAEF,kHAAkH;IAClH,MAAM,0BAA0B,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,CAC1D,uCAAuC,EACvC,EAAE,CACH,CAAC;IACF,IAAI,0BAA0B,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,0BAA0B,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3F,MAAM,IAAI,wBAAwB,CAChC,SAAS,CAAC,iCAAiC,EAC3C,gFAAgF,CACjF,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAC3B,MAAM,IAAI,wBAAwB,CAChC,SAAS,CAAC,iCAAiC,EAC3C,oCAAoC,CACrC,CAAC;IACJ,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SharedAgentRegistry } from "./registry.js";
|
|
2
|
+
import type { SharedAgentRegistryEntry } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Resolves a shared agent definition from the registry by ID.
|
|
5
|
+
* Rejects path-like IDs to ensure agents are referenced by stable name.
|
|
6
|
+
*/
|
|
7
|
+
export declare function resolveSharedAgent(registry: SharedAgentRegistry, id: unknown): SharedAgentRegistryEntry;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ErrorCode } from "../errors/codes.js";
|
|
2
|
+
import { OpenDynamicWorkflowError } from "../errors/types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Resolves a shared agent definition from the registry by ID.
|
|
5
|
+
* Rejects path-like IDs to ensure agents are referenced by stable name.
|
|
6
|
+
*/
|
|
7
|
+
export function resolveSharedAgent(registry, id) {
|
|
8
|
+
if (typeof id !== "string" ||
|
|
9
|
+
id.trim() === "" ||
|
|
10
|
+
id.startsWith(".") ||
|
|
11
|
+
id.startsWith("/") ||
|
|
12
|
+
id.includes("/") ||
|
|
13
|
+
id.includes("\\")) {
|
|
14
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_NOT_FOUND, "Shared agent definition references must use a registry ID, not a path.");
|
|
15
|
+
}
|
|
16
|
+
const entry = registry.get(id);
|
|
17
|
+
if (!entry) {
|
|
18
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_NOT_FOUND, `Shared agent '${id}' was not found in the configured registry.`);
|
|
19
|
+
}
|
|
20
|
+
return entry;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/shared-agents/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAI9D;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAA6B,EAC7B,EAAW;IAEX,IACE,OAAO,EAAE,KAAK,QAAQ;QACtB,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE;QAChB,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAClB,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAClB,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC;QAChB,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EACjB,CAAC;QACD,MAAM,IAAI,wBAAwB,CAChC,SAAS,CAAC,sBAAsB,EAChC,wEAAwE,CACzE,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,wBAAwB,CAChC,SAAS,CAAC,sBAAsB,EAChC,iBAAiB,EAAE,6CAA6C,CACjE,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { DirectAgentCallInput, AgentResult } from "../types/agent.js";
|
|
2
|
+
import type { JsonSchema } from "../types/common.js";
|
|
3
|
+
export interface SharedAgentDefinition {
|
|
4
|
+
id: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
inputSchema?: JsonSchema;
|
|
7
|
+
agentPrompt?: string;
|
|
8
|
+
metadata?: Record<string, unknown>;
|
|
9
|
+
run(context: Record<string, unknown>, runtime: SharedAgentRuntime): Promise<AgentResult>;
|
|
10
|
+
}
|
|
11
|
+
export interface SharedAgentRuntime {
|
|
12
|
+
agent(input: DirectAgentCallInput): Promise<AgentResult>;
|
|
13
|
+
log(message: string, data?: unknown): void;
|
|
14
|
+
signal: AbortSignal;
|
|
15
|
+
runId: string;
|
|
16
|
+
cwd: string;
|
|
17
|
+
artifactsDir: string;
|
|
18
|
+
renderAgentPrompt(context: unknown): string;
|
|
19
|
+
pipeline?: SharedAgentPipelineMetadata;
|
|
20
|
+
}
|
|
21
|
+
export interface SharedAgentPipelineMetadata {
|
|
22
|
+
pipelineId: string;
|
|
23
|
+
itemIndex: number;
|
|
24
|
+
stageIndex: number;
|
|
25
|
+
stageName: string;
|
|
26
|
+
pipelineLabel?: string | undefined;
|
|
27
|
+
}
|
|
28
|
+
export interface SharedAgentRegistryEntry {
|
|
29
|
+
id: string;
|
|
30
|
+
sourcePath: string;
|
|
31
|
+
definition: SharedAgentDefinition;
|
|
32
|
+
validatedAt: string;
|
|
33
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/shared-agents/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SharedAgentDefinition } from "./types.js";
|
|
2
|
+
export interface SharedAgentValidationOptions {
|
|
3
|
+
strictPromptTemplateVariables?: boolean;
|
|
4
|
+
}
|
|
5
|
+
export declare function validateSharedAgentDefinition(definition: unknown, sourcePath: string, options?: SharedAgentValidationOptions): SharedAgentDefinition;
|
|
6
|
+
export declare function validateSharedAgentSource(sourceText: string, sourcePath: string): void;
|
|
7
|
+
export declare function validateSharedAgentInput(definition: SharedAgentDefinition, input: unknown): Record<string, unknown>;
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import AjvModule from "ajv";
|
|
2
|
+
import * as ts from "typescript";
|
|
3
|
+
import { ErrorCode } from "../errors/codes.js";
|
|
4
|
+
import { OpenDynamicWorkflowError } from "../errors/types.js";
|
|
5
|
+
const Ajv = AjvModule.default || AjvModule;
|
|
6
|
+
const ajv = new Ajv({ allErrors: true });
|
|
7
|
+
const ID_REGEX = /^[a-z0-9][a-z0-9-_.]*$/;
|
|
8
|
+
export function validateSharedAgentDefinition(definition, sourcePath, options = {}) {
|
|
9
|
+
if (!definition || typeof definition !== "object") {
|
|
10
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_INVALID_DEFINITION, `Shared agent definition in ${sourcePath} must be an object.`);
|
|
11
|
+
}
|
|
12
|
+
const def = definition;
|
|
13
|
+
// Validate ID
|
|
14
|
+
if (typeof def.id !== "string" || !ID_REGEX.test(def.id)) {
|
|
15
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_INVALID_DEFINITION, `Shared agent in ${sourcePath} has invalid id '${def.id}'. IDs must match ${ID_REGEX}.`);
|
|
16
|
+
}
|
|
17
|
+
// Validate description
|
|
18
|
+
if (def.description !== undefined && typeof def.description !== "string") {
|
|
19
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_INVALID_DEFINITION, `Shared agent in ${sourcePath} has invalid description. If provided, it must be a string.`);
|
|
20
|
+
}
|
|
21
|
+
// Validate run
|
|
22
|
+
if (typeof def.run !== "function") {
|
|
23
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_INVALID_DEFINITION, `Shared agent in ${sourcePath} must have a 'run' function.`);
|
|
24
|
+
}
|
|
25
|
+
// Validate JSON schemas
|
|
26
|
+
if (def.inputSchema !== undefined) {
|
|
27
|
+
validateSchema(def.inputSchema, "inputSchema", sourcePath);
|
|
28
|
+
}
|
|
29
|
+
if (def.schema !== undefined) {
|
|
30
|
+
validateSchema(def.schema, "schema", sourcePath);
|
|
31
|
+
}
|
|
32
|
+
if (def.agentPrompt !== undefined) {
|
|
33
|
+
if (typeof def.agentPrompt !== "string") {
|
|
34
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_INVALID_DEFINITION, `Shared agent in ${sourcePath} has invalid agentPrompt. If provided, it must be a string.`);
|
|
35
|
+
}
|
|
36
|
+
const sharedDef = def;
|
|
37
|
+
if (options.strictPromptTemplateVariables) {
|
|
38
|
+
validatePromptVariables(sharedDef, sourcePath);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return def;
|
|
42
|
+
}
|
|
43
|
+
function validateSchema(schema, fieldName, sourcePath) {
|
|
44
|
+
if (!schema || typeof schema !== "object") {
|
|
45
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_INVALID_DEFINITION, `Shared agent in ${sourcePath} has invalid ${fieldName}. It must be an object.`);
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
ajv.compile(schema);
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_INVALID_DEFINITION, `Shared agent in ${sourcePath} has invalid ${fieldName}: ${err.message}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function validatePromptVariables(def, sourcePath) {
|
|
55
|
+
if (!def.agentPrompt)
|
|
56
|
+
return;
|
|
57
|
+
const matches = def.agentPrompt.matchAll(/\{\{([^}]+)\}\}/g);
|
|
58
|
+
const variables = new Set();
|
|
59
|
+
for (const match of matches) {
|
|
60
|
+
if (match[1]) {
|
|
61
|
+
variables.add(match[1].trim());
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (variables.size === 0)
|
|
65
|
+
return;
|
|
66
|
+
const inputProperties = def.inputSchema?.properties || {};
|
|
67
|
+
const declaredVariables = new Set(Object.keys(inputProperties));
|
|
68
|
+
for (const variable of variables) {
|
|
69
|
+
if (!declaredVariables.has(variable)) {
|
|
70
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_UNDECLARED_PROMPT_VARIABLE, `Shared agent '${def.id}' in ${sourcePath} uses undeclared prompt variable '{{${variable}}}'.`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export function validateSharedAgentSource(sourceText, sourcePath) {
|
|
75
|
+
const sourceFile = ts.createSourceFile(sourcePath, sourceText, ts.ScriptTarget.Latest, true);
|
|
76
|
+
const forbiddenIdentifiers = new Set([
|
|
77
|
+
"globalThis",
|
|
78
|
+
"global",
|
|
79
|
+
"window",
|
|
80
|
+
"self",
|
|
81
|
+
"fetch",
|
|
82
|
+
"eval",
|
|
83
|
+
"Function",
|
|
84
|
+
"Object",
|
|
85
|
+
"Reflect",
|
|
86
|
+
"Proxy",
|
|
87
|
+
"AsyncFunction",
|
|
88
|
+
"process",
|
|
89
|
+
"fs",
|
|
90
|
+
"path",
|
|
91
|
+
"os",
|
|
92
|
+
"child_process",
|
|
93
|
+
"net",
|
|
94
|
+
"http",
|
|
95
|
+
"https",
|
|
96
|
+
"shell",
|
|
97
|
+
"phase",
|
|
98
|
+
"parallel",
|
|
99
|
+
"pipeline",
|
|
100
|
+
"args",
|
|
101
|
+
]);
|
|
102
|
+
const forbiddenProperties = new Set([
|
|
103
|
+
"constructor",
|
|
104
|
+
"__proto__",
|
|
105
|
+
"prototype",
|
|
106
|
+
"Function",
|
|
107
|
+
"fs",
|
|
108
|
+
"path",
|
|
109
|
+
"os",
|
|
110
|
+
"child_process",
|
|
111
|
+
"net",
|
|
112
|
+
"http",
|
|
113
|
+
"https",
|
|
114
|
+
"shell",
|
|
115
|
+
"process",
|
|
116
|
+
"fetch",
|
|
117
|
+
"Object",
|
|
118
|
+
"Reflect",
|
|
119
|
+
"Proxy",
|
|
120
|
+
"AsyncFunction",
|
|
121
|
+
"phase",
|
|
122
|
+
"parallel",
|
|
123
|
+
"pipeline",
|
|
124
|
+
"args",
|
|
125
|
+
]);
|
|
126
|
+
function report(node, message) {
|
|
127
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_SECURITY_POLICY_VIOLATION, message);
|
|
128
|
+
}
|
|
129
|
+
function staticStringValue(node) {
|
|
130
|
+
if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)) {
|
|
131
|
+
return node.text;
|
|
132
|
+
}
|
|
133
|
+
if (ts.isBinaryExpression(node) && node.operatorToken.kind === ts.SyntaxKind.PlusToken) {
|
|
134
|
+
const left = staticStringValue(node.left);
|
|
135
|
+
const right = staticStringValue(node.right);
|
|
136
|
+
if (left !== null && right !== null) {
|
|
137
|
+
return left + right;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
function visit(node) {
|
|
143
|
+
if (ts.isImportDeclaration(node) || ts.isImportEqualsDeclaration(node)) {
|
|
144
|
+
let isAllowed = false;
|
|
145
|
+
if (ts.isImportDeclaration(node)) {
|
|
146
|
+
if (node.importClause?.isTypeOnly) {
|
|
147
|
+
isAllowed = true;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
const moduleSpecifier = node.moduleSpecifier;
|
|
151
|
+
if (ts.isStringLiteral(moduleSpecifier)) {
|
|
152
|
+
const val = moduleSpecifier.text;
|
|
153
|
+
if (val === "@travisliu/open-dynamic-workflow" || val.includes("define-agent")) {
|
|
154
|
+
isAllowed = true;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (!isAllowed) {
|
|
160
|
+
report(node, `Arbitrary imports are not allowed in shared agent: ${sourcePath}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (ts.isCallExpression(node)) {
|
|
164
|
+
const callee = node.expression;
|
|
165
|
+
if (ts.isIdentifier(callee)) {
|
|
166
|
+
const calleeText = callee.text;
|
|
167
|
+
if (calleeText === "require") {
|
|
168
|
+
report(node, `require() is not supported in shared agent: ${sourcePath}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (node.expression.kind === ts.SyntaxKind.ImportKeyword) {
|
|
172
|
+
report(node, `Dynamic import() is not supported in shared agent: ${sourcePath}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (node.kind === ts.SyntaxKind.ThisKeyword) {
|
|
176
|
+
report(node, `'this' keyword is not allowed in shared agent to prevent sandbox escapes: ${sourcePath}`);
|
|
177
|
+
}
|
|
178
|
+
if (ts.isIdentifier(node)) {
|
|
179
|
+
if (forbiddenIdentifiers.has(node.text)) {
|
|
180
|
+
report(node, `Access to restricted identifier '${node.text}' is not allowed in shared agent: ${sourcePath}`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (ts.isPropertyAccessExpression(node)) {
|
|
184
|
+
const propName = node.name.text;
|
|
185
|
+
if (forbiddenProperties.has(propName)) {
|
|
186
|
+
report(node, `Access to restricted property '${propName}' is not allowed in shared agent: ${sourcePath}`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (ts.isElementAccessExpression(node)) {
|
|
190
|
+
const arg = node.argumentExpression;
|
|
191
|
+
const resolvedValue = staticStringValue(arg);
|
|
192
|
+
if (resolvedValue === null) {
|
|
193
|
+
report(node, `Dynamic element access is not allowed in shared agent to prevent security bypasses: ${sourcePath}`);
|
|
194
|
+
}
|
|
195
|
+
else if (forbiddenProperties.has(resolvedValue)) {
|
|
196
|
+
report(node, `Access to restricted property '${resolvedValue}' via element access is not allowed in shared agent: ${sourcePath}`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
ts.forEachChild(node, visit);
|
|
200
|
+
}
|
|
201
|
+
ts.forEachChild(sourceFile, visit);
|
|
202
|
+
}
|
|
203
|
+
export function validateSharedAgentInput(definition, input) {
|
|
204
|
+
if (input === undefined)
|
|
205
|
+
return {};
|
|
206
|
+
if (!input || typeof input !== "object" || Array.isArray(input)) {
|
|
207
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_CONTEXT_VALIDATION_FAILED, "Shared agent context must be an object.");
|
|
208
|
+
}
|
|
209
|
+
const ctx = input;
|
|
210
|
+
if (ctx.subPrompt !== undefined) {
|
|
211
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_CONTEXT_VALIDATION_FAILED, "Context field 'subPrompt' is deprecated and restricted. Use 'prompt' instead.");
|
|
212
|
+
}
|
|
213
|
+
if (definition.inputSchema) {
|
|
214
|
+
const validate = ajv.compile(definition.inputSchema);
|
|
215
|
+
const valid = validate(ctx);
|
|
216
|
+
if (!valid) {
|
|
217
|
+
const error = ajv.errorsText(validate.errors);
|
|
218
|
+
throw new OpenDynamicWorkflowError(ErrorCode.SHARED_AGENT_CONTEXT_VALIDATION_FAILED, `Shared agent context validation failed: ${error}`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return ctx;
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=validate.js.map
|