@tokenfactory/acc-runner 0.2.5-internal → 0.3.0-internal
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cost-pricing.d.ts +47 -0
- package/dist/cost-pricing.d.ts.map +1 -0
- package/dist/cost-pricing.js +71 -0
- package/dist/cost-pricing.js.map +1 -0
- package/dist/git.d.ts +2 -0
- package/dist/git.d.ts.map +1 -1
- package/dist/git.js +7 -0
- package/dist/git.js.map +1 -1
- package/dist/task-runner.d.ts +26 -4
- package/dist/task-runner.d.ts.map +1 -1
- package/dist/task-runner.js +58 -7
- package/dist/task-runner.js.map +1 -1
- package/dist/watch.d.ts +4 -0
- package/dist/watch.d.ts.map +1 -1
- package/dist/watch.js +66 -5
- package/dist/watch.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-model token pricing and a tiny helper that turns a Claude Code
|
|
3
|
+
* `--output-format=json` usage block into integer USD cents.
|
|
4
|
+
*
|
|
5
|
+
* Prices are USD per 1M tokens, snapshotted 2026-02-01 against the
|
|
6
|
+
* Anthropic public pricing page. Cache write/read columns follow
|
|
7
|
+
* Anthropic's "5-minute" cache tier (1.25× input / 0.1× input). When
|
|
8
|
+
* the runner bumps to v0.4.x, re-check the page and update the table.
|
|
9
|
+
*
|
|
10
|
+
* Unknown model strings fall back to Sonnet pricing — neither generous
|
|
11
|
+
* nor punitive, and the cost will still be posted so the cap-check
|
|
12
|
+
* surface stays accurate.
|
|
13
|
+
*/
|
|
14
|
+
export interface ModelPricing {
|
|
15
|
+
inputPer1M: number;
|
|
16
|
+
outputPer1M: number;
|
|
17
|
+
cacheWritePer1M: number;
|
|
18
|
+
cacheReadPer1M: number;
|
|
19
|
+
}
|
|
20
|
+
export interface ClaudeUsage {
|
|
21
|
+
input_tokens?: number;
|
|
22
|
+
output_tokens?: number;
|
|
23
|
+
cache_creation_input_tokens?: number;
|
|
24
|
+
cache_read_input_tokens?: number;
|
|
25
|
+
}
|
|
26
|
+
export interface NormalizedUsage {
|
|
27
|
+
input_tokens: number;
|
|
28
|
+
output_tokens: number;
|
|
29
|
+
cache_read_tokens: number;
|
|
30
|
+
cache_write_tokens: number;
|
|
31
|
+
}
|
|
32
|
+
export declare const MODEL_PRICING: Record<string, ModelPricing>;
|
|
33
|
+
export declare function pricingFor(model: string): ModelPricing;
|
|
34
|
+
export declare function normalizeUsage(raw: ClaudeUsage | null | undefined): NormalizedUsage;
|
|
35
|
+
export declare function priceUsdCents(model: string, usage: NormalizedUsage): number;
|
|
36
|
+
/**
|
|
37
|
+
* Parse the JSON block Claude Code emits with `--output-format=json`.
|
|
38
|
+
* Returns null on parse failure so the caller can fall back to plain
|
|
39
|
+
* markdown extraction.
|
|
40
|
+
*/
|
|
41
|
+
export interface ClaudeJsonOutput {
|
|
42
|
+
result?: string;
|
|
43
|
+
model?: string;
|
|
44
|
+
usage?: ClaudeUsage;
|
|
45
|
+
}
|
|
46
|
+
export declare function parseClaudeJson(stdout: string): ClaudeJsonOutput | null;
|
|
47
|
+
//# sourceMappingURL=cost-pricing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-pricing.d.ts","sourceRoot":"","sources":["../src/cost-pricing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAO,MAAM,CAAC;IACxB,WAAW,EAAM,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAG,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,CAAC,EAAgB,MAAM,CAAC;IACpC,aAAa,CAAC,EAAe,MAAM,CAAC;IACpC,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,uBAAuB,CAAC,EAAK,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAS,MAAM,CAAC;IAC5B,aAAa,EAAQ,MAAM,CAAC;IAC5B,iBAAiB,EAAI,MAAM,CAAC;IAC5B,kBAAkB,EAAG,MAAM,CAAC;CAC7B;AAuBD,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAStD,CAAC;AAEF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAOtD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GAAG,eAAe,CAOnF;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,MAAM,CAQ3E;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAG,MAAM,CAAC;IAChB,KAAK,CAAC,EAAG,WAAW,CAAC;CACtB;AACD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAYvE"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
const SONNET = {
|
|
2
|
+
inputPer1M: 3,
|
|
3
|
+
outputPer1M: 15,
|
|
4
|
+
cacheWritePer1M: 3.75,
|
|
5
|
+
cacheReadPer1M: 0.3,
|
|
6
|
+
};
|
|
7
|
+
const OPUS = {
|
|
8
|
+
inputPer1M: 15,
|
|
9
|
+
outputPer1M: 75,
|
|
10
|
+
cacheWritePer1M: 18.75,
|
|
11
|
+
cacheReadPer1M: 1.5,
|
|
12
|
+
};
|
|
13
|
+
const HAIKU = {
|
|
14
|
+
inputPer1M: 1,
|
|
15
|
+
outputPer1M: 5,
|
|
16
|
+
cacheWritePer1M: 1.25,
|
|
17
|
+
cacheReadPer1M: 0.1,
|
|
18
|
+
};
|
|
19
|
+
export const MODEL_PRICING = {
|
|
20
|
+
"claude-opus-4-7": OPUS,
|
|
21
|
+
"claude-opus-4-6": OPUS,
|
|
22
|
+
"claude-opus-4": OPUS,
|
|
23
|
+
"claude-sonnet-4-7": SONNET,
|
|
24
|
+
"claude-sonnet-4-6": SONNET,
|
|
25
|
+
"claude-sonnet-4": SONNET,
|
|
26
|
+
"claude-haiku-4-5": HAIKU,
|
|
27
|
+
"claude-haiku-4": HAIKU,
|
|
28
|
+
};
|
|
29
|
+
export function pricingFor(model) {
|
|
30
|
+
// Exact match wins; otherwise pick the family by substring so a model
|
|
31
|
+
// string like "claude-sonnet-4-6-20251001" still routes to Sonnet.
|
|
32
|
+
if (MODEL_PRICING[model])
|
|
33
|
+
return MODEL_PRICING[model];
|
|
34
|
+
if (model.includes("opus"))
|
|
35
|
+
return OPUS;
|
|
36
|
+
if (model.includes("haiku"))
|
|
37
|
+
return HAIKU;
|
|
38
|
+
return SONNET;
|
|
39
|
+
}
|
|
40
|
+
export function normalizeUsage(raw) {
|
|
41
|
+
return {
|
|
42
|
+
input_tokens: Math.max(0, Math.floor(raw?.input_tokens ?? 0)),
|
|
43
|
+
output_tokens: Math.max(0, Math.floor(raw?.output_tokens ?? 0)),
|
|
44
|
+
cache_read_tokens: Math.max(0, Math.floor(raw?.cache_read_input_tokens ?? 0)),
|
|
45
|
+
cache_write_tokens: Math.max(0, Math.floor(raw?.cache_creation_input_tokens ?? 0)),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export function priceUsdCents(model, usage) {
|
|
49
|
+
const p = pricingFor(model);
|
|
50
|
+
const usd = (usage.input_tokens * p.inputPer1M +
|
|
51
|
+
usage.output_tokens * p.outputPer1M +
|
|
52
|
+
usage.cache_read_tokens * p.cacheReadPer1M +
|
|
53
|
+
usage.cache_write_tokens * p.cacheWritePer1M) / 1_000_000;
|
|
54
|
+
return Math.round(usd * 100);
|
|
55
|
+
}
|
|
56
|
+
export function parseClaudeJson(stdout) {
|
|
57
|
+
const trimmed = stdout.trim();
|
|
58
|
+
if (!trimmed.startsWith("{"))
|
|
59
|
+
return null;
|
|
60
|
+
try {
|
|
61
|
+
const parsed = JSON.parse(trimmed);
|
|
62
|
+
if (typeof parsed === "object" && parsed !== null) {
|
|
63
|
+
return parsed;
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=cost-pricing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-pricing.js","sourceRoot":"","sources":["../src/cost-pricing.ts"],"names":[],"mappings":"AAkCA,MAAM,MAAM,GAAiB;IAC3B,UAAU,EAAO,CAAC;IAClB,WAAW,EAAM,EAAE;IACnB,eAAe,EAAE,IAAI;IACrB,cAAc,EAAG,GAAG;CACrB,CAAC;AAEF,MAAM,IAAI,GAAiB;IACzB,UAAU,EAAO,EAAE;IACnB,WAAW,EAAM,EAAE;IACnB,eAAe,EAAE,KAAK;IACtB,cAAc,EAAG,GAAG;CACrB,CAAC;AAEF,MAAM,KAAK,GAAiB;IAC1B,UAAU,EAAO,CAAC;IAClB,WAAW,EAAM,CAAC;IAClB,eAAe,EAAE,IAAI;IACrB,cAAc,EAAG,GAAG;CACrB,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAiC;IACzD,iBAAiB,EAAI,IAAI;IACzB,iBAAiB,EAAI,IAAI;IACzB,eAAe,EAAM,IAAI;IACzB,mBAAmB,EAAE,MAAM;IAC3B,mBAAmB,EAAE,MAAM;IAC3B,iBAAiB,EAAI,MAAM;IAC3B,kBAAkB,EAAG,KAAK;IAC1B,gBAAgB,EAAK,KAAK;CAC3B,CAAC;AAEF,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,sEAAsE;IACtE,mEAAmE;IACnE,IAAI,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IACtD,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAI,OAAO,IAAI,CAAC;IAC1C,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAG,OAAO,KAAK,CAAC;IAC3C,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAmC;IAChE,OAAO;QACL,YAAY,EAAQ,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,YAAY,IAAkB,CAAC,CAAC,CAAC;QACjF,aAAa,EAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,aAAa,IAAiB,CAAC,CAAC,CAAC;QACjF,iBAAiB,EAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,uBAAuB,IAAO,CAAC,CAAC,CAAC;QACjF,kBAAkB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,2BAA2B,IAAI,CAAC,CAAC,CAAC;KACnF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,KAAsB;IACjE,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,GAAG,GACP,CAAC,KAAK,CAAC,YAAY,GAAS,CAAC,CAAC,UAAU;QACvC,KAAK,CAAC,aAAa,GAAQ,CAAC,CAAC,WAAW;QACxC,KAAK,CAAC,iBAAiB,GAAI,CAAC,CAAC,cAAc;QAC3C,KAAK,CAAC,kBAAkB,GAAG,CAAC,CAAC,eAAe,CAAC,GAAG,SAAS,CAAC;IAC7D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;AAC/B,CAAC;AAYD,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,CAAC;QAC9C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YAClD,OAAO,MAA0B,CAAC;QACpC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/git.d.ts
CHANGED
package/dist/git.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,kBAAkB,QAAsC,CAAC;AAEtE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAEpE;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,6DAA6D;IAC7D,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC7C;AAMD,eAAO,MAAM,GAAG,EAAE,SAejB,CAAC"}
|
package/dist/git.js
CHANGED
|
@@ -3,6 +3,13 @@
|
|
|
3
3
|
* config — it relies on whatever credentials they already have set up.
|
|
4
4
|
*/
|
|
5
5
|
import { execa } from "execa";
|
|
6
|
+
// Matches branches the runner should treat as ACC-owned, including the
|
|
7
|
+
// `chore/acc-…` and `feat/acc-…` conventional-commit forms that the CLI
|
|
8
|
+
// agent opens in some flows. The original `acc/…` form is preserved.
|
|
9
|
+
export const ACC_BRANCH_PATTERN = /^(?:acc\/|chore\/acc-|feat\/acc-)/;
|
|
10
|
+
export function isAccBranch(name) {
|
|
11
|
+
return typeof name === "string" && ACC_BRANCH_PATTERN.test(name);
|
|
12
|
+
}
|
|
6
13
|
async function run(repoPath, args) {
|
|
7
14
|
return execa("git", args, { cwd: repoPath, env: process.env });
|
|
8
15
|
}
|
package/dist/git.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,KAAK,EAA0B,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,KAAK,EAA0B,MAAM,OAAO,CAAC;AAEtD,uEAAuE;AACvE,wEAAwE;AACxE,qEAAqE;AACrE,MAAM,CAAC,MAAM,kBAAkB,GAAG,mCAAmC,CAAC;AAEtE,MAAM,UAAU,WAAW,CAAC,IAA+B;IACzD,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnE,CAAC;AAUD,KAAK,UAAU,GAAG,CAAC,QAAgB,EAAE,IAAc;IACjD,OAAO,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAc;IAC5B,KAAK,CAAC,KAAK,CAAC,QAAQ;QAClB,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM;QAC7B,qEAAqE;QACrE,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM;QACzB,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,QAAQ;QACpB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;QAClE,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,CAAC;IACpC,CAAC;CACF,CAAC"}
|
package/dist/task-runner.d.ts
CHANGED
|
@@ -15,17 +15,32 @@
|
|
|
15
15
|
*/
|
|
16
16
|
import { type ExecaChildProcess } from "execa";
|
|
17
17
|
import type { RunnerConfig } from "./config.js";
|
|
18
|
+
import { type NormalizedUsage } from "./cost-pricing.js";
|
|
18
19
|
import { type GitRunner } from "./git.js";
|
|
19
20
|
import { type GhRunner } from "./gh.js";
|
|
20
21
|
import type { RunnerSupabaseClient } from "./supabase.js";
|
|
22
|
+
export interface CostEventPayload extends NormalizedUsage {
|
|
23
|
+
task_id: string;
|
|
24
|
+
model: string;
|
|
25
|
+
usd_cents: number;
|
|
26
|
+
runner_id?: string | null;
|
|
27
|
+
}
|
|
21
28
|
export interface RunTaskDeps {
|
|
22
29
|
supabase: RunnerSupabaseClient;
|
|
23
30
|
cfg: RunnerConfig;
|
|
24
31
|
git?: GitRunner;
|
|
25
32
|
gh?: GhRunner;
|
|
26
33
|
/** Override for tests — defaults to
|
|
27
|
-
* execa('claude', ['--print', '--dangerously-skip-permissions'
|
|
34
|
+
* execa('claude', ['--print', '--dangerously-skip-permissions',
|
|
35
|
+
* '--output-format=json']). */
|
|
28
36
|
spawnClaude?: (cwd: string) => ExecaChildProcess;
|
|
37
|
+
/**
|
|
38
|
+
* Cost-event sink. Defaults to a direct `acc.record_cost_event` RPC
|
|
39
|
+
* on the runner's already-authenticated supabase client. Tests
|
|
40
|
+
* override; production callers (watch.ts) can override too if they
|
|
41
|
+
* prefer to route through /api/runner/cost-event.
|
|
42
|
+
*/
|
|
43
|
+
postCostEvent?: (event: CostEventPayload) => Promise<void>;
|
|
29
44
|
}
|
|
30
45
|
export interface RunTaskController {
|
|
31
46
|
taskId: string;
|
|
@@ -40,10 +55,17 @@ export interface RunTaskOutcome {
|
|
|
40
55
|
error?: string;
|
|
41
56
|
}
|
|
42
57
|
/**
|
|
43
|
-
* Pull the structured report block from claude's stdout.
|
|
44
|
-
*
|
|
45
|
-
*
|
|
58
|
+
* Pull the structured report block from claude's stdout. Recognises
|
|
59
|
+
* both `--output-format=json` (extracts .result) and plain text. Falls
|
|
60
|
+
* back to the entire stdout (capped) if no `## Summary` heading is
|
|
61
|
+
* present — that way the PR body still tells the reviewer what happened.
|
|
46
62
|
*/
|
|
47
63
|
export declare function extractReportFromOutput(stdout: string): string;
|
|
64
|
+
/**
|
|
65
|
+
* Build a cost event from claude's stdout. Always returns a payload
|
|
66
|
+
* (zero-cost when usage isn't parseable) so the cap-tracking surface
|
|
67
|
+
* stays consistent: one cost_events row per attempt.
|
|
68
|
+
*/
|
|
69
|
+
export declare function buildCostEvent(taskId: string, stdout: string, fallbackModel: string | null | undefined, runnerId: string | null | undefined): CostEventPayload;
|
|
48
70
|
export declare function runTask(taskId: string, deps: RunTaskDeps): RunTaskController;
|
|
49
71
|
//# sourceMappingURL=task-runner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-runner.d.ts","sourceRoot":"","sources":["../src/task-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAS,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAC;AAMzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAG1D,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,GAAG,EAAE,YAAY,CAAC;IAClB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,EAAE,CAAC,EAAE,QAAQ,CAAC;IACd;
|
|
1
|
+
{"version":3,"file":"task-runner.d.ts","sourceRoot":"","sources":["../src/task-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAS,KAAK,iBAAiB,EAAE,MAAM,OAAO,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAqB,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAmB,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAC;AAMzD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAG1D,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACvD,OAAO,EAAK,MAAM,CAAC;IACnB,KAAK,EAAO,MAAM,CAAC;IACnB,SAAS,EAAG,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,GAAG,EAAE,YAAY,CAAC;IAClB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,EAAE,CAAC,EAAE,QAAQ,CAAC;IACd;;oCAEgC;IAChC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,iBAAiB,CAAC;IACjD;;;;;OAKG;IACH,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5D;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IACjC,MAAM,IAAI,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,IAAI,GAAG,QAAQ,GAAG,WAAW,CAAC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAmED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAU9D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACxC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAClC,gBAAgB,CAWlB;AAmBD,wBAAgB,OAAO,CACrB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,WAAW,GAChB,iBAAiB,CA6KnB"}
|
package/dist/task-runner.js
CHANGED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* returned controller and SIGTERMs it on task_cancelled.
|
|
15
15
|
*/
|
|
16
16
|
import { execa } from "execa";
|
|
17
|
+
import { normalizeUsage, parseClaudeJson, priceUsdCents, } from "./cost-pricing.js";
|
|
17
18
|
import { git as defaultGit } from "./git.js";
|
|
18
19
|
import { gh as defaultGh } from "./gh.js";
|
|
19
20
|
import { branchForTask, prTitleForTask, renderTaskPrompt, } from "./prompt.js";
|
|
@@ -23,7 +24,10 @@ function defaultSpawnClaude(cwd) {
|
|
|
23
24
|
// prompts. The runner is non-interactive (no TTY for human approval)
|
|
24
25
|
// and the permission boundary is enforced one level up — see the
|
|
25
26
|
// "Runner sandbox" section in packages/acc-runner/README.md.
|
|
26
|
-
|
|
27
|
+
// --output-format=json: emit a structured object so we can parse the
|
|
28
|
+
// usage block for cost tracking. parseClaudeJson falls back to plain
|
|
29
|
+
// text when older claude versions emit markdown directly.
|
|
30
|
+
return execa("claude", ["--print", "--dangerously-skip-permissions", "--output-format=json"], {
|
|
27
31
|
cwd,
|
|
28
32
|
stdin: "pipe",
|
|
29
33
|
stdout: "pipe",
|
|
@@ -64,24 +68,59 @@ async function streamToEvents(stream, supabase, taskId, streamName) {
|
|
|
64
68
|
return captured;
|
|
65
69
|
}
|
|
66
70
|
/**
|
|
67
|
-
* Pull the structured report block from claude's stdout.
|
|
68
|
-
*
|
|
69
|
-
*
|
|
71
|
+
* Pull the structured report block from claude's stdout. Recognises
|
|
72
|
+
* both `--output-format=json` (extracts .result) and plain text. Falls
|
|
73
|
+
* back to the entire stdout (capped) if no `## Summary` heading is
|
|
74
|
+
* present — that way the PR body still tells the reviewer what happened.
|
|
70
75
|
*/
|
|
71
76
|
export function extractReportFromOutput(stdout) {
|
|
72
|
-
const
|
|
77
|
+
const parsed = parseClaudeJson(stdout);
|
|
78
|
+
const text = parsed?.result ?? stdout;
|
|
79
|
+
const idx = text.indexOf("## Summary");
|
|
73
80
|
if (idx === -1) {
|
|
74
|
-
const trimmed =
|
|
81
|
+
const trimmed = text.trim();
|
|
75
82
|
if (!trimmed)
|
|
76
83
|
return "_(no report emitted)_";
|
|
77
84
|
return trimmed.slice(-8000);
|
|
78
85
|
}
|
|
79
|
-
return
|
|
86
|
+
return text.slice(idx).trim().slice(0, 16000);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Build a cost event from claude's stdout. Always returns a payload
|
|
90
|
+
* (zero-cost when usage isn't parseable) so the cap-tracking surface
|
|
91
|
+
* stays consistent: one cost_events row per attempt.
|
|
92
|
+
*/
|
|
93
|
+
export function buildCostEvent(taskId, stdout, fallbackModel, runnerId) {
|
|
94
|
+
const parsed = parseClaudeJson(stdout);
|
|
95
|
+
const model = parsed?.model ?? fallbackModel ?? "unknown";
|
|
96
|
+
const usage = normalizeUsage(parsed?.usage);
|
|
97
|
+
return {
|
|
98
|
+
task_id: taskId,
|
|
99
|
+
model,
|
|
100
|
+
usd_cents: priceUsdCents(model, usage),
|
|
101
|
+
runner_id: runnerId ?? null,
|
|
102
|
+
...usage,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
async function defaultPostCostEvent(supabase, event) {
|
|
106
|
+
const { error } = await supabase.rpc("record_cost_event", {
|
|
107
|
+
p_task_id: event.task_id,
|
|
108
|
+
p_model: event.model,
|
|
109
|
+
p_input_tokens: event.input_tokens,
|
|
110
|
+
p_output_tokens: event.output_tokens,
|
|
111
|
+
p_cache_read_tokens: event.cache_read_tokens,
|
|
112
|
+
p_cache_write_tokens: event.cache_write_tokens,
|
|
113
|
+
p_usd_cents: event.usd_cents,
|
|
114
|
+
p_runner_id: event.runner_id ?? null,
|
|
115
|
+
});
|
|
116
|
+
if (error)
|
|
117
|
+
throw new Error(error.message);
|
|
80
118
|
}
|
|
81
119
|
export function runTask(taskId, deps) {
|
|
82
120
|
const git = deps.git ?? defaultGit;
|
|
83
121
|
const gh = deps.gh ?? defaultGh;
|
|
84
122
|
const spawnClaude = deps.spawnClaude ?? defaultSpawnClaude;
|
|
123
|
+
const postCostEvent = deps.postCostEvent ?? ((event) => defaultPostCostEvent(deps.supabase, event));
|
|
85
124
|
let child = null;
|
|
86
125
|
let cancelled = false;
|
|
87
126
|
const promise = (async () => {
|
|
@@ -157,6 +196,18 @@ export function runTask(taskId, deps) {
|
|
|
157
196
|
stdoutPromise,
|
|
158
197
|
stderrPromise,
|
|
159
198
|
]);
|
|
199
|
+
// Post the cost event before any later branch returns so cap tracking
|
|
200
|
+
// captures success, cancellation, and non-zero exit alike. Best-effort:
|
|
201
|
+
// a failed POST logs to stderr but never bubbles past the runner.
|
|
202
|
+
{
|
|
203
|
+
const event = buildCostEvent(taskId, capturedStdout, result.model?.id, result.runner?.id);
|
|
204
|
+
try {
|
|
205
|
+
await postCostEvent(event);
|
|
206
|
+
}
|
|
207
|
+
catch (err) {
|
|
208
|
+
process.stderr.write(`[acc-runner] cost-event post failed: ${err.message}\n`);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
160
211
|
if (cancelled) {
|
|
161
212
|
await appendEvent(deps.supabase, taskId, "cancelled", {
|
|
162
213
|
exit_code: outcome.exitCode,
|
package/dist/task-runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-runner.js","sourceRoot":"","sources":["../src/task-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,KAAK,EAA0B,MAAM,OAAO,CAAC;AAEtD,OAAO,EAAE,GAAG,IAAI,UAAU,EAAkB,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAE,EAAE,IAAI,SAAS,EAAiB,MAAM,SAAS,CAAC;AACzD,OAAO,EACL,aAAa,EACb,cAAc,EACd,gBAAgB,GACjB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"task-runner.js","sourceRoot":"","sources":["../src/task-runner.ts"],"names":[],"mappings":"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"}
|
package/dist/watch.d.ts
CHANGED
|
@@ -2,11 +2,15 @@ import { runTask } from "./task-runner.js";
|
|
|
2
2
|
export interface WatchOptions {
|
|
3
3
|
/** Override heartbeat interval (ms). Defaults to 4000. */
|
|
4
4
|
heartbeatMs?: number;
|
|
5
|
+
/** Override polling interval (ms). Defaults to 30000. */
|
|
6
|
+
pollMs?: number;
|
|
5
7
|
/** Returns a controller for tests; production wiring uses the default. */
|
|
6
8
|
taskRunnerFactory?: typeof runTask;
|
|
7
9
|
}
|
|
8
10
|
export interface WatchHandle {
|
|
9
11
|
stop(): Promise<void>;
|
|
12
|
+
/** Test hook: forces one polling pass and resolves when it finishes. */
|
|
13
|
+
pollOnce(): Promise<void>;
|
|
10
14
|
}
|
|
11
15
|
export declare function watchCommand(options?: WatchOptions): Promise<WatchHandle>;
|
|
12
16
|
//# sourceMappingURL=watch.d.ts.map
|
package/dist/watch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,OAAO,EAA0B,MAAM,kBAAkB,CAAC;AAWnE,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,iBAAiB,CAAC,EAAE,OAAO,OAAO,CAAC;CACpC;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,wEAAwE;IACxE,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAsKD,wBAAsB,YAAY,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CA0HnF"}
|
package/dist/watch.js
CHANGED
|
@@ -3,6 +3,11 @@
|
|
|
3
3
|
* tasks, runs them serially, heartbeats every 4s. v0.2.5 refreshes the
|
|
4
4
|
* access token on startup + every 30 min, and exits loudly after 5
|
|
5
5
|
* consecutive heartbeat failures instead of silent-zombie-ing.
|
|
6
|
+
*
|
|
7
|
+
* v0.3 adds a 30s polling fallback: if a Realtime broadcast is dropped
|
|
8
|
+
* during a reconnect, the next poll pass picks the task up via the
|
|
9
|
+
* `acc.list_assigned_queued_tasks` RPC. A `seen` set keeps the poll
|
|
10
|
+
* and the broadcast from fighting over the same task_id.
|
|
6
11
|
*/
|
|
7
12
|
import chalk from "chalk";
|
|
8
13
|
import { loadConfig } from "./config.js";
|
|
@@ -15,6 +20,7 @@ const ONE_HOUR_MS = 60 * 60 * 1000;
|
|
|
15
20
|
const REFRESH_CHECK_MS = 30 * 60 * 1000;
|
|
16
21
|
const HEARTBEAT_REFRESH_AFTER = 3;
|
|
17
22
|
const HEARTBEAT_EXIT_AFTER = 5;
|
|
23
|
+
const POLL_INTERVAL_MS = 30_000;
|
|
18
24
|
function expiresSoon(session, leadMs = ONE_HOUR_MS) {
|
|
19
25
|
const expires = Date.parse(session.access_expires_at);
|
|
20
26
|
if (!Number.isFinite(expires))
|
|
@@ -44,6 +50,20 @@ async function refreshAccessToken(cfg, session) {
|
|
|
44
50
|
access_expires_at: new Date(body.expires_at * 1000).toISOString(),
|
|
45
51
|
};
|
|
46
52
|
}
|
|
53
|
+
// Single source of truth for "this task is new — push it into the runner
|
|
54
|
+
// queue". Both the Realtime listener and the polling loop go through here.
|
|
55
|
+
function enqueue(state, taskId, factory) {
|
|
56
|
+
if (state.seen.has(taskId))
|
|
57
|
+
return false;
|
|
58
|
+
if (state.current && state.current.taskId === taskId) {
|
|
59
|
+
state.seen.add(taskId);
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
state.seen.add(taskId);
|
|
63
|
+
state.queue.push(taskId);
|
|
64
|
+
void pump(state, factory);
|
|
65
|
+
return true;
|
|
66
|
+
}
|
|
47
67
|
function subscribeChannel(state, taskRunnerFactory) {
|
|
48
68
|
state.channel = state.supabase
|
|
49
69
|
.channel(`runner:${state.session.runner_id}`, {
|
|
@@ -51,10 +71,8 @@ function subscribeChannel(state, taskRunnerFactory) {
|
|
|
51
71
|
})
|
|
52
72
|
.on("broadcast", { event: "task_assigned" }, ({ payload }) => {
|
|
53
73
|
const taskId = payload?.task_id;
|
|
54
|
-
if (taskId)
|
|
55
|
-
state
|
|
56
|
-
void pump(state, taskRunnerFactory);
|
|
57
|
-
}
|
|
74
|
+
if (taskId)
|
|
75
|
+
enqueue(state, taskId, taskRunnerFactory);
|
|
58
76
|
})
|
|
59
77
|
.on("broadcast", { event: "task_cancelled" }, ({ payload }) => {
|
|
60
78
|
const taskId = payload?.task_id;
|
|
@@ -66,6 +84,9 @@ function subscribeChannel(state, taskRunnerFactory) {
|
|
|
66
84
|
else {
|
|
67
85
|
state.queue = state.queue.filter((t) => t !== taskId);
|
|
68
86
|
}
|
|
87
|
+
// Drop from seen so a re-queue (cancel → re-start) is honored on
|
|
88
|
+
// the next broadcast or poll.
|
|
89
|
+
state.seen.delete(taskId);
|
|
69
90
|
})
|
|
70
91
|
.subscribe((status) => {
|
|
71
92
|
if (status === "SUBSCRIBED") {
|
|
@@ -73,6 +94,36 @@ function subscribeChannel(state, taskRunnerFactory) {
|
|
|
73
94
|
}
|
|
74
95
|
});
|
|
75
96
|
}
|
|
97
|
+
// Single-flight poll. The watermark advances only after a clean response so
|
|
98
|
+
// a transient error doesn't permanently skip rows.
|
|
99
|
+
async function pollOnce(state, factory) {
|
|
100
|
+
if (state.stopped || state.polling)
|
|
101
|
+
return;
|
|
102
|
+
state.polling = true;
|
|
103
|
+
try {
|
|
104
|
+
const { data, error } = await state.supabase.rpc("list_assigned_queued_tasks", {
|
|
105
|
+
p_runner_id: state.session.runner_id,
|
|
106
|
+
p_since: state.pollSince,
|
|
107
|
+
});
|
|
108
|
+
if (error) {
|
|
109
|
+
process.stderr.write(`[acc-runner] poll failed: ${error.message}\n`);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const rows = (data ?? []);
|
|
113
|
+
let maxSeen = state.pollSince;
|
|
114
|
+
for (const row of rows) {
|
|
115
|
+
if (!row?.id)
|
|
116
|
+
continue;
|
|
117
|
+
enqueue(state, row.id, factory);
|
|
118
|
+
if (row.updated_at && row.updated_at > maxSeen)
|
|
119
|
+
maxSeen = row.updated_at;
|
|
120
|
+
}
|
|
121
|
+
state.pollSince = maxSeen;
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
state.polling = false;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
76
127
|
// Single-flight refresh. Recreates the Supabase client (so future RPC +
|
|
77
128
|
// channel auth use the new JWT) and resubscribes the broadcast channel.
|
|
78
129
|
async function doRefresh(state, taskRunnerFactory) {
|
|
@@ -128,6 +179,7 @@ export async function watchCommand(options = {}) {
|
|
|
128
179
|
}
|
|
129
180
|
const taskRunnerFactory = options.taskRunnerFactory ?? runTask;
|
|
130
181
|
const heartbeatMs = options.heartbeatMs ?? 4_000;
|
|
182
|
+
const pollMs = options.pollMs ?? POLL_INTERVAL_MS;
|
|
131
183
|
const state = {
|
|
132
184
|
cfg,
|
|
133
185
|
session,
|
|
@@ -135,12 +187,16 @@ export async function watchCommand(options = {}) {
|
|
|
135
187
|
channel: undefined,
|
|
136
188
|
heartbeatTimer: undefined,
|
|
137
189
|
refreshTimer: undefined,
|
|
190
|
+
pollTimer: undefined,
|
|
138
191
|
current: null,
|
|
139
192
|
queue: [],
|
|
193
|
+
seen: new Set(),
|
|
140
194
|
pumping: false,
|
|
141
195
|
stopped: false,
|
|
142
196
|
heartbeatFailures: 0,
|
|
143
197
|
refreshing: null,
|
|
198
|
+
pollSince: new Date(Date.now() - pollMs).toISOString(),
|
|
199
|
+
polling: false,
|
|
144
200
|
};
|
|
145
201
|
subscribeChannel(state, taskRunnerFactory);
|
|
146
202
|
state.heartbeatTimer = setInterval(() => {
|
|
@@ -162,6 +218,7 @@ export async function watchCommand(options = {}) {
|
|
|
162
218
|
process.stderr.write("[acc-runner] heartbeat dead, exiting\n");
|
|
163
219
|
clearInterval(state.heartbeatTimer);
|
|
164
220
|
clearInterval(state.refreshTimer);
|
|
221
|
+
clearInterval(state.pollTimer);
|
|
165
222
|
process.exit(1);
|
|
166
223
|
}
|
|
167
224
|
})();
|
|
@@ -171,6 +228,9 @@ export async function watchCommand(options = {}) {
|
|
|
171
228
|
void doRefresh(state, taskRunnerFactory);
|
|
172
229
|
}
|
|
173
230
|
}, REFRESH_CHECK_MS);
|
|
231
|
+
state.pollTimer = setInterval(() => {
|
|
232
|
+
void pollOnce(state, taskRunnerFactory);
|
|
233
|
+
}, pollMs);
|
|
174
234
|
// Initial heartbeat fires immediately so the runner page reflects "online".
|
|
175
235
|
await state.supabase.rpc("heartbeat_runner", { p_id: state.session.runner_id });
|
|
176
236
|
console.log(chalk.gray(`Runner ${state.session.runner_id} is online. Ctrl-C to stop.`));
|
|
@@ -180,6 +240,7 @@ export async function watchCommand(options = {}) {
|
|
|
180
240
|
state.stopped = true;
|
|
181
241
|
clearInterval(state.heartbeatTimer);
|
|
182
242
|
clearInterval(state.refreshTimer);
|
|
243
|
+
clearInterval(state.pollTimer);
|
|
183
244
|
if (state.current)
|
|
184
245
|
state.current.cancel();
|
|
185
246
|
try {
|
|
@@ -201,7 +262,7 @@ export async function watchCommand(options = {}) {
|
|
|
201
262
|
process.once("SIGINT", onSignal);
|
|
202
263
|
process.once("SIGTERM", onSignal);
|
|
203
264
|
}
|
|
204
|
-
return { stop };
|
|
265
|
+
return { stop, pollOnce: () => pollOnce(state, taskRunnerFactory) };
|
|
205
266
|
}
|
|
206
267
|
async function pump(state, factory) {
|
|
207
268
|
if (state.pumping)
|
package/dist/watch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED