@openclaw/lobster 2026.9.5 → 2026.9.7

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 (163) hide show
  1. package/assets/icon.png +0 -0
  2. package/dist/index.js +8 -294
  3. package/node_modules/@clawdbot/lobster/README.md +20 -133
  4. package/node_modules/@clawdbot/lobster/VISION.md +15 -238
  5. package/node_modules/@clawdbot/lobster/bin/clawd.invoke.js +2 -21
  6. package/node_modules/@clawdbot/lobster/bin/invoke.js +19 -0
  7. package/node_modules/@clawdbot/lobster/bin/lobster.js +2 -21
  8. package/node_modules/@clawdbot/lobster/bin/openclaw.invoke.js +2 -24
  9. package/node_modules/@clawdbot/lobster/dist/src/cli.js +32 -48
  10. package/node_modules/@clawdbot/lobster/dist/src/cli.js.map +1 -1
  11. package/node_modules/@clawdbot/lobster/dist/src/command_tokens.js +81 -0
  12. package/node_modules/@clawdbot/lobster/dist/src/command_tokens.js.map +1 -0
  13. package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/dedupe.js +1 -12
  14. package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/dedupe.js.map +1 -1
  15. package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/group_by.js +2 -14
  16. package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/group_by.js.map +1 -1
  17. package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/llm_invoke.js +1 -337
  18. package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/llm_invoke.js.map +1 -1
  19. package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/map.js +2 -13
  20. package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/map.js.map +1 -1
  21. package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/sort.js +4 -21
  22. package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/sort.js.map +1 -1
  23. package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/state.js +1 -1
  24. package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/state.js.map +1 -1
  25. package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/template.js +2 -13
  26. package/node_modules/@clawdbot/lobster/dist/src/commands/stdlib/template.js.map +1 -1
  27. package/node_modules/@clawdbot/lobster/dist/src/commands/workflows/workflows_run.js +0 -18
  28. package/node_modules/@clawdbot/lobster/dist/src/commands/workflows/workflows_run.js.map +1 -1
  29. package/node_modules/@clawdbot/lobster/dist/src/core/llm_accounting.js +304 -0
  30. package/node_modules/@clawdbot/lobster/dist/src/core/llm_accounting.js.map +1 -0
  31. package/node_modules/@clawdbot/lobster/dist/src/core/value_path.js +11 -0
  32. package/node_modules/@clawdbot/lobster/dist/src/core/value_path.js.map +1 -0
  33. package/node_modules/@clawdbot/lobster/dist/src/parser.js +2 -67
  34. package/node_modules/@clawdbot/lobster/dist/src/parser.js.map +1 -1
  35. package/node_modules/@clawdbot/lobster/dist/src/recipes/github/index.js +1 -1
  36. package/node_modules/@clawdbot/lobster/dist/src/recipes/github/pr-monitor.js +5 -64
  37. package/node_modules/@clawdbot/lobster/dist/src/recipes/github/pr-monitor.js.map +1 -1
  38. package/node_modules/@clawdbot/lobster/dist/src/recipes/github/read_pr.js +45 -0
  39. package/node_modules/@clawdbot/lobster/dist/src/recipes/github/read_pr.js.map +1 -0
  40. package/node_modules/@clawdbot/lobster/dist/src/recipes/github/snapshot.js +45 -0
  41. package/node_modules/@clawdbot/lobster/dist/src/recipes/github/snapshot.js.map +1 -0
  42. package/node_modules/@clawdbot/lobster/dist/src/recipes/github/stages/pr-view.js +9 -47
  43. package/node_modules/@clawdbot/lobster/dist/src/recipes/github/stages/pr-view.js.map +1 -1
  44. package/node_modules/@clawdbot/lobster/dist/src/sdk/Lobster.js +18 -135
  45. package/node_modules/@clawdbot/lobster/dist/src/sdk/Lobster.js.map +1 -1
  46. package/node_modules/@clawdbot/lobster/dist/src/sdk/index.js +1 -1
  47. package/node_modules/@clawdbot/lobster/dist/src/sdk/primitives/approve.js +1 -2
  48. package/node_modules/@clawdbot/lobster/dist/src/sdk/primitives/approve.js.map +1 -1
  49. package/node_modules/@clawdbot/lobster/dist/src/sdk/primitives/diff.js +2 -8
  50. package/node_modules/@clawdbot/lobster/dist/src/sdk/primitives/diff.js.map +1 -1
  51. package/node_modules/@clawdbot/lobster/dist/src/sdk/primitives/exec.js +15 -81
  52. package/node_modules/@clawdbot/lobster/dist/src/sdk/primitives/exec.js.map +1 -1
  53. package/node_modules/@clawdbot/lobster/dist/src/sdk/primitives/state.js +3 -9
  54. package/node_modules/@clawdbot/lobster/dist/src/sdk/primitives/state.js.map +1 -1
  55. package/node_modules/@clawdbot/lobster/dist/src/sdk/runtime.js +0 -12
  56. package/node_modules/@clawdbot/lobster/dist/src/sdk/runtime.js.map +1 -1
  57. package/node_modules/@clawdbot/lobster/dist/src/sdk/state_env.js +6 -0
  58. package/node_modules/@clawdbot/lobster/dist/src/sdk/state_env.js.map +1 -0
  59. package/node_modules/@clawdbot/lobster/dist/src/state/atomic_file.js +192 -0
  60. package/node_modules/@clawdbot/lobster/dist/src/state/atomic_file.js.map +1 -0
  61. package/node_modules/@clawdbot/lobster/dist/src/state/store.js +2 -188
  62. package/node_modules/@clawdbot/lobster/dist/src/state/store.js.map +1 -1
  63. package/node_modules/@clawdbot/lobster/dist/src/workflows/dry_run.js +262 -0
  64. package/node_modules/@clawdbot/lobster/dist/src/workflows/dry_run.js.map +1 -0
  65. package/node_modules/@clawdbot/lobster/dist/src/workflows/expressions.js +345 -0
  66. package/node_modules/@clawdbot/lobster/dist/src/workflows/expressions.js.map +1 -0
  67. package/node_modules/@clawdbot/lobster/dist/src/workflows/file.js +21 -1036
  68. package/node_modules/@clawdbot/lobster/dist/src/workflows/file.js.map +1 -1
  69. package/node_modules/@clawdbot/lobster/dist/src/workflows/github_pr_monitor.js +8 -77
  70. package/node_modules/@clawdbot/lobster/dist/src/workflows/github_pr_monitor.js.map +1 -1
  71. package/node_modules/@clawdbot/lobster/dist/src/workflows/graph.js +1 -7
  72. package/node_modules/@clawdbot/lobster/dist/src/workflows/graph.js.map +1 -1
  73. package/node_modules/@clawdbot/lobster/dist/src/workflows/load.js +347 -0
  74. package/node_modules/@clawdbot/lobster/dist/src/workflows/load.js.map +1 -0
  75. package/node_modules/@clawdbot/lobster/dist/src/workflows/types.js +2 -0
  76. package/node_modules/@clawdbot/lobster/dist/src/workflows/types.js.map +1 -0
  77. package/node_modules/@clawdbot/lobster/dist/src/workflows/values.js +93 -0
  78. package/node_modules/@clawdbot/lobster/dist/src/workflows/values.js.map +1 -0
  79. package/node_modules/@clawdbot/lobster/dist/test/cancellation.test.js +1 -0
  80. package/node_modules/@clawdbot/lobster/dist/test/cancellation.test.js.map +1 -1
  81. package/node_modules/@clawdbot/lobster/dist/test/cli_run_errors.test.js +53 -0
  82. package/node_modules/@clawdbot/lobster/dist/test/cli_run_errors.test.js.map +1 -0
  83. package/node_modules/@clawdbot/lobster/dist/test/command_arguments.test.js +82 -0
  84. package/node_modules/@clawdbot/lobster/dist/test/command_arguments.test.js.map +1 -0
  85. package/node_modules/@clawdbot/lobster/dist/test/cost_tracker.test.js +49 -19
  86. package/node_modules/@clawdbot/lobster/dist/test/cost_tracker.test.js.map +1 -1
  87. package/node_modules/@clawdbot/lobster/dist/test/helpers/node_shell_fixture.js +17 -0
  88. package/node_modules/@clawdbot/lobster/dist/test/helpers/node_shell_fixture.js.map +1 -0
  89. package/node_modules/@clawdbot/lobster/dist/test/llm_invoke.test.js +2 -0
  90. package/node_modules/@clawdbot/lobster/dist/test/llm_invoke.test.js.map +1 -1
  91. package/node_modules/@clawdbot/lobster/dist/test/pipeline_resume_state.test.js +65 -0
  92. package/node_modules/@clawdbot/lobster/dist/test/pipeline_resume_state.test.js.map +1 -0
  93. package/node_modules/@clawdbot/lobster/dist/test/process_output_limit.test.js +5 -3
  94. package/node_modules/@clawdbot/lobster/dist/test/process_output_limit.test.js.map +1 -1
  95. package/node_modules/@clawdbot/lobster/dist/test/sdk_exec.test.js +72 -25
  96. package/node_modules/@clawdbot/lobster/dist/test/sdk_exec.test.js.map +1 -1
  97. package/node_modules/@clawdbot/lobster/dist/test/workflow_graph.test.js +1 -1
  98. package/node_modules/@clawdbot/lobster/dist/test/workflow_graph.test.js.map +1 -1
  99. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/README.md +1 -0
  100. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/SECURITY.md +62 -13
  101. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/index.js +40 -9
  102. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/lib/schemes.js +76 -16
  103. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/lib/utils.js +54 -10
  104. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/package.json +1 -1
  105. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/fixtures/uri-js-parse.json +1 -0
  106. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/ipv6-validation.test.js +130 -0
  107. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/mailto-authority-security.test.js +125 -0
  108. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/mailto-field-name-security.test.js +151 -0
  109. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/test/security-normalization.test.js +38 -0
  110. package/node_modules/@clawdbot/lobster/node_modules/fast-uri/types/index.d.ts +16 -0
  111. package/node_modules/@clawdbot/lobster/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +19 -18
  112. package/node_modules/@clawdbot/lobster/node_modules/yaml/browser/dist/nodes/Alias.js +25 -23
  113. package/node_modules/@clawdbot/lobster/node_modules/yaml/dist/compose/resolve-flow-scalar.js +19 -18
  114. package/node_modules/@clawdbot/lobster/node_modules/yaml/dist/nodes/Alias.js +25 -23
  115. package/node_modules/@clawdbot/lobster/node_modules/yaml/package.json +1 -1
  116. package/node_modules/@clawdbot/lobster/package.json +6 -8
  117. package/node_modules/typebox/build/compile/code.mjs +1 -2
  118. package/node_modules/typebox/build/compile/validator.mjs +5 -1
  119. package/node_modules/typebox/build/format/iri.mjs +16 -9
  120. package/node_modules/typebox/build/guard/emit.mjs +2 -2
  121. package/node_modules/typebox/build/guard/guard.d.mts +7 -5
  122. package/node_modules/typebox/build/guard/guard.mjs +14 -9
  123. package/node_modules/typebox/build/guard/index.mjs +6 -0
  124. package/node_modules/typebox/build/guard/unicode/unicode.d.mts +6 -0
  125. package/node_modules/typebox/build/guard/unicode/unicode.mjs +35 -0
  126. package/node_modules/typebox/build/guard/{string.mjs → unicode/unicode_segment.mjs} +16 -19
  127. package/node_modules/typebox/build/schema/build.mjs +2 -3
  128. package/node_modules/typebox/build/schema/engine/_pathing.d.mts +1 -0
  129. package/node_modules/typebox/build/schema/engine/_pathing.mjs +11 -0
  130. package/node_modules/typebox/build/schema/engine/_refine.mjs +13 -5
  131. package/node_modules/typebox/build/schema/engine/additionalProperties.mjs +2 -1
  132. package/node_modules/typebox/build/schema/engine/dependencies.mjs +2 -1
  133. package/node_modules/typebox/build/schema/engine/dependentSchemas.mjs +2 -1
  134. package/node_modules/typebox/build/schema/engine/dynamicRef.d.mts +1 -1
  135. package/node_modules/typebox/build/schema/engine/dynamicRef.mjs +2 -2
  136. package/node_modules/typebox/build/schema/engine/format.mjs +9 -2
  137. package/node_modules/typebox/build/schema/engine/patternProperties.mjs +3 -2
  138. package/node_modules/typebox/build/schema/engine/properties.mjs +3 -2
  139. package/node_modules/typebox/build/schema/engine/propertyNames.mjs +2 -1
  140. package/node_modules/typebox/build/schema/engine/recursiveRef.d.mts +1 -1
  141. package/node_modules/typebox/build/schema/engine/recursiveRef.mjs +2 -2
  142. package/node_modules/typebox/build/schema/engine/ref.d.mts +1 -1
  143. package/node_modules/typebox/build/schema/engine/ref.mjs +2 -2
  144. package/node_modules/typebox/build/schema/engine/schema.mjs +24 -24
  145. package/node_modules/typebox/build/schema/parse.mjs +3 -0
  146. package/node_modules/typebox/build/schema/pointer/pointer.d.mts +1 -6
  147. package/node_modules/typebox/build/schema/pointer/pointer.mjs +47 -64
  148. package/node_modules/typebox/build/system/settings/internal.d.mts +2 -0
  149. package/node_modules/typebox/build/system/settings/internal.mjs +20 -0
  150. package/node_modules/typebox/build/system/settings/settings.d.mts +11 -0
  151. package/node_modules/typebox/build/system/settings/settings.mjs +14 -0
  152. package/node_modules/typebox/build/type/extends/inference.d.mts +1 -1
  153. package/node_modules/typebox/build/type/extends/inference.mjs +15 -2
  154. package/node_modules/typebox/build/type/extends/tuple.d.mts +2 -1
  155. package/node_modules/typebox/build/type/extends/tuple.mjs +21 -1
  156. package/node_modules/typebox/build/value/parse/parse.mjs +10 -4
  157. package/node_modules/typebox/package.json +1 -1
  158. package/node_modules/typebox/readme.md +3 -1
  159. package/package.json +6 -6
  160. package/dist/runtime-api.js +0 -3
  161. package/node_modules/@clawdbot/lobster/dist/src/sdk/token.js +0 -9
  162. package/node_modules/@clawdbot/lobster/dist/src/sdk/token.js.map +0 -1
  163. /package/node_modules/typebox/build/guard/{string.d.mts → unicode/unicode_segment.d.mts} +0 -0
