@nodetool-ai/execution 0.8.1 → 0.8.2

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 (158) hide show
  1. package/README.md +23 -127
  2. package/dist/.nodetool-build-stamp +1 -1
  3. package/dist/app-debug/app-spec.d.ts.map +1 -1
  4. package/dist/app-debug/app-spec.js +3 -0
  5. package/dist/app-debug/app-spec.js.map +1 -1
  6. package/dist/app-debug/application-target.d.ts +1 -1
  7. package/dist/app-debug/application-target.d.ts.map +1 -1
  8. package/dist/app-debug/application-target.js +5 -3
  9. package/dist/app-debug/application-target.js.map +1 -1
  10. package/dist/app-debug/index.d.ts +4 -2
  11. package/dist/app-debug/index.d.ts.map +1 -1
  12. package/dist/app-debug/index.js +3 -2
  13. package/dist/app-debug/index.js.map +1 -1
  14. package/dist/app-debug/run-recording.d.ts +20 -0
  15. package/dist/app-debug/run-recording.d.ts.map +1 -0
  16. package/dist/app-debug/run-recording.js +105 -0
  17. package/dist/app-debug/run-recording.js.map +1 -0
  18. package/dist/app-debug/runtime.d.ts +2 -0
  19. package/dist/app-debug/runtime.d.ts.map +1 -1
  20. package/dist/app-debug/runtime.js +14 -3
  21. package/dist/app-debug/runtime.js.map +1 -1
  22. package/dist/app-debug/simulate.d.ts +10 -1
  23. package/dist/app-debug/simulate.d.ts.map +1 -1
  24. package/dist/app-debug/simulate.js +57 -26
  25. package/dist/app-debug/simulate.js.map +1 -1
  26. package/dist/app-debug/summarize.d.ts +1 -0
  27. package/dist/app-debug/summarize.d.ts.map +1 -1
  28. package/dist/app-debug/summarize.js +1 -0
  29. package/dist/app-debug/summarize.js.map +1 -1
  30. package/dist/app-debug/types.d.ts +6 -4
  31. package/dist/app-debug/types.d.ts.map +1 -1
  32. package/dist/app-run-generation.d.ts +8 -0
  33. package/dist/app-run-generation.d.ts.map +1 -0
  34. package/dist/app-run-generation.js +61 -0
  35. package/dist/app-run-generation.js.map +1 -0
  36. package/dist/browser-app-run.d.ts +10 -0
  37. package/dist/browser-app-run.d.ts.map +1 -0
  38. package/dist/browser-app-run.js +108 -0
  39. package/dist/browser-app-run.js.map +1 -0
  40. package/dist/browser-run-spans.d.ts +4 -0
  41. package/dist/browser-run-spans.d.ts.map +1 -0
  42. package/dist/browser-run-spans.js +115 -0
  43. package/dist/browser-run-spans.js.map +1 -0
  44. package/dist/browser-trace-policy.d.ts +12 -0
  45. package/dist/browser-trace-policy.d.ts.map +1 -0
  46. package/dist/browser-trace-policy.js +40 -0
  47. package/dist/browser-trace-policy.js.map +1 -0
  48. package/dist/cost-ledger.d.ts +3 -0
  49. package/dist/cost-ledger.d.ts.map +1 -1
  50. package/dist/cost-ledger.js +23 -2
  51. package/dist/cost-ledger.js.map +1 -1
  52. package/dist/debug/types.d.ts +1 -0
  53. package/dist/debug/types.d.ts.map +1 -1
  54. package/dist/generation-lifecycle.d.ts +5 -4
  55. package/dist/generation-lifecycle.d.ts.map +1 -1
  56. package/dist/generation-lifecycle.js +71 -10
  57. package/dist/generation-lifecycle.js.map +1 -1
  58. package/dist/generation-recovery-worker.d.ts.map +1 -1
  59. package/dist/generation-recovery-worker.js +2 -0
  60. package/dist/generation-recovery-worker.js.map +1 -1
  61. package/dist/generation-tracker.d.ts +2 -15
  62. package/dist/generation-tracker.d.ts.map +1 -1
  63. package/dist/generation-tracker.js +92 -6
  64. package/dist/generation-tracker.js.map +1 -1
  65. package/dist/index.d.ts +9 -2
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +6 -1
  68. package/dist/index.js.map +1 -1
  69. package/dist/js-script-debug/index.d.ts +1 -0
  70. package/dist/js-script-debug/index.d.ts.map +1 -1
  71. package/dist/js-script-debug/index.js +1 -0
  72. package/dist/js-script-debug/index.js.map +1 -1
  73. package/dist/js-script-debug/type-check.d.ts +16 -0
  74. package/dist/js-script-debug/type-check.d.ts.map +1 -0
  75. package/dist/js-script-debug/type-check.js +139 -0
  76. package/dist/js-script-debug/type-check.js.map +1 -0
  77. package/dist/js-script-debug/validate.d.ts +8 -0
  78. package/dist/js-script-debug/validate.d.ts.map +1 -1
  79. package/dist/js-script-debug/validate.js +4 -0
  80. package/dist/js-script-debug/validate.js.map +1 -1
  81. package/dist/message-stream.d.ts +1 -32
  82. package/dist/message-stream.d.ts.map +1 -1
  83. package/dist/message-stream.js +1 -57
  84. package/dist/message-stream.js.map +1 -1
  85. package/dist/preflight.d.ts +43 -2
  86. package/dist/preflight.d.ts.map +1 -1
  87. package/dist/preflight.js +78 -4
  88. package/dist/preflight.js.map +1 -1
  89. package/dist/run-trace-store.d.ts +9 -0
  90. package/dist/run-trace-store.d.ts.map +1 -0
  91. package/dist/run-trace-store.js +57 -0
  92. package/dist/run-trace-store.js.map +1 -0
  93. package/dist/runs.d.ts +16 -0
  94. package/dist/runs.d.ts.map +1 -0
  95. package/dist/runs.js +431 -0
  96. package/dist/runs.js.map +1 -0
  97. package/dist/service/app-debug-service.d.ts +4 -2
  98. package/dist/service/app-debug-service.d.ts.map +1 -1
  99. package/dist/service/app-debug-service.js +73 -31
  100. package/dist/service/app-debug-service.js.map +1 -1
  101. package/dist/service/app-operation.d.ts +38 -0
  102. package/dist/service/app-operation.d.ts.map +1 -0
  103. package/dist/service/app-operation.js +269 -0
  104. package/dist/service/app-operation.js.map +1 -0
  105. package/dist/service/app-run-server.d.ts +3 -1
  106. package/dist/service/app-run-server.d.ts.map +1 -1
  107. package/dist/service/app-run-server.js +22 -14
  108. package/dist/service/app-run-server.js.map +1 -1
  109. package/dist/service/index.d.ts +4 -0
  110. package/dist/service/index.d.ts.map +1 -1
  111. package/dist/service/index.js +2 -0
  112. package/dist/service/index.js.map +1 -1
  113. package/dist/service/run-trace-lifecycle.d.ts +34 -0
  114. package/dist/service/run-trace-lifecycle.d.ts.map +1 -0
  115. package/dist/service/run-trace-lifecycle.js +135 -0
  116. package/dist/service/run-trace-lifecycle.js.map +1 -0
  117. package/dist/service/workflow-run.d.ts +5 -16
  118. package/dist/service/workflow-run.d.ts.map +1 -1
  119. package/dist/service/workflow-run.js +54 -52
  120. package/dist/service/workflow-run.js.map +1 -1
  121. package/dist/session.d.ts +1 -1
  122. package/dist/session.d.ts.map +1 -1
  123. package/dist/session.js +109 -100
  124. package/dist/session.js.map +1 -1
  125. package/dist/sketch-debug/markdown.d.ts.map +1 -1
  126. package/dist/sketch-debug/markdown.js +1 -0
  127. package/dist/sketch-debug/markdown.js.map +1 -1
  128. package/dist/sketch-debug/report.d.ts.map +1 -1
  129. package/dist/sketch-debug/report.js +4 -4
  130. package/dist/sketch-debug/report.js.map +1 -1
  131. package/dist/sketch-debug/types.d.ts +2 -0
  132. package/dist/sketch-debug/types.d.ts.map +1 -1
  133. package/dist/timeline-debug/frame-geometry.d.ts +118 -0
  134. package/dist/timeline-debug/frame-geometry.d.ts.map +1 -0
  135. package/dist/timeline-debug/frame-geometry.js +231 -0
  136. package/dist/timeline-debug/frame-geometry.js.map +1 -0
  137. package/dist/timeline-debug/index.d.ts +1 -0
  138. package/dist/timeline-debug/index.d.ts.map +1 -1
  139. package/dist/timeline-debug/index.js +1 -0
  140. package/dist/timeline-debug/index.js.map +1 -1
  141. package/dist/timeline-debug/legibility.d.ts +8 -4
  142. package/dist/timeline-debug/legibility.d.ts.map +1 -1
  143. package/dist/timeline-debug/legibility.js +47 -18
  144. package/dist/timeline-debug/legibility.js.map +1 -1
  145. package/dist/timeline-debug/score.d.ts +110 -0
  146. package/dist/timeline-debug/score.d.ts.map +1 -0
  147. package/dist/timeline-debug/score.js +231 -0
  148. package/dist/timeline-debug/score.js.map +1 -0
  149. package/dist/timeline-debug/showcase.d.ts +12 -0
  150. package/dist/timeline-debug/showcase.d.ts.map +1 -1
  151. package/dist/timeline-debug/showcase.js +669 -13
  152. package/dist/timeline-debug/showcase.js.map +1 -1
  153. package/dist/timeline-debug/validate.d.ts.map +1 -1
  154. package/dist/timeline-debug/validate.js +121 -2
  155. package/dist/timeline-debug/validate.js.map +1 -1
  156. package/dist/types.d.ts +18 -10
  157. package/dist/types.d.ts.map +1 -1
  158. package/package.json +13 -13
