night-orch 0.3.2 → 0.4.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 (221) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +47 -108
  3. package/dist/cli/commands/doctor.d.ts +1 -0
  4. package/dist/cli/commands/doctor.d.ts.map +1 -1
  5. package/dist/cli/commands/doctor.js +18 -0
  6. package/dist/cli/commands/doctor.js.map +1 -1
  7. package/dist/cli/commands/monitoring.d.ts.map +1 -1
  8. package/dist/cli/commands/monitoring.js +7 -3
  9. package/dist/cli/commands/monitoring.js.map +1 -1
  10. package/dist/cli/commands/settings.d.ts.map +1 -1
  11. package/dist/cli/commands/settings.js +40 -4
  12. package/dist/cli/commands/settings.js.map +1 -1
  13. package/dist/cli/commands/status.d.ts.map +1 -1
  14. package/dist/cli/commands/status.js +26 -3
  15. package/dist/cli/commands/status.js.map +1 -1
  16. package/dist/cli/index.js +3 -2
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/cli/tui/app.d.ts.map +1 -1
  19. package/dist/cli/tui/app.js +52 -3
  20. package/dist/cli/tui/app.js.map +1 -1
  21. package/dist/cli/tui/header.d.ts.map +1 -1
  22. package/dist/cli/tui/header.js +2 -1
  23. package/dist/cli/tui/header.js.map +1 -1
  24. package/dist/cli/tui/settings-view.d.ts.map +1 -1
  25. package/dist/cli/tui/settings-view.js +22 -5
  26. package/dist/cli/tui/settings-view.js.map +1 -1
  27. package/dist/cli/tui/stats-view.js +2 -2
  28. package/dist/cli/tui/stats-view.js.map +1 -1
  29. package/dist/config/loader.d.ts.map +1 -1
  30. package/dist/config/loader.js +141 -13
  31. package/dist/config/loader.js.map +1 -1
  32. package/dist/config/schema.d.ts +903 -21
  33. package/dist/config/schema.d.ts.map +1 -1
  34. package/dist/config/schema.js +77 -6
  35. package/dist/config/schema.js.map +1 -1
  36. package/dist/forge/types.d.ts +7 -0
  37. package/dist/forge/types.d.ts.map +1 -1
  38. package/dist/git/repo.d.ts +8 -0
  39. package/dist/git/repo.d.ts.map +1 -1
  40. package/dist/git/repo.js +19 -0
  41. package/dist/git/repo.js.map +1 -1
  42. package/dist/git/worktree.d.ts +3 -0
  43. package/dist/git/worktree.d.ts.map +1 -1
  44. package/dist/git/worktree.js +43 -21
  45. package/dist/git/worktree.js.map +1 -1
  46. package/dist/loop/cost.d.ts +33 -8
  47. package/dist/loop/cost.d.ts.map +1 -1
  48. package/dist/loop/cost.js +250 -46
  49. package/dist/loop/cost.js.map +1 -1
  50. package/dist/loop/decision.js +3 -3
  51. package/dist/loop/decision.js.map +1 -1
  52. package/dist/loop/engine.d.ts +1 -0
  53. package/dist/loop/engine.d.ts.map +1 -1
  54. package/dist/loop/engine.js +76 -13
  55. package/dist/loop/engine.js.map +1 -1
  56. package/dist/loop/parallel.d.ts.map +1 -1
  57. package/dist/loop/parallel.js +2 -0
  58. package/dist/loop/parallel.js.map +1 -1
  59. package/dist/loop/pricing.d.ts +11 -4
  60. package/dist/loop/pricing.d.ts.map +1 -1
  61. package/dist/loop/pricing.js +62 -20
  62. package/dist/loop/pricing.js.map +1 -1
  63. package/dist/loop/progress.d.ts +24 -0
  64. package/dist/loop/progress.d.ts.map +1 -0
  65. package/dist/loop/progress.js +52 -0
  66. package/dist/loop/progress.js.map +1 -0
  67. package/dist/loop/step-executor.d.ts +4 -5
  68. package/dist/loop/step-executor.d.ts.map +1 -1
  69. package/dist/loop/step-executor.js +1 -0
  70. package/dist/loop/step-executor.js.map +1 -1
  71. package/dist/loop/types.d.ts +17 -0
  72. package/dist/loop/types.d.ts.map +1 -1
  73. package/dist/mcp/tools/admin.d.ts +29 -0
  74. package/dist/mcp/tools/admin.d.ts.map +1 -0
  75. package/dist/mcp/tools/admin.js +89 -0
  76. package/dist/mcp/tools/admin.js.map +1 -0
  77. package/dist/mcp/tools/auth.d.ts +3 -0
  78. package/dist/mcp/tools/auth.d.ts.map +1 -0
  79. package/dist/mcp/tools/auth.js +19 -0
  80. package/dist/mcp/tools/auth.js.map +1 -0
  81. package/dist/mcp/tools/index.d.ts.map +1 -1
  82. package/dist/mcp/tools/index.js +5 -533
  83. package/dist/mcp/tools/index.js.map +1 -1
  84. package/dist/mcp/tools/operations.d.ts +32 -0
  85. package/dist/mcp/tools/operations.d.ts.map +1 -0
  86. package/dist/mcp/tools/operations.js +95 -0
  87. package/dist/mcp/tools/operations.js.map +1 -0
  88. package/dist/mcp/tools/settings.d.ts +12 -0
  89. package/dist/mcp/tools/settings.d.ts.map +1 -0
  90. package/dist/mcp/tools/settings.js +58 -0
  91. package/dist/mcp/tools/settings.js.map +1 -0
  92. package/dist/mcp/tools/status.d.ts +25 -0
  93. package/dist/mcp/tools/status.d.ts.map +1 -0
  94. package/dist/mcp/tools/status.js +307 -0
  95. package/dist/mcp/tools/status.js.map +1 -0
  96. package/dist/ops/continue.js +6 -1
  97. package/dist/ops/continue.js.map +1 -1
  98. package/dist/ops/project-check.d.ts +15 -0
  99. package/dist/ops/project-check.d.ts.map +1 -0
  100. package/dist/ops/project-check.js +136 -0
  101. package/dist/ops/project-check.js.map +1 -0
  102. package/dist/ops/rebase-and-check.d.ts +2 -1
  103. package/dist/ops/rebase-and-check.d.ts.map +1 -1
  104. package/dist/ops/rebase-and-check.js +2 -2
  105. package/dist/ops/rebase-and-check.js.map +1 -1
  106. package/dist/ops/rebase.d.ts +8 -5
  107. package/dist/ops/rebase.d.ts.map +1 -1
  108. package/dist/ops/rebase.js +43 -29
  109. package/dist/ops/rebase.js.map +1 -1
  110. package/dist/runner/comment-commands.d.ts +20 -0
  111. package/dist/runner/comment-commands.d.ts.map +1 -0
  112. package/dist/runner/comment-commands.js +221 -0
  113. package/dist/runner/comment-commands.js.map +1 -0
  114. package/dist/runner/helpers.d.ts +57 -0
  115. package/dist/runner/helpers.d.ts.map +1 -0
  116. package/dist/runner/helpers.js +259 -0
  117. package/dist/runner/helpers.js.map +1 -0
  118. package/dist/runner/poller.d.ts.map +1 -1
  119. package/dist/runner/poller.js +19 -781
  120. package/dist/runner/poller.js.map +1 -1
  121. package/dist/runner/reaction-scan.d.ts +17 -0
  122. package/dist/runner/reaction-scan.d.ts.map +1 -0
  123. package/dist/runner/reaction-scan.js +33 -0
  124. package/dist/runner/reaction-scan.js.map +1 -0
  125. package/dist/runner/run-finalizer.d.ts +30 -0
  126. package/dist/runner/run-finalizer.d.ts.map +1 -0
  127. package/dist/runner/run-finalizer.js +217 -0
  128. package/dist/runner/run-finalizer.js.map +1 -0
  129. package/dist/settings/definitions/github.d.ts +3 -0
  130. package/dist/settings/definitions/github.d.ts.map +1 -0
  131. package/dist/settings/definitions/github.js +267 -0
  132. package/dist/settings/definitions/github.js.map +1 -0
  133. package/dist/settings/definitions/loop.d.ts +3 -0
  134. package/dist/settings/definitions/loop.d.ts.map +1 -0
  135. package/dist/settings/definitions/loop.js +113 -0
  136. package/dist/settings/definitions/loop.js.map +1 -0
  137. package/dist/settings/definitions/observability.d.ts +3 -0
  138. package/dist/settings/definitions/observability.d.ts.map +1 -0
  139. package/dist/settings/definitions/observability.js +74 -0
  140. package/dist/settings/definitions/observability.js.map +1 -0
  141. package/dist/settings/definitions/security.d.ts +3 -0
  142. package/dist/settings/definitions/security.d.ts.map +1 -0
  143. package/dist/settings/definitions/security.js +121 -0
  144. package/dist/settings/definitions/security.js.map +1 -0
  145. package/dist/settings/registry.d.ts +82 -6
  146. package/dist/settings/registry.d.ts.map +1 -1
  147. package/dist/settings/registry.js +301 -194
  148. package/dist/settings/registry.js.map +1 -1
  149. package/dist/settings/runtime.d.ts +5 -1
  150. package/dist/settings/runtime.d.ts.map +1 -1
  151. package/dist/settings/runtime.js +46 -9
  152. package/dist/settings/runtime.js.map +1 -1
  153. package/dist/state/db.d.ts.map +1 -1
  154. package/dist/state/db.js +2 -0
  155. package/dist/state/db.js.map +1 -1
  156. package/dist/state/migrations/020-cost-ledger.d.ts +3 -0
  157. package/dist/state/migrations/020-cost-ledger.d.ts.map +1 -0
  158. package/dist/state/migrations/020-cost-ledger.js +37 -0
  159. package/dist/state/migrations/020-cost-ledger.js.map +1 -0
  160. package/dist/state/runs.d.ts +1 -0
  161. package/dist/state/runs.d.ts.map +1 -1
  162. package/dist/state/runs.js +3 -0
  163. package/dist/state/runs.js.map +1 -1
  164. package/dist/state/stats.d.ts +20 -0
  165. package/dist/state/stats.d.ts.map +1 -1
  166. package/dist/state/stats.js +68 -8
  167. package/dist/state/stats.js.map +1 -1
  168. package/dist/utils/logger.d.ts +9 -0
  169. package/dist/utils/logger.d.ts.map +1 -1
  170. package/dist/utils/logger.js +13 -0
  171. package/dist/utils/logger.js.map +1 -1
  172. package/dist/web/routes/api-events.d.ts +10 -0
  173. package/dist/web/routes/api-events.d.ts.map +1 -0
  174. package/dist/web/routes/api-events.js +251 -0
  175. package/dist/web/routes/api-events.js.map +1 -0
  176. package/dist/web/routes/api-operations.d.ts +3 -0
  177. package/dist/web/routes/api-operations.d.ts.map +1 -0
  178. package/dist/web/routes/api-operations.js +371 -0
  179. package/dist/web/routes/api-operations.js.map +1 -0
  180. package/dist/web/routes/api-runs.d.ts +3 -0
  181. package/dist/web/routes/api-runs.d.ts.map +1 -0
  182. package/dist/web/routes/api-runs.js +96 -0
  183. package/dist/web/routes/api-runs.js.map +1 -0
  184. package/dist/web/routes/api-settings.d.ts +3 -0
  185. package/dist/web/routes/api-settings.d.ts.map +1 -0
  186. package/dist/web/routes/api-settings.js +61 -0
  187. package/dist/web/routes/api-settings.js.map +1 -0
  188. package/dist/web/routes/context.d.ts +15 -0
  189. package/dist/web/routes/context.d.ts.map +1 -0
  190. package/dist/web/routes/context.js +2 -0
  191. package/dist/web/routes/context.js.map +1 -0
  192. package/dist/web/server.d.ts +58 -1
  193. package/dist/web/server.d.ts.map +1 -1
  194. package/dist/web/server.js +116 -847
  195. package/dist/web/server.js.map +1 -1
  196. package/dist/web/shell-session.d.ts +74 -0
  197. package/dist/web/shell-session.d.ts.map +1 -0
  198. package/dist/web/shell-session.js +279 -0
  199. package/dist/web/shell-session.js.map +1 -0
  200. package/dist/web/snapshots.d.ts +159 -0
  201. package/dist/web/snapshots.d.ts.map +1 -0
  202. package/dist/web/snapshots.js +231 -0
  203. package/dist/web/snapshots.js.map +1 -0
  204. package/dist/workers/acp.d.ts.map +1 -1
  205. package/dist/workers/acp.js +116 -0
  206. package/dist/workers/acp.js.map +1 -1
  207. package/dist/workers/claude.d.ts.map +1 -1
  208. package/dist/workers/claude.js +13 -3
  209. package/dist/workers/claude.js.map +1 -1
  210. package/dist/workers/codex.d.ts.map +1 -1
  211. package/dist/workers/codex.js +16 -4
  212. package/dist/workers/codex.js.map +1 -1
  213. package/dist/workers/types.d.ts +14 -4
  214. package/dist/workers/types.d.ts.map +1 -1
  215. package/examples/config.example.yaml +12 -3
  216. package/package.json +8 -2
  217. package/web/dist/assets/index-BIrXUwFe.css +1 -0
  218. package/web/dist/assets/index-COMzHPcP.js +26 -0
  219. package/web/dist/index.html +2 -2
  220. package/web/dist/assets/index-k6kgdnzy.js +0 -9
  221. package/web/dist/assets/index-xm9qPlYB.css +0 -1
