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.
Files changed (65) hide show
  1. package/dist/catalog/build-catalog.js +2 -1
  2. package/dist/catalog/build-catalog.js.map +1 -1
  3. package/dist/catalog/classify.js +2 -1
  4. package/dist/catalog/classify.js.map +1 -1
  5. package/dist/catalog/pack-sprites.js +3 -2
  6. package/dist/catalog/pack-sprites.js.map +1 -1
  7. package/dist/catalog/vision-describe.js +3 -2
  8. package/dist/catalog/vision-describe.js.map +1 -1
  9. package/dist/cli.js +35 -16
  10. package/dist/cli.js.map +1 -1
  11. package/dist/commands/qa-workflow.js +6 -5
  12. package/dist/commands/qa-workflow.js.map +1 -1
  13. package/dist/commands/research.d.ts +2 -0
  14. package/dist/commands/research.js +2 -0
  15. package/dist/commands/research.js.map +1 -1
  16. package/dist/commands/spec.d.ts +2 -0
  17. package/dist/commands/spec.js +2 -0
  18. package/dist/commands/spec.js.map +1 -1
  19. package/dist/config.js +2 -1
  20. package/dist/config.js.map +1 -1
  21. package/dist/engine/claude/claude.exec.d.ts +11 -0
  22. package/dist/engine/claude/claude.exec.js +73 -36
  23. package/dist/engine/claude/claude.exec.js.map +1 -1
  24. package/dist/engine/claude/stable.prompt.d.ts +31 -0
  25. package/dist/engine/claude/stable.prompt.js +137 -0
  26. package/dist/engine/claude/stable.prompt.js.map +1 -0
  27. package/dist/engine/claude/stream.display.d.ts +1 -1
  28. package/dist/engine/claude/stream.display.js +2 -1
  29. package/dist/engine/claude/stream.display.js.map +1 -1
  30. package/dist/engine/pipeline/ensemble.exec.d.ts +41 -3
  31. package/dist/engine/pipeline/ensemble.exec.js +294 -92
  32. package/dist/engine/pipeline/ensemble.exec.js.map +1 -1
  33. package/dist/engine/pipeline/phase.sequence.js +9 -3
  34. package/dist/engine/pipeline/phase.sequence.js.map +1 -1
  35. package/dist/engine/pipeline/pipeline.shared.d.ts +7 -0
  36. package/dist/engine/pipeline/pipeline.shared.js +20 -1
  37. package/dist/engine/pipeline/pipeline.shared.js.map +1 -1
  38. package/dist/engine/pipeline/research.exec.d.ts +2 -0
  39. package/dist/engine/pipeline/research.exec.js +52 -5
  40. package/dist/engine/pipeline/research.exec.js.map +1 -1
  41. package/dist/engine/pipeline/review.exec.d.ts +2 -1
  42. package/dist/engine/pipeline/review.exec.js +13 -4
  43. package/dist/engine/pipeline/review.exec.js.map +1 -1
  44. package/dist/engine/pipeline/specialist.verdict.d.ts +19 -0
  45. package/dist/engine/pipeline/specialist.verdict.js +189 -0
  46. package/dist/engine/pipeline/specialist.verdict.js.map +1 -0
  47. package/dist/engine/pipeline/specify.exec.d.ts +2 -0
  48. package/dist/engine/pipeline/specify.exec.js +158 -5
  49. package/dist/engine/pipeline/specify.exec.js.map +1 -1
  50. package/dist/stores/feedback.format.js +9 -0
  51. package/dist/stores/feedback.format.js.map +1 -1
  52. package/dist/stores/feedback.parse.js +2 -0
  53. package/dist/stores/feedback.parse.js.map +1 -1
  54. package/dist/stores/settings.d.ts +7 -0
  55. package/dist/stores/settings.js +10 -1
  56. package/dist/stores/settings.js.map +1 -1
  57. package/dist/stores/trajectory.d.ts +9 -2
  58. package/dist/stores/trajectory.js +6 -0
  59. package/dist/stores/trajectory.js.map +1 -1
  60. package/dist/types.d.ts +36 -2
  61. package/dist/ui/preflight.d.ts +6 -0
  62. package/dist/ui/preflight.js +12 -0
  63. package/dist/ui/preflight.js.map +1 -1
  64. package/dist/utils/flavour-removed.js +2 -2
  65. 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
