tubeless 0.2.7 → 0.2.8

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 (46) hide show
  1. package/dist/core/pipeline-finalizer.js +0 -1
  2. package/dist/core/pipeline-finalizer.js.map +1 -1
  3. package/dist/project/project-compiler.d.ts +21 -4
  4. package/dist/project/project-compiler.js +120 -13
  5. package/dist/project/project-compiler.js.map +1 -1
  6. package/dist/project/project-document.d.ts +32 -2
  7. package/dist/project/project-document.js +39 -4
  8. package/dist/project/project-document.js.map +1 -1
  9. package/dist/project/project.d.ts +2 -2
  10. package/dist/project/project.js.map +1 -1
  11. package/dist/reporter/interactive-reporter.js +2 -6
  12. package/dist/reporter/interactive-reporter.js.map +1 -1
  13. package/dist/reporter/live-ticker-worker.js +55 -50
  14. package/dist/reporter/live-ticker-worker.js.map +1 -1
  15. package/dist/reporter/live-ticker.d.ts +0 -3
  16. package/dist/reporter/live-ticker.js +92 -170
  17. package/dist/reporter/live-ticker.js.map +1 -1
  18. package/dist/workbench/workbench-bin.d.ts +2 -6
  19. package/dist/workbench/workbench-bin.js +8 -20
  20. package/dist/workbench/workbench-bin.js.map +1 -1
  21. package/dist/workbench/workbench-shared.d.ts +1 -15
  22. package/dist/workbench/workbench-shared.js +10 -42
  23. package/dist/workbench/workbench-shared.js.map +1 -1
  24. package/dist/workbench/workbench-ui.js +0 -3
  25. package/dist/workbench/workbench-ui.js.map +1 -1
  26. package/docs/README.md +12 -13
  27. package/docs/agent-guide.md +8 -5
  28. package/docs/api-reference.md +1 -7
  29. package/docs/api-report.json +1 -7
  30. package/docs/cli.md +4 -6
  31. package/docs/declarative-pipelines.md +74 -26
  32. package/docs/getting-started.md +2 -3
  33. package/docs/llms.txt +0 -3
  34. package/docs/pipeline-document.schema.json +53 -2
  35. package/docs/recipes.md +1 -1
  36. package/examples/catalog/tubeless.project.ts +2 -0
  37. package/examples/declarative/handlers.ts +47 -4
  38. package/examples/declarative/pipelines.yaml +29 -7
  39. package/package.json +2 -5
  40. package/skills/tubeless/SKILL.md +6 -5
  41. package/dist/reporter/live-ticker-supervisor.d.ts +0 -1
  42. package/dist/reporter/live-ticker-supervisor.js +0 -44
  43. package/dist/reporter/live-ticker-supervisor.js.map +0 -1
  44. package/dist/workbench/workbench-trampoline.d.ts +0 -71
  45. package/dist/workbench/workbench-trampoline.js +0 -136
  46. package/dist/workbench/workbench-trampoline.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"interactive-reporter.js","sourceRoot":"","sources":["../../src/reporter/interactive-reporter.ts"],"names":[],"mappings":"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","sourcesContent":["import { format } from \"node:util\";\nimport type {\n PipelineError,\n PipelineHooks,\n PipelineLogger,\n PipelinePlan,\n PipelineRun,\n PipelineStepProgress,\n PipelineStepStatus,\n} from \"../core/pipeline.js\";\nimport { hasVisibleStepProgress } from \"../core/progress.js\";\nimport {\n createLiveTicker,\n elapsedToken,\n shimmerToken,\n SPINNER_TOKEN,\n type LiveTicker,\n} from \"./live-ticker.js\";\nimport {\n createReporterTheme,\n createRunReporter,\n formatDurationMs,\n type ReporterTheme,\n type RunReporterConfig,\n} from \"./reporter.js\";\n\nexport type PipelineReporterMode = \"auto\" | \"interactive\" | \"plain\";\nexport type ResolvedPipelineReporterMode = Exclude<PipelineReporterMode, \"auto\">;\n\nexport interface ReporterOutput {\n readonly columns?: number;\n readonly rows?: number;\n /**\n * File descriptor for live frames. When set, spinner, elapsed time, and shimmer\n * paint on a worker thread so they keep moving during CPU-bound steps. Defaults\n * to stdout's fd when `output` is `process.stdout`.\n */\n readonly fd?: number;\n readonly isTTY?: boolean;\n write(chunk: string): unknown;\n}\n\nexport interface PipelineReporterConfig extends RunReporterConfig {\n /** Auto selects the interactive renderer only for a capable, non-CI TTY. */\n mode?: PipelineReporterMode;\n /** Terminal stream used by the interactive renderer. Defaults to stdout. */\n output?: ReporterOutput;\n /** Spinner redraw cadence. Defaults to 80ms. */\n refreshIntervalMs?: number;\n /** Filled/empty character width for determinate progress. Defaults to 20. */\n progressBarWidth?: number;\n}\n\nexport interface PipelineReporterOptions extends PipelineReporterConfig {\n log: PipelineLogger;\n}\n\nexport interface PipelineReporterController<TResult = unknown> {\n readonly hooks: PipelineHooks<TResult>;\n readonly log: PipelineLogger;\n readonly mode: ResolvedPipelineReporterMode;\n /** Stop redraws and restore terminal state. Safe to call more than once. */\n dispose(): void;\n}\n\ntype StepState = PipelineStepStatus & {\n /** Wall-clock ms from Date.now() when the step entered the running state. */\n startedAtMs?: number;\n details?: PipelineStepProgress[\"details\"];\n};\n\ntype FinalizeState =\n | { status: \"idle\" }\n | { status: \"running\" }\n | { durationMs: number; status: \"completed\" }\n | { durationMs: number; error: PipelineError; status: \"failed\" };\n\nconst TERMINAL_OSC = /(?:\\u001B\\]|\\u009D)[\\s\\S]*?(?:\\u0007|\\u001B\\\\|\\u009C)/g;\nconst TERMINAL_STRING = /(?:\\u001B[P_X^]|\\u0090|\\u0098|\\u009E|\\u009F)[\\s\\S]*?(?:\\u001B\\\\|\\u009C)/g;\nconst TERMINAL_CSI = /(?:\\u001B\\[|\\u009B)[0-?]*[ -/]*[@-~]/g;\nconst TERMINAL_ESCAPE = /\\u001B[@-_]/g;\nconst TERMINAL_CONTROL = /[\\u0000-\\u0009\\u000B-\\u001F\\u007F-\\u009F]/g;\n\nfunction autoInteractiveAllowed(output: ReporterOutput, config: PipelineReporterConfig): boolean {\n const isTTY = config.terminal?.isTTY ?? output.isTTY === true;\n const ci = process.env.CI;\n const isCI = ci !== undefined && ci !== \"\" && ci !== \"0\" && ci !== \"false\";\n return isTTY && process.env.TERM !== \"dumb\" && !isCI;\n}\n\nfunction resolveMode(\n output: ReporterOutput,\n config: PipelineReporterConfig\n): ResolvedPipelineReporterMode {\n if (config.mode === \"interactive\") return \"interactive\";\n if (config.mode === \"plain\") return \"plain\";\n return autoInteractiveAllowed(output, config) ? \"interactive\" : \"plain\";\n}\n\nfunction safeNumber(value: number): number {\n return Number.isFinite(value) ? value : 0;\n}\n\nfunction stripTerminalControls(value: string): string {\n return value\n .replace(TERMINAL_OSC, \"\")\n .replace(TERMINAL_STRING, \"\")\n .replace(TERMINAL_CSI, \"\")\n .replace(TERMINAL_ESCAPE, \"\")\n .replace(TERMINAL_CONTROL, \"\");\n}\n\nfunction safeTerminalText(value: string): string {\n return stripTerminalControls(value.replace(/\\s+/g, \" \")).trim();\n}\n\nfunction safeTerminalLog(value: string): string {\n return stripTerminalControls(value.replace(/\\r\\n?/g, \"\\n\").replaceAll(\"\\t\", \" \"));\n}\n\nfunction formatCount(value: number): string {\n return Number.isInteger(value) ? String(value) : value.toFixed(1);\n}\n\nfunction renderProgress(progress: PipelineStepProgress, width: number, unicode: boolean): string {\n // Parent line keeps the summary message only; per-item work uses `details`.\n const message = progress.message ? ` ${safeTerminalText(progress.message)}` : \"\";\n if (progress.total === undefined || safeNumber(progress.total) <= 0) {\n return `${formatCount(safeNumber(progress.completed))}${message}`;\n }\n const completed = safeNumber(progress.completed);\n const total = safeNumber(progress.total);\n const ratio = Math.max(0, Math.min(1, completed / total));\n const filled = Math.round(ratio * width);\n const bar = `${unicode ? \"█\".repeat(filled) : \"=\".repeat(filled)}${\n unicode ? \"░\".repeat(width - filled) : \"-\".repeat(width - filled)\n }`;\n return `[${bar}] ${Math.round(ratio * 100)}% ${formatCount(completed)}/${formatCount(total)}${message}`;\n}\n\nfunction renderProgressDetail(\n detail: NonNullable<PipelineStepProgress[\"details\"]>[number],\n theme: ReporterTheme,\n spinner: string,\n progressBarWidth: number,\n parentStatus: PipelineStepStatus[\"status\"]\n): string {\n const status =\n (detail.status ?? \"running\") === \"running\" && parentStatus !== \"running\"\n ? parentStatus\n : (detail.status ?? \"running\");\n const symbol =\n status === \"completed\"\n ? theme.styled.complete(theme.symbols.complete)\n : status === \"failed\"\n ? theme.styled.fail(theme.symbols.fail)\n : status === \"skipped\" || status === \"cancelled\"\n ? theme.styled.skip(theme.symbols.skip)\n : status === \"pending\"\n ? theme.styled.description(theme.symbols.pending)\n : theme.styled.start(spinner);\n const id = safeTerminalText(detail.name ?? detail.id);\n const label = detail.label ? safeTerminalText(detail.label) : \"\";\n const labelText = status === \"cancelled\" ? `cancelled${label ? `: ${label}` : \"\"}` : label;\n const running = status === \"running\";\n const body = labelText ? `${id} ${labelText}` : id;\n const paintedBody =\n running && theme.colorEnabled\n ? shimmerToken(body)\n : `${id}${labelText ? ` ${theme.styled.description(labelText)}` : \"\"}`;\n const depth = Math.max(0, Math.min(32, Math.floor(safeNumber(detail.depth ?? 0))));\n const progress =\n detail.completed === undefined\n ? \"\"\n : ` ${renderProgress(\n { completed: detail.completed, total: detail.total },\n progressBarWidth,\n theme.capabilities.unicode\n )}`;\n return `${\" \".repeat(depth + 2)}${symbol} ${paintedBody}${progress}`;\n}\n\nfunction renderStep(\n state: StepState,\n theme: ReporterTheme,\n spinner: string,\n progressBarWidth: number\n): string[] {\n const { step } = state;\n const displayName = safeTerminalText(step.name ?? step.id);\n switch (state.status) {\n case \"running\": {\n const progress =\n state.progress && hasVisibleStepProgress(state.progress)\n ? ` ${renderProgress(state.progress, progressBarWidth, theme.capabilities.unicode)}`\n : \"\";\n const elapsed =\n state.startedAtMs !== undefined\n ? ` ${theme.styled.duration(elapsedToken(state.startedAtMs))}`\n : \"\";\n const lines = [\n ` ${theme.styled.start(spinner)} ${shimmerToken(displayName)}${progress}${elapsed}`,\n ];\n return lines;\n }\n case \"completed\":\n return [\n ` ${theme.styled.complete(theme.symbols.complete)} ${displayName} ${theme.styled.duration(\n `(${formatDurationMs(state.finishedAtMs - state.startedAtMs)})`\n )}`,\n ];\n case \"failed\":\n return [\n ` ${theme.styled.fail(theme.symbols.fail)} ${displayName}: ${safeTerminalText(\n state.error.message\n )}`,\n ];\n case \"cancelled\":\n return [\n ` ${theme.styled.skip(theme.symbols.skip)} ${displayName}: cancelled: ${safeTerminalText(\n state.error.message\n )}`,\n ];\n case \"skipped\":\n return [\n ` ${theme.styled.skip(theme.symbols.skip)} ${displayName} ${theme.styled.duration(\n `(${state.message ?? state.reason})`\n )}`,\n ];\n case \"planned\":\n return [\n ` ${theme.styled.description(theme.symbols.pending)} ${displayName} ${theme.styled.description(\"waiting\")}`,\n ];\n }\n}\n\nfunction reporterOutputFd(output: ReporterOutput): number | undefined {\n const stdoutFd = output === process.stdout ? process.stdout.fd : undefined;\n for (const fd of [output.fd, stdoutFd]) {\n if (fd !== undefined && Number.isInteger(fd) && fd >= 0) return fd;\n }\n return undefined;\n}\n\nfunction createInteractiveReporter<TResult>(\n options: PipelineReporterOptions,\n output: ReporterOutput\n): PipelineReporterController<TResult> {\n const terminalIsTTY = options.terminal?.isTTY ?? output.isTTY === true;\n const theme = createReporterTheme({\n ...options,\n terminal: { isTTY: terminalIsTTY, ...options.terminal },\n });\n const progressBarWidth = Math.max(4, Math.floor(options.progressBarWidth ?? 20));\n // ~12.5 fps keeps braille spinners smooth without flooding the terminal.\n const refreshIntervalMs = Math.max(16, Math.floor(options.refreshIntervalMs ?? 80));\n const steps = new Map<string, StepState>();\n let plan: PipelinePlan | undefined;\n let result: PipelineRun<TResult> | undefined;\n let finalize: FinalizeState = { status: \"idle\" };\n let lastProgressRedrawAt = Number.NEGATIVE_INFINITY;\n let progressDirty = false;\n let disposed = false;\n let ticker: LiveTicker | undefined;\n let trailingFlush: ReturnType<typeof setTimeout> | undefined;\n let exitListener: (() => void) | undefined;\n\n const frameLines = (): string[] => {\n if (!plan) return [];\n const lines: string[] = [];\n if (options.logPlan !== false) {\n const header = result\n ? options.logSummary === false\n ? `Pipeline ${result.pipelineId}`\n : `Pipeline ${result.pipelineId}: done in ${formatDurationMs(result.finishedAtMs - result.startedAtMs)} (status=${result.status}, steps=${result.steps.length}, errors=${result.errors.length})`\n : `Pipeline ${plan.pipelineId} (${plan.steps.length} steps, dryRun=${plan.dryRun})`;\n lines.push(\n result?.status === \"completed\"\n ? theme.styled.complete(header)\n : result\n ? theme.styled.fail(header)\n : theme.styled.pipeline(header)\n );\n }\n for (const state of steps.values()) {\n lines.push(...renderStep(state, theme, SPINNER_TOKEN, progressBarWidth));\n for (const detail of state.details ?? []) {\n lines.push(\n renderProgressDetail(detail, theme, SPINNER_TOKEN, progressBarWidth, state.status)\n );\n }\n }\n if (finalize.status === \"running\") {\n lines.push(` ${theme.styled.start(SPINNER_TOKEN)} ${shimmerToken(\"finalize\")}`);\n } else if (finalize.status === \"completed\") {\n lines.push(\n ` ${theme.styled.complete(theme.symbols.complete)} finalize ${theme.styled.duration(\n `(${formatDurationMs(finalize.durationMs)})`\n )}`\n );\n } else if (finalize.status === \"failed\") {\n lines.push(\n ` ${theme.styled.fail(theme.symbols.fail)} finalize: ${safeTerminalText(\n finalize.error.message\n )}`\n );\n }\n return lines;\n };\n\n const ensureTicker = (): LiveTicker => {\n if (!ticker) {\n ticker = createLiveTicker({\n color: theme.colorEnabled,\n columns: output.columns,\n getColumns: () => output.columns,\n fd: reporterOutputFd(output),\n refreshIntervalMs,\n unicode: theme.capabilities.unicode,\n write: (chunk) => {\n output.write(chunk);\n },\n });\n }\n return ticker;\n };\n\n const redraw = (): void => {\n if (disposed) return;\n const lines = frameLines();\n if (lines.length === 0) return;\n const rows = output.rows;\n if (rows === undefined || rows < 2 || lines.length < rows) {\n ensureTicker().setLines(lines);\n return;\n }\n if (result) {\n // A finished tree can scroll normally; never try to erase beyond the viewport.\n ensureTicker().setLines([]);\n ensureTicker().writeLog(`${lines.join(\"\\n\")}\\n`);\n return;\n }\n const ellipsis = theme.capabilities.unicode ? \"…\" : \"...\";\n if (rows < 5) {\n ensureTicker().setLines(\n [lines[0]!, ` ${ellipsis} ${lines.length - 1} rows omitted`].slice(0, rows - 1)\n );\n return;\n }\n const available = rows - 4;\n let focus = 0;\n for (const [index, line] of lines.entries()) {\n if (line.includes(SPINNER_TOKEN)) focus = index;\n }\n const start = Math.max(\n 1,\n Math.min(lines.length - available, focus - Math.floor(available / 2))\n );\n const end = start + available;\n const visible = [lines[0]!];\n if (start > 1) visible.push(` ${ellipsis} ${start - 1} rows above`);\n visible.push(...lines.slice(start, end));\n if (end < lines.length) visible.push(` ${ellipsis} ${lines.length - end} rows below`);\n ensureTicker().setLines(visible);\n };\n\n const flushProgress = (): void => {\n if (trailingFlush !== undefined) {\n clearTimeout(trailingFlush);\n trailingFlush = undefined;\n }\n if (!progressDirty) return;\n progressDirty = false;\n lastProgressRedrawAt = Date.now();\n redraw();\n };\n\n const dispose = (): void => {\n if (disposed) return;\n disposed = true;\n if (trailingFlush !== undefined) {\n clearTimeout(trailingFlush);\n trailingFlush = undefined;\n }\n ticker?.dispose();\n ticker = undefined;\n if (exitListener) process.off(\"exit\", exitListener);\n exitListener = undefined;\n };\n\n const writeLog = (level: \"error\" | \"log\" | \"warn\", message?: unknown, ...args: unknown[]) => {\n const rendered = message === undefined && args.length === 0 ? \"\" : format(message, ...args);\n const safeRendered = safeTerminalLog(rendered);\n const prefix =\n level === \"error\"\n ? `${theme.styled.fail(theme.symbols.fail)} `\n : level === \"warn\"\n ? `${theme.styled.skip(\"!\")} `\n : \"\";\n const text = `${prefix}${safeRendered}\\n`;\n if (disposed) {\n output.write(text);\n return;\n }\n ensureTicker().writeLog(text);\n progressDirty = false;\n lastProgressRedrawAt = Date.now();\n redraw();\n };\n\n const log: PipelineLogger = {\n error: (message, ...args) => writeLog(\"error\", message, ...args),\n log: (message, ...args) => writeLog(\"log\", message, ...args),\n warn: (message, ...args) => writeLog(\"warn\", message, ...args),\n };\n\n const hooks: PipelineHooks<TResult> = {\n onPipelineStart: (nextPlan) => {\n plan = nextPlan;\n for (const step of nextPlan.steps) {\n steps.set(step.id, { pipelineId: nextPlan.pipelineId, status: \"planned\", step });\n }\n if (output === process.stdout) {\n exitListener = dispose;\n process.once(\"exit\", exitListener);\n }\n redraw();\n },\n onStepStatus: (event) => {\n const previous = steps.get(event.step.id);\n if (event.status === \"running\") {\n // Empty/non-visible progress only refreshes the frame; retain the last\n // visible progress snapshot while still publishing one running state.\n const progress =\n event.progress && hasVisibleStepProgress(event.progress)\n ? event.progress\n : previous?.status === \"running\"\n ? previous.progress\n : undefined;\n steps.set(event.step.id, {\n ...event,\n progress,\n details: progress?.details,\n startedAtMs: previous?.startedAtMs ?? Date.now(),\n });\n const now = Date.now();\n if (now - lastProgressRedrawAt >= refreshIntervalMs) {\n progressDirty = false;\n lastProgressRedrawAt = now;\n redraw();\n } else {\n progressDirty = true;\n trailingFlush ??= setTimeout(\n () => {\n trailingFlush = undefined;\n if (!disposed) flushProgress();\n },\n Math.max(0, refreshIntervalMs - (now - lastProgressRedrawAt))\n );\n trailingFlush.unref?.();\n }\n return;\n }\n if (event.status !== \"planned\") flushProgress();\n steps.set(event.step.id, { ...event, details: previous?.details });\n redraw();\n },\n onFinalizeStart: () => {\n finalize = { status: \"running\" };\n redraw();\n },\n onFinalizeComplete: ({ durationMs }) => {\n finalize = { durationMs, status: \"completed\" };\n redraw();\n },\n onFinalizeError: ({ durationMs, error }) => {\n finalize = { durationMs, error, status: \"failed\" };\n redraw();\n },\n onPipelineComplete: (nextResult) => {\n result = nextResult;\n redraw();\n dispose();\n },\n };\n\n return { dispose, hooks, log, mode: \"interactive\" };\n}\n\n/** Create the plain or interactive reporter selected by the configured terminal mode. */\nexport function createPipelineReporter<TResult = unknown>(\n options: PipelineReporterOptions\n): PipelineReporterController<TResult> {\n const output = options.output ?? process.stdout;\n const mode = resolveMode(output, options);\n if (mode === \"interactive\") {\n return createInteractiveReporter(options, output);\n }\n return {\n dispose: () => undefined,\n hooks: createRunReporter<TResult>(options),\n log: options.log,\n mode: \"plain\",\n };\n}\n"]}
