pipework 0.53.0 → 0.55.0

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 (63) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/REFERENCE.md +121 -0
  3. package/dist/core/config/load.d.ts +2 -0
  4. package/dist/core/config/load.d.ts.map +1 -1
  5. package/dist/core/config/load.js +1 -0
  6. package/dist/core/config/load.js.map +1 -1
  7. package/dist/core/config/namespace.d.ts +2 -0
  8. package/dist/core/config/namespace.d.ts.map +1 -1
  9. package/dist/core/config/schema.d.ts +5 -0
  10. package/dist/core/config/schema.d.ts.map +1 -1
  11. package/dist/core/config/schema.js +3 -0
  12. package/dist/core/config/schema.js.map +1 -1
  13. package/dist/data/migrate/internal-definitions.d.ts.map +1 -1
  14. package/dist/data/migrate/internal-definitions.js +6 -0
  15. package/dist/data/migrate/internal-definitions.js.map +1 -1
  16. package/dist/index.d.ts +4 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +2 -0
  19. package/dist/index.js.map +1 -1
  20. package/dist/infra/access-links/code.d.ts +20 -0
  21. package/dist/infra/access-links/code.d.ts.map +1 -0
  22. package/dist/infra/access-links/code.js +47 -0
  23. package/dist/infra/access-links/code.js.map +1 -0
  24. package/dist/infra/access-links/handle.d.ts +127 -0
  25. package/dist/infra/access-links/handle.d.ts.map +1 -0
  26. package/dist/infra/access-links/handle.js +411 -0
  27. package/dist/infra/access-links/handle.js.map +1 -0
  28. package/dist/infra/access-links/index.d.ts +5 -0
  29. package/dist/infra/access-links/index.d.ts.map +1 -0
  30. package/dist/infra/access-links/index.js +2 -0
  31. package/dist/infra/access-links/index.js.map +1 -0
  32. package/dist/infra/access-links/namespace.d.ts +7 -0
  33. package/dist/infra/access-links/namespace.d.ts.map +1 -0
  34. package/dist/infra/access-links/namespace.js +7 -0
  35. package/dist/infra/access-links/namespace.js.map +1 -0
  36. package/dist/infra/access-links/rate-limit.d.ts +10 -0
  37. package/dist/infra/access-links/rate-limit.d.ts.map +1 -0
  38. package/dist/infra/access-links/rate-limit.js +28 -0
  39. package/dist/infra/access-links/rate-limit.js.map +1 -0
  40. package/dist/infra/access-links/schema.d.ts +117 -0
  41. package/dist/infra/access-links/schema.d.ts.map +1 -0
  42. package/dist/infra/access-links/schema.js +50 -0
  43. package/dist/infra/access-links/schema.js.map +1 -0
  44. package/dist/trace/entry/open-trace.d.ts.map +1 -1
  45. package/dist/trace/entry/open-trace.js +1 -0
  46. package/dist/trace/entry/open-trace.js.map +1 -1
  47. package/dist/trace/external/record.d.ts +11 -0
  48. package/dist/trace/external/record.d.ts.map +1 -0
  49. package/dist/trace/external/record.js +156 -0
  50. package/dist/trace/external/record.js.map +1 -0
  51. package/dist/trace/external/report.d.ts +34 -0
  52. package/dist/trace/external/report.d.ts.map +1 -0
  53. package/dist/trace/external/report.js +47 -0
  54. package/dist/trace/external/report.js.map +1 -0
  55. package/dist/trace/namespace.d.ts +11 -0
  56. package/dist/trace/namespace.d.ts.map +1 -0
  57. package/dist/trace/namespace.js +11 -0
  58. package/dist/trace/namespace.js.map +1 -0
  59. package/dist/trace/runtime/step-buffer.d.ts +30 -0
  60. package/dist/trace/runtime/step-buffer.d.ts.map +1 -1
  61. package/dist/trace/runtime/step-buffer.js +30 -1
  62. package/dist/trace/runtime/step-buffer.js.map +1 -1
  63. package/package.json +1 -1