- "-p",
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
- const lower = stderrData.toLowerCase();
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;AAG/C,oEAAoE;AACpE,MAAM,0BAA0B,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA;AAEhD,yEAAyE;AACzE,MAAM,wBAAwB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA;AAE9C,+DAA+D;AAC/D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAgB,CAAA;AAEzC,wEAAwE;AACjE,MAAM,aAAa,GAAG,GAAS,EAAE;IACtC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,IAAI,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IACD,UAAU,CAAC,GAAG,EAAE;QACd,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;IACH,CAAC,EAAE,IAAI,CAAC,CAAA;AACV,CAAC,CAAA;AAbY,QAAA,aAAa,iBAazB;AAED,6EAA6E;AACtE,MAAM,iBAAiB,GAAG,GAAS,EAAE;IAC1C,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,IAAI,CAAC;gBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;AACH,CAAC,CAAA;AANY,QAAA,iBAAiB,qBAM7B;AAwBM,MAAM,YAAY,GAAG,KAAK,EAAE,IAAmB,EAAyB,EAAE;IAC/E,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,IAAI,IAAI,CAAA;IAC7C,IAAI,QAAQ,EAAE,SAAS,EAAE,CAAC;QACxB,MAAM,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAA;IACvD,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAa;YACrB,IAAI;YACJ,iBAAiB,EAAE,aAAa;YAChC,SAAS,EAAE,IAAI,CAAC,KAAK;YACrB,WAAW;YACX,mBAAmB,EAAE,eAAe;SACrC,CAAA;QAED,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QAC1D,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;QACvC,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QACpD,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC,CAAA;YAChC,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,UAAU,CAAC,CAAA;QAC7C,CAAC;QAED,yEAAyE;QACzE,2EAA2E;QAC3E,iBAAiB;QACjB,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;QAEtD,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAA;QACvD,MAAM,SAAS,GAAG,QAAQ;YACxB,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE,EAAE,IAAI,CAAC,oBAAoB,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;YAC9G,CAAC,CAAC,IAAI,CAAA;QAER,MAAM,IAAI,GAAiB,IAAA,0BAAK,EAAC,QAAQ,EAAE,SAAS,EAAE;YACpD,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,QAAQ,EAAE,IAAI;YACd,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG;SACzE,CAAC,CAAA;QACF,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAEnB,IAAI,UAAU,GAAG,EAAE,CAAA;QACnB,IAAI,UAAU,GAAG,EAAE,CAAA;QACnB,oCAAoC;QACpC,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,IAAI,WAAW,GAAG,EAAE,CAAA;QACpB,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,IAAI,0BAA0B,CAAA;QACrE,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,IAAI,wBAAwB,CAAA;QAE/D,MAAM,QAAQ,GAAG,CAAC,MAAsB,EAAE,EAAE;YAC1C,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC;oBAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;YACtE,CAAC;QACH,CAAC,CAAA;QAED,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,EAAE;YACrC,OAAO,GAAG,IAAI,CAAA;YACd,WAAW,GAAG,MAAM,CAAA;YACpB,QAAQ,CAAC,SAAS,CAAC,CAAA;YACnB,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAA;QAC7C,CAAC,CAAA;QAED,4DAA4D;QAC5D,IAAI,UAAU,GAAyC,UAAU,CAAC,GAAG,EAAE;YACrE,WAAW,CAAC,6BAA6B,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,8BAA8B,CAAC,CAAA;QACtG,CAAC,EAAE,SAAS,CAAC,CAAA;QAEb,MAAM,eAAe,GAAG,GAAG,EAAE;YAC3B,IAAI,OAAO;gBAAE,OAAM;YACnB,IAAI,UAAU;gBAAE,YAAY,CAAC,UAAU,CAAC,CAAA;YACxC,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC3B,WAAW,CAAC,0BAA0B,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAA;YACtF,CAAC,EAAE,OAAO,CAAC,CAAA;QACb,CAAC,CAAA;QAED,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;YACpC,UAAU,IAAI,IAAI,CAAA;YAClB,eAAe,EAAE,CAAA;YACjB,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAA;QACvB,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;YACpC,UAAU,IAAI,IAAI,CAAA;YAClB,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAA;QACvB,CAAC,CAAC,CAAA;QAEF,yBAAyB;QACzB,IAAI,QAAQ,GAAG,KAAK,CAAA;QACpB,IAAI,KAAK,GAAyC,IAAI,CAAA;QAEtD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBACtB,QAAQ,GAAG,IAAI,CAAA;gBACf,QAAQ,CAAC,SAAS,CAAC,CAAA;gBACnB,UAAU,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,CAAA;YAC7C,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAA;QACpB,CAAC;QAED,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YACtB,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAA;YAC9B,IAAI,UAAU;gBAAE,YAAY,CAAC,UAAU,CAAC,CAAA;YAExC,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAA;gBAChD,OAAM;YACR,CAAC;YAED,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,CAAC,IAAI,KAAK,CAAC,8BAA8B,WAAW,EAAE,CAAC,CAAC,CAAA;gBAC9D,OAAM;YACR,CAAC;YAED,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;gBACrC,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,EAAE,CAAA;gBACtC,IAAI,KAAK,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC;oBAClE,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,yBAAyB,CAAC;oBACxE,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,CAAC;oBACtC,MAAM,CAAC,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC,CAAA;oBAC3F,OAAM;gBACR,CAAC;gBACD,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,IAAI,KAAK,UAAU,EAAE,CAAC,CAAC,CAAA;gBACnE,OAAM;YACR,CAAC;YAED,IAAI,CAAC;gBACH,OAAO,CAAC,IAAA,6BAAa,EAAC,UAAU,CAAC,CAAC,CAAA;YACpC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,KAAK,CAAC,kCAAkC,GAAG,EAAE,CAAC,CAAC,CAAA;YAC5D,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,6BAA6B;QAC7B,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAClC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,CAAA;IACnB,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAxJY,QAAA,YAAY,gBAwJxB"}
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAA6B;AAC7B,gDAAiC;AACjC,4CAA6B;AAC7B,6CAAwC;AACxC,2DAA8C;AAgBvC,MAAM,iBAAiB,GAAG,CAAC,KAAwB,EAAU,EAAE;IACpE,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,QAAQ,CAAC,IAAI,CAAC,wBAAwB,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IACxE,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrD,QAAQ,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IAC9D,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnD,QAAQ,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IAC5D,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC5B,CAAC,CAAA;AAVY,QAAA,iBAAiB,qBAU7B;AAEM,MAAM,iBAAiB,GAAG,CAAC,OAAe,EAAU,EAAE,CAC3D,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AADvC,QAAA,iBAAiB,qBACsB;AAEpD,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAA;AAC1C,IAAI,iBAAiB,GAAG,KAAK,CAAA;AAE7B,MAAM,eAAe,GAAG,GAAS,EAAE;IACjC,IAAI,iBAAiB;QAAE,OAAM;IAC7B,iBAAiB,GAAG,IAAI,CAAA;IACxB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;QACtB,KAAK,MAAM,EAAE,IAAI,gBAAgB,EAAE,CAAC;YAClC,IAAI,CAAC;gBAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;QACvD,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA;AAED;;;GAGG;AACI,MAAM,qBAAqB,GAAG,CAAC,OAAe,EAAoB,EAAE;IACzE,MAAM,IAAI,GAAG,IAAA,yBAAiB,EAAC,OAAO,CAAC,CAAA;IACvC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,oBAAoB,IAAI,KAAK,CAAC,CAAA;IAChE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;QACvB,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IAC/B,CAAC;IACD,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IACxB,eAAe,EAAE,CAAA;IACjB,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,IAAA,6BAAqB,EAAC,OAAO,CAAC,EAAE,CAAA;AAC1E,CAAC,CAAA;AATY,QAAA,qBAAqB,yBASjC;AAED,uFAAuF;AAChF,MAAM,qBAAqB,GAAG,CAAC,OAAe,EAAU,EAAE,CAC/D,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;AADlB,QAAA,qBAAqB,yBACH;AAE/B;;;GAGG;AACI,MAAM,kBAAkB,GAAG,CAAC,KAAa,EAAU,EAAE;IAC1D,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAA;IAC7B,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAA;IACrC,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAJY,QAAA,kBAAkB,sBAI9B;AAED,MAAM,iBAAiB,GAAe,GAAG,EAAE;IACzC,MAAM,CAAC,GAAG,IAAA,8BAAS,EAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;IAChF,OAAO,GAAG,CAAC,CAAC,MAAM,IAAI,EAAE,GAAG,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,CAAA;AAC7C,CAAC,CAAA;AAED,IAAI,mBAAmB,GAAmB,IAAI,CAAA;AAEvC,MAAM,wBAAwB,GAAG,CAAC,MAAmB,EAAW,EAAE;IACvE,IAAI,mBAAmB,KAAK,IAAI;QAAE,OAAO,mBAAmB,CAAA;IAC5D,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,iBAAiB,CAAC,EAAE,CAAA;QAC5C,mBAAmB,GAAG,IAAI,CAAC,QAAQ,CAAC,0CAA0C,CAAC,CAAA;IACjF,CAAC;IAAC,MAAM,CAAC;QACP,mBAAmB,GAAG,KAAK,CAAA;IAC7B,CAAC;IACD,OAAO,mBAAmB,CAAA;AAC5B,CAAC,CAAA;AATY,QAAA,wBAAwB,4BASpC;AAED,IAAI,iBAAiB,GAAG,KAAK,CAAA;AAEtB,MAAM,wBAAwB,GAAG,GAAY,EAAE;IACpD,IAAI,iBAAiB;QAAE,OAAO,KAAK,CAAA;IACnC,iBAAiB,GAAG,IAAI,CAAA;IACxB,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAJY,QAAA,wBAAwB,4BAIpC;AAED,gDAAgD;AACzC,MAAM,wBAAwB,GAAG,GAAS,EAAE;IACjD,mBAAmB,GAAG,IAAI,CAAA;IAC1B,iBAAiB,GAAG,KAAK,CAAA;IACzB,gBAAgB,CAAC,KAAK,EAAE,CAAA;IACxB,iBAAiB,GAAG,KAAK,CAAA;AAC3B,CAAC,CAAA;AALY,QAAA,wBAAwB,4BAKpC;AAED,+DAA+D;AACxD,MAAM,kBAAkB,GAAG,GAAa,EAAE,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAA;AAA1D,QAAA,kBAAkB,sBAAwC"}
@@ -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 in dim grey (ANSI 90). */
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 ? `\x1b[90m${text}\x1b[0m` : text);
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":"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"}
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
- /** Timeout in minutes */
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[];