ralphy-spec 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/README.ja.md +126 -0
  2. package/README.ko.md +126 -0
  3. package/README.md +77 -133
  4. package/README.zh.md +126 -0
  5. package/bin/ralphy-spec.js +0 -0
  6. package/dist/cli/checkpoint.d.ts +3 -0
  7. package/dist/cli/checkpoint.d.ts.map +1 -0
  8. package/dist/cli/checkpoint.js +23 -0
  9. package/dist/cli/checkpoint.js.map +1 -0
  10. package/dist/cli/init.d.ts +3 -0
  11. package/dist/cli/init.d.ts.map +1 -0
  12. package/dist/cli/init.js +66 -0
  13. package/dist/cli/init.js.map +1 -0
  14. package/dist/cli/report.d.ts +3 -0
  15. package/dist/cli/report.d.ts.map +1 -0
  16. package/dist/cli/report.js +53 -0
  17. package/dist/cli/report.js.map +1 -0
  18. package/dist/cli/run.d.ts +3 -0
  19. package/dist/cli/run.d.ts.map +1 -0
  20. package/dist/cli/run.js +79 -0
  21. package/dist/cli/run.js.map +1 -0
  22. package/dist/cli/status.d.ts +3 -0
  23. package/dist/cli/status.d.ts.map +1 -0
  24. package/dist/cli/status.js +45 -0
  25. package/dist/cli/status.js.map +1 -0
  26. package/dist/cli/tail.d.ts +3 -0
  27. package/dist/cli/tail.d.ts.map +1 -0
  28. package/dist/cli/tail.js +46 -0
  29. package/dist/cli/tail.js.map +1 -0
  30. package/dist/cli/update.d.ts +3 -0
  31. package/dist/cli/update.d.ts.map +1 -0
  32. package/dist/cli/update.js +62 -0
  33. package/dist/cli/update.js.map +1 -0
  34. package/dist/cli/validate.d.ts +3 -0
  35. package/dist/cli/validate.d.ts.map +1 -0
  36. package/dist/cli/validate.js +83 -0
  37. package/dist/cli/validate.js.map +1 -0
  38. package/dist/core/backends/claude-code.d.ts +17 -0
  39. package/dist/core/backends/claude-code.d.ts.map +1 -0
  40. package/dist/core/backends/claude-code.js +75 -0
  41. package/dist/core/backends/claude-code.js.map +1 -0
  42. package/dist/core/backends/cursor.d.ts +17 -0
  43. package/dist/core/backends/cursor.d.ts.map +1 -0
  44. package/dist/core/backends/cursor.js +75 -0
  45. package/dist/core/backends/cursor.js.map +1 -0
  46. package/dist/core/backends/noop.d.ts +10 -0
  47. package/dist/core/backends/noop.d.ts.map +1 -0
  48. package/dist/core/backends/noop.js +17 -0
  49. package/dist/core/backends/noop.js.map +1 -0
  50. package/dist/core/backends/opencode.d.ts +16 -0
  51. package/dist/core/backends/opencode.d.ts.map +1 -0
  52. package/dist/core/backends/opencode.js +73 -0
  53. package/dist/core/backends/opencode.js.map +1 -0
  54. package/dist/core/backends/types.d.ts +21 -0
  55. package/dist/core/backends/types.d.ts.map +1 -0
  56. package/dist/core/backends/types.js +3 -0
  57. package/dist/core/backends/types.js.map +1 -0
  58. package/dist/core/budgets/manager.d.ts +21 -0
  59. package/dist/core/budgets/manager.d.ts.map +1 -0
  60. package/dist/core/budgets/manager.js +48 -0
  61. package/dist/core/budgets/manager.js.map +1 -0
  62. package/dist/core/budgets/state.d.ts +25 -0
  63. package/dist/core/budgets/state.d.ts.map +1 -0
  64. package/dist/core/budgets/state.js +33 -0
  65. package/dist/core/budgets/state.js.map +1 -0
  66. package/dist/core/budgets/tiers.d.ts +32 -0
  67. package/dist/core/budgets/tiers.d.ts.map +1 -0
  68. package/dist/core/budgets/tiers.js +67 -0
  69. package/dist/core/budgets/tiers.js.map +1 -0
  70. package/dist/core/engine/context-pack.d.ts +12 -0
  71. package/dist/core/engine/context-pack.d.ts.map +1 -0
  72. package/dist/core/engine/context-pack.js +45 -0
  73. package/dist/core/engine/context-pack.js.map +1 -0
  74. package/dist/core/engine/loop.d.ts +28 -0
  75. package/dist/core/engine/loop.d.ts.map +1 -0
  76. package/dist/core/engine/loop.js +366 -0
  77. package/dist/core/engine/loop.js.map +1 -0
  78. package/dist/core/engine/phases.d.ts +2 -0
  79. package/dist/core/engine/phases.d.ts.map +1 -0
  80. package/dist/core/engine/phases.js +3 -0
  81. package/dist/core/engine/phases.js.map +1 -0
  82. package/dist/core/engine/repair.d.ts +6 -0
  83. package/dist/core/engine/repair.d.ts.map +1 -0
  84. package/dist/core/engine/repair.js +23 -0
  85. package/dist/core/engine/repair.js.map +1 -0
  86. package/dist/core/folders.d.ts +26 -0
  87. package/dist/core/folders.d.ts.map +1 -0
  88. package/dist/core/folders.js +58 -0
  89. package/dist/core/folders.js.map +1 -0
  90. package/dist/core/memory/ledger.d.ts +13 -0
  91. package/dist/core/memory/ledger.d.ts.map +1 -0
  92. package/dist/core/memory/ledger.js +24 -0
  93. package/dist/core/memory/ledger.js.map +1 -0
  94. package/dist/core/memory/persistence.d.ts +45 -0
  95. package/dist/core/memory/persistence.d.ts.map +1 -0
  96. package/dist/core/memory/persistence.js +162 -0
  97. package/dist/core/memory/persistence.js.map +1 -0
  98. package/dist/core/reporting/spend.d.ts +40 -0
  99. package/dist/core/reporting/spend.d.ts.map +1 -0
  100. package/dist/core/reporting/spend.js +157 -0
  101. package/dist/core/reporting/spend.js.map +1 -0
  102. package/dist/core/spec/dag.d.ts +7 -0
  103. package/dist/core/spec/dag.d.ts.map +1 -0
  104. package/dist/core/spec/dag.js +65 -0
  105. package/dist/core/spec/dag.js.map +1 -0
  106. package/dist/core/spec/file-contract.d.ts +13 -0
  107. package/dist/core/spec/file-contract.d.ts.map +1 -0
  108. package/dist/core/spec/file-contract.js +29 -0
  109. package/dist/core/spec/file-contract.js.map +1 -0
  110. package/dist/core/spec/loader.d.ts +8 -0
  111. package/dist/core/spec/loader.d.ts.map +1 -0
  112. package/dist/core/spec/loader.js +51 -0
  113. package/dist/core/spec/loader.js.map +1 -0
  114. package/dist/core/spec/schemas.d.ts +278 -0
  115. package/dist/core/spec/schemas.d.ts.map +1 -0
  116. package/dist/core/spec/schemas.js +207 -0
  117. package/dist/core/spec/schemas.js.map +1 -0
  118. package/dist/core/spec/types.d.ts +71 -0
  119. package/dist/core/spec/types.d.ts.map +1 -0
  120. package/dist/core/spec/types.js +3 -0
  121. package/dist/core/spec/types.js.map +1 -0
  122. package/dist/core/validators/parsers/eslint.d.ts +3 -0
  123. package/dist/core/validators/parsers/eslint.d.ts.map +1 -0
  124. package/dist/core/validators/parsers/eslint.js +35 -0
  125. package/dist/core/validators/parsers/eslint.js.map +1 -0
  126. package/dist/core/validators/parsers/jest.d.ts +3 -0
  127. package/dist/core/validators/parsers/jest.d.ts.map +1 -0
  128. package/dist/core/validators/parsers/jest.js +16 -0
  129. package/dist/core/validators/parsers/jest.js.map +1 -0
  130. package/dist/core/validators/parsers/tsc.d.ts +3 -0
  131. package/dist/core/validators/parsers/tsc.d.ts.map +1 -0
  132. package/dist/core/validators/parsers/tsc.js +32 -0
  133. package/dist/core/validators/parsers/tsc.js.map +1 -0
  134. package/dist/core/validators/runner.d.ts +8 -0
  135. package/dist/core/validators/runner.d.ts.map +1 -0
  136. package/dist/core/validators/runner.js +85 -0
  137. package/dist/core/validators/runner.js.map +1 -0
  138. package/dist/core/validators/signatures.d.ts +3 -0
  139. package/dist/core/validators/signatures.d.ts.map +1 -0
  140. package/dist/core/validators/signatures.js +10 -0
  141. package/dist/core/validators/signatures.js.map +1 -0
  142. package/dist/core/validators/types.d.ts +27 -0
  143. package/dist/core/validators/types.d.ts.map +1 -0
  144. package/dist/core/validators/types.js +3 -0
  145. package/dist/core/validators/types.js.map +1 -0
  146. package/dist/core/workspace/contract-enforcer.d.ts +54 -0
  147. package/dist/core/workspace/contract-enforcer.d.ts.map +1 -0
  148. package/dist/core/workspace/contract-enforcer.js +128 -0
  149. package/dist/core/workspace/contract-enforcer.js.map +1 -0
  150. package/dist/core/workspace/manager.d.ts +28 -0
  151. package/dist/core/workspace/manager.d.ts.map +1 -0
  152. package/dist/core/workspace/manager.js +3 -0
  153. package/dist/core/workspace/manager.js.map +1 -0
  154. package/dist/core/workspace/merge.d.ts +38 -0
  155. package/dist/core/workspace/merge.d.ts.map +1 -0
  156. package/dist/core/workspace/merge.js +92 -0
  157. package/dist/core/workspace/merge.js.map +1 -0
  158. package/dist/core/workspace/patch-mode.d.ts +22 -0
  159. package/dist/core/workspace/patch-mode.d.ts.map +1 -0
  160. package/dist/core/workspace/patch-mode.js +91 -0
  161. package/dist/core/workspace/patch-mode.js.map +1 -0
  162. package/dist/core/workspace/worktree-mode.d.ts +28 -0
  163. package/dist/core/workspace/worktree-mode.d.ts.map +1 -0
  164. package/dist/core/workspace/worktree-mode.js +156 -0
  165. package/dist/core/workspace/worktree-mode.js.map +1 -0
  166. package/dist/index.js +14 -4
  167. package/dist/index.js.map +1 -1
  168. package/dist/templates/claude-code/ralphy-archive.md +22 -0
  169. package/dist/templates/claude-code/ralphy-implement.md +30 -0
  170. package/dist/templates/claude-code/ralphy-plan.md +31 -0
  171. package/dist/templates/claude-code/ralphy-validate.md +21 -0
  172. package/dist/templates/cursor/ralphy-archive.md +20 -0
  173. package/dist/templates/cursor/ralphy-implement.md +31 -0
  174. package/dist/templates/cursor/ralphy-plan.md +39 -0
  175. package/dist/templates/cursor/ralphy-validate.md +24 -0
  176. package/dist/templates/opencode/AGENTS.md +46 -0
  177. package/dist/templates/shared/openspec-tasks-template.md +48 -0
  178. package/dist/templates/shared/project-template.yml +232 -0
  179. package/dist/templates/shared/ralph-loop-prompt-template.md +25 -0
  180. package/dist/utils/installer.d.ts.map +1 -1
  181. package/dist/utils/installer.js +31 -1
  182. package/dist/utils/installer.js.map +1 -1
  183. package/dist/utils/validator.d.ts.map +1 -1
  184. package/dist/utils/validator.js +10 -0
  185. package/dist/utils/validator.js.map +1 -1
  186. package/package.json +14 -4
  187. package/scripts/copy-templates.mjs +2 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/core/backends/claude-code.ts"],"names":[],"mappings":";;;AAAA,iCAA8B;AAG9B;;;;;GAKG;AACH,MAAa,iBAAiB;IAGC;IAFpB,EAAE,GAAG,aAAa,CAAC;IAE5B,YAA6B,OAA+B,EAAE;QAAjC,SAAI,GAAJ,IAAI,CAA6B;IAAG,CAAC;IAElE,KAAK,CAAC,SAAS,CAAC,GAAe,EAAE,KAAqB;QACpD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;QAE/C,0CAA0C;QAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAE9D,IAAI,CAAC;YACH,+DAA+D;YAC/D,iDAAiD;YACjD,MAAM,MAAM,GAAG,MAAM,IAAA,aAAK,EAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE;gBACxD,GAAG,EAAE,GAAG,CAAC,GAAG;gBACZ,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,OAAO,EAAE,iBAAiB;gBAC1D,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO;oBACL,EAAE,EAAE,IAAI;oBACR,OAAO,EAAE,+BAA+B,IAAI,CAAC,EAAE,gBAAgB,SAAS,GAAG;iBAC5E,CAAC;YACJ,CAAC;YAED,qBAAqB;YACrB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,OAAO,EAAE,gCAAgC,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CACjG,CAAC,EACD,IAAI,CACL;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,iDAAiD;YACjD,IAAI,GAAG,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC3B,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,OAAO,EACL,sFAAsF;iBACzF,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe;aAC7E,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,WAAW,CACjB,IAAmD,EACnD,SAAiB,EACjB,WAAoB;QAEpB,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,8BAA8B,SAAS,GAAG,CAAC,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;QAEzE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF;AA/ED,8CA+EC"}
