patchwork-os 0.2.0-beta.10.canary.99 → 0.2.0-beta.11
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.md +20 -1
- package/dist/adapters/grok.js +6 -1
- package/dist/adapters/grok.js.map +1 -1
- package/dist/approvalHttp.js +61 -66
- package/dist/approvalHttp.js.map +1 -1
- package/dist/bridge.js +3 -2
- package/dist/bridge.js.map +1 -1
- package/dist/claudeOrchestrator.js +15 -0
- package/dist/claudeOrchestrator.js.map +1 -1
- package/dist/commands/patchworkInit.d.ts +7 -0
- package/dist/commands/patchworkInit.js +26 -0
- package/dist/commands/patchworkInit.js.map +1 -1
- package/dist/commands/recipe.d.ts +14 -0
- package/dist/commands/recipe.js +51 -0
- package/dist/commands/recipe.js.map +1 -1
- package/dist/commands/recipeInstall.js +15 -0
- package/dist/commands/recipeInstall.js.map +1 -1
- package/dist/connectors/postgres.d.ts +7 -0
- package/dist/connectors/postgres.js +16 -2
- package/dist/connectors/postgres.js.map +1 -1
- package/dist/connectors/snowflake.js +6 -0
- package/dist/connectors/snowflake.js.map +1 -1
- package/dist/connectors/tokenStorage.d.ts +8 -0
- package/dist/connectors/tokenStorage.js +42 -3
- package/dist/connectors/tokenStorage.js.map +1 -1
- package/dist/drivers/claude/api.js +15 -2
- package/dist/drivers/claude/api.js.map +1 -1
- package/dist/drivers/claude/subprocess.js +1 -29
- package/dist/drivers/claude/subprocess.js.map +1 -1
- package/dist/drivers/gemini/index.js +9 -5
- package/dist/drivers/gemini/index.js.map +1 -1
- package/dist/drivers/openai/index.js +29 -4
- package/dist/drivers/openai/index.js.map +1 -1
- package/dist/drivers/outputCap.d.ts +27 -0
- package/dist/drivers/outputCap.js +50 -0
- package/dist/drivers/outputCap.js.map +1 -0
- package/dist/featureFlags.d.ts +9 -0
- package/dist/featureFlags.js +16 -0
- package/dist/featureFlags.js.map +1 -1
- package/dist/fp/commandDescription.d.ts +6 -0
- package/dist/fp/commandDescription.js +4 -4
- package/dist/fp/commandDescription.js.map +1 -1
- package/dist/fp/policyParser.js +13 -7
- package/dist/fp/policyParser.js.map +1 -1
- package/dist/haltPushDispatch.js +7 -22
- package/dist/haltPushDispatch.js.map +1 -1
- package/dist/index.js +128 -0
- package/dist/index.js.map +1 -1
- package/dist/mcpRoutes.js +1 -1
- package/dist/mcpRoutes.js.map +1 -1
- package/dist/oauth.d.ts +13 -0
- package/dist/oauth.js +34 -1
- package/dist/oauth.js.map +1 -1
- package/dist/recipeOrchestration.js +10 -0
- package/dist/recipeOrchestration.js.map +1 -1
- package/dist/recipeRoutes.d.ts +39 -0
- package/dist/recipeRoutes.js +214 -12
- package/dist/recipeRoutes.js.map +1 -1
- package/dist/recipes/agentExecutor.d.ts +20 -0
- package/dist/recipes/agentExecutor.js +32 -10
- package/dist/recipes/agentExecutor.js.map +1 -1
- package/dist/recipes/chainedRunner.d.ts +41 -2
- package/dist/recipes/chainedRunner.js +134 -6
- package/dist/recipes/chainedRunner.js.map +1 -1
- package/dist/recipes/connectorPreflight.js +30 -0
- package/dist/recipes/connectorPreflight.js.map +1 -1
- package/dist/recipes/haltCategory.d.ts +5 -0
- package/dist/recipes/haltCategory.js +7 -1
- package/dist/recipes/haltCategory.js.map +1 -1
- package/dist/recipes/judgeVerdict.d.ts +10 -0
- package/dist/recipes/judgeVerdict.js +10 -0
- package/dist/recipes/judgeVerdict.js.map +1 -1
- package/dist/recipes/names.d.ts +5 -0
- package/dist/recipes/names.js +10 -5
- package/dist/recipes/names.js.map +1 -1
- package/dist/recipes/parser.js +32 -9
- package/dist/recipes/parser.js.map +1 -1
- package/dist/recipes/pricing/costRouter.d.ts +43 -0
- package/dist/recipes/pricing/costRouter.js +44 -0
- package/dist/recipes/pricing/costRouter.js.map +1 -0
- package/dist/recipes/pricing/priceTable.d.ts +76 -0
- package/dist/recipes/pricing/priceTable.js +144 -0
- package/dist/recipes/pricing/priceTable.js.map +1 -0
- package/dist/recipes/runBudget.d.ts +82 -32
- package/dist/recipes/runBudget.js +182 -49
- package/dist/recipes/runBudget.js.map +1 -1
- package/dist/recipes/schema.d.ts +25 -4
- package/dist/recipes/schemaGenerator.d.ts +9 -0
- package/dist/recipes/schemaGenerator.js +386 -75
- package/dist/recipes/schemaGenerator.js.map +1 -1
- package/dist/recipes/simulation/aggregateRunRisk.d.ts +43 -0
- package/dist/recipes/simulation/aggregateRunRisk.js +117 -0
- package/dist/recipes/simulation/aggregateRunRisk.js.map +1 -0
- package/dist/recipes/simulation/costProjector.d.ts +32 -0
- package/dist/recipes/simulation/costProjector.js +194 -0
- package/dist/recipes/simulation/costProjector.js.map +1 -0
- package/dist/recipes/simulation/sideEffects.d.ts +32 -0
- package/dist/recipes/simulation/sideEffects.js +62 -0
- package/dist/recipes/simulation/sideEffects.js.map +1 -0
- package/dist/recipes/simulation/simulate.d.ts +36 -0
- package/dist/recipes/simulation/simulate.js +264 -0
- package/dist/recipes/simulation/simulate.js.map +1 -0
- package/dist/recipes/simulation/simulateMockedRun.d.ts +52 -0
- package/dist/recipes/simulation/simulateMockedRun.js +72 -0
- package/dist/recipes/simulation/simulateMockedRun.js.map +1 -0
- package/dist/recipes/simulation/synthesizeMockedOutputs.d.ts +31 -0
- package/dist/recipes/simulation/synthesizeMockedOutputs.js +50 -0
- package/dist/recipes/simulation/synthesizeMockedOutputs.js.map +1 -0
- package/dist/recipes/simulation/types.d.ts +198 -0
- package/dist/recipes/simulation/types.js +30 -0
- package/dist/recipes/simulation/types.js.map +1 -0
- package/dist/recipes/stepObservation.d.ts +12 -0
- package/dist/recipes/stepObservation.js +21 -1
- package/dist/recipes/stepObservation.js.map +1 -1
- package/dist/recipes/tools/airtable.d.ts +15 -0
- package/dist/recipes/tools/airtable.js +240 -0
- package/dist/recipes/tools/airtable.js.map +1 -0
- package/dist/recipes/tools/caldiy.d.ts +13 -0
- package/dist/recipes/tools/caldiy.js +214 -0
- package/dist/recipes/tools/caldiy.js.map +1 -0
- package/dist/recipes/tools/circleci.d.ts +10 -0
- package/dist/recipes/tools/circleci.js +204 -0
- package/dist/recipes/tools/circleci.js.map +1 -0
- package/dist/recipes/tools/cloudflare.d.ts +13 -0
- package/dist/recipes/tools/cloudflare.js +211 -0
- package/dist/recipes/tools/cloudflare.js.map +1 -0
- package/dist/recipes/tools/docs.d.ts +18 -0
- package/dist/recipes/tools/docs.js +94 -0
- package/dist/recipes/tools/docs.js.map +1 -0
- package/dist/recipes/tools/elasticsearch.d.ts +11 -0
- package/dist/recipes/tools/elasticsearch.js +156 -0
- package/dist/recipes/tools/elasticsearch.js.map +1 -0
- package/dist/recipes/tools/figma.d.ts +12 -0
- package/dist/recipes/tools/figma.js +194 -0
- package/dist/recipes/tools/figma.js.map +1 -0
- package/dist/recipes/tools/grafana.d.ts +11 -0
- package/dist/recipes/tools/grafana.js +216 -0
- package/dist/recipes/tools/grafana.js.map +1 -0
- package/dist/recipes/tools/http.d.ts +1 -1
- package/dist/recipes/tools/http.js +10 -28
- package/dist/recipes/tools/http.js.map +1 -1
- package/dist/recipes/tools/index.d.ts +26 -0
- package/dist/recipes/tools/index.js +26 -0
- package/dist/recipes/tools/index.js.map +1 -1
- package/dist/recipes/tools/monday.d.ts +22 -0
- package/dist/recipes/tools/monday.js +242 -0
- package/dist/recipes/tools/monday.js.map +1 -0
- package/dist/recipes/tools/obsidian.d.ts +15 -0
- package/dist/recipes/tools/obsidian.js +172 -0
- package/dist/recipes/tools/obsidian.js.map +1 -0
- package/dist/recipes/tools/paystack.d.ts +11 -0
- package/dist/recipes/tools/paystack.js +211 -0
- package/dist/recipes/tools/paystack.js.map +1 -0
- package/dist/recipes/tools/pipedrive.d.ts +16 -0
- package/dist/recipes/tools/pipedrive.js +233 -0
- package/dist/recipes/tools/pipedrive.js.map +1 -0
- package/dist/recipes/tools/postgres.d.ts +15 -0
- package/dist/recipes/tools/postgres.js +185 -0
- package/dist/recipes/tools/postgres.js.map +1 -0
- package/dist/recipes/tools/posthog.d.ts +16 -0
- package/dist/recipes/tools/posthog.js +219 -0
- package/dist/recipes/tools/posthog.js.map +1 -0
- package/dist/recipes/tools/redis.d.ts +9 -0
- package/dist/recipes/tools/redis.js +140 -0
- package/dist/recipes/tools/redis.js.map +1 -0
- package/dist/recipes/tools/resend.d.ts +8 -0
- package/dist/recipes/tools/resend.js +153 -0
- package/dist/recipes/tools/resend.js.map +1 -0
- package/dist/recipes/tools/salesforce.d.ts +16 -0
- package/dist/recipes/tools/salesforce.js +184 -0
- package/dist/recipes/tools/salesforce.js.map +1 -0
- package/dist/recipes/tools/sendgrid.d.ts +9 -0
- package/dist/recipes/tools/sendgrid.js +174 -0
- package/dist/recipes/tools/sendgrid.js.map +1 -0
- package/dist/recipes/tools/shopify.d.ts +16 -0
- package/dist/recipes/tools/shopify.js +265 -0
- package/dist/recipes/tools/shopify.js.map +1 -0
- package/dist/recipes/tools/snowflake.d.ts +16 -0
- package/dist/recipes/tools/snowflake.js +173 -0
- package/dist/recipes/tools/snowflake.js.map +1 -0
- package/dist/recipes/tools/stripe.js +13 -12
- package/dist/recipes/tools/stripe.js.map +1 -1
- package/dist/recipes/tools/supabase.d.ts +9 -0
- package/dist/recipes/tools/supabase.js +132 -0
- package/dist/recipes/tools/supabase.js.map +1 -0
- package/dist/recipes/tools/todoist.d.ts +15 -0
- package/dist/recipes/tools/todoist.js +227 -0
- package/dist/recipes/tools/todoist.js.map +1 -0
- package/dist/recipes/tools/twilio.d.ts +11 -0
- package/dist/recipes/tools/twilio.js +180 -0
- package/dist/recipes/tools/twilio.js.map +1 -0
- package/dist/recipes/tools/vercel.d.ts +9 -0
- package/dist/recipes/tools/vercel.js +145 -0
- package/dist/recipes/tools/vercel.js.map +1 -0
- package/dist/recipes/tools/webflow.d.ts +11 -0
- package/dist/recipes/tools/webflow.js +243 -0
- package/dist/recipes/tools/webflow.js.map +1 -0
- package/dist/recipes/tools/woocommerce.d.ts +18 -0
- package/dist/recipes/tools/woocommerce.js +259 -0
- package/dist/recipes/tools/woocommerce.js.map +1 -0
- package/dist/recipes/tools/wrapConnectorExecute.d.ts +25 -0
- package/dist/recipes/tools/wrapConnectorExecute.js +37 -0
- package/dist/recipes/tools/wrapConnectorExecute.js.map +1 -0
- package/dist/recipes/validation.js +264 -0
- package/dist/recipes/validation.js.map +1 -1
- package/dist/recipes/yamlRunner.d.ts +112 -3
- package/dist/recipes/yamlRunner.js +482 -19
- package/dist/recipes/yamlRunner.js.map +1 -1
- package/dist/runLog.d.ts +46 -0
- package/dist/runLog.js +4 -0
- package/dist/runLog.js.map +1 -1
- package/dist/schemas/recipe.v1.json +217 -11
- package/dist/server.d.ts +3 -0
- package/dist/server.js +4 -0
- package/dist/server.js.map +1 -1
- package/dist/streamableHttp.js +3 -2
- package/dist/streamableHttp.js.map +1 -1
- package/dist/tools/gitWrite.js +5 -1
- package/dist/tools/gitWrite.js.map +1 -1
- package/dist/tools/terminal.js +15 -49
- package/dist/tools/terminal.js.map +1 -1
- package/dist/transport.d.ts +1 -0
- package/dist/transport.js +7 -0
- package/dist/transport.js.map +1 -1
- package/package.json +3 -3
- package/scripts/mcp-stdio-shim.cjs +218 -84
- package/templates/recipes/incident-to-pr.yaml +187 -0
|
@@ -20,6 +20,11 @@ export type HaltCategory = "agent_silent_fail" | "agent_narration_only" | "agent
|
|
|
20
20
|
| "expect_failed"
|
|
21
21
|
/** Per-step wall-clock `timeout_ms` exceeded (sandbox-alternative slice). */
|
|
22
22
|
| "step_timeout"
|
|
23
|
+
/**
|
|
24
|
+
* Opt-in judge→refine loop exhausted its `max_revisions` budget and the
|
|
25
|
+
* judge still returned `request_changes` with `on_exhausted: "halt"`.
|
|
26
|
+
*/
|
|
27
|
+
| "judge_revisions_exhausted"
|
|
23
28
|
/**
|
|
24
29
|
* Connector returned 401/403 — token expired or scopes insufficient.
|
|
25
30
|
* Actionable: user should reconnect from /connections.
|
|
@@ -26,6 +26,7 @@ export const HALT_CATEGORY_LABELS = {
|
|
|
26
26
|
budget_exceeded: "budget exceeded",
|
|
27
27
|
expect_failed: "expect failed",
|
|
28
28
|
step_timeout: "step timeout",
|
|
29
|
+
judge_revisions_exhausted: "judge revisions exhausted",
|
|
29
30
|
auth_failure: "auth failure",
|
|
30
31
|
rate_limited: "rate limited",
|
|
31
32
|
network_error: "network error",
|
|
@@ -45,9 +46,10 @@ export const HALT_CATEGORY_HINTS = {
|
|
|
45
46
|
tool_threw: "check inner error in trace",
|
|
46
47
|
tool_error: "check inner error in trace",
|
|
47
48
|
kill_switch: "run `patchwork kill-switch release`",
|
|
48
|
-
budget_exceeded: "raise tokensMax or shrink prompts",
|
|
49
|
+
budget_exceeded: "raise tokensMax / usdMax or shrink prompts",
|
|
49
50
|
expect_failed: "inspect assertion vs actual output",
|
|
50
51
|
step_timeout: "bump timeout_ms or speed up step",
|
|
52
|
+
judge_revisions_exhausted: "raise max_revisions, refine the prompt, or set on_exhausted: proceed",
|
|
51
53
|
auth_failure: "reconnect from /connections",
|
|
52
54
|
rate_limited: "back off cron cadence or wait",
|
|
53
55
|
network_error: "check connectivity to upstream",
|
|
@@ -73,6 +75,10 @@ export function categoriseHaltReason(reason) {
|
|
|
73
75
|
return "budget_exceeded";
|
|
74
76
|
if (/^expect_failed/i.test(reason))
|
|
75
77
|
return "expect_failed";
|
|
78
|
+
// Opt-in judge→refine loop exhaustion (`judge "x" did not approve after N
|
|
79
|
+
// revisions`). Must precede the generic `Agent step ... threw` matcher.
|
|
80
|
+
if (/did not approve after \d+ revision/i.test(reason))
|
|
81
|
+
return "judge_revisions_exhausted";
|
|
76
82
|
// Must precede the `^Tool ... threw` matcher: timeouts surface wrapped
|
|
77
83
|
// inside the tool-threw envelope (`Tool "x" in step "y" threw: step_timeout: ...`).
|
|
78
84
|
if (/step_timeout/i.test(reason))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"haltCategory.js","sourceRoot":"","sources":["../../src/recipes/haltCategory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"haltCategory.js","sourceRoot":"","sources":["../../src/recipes/haltCategory.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,16 @@
|
|
|
20
20
|
* `status: "ok"` with a stashed verdict, never `status: "error"`.
|
|
21
21
|
* That separation is what prevents the judge step from quietly
|
|
22
22
|
* becoming a gate.
|
|
23
|
+
*
|
|
24
|
+
* ⚠️ OPT-IN DEPARTURE (judge→refine loop) — when a judge step sets the
|
|
25
|
+
* opt-in `agent.max_revisions > 0` (with `kind: "judge"` + `reviews`),
|
|
26
|
+
* the runner DELIBERATELY departs the augment-only invariant: a
|
|
27
|
+
* `request_changes` verdict drives a bounded revise→re-judge loop and
|
|
28
|
+
* MAY end with `status: "error"` (`on_exhausted: "halt"`). This is the
|
|
29
|
+
* single sanctioned exception and is reachable ONLY through those opt-in
|
|
30
|
+
* fields. When they're absent, the augment-only contract above holds
|
|
31
|
+
* byte-for-byte. The loop itself lives in `runJudgeRefineLoop` inside
|
|
32
|
+
* yamlRunner.ts; this parser is unchanged and still never gates.
|
|
23
33
|
*/
|
|
24
34
|
export type JudgeVerdictKind = "approve" | "request_changes" | "unparseable";
|
|
25
35
|
export interface JudgeVerdict {
|
|
@@ -20,6 +20,16 @@
|
|
|
20
20
|
* `status: "ok"` with a stashed verdict, never `status: "error"`.
|
|
21
21
|
* That separation is what prevents the judge step from quietly
|
|
22
22
|
* becoming a gate.
|
|
23
|
+
*
|
|
24
|
+
* ⚠️ OPT-IN DEPARTURE (judge→refine loop) — when a judge step sets the
|
|
25
|
+
* opt-in `agent.max_revisions > 0` (with `kind: "judge"` + `reviews`),
|
|
26
|
+
* the runner DELIBERATELY departs the augment-only invariant: a
|
|
27
|
+
* `request_changes` verdict drives a bounded revise→re-judge loop and
|
|
28
|
+
* MAY end with `status: "error"` (`on_exhausted: "halt"`). This is the
|
|
29
|
+
* single sanctioned exception and is reachable ONLY through those opt-in
|
|
30
|
+
* fields. When they're absent, the augment-only contract above holds
|
|
31
|
+
* byte-for-byte. The loop itself lives in `runJudgeRefineLoop` inside
|
|
32
|
+
* yamlRunner.ts; this parser is unchanged and still never gates.
|
|
23
33
|
*/
|
|
24
34
|
/**
|
|
25
35
|
* Append to the judge prompt to elicit the structured tail. Kept short
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"judgeVerdict.js","sourceRoot":"","sources":["../../src/recipes/judgeVerdict.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"judgeVerdict.js","sourceRoot":"","sources":["../../src/recipes/judgeVerdict.ts"],"names":[],"mappings":"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"}
|
package/dist/recipes/names.d.ts
CHANGED
|
@@ -56,5 +56,10 @@ export declare const RECIPE_VAR_NAME_RE: RegExp;
|
|
|
56
56
|
* data silently. The simple-identifier subset of
|
|
57
57
|
* `registerRecipeContextKeys` + `extractTemplateExpressions builtinKeys`
|
|
58
58
|
* (see `src/recipes/validation.ts`).
|
|
59
|
+
*
|
|
60
|
+
* Entries are stored LOWERCASE: the validator (and the dashboard mirror)
|
|
61
|
+
* look up `name.toLowerCase()`, so the date-format keys (`yyyy`, `iso_now`,
|
|
62
|
+
* `hh`, `mm`, `ss`) must be lowercase here or they would never match —
|
|
63
|
+
* letting a `yyyy`/`YYYY` var silently shadow the built-in date key.
|
|
59
64
|
*/
|
|
60
65
|
export declare const RESERVED_VAR_NAMES: ReadonlySet<string>;
|
package/dist/recipes/names.js
CHANGED
|
@@ -61,15 +61,20 @@ export const RECIPE_VAR_NAME_RE = /^[A-Za-z_][A-Za-z0-9_]{0,63}$/;
|
|
|
61
61
|
* data silently. The simple-identifier subset of
|
|
62
62
|
* `registerRecipeContextKeys` + `extractTemplateExpressions builtinKeys`
|
|
63
63
|
* (see `src/recipes/validation.ts`).
|
|
64
|
+
*
|
|
65
|
+
* Entries are stored LOWERCASE: the validator (and the dashboard mirror)
|
|
66
|
+
* look up `name.toLowerCase()`, so the date-format keys (`yyyy`, `iso_now`,
|
|
67
|
+
* `hh`, `mm`, `ss`) must be lowercase here or they would never match —
|
|
68
|
+
* letting a `yyyy`/`YYYY` var silently shadow the built-in date key.
|
|
64
69
|
*/
|
|
65
70
|
export const RESERVED_VAR_NAMES = new Set([
|
|
66
71
|
"date",
|
|
67
72
|
"time",
|
|
68
|
-
"
|
|
69
|
-
"
|
|
70
|
-
"
|
|
71
|
-
"
|
|
72
|
-
"
|
|
73
|
+
"yyyy",
|
|
74
|
+
"iso_now",
|
|
75
|
+
"hh",
|
|
76
|
+
"mm",
|
|
77
|
+
"ss",
|
|
73
78
|
"this",
|
|
74
79
|
"hash",
|
|
75
80
|
"message",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"names.js","sourceRoot":"","sources":["../../src/recipes/names.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,2BAA2B,CAAC;AAE1D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;AAC/C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,+BAA+B,CAAC;AAElE
|
|
1
|
+
{"version":3,"file":"names.js","sourceRoot":"","sources":["../../src/recipes/names.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,2BAA2B,CAAC;AAE1D;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;AAC/C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,+BAA+B,CAAC;AAElE;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAwB,IAAI,GAAG,CAAC;IAC7D,MAAM;IACN,MAAM;IACN,MAAM;IACN,SAAS;IACT,IAAI;IACJ,IAAI;IACJ,IAAI;IACJ,MAAM;IACN,MAAM;IACN,SAAS;IACT,QAAQ;IACR,SAAS;IACT,iBAAiB;IACjB,WAAW;IACX,cAAc;IACd,MAAM;IACN,UAAU;IACV,eAAe;IACf,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,UAAU;IACV,OAAO;CACR,CAAC,CAAC"}
|
package/dist/recipes/parser.js
CHANGED
|
@@ -68,6 +68,13 @@ export function parseRecipe(raw) {
|
|
|
68
68
|
on_error: typeof r.on_error === "object" && r.on_error !== null
|
|
69
69
|
? r.on_error
|
|
70
70
|
: undefined,
|
|
71
|
+
// Pass the recipe-level budget through. Without this the normalizer
|
|
72
|
+
// silently dropped `budget`, so any recipe round-tripped through
|
|
73
|
+
// parseRecipe (the installer's validation path) lost its token budget —
|
|
74
|
+
// RunBudget(recipe.budget) then saw undefined and enforced nothing.
|
|
75
|
+
budget: typeof r.budget === "object" && r.budget !== null
|
|
76
|
+
? r.budget
|
|
77
|
+
: undefined,
|
|
71
78
|
};
|
|
72
79
|
}
|
|
73
80
|
function requireString(o, key) {
|
|
@@ -88,23 +95,39 @@ function parseTrigger(raw) {
|
|
|
88
95
|
"path",
|
|
89
96
|
]);
|
|
90
97
|
return { type: "webhook", path: t.path };
|
|
91
|
-
case "cron":
|
|
92
|
-
|
|
93
|
-
|
|
98
|
+
case "cron": {
|
|
99
|
+
// Audit 2026-06-03 (HIGH #9): accept both `schedule` and the schema-
|
|
100
|
+
// documented `at` field. validateRecipeDefinition reads `trigger.at`
|
|
101
|
+
// (post-normalization) so a recipe authored with `at:` lints fine; the
|
|
102
|
+
// install path goes through here, so without this alias it threw
|
|
103
|
+
// `cron.schedule required` and lint-passing recipes failed to install.
|
|
104
|
+
const cronExpr = typeof t.schedule === "string" && t.schedule.trim()
|
|
105
|
+
? t.schedule
|
|
106
|
+
: typeof t.at === "string" && t.at.trim()
|
|
107
|
+
? t.at
|
|
108
|
+
: null;
|
|
109
|
+
if (!cronExpr)
|
|
110
|
+
throw new RecipeParseError("cron.schedule (or cron.at) required", [
|
|
94
111
|
"trigger",
|
|
95
112
|
"schedule",
|
|
96
113
|
]);
|
|
97
|
-
return { type: "cron", schedule:
|
|
98
|
-
|
|
114
|
+
return { type: "cron", schedule: cronExpr };
|
|
115
|
+
}
|
|
116
|
+
case "file_watch": {
|
|
99
117
|
if (!Array.isArray(t.patterns) || t.patterns.length === 0)
|
|
100
118
|
throw new RecipeParseError("file_watch.patterns required", [
|
|
101
119
|
"trigger",
|
|
102
120
|
"patterns",
|
|
103
121
|
]);
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
122
|
+
const patterns = t.patterns.filter((p) => typeof p === "string");
|
|
123
|
+
// Audit 2026-06-03 (MEDIUM): a patterns array containing only non-strings
|
|
124
|
+
// passed the length check above but filtered to []. The trigger then
|
|
125
|
+
// silently watched NOTHING — install/lint succeeded but the recipe never
|
|
126
|
+
// fired. Require at least one usable string pattern.
|
|
127
|
+
if (patterns.length === 0)
|
|
128
|
+
throw new RecipeParseError("file_watch.patterns must contain at least one string glob", ["trigger", "patterns"]);
|
|
129
|
+
return { type: "file_watch", patterns };
|
|
130
|
+
}
|
|
108
131
|
case "git_hook":
|
|
109
132
|
if (t.event !== "post-commit" &&
|
|
110
133
|
t.event !== "pre-push" &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/recipes/parser.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/recipes/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cost-aware model routing — cost-routing Phase 4 (pure selection).
|
|
3
|
+
*
|
|
4
|
+
* Opt-in, author-controlled "gearbox" on top of the `usdMax` brake (Phase 3):
|
|
5
|
+
* a per-step `downshift` list lets a recipe drop to a cheaper model as the USD
|
|
6
|
+
* budget tightens, instead of either blowing the cap or halting outright. The
|
|
7
|
+
* recipe author asserts each fallback is "good enough" for the step — the
|
|
8
|
+
* engine does NOT reason about model quality, only affordability.
|
|
9
|
+
*
|
|
10
|
+
* This module is the pure decision: given the preferred (driver, model), the
|
|
11
|
+
* author's ordered downshift candidates, and a quote() that estimates each
|
|
12
|
+
* candidate's USD cost, pick the most-preferred candidate that still fits the
|
|
13
|
+
* remaining budget. It loads nothing and has no side effects — the runner
|
|
14
|
+
* supplies remainingUsd + quote from RunBudget.
|
|
15
|
+
*
|
|
16
|
+
* Absent / empty `downshift` ⇒ returns `preferred` unchanged (byte-identical
|
|
17
|
+
* to no routing). Routing only runs when a USD cap is set (the runner passes
|
|
18
|
+
* remainingUsd only then).
|
|
19
|
+
*/
|
|
20
|
+
export interface RouteCandidate {
|
|
21
|
+
driver?: string;
|
|
22
|
+
model?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface RouteContext {
|
|
25
|
+
/** USD left before `budget.usdMax`. The router runs only when a cap is set. */
|
|
26
|
+
remainingUsd: number;
|
|
27
|
+
/**
|
|
28
|
+
* Pre-dispatch USD estimate for a prospective (driver, model) call, or
|
|
29
|
+
* `undefined` when that call is NOT USD-enforced — a non-billable driver
|
|
30
|
+
* (local / subscription) or an unpriced model. An unenforced candidate is
|
|
31
|
+
* treated as always affordable (it costs nothing against the cap), so it is
|
|
32
|
+
* a valid "free" downshift target.
|
|
33
|
+
*/
|
|
34
|
+
quote: (driver: string | undefined, model: string | undefined) => number | undefined;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Pick the most-preferred candidate whose estimated cost fits `remainingUsd`.
|
|
38
|
+
* Candidates are tried in order `[preferred, ...downshift]`; a downshift entry
|
|
39
|
+
* inherits the preferred driver/model for any field it omits. If none fit, the
|
|
40
|
+
* last (cheapest listed) is returned and the admit()/reconcile() gate decides
|
|
41
|
+
* whether to halt — downshift slows the spend rate, it never overrides a breach.
|
|
42
|
+
*/
|
|
43
|
+
export declare function costRouter(preferred: RouteCandidate, downshift: RouteCandidate[] | undefined, ctx: RouteContext): RouteCandidate;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cost-aware model routing — cost-routing Phase 4 (pure selection).
|
|
3
|
+
*
|
|
4
|
+
* Opt-in, author-controlled "gearbox" on top of the `usdMax` brake (Phase 3):
|
|
5
|
+
* a per-step `downshift` list lets a recipe drop to a cheaper model as the USD
|
|
6
|
+
* budget tightens, instead of either blowing the cap or halting outright. The
|
|
7
|
+
* recipe author asserts each fallback is "good enough" for the step — the
|
|
8
|
+
* engine does NOT reason about model quality, only affordability.
|
|
9
|
+
*
|
|
10
|
+
* This module is the pure decision: given the preferred (driver, model), the
|
|
11
|
+
* author's ordered downshift candidates, and a quote() that estimates each
|
|
12
|
+
* candidate's USD cost, pick the most-preferred candidate that still fits the
|
|
13
|
+
* remaining budget. It loads nothing and has no side effects — the runner
|
|
14
|
+
* supplies remainingUsd + quote from RunBudget.
|
|
15
|
+
*
|
|
16
|
+
* Absent / empty `downshift` ⇒ returns `preferred` unchanged (byte-identical
|
|
17
|
+
* to no routing). Routing only runs when a USD cap is set (the runner passes
|
|
18
|
+
* remainingUsd only then).
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Pick the most-preferred candidate whose estimated cost fits `remainingUsd`.
|
|
22
|
+
* Candidates are tried in order `[preferred, ...downshift]`; a downshift entry
|
|
23
|
+
* inherits the preferred driver/model for any field it omits. If none fit, the
|
|
24
|
+
* last (cheapest listed) is returned and the admit()/reconcile() gate decides
|
|
25
|
+
* whether to halt — downshift slows the spend rate, it never overrides a breach.
|
|
26
|
+
*/
|
|
27
|
+
export function costRouter(preferred, downshift, ctx) {
|
|
28
|
+
if (!downshift || downshift.length === 0)
|
|
29
|
+
return preferred;
|
|
30
|
+
const candidates = [preferred, ...downshift].map((c) => ({
|
|
31
|
+
driver: c.driver ?? preferred.driver,
|
|
32
|
+
model: c.model ?? preferred.model,
|
|
33
|
+
}));
|
|
34
|
+
for (const cand of candidates) {
|
|
35
|
+
const q = ctx.quote(cand.driver, cand.model);
|
|
36
|
+
// undefined quote = unenforced (free / unpriced) → always affordable.
|
|
37
|
+
if (q === undefined || q <= ctx.remainingUsd)
|
|
38
|
+
return cand;
|
|
39
|
+
}
|
|
40
|
+
// None fit — fall back to the cheapest listed; the budget gate halts if even
|
|
41
|
+
// that exceeds the cap on the next admission check.
|
|
42
|
+
return candidates[candidates.length - 1] ?? preferred;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=costRouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"costRouter.js","sourceRoot":"","sources":["../../../src/recipes/pricing/costRouter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAuBH;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CACxB,SAAyB,EACzB,SAAuC,EACvC,GAAiB;IAEjB,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAE3D,MAAM,UAAU,GAAqB,CAAC,SAAS,EAAE,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACzE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM;QACpC,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK;KAClC,CAAC,CAAC,CAAC;IAEJ,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,sEAAsE;QACtE,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,IAAI,GAAG,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC;IAC5D,CAAC;IACD,6EAA6E;IAC7E,oDAAoD;IACpD,OAAO,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model price table — cost-aware routing Phase 2 (dormant data).
|
|
3
|
+
*
|
|
4
|
+
* A `(model id) → USD-per-million-tokens` table plus a loader. Nothing
|
|
5
|
+
* consumes it yet; Phase 3 wires `costUsd()` into RunBudget so `budget.usdMax`
|
|
6
|
+
* can be enforced for *measured* (API) drivers. Lands separately so the price
|
|
7
|
+
* data can be reviewed for accuracy on its own.
|
|
8
|
+
*
|
|
9
|
+
* Design notes (docs/design/cost-aware-routing.md):
|
|
10
|
+
* - Prices are DATA, not code, and OVERRIDABLE without a release:
|
|
11
|
+
* precedence env `PATCHWORK_PRICE_TABLE` (path) >
|
|
12
|
+
* `~/.patchwork/prices.json` >
|
|
13
|
+
* the built-in table below.
|
|
14
|
+
* - FAIL-OPEN everywhere: an unknown model, a malformed override, or a
|
|
15
|
+
* missing file never throws — `costUsd` just returns `undefined` (and the
|
|
16
|
+
* budget layer treats that as "unpriceable → don't enforce").
|
|
17
|
+
* - The built-in default lives here as a TS const (compiled into dist, so it
|
|
18
|
+
* is always available at runtime); overrides are JSON read from disk.
|
|
19
|
+
* - NO runtime network calls. Prices drift; refresh the const below and bump
|
|
20
|
+
* `_generatedAt`. `isPriceTableStale()` is provided for a scheduled check.
|
|
21
|
+
*/
|
|
22
|
+
/** USD per 1,000,000 tokens, split by input vs output. */
|
|
23
|
+
export interface ModelPrice {
|
|
24
|
+
input: number;
|
|
25
|
+
output: number;
|
|
26
|
+
}
|
|
27
|
+
export interface PriceTableMeta {
|
|
28
|
+
/** ISO date (YYYY-MM-DD) the built-in prices were last reviewed. */
|
|
29
|
+
_generatedAt: string;
|
|
30
|
+
_unit: "usd_per_million_tokens";
|
|
31
|
+
_source: string;
|
|
32
|
+
_note: string;
|
|
33
|
+
/** Set by the loader when an override file was merged in. */
|
|
34
|
+
_override?: string;
|
|
35
|
+
}
|
|
36
|
+
export interface PriceTable {
|
|
37
|
+
_meta: PriceTableMeta;
|
|
38
|
+
/** Keyed by exact model id (e.g. "gpt-4o", "claude-haiku-4-5-20251001"). */
|
|
39
|
+
prices: Record<string, ModelPrice>;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Built-in default prices. **Approximate public list prices** (USD / 1M tokens)
|
|
43
|
+
* as of `_generatedAt` — VERIFY before relying on a USD cap; they drift, and a
|
|
44
|
+
* subscription/CLI driver's spend is notional, not real money out. Override via
|
|
45
|
+
* `~/.patchwork/prices.json` or `PATCHWORK_PRICE_TABLE`.
|
|
46
|
+
*/
|
|
47
|
+
export declare const BUILTIN_PRICE_TABLE: PriceTable;
|
|
48
|
+
/**
|
|
49
|
+
* Load the effective price table: the built-in default with any override file
|
|
50
|
+
* merged over its `prices`. Fail-open — an unreadable / malformed override is
|
|
51
|
+
* ignored and the built-in is returned unchanged.
|
|
52
|
+
*
|
|
53
|
+
* Override file shape: `{ "prices": { "<model>": { "input": N, "output": N } } }`
|
|
54
|
+
* (a bare `{ "<model>": { ... } }` map is also accepted for convenience).
|
|
55
|
+
*/
|
|
56
|
+
export declare function loadPriceTable(opts?: {
|
|
57
|
+
env?: NodeJS.ProcessEnv;
|
|
58
|
+
homeDir?: string;
|
|
59
|
+
}): PriceTable;
|
|
60
|
+
/** Price for one model, or undefined if the table does not list it. */
|
|
61
|
+
export declare function priceFor(model: string, table?: PriceTable): ModelPrice | undefined;
|
|
62
|
+
/**
|
|
63
|
+
* USD cost of a call given its token usage, or `undefined` when the model is
|
|
64
|
+
* not priced (fail-open: the budget layer then declines to enforce on it).
|
|
65
|
+
*/
|
|
66
|
+
export declare function costUsd(model: string, usage: {
|
|
67
|
+
inputTokens: number;
|
|
68
|
+
outputTokens: number;
|
|
69
|
+
}, table?: PriceTable): number | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* True when the table's `_generatedAt` is unparseable, in the future, or older
|
|
72
|
+
* than `maxAgeDays` (default 548 ≈ 18 months). Pure — caller supplies `now` —
|
|
73
|
+
* so a scheduled job can fail loudly without baking a wall-clock time-bomb into
|
|
74
|
+
* every PR's test run.
|
|
75
|
+
*/
|
|
76
|
+
export declare function isPriceTableStale(generatedAt: string, now: number, maxAgeDays?: number): boolean;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Model price table — cost-aware routing Phase 2 (dormant data).
|
|
3
|
+
*
|
|
4
|
+
* A `(model id) → USD-per-million-tokens` table plus a loader. Nothing
|
|
5
|
+
* consumes it yet; Phase 3 wires `costUsd()` into RunBudget so `budget.usdMax`
|
|
6
|
+
* can be enforced for *measured* (API) drivers. Lands separately so the price
|
|
7
|
+
* data can be reviewed for accuracy on its own.
|
|
8
|
+
*
|
|
9
|
+
* Design notes (docs/design/cost-aware-routing.md):
|
|
10
|
+
* - Prices are DATA, not code, and OVERRIDABLE without a release:
|
|
11
|
+
* precedence env `PATCHWORK_PRICE_TABLE` (path) >
|
|
12
|
+
* `~/.patchwork/prices.json` >
|
|
13
|
+
* the built-in table below.
|
|
14
|
+
* - FAIL-OPEN everywhere: an unknown model, a malformed override, or a
|
|
15
|
+
* missing file never throws — `costUsd` just returns `undefined` (and the
|
|
16
|
+
* budget layer treats that as "unpriceable → don't enforce").
|
|
17
|
+
* - The built-in default lives here as a TS const (compiled into dist, so it
|
|
18
|
+
* is always available at runtime); overrides are JSON read from disk.
|
|
19
|
+
* - NO runtime network calls. Prices drift; refresh the const below and bump
|
|
20
|
+
* `_generatedAt`. `isPriceTableStale()` is provided for a scheduled check.
|
|
21
|
+
*/
|
|
22
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
23
|
+
import { homedir } from "node:os";
|
|
24
|
+
import { join } from "node:path";
|
|
25
|
+
/**
|
|
26
|
+
* Built-in default prices. **Approximate public list prices** (USD / 1M tokens)
|
|
27
|
+
* as of `_generatedAt` — VERIFY before relying on a USD cap; they drift, and a
|
|
28
|
+
* subscription/CLI driver's spend is notional, not real money out. Override via
|
|
29
|
+
* `~/.patchwork/prices.json` or `PATCHWORK_PRICE_TABLE`.
|
|
30
|
+
*/
|
|
31
|
+
export const BUILTIN_PRICE_TABLE = {
|
|
32
|
+
_meta: {
|
|
33
|
+
_generatedAt: "2026-06-03",
|
|
34
|
+
_unit: "usd_per_million_tokens",
|
|
35
|
+
_source: "provider public list prices",
|
|
36
|
+
_note: "Approximate list prices (USD per 1M tokens). Review before relying on budget.usdMax; override via ~/.patchwork/prices.json or PATCHWORK_PRICE_TABLE.",
|
|
37
|
+
},
|
|
38
|
+
prices: {
|
|
39
|
+
// Anthropic (Claude 4.x)
|
|
40
|
+
"claude-opus-4-8": { input: 15, output: 75 },
|
|
41
|
+
"claude-sonnet-4-6": { input: 3, output: 15 },
|
|
42
|
+
"claude-haiku-4-5-20251001": { input: 1, output: 5 },
|
|
43
|
+
// OpenAI
|
|
44
|
+
"gpt-4o": { input: 2.5, output: 10 },
|
|
45
|
+
"gpt-4o-mini": { input: 0.15, output: 0.6 },
|
|
46
|
+
// xAI (Grok)
|
|
47
|
+
"grok-2-latest": { input: 2, output: 10 },
|
|
48
|
+
// Google (Gemini, API-keyed)
|
|
49
|
+
"gemini-2.5-pro": { input: 1.25, output: 10 },
|
|
50
|
+
"gemini-2.5-flash": { input: 0.3, output: 2.5 },
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
const MS_PER_DAY = 86_400_000;
|
|
54
|
+
/** Resolve the override file path per the precedence rule (or undefined). */
|
|
55
|
+
function resolveOverridePath(env, homeDir) {
|
|
56
|
+
const envPath = env.PATCHWORK_PRICE_TABLE;
|
|
57
|
+
if (typeof envPath === "string" && envPath.trim())
|
|
58
|
+
return envPath.trim();
|
|
59
|
+
const filePath = join(homeDir, ".patchwork", "prices.json");
|
|
60
|
+
return existsSync(filePath) ? filePath : undefined;
|
|
61
|
+
}
|
|
62
|
+
/** Extract a valid `{input, output}` price from an unknown override entry. */
|
|
63
|
+
function coercePrice(value) {
|
|
64
|
+
if (!value || typeof value !== "object")
|
|
65
|
+
return undefined;
|
|
66
|
+
const v = value;
|
|
67
|
+
if (typeof v.input === "number" && typeof v.output === "number") {
|
|
68
|
+
return { input: v.input, output: v.output };
|
|
69
|
+
}
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Load the effective price table: the built-in default with any override file
|
|
74
|
+
* merged over its `prices`. Fail-open — an unreadable / malformed override is
|
|
75
|
+
* ignored and the built-in is returned unchanged.
|
|
76
|
+
*
|
|
77
|
+
* Override file shape: `{ "prices": { "<model>": { "input": N, "output": N } } }`
|
|
78
|
+
* (a bare `{ "<model>": { ... } }` map is also accepted for convenience).
|
|
79
|
+
*/
|
|
80
|
+
export function loadPriceTable(opts = {}) {
|
|
81
|
+
const env = opts.env ?? process.env;
|
|
82
|
+
const homeDir = opts.homeDir ?? homedir();
|
|
83
|
+
const overridePath = resolveOverridePath(env, homeDir);
|
|
84
|
+
if (!overridePath)
|
|
85
|
+
return BUILTIN_PRICE_TABLE;
|
|
86
|
+
try {
|
|
87
|
+
const parsed = JSON.parse(readFileSync(overridePath, "utf8"));
|
|
88
|
+
const root = (parsed ?? {});
|
|
89
|
+
const rawPrices = root.prices && typeof root.prices === "object" ? root.prices : root;
|
|
90
|
+
// Null-prototype base so a user override keyed "__proto__" creates an own
|
|
91
|
+
// property instead of mutating the prototype (bracket-assign pollution).
|
|
92
|
+
const merged = Object.create(null);
|
|
93
|
+
Object.assign(merged, BUILTIN_PRICE_TABLE.prices);
|
|
94
|
+
for (const [model, entry] of Object.entries(rawPrices)) {
|
|
95
|
+
const price = coercePrice(entry);
|
|
96
|
+
if (price)
|
|
97
|
+
merged[model] = price;
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
_meta: { ...BUILTIN_PRICE_TABLE._meta, _override: overridePath },
|
|
101
|
+
prices: merged,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
// Malformed / unreadable override → fail open to the built-in table.
|
|
106
|
+
return BUILTIN_PRICE_TABLE;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/** Price for one model, or undefined if the table does not list it. */
|
|
110
|
+
export function priceFor(model, table = loadPriceTable()) {
|
|
111
|
+
// Own-property lookup only. A user-controlled model id that collides with an
|
|
112
|
+
// Object.prototype key ("__proto__", "constructor", "valueOf", "toString", …)
|
|
113
|
+
// must resolve to undefined (unpriced → fail open), NOT to an inherited
|
|
114
|
+
// prototype member — otherwise costUsd would compute on a function and return
|
|
115
|
+
// NaN, silently poisoning the USD budget (a prototype-walk bug class this
|
|
116
|
+
// codebase has been bitten by before — use Object.hasOwn, never `in`/bracket).
|
|
117
|
+
return Object.hasOwn(table.prices, model) ? table.prices[model] : undefined;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* USD cost of a call given its token usage, or `undefined` when the model is
|
|
121
|
+
* not priced (fail-open: the budget layer then declines to enforce on it).
|
|
122
|
+
*/
|
|
123
|
+
export function costUsd(model, usage, table = loadPriceTable()) {
|
|
124
|
+
const price = priceFor(model, table);
|
|
125
|
+
if (!price)
|
|
126
|
+
return undefined;
|
|
127
|
+
return ((usage.inputTokens / 1_000_000) * price.input +
|
|
128
|
+
(usage.outputTokens / 1_000_000) * price.output);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* True when the table's `_generatedAt` is unparseable, in the future, or older
|
|
132
|
+
* than `maxAgeDays` (default 548 ≈ 18 months). Pure — caller supplies `now` —
|
|
133
|
+
* so a scheduled job can fail loudly without baking a wall-clock time-bomb into
|
|
134
|
+
* every PR's test run.
|
|
135
|
+
*/
|
|
136
|
+
export function isPriceTableStale(generatedAt, now, maxAgeDays = 548) {
|
|
137
|
+
const t = Date.parse(generatedAt);
|
|
138
|
+
if (Number.isNaN(t))
|
|
139
|
+
return true;
|
|
140
|
+
if (t > now)
|
|
141
|
+
return true;
|
|
142
|
+
return now - t > maxAgeDays * MS_PER_DAY;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=priceTable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"priceTable.js","sourceRoot":"","sources":["../../../src/recipes/pricing/priceTable.ts"],"names":[],"mappings":"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"}
|