tubeless 0.1.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 (224) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +106 -0
  3. package/dist/abort.d.ts +12 -0
  4. package/dist/abort.d.ts.map +1 -0
  5. package/dist/abort.js +49 -0
  6. package/dist/abort.js.map +1 -0
  7. package/dist/batch.d.ts +22 -0
  8. package/dist/batch.d.ts.map +1 -0
  9. package/dist/batch.js +73 -0
  10. package/dist/batch.js.map +1 -0
  11. package/dist/checkpoint.d.ts +33 -0
  12. package/dist/checkpoint.d.ts.map +1 -0
  13. package/dist/checkpoint.js +71 -0
  14. package/dist/checkpoint.js.map +1 -0
  15. package/dist/child-execution.d.ts +30 -0
  16. package/dist/child-execution.d.ts.map +1 -0
  17. package/dist/child-execution.js +270 -0
  18. package/dist/child-execution.js.map +1 -0
  19. package/dist/cli-command.d.ts +29 -0
  20. package/dist/cli-command.d.ts.map +1 -0
  21. package/dist/cli-command.js +314 -0
  22. package/dist/cli-command.js.map +1 -0
  23. package/dist/cli-parser.d.ts +28 -0
  24. package/dist/cli-parser.d.ts.map +1 -0
  25. package/dist/cli-parser.js +557 -0
  26. package/dist/cli-parser.js.map +1 -0
  27. package/dist/cli-pipeline-command.d.ts +84 -0
  28. package/dist/cli-pipeline-command.d.ts.map +1 -0
  29. package/dist/cli-pipeline-command.js +185 -0
  30. package/dist/cli-pipeline-command.js.map +1 -0
  31. package/dist/cli-types.d.ts +220 -0
  32. package/dist/cli-types.d.ts.map +1 -0
  33. package/dist/cli-types.js +19 -0
  34. package/dist/cli-types.js.map +1 -0
  35. package/dist/cli.d.ts +6 -0
  36. package/dist/cli.d.ts.map +1 -0
  37. package/dist/cli.js +6 -0
  38. package/dist/cli.js.map +1 -0
  39. package/dist/env.d.ts +2 -0
  40. package/dist/env.d.ts.map +1 -0
  41. package/dist/env.js +8 -0
  42. package/dist/env.js.map +1 -0
  43. package/dist/file-utils.d.ts +4 -0
  44. package/dist/file-utils.d.ts.map +1 -0
  45. package/dist/file-utils.js +35 -0
  46. package/dist/file-utils.js.map +1 -0
  47. package/dist/interactive-reporter.d.ts +38 -0
  48. package/dist/interactive-reporter.d.ts.map +1 -0
  49. package/dist/interactive-reporter.js +308 -0
  50. package/dist/interactive-reporter.js.map +1 -0
  51. package/dist/lifecycle.d.ts +17 -0
  52. package/dist/lifecycle.d.ts.map +1 -0
  53. package/dist/lifecycle.js +77 -0
  54. package/dist/lifecycle.js.map +1 -0
  55. package/dist/live-ticker.d.ts +21 -0
  56. package/dist/live-ticker.d.ts.map +1 -0
  57. package/dist/live-ticker.js +377 -0
  58. package/dist/live-ticker.js.map +1 -0
  59. package/dist/mapped-child-progress.d.ts +109 -0
  60. package/dist/mapped-child-progress.d.ts.map +1 -0
  61. package/dist/mapped-child-progress.js +133 -0
  62. package/dist/mapped-child-progress.js.map +1 -0
  63. package/dist/node.d.ts +5 -0
  64. package/dist/node.d.ts.map +1 -0
  65. package/dist/node.js +5 -0
  66. package/dist/node.js.map +1 -0
  67. package/dist/paths.d.ts +9 -0
  68. package/dist/paths.d.ts.map +1 -0
  69. package/dist/paths.js +19 -0
  70. package/dist/paths.js.map +1 -0
  71. package/dist/pipeline-command-marker.d.ts +5 -0
  72. package/dist/pipeline-command-marker.d.ts.map +1 -0
  73. package/dist/pipeline-command-marker.js +21 -0
  74. package/dist/pipeline-command-marker.js.map +1 -0
  75. package/dist/pipeline-diagnostics.d.ts +4 -0
  76. package/dist/pipeline-diagnostics.d.ts.map +1 -0
  77. package/dist/pipeline-diagnostics.js +17 -0
  78. package/dist/pipeline-diagnostics.js.map +1 -0
  79. package/dist/pipeline-module.d.ts +62 -0
  80. package/dist/pipeline-module.d.ts.map +1 -0
  81. package/dist/pipeline-module.js +157 -0
  82. package/dist/pipeline-module.js.map +1 -0
  83. package/dist/pipeline.d.ts +606 -0
  84. package/dist/pipeline.d.ts.map +1 -0
  85. package/dist/pipeline.js +1444 -0
  86. package/dist/pipeline.js.map +1 -0
  87. package/dist/progress.d.ts +4 -0
  88. package/dist/progress.d.ts.map +1 -0
  89. package/dist/progress.js +8 -0
  90. package/dist/progress.js.map +1 -0
  91. package/dist/prompt-select.d.ts +81 -0
  92. package/dist/prompt-select.d.ts.map +1 -0
  93. package/dist/prompt-select.js +197 -0
  94. package/dist/prompt-select.js.map +1 -0
  95. package/dist/rate-limit.d.ts +7 -0
  96. package/dist/rate-limit.d.ts.map +1 -0
  97. package/dist/rate-limit.js +23 -0
  98. package/dist/rate-limit.js.map +1 -0
  99. package/dist/render.d.ts +21 -0
  100. package/dist/render.d.ts.map +1 -0
  101. package/dist/render.js +60 -0
  102. package/dist/render.js.map +1 -0
  103. package/dist/reporter-entry.d.ts +3 -0
  104. package/dist/reporter-entry.d.ts.map +1 -0
  105. package/dist/reporter-entry.js +3 -0
  106. package/dist/reporter-entry.js.map +1 -0
  107. package/dist/reporter.d.ts +50 -0
  108. package/dist/reporter.d.ts.map +1 -0
  109. package/dist/reporter.js +167 -0
  110. package/dist/reporter.js.map +1 -0
  111. package/dist/retry.d.ts +28 -0
  112. package/dist/retry.d.ts.map +1 -0
  113. package/dist/retry.js +59 -0
  114. package/dist/retry.js.map +1 -0
  115. package/dist/run-store-sqlite.d.ts +12 -0
  116. package/dist/run-store-sqlite.d.ts.map +1 -0
  117. package/dist/run-store-sqlite.js +187 -0
  118. package/dist/run-store-sqlite.js.map +1 -0
  119. package/dist/run-store-ui-http.d.ts +5 -0
  120. package/dist/run-store-ui-http.d.ts.map +1 -0
  121. package/dist/run-store-ui-http.js +19 -0
  122. package/dist/run-store-ui-http.js.map +1 -0
  123. package/dist/run-store-ui-page.d.ts +2 -0
  124. package/dist/run-store-ui-page.d.ts.map +1 -0
  125. package/dist/run-store-ui-page.js +759 -0
  126. package/dist/run-store-ui-page.js.map +1 -0
  127. package/dist/run-store-ui-protocol.d.ts +28 -0
  128. package/dist/run-store-ui-protocol.d.ts.map +1 -0
  129. package/dist/run-store-ui-protocol.js +84 -0
  130. package/dist/run-store-ui-protocol.js.map +1 -0
  131. package/dist/run-store-ui-state.d.ts +21 -0
  132. package/dist/run-store-ui-state.d.ts.map +1 -0
  133. package/dist/run-store-ui-state.js +65 -0
  134. package/dist/run-store-ui-state.js.map +1 -0
  135. package/dist/run-store-ui.d.ts +25 -0
  136. package/dist/run-store-ui.d.ts.map +1 -0
  137. package/dist/run-store-ui.js +217 -0
  138. package/dist/run-store-ui.js.map +1 -0
  139. package/dist/run-store.d.ts +109 -0
  140. package/dist/run-store.d.ts.map +1 -0
  141. package/dist/run-store.js +345 -0
  142. package/dist/run-store.js.map +1 -0
  143. package/dist/testing.d.ts +40 -0
  144. package/dist/testing.d.ts.map +1 -0
  145. package/dist/testing.js +83 -0
  146. package/dist/testing.js.map +1 -0
  147. package/dist/tracing-internal.d.ts +21 -0
  148. package/dist/tracing-internal.d.ts.map +1 -0
  149. package/dist/tracing-internal.js +206 -0
  150. package/dist/tracing-internal.js.map +1 -0
  151. package/dist/tracing-json.d.ts +12 -0
  152. package/dist/tracing-json.d.ts.map +1 -0
  153. package/dist/tracing-json.js +8 -0
  154. package/dist/tracing-json.js.map +1 -0
  155. package/dist/tracing-otel.d.ts +36 -0
  156. package/dist/tracing-otel.d.ts.map +1 -0
  157. package/dist/tracing-otel.js +60 -0
  158. package/dist/tracing-otel.js.map +1 -0
  159. package/dist/tracing.d.ts +48 -0
  160. package/dist/tracing.d.ts.map +1 -0
  161. package/dist/tracing.js +2 -0
  162. package/dist/tracing.js.map +1 -0
  163. package/dist/workbench-bin.d.ts +3 -0
  164. package/dist/workbench-bin.d.ts.map +1 -0
  165. package/dist/workbench-bin.js +8 -0
  166. package/dist/workbench-bin.js.map +1 -0
  167. package/dist/workbench-graph.d.ts +3 -0
  168. package/dist/workbench-graph.d.ts.map +1 -0
  169. package/dist/workbench-graph.js +64 -0
  170. package/dist/workbench-graph.js.map +1 -0
  171. package/dist/workbench-inspect.d.ts +3 -0
  172. package/dist/workbench-inspect.d.ts.map +1 -0
  173. package/dist/workbench-inspect.js +65 -0
  174. package/dist/workbench-inspect.js.map +1 -0
  175. package/dist/workbench-plan.d.ts +3 -0
  176. package/dist/workbench-plan.d.ts.map +1 -0
  177. package/dist/workbench-plan.js +72 -0
  178. package/dist/workbench-plan.js.map +1 -0
  179. package/dist/workbench-run.d.ts +13 -0
  180. package/dist/workbench-run.d.ts.map +1 -0
  181. package/dist/workbench-run.js +115 -0
  182. package/dist/workbench-run.js.map +1 -0
  183. package/dist/workbench-shared.d.ts +67 -0
  184. package/dist/workbench-shared.d.ts.map +1 -0
  185. package/dist/workbench-shared.js +163 -0
  186. package/dist/workbench-shared.js.map +1 -0
  187. package/dist/workbench-studio.d.ts +26 -0
  188. package/dist/workbench-studio.d.ts.map +1 -0
  189. package/dist/workbench-studio.js +57 -0
  190. package/dist/workbench-studio.js.map +1 -0
  191. package/dist/workbench-ui.d.ts +3 -0
  192. package/dist/workbench-ui.d.ts.map +1 -0
  193. package/dist/workbench-ui.js +262 -0
  194. package/dist/workbench-ui.js.map +1 -0
  195. package/dist/workbench.d.ts +5 -0
  196. package/dist/workbench.d.ts.map +1 -0
  197. package/dist/workbench.js +43 -0
  198. package/dist/workbench.js.map +1 -0
  199. package/docs/README.md +31 -0
  200. package/docs/agent-guide.md +168 -0
  201. package/docs/api-reference.md +269 -0
  202. package/docs/api-report.json +298 -0
  203. package/docs/child-pipeline-composition.md +185 -0
  204. package/docs/cli.md +118 -0
  205. package/docs/concepts.md +502 -0
  206. package/docs/getting-started.md +162 -0
  207. package/docs/llms.txt +62 -0
  208. package/docs/recipes.md +51 -0
  209. package/docs/studio.md +86 -0
  210. package/examples/best-effort.ts +42 -0
  211. package/examples/cancellation-and-testing.ts +45 -0
  212. package/examples/child-pipeline.ts +51 -0
  213. package/examples/cli-job.ts +86 -0
  214. package/examples/conditional-step.ts +41 -0
  215. package/examples/fan-out-progress.ts +53 -0
  216. package/examples/local-observability.ts +80 -0
  217. package/examples/publish-with-gates.ts +56 -0
  218. package/examples/rendering.ts +34 -0
  219. package/examples/resumable-enrichment.ts +75 -0
  220. package/examples/tracing.ts +35 -0
  221. package/examples/tsconfig.json +15 -0
  222. package/examples/typed-import.ts +54 -0
  223. package/examples/validated-boundaries.ts +75 -0
  224. package/package.json +156 -0
