audit-tools 0.50.4 → 0.50.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.
- package/dist/audit/cli/auditStep.d.ts +30 -0
- package/dist/audit/cli/auditStep.d.ts.map +1 -1
- package/dist/audit/cli/auditStep.js +50 -0
- package/dist/audit/cli/auditStep.js.map +1 -1
- package/dist/audit/cli/foldTransaction.d.ts +103 -0
- package/dist/audit/cli/foldTransaction.d.ts.map +1 -0
- package/dist/audit/cli/foldTransaction.js +243 -0
- package/dist/audit/cli/foldTransaction.js.map +1 -0
- package/dist/audit/cli/nextStepHelpers.d.ts +109 -28
- package/dist/audit/cli/nextStepHelpers.d.ts.map +1 -1
- package/dist/audit/cli/nextStepHelpers.js +661 -560
- package/dist/audit/cli/nextStepHelpers.js.map +1 -1
- package/dist/audit/cli/reviewRun.d.ts +15 -3
- package/dist/audit/cli/reviewRun.d.ts.map +1 -1
- package/dist/audit/cli/reviewRun.js +39 -13
- package/dist/audit/cli/reviewRun.js.map +1 -1
- package/dist/audit/orchestrator/advance.d.ts +38 -36
- package/dist/audit/orchestrator/advance.d.ts.map +1 -1
- package/dist/audit/orchestrator/advance.js +126 -82
- package/dist/audit/orchestrator/advance.js.map +1 -1
- package/dist/audit/orchestrator/advanceTypes.d.ts +23 -0
- package/dist/audit/orchestrator/advanceTypes.d.ts.map +1 -1
- package/dist/audit/orchestrator/designReviewSnapshot.d.ts +8 -2
- package/dist/audit/orchestrator/designReviewSnapshot.d.ts.map +1 -1
- package/dist/audit/orchestrator/designReviewSnapshot.js +12 -6
- package/dist/audit/orchestrator/designReviewSnapshot.js.map +1 -1
- package/dist/audit/orchestrator/executorRunners.d.ts.map +1 -1
- package/dist/audit/orchestrator/executorRunners.js +1 -1
- package/dist/audit/orchestrator/executorRunners.js.map +1 -1
- package/dist/audit/orchestrator/executors.d.ts.map +1 -1
- package/dist/audit/orchestrator/executors.js +1 -1
- package/dist/audit/orchestrator/executors.js.map +1 -1
- package/dist/audit/orchestrator/hostInputPause.d.ts +0 -33
- package/dist/audit/orchestrator/hostInputPause.d.ts.map +1 -1
- package/dist/audit/orchestrator/hostInputPause.js +6 -64
- package/dist/audit/orchestrator/hostInputPause.js.map +1 -1
- package/dist/audit/orchestrator/obligationPolicy.d.ts +90 -0
- package/dist/audit/orchestrator/obligationPolicy.d.ts.map +1 -0
- package/dist/audit/orchestrator/obligationPolicy.js +228 -0
- package/dist/audit/orchestrator/obligationPolicy.js.map +1 -0
- package/dist/audit/orchestrator/systemicChallengeExecutor.d.ts +1 -1
- package/dist/audit/orchestrator/systemicChallengeExecutor.d.ts.map +1 -1
- package/dist/audit/orchestrator/systemicChallengeExecutor.js +23 -1
- package/dist/audit/orchestrator/systemicChallengeExecutor.js.map +1 -1
- package/dist/audit/types/systemicChallenge.d.ts +9 -0
- package/dist/audit/types/systemicChallenge.d.ts.map +1 -1
- package/dist/shared/engine/obligationEngine.d.ts +52 -11
- package/dist/shared/engine/obligationEngine.d.ts.map +1 -1
- package/dist/shared/engine/obligationEngine.js +46 -9
- package/dist/shared/engine/obligationEngine.js.map +1 -1
- package/dist/shared/observability/runLog.d.ts +2 -0
- package/dist/shared/observability/runLog.d.ts.map +1 -1
- package/dist/shared/observability/runLog.js.map +1 -1
- package/package.json +1 -1
|
@@ -152,25 +152,51 @@ export declare function deriveEngineBound(cap: number): number;
|
|
|
152
152
|
* - `step` null, `stopped: "bound"` → the fold spent `maxTransitions`
|
|
153
153
|
* transitions without reaching an emit or completion. Also non-convergence,
|
|
154
154
|
* detected by counting rather than by signature.
|
|
155
|
+
* - `step` null, `stopped: "budget"` → the fold spent `maxExecutions` charged
|
|
156
|
+
* obligation executions. This is NOT non-convergence: the budget is a pacing
|
|
157
|
+
* cap, the stop is graceful, and the caller resumes the fold on its next
|
|
158
|
+
* call. Only possible when `opts.maxExecutions` is supplied.
|
|
155
159
|
*
|
|
156
160
|
* `stopped` being ABSENT is what means "the run is complete". A caller that
|
|
157
161
|
* branches on `step` alone therefore cannot tell completion from
|
|
158
|
-
* non-convergence, and would report a wedged fold as a finished one — so
|
|
159
|
-
* stopped
|
|
160
|
-
* obligation the fold was executing
|
|
161
|
-
*
|
|
162
|
+
* non-convergence, and would report a wedged fold as a finished one — so every
|
|
163
|
+
* stopped value must be handled explicitly. `lastObligationId` names the
|
|
164
|
+
* obligation the fold was executing (or, for `budget`, about to execute) when
|
|
165
|
+
* it stopped, so a caller can say WHICH obligation is in flight without
|
|
166
|
+
* parsing it out of a message.
|
|
162
167
|
*/
|
|
163
168
|
export interface AdvanceResult<S, Step> {
|
|
164
169
|
state: S;
|
|
165
170
|
step: Step | null;
|
|
166
|
-
stopped?: "cycle" | "bound";
|
|
171
|
+
stopped?: "cycle" | "bound" | "budget";
|
|
167
172
|
/** The obligation in flight when `stopped` was set; absent otherwise. */
|
|
168
173
|
lastObligationId?: string;
|
|
174
|
+
/**
|
|
175
|
+
* The numeric limit that fired — `maxTransitions` for `bound`,
|
|
176
|
+
* `maxExecutions` for `budget`; absent for `cycle` (no number fired). Carried
|
|
177
|
+
* ON the result so `describeStoppedFold` reports the number that actually
|
|
178
|
+
* stopped the fold, and no caller has to know which of two limits to restate.
|
|
179
|
+
*/
|
|
180
|
+
stoppedBound?: number;
|
|
181
|
+
/**
|
|
182
|
+
* Charged obligation executions this call spent (the unit `maxExecutions`
|
|
183
|
+
* caps). Carried on every outcome so a caller can RECORD the spend — the
|
|
184
|
+
* CX-02 hold-time measurement reads it — without re-counting dispatches
|
|
185
|
+
* against a second counter that could drift from the engine's own.
|
|
186
|
+
*/
|
|
187
|
+
executions: number;
|
|
169
188
|
}
|
|
170
|
-
/**
|
|
189
|
+
/**
|
|
190
|
+
* A stop, described once for every draw that can hit one. `cycle` and `bound`
|
|
191
|
+
* are non-convergence; `budget` is the graceful pacing cap — a caller that
|
|
192
|
+
* expects the cap should branch on `stopped === "budget"` BEFORE reaching for
|
|
193
|
+
* this description, and build its own resumable pause from its accumulators.
|
|
194
|
+
* The description exists so a caller that does NOT special-case the budget
|
|
195
|
+
* still reports the stop honestly rather than as a finished run.
|
|
196
|
+
*/
|
|
171
197
|
export interface StoppedFoldDescription {
|
|
172
198
|
/** Which backstop fired, carried through so a caller need not re-read it. */
|
|
173
|
-
stopped: "cycle" | "bound";
|
|
199
|
+
stopped: "cycle" | "bound" | "budget";
|
|
174
200
|
/**
|
|
175
201
|
* The obligation in flight when the fold stopped, or `"unknown"` when it
|
|
176
202
|
* stopped before selecting one. Never parsed out of prose.
|
|
@@ -189,14 +215,16 @@ export interface StoppedFoldDescription {
|
|
|
189
215
|
* null-check itself the branch: there is no way to consume the description
|
|
190
216
|
* without having asked the question.
|
|
191
217
|
*
|
|
192
|
-
*
|
|
193
|
-
*
|
|
218
|
+
* The number reported is `outcome.stoppedBound` — the limit that actually
|
|
219
|
+
* fired, carried on the result by the engine itself. `opts.bound` remains as
|
|
220
|
+
* the fallback for callers describing an outcome from an engine that did not
|
|
221
|
+
* stamp one, so the number a host reads is still never a restated constant.
|
|
194
222
|
*
|
|
195
223
|
* `cause` is prose for a human terminal ONLY. Never match it: `stopped` and
|
|
196
224
|
* `spinning` are the machine-readable fields, and recognizing a wedged fold by
|
|
197
225
|
* its message text is the divergence this module's bounded-call invariant bans.
|
|
198
226
|
*/
|
|
199
|
-
export declare function describeStoppedFold(outcome: Pick<AdvanceResult<unknown, unknown>, "stopped" | "lastObligationId">, opts?: {
|
|
227
|
+
export declare function describeStoppedFold(outcome: Pick<AdvanceResult<unknown, unknown>, "stopped" | "lastObligationId" | "stoppedBound">, opts?: {
|
|
200
228
|
bound?: number;
|
|
201
229
|
}): StoppedFoldDescription | null;
|
|
202
230
|
/**
|
|
@@ -222,7 +250,19 @@ export declare function describeStoppedFold(outcome: Pick<AdvanceResult<unknown,
|
|
|
222
250
|
* signature — it stops the loop with `stopped: "bound"` after that many
|
|
223
251
|
* consecutive transitions.
|
|
224
252
|
*
|
|
225
|
-
*
|
|
253
|
+
* **Execution budget.** `opts.maxExecutions` is the consumer-facing pacing cap
|
|
254
|
+
* (PH-03: a budget stop the result expresses structurally, so no caller wraps
|
|
255
|
+
* the engine in a second drain to enforce one). The engine charges EVERY
|
|
256
|
+
* `obligation.execute` call to it, spend-before-dispatch: once the budget is
|
|
257
|
+
* spent, the next selected obligation is NOT executed and the loop returns
|
|
258
|
+
* `stopped: "budget"` naming it. Because every transition follows a charged
|
|
259
|
+
* execution, `transitions <= charged executions` holds by construction — so a
|
|
260
|
+
* `maxTransitions` derived via {@link deriveEngineBound} from the same cap can
|
|
261
|
+
* never fire first, which is the bounded-call invariant this module owns. An
|
|
262
|
+
* `emit` spends its charge and returns normally; it is never converted into a
|
|
263
|
+
* budget stop.
|
|
264
|
+
*
|
|
265
|
+
* ALL backstops terminate GRACEFULLY. The bound used to throw, which forced
|
|
226
266
|
* every consumer to recognize a wedged fold by matching text in an error
|
|
227
267
|
* message and to recover the spinning obligation's id with a regex over that
|
|
228
268
|
* same prose — so the engine's bound was part of its contract while its only
|
|
@@ -239,5 +279,6 @@ export declare function describeStoppedFold(outcome: Pick<AdvanceResult<unknown,
|
|
|
239
279
|
export declare function advance<S, Ctx, Step>(engine: ObligationEngine<S, Ctx, Step>, state: S, ctx: Ctx, opts?: {
|
|
240
280
|
maxTransitions?: number;
|
|
241
281
|
stateSignature?: (state: S) => string;
|
|
282
|
+
maxExecutions?: number;
|
|
242
283
|
}): Promise<AdvanceResult<S, Step>>;
|
|
243
284
|
//# sourceMappingURL=obligationEngine.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"obligationEngine.d.ts","sourceRoot":"","sources":["../../../src/shared/engine/obligationEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,oEAMhC,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB;;;;;;;;;;;;EAMlB,CAAC;AACZ,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D;;;;;;;;;;;;GAYG;AACH,wBAAgB,6BAA6B,CAAC,CAAC,SAAS,UAAU,EAChE,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,WAAW,EAAE,SAAS,CAAC,EAAE,GACxB,CAAC,GAAG,SAAS,CAQf;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,KAAK,EAAE,CAAC,GAAG,eAAe,CAAC;IAClC,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;CAClE;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,EAAE,IAAI,IACjC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,CAAC,CAAA;CAAE,CAAC;AAE5C,8EAA8E;AAC9E,MAAM,WAAW,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI;IAC5C,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,WAAW,EAAE,SAAS,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;CACrD;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAC7C,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,WAAW,EAAE,SAAS,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EACnD,KAAK,EAAE,CAAC,GACP,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,SAAS,CAIzC;AAED;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAE3C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAErD;AAED
|
|
1
|
+
{"version":3,"file":"obligationEngine.d.ts","sourceRoot":"","sources":["../../../src/shared/engine/obligationEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -111,8 +111,10 @@ export function deriveEngineBound(cap) {
|
|
|
111
111
|
* null-check itself the branch: there is no way to consume the description
|
|
112
112
|
* without having asked the question.
|
|
113
113
|
*
|
|
114
|
-
*
|
|
115
|
-
*
|
|
114
|
+
* The number reported is `outcome.stoppedBound` — the limit that actually
|
|
115
|
+
* fired, carried on the result by the engine itself. `opts.bound` remains as
|
|
116
|
+
* the fallback for callers describing an outcome from an engine that did not
|
|
117
|
+
* stamp one, so the number a host reads is still never a restated constant.
|
|
116
118
|
*
|
|
117
119
|
* `cause` is prose for a human terminal ONLY. Never match it: `stopped` and
|
|
118
120
|
* `spinning` are the machine-readable fields, and recognizing a wedged fold by
|
|
@@ -121,13 +123,16 @@ export function deriveEngineBound(cap) {
|
|
|
121
123
|
export function describeStoppedFold(outcome, opts) {
|
|
122
124
|
if (!outcome.stopped)
|
|
123
125
|
return null;
|
|
124
|
-
const bound = opts?.bound ?? DEFAULT_MAX_TRANSITIONS;
|
|
126
|
+
const bound = outcome.stoppedBound ?? opts?.bound ?? DEFAULT_MAX_TRANSITIONS;
|
|
127
|
+
const cause = outcome.stopped === "bound"
|
|
128
|
+
? `spent the engine transition bound (${String(bound)}) without reaching a host-actionable step`
|
|
129
|
+
: outcome.stopped === "budget"
|
|
130
|
+
? `spent its charged-execution budget (${String(bound)}) and pauses resumably at the cap`
|
|
131
|
+
: "revisited a state it had already scanned this run";
|
|
125
132
|
return {
|
|
126
133
|
stopped: outcome.stopped,
|
|
127
134
|
spinning: outcome.lastObligationId ?? "unknown",
|
|
128
|
-
cause
|
|
129
|
-
? `spent the engine transition bound (${String(bound)}) without reaching a host-actionable step`
|
|
130
|
-
: "revisited a state it had already scanned this run",
|
|
135
|
+
cause,
|
|
131
136
|
};
|
|
132
137
|
}
|
|
133
138
|
/**
|
|
@@ -153,7 +158,19 @@ export function describeStoppedFold(outcome, opts) {
|
|
|
153
158
|
* signature — it stops the loop with `stopped: "bound"` after that many
|
|
154
159
|
* consecutive transitions.
|
|
155
160
|
*
|
|
156
|
-
*
|
|
161
|
+
* **Execution budget.** `opts.maxExecutions` is the consumer-facing pacing cap
|
|
162
|
+
* (PH-03: a budget stop the result expresses structurally, so no caller wraps
|
|
163
|
+
* the engine in a second drain to enforce one). The engine charges EVERY
|
|
164
|
+
* `obligation.execute` call to it, spend-before-dispatch: once the budget is
|
|
165
|
+
* spent, the next selected obligation is NOT executed and the loop returns
|
|
166
|
+
* `stopped: "budget"` naming it. Because every transition follows a charged
|
|
167
|
+
* execution, `transitions <= charged executions` holds by construction — so a
|
|
168
|
+
* `maxTransitions` derived via {@link deriveEngineBound} from the same cap can
|
|
169
|
+
* never fire first, which is the bounded-call invariant this module owns. An
|
|
170
|
+
* `emit` spends its charge and returns normally; it is never converted into a
|
|
171
|
+
* budget stop.
|
|
172
|
+
*
|
|
173
|
+
* ALL backstops terminate GRACEFULLY. The bound used to throw, which forced
|
|
157
174
|
* every consumer to recognize a wedged fold by matching text in an error
|
|
158
175
|
* message and to recover the spinning obligation's id with a regex over that
|
|
159
176
|
* same prose — so the engine's bound was part of its contract while its only
|
|
@@ -169,10 +186,12 @@ export function describeStoppedFold(outcome, opts) {
|
|
|
169
186
|
*/
|
|
170
187
|
export async function advance(engine, state, ctx, opts) {
|
|
171
188
|
const maxTransitions = opts?.maxTransitions ?? DEFAULT_MAX_TRANSITIONS;
|
|
189
|
+
const maxExecutions = opts?.maxExecutions;
|
|
172
190
|
const stateSignature = opts?.stateSignature;
|
|
173
191
|
const visited = stateSignature ? new Set() : null;
|
|
174
192
|
let current = state;
|
|
175
193
|
let transitions = 0;
|
|
194
|
+
let executions = 0;
|
|
176
195
|
// The obligation most recently selected — reported on every non-convergent
|
|
177
196
|
// stop so the caller can name what is spinning.
|
|
178
197
|
let lastObligationId = null;
|
|
@@ -188,6 +207,7 @@ export async function advance(engine, state, ctx, opts) {
|
|
|
188
207
|
state: current,
|
|
189
208
|
step: null,
|
|
190
209
|
stopped: "cycle",
|
|
210
|
+
executions,
|
|
191
211
|
...(lastObligationId === null ? {} : { lastObligationId }),
|
|
192
212
|
};
|
|
193
213
|
}
|
|
@@ -195,11 +215,26 @@ export async function advance(engine, state, ctx, opts) {
|
|
|
195
215
|
}
|
|
196
216
|
const obligation = findNextObligation(engine.priority, engine.obligations, current);
|
|
197
217
|
if (!obligation)
|
|
198
|
-
return { state: current, step: null };
|
|
218
|
+
return { state: current, step: null, executions };
|
|
199
219
|
lastObligationId = obligation.id;
|
|
220
|
+
if (maxExecutions !== undefined && executions >= maxExecutions) {
|
|
221
|
+
// The budget is spent and another obligation is still actionable. Spend-
|
|
222
|
+
// before-dispatch: the selected obligation is NOT executed — a cap stated
|
|
223
|
+
// as a maximum must never authorize one step past itself. Graceful and
|
|
224
|
+
// resumable; the next call re-selects this same obligation.
|
|
225
|
+
return {
|
|
226
|
+
state: current,
|
|
227
|
+
step: null,
|
|
228
|
+
stopped: "budget",
|
|
229
|
+
lastObligationId,
|
|
230
|
+
stoppedBound: maxExecutions,
|
|
231
|
+
executions,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
executions += 1;
|
|
200
235
|
const outcome = await obligation.execute(current, ctx);
|
|
201
236
|
if (outcome.kind === "emit") {
|
|
202
|
-
return { state: outcome.state ?? current, step: outcome.step };
|
|
237
|
+
return { state: outcome.state ?? current, step: outcome.step, executions };
|
|
203
238
|
}
|
|
204
239
|
current = outcome.state;
|
|
205
240
|
if (++transitions > maxTransitions) {
|
|
@@ -213,6 +248,8 @@ export async function advance(engine, state, ctx, opts) {
|
|
|
213
248
|
step: null,
|
|
214
249
|
stopped: "bound",
|
|
215
250
|
lastObligationId,
|
|
251
|
+
stoppedBound: maxTransitions,
|
|
252
|
+
executions,
|
|
216
253
|
};
|
|
217
254
|
}
|
|
218
255
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"obligationEngine.js","sourceRoot":"","sources":["../../../src/shared/engine/obligationEngine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,IAAI,CAAC;IAC1C,SAAS;IACT,SAAS;IACT,OAAO;IACP,SAAS;IACT,WAAW;CACZ,CAAC,CAAC;AAGH,+EAA+E;AAC/E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC;KAC9B,MAAM,CAAC;IACN,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,KAAK,EAAE,qBAAqB;IAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC9B,CAAC;KACD,MAAM,EAAE,CAAC;AAGZ;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,6BAA6B,CAC3C,QAA2B,EAC3B,WAAyB;IAEzB,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAClD,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,CAAC,EAAE,CAAC;YACjE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAiDD;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAA2B,EAC3B,WAAmD,EACnD,KAAQ;IAER,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/E,MAAM,MAAM,GAAG,6BAA6B,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChE,OAAO,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1E,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAE3C;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC;AAE5C;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,OAAO,GAAG,GAAG,0BAA0B,CAAC;AAC1C,CAAC;
|
|
1
|
+
{"version":3,"file":"obligationEngine.js","sourceRoot":"","sources":["../../../src/shared/engine/obligationEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,8 @@ export interface RunLogEvent {
|
|
|
13
13
|
artifact?: string;
|
|
14
14
|
tokens_est?: number;
|
|
15
15
|
duration_ms?: number;
|
|
16
|
+
/** Charged obligation executions a fold spent (CX-02 hold measurement). */
|
|
17
|
+
executions?: number;
|
|
16
18
|
note?: string;
|
|
17
19
|
/** Run- or request-scoped token for correlating log events across a single invocation. */
|
|
18
20
|
correlationId?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runLog.d.ts","sourceRoot":"","sources":["../../../src/shared/observability/runLog.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,MAAM,MAAM,eAAe,GACvB,YAAY,GACZ,gBAAgB,GAChB,cAAc,GACd,gBAAgB,GAChB,OAAO,GACP,SAAS,GACT,MAAM,GACN,OAAO,GACP,OAAO,CAAC;AAEZ,MAAM,WAAW,WAAW;IAC1B,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0FAA0F;IAC1F,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2DAA2D;IAC3D,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEvB,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAMxD,2EAA2E;IAC3E,MAAM,CAAC,QAAQ,IAAI,SAAS;IAI5B,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,8EAA8E;IAC9E,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;CAgBhC"}
|
|
1
|
+
{"version":3,"file":"runLog.d.ts","sourceRoot":"","sources":["../../../src/shared/observability/runLog.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,MAAM,MAAM,eAAe,GACvB,YAAY,GACZ,gBAAgB,GAChB,cAAc,GACd,gBAAgB,GAChB,OAAO,GACP,SAAS,GACT,MAAM,GACN,OAAO,GACP,OAAO,CAAC;AAEZ,MAAM,WAAW,WAAW;IAC1B,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0FAA0F;IAC1F,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2DAA2D;IAC3D,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEvB,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;IAMxD,2EAA2E;IAC3E,MAAM,CAAC,QAAQ,IAAI,SAAS;IAI5B,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,8EAA8E;IAC9E,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;CAgBhC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runLog.js","sourceRoot":"","sources":["../../../src/shared/observability/runLog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"runLog.js","sourceRoot":"","sources":["../../../src/shared/observability/runLog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4CpC,MAAM,OAAO,SAAS;IACH,IAAI,CAAS;IACb,OAAO,CAAU;IACjB,GAAG,CAAe;IAEnC,YAAY,IAAY,EAAE,UAA4B,EAAE;QACtD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,CAAC;QACvC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,2EAA2E;IAC3E,MAAM,CAAC,QAAQ;QACb,OAAO,IAAI,SAAS,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,8EAA8E;IAC9E,KAAK,CAAC,KAAkB;QACtB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACpD,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,GAAG,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;QACrF,CAAC;QAAC,MAAM,CAAC;YACP,sEAAsE;YACtE,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,sBAAsB,EAAE,CAAC,GAAG,IAAI,CAAC;QAC3H,CAAC;QACD,IAAI,CAAC;YACH,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACnD,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1C,CAAC;QAAC,MAAM,CAAC;YACP,wCAAwC;QAC1C,CAAC;IACH,CAAC;CACF"}
|