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.
- package/README.ja.md +126 -0
- package/README.ko.md +126 -0
- package/README.md +77 -133
- package/README.zh.md +126 -0
- package/bin/ralphy-spec.js +0 -0
- package/dist/cli/checkpoint.d.ts +3 -0
- package/dist/cli/checkpoint.d.ts.map +1 -0
- package/dist/cli/checkpoint.js +23 -0
- package/dist/cli/checkpoint.js.map +1 -0
- package/dist/cli/init.d.ts +3 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +66 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/report.d.ts +3 -0
- package/dist/cli/report.d.ts.map +1 -0
- package/dist/cli/report.js +53 -0
- package/dist/cli/report.js.map +1 -0
- package/dist/cli/run.d.ts +3 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +79 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/status.d.ts +3 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +45 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/tail.d.ts +3 -0
- package/dist/cli/tail.d.ts.map +1 -0
- package/dist/cli/tail.js +46 -0
- package/dist/cli/tail.js.map +1 -0
- package/dist/cli/update.d.ts +3 -0
- package/dist/cli/update.d.ts.map +1 -0
- package/dist/cli/update.js +62 -0
- package/dist/cli/update.js.map +1 -0
- package/dist/cli/validate.d.ts +3 -0
- package/dist/cli/validate.d.ts.map +1 -0
- package/dist/cli/validate.js +83 -0
- package/dist/cli/validate.js.map +1 -0
- package/dist/core/backends/claude-code.d.ts +17 -0
- package/dist/core/backends/claude-code.d.ts.map +1 -0
- package/dist/core/backends/claude-code.js +75 -0
- package/dist/core/backends/claude-code.js.map +1 -0
- package/dist/core/backends/cursor.d.ts +17 -0
- package/dist/core/backends/cursor.d.ts.map +1 -0
- package/dist/core/backends/cursor.js +75 -0
- package/dist/core/backends/cursor.js.map +1 -0
- package/dist/core/backends/noop.d.ts +10 -0
- package/dist/core/backends/noop.d.ts.map +1 -0
- package/dist/core/backends/noop.js +17 -0
- package/dist/core/backends/noop.js.map +1 -0
- package/dist/core/backends/opencode.d.ts +16 -0
- package/dist/core/backends/opencode.d.ts.map +1 -0
- package/dist/core/backends/opencode.js +73 -0
- package/dist/core/backends/opencode.js.map +1 -0
- package/dist/core/backends/types.d.ts +21 -0
- package/dist/core/backends/types.d.ts.map +1 -0
- package/dist/core/backends/types.js +3 -0
- package/dist/core/backends/types.js.map +1 -0
- package/dist/core/budgets/manager.d.ts +21 -0
- package/dist/core/budgets/manager.d.ts.map +1 -0
- package/dist/core/budgets/manager.js +48 -0
- package/dist/core/budgets/manager.js.map +1 -0
- package/dist/core/budgets/state.d.ts +25 -0
- package/dist/core/budgets/state.d.ts.map +1 -0
- package/dist/core/budgets/state.js +33 -0
- package/dist/core/budgets/state.js.map +1 -0
- package/dist/core/budgets/tiers.d.ts +32 -0
- package/dist/core/budgets/tiers.d.ts.map +1 -0
- package/dist/core/budgets/tiers.js +67 -0
- package/dist/core/budgets/tiers.js.map +1 -0
- package/dist/core/engine/context-pack.d.ts +12 -0
- package/dist/core/engine/context-pack.d.ts.map +1 -0
- package/dist/core/engine/context-pack.js +45 -0
- package/dist/core/engine/context-pack.js.map +1 -0
- package/dist/core/engine/loop.d.ts +28 -0
- package/dist/core/engine/loop.d.ts.map +1 -0
- package/dist/core/engine/loop.js +366 -0
- package/dist/core/engine/loop.js.map +1 -0
- package/dist/core/engine/phases.d.ts +2 -0
- package/dist/core/engine/phases.d.ts.map +1 -0
- package/dist/core/engine/phases.js +3 -0
- package/dist/core/engine/phases.js.map +1 -0
- package/dist/core/engine/repair.d.ts +6 -0
- package/dist/core/engine/repair.d.ts.map +1 -0
- package/dist/core/engine/repair.js +23 -0
- package/dist/core/engine/repair.js.map +1 -0
- package/dist/core/folders.d.ts +26 -0
- package/dist/core/folders.d.ts.map +1 -0
- package/dist/core/folders.js +58 -0
- package/dist/core/folders.js.map +1 -0
- package/dist/core/memory/ledger.d.ts +13 -0
- package/dist/core/memory/ledger.d.ts.map +1 -0
- package/dist/core/memory/ledger.js +24 -0
- package/dist/core/memory/ledger.js.map +1 -0
- package/dist/core/memory/persistence.d.ts +45 -0
- package/dist/core/memory/persistence.d.ts.map +1 -0
- package/dist/core/memory/persistence.js +162 -0
- package/dist/core/memory/persistence.js.map +1 -0
- package/dist/core/reporting/spend.d.ts +40 -0
- package/dist/core/reporting/spend.d.ts.map +1 -0
- package/dist/core/reporting/spend.js +157 -0
- package/dist/core/reporting/spend.js.map +1 -0
- package/dist/core/spec/dag.d.ts +7 -0
- package/dist/core/spec/dag.d.ts.map +1 -0
- package/dist/core/spec/dag.js +65 -0
- package/dist/core/spec/dag.js.map +1 -0
- package/dist/core/spec/file-contract.d.ts +13 -0
- package/dist/core/spec/file-contract.d.ts.map +1 -0
- package/dist/core/spec/file-contract.js +29 -0
- package/dist/core/spec/file-contract.js.map +1 -0
- package/dist/core/spec/loader.d.ts +8 -0
- package/dist/core/spec/loader.d.ts.map +1 -0
- package/dist/core/spec/loader.js +51 -0
- package/dist/core/spec/loader.js.map +1 -0
- package/dist/core/spec/schemas.d.ts +278 -0
- package/dist/core/spec/schemas.d.ts.map +1 -0
- package/dist/core/spec/schemas.js +207 -0
- package/dist/core/spec/schemas.js.map +1 -0
- package/dist/core/spec/types.d.ts +71 -0
- package/dist/core/spec/types.d.ts.map +1 -0
- package/dist/core/spec/types.js +3 -0
- package/dist/core/spec/types.js.map +1 -0
- package/dist/core/validators/parsers/eslint.d.ts +3 -0
- package/dist/core/validators/parsers/eslint.d.ts.map +1 -0
- package/dist/core/validators/parsers/eslint.js +35 -0
- package/dist/core/validators/parsers/eslint.js.map +1 -0
- package/dist/core/validators/parsers/jest.d.ts +3 -0
- package/dist/core/validators/parsers/jest.d.ts.map +1 -0
- package/dist/core/validators/parsers/jest.js +16 -0
- package/dist/core/validators/parsers/jest.js.map +1 -0
- package/dist/core/validators/parsers/tsc.d.ts +3 -0
- package/dist/core/validators/parsers/tsc.d.ts.map +1 -0
- package/dist/core/validators/parsers/tsc.js +32 -0
- package/dist/core/validators/parsers/tsc.js.map +1 -0
- package/dist/core/validators/runner.d.ts +8 -0
- package/dist/core/validators/runner.d.ts.map +1 -0
- package/dist/core/validators/runner.js +85 -0
- package/dist/core/validators/runner.js.map +1 -0
- package/dist/core/validators/signatures.d.ts +3 -0
- package/dist/core/validators/signatures.d.ts.map +1 -0
- package/dist/core/validators/signatures.js +10 -0
- package/dist/core/validators/signatures.js.map +1 -0
- package/dist/core/validators/types.d.ts +27 -0
- package/dist/core/validators/types.d.ts.map +1 -0
- package/dist/core/validators/types.js +3 -0
- package/dist/core/validators/types.js.map +1 -0
- package/dist/core/workspace/contract-enforcer.d.ts +54 -0
- package/dist/core/workspace/contract-enforcer.d.ts.map +1 -0
- package/dist/core/workspace/contract-enforcer.js +128 -0
- package/dist/core/workspace/contract-enforcer.js.map +1 -0
- package/dist/core/workspace/manager.d.ts +28 -0
- package/dist/core/workspace/manager.d.ts.map +1 -0
- package/dist/core/workspace/manager.js +3 -0
- package/dist/core/workspace/manager.js.map +1 -0
- package/dist/core/workspace/merge.d.ts +38 -0
- package/dist/core/workspace/merge.d.ts.map +1 -0
- package/dist/core/workspace/merge.js +92 -0
- package/dist/core/workspace/merge.js.map +1 -0
- package/dist/core/workspace/patch-mode.d.ts +22 -0
- package/dist/core/workspace/patch-mode.d.ts.map +1 -0
- package/dist/core/workspace/patch-mode.js +91 -0
- package/dist/core/workspace/patch-mode.js.map +1 -0
- package/dist/core/workspace/worktree-mode.d.ts +28 -0
- package/dist/core/workspace/worktree-mode.d.ts.map +1 -0
- package/dist/core/workspace/worktree-mode.js +156 -0
- package/dist/core/workspace/worktree-mode.js.map +1 -0
- package/dist/index.js +14 -4
- package/dist/index.js.map +1 -1
- package/dist/templates/claude-code/ralphy-archive.md +22 -0
- package/dist/templates/claude-code/ralphy-implement.md +30 -0
- package/dist/templates/claude-code/ralphy-plan.md +31 -0
- package/dist/templates/claude-code/ralphy-validate.md +21 -0
- package/dist/templates/cursor/ralphy-archive.md +20 -0
- package/dist/templates/cursor/ralphy-implement.md +31 -0
- package/dist/templates/cursor/ralphy-plan.md +39 -0
- package/dist/templates/cursor/ralphy-validate.md +24 -0
- package/dist/templates/opencode/AGENTS.md +46 -0
- package/dist/templates/shared/openspec-tasks-template.md +48 -0
- package/dist/templates/shared/project-template.yml +232 -0
- package/dist/templates/shared/ralph-loop-prompt-template.md +25 -0
- package/dist/utils/installer.d.ts.map +1 -1
- package/dist/utils/installer.js +31 -1
- package/dist/utils/installer.js.map +1 -1
- package/dist/utils/validator.d.ts.map +1 -1
- package/dist/utils/validator.js +10 -0
- package/dist/utils/validator.js.map +1 -1
- package/package.json +14 -4
- 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 @@
|
|
|
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"}
|