@@ -0,0 +1,50 @@
1
+ import type { PipelineHooks, PipelineLogger } from "./pipeline.js";
2
+ export type ReporterColorMode = "always" | "auto" | "never";
3
+ export type ReporterSymbolMode = "ascii" | "auto" | "emoji" | "unicode";
4
+ export interface ReporterTerminalCapabilities {
5
+ color: boolean;
6
+ isTTY: boolean;
7
+ unicode: boolean;
8
+ }
9
+ export interface RunReporterConfig {
10
+ /** Defaults to auto: color only when the output supports it. */
11
+ color?: ReporterColorMode;
12
+ /** Defaults to auto: Unicode in capable terminals, ASCII elsewhere. */
13
+ symbols?: ReporterSymbolMode;
14
+ /** Override detected capabilities, primarily for custom streams and tests. */
15
+ terminal?: Partial<ReporterTerminalCapabilities>;
16
+ /** Log the pipeline start summary. Defaults to true. */
17
+ logPlan?: boolean;
18
+ /** Log the final pipeline summary. Defaults to true. */
19
+ logSummary?: boolean;
20
+ }
21
+ export interface RunReporterOptions extends RunReporterConfig {
22
+ log: PipelineLogger;
23
+ }
24
+ export interface ReporterSymbols {
25
+ complete: string;
26
+ fail: string;
27
+ pending: string;
28
+ skip: string;
29
+ start: string;
30
+ }
31
+ export declare function detectTerminalCapabilities(overrides?: Partial<ReporterTerminalCapabilities>): ReporterTerminalCapabilities;
32
+ export declare function formatDurationMs(durationMs: number): string;
33
+ export interface ReporterTheme {
34
+ capabilities: ReporterTerminalCapabilities;
35
+ colorEnabled: boolean;
36
+ styled: {
37
+ complete(value: string): string;
38
+ description(value: string): string;
39
+ duration(value: string): string;
40
+ fail(value: string): string;
41
+ pipeline(value: string): string;
42
+ skip(value: string): string;
43
+ start(value: string): string;
44
+ };
45
+ symbols: ReporterSymbols;
46
+ }
47
+ export declare function createReporterTheme(config?: RunReporterConfig): ReporterTheme;
48
+ /** Create concise, append-only lifecycle logging for a pipeline run. */
49
+ export declare function createRunReporter<TResult = unknown>(options: RunReporterOptions): PipelineHooks<TResult>;
50
+ //# sourceMappingURL=reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGnE,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;AAC5D,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;AAExE,MAAM,WAAW,4BAA4B;IAC3C,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,KAAK,CAAC,EAAE,iBAAiB,CAAC;IAC1B,uEAAuE;IACvE,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,OAAO,CAAC,4BAA4B,CAAC,CAAC;IACjD,wDAAwD;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wDAAwD;IACxD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D,GAAG,EAAE,cAAc,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAmBD,wBAAgB,0BAA0B,CACxC,SAAS,GAAE,OAAO,CAAC,4BAA4B,CAAM,GACpD,4BAA4B,CAa9B;AAsBD,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAU3D;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,4BAA4B,CAAC;IAC3C,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE;QACN,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;QAChC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;QACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;QAChC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;QAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;QAChC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;QAC5B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;KAC9B,CAAC;IACF,OAAO,EAAE,eAAe,CAAC;CAC1B;AAED,wBAAgB,mBAAmB,CAAC,MAAM,GAAE,iBAAsB,GAAG,aAAa,CAkBjF;AAED,wEAAwE;AACxE,wBAAgB,iBAAiB,CAAC,OAAO,GAAG,OAAO,EACjD,OAAO,EAAE,kBAAkB,GAC1B,aAAa,CAAC,OAAO,CAAC,CAyGxB"}
@@ -0,0 +1,167 @@
1
+ import { hasVisibleStepProgress } from "./progress.js";
2
+ const SYMBOLS = {
3
+ ascii: { complete: "ok", fail: "fail", pending: ".", skip: "-", start: "->" },
4
+ // Distinct from pending (○): skipped work uses a yellow dash, not a green check.
5
+ unicode: { complete: "✓", fail: "✗", pending: "○", skip: "–", start: "→" },
6
+ emoji: { complete: "✅", fail: "❌", pending: "▫️", skip: "⏭️", start: "⏳" },
7
+ };
8
+ const ANSI = {
9
+ boldCyan: "\u001B[1;36m",
10
+ cyan: "\u001B[36m",
11
+ dim: "\u001B[2m",
12
+ green: "\u001B[32m",
13
+ red: "\u001B[31m",
14
+ reset: "\u001B[0m",
15
+ yellow: "\u001B[33m",
16
+ };
17
+ export function detectTerminalCapabilities(overrides = {}) {
18
+ const isTTY = overrides.isTTY ?? process.stdout.isTTY === true;
19
+ const termIsDumb = process.env.TERM === "dumb";
20
+ const forceColor = process.env.FORCE_COLOR;
21
+ const autoColor = forceColor !== undefined
22
+ ? forceColor !== "0"
23
+ : process.env.NO_COLOR === undefined && isTTY && !termIsDumb;
24
+ return {
25
+ isTTY,
26
+ color: overrides.color ?? autoColor,
27
+ unicode: overrides.unicode ?? (isTTY && !termIsDumb),
28
+ };
29
+ }
30
+ function resolveColorEnabled(mode, capabilities) {
31
+ if (mode === "always")
32
+ return true;
33
+ if (mode === "never")
34
+ return false;
35
+ return capabilities.color;
36
+ }
37
+ function resolveSymbols(mode, capabilities) {
38
+ return SYMBOLS[mode === "auto" ? (capabilities.unicode ? "unicode" : "ascii") : mode];
39
+ }
40
+ function paint(enabled, code, value) {
41
+ return enabled ? `${code}${value}${ANSI.reset}` : value;
42
+ }
43
+ export function formatDurationMs(durationMs) {
44
+ const ms = Math.max(0, Math.round(durationMs));
45
+ if (ms < 1000)
46
+ return `${ms}ms`;
47
+ if (ms < 60_000) {
48
+ const seconds = ms / 1000;
49
+ return Number.isInteger(seconds) ? `${seconds}s` : `${seconds.toFixed(1)}s`;
50
+ }
51
+ const minutes = Math.floor(ms / 60_000);
52
+ const seconds = Math.round((ms % 60_000) / 1000);
53
+ return seconds === 0 ? `${minutes}m` : `${minutes}m${seconds}s`;
54
+ }
55
+ export function createReporterTheme(config = {}) {
56
+ const capabilities = detectTerminalCapabilities(config.terminal);
57
+ const colorEnabled = resolveColorEnabled(config.color ?? "auto", capabilities);
58
+ const symbols = resolveSymbols(config.symbols ?? "auto", capabilities);
59
+ return {
60
+ capabilities,
61
+ colorEnabled,
62
+ symbols,
63
+ styled: {
64
+ complete: (value) => paint(colorEnabled, ANSI.green, value),
65
+ description: (value) => paint(colorEnabled, ANSI.dim, value),
66
+ duration: (value) => paint(colorEnabled, ANSI.dim, value),
67
+ fail: (value) => paint(colorEnabled, ANSI.red, value),
68
+ pipeline: (value) => paint(colorEnabled, ANSI.boldCyan, value),
69
+ skip: (value) => paint(colorEnabled, ANSI.yellow, value),
70
+ start: (value) => paint(colorEnabled, ANSI.cyan, value),
71
+ },
72
+ };
73
+ }
74
+ /** Create concise, append-only lifecycle logging for a pipeline run. */
75
+ export function createRunReporter(options) {
76
+ const { log } = options;
77
+ const logPlan = options.logPlan !== false;
78
+ const logSummary = options.logSummary !== false;
79
+ const { styled, symbols } = createReporterTheme(options);
80
+ // Throttle progress lines so concurrent mapped children stay readable.
81
+ const lastProgressLogAt = new Map();
82
+ const lastProgressMessage = new Map();
83
+ const progressLogIntervalMs = 750;
84
+ const displayName = (step) => step.name ?? step.id;
85
+ const clearProgress = (stepId) => {
86
+ lastProgressLogAt.delete(stepId);
87
+ lastProgressMessage.delete(stepId);
88
+ };
89
+ return {
90
+ onPipelineStart: (plan) => {
91
+ if (!logPlan)
92
+ return;
93
+ log.log(styled.pipeline(`Pipeline ${plan.pipelineId}: starting (${plan.steps.length} steps, dryRun=${plan.dryRun})`));
94
+ },
95
+ onStepStart: ({ step }) => {
96
+ const description = step.description ? ` - ${styled.description(step.description)}` : "";
97
+ log.log(` ${styled.start(symbols.start)} ${displayName(step)}${description}`);
98
+ },
99
+ onStepProgress: ({ progress, step }) => {
100
+ // Ignore empty/non-visible progress snapshots (no message, total, or work count).
101
+ if (!hasVisibleStepProgress(progress))
102
+ return;
103
+ const total = progress.total !== undefined && Number.isFinite(progress.total)
104
+ ? String(progress.total)
105
+ : "?";
106
+ const message = progress.message ? ` ${progress.message}` : "";
107
+ const line = `${progress.completed}/${total}${message}`;
108
+ const now = Date.now();
109
+ const previousAt = lastProgressLogAt.get(step.id) ?? Number.NEGATIVE_INFINITY;
110
+ const previousLine = lastProgressMessage.get(step.id);
111
+ const isCompletion = progress.total !== undefined &&
112
+ Number.isFinite(progress.total) &&
113
+ progress.completed >= progress.total;
114
+ if (!isCompletion && line === previousLine && now - previousAt < progressLogIntervalMs) {
115
+ return;
116
+ }
117
+ if (!isCompletion && now - previousAt < progressLogIntervalMs && previousLine !== undefined) {
118
+ return;
119
+ }
120
+ lastProgressLogAt.set(step.id, now);
121
+ lastProgressMessage.set(step.id, line);
122
+ log.log(` ${styled.description("…")} ${displayName(step)} ${styled.description(line)}`);
123
+ },
124
+ onStepComplete: (event) => {
125
+ clearProgress(event.id);
126
+ const durationMs = event.finishedAtMs - event.startedAtMs;
127
+ log.log(` ${styled.complete(symbols.complete)} ${displayName(event)} ${styled.duration(`(${formatDurationMs(durationMs)})`)}`);
128
+ },
129
+ onStepSkip: (event) => {
130
+ clearProgress(event.id);
131
+ const detail = event.dependencyId
132
+ ? `${event.reason}: ${event.dependencyId}`
133
+ : (event.message ?? event.reason);
134
+ log.log(` ${styled.skip(symbols.skip)} ${displayName(event.step)} ${styled.duration(`(${detail})`)}`);
135
+ },
136
+ onStepCancel: (event) => {
137
+ clearProgress(event.id);
138
+ log.warn(` ${styled.skip(symbols.skip)} ${displayName(event.step)}: cancelled: ${event.error.message}`);
139
+ },
140
+ onStepFail: (event) => {
141
+ clearProgress(event.id);
142
+ log.error(` ${styled.fail(symbols.fail)} ${displayName(event.step)}: ${event.error.message}`);
143
+ },
144
+ onFinalizeStart: () => {
145
+ log.log(` ${styled.start(symbols.start)} finalize`);
146
+ },
147
+ onFinalizeComplete: ({ durationMs }) => {
148
+ log.log(` ${styled.complete(symbols.complete)} finalize ${styled.duration(`(${formatDurationMs(durationMs)})`)}`);
149
+ },
150
+ onFinalizeError: ({ error }) => {
151
+ log.error(` ${styled.fail(symbols.fail)} finalize: ${error.message}`);
152
+ },
153
+ onPipelineComplete: (result) => {
154
+ if (!logSummary)
155
+ return;
156
+ const durationMs = result.finishedAtMs - result.startedAtMs;
157
+ const message = `Pipeline ${result.pipelineId}: done in ${formatDurationMs(durationMs)} (status=${result.status}, steps=${result.steps.length}, errors=${result.errors.length})`;
158
+ if (result.status === "completed") {
159
+ log.log(styled.complete(message));
160
+ }
161
+ else {
162
+ log.error(styled.fail(message));
163
+ }
164
+ },
165
+ };
166
+ }
167
+ //# sourceMappingURL=reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export interface RetryOptions {
2
+ maxAttempts: number;
3
+ baseDelayMs: number;
4
+ maxDelayMs?: number;
5
+ jitter?: boolean;
6
+ random?: () => number;
7
+ signal?: AbortSignal;
8
+ sleep?: (durationMs: number, signal?: AbortSignal) => Promise<void>;
9
+ /**
10
+ * Return false to stop retrying and rethrow the current error immediately.
11
+ * The attempt number is the 1-based attempt that just failed. When omitted,
12
+ * every error remains retryable until maxAttempts is reached.
13
+ */
14
+ shouldRetry?: (error: unknown, attempt: number) => boolean;
15
+ }
16
+ /** Metadata supplied to each retry operation attempt. */
17
+ export interface RetryAttemptContext {
18
+ /** 1-based attempt number. */
19
+ attempt: number;
20
+ /** Total allowed attempts from `RetryOptions.maxAttempts`. */
21
+ maxAttempts: number;
22
+ /** The same signal used for backoff and pre-attempt cancellation checks. */
23
+ signal?: AbortSignal;
24
+ }
25
+ /** A no-argument async function remains assignable for simple retry callers. */
26
+ export type RetryOperation<T> = (context: RetryAttemptContext) => Promise<T>;
27
+ export declare function withRetry<T>(operation: RetryOperation<T>, options: RetryOptions, onRetry?: (attempt: number, error: unknown, delayMs: number) => void): Promise<T>;
28
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;CAC5D;AAED,yDAAyD;AACzD,MAAM,WAAW,mBAAmB;IAClC,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,gFAAgF;AAChF,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AA0B7E,wBAAsB,SAAS,CAAC,CAAC,EAC/B,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC,EAC5B,OAAO,EAAE,YAAY,EACrB,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,GACnE,OAAO,CAAC,CAAC,CAAC,CAuCZ"}
package/dist/retry.js ADDED
@@ -0,0 +1,59 @@
1
+ import { abortableSleep, throwIfAborted as throwIfSignalAborted } from "./abort.js";
2
+ function computeDelayMs(attempt, options) {
3
+ const raw = options.baseDelayMs * 2 ** (attempt - 1);
4
+ const capped = options.maxDelayMs === undefined ? raw : Math.min(raw, options.maxDelayMs);
5
+ if (!options.jitter) {
6
+ return capped;
7
+ }
8
+ const jittered = capped + (options.random ?? Math.random)() * capped * 0.1;
9
+ return options.maxDelayMs === undefined ? jittered : Math.min(jittered, options.maxDelayMs);
10
+ }
11
+ function throwIfAborted(signal) {
12
+ throwIfSignalAborted(signal, "Retry");
13
+ }
14
+ async function sleepBeforeRetry(durationMs, options) {
15
+ throwIfAborted(options.signal);
16
+ if (options.sleep) {
17
+ await options.sleep(durationMs, options.signal);
18
+ throwIfAborted(options.signal);
19
+ return;
20
+ }
21
+ await abortableSleep(durationMs, options.signal, "Retry");
22
+ }
23
+ export async function withRetry(operation, options, onRetry) {
24
+ if (!Number.isInteger(options.maxAttempts) || options.maxAttempts < 1) {
25
+ throw new Error(`maxAttempts must be a positive integer, got ${options.maxAttempts}`);
26
+ }
27
+ if (!Number.isFinite(options.baseDelayMs) || options.baseDelayMs < 0) {
28
+ throw new Error(`baseDelayMs must be a non-negative finite number, got ${options.baseDelayMs}`);
29
+ }
30
+ if (options.maxDelayMs !== undefined &&
31
+ (!Number.isFinite(options.maxDelayMs) || options.maxDelayMs < 0)) {
32
+ throw new Error(`maxDelayMs must be a non-negative finite number, got ${options.maxDelayMs}`);
33
+ }
34
+ let lastError;
35
+ for (let attempt = 1; attempt <= options.maxAttempts; attempt++) {
36
+ throwIfAborted(options.signal);
37
+ try {
38
+ return await operation({
39
+ attempt,
40
+ maxAttempts: options.maxAttempts,
41
+ signal: options.signal,
42
+ });
43
+ }
44
+ catch (error) {
45
+ lastError = error;
46
+ if (attempt >= options.maxAttempts) {
47
+ break;
48
+ }
49
+ if (options.shouldRetry && !options.shouldRetry(error, attempt)) {
50
+ throw error;
51
+ }
52
+ const delayMs = computeDelayMs(attempt, options);
53
+ onRetry?.(attempt, error, delayMs);
54
+ await sleepBeforeRetry(delayMs, options);
55
+ }
56
+ }
57
+ throw lastError;
58
+ }
59
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../src/retry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { PipelineRunEventStore } from "./run-store.js";
2
+ /** SQLite event store plus the explicit all-history maintenance operation. */
3
+ export interface SqlitePipelineRunStore extends PipelineRunEventStore {
4
+ /** Delete every recorded event and compact the database; individual mutation stays forbidden. */
5
+ clearHistory(): void | Promise<void>;
6
+ }
7
+ /**
8
+ * Open the optional local SQLite trace store used by `tubeless run --store` and
9
+ * `tubeless ui`. The main executor never imports this module.
10
+ */
11
+ export declare function openSqlitePipelineRunStore(filename: string): Promise<SqlitePipelineRunStore>;
12
+ //# sourceMappingURL=run-store-sqlite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-store-sqlite.d.ts","sourceRoot":"","sources":["../src/run-store-sqlite.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,qBAAqB,EAEtB,MAAM,gBAAgB,CAAC;AAkFxB,8EAA8E;AAC9E,MAAM,WAAW,sBAAuB,SAAQ,qBAAqB;IACnE,iGAAiG;IACjG,YAAY,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AA+CD;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,sBAAsB,CAAC,CAwGjC"}
@@ -0,0 +1,187 @@
1
+ import { mkdir } from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ const RUN_EVENT_STORE_VERSION = 1;
4
+ const RUN_EVENT_STORE_APPEND_ONLY_TRIGGERS = `
5
+ CREATE TRIGGER IF NOT EXISTS pipeline_run_events_no_update
6
+ BEFORE UPDATE ON pipeline_run_events
7
+ BEGIN
8
+ SELECT RAISE(ABORT, 'pipeline_run_events is append-only');
9
+ END;
10
+
11
+ CREATE TRIGGER IF NOT EXISTS pipeline_run_events_no_delete
12
+ BEFORE DELETE ON pipeline_run_events
13
+ BEGIN
14
+ SELECT RAISE(ABORT, 'pipeline_run_events is append-only');
15
+ END;
16
+ `;
17
+ const RUN_EVENT_STORE_SCHEMA = `
18
+ PRAGMA journal_mode = WAL;
19
+ PRAGMA synchronous = NORMAL;
20
+ PRAGMA foreign_keys = ON;
21
+
22
+ CREATE TABLE IF NOT EXISTS pipeline_run_events (
23
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
24
+ version INTEGER NOT NULL,
25
+ run_id TEXT NOT NULL,
26
+ parent_run_id TEXT,
27
+ pipeline_id TEXT NOT NULL,
28
+ step_id TEXT,
29
+ attempt_id TEXT,
30
+ item_key TEXT,
31
+ event_name TEXT NOT NULL,
32
+ timestamp_ms INTEGER NOT NULL,
33
+ duration_ms REAL,
34
+ attributes_json TEXT NOT NULL,
35
+ error_json TEXT
36
+ );
37
+
38
+ CREATE INDEX IF NOT EXISTS pipeline_run_events_run_id_idx
39
+ ON pipeline_run_events(run_id, id);
40
+ CREATE INDEX IF NOT EXISTS pipeline_run_events_pipeline_id_idx
41
+ ON pipeline_run_events(pipeline_id, id DESC);
42
+ CREATE INDEX IF NOT EXISTS pipeline_run_events_timestamp_idx
43
+ ON pipeline_run_events(timestamp_ms DESC);
44
+
45
+ ${RUN_EVENT_STORE_APPEND_ONLY_TRIGGERS}
46
+ `;
47
+ function statement(database, sql) {
48
+ const prepared = database.query?.(sql) ?? database.prepare?.(sql);
49
+ if (!prepared)
50
+ throw new Error("The current SQLite runtime does not support prepared queries.");
51
+ return prepared;
52
+ }
53
+ async function loadSqliteModule() {
54
+ const specifier = "Bun" in globalThis ? "bun:sqlite" : "node:sqlite";
55
+ // SAFETY: The dynamic import resolves to the built-in sqlite module whose
56
+ // runtime shape is the `SqliteModule` interface we depend on.
57
+ return (await import(specifier));
58
+ }
59
+ async function openDatabase(filename) {
60
+ const module = await loadSqliteModule();
61
+ const Database = module.Database ?? module.DatabaseSync;
62
+ if (!Database)
63
+ throw new Error("No synchronous SQLite database implementation is available.");
64
+ return new Database(filename);
65
+ }
66
+ function mapRow(row) {
67
+ const event = {
68
+ // SAFETY: attributes_json was written by this store via JSON.stringify of a
69
+ // PipelineTraceEvent["attributes"] value, so parsing yields the same shape.
70
+ attributes: JSON.parse(row.attributes_json),
71
+ id: Number(row.id),
72
+ name: row.event_name,
73
+ pipelineId: row.pipeline_id,
74
+ runId: row.run_id,
75
+ timestampMs: Number(row.timestamp_ms),
76
+ version: row.version,
77
+ };
78
+ if (row.attempt_id)
79
+ event.attemptId = row.attempt_id;
80
+ if (row.duration_ms !== null)
81
+ event.durationMs = Number(row.duration_ms);
82
+ if (row.error_json) {
83
+ // SAFETY: error_json was written by this store via JSON.stringify of a
84
+ // NonNullable<PipelineTraceEvent["error"]> value, so parsing yields the same shape.
85
+ event.error = JSON.parse(row.error_json);
86
+ }
87
+ if (row.item_key)
88
+ event.itemKey = row.item_key;
89
+ if (row.parent_run_id)
90
+ event.parentRunId = row.parent_run_id;
91
+ if (row.step_id)
92
+ event.stepId = row.step_id;
93
+ return event;
94
+ }
95
+ /**
96
+ * Open the optional local SQLite trace store used by `tubeless run --store` and
97
+ * `tubeless ui`. The main executor never imports this module.
98
+ */
99
+ export async function openSqlitePipelineRunStore(filename) {
100
+ const resolvedFilename = filename === ":memory:" ? filename : path.resolve(filename);
101
+ if (resolvedFilename !== ":memory:") {
102
+ await mkdir(path.dirname(resolvedFilename), { recursive: true });
103
+ }
104
+ const database = await openDatabase(resolvedFilename);
105
+ try {
106
+ // SAFETY: `PRAGMA user_version` always returns a single row with a
107
+ // `user_version` column, so the first result row matches this shape.
108
+ const versionRow = statement(database, "PRAGMA user_version").all()[0];
109
+ const version = Number(versionRow?.user_version ?? 0);
110
+ if (version !== 0 && version !== RUN_EVENT_STORE_VERSION) {
111
+ throw new Error(`Unsupported pipeline run store schema version ${version}; expected ${RUN_EVENT_STORE_VERSION}.`);
112
+ }
113
+ database.exec(RUN_EVENT_STORE_SCHEMA);
114
+ database.exec(`PRAGMA user_version = ${RUN_EVENT_STORE_VERSION}`);
115
+ }
116
+ catch (error) {
117
+ database.close();
118
+ throw error;
119
+ }
120
+ const insert = statement(database, `INSERT INTO pipeline_run_events (
121
+ version, run_id, parent_run_id, pipeline_id, step_id, attempt_id, item_key,
122
+ event_name, timestamp_ms, duration_ms, attributes_json, error_json
123
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
124
+ let closed = false;
125
+ return {
126
+ export(event) {
127
+ if (closed)
128
+ throw new Error("Cannot append to a closed pipeline run store.");
129
+ insert.run(event.version, event.runId, event.parentRunId ?? null, event.pipelineId, event.stepId ?? null, event.attemptId ?? null, event.itemKey ?? null, event.name, event.timestampMs, event.durationMs ?? null, JSON.stringify(event.attributes), event.error ? JSON.stringify(event.error) : null);
130
+ },
131
+ flush() { },
132
+ async listEvents(query = {}) {
133
+ if (closed)
134
+ throw new Error("Cannot query a closed pipeline run store.");
135
+ const predicates = [];
136
+ const params = [];
137
+ if (query.afterId !== undefined) {
138
+ predicates.push("id > ?");
139
+ params.push(query.afterId);
140
+ }
141
+ if (query.pipelineId !== undefined) {
142
+ predicates.push("pipeline_id = ?");
143
+ params.push(query.pipelineId);
144
+ }
145
+ if (query.runId !== undefined) {
146
+ predicates.push("run_id = ?");
147
+ params.push(query.runId);
148
+ }
149
+ const limit = Math.max(1, Math.min(100_000, Math.floor(query.limit ?? 20_000)));
150
+ params.push(limit);
151
+ const where = predicates.length > 0 ? `WHERE ${predicates.join(" AND ")}` : "";
152
+ // SAFETY: The SELECT * columns match the StoredEventRow interface exactly
153
+ // (the table schema is owned by this module), so each result row is one.
154
+ const rows = statement(database, `SELECT * FROM pipeline_run_events ${where} ORDER BY id ASC LIMIT ?`).all(...params);
155
+ return rows.map(mapRow);
156
+ },
157
+ clearHistory() {
158
+ if (closed)
159
+ throw new Error("Cannot clear a closed pipeline run store.");
160
+ try {
161
+ database.exec(`
162
+ BEGIN IMMEDIATE;
163
+ DROP TRIGGER IF EXISTS pipeline_run_events_no_update;
164
+ DROP TRIGGER IF EXISTS pipeline_run_events_no_delete;
165
+ DELETE FROM pipeline_run_events;
166
+ ${RUN_EVENT_STORE_APPEND_ONLY_TRIGGERS}
167
+ COMMIT;
168
+ `);
169
+ }
170
+ catch (error) {
171
+ try {
172
+ database.exec("ROLLBACK");
173
+ }
174
+ catch { }
175
+ throw error;
176
+ }
177
+ database.exec("VACUUM; PRAGMA wal_checkpoint(TRUNCATE);");
178
+ },
179
+ close() {
180
+ if (closed)
181
+ return;
182
+ closed = true;
183
+ database.close();
184
+ },
185
+ };
186
+ }
187
+ //# sourceMappingURL=run-store-sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-store-sqlite.js","sourceRoot":"","sources":["../src/run-store-sqlite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /** Format a host literal for an HTTP URL or authority. */
2
+ export declare function formatHttpUrlHost(host: string): string;
3
+ /** Normalize a bare HTTP authority, including omission of the default port. */
4
+ export declare function normalizeHttpAuthority(authority: string | undefined): string | undefined;
5
+ //# sourceMappingURL=run-store-ui-http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-store-ui-http.d.ts","sourceRoot":"","sources":["../src/run-store-ui-http.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,+EAA+E;AAC/E,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CASxF"}
@@ -0,0 +1,19 @@
1
+ /** Format a host literal for an HTTP URL or authority. */
2
+ export function formatHttpUrlHost(host) {
3
+ return host.includes(":") ? `[${host}]` : host;
4
+ }
5
+ /** Normalize a bare HTTP authority, including omission of the default port. */
6
+ export function normalizeHttpAuthority(authority) {
7
+ if (!authority || /[\s\\/@?#]/.test(authority))
8
+ return undefined;
9
+ try {
10
+ const parsed = new URL(`http://${authority}/`);
11
+ if (parsed.username || parsed.password || parsed.pathname !== "/")
12
+ return undefined;
13
+ return parsed.host.toLowerCase();
14
+ }
15
+ catch {
16
+ return undefined;
17
+ }
18
+ }
19
+ //# sourceMappingURL=run-store-ui-http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-store-ui-http.js","sourceRoot":"","sources":["../src/run-store-ui-http.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,sBAAsB,CAAC,SAA6B;IAClE,IAAI,CAAC,SAAS,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IACjE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,UAAU,SAAS,GAAG,CAAC,CAAC;QAC/C,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,GAAG;YAAE,OAAO,SAAS,CAAC;QACpF,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const PIPELINE_RUN_STUDIO_HTML: string;
2
+ //# sourceMappingURL=run-store-ui-page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-store-ui-page.d.ts","sourceRoot":"","sources":["../src/run-store-ui-page.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB,QAqvB7B,CAAC"}