ridgeline 0.4.4 → 0.5.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -14
- package/dist/agents/core/builder.md +15 -15
- package/dist/agents/core/planner.md +12 -12
- package/dist/agents/core/reviewer.md +19 -19
- package/dist/agents/core/shaper.md +44 -45
- package/dist/agents/core/specifier.md +20 -23
- package/dist/agents/planners/context.md +10 -10
- package/dist/agents/planners/simplicity.md +1 -1
- package/dist/agents/planners/thoroughness.md +2 -2
- package/dist/agents/planners/velocity.md +2 -2
- package/dist/agents/specialists/auditor.md +34 -33
- package/dist/agents/specialists/explorer.md +74 -0
- package/dist/agents/specialists/tester.md +24 -24
- package/dist/agents/specialists/verifier.md +17 -20
- package/dist/agents/specifiers/clarity.md +1 -1
- package/dist/agents/specifiers/completeness.md +2 -2
- package/dist/agents/specifiers/pragmatism.md +2 -2
- package/dist/cli.js +15 -10
- package/dist/cli.js.map +1 -1
- package/dist/commands/build.js +42 -75
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/clean.d.ts +1 -1
- package/dist/commands/clean.js +2 -5
- package/dist/commands/clean.js.map +1 -1
- package/dist/commands/create.d.ts +1 -0
- package/dist/commands/create.js +5 -1
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/dry-run.js +1 -1
- package/dist/commands/dry-run.js.map +1 -1
- package/dist/commands/plan.js +3 -3
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/rewind.js +1 -6
- package/dist/commands/rewind.js.map +1 -1
- package/dist/commands/shape.d.ts +1 -0
- package/dist/commands/shape.js +9 -7
- package/dist/commands/shape.js.map +1 -1
- package/dist/commands/spec.d.ts +1 -0
- package/dist/commands/spec.js +2 -1
- package/dist/commands/spec.js.map +1 -1
- package/dist/config.js +3 -3
- package/dist/config.js.map +1 -1
- package/dist/engine/claude/claude.exec.js +2 -2
- package/dist/engine/claude/stream.display.d.ts +17 -0
- package/dist/engine/claude/stream.display.js +101 -0
- package/dist/engine/claude/stream.display.js.map +1 -0
- package/dist/engine/claude/stream.parse.d.ts +21 -0
- package/dist/engine/claude/stream.parse.js +119 -0
- package/dist/engine/claude/stream.parse.js.map +1 -0
- package/dist/engine/claude/stream.result.d.ts +6 -0
- package/dist/engine/claude/stream.result.js +61 -0
- package/dist/engine/claude/stream.result.js.map +1 -0
- package/dist/engine/discovery/agent.registry.d.ts +27 -0
- package/dist/engine/discovery/agent.registry.js +152 -0
- package/dist/engine/discovery/agent.registry.js.map +1 -0
- package/dist/engine/discovery/agent.scan.d.ts +0 -1
- package/dist/engine/discovery/agent.scan.js +1 -20
- package/dist/engine/discovery/agent.scan.js.map +1 -1
- package/dist/engine/discovery/flavour.resolve.d.ts +11 -0
- package/dist/engine/discovery/flavour.resolve.js +98 -0
- package/dist/engine/discovery/flavour.resolve.js.map +1 -0
- package/dist/engine/index.d.ts +6 -3
- package/dist/engine/index.js +12 -9
- package/dist/engine/index.js.map +1 -1
- package/dist/engine/pipeline/build.exec.js +7 -5
- package/dist/engine/pipeline/build.exec.js.map +1 -1
- package/dist/engine/pipeline/ensemble.exec.d.ts +3 -4
- package/dist/engine/pipeline/ensemble.exec.js +12 -104
- package/dist/engine/pipeline/ensemble.exec.js.map +1 -1
- package/dist/engine/pipeline/phase.sequence.js +69 -67
- package/dist/engine/pipeline/phase.sequence.js.map +1 -1
- package/dist/engine/pipeline/pipeline.shared.js +5 -4
- package/dist/engine/pipeline/pipeline.shared.js.map +1 -1
- package/dist/engine/pipeline/review.exec.js +9 -7
- package/dist/engine/pipeline/review.exec.js.map +1 -1
- package/dist/engine/pipeline/specify.exec.d.ts +1 -0
- package/dist/engine/pipeline/specify.exec.js +5 -3
- package/dist/engine/pipeline/specify.exec.js.map +1 -1
- package/dist/engine/worktree.d.ts +0 -8
- package/dist/engine/worktree.js +2 -163
- package/dist/engine/worktree.js.map +1 -1
- package/dist/flavours/data-analysis/core/builder.md +119 -0
- package/dist/flavours/data-analysis/core/planner.md +102 -0
- package/dist/flavours/data-analysis/core/reviewer.md +148 -0
- package/dist/flavours/data-analysis/core/shaper.md +139 -0
- package/dist/flavours/data-analysis/core/specifier.md +74 -0
- package/dist/flavours/data-analysis/planners/context.md +50 -0
- package/dist/flavours/data-analysis/planners/simplicity.md +7 -0
- package/dist/flavours/data-analysis/planners/thoroughness.md +7 -0
- package/dist/flavours/data-analysis/planners/velocity.md +7 -0
- package/dist/flavours/data-analysis/specialists/auditor.md +94 -0
- package/dist/flavours/data-analysis/specialists/explorer.md +93 -0
- package/dist/flavours/data-analysis/specialists/tester.md +107 -0
- package/dist/flavours/data-analysis/specialists/verifier.md +103 -0
- package/dist/flavours/data-analysis/specifiers/clarity.md +7 -0
- package/dist/flavours/data-analysis/specifiers/completeness.md +15 -0
- package/dist/flavours/data-analysis/specifiers/pragmatism.md +7 -0
- package/dist/flavours/game-dev/core/builder.md +104 -0
- package/dist/flavours/game-dev/core/planner.md +90 -0
- package/dist/flavours/game-dev/core/reviewer.md +151 -0
- package/dist/flavours/game-dev/core/shaper.md +139 -0
- package/dist/flavours/game-dev/core/specifier.md +73 -0
- package/dist/flavours/game-dev/planners/context.md +50 -0
- package/dist/flavours/game-dev/planners/simplicity.md +7 -0
- package/dist/flavours/game-dev/planners/thoroughness.md +7 -0
- package/dist/flavours/game-dev/planners/velocity.md +7 -0
- package/dist/flavours/game-dev/specialists/auditor.md +91 -0
- package/dist/flavours/game-dev/specialists/explorer.md +78 -0
- package/dist/flavours/game-dev/specialists/tester.md +73 -0
- package/dist/flavours/game-dev/specialists/verifier.md +104 -0
- package/dist/flavours/game-dev/specifiers/clarity.md +7 -0
- package/dist/flavours/game-dev/specifiers/completeness.md +7 -0
- package/dist/flavours/game-dev/specifiers/pragmatism.md +7 -0
- package/dist/flavours/legal-drafting/core/builder.md +118 -0
- package/dist/flavours/legal-drafting/core/planner.md +92 -0
- package/dist/flavours/legal-drafting/core/reviewer.md +150 -0
- package/dist/flavours/legal-drafting/core/shaper.md +137 -0
- package/dist/flavours/legal-drafting/core/specifier.md +68 -0
- package/dist/flavours/legal-drafting/planners/context.md +48 -0
- package/dist/flavours/legal-drafting/planners/simplicity.md +7 -0
- package/dist/flavours/legal-drafting/planners/thoroughness.md +7 -0
- package/dist/flavours/legal-drafting/planners/velocity.md +7 -0
- package/dist/flavours/legal-drafting/specialists/auditor.md +92 -0
- package/dist/flavours/legal-drafting/specialists/explorer.md +78 -0
- package/dist/flavours/legal-drafting/specialists/tester.md +76 -0
- package/dist/flavours/legal-drafting/specialists/verifier.md +111 -0
- package/dist/flavours/legal-drafting/specifiers/clarity.md +7 -0
- package/dist/flavours/legal-drafting/specifiers/completeness.md +7 -0
- package/dist/flavours/legal-drafting/specifiers/pragmatism.md +7 -0
- package/dist/flavours/machine-learning/core/builder.md +127 -0
- package/dist/flavours/machine-learning/core/planner.md +90 -0
- package/dist/flavours/machine-learning/core/reviewer.md +152 -0
- package/dist/flavours/machine-learning/core/shaper.md +141 -0
- package/dist/flavours/machine-learning/core/specifier.md +71 -0
- package/dist/flavours/machine-learning/planners/context.md +49 -0
- package/dist/flavours/machine-learning/planners/simplicity.md +7 -0
- package/dist/flavours/machine-learning/planners/thoroughness.md +7 -0
- package/dist/flavours/machine-learning/planners/velocity.md +7 -0
- package/dist/flavours/machine-learning/specialists/auditor.md +96 -0
- package/dist/flavours/machine-learning/specialists/explorer.md +81 -0
- package/dist/flavours/machine-learning/specialists/tester.md +82 -0
- package/dist/flavours/machine-learning/specialists/verifier.md +100 -0
- package/dist/flavours/machine-learning/specifiers/clarity.md +7 -0
- package/dist/flavours/machine-learning/specifiers/completeness.md +7 -0
- package/dist/flavours/machine-learning/specifiers/pragmatism.md +7 -0
- package/dist/flavours/mobile-app/core/builder.md +108 -0
- package/dist/flavours/mobile-app/core/planner.md +90 -0
- package/dist/flavours/mobile-app/core/reviewer.md +144 -0
- package/dist/flavours/mobile-app/core/shaper.md +146 -0
- package/dist/flavours/mobile-app/core/specifier.md +73 -0
- package/dist/flavours/mobile-app/planners/context.md +41 -0
- package/dist/flavours/mobile-app/planners/simplicity.md +7 -0
- package/dist/flavours/mobile-app/planners/thoroughness.md +7 -0
- package/dist/flavours/mobile-app/planners/velocity.md +7 -0
- package/dist/flavours/mobile-app/specialists/auditor.md +92 -0
- package/dist/flavours/mobile-app/specialists/explorer.md +84 -0
- package/dist/flavours/mobile-app/specialists/tester.md +75 -0
- package/dist/flavours/mobile-app/specialists/verifier.md +114 -0
- package/dist/flavours/mobile-app/specifiers/clarity.md +7 -0
- package/dist/flavours/mobile-app/specifiers/completeness.md +7 -0
- package/dist/flavours/mobile-app/specifiers/pragmatism.md +7 -0
- package/dist/flavours/music-composition/core/builder.md +112 -0
- package/dist/flavours/music-composition/core/planner.md +102 -0
- package/dist/flavours/music-composition/core/reviewer.md +139 -0
- package/dist/flavours/music-composition/core/shaper.md +139 -0
- package/dist/flavours/music-composition/core/specifier.md +72 -0
- package/dist/flavours/music-composition/planners/context.md +39 -0
- package/dist/flavours/music-composition/planners/simplicity.md +7 -0
- package/dist/flavours/music-composition/planners/thoroughness.md +7 -0
- package/dist/flavours/music-composition/planners/velocity.md +7 -0
- package/dist/flavours/music-composition/specialists/auditor.md +90 -0
- package/dist/flavours/music-composition/specialists/explorer.md +87 -0
- package/dist/flavours/music-composition/specialists/tester.md +74 -0
- package/dist/flavours/music-composition/specialists/verifier.md +89 -0
- package/dist/flavours/music-composition/specifiers/clarity.md +7 -0
- package/dist/flavours/music-composition/specifiers/completeness.md +7 -0
- package/dist/flavours/music-composition/specifiers/pragmatism.md +7 -0
- package/dist/flavours/novel-writing/core/builder.md +116 -0
- package/dist/flavours/novel-writing/core/planner.md +92 -0
- package/dist/flavours/novel-writing/core/reviewer.md +152 -0
- package/dist/flavours/novel-writing/core/shaper.md +143 -0
- package/dist/flavours/novel-writing/core/specifier.md +76 -0
- package/dist/flavours/novel-writing/planners/context.md +39 -0
- package/dist/flavours/novel-writing/planners/simplicity.md +7 -0
- package/dist/flavours/novel-writing/planners/thoroughness.md +7 -0
- package/dist/flavours/novel-writing/planners/velocity.md +7 -0
- package/dist/flavours/novel-writing/specialists/auditor.md +87 -0
- package/dist/flavours/novel-writing/specialists/explorer.md +83 -0
- package/dist/flavours/novel-writing/specialists/tester.md +89 -0
- package/dist/flavours/novel-writing/specialists/verifier.md +122 -0
- package/dist/flavours/novel-writing/specifiers/clarity.md +7 -0
- package/dist/flavours/novel-writing/specifiers/completeness.md +7 -0
- package/dist/flavours/novel-writing/specifiers/pragmatism.md +7 -0
- package/dist/flavours/screenwriting/core/builder.md +115 -0
- package/dist/flavours/screenwriting/core/planner.md +92 -0
- package/dist/flavours/screenwriting/core/reviewer.md +151 -0
- package/dist/flavours/screenwriting/core/shaper.md +143 -0
- package/dist/flavours/screenwriting/core/specifier.md +78 -0
- package/dist/flavours/screenwriting/planners/context.md +52 -0
- package/dist/flavours/screenwriting/planners/simplicity.md +7 -0
- package/dist/flavours/screenwriting/planners/thoroughness.md +7 -0
- package/dist/flavours/screenwriting/planners/velocity.md +7 -0
- package/dist/flavours/screenwriting/specialists/auditor.md +98 -0
- package/dist/flavours/screenwriting/specialists/explorer.md +87 -0
- package/dist/flavours/screenwriting/specialists/tester.md +90 -0
- package/dist/flavours/screenwriting/specialists/verifier.md +129 -0
- package/dist/flavours/screenwriting/specifiers/clarity.md +7 -0
- package/dist/flavours/screenwriting/specifiers/completeness.md +7 -0
- package/dist/flavours/screenwriting/specifiers/pragmatism.md +7 -0
- package/dist/flavours/security-audit/core/builder.md +123 -0
- package/dist/flavours/security-audit/core/planner.md +92 -0
- package/dist/flavours/security-audit/core/reviewer.md +150 -0
- package/dist/flavours/security-audit/core/shaper.md +145 -0
- package/dist/flavours/security-audit/core/specifier.md +69 -0
- package/dist/flavours/security-audit/planners/context.md +51 -0
- package/dist/flavours/security-audit/planners/simplicity.md +7 -0
- package/dist/flavours/security-audit/planners/thoroughness.md +7 -0
- package/dist/flavours/security-audit/planners/velocity.md +7 -0
- package/dist/flavours/security-audit/specialists/auditor.md +100 -0
- package/dist/flavours/security-audit/specialists/explorer.md +84 -0
- package/dist/flavours/security-audit/specialists/tester.md +80 -0
- package/dist/flavours/security-audit/specialists/verifier.md +101 -0
- package/dist/flavours/security-audit/specifiers/clarity.md +7 -0
- package/dist/flavours/security-audit/specifiers/completeness.md +7 -0
- package/dist/flavours/security-audit/specifiers/pragmatism.md +7 -0
- package/dist/flavours/software-engineering/core/builder.md +100 -0
- package/dist/flavours/software-engineering/core/planner.md +90 -0
- package/dist/flavours/software-engineering/core/reviewer.md +137 -0
- package/dist/flavours/software-engineering/core/shaper.md +137 -0
- package/dist/flavours/software-engineering/core/specifier.md +69 -0
- package/dist/flavours/software-engineering/planners/context.md +37 -0
- package/dist/flavours/software-engineering/planners/simplicity.md +7 -0
- package/dist/flavours/software-engineering/planners/thoroughness.md +7 -0
- package/dist/flavours/software-engineering/planners/velocity.md +7 -0
- package/dist/flavours/software-engineering/specialists/auditor.md +88 -0
- package/dist/{agents/specialists/scout.md → flavours/software-engineering/specialists/explorer.md} +2 -2
- package/dist/flavours/software-engineering/specialists/tester.md +72 -0
- package/dist/flavours/software-engineering/specialists/verifier.md +89 -0
- package/dist/flavours/software-engineering/specifiers/clarity.md +7 -0
- package/dist/flavours/software-engineering/specifiers/completeness.md +7 -0
- package/dist/flavours/software-engineering/specifiers/pragmatism.md +7 -0
- package/dist/flavours/technical-writing/core/builder.md +119 -0
- package/dist/flavours/technical-writing/core/planner.md +102 -0
- package/dist/flavours/technical-writing/core/reviewer.md +138 -0
- package/dist/flavours/technical-writing/core/shaper.md +137 -0
- package/dist/flavours/technical-writing/core/specifier.md +69 -0
- package/dist/flavours/technical-writing/planners/context.md +49 -0
- package/dist/flavours/technical-writing/planners/simplicity.md +7 -0
- package/dist/flavours/technical-writing/planners/thoroughness.md +7 -0
- package/dist/flavours/technical-writing/planners/velocity.md +7 -0
- package/dist/flavours/technical-writing/specialists/auditor.md +94 -0
- package/dist/flavours/technical-writing/specialists/explorer.md +85 -0
- package/dist/flavours/technical-writing/specialists/tester.md +93 -0
- package/dist/flavours/technical-writing/specialists/verifier.md +113 -0
- package/dist/flavours/technical-writing/specifiers/clarity.md +7 -0
- package/dist/flavours/technical-writing/specifiers/completeness.md +7 -0
- package/dist/flavours/technical-writing/specifiers/pragmatism.md +7 -0
- package/dist/flavours/test-suite/core/builder.md +114 -0
- package/dist/flavours/test-suite/core/planner.md +101 -0
- package/dist/flavours/test-suite/core/reviewer.md +161 -0
- package/dist/flavours/test-suite/core/shaper.md +144 -0
- package/dist/flavours/test-suite/core/specifier.md +71 -0
- package/dist/flavours/test-suite/planners/context.md +52 -0
- package/dist/flavours/test-suite/planners/simplicity.md +7 -0
- package/dist/flavours/test-suite/planners/thoroughness.md +7 -0
- package/dist/flavours/test-suite/planners/velocity.md +7 -0
- package/dist/flavours/test-suite/specialists/auditor.md +85 -0
- package/dist/flavours/test-suite/specialists/explorer.md +88 -0
- package/dist/flavours/test-suite/specialists/tester.md +88 -0
- package/dist/flavours/test-suite/specialists/verifier.md +100 -0
- package/dist/flavours/test-suite/specifiers/clarity.md +7 -0
- package/dist/flavours/test-suite/specifiers/completeness.md +7 -0
- package/dist/flavours/test-suite/specifiers/pragmatism.md +7 -0
- package/dist/flavours/translation/core/builder.md +120 -0
- package/dist/flavours/translation/core/planner.md +90 -0
- package/dist/flavours/translation/core/reviewer.md +151 -0
- package/dist/flavours/translation/core/shaper.md +137 -0
- package/dist/flavours/translation/core/specifier.md +71 -0
- package/dist/flavours/translation/planners/context.md +53 -0
- package/dist/flavours/translation/planners/simplicity.md +7 -0
- package/dist/flavours/translation/planners/thoroughness.md +7 -0
- package/dist/flavours/translation/planners/velocity.md +7 -0
- package/dist/flavours/translation/specialists/auditor.md +109 -0
- package/dist/flavours/translation/specialists/explorer.md +98 -0
- package/dist/flavours/translation/specialists/tester.md +82 -0
- package/dist/flavours/translation/specialists/verifier.md +121 -0
- package/dist/flavours/translation/specifiers/clarity.md +7 -0
- package/dist/flavours/translation/specifiers/completeness.md +7 -0
- package/dist/flavours/translation/specifiers/pragmatism.md +7 -0
- package/dist/stores/budget.d.ts +5 -0
- package/dist/stores/budget.js +74 -0
- package/dist/stores/budget.js.map +1 -0
- package/dist/stores/feedback.io.d.ts +6 -0
- package/dist/stores/feedback.io.js +64 -0
- package/dist/stores/feedback.io.js.map +1 -0
- package/dist/stores/feedback.verdict.d.ts +4 -0
- package/dist/stores/feedback.verdict.js +179 -0
- package/dist/stores/feedback.verdict.js.map +1 -0
- package/dist/stores/handoff.d.ts +2 -0
- package/dist/stores/handoff.js +54 -0
- package/dist/stores/handoff.js.map +1 -0
- package/dist/stores/index.d.ts +9 -0
- package/dist/stores/index.js +49 -0
- package/dist/stores/index.js.map +1 -0
- package/dist/stores/inputs.d.ts +2 -0
- package/dist/stores/inputs.js +64 -0
- package/dist/stores/inputs.js.map +1 -0
- package/dist/stores/phases.d.ts +15 -0
- package/dist/stores/phases.js +81 -0
- package/dist/stores/phases.js.map +1 -0
- package/dist/stores/settings.d.ts +12 -0
- package/dist/stores/settings.js +85 -0
- package/dist/stores/settings.js.map +1 -0
- package/dist/stores/state.d.ts +20 -0
- package/dist/stores/state.js +264 -0
- package/dist/stores/state.js.map +1 -0
- package/dist/stores/tags.d.ts +6 -0
- package/dist/stores/tags.js +34 -0
- package/dist/stores/tags.js.map +1 -0
- package/dist/stores/trajectory.d.ts +11 -0
- package/dist/stores/trajectory.js +66 -0
- package/dist/stores/trajectory.js.map +1 -0
- package/dist/types.d.ts +1 -2
- package/package.json +2 -2
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.invokeClaude = exports.killAllClaudeSync = exports.killAllClaude = void 0;
|
|
4
4
|
const node_child_process_1 = require("node:child_process");
|
|
5
|
-
const
|
|
5
|
+
const stream_result_1 = require("./stream.result");
|
|
6
6
|
/** Default: kill if no stdout arrives within 2 minutes of spawn. */
|
|
7
7
|
const DEFAULT_STARTUP_TIMEOUT_MS = 2 * 60 * 1000;
|
|
8
8
|
/** Default: kill if no stdout arrives for 5 minutes during execution. */
|
|
@@ -165,7 +165,7 @@ const invokeClaude = async (opts) => {
|
|
|
165
165
|
return;
|
|
166
166
|
}
|
|
167
167
|
try {
|
|
168
|
-
resolve((0,
|
|
168
|
+
resolve((0, stream_result_1.extractResult)(stdoutData));
|
|
169
169
|
}
|
|
170
170
|
catch (err) {
|
|
171
171
|
reject(new Error(`Failed to parse claude output: ${err}`));
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface DisplayCallbackOptions {
|
|
2
|
+
/** Suppress fenced JSON blocks (```json ... ```) from display output. */
|
|
3
|
+
suppressJsonBlock?: boolean;
|
|
4
|
+
/** When set, strip this prefix from tool-call file paths so the display shows relative paths. */
|
|
5
|
+
projectRoot?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Create an onStdout callback that streams assistant text to stdout.
|
|
9
|
+
* The spinner pauses while text is streaming and resumes after a
|
|
10
|
+
* debounce period of inactivity, keeping it visible during tool-use pauses.
|
|
11
|
+
* Returns the callback and a flush function to finalize output.
|
|
12
|
+
*/
|
|
13
|
+
export declare const createDisplayCallbacks: (opts?: DisplayCallbackOptions) => {
|
|
14
|
+
onStdout: (chunk: string) => void;
|
|
15
|
+
flush: () => void;
|
|
16
|
+
};
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createDisplayCallbacks = void 0;
|
|
4
|
+
const stream_parse_1 = require("./stream.parse");
|
|
5
|
+
const spinner_1 = require("../../ui/spinner");
|
|
6
|
+
const RESUME_DEBOUNCE_MS = 200;
|
|
7
|
+
/**
|
|
8
|
+
* Create an onStdout callback that streams assistant text to stdout.
|
|
9
|
+
* The spinner pauses while text is streaming and resumes after a
|
|
10
|
+
* debounce period of inactivity, keeping it visible during tool-use pauses.
|
|
11
|
+
* Returns the callback and a flush function to finalize output.
|
|
12
|
+
*/
|
|
13
|
+
const createDisplayCallbacks = (opts) => {
|
|
14
|
+
let hasStreamedText = false;
|
|
15
|
+
let lastCharWasNewline = true;
|
|
16
|
+
let jsonSuppressed = false;
|
|
17
|
+
let lastEventWasTool = false;
|
|
18
|
+
let resumeTimer = null;
|
|
19
|
+
const spinner = (0, spinner_1.startSpinner)();
|
|
20
|
+
const scheduleResume = () => {
|
|
21
|
+
if (resumeTimer)
|
|
22
|
+
clearTimeout(resumeTimer);
|
|
23
|
+
resumeTimer = setTimeout(() => {
|
|
24
|
+
resumeTimer = null;
|
|
25
|
+
if (!lastCharWasNewline) {
|
|
26
|
+
process.stdout.write("\n");
|
|
27
|
+
lastCharWasNewline = true;
|
|
28
|
+
}
|
|
29
|
+
spinner.resume();
|
|
30
|
+
}, RESUME_DEBOUNCE_MS);
|
|
31
|
+
};
|
|
32
|
+
const writeText = (text) => {
|
|
33
|
+
if (opts?.suppressJsonBlock) {
|
|
34
|
+
const lines = text.split("\n");
|
|
35
|
+
const output = [];
|
|
36
|
+
for (const line of lines) {
|
|
37
|
+
if (!jsonSuppressed && /^\s*```json\s*$/.test(line)) {
|
|
38
|
+
jsonSuppressed = true;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (jsonSuppressed)
|
|
42
|
+
continue;
|
|
43
|
+
output.push(line);
|
|
44
|
+
}
|
|
45
|
+
if (output.length === 0)
|
|
46
|
+
return;
|
|
47
|
+
text = output.join("\n");
|
|
48
|
+
if (text.length === 0)
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (!lastCharWasNewline) {
|
|
52
|
+
process.stdout.write("\n");
|
|
53
|
+
}
|
|
54
|
+
process.stdout.write(text);
|
|
55
|
+
lastCharWasNewline = text.endsWith("\n");
|
|
56
|
+
};
|
|
57
|
+
const handler = (0, stream_parse_1.createStreamHandler)((event) => {
|
|
58
|
+
if (event.type === "text") {
|
|
59
|
+
if (!hasStreamedText) {
|
|
60
|
+
hasStreamedText = true;
|
|
61
|
+
}
|
|
62
|
+
spinner.pause();
|
|
63
|
+
if (resumeTimer)
|
|
64
|
+
clearTimeout(resumeTimer);
|
|
65
|
+
if (lastEventWasTool) {
|
|
66
|
+
process.stdout.write("\n");
|
|
67
|
+
lastEventWasTool = false;
|
|
68
|
+
}
|
|
69
|
+
writeText(event.text);
|
|
70
|
+
scheduleResume();
|
|
71
|
+
}
|
|
72
|
+
else if (event.type === "tool_use") {
|
|
73
|
+
let summary = event.summary;
|
|
74
|
+
if (summary && opts?.projectRoot) {
|
|
75
|
+
const root = opts.projectRoot.endsWith("/") ? opts.projectRoot : opts.projectRoot + "/";
|
|
76
|
+
summary = summary.replaceAll(root, "");
|
|
77
|
+
}
|
|
78
|
+
const line = summary
|
|
79
|
+
? `[${event.tool}] ${summary}`
|
|
80
|
+
: `[${event.tool}]`;
|
|
81
|
+
spinner.printAbove(line);
|
|
82
|
+
spinner.setDetail(event.tool);
|
|
83
|
+
lastEventWasTool = true;
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
return {
|
|
87
|
+
onStdout: handler,
|
|
88
|
+
flush: () => {
|
|
89
|
+
if (resumeTimer) {
|
|
90
|
+
clearTimeout(resumeTimer);
|
|
91
|
+
resumeTimer = null;
|
|
92
|
+
}
|
|
93
|
+
spinner.stop();
|
|
94
|
+
if (hasStreamedText && !lastCharWasNewline) {
|
|
95
|
+
process.stdout.write("\n");
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
exports.createDisplayCallbacks = createDisplayCallbacks;
|
|
101
|
+
//# sourceMappingURL=stream.display.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.display.js","sourceRoot":"","sources":["../../../src/engine/claude/stream.display.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ClaudeResult } from "../../types";
|
|
2
|
+
export type StreamEvent = {
|
|
3
|
+
type: "text";
|
|
4
|
+
text: string;
|
|
5
|
+
} | {
|
|
6
|
+
type: "tool_use";
|
|
7
|
+
tool: string;
|
|
8
|
+
summary?: string;
|
|
9
|
+
} | {
|
|
10
|
+
type: "result";
|
|
11
|
+
result: ClaudeResult;
|
|
12
|
+
} | {
|
|
13
|
+
type: "other";
|
|
14
|
+
};
|
|
15
|
+
export declare const parseClaudeResult: (parsed: Record<string, unknown>) => ClaudeResult;
|
|
16
|
+
export declare const parseStreamLine: (line: string) => StreamEvent;
|
|
17
|
+
/**
|
|
18
|
+
* Line-buffered chunk handler. Splits raw stdout chunks on newlines,
|
|
19
|
+
* parses complete lines, and calls `onEvent` for each.
|
|
20
|
+
*/
|
|
21
|
+
export declare const createStreamHandler: (onEvent: (event: StreamEvent) => void) => ((chunk: string) => void);
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createStreamHandler = exports.parseStreamLine = exports.parseClaudeResult = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Parse a single NDJSON line from `claude --output-format stream-json`.
|
|
6
|
+
*
|
|
7
|
+
* Relevant event shapes:
|
|
8
|
+
* - `{"type":"assistant","subtype":"text","text":"..."}` — streamed model text
|
|
9
|
+
* - `{"type":"result","result":"...","total_cost_usd":...}` — final result with usage
|
|
10
|
+
*/
|
|
11
|
+
const MAX_SUMMARY_LEN = 200;
|
|
12
|
+
const summarizeToolInput = (input) => {
|
|
13
|
+
// Pick the most informative field per tool type
|
|
14
|
+
const raw = input.command ?? // Bash
|
|
15
|
+
input.file_path ?? // Read, Write, Edit
|
|
16
|
+
input.pattern ?? // Grep, Glob
|
|
17
|
+
input.prompt; // Agent
|
|
18
|
+
if (typeof raw !== "string" || raw.length === 0)
|
|
19
|
+
return undefined;
|
|
20
|
+
// Take first line only
|
|
21
|
+
const firstLine = raw.split("\n")[0];
|
|
22
|
+
if (firstLine.length <= MAX_SUMMARY_LEN)
|
|
23
|
+
return firstLine;
|
|
24
|
+
return firstLine.slice(0, MAX_SUMMARY_LEN - 1) + "…";
|
|
25
|
+
};
|
|
26
|
+
const parseClaudeResult = (parsed) => {
|
|
27
|
+
const result = parsed.result;
|
|
28
|
+
return {
|
|
29
|
+
success: !parsed.is_error,
|
|
30
|
+
result: typeof result === "string"
|
|
31
|
+
? result
|
|
32
|
+
: (result != null ? JSON.stringify(result) : ""),
|
|
33
|
+
durationMs: parsed.duration_ms ?? 0,
|
|
34
|
+
costUsd: parsed.total_cost_usd ?? 0,
|
|
35
|
+
usage: {
|
|
36
|
+
inputTokens: parsed.usage?.input_tokens ?? 0,
|
|
37
|
+
outputTokens: parsed.usage?.output_tokens ?? 0,
|
|
38
|
+
cacheReadInputTokens: parsed.usage?.cache_read_input_tokens ?? 0,
|
|
39
|
+
cacheCreationInputTokens: parsed.usage?.cache_creation_input_tokens ?? 0,
|
|
40
|
+
},
|
|
41
|
+
sessionId: parsed.session_id ?? "",
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
exports.parseClaudeResult = parseClaudeResult;
|
|
45
|
+
const parseStreamLine = (line) => {
|
|
46
|
+
const trimmed = line.trim();
|
|
47
|
+
if (trimmed.length === 0)
|
|
48
|
+
return { type: "other" };
|
|
49
|
+
let parsed;
|
|
50
|
+
try {
|
|
51
|
+
parsed = JSON.parse(trimmed);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return { type: "other" };
|
|
55
|
+
}
|
|
56
|
+
// Legacy format: {"type":"assistant","subtype":"text","text":"..."}
|
|
57
|
+
if (parsed.type === "assistant" && parsed.subtype === "text") {
|
|
58
|
+
const text = parsed.text;
|
|
59
|
+
if (typeof text === "string" && text.length > 0) {
|
|
60
|
+
return { type: "text", text };
|
|
61
|
+
}
|
|
62
|
+
return { type: "other" };
|
|
63
|
+
}
|
|
64
|
+
// Legacy format: {"type":"assistant","subtype":"tool_use","tool":"Read"}
|
|
65
|
+
if (parsed.type === "assistant" && parsed.subtype === "tool_use") {
|
|
66
|
+
const tool = parsed.tool;
|
|
67
|
+
if (typeof tool === "string" && tool.length > 0) {
|
|
68
|
+
return { type: "tool_use", tool };
|
|
69
|
+
}
|
|
70
|
+
return { type: "other" };
|
|
71
|
+
}
|
|
72
|
+
// Current format: {"type":"assistant","message":{"content":[...]}}
|
|
73
|
+
if (parsed.type === "assistant" && parsed.message) {
|
|
74
|
+
const message = parsed.message;
|
|
75
|
+
const content = message.content;
|
|
76
|
+
if (Array.isArray(content)) {
|
|
77
|
+
const textParts = content
|
|
78
|
+
.filter((c) => c.type === "text" && typeof c.text === "string")
|
|
79
|
+
.map((c) => c.text)
|
|
80
|
+
.join("");
|
|
81
|
+
if (textParts.length > 0) {
|
|
82
|
+
return { type: "text", text: textParts };
|
|
83
|
+
}
|
|
84
|
+
// No text found — check for tool_use blocks
|
|
85
|
+
const toolBlock = content.find((c) => c.type === "tool_use" && typeof c.name === "string");
|
|
86
|
+
if (toolBlock) {
|
|
87
|
+
const summary = toolBlock.input
|
|
88
|
+
? summarizeToolInput(toolBlock.input)
|
|
89
|
+
: undefined;
|
|
90
|
+
return { type: "tool_use", tool: toolBlock.name, summary };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return { type: "other" };
|
|
94
|
+
}
|
|
95
|
+
if (parsed.type === "result") {
|
|
96
|
+
return { type: "result", result: (0, exports.parseClaudeResult)(parsed) };
|
|
97
|
+
}
|
|
98
|
+
return { type: "other" };
|
|
99
|
+
};
|
|
100
|
+
exports.parseStreamLine = parseStreamLine;
|
|
101
|
+
/**
|
|
102
|
+
* Line-buffered chunk handler. Splits raw stdout chunks on newlines,
|
|
103
|
+
* parses complete lines, and calls `onEvent` for each.
|
|
104
|
+
*/
|
|
105
|
+
const createStreamHandler = (onEvent) => {
|
|
106
|
+
let buffer = "";
|
|
107
|
+
return (chunk) => {
|
|
108
|
+
buffer += chunk;
|
|
109
|
+
const lines = buffer.split("\n");
|
|
110
|
+
buffer = lines.pop() ?? "";
|
|
111
|
+
for (const line of lines) {
|
|
112
|
+
if (line.trim().length > 0) {
|
|
113
|
+
onEvent((0, exports.parseStreamLine)(line));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
};
|
|
118
|
+
exports.createStreamHandler = createStreamHandler;
|
|
119
|
+
//# sourceMappingURL=stream.parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.parse.js","sourceRoot":"","sources":["../../../src/engine/claude/stream.parse.ts"],"names":[],"mappings":";;;AAQA;;;;;;GAMG;AACH,MAAM,eAAe,GAAG,GAAG,CAAA;AAE3B,MAAM,kBAAkB,GAAG,CAAC,KAA8B,EAAsB,EAAE;IAChF,gDAAgD;IAChD,MAAM,GAAG,GACP,KAAK,CAAC,OAAO,IAAW,OAAO;QAC/B,KAAK,CAAC,SAAS,IAAS,oBAAoB;QAC5C,KAAK,CAAC,OAAO,IAAW,aAAa;QACrC,KAAK,CAAC,MAAM,CAAA,CAAY,QAAQ;IAElC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAEjE,uBAAuB;IACvB,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;IACpC,IAAI,SAAS,CAAC,MAAM,IAAI,eAAe;QAAE,OAAO,SAAS,CAAA;IACzD,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,GAAG,CAAC,CAAC,GAAG,GAAG,CAAA;AACtD,CAAC,CAAA;AAEM,MAAM,iBAAiB,GAAG,CAAC,MAA+B,EAAgB,EAAE;IACjF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IAC5B,OAAO;QACL,OAAO,EAAE,CAAC,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,OAAO,MAAM,KAAK,QAAQ;YAChC,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,UAAU,EAAG,MAAM,CAAC,WAAsB,IAAI,CAAC;QAC/C,OAAO,EAAG,MAAM,CAAC,cAAyB,IAAI,CAAC;QAC/C,KAAK,EAAE;YACL,WAAW,EAAG,MAAiD,CAAC,KAAK,EAAE,YAAY,IAAI,CAAC;YACxF,YAAY,EAAG,MAAiD,CAAC,KAAK,EAAE,aAAa,IAAI,CAAC;YAC1F,oBAAoB,EAAG,MAAiD,CAAC,KAAK,EAAE,uBAAuB,IAAI,CAAC;YAC5G,wBAAwB,EAAG,MAAiD,CAAC,KAAK,EAAE,2BAA2B,IAAI,CAAC;SACrH;QACD,SAAS,EAAG,MAAM,CAAC,UAAqB,IAAI,EAAE;KAC/C,CAAA;AACH,CAAC,CAAA;AAjBY,QAAA,iBAAiB,qBAiB7B;AAEM,MAAM,eAAe,GAAG,CAAC,IAAY,EAAe,EAAE;IAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;IAC3B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;IAElD,IAAI,MAA+B,CAAA;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;IAC1B,CAAC;IAED,oEAAoE;IACpE,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;QAC7D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;QACxB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;QAC/B,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;IAC1B,CAAC;IAED,yEAAyE;IACzE,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QACjE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;QACxB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAA;QACnC,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;IAC1B,CAAC;IAED,mEAAmE;IACnE,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAClD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAkC,CAAA;QACzD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAqD,CAAA;QAC7E,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,OAAO;iBACtB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;iBAC9D,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAc,CAAC;iBAC5B,IAAI,CAAC,EAAE,CAAC,CAAA;YACX,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAA;YAC1C,CAAC;YAED,4CAA4C;YAC5C,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAA;YAC1F,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK;oBAC7B,CAAC,CAAC,kBAAkB,CAAC,SAAS,CAAC,KAAgC,CAAC;oBAChE,CAAC,CAAC,SAAS,CAAA;gBACb,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,CAAC,IAAc,EAAE,OAAO,EAAE,CAAA;YACtE,CAAC;QACH,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;IAC1B,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAA,yBAAiB,EAAC,MAAM,CAAC,EAAE,CAAA;IAC9D,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;AAC1B,CAAC,CAAA;AA3DY,QAAA,eAAe,mBA2D3B;AAED;;;GAGG;AACI,MAAM,mBAAmB,GAAG,CACjC,OAAqC,EACV,EAAE;IAC7B,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,OAAO,CAAC,KAAa,EAAE,EAAE;QACvB,MAAM,IAAI,KAAK,CAAA;QACf,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAChC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAA;QAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,IAAA,uBAAe,EAAC,IAAI,CAAC,CAAC,CAAA;YAChC,CAAC;QACH,CAAC;IACH,CAAC,CAAA;AACH,CAAC,CAAA;AAdY,QAAA,mBAAmB,uBAc/B"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.extractResult = void 0;
|
|
4
|
+
const stream_parse_1 = require("./stream.parse");
|
|
5
|
+
const collectContentFallbacks = (parsed, acc) => {
|
|
6
|
+
// Check for StructuredOutput tool_use in assistant messages
|
|
7
|
+
if (parsed.type === "assistant" && parsed.message) {
|
|
8
|
+
const content = parsed.message.content;
|
|
9
|
+
if (Array.isArray(content)) {
|
|
10
|
+
for (const block of content) {
|
|
11
|
+
if (block.type === "tool_use" && block.name === "StructuredOutput" && block.input != null) {
|
|
12
|
+
acc.structuredOutput = typeof block.input === "string"
|
|
13
|
+
? block.input
|
|
14
|
+
: JSON.stringify(block.input);
|
|
15
|
+
}
|
|
16
|
+
if (block.type === "text" && typeof block.text === "string") {
|
|
17
|
+
acc.textParts.push(block.text);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
// Legacy format text
|
|
23
|
+
if (parsed.type === "assistant" && parsed.subtype === "text" && typeof parsed.text === "string") {
|
|
24
|
+
acc.textParts.push(parsed.text);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Scan accumulated NDJSON stdout for the final `type: "result"` event
|
|
29
|
+
* and return a parsed ClaudeResult.
|
|
30
|
+
*/
|
|
31
|
+
const extractResult = (ndjsonStdout) => {
|
|
32
|
+
const lines = ndjsonStdout.trim().split("\n");
|
|
33
|
+
// Collect fallback content for when result field is empty.
|
|
34
|
+
// --json-schema uses a synthetic StructuredOutput tool_use whose input IS the JSON.
|
|
35
|
+
// Text content is also collected as a secondary fallback.
|
|
36
|
+
const fallbacks = { textParts: [], structuredOutput: null };
|
|
37
|
+
let resultEvent = null;
|
|
38
|
+
for (const line of lines) {
|
|
39
|
+
try {
|
|
40
|
+
const parsed = JSON.parse(line);
|
|
41
|
+
if (parsed.type === "result") {
|
|
42
|
+
resultEvent = (0, stream_parse_1.parseClaudeResult)(parsed);
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
collectContentFallbacks(parsed, fallbacks);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Not valid JSON, skip
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (!resultEvent) {
|
|
52
|
+
throw new Error("No result event found in stream-json output");
|
|
53
|
+
}
|
|
54
|
+
// Populate result from fallbacks: StructuredOutput first, then text content
|
|
55
|
+
if (!resultEvent.result) {
|
|
56
|
+
resultEvent.result = fallbacks.structuredOutput ?? (fallbacks.textParts.length > 0 ? fallbacks.textParts.join("") : "");
|
|
57
|
+
}
|
|
58
|
+
return resultEvent;
|
|
59
|
+
};
|
|
60
|
+
exports.extractResult = extractResult;
|
|
61
|
+
//# sourceMappingURL=stream.result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.result.js","sourceRoot":"","sources":["../../../src/engine/claude/stream.result.ts"],"names":[],"mappings":";;;AACA,iDAAkD;AAOlD,MAAM,uBAAuB,GAAG,CAAC,MAA+B,EAAE,GAAqB,EAAQ,EAAE;IAC/F,4DAA4D;IAC5D,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAClD,MAAM,OAAO,GAAI,MAAM,CAAC,OAAmC,CAAC,OAAqD,CAAA;QACjH,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;gBAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC;oBAC1F,GAAG,CAAC,gBAAgB,GAAG,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;wBACpD,CAAC,CAAC,KAAK,CAAC,KAAK;wBACb,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;gBACjC,CAAC;gBACD,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC5D,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAc,CAAC,CAAA;gBAC1C,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAChG,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAc,CAAC,CAAA;IAC3C,CAAC;AACH,CAAC,CAAA;AAED;;;GAGG;AACI,MAAM,aAAa,GAAG,CAAC,YAAoB,EAAgB,EAAE;IAClE,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAE7C,2DAA2D;IAC3D,oFAAoF;IACpF,0DAA0D;IAC1D,MAAM,SAAS,GAAqB,EAAE,SAAS,EAAE,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAA;IAE7E,IAAI,WAAW,GAAwB,IAAI,CAAA;IAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;YAC/B,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7B,WAAW,GAAG,IAAA,gCAAiB,EAAC,MAAM,CAAC,CAAA;gBACvC,SAAQ;YACV,CAAC;YACD,uBAAuB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAA;IAChE,CAAC;IAED,4EAA4E;IAC5E,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QACxB,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IACzH,CAAC;IAED,OAAO,WAAW,CAAA;AACpB,CAAC,CAAA;AAhCY,QAAA,aAAa,iBAgCzB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { DiscoveredAgent } from "./agent.scan";
|
|
2
|
+
export type SpecialistDef = {
|
|
3
|
+
perspective: string;
|
|
4
|
+
overlay: string;
|
|
5
|
+
};
|
|
6
|
+
type AgentRegistry = {
|
|
7
|
+
/** Get a core agent prompt by filename (e.g., "builder.md"). Throws if missing. */
|
|
8
|
+
getCorePrompt: (filename: string) => string;
|
|
9
|
+
/** Get ensemble specialists for a subfolder (e.g., "planners"). */
|
|
10
|
+
getSpecialists: (subfolder: string) => SpecialistDef[];
|
|
11
|
+
/** Get shared context for an ensemble subfolder. Returns null if no context.md. */
|
|
12
|
+
getContext: (subfolder: string) => string | null;
|
|
13
|
+
/** Get sub-agents from specialists/ as DiscoveredAgent[]. */
|
|
14
|
+
getSubAgents: () => DiscoveredAgent[];
|
|
15
|
+
/** Get the agents flag object for Claude invocation. */
|
|
16
|
+
getAgentsFlag: () => Record<string, {
|
|
17
|
+
description: string;
|
|
18
|
+
prompt: string;
|
|
19
|
+
model?: string;
|
|
20
|
+
}>;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Build an agent registry that resolves agents from an optional flavour
|
|
24
|
+
* directory with per-subfolder fallback to the generic defaults in src/agents/.
|
|
25
|
+
*/
|
|
26
|
+
export declare const buildAgentRegistry: (flavourPath: string | null) => AgentRegistry;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.buildAgentRegistry = void 0;
|
|
37
|
+
const fs = __importStar(require("node:fs"));
|
|
38
|
+
const path = __importStar(require("node:path"));
|
|
39
|
+
const agent_scan_1 = require("./agent.scan");
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// Path resolution helpers
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
/** Resolve the built-in agents/ directory across dist and src layouts. */
|
|
44
|
+
const resolveDefaultAgentsDir = () => {
|
|
45
|
+
const candidates = [
|
|
46
|
+
path.join(__dirname, "..", "agents"),
|
|
47
|
+
path.join(__dirname, "..", "..", "agents"),
|
|
48
|
+
path.join(__dirname, "..", "..", "..", "src", "agents"),
|
|
49
|
+
];
|
|
50
|
+
for (const dir of candidates) {
|
|
51
|
+
if (fs.existsSync(dir) && fs.statSync(dir).isDirectory())
|
|
52
|
+
return dir;
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* For a given subfolder (core, planners, specifiers, specialists), return the
|
|
58
|
+
* directory to use — flavour's version if present, otherwise the default.
|
|
59
|
+
*/
|
|
60
|
+
const resolveSubfolder = (subfolder, flavourPath, defaultAgentsDir) => {
|
|
61
|
+
if (flavourPath) {
|
|
62
|
+
const flavourSub = path.join(flavourPath, subfolder);
|
|
63
|
+
if (fs.existsSync(flavourSub) && fs.statSync(flavourSub).isDirectory()) {
|
|
64
|
+
return flavourSub;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const defaultSub = path.join(defaultAgentsDir, subfolder);
|
|
68
|
+
if (fs.existsSync(defaultSub) && fs.statSync(defaultSub).isDirectory()) {
|
|
69
|
+
return defaultSub;
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
};
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
// Specialist discovery (extracted from ensemble.exec.ts)
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
const discoverSpecialistsInDir = (dir, excludeFiles) => {
|
|
77
|
+
const exclude = new Set(excludeFiles ?? []);
|
|
78
|
+
const specialists = [];
|
|
79
|
+
for (const entry of fs.readdirSync(dir)) {
|
|
80
|
+
if (!entry.endsWith(".md"))
|
|
81
|
+
continue;
|
|
82
|
+
if (exclude.has(entry))
|
|
83
|
+
continue;
|
|
84
|
+
const filepath = path.join(dir, entry);
|
|
85
|
+
try {
|
|
86
|
+
const content = fs.readFileSync(filepath, "utf-8");
|
|
87
|
+
const fm = (0, agent_scan_1.parseFrontmatter)(content);
|
|
88
|
+
if (!fm)
|
|
89
|
+
continue;
|
|
90
|
+
const perspectiveMatch = content.match(/^perspective:\s*(.+)$/m);
|
|
91
|
+
const perspective = perspectiveMatch ? perspectiveMatch[1].trim() : fm.name;
|
|
92
|
+
const body = content.replace(/^---\n[\s\S]*?\n---\n*/, "").trim();
|
|
93
|
+
if (!body)
|
|
94
|
+
continue;
|
|
95
|
+
specialists.push({ perspective, overlay: body });
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// Skip unreadable files
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return specialists;
|
|
102
|
+
};
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
// Registry builder
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
/**
|
|
107
|
+
* Build an agent registry that resolves agents from an optional flavour
|
|
108
|
+
* directory with per-subfolder fallback to the generic defaults in src/agents/.
|
|
109
|
+
*/
|
|
110
|
+
const buildAgentRegistry = (flavourPath) => {
|
|
111
|
+
const defaultAgentsDir = resolveDefaultAgentsDir();
|
|
112
|
+
if (!defaultAgentsDir) {
|
|
113
|
+
throw new Error("Built-in agents directory not found");
|
|
114
|
+
}
|
|
115
|
+
const getCorePrompt = (filename) => {
|
|
116
|
+
const coreDir = resolveSubfolder("core", flavourPath, defaultAgentsDir);
|
|
117
|
+
if (!coreDir)
|
|
118
|
+
throw new Error("No core agents directory found");
|
|
119
|
+
const filepath = path.join(coreDir, filename);
|
|
120
|
+
if (!fs.existsSync(filepath)) {
|
|
121
|
+
throw new Error(`Core agent not found: ${filename}`);
|
|
122
|
+
}
|
|
123
|
+
return fs.readFileSync(filepath, "utf-8");
|
|
124
|
+
};
|
|
125
|
+
const getSpecialists = (subfolder) => {
|
|
126
|
+
const dir = resolveSubfolder(subfolder, flavourPath, defaultAgentsDir);
|
|
127
|
+
if (!dir)
|
|
128
|
+
return [];
|
|
129
|
+
return discoverSpecialistsInDir(dir, ["context.md"]);
|
|
130
|
+
};
|
|
131
|
+
const getContext = (subfolder) => {
|
|
132
|
+
const dir = resolveSubfolder(subfolder, flavourPath, defaultAgentsDir);
|
|
133
|
+
if (!dir)
|
|
134
|
+
return null;
|
|
135
|
+
const contextPath = path.join(dir, "context.md");
|
|
136
|
+
if (!fs.existsSync(contextPath))
|
|
137
|
+
return null;
|
|
138
|
+
return fs.readFileSync(contextPath, "utf-8");
|
|
139
|
+
};
|
|
140
|
+
const getSubAgents = () => {
|
|
141
|
+
const dir = resolveSubfolder("specialists", flavourPath, defaultAgentsDir);
|
|
142
|
+
if (!dir)
|
|
143
|
+
return [];
|
|
144
|
+
return (0, agent_scan_1.discoverAgentsInDir)(dir);
|
|
145
|
+
};
|
|
146
|
+
const getAgentsFlag = () => {
|
|
147
|
+
return (0, agent_scan_1.buildAgentsFlag)(getSubAgents());
|
|
148
|
+
};
|
|
149
|
+
return { getCorePrompt, getSpecialists, getContext, getSubAgents, getAgentsFlag };
|
|
150
|
+
};
|
|
151
|
+
exports.buildAgentRegistry = buildAgentRegistry;
|
|
152
|
+
//# sourceMappingURL=agent.registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.registry.js","sourceRoot":"","sources":["../../../src/engine/discovery/agent.registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,6 @@ type Frontmatter = {
|
|
|
12
12
|
};
|
|
13
13
|
export declare const parseFrontmatter: (content: string) => Frontmatter | null;
|
|
14
14
|
export declare const discoverAgentsInDir: (dir: string) => DiscoveredAgent[];
|
|
15
|
-
export declare const discoverBuiltinAgents: () => DiscoveredAgent[];
|
|
16
15
|
export declare const buildAgentsFlag: (agents: DiscoveredAgent[]) => Record<string, {
|
|
17
16
|
description: string;
|
|
18
17
|
prompt: string;
|
|
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.buildAgentsFlag = exports.
|
|
36
|
+
exports.buildAgentsFlag = exports.discoverAgentsInDir = exports.parseFrontmatter = void 0;
|
|
37
37
|
const fs = __importStar(require("node:fs"));
|
|
38
38
|
const path = __importStar(require("node:path"));
|
|
39
39
|
const parseFrontmatter = (content) => {
|
|
@@ -53,18 +53,6 @@ const parseFrontmatter = (content) => {
|
|
|
53
53
|
};
|
|
54
54
|
};
|
|
55
55
|
exports.parseFrontmatter = parseFrontmatter;
|
|
56
|
-
const resolveSpecialistsDir = () => {
|
|
57
|
-
const candidates = [
|
|
58
|
-
path.join(__dirname, "agents", "specialists"),
|
|
59
|
-
path.join(__dirname, "..", "agents", "specialists"),
|
|
60
|
-
path.join(__dirname, "..", "..", "src", "agents", "specialists"),
|
|
61
|
-
];
|
|
62
|
-
for (const dir of candidates) {
|
|
63
|
-
if (fs.existsSync(dir) && fs.statSync(dir).isDirectory())
|
|
64
|
-
return dir;
|
|
65
|
-
}
|
|
66
|
-
return null;
|
|
67
|
-
};
|
|
68
56
|
const discoverAgentsInDir = (dir) => {
|
|
69
57
|
if (!fs.existsSync(dir) || !fs.statSync(dir).isDirectory())
|
|
70
58
|
return [];
|
|
@@ -93,13 +81,6 @@ const discoverAgentsInDir = (dir) => {
|
|
|
93
81
|
return agents;
|
|
94
82
|
};
|
|
95
83
|
exports.discoverAgentsInDir = discoverAgentsInDir;
|
|
96
|
-
const discoverBuiltinAgents = () => {
|
|
97
|
-
const specialistsDir = resolveSpecialistsDir();
|
|
98
|
-
if (!specialistsDir)
|
|
99
|
-
return [];
|
|
100
|
-
return (0, exports.discoverAgentsInDir)(specialistsDir);
|
|
101
|
-
};
|
|
102
|
-
exports.discoverBuiltinAgents = discoverBuiltinAgents;
|
|
103
84
|
const buildAgentsFlag = (agents) => {
|
|
104
85
|
const result = {};
|
|
105
86
|
for (const agent of agents) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent.scan.js","sourceRoot":"","sources":["../../../src/engine/discovery/agent.scan.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAA6B;AAC7B,gDAAiC;AAgB1B,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAsB,EAAE;IACtE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAA;IACpD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IAEvB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IACtB,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAA;IAChD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAA;IACvD,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAA;IAEzC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAA;IAElD,OAAO;QACL,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;QACzB,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;QAChC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;KAChD,CAAA;AACH,CAAC,CAAA;AAhBY,QAAA,gBAAgB,oBAgB5B;
|
|
1
|
+
{"version":3,"file":"agent.scan.js","sourceRoot":"","sources":["../../../src/engine/discovery/agent.scan.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAA6B;AAC7B,gDAAiC;AAgB1B,MAAM,gBAAgB,GAAG,CAAC,OAAe,EAAsB,EAAE;IACtE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAA;IACpD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IAEvB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IACtB,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAA;IAChD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAA;IACvD,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAA;IAEzC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAA;IAElD,OAAO;QACL,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;QACzB,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;QAChC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI;KAChD,CAAA;AACH,CAAC,CAAA;AAhBY,QAAA,gBAAgB,oBAgB5B;AAEM,MAAM,mBAAmB,GAAG,CACjC,GAAW,EACQ,EAAE;IACrB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE;QAAE,OAAO,EAAE,CAAA;IAErE,MAAM,MAAM,GAAsB,EAAE,CAAA;IAEpC,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;QACxC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAQ;QAEpC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QACtC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;YAClD,MAAM,EAAE,GAAG,IAAA,wBAAgB,EAAC,OAAO,CAAC,CAAA;YACpC,IAAI,CAAC,EAAE;gBAAE,SAAQ;YAEjB,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,EAAE,CAAC,IAAI;gBACb,WAAW,EAAE,EAAE,CAAC,WAAW;gBAC3B,MAAM,EAAE,OAAO;gBACf,KAAK,EAAE,EAAE,CAAC,KAAK;gBACf,QAAQ,EAAE,KAAK;aAChB,CAAC,CAAA;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AA7BY,QAAA,mBAAmB,uBA6B/B;AAEM,MAAM,eAAe,GAAG,CAC7B,MAAyB,EACgD,EAAE;IAC3E,MAAM,MAAM,GAA4E,EAAE,CAAA;IAE1F,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAA4D;YACrE,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;SACrB,CAAA;QACD,IAAI,KAAK,CAAC,KAAK;YAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;QAE1C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;IAC5B,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAhBY,QAAA,eAAe,mBAgB3B"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve a flavour identifier to an absolute directory path.
|
|
3
|
+
*
|
|
4
|
+
* - If the value looks like a filesystem path (contains / or . or ~),
|
|
5
|
+
* resolve it against the current working directory.
|
|
6
|
+
* - Otherwise treat it as a built-in flavour name and look it up
|
|
7
|
+
* under src/flavours/{name}/.
|
|
8
|
+
* - Returns null when no flavour is specified.
|
|
9
|
+
* - Throws when a flavour is specified but cannot be found.
|
|
10
|
+
*/
|
|
11
|
+
export declare const resolveFlavour: (flavour: string | null) => string | null;
|