@@ -1,32 +1,56 @@
1
1
  import type Database from 'better-sqlite3';
2
2
  import type { Config } from '../config/schema.js';
3
- interface TokenUsageInput {
3
+ import type { TokenUsage } from '../workers/types.js';
4
+ type TokenUsageInput = TokenUsage;
5
+ export interface TokenUsageTotals {
4
6
  promptTokens: number;
5
7
  completionTokens: number;
8
+ cacheReadTokens: number;
9
+ totalTokens: number;
6
10
  }
7
- export interface TokenUsageTotals {
11
+ interface CostRecordMetadata {
12
+ stepId?: string;
13
+ workerType?: string | null;
14
+ }
15
+ export interface StepCostBreakdown {
16
+ stepId: string;
17
+ costUsd: number;
18
+ promptTokens: number;
19
+ completionTokens: number;
20
+ cacheReadTokens: number;
21
+ totalTokens: number;
22
+ }
23
+ export interface WorkerCostBreakdown {
24
+ workerType: string;
25
+ costUsd: number;
8
26
  promptTokens: number;
9
27
  completionTokens: number;
28
+ cacheReadTokens: number;
10
29
  totalTokens: number;
11
30
  }
12
31
  export declare class CostTracker {
13
32
  private db;
14
33
  private issueManager;
34
+ private advisoryWarnings;
15
35
  constructor(db: Database.Database);
16
- recordCost(runId: string, costUsd: number, tokenUsage?: TokenUsageInput): void;
36
+ private persistCostRecord;
37
+ recordCost(runId: string, costUsd: number, tokenUsage?: TokenUsageInput, metadata?: CostRecordMetadata): void;
38
+ recordCostAndCheckBudget(runId: string, costUsd: number, tokenUsage: TokenUsageInput | undefined, metadata: CostRecordMetadata, limits: Config['security'], costPolicyInput?: Config['cost']['model'] | Config['cost'] | undefined): BudgetStatus;
17
39
  getDailyCost(): number;
18
40
  getRunCost(runId: string): number;
19
41
  getDailyTokenUsage(): TokenUsageTotals;
20
42
  getRunTokenUsage(runId: string): TokenUsageTotals;
43
+ getRunCostBreakdownByStep(runId: string): StepCostBreakdown[];
44
+ getDailyCostBreakdownByStep(date?: string): StepCostBreakdown[];
45
+ getDailyCostBreakdownByWorker(date?: string): WorkerCostBreakdown[];
21
46
  /**
22
47
  * Evaluate whether a run has crossed any spend limit.
23
48
  * Returns a discriminated status so callers can build messages that name
24
49
  * the specific limit that tripped (daily vs per-run) instead of guessing.
25
50
  *
26
- * When `costModel === 'subscription'` (Claude Pro/Max, Codex Pro, etc.) the
27
- * USD estimate is advisory only the operator pays a flat subscription fee,
28
- * not per-token so enforcement is skipped entirely. Tokens and the
29
- * advisory USD estimate continue to be written to the DB for analytics.
51
+ * In `subscription` mode, enforcement is always skipped.
52
+ * In `subscription-metered` mode, warnings can be emitted while enforcement
53
+ * is optional per configured knob.
30
54
  *
31
55
  * A non-null `cost_budget_override_usd` on the run row overrides the
32
56
  * per-run cap with the stored value AND exempts the run from the daily
@@ -37,7 +61,7 @@ export declare class CostTracker {
37
61
  * replaces `limits.maxDailyCostUsd` for today only. It auto-expires when
38
62
  * the UTC day rolls over (next day's row starts NULL).
39
63
  */
40
- checkBudget(runId: string, limits: Config['security'], costModel?: Config['cost']['model']): BudgetStatus;
64
+ checkBudget(runId: string, limits: Config['security'], costPolicyInput?: Config['cost']['model'] | Config['cost'] | undefined): BudgetStatus;
41
65
  /**
42
66
  * Read the cost budget override for a run, or null if no override is set.
43
67
  */
@@ -60,6 +84,7 @@ export declare class CostTracker {
60
84
  * day rolls over — operators do not need to clear it manually.
61
85
  */
62
86
  setDailyCapOverride(overrideUsd: number | null, date?: string): void;
87
+ private logSubscriptionMeteredWarningOnce;
63
88
  }
64
89
  export type BudgetStatus = {
65
90
  overBudget: false;
@@ -1 +1 @@
1
- {"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../../src/loop/cost.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAC1C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAKjD,UAAU,eAAe;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAA;IACpB,gBAAgB,EAAE,MAAM,CAAA;IACxB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,qBAAa,WAAW;IAGV,OAAO,CAAC,EAAE;IAFtB,OAAO,CAAC,YAAY,CAAc;gBAEd,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAIzC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,eAAe,GAAG,IAAI;IA4C9E,YAAY,IAAI,MAAM;IAQtB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAOjC,kBAAkB,IAAI,gBAAgB;IAetC,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB;IAcjD;;;;;;;;;;;;;;;;;;OAkBG;IACH,WAAW,CACT,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,EAC1B,SAAS,GAAE,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAiB,GACjD,YAAY;IA0Cf;;OAEG;IACH,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAQlD;;;;OAIG;IACH,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IASrE;;;OAGG;IACH,mBAAmB,CAAC,IAAI,GAAE,MAAoB,GAAG,MAAM,GAAG,IAAI;IAQ9D;;;;;OAKG;IACH,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,GAAE,MAAoB,GAAG,IAAI;CAclF;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,UAAU,EAAE,KAAK,CAAA;CAAE,GACrB;IACE,UAAU,EAAE,IAAI,CAAA;IAChB,KAAK,EAAE,OAAO,GAAG,SAAS,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAEL,qEAAqE;AACrE,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,OAAO,CAAC,YAAY,EAAE;IAAE,UAAU,EAAE,IAAI,CAAA;CAAE,CAAC,GAClD,MAAM,CAGR;AAED,iEAAiE;AACjE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAaxE"}
1
+ {"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../../src/loop/cost.ts"],"names":[],"mappings":"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"}
package/dist/loop/cost.js CHANGED
@@ -1,46 +1,84 @@
1
1
  import { IssueManager } from '../state/issues.js';
2
2
  import { RunManager } from '../state/runs.js';
3
3
  import { utcDayKey } from '../utils/time.js';
4
+ import { logger } from '../utils/logger.js';
4
5
  export class CostTracker {
5
6
  db;
6
7
  issueManager;
8
+ advisoryWarnings = new Set();
7
9
  constructor(db) {
8
10
  this.db = db;
9
11
  this.issueManager = new IssueManager(db);
10
12
  }
11
- recordCost(runId, costUsd, tokenUsage) {
13
+ persistCostRecord(runId, date, usage, usdAmount, costStepId, costWorkerType) {
14
+ const runUsageInsert = this.db
15
+ .prepare(`INSERT INTO daily_run_usage (date, run_id)
16
+ VALUES (?, ?)
17
+ ON CONFLICT(date, run_id) DO NOTHING`)
18
+ .run(date, runId);
19
+ const dailyRunCountIncrement = runUsageInsert.changes > 0 ? 1 : 0;
20
+ this.db
21
+ .prepare(`INSERT INTO daily_costs (date, total_cost_usd, run_count, total_prompt_tokens, total_completion_tokens, total_cache_read_tokens)
22
+ VALUES (?, ?, ?, ?, ?, ?)
23
+ ON CONFLICT(date) DO UPDATE SET
24
+ total_cost_usd = total_cost_usd + excluded.total_cost_usd,
25
+ run_count = run_count + excluded.run_count,
26
+ total_prompt_tokens = total_prompt_tokens + excluded.total_prompt_tokens,
27
+ total_completion_tokens = total_completion_tokens + excluded.total_completion_tokens,
28
+ total_cache_read_tokens = total_cache_read_tokens + excluded.total_cache_read_tokens`)
29
+ .run(date, usdAmount, dailyRunCountIncrement, usage.promptTokens, usage.completionTokens, usage.cacheReadTokens);
30
+ this.db
31
+ .prepare(`UPDATE runs
32
+ SET estimated_cost_usd = estimated_cost_usd + ?,
33
+ prompt_tokens = prompt_tokens + ?,
34
+ completion_tokens = completion_tokens + ?,
35
+ cache_read_tokens = cache_read_tokens + ?
36
+ WHERE id = ?`)
37
+ .run(usdAmount, usage.promptTokens, usage.completionTokens, usage.cacheReadTokens, runId);
38
+ if (costStepId !== null) {
39
+ this.db
40
+ .prepare(`INSERT INTO run_cost_entries (
41
+ run_id,
42
+ step_id,
43
+ worker_type,
44
+ cost_usd,
45
+ prompt_tokens,
46
+ completion_tokens,
47
+ cache_read_tokens
48
+ )
49
+ VALUES (?, ?, ?, ?, ?, ?, ?)`)
50
+ .run(runId, costStepId, costWorkerType, usdAmount, usage.promptTokens, usage.completionTokens, usage.cacheReadTokens);
51
+ }
52
+ this.issueManager.syncFromRunId(runId);
53
+ }
54
+ recordCost(runId, costUsd, tokenUsage, metadata = {}) {
12
55
  const amountUsd = Number(Math.max(0, costUsd).toFixed(6));
13
56
  const normalizedTokens = normalizeTokenUsage(tokenUsage);
14
57
  if (amountUsd <= 0 && normalizedTokens.totalTokens <= 0)
15
58
  return;
16
59
  const today = utcDayKey();
60
+ const costStepId = metadata.stepId?.trim() ? metadata.stepId : null;
61
+ const costWorkerType = metadata.workerType?.trim() ? metadata.workerType : null;
17
62
  const tx = this.db.transaction((id, date, usage, usdAmount) => {
18
- const runUsageInsert = this.db
19
- .prepare(`INSERT INTO daily_run_usage (date, run_id)
20
- VALUES (?, ?)
21
- ON CONFLICT(date, run_id) DO NOTHING`)
22
- .run(date, id);
23
- const dailyRunCountIncrement = runUsageInsert.changes > 0 ? 1 : 0;
24
- this.db
25
- .prepare(`INSERT INTO daily_costs (date, total_cost_usd, run_count, total_prompt_tokens, total_completion_tokens)
26
- VALUES (?, ?, ?, ?, ?)
27
- ON CONFLICT(date) DO UPDATE SET
28
- total_cost_usd = total_cost_usd + excluded.total_cost_usd,
29
- run_count = run_count + excluded.run_count,
30
- total_prompt_tokens = total_prompt_tokens + excluded.total_prompt_tokens,
31
- total_completion_tokens = total_completion_tokens + excluded.total_completion_tokens`)
32
- .run(date, usdAmount, dailyRunCountIncrement, usage.promptTokens, usage.completionTokens);
33
- this.db
34
- .prepare(`UPDATE runs
35
- SET estimated_cost_usd = estimated_cost_usd + ?,
36
- prompt_tokens = prompt_tokens + ?,
37
- completion_tokens = completion_tokens + ?
38
- WHERE id = ?`)
39
- .run(usdAmount, usage.promptTokens, usage.completionTokens, id);
40
- this.issueManager.syncFromRunId(id);
63
+ this.persistCostRecord(id, date, usage, usdAmount, costStepId, costWorkerType);
41
64
  });
42
65
  tx(runId, today, normalizedTokens, amountUsd);
43
66
  }
67
+ recordCostAndCheckBudget(runId, costUsd, tokenUsage, metadata, limits, costPolicyInput = 'pay-per-use') {
68
+ const amountUsd = Number(Math.max(0, costUsd).toFixed(6));
69
+ const normalizedTokens = normalizeTokenUsage(tokenUsage);
70
+ if (amountUsd <= 0 && normalizedTokens.totalTokens <= 0) {
71
+ return this.checkBudget(runId, limits, costPolicyInput);
72
+ }
73
+ const today = utcDayKey();
74
+ const costStepId = metadata.stepId?.trim() ? metadata.stepId : null;
75
+ const costWorkerType = metadata.workerType?.trim() ? metadata.workerType : null;
76
+ const tx = this.db.transaction((id, date, usage, usdAmount, securityLimits, policyInput) => {
77
+ this.persistCostRecord(id, date, usage, usdAmount, costStepId, costWorkerType);
78
+ return this.checkBudget(id, securityLimits, policyInput);
79
+ });
80
+ return tx(runId, today, normalizedTokens, amountUsd, limits, costPolicyInput);
81
+ }
44
82
  getDailyCost() {
45
83
  const today = utcDayKey();
46
84
  const row = this.db
@@ -57,37 +95,121 @@ export class CostTracker {
57
95
  getDailyTokenUsage() {
58
96
  const today = utcDayKey();
59
97
  const row = this.db
60
- .prepare('SELECT total_prompt_tokens, total_completion_tokens FROM daily_costs WHERE date = ?')
98
+ .prepare('SELECT total_prompt_tokens, total_completion_tokens, total_cache_read_tokens FROM daily_costs WHERE date = ?')
61
99
  .get(today);
62
100
  const promptTokens = row?.total_prompt_tokens ?? 0;
63
101
  const completionTokens = row?.total_completion_tokens ?? 0;
102
+ const cacheReadTokens = row?.total_cache_read_tokens ?? 0;
64
103
  return {
65
104
  promptTokens,
66
105
  completionTokens,
67
- totalTokens: promptTokens + completionTokens,
106
+ cacheReadTokens,
107
+ totalTokens: promptTokens + completionTokens + cacheReadTokens,
68
108
  };
69
109
  }
70
110
  getRunTokenUsage(runId) {
71
111
  const row = this.db
72
- .prepare('SELECT prompt_tokens, completion_tokens FROM runs WHERE id = ?')
112
+ .prepare('SELECT prompt_tokens, completion_tokens, cache_read_tokens FROM runs WHERE id = ?')
73
113
  .get(runId);
74
114
  const promptTokens = row?.prompt_tokens ?? 0;
75
115
  const completionTokens = row?.completion_tokens ?? 0;
116
+ const cacheReadTokens = row?.cache_read_tokens ?? 0;
76
117
  return {
77
118
  promptTokens,
78
119
  completionTokens,
79
- totalTokens: promptTokens + completionTokens,
120
+ cacheReadTokens,
121
+ totalTokens: promptTokens + completionTokens + cacheReadTokens,
80
122
  };
81
123
  }
124
+ getRunCostBreakdownByStep(runId) {
125
+ const rows = this.db
126
+ .prepare(`SELECT
127
+ step_id,
128
+ SUM(cost_usd) AS cost_usd,
129
+ SUM(prompt_tokens) AS prompt_tokens,
130
+ SUM(completion_tokens) AS completion_tokens,
131
+ SUM(cache_read_tokens) AS cache_read_tokens
132
+ FROM run_cost_entries
133
+ WHERE run_id = ?
134
+ GROUP BY step_id
135
+ ORDER BY cost_usd DESC, step_id ASC`)
136
+ .all(runId);
137
+ return rows.map((row) => {
138
+ const promptTokens = row.prompt_tokens ?? 0;
139
+ const completionTokens = row.completion_tokens ?? 0;
140
+ const cacheReadTokens = row.cache_read_tokens ?? 0;
141
+ return {
142
+ stepId: row.step_id,
143
+ costUsd: row.cost_usd ?? 0,
144
+ promptTokens,
145
+ completionTokens,
146
+ cacheReadTokens,
147
+ totalTokens: promptTokens + completionTokens + cacheReadTokens,
148
+ };
149
+ });
150
+ }
151
+ getDailyCostBreakdownByStep(date = utcDayKey()) {
152
+ const rows = this.db
153
+ .prepare(`SELECT
154
+ step_id,
155
+ SUM(cost_usd) AS cost_usd,
156
+ SUM(prompt_tokens) AS prompt_tokens,
157
+ SUM(completion_tokens) AS completion_tokens,
158
+ SUM(cache_read_tokens) AS cache_read_tokens
159
+ FROM run_cost_entries
160
+ WHERE date(created_at) = ?
161
+ GROUP BY step_id
162
+ ORDER BY cost_usd DESC, step_id ASC`)
163
+ .all(date);
164
+ return rows.map((row) => {
165
+ const promptTokens = row.prompt_tokens ?? 0;
166
+ const completionTokens = row.completion_tokens ?? 0;
167
+ const cacheReadTokens = row.cache_read_tokens ?? 0;
168
+ return {
169
+ stepId: row.step_id,
170
+ costUsd: row.cost_usd ?? 0,
171
+ promptTokens,
172
+ completionTokens,
173
+ cacheReadTokens,
174
+ totalTokens: promptTokens + completionTokens + cacheReadTokens,
175
+ };
176
+ });
177
+ }
178
+ getDailyCostBreakdownByWorker(date = utcDayKey()) {
179
+ const rows = this.db
180
+ .prepare(`SELECT
181
+ COALESCE(worker_type, 'unknown') AS worker_type,
182
+ SUM(cost_usd) AS cost_usd,
183
+ SUM(prompt_tokens) AS prompt_tokens,
184
+ SUM(completion_tokens) AS completion_tokens,
185
+ SUM(cache_read_tokens) AS cache_read_tokens
186
+ FROM run_cost_entries
187
+ WHERE date(created_at) = ?
188
+ GROUP BY worker_type
189
+ ORDER BY cost_usd DESC, worker_type ASC`)
190
+ .all(date);
191
+ return rows.map((row) => {
192
+ const promptTokens = row.prompt_tokens ?? 0;
193
+ const completionTokens = row.completion_tokens ?? 0;
194
+ const cacheReadTokens = row.cache_read_tokens ?? 0;
195
+ return {
196
+ workerType: row.worker_type,
197
+ costUsd: row.cost_usd ?? 0,
198
+ promptTokens,
199
+ completionTokens,
200
+ cacheReadTokens,
201
+ totalTokens: promptTokens + completionTokens + cacheReadTokens,
202
+ };
203
+ });
204
+ }
82
205
  /**
83
206
  * Evaluate whether a run has crossed any spend limit.
84
207
  * Returns a discriminated status so callers can build messages that name
85
208
  * the specific limit that tripped (daily vs per-run) instead of guessing.
86
209
  *
87
- * When `costModel === 'subscription'` (Claude Pro/Max, Codex Pro, etc.) the
88
- * USD estimate is advisory only the operator pays a flat subscription fee,
89
- * not per-token so enforcement is skipped entirely. Tokens and the
90
- * advisory USD estimate continue to be written to the DB for analytics.
210
+ * In `subscription` mode, enforcement is always skipped.
211
+ * In `subscription-metered` mode, warnings can be emitted while enforcement
212
+ * is optional per configured knob.
91
213
  *
92
214
  * A non-null `cost_budget_override_usd` on the run row overrides the
93
215
  * per-run cap with the stored value AND exempts the run from the daily
@@ -98,18 +220,73 @@ export class CostTracker {
98
220
  * replaces `limits.maxDailyCostUsd` for today only. It auto-expires when
99
221
  * the UTC day rolls over (next day's row starts NULL).
100
222
  */
101
- checkBudget(runId, limits, costModel = 'pay-per-use') {
102
- // Subscription plans are flat-rate. The per-token USD numbers the worker
103
- // adapters report are "what this would have cost on the API" estimates and
104
- // have no relationship to what the operator actually pays, so enforcing
105
- // them would block every run the moment tokens add up.
106
- if (costModel === 'subscription') {
223
+ checkBudget(runId, limits, costPolicyInput = 'pay-per-use') {
224
+ const policy = resolveCostPolicy(costPolicyInput);
225
+ if (policy.model === 'subscription') {
107
226
  return { overBudget: false };
108
227
  }
109
228
  const override = this.getRunBudgetOverride(runId);
110
229
  const runCost = this.getRunCost(runId);
111
230
  const effectivePerRunLimit = override ?? limits.maxCostPerRunUsd;
112
- if (runCost >= effectivePerRunLimit) {
231
+ const runOverLimit = runCost >= effectivePerRunLimit;
232
+ const dailyCost = this.getDailyCost();
233
+ const dailyCapOverride = this.getDailyCapOverride();
234
+ const effectiveDailyLimit = dailyCapOverride ?? limits.maxDailyCostUsd;
235
+ const dailyOverLimit = dailyCost >= effectiveDailyLimit;
236
+ if (policy.model === 'subscription-metered') {
237
+ const advisoryThreshold = policy.subscriptionMetered.advisoryThresholdUsd;
238
+ if (advisoryThreshold !== null) {
239
+ if (runCost >= advisoryThreshold) {
240
+ this.logSubscriptionMeteredWarningOnce(`${runId}:advisory:run:${advisoryThreshold}`, {
241
+ runId,
242
+ thresholdUsd: advisoryThreshold,
243
+ runCostUsd: runCost,
244
+ }, 'subscription-metered advisory threshold exceeded (run)');
245
+ }
246
+ if (dailyCost >= advisoryThreshold) {
247
+ this.logSubscriptionMeteredWarningOnce(`${runId}:advisory:daily:${advisoryThreshold}:${utcDayKey()}`, {
248
+ runId,
249
+ thresholdUsd: advisoryThreshold,
250
+ dailyCostUsd: dailyCost,
251
+ }, 'subscription-metered advisory threshold exceeded (daily)');
252
+ }
253
+ }
254
+ if (runOverLimit && !policy.subscriptionMetered.enforcePerRunLimit) {
255
+ this.logSubscriptionMeteredWarningOnce(`${runId}:soft:per-run:${effectivePerRunLimit}`, {
256
+ runId,
257
+ runCostUsd: runCost,
258
+ effectivePerRunLimitUsd: effectivePerRunLimit,
259
+ }, 'subscription-metered soft per-run limit exceeded');
260
+ }
261
+ if (runOverLimit && policy.subscriptionMetered.enforcePerRunLimit) {
262
+ return {
263
+ overBudget: true,
264
+ limit: 'per-run',
265
+ actualUsd: runCost,
266
+ limitUsd: effectivePerRunLimit,
267
+ };
268
+ }
269
+ if (override !== null) {
270
+ return { overBudget: false };
271
+ }
272
+ if (dailyOverLimit && !policy.subscriptionMetered.enforceDailyLimit) {
273
+ this.logSubscriptionMeteredWarningOnce(`${runId}:soft:daily:${effectiveDailyLimit}:${utcDayKey()}`, {
274
+ runId,
275
+ dailyCostUsd: dailyCost,
276
+ effectiveDailyLimitUsd: effectiveDailyLimit,
277
+ }, 'subscription-metered soft daily limit exceeded');
278
+ }
279
+ if (dailyOverLimit && policy.subscriptionMetered.enforceDailyLimit) {
280
+ return {
281
+ overBudget: true,
282
+ limit: 'daily',
283
+ actualUsd: dailyCost,
284
+ limitUsd: effectiveDailyLimit,
285
+ };
286
+ }
287
+ return { overBudget: false };
288
+ }
289
+ if (runOverLimit) {
113
290
  return {
114
291
  overBudget: true,
115
292
  limit: 'per-run',
@@ -122,10 +299,7 @@ export class CostTracker {
122
299
  if (override !== null) {
123
300
  return { overBudget: false };
124
301
  }
125
- const dailyCost = this.getDailyCost();
126
- const dailyCapOverride = this.getDailyCapOverride();
127
- const effectiveDailyLimit = dailyCapOverride ?? limits.maxDailyCostUsd;
128
- if (dailyCost >= effectiveDailyLimit) {
302
+ if (dailyOverLimit) {
129
303
  return {
130
304
  overBudget: true,
131
305
  limit: 'daily',
@@ -184,11 +358,17 @@ export class CostTracker {
184
358
  }
185
359
  }
186
360
  this.db
187
- .prepare(`INSERT INTO daily_costs (date, total_cost_usd, run_count, total_prompt_tokens, total_completion_tokens, daily_cost_cap_override_usd)
188
- VALUES (?, 0, 0, 0, 0, ?)
361
+ .prepare(`INSERT INTO daily_costs (date, total_cost_usd, run_count, total_prompt_tokens, total_completion_tokens, total_cache_read_tokens, daily_cost_cap_override_usd)
362
+ VALUES (?, 0, 0, 0, 0, 0, ?)
189
363
  ON CONFLICT(date) DO UPDATE SET daily_cost_cap_override_usd = excluded.daily_cost_cap_override_usd`)
190
364
  .run(date, overrideUsd);
191
365
  }
366
+ logSubscriptionMeteredWarningOnce(key, data, message) {
367
+ if (this.advisoryWarnings.has(key))
368
+ return;
369
+ this.advisoryWarnings.add(key);
370
+ logger.warn(data, message);
371
+ }
192
372
  }
193
373
  /** Human-readable message naming the specific limit that tripped. */
194
374
  export function describeBudgetBlock(status) {
@@ -209,10 +389,12 @@ export function costLimitRecoveryHint(limit) {
209
389
  function normalizeTokenUsage(tokenUsage) {
210
390
  const promptTokens = normalizeTokenCount(tokenUsage?.promptTokens);
211
391
  const completionTokens = normalizeTokenCount(tokenUsage?.completionTokens);
392
+ const cacheReadTokens = normalizeTokenCount(tokenUsage?.cacheReadTokens);
212
393
  return {
213
394
  promptTokens,
214
395
  completionTokens,
215
- totalTokens: promptTokens + completionTokens,
396
+ cacheReadTokens,
397
+ totalTokens: promptTokens + completionTokens + cacheReadTokens,
216
398
  };
217
399
  }
218
400
  function normalizeTokenCount(value) {
@@ -220,4 +402,26 @@ function normalizeTokenCount(value) {
220
402
  return 0;
221
403
  return Math.max(0, Math.floor(value));
222
404
  }
405
+ function resolveCostPolicy(input) {
406
+ if (typeof input === 'string') {
407
+ return {
408
+ model: input,
409
+ subscriptionMetered: {
410
+ advisoryThresholdUsd: null,
411
+ enforcePerRunLimit: false,
412
+ enforceDailyLimit: false,
413
+ },
414
+ };
415
+ }
416
+ const model = input?.model ?? 'pay-per-use';
417
+ const subscriptionMetered = input?.subscriptionMetered;
418
+ return {
419
+ model,
420
+ subscriptionMetered: {
421
+ advisoryThresholdUsd: subscriptionMetered?.advisoryThresholdUsd ?? null,
422
+ enforcePerRunLimit: subscriptionMetered?.enforcePerRunLimit ?? false,
423
+ enforceDailyLimit: subscriptionMetered?.enforceDailyLimit ?? false,
424
+ },
425
+ };
426
+ }
223
427
  //# sourceMappingURL=cost.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cost.js","sourceRoot":"","sources":["../../src/loop/cost.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cost.js","sourceRoot":"","sources":["../../src/loop/cost.ts"],"names":[],"mappings":"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"}
@@ -24,9 +24,9 @@ export function decide(ctx, loopConfig, securityConfig, options = {}) {
24
24
  // (Primary check lives in the engine via CostTracker.checkBudget which also
25
25
  // covers the daily cap; this is a pure-function fallback that only sees the
26
26
  // run-local estimate, so it can only catch the per-run overrun here.)
27
- // Skipped in subscription mode — the USD numbers are advisory-only estimates
28
- // and don't correspond to what the operator actually pays.
29
- if (costModel !== 'subscription' && ctx.estimatedCostUsd > securityConfig.maxCostPerRunUsd) {
27
+ // Skipped in subscription-like modes — the engine-level CostTracker handles
28
+ // enforcement policy for subscription-metered and advisory-only subscription.
29
+ if (costModel === 'pay-per-use' && ctx.estimatedCostUsd > securityConfig.maxCostPerRunUsd) {
30
30
  const reason = `Per-run cost limit exceeded: $${ctx.estimatedCostUsd.toFixed(2)} >= ` +
31
31
  `$${securityConfig.maxCostPerRunUsd.toFixed(2)}. ${costLimitRecoveryHint('per-run')}`;
32
32
  return { action: 'block', reason, blockReason: 'cost_limit' };
@@ -1 +1 @@
1
- {"version":3,"file":"decision.js","sourceRoot":"","sources":["../../src/loop/decision.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"decision.js","sourceRoot":"","sources":["../../src/loop/decision.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ import type { MetricsService } from '../metrics/service.js';
5
5
  import type { ResolvedWorkflow } from './workflow.js';
6
6
  import type Database from 'better-sqlite3';
7
7
  import type { AgentEvent } from '../events/types.js';
8
+ /** External services injected into the loop engine. Tests can substitute mocks for all of these. */
8
9
  export interface LoopDependencies {
9
10
  db: Database.Database;
10
11
  config: Config;
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/loop/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAWrD,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAE1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAEpD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IACvC,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;IAC1C,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAChD;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,OAAO,CAAA;CAC/B;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,UAAU,CAAC,CA0SrB"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/loop/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC3D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAYrD,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAE1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAGpD,oGAAoG;AACpG,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IACvC,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAA;IAC1C,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAChD;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,OAAO,CAAA;CAC/B;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,UAAU,CAAC,CAoWrB"}