1
+ {"version":3,"file":"interactive-reporter.js","sourceRoot":"","sources":["../../src/reporter/interactive-reporter.ts"],"names":[],"mappings":"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","sourcesContent":["import { format } from \"node:util\";\nimport type {\n PipelineError,\n PipelineHooks,\n PipelineLogger,\n PipelinePlan,\n PipelineRun,\n PipelineStepProgress,\n PipelineStepStatus,\n} from \"../core/pipeline.js\";\nimport { hasVisibleStepProgress } from \"../core/progress.js\";\nimport {\n createLiveTicker,\n elapsedToken,\n shimmerToken,\n SPINNER_TOKEN,\n type LiveTicker,\n} from \"./live-ticker.js\";\nimport {\n createReporterTheme,\n createRunReporter,\n formatDurationMs,\n type ReporterTheme,\n type RunReporterConfig,\n} from \"./reporter.js\";\n\nexport type PipelineReporterMode = \"auto\" | \"interactive\" | \"plain\";\nexport type ResolvedPipelineReporterMode = Exclude<PipelineReporterMode, \"auto\">;\n\nexport interface ReporterOutput {\n readonly columns?: number;\n readonly rows?: number;\n /**\n * File descriptor for live frames. When set, spinner, elapsed time, and shimmer\n * paint on a worker thread so they keep moving during CPU-bound steps. Defaults\n * to stdout's fd when `output` is `process.stdout`.\n */\n readonly fd?: number;\n readonly isTTY?: boolean;\n write(chunk: string): unknown;\n}\n\nexport interface PipelineReporterConfig extends RunReporterConfig {\n /** Auto selects the interactive renderer only for a capable, non-CI TTY. */\n mode?: PipelineReporterMode;\n /** Terminal stream used by the interactive renderer. Defaults to stdout. */\n output?: ReporterOutput;\n /** Spinner redraw cadence. Defaults to 80ms. */\n refreshIntervalMs?: number;\n /** Filled/empty character width for determinate progress. Defaults to 20. */\n progressBarWidth?: number;\n}\n\nexport interface PipelineReporterOptions extends PipelineReporterConfig {\n log: PipelineLogger;\n}\n\nexport interface PipelineReporterController<TResult = unknown> {\n readonly hooks: PipelineHooks<TResult>;\n readonly log: PipelineLogger;\n readonly mode: ResolvedPipelineReporterMode;\n /** Stop redraws and restore terminal state. Safe to call more than once. */\n dispose(): void;\n}\n\ntype StepState = PipelineStepStatus & {\n /** Wall-clock ms from Date.now() when the step entered the running state. */\n startedAtMs?: number;\n details?: PipelineStepProgress[\"details\"];\n};\n\ntype FinalizeState =\n | { status: \"idle\" }\n | { status: \"running\" }\n | { durationMs: number; status: \"completed\" }\n | { durationMs: number; error: PipelineError; status: \"failed\" };\n\nconst TERMINAL_OSC = /(?:\\u001B\\]|\\u009D)[\\s\\S]*?(?:\\u0007|\\u001B\\\\|\\u009C)/g;\nconst TERMINAL_STRING = /(?:\\u001B[P_X^]|\\u0090|\\u0098|\\u009E|\\u009F)[\\s\\S]*?(?:\\u001B\\\\|\\u009C)/g;\nconst TERMINAL_CSI = /(?:\\u001B\\[|\\u009B)[0-?]*[ -/]*[@-~]/g;\nconst TERMINAL_ESCAPE = /\\u001B[@-_]/g;\nconst TERMINAL_CONTROL = /[\\u0000-\\u0009\\u000B-\\u001F\\u007F-\\u009F]/g;\n\nfunction autoInteractiveAllowed(output: ReporterOutput, config: PipelineReporterConfig): boolean {\n const isTTY = config.terminal?.isTTY ?? output.isTTY === true;\n const ci = process.env.CI;\n const isCI = ci !== undefined && ci !== \"\" && ci !== \"0\" && ci !== \"false\";\n return isTTY && process.env.TERM !== \"dumb\" && !isCI;\n}\n\nfunction resolveMode(\n output: ReporterOutput,\n config: PipelineReporterConfig\n): ResolvedPipelineReporterMode {\n if (config.mode === \"interactive\") return \"interactive\";\n if (config.mode === \"plain\") return \"plain\";\n return autoInteractiveAllowed(output, config) ? \"interactive\" : \"plain\";\n}\n\nfunction safeNumber(value: number): number {\n return Number.isFinite(value) ? value : 0;\n}\n\nfunction stripTerminalControls(value: string): string {\n return value\n .replace(TERMINAL_OSC, \"\")\n .replace(TERMINAL_STRING, \"\")\n .replace(TERMINAL_CSI, \"\")\n .replace(TERMINAL_ESCAPE, \"\")\n .replace(TERMINAL_CONTROL, \"\");\n}\n\nfunction safeTerminalText(value: string): string {\n return stripTerminalControls(value.replace(/\\s+/g, \" \")).trim();\n}\n\nfunction safeTerminalLog(value: string): string {\n return stripTerminalControls(value.replace(/\\r\\n?/g, \"\\n\").replaceAll(\"\\t\", \" \"));\n}\n\nfunction formatCount(value: number): string {\n return Number.isInteger(value) ? String(value) : value.toFixed(1);\n}\n\nfunction renderProgress(progress: PipelineStepProgress, width: number, unicode: boolean): string {\n // Parent line keeps the summary message only; per-item work uses `details`.\n const message = progress.message ? ` ${safeTerminalText(progress.message)}` : \"\";\n if (progress.total === undefined || safeNumber(progress.total) <= 0) {\n return `${formatCount(safeNumber(progress.completed))}${message}`;\n }\n const completed = safeNumber(progress.completed);\n const total = safeNumber(progress.total);\n const ratio = Math.max(0, Math.min(1, completed / total));\n const filled = Math.round(ratio * width);\n const bar = `${unicode ? \"█\".repeat(filled) : \"=\".repeat(filled)}${\n unicode ? \"░\".repeat(width - filled) : \"-\".repeat(width - filled)\n }`;\n return `[${bar}] ${Math.round(ratio * 100)}% ${formatCount(completed)}/${formatCount(total)}${message}`;\n}\n\nfunction renderProgressDetail(\n detail: NonNullable<PipelineStepProgress[\"details\"]>[number],\n theme: ReporterTheme,\n spinner: string,\n progressBarWidth: number,\n parentStatus: PipelineStepStatus[\"status\"]\n): string {\n const status =\n (detail.status ?? \"running\") === \"running\" && parentStatus !== \"running\"\n ? parentStatus\n : (detail.status ?? \"running\");\n const symbol =\n status === \"completed\"\n ? theme.styled.complete(theme.symbols.complete)\n : status === \"failed\"\n ? theme.styled.fail(theme.symbols.fail)\n : status === \"skipped\" || status === \"cancelled\"\n ? theme.styled.skip(theme.symbols.skip)\n : status === \"pending\"\n ? theme.styled.description(theme.symbols.pending)\n : theme.styled.start(spinner);\n const id = safeTerminalText(detail.name ?? detail.id);\n const label = detail.label ? safeTerminalText(detail.label) : \"\";\n const labelText = status === \"cancelled\" ? `cancelled${label ? `: ${label}` : \"\"}` : label;\n const running = status === \"running\";\n const body = labelText ? `${id} ${labelText}` : id;\n const paintedBody =\n running && theme.colorEnabled\n ? shimmerToken(body)\n : `${id}${labelText ? ` ${theme.styled.description(labelText)}` : \"\"}`;\n const depth = Math.max(0, Math.min(32, Math.floor(safeNumber(detail.depth ?? 0))));\n const progress =\n detail.completed === undefined\n ? \"\"\n : ` ${renderProgress(\n { completed: detail.completed, total: detail.total },\n progressBarWidth,\n theme.capabilities.unicode\n )}`;\n return `${\" \".repeat(depth + 2)}${symbol} ${paintedBody}${progress}`;\n}\n\nfunction renderStep(\n state: StepState,\n theme: ReporterTheme,\n spinner: string,\n progressBarWidth: number\n): string[] {\n const { step } = state;\n const displayName = safeTerminalText(step.name ?? step.id);\n switch (state.status) {\n case \"running\": {\n const progress =\n state.progress && hasVisibleStepProgress(state.progress)\n ? ` ${renderProgress(state.progress, progressBarWidth, theme.capabilities.unicode)}`\n : \"\";\n const elapsed =\n state.startedAtMs !== undefined\n ? ` ${theme.styled.duration(elapsedToken(state.startedAtMs))}`\n : \"\";\n const lines = [\n ` ${theme.styled.start(spinner)} ${shimmerToken(displayName)}${progress}${elapsed}`,\n ];\n return lines;\n }\n case \"completed\":\n return [\n ` ${theme.styled.complete(theme.symbols.complete)} ${displayName} ${theme.styled.duration(\n `(${formatDurationMs(state.finishedAtMs - state.startedAtMs)})`\n )}`,\n ];\n case \"failed\":\n return [\n ` ${theme.styled.fail(theme.symbols.fail)} ${displayName}: ${safeTerminalText(\n state.error.message\n )}`,\n ];\n case \"cancelled\":\n return [\n ` ${theme.styled.skip(theme.symbols.skip)} ${displayName}: cancelled: ${safeTerminalText(\n state.error.message\n )}`,\n ];\n case \"skipped\":\n return [\n ` ${theme.styled.skip(theme.symbols.skip)} ${displayName} ${theme.styled.duration(\n `(${state.message ?? state.reason})`\n )}`,\n ];\n case \"planned\":\n return [\n ` ${theme.styled.description(theme.symbols.pending)} ${displayName} ${theme.styled.description(\"waiting\")}`,\n ];\n }\n}\n\nfunction reporterOutputFd(output: ReporterOutput): number | undefined {\n const fd = output.fd ?? (output === process.stdout ? process.stdout.fd : undefined);\n return fd !== undefined && Number.isInteger(fd) && fd >= 0 ? fd : undefined;\n}\n\nfunction createInteractiveReporter<TResult>(\n options: PipelineReporterOptions,\n output: ReporterOutput\n): PipelineReporterController<TResult> {\n const terminalIsTTY = options.terminal?.isTTY ?? output.isTTY === true;\n const theme = createReporterTheme({\n ...options,\n terminal: { isTTY: terminalIsTTY, ...options.terminal },\n });\n const progressBarWidth = Math.max(4, Math.floor(options.progressBarWidth ?? 20));\n // ~12.5 fps keeps braille spinners smooth without flooding the terminal.\n const refreshIntervalMs = Math.max(16, Math.floor(options.refreshIntervalMs ?? 80));\n const steps = new Map<string, StepState>();\n let plan: PipelinePlan | undefined;\n let result: PipelineRun<TResult> | undefined;\n let finalize: FinalizeState = { status: \"idle\" };\n let lastProgressRedrawAt = Number.NEGATIVE_INFINITY;\n let progressDirty = false;\n let disposed = false;\n let ticker: LiveTicker | undefined;\n let trailingFlush: ReturnType<typeof setTimeout> | undefined;\n let exitListener: (() => void) | undefined;\n\n const frameLines = (): string[] => {\n if (!plan) return [];\n const lines: string[] = [];\n if (options.logPlan !== false) {\n const header = result\n ? options.logSummary === false\n ? `Pipeline ${result.pipelineId}`\n : `Pipeline ${result.pipelineId}: done in ${formatDurationMs(result.finishedAtMs - result.startedAtMs)} (status=${result.status}, steps=${result.steps.length}, errors=${result.errors.length})`\n : `Pipeline ${plan.pipelineId} (${plan.steps.length} steps, dryRun=${plan.dryRun})`;\n lines.push(\n result?.status === \"completed\"\n ? theme.styled.complete(header)\n : result\n ? theme.styled.fail(header)\n : theme.styled.pipeline(header)\n );\n }\n for (const state of steps.values()) {\n lines.push(...renderStep(state, theme, SPINNER_TOKEN, progressBarWidth));\n for (const detail of state.details ?? []) {\n lines.push(\n renderProgressDetail(detail, theme, SPINNER_TOKEN, progressBarWidth, state.status)\n );\n }\n }\n if (finalize.status === \"running\") {\n lines.push(` ${theme.styled.start(SPINNER_TOKEN)} ${shimmerToken(\"finalize\")}`);\n } else if (finalize.status === \"completed\") {\n lines.push(\n ` ${theme.styled.complete(theme.symbols.complete)} finalize ${theme.styled.duration(\n `(${formatDurationMs(finalize.durationMs)})`\n )}`\n );\n } else if (finalize.status === \"failed\") {\n lines.push(\n ` ${theme.styled.fail(theme.symbols.fail)} finalize: ${safeTerminalText(\n finalize.error.message\n )}`\n );\n }\n return lines;\n };\n\n const ensureTicker = (): LiveTicker => {\n if (!ticker) {\n ticker = createLiveTicker({\n color: theme.colorEnabled,\n columns: output.columns,\n getColumns: () => output.columns,\n fd: reporterOutputFd(output),\n refreshIntervalMs,\n unicode: theme.capabilities.unicode,\n write: (chunk) => {\n output.write(chunk);\n },\n });\n }\n return ticker;\n };\n\n const redraw = (): void => {\n if (disposed) return;\n const lines = frameLines();\n if (lines.length === 0) return;\n const rows = output.rows;\n if (rows === undefined || rows < 2 || lines.length < rows) {\n ensureTicker().setLines(lines);\n return;\n }\n if (result) {\n // A finished tree can scroll normally; never try to erase beyond the viewport.\n ensureTicker().setLines([]);\n ensureTicker().writeLog(`${lines.join(\"\\n\")}\\n`);\n return;\n }\n const ellipsis = theme.capabilities.unicode ? \"…\" : \"...\";\n if (rows < 5) {\n ensureTicker().setLines(\n [lines[0]!, ` ${ellipsis} ${lines.length - 1} rows omitted`].slice(0, rows - 1)\n );\n return;\n }\n const available = rows - 4;\n let focus = 0;\n for (const [index, line] of lines.entries()) {\n if (line.includes(SPINNER_TOKEN)) focus = index;\n }\n const start = Math.max(\n 1,\n Math.min(lines.length - available, focus - Math.floor(available / 2))\n );\n const end = start + available;\n const visible = [lines[0]!];\n if (start > 1) visible.push(` ${ellipsis} ${start - 1} rows above`);\n visible.push(...lines.slice(start, end));\n if (end < lines.length) visible.push(` ${ellipsis} ${lines.length - end} rows below`);\n ensureTicker().setLines(visible);\n };\n\n const flushProgress = (): void => {\n if (trailingFlush !== undefined) {\n clearTimeout(trailingFlush);\n trailingFlush = undefined;\n }\n if (!progressDirty) return;\n progressDirty = false;\n lastProgressRedrawAt = Date.now();\n redraw();\n };\n\n const dispose = (): void => {\n if (disposed) return;\n disposed = true;\n if (trailingFlush !== undefined) {\n clearTimeout(trailingFlush);\n trailingFlush = undefined;\n }\n ticker?.dispose();\n ticker = undefined;\n if (exitListener) process.off(\"exit\", exitListener);\n exitListener = undefined;\n };\n\n const writeLog = (level: \"error\" | \"log\" | \"warn\", message?: unknown, ...args: unknown[]) => {\n const rendered = message === undefined && args.length === 0 ? \"\" : format(message, ...args);\n const safeRendered = safeTerminalLog(rendered);\n const prefix =\n level === \"error\"\n ? `${theme.styled.fail(theme.symbols.fail)} `\n : level === \"warn\"\n ? `${theme.styled.skip(\"!\")} `\n : \"\";\n const text = `${prefix}${safeRendered}\\n`;\n if (disposed) {\n output.write(text);\n return;\n }\n ensureTicker().writeLog(text);\n progressDirty = false;\n lastProgressRedrawAt = Date.now();\n redraw();\n };\n\n const log: PipelineLogger = {\n error: (message, ...args) => writeLog(\"error\", message, ...args),\n log: (message, ...args) => writeLog(\"log\", message, ...args),\n warn: (message, ...args) => writeLog(\"warn\", message, ...args),\n };\n\n const hooks: PipelineHooks<TResult> = {\n onPipelineStart: (nextPlan) => {\n plan = nextPlan;\n for (const step of nextPlan.steps) {\n steps.set(step.id, { pipelineId: nextPlan.pipelineId, status: \"planned\", step });\n }\n if (output === process.stdout) {\n exitListener = dispose;\n process.once(\"exit\", exitListener);\n }\n redraw();\n },\n onStepStatus: (event) => {\n const previous = steps.get(event.step.id);\n if (event.status === \"running\") {\n // Empty/non-visible progress only refreshes the frame; retain the last\n // visible progress snapshot while still publishing one running state.\n const progress =\n event.progress && hasVisibleStepProgress(event.progress)\n ? event.progress\n : previous?.status === \"running\"\n ? previous.progress\n : undefined;\n steps.set(event.step.id, {\n ...event,\n progress,\n details: progress?.details,\n startedAtMs: previous?.startedAtMs ?? Date.now(),\n });\n const now = Date.now();\n if (now - lastProgressRedrawAt >= refreshIntervalMs) {\n progressDirty = false;\n lastProgressRedrawAt = now;\n redraw();\n } else {\n progressDirty = true;\n trailingFlush ??= setTimeout(\n () => {\n trailingFlush = undefined;\n if (!disposed) flushProgress();\n },\n Math.max(0, refreshIntervalMs - (now - lastProgressRedrawAt))\n );\n trailingFlush.unref?.();\n }\n return;\n }\n if (event.status !== \"planned\") flushProgress();\n steps.set(event.step.id, { ...event, details: previous?.details });\n redraw();\n },\n onFinalizeStart: () => {\n finalize = { status: \"running\" };\n redraw();\n },\n onFinalizeComplete: ({ durationMs }) => {\n finalize = { durationMs, status: \"completed\" };\n redraw();\n },\n onFinalizeError: ({ durationMs, error }) => {\n finalize = { durationMs, error, status: \"failed\" };\n redraw();\n },\n onPipelineComplete: (nextResult) => {\n result = nextResult;\n redraw();\n dispose();\n },\n };\n\n return { dispose, hooks, log, mode: \"interactive\" };\n}\n\n/** Create the plain or interactive reporter selected by the configured terminal mode. */\nexport function createPipelineReporter<TResult = unknown>(\n options: PipelineReporterOptions\n): PipelineReporterController<TResult> {\n const output = options.output ?? process.stdout;\n const mode = resolveMode(output, options);\n if (mode === \"interactive\") {\n return createInteractiveReporter(options, output);\n }\n return {\n dispose: () => undefined,\n hooks: createRunReporter<TResult>(options),\n log: options.log,\n mode: \"plain\",\n };\n}\n"]}
@@ -1,72 +1,77 @@
1
1
  import { writeSync } from "node:fs";