@@ -0,0 +1,28 @@
1
+ // In-process sliding-window limiter. State lives in this process's memory:
2
+ // with N server processes the effective limit per client is up to N times
3
+ // `max`, and it resets on restart.
4
+ export function createRateLimiter(config) {
5
+ const hits = new Map();
6
+ let lastSweep = 0;
7
+ return {
8
+ hit(client, now = Date.now()) {
9
+ if (now - lastSweep > config.windowMs) {
10
+ lastSweep = now;
11
+ for (const [key, times] of hits) {
12
+ if (times.length === 0 || times[times.length - 1] <= now - config.windowMs)
13
+ hits.delete(key);
14
+ }
15
+ }
16
+ const cutoff = now - config.windowMs;
17
+ const times = (hits.get(client) ?? []).filter(t => t > cutoff);
18
+ if (times.length >= config.max) {
19
+ hits.set(client, times);
20
+ return false;
21
+ }
22
+ times.push(now);
23
+ hits.set(client, times);
24
+ return true;
25
+ },
26
+ };
27
+ }
28
+ //# sourceMappingURL=rate-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../../src/infra/access-links/rate-limit.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,0EAA0E;AAC1E,mCAAmC;AAYnC,MAAM,UAAU,iBAAiB,CAAC,MAAuB;IACvD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAoB,CAAA;IACxC,IAAI,SAAS,GAAG,CAAC,CAAA;IAEjB,OAAO;QACL,GAAG,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;YAC1B,IAAI,GAAG,GAAG,SAAS,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACtC,SAAS,GAAG,GAAG,CAAA;gBACf,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;oBAChC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAE,IAAI,GAAG,GAAG,MAAM,CAAC,QAAQ;wBAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBAC/F,CAAC;YACH,CAAC;YACD,MAAM,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAA;YACpC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAA;YAC9D,IAAI,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;gBAC/B,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;gBACvB,OAAO,KAAK,CAAA;YACd,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACf,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;YACvB,OAAO,IAAI,CAAA;QACb,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,117 @@
1
+ export declare const ACCESS_LINK_USE_STATUSES: readonly ["pending", "completed", "abandoned"];
2
+ export declare const accessLinkCode: import("../../data/domain/types.js").DefinedTable<{
3
+ code: import("../../data/domain/types.js").FieldDescriptor<string, {
4
+ primaryKey: true;
5
+ }> & import("../../data/domain/field.js").FieldModifiers<string, {
6
+ primaryKey: true;
7
+ }>;
8
+ tenantId: import("../../data/domain/types.js").FieldDescriptor<string, {}> & import("../../data/domain/field.js").FieldModifiers<string, {}>;
9
+ linkId: import("../../data/domain/types.js").FieldDescriptor<string, {}> & import("../../data/domain/field.js").FieldModifiers<string, {}>;
10
+ createdAt: import("../../data/domain/types.js").FieldDescriptor<Date, {
11
+ hasDefault: true;
12
+ }> & import("../../data/domain/field.js").FieldModifiers<Date, {
13
+ hasDefault: true;
14
+ }>;
15
+ }, "access_link_code">;
16
+ export declare const accessLink: import("../../data/domain/types.js").DefinedTable<{
17
+ id: import("../../data/domain/types.js").FieldDescriptor<string, {
18
+ defaultRandom: true;
19
+ hasDefault: true;
20
+ } & {
21
+ primaryKey: true;
22
+ }> & import("../../data/domain/field.js").FieldModifiers<string, {
23
+ defaultRandom: true;
24
+ hasDefault: true;
25
+ } & {
26
+ primaryKey: true;
27
+ }>;
28
+ tenantId: import("../../data/domain/types.js").FieldDescriptor<string, {}> & import("../../data/domain/field.js").FieldModifiers<string, {}>;
29
+ code: import("../../data/domain/types.js").FieldDescriptor<string, {}> & import("../../data/domain/field.js").FieldModifiers<string, {}>;
30
+ targetType: import("../../data/domain/types.js").FieldDescriptor<string, {}> & import("../../data/domain/field.js").FieldModifiers<string, {}>;
31
+ targetId: import("../../data/domain/types.js").FieldDescriptor<string, {}> & import("../../data/domain/field.js").FieldModifiers<string, {}>;
32
+ permissions: import("../../data/domain/types.js").FieldDescriptor<import("zod/v4").JSONType, {}> & import("../../data/domain/field.js").FieldModifiers<import("zod/v4").JSONType, {}>;
33
+ note: import("../../data/domain/types.js").FieldDescriptor<string | null, {
34
+ nullable: true;
35
+ }> & import("../../data/domain/field.js").FieldModifiers<string | null, {
36
+ nullable: true;
37
+ }>;
38
+ createdBy: import("../../data/domain/types.js").FieldDescriptor<string | null, {
39
+ nullable: true;
40
+ }> & import("../../data/domain/field.js").FieldModifiers<string | null, {
41
+ nullable: true;
42
+ }>;
43
+ createdAt: import("../../data/domain/types.js").FieldDescriptor<Date, {
44
+ hasDefault: true;
45
+ }> & import("../../data/domain/field.js").FieldModifiers<Date, {
46
+ hasDefault: true;
47
+ }>;
48
+ expiresAt: import("../../data/domain/types.js").FieldDescriptor<Date | null, {
49
+ nullable: true;
50
+ }> & import("../../data/domain/field.js").FieldModifiers<Date | null, {
51
+ nullable: true;
52
+ }>;
53
+ maxUses: import("../../data/domain/types.js").FieldDescriptor<number | null, {
54
+ nullable: true;
55
+ }> & import("../../data/domain/field.js").FieldModifiers<number | null, {
56
+ nullable: true;
57
+ }>;
58
+ requireChecks: import("../../data/domain/types.js").FieldDescriptor<import("zod/v4").JSONType, {
59
+ hasDefault: true;
60
+ }> & import("../../data/domain/field.js").FieldModifiers<import("zod/v4").JSONType, {
61
+ hasDefault: true;
62
+ }>;
63
+ checkData: import("../../data/domain/types.js").FieldDescriptor<import("zod/v4").JSONType, {
64
+ nullable: true;
65
+ }> & import("../../data/domain/field.js").FieldModifiers<import("zod/v4").JSONType, {
66
+ nullable: true;
67
+ }>;
68
+ revokedAt: import("../../data/domain/types.js").FieldDescriptor<Date | null, {
69
+ nullable: true;
70
+ }> & import("../../data/domain/field.js").FieldModifiers<Date | null, {
71
+ nullable: true;
72
+ }>;
73
+ revokedBy: import("../../data/domain/types.js").FieldDescriptor<string | null, {
74
+ nullable: true;
75
+ }> & import("../../data/domain/field.js").FieldModifiers<string | null, {
76
+ nullable: true;
77
+ }>;
78
+ }, "access_link">;
79
+ export declare const accessLinkUse: import("../../data/domain/types.js").DefinedTable<{
80
+ id: import("../../data/domain/types.js").FieldDescriptor<string, {
81
+ defaultRandom: true;
82
+ hasDefault: true;
83
+ } & {
84
+ primaryKey: true;
85
+ }> & import("../../data/domain/field.js").FieldModifiers<string, {
86
+ defaultRandom: true;
87
+ hasDefault: true;
88
+ } & {
89
+ primaryKey: true;
90
+ }>;
91
+ tenantId: import("../../data/domain/types.js").FieldDescriptor<string, {}> & import("../../data/domain/field.js").FieldModifiers<string, {}>;
92
+ linkId: import("../../data/domain/types.js").FieldDescriptor<string, {}> & import("../../data/domain/field.js").FieldModifiers<string, {}>;
93
+ kind: import("../../data/domain/types.js").FieldDescriptor<string, {}> & import("../../data/domain/field.js").FieldModifiers<string, {}>;
94
+ status: import("../../data/domain/types.js").FieldDescriptor<"completed" | "pending" | "abandoned", {}> & import("../../data/domain/field.js").FieldModifiers<"completed" | "pending" | "abandoned", {}>;
95
+ startedAt: import("../../data/domain/types.js").FieldDescriptor<Date, {
96
+ hasDefault: true;
97
+ }> & import("../../data/domain/field.js").FieldModifiers<Date, {
98
+ hasDefault: true;
99
+ }>;
100
+ reservedUntil: import("../../data/domain/types.js").FieldDescriptor<Date, {}> & import("../../data/domain/field.js").FieldModifiers<Date, {}>;
101
+ completedAt: import("../../data/domain/types.js").FieldDescriptor<Date | null, {
102
+ nullable: true;
103
+ }> & import("../../data/domain/field.js").FieldModifiers<Date | null, {
104
+ nullable: true;
105
+ }>;
106
+ client: import("../../data/domain/types.js").FieldDescriptor<string | null, {
107
+ nullable: true;
108
+ }> & import("../../data/domain/field.js").FieldModifiers<string | null, {
109
+ nullable: true;
110
+ }>;
111
+ location: import("../../data/domain/types.js").FieldDescriptor<string | null, {
112
+ nullable: true;
113
+ }> & import("../../data/domain/field.js").FieldModifiers<string | null, {
114
+ nullable: true;
115
+ }>;
116
+ }, "access_link_use">;
117
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/infra/access-links/schema.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,wBAAwB,gDAAiD,CAAA;AAEtF,eAAO,MAAM,cAAc;;;;;;;;;;;;;sBAKzB,CAAA;AAEF,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAgBrB,CAAA;AAEF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAexB,CAAA"}
@@ -0,0 +1,50 @@
1
+ // The three tables behind access links. `access_link_code` is deliberately NOT
2
+ // tenant-scoped: it maps a code to its tenant so a request with no tenant can
3
+ // find where to look, and holds nothing else. `access_link` and
4
+ // `access_link_use` carry a `.tenant()` key, so generated migrations put them
5
+ // under forced row-level security.
6
+ import { define } from '../../data/domain/index.js';
7
+ import { field } from '../../data/domain/field.js';
8
+ import { schema } from '../../data/schema/namespace.js';
9
+ import { index } from '../../data/db/idx/index.js';
10
+ export const ACCESS_LINK_USE_STATUSES = ['pending', 'completed', 'abandoned'];
11
+ export const accessLinkCode = define('access_link_code', {
12
+ code: field.text().primaryKey(),
13
+ tenantId: field.uuid(),
14
+ linkId: field.uuid(),
15
+ createdAt: field.timestamp().default('now'),
16
+ });
17
+ export const accessLink = define('access_link', {
18
+ id: field.uuid().defaultRandom().primaryKey(),
19
+ tenantId: field.uuid().tenant(),
20
+ code: field.text().unique(),
21
+ targetType: field.text(),
22
+ targetId: field.text(),
23
+ permissions: field.jsonb(schema.check.json()),
24
+ note: field.text().nullable(),
25
+ createdBy: field.text().nullable(),
26
+ createdAt: field.timestamp().default('now'),
27
+ expiresAt: field.timestamp().nullable(),
28
+ maxUses: field.integer().nullable(),
29
+ requireChecks: field.jsonb(schema.check.json()).default([]),
30
+ checkData: field.jsonb(schema.check.json()).nullable(),
31
+ revokedAt: field.timestamp().nullable(),
32
+ revokedBy: field.text().nullable(),
33
+ });
34
+ export const accessLinkUse = define('access_link_use', {
35
+ id: field.uuid().defaultRandom().primaryKey(),
36
+ tenantId: field.uuid().tenant(),
37
+ linkId: field.uuid(),
38
+ kind: field.text(),
39
+ status: field.enum(ACCESS_LINK_USE_STATUSES),
40
+ startedAt: field.timestamp().default('now'),
41
+ reservedUntil: field.timestamp(),
42
+ completedAt: field.timestamp().nullable(),
43
+ client: field.text().nullable(),
44
+ location: field.text().nullable(),
45
+ }, {
46
+ indexes: (t) => ({
47
+ byLink: index('idx_access_link_use_link').on(t['linkId'], t['status']),
48
+ }),
49
+ });
50
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/infra/access-links/schema.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"open-trace.d.ts","sourceRoot":"","sources":["../../../src/trace/entry/open-trace.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAKtD,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAItE;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAA;IAClC,oDAAoD;IACpD,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAAA;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAClC;AAED,wFAAwF;AACxF,wBAAgB,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,YAAY,CA6C/D"}
1
+ {"version":3,"file":"open-trace.d.ts","sourceRoot":"","sources":["../../../src/trace/entry/open-trace.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAKtD,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAItE;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAA;IAClC,oDAAoD;IACpD,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAAA;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAClC;AAED,wFAAwF;AACxF,wBAAgB,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,YAAY,CA8C/D"}
@@ -51,6 +51,7 @@ export function openTrace(params) {
51
51
  traceDay: openedDay,
52
52
  cap,
53
53
  captureInputs: traceConfig.captureInputs,
54
+ maxExternalSteps: traceConfig.maxExternalSteps,
54
55
  });