@@ -0,0 +1,304 @@
1
+ import { billableTokens } from "./cost_tracker.js";
2
+ // Only in-process objects carry this symbol. JSON fields cannot grant a replay exemption.
3
+ const LLM_PROVENANCE = Symbol("lobster.llm.provenance");
4
+ // Object spreads share this private identity; WeakSet tracking also works for frozen items.
5
+ const replayedCalls = new WeakSet();
6
+ /**
7
+ * Stamps provenance on a value this module is emitting. The property is enumerable so a
8
+ * downstream `{ ...value }` keeps it, and `JSON.stringify` ignores symbol keys, so serialized
9
+ * output — including what is written to the cache — is unchanged.
10
+ */
11
+ function markProvenance(value, provenance) {
12
+ return Object.defineProperty(value, LLM_PROVENANCE, {
13
+ value: provenance,
14
+ enumerable: true,
15
+ configurable: true,
16
+ });
17
+ }
18
+ /** Mark both the item and usage so projections such as `pick model,usage` preserve provenance. */
19
+ export function markLlmItem(item, provenance) {
20
+ if (item.usage && typeof item.usage === "object") {
21
+ markProvenance(item.usage, provenance);
22
+ }
23
+ return markProvenance(item, provenance);
24
+ }
25
+ /** Public cache keys and `replayed` fields are not trusted as billing provenance. */
26
+ export function llmProvenanceOf(value) {
27
+ if (!value || typeof value !== "object")
28
+ return null;
29
+ const provenance = value[LLM_PROVENANCE];
30
+ if (!provenance || typeof provenance !== "object")
31
+ return null;
32
+ const { cacheKey, replayed } = provenance;
33
+ if (typeof cacheKey !== "string" || typeof replayed !== "boolean")
34
+ return null;
35
+ return { cacheKey, replayed: replayed || replayedCalls.has(provenance) };
36
+ }
37
+ /** A billed live result becomes a replay wherever that same call identity is re-emitted. */
38
+ export function markLlmProvenanceReplayed(value) {
39
+ if (!llmProvenanceOf(value))
40
+ return;
41
+ replayedCalls.add(value[LLM_PROVENANCE]);
42
+ }
43
+ /** Carry provenance only across a JSON round trip whose source is still held in-process. */
44
+ export function carryLlmProvenance(source, target) {
45
+ if (!source || typeof source !== "object" || !target || typeof target !== "object")
46
+ return;
47
+ const provenance = llmProvenanceOf(source);
48
+ if (provenance)
49
+ markProvenance(target, { cacheKey: provenance.cacheKey, replayed: true });
50
+ if (Array.isArray(source) || Array.isArray(target)) {
51
+ if (!Array.isArray(source) || !Array.isArray(target))
52
+ return;
53
+ for (let index = 0; index < Math.min(source.length, target.length); index++) {
54
+ carryLlmProvenance(source[index], target[index]);
55
+ }
56
+ return;
57
+ }
58
+ for (const key of Object.keys(source)) {
59
+ carryLlmProvenance(source[key], target[key]);
60
+ }
61
+ }
62
+ /**
63
+ * Restores private replay provenance on completed step results loaded from Lobster's own
64
+ * workflow-resume state. Resume state is the narrow trusted boundary: ordinary command JSON
65
+ * never reaches this helper, so copying a public cache key cannot suppress its usage record.
66
+ */
67
+ export function restoreLlmProvenance(target, charges) {
68
+ if (!target || typeof target !== "object" || !Array.isArray(charges))
69
+ return;
70
+ const settled = charges.filter((charge) => charge &&
71
+ typeof charge === "object" &&
72
+ typeof charge.cacheKey === "string" &&
73
+ charge.cacheKey &&
74
+ charge.usage &&
75
+ typeof charge.usage === "object");
76
+ if (!settled.length)
77
+ return;
78
+ const visit = (value) => {
79
+ if (!value || typeof value !== "object")
80
+ return;
81
+ if (Array.isArray(value)) {
82
+ for (const item of value)
83
+ visit(item);
84
+ return;
85
+ }
86
+ const record = value;
87
+ const cacheKey = typeof record.cacheKey === "string" ? record.cacheKey : null;
88
+ const model = typeof record.model === "string" ? record.model : null;
89
+ const usage = record.usage;
90
+ if (cacheKey && usage && typeof usage === "object") {
91
+ const matches = settled.some((charge) => charge.cacheKey === cacheKey &&
92
+ (charge.model ?? null) === model &&
93
+ sameBillableUsage(charge.usage, usage));
94
+ if (matches) {
95
+ const provenance = { cacheKey, replayed: true };
96
+ markProvenance(usage, provenance);
97
+ markProvenance(record, provenance);
98
+ }
99
+ }
100
+ for (const child of Object.values(record))
101
+ visit(child);
102
+ };
103
+ visit(target);
104
+ }
105
+ // A call nothing ever bills — a step that failed outright — leaves its key behind, so the
106
+ // oldest are dropped to keep a long run's ledger bounded.
107
+ const MAX_UNBILLED_LIVE_INVOCATIONS = 256;
108
+ /** Each run settles its own charges once; composed runs also record charges in their parent. */
109
+ export function createLlmSpendLedger(parent) {
110
+ // Outstanding charges per cache key, held one entry per call rather than as a count: two
111
+ // identical calls that race on a cold cache are two provider charges under one key, the
112
+ // replays that later stand in for them have to be able to settle both, and each carries the
113
+ // cost of the call that opened it.
114
+ const unbilled = new Map();
115
+ // Charges this run has already accounted for. A copy of an item that lost its mark can turn
116
+ // up in any later step, and the only way to tell it from a call nobody has billed yet is to
117
+ // remember what has been billed. Bounded like the open charges, oldest key first.
118
+ const billed = new Map();
119
+ function settle(cacheKey, charge) {
120
+ const seen = billed.get(cacheKey) ?? [];
121
+ seen.push(charge ?? {});
122
+ billed.set(cacheKey, seen);
123
+ for (const oldest of billed.keys()) {
124
+ if (billed.size <= MAX_UNBILLED_LIVE_INVOCATIONS)
125
+ break;
126
+ billed.delete(oldest);
127
+ }
128
+ }
129
+ return {
130
+ record(cacheKey, charge) {
131
+ if (!cacheKey)
132
+ return;
133
+ parent?.record(cacheKey, charge);
134
+ const open = unbilled.get(cacheKey) ?? [];
135
+ open.push({ ...charge });
136
+ unbilled.set(cacheKey, open);
137
+ for (const oldest of unbilled.keys()) {
138
+ if (unbilled.size <= MAX_UNBILLED_LIVE_INVOCATIONS)
139
+ break;
140
+ unbilled.delete(oldest);
141
+ }
142
+ },
143
+ /**
144
+ * Settles one outstanding charge and hands back what that call cost, or null for the
145
+ * caller that must not bill anything. A live item and every replay of it draw on the same
146
+ * charges, so a provider call is billed exactly once however many steps re-emit its
147
+ * answer — and N calls under one key can be billed N times, never fewer.
148
+ *
149
+ * The cost comes back because a replay is not a reliable witness of it: identical calls
150
+ * that raced on a cold cache each paid their own way, and every replay of them carries
151
+ * whichever single answer was stored.
152
+ */
153
+ claim(cacheKey, cost) {
154
+ const open = unbilled.get(cacheKey);
155
+ if (!open?.length)
156
+ return null;
157
+ // A caller that knows what its own call cost settles that call's charge. A step
158
+ // retried after an attempt that failed *after* paying has more than one charge under
159
+ // the key, and they did not cost the same: settling the wrong one leaves the other to
160
+ // be billed at this call's price instead of its own.
161
+ const own = cost
162
+ ? open.findIndex((charge) => (charge.model ?? null) === (cost.model ?? null) &&
163
+ sameBillableUsage(charge.usage, cost.usage))
164
+ : -1;
165
+ // Otherwise: a charge that records no cost settles nothing anyone can bill, so it
166
+ // must not be the one handed to a caller with a real call to account for. Charges
167
+ // restored from resume state written before they carried a cost are the ones this
168
+ // can be.
169
+ const index = own >= 0
170
+ ? own
171
+ : Math.max(open.findIndex((charge) => charge.usage !== undefined), 0);
172
+ const [charge] = open.splice(index, 1);
173
+ if (!open.length)
174
+ unbilled.delete(cacheKey);
175
+ settle(cacheKey, charge);
176
+ return charge ?? {};
177
+ },
178
+ /**
179
+ * Whether an item carrying a call's numbers but not its in-process mark should be billed.
180
+ * A matching open charge is settled so the same provider call is not recorded again by
181
+ * end-of-step cleanup. Once no charge is open, however, public fields can never suppress
182
+ * usage: only the private provenance symbol can prove an item is a replay.
183
+ */
184
+ billCopy(cacheKey, model, usage) {
185
+ const isSameCall = (charge) => (charge.model ?? null) === model && sameBillableUsage(charge.usage, usage);
186
+ // A copy that still names a cache key is read against that key alone: the key is
187
+ // evidence of which call it came from, and honoring it keeps one call's copy from
188
+ // settling another call's charge. A transform can emit `{ model, usage }` and drop
189
+ // the key with the symbols, leaving the cost as the only evidence there is.
190
+ for (const key of cacheKey === null ? [...unbilled.keys()] : [cacheKey]) {
191
+ const open = unbilled.get(key);
192
+ const index = open?.findIndex(isSameCall) ?? -1;
193
+ if (!open || index < 0)
194
+ continue;
195
+ settle(key, open.splice(index, 1)[0]);
196
+ if (!open.length)
197
+ unbilled.delete(key);
198
+ return true;
199
+ }
200
+ return true;
201
+ },
202
+ outstanding() {
203
+ const charges = [];
204
+ for (const [cacheKey, open] of unbilled) {
205
+ for (const charge of open)
206
+ charges.push({ cacheKey, count: 1, ...charge });
207
+ }
208
+ return charges;
209
+ },
210
+ /**
211
+ * Reopens charges a paused run had not billed. A pipeline can suspend mid-step — at an
212
+ * `ask` gate — after its LLM call has been paid for but before the step succeeded, so
213
+ * without this the charge would exist in no run: the paused one never billed it, and the
214
+ * resumed one would exempt the replay that stands in for it.
215
+ */
216
+ restore(charges) {
217
+ if (!Array.isArray(charges))
218
+ return;
219
+ for (const charge of charges) {
220
+ if (!charge || typeof charge !== "object")
221
+ continue;
222
+ if (typeof charge.cacheKey !== "string" || !charge.cacheKey)
223
+ continue;
224
+ const count = Math.floor(Number(charge.count ?? 0));
225
+ if (!Number.isFinite(count) || count < 1)
226
+ continue;
227
+ // State written before this field existed carries no cost, and a hand-edited file
228
+ // should not be able to invent one: only a plain object of numbers is taken.
229
+ const { cacheKey, count: _count, ...cost } = charge;
230
+ const restored = sanitizeChargeCost(cost);
231
+ for (let i = 0; i < count; i++)
232
+ this.record(cacheKey, restored);
233
+ }
234
+ },
235
+ /**
236
+ * The calls this run has already billed. A run that pauses carries this the way it carries
237
+ * what it spent: the total says how much, and this says which calls it was for.
238
+ */
239
+ settled() {
240
+ const charges = [];
241
+ for (const [cacheKey, seen] of billed) {
242
+ for (const charge of seen)
243
+ charges.push({ cacheKey, count: 1, ...charge });
244
+ }
245
+ return charges;
246
+ },
247
+ /**
248
+ * Restores what a paused run had billed, so the two halves of its accounting agree after
249
+ * the pause. `cost` brings the money back; without this the run that resumes has no record
250
+ * of what the money was for, and a later step that re-emits a completed LLM output — `head`
251
+ * over `$live.json` — hands on a copy the fresh ledger has never heard of. It is billed on
252
+ * top of the restored total: one provider call, twice in `_meta.cost` and against
253
+ * `cost_limit`.
254
+ *
255
+ * A settled charge is only ever read against a cache key, so what this restores can excuse
256
+ * a copy of a named call and nothing else. It cannot touch a live call — those settle out
257
+ * of the open charges — and the spend it is reconstructing is already in the `cost` this
258
+ * same state carries.
259
+ */
260
+ restoreSettled(charges) {
261
+ if (!Array.isArray(charges))
262
+ return;
263
+ for (const charge of charges) {
264
+ if (!charge || typeof charge !== "object")
265
+ continue;
266
+ if (typeof charge.cacheKey !== "string" || !charge.cacheKey)
267
+ continue;
268
+ const count = Math.floor(Number(charge.count ?? 0));
269
+ if (!Number.isFinite(count) || count < 1)
270
+ continue;
271
+ const { cacheKey, count: _count, ...cost } = charge;
272
+ const restored = sanitizeChargeCost(cost);
273
+ for (let i = 0; i < count; i++)
274
+ settle(cacheKey, restored);
275
+ }
276
+ },
277
+ };
278
+ }
279
+ /** Compare billable token counts, ignoring provenance and unbilled response metadata. */
280
+ function sameBillableUsage(left, right) {
281
+ if (!left || typeof left !== "object" || !right || typeof right !== "object")
282
+ return false;
283
+ const billed = billableTokens(left);
284
+ const other = billableTokens(right);
285
+ return billed.inputTokens === other.inputTokens && billed.outputTokens === other.outputTokens;
286
+ }
287
+ function sanitizeChargeCost(cost) {
288
+ const usage = cost.usage;
289
+ if (!usage || typeof usage !== "object" || Array.isArray(usage))
290
+ return {};
291
+ const numbers = {};
292
+ for (const [key, value] of Object.entries(usage)) {
293
+ if (typeof value === "number" && Number.isFinite(value))
294
+ numbers[key] = value;
295
+ }
296
+ if (!Object.keys(numbers).length)
297
+ return {};
298
+ return {
299
+ ...(typeof cost.stepId === "string" ? { stepId: cost.stepId } : null),
300
+ model: typeof cost.model === "string" ? cost.model : null,
301
+ usage: numbers,
302
+ };
303
+ }
304
+ //# sourceMappingURL=llm_accounting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm_accounting.js","sourceRoot":"","sources":["../../../src/core/llm_accounting.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,0FAA0F;AAC1F,MAAM,cAAc,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC;AACxD,4FAA4F;AAC5F,MAAM,aAAa,GAAG,IAAI,OAAO,EAAU,CAAC;AAI5C;;;;GAIG;AACH,SAAS,cAAc,CAAmB,KAAQ,EAAE,UAAyB;IAC5E,OAAO,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,cAAc,EAAE;QACnD,KAAK,EAAE,UAAU;QACjB,UAAU,EAAE,IAAI;QAChB,YAAY,EAAE,IAAI;KAClB,CAAC,CAAC;AACJ,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,WAAW,CAC1B,IAAO,EACP,UAAyB;IAEzB,IAAI,IAAI,CAAC,KAAK,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAClD,cAAc,CAAC,IAAI,CAAC,KAAe,EAAE,UAAU,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AACzC,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,eAAe,CAAC,KAAc;IAC7C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACrD,MAAM,UAAU,GAAI,KAAiC,CAAC,cAAc,CAAC,CAAC;IACtE,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC/D,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,UAA2B,CAAC;IAC3D,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC/E,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,IAAI,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;AAC1E,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACvD,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;QAAE,OAAO;IACpC,aAAa,CAAC,GAAG,CAAE,KAAgC,CAAC,cAAc,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,kBAAkB,CAAC,MAAe,EAAE,MAAe;IAClE,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO;IAC3F,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,UAAU;QACb,cAAc,CAAC,MAAgB,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACrF,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACpD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO;QAC7D,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;YAC7E,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAClD,CAAC;QACD,OAAO;IACR,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACvC,kBAAkB,CAChB,MAAkC,CAAC,GAAG,CAAC,EACvC,MAAkC,CAAC,GAAG,CAAC,CACxC,CAAC;IACH,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CACnC,MAAe,EACf,OAAoD;IAEpD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QAAE,OAAO;IAC7E,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAC7B,CAAC,MAAM,EAAE,EAAE,CACV,MAAM;QACN,OAAO,MAAM,KAAK,QAAQ;QAC1B,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;QACnC,MAAM,CAAC,QAAQ;QACf,MAAM,CAAC,KAAK;QACZ,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CACjC,CAAC;IACF,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO;IAE5B,MAAM,KAAK,GAAG,CAAC,KAAc,EAAE,EAAE;QAChC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO;QAChD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACtC,OAAO;QACR,CAAC;QAED,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,MAAM,QAAQ,GAAG,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9E,MAAM,KAAK,GAAG,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACrE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,IAAI,QAAQ,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACpD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAC3B,CAAC,MAAM,EAAE,EAAE,CACV,MAAM,CAAC,QAAQ,KAAK,QAAQ;gBAC5B,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK;gBAChC,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CACvC,CAAC;YACF,IAAI,OAAO,EAAE,CAAC;gBACb,MAAM,UAAU,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;gBAChD,cAAc,CAAC,KAAe,EAAE,UAAU,CAAC,CAAC;gBAC5C,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YACpC,CAAC;QACF,CAAC;QAED,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;YAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC,CAAC;IACF,KAAK,CAAC,MAAM,CAAC,CAAC;AACf,CAAC;AA4BD,0FAA0F;AAC1F,0DAA0D;AAC1D,MAAM,6BAA6B,GAAG,GAAG,CAAC;AAE1C,gGAAgG;AAChG,MAAM,UAAU,oBAAoB,CAAC,MAA8B;IAClE,yFAAyF;IACzF,wFAAwF;IACxF,4FAA4F;IAC5F,mCAAmC;IACnC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;IACpD,4FAA4F;IAC5F,4FAA4F;IAC5F,kFAAkF;IAClF,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2B,CAAC;IAClD,SAAS,MAAM,CAAC,QAAgB,EAAE,MAAiC;QAClE,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QACxB,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC3B,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACpC,IAAI,MAAM,CAAC,IAAI,IAAI,6BAA6B;gBAAE,MAAM;YACxD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;IACF,CAAC;IACD,OAAO;QACN,MAAM,CAAC,QAAgB,EAAE,MAAsB;YAC9C,IAAI,CAAC,QAAQ;gBAAE,OAAO;YACtB,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACjC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;YACzB,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC7B,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;gBACtC,IAAI,QAAQ,CAAC,IAAI,IAAI,6BAA6B;oBAAE,MAAM;gBAC1D,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACzB,CAAC;QACF,CAAC;QACD;;;;;;;;;WASG;QACH,KAAK,CAAC,QAAgB,EAAE,IAAoB;YAC3C,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACpC,IAAI,CAAC,IAAI,EAAE,MAAM;gBAAE,OAAO,IAAI,CAAC;YAC/B,gFAAgF;YAChF,qFAAqF;YACrF,sFAAsF;YACtF,qDAAqD;YACrD,MAAM,GAAG,GAAG,IAAI;gBACf,CAAC,CAAC,IAAI,CAAC,SAAS,CACd,CAAC,MAAM,EAAE,EAAE,CACV,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;oBAC/C,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAC5C;gBACF,CAAC,CAAC,CAAC,CAAC,CAAC;YACN,kFAAkF;YAClF,kFAAkF;YAClF,kFAAkF;YAClF,UAAU;YACV,MAAM,KAAK,GACV,GAAG,IAAI,CAAC;gBACP,CAAC,CAAC,GAAG;gBACL,CAAC,CAAC,IAAI,CAAC,GAAG,CACR,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,EACtD,CAAC,CACD,CAAC;YACL,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACvC,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC5C,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACzB,OAAO,MAAM,IAAI,EAAE,CAAC;QACrB,CAAC;QACD;;;;;WAKG;QACH,QAAQ,CAAC,QAAuB,EAAE,KAAoB,EAAE,KAA8B;YACrF,MAAM,UAAU,GAAG,CAAC,MAAqB,EAAE,EAAE,CAC5C,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,iBAAiB,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YAC5E,iFAAiF;YACjF,kFAAkF;YAClF,mFAAmF;YACnF,4EAA4E;YAC5E,KAAK,MAAM,GAAG,IAAI,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzE,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC/B,MAAM,KAAK,GAAG,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;gBAChD,IAAI,CAAC,IAAI,IAAI,KAAK,GAAG,CAAC;oBAAE,SAAS;gBACjC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtC,IAAI,CAAC,IAAI,CAAC,MAAM;oBAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACvC,OAAO,IAAI,CAAC;YACb,CAAC;YACD,OAAO,IAAI,CAAC;QACb,CAAC;QACD,WAAW;YACV,MAAM,OAAO,GAA2B,EAAE,CAAC;YAC3C,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzC,KAAK,MAAM,MAAM,IAAI,IAAI;oBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;YAC5E,CAAC;YACD,OAAO,OAAO,CAAC;QAChB,CAAC;QACD;;;;;WAKG;QACH,OAAO,CAAC,OAAoD;YAC3D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;gBAAE,OAAO;YACpC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC9B,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;oBAAE,SAAS;gBACpD,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ;oBAAE,SAAS;gBACtE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;gBACpD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;oBAAE,SAAS;gBACnD,kFAAkF;gBAClF,6EAA6E;gBAC7E,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;gBACpD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;gBAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE;oBAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACjE,CAAC;QACF,CAAC;QACD;;;WAGG;QACH,OAAO;YACN,MAAM,OAAO,GAA2B,EAAE,CAAC;YAC3C,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,MAAM,EAAE,CAAC;gBACvC,KAAK,MAAM,MAAM,IAAI,IAAI;oBAAE,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;YAC5E,CAAC;YACD,OAAO,OAAO,CAAC;QAChB,CAAC;QACD;;;;;;;;;;;;WAYG;QACH,cAAc,CAAC,OAAoD;YAClE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;gBAAE,OAAO;YACpC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC9B,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;oBAAE,SAAS;gBACpD,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ;oBAAE,SAAS;gBACtE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;gBACpD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;oBAAE,SAAS;gBACnD,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;gBACpD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;gBAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE;oBAAE,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC5D,CAAC;QACF,CAAC;KACD,CAAC;AACH,CAAC;AAED,yFAAyF;AACzF,SAAS,iBAAiB,CAAC,IAAa,EAAE,KAAc;IACvD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC3F,MAAM,MAAM,GAAG,cAAc,CAAC,IAA+B,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,cAAc,CAAC,KAAgC,CAAC,CAAC;IAC/D,OAAO,MAAM,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW,IAAI,MAAM,CAAC,YAAY,KAAK,KAAK,CAAC,YAAY,CAAC;AAC/F,CAAC;AAED,SAAS,kBAAkB,CAAC,IAA6B;IACxD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACzB,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3E,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC/E,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC5C,OAAO;QACN,GAAG,CAAC,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACrE,KAAK,EAAE,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;QACzD,KAAK,EAAE,OAAO;KACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ /** Resolve command dot paths, ignoring empty segments and stopping at nullish values. */
2
+ export function getByPath(value, path) {
3
+ let current = value;
4
+ for (const field of path.split(".").filter(Boolean)) {
5
+ if (current == null)
6
+ return undefined;
7
+ current = current[field];
8
+ }
9
+ return current;
10
+ }
11
+ //# sourceMappingURL=value_path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value_path.js","sourceRoot":"","sources":["../../../src/core/value_path.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,MAAM,UAAU,SAAS,CAAC,KAAc,EAAE,IAAY;IACrD,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACrD,IAAI,OAAO,IAAI,IAAI;YAAE,OAAO,SAAS,CAAC;QACtC,OAAO,GAAI,OAAmC,CAAC,KAAK,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC"}
@@ -1,6 +1,4 @@
1
- function isWhitespace(ch) {
2
- return ch === " " || ch === "\t" || ch === "\n" || ch === "\r";
3
- }
1
+ import { tokenizeCommand } from "./command_tokens.js";
4
2
  function splitPipes(input) {
5
3
  const parts = [];
6
4
  let current = "";
@@ -40,69 +38,6 @@ function splitPipes(input) {
40
38
  parts.push(current.trim());
41
39
  return parts;
42
40
  }
43
- function tokenizeCommand(input) {
44
- const tokens = [];
45
- let current = "";
46
- let quote = null;
47
- const push = () => {
48
- if (current.length > 0)
49
- tokens.push(current);
50
- current = "";
51
- };
52
- for (let i = 0; i < input.length; i++) {
53
- const ch = input[i];
54
- if (quote) {
55
- if (quote === "'") {
56
- if (ch === "\\" && input[i + 1] === quote) {
57
- current += quote;
58
- i++;
59
- continue;
60
- }
61
- if (ch === quote) {
62
- quote = null;
63
- continue;
64
- }
65
- current += ch;
66
- continue;
67
- }
68
- // Double-quoted mode: preserve unknown escapes (\n, \t, etc) while
69
- // unescaping only shell-like quote/backslash escapes.
70
- if (ch === "\\") {
71
- const next = input[i + 1];
72
- if (next === '"' || next === "\\" || next === "$" || next === "`") {
73
- current += next;
74
- i++;
75
- continue;
76
- }
77
- if (next === "\n") {
78
- i++;
79
- continue;
80
- }
81
- current += ch;
82
- continue;
83
- }
84
- if (ch === quote) {
85
- quote = null;
86
- continue;
87
- }
88
- current += ch;
89
- continue;
90
- }
91
- if (ch === '"' || ch === "'") {
92
- quote = ch;
93
- continue;
94
- }
95
- if (isWhitespace(ch)) {
96
- push();
97
- continue;
98
- }
99
- current += ch;
100
- }
101
- if (quote)
102
- throw new Error("Unclosed quote");
103
- push();
104
- return tokens;
105
- }
106
41
  function parseArgs(tokens, booleanFlags = []) {
107
42
  const args = { _: [] };
108
43
  for (let i = 0; i < tokens.length; i++) {
@@ -117,7 +52,7 @@ function parseArgs(tokens, booleanFlags = []) {
117
52
  }
118
53
  const key = tok.slice(2);
119
54
  const next = tokens[i + 1];
120
- if (booleanFlags.includes(key) || !next || next.startsWith("--")) {
55
+ if (booleanFlags.includes(key) || next === undefined || next.startsWith("--")) {
121
56
  args[key] = true;
122
57
  continue;
123
58
  }
@@ -1 +1 @@
1
- {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/parser.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  * GitHub Recipes
3
3
  *
4
4
  * @example
5
- * import { prMonitor, prMonitorNotify } from 'lobster/recipes/github';
5
+ * import { prMonitor, prMonitorNotify } from '@clawdbot/lobster/recipes/github';
6
6
  *
7
7
  * const result = await prMonitor({ repo: 'owner/repo', pr: 123 }).run();
8
8
  */
@@ -1,8 +1,9 @@
1
+ import { buildPrChangeSummary, formatPrChangeMessage } from "./snapshot.js";
1
2
  /**
2
3
  * GitHub PR Monitor Recipe - Track PR changes over time
3
4
  *
4
5
  * @example
5
- * import { prMonitor, prMonitorNotify } from 'lobster/recipes/github';
6
+ * import { prMonitor, prMonitorNotify } from '@clawdbot/lobster/recipes/github';
6
7
  *
7
8
  * // Full PR state with diff
8
9
  * const result = await prMonitor({ repo: 'owner/repo', pr: 123 }).run();
@@ -13,66 +14,6 @@
13
14
  import { Lobster } from "../../sdk/index.js";
14
15
  import { diffLast } from "../../sdk/primitives/diff.js";
15
16
  import { ghPrView } from "./stages/pr-view.js";
16
- /**
17
- * Pick a subset of PR fields for comparison
18
- * @param {Object} snapshot
19
- * @returns {Object|null}
20
- */
21
- function pickSubset(snapshot) {
22
- if (!snapshot || typeof snapshot !== "object")
23
- return null;
24
- return {
25
- number: snapshot.number,
26
- title: snapshot.title,
27
- url: snapshot.url,
28
- state: snapshot.state,
29
- isDraft: snapshot.isDraft,
30
- mergeable: snapshot.mergeable,
31
- reviewDecision: snapshot.reviewDecision,
32
- updatedAt: snapshot.updatedAt,
33
- baseRefName: snapshot.baseRefName,
34
- headRefName: snapshot.headRefName,
35
- };
36
- }
37
- /**
38
- * Build a summary of what changed between two snapshots
39
- * @param {Object|null} before
40
- * @param {Object} after
41
- * @returns {{ changedFields: string[], changes: Object }}
42
- */
43
- function buildChangeSummary(before, after) {
44
- const a = pickSubset(after);
45
- const b = pickSubset(before);
46
- if (!a)
47
- return { changedFields: [], changes: {} };
48
- if (!b) {
49
- return {
50
- changedFields: Object.keys(a),
51
- changes: Object.fromEntries(Object.keys(a).map((k) => [k, { from: null, to: a[k] }])),
52
- };
53
- }
54
- const changes = {};
55
- for (const key of Object.keys(a)) {
56
- if (JSON.stringify(a[key]) !== JSON.stringify(b[key])) {
57
- changes[key] = { from: b[key], to: a[key] };
58
- }
59
- }
60
- return {
61
- changedFields: Object.keys(changes),
62
- changes,
63
- };
64
- }
65
- /**
66
- * Format a human-readable change message
67
- * @param {Object} options
68
- * @returns {string}
69
- */
70
- function formatChangeMessage({ repo, pr, changedFields, prInfo }) {
71
- const fields = changedFields.length ? ` (${changedFields.join(", ")})` : "";
72
- const title = prInfo?.title ? `: ${prInfo.title}` : "";
73
- const url = prInfo?.url ? ` ${prInfo.url}` : "";
74
- return `PR updated: ${repo}#${pr}${title}${fields}.${url}`.replace(/\s+/g, " ").trim();
75
- }
76
17
  /**
77
18
  * Create a PR monitor workflow
78
19
  *
@@ -113,7 +54,7 @@ export function prMonitor(options) {
113
54
  },
114
55
  ];
115
56
  }
116
- const summary = buildChangeSummary(before, current);
57
+ const summary = buildPrChangeSummary(before, current);
117
58
  if (summaryOnly) {
118
59
  return [
119
60
  {
@@ -200,8 +141,8 @@ export function prMonitorNotify(options) {
200
141
  }
201
142
  const current = diffResult.after;
202
143
  const before = diffResult.before;
203
- const summary = buildChangeSummary(before, current);
204
- const message = formatChangeMessage({
144
+ const summary = buildPrChangeSummary(before, current);
145
+ const message = formatPrChangeMessage({
205
146
  repo,
206
147
  pr: Number(pr),
207
148
  changedFields: summary.changedFields,
@@ -1 +1 @@
1
- {"version":3,"file":"pr-monitor.js","sourceRoot":"","sources":["../../../../src/recipes/github/pr-monitor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pr-monitor.js","sourceRoot":"","sources":["../../../../src/recipes/github/pr-monitor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC5E;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE/C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,SAAS,CAAC,OAAO;IAChC,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,GAAG,KAAK,EAAE,WAAW,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IACvE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,aAAa,IAAI,IAAI,EAAE,EAAE,CAAC;IAErD,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IACtD,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAElD,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;SACtD,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;SAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;SACnB,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QACjB,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC;QACjC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;QACjC,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC;QAEnC,gDAAgD;QAChD,IAAI,WAAW,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7B,OAAO;gBACN;oBACC,IAAI,EAAE,mBAAmB;oBACzB,IAAI;oBACJ,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;oBACd,GAAG;oBACH,OAAO,EAAE,KAAK;oBACd,UAAU,EAAE,IAAI;iBAChB;aACD,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAEtD,IAAI,WAAW,EAAE,CAAC;YACjB,OAAO;gBACN;oBACC,IAAI,EAAE,mBAAmB;oBACzB,IAAI;oBACJ,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;oBACd,GAAG;oBACH,OAAO;oBACP,OAAO;oBACP,MAAM,EAAE;wBACP,MAAM,EAAE,OAAO,CAAC,MAAM;wBACtB,KAAK,EAAE,OAAO,CAAC,KAAK;wBACpB,GAAG,EAAE,OAAO,CAAC,GAAG;wBAChB,KAAK,EAAE,OAAO,CAAC,KAAK;wBACpB,SAAS,EAAE,OAAO,CAAC,SAAS;qBAC5B;iBACD;aACD,CAAC;QACH,CAAC;QAED,OAAO;YACN;gBACC,IAAI,EAAE,mBAAmB;gBACzB,IAAI;gBACJ,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;gBACd,GAAG;gBACH,OAAO;gBACP,OAAO;gBACP,UAAU,EAAE,OAAO;aACnB;SACD,CAAC;IACH,CAAC,CAAC;SACD,IAAI,CAAC;QACL,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,qCAAqC;QAClD,QAAQ,EAAE,CAAC,IAAI,CAAC;QAChB,IAAI,EAAE;YACL,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,yBAAyB,EAAE;YAChF,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE;YAChE,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE;YAC1D,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,0BAA0B,EAAE;YACzF,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,wBAAwB,EAAE;SACvF;KACD,CAAC,CAAC;IAEJ,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,kBAAkB;AAClB,SAAS,CAAC,IAAI,GAAG;IAChB,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,qCAAqC;IAClD,QAAQ,EAAE,CAAC,IAAI,CAAC;IAChB,IAAI,EAAE;QACL,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QACxC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QACtC,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACvB,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;QAChD,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;KAChD;CACD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,OAAO;IACtC,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC;IAC7B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,aAAa,IAAI,IAAI,EAAE,EAAE,CAAC;IAErD,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC5D,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAExD,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;SACtD,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;SAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;SAC1C,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QACjB,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAE9B,IAAI,UAAU,CAAC,UAAU,EAAE,CAAC;YAC3B,OAAO,CAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC;QACjC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;QACjC,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAEtD,MAAM,OAAO,GAAG,qBAAqB,CAAC;YACrC,IAAI;YACJ,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;YACd,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,MAAM,EAAE,OAAO;SACf,CAAC,CAAC;QAEH,OAAO;YACN;gBACC,IAAI,EAAE,0BAA0B;gBAChC,OAAO,EAAE,IAAI;gBACb,IAAI;gBACJ,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;gBACd,OAAO;gBACP,MAAM,EAAE;oBACP,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,GAAG,EAAE,OAAO,CAAC,GAAG;oBAChB,KAAK,EAAE,OAAO,CAAC,KAAK;iBACpB;gBACD,OAAO;aACP;SACD,CAAC;IACH,CAAC,CAAC;SACD,IAAI,CAAC;QACL,IAAI,EAAE,0BAA0B;QAChC,WAAW,EAAE,6CAA6C;QAC1D,QAAQ,EAAE,CAAC,IAAI,CAAC;QAChB,IAAI,EAAE;YACL,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;YACxC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;YACtC,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SACvB;KACD,CAAC,CAAC;IAEJ,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED,kBAAkB;AAClB,eAAe,CAAC,IAAI,GAAG;IACtB,IAAI,EAAE,0BAA0B;IAChC,WAAW,EAAE,6CAA6C;IAC1D,QAAQ,EAAE,CAAC,IAAI,CAAC;IAChB,IAAI,EAAE;QACL,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QACxC,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QACtC,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;KACvB;CACD,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { runAbortableProcess } from "../../abortable_process.js";
2
+ const DEFAULT_FIELDS = [
3
+ "number",
4
+ "title",
5
+ "url",
6
+ "state",
7
+ "isDraft",
8
+ "mergeable",
9
+ "reviewDecision",
10
+ "author",
11
+ "baseRefName",
12
+ "headRefName",
13
+ "updatedAt",
14
+ ];
15
+ export async function runGithubPr({ repo, pr, fields, env, cwd, signal, forceTerminationSignal, }) {
16
+ const { stdout, stderr, code } = await runAbortableProcess({
17
+ command: "gh",
18
+ argv: [
19
+ "pr",
20
+ "view",
21
+ String(pr),
22
+ "--repo",
23
+ String(repo),
24
+ "--json",
25
+ (fields ?? DEFAULT_FIELDS).join(","),
26
+ ],
27
+ env,
28
+ cwd,
29
+ signal,
30
+ forceTerminationSignal,
31
+ notFoundMessage: "gh not found on PATH (install GitHub CLI)",
32
+ });
33
+ if (code !== 0)
34
+ throw new Error(`gh failed (${code}): ${stderr.trim() || stdout.trim()}`);
35
+ return stdout;
36
+ }
37
+ export function parseGithubPr(stdout) {
38
+ try {
39
+ return JSON.parse(stdout.trim());
40
+ }
41
+ catch {
42
+ throw new Error("gh returned non-JSON output");
43
+ }
44
+ }
45
+ //# sourceMappingURL=read_pr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read_pr.js","sourceRoot":"","sources":["../../../../src/recipes/github/read_pr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,cAAc,GAAG;IACtB,QAAQ;IACR,OAAO;IACP,KAAK;IACL,OAAO;IACP,SAAS;IACT,WAAW;IACX,gBAAgB;IAChB,QAAQ;IACR,aAAa;IACb,aAAa;IACb,WAAW;CACX,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,EACjC,IAAI,EACJ,EAAE,EACF,MAAM,EACN,GAAG,EACH,GAAG,EACH,MAAM,EACN,sBAAsB,GAStB;IACA,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,mBAAmB,CAAC;QAC1D,OAAO,EAAE,IAAI;QACb,IAAI,EAAE;YACL,IAAI;YACJ,MAAM;YACN,MAAM,CAAC,EAAE,CAAC;YACV,QAAQ;YACR,MAAM,CAAC,IAAI,CAAC;YACZ,QAAQ;YACR,CAAC,MAAM,IAAI,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;SACpC;QACD,GAAG;QACH,GAAG;QACH,MAAM;QACN,sBAAsB;QACtB,eAAe,EAAE,2CAA2C;KAC5D,CAAC,CAAC;IACH,IAAI,IAAI,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,MAAM,MAAM,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1F,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc;IAC3C,IAAI,CAAC;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAChD,CAAC;AACF,CAAC"}