pipework 0.7.25 → 0.8.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 (139) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +18 -8
  3. package/dist/cli/commands/check.d.ts +2 -0
  4. package/dist/cli/commands/check.d.ts.map +1 -1
  5. package/dist/cli/commands/check.js +54 -11
  6. package/dist/cli/commands/check.js.map +1 -1
  7. package/dist/cli/commands/test.d.ts +1 -0
  8. package/dist/cli/commands/test.d.ts.map +1 -1
  9. package/dist/cli/commands/test.js +20 -6
  10. package/dist/cli/commands/test.js.map +1 -1
  11. package/dist/core/config/load.d.ts +6 -0
  12. package/dist/core/config/load.d.ts.map +1 -1
  13. package/dist/core/config/load.js +5 -0
  14. package/dist/core/config/load.js.map +1 -1
  15. package/dist/core/config/namespace.d.ts +5 -0
  16. package/dist/core/config/namespace.d.ts.map +1 -1
  17. package/dist/core/config/schema.d.ts +11 -0
  18. package/dist/core/config/schema.d.ts.map +1 -1
  19. package/dist/core/config/schema.js +6 -0
  20. package/dist/core/config/schema.js.map +1 -1
  21. package/dist/core/logging/redact-match.d.ts +4 -0
  22. package/dist/core/logging/redact-match.d.ts.map +1 -0
  23. package/dist/core/logging/redact-match.js +23 -0
  24. package/dist/core/logging/redact-match.js.map +1 -0
  25. package/dist/data/db/namespace.d.ts +1 -0
  26. package/dist/data/db/namespace.d.ts.map +1 -1
  27. package/dist/data/domain/build-factory.js +2 -0
  28. package/dist/data/domain/build-factory.js.map +1 -1
  29. package/dist/data/domain/build-schema.js +2 -0
  30. package/dist/data/domain/build-schema.js.map +1 -1
  31. package/dist/data/domain/build-table.d.ts.map +1 -1
  32. package/dist/data/domain/build-table.js +86 -12
  33. package/dist/data/domain/build-table.js.map +1 -1
  34. package/dist/data/domain/field.d.ts +2 -0
  35. package/dist/data/domain/field.d.ts.map +1 -1
  36. package/dist/data/domain/field.js +7 -0
  37. package/dist/data/domain/field.js.map +1 -1
  38. package/dist/data/domain/trace-safe-projection.d.ts +12 -0
  39. package/dist/data/domain/trace-safe-projection.d.ts.map +1 -0
  40. package/dist/data/domain/trace-safe-projection.js +25 -0
  41. package/dist/data/domain/trace-safe-projection.js.map +1 -0
  42. package/dist/data/domain/types.d.ts +34 -2
  43. package/dist/data/domain/types.d.ts.map +1 -1
  44. package/dist/data/migrate/diff.d.ts.map +1 -1
  45. package/dist/data/migrate/diff.js +19 -0
  46. package/dist/data/migrate/diff.js.map +1 -1
  47. package/dist/data/migrate/snapshot.d.ts +6 -0
  48. package/dist/data/migrate/snapshot.d.ts.map +1 -1
  49. package/dist/data/migrate/snapshot.js +16 -0
  50. package/dist/data/migrate/snapshot.js.map +1 -1
  51. package/dist/data/migrate/sql-emit.js +4 -1
  52. package/dist/data/migrate/sql-emit.js.map +1 -1
  53. package/dist/test/index.d.ts +1 -1
  54. package/dist/test/index.d.ts.map +1 -1
  55. package/dist/test/index.js +1 -1
  56. package/dist/test/index.js.map +1 -1
  57. package/dist/test/vitest-workspace.d.ts.map +1 -1
  58. package/dist/test/vitest-workspace.js +15 -3
  59. package/dist/test/vitest-workspace.js.map +1 -1
  60. package/dist/trace/annotation/flow-step-annotation.d.ts +51 -0
  61. package/dist/trace/annotation/flow-step-annotation.d.ts.map +1 -0
  62. package/dist/trace/annotation/flow-step-annotation.js +6 -0
  63. package/dist/trace/annotation/flow-step-annotation.js.map +1 -0
  64. package/dist/trace/annotation/parse-error.d.ts +16 -0
  65. package/dist/trace/annotation/parse-error.d.ts.map +1 -0
  66. package/dist/trace/annotation/parse-error.js +5 -0
  67. package/dist/trace/annotation/parse-error.js.map +1 -0
  68. package/dist/trace/annotation/parse.d.ts +21 -0
  69. package/dist/trace/annotation/parse.d.ts.map +1 -0
  70. package/dist/trace/annotation/parse.js +201 -0
  71. package/dist/trace/annotation/parse.js.map +1 -0
  72. package/dist/trace/capture/bounded-serializer.d.ts +21 -0
  73. package/dist/trace/capture/bounded-serializer.d.ts.map +1 -0
  74. package/dist/trace/capture/bounded-serializer.js +107 -0
  75. package/dist/trace/capture/bounded-serializer.js.map +1 -0
  76. package/dist/trace/partition/day.d.ts +7 -0
  77. package/dist/trace/partition/day.d.ts.map +1 -0
  78. package/dist/trace/partition/day.js +39 -0
  79. package/dist/trace/partition/day.js.map +1 -0
  80. package/dist/trace/partition/index.d.ts +11 -0
  81. package/dist/trace/partition/index.d.ts.map +1 -0
  82. package/dist/trace/partition/index.js +8 -0
  83. package/dist/trace/partition/index.js.map +1 -0
  84. package/dist/trace/partition/partition-name.d.ts +8 -0
  85. package/dist/trace/partition/partition-name.d.ts.map +1 -0
  86. package/dist/trace/partition/partition-name.js +23 -0
  87. package/dist/trace/partition/partition-name.js.map +1 -0
  88. package/dist/trace/partition/plan.d.ts +35 -0
  89. package/dist/trace/partition/plan.d.ts.map +1 -0
  90. package/dist/trace/partition/plan.js +39 -0
  91. package/dist/trace/partition/plan.js.map +1 -0
  92. package/dist/trace/partition/schedule.d.ts +14 -0
  93. package/dist/trace/partition/schedule.d.ts.map +1 -0
  94. package/dist/trace/partition/schedule.js +11 -0
  95. package/dist/trace/partition/schedule.js.map +1 -0
  96. package/dist/trace/partition/startup-hook.d.ts +6 -0
  97. package/dist/trace/partition/startup-hook.d.ts.map +1 -0
  98. package/dist/trace/partition/startup-hook.js +15 -0
  99. package/dist/trace/partition/startup-hook.js.map +1 -0
  100. package/dist/trace/partition/sync.d.ts +14 -0
  101. package/dist/trace/partition/sync.d.ts.map +1 -0
  102. package/dist/trace/partition/sync.js +62 -0
  103. package/dist/trace/partition/sync.js.map +1 -0
  104. package/dist/trace/partition/tables.d.ts +8 -0
  105. package/dist/trace/partition/tables.d.ts.map +1 -0
  106. package/dist/trace/partition/tables.js +16 -0
  107. package/dist/trace/partition/tables.js.map +1 -0
  108. package/dist/trace/retain/copy-on-error.d.ts +18 -0
  109. package/dist/trace/retain/copy-on-error.d.ts.map +1 -0
  110. package/dist/trace/retain/copy-on-error.js +62 -0
  111. package/dist/trace/retain/copy-on-error.js.map +1 -0
  112. package/dist/trace/schema/trace-fields.d.ts +18 -0
  113. package/dist/trace/schema/trace-fields.d.ts.map +1 -0
  114. package/dist/trace/schema/trace-fields.js +34 -0
  115. package/dist/trace/schema/trace-fields.js.map +1 -0
  116. package/dist/trace/schema/trace-retained.d.ts +18 -0
  117. package/dist/trace/schema/trace-retained.d.ts.map +1 -0
  118. package/dist/trace/schema/trace-retained.js +11 -0
  119. package/dist/trace/schema/trace-retained.js.map +1 -0
  120. package/dist/trace/schema/trace-step-fields.d.ts +15 -0
  121. package/dist/trace/schema/trace-step-fields.d.ts.map +1 -0
  122. package/dist/trace/schema/trace-step-fields.js +31 -0
  123. package/dist/trace/schema/trace-step-fields.js.map +1 -0
  124. package/dist/trace/schema/trace-step-retained.d.ts +15 -0
  125. package/dist/trace/schema/trace-step-retained.d.ts.map +1 -0
  126. package/dist/trace/schema/trace-step-retained.js +18 -0
  127. package/dist/trace/schema/trace-step-retained.js.map +1 -0
  128. package/dist/trace/schema/trace-step.d.ts +15 -0
  129. package/dist/trace/schema/trace-step.d.ts.map +1 -0
  130. package/dist/trace/schema/trace-step.js +17 -0
  131. package/dist/trace/schema/trace-step.js.map +1 -0
  132. package/dist/trace/schema/trace.d.ts +18 -0
  133. package/dist/trace/schema/trace.d.ts.map +1 -0
  134. package/dist/trace/schema/trace.js +11 -0
  135. package/dist/trace/schema/trace.js.map +1 -0
  136. package/dist/workspace/changed-files.d.ts.map +1 -1
  137. package/dist/workspace/changed-files.js +5 -1
  138. package/dist/workspace/changed-files.js.map +1 -1
  139. package/package.json +3 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../src/trace/annotation/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { type RedactMatcher } from '../../core/logging/redact-match.js';