@@ -0,0 +1,17 @@
1
+ import type { BackendEnv, CodingBackend, ImplementInput, ImplementOutput } from "./types";
2
+ /**
3
+ * CursorBackend shells out to the `cursor` CLI for code implementation.
4
+ *
5
+ * Note: Cursor IDE typically runs interactively. This backend sends prompts
6
+ * via the CLI and expects the user/AI to complete the task.
7
+ */
8
+ export declare class CursorBackend implements CodingBackend {
9
+ private readonly opts;
10
+ readonly id = "cursor";
11
+ constructor(opts?: {
12
+ timeoutMs?: number;
13
+ });
14
+ implement(env: BackendEnv, input: ImplementInput): Promise<ImplementOutput>;
15
+ private buildPrompt;
16
+ }
17
+ //# sourceMappingURL=cursor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../../src/core/backends/cursor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1F;;;;;GAKG;AACH,qBAAa,aAAc,YAAW,aAAa;IAGrC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,QAAQ,CAAC,EAAE,YAAY;gBAEM,IAAI,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO;IAExD,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAgDjF,OAAO,CAAC,WAAW;CA0BpB"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CursorBackend = void 0;
4
+ const execa_1 = require("execa");
5
+ /**
6
+ * CursorBackend shells out to the `cursor` CLI for code implementation.
7
+ *
8
+ * Note: Cursor IDE typically runs interactively. This backend sends prompts
9
+ * via the CLI and expects the user/AI to complete the task.
10
+ */
11
+ class CursorBackend {
12
+ opts;
13
+ id = "cursor";
14
+ constructor(opts = {}) {
15
+ this.opts = opts;
16
+ }
17
+ async implement(env, input) {
18
+ const { task, iteration, repairNotes } = input;
19
+ // Build the prompt to send to Cursor
20
+ const prompt = this.buildPrompt(task, iteration, repairNotes);
21
+ try {
22
+ // Cursor CLI: `cursor --command "prompt"` or similar
23
+ // Note: Cursor's CLI interface may vary; adjust as needed
24
+ const result = await (0, execa_1.execa)("cursor", ["--command", prompt], {
25
+ cwd: env.cwd,
26
+ timeout: this.opts.timeoutMs ?? 600_000, // 10 min default
27
+ reject: false,
28
+ stdio: "pipe",
29
+ });
30
+ if (result.exitCode === 0) {
31
+ return {
32
+ ok: true,
33
+ message: `Cursor completed task "${task.id}" (iteration ${iteration})`,
34
+ };
35
+ }
36
+ // Non-zero exit code
37
+ return {
38
+ ok: false,
39
+ message: `Cursor exited with code ${result.exitCode}: ${result.stderr || result.stdout}`.slice(0, 2000),
40
+ };
41
+ }
42
+ catch (err) {
43
+ // Handle cases where cursor CLI is not available
44
+ if (err?.code === "ENOENT") {
45
+ return {
46
+ ok: false,
47
+ message: "Cursor CLI not found. Please ensure Cursor is installed and the CLI is in PATH.",
48
+ };
49
+ }
50
+ return {
51
+ ok: false,
52
+ message: err?.message ? String(err.message).slice(0, 2000) : "Unknown error",
53
+ };
54
+ }
55
+ }
56
+ buildPrompt(task, iteration, repairNotes) {
57
+ const lines = [];
58
+ lines.push(`# Task: ${task.title ?? task.id}`);
59
+ lines.push(``);
60
+ if (task.goal) {
61
+ lines.push(`## Goal`);
62
+ lines.push(task.goal);
63
+ lines.push(``);
64
+ }
65
+ if (repairNotes) {
66
+ lines.push(`## Repair Notes (iteration ${iteration})`);
67
+ lines.push(repairNotes);
68
+ lines.push(``);
69
+ }
70
+ lines.push(`Please implement this task and ensure all validators pass.`);
71
+ return lines.join("\n");
72
+ }
73
+ }
74
+ exports.CursorBackend = CursorBackend;
75
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../src/core/backends/cursor.ts"],"names":[],"mappings":";;;AAAA,iCAA8B;AAG9B;;;;;GAKG;AACH,MAAa,aAAa;IAGK;IAFpB,EAAE,GAAG,QAAQ,CAAC;IAEvB,YAA6B,OAA+B,EAAE;QAAjC,SAAI,GAAJ,IAAI,CAA6B;IAAG,CAAC;IAElE,KAAK,CAAC,SAAS,CAAC,GAAe,EAAE,KAAqB;QACpD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;QAE/C,qCAAqC;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAE9D,IAAI,CAAC;YACH,qDAAqD;YACrD,0DAA0D;YAC1D,MAAM,MAAM,GAAG,MAAM,IAAA,aAAK,EAAC,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE;gBAC1D,GAAG,EAAE,GAAG,CAAC,GAAG;gBACZ,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,OAAO,EAAE,iBAAiB;gBAC1D,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,MAAM;aACd,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO;oBACL,EAAE,EAAE,IAAI;oBACR,OAAO,EAAE,0BAA0B,IAAI,CAAC,EAAE,gBAAgB,SAAS,GAAG;iBACvE,CAAC;YACJ,CAAC;YAED,qBAAqB;YACrB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,OAAO,EAAE,2BAA2B,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAC5F,CAAC,EACD,IAAI,CACL;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,iDAAiD;YACjD,IAAI,GAAG,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC3B,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,OAAO,EACL,iFAAiF;iBACpF,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe;aAC7E,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,WAAW,CACjB,IAAmD,EACnD,SAAiB,EACjB,WAAoB;QAEpB,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,8BAA8B,SAAS,GAAG,CAAC,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;QAEzE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF;AA/ED,sCA+EC"}
@@ -0,0 +1,10 @@
1
+ import type { CodingBackend } from "./types";
2
+ export declare class NoopBackend implements CodingBackend {
3
+ readonly id: string;
4
+ constructor(id: string);
5
+ implement(): Promise<{
6
+ ok: boolean;
7
+ message: string;
8
+ }>;
9
+ }
10
+ //# sourceMappingURL=noop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noop.d.ts","sourceRoot":"","sources":["../../../src/core/backends/noop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,qBAAa,WAAY,YAAW,aAAa;aACnB,EAAE,EAAE,MAAM;gBAAV,EAAE,EAAE,MAAM;IAEhC,SAAS,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAO7D"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NoopBackend = void 0;
4
+ class NoopBackend {
5
+ id;
6
+ constructor(id) {
7
+ this.id = id;
8
+ }
9
+ async implement() {
10
+ return {
11
+ ok: true,
12
+ message: "Noop backend: no code changes performed. Use validators/contracts to verify desired state.",
13
+ };
14
+ }
15
+ }
16
+ exports.NoopBackend = NoopBackend;
17
+ //# sourceMappingURL=noop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noop.js","sourceRoot":"","sources":["../../../src/core/backends/noop.ts"],"names":[],"mappings":";;;AAEA,MAAa,WAAW;IACM;IAA5B,YAA4B,EAAU;QAAV,OAAE,GAAF,EAAE,CAAQ;IAAG,CAAC;IAE1C,KAAK,CAAC,SAAS;QACb,OAAO;YACL,EAAE,EAAE,IAAI;YACR,OAAO,EACL,4FAA4F;SAC/F,CAAC;IACJ,CAAC;CACF;AAVD,kCAUC"}
@@ -0,0 +1,16 @@
1
+ import type { BackendEnv, CodingBackend, ImplementInput, ImplementOutput } from "./types";
2
+ /**
3
+ * OpenCodeBackend shells out to the `opencode` CLI for code implementation.
4
+ *
5
+ * OpenCode is an open-source AI coding assistant that can run in headless mode.
6
+ */
7
+ export declare class OpenCodeBackend implements CodingBackend {
8
+ private readonly opts;
9
+ readonly id = "opencode";
10
+ constructor(opts?: {
11
+ timeoutMs?: number;
12
+ });
13
+ implement(env: BackendEnv, input: ImplementInput): Promise<ImplementOutput>;
14
+ private buildPrompt;
15
+ }
16
+ //# sourceMappingURL=opencode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/core/backends/opencode.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1F;;;;GAIG;AACH,qBAAa,eAAgB,YAAW,aAAa;IAGvC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,QAAQ,CAAC,EAAE,cAAc;gBAEI,IAAI,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO;IAExD,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAmDjF,OAAO,CAAC,WAAW;CA0BpB"}
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OpenCodeBackend = void 0;
4
+ const execa_1 = require("execa");
5
+ /**
6
+ * OpenCodeBackend shells out to the `opencode` CLI for code implementation.
7
+ *
8
+ * OpenCode is an open-source AI coding assistant that can run in headless mode.
9
+ */
10
+ class OpenCodeBackend {
11
+ opts;
12
+ id = "opencode";
13
+ constructor(opts = {}) {
14
+ this.opts = opts;
15
+ }
16
+ async implement(env, input) {
17
+ const { task, iteration, repairNotes } = input;
18
+ // Build the prompt to send to OpenCode
19
+ const prompt = this.buildPrompt(task, iteration, repairNotes);
20
+ try {
21
+ // OpenCode CLI: `opencode run --prompt "..." --non-interactive`
22
+ const result = await (0, execa_1.execa)("opencode", ["run", "--prompt", prompt, "--non-interactive"], {
23
+ cwd: env.cwd,
24
+ timeout: this.opts.timeoutMs ?? 600_000, // 10 min default
25
+ reject: false,
26
+ stdio: "pipe",
27
+ });
28
+ if (result.exitCode === 0) {
29
+ return {
30
+ ok: true,
31
+ message: `OpenCode completed task "${task.id}" (iteration ${iteration})`,
32
+ };
33
+ }
34
+ // Non-zero exit code
35
+ return {
36
+ ok: false,
37
+ message: `OpenCode exited with code ${result.exitCode}: ${result.stderr || result.stdout}`.slice(0, 2000),
38
+ };
39
+ }
40
+ catch (err) {
41
+ // Handle cases where opencode CLI is not available
42
+ if (err?.code === "ENOENT") {
43
+ return {
44
+ ok: false,
45
+ message: "OpenCode CLI not found. Please ensure OpenCode is installed and in PATH.",
46
+ };
47
+ }
48
+ return {
49
+ ok: false,
50
+ message: err?.message ? String(err.message).slice(0, 2000) : "Unknown error",
51
+ };
52
+ }
53
+ }
54
+ buildPrompt(task, iteration, repairNotes) {
55
+ const lines = [];
56
+ lines.push(`# Task: ${task.title ?? task.id}`);
57
+ lines.push(``);
58
+ if (task.goal) {
59
+ lines.push(`## Goal`);
60
+ lines.push(task.goal);
61
+ lines.push(``);
62
+ }
63
+ if (repairNotes) {
64
+ lines.push(`## Repair Notes (iteration ${iteration})`);
65
+ lines.push(repairNotes);
66
+ lines.push(``);
67
+ }
68
+ lines.push(`Please implement this task and ensure all validators pass.`);
69
+ return lines.join("\n");
70
+ }
71
+ }
72
+ exports.OpenCodeBackend = OpenCodeBackend;
73
+ //# sourceMappingURL=opencode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/core/backends/opencode.ts"],"names":[],"mappings":";;;AAAA,iCAA8B;AAG9B;;;;GAIG;AACH,MAAa,eAAe;IAGG;IAFpB,EAAE,GAAG,UAAU,CAAC;IAEzB,YAA6B,OAA+B,EAAE;QAAjC,SAAI,GAAJ,IAAI,CAA6B;IAAG,CAAC;IAElE,KAAK,CAAC,SAAS,CAAC,GAAe,EAAE,KAAqB;QACpD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;QAE/C,uCAAuC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAE9D,IAAI,CAAC;YACH,gEAAgE;YAChE,MAAM,MAAM,GAAG,MAAM,IAAA,aAAK,EACxB,UAAU,EACV,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,mBAAmB,CAAC,EAChD;gBACE,GAAG,EAAE,GAAG,CAAC,GAAG;gBACZ,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,OAAO,EAAE,iBAAiB;gBAC1D,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,MAAM;aACd,CACF,CAAC;YAEF,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO;oBACL,EAAE,EAAE,IAAI;oBACR,OAAO,EAAE,4BAA4B,IAAI,CAAC,EAAE,gBAAgB,SAAS,GAAG;iBACzE,CAAC;YACJ,CAAC;YAED,qBAAqB;YACrB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,OAAO,EAAE,6BAA6B,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAC9F,CAAC,EACD,IAAI,CACL;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,mDAAmD;YACnD,IAAI,GAAG,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC3B,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,OAAO,EACL,0EAA0E;iBAC7E,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe;aAC7E,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,WAAW,CACjB,IAAmD,EACnD,SAAiB,EACjB,WAAoB;QAEpB,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEf,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,8BAA8B,SAAS,GAAG,CAAC,CAAC;YACvD,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC;QAEzE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF;AAlFD,0CAkFC"}
@@ -0,0 +1,21 @@
1
+ import type { TaskSpec } from "../spec/types";
2
+ export type BackendEnv = {
3
+ cwd: string;
4
+ backendId: string;
5
+ };
6
+ export type ImplementInput = {
7
+ task: TaskSpec;
8
+ iteration: number;
9
+ repairNotes?: string;
10
+ };
11
+ export type ImplementOutput = {
12
+ ok: boolean;
13
+ message: string;
14
+ estimatedUsd?: number;
15
+ estimatedTokens?: number;
16
+ };
17
+ export interface CodingBackend {
18
+ id: string;
19
+ implement(env: BackendEnv, input: ImplementInput): Promise<ImplementOutput>;
20
+ }
21
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/backends/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,MAAM,UAAU,GAAG;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAC7E"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/backends/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import { BudgetState } from "./state";
2
+ import type { TaskBudgetConfig } from "./tiers";
3
+ export declare class BudgetManager {
4
+ private readonly state;
5
+ constructor(state: BudgetState);
6
+ preflightOrThrow(args: {
7
+ estimatedUsd?: number;
8
+ estimatedTokens?: number;
9
+ }): void;
10
+ recordIteration(wallTimeMs: number): void;
11
+ recordBackendUsage(args: {
12
+ usd?: number;
13
+ tokens?: number;
14
+ }): void;
15
+ getTier(config?: TaskBudgetConfig): "optimal" | "warning" | "hard";
16
+ shouldApplyDegrade(config?: TaskBudgetConfig): boolean;
17
+ isAtHardCap(config?: TaskBudgetConfig): boolean;
18
+ getStatus(config: TaskBudgetConfig): import("./tiers").BudgetStatus;
19
+ getState(): BudgetState;
20
+ }
21
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/core/budgets/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAGhD,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,WAAW;IAE/C,gBAAgB,CAAC,IAAI,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAejF,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIzC,kBAAkB,CAAC,IAAI,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAIjE,OAAO,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM;IAKlE,kBAAkB,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO;IAItD,WAAW,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,OAAO;IAK/C,SAAS,CAAC,MAAM,EAAE,gBAAgB;IAIlC,QAAQ,IAAI,WAAW;CAGxB"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BudgetManager = void 0;
4
+ const tiers_1 = require("./tiers");
5
+ class BudgetManager {
6
+ state;
7
+ constructor(state) {
8
+ this.state = state;
9
+ }
10
+ preflightOrThrow(args) {
11
+ const usdAfter = this.state.usage.usd + (args.estimatedUsd ?? 0);
12
+ const tokensAfter = this.state.usage.tokens + (args.estimatedTokens ?? 0);
13
+ if (this.state.limits.usd !== undefined && usdAfter > this.state.limits.usd) {
14
+ throw new Error("Budget limit exceeded (usd)");
15
+ }
16
+ if (this.state.limits.tokens !== undefined &&
17
+ tokensAfter > this.state.limits.tokens) {
18
+ throw new Error("Budget limit exceeded (tokens)");
19
+ }
20
+ }
21
+ recordIteration(wallTimeMs) {
22
+ this.state.addUsage({ wallTimeMs, iterations: 1 });
23
+ }
24
+ recordBackendUsage(args) {
25
+ this.state.addUsage({ usd: args.usd ?? 0, tokens: args.tokens ?? 0 });
26
+ }
27
+ getTier(config) {
28
+ if (!config)
29
+ return this.state.exceededHardLimit().ok ? "optimal" : "hard";
30
+ return (0, tiers_1.getBudgetTier)(this.state.usage, config);
31
+ }
32
+ shouldApplyDegrade(config) {
33
+ return this.getTier(config) === "warning";
34
+ }
35
+ isAtHardCap(config) {
36
+ if (!config)
37
+ return !this.state.exceededHardLimit().ok;
38
+ return (0, tiers_1.getBudgetStatus)(this.state.usage, config).isAtHardCap;
39
+ }
40
+ getStatus(config) {
41
+ return (0, tiers_1.getBudgetStatus)(this.state.usage, config);
42
+ }
43
+ getState() {
44
+ return this.state;
45
+ }
46
+ }
47
+ exports.BudgetManager = BudgetManager;
48
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/core/budgets/manager.ts"],"names":[],"mappings":";;;AAEA,mCAAyD;AAEzD,MAAa,aAAa;IACK;IAA7B,YAA6B,KAAkB;QAAlB,UAAK,GAAL,KAAK,CAAa;IAAG,CAAC;IAEnD,gBAAgB,CAAC,IAAyD;QACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC;QACjE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,CAAC,CAAC;QAE1E,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,SAAS,IAAI,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YAC5E,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QACD,IACE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS;YACtC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EACtC,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IAED,eAAe,CAAC,UAAkB;QAChC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,kBAAkB,CAAC,IAAuC;QACxD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,CAAC,MAAyB;QAC/B,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QAC3E,OAAO,IAAA,qBAAa,EAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,kBAAkB,CAAC,MAAyB;QAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC;IAC5C,CAAC;IAED,WAAW,CAAC,MAAyB;QACnC,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE,CAAC,EAAE,CAAC;QACvD,OAAO,IAAA,uBAAe,EAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,WAAW,CAAC;IAC/D,CAAC;IAED,SAAS,CAAC,MAAwB;QAChC,OAAO,IAAA,uBAAe,EAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF;AA/CD,sCA+CC"}
@@ -0,0 +1,25 @@
1
+ export type BudgetUsage = {
2
+ usd: number;
3
+ tokens: number;
4
+ wallTimeMs: number;
5
+ iterations: number;
6
+ };
7
+ export type BudgetLimits = {
8
+ usd?: number;
9
+ tokens?: number;
10
+ wallTimeMs?: number;
11
+ maxIterations?: number;
12
+ };
13
+ export declare class BudgetState {
14
+ readonly limits: BudgetLimits;
15
+ usage: BudgetUsage;
16
+ constructor(limits: BudgetLimits);
17
+ addUsage(delta: Partial<BudgetUsage>): void;
18
+ exceededHardLimit(): {
19
+ ok: true;
20
+ } | {
21
+ ok: false;
22
+ reason: string;
23
+ };
24
+ }
25
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../../src/core/budgets/state.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,qBAAa,WAAW;aAGM,MAAM,EAAE,YAAY;IAFhD,KAAK,EAAE,WAAW,CAAuD;gBAE7C,MAAM,EAAE,YAAY;IAEhD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;IAS3C,iBAAiB,IAAI;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAYlE"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BudgetState = void 0;
4
+ class BudgetState {
5
+ limits;
6
+ usage = { usd: 0, tokens: 0, wallTimeMs: 0, iterations: 0 };
7
+ constructor(limits) {
8
+ this.limits = limits;
9
+ }
10
+ addUsage(delta) {
11
+ this.usage = {
12
+ usd: this.usage.usd + (delta.usd ?? 0),
13
+ tokens: this.usage.tokens + (delta.tokens ?? 0),
14
+ wallTimeMs: this.usage.wallTimeMs + (delta.wallTimeMs ?? 0),
15
+ iterations: this.usage.iterations + (delta.iterations ?? 0),
16
+ };
17
+ }
18
+ exceededHardLimit() {
19
+ const { usd, tokens, wallTimeMs, iterations } = this.usage;
20
+ const lim = this.limits;
21
+ if (lim.usd !== undefined && usd > lim.usd)
22
+ return { ok: false, reason: "usd" };
23
+ if (lim.tokens !== undefined && tokens > lim.tokens)
24
+ return { ok: false, reason: "tokens" };
25
+ if (lim.wallTimeMs !== undefined && wallTimeMs > lim.wallTimeMs)
26
+ return { ok: false, reason: "wall_time" };
27
+ if (lim.maxIterations !== undefined && iterations > lim.maxIterations)
28
+ return { ok: false, reason: "iterations" };
29
+ return { ok: true };
30
+ }
31
+ }
32
+ exports.BudgetState = BudgetState;
33
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/core/budgets/state.ts"],"names":[],"mappings":";;;AAcA,MAAa,WAAW;IAGM;IAF5B,KAAK,GAAgB,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;IAEzE,YAA4B,MAAoB;QAApB,WAAM,GAAN,MAAM,CAAc;IAAG,CAAC;IAEpD,QAAQ,CAAC,KAA2B;QAClC,IAAI,CAAC,KAAK,GAAG;YACX,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YACtC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;YAC/C,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC;YAC3D,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC;SAC5D,CAAC;IACJ,CAAC;IAED,iBAAiB;QACf,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;QAExB,IAAI,GAAG,CAAC,GAAG,KAAK,SAAS,IAAI,GAAG,GAAG,GAAG,CAAC,GAAG;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAChF,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,GAAG,GAAG,CAAC,MAAM;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QAC5F,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,IAAI,UAAU,GAAG,GAAG,CAAC,UAAU;YAC7D,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QAC5C,IAAI,GAAG,CAAC,aAAa,KAAK,SAAS,IAAI,UAAU,GAAG,GAAG,CAAC,aAAa;YACnE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;QAC7C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;CACF;AA1BD,kCA0BC"}
@@ -0,0 +1,32 @@
1
+ import type { BudgetUsage } from "./state";
2
+ export type BudgetTierName = "optimal" | "warning" | "hard";
3
+ export type BudgetTierConfig = {
4
+ usd?: number;
5
+ tokens?: number;
6
+ timeMinutes?: number;
7
+ };
8
+ export type TaskBudgetConfig = {
9
+ optimal: BudgetTierConfig;
10
+ warning: BudgetTierConfig;
11
+ hard: BudgetTierConfig & {
12
+ maxIterations: number;
13
+ };
14
+ };
15
+ export type BudgetStatus = {
16
+ tier: BudgetTierName;
17
+ usedUsd: number;
18
+ usedTokens: number;
19
+ usedTimeMs: number;
20
+ usedIterations: number;
21
+ usdPctOfOptimal: number | null;
22
+ usdPctOfHard: number | null;
23
+ tokensPctOfOptimal: number | null;
24
+ tokensPctOfHard: number | null;
25
+ timePctOfOptimal: number | null;
26
+ timePctOfHard: number | null;
27
+ isInWarning: boolean;
28
+ isAtHardCap: boolean;
29
+ };
30
+ export declare function getBudgetTier(used: BudgetUsage, config: TaskBudgetConfig): BudgetTierName;
31
+ export declare function getBudgetStatus(used: BudgetUsage, config: TaskBudgetConfig): BudgetStatus;
32
+ //# sourceMappingURL=tiers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiers.d.ts","sourceRoot":"","sources":["../../../src/core/budgets/tiers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAE5D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,IAAI,EAAE,gBAAgB,GAAG;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,cAAc,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAQF,wBAAgB,aAAa,CAC3B,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,gBAAgB,GACvB,cAAc,CAoChB;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,WAAW,EACjB,MAAM,EAAE,gBAAgB,GACvB,YAAY,CA6Bd"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getBudgetTier = getBudgetTier;
4
+ exports.getBudgetStatus = getBudgetStatus;
5
+ function pct(used, limit) {
6
+ if (limit === undefined)
7
+ return null;
8
+ if (limit === 0)
9
+ return used > 0 ? 1 : 0;
10
+ return used / limit;
11
+ }
12
+ function getBudgetTier(used, config) {
13
+ // HARD if any configured hard metric reached (or iterations)
14
+ if (used.iterations >= config.hard.maxIterations)
15
+ return "hard";
16
+ const hardUsd = config.hard.usd;
17
+ const hardTokens = config.hard.tokens;
18
+ const hardTimeMs = config.hard.timeMinutes !== undefined ? config.hard.timeMinutes * 60_000 : undefined;
19
+ if (hardUsd !== undefined && used.usd >= hardUsd)
20
+ return "hard";
21
+ if (hardTokens !== undefined && used.tokens >= hardTokens)
22
+ return "hard";
23
+ if (hardTimeMs !== undefined && used.wallTimeMs >= hardTimeMs)
24
+ return "hard";
25
+ // WARNING if any configured "optimal" threshold crossed (or explicit warning threshold)
26
+ const optUsd = config.optimal.usd;
27
+ const optTokens = config.optimal.tokens;
28
+ const optTimeMs = config.optimal.timeMinutes !== undefined ? config.optimal.timeMinutes * 60_000 : undefined;
29
+ const warnUsd = config.warning.usd;
30
+ const warnTokens = config.warning.tokens;
31
+ const warnTimeMs = config.warning.timeMinutes !== undefined ? config.warning.timeMinutes * 60_000 : undefined;
32
+ const crossedUsd = (optUsd !== undefined && used.usd >= optUsd) ||
33
+ (warnUsd !== undefined && used.usd >= warnUsd);
34
+ const crossedTokens = (optTokens !== undefined && used.tokens >= optTokens) ||
35
+ (warnTokens !== undefined && used.tokens >= warnTokens);
36
+ const crossedTime = (optTimeMs !== undefined && used.wallTimeMs >= optTimeMs) ||
37
+ (warnTimeMs !== undefined && used.wallTimeMs >= warnTimeMs);
38
+ if (crossedUsd || crossedTokens || crossedTime)
39
+ return "warning";
40
+ return "optimal";
41
+ }
42
+ function getBudgetStatus(used, config) {
43
+ const tier = getBudgetTier(used, config);
44
+ const hardTimeMs = config.hard.timeMinutes !== undefined ? config.hard.timeMinutes * 60_000 : undefined;
45
+ const optTimeMs = config.optimal.timeMinutes !== undefined ? config.optimal.timeMinutes * 60_000 : undefined;
46
+ const isAtHardCap = tier === "hard" ||
47
+ used.iterations >= config.hard.maxIterations ||
48
+ (config.hard.usd !== undefined && used.usd >= config.hard.usd) ||
49
+ (config.hard.tokens !== undefined && used.tokens >= config.hard.tokens) ||
50
+ (hardTimeMs !== undefined && used.wallTimeMs >= hardTimeMs);
51
+ return {
52
+ tier,
53
+ usedUsd: used.usd,
54
+ usedTokens: used.tokens,
55
+ usedTimeMs: used.wallTimeMs,
56
+ usedIterations: used.iterations,
57
+ usdPctOfOptimal: pct(used.usd, config.optimal.usd),
58
+ usdPctOfHard: pct(used.usd, config.hard.usd),
59
+ tokensPctOfOptimal: pct(used.tokens, config.optimal.tokens),
60
+ tokensPctOfHard: pct(used.tokens, config.hard.tokens),
61
+ timePctOfOptimal: pct(used.wallTimeMs, optTimeMs),
62
+ timePctOfHard: pct(used.wallTimeMs, hardTimeMs),
63
+ isInWarning: tier === "warning",
64
+ isAtHardCap,
65
+ };
66
+ }
67
+ //# sourceMappingURL=tiers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiers.js","sourceRoot":"","sources":["../../../src/core/budgets/tiers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { Issue, ValidateResult } from "../validators/types";
2
+ export type ContextPack = {
3
+ text: string;
4
+ size: "full" | "warning_shrunk";
5
+ };
6
+ export declare function buildContextPack(args: {
7
+ tier: "optimal" | "warning" | "hard";
8
+ taskId: string;
9
+ validatorResults: Record<string, ValidateResult>;
10
+ issues: Issue[];
11
+ }): ContextPack;
12
+ //# sourceMappingURL=context-pack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-pack.d.ts","sourceRoot":"","sources":["../../../src/core/engine/context-pack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEjE,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAAC;CACjC,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACrC,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACjD,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB,GAAG,WAAW,CA6Cd"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildContextPack = buildContextPack;
4
+ function buildContextPack(args) {
5
+ const failing = Object.entries(args.validatorResults).filter(([, r]) => !r.ok);
6
+ const issueFiles = [...new Set(args.issues.map((i) => i.file).filter(Boolean))];
7
+ if (args.tier !== "warning") {
8
+ return {
9
+ size: "full",
10
+ text: [
11
+ `# Context`,
12
+ ``,
13
+ `Task: ${args.taskId}`,
14
+ ``,
15
+ `## Validator summary`,
16
+ ...Object.entries(args.validatorResults).map(([id, r]) => `- ${id}: ${r.ok ? "OK" : "FAIL"} (exit=${r.exitCode ?? "?"})`),
17
+ ``,
18
+ ].join("\n"),
19
+ };
20
+ }
21
+ // Warning tier: include only failing validator output + referenced files list.
22
+ const shrunk = [
23
+ `# Context (WARNING: shrunk)`,
24
+ ``,
25
+ `Task: ${args.taskId}`,
26
+ ``,
27
+ `## Failing validators`,
28
+ ...(failing.length
29
+ ? failing.map(([id, r]) => {
30
+ const combined = [r.stdout, r.stderr].filter(Boolean).join("\n").trim();
31
+ return [
32
+ `### ${id}`,
33
+ combined ? "```" : "(no output)",
34
+ ...(combined ? [combined.slice(0, 8000), "```"] : []),
35
+ ``,
36
+ ].join("\n");
37
+ })
38
+ : ["(none)", ""]),
39
+ `## Issue files (hints)`,
40
+ ...(issueFiles.length ? issueFiles.map((f) => `- ${f}`) : ["(none)"]),
41
+ ``,
42
+ ].join("\n");
43
+ return { size: "warning_shrunk", text: shrunk };
44
+ }
45
+ //# sourceMappingURL=context-pack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-pack.js","sourceRoot":"","sources":["../../../src/core/engine/context-pack.ts"],"names":[],"mappings":";;AAOA,4CAkDC;AAlDD,SAAgB,gBAAgB,CAAC,IAKhC;IACC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/E,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAa,CAAC;IAE5F,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE;gBACJ,WAAW;gBACX,EAAE;gBACF,SAAS,IAAI,CAAC,MAAM,EAAE;gBACtB,EAAE;gBACF,sBAAsB;gBACtB,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAC1C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,CAAC,QAAQ,IAAI,GAAG,GAAG,CAC5E;gBACD,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC;SACb,CAAC;IACJ,CAAC;IAED,+EAA+E;IAC/E,MAAM,MAAM,GAAG;QACb,6BAA6B;QAC7B,EAAE;QACF,SAAS,IAAI,CAAC,MAAM,EAAE;QACtB,EAAE;QACF,uBAAuB;QACvB,GAAG,CAAC,OAAO,CAAC,MAAM;YAChB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE;gBACtB,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBACxE,OAAO;oBACL,OAAO,EAAE,EAAE;oBACX,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa;oBAChC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrD,EAAE;iBACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACf,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACnB,wBAAwB;QACxB,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACrE,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAClD,CAAC"}