55
56
  return { id, rootId, openedDay, persisted, buffer };
56
57
  }
@@ -1 +1 @@
1
- {"version":3,"file":"open-trace.js","sourceRoot":"","sources":["../../../src/trace/entry/open-trace.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"open-trace.js","sourceRoot":"","sources":["../../../src/trace/entry/open-trace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type ExternalRecordResult, type ExternalStepReport } from './report.js';
2
+ /** W3C `traceparent` for the current trace and open step, or `null` outside a traced flow or once the trace is truncated. */
3
+ export declare function traceparent(): string | null;
4
+ /** `{ TRACEPARENT }` for a child process's environment, or `{}` when there is no traceparent. */
5
+ export declare function env(): Record<string, string>;
6
+ /**
7
+ * Records steps reported by an outside process under the step open now (or as
8
+ * root-level steps when none is open). Synchronous and never throws.
9
+ */
10
+ export declare function record(input: string | Iterable<ExternalStepReport>): ExternalRecordResult;
11
+ //# sourceMappingURL=record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record.d.ts","sourceRoot":"","sources":["../../../src/trace/external/record.ts"],"names":[],"mappings":"AASA,OAAO,EAGL,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACxB,MAAM,aAAa,CAAA;AAIpB,6HAA6H;AAC7H,wBAAgB,WAAW,IAAI,MAAM,GAAG,IAAI,CAM3C;AAED,iGAAiG;AACjG,wBAAgB,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAG5C;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC,kBAAkB,CAAC,GAAG,oBAAoB,CAOzF"}
@@ -0,0 +1,156 @@
1
+ // `trace.traceparent`, `trace.env` and `trace.record`: carry the current trace
2
+ // to a process outside Node and stage the steps it reports back.
3
+ import { randomUUID } from 'node:crypto';
4
+ import { getContext } from '../../request/context/store.js';
5
+ import { getBaseLogger } from '../../core/logging/index.js';
6
+ import { emitReadTouches } from '../../data/write/audit/read-touches.js';
7
+ import { serializeForTrace } from '../capture/bounded-serializer.js';
8
+ import { externalStepReportSchema, parseReportTime, } from './report.js';
9
+ const NONE = { recorded: 0, invalid: 0, dropped: 0 };
10
+ /** W3C `traceparent` for the current trace and open step, or `null` outside a traced flow or once the trace is truncated. */
11
+ export function traceparent() {
12
+ const ctx = getContext()?.trace;
13
+ if (ctx === undefined || ctx === null || ctx.buffer.truncated)
14
+ return null;
15
+ const traceHex = ctx.id.replaceAll('-', '');
16
+ const spanSource = (ctx.buffer.openStepId ?? ctx.id).replaceAll('-', '');
17
+ return `00-${traceHex}-${spanSource.slice(-16)}-01`;
18
+ }
19
+ /** `{ TRACEPARENT }` for a child process's environment, or `{}` when there is no traceparent. */
20
+ export function env() {
21
+ const value = traceparent();
22
+ return value === null ? {} : { TRACEPARENT: value };
23
+ }
24
+ /**
25
+ * Records steps reported by an outside process under the step open now (or as
26
+ * root-level steps when none is open). Synchronous and never throws.
27
+ */
28
+ export function record(input) {
29
+ try {
30
+ return recordUnsafe(input);
31
+ }
32
+ catch (err) {
33
+ getBaseLogger().error({ err }, 'trace.record failed; no external steps were recorded');
34
+ return NONE;
35
+ }
36
+ }
37
+ function recordUnsafe(input) {
38
+ const flow = getContext();
39
+ const ctx = flow?.trace;
40
+ if (flow === undefined || ctx === undefined || ctx === null)
41
+ return NONE;
42
+ const buffer = ctx.buffer;
43
+ let invalid = 0;
44
+ const valid = new Map();
45
+ for (const candidate of candidates(input)) {
46
+ if (candidate === SKIP)
47
+ continue;
48
+ const parsed = candidate === BAD ? null : externalStepReportSchema.safeParse(candidate);
49
+ if (parsed === null || !parsed.success || valid.has(parsed.data.id)) {
50
+ invalid++;
51
+ continue;
52
+ }
53
+ valid.set(parsed.data.id, parsed.data);
54
+ }
55
+ // A parent chain that never reaches the calling step (a cycle) invalidates
56
+ // every report on it. Unknown or self parents end the chain at the caller.
57
+ const parentOf = (r) => r.parent == null || r.parent === r.id ? undefined : valid.get(r.parent);
58
+ const cyclic = [];
59
+ for (const r of valid.values()) {
60
+ const seen = new Set();
61
+ for (let cur = r; cur !== undefined; cur = parentOf(cur)) {
62
+ if (seen.has(cur.id)) {
63
+ cyclic.push(r.id);
64
+ break;
65
+ }
66
+ seen.add(cur.id);
67
+ }
68
+ }
69
+ for (const id of cyclic)
70
+ valid.delete(id);
71
+ invalid += cyclic.length;
72
+ const callerStepId = buffer.openStepId;
73
+ const ordered = [...valid.values()]
74
+ .map(r => ({ r, start: parseReportTime(r.start), end: parseReportTime(r.end) }))
75
+ .sort((a, b) => (a.start < b.start ? -1 : a.start > b.start ? 1 : 0));
76
+ const staged = new Map();
77
+ const resolveParent = (r) => {
78
+ for (let p = parentOf(r); p !== undefined; p = parentOf(p)) {
79
+ const id = staged.get(p.id);
80
+ if (id !== undefined)
81
+ return id;
82
+ }
83
+ return callerStepId;
84
+ };
85
+ let recorded = 0;
86
+ let dropped = 0;
87
+ const ids = new Map(ordered.map(o => [o.r.id, randomUUID()]));
88
+ for (const { r, start, end } of ordered) {
89
+ const id = ids.get(r.id);
90
+ const parentStepId = resolveParent(r);
91
+ const row = buffer.stageExternal({
92
+ id,
93
+ parentStepId,
94
+ flowStepRef: `external:${r.name}`,
95
+ status: r.status,
96
+ startedAt: new Date(Number(start / 1000n)),
97
+ completedAt: new Date(Number(end / 1000n)),
98
+ durationMicros: end - start,
99
+ capturedInputs: r.capture === undefined ? null : [serializeForTrace(r.capture)],
100
+ error: r.status === 'error'
101
+ ? {
102
+ name: r.error?.name ?? 'ExternalError',
103
+ message: r.error?.message ?? 'step reported error',
104
+ stack: r.error?.stack ?? null,
105
+ }
106
+ : null,
107
+ });
108
+ if (row === null) {
109
+ dropped++;
110
+ continue;
111
+ }
112
+ staged.set(r.id, id);
113
+ recorded++;
114
+ if (r.status === 'ok' && r.touches !== undefined && r.touches.length > 0) {
115
+ const begun = {
116
+ seq: row.seq,
117
+ stepId: id,
118
+ parentStepId: row.parentStepId,
119
+ flowStepRef: row.flowStepRef,
120
+ startedAt: row.startedAt,
121
+ startHrTime: 0n,
122
+ capturedInputs: row.capturedInputs,
123
+ touches: r.touches.map(t => {
124
+ const at = t.indexOf(':');
125
+ return { entity: t.slice(0, at), verb: t.slice(at + 1) };
126
+ }),
127
+ wroteForAudit: false,
128
+ };
129
+ // Sync like a sync flow step: fire and forget; the emitter logs its own failures.
130
+ void emitReadTouches(flow, begun);
131
+ }
132
+ }
133
+ return { recorded, invalid, dropped };
134
+ }
135
+ const SKIP = Symbol('skip');
136
+ const BAD = Symbol('bad');
137
+ function* candidates(input) {
138
+ if (typeof input !== 'string') {
139
+ yield* input;
140
+ return;
141
+ }
142
+ for (const raw of input.split('\n')) {
143
+ const line = raw.trim();
144
+ if (!line.startsWith('{')) {
145
+ yield SKIP;
146
+ continue;
147
+ }
148
+ try {
149
+ yield JSON.parse(line);
150
+ }
151
+ catch {
152
+ yield BAD;
153
+ }
154
+ }
155
+ }
156
+ //# sourceMappingURL=record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record.js","sourceRoot":"","sources":["../../../src/trace/external/record.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { z } from '../../data/schema/index.js';
2
+ /** Microseconds since the Unix epoch for an RFC 3339 timestamp with offset, or `null` when malformed. */
3
+ export declare function parseReportTime(text: string): bigint | null;
4
+ export declare const externalStepReportSchema: z.ZodObject<{
5
+ v: z.ZodLiteral<1>;
6
+ id: z.ZodString;
7
+ parent: z.ZodOptional<z.ZodNullable<z.ZodString>>;
8
+ name: z.ZodString;
9
+ start: z.ZodString;
10
+ end: z.ZodString;
11
+ status: z.ZodEnum<{
12
+ error: "error";
13
+ ok: "ok";
14
+ }>;
15
+ error: z.ZodOptional<z.ZodObject<{
16
+ name: z.ZodOptional<z.ZodString>;
17
+ message: z.ZodString;
18
+ stack: z.ZodOptional<z.ZodString>;
19
+ }, z.core.$strip>>;
20
+ capture: z.ZodOptional<z.ZodUnknown>;
21
+ touches: z.ZodOptional<z.ZodArray<z.ZodString>>;
22
+ }, z.core.$strip>;
23
+ /** One step reported by an outside process. */
24
+ export type ExternalStepReport = z.infer<typeof externalStepReportSchema>;
25
+ /** What `trace.record` did with a report. */
26
+ export interface ExternalRecordResult {
27
+ /** Steps staged into the trace. */
28
+ readonly recorded: number;
29
+ /** Reports skipped as malformed, duplicate, time-inverted or cyclic. */
30
+ readonly invalid: number;
31
+ /** Valid reports not recorded: over `trace.maxExternalSteps`, or the trace is truncated. */
32
+ readonly dropped: number;
33
+ }
34
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/trace/external/report.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,4BAA4B,CAAA;AAI9C,yGAAyG;AACzG,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkB3D;AAID,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;iBAkBpC,CAAA;AAED,+CAA+C;AAC/C,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAA;AAEzE,6CAA6C;AAC7C,MAAM,WAAW,oBAAoB;IACnC,mCAAmC;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,wEAAwE;IACxE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,4FAA4F;IAC5F,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB"}
@@ -0,0 +1,47 @@
1
+ // The language-neutral report a process outside Node sends back: one JSON
2
+ // object per line. `parseReportTime` reads RFC 3339 timestamps to microsecond
3
+ // precision (a JS `Date` keeps only milliseconds).
4
+ import { z } from '../../data/schema/index.js';
5
+ const RFC3339 = /^(\d{4})-(\d{2})-(\d{2})[Tt](\d{2}):(\d{2}):(\d{2})(?:\.(\d+))?([Zz]|[+-]\d{2}:\d{2})$/;
6
+ /** Microseconds since the Unix epoch for an RFC 3339 timestamp with offset, or `null` when malformed. */
7
+ export function parseReportTime(text) {
8
+ const m = RFC3339.exec(text);
9
+ if (m === null)
10
+ return null;
11
+ const [year, month, day, hour, minute, second] = m.slice(1, 7).map(Number);
12
+ if (month < 1 || month > 12 || day < 1 || hour > 23 || minute > 59 || second > 60)
13
+ return null;
14
+ const probe = new Date(Date.UTC(year, month - 1, day));
15
+ if (probe.getUTCMonth() !== month - 1 || probe.getUTCDate() !== day)
16
+ return null;
17
+ let offsetSeconds = 0;
18
+ const zone = m[8];
19
+ if (zone !== 'Z' && zone !== 'z') {
20
+ const oh = Number(zone.slice(1, 3));
21
+ const om = Number(zone.slice(4, 6));
22
+ if (oh > 23 || om > 59)
23
+ return null;
24
+ offsetSeconds = (oh * 3600 + om * 60) * (zone.startsWith('-') ? -1 : 1);
25
+ }
26
+ const wholeMs = Date.UTC(year, month - 1, day, hour, minute, second);
27
+ const fraction = Number((m[7] ?? '').padEnd(6, '0').slice(0, 6));
28
+ return (BigInt(wholeMs) / 1000n - BigInt(offsetSeconds)) * 1000000n + BigInt(fraction);
29
+ }
30
+ const timestamp = z.string().refine(v => parseReportTime(v) !== null, 'expected an RFC 3339 timestamp with offset');
31
+ export const externalStepReportSchema = z.object({
32
+ v: z.literal(1),
33
+ id: z.string().min(1).max(128),
34
+ parent: z.string().nullable().optional(),
35
+ name: z.string().min(1).max(200),
36
+ start: timestamp,
37
+ end: timestamp,
38
+ status: z.enum(['ok', 'error']),
39
+ error: z.object({
40
+ name: z.string().optional(),
41
+ message: z.string(),
42
+ stack: z.string().optional(),
43
+ }).optional(),
44
+ capture: z.unknown().optional(),
45
+ touches: z.array(z.string().regex(/^[A-Za-z_][A-Za-z0-9_.]*:[A-Za-z_][A-Za-z0-9_-]*$/)).optional(),
46
+ }).refine(r => parseReportTime(r.end) >= parseReportTime(r.start), { message: 'end is before start' });
47
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../../src/trace/external/report.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,8EAA8E;AAC9E,mDAAmD;AAEnD,OAAO,EAAE,CAAC,EAAE,MAAM,4BAA4B,CAAA;AAE9C,MAAM,OAAO,GAAG,wFAAwF,CAAA;AAExG,yGAAyG;AACzG,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAC3B,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAqD,CAAA;IAC9H,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,IAAI,MAAM,GAAG,EAAE,IAAI,MAAM,GAAG,EAAE;QAAE,OAAO,IAAI,CAAA;IAC9F,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;IACtD,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,KAAK,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,EAAE,KAAK,GAAG;QAAE,OAAO,IAAI,CAAA;IAChF,IAAI,aAAa,GAAG,CAAC,CAAA;IACrB,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAW,CAAA;IAC3B,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;QACjC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACnC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QACnC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE;YAAE,OAAO,IAAI,CAAA;QACnC,aAAa,GAAG,CAAC,EAAE,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACzE,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IACpE,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAChE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;AACxF,CAAC;AAED,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,4CAA4C,CAAC,CAAA;AAEnH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/C,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACf,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACxC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IAChC,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,SAAS;IACd,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/B,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC3B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;QACnB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC7B,CAAC,CAAC,QAAQ,EAAE;IACb,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC/B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC,QAAQ,EAAE;CACnG,CAAC,CAAC,MAAM,CACP,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,CAAE,IAAI,eAAe,CAAC,CAAC,CAAC,KAAK,CAAE,EACzD,EAAE,OAAO,EAAE,qBAAqB,EAAE,CACnC,CAAA"}
@@ -0,0 +1,11 @@
1
+ import { env, record, traceparent } from './external/record.js';
2
+ /** Trace namespace — hand the current trace to a process outside Node and record the steps it reports back. */
3
+ export declare const trace: {
4
+ /** W3C `traceparent` for the current trace and open step; `null` outside a traced flow or when the trace is truncated. */
5
+ traceparent: typeof traceparent;
6
+ /** `{ TRACEPARENT }` for a child process's environment, or `{}` when there is no traceparent. */
7
+ env: typeof env;
8
+ /** Records steps reported as JSON lines (or objects) by an outside process under the step open now. Synchronous; never throws. */
9
+ record: typeof record;
10
+ };
11
+ //# sourceMappingURL=namespace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../src/trace/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAE/D,+GAA+G;AAC/G,eAAO,MAAM,KAAK;IAChB,0HAA0H;;IAE1H,iGAAiG;;IAEjG,kIAAkI;;CAEnI,CAAA"}
@@ -0,0 +1,11 @@
1
+ import { env, record, traceparent } from './external/record.js';
2
+ /** Trace namespace — hand the current trace to a process outside Node and record the steps it reports back. */
3
+ export const trace = {
4
+ /** W3C `traceparent` for the current trace and open step; `null` outside a traced flow or when the trace is truncated. */
5
+ traceparent,
6
+ /** `{ TRACEPARENT }` for a child process's environment, or `{}` when there is no traceparent. */
7
+ env,
8
+ /** Records steps reported as JSON lines (or objects) by an outside process under the step open now. Synchronous; never throws. */
9
+ record,
10
+ };
11
+ //# sourceMappingURL=namespace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../src/trace/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAE/D,+GAA+G;AAC/G,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,0HAA0H;IAC1H,WAAW;IACX,iGAAiG;IACjG,GAAG;IACH,kIAAkI;IAClI,MAAM;CACP,CAAA"}
@@ -78,6 +78,23 @@ export interface StepBufferParams {
78
78
  * emitted — Tier-1 capture is unaffected.
79
79
  */
80
80
  readonly captureInputs: boolean;
81
+ /**
82
+ * Per-trace limit on steps staged through `stageExternal` (steps reported by
83
+ * a process outside Node). They do not count against `cap`. Default 1000.
84
+ */
85
+ readonly maxExternalSteps?: number;
86
+ }
87
+ /** A completed step reported from outside the process, ready for `stageExternal`. */
88
+ export interface ExternalStepInput {
89
+ readonly id: string;
90
+ readonly parentStepId: string | null;
91
+ readonly flowStepRef: string;
92
+ readonly status: 'ok' | 'error';
93
+ readonly startedAt: Date;
94
+ readonly completedAt: Date;
95
+ readonly durationMicros: bigint;
96
+ readonly capturedInputs: readonly unknown[] | null;
97
+ readonly error: StepError | null;
81
98
  }
82
99
  export declare class StepBuffer {
83
100
  private readonly traceId;
@@ -85,6 +102,10 @@ export declare class StepBuffer {
85
102
  private readonly cap;
86
103
  readonly captureInputs: boolean;
87
104
  private seq;
105
+ /** Steps begun through `begin` — the count the step cap applies to. */
106
+ private structuralCount;
107
+ private externalCount;
108
+ private readonly maxExternalSteps;
88
109
  private currentStepId;
89
110
  /**
90
111
  * The active begun-step at the deepest open nesting level. `__flowStep`
@@ -100,6 +121,8 @@ export declare class StepBuffer {
100
121
  private truncatedAtSeqValue;
101
122
  private truncationDoneValue;
102
123
  constructor(params: StepBufferParams);
124
+ /** The id of the step currently open (innermost), or `null` when none is. */
125
+ get openStepId(): string | null;
103
126
  /** True once the step cap has been blown — the trace records no further steps. */
104
127
  get truncated(): boolean;
105
128
  /** The `seq` that tripped truncation, for `trace.truncated_at_seq`. */
@@ -133,6 +156,13 @@ export declare class StepBuffer {
133
156
  currentStep(): ActiveAuditStep | null;
134
157
  /** Settles a begun step: stamps its outcome and timing, stages the row, unnests. */
135
158
  complete(begun: BegunStep, status: 'ok' | 'error', thrown: unknown): void;
159
+ /**
160
+ * Stages an already-completed step reported from outside the process. Assigns
161
+ * its `seq`. Returns the staged row, or `null` when nothing was recorded: the
162
+ * trace is truncated or the external-step limit is reached. External steps
163
+ * never count toward the structural cap.
164
+ */
165
+ stageExternal(step: ExternalStepInput): PendingStep | null;
136
166
  /** Removes and returns every staged row — the buffer is empty afterwards. */
137
167
  drain(): PendingStep[];
138
168
  }
@@ -1 +1 @@
1
- {"version":3,"file":"step-buffer.d.ts","sourceRoot":"","sources":["../../../src/trace/runtime/step-buffer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"step-buffer.d.ts","sourceRoot":"","sources":["../../../src/trace/runtime/step-buffer.ts"],"names":[],"mappings":"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"}