ridgeline 0.8.1 → 0.8.2
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/dist/catalog/build-catalog.js +2 -1
- package/dist/catalog/build-catalog.js.map +1 -1
- package/dist/catalog/classify.js +2 -1
- package/dist/catalog/classify.js.map +1 -1
- package/dist/catalog/pack-sprites.js +3 -2
- package/dist/catalog/pack-sprites.js.map +1 -1
- package/dist/catalog/vision-describe.js +3 -2
- package/dist/catalog/vision-describe.js.map +1 -1
- package/dist/cli.js +35 -16
- package/dist/cli.js.map +1 -1
- package/dist/commands/qa-workflow.js +6 -5
- package/dist/commands/qa-workflow.js.map +1 -1
- package/dist/commands/research.d.ts +2 -0
- package/dist/commands/research.js +2 -0
- package/dist/commands/research.js.map +1 -1
- package/dist/commands/spec.d.ts +2 -0
- package/dist/commands/spec.js +2 -0
- package/dist/commands/spec.js.map +1 -1
- package/dist/config.js +2 -1
- package/dist/config.js.map +1 -1
- package/dist/engine/claude/claude.exec.d.ts +11 -0
- package/dist/engine/claude/claude.exec.js +73 -36
- package/dist/engine/claude/claude.exec.js.map +1 -1
- package/dist/engine/claude/stable.prompt.d.ts +31 -0
- package/dist/engine/claude/stable.prompt.js +137 -0
- package/dist/engine/claude/stable.prompt.js.map +1 -0
- package/dist/engine/claude/stream.display.d.ts +1 -1
- package/dist/engine/claude/stream.display.js +2 -1
- package/dist/engine/claude/stream.display.js.map +1 -1
- package/dist/engine/pipeline/ensemble.exec.d.ts +41 -3
- package/dist/engine/pipeline/ensemble.exec.js +294 -92
- package/dist/engine/pipeline/ensemble.exec.js.map +1 -1
- package/dist/engine/pipeline/phase.sequence.js +9 -3
- package/dist/engine/pipeline/phase.sequence.js.map +1 -1
- package/dist/engine/pipeline/pipeline.shared.d.ts +7 -0
- package/dist/engine/pipeline/pipeline.shared.js +20 -1
- package/dist/engine/pipeline/pipeline.shared.js.map +1 -1
- package/dist/engine/pipeline/research.exec.d.ts +2 -0
- package/dist/engine/pipeline/research.exec.js +52 -5
- package/dist/engine/pipeline/research.exec.js.map +1 -1
- package/dist/engine/pipeline/review.exec.d.ts +2 -1
- package/dist/engine/pipeline/review.exec.js +13 -4
- package/dist/engine/pipeline/review.exec.js.map +1 -1
- package/dist/engine/pipeline/specialist.verdict.d.ts +19 -0
- package/dist/engine/pipeline/specialist.verdict.js +189 -0
- package/dist/engine/pipeline/specialist.verdict.js.map +1 -0
- package/dist/engine/pipeline/specify.exec.d.ts +2 -0
- package/dist/engine/pipeline/specify.exec.js +158 -5
- package/dist/engine/pipeline/specify.exec.js.map +1 -1
- package/dist/stores/feedback.format.js +9 -0
- package/dist/stores/feedback.format.js.map +1 -1
- package/dist/stores/feedback.parse.js +2 -0
- package/dist/stores/feedback.parse.js.map +1 -1
- package/dist/stores/settings.d.ts +7 -0
- package/dist/stores/settings.js +10 -1
- package/dist/stores/settings.js.map +1 -1
- package/dist/stores/trajectory.d.ts +9 -2
- package/dist/stores/trajectory.js +6 -0
- package/dist/stores/trajectory.js.map +1 -1
- package/dist/types.d.ts +36 -2
- package/dist/ui/preflight.d.ts +6 -0
- package/dist/ui/preflight.js +12 -0
- package/dist/ui/preflight.js.map +1 -1
- package/dist/utils/flavour-removed.js +2 -2
- package/package.json +1 -1
|
@@ -3,6 +3,8 @@ 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
5
|
const stream_result_1 = require("./stream.result");
|
|
6
|
+
const stable_prompt_1 = require("./stable.prompt");
|
|
7
|
+
const trajectory_1 = require("../../stores/trajectory");
|
|
6
8
|
/** Default: kill if no stdout arrives within 2 minutes of spawn. */
|
|
7
9
|
const DEFAULT_STARTUP_TIMEOUT_MS = 2 * 60 * 1000;
|
|
8
10
|
/** Default: kill if no stdout arrives for 5 minutes during execution. */
|
|
@@ -43,40 +45,82 @@ const killAllClaudeSync = () => {
|
|
|
43
45
|
}
|
|
44
46
|
};
|
|
45
47
|
exports.killAllClaudeSync = killAllClaudeSync;
|
|
48
|
+
const buildBaseArgs = (opts) => {
|
|
49
|
+
const args = [
|
|
50
|
+
"-p",
|
|
51
|
+
"--output-format", "stream-json",
|
|
52
|
+
"--model", opts.model,
|
|
53
|
+
"--verbose",
|
|
54
|
+
"--setting-sources", "project,local",
|
|
55
|
+
];
|
|
56
|
+
if (opts.allowedTools && opts.allowedTools.length > 0) {
|
|
57
|
+
args.push("--allowedTools", opts.allowedTools.join(","));
|
|
58
|
+
}
|
|
59
|
+
if (opts.sessionId) {
|
|
60
|
+
args.push("--resume", opts.sessionId);
|
|
61
|
+
}
|
|
62
|
+
if (opts.agents && Object.keys(opts.agents).length > 0) {
|
|
63
|
+
args.push("--agents", JSON.stringify(opts.agents));
|
|
64
|
+
}
|
|
65
|
+
if (opts.pluginDirs) {
|
|
66
|
+
for (const dir of opts.pluginDirs) {
|
|
67
|
+
args.push("--plugin-dir", dir);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (opts.jsonSchema) {
|
|
71
|
+
args.push("--json-schema", opts.jsonSchema);
|
|
72
|
+
}
|
|
73
|
+
// Append to Claude Code's default system prompt so harness-level context
|
|
74
|
+
// (skill discovery, built-in reminders) is preserved alongside ridgeline's
|
|
75
|
+
// agent prompts.
|
|
76
|
+
args.push("--append-system-prompt", opts.systemPrompt);
|
|
77
|
+
return args;
|
|
78
|
+
};
|
|
79
|
+
const logStableHash = (buildDir, hash) => {
|
|
80
|
+
if (!buildDir)
|
|
81
|
+
return;
|
|
82
|
+
try {
|
|
83
|
+
(0, trajectory_1.logTrajectory)(buildDir, "prompt_stable_hash", null, `stable prompt sha256: ${hash}`, { promptStableHash: hash });
|
|
84
|
+
}
|
|
85
|
+
catch { /* best-effort */ }
|
|
86
|
+
};
|
|
87
|
+
const logCachingUnavailable = (buildDir) => {
|
|
88
|
+
if (!buildDir || !(0, stable_prompt_1.shouldLogUnavailableOnce)())
|
|
89
|
+
return;
|
|
90
|
+
try {
|
|
91
|
+
(0, trajectory_1.logTrajectory)(buildDir, "prompt_stable_hash", null, "caching code path skipped: claude CLI does not expose --exclude-dynamic-system-prompt-sections", { reason: "cli_flag_unavailable" });
|
|
92
|
+
}
|
|
93
|
+
catch { /* best-effort */ }
|
|
94
|
+
};
|
|
95
|
+
const applyCachingArgs = (args, opts) => {
|
|
96
|
+
if (!opts.stablePrompt || opts.stablePrompt.length === 0)
|
|
97
|
+
return;
|
|
98
|
+
if (!(0, stable_prompt_1.detectExcludeDynamicFlag)(opts.helpRunner)) {
|
|
99
|
+
logCachingUnavailable(opts.buildDir);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const stable = (0, stable_prompt_1.writeStablePromptFile)(opts.stablePrompt);
|
|
103
|
+
args.push("--append-system-prompt-file", stable.path);
|
|
104
|
+
args.push("--exclude-dynamic-system-prompt-sections");
|
|
105
|
+
logStableHash(opts.buildDir, stable.hash);
|
|
106
|
+
};
|
|
107
|
+
const classifyCloseError = (code, stderrData) => {
|
|
108
|
+
const lower = stderrData.toLowerCase();
|
|
109
|
+
const isAuth = lower.includes("authentication") || lower.includes("unauthorized") ||
|
|
110
|
+
lower.includes("forbidden") || lower.includes("oauth token has expired") ||
|
|
111
|
+
lower.includes("invalid_api_key");
|
|
112
|
+
return isAuth
|
|
113
|
+
? new Error("Authentication failed. Refresh your OAuth token or API key and resume.")
|
|
114
|
+
: new Error(`claude exited with code ${code}: ${stderrData}`);
|
|
115
|
+
};
|
|
46
116
|
const invokeClaude = async (opts) => {
|
|
47
117
|
const provider = opts.sandboxProvider ?? null;
|
|
48
118
|
if (provider?.syncRules) {
|
|
49
119
|
await provider.syncRules(opts.networkAllowlist ?? []);
|
|
50
120
|
}
|
|
51
121
|
return new Promise((resolve, reject) => {
|
|
52
|
-
const args =
|
|
53
|
-
|
|
54
|
-
"--output-format", "stream-json",
|
|
55
|
-
"--model", opts.model,
|
|
56
|
-
"--verbose",
|
|
57
|
-
"--setting-sources", "project,local",
|
|
58
|
-
];
|
|
59
|
-
if (opts.allowedTools && opts.allowedTools.length > 0) {
|
|
60
|
-
args.push("--allowedTools", opts.allowedTools.join(","));
|
|
61
|
-
}
|
|
62
|
-
if (opts.sessionId) {
|
|
63
|
-
args.push("--resume", opts.sessionId);
|
|
64
|
-
}
|
|
65
|
-
if (opts.agents && Object.keys(opts.agents).length > 0) {
|
|
66
|
-
args.push("--agents", JSON.stringify(opts.agents));
|
|
67
|
-
}
|
|
68
|
-
if (opts.pluginDirs) {
|
|
69
|
-
for (const dir of opts.pluginDirs) {
|
|
70
|
-
args.push("--plugin-dir", dir);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
if (opts.jsonSchema) {
|
|
74
|
-
args.push("--json-schema", opts.jsonSchema);
|
|
75
|
-
}
|
|
76
|
-
// Append to Claude Code's default system prompt so harness-level context
|
|
77
|
-
// (skill discovery, built-in reminders) is preserved alongside ridgeline's
|
|
78
|
-
// agent prompts.
|
|
79
|
-
args.push("--append-system-prompt", opts.systemPrompt);
|
|
122
|
+
const args = buildBaseArgs(opts);
|
|
123
|
+
applyCachingArgs(args, opts);
|
|
80
124
|
const spawnCmd = provider ? provider.command : "claude";
|
|
81
125
|
const spawnArgs = provider
|
|
82
126
|
? [...provider.buildArgs(opts.cwd, opts.networkAllowlist ?? [], opts.additionalWritePaths), "claude", ...args]
|
|
@@ -158,14 +202,7 @@ const invokeClaude = async (opts) => {
|
|
|
158
202
|
return;
|
|
159
203
|
}
|
|
160
204
|
if (code !== 0 && !stdoutData.trim()) {
|
|
161
|
-
|
|
162
|
-
if (lower.includes("authentication") || lower.includes("unauthorized") ||
|
|
163
|
-
lower.includes("forbidden") || lower.includes("oauth token has expired") ||
|
|
164
|
-
lower.includes("invalid_api_key")) {
|
|
165
|
-
reject(new Error("Authentication failed. Refresh your OAuth token or API key and resume."));
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
reject(new Error(`claude exited with code ${code}: ${stderrData}`));
|
|
205
|
+
reject(classifyCloseError(code, stderrData));
|
|
169
206
|
return;
|
|
170
207
|
}
|
|
171
208
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.exec.js","sourceRoot":"","sources":["../../../src/engine/claude/claude.exec.ts"],"names":[],"mappings":";;;AAAA,2DAAwD;AAExD,mDAA+C;
|
|
1
|
+
{"version":3,"file":"claude.exec.js","sourceRoot":"","sources":["../../../src/engine/claude/claude.exec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export interface StablePromptParts {
|
|
2
|
+
constraintsMd: string;
|
|
3
|
+
tasteMd?: string | null;
|
|
4
|
+
specMd?: string | null;
|
|
5
|
+
}
|
|
6
|
+
export interface StablePromptFile {
|
|
7
|
+
path: string;
|
|
8
|
+
hash: string;
|
|
9
|
+
tokenEstimate: number;
|
|
10
|
+
}
|
|
11
|
+
export type HelpRunner = () => string;
|
|
12
|
+
export declare const buildStablePrompt: (parts: StablePromptParts) => string;
|
|
13
|
+
export declare const computeStableHash: (content: string) => string;
|
|
14
|
+
/**
|
|
15
|
+
* Write (or reuse) the stable-block temp file named by sha256 of its content.
|
|
16
|
+
* Files persist for the process lifetime and are unlinked on exit.
|
|
17
|
+
*/
|
|
18
|
+
export declare const writeStablePromptFile: (content: string) => StablePromptFile;
|
|
19
|
+
/** Rough 4 chars ≈ 1 token heuristic; sufficient for the preflight threshold check. */
|
|
20
|
+
export declare const approximateTokenCount: (content: string) => number;
|
|
21
|
+
/**
|
|
22
|
+
* Minimum cacheable prefix in tokens per model family.
|
|
23
|
+
* Opus 4.5/4.6/4.7 and Haiku 4.5 → 4,096; Sonnet 4.6 → 2,048.
|
|
24
|
+
*/
|
|
25
|
+
export declare const minCacheableTokens: (model: string) => number;
|
|
26
|
+
export declare const detectExcludeDynamicFlag: (runner?: HelpRunner) => boolean;
|
|
27
|
+
export declare const shouldLogUnavailableOnce: () => boolean;
|
|
28
|
+
/** Test helper: reset internal module state. */
|
|
29
|
+
export declare const __resetStablePromptState: () => void;
|
|
30
|
+
/** Test helper: inspect tracked files (read-only snapshot). */
|
|
31
|
+
export declare const __trackedTempFiles: () => string[];
|
|
@@ -0,0 +1,137 @@
|
|
|
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.__trackedTempFiles = exports.__resetStablePromptState = exports.shouldLogUnavailableOnce = exports.detectExcludeDynamicFlag = exports.minCacheableTokens = exports.approximateTokenCount = exports.writeStablePromptFile = exports.computeStableHash = exports.buildStablePrompt = void 0;
|
|
37
|
+
const os = __importStar(require("node:os"));
|
|
38
|
+
const path = __importStar(require("node:path"));
|
|
39
|
+
const fs = __importStar(require("node:fs"));
|
|
40
|
+
const node_crypto_1 = require("node:crypto");
|
|
41
|
+
const node_child_process_1 = require("node:child_process");
|
|
42
|
+
const buildStablePrompt = (parts) => {
|
|
43
|
+
const sections = [];
|
|
44
|
+
sections.push(`## constraints.md\n\n${parts.constraintsMd.trimEnd()}\n`);
|
|
45
|
+
if (parts.tasteMd && parts.tasteMd.trim().length > 0) {
|
|
46
|
+
sections.push(`## taste.md\n\n${parts.tasteMd.trimEnd()}\n`);
|
|
47
|
+
}
|
|
48
|
+
if (parts.specMd && parts.specMd.trim().length > 0) {
|
|
49
|
+
sections.push(`## spec.md\n\n${parts.specMd.trimEnd()}\n`);
|
|
50
|
+
}
|
|
51
|
+
return sections.join("\n");
|
|
52
|
+
};
|
|
53
|
+
exports.buildStablePrompt = buildStablePrompt;
|
|
54
|
+
const computeStableHash = (content) => (0, node_crypto_1.createHash)("sha256").update(content).digest("hex");
|
|
55
|
+
exports.computeStableHash = computeStableHash;
|
|
56
|
+
const trackedTempFiles = new Set();
|
|
57
|
+
let cleanupRegistered = false;
|
|
58
|
+
const registerCleanup = () => {
|
|
59
|
+
if (cleanupRegistered)
|
|
60
|
+
return;
|
|
61
|
+
cleanupRegistered = true;
|
|
62
|
+
process.on("exit", () => {
|
|
63
|
+
for (const fp of trackedTempFiles) {
|
|
64
|
+
try {
|
|
65
|
+
fs.unlinkSync(fp);
|
|
66
|
+
}
|
|
67
|
+
catch { /* best-effort */ }
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Write (or reuse) the stable-block temp file named by sha256 of its content.
|
|
73
|
+
* Files persist for the process lifetime and are unlinked on exit.
|
|
74
|
+
*/
|
|
75
|
+
const writeStablePromptFile = (content) => {
|
|
76
|
+
const hash = (0, exports.computeStableHash)(content);
|
|
77
|
+
const fp = path.join(os.tmpdir(), `ridgeline-stable-${hash}.md`);
|
|
78
|
+
if (!fs.existsSync(fp)) {
|
|
79
|
+
fs.writeFileSync(fp, content);
|
|
80
|
+
}
|
|
81
|
+
trackedTempFiles.add(fp);
|
|
82
|
+
registerCleanup();
|
|
83
|
+
return { path: fp, hash, tokenEstimate: (0, exports.approximateTokenCount)(content) };
|
|
84
|
+
};
|
|
85
|
+
exports.writeStablePromptFile = writeStablePromptFile;
|
|
86
|
+
/** Rough 4 chars ≈ 1 token heuristic; sufficient for the preflight threshold check. */
|
|
87
|
+
const approximateTokenCount = (content) => Math.ceil(content.length / 4);
|
|
88
|
+
exports.approximateTokenCount = approximateTokenCount;
|
|
89
|
+
/**
|
|
90
|
+
* Minimum cacheable prefix in tokens per model family.
|
|
91
|
+
* Opus 4.5/4.6/4.7 and Haiku 4.5 → 4,096; Sonnet 4.6 → 2,048.
|
|
92
|
+
*/
|
|
93
|
+
const minCacheableTokens = (model) => {
|
|
94
|
+
const m = model.toLowerCase();
|
|
95
|
+
if (m.includes("sonnet"))
|
|
96
|
+
return 2048;
|
|
97
|
+
return 4096;
|
|
98
|
+
};
|
|
99
|
+
exports.minCacheableTokens = minCacheableTokens;
|
|
100
|
+
const defaultHelpRunner = () => {
|
|
101
|
+
const r = (0, node_child_process_1.spawnSync)("claude", ["--help"], { encoding: "utf-8", timeout: 10000 });
|
|
102
|
+
return `${r.stdout ?? ""}${r.stderr ?? ""}`;
|
|
103
|
+
};
|
|
104
|
+
let cachedFlagDetection = null;
|
|
105
|
+
const detectExcludeDynamicFlag = (runner) => {
|
|
106
|
+
if (cachedFlagDetection !== null)
|
|
107
|
+
return cachedFlagDetection;
|
|
108
|
+
try {
|
|
109
|
+
const help = (runner ?? defaultHelpRunner)();
|
|
110
|
+
cachedFlagDetection = help.includes("--exclude-dynamic-system-prompt-sections");
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
cachedFlagDetection = false;
|
|
114
|
+
}
|
|
115
|
+
return cachedFlagDetection;
|
|
116
|
+
};
|
|
117
|
+
exports.detectExcludeDynamicFlag = detectExcludeDynamicFlag;
|
|
118
|
+
let unavailableLogged = false;
|
|
119
|
+
const shouldLogUnavailableOnce = () => {
|
|
120
|
+
if (unavailableLogged)
|
|
121
|
+
return false;
|
|
122
|
+
unavailableLogged = true;
|
|
123
|
+
return true;
|
|
124
|
+
};
|
|
125
|
+
exports.shouldLogUnavailableOnce = shouldLogUnavailableOnce;
|
|
126
|
+
/** Test helper: reset internal module state. */
|
|
127
|
+
const __resetStablePromptState = () => {
|
|
128
|
+
cachedFlagDetection = null;
|
|
129
|
+
unavailableLogged = false;
|
|
130
|
+
trackedTempFiles.clear();
|
|
131
|
+
cleanupRegistered = false;
|
|
132
|
+
};
|
|
133
|
+
exports.__resetStablePromptState = __resetStablePromptState;
|
|
134
|
+
/** Test helper: inspect tracked files (read-only snapshot). */
|
|
135
|
+
const __trackedTempFiles = () => [...trackedTempFiles];
|
|
136
|
+
exports.__trackedTempFiles = __trackedTempFiles;
|
|
137
|
+
//# sourceMappingURL=stable.prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stable.prompt.js","sourceRoot":"","sources":["../../../src/engine/claude/stable.prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ interface DisplayCallbackOptions {
|
|
|
3
3
|
suppressJsonBlock?: boolean;
|
|
4
4
|
/** When set, strip this prefix from tool-call file paths so the display shows relative paths. */
|
|
5
5
|
projectRoot?: string;
|
|
6
|
-
/** When set, render streamed text
|
|
6
|
+
/** When set, render streamed text dimmed. */
|
|
7
7
|
dimText?: boolean;
|
|
8
8
|
}
|
|
9
9
|
/**
|
|
@@ -4,6 +4,7 @@ exports.createDisplayCallbacks = void 0;
|
|
|
4
4
|
const stream_parse_1 = require("./stream.parse");
|
|
5
5
|
const spinner_1 = require("../../ui/spinner");
|
|
6
6
|
const transcript_1 = require("../../ui/transcript");
|
|
7
|
+
const color_1 = require("../../ui/color");
|
|
7
8
|
const RESUME_DEBOUNCE_MS = 200;
|
|
8
9
|
/**
|
|
9
10
|
* Create an onStdout callback that streams assistant text to stdout.
|
|
@@ -52,7 +53,7 @@ const createDisplayCallbacks = (opts) => {
|
|
|
52
53
|
if (!lastCharWasNewline) {
|
|
53
54
|
process.stdout.write("\n");
|
|
54
55
|
}
|
|
55
|
-
process.stdout.write(opts?.dimText ?
|
|
56
|
+
process.stdout.write(opts?.dimText ? (0, color_1.hint)(text, { force: true }) : text);
|
|
56
57
|
(0, transcript_1.appendTranscript)(text);
|
|
57
58
|
lastCharWasNewline = text.endsWith("\n");
|
|
58
59
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream.display.js","sourceRoot":"","sources":["../../../src/engine/claude/stream.display.ts"],"names":[],"mappings":";;;AAAA,iDAAoD;AACpD,8CAA+C;AAC/C,oDAAsD;
|
|
1
|
+
{"version":3,"file":"stream.display.js","sourceRoot":"","sources":["../../../src/engine/claude/stream.display.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RidgelineConfig, PhaseInfo, ClaudeResult, EnsembleResult } from "../../types";
|
|
1
|
+
import { RidgelineConfig, PhaseInfo, ClaudeResult, EnsembleResult, SpecialistStage } from "../../types";
|
|
2
2
|
import { SpecialistDef } from "../discovery/agent.registry";
|
|
3
3
|
/**
|
|
4
4
|
* Attempt to extract a JSON object from a string that may be wrapped in
|
|
@@ -37,8 +37,13 @@ type EnsembleConfig<TDraft> = {
|
|
|
37
37
|
specialistTools?: string[];
|
|
38
38
|
/** Model name for invokeClaude */
|
|
39
39
|
model: string;
|
|
40
|
-
/**
|
|
40
|
+
/** Synthesizer timeout in minutes. */
|
|
41
41
|
timeoutMinutes: number;
|
|
42
|
+
/**
|
|
43
|
+
* Per-specialist call timeout in seconds. Defaults to 180. When `isStructured`
|
|
44
|
+
* is false (research), caller may override with a longer value.
|
|
45
|
+
*/
|
|
46
|
+
specialistTimeoutSeconds?: number;
|
|
42
47
|
/** Budget cap (null = unlimited) */
|
|
43
48
|
maxBudgetUsd: number | null;
|
|
44
49
|
/** Optional post-synthesis verification. Throw to signal failure. */
|
|
@@ -53,7 +58,6 @@ type EnsembleConfig<TDraft> = {
|
|
|
53
58
|
* Enable two-round ensemble: after round 1 (independent drafts), each specialist
|
|
54
59
|
* sees all other drafts and produces annotations (concerns, agreements, gaps).
|
|
55
60
|
* The synthesizer then receives both drafts and annotations.
|
|
56
|
-
* Default: false (opt-in, because it roughly doubles specialist cost).
|
|
57
61
|
*/
|
|
58
62
|
isTwoRound?: boolean;
|
|
59
63
|
/** Build the annotation prompt for round 2, given other drafts. Requires isTwoRound. */
|
|
@@ -61,8 +65,42 @@ type EnsembleConfig<TDraft> = {
|
|
|
61
65
|
perspective: string;
|
|
62
66
|
draft: TDraft;
|
|
63
67
|
}[]) => string;
|
|
68
|
+
/** Stage identifier for structured-verdict agreement detection. */
|
|
69
|
+
stage?: SpecialistStage;
|
|
70
|
+
/**
|
|
71
|
+
* Build directory used for trajectory logging. When absent, specialist
|
|
72
|
+
* failures and agreement skips are logged to stderr only.
|
|
73
|
+
*/
|
|
74
|
+
buildDir?: string;
|
|
75
|
+
/**
|
|
76
|
+
* Extract the raw string used for skeleton parsing from a specialist's draft.
|
|
77
|
+
* Defaults to the ClaudeResult.result text.
|
|
78
|
+
*/
|
|
79
|
+
skeletonSource?: (result: ClaudeResult, draft: TDraft) => string;
|
|
80
|
+
/**
|
|
81
|
+
* When all specialists' skeletons agree, produce the canonical artifact
|
|
82
|
+
* from the first specialist's draft and return a synthetic synthesizer
|
|
83
|
+
* result describing the skip. When absent, agreement detection is disabled.
|
|
84
|
+
*/
|
|
85
|
+
onAgreementSkip?: (successful: {
|
|
86
|
+
perspective: string;
|
|
87
|
+
result: ClaudeResult;
|
|
88
|
+
draft: TDraft;
|
|
89
|
+
}[]) => Promise<ClaudeResult> | ClaudeResult;
|
|
64
90
|
};
|
|
65
91
|
export declare const invokeEnsemble: <TDraft>(config: EnsembleConfig<TDraft>) => Promise<EnsembleResult>;
|
|
92
|
+
/**
|
|
93
|
+
* Cap a registered specialist list to the configured ensemble size.
|
|
94
|
+
* Default size: 2; thorough mode: 3.
|
|
95
|
+
*/
|
|
96
|
+
export declare const selectSpecialists: (all: SpecialistDef[], { isThorough }: {
|
|
97
|
+
isThorough: boolean;
|
|
98
|
+
}) => SpecialistDef[];
|
|
99
|
+
/**
|
|
100
|
+
* Append the audit note that marks an agreement-based synthesis skip.
|
|
101
|
+
* Idempotent when applied more than once to the same artifact.
|
|
102
|
+
*/
|
|
103
|
+
export declare const appendSkipAuditNote: (filepath: string, count: number, stage: SpecialistStage) => void;
|
|
66
104
|
export declare const invokePlanner: (config: RidgelineConfig) => Promise<{
|
|
67
105
|
result: ClaudeResult;
|
|
68
106
|
phases: PhaseInfo[];
|