2
2
  import { parentPort, workerData } from "node:worker_threads";
3
- import { TickerFrame, currentSpinner, paintLiveLines, SHIMMER_TOKEN_START, SPINNER_TOKEN, } from "./live-ticker.js";
3
+ import { currentSpinner, paintLiveLines, SHIMMER_TOKEN_START, SPINNER_TOKEN, TickerFrame, } from "./live-ticker.js";
4
4
  const port = parentPort;
5
- if (port === null) {
6
- throw new Error("live-ticker-worker must run as a worker thread");
7
- }
8
- // SAFETY: createWorkerTicker always posts this exact workerData shape
9
- // (color, columns, fd, handshakeBuffer, refreshIntervalMs, unicode).
5
+ if (port === null)
6
+ throw new Error("live-ticker-worker must run in a worker thread");
7
+ // SAFETY: createWorkerTicker owns the workerData shape.
10
8
  const data = workerData;
11
- const handshake = new Int32Array(data.handshakeBuffer);
9
+ // [0] stopped, [1] painted rows, [2] accepted logs, [3] inline owns output, [4] output lock
10
+ const state = new Int32Array(data.stateBuffer);
11
+ const frame = new TickerFrame((chunk) => writeSync(data.fd, chunk));
12
12
  let columns = data.columns;