@@ -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
- /** Graphs the target carries, keyed by the id its operations reference. */
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
- * JS scripts the target carries, keyed the same way — a bundle ships the
43
- * document of every script version its operations pin, so a script operation
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":"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"}
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":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACL,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAC7I,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,2BAA2B,EAAoB,MAAM,uBAAuB,CAAC;AAC5I,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,8BAA8B,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,0BAA0B,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAEjG,oGAAoG;AACpG,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAc,EAAE,EAAU;IACnE,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IAChG,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACzG,OAAO,IAAI,EAAE,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,wBAAwB,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,wBAAwB,CAAC,KAAK,SAAS;QAC3K,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3B,CAAC;AAED,oGAAoG;AACpG,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAc,EAAE,EAAU,EAAE,KAAc;IACjF,IAAI,CAAC;QAAC,OAAO,MAAM,eAAe,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;IAAC,CAAC;IACxD,OAAO,KAAK,EAAE,CAAC;QACb,IAAI,KAAK,YAAY,WAAW,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;YACnE,MAAM,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3I,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,MAAc,EAAE,EAAU,EAAE,KAAc;IACvE,MAAM,MAAM,GAAG,0BAA0B,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC3D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAAC,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,6BAA6B,CAAC,CAAC;IAAC,CAAC;IAC7F,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAAC,MAAM,IAAI,SAAS,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;IAAC,CAAC;IACpH,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,OAAO,KAAK,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC1H,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,oDAAoD,CAAC,CAAC;IAC7F,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC5D,IAAI,QAAQ,IAAI,QAAQ,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;QAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;IAAC,CAAC;IACpG,IAAI,GAAG,CAAC,oBAAoB,IAAI,YAAY,CAAC,YAAY,EAAE,CAAC;QAAC,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,yBAAyB,CAAC,CAAC;IAAC,CAAC;IAC/H,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC1F,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,wBAAwB,CAAC,KAAK,SAAS,CAAC,EAAE,CAAC;QACzH,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,2CAA2C,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,CAAC,MAAM,WAAW,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,2BAA2B,CAAC,EAAE,CAAC;QAAC,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,yBAAyB,CAAC,CAAC;IAAC,CAAC;IACzI,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,WAAW,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO;YAC/C,CAAC,GAAG,CAAC,QAAQ,KAAK,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YAChG,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,kEAAkE,CAAC,CAAC;QAC3G,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE;gBAC1F,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU;gBACpG,aAAa,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;gBACnF,UAAU,EAAE,EAAE,wBAAwB,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,CAAC,EAAE,EAAE,iBAAiB,EAAE,GAAG,CAAC,WAAW,EAAE,kBAAkB,EAAE,GAAG,CAAC,YAAY,EAAE;gBACnJ,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,wBAAwB,CAAC,EAAE,QAAQ,EAAE;aAC/D,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACvB,IAAI,CAAC,SAAS,EAAE,CAAC;YAAC,MAAM,IAAI,SAAS,CAAC,eAAe,EAAE,oCAAoC,CAAC,CAAC;QAAC,CAAC;QAC/F,8BAA8B,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAClD,mFAAmF;QACnF,yFAAyF;QACzF,0BAA0B,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAChK,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;IAClC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,mCAAmC,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1J,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,MAAc,EAAE,EAAU,EAAE,MAA4C;IACrH,MAAM,IAAI,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACpD,IAAI,CAAC,IAAI,EAAE,CAAC;QAAC,OAAO;IAAC,CAAC;IACtB,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxD,IAAI,CAAC,YAAY,EAAE,CAAC;QAAC,OAAO;IAAC,CAAC;IAC9B,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC9F,IAAI,MAAM,EAAE,WAAW,KAAK,YAAY,EAAE,CAAC;QAAC,OAAO;IAAC,CAAC;IACrD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE;YACjG,GAAG,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE;SAC5H,EAAE,CAAC,CAAC;IACL,IAAI,SAAS,EAAE,CAAC;QAAC,8BAA8B,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAAC,CAAC;IACrE,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC1C,CAAC"}
@@ -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"}
@@ -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":"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"}
1
+ {"version":3,"file":"cost-ledger.d.ts","sourceRoot":"","sources":["../src/cost-ledger.ts"],"names":[],"mappings":"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"}
@@ -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 write = recordFromMessage(msg, options, state)
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(() => pending.delete(write));
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) || "",