@nodetool-ai/execution 0.8.1 → 0.8.3
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 +23 -127
- package/dist/.nodetool-build-stamp +1 -1
- package/dist/app-debug/app-spec.d.ts.map +1 -1
- package/dist/app-debug/app-spec.js +3 -0
- package/dist/app-debug/app-spec.js.map +1 -1
- package/dist/app-debug/application-target.d.ts +1 -1
- package/dist/app-debug/application-target.d.ts.map +1 -1
- package/dist/app-debug/application-target.js +5 -3
- package/dist/app-debug/application-target.js.map +1 -1
- package/dist/app-debug/index.d.ts +4 -2
- package/dist/app-debug/index.d.ts.map +1 -1
- package/dist/app-debug/index.js +3 -2
- package/dist/app-debug/index.js.map +1 -1
- package/dist/app-debug/run-recording.d.ts +20 -0
- package/dist/app-debug/run-recording.d.ts.map +1 -0
- package/dist/app-debug/run-recording.js +105 -0
- package/dist/app-debug/run-recording.js.map +1 -0
- package/dist/app-debug/runtime.d.ts +2 -0
- package/dist/app-debug/runtime.d.ts.map +1 -1
- package/dist/app-debug/runtime.js +19 -4
- package/dist/app-debug/runtime.js.map +1 -1
- package/dist/app-debug/simulate.d.ts +10 -1
- package/dist/app-debug/simulate.d.ts.map +1 -1
- package/dist/app-debug/simulate.js +67 -27
- package/dist/app-debug/simulate.js.map +1 -1
- package/dist/app-debug/summarize.d.ts +1 -0
- package/dist/app-debug/summarize.d.ts.map +1 -1
- package/dist/app-debug/summarize.js +1 -0
- package/dist/app-debug/summarize.js.map +1 -1
- package/dist/app-debug/types.d.ts +6 -4
- package/dist/app-debug/types.d.ts.map +1 -1
- package/dist/app-run-generation.d.ts +8 -0
- package/dist/app-run-generation.d.ts.map +1 -0
- package/dist/app-run-generation.js +61 -0
- package/dist/app-run-generation.js.map +1 -0
- package/dist/browser-app-run.d.ts +10 -0
- package/dist/browser-app-run.d.ts.map +1 -0
- package/dist/browser-app-run.js +108 -0
- package/dist/browser-app-run.js.map +1 -0
- package/dist/browser-run-spans.d.ts +4 -0
- package/dist/browser-run-spans.d.ts.map +1 -0
- package/dist/browser-run-spans.js +115 -0
- package/dist/browser-run-spans.js.map +1 -0
- package/dist/browser-trace-policy.d.ts +12 -0
- package/dist/browser-trace-policy.d.ts.map +1 -0
- package/dist/browser-trace-policy.js +40 -0
- package/dist/browser-trace-policy.js.map +1 -0
- package/dist/cost-ledger.d.ts +3 -0
- package/dist/cost-ledger.d.ts.map +1 -1
- package/dist/cost-ledger.js +23 -2
- package/dist/cost-ledger.js.map +1 -1
- package/dist/debug/types.d.ts +1 -0
- package/dist/debug/types.d.ts.map +1 -1
- package/dist/debug/verdict.d.ts +26 -1
- package/dist/debug/verdict.d.ts.map +1 -1
- package/dist/debug/verdict.js +36 -0
- package/dist/debug/verdict.js.map +1 -1
- package/dist/generation-lifecycle.d.ts +5 -4
- package/dist/generation-lifecycle.d.ts.map +1 -1
- package/dist/generation-lifecycle.js +71 -10
- package/dist/generation-lifecycle.js.map +1 -1
- package/dist/generation-recovery-worker.d.ts.map +1 -1
- package/dist/generation-recovery-worker.js +2 -0
- package/dist/generation-recovery-worker.js.map +1 -1
- package/dist/generation-tracker.d.ts +2 -15
- package/dist/generation-tracker.d.ts.map +1 -1
- package/dist/generation-tracker.js +92 -6
- package/dist/generation-tracker.js.map +1 -1
- package/dist/index.d.ts +9 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/js-script-debug/index.d.ts +1 -0
- package/dist/js-script-debug/index.d.ts.map +1 -1
- package/dist/js-script-debug/index.js +1 -0
- package/dist/js-script-debug/index.js.map +1 -1
- package/dist/js-script-debug/report.d.ts.map +1 -1
- package/dist/js-script-debug/report.js +9 -24
- package/dist/js-script-debug/report.js.map +1 -1
- package/dist/js-script-debug/type-check.d.ts +16 -0
- package/dist/js-script-debug/type-check.d.ts.map +1 -0
- package/dist/js-script-debug/type-check.js +150 -0
- package/dist/js-script-debug/type-check.js.map +1 -0
- package/dist/js-script-debug/validate.d.ts +8 -0
- package/dist/js-script-debug/validate.d.ts.map +1 -1
- package/dist/js-script-debug/validate.js +4 -0
- package/dist/js-script-debug/validate.js.map +1 -1
- package/dist/message-stream.d.ts +1 -32
- package/dist/message-stream.d.ts.map +1 -1
- package/dist/message-stream.js +1 -57
- package/dist/message-stream.js.map +1 -1
- package/dist/partial-run.d.ts +65 -0
- package/dist/partial-run.d.ts.map +1 -0
- package/dist/partial-run.js +300 -0
- package/dist/partial-run.js.map +1 -0
- package/dist/preflight.d.ts +43 -2
- package/dist/preflight.d.ts.map +1 -1
- package/dist/preflight.js +78 -4
- package/dist/preflight.js.map +1 -1
- package/dist/run-trace-store.d.ts +9 -0
- package/dist/run-trace-store.d.ts.map +1 -0
- package/dist/run-trace-store.js +57 -0
- package/dist/run-trace-store.js.map +1 -0
- package/dist/runs.d.ts +16 -0
- package/dist/runs.d.ts.map +1 -0
- package/dist/runs.js +431 -0
- package/dist/runs.js.map +1 -0
- package/dist/service/app-debug-service.d.ts +4 -2
- package/dist/service/app-debug-service.d.ts.map +1 -1
- package/dist/service/app-debug-service.js +73 -31
- package/dist/service/app-debug-service.js.map +1 -1
- package/dist/service/app-operation.d.ts +39 -0
- package/dist/service/app-operation.d.ts.map +1 -0
- package/dist/service/app-operation.js +271 -0
- package/dist/service/app-operation.js.map +1 -0
- package/dist/service/app-run-server.d.ts +3 -1
- package/dist/service/app-run-server.d.ts.map +1 -1
- package/dist/service/app-run-server.js +22 -14
- package/dist/service/app-run-server.js.map +1 -1
- package/dist/service/index.d.ts +5 -1
- package/dist/service/index.d.ts.map +1 -1
- package/dist/service/index.js +2 -0
- package/dist/service/index.js.map +1 -1
- package/dist/service/run-trace-lifecycle.d.ts +34 -0
- package/dist/service/run-trace-lifecycle.d.ts.map +1 -0
- package/dist/service/run-trace-lifecycle.js +135 -0
- package/dist/service/run-trace-lifecycle.js.map +1 -0
- package/dist/service/workflow-run.d.ts +47 -16
- package/dist/service/workflow-run.d.ts.map +1 -1
- package/dist/service/workflow-run.js +210 -78
- package/dist/service/workflow-run.js.map +1 -1
- package/dist/session.d.ts +1 -1
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +109 -100
- package/dist/session.js.map +1 -1
- package/dist/sketch-debug/markdown.d.ts.map +1 -1
- package/dist/sketch-debug/markdown.js +1 -0
- package/dist/sketch-debug/markdown.js.map +1 -1
- package/dist/sketch-debug/report.d.ts.map +1 -1
- package/dist/sketch-debug/report.js +19 -28
- package/dist/sketch-debug/report.js.map +1 -1
- package/dist/sketch-debug/types.d.ts +2 -0
- package/dist/sketch-debug/types.d.ts.map +1 -1
- package/dist/timeline-debug/frame-geometry.d.ts +120 -0
- package/dist/timeline-debug/frame-geometry.d.ts.map +1 -0
- package/dist/timeline-debug/frame-geometry.js +238 -0
- package/dist/timeline-debug/frame-geometry.js.map +1 -0
- package/dist/timeline-debug/index.d.ts +1 -0
- package/dist/timeline-debug/index.d.ts.map +1 -1
- package/dist/timeline-debug/index.js +1 -0
- package/dist/timeline-debug/index.js.map +1 -1
- package/dist/timeline-debug/legibility.d.ts +8 -4
- package/dist/timeline-debug/legibility.d.ts.map +1 -1
- package/dist/timeline-debug/legibility.js +47 -18
- package/dist/timeline-debug/legibility.js.map +1 -1
- package/dist/timeline-debug/report.d.ts.map +1 -1
- package/dist/timeline-debug/report.js +16 -25
- package/dist/timeline-debug/report.js.map +1 -1
- package/dist/timeline-debug/score.d.ts +110 -0
- package/dist/timeline-debug/score.d.ts.map +1 -0
- package/dist/timeline-debug/score.js +231 -0
- package/dist/timeline-debug/score.js.map +1 -0
- package/dist/timeline-debug/showcase.d.ts +12 -0
- package/dist/timeline-debug/showcase.d.ts.map +1 -1
- package/dist/timeline-debug/showcase.js +669 -13
- package/dist/timeline-debug/showcase.js.map +1 -1
- package/dist/timeline-debug/validate.d.ts.map +1 -1
- package/dist/timeline-debug/validate.js +121 -2
- package/dist/timeline-debug/validate.js.map +1 -1
- package/dist/types.d.ts +18 -10
- package/dist/types.d.ts.map +1 -1
- package/package.json +13 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"summarize.js","sourceRoot":"","sources":["../../src/app-debug/summarize.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"summarize.js","sourceRoot":"","sources":["../../src/app-debug/summarize.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,12 +36,11 @@ export interface ResolvedAppTarget {
|
|
|
36
36
|
document: ApplicationDocument | null;
|
|
37
37
|
/** Why no document could be parsed. */
|
|
38
38
|
issue: string | null;
|
|
39
|
-
/**
|
|
39
|
+
/** Loaded graphs use id@version (or id@latest). Carried legacy and bundle graphs use their reference id. */
|
|
40
40
|
graphs: Map<string, DebugGraph>;
|
|
41
41
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
* runs without a database.
|
|
42
|
+
* Loaded scripts use id@version. Bundle scripts use their local reference key
|
|
43
|
+
* so an operation runs without a database.
|
|
45
44
|
*/
|
|
46
45
|
scripts?: Map<string, {
|
|
47
46
|
name: string;
|
|
@@ -82,6 +81,8 @@ export interface AppWidgetSpec {
|
|
|
82
81
|
* state, so this is their binding rather than {@link binding}.
|
|
83
82
|
*/
|
|
84
83
|
resourceBindingId: string | null;
|
|
84
|
+
/** Authored fallback choices when no optionsBinding is supplied. */
|
|
85
|
+
choiceOptions?: unknown;
|
|
85
86
|
/**
|
|
86
87
|
* Bindings the widget carries besides {@link binding} — a chat thread's live
|
|
87
88
|
* reply, a composer's conversation variable. Same resolution rules; `ref` is
|
|
@@ -273,6 +274,7 @@ export interface AppResourceCollectionState {
|
|
|
273
274
|
commands: string[];
|
|
274
275
|
}
|
|
275
276
|
export interface AppDebugReport {
|
|
277
|
+
run_ids?: string[];
|
|
276
278
|
generatedAt: string;
|
|
277
279
|
target: DebugTargetInfo;
|
|
278
280
|
app: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/app-debug/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EACV,QAAQ,EACR,mBAAmB,EACnB,UAAU,EACV,cAAc,EACd,YAAY,EACZ,eAAe,EACf,eAAe,EACf,aAAa,EACb,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,iBAAiB,IAAI,uBAAuB,EAC7C,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EACf,YAAY,EACZ,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iDAAiD,CAAC;AACxF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAEjC;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,eAAe,CAAC;IACtB;;;;OAIG;IACH,KAAK,EAAE,UAAU,CAAC;IAClB,gFAAgF;IAChF,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,2EAA2E;IAC3E,MAAM,EAAE,OAAO,CAAC;IAChB,wFAAwF;IACxF,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACrC,uCAAuC;IACvC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/app-debug/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { GenerationOutput, type Prediction } from "@nodetool-ai/models";
|
|
2
|
+
import type { AppRunContext } from "@nodetool-ai/runtime";
|
|
3
|
+
export declare function appRunGenerationMetadata(context?: AppRunContext): Record<string, unknown>;
|
|
4
|
+
/** Recovery uses the accepted association, never a process-local context. */
|
|
5
|
+
export declare function attachAppRunGenerationOutputs(generation: Prediction | null, outputs: readonly GenerationOutput[]): Promise<void>;
|
|
6
|
+
/** Legacy provider calls already own a prediction row. Add output references only. */
|
|
7
|
+
export declare function attachLegacyAppRunGeneration(generation: Prediction): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=app-run-generation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-run-generation.d.ts","sourceRoot":"","sources":["../src/app-run-generation.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gBAAgB,EAChB,KAAK,UAAU,EAGhB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,wBAAgB,wBAAwB,CACtC,OAAO,CAAC,EAAE,aAAa,GACtB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQzB;AAED,6EAA6E;AAC7E,wBAAsB,6BAA6B,CACjD,UAAU,EAAE,UAAU,GAAG,IAAI,EAC7B,OAAO,EAAE,SAAS,gBAAgB,EAAE,GACnC,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED,sFAAsF;AACtF,wBAAsB,4BAA4B,CAChD,UAAU,EAAE,UAAU,GACrB,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { GenerationAttempt, GenerationOutput, attachGenerationToAppRun, reconcileAppRunCost } from "@nodetool-ai/models";
|
|
2
|
+
export function appRunGenerationMetadata(context) {
|
|
3
|
+
return context
|
|
4
|
+
? {
|
|
5
|
+
app_run_id: context.appRunId,
|
|
6
|
+
app_instance_id: context.instanceId,
|
|
7
|
+
app_run_user_id: context.userId
|
|
8
|
+
}
|
|
9
|
+
: {};
|
|
10
|
+
}
|
|
11
|
+
/** Recovery uses the accepted association, never a process-local context. */
|
|
12
|
+
export async function attachAppRunGenerationOutputs(generation, outputs) {
|
|
13
|
+
if (!generation) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const runId = generation.metadata?.app_run_id;
|
|
17
|
+
const ownerId = generation.metadata?.app_run_user_id;
|
|
18
|
+
if (typeof runId !== "string" || ownerId !== generation.user_id) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
for (const output of outputs) {
|
|
22
|
+
if (output.status !== "ready") {
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
await attachGenerationToAppRun(generation.user_id, runId, generation.id, output.id);
|
|
26
|
+
}
|
|
27
|
+
await reconcileAppRunCost(generation.user_id, runId);
|
|
28
|
+
}
|
|
29
|
+
/** Legacy provider calls already own a prediction row. Add output references only. */
|
|
30
|
+
export async function attachLegacyAppRunGeneration(generation) {
|
|
31
|
+
if (typeof generation.metadata?.app_run_id !== "string") {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const assets = generation.asset_ids ?? [];
|
|
35
|
+
if (!assets.length) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const { attempt } = await GenerationAttempt.ensureForGeneration({
|
|
39
|
+
generation_id: generation.id,
|
|
40
|
+
provider: generation.provider
|
|
41
|
+
});
|
|
42
|
+
const outputs = [];
|
|
43
|
+
for (const [index, assetId] of assets.entries()) {
|
|
44
|
+
const output = await GenerationOutput.upsertOutput({
|
|
45
|
+
generation_id: generation.id,
|
|
46
|
+
attempt_id: attempt.id,
|
|
47
|
+
output_key: `app-run:${assetId}`,
|
|
48
|
+
output_index: index,
|
|
49
|
+
output_type: "media"
|
|
50
|
+
});
|
|
51
|
+
const ready = await GenerationOutput.transition(output.id, {
|
|
52
|
+
status: "ready",
|
|
53
|
+
asset_id: assetId
|
|
54
|
+
});
|
|
55
|
+
if (ready) {
|
|
56
|
+
outputs.push(ready);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
await attachAppRunGenerationOutputs(generation, outputs);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=app-run-generation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-run-generation.js","sourceRoot":"","sources":["../src/app-run-generation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAEhB,wBAAwB,EACxB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC;AAG7B,MAAM,UAAU,wBAAwB,CACtC,OAAuB;IAEvB,OAAO,OAAO;QACZ,CAAC,CAAC;YACE,UAAU,EAAE,OAAO,CAAC,QAAQ;YAC5B,eAAe,EAAE,OAAO,CAAC,UAAU;YACnC,eAAe,EAAE,OAAO,CAAC,MAAM;SAChC;QACH,CAAC,CAAC,EAAE,CAAC;AACT,CAAC;AAED,6EAA6E;AAC7E,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,UAA6B,EAC7B,OAAoC;IAEpC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC9C,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,EAAE,eAAe,CAAC;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC;QAChE,OAAO;IACT,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAC9B,SAAS;QACX,CAAC;QACD,MAAM,wBAAwB,CAC5B,UAAU,CAAC,OAAO,EAClB,KAAK,EACL,UAAU,CAAC,EAAE,EACb,MAAM,CAAC,EAAE,CACV,CAAC;IACJ,CAAC;IACD,MAAM,mBAAmB,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AACvD,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,UAAsB;IAEtB,IAAI,OAAO,UAAU,CAAC,QAAQ,EAAE,UAAU,KAAK,QAAQ,EAAE,CAAC;QACxD,OAAO;IACT,CAAC;IACD,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,IAAI,EAAE,CAAC;IAC1C,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,iBAAiB,CAAC,mBAAmB,CAAC;QAC9D,aAAa,EAAE,UAAU,CAAC,EAAE;QAC5B,QAAQ,EAAE,UAAU,CAAC,QAAQ;KAC9B,CAAC,CAAC;IACH,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAAC;YACjD,aAAa,EAAE,UAAU,CAAC,EAAE;YAC5B,UAAU,EAAE,OAAO,CAAC,EAAE;YACtB,UAAU,EAAE,WAAW,OAAO,EAAE;YAChC,YAAY,EAAE,KAAK;YACnB,WAAW,EAAE,OAAO;SACrB,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE;YACzD,MAAM,EAAE,OAAO;YACf,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,MAAM,6BAA6B,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type TraceRecord } from "@nodetool-ai/protocol";
|
|
2
|
+
/** The stored host marker survives a server restart and cannot be set by browser span ingestion. */
|
|
3
|
+
export declare function getBrowserAppRunRoot(userId: string, id: string): Promise<TraceRecord | null>;
|
|
4
|
+
/** Claim the reservation before the browser kernel starts, with a durable server-owned app root. */
|
|
5
|
+
export declare function startBrowserAppRun(userId: string, id: string, input: unknown): Promise<{
|
|
6
|
+
root_span_id: string;
|
|
7
|
+
}>;
|
|
8
|
+
/** Close from the stored start, so reloads and server restarts do not lose the terminal root. */
|
|
9
|
+
export declare function finishBrowserAppRunTrace(userId: string, id: string, status: "completed" | "failed" | "cancelled"): Promise<void>;
|
|
10
|
+
//# sourceMappingURL=browser-app-run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-app-run.d.ts","sourceRoot":"","sources":["../src/browser-app-run.ts"],"names":[],"mappings":"AAIA,OAAO,EAAqF,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAK5I,oGAAoG;AACpG,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAMlG;AAED,oGAAoG;AACpG,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAQtH;AA8CD,iGAAiG;AACjG,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAatI"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import { getAppRun, getAppInstance, claimAppRun, resolveRunReader, queryRunReaderSpans, writeRunTraceUpdate, settleAppRun, AppRunError, RunTraceError } from "@nodetool-ai/models";
|
|
3
|
+
import { browserRunStartInputSchema, BROWSER_TRACE_SOURCE_KEY, BROWSER_APP_RUNNER_INSTANCE } from "@nodetool-ai/protocol";
|
|
4
|
+
import { RunsError } from "./runs.js";
|
|
5
|
+
import { publishCommittedRunTraceUpdate } from "./run-trace-store.js";
|
|
6
|
+
import { rememberBrowserTracePolicy, expireBrowserTracePolicy } from "./browser-trace-policy.js";
|
|
7
|
+
/** The stored host marker survives a server restart and cannot be set by browser span ingestion. */
|
|
8
|
+
export async function getBrowserAppRunRoot(userId, id) {
|
|
9
|
+
const registration = await resolveRunReader(userId, id);
|
|
10
|
+
if (!registration || registration.kind !== "app" || !registration.root_span_id) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
const [root] = await queryRunReaderSpans(userId, registration, { spanIds: [registration.root_span_id] });
|
|
14
|
+
return root?.metadata.name === "app.run" && root.metadata.resource[BROWSER_TRACE_SOURCE_KEY] === "server" && root.metadata.attributes["app.execution.location"] === "browser"
|
|
15
|
+
? root.metadata : null;
|
|
16
|
+
}
|
|
17
|
+
/** Claim the reservation before the browser kernel starts, with a durable server-owned app root. */
|
|
18
|
+
export async function startBrowserAppRun(userId, id, input) {
|
|
19
|
+
try {
|
|
20
|
+
return await startBrowserRun(userId, id, input);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
if (error instanceof AppRunError || error instanceof RunTraceError) {
|
|
24
|
+
throw new RunsError(error.code === "not_found" ? "not_found" : error.code === "conflict" ? "ambiguous" : "invalid_input", error.message);
|
|
25
|
+
}
|
|
26
|
+
throw error;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async function startBrowserRun(userId, id, input) {
|
|
30
|
+
const parsed = browserRunStartInputSchema.safeParse(input);
|
|
31
|
+
if (!parsed.success) {
|
|
32
|
+
throw new RunsError("invalid_input", "Invalid browser traceparent");
|
|
33
|
+
}
|
|
34
|
+
const [, traceId, parentId] = parsed.data.traceparent.split("-");
|
|
35
|
+
const run = await getAppRun(userId, id);
|
|
36
|
+
const registration = await resolveRunReader(userId, id);
|
|
37
|
+
if (!run || !registration || registration.kind !== "app") {
|
|
38
|
+
throw new RunsError("not_found", "App run not found");
|
|
39
|
+
}
|
|
40
|
+
if (!parentId || /^0+$/.test(parentId) || traceId !== run.trace_id || run.origin === "public" || run.status !== "running") {
|
|
41
|
+
throw new RunsError("invalid_input", "Browser traceparent does not match an open app run");
|
|
42
|
+
}
|
|
43
|
+
const existing = await getBrowserAppRunRoot(userId, run.id);
|
|
44
|
+
if (existing && existing.parent_span_id === parentId) {
|
|
45
|
+
return { root_span_id: existing.span_id };
|
|
46
|
+
}
|
|
47
|
+
if (run.execution_started_at || registration.root_span_id) {
|
|
48
|
+
throw new RunsError("invalid_input", "App run already claimed");
|
|
49
|
+
}
|
|
50
|
+
const [parent] = await queryRunReaderSpans(userId, registration, { spanIds: [parentId] });
|
|
51
|
+
if (parent && (parent.metadata.name !== "ui.action" || parent.metadata.resource[BROWSER_TRACE_SOURCE_KEY] !== "browser")) {
|
|
52
|
+
throw new RunsError("invalid_input", "App root requires a browser action parent");
|
|
53
|
+
}
|
|
54
|
+
if (!await claimAppRun(userId, run.id, BROWSER_APP_RUNNER_INSTANCE)) {
|
|
55
|
+
throw new RunsError("invalid_input", "App run already claimed");
|
|
56
|
+
}
|
|
57
|
+
const spanId = randomBytes(8).toString("hex");
|
|
58
|
+
const start = Date.now();
|
|
59
|
+
try {
|
|
60
|
+
const instance = await getAppInstance(userId, run.instance_id);
|
|
61
|
+
if (!instance || instance.version !== run.version ||
|
|
62
|
+
(run.snapshot !== null && JSON.stringify(instance.snapshot) !== JSON.stringify(run.snapshot))) {
|
|
63
|
+
throw new RunsError("invalid_input", "App instance snapshot changed before execution. Start a new run.");
|
|
64
|
+
}
|
|
65
|
+
const committed = await writeRunTraceUpdate(userId, run.id, { kind: "span_started", record: {
|
|
66
|
+
trace_id: run.trace_id, span_id: spanId, parent_span_id: parentId, name: "app.run", kind: "INTERNAL",
|
|
67
|
+
start_time_ms: start, end_time_ms: start, duration_ms: 0, status: { code: "UNSET" },
|
|
68
|
+
attributes: { "app.execution.location": "browser", "app.run_id": run.id, "app.instance_id": run.instance_id, "app.operation_id": run.operation_id },
|
|
69
|
+
events: [], resource: { [BROWSER_TRACE_SOURCE_KEY]: "server" }
|
|
70
|
+
} }, { isRoot: true });
|
|
71
|
+
if (!committed) {
|
|
72
|
+
throw new RunsError("invalid_input", "App run root could not be recorded");
|
|
73
|
+
}
|
|
74
|
+
publishCommittedRunTraceUpdate(userId, committed);
|
|
75
|
+
// Both browser kernel hosts construct ProcessingContext without a secret resolver.
|
|
76
|
+
// Hosted credentials can only enter server execution, whose scopes carry their own sets.
|
|
77
|
+
rememberBrowserTracePolicy({ userId, runId: run.id, traceId: run.trace_id, origin: run.origin, secretValues: new Set(), policy: { contentSuppressed: false } });
|
|
78
|
+
return { root_span_id: spanId };
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
await settleAppRun(userId, run.id, { status: "failed", error: "Browser execution could not start", actualUsd: 0, knownLlmUsd: 0, updateInstance: false });
|
|
82
|
+
throw error;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/** Close from the stored start, so reloads and server restarts do not lose the terminal root. */
|
|
86
|
+
export async function finishBrowserAppRunTrace(userId, id, status) {
|
|
87
|
+
const root = await getBrowserAppRunRoot(userId, id);
|
|
88
|
+
if (!root) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const registration = await resolveRunReader(userId, id);
|
|
92
|
+
if (!registration) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const [stored] = await queryRunReaderSpans(userId, registration, { spanIds: [root.span_id] });
|
|
96
|
+
if (stored?.update_kind === "span_ended") {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const end = Math.max(Date.now(), root.start_time_ms);
|
|
100
|
+
const committed = await writeRunTraceUpdate(userId, registration.id, { kind: "span_ended", record: {
|
|
101
|
+
...root, end_time_ms: end, duration_ms: end - root.start_time_ms, status: { code: status === "completed" ? "OK" : "ERROR" }
|
|
102
|
+
} });
|
|
103
|
+
if (committed) {
|
|
104
|
+
publishCommittedRunTraceUpdate(userId, committed);
|
|
105
|
+
}
|
|
106
|
+
expireBrowserTracePolicy(root.trace_id);
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=browser-app-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-app-run.js","sourceRoot":"","sources":["../src/browser-app-run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type BrowserRunSpansResult } from "@nodetool-ai/protocol";
|
|
2
|
+
/** Owner-only browser ingestion shares durable storage, caps and redaction with server spans. */
|
|
3
|
+
export declare function ingestBrowserRunSpans(userId: string, id: string, input: unknown): Promise<BrowserRunSpansResult>;
|
|
4
|
+
//# sourceMappingURL=browser-run-spans.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-run-spans.d.ts","sourceRoot":"","sources":["../src/browser-run-spans.ts"],"names":[],"mappings":"AAAA,OAAO,EAEuB,KAAK,qBAAqB,EACvD,MAAM,uBAAuB,CAAC;AAM/B,iGAAiG;AACjG,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA6EtH"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { BROWSER_TRACE_BODY_BYTE_LIMIT, BROWSER_TRACE_CLOSE_WINDOW_MS, BROWSER_TRACE_CLOCK_SKEW_MS, BROWSER_TRACE_SOURCE_KEY, browserRunSpansInputSchema } from "@nodetool-ai/protocol";
|
|
2
|
+
import { getAppRun, resolveRunReader, queryRunReaderSpans, writeRunTraceUpdate, markRunTraceIncomplete, RunTraceError } from "@nodetool-ai/models";
|
|
3
|
+
import { browserTracePolicy } from "./browser-trace-policy.js";
|
|
4
|
+
import { publishCommittedRunTraceUpdate } from "./run-trace-store.js";
|
|
5
|
+
import { RunsError } from "./runs.js";
|
|
6
|
+
/** Owner-only browser ingestion shares durable storage, caps and redaction with server spans. */
|
|
7
|
+
export async function ingestBrowserRunSpans(userId, id, input) {
|
|
8
|
+
const parsed = browserRunSpansInputSchema.safeParse(input);
|
|
9
|
+
if (!parsed.success) {
|
|
10
|
+
throw new RunsError("invalid_input", parsed.error.issues[0]?.message ?? "Invalid browser spans");
|
|
11
|
+
}
|
|
12
|
+
if (Buffer.byteLength(JSON.stringify(parsed.data)) > BROWSER_TRACE_BODY_BYTE_LIMIT) {
|
|
13
|
+
throw new RunsError("invalid_input", "Browser span batch exceeds byte limit");
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const run = await resolveRunReader(userId, id);
|
|
17
|
+
if (!run) {
|
|
18
|
+
throw new RunsError("not_found", "Run not found");
|
|
19
|
+
}
|
|
20
|
+
const now = Date.now();
|
|
21
|
+
if (run.origin === "public" || (run.ended_at && Date.parse(run.ended_at) < now - BROWSER_TRACE_CLOSE_WINDOW_MS)) {
|
|
22
|
+
throw new RunsError("invalid_input", "Run does not accept browser spans");
|
|
23
|
+
}
|
|
24
|
+
const rows = await queryRunReaderSpans(userId, run);
|
|
25
|
+
const byId = new Map(rows.map((row) => [row.span_id, row]));
|
|
26
|
+
const parents = new Map(rows.map((row) => [row.span_id, row.metadata.parent_span_id]));
|
|
27
|
+
const batchIds = new Set();
|
|
28
|
+
for (const record of parsed.data.records) {
|
|
29
|
+
if (record.trace_id !== run.trace_id || record.span_id === run.root_span_id ||
|
|
30
|
+
record.start_time_ms < Date.parse(run.started_at) - BROWSER_TRACE_CLOSE_WINDOW_MS ||
|
|
31
|
+
record.end_time_ms > now + BROWSER_TRACE_CLOCK_SKEW_MS ||
|
|
32
|
+
(run.ended_at && record.end_time_ms > Date.parse(run.ended_at) + BROWSER_TRACE_CLOSE_WINDOW_MS)) {
|
|
33
|
+
throw new RunsError("invalid_input", "Span does not match run identity or timing");
|
|
34
|
+
}
|
|
35
|
+
const existing = byId.get(record.span_id);
|
|
36
|
+
if (existing && existing.metadata.resource[BROWSER_TRACE_SOURCE_KEY] !== "browser") {
|
|
37
|
+
throw new RunsError("invalid_input", "Browser span cannot overwrite a server span");
|
|
38
|
+
}
|
|
39
|
+
if (batchIds.has(record.span_id)) {
|
|
40
|
+
throw new RunsError("invalid_input", "Duplicate span id in batch");
|
|
41
|
+
}
|
|
42
|
+
batchIds.add(record.span_id);
|
|
43
|
+
if (!existing) {
|
|
44
|
+
parents.set(record.span_id, record.parent_span_id);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const visited = new Set();
|
|
48
|
+
for (const start of batchIds) {
|
|
49
|
+
const path = new Set();
|
|
50
|
+
let current = start;
|
|
51
|
+
while (current && !visited.has(current)) {
|
|
52
|
+
if (path.has(current)) {
|
|
53
|
+
throw new RunsError("invalid_input", "Cyclic browser span ancestry");
|
|
54
|
+
}
|
|
55
|
+
path.add(current);
|
|
56
|
+
current = parents.get(current);
|
|
57
|
+
}
|
|
58
|
+
for (const spanId of path) {
|
|
59
|
+
visited.add(spanId);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const policy = browserTracePolicy(userId, run.trace_id);
|
|
63
|
+
const root = run.root_span_id ? byId.get(run.root_span_id)?.metadata : undefined;
|
|
64
|
+
const browserRoot = run.kind === "app" && root?.name === "app.run" && root.resource[BROWSER_TRACE_SOURCE_KEY] === "server" && root.attributes["app.execution.location"] === "browser";
|
|
65
|
+
if (run.kind === "app") {
|
|
66
|
+
const appRun = await getAppRun(userId, run.source_id);
|
|
67
|
+
// Server scopes can resolve more secrets until execution actually settles.
|
|
68
|
+
if (!appRun || (appRun.status === "running" && !browserRoot)) {
|
|
69
|
+
policy.contentSuppressed = true;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
else if (run.status === "running") {
|
|
73
|
+
policy.contentSuppressed = true;
|
|
74
|
+
}
|
|
75
|
+
const result = { accepted: 0, duplicate: 0, dropped: 0 };
|
|
76
|
+
for (const record of parsed.data.records) {
|
|
77
|
+
if (byId.has(record.span_id)) {
|
|
78
|
+
result.duplicate++;
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (record.name === "ui.action" && record.attributes["nodetool.trace.incomplete"] === true) {
|
|
82
|
+
await markRunTraceIncomplete(userId, run.trace_id, "Browser recording lost spans");
|
|
83
|
+
}
|
|
84
|
+
const attributes = { ...record.attributes };
|
|
85
|
+
if (policy.contentSuppressed) {
|
|
86
|
+
attributes["nodetool.trace.content_suppressed"] = true;
|
|
87
|
+
}
|
|
88
|
+
const committed = await writeRunTraceUpdate(userId, run.id, {
|
|
89
|
+
kind: "span_ended",
|
|
90
|
+
record: { ...record, resource: { ...record.resource, [BROWSER_TRACE_SOURCE_KEY]: "browser" }, attributes }
|
|
91
|
+
}, { ...policy, browserOnly: true });
|
|
92
|
+
if (committed) {
|
|
93
|
+
result.accepted++;
|
|
94
|
+
publishCommittedRunTraceUpdate(userId, committed);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
const winner = await queryRunReaderSpans(userId, run, { spanIds: [record.span_id] });
|
|
98
|
+
if (winner[0]?.metadata.resource[BROWSER_TRACE_SOURCE_KEY] === "browser") {
|
|
99
|
+
result.duplicate++;
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
result.dropped++;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
if (error instanceof RunTraceError) {
|
|
110
|
+
throw new RunsError(error.code === "conflict" ? "invalid_input" : error.code, error.message);
|
|
111
|
+
}
|
|
112
|
+
throw error;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=browser-run-spans.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-run-spans.js","sourceRoot":"","sources":["../src/browser-run-spans.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { RunTraceScope } from "@nodetool-ai/runtime";
|
|
2
|
+
interface BrowserTracePolicy {
|
|
3
|
+
secretValues: ReadonlySet<string>;
|
|
4
|
+
contentSuppressed: boolean;
|
|
5
|
+
}
|
|
6
|
+
/** Keep shared secret sets in memory only, including secrets resolved after registration. */
|
|
7
|
+
export declare function rememberBrowserTracePolicy(scope: RunTraceScope, terminal?: boolean): void;
|
|
8
|
+
/** Another worker or a restarted host cannot recover run-only secrets, so content fails closed. */
|
|
9
|
+
export declare function browserTracePolicy(userId: string, traceId: string): BrowserTracePolicy;
|
|
10
|
+
export declare function expireBrowserTracePolicy(traceId: string): void;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=browser-trace-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-trace-policy.d.ts","sourceRoot":"","sources":["../src/browser-trace-policy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAG1D,UAAU,kBAAkB;IAAG,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAAC,iBAAiB,EAAE,OAAO,CAAA;CAAE;AAW9F,6FAA6F;AAC7F,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,UAAQ,GAAG,IAAI,CAQvF;AAED,mGAAmG;AACnG,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAOtF;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAG9D"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { BROWSER_TRACE_CLOSE_WINDOW_MS } from "@nodetool-ai/protocol";
|
|
2
|
+
const policies = new Map();
|
|
3
|
+
const POLICY_LIMIT = 1_000;
|
|
4
|
+
const ACTIVE_POLICY_MS = 24 * 60 * 60_000;
|
|
5
|
+
const sweep = setInterval(() => {
|
|
6
|
+
for (const [id, entry] of policies) {
|
|
7
|
+
if (entry.expiresAt < Date.now()) {
|
|
8
|
+
policies.delete(id);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}, 60_000);
|
|
12
|
+
sweep.unref();
|
|
13
|
+
/** Keep shared secret sets in memory only, including secrets resolved after registration. */
|
|
14
|
+
export function rememberBrowserTracePolicy(scope, terminal = false) {
|
|
15
|
+
const existing = policies.get(scope.traceId);
|
|
16
|
+
policies.delete(scope.traceId);
|
|
17
|
+
policies.set(scope.traceId, { scope, expiresAt: terminal ? Date.now() + BROWSER_TRACE_CLOSE_WINDOW_MS : existing?.expiresAt ?? Date.now() + ACTIVE_POLICY_MS });
|
|
18
|
+
if (policies.size > POLICY_LIMIT) {
|
|
19
|
+
const oldest = policies.keys().next().value;
|
|
20
|
+
if (oldest) {
|
|
21
|
+
policies.delete(oldest);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/** Another worker or a restarted host cannot recover run-only secrets, so content fails closed. */
|
|
26
|
+
export function browserTracePolicy(userId, traceId) {
|
|
27
|
+
const entry = policies.get(traceId);
|
|
28
|
+
if (!entry || entry.expiresAt < Date.now() || entry.scope.userId !== userId) {
|
|
29
|
+
policies.delete(traceId);
|
|
30
|
+
return { secretValues: new Set(), contentSuppressed: true };
|
|
31
|
+
}
|
|
32
|
+
return { secretValues: entry.scope.secretValues, contentSuppressed: entry.scope.policy.contentSuppressed };
|
|
33
|
+
}
|
|
34
|
+
export function expireBrowserTracePolicy(traceId) {
|
|
35
|
+
const entry = policies.get(traceId);
|
|
36
|
+
if (entry) {
|
|
37
|
+
entry.expiresAt = Date.now() + BROWSER_TRACE_CLOSE_WINDOW_MS;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=browser-trace-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-trace-policy.js","sourceRoot":"","sources":["../src/browser-trace-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AAKtE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAuB,CAAC;AAChD,MAAM,YAAY,GAAG,KAAK,CAAC;AAC3B,MAAM,gBAAgB,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;AAC1C,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;IAC7B,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,QAAQ,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAAC,CAAC;IAC5D,CAAC;AACH,CAAC,EAAE,MAAM,CAAC,CAAC;AACX,KAAK,CAAC,KAAK,EAAE,CAAC;AAEd,6FAA6F;AAC7F,MAAM,UAAU,0BAA0B,CAAC,KAAoB,EAAE,QAAQ,GAAG,KAAK;IAC/E,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7C,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,6BAA6B,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,EAAE,CAAC,CAAC;IAChK,IAAI,QAAQ,CAAC,IAAI,GAAG,YAAY,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC5C,IAAI,MAAM,EAAE,CAAC;YAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,OAAe;IAChE,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC5E,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACzB,OAAO,EAAE,YAAY,EAAE,IAAI,GAAG,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC;IAC9D,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,KAAK,CAAC,KAAK,CAAC,YAAY,EAAE,iBAAiB,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;AAC7G,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAe;IACtD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,KAAK,EAAE,CAAC;QAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,6BAA6B,CAAC;IAAC,CAAC;AAC9E,CAAC"}
|
package/dist/cost-ledger.d.ts
CHANGED
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
* is auditable even when the estimate is imperfect.
|
|
28
28
|
*/
|
|
29
29
|
import { Prediction } from "@nodetool-ai/models";
|
|
30
|
+
import { type AppRunContext } from "@nodetool-ai/runtime";
|
|
30
31
|
import type { ProcessingMessage, ProviderCost } from "@nodetool-ai/protocol";
|
|
31
32
|
import { type GenerationTrackerState } from "./generation-tracker.js";
|
|
32
33
|
/** Whether a capability is billed per unit of output (and so belongs here). */
|
|
@@ -76,6 +77,7 @@ export declare function priceGeneration(spend: GenerationSpend): PricedGeneratio
|
|
|
76
77
|
export declare function recordGenerationSpend(spend: GenerationSpend): Promise<Prediction | null>;
|
|
77
78
|
/** A charge a node reported for itself, as it rides out on `node_update`. */
|
|
78
79
|
export interface NodeCostSpend {
|
|
80
|
+
appRunContext?: AppRunContext;
|
|
79
81
|
userId: string;
|
|
80
82
|
cost: ProviderCost;
|
|
81
83
|
nodeId: string;
|
|
@@ -95,6 +97,7 @@ export interface NodeCostSpend {
|
|
|
95
97
|
*/
|
|
96
98
|
export declare function recordNodeProviderCost(spend: NodeCostSpend): Promise<Prediction | null>;
|
|
97
99
|
export interface RunCostLedgerOptions {
|
|
100
|
+
appRunContext?: AppRunContext;
|
|
98
101
|
userId: string;
|
|
99
102
|
workflowId: string | null;
|
|
100
103
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cost-ledger.d.ts","sourceRoot":"","sources":["../src/cost-ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;
|
|
1
|
+
{"version":3,"file":"cost-ledger.d.ts","sourceRoot":"","sources":["../src/cost-ledger.ts"],"names":[],"mappings":"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"}
|
package/dist/cost-ledger.js
CHANGED
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
* catalog's own breakdown in `metadata`) so a per-second or per-megapixel row
|
|
27
27
|
* is auditable even when the estimate is imperfect.
|
|
28
28
|
*/
|
|
29
|
+
import { appRunGenerationMetadata } from "./app-run-generation.js";
|
|
29
30
|
import { createLogger } from "@nodetool-ai/config";
|
|
30
31
|
import { Prediction } from "@nodetool-ai/models";
|
|
31
32
|
import { getModelUnitPrice } from "@nodetool-ai/model-pricing";
|
|
@@ -171,6 +172,9 @@ export async function recordNodeProviderCost(spend) {
|
|
|
171
172
|
project_id: spend.projectId ?? null,
|
|
172
173
|
document_id: spend.documentId ?? null,
|
|
173
174
|
status: "completed",
|
|
175
|
+
metadata: appRunGenerationMetadata(cost.input_tokens != null || cost.output_tokens != null
|
|
176
|
+
? undefined
|
|
177
|
+
: spend.appRunContext),
|
|
174
178
|
cost: cost.amount,
|
|
175
179
|
currency: cost.currency ?? cost.unit ?? null,
|
|
176
180
|
billing_unit: cost.billing_unit ?? null,
|
|
@@ -240,10 +244,26 @@ export function nodeTypeLookup(nodes) {
|
|
|
240
244
|
export function attachRunCostLedger(context, options) {
|
|
241
245
|
const state = createTrackerState();
|
|
242
246
|
const pending = new Set();
|
|
247
|
+
const generationWrites = new Map();
|
|
243
248
|
const detach = context.addMessageListener((msg) => {
|
|
244
|
-
const
|
|
249
|
+
const generationId = msg.type === "prediction" ? msg.id : null;
|
|
250
|
+
const previous = generationId
|
|
251
|
+
? generationWrites.get(generationId)
|
|
252
|
+
: undefined;
|
|
253
|
+
const operation = previous
|
|
254
|
+
? previous.then(() => recordFromMessage(msg, options, state))
|
|
255
|
+
: recordFromMessage(msg, options, state);
|
|
256
|
+
const write = operation
|
|
245
257
|
.catch(() => undefined)
|
|
246
|
-
.finally(() =>
|
|
258
|
+
.finally(() => {
|
|
259
|
+
pending.delete(write);
|
|
260
|
+
if (generationId && generationWrites.get(generationId) === write) {
|
|
261
|
+
generationWrites.delete(generationId);
|
|
262
|
+
}
|
|
263
|
+
});
|
|
264
|
+
if (generationId) {
|
|
265
|
+
generationWrites.set(generationId, write);
|
|
266
|
+
}
|
|
247
267
|
pending.add(write);
|
|
248
268
|
});
|
|
249
269
|
return Object.assign(detach, {
|
|
@@ -269,6 +289,7 @@ export async function recordFromMessage(msg, options, state = createTrackerState
|
|
|
269
289
|
}
|
|
270
290
|
await recordNodeProviderCost({
|
|
271
291
|
userId: options.userId,
|
|
292
|
+
appRunContext: options.appRunContext,
|
|
272
293
|
cost: msg.provider_cost,
|
|
273
294
|
nodeId: msg.node_id,
|
|
274
295
|
nodeType: msg.node_type || options.nodeType?.(msg.node_id) || "",
|