2
+ export interface TraceSerializeOptions {
3
+ /** Nested objects/arrays deeper than this are replaced with a marker. */
4
+ readonly maxDepth?: number;
5
+ /** Object keys / array items kept per level; the excess is summarized. */
6
+ readonly maxEntries?: number;
7
+ /** Strings longer than this are truncated with a marker. */
8
+ readonly maxStringLength?: number;
9
+ /** Key-path matcher; matching values are replaced with `[Redacted]`. */
10
+ readonly redact?: RedactMatcher;
11
+ }
12
+ /**
13
+ * Serialize a captured value into a JSON-safe, bounded, redacted form.
14
+ *
15
+ * The result contains only `null`, booleans, finite numbers, strings, plain
16
+ * objects and arrays — safe to write straight into a `jsonb` column. Anything
17
+ * that would break those guarantees is replaced with a `[…]` marker rather than
18
+ * dropped silently, so a reader can tell capture hit a bound.
19
+ */
20
+ export declare function serializeForTrace(value: unknown, options?: TraceSerializeOptions): unknown;
21
+ //# sourceMappingURL=bounded-serializer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bounded-serializer.d.ts","sourceRoot":"","sources":["../../../src/trace/capture/bounded-serializer.ts"],"names":[],"mappings":"AAUA,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,oCAAoC,CAAA;AAG3F,MAAM,WAAW,qBAAqB;IACpC,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,4DAA4D;IAC5D,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;IACjC,wEAAwE;IACxE,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAA;CAChC;AAgBD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAQ9F"}
@@ -0,0 +1,107 @@
1
+ // The bounded serializer is the last safety net on trace input capture: it
2
+ // turns an arbitrary captured value into something JSON-safe, size-bounded, and
3
+ // redacted before it lands in `trace_step.captured_inputs`.
4
+ //
5
+ // "Safe" means it never throws and never blows up the trace row: depth, fan-out
6
+ // and string length are all capped, cycles are broken, and non-JSON primitives
7
+ // (bigint, NaN, Date, functions) are rendered to stable markers or strings.
8
+ // "Redacted" means it runs every key-path through the same redact matcher the
9
+ // logger uses, so a path censored in logs is censored in traces too.
10
+ import { compileRedactPaths } from '../../core/logging/redact-match.js';
11
+ import { DEFAULT_REDACT_PATHS } from '../../core/logging/index.js';
12
+ const DEFAULTS = {
13
+ maxDepth: 6,
14
+ maxEntries: 64,
15
+ maxStringLength: 1024,
16
+ redact: compileRedactPaths(DEFAULT_REDACT_PATHS),
17
+ };
18
+ /**
19
+ * Serialize a captured value into a JSON-safe, bounded, redacted form.
20
+ *
21
+ * The result contains only `null`, booleans, finite numbers, strings, plain
22
+ * objects and arrays — safe to write straight into a `jsonb` column. Anything
23
+ * that would break those guarantees is replaced with a `[…]` marker rather than
24
+ * dropped silently, so a reader can tell capture hit a bound.
25
+ */
26
+ export function serializeForTrace(value, options = {}) {
27
+ const resolved = {
28
+ maxDepth: options.maxDepth ?? DEFAULTS.maxDepth,
29
+ maxEntries: options.maxEntries ?? DEFAULTS.maxEntries,
30
+ maxStringLength: options.maxStringLength ?? DEFAULTS.maxStringLength,
31
+ redact: options.redact ?? DEFAULTS.redact,
32
+ };
33
+ return walk(value, 0, [], new WeakSet(), resolved);
34
+ }
35
+ function walk(value, depth, keyPath, seen, opts) {
36
+ if (value === null)
37
+ return null;
38
+ switch (typeof value) {
39
+ case 'string':
40
+ return boundString(value, opts.maxStringLength);
41
+ case 'number':
42
+ return Number.isFinite(value) ? value : String(value);
43
+ case 'boolean':
44
+ return value;
45
+ case 'bigint':
46
+ return value.toString();
47
+ case 'undefined':
48
+ return undefined;
49
+ case 'function':
50
+ return '[Function]';
51
+ case 'symbol':
52
+ return value.toString();
53
+ }
54
+ if (value instanceof Date)
55
+ return value.toISOString();
56
+ if (depth >= opts.maxDepth)
57
+ return '[Pruned: max depth]';
58
+ if (seen.has(value))
59
+ return '[Circular]';
60
+ seen.add(value);
61
+ const result = Array.isArray(value)
62
+ ? walkArray(value, depth, keyPath, seen, opts)
63
+ : walkObject(value, depth, keyPath, seen, opts);
64
+ seen.delete(value);
65
+ return result;
66
+ }
67
+ function walkArray(value, depth, keyPath, seen, opts) {
68
+ const out = [];
69
+ for (const item of value.slice(0, opts.maxEntries)) {
70
+ // Arrays are transparent to the redact key-path: an item carries its
71
+ // parent's path, not an index segment. This makes redaction match by
72
+ // object-key nesting and, where it differs from pino, errs toward
73
+ // redacting more — the safe direction for a capture net.
74
+ const serialized = walk(item, depth + 1, keyPath, seen, opts);
75
+ // JSON arrays cannot carry holes; an undefined slot becomes null.
76
+ out.push(serialized === undefined ? null : serialized);
77
+ }
78
+ if (value.length > opts.maxEntries) {
79
+ out.push(`[Pruned: ${value.length - opts.maxEntries} more items]`);
80
+ }
81
+ return out;
82
+ }
83
+ function walkObject(value, depth, keyPath, seen, opts) {
84
+ const out = {};
85
+ const entries = Object.entries(value);
86
+ for (const [key, raw] of entries.slice(0, opts.maxEntries)) {
87
+ const path = [...keyPath, key];
88
+ if (opts.redact(path)) {
89
+ out[key] = '[Redacted]';
90
+ continue;
91
+ }
92
+ const serialized = walk(raw, depth + 1, path, seen, opts);
93
+ // An undefined property is absent in JSON; drop it rather than emit a hole.
94
+ if (serialized !== undefined)
95
+ out[key] = serialized;
96
+ }
97
+ if (entries.length > opts.maxEntries) {
98
+ out['[Pruned]'] = `${entries.length - opts.maxEntries} more keys`;
99
+ }
100
+ return out;
101
+ }
102
+ function boundString(value, max) {
103
+ if (value.length <= max)
104
+ return value;
105
+ return `${value.slice(0, max)}[Truncated: ${value.length - max} chars]`;
106
+ }
107
+ //# sourceMappingURL=bounded-serializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bounded-serializer.js","sourceRoot":"","sources":["../../../src/trace/capture/bounded-serializer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /** The UTC calendar day of an instant, as `YYYY-MM-DD`. */
2
+ export declare function toDay(date: Date): string;
3
+ /** The day `n` days after `day` (negative `n` moves backward). */
4
+ export declare function addDays(day: string, n: number): string;
5
+ /** Every day in `[from, to]` inclusive, ascending. Empty when `from > to`. */
6
+ export declare function dayRange(from: string, to: string): string[];
7
+ //# sourceMappingURL=day.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"day.d.ts","sourceRoot":"","sources":["../../../src/trace/partition/day.ts"],"names":[],"mappings":"AAOA,2DAA2D;AAC3D,wBAAgB,KAAK,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CAExC;AAsBD,kEAAkE;AAClE,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,8EAA8E;AAC9E,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ3D"}
@@ -0,0 +1,39 @@
1
+ // Day arithmetic for trace partitioning. Trace tables are RANGE-partitioned by
2
+ // a `date` column, one partition per calendar day, reckoned in UTC — the same
3
+ // frame the `date` column stores. All helpers take and return `YYYY-MM-DD`.
4
+ const DAY_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
5
+ const MS_PER_DAY = 86_400_000;
6
+ /** The UTC calendar day of an instant, as `YYYY-MM-DD`. */
7
+ export function toDay(date) {
8
+ return date.toISOString().slice(0, 10);
9
+ }
10
+ function parseDay(day) {
11
+ if (!DAY_PATTERN.test(day)) {
12
+ throw new Error(`[pipework] Invalid day "${day}" — expected YYYY-MM-DD.\n\n` +
13
+ ' Trace partition days are UTC calendar dates with no time component.\n');
14
+ }
15
+ const ms = Date.parse(`${day}T00:00:00.000Z`);
16
+ // Date.parse rolls overflow (`2026-02-30` → March 2) instead of failing, so a
17
+ // well-formed string that isn't a real calendar date round-trips to a
18
+ // different day. Reject those rather than silently shifting the partition.
19
+ if (Number.isNaN(ms) || new Date(ms).toISOString().slice(0, 10) !== day) {
20
+ throw new Error(`[pipework] Invalid day "${day}" — well-formed but not a real date.\n\n` +
21
+ ' Check the month and day are within range.\n');
22
+ }
23
+ return ms;
24
+ }
25
+ /** The day `n` days after `day` (negative `n` moves backward). */
26
+ export function addDays(day, n) {
27
+ return toDay(new Date(parseDay(day) + n * MS_PER_DAY));
28
+ }
29
+ /** Every day in `[from, to]` inclusive, ascending. Empty when `from > to`. */
30
+ export function dayRange(from, to) {
31
+ const start = parseDay(from);
32
+ const end = parseDay(to);
33
+ const days = [];
34
+ for (let ms = start; ms <= end; ms += MS_PER_DAY) {
35
+ days.push(toDay(new Date(ms)));
36
+ }
37
+ return days;
38
+ }
39
+ //# sourceMappingURL=day.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"day.js","sourceRoot":"","sources":["../../../src/trace/partition/day.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,8EAA8E;AAC9E,4EAA4E;AAE5E,MAAM,WAAW,GAAG,qBAAqB,CAAA;AACzC,MAAM,UAAU,GAAG,UAAU,CAAA;AAE7B,2DAA2D;AAC3D,MAAM,UAAU,KAAK,CAAC,IAAU;IAC9B,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;AACxC,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW;IAC3B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACb,2BAA2B,GAAG,8BAA8B;YAC5D,yEAAyE,CAC1E,CAAA;IACH,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,gBAAgB,CAAC,CAAA;IAC7C,8EAA8E;IAC9E,sEAAsE;IACtE,2EAA2E;IAC3E,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC;QACxE,MAAM,IAAI,KAAK,CACb,2BAA2B,GAAG,0CAA0C;YACxE,+CAA+C,CAChD,CAAA;IACH,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,OAAO,CAAC,GAAW,EAAE,CAAS;IAC5C,OAAO,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,CAAA;AACxD,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,EAAU;IAC/C,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IACxB,MAAM,IAAI,GAAa,EAAE,CAAA;IACzB,KAAK,IAAI,EAAE,GAAG,KAAK,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,UAAU,EAAE,CAAC;QACjD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAChC,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,11 @@
1
+ export { syncTracePartitions } from './sync.js';
2
+ export type { PartitionSyncSummary } from './sync.js';
3
+ export { planPartitions } from './plan.js';
4
+ export type { TracePartitionConfig, DayPartition, PartitionPlan, PartitionPlanInput } from './plan.js';
5
+ export { PARTITIONED_TRACE_TABLES } from './tables.js';
6
+ export type { PartitionedTraceTable, RetentionClass } from './tables.js';
7
+ export { partitionName, parsePartitionDay } from './partition-name.js';
8
+ export { toDay, addDays, dayRange } from './day.js';
9
+ export { createTracePartitionStartupHook, TRACE_PARTITION_HOOK_NAME } from './startup-hook.js';
10
+ export { scheduleTracePartitionMaintenance, TRACE_PARTITION_MAINTENANCE_JOB, TRACE_PARTITION_MAINTENANCE_CRON, } from './schedule.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/trace/partition/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAC/C,YAAY,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAC1C,YAAY,EAAE,oBAAoB,EAAE,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AACtG,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AACtD,YAAY,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACxE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACtE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnD,OAAO,EAAE,+BAA+B,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAA;AAC9F,OAAO,EACL,iCAAiC,EACjC,+BAA+B,EAC/B,gCAAgC,GACjC,MAAM,eAAe,CAAA"}
@@ -0,0 +1,8 @@
1
+ export { syncTracePartitions } from './sync.js';
2
+ export { planPartitions } from './plan.js';
3
+ export { PARTITIONED_TRACE_TABLES } from './tables.js';
4
+ export { partitionName, parsePartitionDay } from './partition-name.js';
5
+ export { toDay, addDays, dayRange } from './day.js';
6
+ export { createTracePartitionStartupHook, TRACE_PARTITION_HOOK_NAME } from './startup-hook.js';
7
+ export { scheduleTracePartitionMaintenance, TRACE_PARTITION_MAINTENANCE_JOB, TRACE_PARTITION_MAINTENANCE_CRON, } from './schedule.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/trace/partition/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAE/C,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAE1C,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAEtD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACtE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACnD,OAAO,EAAE,+BAA+B,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAA;AAC9F,OAAO,EACL,iCAAiC,EACjC,+BAA+B,EAC/B,gCAAgC,GACjC,MAAM,eAAe,CAAA"}
@@ -0,0 +1,8 @@
1
+ /** The partition table name for `parent`'s slice covering `day` (`YYYY-MM-DD`). */
2
+ export declare function partitionName(parent: string, day: string): string;
3
+ /**
4
+ * The calendar day a partition name encodes, or `null` when `name` is not a day
5
+ * partition of `parent`. Used to tell which catalog children are ours to manage.
6
+ */
7
+ export declare function parsePartitionDay(parent: string, name: string): string | null;
8
+ //# sourceMappingURL=partition-name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partition-name.d.ts","sourceRoot":"","sources":["../../../src/trace/partition/partition-name.ts"],"names":[],"mappings":"AAOA,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM7E"}
@@ -0,0 +1,23 @@
1
+ // The naming convention that ties a day partition back to its parent table and
2
+ // calendar day. `trace` + `2026-05-14` ⇄ `trace_p20260514`. The `_p` separator
3
+ // plus a fixed 8-digit date keeps real table names (`trace_step`,
4
+ // `trace_retained`) from ever parsing as partitions of `trace`.
5
+ const DIGITS_PATTERN = /^\d{8}$/;
6
+ /** The partition table name for `parent`'s slice covering `day` (`YYYY-MM-DD`). */
7
+ export function partitionName(parent, day) {
8
+ return `${parent}_p${day.replace(/-/g, '')}`;
9
+ }
10
+ /**
11
+ * The calendar day a partition name encodes, or `null` when `name` is not a day
12
+ * partition of `parent`. Used to tell which catalog children are ours to manage.
13
+ */
14
+ export function parsePartitionDay(parent, name) {
15
+ const prefix = `${parent}_p`;
16
+ if (!name.startsWith(prefix))
17
+ return null;
18
+ const digits = name.slice(prefix.length);
19
+ if (!DIGITS_PATTERN.test(digits))
20
+ return null;
21
+ return `${digits.slice(0, 4)}-${digits.slice(4, 6)}-${digits.slice(6, 8)}`;
22
+ }
23
+ //# sourceMappingURL=partition-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partition-name.js","sourceRoot":"","sources":["../../../src/trace/partition/partition-name.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,+EAA+E;AAC/E,kEAAkE;AAClE,gEAAgE;AAEhE,MAAM,cAAc,GAAG,SAAS,CAAA;AAEhC,mFAAmF;AACnF,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,GAAW;IACvD,OAAO,GAAG,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAA;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,IAAY;IAC5D,MAAM,MAAM,GAAG,GAAG,MAAM,IAAI,CAAA;IAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAA;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACxC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAA;IAC7C,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAA;AAC5E,CAAC"}
@@ -0,0 +1,35 @@
1
+ export interface TracePartitionConfig {
2
+ /** Days of hot partitions kept for `trace` / `trace_step`. */
3
+ readonly hotRetentionDays: number;
4
+ /** Days of cold partitions kept for `trace_retained` / `trace_step_retained`. */
5
+ readonly errorRetentionDays: number;
6
+ /** Days of partitions pre-created ahead of today so writes never race creation. */
7
+ readonly partitionLeadDays: number;
8
+ }
9
+ /** A single day partition: which parent it belongs to, its name, and its day. */
10
+ export interface DayPartition {
11
+ readonly parent: string;
12
+ readonly name: string;
13
+ readonly day: string;
14
+ }
15
+ export interface PartitionPlan {
16
+ readonly create: readonly DayPartition[];
17
+ readonly drop: readonly DayPartition[];
18
+ }
19
+ export interface PartitionPlanInput {
20
+ readonly now: Date;
21
+ readonly config: TracePartitionConfig;
22
+ /** Existing child partition names per parent table, as found in the catalog. */
23
+ readonly existing: ReadonlyMap<string, ReadonlySet<string>>;
24
+ }
25
+ /**
26
+ * Reconcile desired partitions against existing ones.
27
+ *
28
+ * For each table the desired set spans `[today - retentionDays, today + leadDays]`.
29
+ * `create` is every desired day with no partition yet. `drop` is every existing
30
+ * partition whose day has fallen before the retention cutoff — retention is the
31
+ * dropping of day partitions, never a DELETE. Catalog children that don't parse
32
+ * as our day partitions are left untouched.
33
+ */
34
+ export declare function planPartitions(input: PartitionPlanInput): PartitionPlan;
35
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../../src/trace/partition/plan.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,oBAAoB;IACnC,8DAA8D;IAC9D,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,iFAAiF;IACjF,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAA;IACnC,mFAAmF;IACnF,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;CACnC;AAED,iFAAiF;AACjF,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAA;IACxC,QAAQ,CAAC,IAAI,EAAE,SAAS,YAAY,EAAE,CAAA;CACvC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAA;IAClB,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAA;IACrC,gFAAgF;IAChF,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAA;CAC5D;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,GAAG,aAAa,CAuBvE"}
@@ -0,0 +1,39 @@
1
+ // The pure core of partition maintenance: given the clock, the retention
2
+ // windows, and the partitions that currently exist, decide which day
3
+ // partitions to create and which to drop. No database access — every decision
4
+ // here is a function of its inputs, so the whole policy is unit-testable.
5
+ import { PARTITIONED_TRACE_TABLES } from './tables.js';
6
+ import { partitionName, parsePartitionDay } from './partition-name.js';
7
+ import { toDay, addDays, dayRange } from './day.js';
8
+ /**
9
+ * Reconcile desired partitions against existing ones.
10
+ *
11
+ * For each table the desired set spans `[today - retentionDays, today + leadDays]`.
12
+ * `create` is every desired day with no partition yet. `drop` is every existing
13
+ * partition whose day has fallen before the retention cutoff — retention is the
14
+ * dropping of day partitions, never a DELETE. Catalog children that don't parse
15
+ * as our day partitions are left untouched.
16
+ */
17
+ export function planPartitions(input) {
18
+ const { config } = input;
19
+ const today = toDay(input.now);
20
+ const create = [];
21
+ const drop = [];
22
+ for (const { parent, retention } of PARTITIONED_TRACE_TABLES) {
23
+ const retentionDays = retention === 'hot' ? config.hotRetentionDays : config.errorRetentionDays;
24
+ const cutoff = addDays(today, -retentionDays);
25
+ const existing = input.existing.get(parent) ?? new Set();
26
+ for (const day of dayRange(cutoff, addDays(today, config.partitionLeadDays))) {
27
+ const name = partitionName(parent, day);
28
+ if (!existing.has(name))
29
+ create.push({ parent, name, day });
30
+ }
31
+ for (const name of existing) {
32
+ const day = parsePartitionDay(parent, name);
33
+ if (day !== null && day < cutoff)
34
+ drop.push({ parent, name, day });
35
+ }
36
+ }
37
+ return { create, drop };
38
+ }
39
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../../src/trace/partition/plan.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,qEAAqE;AACrE,8EAA8E;AAC9E,0EAA0E;AAE1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACtE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AA8BnD;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,KAAyB;IACtD,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAA;IACxB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC9B,MAAM,MAAM,GAAmB,EAAE,CAAA;IACjC,MAAM,IAAI,GAAmB,EAAE,CAAA;IAE/B,KAAK,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,wBAAwB,EAAE,CAAC;QAC7D,MAAM,aAAa,GAAG,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,kBAAkB,CAAA;QAC/F,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,CAAA;QAC7C,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,GAAG,EAAU,CAAA;QAEhE,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC;YAC7E,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;YACvC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAA;QAC7D,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YAC3C,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,GAAG,MAAM;gBAAE,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAA;QACpE,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;AACzB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { DB } from '../../data/db/index.js';
2
+ export declare const TRACE_PARTITION_MAINTENANCE_JOB = "pipework.trace.partition-maintenance";
3
+ /** Daily at 01:10 UTC — past the midnight day rollover, before business hours. */
4
+ export declare const TRACE_PARTITION_MAINTENANCE_CRON = "10 1 * * *";
5
+ /** The scheduler surface this helper needs — structural so it doesn't couple to the job queue. */
6
+ interface SchedulerLike {
7
+ schedule(db: DB, spec: {
8
+ readonly name: string;
9
+ readonly cron: string;
10
+ }): Promise<void>;
11
+ }
12
+ export declare function scheduleTracePartitionMaintenance(scheduler: SchedulerLike, db: DB, cron?: string): Promise<void>;
13
+ export {};
14
+ //# sourceMappingURL=schedule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../../src/trace/partition/schedule.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAA;AAEhD,eAAO,MAAM,+BAA+B,yCAAyC,CAAA;AAErF,kFAAkF;AAClF,eAAO,MAAM,gCAAgC,eAAe,CAAA;AAE5D,kGAAkG;AAClG,UAAU,aAAa;IACrB,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACxF;AAED,wBAAsB,iCAAiC,CACrD,SAAS,EAAE,aAAa,EACxB,EAAE,EAAE,EAAE,EACN,IAAI,GAAE,MAAyC,GAC9C,OAAO,CAAC,IAAI,CAAC,CAEf"}
@@ -0,0 +1,11 @@
1
+ // Registers partition maintenance as a recurring job on the cron scheduler.
2
+ // The startup hook covers the boot moment; this keeps partitions rolling
3
+ // forward for a long-lived process. The job body is `syncTracePartitions` —
4
+ // the consumer's worker dispatch routes `TRACE_PARTITION_MAINTENANCE_JOB` to it.
5
+ export const TRACE_PARTITION_MAINTENANCE_JOB = 'pipework.trace.partition-maintenance';
6
+ /** Daily at 01:10 UTC — past the midnight day rollover, before business hours. */
7
+ export const TRACE_PARTITION_MAINTENANCE_CRON = '10 1 * * *';
8
+ export async function scheduleTracePartitionMaintenance(scheduler, db, cron = TRACE_PARTITION_MAINTENANCE_CRON) {
9
+ await scheduler.schedule(db, { name: TRACE_PARTITION_MAINTENANCE_JOB, cron });
10
+ }
11
+ //# sourceMappingURL=schedule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schedule.js","sourceRoot":"","sources":["../../../src/trace/partition/schedule.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,yEAAyE;AACzE,4EAA4E;AAC5E,iFAAiF;AAIjF,MAAM,CAAC,MAAM,+BAA+B,GAAG,sCAAsC,CAAA;AAErF,kFAAkF;AAClF,MAAM,CAAC,MAAM,gCAAgC,GAAG,YAAY,CAAA;AAO5D,MAAM,CAAC,KAAK,UAAU,iCAAiC,CACrD,SAAwB,EACxB,EAAM,EACN,OAAe,gCAAgC;IAE/C,MAAM,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,+BAA+B,EAAE,IAAI,EAAE,CAAC,CAAA;AAC/E,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { DB } from '../../data/db/index.js';
2
+ import type { StartupHook } from '../../core/lifecycle/types.js';
3
+ import type { TracePartitionConfig } from './plan.js';
4
+ export declare const TRACE_PARTITION_HOOK_NAME = "trace-partition-maintenance";
5
+ export declare function createTracePartitionStartupHook(db: DB, config: TracePartitionConfig): StartupHook;
6
+ //# sourceMappingURL=startup-hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup-hook.d.ts","sourceRoot":"","sources":["../../../src/trace/partition/startup-hook.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAEhE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAErD,eAAO,MAAM,yBAAyB,gCAAgC,CAAA;AAEtE,wBAAgB,+BAA+B,CAAC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,oBAAoB,GAAG,WAAW,CAOjG"}
@@ -0,0 +1,15 @@
1
+ // Partition maintenance as a startup hook. Running it at boot guarantees the
2
+ // near-term partitions exist before the app takes its first request — a fresh
3
+ // deploy on a new day must not write a trace into a partition that doesn't
4
+ // exist yet. The cron schedule keeps it current after that.
5
+ import { syncTracePartitions } from './sync.js';
6
+ export const TRACE_PARTITION_HOOK_NAME = 'trace-partition-maintenance';
7
+ export function createTracePartitionStartupHook(db, config) {
8
+ return {
9
+ name: TRACE_PARTITION_HOOK_NAME,
10
+ async execute() {
11
+ await syncTracePartitions(db, config);
12
+ },
13
+ };
14
+ }
15
+ //# sourceMappingURL=startup-hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startup-hook.js","sourceRoot":"","sources":["../../../src/trace/partition/startup-hook.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,8EAA8E;AAC9E,2EAA2E;AAC3E,4DAA4D;AAI5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAA;AAG/C,MAAM,CAAC,MAAM,yBAAyB,GAAG,6BAA6B,CAAA;AAEtE,MAAM,UAAU,+BAA+B,CAAC,EAAM,EAAE,MAA4B;IAClF,OAAO;QACL,IAAI,EAAE,yBAAyB;QAC/B,KAAK,CAAC,OAAO;YACX,MAAM,mBAAmB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;QACvC,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { DB } from '../../data/db/index.js';
2
+ import { type TracePartitionConfig } from './plan.js';
3
+ export interface PartitionSyncSummary {
4
+ readonly created: readonly string[];
5
+ readonly dropped: readonly string[];
6
+ }
7
+ /**
8
+ * Reconcile the trace tables' day partitions with the retention policy.
9
+ *
10
+ * `now` is injectable so the maintenance window is testable without mocking the
11
+ * clock. Returns the names created and dropped so a job runner can record them.
12
+ */
13
+ export declare function syncTracePartitions(db: DB, config: TracePartitionConfig, now?: Date): Promise<PartitionSyncSummary>;
14
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/trace/partition/sync.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAA;AAIhD,OAAO,EAAkB,KAAK,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAGrE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CACpC;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,oBAAoB,EAC5B,GAAG,GAAE,IAAiB,GACrB,OAAO,CAAC,oBAAoB,CAAC,CAiC/B"}
@@ -0,0 +1,62 @@
1
+ // The impure half of partition maintenance: read the catalog for partitions
2
+ // that exist, ask the planner what should exist, and apply the difference.
3
+ // Creating and dropping day partitions is idempotent — `IF NOT EXISTS` /
4
+ // `IF EXISTS` make a re-run after a crash a no-op — so this is safe to run on
5
+ // every boot and on a cron without coordination.
6
+ import { sql } from '../../data/db/sql.js';
7
+ import { quoteIdentifier } from '../../data/db/identifiers.js';
8
+ import { getBaseLogger } from '../../core/logging/index.js';
9
+ import { PARTITIONED_TRACE_TABLES } from './tables.js';
10
+ import { planPartitions } from './plan.js';
11
+ import { addDays } from './day.js';
12
+ /**
13
+ * Reconcile the trace tables' day partitions with the retention policy.
14
+ *
15
+ * `now` is injectable so the maintenance window is testable without mocking the
16
+ * clock. Returns the names created and dropped so a job runner can record them.
17
+ */
18
+ export async function syncTracePartitions(db, config, now = new Date()) {
19
+ const existing = await readExistingPartitions(db);
20
+ const plan = planPartitions({ now, config, existing });
21
+ for (const partition of plan.create) {
22
+ const child = quoteIdentifier(partition.name, 'trace partition');
23
+ const parent = quoteIdentifier(partition.parent, 'trace table');
24
+ // addDays re-validates the day; the bound is a generated YYYY-MM-DD literal.
25
+ const upper = addDays(partition.day, 1);
26
+ await db.execute(sql.raw(`CREATE TABLE IF NOT EXISTS ${child} PARTITION OF ${parent} ` +
27
+ `FOR VALUES FROM ('${partition.day}') TO ('${upper}')`));
28
+ }
29
+ for (const partition of plan.drop) {
30
+ const child = quoteIdentifier(partition.name, 'trace partition');
31
+ await db.execute(sql.raw(`DROP TABLE IF EXISTS ${child}`));
32
+ }
33
+ const summary = {
34
+ created: plan.create.map(p => p.name),
35
+ dropped: plan.drop.map(p => p.name),
36
+ };
37
+ if (summary.created.length > 0 || summary.dropped.length > 0) {
38
+ getBaseLogger().info({ created: summary.created, dropped: summary.dropped }, 'Trace partition maintenance applied');
39
+ }
40
+ return summary;
41
+ }
42
+ async function readExistingPartitions(db) {
43
+ const parents = PARTITIONED_TRACE_TABLES.map(t => t.parent);
44
+ const parentList = sql.join(parents.map(p => sql `${p}`), sql `, `);
45
+ const rows = await db.execute(sql `
46
+ SELECT p.relname AS parent, c.relname AS child
47
+ FROM pg_inherits i
48
+ JOIN pg_class c ON c.oid = i.inhrelid
49
+ JOIN pg_class p ON p.oid = i.inhparent
50
+ WHERE p.relname IN (${parentList})
51
+ `);
52
+ const byParent = new Map();
53
+ for (const parent of parents)
54
+ byParent.set(parent, new Set());
55
+ for (const row of rows) {
56
+ const parent = row['parent'];
57
+ const child = row['child'];
58
+ byParent.get(parent)?.add(child);
59
+ }
60
+ return byParent;
61
+ }
62
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/trace/partition/sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export type RetentionClass = 'hot' | 'cold';
2
+ export interface PartitionedTraceTable {
3
+ /** The parent table's wire name — partitions are children of this. */
4
+ readonly parent: string;
5
+ readonly retention: RetentionClass;
6
+ }
7
+ export declare const PARTITIONED_TRACE_TABLES: readonly PartitionedTraceTable[];
8
+ //# sourceMappingURL=tables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../../../src/trace/partition/tables.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,CAAA;AAE3C,MAAM,WAAW,qBAAqB;IACpC,sEAAsE;IACtE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAA;CACnC;AAED,eAAO,MAAM,wBAAwB,EAAE,SAAS,qBAAqB,EAKpE,CAAA"}
@@ -0,0 +1,16 @@
1
+ // The four partitioned trace tables and the retention window each one obeys.
2
+ // Hot tables (`trace`, `trace_step`) keep `hotRetentionDays` of partitions;
3
+ // cold tables (`trace_retained`, `trace_step_retained`) keep
4
+ // `errorRetentionDays`. Partition creation uses the same lead window for all
5
+ // four — copy-on-error can land a cold row on any day a hot row exists.
6
+ import { trace } from '../schema/trace.js';
7
+ import { traceStep } from '../schema/trace-step.js';
8
+ import { traceRetained } from '../schema/trace-retained.js';
9
+ import { traceStepRetained } from '../schema/trace-step-retained.js';
10
+ export const PARTITIONED_TRACE_TABLES = [
11
+ { parent: trace.$name, retention: 'hot' },
12
+ { parent: traceStep.$name, retention: 'hot' },
13
+ { parent: traceRetained.$name, retention: 'cold' },
14
+ { parent: traceStepRetained.$name, retention: 'cold' },
15
+ ];
16
+ //# sourceMappingURL=tables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tables.js","sourceRoot":"","sources":["../../../src/trace/partition/tables.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,4EAA4E;AAC5E,6DAA6D;AAC7D,6EAA6E;AAC7E,wEAAwE;AAExE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAA;AAUpE,MAAM,CAAC,MAAM,wBAAwB,GAAqC;IACxE,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;IACzC,EAAE,MAAM,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE;IAC7C,EAAE,MAAM,EAAE,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE;IAClD,EAAE,MAAM,EAAE,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE;CACvD,CAAA"}
@@ -0,0 +1,18 @@
1
+ import type { DB } from '../../data/db/index.js';
2
+ export interface CopyOnErrorResult {
3
+ /** Rows newly inserted into `trace_retained` (rows already retained excluded). */
4
+ readonly traces: number;
5
+ /** Rows newly inserted into `trace_step_retained`. */
6
+ readonly steps: number;
7
+ }
8
+ /**
9
+ * Copy an errored trace and its parent spine into the cold retained tables.
10
+ *
11
+ * `traceId` is the trace that ended badly. Its ancestry is walked through
12
+ * `parent_id` to the root; every trace on that spine, plus all of their steps,
13
+ * is inserted into `trace_retained` / `trace_step_retained`. Returns the count
14
+ * of rows actually inserted — zero for both when everything was already
15
+ * retained, or when `traceId` does not exist.
16
+ */
17
+ export declare function copyTraceOnError(db: DB, traceId: string): Promise<CopyOnErrorResult>;
18
+ //# sourceMappingURL=copy-on-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy-on-error.d.ts","sourceRoot":"","sources":["../../../src/trace/retain/copy-on-error.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,wBAAwB,CAAA;AAMhD,MAAM,WAAW,iBAAiB;IAChC,kFAAkF;IAClF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAUD;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2B1F"}