13
13
  let lines = [];
14
- const frame = new TickerFrame((chunk) => writeSync(data.fd, chunk));
15
- let announcedReady = false;
16
- function publishFrame() {
17
- Atomics.store(handshake, 1, frame.frameLineCount);
18
- }
19
- function announceReady() {
20
- publishFrame();
21
- if (announcedReady || port === null)
22
- return;
23
- announcedReady = true;
24
- port.postMessage({ type: "ready", frameLineCount: frame.frameLineCount });
14
+ function withOutputLock(write) {
15
+ while (Atomics.compareExchange(state, 4, 0, 1) !== 0) {
16
+ Atomics.wait(state, 4, 1);
17
+ }
18
+ try {
19
+ if (Atomics.load(state, 3) === 0)
20
+ write();
21
+ }
22
+ finally {
23
+ Atomics.store(state, 4, 0);
24
+ Atomics.notify(state, 4);
25
+ }
25
26
  }
26
- function redraw() {
27
+ function paintFrame() {
27
28
  frame.redraw(paintLiveLines(lines, currentSpinner(data.unicode, data.refreshIntervalMs), Date.now(), columns, data.color));
28
- publishFrame();
29
+ Atomics.store(state, 1, frame.frameLineCount);
29
30
  }
30
- function done() {
31
- Atomics.store(handshake, 0, 1);
32
- Atomics.notify(handshake, 0);
31
+ function redraw() {
32
+ withOutputLock(paintFrame);
33
33
  }
34
- const beat = () => {
35
- Atomics.add(handshake, 3, 1);
36
- };
37
- beat();
38
34
  const timer = setInterval(() => {
39
- beat();
40
- if (!lines.some((line) => line.includes(SPINNER_TOKEN) || line.includes(SHIMMER_TOKEN_START))) {
35
+ if (Atomics.load(state, 3) === 1) {
36
+ clearInterval(timer);
37
+ port.close();
41
38
  return;
42
39
  }
43
- redraw();
40
+ if (lines.some((line) => line.includes(SPINNER_TOKEN) || line.includes(SHIMMER_TOKEN_START))) {
41
+ redraw();
42
+ }
44
43
  }, data.refreshIntervalMs);
45
- port.on("message", (msg) => {
46
- if (msg.type === "log") {
47
- frame.clear();
48
- writeSync(data.fd, msg.text);
49
- publishFrame();
50
- Atomics.add(handshake, 2, 1);
51
- announceReady();
52
- port.postMessage({ type: "ack", kind: "log" });
44
+ port.on("message", (message) => {
45
+ if (Atomics.load(state, 3) === 1) {
46
+ clearInterval(timer);
47
+ port.close();
53
48
  return;
54
49
  }
55
- if (msg.columns !== undefined)
56
- columns = msg.columns;
57
- if (msg.type === "lines") {
58
- lines = msg.lines;
59
- redraw();
60
- announceReady();
50
+ if (message.type === "log") {
51
+ withOutputLock(() => {
52
+ frame.clear();
53
+ Atomics.store(state, 1, 0);
54
+ writeSync(data.fd, message.text);
55
+ Atomics.add(state, 2, 1);
56
+ });
61
57
  return;
62
58
  }
63
- if (msg.type === "stop") {
64
- clearInterval(timer);
65
- if (msg.lines)
66
- lines = msg.lines;
59
+ columns = message.columns ?? columns;
60
+ lines = message.lines;
61
+ if (message.type === "lines") {
67
62
  redraw();
68
- frame.showCursor();
69
- done();
63
+ return;
64
+ }
65
+ clearInterval(timer);
66
+ try {
67
+ withOutputLock(() => {
68
+ paintFrame();
69
+ frame.showCursor();
70
+ });
71
+ Atomics.store(state, 0, 1);
72
+ Atomics.notify(state, 0);
73
+ }
74
+ finally {
70
75
  port.close();
71
76
  }
72
77
  });
@@ -1 +1 @@
1
- {"version":3,"file":"live-ticker-worker.js","sourceRoot":"","sources":["../../src/reporter/live-ticker-worker.ts"],"names":[],"mappings":"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","sourcesContent":["import { writeSync } from \"node:fs\";\nimport { parentPort, workerData } from \"node:worker_threads\";\nimport {\n TickerFrame,\n currentSpinner,\n paintLiveLines,\n SHIMMER_TOKEN_START,\n SPINNER_TOKEN,\n} from \"./live-ticker.js\";\n\ninterface LiveTickerWorkerData {\n color: boolean;\n columns?: number;\n fd: number;\n handshakeBuffer: SharedArrayBuffer;\n refreshIntervalMs: number;\n unicode: boolean;\n}\n\ntype TickerWorkerMessage =\n | { columns?: number; lines: string[]; type: \"lines\" }\n | { text: string; type: \"log\" }\n | { columns?: number; lines: string[]; type: \"stop\" };\n\nconst port = parentPort;\nif (port === null) {\n throw new Error(\"live-ticker-worker must run as a worker thread\");\n}\n\n// SAFETY: createWorkerTicker always posts this exact workerData shape\n// (color, columns, fd, handshakeBuffer, refreshIntervalMs, unicode).\nconst data = workerData as LiveTickerWorkerData;\nconst handshake = new Int32Array(data.handshakeBuffer);\nlet columns = data.columns;\nlet lines: string[] = [];\nconst frame = new TickerFrame((chunk) => writeSync(data.fd, chunk));\nlet announcedReady = false;\n\nfunction publishFrame(): void {\n Atomics.store(handshake, 1, frame.frameLineCount);\n}\n\nfunction announceReady(): void {\n publishFrame();\n if (announcedReady || port === null) return;\n announcedReady = true;\n port.postMessage({ type: \"ready\", frameLineCount: frame.frameLineCount });\n}\n\nfunction redraw(): void {\n frame.redraw(\n paintLiveLines(\n lines,\n currentSpinner(data.unicode, data.refreshIntervalMs),\n Date.now(),\n columns,\n data.color\n )\n );\n publishFrame();\n}\n\nfunction done(): void {\n Atomics.store(handshake, 0, 1);\n Atomics.notify(handshake, 0);\n}\n\nconst beat = (): void => {\n Atomics.add(handshake, 3, 1);\n};\n\nbeat();\nconst timer = setInterval(() => {\n beat();\n if (!lines.some((line) => line.includes(SPINNER_TOKEN) || line.includes(SHIMMER_TOKEN_START))) {\n return;\n }\n redraw();\n}, data.refreshIntervalMs);\n\nport.on(\"message\", (msg: TickerWorkerMessage) => {\n if (msg.type === \"log\") {\n frame.clear();\n writeSync(data.fd, msg.text);\n publishFrame();\n Atomics.add(handshake, 2, 1);\n announceReady();\n port.postMessage({ type: \"ack\", kind: \"log\" });\n return;\n }\n if (msg.columns !== undefined) columns = msg.columns;\n if (msg.type === \"lines\") {\n lines = msg.lines;\n redraw();\n announceReady();\n return;\n }\n if (msg.type === \"stop\") {\n clearInterval(timer);\n if (msg.lines) lines = msg.lines;\n redraw();\n frame.showCursor();\n done();\n port.close();\n }\n});\n"]}
1
+ {"version":3,"file":"live-ticker-worker.js","sourceRoot":"","sources":["../../src/reporter/live-ticker-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EACL,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAgB1B,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,IAAI,IAAI,KAAK,IAAI;IAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;AAErF,wDAAwD;AACxD,MAAM,IAAI,GAAG,UAAkC,CAAC;AAChD,4FAA4F;AAC5F,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AAC/C,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;AACpE,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;AAC3B,IAAI,KAAK,GAAa,EAAE,CAAC;AAEzB,SAAS,cAAc,CAAC,KAAiB;IACvC,OAAO,OAAO,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC;YAAE,KAAK,EAAE,CAAC;IAC5C,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,SAAS,UAAU;IACjB,KAAK,CAAC,MAAM,CACV,cAAc,CACZ,KAAK,EACL,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,EACpD,IAAI,CAAC,GAAG,EAAE,EACV,OAAO,EACP,IAAI,CAAC,KAAK,CACX,CACF,CAAC;IACF,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,MAAM;IACb,cAAc,CAAC,UAAU,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;IAC7B,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC;QAC7F,MAAM,EAAE,CAAC;IACX,CAAC;AACH,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAE3B,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAA4B,EAAE,EAAE;IAClD,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,aAAa,CAAC,KAAK,CAAC,CAAC;QACrB,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC3B,cAAc,CAAC,GAAG,EAAE;YAClB,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3B,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC;IACrC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IACtB,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC7B,MAAM,EAAE,CAAC;QACT,OAAO;IACT,CAAC;IACD,aAAa,CAAC,KAAK,CAAC,CAAC;IACrB,IAAI,CAAC;QACH,cAAc,CAAC,GAAG,EAAE;YAClB,UAAU,EAAE,CAAC;YACb,KAAK,CAAC,UAAU,EAAE,CAAC;QACrB,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC3B,CAAC;YAAS,CAAC;QACT,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;AACH,CAAC,CAAC,CAAC","sourcesContent":["import { writeSync } from \"node:fs\";\nimport { parentPort, workerData } from \"node:worker_threads\";\nimport {\n currentSpinner,\n paintLiveLines,\n SHIMMER_TOKEN_START,\n SPINNER_TOKEN,\n TickerFrame,\n} from \"./live-ticker.js\";\n\ninterface LiveTickerWorkerData {\n color: boolean;\n columns?: number;\n fd: number;\n refreshIntervalMs: number;\n stateBuffer: SharedArrayBuffer;\n unicode: boolean;\n}\n\ntype TickerWorkerMessage =\n | { columns?: number; lines: string[]; type: \"lines\" }\n | { text: string; type: \"log\" }\n | { columns?: number; lines: string[]; type: \"stop\" };\n\nconst port = parentPort;\nif (port === null) throw new Error(\"live-ticker-worker must run in a worker thread\");\n\n// SAFETY: createWorkerTicker owns the workerData shape.\nconst data = workerData as LiveTickerWorkerData;\n// [0] stopped, [1] painted rows, [2] accepted logs, [3] inline owns output, [4] output lock\nconst state = new Int32Array(data.stateBuffer);\nconst frame = new TickerFrame((chunk) => writeSync(data.fd, chunk));\nlet columns = data.columns;\nlet lines: string[] = [];\n\nfunction withOutputLock(write: () => void): void {\n while (Atomics.compareExchange(state, 4, 0, 1) !== 0) {\n Atomics.wait(state, 4, 1);\n }\n try {\n if (Atomics.load(state, 3) === 0) write();\n } finally {\n Atomics.store(state, 4, 0);\n Atomics.notify(state, 4);\n }\n}\n\nfunction paintFrame(): void {\n frame.redraw(\n paintLiveLines(\n lines,\n currentSpinner(data.unicode, data.refreshIntervalMs),\n Date.now(),\n columns,\n data.color\n )\n );\n Atomics.store(state, 1, frame.frameLineCount);\n}\n\nfunction redraw(): void {\n withOutputLock(paintFrame);\n}\n\nconst timer = setInterval(() => {\n if (Atomics.load(state, 3) === 1) {\n clearInterval(timer);\n port.close();\n return;\n }\n if (lines.some((line) => line.includes(SPINNER_TOKEN) || line.includes(SHIMMER_TOKEN_START))) {\n redraw();\n }\n}, data.refreshIntervalMs);\n\nport.on(\"message\", (message: TickerWorkerMessage) => {\n if (Atomics.load(state, 3) === 1) {\n clearInterval(timer);\n port.close();\n return;\n }\n if (message.type === \"log\") {\n withOutputLock(() => {\n frame.clear();\n Atomics.store(state, 1, 0);\n writeSync(data.fd, message.text);\n Atomics.add(state, 2, 1);\n });\n return;\n }\n columns = message.columns ?? columns;\n lines = message.lines;\n if (message.type === \"lines\") {\n redraw();\n return;\n }\n clearInterval(timer);\n try {\n withOutputLock(() => {\n paintFrame();\n frame.showCursor();\n });\n Atomics.store(state, 0, 1);\n Atomics.notify(state, 0);\n } finally {\n port.close();\n }\n});\n"]}
@@ -17,9 +17,7 @@ export interface LiveTickerOptions {
17
17
  color?: boolean;
18
18
  write(chunk: string): void;
19
19
  workerUrl?: URL;
20
- supervisorUrl?: URL;
21
20
  }
22
- /** Cursor and frame ownership shared by inline and worker tickers. */
23
21
  export declare class TickerFrame {
24
22
  private readonly write;
25
23
  frameLineCount: number;
@@ -30,5 +28,4 @@ export declare class TickerFrame {
30
28
  redraw(lines: readonly string[]): void;
31
29
  }
32
30
  export declare function currentSpinner(unicode: boolean, refreshIntervalMs: number): string;
33
- /** Inline interval for tests; worker thread when `fd` is a real TTY/pipe. */
34
31
  export declare function createLiveTicker(options: LiveTickerOptions): LiveTicker;