@diff-review-system/drs 4.0.0-rc.4 → 4.1.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/.pi/agents/describe/pr-describer.md +14 -0
- package/.pi/agents/review/unified-reviewer.md +33 -7
- package/.pi/agents/task/agents-md-updater.md +3 -1
- package/.pi/agents/task/review-assistant.md +22 -0
- package/.pi/agents/task/review-issue-fixer.md +18 -1
- package/.pi/agents/visual/pr-explainer.md +205 -0
- package/.pi/workflows/github-pr-describe.yaml +10 -7
- package/.pi/workflows/github-pr-fix-review-issues-stacked.yaml +154 -0
- package/.pi/workflows/github-pr-post-comment.yaml +10 -10
- package/.pi/workflows/github-pr-review-post.yaml +18 -8
- package/.pi/workflows/github-pr-review.yaml +354 -7
- package/.pi/workflows/github-pr-show-changes.yaml +8 -8
- package/.pi/workflows/github-pr-update-agents-md-stacked.yaml +103 -0
- package/.pi/workflows/github-pr-visual-explain.yaml +80 -0
- package/.pi/workflows/gitlab-mr-describe.yaml +8 -5
- package/.pi/workflows/gitlab-mr-fix-review-issues-stacked.yaml +150 -0
- package/.pi/workflows/gitlab-mr-post-comment.yaml +8 -8
- package/.pi/workflows/gitlab-mr-review.yaml +354 -5
- package/.pi/workflows/gitlab-mr-show-changes.yaml +6 -6
- package/.pi/workflows/gitlab-mr-update-agents-md-stacked.yaml +100 -0
- package/.pi/workflows/gitlab-mr-visual-explain.yaml +78 -0
- package/.pi/workflows/local-fix-review-issues.yaml +89 -13
- package/.pi/workflows/local-review.yaml +15 -2
- package/.pi/workflows/local-update-agents-md.yaml +1 -1
- package/.pi/workflows/local-visual-explain.yaml +76 -0
- package/.pi/workflows/release-changelog-finalize.yaml +47 -0
- package/.pi/workflows/tag-changelog-update.yaml +4 -4
- package/.pi/workflows/temporal-control-smoke.yaml +63 -0
- package/README.md +130 -27
- package/dist/ci/runner.d.ts.map +1 -1
- package/dist/ci/runner.js +3 -1
- package/dist/ci/runner.js.map +1 -1
- package/dist/cli/index.js +258 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts +6 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +29 -10
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/run-agent.d.ts +4 -7
- package/dist/cli/run-agent.d.ts.map +1 -1
- package/dist/cli/run-agent.js +4 -0
- package/dist/cli/run-agent.js.map +1 -1
- package/dist/cli/workflow-executor-selection.d.ts +3 -0
- package/dist/cli/workflow-executor-selection.d.ts.map +1 -0
- package/dist/cli/workflow-executor-selection.js +15 -0
- package/dist/cli/workflow-executor-selection.js.map +1 -0
- package/dist/cli/workflow.d.ts +76 -26
- package/dist/cli/workflow.d.ts.map +1 -1
- package/dist/cli/workflow.js +1624 -192
- package/dist/cli/workflow.js.map +1 -1
- package/dist/github/client.d.ts +12 -0
- package/dist/github/client.d.ts.map +1 -1
- package/dist/github/client.js +27 -0
- package/dist/github/client.js.map +1 -1
- package/dist/github/platform-adapter.d.ts +6 -1
- package/dist/github/platform-adapter.d.ts.map +1 -1
- package/dist/github/platform-adapter.js +84 -8
- package/dist/github/platform-adapter.js.map +1 -1
- package/dist/gitlab/client.d.ts +11 -0
- package/dist/gitlab/client.d.ts.map +1 -1
- package/dist/gitlab/client.js +11 -0
- package/dist/gitlab/client.js.map +1 -1
- package/dist/gitlab/platform-adapter.d.ts +3 -1
- package/dist/gitlab/platform-adapter.d.ts.map +1 -1
- package/dist/gitlab/platform-adapter.js +32 -1
- package/dist/gitlab/platform-adapter.js.map +1 -1
- package/dist/lib/agent-result.d.ts +8 -0
- package/dist/lib/agent-result.d.ts.map +1 -0
- package/dist/lib/agent-result.js +2 -0
- package/dist/lib/agent-result.js.map +1 -0
- package/dist/lib/comment-formatter.d.ts +8 -0
- package/dist/lib/comment-formatter.d.ts.map +1 -1
- package/dist/lib/comment-formatter.js +12 -4
- package/dist/lib/comment-formatter.js.map +1 -1
- package/dist/lib/comment-poster.d.ts.map +1 -1
- package/dist/lib/comment-poster.js +28 -1
- package/dist/lib/comment-poster.js.map +1 -1
- package/dist/lib/config.d.ts +71 -11
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +163 -28
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/context-compression.d.ts +10 -0
- package/dist/lib/context-compression.d.ts.map +1 -1
- package/dist/lib/context-compression.js +101 -13
- package/dist/lib/context-compression.js.map +1 -1
- package/dist/lib/context-loader.d.ts +2 -1
- package/dist/lib/context-loader.d.ts.map +1 -1
- package/dist/lib/context-loader.js +70 -1
- package/dist/lib/context-loader.js.map +1 -1
- package/dist/lib/describe-core.d.ts.map +1 -1
- package/dist/lib/describe-core.js +3 -2
- package/dist/lib/describe-core.js.map +1 -1
- package/dist/lib/diff-lines.d.ts +9 -0
- package/dist/lib/diff-lines.d.ts.map +1 -1
- package/dist/lib/diff-lines.js +17 -9
- package/dist/lib/diff-lines.js.map +1 -1
- package/dist/lib/exit.js +4 -4
- package/dist/lib/exit.js.map +1 -1
- package/dist/lib/html-artifact.d.ts +14 -0
- package/dist/lib/html-artifact.d.ts.map +1 -0
- package/dist/lib/html-artifact.js +59 -0
- package/dist/lib/html-artifact.js.map +1 -0
- package/dist/lib/issue-parser.js +3 -3
- package/dist/lib/issue-parser.js.map +1 -1
- package/dist/lib/json-output-schema.d.ts +70 -0
- package/dist/lib/json-output-schema.d.ts.map +1 -1
- package/dist/lib/json-output-schema.js +40 -0
- package/dist/lib/json-output-schema.js.map +1 -1
- package/dist/lib/output-paths.d.ts +0 -1
- package/dist/lib/output-paths.d.ts.map +1 -1
- package/dist/lib/output-paths.js +0 -1
- package/dist/lib/output-paths.js.map +1 -1
- package/dist/lib/platform-client.d.ts +26 -0
- package/dist/lib/platform-client.d.ts.map +1 -1
- package/dist/lib/project-setup.d.ts +10 -0
- package/dist/lib/project-setup.d.ts.map +1 -0
- package/dist/lib/project-setup.js +25 -0
- package/dist/lib/project-setup.js.map +1 -0
- package/dist/lib/review-artifact-store.d.ts +16 -0
- package/dist/lib/review-artifact-store.d.ts.map +1 -0
- package/dist/lib/review-artifact-store.js +84 -0
- package/dist/lib/review-artifact-store.js.map +1 -0
- package/dist/lib/review-artifact.d.ts +69 -0
- package/dist/lib/review-artifact.d.ts.map +1 -0
- package/dist/lib/review-artifact.js +172 -0
- package/dist/lib/review-artifact.js.map +1 -0
- package/dist/lib/review-core.d.ts +7 -4
- package/dist/lib/review-core.d.ts.map +1 -1
- package/dist/lib/review-core.js +82 -165
- package/dist/lib/review-core.js.map +1 -1
- package/dist/lib/review-orchestrator.d.ts +23 -0
- package/dist/lib/review-orchestrator.d.ts.map +1 -1
- package/dist/lib/review-orchestrator.js +20 -13
- package/dist/lib/review-orchestrator.js.map +1 -1
- package/dist/lib/review-parser.d.ts.map +1 -1
- package/dist/lib/review-parser.js +15 -12
- package/dist/lib/review-parser.js.map +1 -1
- package/dist/lib/review-usage.d.ts +4 -0
- package/dist/lib/review-usage.d.ts.map +1 -1
- package/dist/lib/review-usage.js +25 -0
- package/dist/lib/review-usage.js.map +1 -1
- package/dist/lib/skills.d.ts +16 -0
- package/dist/lib/skills.d.ts.map +1 -0
- package/dist/lib/skills.js +140 -0
- package/dist/lib/skills.js.map +1 -0
- package/dist/lib/trace-collector.d.ts +105 -0
- package/dist/lib/trace-collector.d.ts.map +1 -0
- package/dist/lib/trace-collector.js +255 -0
- package/dist/lib/trace-collector.js.map +1 -0
- package/dist/lib/trace-html.d.ts +3 -0
- package/dist/lib/trace-html.d.ts.map +1 -0
- package/dist/lib/trace-html.js +349 -0
- package/dist/lib/trace-html.js.map +1 -0
- package/dist/lib/workflow/artifact-store.d.ts +71 -0
- package/dist/lib/workflow/artifact-store.d.ts.map +1 -0
- package/dist/lib/workflow/artifact-store.js +121 -0
- package/dist/lib/workflow/artifact-store.js.map +1 -0
- package/dist/lib/workflow/compiled-plan.d.ts +87 -0
- package/dist/lib/workflow/compiled-plan.d.ts.map +1 -0
- package/dist/lib/workflow/compiled-plan.js +62 -0
- package/dist/lib/workflow/compiled-plan.js.map +1 -0
- package/dist/lib/workflow/executor.d.ts +18 -0
- package/dist/lib/workflow/executor.d.ts.map +1 -0
- package/dist/lib/workflow/executor.js +2 -0
- package/dist/lib/workflow/executor.js.map +1 -0
- package/dist/lib/workflow/graph.d.ts +30 -0
- package/dist/lib/workflow/graph.d.ts.map +1 -0
- package/dist/lib/workflow/graph.js +139 -0
- package/dist/lib/workflow/graph.js.map +1 -0
- package/dist/lib/workflow/input.d.ts +4 -0
- package/dist/lib/workflow/input.d.ts.map +1 -0
- package/dist/lib/workflow/input.js +4 -0
- package/dist/lib/workflow/input.js.map +1 -0
- package/dist/lib/workflow/node-executor.d.ts +19 -0
- package/dist/lib/workflow/node-executor.d.ts.map +1 -0
- package/dist/lib/workflow/node-executor.js +2 -0
- package/dist/lib/workflow/node-executor.js.map +1 -0
- package/dist/lib/workflow/planning.d.ts +51 -0
- package/dist/lib/workflow/planning.d.ts.map +1 -0
- package/dist/lib/workflow/planning.js +814 -0
- package/dist/lib/workflow/planning.js.map +1 -0
- package/dist/lib/workflow/types.d.ts +66 -0
- package/dist/lib/workflow/types.d.ts.map +1 -0
- package/dist/lib/workflow/types.js +2 -0
- package/dist/lib/workflow/types.js.map +1 -0
- package/dist/lib/workflow-artifacts.d.ts +54 -0
- package/dist/lib/workflow-artifacts.d.ts.map +1 -0
- package/dist/lib/workflow-artifacts.js +150 -0
- package/dist/lib/workflow-artifacts.js.map +1 -0
- package/dist/lib/write-json-output.d.ts.map +1 -1
- package/dist/lib/write-json-output.js +3 -8
- package/dist/lib/write-json-output.js.map +1 -1
- package/dist/pi/sdk.d.ts.map +1 -1
- package/dist/pi/sdk.js +576 -8
- package/dist/pi/sdk.js.map +1 -1
- package/dist/runtime/agent-loader.js +2 -2
- package/dist/runtime/built-in-paths.d.ts +1 -0
- package/dist/runtime/built-in-paths.d.ts.map +1 -1
- package/dist/runtime/built-in-paths.js +7 -0
- package/dist/runtime/built-in-paths.js.map +1 -1
- package/dist/runtime/client.d.ts +2 -0
- package/dist/runtime/client.d.ts.map +1 -1
- package/dist/runtime/client.js +11 -5
- package/dist/runtime/client.js.map +1 -1
- package/dist/temporal/activities.d.ts +26 -0
- package/dist/temporal/activities.d.ts.map +1 -0
- package/dist/temporal/activities.js +219 -0
- package/dist/temporal/activities.js.map +1 -0
- package/dist/temporal/config.d.ts +4 -0
- package/dist/temporal/config.d.ts.map +1 -0
- package/dist/temporal/config.js +36 -0
- package/dist/temporal/config.js.map +1 -0
- package/dist/temporal/executor.d.ts +7 -0
- package/dist/temporal/executor.d.ts.map +1 -0
- package/dist/temporal/executor.js +233 -0
- package/dist/temporal/executor.js.map +1 -0
- package/dist/temporal/retry-policy.d.ts +28 -0
- package/dist/temporal/retry-policy.d.ts.map +1 -0
- package/dist/temporal/retry-policy.js +56 -0
- package/dist/temporal/retry-policy.js.map +1 -0
- package/dist/temporal/types.d.ts +86 -0
- package/dist/temporal/types.d.ts.map +1 -0
- package/dist/temporal/types.js +2 -0
- package/dist/temporal/types.js.map +1 -0
- package/dist/temporal/worker.d.ts +3 -0
- package/dist/temporal/worker.d.ts.map +1 -0
- package/dist/temporal/worker.js +18 -0
- package/dist/temporal/worker.js.map +1 -0
- package/dist/temporal/workflow-id.d.ts +27 -0
- package/dist/temporal/workflow-id.d.ts.map +1 -0
- package/dist/temporal/workflow-id.js +53 -0
- package/dist/temporal/workflow-id.js.map +1 -0
- package/dist/temporal/workflows.d.ts +6 -0
- package/dist/temporal/workflows.d.ts.map +1 -0
- package/dist/temporal/workflows.js +342 -0
- package/dist/temporal/workflows.js.map +1 -0
- package/package.json +26 -15
- package/.pi/workflows/github-pr-describe-post.yaml +0 -24
- package/.pi/workflows/gitlab-mr-describe-post.yaml +0 -22
- package/.pi/workflows/gitlab-mr-review-code-quality.yaml +0 -31
- package/.pi/workflows/gitlab-mr-review-post-code-quality.yaml +0 -40
- package/.pi/workflows/gitlab-mr-review-post.yaml +0 -30
- package/.pi/workflows/local-staged-review.yaml +0 -17
- package/dist/cli/run-agent.test.d.ts +0 -2
- package/dist/cli/run-agent.test.d.ts.map +0 -1
- package/dist/cli/run-agent.test.js +0 -204
- package/dist/cli/run-agent.test.js.map +0 -1
- package/dist/cli/workflow.test.d.ts +0 -2
- package/dist/cli/workflow.test.d.ts.map +0 -1
- package/dist/cli/workflow.test.js +0 -1410
- package/dist/cli/workflow.test.js.map +0 -1
- package/dist/github/client.test.d.ts +0 -2
- package/dist/github/client.test.d.ts.map +0 -1
- package/dist/github/client.test.js +0 -206
- package/dist/github/client.test.js.map +0 -1
- package/dist/github/platform-adapter.test.d.ts +0 -2
- package/dist/github/platform-adapter.test.d.ts.map +0 -1
- package/dist/github/platform-adapter.test.js +0 -40
- package/dist/github/platform-adapter.test.js.map +0 -1
- package/dist/gitlab/diff-parser.test.d.ts +0 -2
- package/dist/gitlab/diff-parser.test.d.ts.map +0 -1
- package/dist/gitlab/diff-parser.test.js +0 -315
- package/dist/gitlab/diff-parser.test.js.map +0 -1
- package/dist/gitlab/platform-adapter.test.d.ts +0 -2
- package/dist/gitlab/platform-adapter.test.d.ts.map +0 -1
- package/dist/gitlab/platform-adapter.test.js +0 -21
- package/dist/gitlab/platform-adapter.test.js.map +0 -1
- package/dist/index.test.d.ts +0 -2
- package/dist/index.test.d.ts.map +0 -1
- package/dist/index.test.js +0 -7
- package/dist/index.test.js.map +0 -1
- package/dist/lib/code-quality-report.test.d.ts +0 -2
- package/dist/lib/code-quality-report.test.d.ts.map +0 -1
- package/dist/lib/code-quality-report.test.js +0 -327
- package/dist/lib/code-quality-report.test.js.map +0 -1
- package/dist/lib/comment-formatter.test.d.ts +0 -2
- package/dist/lib/comment-formatter.test.d.ts.map +0 -1
- package/dist/lib/comment-formatter.test.js +0 -727
- package/dist/lib/comment-formatter.test.js.map +0 -1
- package/dist/lib/comment-manager.test.d.ts +0 -2
- package/dist/lib/comment-manager.test.d.ts.map +0 -1
- package/dist/lib/comment-manager.test.js +0 -680
- package/dist/lib/comment-manager.test.js.map +0 -1
- package/dist/lib/comment-poster.test.d.ts +0 -5
- package/dist/lib/comment-poster.test.d.ts.map +0 -1
- package/dist/lib/comment-poster.test.js +0 -255
- package/dist/lib/comment-poster.test.js.map +0 -1
- package/dist/lib/config-model-overrides.test.d.ts +0 -2
- package/dist/lib/config-model-overrides.test.d.ts.map +0 -1
- package/dist/lib/config-model-overrides.test.js +0 -218
- package/dist/lib/config-model-overrides.test.js.map +0 -1
- package/dist/lib/config.test.d.ts +0 -2
- package/dist/lib/config.test.d.ts.map +0 -1
- package/dist/lib/config.test.js +0 -353
- package/dist/lib/config.test.js.map +0 -1
- package/dist/lib/context-compression.test.d.ts +0 -2
- package/dist/lib/context-compression.test.d.ts.map +0 -1
- package/dist/lib/context-compression.test.js +0 -337
- package/dist/lib/context-compression.test.js.map +0 -1
- package/dist/lib/context-loader.test.d.ts +0 -2
- package/dist/lib/context-loader.test.d.ts.map +0 -1
- package/dist/lib/context-loader.test.js +0 -212
- package/dist/lib/context-loader.test.js.map +0 -1
- package/dist/lib/cursor-fix-link.test.d.ts +0 -2
- package/dist/lib/cursor-fix-link.test.d.ts.map +0 -1
- package/dist/lib/cursor-fix-link.test.js +0 -70
- package/dist/lib/cursor-fix-link.test.js.map +0 -1
- package/dist/lib/describe-core.test.d.ts +0 -2
- package/dist/lib/describe-core.test.d.ts.map +0 -1
- package/dist/lib/describe-core.test.js +0 -208
- package/dist/lib/describe-core.test.js.map +0 -1
- package/dist/lib/describe-output-path.test.d.ts +0 -2
- package/dist/lib/describe-output-path.test.d.ts.map +0 -1
- package/dist/lib/describe-output-path.test.js +0 -51
- package/dist/lib/describe-output-path.test.js.map +0 -1
- package/dist/lib/describe-parser.test.d.ts +0 -2
- package/dist/lib/describe-parser.test.d.ts.map +0 -1
- package/dist/lib/describe-parser.test.js +0 -282
- package/dist/lib/describe-parser.test.js.map +0 -1
- package/dist/lib/description-executor.test.d.ts +0 -2
- package/dist/lib/description-executor.test.d.ts.map +0 -1
- package/dist/lib/description-executor.test.js +0 -135
- package/dist/lib/description-executor.test.js.map +0 -1
- package/dist/lib/description-formatter.test.d.ts +0 -2
- package/dist/lib/description-formatter.test.d.ts.map +0 -1
- package/dist/lib/description-formatter.test.js +0 -57
- package/dist/lib/description-formatter.test.js.map +0 -1
- package/dist/lib/diff-lines.test.d.ts +0 -2
- package/dist/lib/diff-lines.test.d.ts.map +0 -1
- package/dist/lib/diff-lines.test.js +0 -13
- package/dist/lib/diff-lines.test.js.map +0 -1
- package/dist/lib/diff-parser.test.d.ts +0 -2
- package/dist/lib/diff-parser.test.d.ts.map +0 -1
- package/dist/lib/diff-parser.test.js +0 -335
- package/dist/lib/diff-parser.test.js.map +0 -1
- package/dist/lib/error-comment-poster.test.d.ts +0 -2
- package/dist/lib/error-comment-poster.test.d.ts.map +0 -1
- package/dist/lib/error-comment-poster.test.js +0 -128
- package/dist/lib/error-comment-poster.test.js.map +0 -1
- package/dist/lib/exit.test.d.ts +0 -2
- package/dist/lib/exit.test.d.ts.map +0 -1
- package/dist/lib/exit.test.js +0 -120
- package/dist/lib/exit.test.js.map +0 -1
- package/dist/lib/issue-parser.test.d.ts +0 -2
- package/dist/lib/issue-parser.test.d.ts.map +0 -1
- package/dist/lib/issue-parser.test.js +0 -281
- package/dist/lib/issue-parser.test.js.map +0 -1
- package/dist/lib/json-output-schema.test.d.ts +0 -2
- package/dist/lib/json-output-schema.test.d.ts.map +0 -1
- package/dist/lib/json-output-schema.test.js +0 -92
- package/dist/lib/json-output-schema.test.js.map +0 -1
- package/dist/lib/json-output.test.d.ts +0 -2
- package/dist/lib/json-output.test.d.ts.map +0 -1
- package/dist/lib/json-output.test.js +0 -141
- package/dist/lib/json-output.test.js.map +0 -1
- package/dist/lib/logger.test.d.ts +0 -2
- package/dist/lib/logger.test.d.ts.map +0 -1
- package/dist/lib/logger.test.js +0 -324
- package/dist/lib/logger.test.js.map +0 -1
- package/dist/lib/position-validator.test.d.ts +0 -2
- package/dist/lib/position-validator.test.d.ts.map +0 -1
- package/dist/lib/position-validator.test.js +0 -128
- package/dist/lib/position-validator.test.js.map +0 -1
- package/dist/lib/prompt-budget.test.d.ts +0 -2
- package/dist/lib/prompt-budget.test.d.ts.map +0 -1
- package/dist/lib/prompt-budget.test.js +0 -55
- package/dist/lib/prompt-budget.test.js.map +0 -1
- package/dist/lib/repository-validator.test.d.ts +0 -5
- package/dist/lib/repository-validator.test.d.ts.map +0 -1
- package/dist/lib/repository-validator.test.js +0 -341
- package/dist/lib/repository-validator.test.js.map +0 -1
- package/dist/lib/review-core.test.d.ts +0 -2
- package/dist/lib/review-core.test.d.ts.map +0 -1
- package/dist/lib/review-core.test.js +0 -614
- package/dist/lib/review-core.test.js.map +0 -1
- package/dist/lib/review-orchestrator.test.d.ts +0 -2
- package/dist/lib/review-orchestrator.test.d.ts.map +0 -1
- package/dist/lib/review-orchestrator.test.js +0 -552
- package/dist/lib/review-orchestrator.test.js.map +0 -1
- package/dist/lib/review-output-path.test.d.ts +0 -2
- package/dist/lib/review-output-path.test.d.ts.map +0 -1
- package/dist/lib/review-output-path.test.js +0 -83
- package/dist/lib/review-output-path.test.js.map +0 -1
- package/dist/lib/review-parser.test.d.ts +0 -2
- package/dist/lib/review-parser.test.d.ts.map +0 -1
- package/dist/lib/review-parser.test.js +0 -130
- package/dist/lib/review-parser.test.js.map +0 -1
- package/dist/lib/review-usage.test.d.ts +0 -2
- package/dist/lib/review-usage.test.d.ts.map +0 -1
- package/dist/lib/review-usage.test.js +0 -83
- package/dist/lib/review-usage.test.js.map +0 -1
- package/dist/lib/unified-review-executor.d.ts +0 -58
- package/dist/lib/unified-review-executor.d.ts.map +0 -1
- package/dist/lib/unified-review-executor.js +0 -201
- package/dist/lib/unified-review-executor.js.map +0 -1
- package/dist/lib/unified-review-executor.test.d.ts +0 -5
- package/dist/lib/unified-review-executor.test.d.ts.map +0 -1
- package/dist/lib/unified-review-executor.test.js +0 -472
- package/dist/lib/unified-review-executor.test.js.map +0 -1
- package/dist/lib/write-json-output.test.d.ts +0 -2
- package/dist/lib/write-json-output.test.d.ts.map +0 -1
- package/dist/lib/write-json-output.test.js +0 -259
- package/dist/lib/write-json-output.test.js.map +0 -1
- package/dist/pi/sdk.test.d.ts +0 -2
- package/dist/pi/sdk.test.d.ts.map +0 -1
- package/dist/pi/sdk.test.js +0 -488
- package/dist/pi/sdk.test.js.map +0 -1
- package/dist/runtime/agent-loader.test.d.ts +0 -2
- package/dist/runtime/agent-loader.test.d.ts.map +0 -1
- package/dist/runtime/agent-loader.test.js +0 -277
- package/dist/runtime/agent-loader.test.js.map +0 -1
- package/dist/runtime/client.test.d.ts +0 -2
- package/dist/runtime/client.test.d.ts.map +0 -1
- package/dist/runtime/client.test.js +0 -772
- package/dist/runtime/client.test.js.map +0 -1
- package/dist/runtime/path-config.test.d.ts +0 -2
- package/dist/runtime/path-config.test.d.ts.map +0 -1
- package/dist/runtime/path-config.test.js +0 -112
- package/dist/runtime/path-config.test.js.map +0 -1
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
export function renderTraceHtml(trace) {
|
|
2
|
+
const traces = trace.agentTraces;
|
|
3
|
+
const totalCost = traces.reduce((sum, t) => sum + (t.totalUsage?.cost?.total ?? 0), 0);
|
|
4
|
+
const totalInputTokens = traces.reduce((sum, t) => sum + (t.totalUsage?.input ?? 0), 0);
|
|
5
|
+
const totalOutputTokens = traces.reduce((sum, t) => sum + (t.totalUsage?.output ?? 0), 0);
|
|
6
|
+
const totalCacheRead = traces.reduce((sum, t) => sum + (t.totalUsage?.cacheRead ?? 0), 0);
|
|
7
|
+
const totalToolCalls = traces.reduce((sum, t) => sum + t.toolCallCount, 0);
|
|
8
|
+
const totalDurationMs = traces.reduce((sum, t) => sum + (t.durationMs ?? 0), 0);
|
|
9
|
+
const totalTurns = traces.reduce((sum, t) => sum + t.turns.length, 0);
|
|
10
|
+
const invocationNodes = traces.map((t, i) => renderInvocationNode(t, i)).join('');
|
|
11
|
+
const traceDataJson = JSON.stringify(trace).replace(/</g, '\\u003c').replace(/>/g, '\\u003e');
|
|
12
|
+
return `<!DOCTYPE html>
|
|
13
|
+
<html lang="en">
|
|
14
|
+
<head>
|
|
15
|
+
<meta charset="UTF-8">
|
|
16
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
17
|
+
<title>DRS Trace — ${escapeHtml(trace.workflowName)}</title>
|
|
18
|
+
<style>
|
|
19
|
+
${TRACE_CSS}
|
|
20
|
+
</style>
|
|
21
|
+
</head>
|
|
22
|
+
<body>
|
|
23
|
+
<div id="app">
|
|
24
|
+
<header id="topbar">
|
|
25
|
+
<div class="header-left">
|
|
26
|
+
<h1>DRS Trace Explorer</h1>
|
|
27
|
+
<span class="workflow-name">${escapeHtml(trace.workflowName)}</span>
|
|
28
|
+
</div>
|
|
29
|
+
<div class="header-stats">
|
|
30
|
+
<span class="stat">Agents: <b>${traces.length}</b></span>
|
|
31
|
+
<span class="stat">Turns: <b>${totalTurns}</b></span>
|
|
32
|
+
<span class="stat">Tool Calls: <b>${totalToolCalls}</b></span>
|
|
33
|
+
<span class="stat">Input: <b>${formatTokens(totalInputTokens)}</b></span>
|
|
34
|
+
<span class="stat">Output: <b>${formatTokens(totalOutputTokens)}</b></span>
|
|
35
|
+
<span class="stat">Cache Read: <b>${formatTokens(totalCacheRead)}</b></span>
|
|
36
|
+
<span class="stat">Cost: <b>$${totalCost.toFixed(4)}</b></span>
|
|
37
|
+
<span class="stat">Duration: <b>${formatDuration(totalDurationMs)}</b></span>
|
|
38
|
+
</div>
|
|
39
|
+
</header>
|
|
40
|
+
<main>
|
|
41
|
+
<nav id="tree">
|
|
42
|
+
<div class="search-bar">
|
|
43
|
+
<input type="text" id="search" placeholder="Search..." oninput="filterTree(this.value)" />
|
|
44
|
+
</div>
|
|
45
|
+
<div id="tree-content">${invocationNodes}</div>
|
|
46
|
+
</nav>
|
|
47
|
+
<section id="detail">
|
|
48
|
+
<div class="detail-empty">Select a node to inspect</div>
|
|
49
|
+
</section>
|
|
50
|
+
</main>
|
|
51
|
+
</div>
|
|
52
|
+
<script>
|
|
53
|
+
${buildTraceJs(traceDataJson)}
|
|
54
|
+
</script>
|
|
55
|
+
</body>
|
|
56
|
+
</html>`;
|
|
57
|
+
}
|
|
58
|
+
function renderInvocationNode(trace, _index) {
|
|
59
|
+
const statusClass = trace.errorMessage ? 'error' : 'ok';
|
|
60
|
+
const label = trace.workflowIteration
|
|
61
|
+
? `${trace.nodeId} (iter ${trace.workflowIteration})`
|
|
62
|
+
: trace.nodeId;
|
|
63
|
+
const cost = trace.totalUsage?.cost?.total ?? 0;
|
|
64
|
+
const inputTokens = trace.totalUsage?.input ?? 0;
|
|
65
|
+
const outputTokens = trace.totalUsage?.output ?? 0;
|
|
66
|
+
const turnNodes = trace.turns.map((turn) => renderTurnNode(trace.id, turn)).join('');
|
|
67
|
+
return `<div class="tree-node invocation" data-trace-id="${trace.id}" data-node-id="${escapeHtml(trace.nodeId)}" data-agent="${escapeHtml(trace.agentId)}" onclick="selectNode(event, 'invocation', '${trace.id}')">
|
|
68
|
+
<div class="node-header ${statusClass}">
|
|
69
|
+
<span class="node-icon">Agent</span>
|
|
70
|
+
<span class="node-label">${escapeHtml(label)}</span>
|
|
71
|
+
<span class="node-meta">${escapeHtml(trace.agentId)} · ${formatDuration(trace.durationMs ?? 0)} · ${formatTokens(inputTokens)}→${formatTokens(outputTokens)} · $${cost.toFixed(4)}</span>
|
|
72
|
+
</div>
|
|
73
|
+
<div class="tree-children">
|
|
74
|
+
${turnNodes}
|
|
75
|
+
</div>
|
|
76
|
+
</div>`;
|
|
77
|
+
}
|
|
78
|
+
function renderTurnNode(traceId, turn) {
|
|
79
|
+
const nodeId = `${traceId}-turn-${turn.turnIndex}`;
|
|
80
|
+
const toolNodes = turn.toolCalls
|
|
81
|
+
.map((tc) => renderToolNode(traceId, turn.turnIndex, tc))
|
|
82
|
+
.join('');
|
|
83
|
+
const usage = turn.usage;
|
|
84
|
+
const usageBadge = usage
|
|
85
|
+
? `${formatTokens(usage.input)}→${formatTokens(usage.output)} · $${(usage.cost?.total ?? 0).toFixed(4)}`
|
|
86
|
+
: '';
|
|
87
|
+
return `<div class="tree-node turn" data-node-id="${nodeId}" onclick="selectNode(event, 'turn', '${nodeId}')">
|
|
88
|
+
<div class="node-header">
|
|
89
|
+
<span class="node-icon">Turn ${turn.turnIndex}</span>
|
|
90
|
+
<span class="node-meta">${formatDuration(turn.durationMs ?? 0)}${usageBadge ? ' · ' + usageBadge : ''}${turn.stopReason ? ' · ' + escapeHtml(turn.stopReason) : ''}${turn.model ? ' · ' + escapeHtml(turn.model) : ''}</span>
|
|
91
|
+
</div>
|
|
92
|
+
<div class="tree-children">
|
|
93
|
+
${toolNodes}
|
|
94
|
+
</div>
|
|
95
|
+
</div>`;
|
|
96
|
+
}
|
|
97
|
+
function renderToolNode(traceId, turnIndex, tc) {
|
|
98
|
+
const nodeId = `${traceId}-turn-${turnIndex}-tool-${tc.toolCallId}`;
|
|
99
|
+
const statusClass = tc.isError ? 'error' : 'ok';
|
|
100
|
+
return `<div class="tree-node tool" data-node-id="${nodeId}" onclick="selectNode(event, 'tool', '${nodeId}')">
|
|
101
|
+
<div class="node-header ${statusClass}">
|
|
102
|
+
<span class="node-icon">${escapeHtml(tc.toolName)}</span>
|
|
103
|
+
<span class="node-meta">${formatDuration(tc.durationMs)}</span>
|
|
104
|
+
</div>
|
|
105
|
+
</div>`;
|
|
106
|
+
}
|
|
107
|
+
const TRACE_CSS = `
|
|
108
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
109
|
+
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; font-size: 13px; background: #0f1117; color: #e0e0e0; }
|
|
110
|
+
#app { display: flex; flex-direction: column; height: 100vh; }
|
|
111
|
+
#topbar { display: flex; justify-content: space-between; align-items: center; padding: 8px 16px; background: #161821; border-bottom: 1px solid #2a2d3a; flex-shrink: 0; }
|
|
112
|
+
.header-left { display: flex; align-items: center; gap: 12px; }
|
|
113
|
+
.header-left h1 { font-size: 15px; font-weight: 600; color: #7c8aff; }
|
|
114
|
+
.workflow-name { color: #888; font-size: 12px; }
|
|
115
|
+
.header-stats { display: flex; gap: 12px; flex-wrap: wrap; }
|
|
116
|
+
.stat { font-size: 11px; color: #888; }
|
|
117
|
+
.stat b { color: #e0e0e0; }
|
|
118
|
+
main { display: flex; flex: 1; overflow: hidden; }
|
|
119
|
+
#tree { width: 400px; min-width: 300px; max-width: 600px; border-right: 1px solid #2a2d3a; overflow-y: auto; background: #12131a; flex-shrink: 0; }
|
|
120
|
+
#tree-content { padding: 4px; }
|
|
121
|
+
.search-bar { padding: 8px; position: sticky; top: 0; background: #12131a; z-index: 1; }
|
|
122
|
+
.search-bar input { width: 100%; padding: 6px 10px; background: #1a1c28; border: 1px solid #2a2d3a; border-radius: 6px; color: #e0e0e0; font-size: 12px; }
|
|
123
|
+
.search-bar input:focus { outline: none; border-color: #7c8aff; }
|
|
124
|
+
.tree-node { margin: 2px 0; }
|
|
125
|
+
.node-header { display: flex; align-items: center; gap: 6px; padding: 4px 8px; border-radius: 4px; cursor: pointer; flex-wrap: wrap; }
|
|
126
|
+
.node-header:hover { background: #1e2030; }
|
|
127
|
+
.node-header.ok { border-left: 3px solid #22c55e; }
|
|
128
|
+
.node-header.error { border-left: 3px solid #ef4444; }
|
|
129
|
+
.node-icon { font-weight: 600; font-size: 11px; color: #7c8aff; min-width: 60px; }
|
|
130
|
+
.node-label { font-weight: 500; color: #e0e0e0; }
|
|
131
|
+
.node-meta { color: #666; font-size: 10px; margin-left: auto; }
|
|
132
|
+
.tree-children { margin-left: 16px; border-left: 1px solid #2a2d3a; padding-left: 4px; }
|
|
133
|
+
.tree-node.tool .node-icon { color: #c9a227; min-width: auto; }
|
|
134
|
+
.tree-node.turn .node-icon { color: #22c55e; }
|
|
135
|
+
.tree-node.invocation .node-icon { color: #7c8aff; }
|
|
136
|
+
.tree-node.hidden { display: none; }
|
|
137
|
+
#detail { flex: 1; overflow-y: auto; padding: 16px; background: #0f1117; }
|
|
138
|
+
.detail-empty { color: #555; text-align: center; padding: 40px; }
|
|
139
|
+
.detail-section { margin-bottom: 16px; }
|
|
140
|
+
.detail-section h3 { font-size: 12px; color: #7c8aff; margin-bottom: 6px; text-transform: uppercase; letter-spacing: 0.5px; }
|
|
141
|
+
.detail-badges { display: flex; gap: 6px; flex-wrap: wrap; margin-bottom: 12px; }
|
|
142
|
+
.badge { padding: 2px 8px; border-radius: 4px; font-size: 11px; font-weight: 500; }
|
|
143
|
+
.badge-duration { background: #1a2a3a; color: #66ccff; }
|
|
144
|
+
.badge-tokens { background: #1a3a2a; color: #66ff99; }
|
|
145
|
+
.badge-cost { background: #3a2a1a; color: #ffcc66; }
|
|
146
|
+
.badge-model { background: #2a1a3a; color: #cc99ff; }
|
|
147
|
+
.badge-error { background: #3a1a1a; color: #ff6666; }
|
|
148
|
+
.badge-stop { background: #1a1a2a; color: #8888cc; }
|
|
149
|
+
.detail-json { background: #161821; border: 1px solid #2a2d3a; border-radius: 6px; padding: 12px; font-family: 'SF Mono', 'Monaco', 'Consolas', monospace; font-size: 11px; white-space: pre-wrap; word-break: break-all; overflow-x: auto; max-height: 400px; overflow-y: auto; }
|
|
150
|
+
.detail-text { background: #161821; border: 1px solid #2a2d3a; border-radius: 6px; padding: 12px; white-space: pre-wrap; word-break: break-word; max-height: 400px; overflow-y: auto; font-size: 12px; line-height: 1.5; }
|
|
151
|
+
.detail-prompt { background: #161821; border: 1px solid #2a2d3a; border-radius: 6px; padding: 12px; white-space: pre-wrap; word-break: break-word; max-height: 300px; overflow-y: auto; font-size: 11px; line-height: 1.4; color: #aaa; }
|
|
152
|
+
.tool-result-ok { color: #66ff99; }
|
|
153
|
+
.tool-result-error { color: #ff6666; }
|
|
154
|
+
`;
|
|
155
|
+
function buildTraceJs(traceDataJson) {
|
|
156
|
+
return `
|
|
157
|
+
const TRACE_DATA = ${traceDataJson};
|
|
158
|
+
|
|
159
|
+
function selectNode(event, type, nodeId) {
|
|
160
|
+
event.stopPropagation();
|
|
161
|
+
document.querySelectorAll('.node-header').forEach(el => el.classList.remove('selected'));
|
|
162
|
+
event.currentTarget.classList.add('selected');
|
|
163
|
+
renderDetail(type, nodeId);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function renderDetail(type, nodeId) {
|
|
167
|
+
const detail = document.getElementById('detail');
|
|
168
|
+
const data = findNodeData(type, nodeId);
|
|
169
|
+
if (!data) {
|
|
170
|
+
detail.innerHTML = '<div class="detail-empty">No data found for ' + escapeHtml(nodeId) + '</div>';
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
detail.innerHTML = renderDetailHtml(type, data);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function findNodeData(type, nodeId) {
|
|
177
|
+
for (const trace of TRACE_DATA.agentTraces) {
|
|
178
|
+
if (type === 'invocation' && trace.id === nodeId) return { type, trace };
|
|
179
|
+
for (const turn of trace.turns) {
|
|
180
|
+
const turnId = trace.id + '-turn-' + turn.turnIndex;
|
|
181
|
+
if (type === 'turn' && turnId === nodeId) return { type, turn, trace };
|
|
182
|
+
for (const tc of turn.toolCalls) {
|
|
183
|
+
const tcId = trace.id + '-turn-' + turn.turnIndex + '-tool-' + tc.toolCallId;
|
|
184
|
+
if (type === 'tool' && tcId === nodeId) return { type, toolCall: tc, turn, trace };
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
function renderDetailHtml(type, data) {
|
|
192
|
+
if (type === 'invocation') return renderInvocationDetail(data.trace);
|
|
193
|
+
if (type === 'turn') return renderTurnDetail(data.turn, data.trace);
|
|
194
|
+
if (type === 'tool') return renderToolDetail(data.toolCall, data.turn);
|
|
195
|
+
return '<div class="detail-empty">Unknown type</div>';
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function renderInvocationDetail(trace) {
|
|
199
|
+
const usage = trace.totalUsage || {};
|
|
200
|
+
const cost = (usage.cost && usage.cost.total) || 0;
|
|
201
|
+
let html = '<div class="detail-section"><h3>Agent Invocation</h3>';
|
|
202
|
+
html += '<div class="detail-badges">';
|
|
203
|
+
html += badge('duration', formatDuration(trace.durationMs || 0));
|
|
204
|
+
html += badge('tokens', formatTokens(usage.input || 0) + ' in / ' + formatTokens(usage.output || 0) + ' out');
|
|
205
|
+
html += badge('cost', '$' + cost.toFixed(4));
|
|
206
|
+
if (trace.model) html += badge('model', trace.model);
|
|
207
|
+
if (trace.provider) html += badge('model', trace.provider);
|
|
208
|
+
html += '</div></div>';
|
|
209
|
+
html += '<div class="detail-section"><h3>Node</h3><div class="detail-text">' + escapeHtml(trace.nodeId) + '</div></div>';
|
|
210
|
+
html += '<div class="detail-section"><h3>Agent</h3><div class="detail-text">' + escapeHtml(trace.agentId) + '</div></div>';
|
|
211
|
+
if (trace.workflowIteration) {
|
|
212
|
+
html += '<div class="detail-section"><h3>Workflow Iteration</h3><div class="detail-text">' + trace.workflowIteration + '</div></div>';
|
|
213
|
+
}
|
|
214
|
+
if (trace.skillsLoaded && trace.skillsLoaded.length > 0) {
|
|
215
|
+
html += '<div class="detail-section"><h3>Skills Loaded</h3><div class="detail-text">' + trace.skillsLoaded.map(escapeHtml).join(', ') + '</div></div>';
|
|
216
|
+
}
|
|
217
|
+
if (trace.errorMessage) {
|
|
218
|
+
html += '<div class="detail-section"><h3>Error</h3><div class="detail-text" style="color:#ff6666">' + escapeHtml(trace.errorMessage) + '</div></div>';
|
|
219
|
+
}
|
|
220
|
+
html += '<div class="detail-section"><h3>Prompt (' + trace.prompt.length + ' chars)</h3><div class="detail-prompt">' + escapeHtml(trace.prompt) + '</div></div>';
|
|
221
|
+
if (trace.systemPrompt) {
|
|
222
|
+
html += '<div class="detail-section"><h3>System Prompt (' + trace.systemPrompt.length + ' chars)</h3><div class="detail-prompt">' + escapeHtml(trace.systemPrompt) + '</div></div>';
|
|
223
|
+
}
|
|
224
|
+
html += '<div class="detail-section"><h3>Turns (' + trace.turns.length + ')</h3>';
|
|
225
|
+
html += '<div class="detail-text">' + trace.turns.map(function(t) {
|
|
226
|
+
return 'Turn ' + t.turnIndex + ': ' + (t.toolCalls.length) + ' tool calls, ' + formatDuration(t.durationMs || 0) + ', ' + formatTokens((t.usage && t.usage.input) || 0) + ' in';
|
|
227
|
+
}).join('\\n') + '</div></div>';
|
|
228
|
+
return html;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
function renderTurnDetail(turn, trace) {
|
|
232
|
+
const usage = turn.usage || {};
|
|
233
|
+
const cost = (usage.cost && usage.cost.total) || 0;
|
|
234
|
+
let html = '<div class="detail-section"><h3>Turn ' + turn.turnIndex + '</h3>';
|
|
235
|
+
html += '<div class="detail-badges">';
|
|
236
|
+
html += badge('duration', formatDuration(turn.durationMs || 0));
|
|
237
|
+
html += badge('tokens', formatTokens(usage.input || 0) + ' in / ' + formatTokens(usage.output || 0) + ' out');
|
|
238
|
+
if (usage.cacheRead) html += badge('tokens', 'cache: ' + formatTokens(usage.cacheRead));
|
|
239
|
+
html += badge('cost', '$' + cost.toFixed(4));
|
|
240
|
+
if (turn.model) html += badge('model', turn.model);
|
|
241
|
+
if (turn.responseModel && turn.responseModel !== turn.model) html += badge('model', 'resp: ' + turn.responseModel);
|
|
242
|
+
if (turn.stopReason) html += badge('stop', turn.stopReason);
|
|
243
|
+
html += '</div></div>';
|
|
244
|
+
if (turn.thinkingContent) {
|
|
245
|
+
html += '<div class="detail-section"><h3>Thinking</h3><div class="detail-text">' + escapeHtml(turn.thinkingContent) + '</div></div>';
|
|
246
|
+
}
|
|
247
|
+
if (turn.assistantContent) {
|
|
248
|
+
html += '<div class="detail-section"><h3>Response</h3><div class="detail-text">' + escapeHtml(turn.assistantContent) + '</div></div>';
|
|
249
|
+
}
|
|
250
|
+
if (turn.toolCalls && turn.toolCalls.length > 0) {
|
|
251
|
+
html += '<div class="detail-section"><h3>Tool Calls (' + turn.toolCalls.length + ')</h3>';
|
|
252
|
+
for (const tc of turn.toolCalls) {
|
|
253
|
+
html += '<div class="detail-section"><h4 style="color:#c9a227">' + escapeHtml(tc.toolName) + ' · ' + formatDuration(tc.durationMs) + (tc.isError ? ' · ERROR' : '') + '</h4>';
|
|
254
|
+
html += '<div class="detail-json">' + escapeHtml(JSON.stringify(tc.args, null, 2)) + '</div>';
|
|
255
|
+
html += '<div class="detail-section"><h3 style="color:#555">Result</h3>';
|
|
256
|
+
const resultStr = typeof tc.result === 'string' ? tc.result : JSON.stringify(tc.result, null, 2);
|
|
257
|
+
html += '<div class="detail-json ' + (tc.isError ? 'tool-result-error' : 'tool-result-ok') + '">' + escapeHtml(truncate(resultStr, 8000)) + '</div>';
|
|
258
|
+
html += '</div></div>';
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return html;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function renderToolDetail(tc, turn) {
|
|
265
|
+
let html = '<div class="detail-section"><h3>' + escapeHtml(tc.toolName) + '</h3>';
|
|
266
|
+
html += '<div class="detail-badges">';
|
|
267
|
+
html += badge('duration', formatDuration(tc.durationMs));
|
|
268
|
+
if (tc.isError) html += badge('error', 'ERROR');
|
|
269
|
+
html += '</div></div>';
|
|
270
|
+
html += '<div class="detail-section"><h3>Input</h3><div class="detail-json">' + escapeHtml(JSON.stringify(tc.args, null, 2)) + '</div></div>';
|
|
271
|
+
html += '<div class="detail-section"><h3>Result</h3>';
|
|
272
|
+
const resultStr = typeof tc.result === 'string' ? tc.result : JSON.stringify(tc.result, null, 2);
|
|
273
|
+
html += '<div class="detail-json ' + (tc.isError ? 'tool-result-error' : 'tool-result-ok') + '">' + escapeHtml(truncate(resultStr, 8000)) + '</div></div>';
|
|
274
|
+
return html;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
function badge(cls, text) {
|
|
278
|
+
return '<span class="badge badge-' + cls + '">' + escapeHtml(text) + '</span>';
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
function formatTokens(n) {
|
|
282
|
+
if (n >= 1000000) return (n / 1000000).toFixed(1) + 'M';
|
|
283
|
+
if (n >= 1000) return (n / 1000).toFixed(1) + 'K';
|
|
284
|
+
return String(n);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
function formatDuration(ms) {
|
|
288
|
+
if (ms >= 60000) return (ms / 60000).toFixed(1) + 'm';
|
|
289
|
+
if (ms >= 1000) return (ms / 1000).toFixed(1) + 's';
|
|
290
|
+
return ms + 'ms';
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
function truncate(str, max) {
|
|
294
|
+
if (str.length <= max) return str;
|
|
295
|
+
return str.substring(0, max) + '\\n... (' + str.length + ' chars total)';
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
function escapeHtml(str) {
|
|
299
|
+
if (str === null || str === undefined) return '';
|
|
300
|
+
return String(str)
|
|
301
|
+
.replace(/&/g, '&')
|
|
302
|
+
.replace(/</g, '<')
|
|
303
|
+
.replace(/>/g, '>')
|
|
304
|
+
.replace(/"/g, '"')
|
|
305
|
+
.replace(/'/g, ''');
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
function filterTree(query) {
|
|
309
|
+
query = query.toLowerCase();
|
|
310
|
+
document.querySelectorAll('.tree-node').forEach(function(node) {
|
|
311
|
+
if (!query) {
|
|
312
|
+
node.classList.remove('hidden');
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
const text = node.textContent.toLowerCase();
|
|
316
|
+
if (text.indexOf(query) !== -1) {
|
|
317
|
+
node.classList.remove('hidden');
|
|
318
|
+
} else {
|
|
319
|
+
node.classList.add('hidden');
|
|
320
|
+
}
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
`;
|
|
324
|
+
}
|
|
325
|
+
function escapeHtml(str) {
|
|
326
|
+
if (str === null || str === undefined)
|
|
327
|
+
return '';
|
|
328
|
+
return String(str)
|
|
329
|
+
.replace(/&/g, '&')
|
|
330
|
+
.replace(/</g, '<')
|
|
331
|
+
.replace(/>/g, '>')
|
|
332
|
+
.replace(/"/g, '"')
|
|
333
|
+
.replace(/'/g, ''');
|
|
334
|
+
}
|
|
335
|
+
function formatTokens(n) {
|
|
336
|
+
if (n >= 1000000)
|
|
337
|
+
return (n / 1000000).toFixed(1) + 'M';
|
|
338
|
+
if (n >= 1000)
|
|
339
|
+
return (n / 1000).toFixed(1) + 'K';
|
|
340
|
+
return String(n);
|
|
341
|
+
}
|
|
342
|
+
function formatDuration(ms) {
|
|
343
|
+
if (ms >= 60000)
|
|
344
|
+
return (ms / 60000).toFixed(1) + 'm';
|
|
345
|
+
if (ms >= 1000)
|
|
346
|
+
return (ms / 1000).toFixed(1) + 's';
|
|
347
|
+
return ms + 'ms';
|
|
348
|
+
}
|
|
349
|
+
//# sourceMappingURL=trace-html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-html.js","sourceRoot":"","sources":["../../src/lib/trace-html.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reference to a workflow artifact stored outside Temporal history.
|
|
3
|
+
*
|
|
4
|
+
* Large node outputs (diffs, review payloads, model responses) are persisted
|
|
5
|
+
* to an artifact store and replaced with this ref in the Temporal event
|
|
6
|
+
* history so history stays small and replayable.
|
|
7
|
+
*/
|
|
8
|
+
export interface TemporalArtifactRef {
|
|
9
|
+
kind: 'artifact-ref';
|
|
10
|
+
key: string;
|
|
11
|
+
uri: string;
|
|
12
|
+
contentType?: string;
|
|
13
|
+
sizeBytes?: number;
|
|
14
|
+
sha256?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Metadata recorded alongside a stored artifact value.
|
|
18
|
+
*/
|
|
19
|
+
export interface ArtifactMetadata {
|
|
20
|
+
contentType?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Policy controlling which node output values stay inline in workflow/results
|
|
24
|
+
* and which are offloaded to the artifact store as refs.
|
|
25
|
+
*
|
|
26
|
+
* - `inline-only`: every value stays inline (local executor default).
|
|
27
|
+
* - `ref-large-values`: values larger than `inlineMaxBytes` become refs
|
|
28
|
+
* (Temporal executor default).
|
|
29
|
+
* - `ref-all-values`: every value becomes a ref (useful for debugging or
|
|
30
|
+
* strict-history-size scenarios).
|
|
31
|
+
*/
|
|
32
|
+
export type ArtifactInliningMode = 'inline-only' | 'ref-large-values' | 'ref-all-values';
|
|
33
|
+
export interface ArtifactInliningPolicy {
|
|
34
|
+
mode: ArtifactInliningMode;
|
|
35
|
+
inlineMaxBytes: number;
|
|
36
|
+
}
|
|
37
|
+
export declare const DEFAULT_ARTIFACT_POLICY: ArtifactInliningPolicy;
|
|
38
|
+
/**
|
|
39
|
+
* Backend for persisting and hydrating workflow artifact values.
|
|
40
|
+
*
|
|
41
|
+
* The local filesystem store is used for development and the Temporal MVP.
|
|
42
|
+
* S3-compatible and other object stores can implement the same interface for
|
|
43
|
+
* CI/production without changing workflow code.
|
|
44
|
+
*/
|
|
45
|
+
export interface WorkflowArtifactStore {
|
|
46
|
+
put(key: string, value: unknown, metadata?: ArtifactMetadata): Promise<TemporalArtifactRef>;
|
|
47
|
+
get(ref: TemporalArtifactRef): Promise<unknown>;
|
|
48
|
+
exists(ref: TemporalArtifactRef): Promise<boolean>;
|
|
49
|
+
}
|
|
50
|
+
export declare function isArtifactRef(value: unknown): value is TemporalArtifactRef;
|
|
51
|
+
/**
|
|
52
|
+
* Decide whether a value should stay inline or be offloaded to the store.
|
|
53
|
+
*/
|
|
54
|
+
export declare function shouldInline(serializedSize: number, policy: ArtifactInliningPolicy): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Local filesystem artifact store.
|
|
57
|
+
*
|
|
58
|
+
* Persists artifacts under `.drs/artifacts/temporal/<namespace>/<key>` within
|
|
59
|
+
* the specified working directory. The `uri` in returned refs is a relative
|
|
60
|
+
* path so the store works consistently across machines when the working
|
|
61
|
+
* directory matches.
|
|
62
|
+
*/
|
|
63
|
+
export declare class LocalWorkflowArtifactStore implements WorkflowArtifactStore {
|
|
64
|
+
private readonly workingDir;
|
|
65
|
+
private readonly baseDir;
|
|
66
|
+
constructor(workingDir: string, namespace?: string);
|
|
67
|
+
put(key: string, value: unknown, metadata?: ArtifactMetadata): Promise<TemporalArtifactRef>;
|
|
68
|
+
get(ref: TemporalArtifactRef): Promise<unknown>;
|
|
69
|
+
exists(ref: TemporalArtifactRef): Promise<boolean>;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=artifact-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-store.d.ts","sourceRoot":"","sources":["../../../src/lib/workflow/artifact-store.ts"],"names":[],"mappings":"AAKA;;;;;;GAMG;AACH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,oBAAoB,GAAG,aAAa,GAAG,kBAAkB,GAAG,gBAAgB,CAAC;AAEzF,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,oBAAoB,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,uBAAuB,EAAE,sBAGrC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC5F,GAAG,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,MAAM,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACpD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAQ1E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAI5F;AAiDD;;;;;;;GAOG;AACH,qBAAa,0BAA2B,YAAW,qBAAqB;IAIpE,OAAO,CAAC,QAAQ,CAAC,UAAU;IAH7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAGd,UAAU,EAAE,MAAM,EACnC,SAAS,SAAY;IAMjB,GAAG,CACP,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,EACd,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,OAAO,CAAC,mBAAmB,CAAC;IAqBzB,GAAG,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;IAM/C,MAAM,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;CAUzD"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { createHash } from 'crypto';
|
|
2
|
+
import { mkdir, readFile, writeFile } from 'fs/promises';
|
|
3
|
+
import { dirname, join } from 'path';
|
|
4
|
+
import { resolveWithinWorkingDir } from '../path-utils.js';
|
|
5
|
+
export const DEFAULT_ARTIFACT_POLICY = {
|
|
6
|
+
mode: 'ref-large-values',
|
|
7
|
+
inlineMaxBytes: 64 * 1024,
|
|
8
|
+
};
|
|
9
|
+
export function isArtifactRef(value) {
|
|
10
|
+
return (typeof value === 'object' &&
|
|
11
|
+
value !== null &&
|
|
12
|
+
value.kind === 'artifact-ref' &&
|
|
13
|
+
typeof value.key === 'string' &&
|
|
14
|
+
typeof value.uri === 'string');
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Decide whether a value should stay inline or be offloaded to the store.
|
|
18
|
+
*/
|
|
19
|
+
export function shouldInline(serializedSize, policy) {
|
|
20
|
+
if (policy.mode === 'inline-only')
|
|
21
|
+
return true;
|
|
22
|
+
if (policy.mode === 'ref-all-values')
|
|
23
|
+
return false;
|
|
24
|
+
return serializedSize <= policy.inlineMaxBytes;
|
|
25
|
+
}
|
|
26
|
+
function serialize(value) {
|
|
27
|
+
if (typeof value === 'string') {
|
|
28
|
+
return { bytes: Buffer.from(value, 'utf-8'), contentType: 'text/plain' };
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
bytes: Buffer.from(JSON.stringify(value, null, 2), 'utf-8'),
|
|
32
|
+
contentType: 'application/json',
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function deserialize(buf, contentType) {
|
|
36
|
+
const text = buf.toString('utf-8');
|
|
37
|
+
if (contentType === 'application/json') {
|
|
38
|
+
return JSON.parse(text);
|
|
39
|
+
}
|
|
40
|
+
if (contentType === 'text/plain') {
|
|
41
|
+
return text;
|
|
42
|
+
}
|
|
43
|
+
// Fallback: try JSON, then treat as string.
|
|
44
|
+
try {
|
|
45
|
+
return JSON.parse(text);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return text;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function sha256(buf) {
|
|
52
|
+
return createHash('sha256').update(buf).digest('hex');
|
|
53
|
+
}
|
|
54
|
+
function slugSegment(value, fallback) {
|
|
55
|
+
const raw = value === undefined || value === '' ? fallback : String(value);
|
|
56
|
+
const slug = raw
|
|
57
|
+
.trim()
|
|
58
|
+
.replace(/[^A-Za-z0-9._-]+/g, '-')
|
|
59
|
+
.replace(/^-+|-+$/g, '');
|
|
60
|
+
return slug || fallback;
|
|
61
|
+
}
|
|
62
|
+
function sanitizeKey(key) {
|
|
63
|
+
const segments = key.split('/').map((seg) => slugSegment(seg, 'segment'));
|
|
64
|
+
if (segments.some((seg) => seg === '..' || seg === '.')) {
|
|
65
|
+
throw new Error(`Refusing to put artifact with unsafe key: ${key}`);
|
|
66
|
+
}
|
|
67
|
+
return segments.join('/');
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Local filesystem artifact store.
|
|
71
|
+
*
|
|
72
|
+
* Persists artifacts under `.drs/artifacts/temporal/<namespace>/<key>` within
|
|
73
|
+
* the specified working directory. The `uri` in returned refs is a relative
|
|
74
|
+
* path so the store works consistently across machines when the working
|
|
75
|
+
* directory matches.
|
|
76
|
+
*/
|
|
77
|
+
export class LocalWorkflowArtifactStore {
|
|
78
|
+
workingDir;
|
|
79
|
+
baseDir;
|
|
80
|
+
constructor(workingDir, namespace = 'default') {
|
|
81
|
+
this.workingDir = workingDir;
|
|
82
|
+
const slug = slugSegment(namespace, 'default');
|
|
83
|
+
this.baseDir = `.drs/artifacts/temporal/${slug}`;
|
|
84
|
+
}
|
|
85
|
+
async put(key, value, metadata) {
|
|
86
|
+
const { bytes, contentType } = serialize(value);
|
|
87
|
+
const resolvedContentType = metadata?.contentType ?? contentType;
|
|
88
|
+
const hash = sha256(bytes);
|
|
89
|
+
const safeKey = sanitizeKey(key);
|
|
90
|
+
const relativePath = join(this.baseDir, `${safeKey}.json`);
|
|
91
|
+
const fullPath = resolveWithinWorkingDir(this.workingDir, relativePath, 'write');
|
|
92
|
+
await mkdir(dirname(fullPath), { recursive: true });
|
|
93
|
+
await writeFile(fullPath, bytes, 'utf-8');
|
|
94
|
+
return {
|
|
95
|
+
kind: 'artifact-ref',
|
|
96
|
+
key,
|
|
97
|
+
uri: relativePath,
|
|
98
|
+
contentType: resolvedContentType,
|
|
99
|
+
sizeBytes: bytes.length,
|
|
100
|
+
sha256: hash,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
async get(ref) {
|
|
104
|
+
const fullPath = resolveWithinWorkingDir(this.workingDir, ref.uri, 'read');
|
|
105
|
+
const bytes = await readFile(fullPath);
|
|
106
|
+
return deserialize(bytes, ref.contentType);
|
|
107
|
+
}
|
|
108
|
+
async exists(ref) {
|
|
109
|
+
try {
|
|
110
|
+
const fullPath = resolveWithinWorkingDir(this.workingDir, ref.uri, 'read');
|
|
111
|
+
await readFile(fullPath);
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
if (error.code === 'ENOENT')
|
|
116
|
+
return false;
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=artifact-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"artifact-store.js","sourceRoot":"","sources":["../../../src/lib/workflow/artifact-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { DRSConfig, WorkflowNodeConfig } from '../config.js';
|
|
2
|
+
/**
|
|
3
|
+
* Workflow node as it appears in a compiled plan.
|
|
4
|
+
*
|
|
5
|
+
* This is currently an API-facing alias for WorkflowNodeConfig so future plan
|
|
6
|
+
* schema changes can evolve independently from raw workflow config types.
|
|
7
|
+
*/
|
|
8
|
+
export type CompiledWorkflowNode = WorkflowNodeConfig;
|
|
9
|
+
/**
|
|
10
|
+
* A DRS workflow control-flow segment expressed as JSON-serializable data.
|
|
11
|
+
*
|
|
12
|
+
* - DAG segments list their node ids plus, when a control node routes into
|
|
13
|
+
* them, the set of active node ids that should actually execute (inactive
|
|
14
|
+
* node ids are skipped by the runner). Active ids are absent for plain DAG
|
|
15
|
+
* segments with no gating control node.
|
|
16
|
+
* - Control segments record the controlling node id.
|
|
17
|
+
*/
|
|
18
|
+
export type CompiledWorkflowSegment = {
|
|
19
|
+
type: 'dag';
|
|
20
|
+
nodeIds: string[];
|
|
21
|
+
activeNodeIds?: string[];
|
|
22
|
+
} | {
|
|
23
|
+
type: 'control';
|
|
24
|
+
nodeId: string;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Metadata for a single workflow input, normalized to a plain object so the
|
|
28
|
+
* compiled plan is JSON-serializable even when the original input is declared
|
|
29
|
+
* as a bare string.
|
|
30
|
+
*/
|
|
31
|
+
export interface CompiledWorkflowInput {
|
|
32
|
+
type: 'string' | 'boolean' | 'number' | 'enum';
|
|
33
|
+
value?: string;
|
|
34
|
+
file?: string;
|
|
35
|
+
default?: string | number | boolean;
|
|
36
|
+
required?: boolean;
|
|
37
|
+
values?: Array<string | number | boolean>;
|
|
38
|
+
description?: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* A fully resolved, JSON-serializable description of a workflow ready to be
|
|
42
|
+
* handed to an executor (local or Temporal). It carries everything needed to
|
|
43
|
+
* schedule nodes without reloading repo config: normalized nodes, execution
|
|
44
|
+
* order, waves, control-flow segments, input metadata, and the output key.
|
|
45
|
+
*
|
|
46
|
+
* Resolved input *values* are intentionally not part of the plan; they are
|
|
47
|
+
* supplied separately at run time so the same plan can dispatch multiple runs
|
|
48
|
+
* with different inputs.
|
|
49
|
+
*/
|
|
50
|
+
export interface CompiledWorkflowPlan {
|
|
51
|
+
/** Schema version so executors can evolve the shape safely. */
|
|
52
|
+
schemaVersion: 1;
|
|
53
|
+
/** Workflow name as resolved from config.workflows. */
|
|
54
|
+
workflowName: string;
|
|
55
|
+
/** Optional human-readable description. */
|
|
56
|
+
description?: string;
|
|
57
|
+
/** Origin of the workflow definition: packaged or project. */
|
|
58
|
+
source: 'packaged' | 'project';
|
|
59
|
+
/** Project workflows overriding a packaged workflow of the same name. */
|
|
60
|
+
overridesPackaged: boolean;
|
|
61
|
+
/** Workflow-level output artifact key. May be undefined (last node output). */
|
|
62
|
+
output?: string;
|
|
63
|
+
/** Workflow input metadata keyed by input name. */
|
|
64
|
+
inputs: Record<string, CompiledWorkflowInput>;
|
|
65
|
+
/** Normalized nodes keyed by id, identical in shape to WorkflowNodeConfig. */
|
|
66
|
+
nodes: Record<string, CompiledWorkflowNode>;
|
|
67
|
+
/** Dependency-ordered node ids (topological). */
|
|
68
|
+
executionOrder: string[];
|
|
69
|
+
/** Wave grouping for parallel DAG execution. */
|
|
70
|
+
waves: string[][];
|
|
71
|
+
/** Control-flow segments for control-bearing workflows; empty for DAG-only. */
|
|
72
|
+
segments: CompiledWorkflowSegment[];
|
|
73
|
+
/** True when the workflow uses any control (loop/switch/end/passThrough) node. */
|
|
74
|
+
hasControlNodes: boolean;
|
|
75
|
+
/** Id of the last node in execution order, used when output is undefined. */
|
|
76
|
+
lastNodeId: string;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Subset of {@link WorkflowRunOptions} relevant to plan compilation. The
|
|
80
|
+
* workingDir is used only to resolve workflow source info (packaged vs.
|
|
81
|
+
* project) and does not become part of the serialized plan.
|
|
82
|
+
*/
|
|
83
|
+
export interface CompileWorkflowPlanOptions {
|
|
84
|
+
workingDir?: string;
|
|
85
|
+
}
|
|
86
|
+
export declare function compileWorkflowPlan(config: DRSConfig, workflowName: string, options?: CompileWorkflowPlanOptions): CompiledWorkflowPlan;
|
|
87
|
+
//# sourceMappingURL=compiled-plan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiled-plan.d.ts","sourceRoot":"","sources":["../../../src/lib/workflow/compiled-plan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EAGT,kBAAkB,EACnB,MAAM,cAAc,CAAC;AAWtB;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AAEtD;;;;;;;;GAQG;AACH,MAAM,MAAM,uBAAuB,GAC/B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAExC;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,oBAAoB;IACnC,+DAA+D;IAC/D,aAAa,EAAE,CAAC,CAAC;IACjB,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC;IAC/B,yEAAyE;IACzE,iBAAiB,EAAE,OAAO,CAAC;IAC3B,+EAA+E;IAC/E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IAC9C,8EAA8E;IAC9E,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAC5C,iDAAiD;IACjD,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,gDAAgD;IAChD,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;IAClB,+EAA+E;IAC/E,QAAQ,EAAE,uBAAuB,EAAE,CAAC;IACpC,kFAAkF;IAClF,eAAe,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,MAAM,WAAW,0BAA0B;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAiBD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE,0BAA+B,GACvC,oBAAoB,CAmDtB"}
|