silvery 0.18.2 → 0.19.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 (156) hide show
  1. package/dist/{animation-DhINOJk8.mjs → animation-Cn64yepo.mjs} +1 -1
  2. package/dist/{animation-DhINOJk8.mjs.map → animation-Cn64yepo.mjs.map} +1 -1
  3. package/dist/{ansi-C6Qs1Wn2.mjs → ansi-CLOitHKx.mjs} +1 -1
  4. package/dist/ansi-CLOitHKx.mjs.map +1 -0
  5. package/dist/{ansi-CsjnZtAw.d.mts → ansi-Cc33mW54.d.mts} +1 -1
  6. package/dist/{ansi-CsjnZtAw.d.mts.map → ansi-Cc33mW54.d.mts.map} +1 -1
  7. package/dist/{chunk-BSw8zbkd.mjs → chunk-Vs_PY4HZ.mjs} +1 -1
  8. package/dist/cli-BKp0YtBD.mjs +4 -0
  9. package/dist/{context-BjWgrikx.mjs → context-BU5LkkIy.mjs} +8 -7
  10. package/dist/context-BU5LkkIy.mjs.map +1 -0
  11. package/dist/devtools-9QY4teqI.mjs +2 -0
  12. package/dist/{devtools-CeO9X_uv.mjs → devtools-DxkSLXDA.mjs} +4 -5
  13. package/dist/devtools-DxkSLXDA.mjs.map +1 -0
  14. package/dist/{eta-BnQSZcWf.mjs → eta-Bb3RH3wh.mjs} +1 -1
  15. package/dist/{eta-BnQSZcWf.mjs.map → eta-Bb3RH3wh.mjs.map} +1 -1
  16. package/dist/{flexily-zero-adapter-BOM0cl8R.mjs → flexily-zero-adapter-BlQa46nr.mjs} +21 -64
  17. package/dist/flexily-zero-adapter-BlQa46nr.mjs.map +1 -0
  18. package/dist/{flexily-zero-adapter-V8R3HQtK.mjs → flexily-zero-adapter-CMxXhdOL.mjs} +1 -1
  19. package/dist/{image-B0zMbVUr.mjs → image-CTII5QWI.mjs} +3 -3
  20. package/dist/image-CTII5QWI.mjs.map +1 -0
  21. package/dist/{index-Bh3U1K09.d.mts → index-BXslOebb.d.mts} +547 -137
  22. package/dist/index-BXslOebb.d.mts.map +1 -0
  23. package/dist/{index-C4vrhbud.d.mts → index-BnA7mNpo.d.mts} +1 -1
  24. package/dist/{index-C4vrhbud.d.mts.map → index-BnA7mNpo.d.mts.map} +1 -1
  25. package/dist/index-D3saHouR.d.mts +1392 -0
  26. package/dist/index-D3saHouR.d.mts.map +1 -0
  27. package/dist/index.d.mts +5 -33
  28. package/dist/index.d.mts.map +1 -1
  29. package/dist/index.mjs +13 -13
  30. package/dist/{layout-engine--drvrWjD.mjs → layout-engine-B6Cdz1yZ.mjs} +1 -1
  31. package/dist/{layout-engine-Dr3cY5U4.mjs → layout-engine-ClUgv6jB.mjs} +3 -3
  32. package/dist/{layout-engine-Dr3cY5U4.mjs.map → layout-engine-ClUgv6jB.mjs.map} +1 -1
  33. package/dist/{multi-progress-CcdqJFlf.mjs → multi-progress-Bq9Oi_WI.mjs} +3 -3
  34. package/dist/{multi-progress-CcdqJFlf.mjs.map → multi-progress-Bq9Oi_WI.mjs.map} +1 -1
  35. package/dist/{multi-progress-DQ-uUzLf.d.mts → multi-progress-DAQC7eap.d.mts} +2 -2
  36. package/dist/{multi-progress-DQ-uUzLf.d.mts.map → multi-progress-DAQC7eap.d.mts.map} +1 -1
  37. package/dist/{node-CP5WChgr.mjs → node-BeWlnCPY.mjs} +4 -4
  38. package/dist/node-BeWlnCPY.mjs.map +1 -0
  39. package/dist/{progress-bar-IrUjkLfU.mjs → progress-bar-CXE5Qfkd.mjs} +4 -4
  40. package/dist/progress-bar-CXE5Qfkd.mjs.map +1 -0
  41. package/dist/reconciler-Cwgm8hRR.mjs +8459 -0
  42. package/dist/reconciler-Cwgm8hRR.mjs.map +1 -0
  43. package/dist/{render-string-DVfgc8xr.mjs → render-string-Cbuf63Ya.mjs} +936 -136
  44. package/dist/render-string-Cbuf63Ya.mjs.map +1 -0
  45. package/dist/{render-string-BwLG7rIX.mjs → render-string-Tv-jqM16.mjs} +1 -1
  46. package/dist/runtime.d.mts +2 -2
  47. package/dist/runtime.mjs +3 -3
  48. package/dist/{spinner-BRkaJI0N.d.mts → spinner-CGo34vyR.d.mts} +2 -2
  49. package/dist/{spinner-BRkaJI0N.d.mts.map → spinner-CGo34vyR.d.mts.map} +1 -1
  50. package/dist/{spinner-BmldKx0M.mjs → spinner-CeOmcuw_.mjs} +3 -3
  51. package/dist/spinner-CeOmcuw_.mjs.map +1 -0
  52. package/dist/src-B5GjfG7g.mjs +4305 -0
  53. package/dist/src-B5GjfG7g.mjs.map +1 -0
  54. package/dist/{src-CJPXf3fC.mjs → src-C2uvC-r0.mjs} +7535 -6467
  55. package/dist/src-C2uvC-r0.mjs.map +1 -0
  56. package/dist/{src-D8kLrQBT.mjs → src-CChwjk0Z.mjs} +8 -86
  57. package/dist/src-CChwjk0Z.mjs.map +1 -0
  58. package/dist/{src-D_BS-as7.mjs → src-NCKb8kE5.mjs} +777 -776
  59. package/dist/src-NCKb8kE5.mjs.map +1 -0
  60. package/dist/theme.d.mts +2 -130
  61. package/dist/theme.mjs +3 -8
  62. package/dist/{types-B4A8Ebba.d.mts → types-BH_v3iMT.d.mts} +1 -1
  63. package/dist/{types-B4A8Ebba.d.mts.map → types-BH_v3iMT.d.mts.map} +1 -1
  64. package/dist/{types-e4dpfbSa.mjs → types-Bk2yw9Qj.mjs} +3 -3
  65. package/dist/types-Bk2yw9Qj.mjs.map +1 -0
  66. package/dist/ui/animation.d.mts +1 -1
  67. package/dist/ui/animation.mjs +1 -1
  68. package/dist/ui/ansi.d.mts +1 -1
  69. package/dist/ui/ansi.mjs +1 -1
  70. package/dist/ui/cli.d.mts +3 -3
  71. package/dist/ui/cli.mjs +5 -5
  72. package/dist/ui/display.d.mts +1 -1
  73. package/dist/ui/display.mjs.map +1 -1
  74. package/dist/ui/image.d.mts +1 -1
  75. package/dist/ui/image.mjs +1 -1
  76. package/dist/ui/input.d.mts +1 -1
  77. package/dist/ui/input.d.mts.map +1 -1
  78. package/dist/ui/input.mjs +2 -4
  79. package/dist/ui/input.mjs.map +1 -1
  80. package/dist/ui/progress.d.mts +3 -3
  81. package/dist/ui/progress.d.mts.map +1 -1
  82. package/dist/ui/progress.mjs +3 -3
  83. package/dist/ui/progress.mjs.map +1 -1
  84. package/dist/ui/react.d.mts +1 -1
  85. package/dist/ui/react.d.mts.map +1 -1
  86. package/dist/ui/react.mjs +2 -2
  87. package/dist/ui/react.mjs.map +1 -1
  88. package/dist/ui/utils.mjs +1 -1
  89. package/dist/ui/wrappers.d.mts +2 -2
  90. package/dist/ui/wrappers.mjs +1 -1
  91. package/dist/ui.d.mts +5 -5
  92. package/dist/ui.mjs +6 -6
  93. package/dist/{useLatest-6xqnGIU6.d.mts → useLatest-Bg2x4bfP.d.mts} +1 -1
  94. package/dist/{useLatest-6xqnGIU6.d.mts.map → useLatest-Bg2x4bfP.d.mts.map} +1 -1
  95. package/dist/{with-text-input-lUh9gYAG.d.mts → with-text-input-CRfoiFFG.d.mts} +3 -3
  96. package/dist/with-text-input-CRfoiFFG.d.mts.map +1 -0
  97. package/dist/{wrappers-JrEYTuKA.mjs → wrappers-UTADQkSY.mjs} +4 -4
  98. package/dist/wrappers-UTADQkSY.mjs.map +1 -0
  99. package/dist/{yoga-adapter-Bc8XT9cN.mjs → yoga-adapter-8oRGRw8V.mjs} +2 -2
  100. package/dist/{yoga-adapter-Bc8XT9cN.mjs.map → yoga-adapter-8oRGRw8V.mjs.map} +1 -1
  101. package/dist/yoga-adapter-D_CcxSt5.mjs +2 -0
  102. package/package.json +54 -45
  103. package/dist/UPNG-DvKjM6wE.mjs +0 -5076
  104. package/dist/UPNG-DvKjM6wE.mjs.map +0 -1
  105. package/dist/__vite-browser-external-2447137e-DPKHHqQK.mjs +0 -6
  106. package/dist/__vite-browser-external-2447137e-DPKHHqQK.mjs.map +0 -1
  107. package/dist/ansi-C6Qs1Wn2.mjs.map +0 -1
  108. package/dist/apng-CvSlLBtc.mjs +0 -3
  109. package/dist/apng-DFFVOItr.mjs +0 -70
  110. package/dist/apng-DFFVOItr.mjs.map +0 -1
  111. package/dist/assets/resvgjs.darwin-arm64-BtufyGW1.node +0 -0
  112. package/dist/backend-DU0Y938U.mjs +0 -13396
  113. package/dist/backend-DU0Y938U.mjs.map +0 -1
  114. package/dist/backends-BihMKFY_.mjs +0 -1181
  115. package/dist/backends-BihMKFY_.mjs.map +0 -1
  116. package/dist/backends-Dk_5G_gC.mjs +0 -3
  117. package/dist/cli-GwJ0S2In.mjs +0 -4
  118. package/dist/context-BjWgrikx.mjs.map +0 -1
  119. package/dist/derive-O_Kb1Bk_.d.mts +0 -28
  120. package/dist/derive-O_Kb1Bk_.d.mts.map +0 -1
  121. package/dist/devtools-CeO9X_uv.mjs.map +0 -1
  122. package/dist/devtools-nX4tj6OH.mjs +0 -2
  123. package/dist/flexily-zero-adapter-BOM0cl8R.mjs.map +0 -1
  124. package/dist/gif-B9Uq4qZA.mjs +0 -73
  125. package/dist/gif-B9Uq4qZA.mjs.map +0 -1
  126. package/dist/gif-BdrLRBmM.mjs +0 -3
  127. package/dist/gifenc-DfhOb4xr.mjs +0 -730
  128. package/dist/gifenc-DfhOb4xr.mjs.map +0 -1
  129. package/dist/image-B0zMbVUr.mjs.map +0 -1
  130. package/dist/index-Bh3U1K09.d.mts.map +0 -1
  131. package/dist/index-dehZ18K-.d.mts +0 -679
  132. package/dist/index-dehZ18K-.d.mts.map +0 -1
  133. package/dist/key-mapping-7k2ufK2b.mjs +0 -3
  134. package/dist/key-mapping-WLUmxjx1.mjs +0 -132
  135. package/dist/key-mapping-WLUmxjx1.mjs.map +0 -1
  136. package/dist/node-CP5WChgr.mjs.map +0 -1
  137. package/dist/progress-bar-IrUjkLfU.mjs.map +0 -1
  138. package/dist/reconciler-B8uxQxaU.mjs +0 -16482
  139. package/dist/reconciler-B8uxQxaU.mjs.map +0 -1
  140. package/dist/render-string-DVfgc8xr.mjs.map +0 -1
  141. package/dist/resvg-js-Cwipz-_J.mjs +0 -203
  142. package/dist/resvg-js-Cwipz-_J.mjs.map +0 -1
  143. package/dist/spinner-BmldKx0M.mjs.map +0 -1
  144. package/dist/src-C0sOQW-t.mjs +0 -3866
  145. package/dist/src-C0sOQW-t.mjs.map +0 -1
  146. package/dist/src-CJPXf3fC.mjs.map +0 -1
  147. package/dist/src-D8kLrQBT.mjs.map +0 -1
  148. package/dist/src-D_BS-as7.mjs.map +0 -1
  149. package/dist/theme.d.mts.map +0 -1
  150. package/dist/theme.mjs.map +0 -1
  151. package/dist/types-e4dpfbSa.mjs.map +0 -1
  152. package/dist/with-text-input-lUh9gYAG.d.mts.map +0 -1
  153. package/dist/wrapper-CE6GQ27z.mjs +0 -3527
  154. package/dist/wrapper-CE6GQ27z.mjs.map +0 -1
  155. package/dist/wrappers-JrEYTuKA.mjs.map +0 -1
  156. package/dist/yoga-adapter-B8LZpQcE.mjs +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"progress.d.mts","names":[],"sources":["../../packages/ag-react/src/ui/progress/step-node.ts","../../packages/ag-react/src/ui/progress/als-context.ts","../../packages/ag-react/src/ui/progress/declarative.ts","../../packages/ag-react/src/ui/progress/steps.ts","../../packages/ag-react/src/ui/progress/task.ts","../../packages/ag-react/src/ui/progress/tasks.ts"],"mappings":"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"}
1
+ {"version":3,"file":"progress.d.mts","names":[],"sources":["../../packages/ag-react/src/ui/progress/step-node.ts","../../packages/ag-react/src/ui/progress/als-context.ts","../../packages/ag-react/src/ui/progress/declarative.ts","../../packages/ag-react/src/ui/progress/steps.ts","../../packages/ag-react/src/ui/progress/task.ts","../../packages/ag-react/src/ui/progress/tasks.ts"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { i as createSpinner, r as Spinner } from "../spinner-BmldKx0M.mjs";
2
- import { t as ProgressBar } from "../progress-bar-IrUjkLfU.mjs";
3
- import { t as MultiProgress } from "../multi-progress-CcdqJFlf.mjs";
1
+ import { i as createSpinner, r as Spinner } from "../spinner-CeOmcuw_.mjs";
2
+ import { t as ProgressBar } from "../progress-bar-CXE5Qfkd.mjs";
3
+ import { t as MultiProgress } from "../multi-progress-Bq9Oi_WI.mjs";
4
4
  import { AsyncLocalStorage } from "node:async_hooks";
5
5
  //#region packages/ag-react/src/ui/progress/als-context.ts
6
6
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"progress.mjs","names":["isGenerator","runGenerator","isAsyncGenerator","runAsyncGenerator","isDeclareSteps","isPromiseLike","PHASE_LABELS","isGenerator","runGenerator","isPromiseLike"],"sources":["../../packages/ag-react/src/ui/progress/als-context.ts","../../packages/ag-react/src/ui/progress/step-node.ts","../../packages/ag-react/src/ui/progress/declarative.ts","../../packages/ag-react/src/ui/progress/steps.ts","../../packages/ag-react/src/ui/progress/task.ts","../../packages/ag-react/src/ui/progress/tasks.ts"],"sourcesContent":["/**\n * AsyncLocalStorage context for step progress reporting\n *\n * Provides a `step()` function that work functions can call to report progress.\n * Returns a no-op context when called outside of a steps() execution context,\n * so functions work in tests without the progress UI.\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\"\nimport type { TaskHandle } from \"../cli/multi-progress\"\n\n/**\n * Context available to work functions during step execution\n */\nexport interface StepContext {\n /** Update progress on current step */\n progress(current: number, total: number): void\n\n /** Create a sub-step (auto-completes previous sub-step) */\n sub(label: string): void\n\n /** Get current step label (for debugging) */\n readonly label: string\n}\n\n/**\n * Internal context with additional fields for the runner\n */\nexport interface InternalStepContext extends StepContext {\n /** TaskHandle for this step */\n readonly handle: TaskHandle\n\n /** Add a sub-step handle (called by runner) */\n _addSubHandle(label: string, handle: TaskHandle): void\n\n /** Get a pre-declared sub-step handle by label */\n _getSubHandle(label: string): TaskHandle | undefined\n\n /** Set the current sub-step (when starting a pre-declared step) */\n _setCurrentSubHandle(label: string, handle: TaskHandle): void\n\n /** Complete current sub-step (called by runner) */\n _completeSubStep(): void\n}\n\n// AsyncLocalStorage instance\nconst stepContext = new AsyncLocalStorage<InternalStepContext>()\n\n/**\n * Get the current step context\n *\n * Safe to call anywhere - returns a no-op context when called outside\n * of a steps() execution context.\n *\n * @example\n * ```typescript\n * async function processFiles(files: string[]) {\n * for (let i = 0; i < files.length; i++) {\n * step().progress(i + 1, files.length);\n * await process(files[i]);\n * }\n * }\n *\n * // In tests (no steps context)\n * await processFiles([\"a.md\", \"b.md\"]); // step() returns no-op, no errors\n *\n * // In production (with steps context)\n * await steps({ process: processFiles }).run(); // Shows progress\n * ```\n */\nexport function step(): StepContext {\n return stepContext.getStore() ?? NO_OP_CONTEXT\n}\n\n/**\n * Run a function with step context (internal use by runner)\n */\nexport function runWithStepContext<T>(ctx: InternalStepContext, fn: () => T): T {\n return stepContext.run(ctx, fn)\n}\n\n/**\n * Create an internal step context for the runner\n */\nexport function createStepContext(\n label: string,\n handle: TaskHandle,\n onSubStep?: (label: string) => TaskHandle,\n): InternalStepContext {\n let currentSubLabel: string | undefined\n let currentSubHandle: TaskHandle | null = null\n let subStepStartTime = 0\n const declaredHandles = new Map<string, TaskHandle>()\n\n return {\n get label() {\n return label\n },\n\n get handle() {\n return handle\n },\n\n progress(current: number, total: number) {\n if (currentSubHandle) {\n currentSubHandle.setTitle(`${currentSubLabel} (${current}/${total})`)\n } else {\n handle.setTitle(`${label} (${current}/${total})`)\n }\n },\n\n sub(subLabel: string) {\n // Complete previous sub-step if any\n this._completeSubStep()\n\n currentSubLabel = subLabel\n subStepStartTime = Date.now()\n\n if (onSubStep) {\n currentSubHandle = onSubStep(subLabel)\n currentSubHandle.start()\n }\n },\n\n _addSubHandle(subLabel: string, subHandle: TaskHandle) {\n declaredHandles.set(subLabel, subHandle)\n },\n\n _getSubHandle(subLabel: string) {\n return declaredHandles.get(subLabel)\n },\n\n _setCurrentSubHandle(subLabel: string, subHandle: TaskHandle) {\n currentSubLabel = subLabel\n currentSubHandle = subHandle\n subStepStartTime = Date.now()\n },\n\n _completeSubStep() {\n if (currentSubHandle && currentSubLabel) {\n const elapsed = Date.now() - subStepStartTime\n // Use numeric timing - preserves current title (which may have progress info)\n currentSubHandle.complete(elapsed)\n currentSubHandle = null\n currentSubLabel = undefined\n }\n },\n }\n}\n\n/**\n * No-op context for when step() is called outside execution context\n */\nconst NO_OP_CONTEXT: StepContext = {\n progress: () => {},\n sub: () => {},\n get label() {\n return \"\"\n },\n}\n","/**\n * Step node tree structure for declarative steps\n *\n * Parses the user's declarative object structure into an internal tree\n * that can be rendered and executed.\n */\n\n/**\n * A single step in the tree\n */\nexport interface StepNode {\n /** Display label (auto-generated or custom) */\n label: string\n\n /** Object key from the declaration */\n key: string\n\n /** Work function (if leaf node) */\n work?: (...args: unknown[]) => unknown\n\n /** Child steps (if group node) */\n children?: StepNode[]\n\n /** Indentation level for display */\n indent: number\n}\n\n/**\n * What users can declare as a step value\n */\nexport type StepValue =\n | ((...args: unknown[]) => unknown) // Function (auto-named)\n | [string, (...args: unknown[]) => unknown] // [label, function]\n | StepsDef // Nested group\n\n/**\n * The declarative structure users provide\n */\nexport type StepsDef = {\n [key: string]: StepValue\n}\n\n/**\n * Parse a declarative steps definition into a tree of StepNodes\n *\n * @param def - The declarative structure\n * @param indent - Current indentation level (internal)\n * @returns Array of StepNodes\n */\nexport function parseStepsDef(def: StepsDef, indent = 0): StepNode[] {\n const nodes: StepNode[] = []\n\n for (const [key, value] of Object.entries(def)) {\n if (typeof value === \"function\") {\n // Function: auto-generate label from key\n nodes.push({\n key,\n label: generateLabel(key),\n work: value,\n indent,\n })\n } else if (Array.isArray(value) && value.length === 2) {\n // Tuple: [label, function]\n const [label, work] = value as [string, (...args: unknown[]) => unknown]\n nodes.push({\n key,\n label,\n work,\n indent,\n })\n } else if (typeof value === \"object\" && value !== null) {\n // Nested group\n const children = parseStepsDef(value as StepsDef, indent + 1)\n nodes.push({\n key,\n label: generateLabel(key),\n children,\n indent,\n })\n }\n }\n\n return nodes\n}\n\n/**\n * Flatten the tree for sequential execution\n *\n * Returns nodes in depth-first order, with groups followed by their children.\n */\nexport function flattenStepNodes(nodes: StepNode[]): StepNode[] {\n const result: StepNode[] = []\n\n for (const node of nodes) {\n result.push(node)\n if (node.children) {\n result.push(...flattenStepNodes(node.children))\n }\n }\n\n return result\n}\n\n/**\n * Get only leaf nodes (nodes with work functions)\n */\nexport function getLeafNodes(nodes: StepNode[]): StepNode[] {\n const result: StepNode[] = []\n\n for (const node of nodes) {\n if (node.work) {\n result.push(node)\n }\n if (node.children) {\n result.push(...getLeafNodes(node.children))\n }\n }\n\n return result\n}\n\n/**\n * Generate a display label from a camelCase function name\n *\n * @example\n * generateLabel(\"loadModules\") // \"Load modules\"\n * generateLabel(\"parseMarkdown\") // \"Parse markdown\"\n * generateLabel(\"initBoardStateGenerator\") // \"Init board state generator\"\n */\nexport function generateLabel(fnName: string): string {\n return fnName\n .replace(/([A-Z])/g, \" $1\") // Insert space before capitals\n .replace(/(\\d+)/g, \" $1\") // Insert space before numbers\n .toLowerCase() // Convert all to lowercase\n .trim() // Remove leading/trailing spaces\n .replace(/\\s+/g, \" \") // Collapse multiple spaces\n .replace(/^./, (s) => s.toUpperCase()) // Capitalize only first letter\n}\n\n/**\n * Check if a value is a StepsDef (nested group)\n */\nexport function isStepsDef(value: unknown): value is StepsDef {\n return typeof value === \"object\" && value !== null && !Array.isArray(value) && typeof value !== \"function\"\n}\n\n/**\n * Check if a value is a tuple [label, function]\n */\nexport function isLabelTuple(value: unknown): value is [string, (...args: unknown[]) => unknown] {\n return Array.isArray(value) && value.length === 2 && typeof value[0] === \"string\" && typeof value[1] === \"function\"\n}\n","/**\n * Declarative steps implementation\n *\n * Provides the declarative overload for steps() that accepts an object\n * structure and shows all steps upfront before execution.\n */\n\nimport { MultiProgress, type TaskHandle } from \"../cli/multi-progress\"\nimport { step as getStepContext, createStepContext, runWithStepContext, type InternalStepContext } from \"./als-context\"\nimport { parseStepsDef, flattenStepNodes, getLeafNodes, type StepNode, type StepsDef } from \"./step-node\"\n\n// Re-export step() for convenience\nexport { step } from \"./als-context\"\n\n// Node.js globals for yielding to event loop\ndeclare function setImmediate(callback: (value?: unknown) => void): unknown\ndeclare function setTimeout(callback: (value?: unknown) => void, ms: number): unknown\n\n/**\n * Options for run() and pipe() execution\n */\nexport interface ExecuteOptions {\n /** Clear progress display after completion (default: false) */\n clear?: boolean\n}\n\n/**\n * Extract the return type from a generator or async generator\n */\ntype GeneratorReturn<T> =\n T extends Generator<unknown, infer R, unknown> ? R : T extends AsyncGenerator<unknown, infer R, unknown> ? R : T\n\n/**\n * Unwrap the result type, handling generators specially\n */\ntype UnwrapResult<T> = Awaited<GeneratorReturn<Awaited<T>>>\n\n/**\n * Result type: maps step keys to their return values\n */\ntype StepResults<T extends StepsDef> = {\n [K in keyof T]: T[K] extends (...args: unknown[]) => infer R\n ? UnwrapResult<R>\n : T[K] extends [string, (...args: unknown[]) => infer R]\n ? UnwrapResult<R>\n : T[K] extends StepsDef\n ? StepResults<T[K]>\n : unknown\n}\n\n/**\n * The runner object returned by steps()\n */\nexport interface StepsRunner<T extends StepsDef> {\n /** Internal: the parsed step nodes (for testing) */\n readonly _steps: StepNode[]\n\n /**\n * Execute all steps sequentially\n * @returns Results keyed by step name\n */\n run(options?: ExecuteOptions): Promise<StepResults<T>>\n\n /**\n * Execute all steps in a pipeline (each receives previous result)\n * @returns Final step's result\n */\n pipe(options?: ExecuteOptions): Promise<unknown>\n\n /**\n * Manually signal completion (for manual execution mode)\n */\n done(options?: { clear?: boolean }): void\n}\n\n/**\n * Create a declarative steps runner\n *\n * @param def - Object structure defining steps\n * @returns StepsRunner with run(), pipe(), and done() methods\n *\n * @example\n * ```typescript\n * const loader = stepsDeclarative({\n * loadModules, // \"Load modules\"\n * loadRepo: { // \"Load repo\" (group)\n * discover, // \"Discover\"\n * parse, // \"Parse\"\n * },\n * });\n *\n * const results = await loader.run({ clear: true });\n * ```\n */\nexport function stepsDeclarative<T extends StepsDef>(def: T): StepsRunner<T> {\n const rootNodes = parseStepsDef(def)\n const allNodes = flattenStepNodes(rootNodes)\n\n let multi: MultiProgress | null = null\n const handles = new Map<StepNode, TaskHandle>()\n\n // Build group tracking: map each group to its leaf nodes\n const groupLeaves = new Map<StepNode, StepNode[]>()\n const leafToGroups = new Map<StepNode, StepNode[]>()\n\n for (const node of allNodes) {\n if (node.children) {\n const leaves = getLeafNodes([node])\n groupLeaves.set(node, leaves)\n for (const leaf of leaves) {\n const groups = leafToGroups.get(leaf) ?? []\n groups.push(node)\n leafToGroups.set(leaf, groups)\n }\n }\n }\n\n return {\n get _steps() {\n return rootNodes\n },\n\n async run(options?: ExecuteOptions): Promise<StepResults<T>> {\n multi = new MultiProgress()\n\n // Register all steps upfront (shows pending state)\n registerAllSteps(allNodes, multi, handles)\n\n // Group timing tracking\n const groupStartTimes = new Map<StepNode, number>()\n const completedLeaves = new Set<StepNode>()\n\n multi.start()\n\n // Yield to event loop to ensure initial render is displayed\n // before we start modifying task states\n await new Promise((resolve) => setImmediate(resolve))\n\n const results: Record<string, unknown> = {}\n\n try {\n // Execute each step with work\n for (const node of allNodes) {\n if (node.work) {\n // Start parent groups if not started\n const groups = leafToGroups.get(node) ?? []\n for (const group of groups) {\n if (!groupStartTimes.has(group)) {\n groupStartTimes.set(group, Date.now())\n handles.get(group)?.start()\n }\n }\n\n const result = await executeStep(node, handles, multi)\n setNestedResult(results, node.key, result)\n\n // Mark leaf as complete and check group completion\n completedLeaves.add(node)\n for (const group of groups) {\n const leaves = groupLeaves.get(group) ?? []\n if (leaves.every((l) => completedLeaves.has(l))) {\n const elapsed = Date.now() - groupStartTimes.get(group)!\n handles.get(group)?.complete(elapsed)\n }\n }\n }\n }\n } finally {\n multi.stop(options?.clear ?? false)\n }\n\n return results as StepResults<T>\n },\n\n async pipe(options?: ExecuteOptions): Promise<unknown> {\n multi = new MultiProgress()\n\n // Register all steps upfront\n registerAllSteps(allNodes, multi, handles)\n\n // Group timing tracking\n const groupStartTimes = new Map<StepNode, number>()\n const completedLeaves = new Set<StepNode>()\n\n multi.start()\n\n // Yield to event loop to ensure initial render is displayed\n // before we start modifying task states\n await new Promise((resolve) => setImmediate(resolve))\n\n let previousResult: unknown = undefined\n\n try {\n // Execute each step, passing previous result\n for (const node of allNodes) {\n if (node.work) {\n // Start parent groups if not started\n const groups = leafToGroups.get(node) ?? []\n for (const group of groups) {\n if (!groupStartTimes.has(group)) {\n groupStartTimes.set(group, Date.now())\n handles.get(group)?.start()\n }\n }\n\n previousResult = await executeStep(node, handles, multi, previousResult)\n\n // Mark leaf as complete and check group completion\n completedLeaves.add(node)\n for (const group of groups) {\n const leaves = groupLeaves.get(group) ?? []\n if (leaves.every((l) => completedLeaves.has(l))) {\n const elapsed = Date.now() - groupStartTimes.get(group)!\n handles.get(group)?.complete(elapsed)\n }\n }\n }\n }\n } finally {\n multi.stop(options?.clear ?? false)\n }\n\n return previousResult\n },\n\n done(options?: { clear?: boolean }) {\n if (multi) {\n multi.stop(options?.clear ?? false)\n multi = null\n }\n },\n }\n}\n\n/**\n * Register all steps with MultiProgress upfront\n */\nfunction registerAllSteps(nodes: StepNode[], multi: MultiProgress, handles: Map<StepNode, TaskHandle>): void {\n // Register in order without insertAfter - simpler and correct\n for (const node of nodes) {\n const isGroup = node.children && !node.work\n const handle = multi.add(node.label, {\n type: isGroup ? \"group\" : \"spinner\",\n indent: node.indent,\n })\n handles.set(node, handle)\n }\n}\n\n/**\n * Execute a single step\n */\nasync function executeStep(\n node: StepNode,\n handles: Map<StepNode, TaskHandle>,\n multi: MultiProgress,\n input?: unknown,\n): Promise<unknown> {\n const handle = handles.get(node)!\n const startTime = Date.now()\n\n // Yield to event loop before starting\n await new Promise((resolve) => setImmediate(resolve))\n\n // Create step context for ALS\n const ctx = createStepContext(node.label, handle, (subLabel) => {\n // Create sub-step handle when step().sub() is called\n return multi.add(subLabel, {\n type: \"spinner\",\n indent: node.indent + 1,\n insertAfter: handle.id,\n })\n })\n\n handle.start()\n\n try {\n // Run work function with ALS context\n const result = await runWithStepContext(ctx, () => {\n if (input !== undefined) {\n return (node.work as (input: unknown) => unknown)(input)\n }\n return node.work!()\n })\n\n // Handle generator results\n if (isGenerator(result)) {\n return await runGenerator(result, ctx, node, multi)\n }\n\n if (isAsyncGenerator(result)) {\n return await runAsyncGenerator(result, ctx, node, multi)\n }\n\n // Complete any remaining sub-step\n ctx._completeSubStep()\n\n // Complete the step with timing\n const elapsed = Date.now() - startTime\n handle.complete(elapsed)\n\n return result\n } catch (error) {\n handle.fail()\n throw error\n }\n}\n\n/**\n * Run a sync generator step\n */\nasync function runGenerator<T>(\n gen: Generator<unknown, T, unknown>,\n ctx: InternalStepContext,\n node: StepNode,\n multi: MultiProgress,\n): Promise<T> {\n const startTime = Date.now()\n let result = gen.next()\n let hasSubSteps = false\n // Track last inserted handle to maintain correct order\n // Each new sub-step inserts after the previous one, not after parent\n let lastInsertedId = ctx.handle.id\n\n while (!result.done) {\n const value = result.value\n\n // Handle yielded values\n if (isDeclareSteps(value)) {\n // Declare all sub-steps upfront (show as pending)\n if (!hasSubSteps) {\n hasSubSteps = true\n ctx.handle.setType(\"group\")\n }\n for (const label of value.declare) {\n const subHandle = multi.add(label, {\n type: \"spinner\",\n indent: node.indent + 1,\n insertAfter: lastInsertedId,\n })\n lastInsertedId = subHandle.id\n ctx._addSubHandle(label, subHandle)\n }\n } else if (typeof value === \"string\") {\n // String = start a sub-step with this label\n ctx._completeSubStep()\n\n // First sub-step: change parent from spinner to group (no animation)\n if (!hasSubSteps) {\n hasSubSteps = true\n ctx.handle.setType(\"group\")\n }\n\n // Check if already declared, otherwise create new\n const existingHandle = ctx._getSubHandle?.(value)\n if (existingHandle) {\n ctx._setCurrentSubHandle(value, existingHandle)\n existingHandle.start()\n } else {\n const subHandle = multi.add(value, {\n type: \"spinner\",\n indent: node.indent + 1,\n insertAfter: lastInsertedId,\n })\n lastInsertedId = subHandle.id\n ctx._addSubHandle(value, subHandle)\n subHandle.start()\n }\n } else if (isProgressUpdate(value)) {\n // Progress update\n ctx.progress(value.current ?? 0, value.total ?? 0)\n }\n\n // Yield to event loop for animation\n await new Promise((resolve) => setTimeout(resolve, 0))\n\n result = gen.next()\n }\n\n // Complete any remaining sub-step\n ctx._completeSubStep()\n\n // Complete the step with timing\n const elapsed = Date.now() - startTime\n ctx.handle.complete(elapsed)\n\n return result.value\n}\n\n/**\n * Run an async generator step\n */\nasync function runAsyncGenerator<T>(\n gen: AsyncGenerator<unknown, T, unknown>,\n ctx: InternalStepContext,\n node: StepNode,\n multi: MultiProgress,\n): Promise<T> {\n const startTime = Date.now()\n let result = await gen.next()\n let hasSubSteps = false\n // Track last inserted handle to maintain correct order\n // Each new sub-step inserts after the previous one, not after parent\n let lastInsertedId = ctx.handle.id\n\n while (!result.done) {\n const value = result.value\n\n // Handle yielded values\n if (isDeclareSteps(value)) {\n // Declare all sub-steps upfront (show as pending)\n if (!hasSubSteps) {\n hasSubSteps = true\n ctx.handle.setType(\"group\")\n }\n for (const label of value.declare) {\n const subHandle = multi.add(label, {\n type: \"spinner\",\n indent: node.indent + 1,\n insertAfter: lastInsertedId,\n })\n lastInsertedId = subHandle.id\n ctx._addSubHandle(label, subHandle)\n }\n } else if (typeof value === \"string\") {\n // String = start a sub-step with this label\n ctx._completeSubStep()\n\n // First sub-step: change parent from spinner to group (no animation)\n if (!hasSubSteps) {\n hasSubSteps = true\n ctx.handle.setType(\"group\")\n }\n\n // Check if already declared, otherwise create new\n const existingHandle = ctx._getSubHandle(value)\n if (existingHandle) {\n ctx._setCurrentSubHandle(value, existingHandle)\n existingHandle.start()\n } else {\n const subHandle = multi.add(value, {\n type: \"spinner\",\n indent: node.indent + 1,\n insertAfter: lastInsertedId,\n })\n lastInsertedId = subHandle.id\n ctx._addSubHandle(value, subHandle)\n subHandle.start()\n }\n } else if (isProgressUpdate(value)) {\n // Progress update\n ctx.progress(value.current ?? 0, value.total ?? 0)\n }\n\n // Yield to event loop for animation\n await new Promise((resolve) => setTimeout(resolve, 0))\n\n result = await gen.next()\n }\n\n // Complete any remaining sub-step\n ctx._completeSubStep()\n\n // Complete the step with timing\n const elapsed = Date.now() - startTime\n ctx.handle.complete(elapsed)\n\n return result.value\n}\n\n/**\n * Set a nested result value by key path\n */\nfunction setNestedResult(results: Record<string, unknown>, key: string, value: unknown): void {\n // For now, flat keys only - nested groups would need path handling\n results[key] = value\n}\n\n/**\n * Type guards\n */\nfunction isGenerator(value: unknown): value is Generator<unknown, unknown, unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as Generator).next === \"function\" &&\n typeof (value as Generator)[Symbol.iterator] === \"function\"\n )\n}\n\nfunction isAsyncGenerator(value: unknown): value is AsyncGenerator<unknown, unknown, unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as AsyncGenerator).next === \"function\" &&\n typeof (value as AsyncGenerator)[Symbol.asyncIterator] === \"function\"\n )\n}\n\ninterface ProgressUpdate {\n current?: number\n total?: number\n}\n\ninterface DeclareSteps {\n declare: string[]\n}\n\nfunction isProgressUpdate(value: unknown): value is ProgressUpdate {\n return (\n value !== null && typeof value === \"object\" && !Array.isArray(value) && (\"current\" in value || \"total\" in value)\n )\n}\n\nfunction isDeclareSteps(value: unknown): value is DeclareSteps {\n return (\n value !== null && typeof value === \"object\" && \"declare\" in value && Array.isArray((value as DeclareSteps).declare)\n )\n}\n","/**\n * Sequential step runner with progress display\n *\n * Supports two modes:\n *\n * ## Declarative Mode (recommended)\n *\n * Pass an object to declare all steps upfront:\n *\n * ```typescript\n * import { steps, step } from \"./index\";\n *\n * const loader = steps({\n * loadModules, // Auto-named: \"Load modules\"\n * loadRepo: { // Group: \"Load repo\"\n * discover, // \"Discover\"\n * parse, // \"Parse\"\n * },\n * });\n *\n * const results = await loader.run({ clear: true });\n *\n * // Inside work functions, use step() to report progress:\n * async function discover() {\n * const files = await glob(\"**\\/*.md\");\n * for (let i = 0; i < files.length; i++) {\n * step().progress(i + 1, files.length);\n * await process(files[i]);\n * }\n * return files;\n * }\n * ```\n *\n * ## Fluent Mode (legacy)\n *\n * Chain steps with `.run()` and execute with `.execute()`:\n *\n * ```typescript\n * await steps()\n * .run(\"Loading modules\", () => import(\"./app\"))\n * .run(\"Building view\", async () => buildView())\n * .execute();\n * ```\n *\n * Generators can yield sub-step progress:\n * - Yield a **string** to create a new sub-step\n * - Yield an **object** `{ current, total }` to update progress on current sub-step\n */\n\nimport { MultiProgress, type TaskHandle } from \"../cli/multi-progress\"\nimport { stepsDeclarative, type StepsRunner } from \"./declarative\"\nimport type { StepsDef } from \"./step-node\"\n\n// Re-export step() context helper\nexport { step } from \"./als-context\"\n\n// Re-export types from declarative\nexport type { StepsRunner } from \"./declarative\"\nexport type { StepsDef, StepNode } from \"./step-node\"\nexport type { StepContext } from \"./als-context\"\n\n// Node.js globals for yielding to event loop\ndeclare function setImmediate(callback: (value?: unknown) => void): unknown\ndeclare function setTimeout(callback: (value?: unknown) => void, ms: number): unknown\n\n/** Progress update (object form) */\ninterface ProgressUpdate {\n current?: number\n total?: number\n}\n\n/** Declare all sub-steps upfront (optional, yield as first value) */\ninterface DeclareSteps {\n declare: string[]\n}\n\n/** What generators can yield */\ntype StepYield = string | ProgressUpdate | DeclareSteps\n\n/**\n * Controller for creating and updating sub-steps\n *\n * Passed to work functions that need to report sub-step progress.\n */\nexport interface StepController {\n /** Create a new sub-step (auto-completes previous sub-step) */\n new (label: string): void\n\n /** Update progress on current sub-step */\n progress(current: number, total: number): void\n\n /** Explicitly complete current sub-step (optional - new() auto-completes) */\n done(): void\n}\n\n/** Work function types */\ntype SyncWork<T> = () => T\ntype AsyncWork<T> = () => PromiseLike<T>\ntype SyncGeneratorWork<T> = () => Generator<StepYield, T, unknown>\ntype AsyncGeneratorWork<T> = () => AsyncGenerator<StepYield, T, unknown>\n/** Work function with step controller for sub-step progress */\ntype WorkWithStep<T> = (step: StepController) => T | PromiseLike<T>\n\ntype WorkFn<T> = SyncWork<T> | AsyncWork<T> | SyncGeneratorWork<T> | AsyncGeneratorWork<T> | WorkWithStep<T>\n\n/** Step definition */\ninterface StepDef<T = unknown> {\n title: string\n work: WorkFn<T>\n}\n\n/** Options for execute() */\nexport interface ExecuteOptions {\n /** Clear progress display after completion (default: false) */\n clear?: boolean\n}\n\nexport interface StepBuilder {\n /**\n * Add a step to run\n *\n * @param title - Display title for this step\n * @param work - Function to execute. Can be:\n * - Sync function: `() => result`\n * - Async function: `async () => result`\n * - Sync generator: `function* () { yield \"sub-step\"; return result; }`\n * - Async generator: `async function* () { yield \"sub-step\"; return result; }`\n *\n * Generators can yield:\n * - `\"string\"` - Creates a new sub-step with that label\n * - `{ current: N, total: M }` - Updates progress on current sub-step\n */\n run<T>(title: string, work: WorkFn<T>): StepBuilder\n\n /**\n * Execute all steps in sequence\n * @param options - Execution options\n * @returns Results keyed by step title\n */\n execute(options?: ExecuteOptions): Promise<Record<string, unknown>>\n}\n\n/**\n * Create a step runner\n *\n * @overload Declarative mode - pass an object to declare steps upfront\n * @overload Fluent mode - chain steps with .run() and execute with .execute()\n *\n * @example Declarative mode (recommended)\n * ```typescript\n * const loader = steps({\n * loadModules,\n * loadRepo: { discover, parse },\n * });\n * const results = await loader.run({ clear: true });\n * ```\n *\n * @example Fluent mode\n * ```typescript\n * await steps()\n * .run(\"Step 1\", doStep1)\n * .run(\"Step 2\", doStep2)\n * .execute();\n * ```\n */\nexport function steps<T extends StepsDef>(def: T): StepsRunner<T>\nexport function steps(): StepBuilder\nexport function steps<T extends StepsDef>(def?: T): StepsRunner<T> | StepBuilder {\n // Declarative mode: object passed\n if (def !== undefined) {\n return stepsDeclarative(def)\n }\n\n // Fluent mode: no arguments\n return createFluentBuilder()\n}\n\n/**\n * Create a no-op StepController for work functions that don't use sub-steps.\n * This satisfies the type union while being harmless if not used.\n */\nfunction createNoopStepController(): StepController {\n const controller = (_label: string) => {}\n controller.progress = (_current: number, _total: number) => {}\n controller.done = () => {}\n // StepController uses `new` as a callable signature, not a constructor\n return controller as unknown as StepController\n}\n\n/**\n * Create the fluent step builder (legacy mode)\n */\nfunction createFluentBuilder(): StepBuilder {\n const stepList: StepDef[] = []\n\n const builder: StepBuilder = {\n run<T>(title: string, work: WorkFn<T>): StepBuilder {\n stepList.push({ title, work: work as WorkFn<unknown> })\n return builder\n },\n\n async execute(options?: ExecuteOptions): Promise<Record<string, unknown>> {\n const multi = new MultiProgress()\n const handles = new Map<string, TaskHandle>()\n const results: Record<string, unknown> = {}\n\n // Register all steps upfront (shows pending state)\n for (const step of stepList) {\n handles.set(step.title, multi.add(step.title, { type: \"spinner\" }))\n }\n\n multi.start()\n\n try {\n for (const step of stepList) {\n const handle = handles.get(step.title)!\n\n // Yield to event loop before potentially blocking work\n await new Promise((resolve) => setImmediate(resolve))\n\n const result = step.work(createNoopStepController())\n\n if (isAsyncGenerator(result)) {\n // Async generator: parent stays static while sub-steps animate\n results[step.title] = await runAsyncGenerator(result, handle, step.title, multi)\n } else if (isSyncGenerator(result)) {\n // Sync generator: same handling\n results[step.title] = await runSyncGenerator(result, handle, step.title, multi)\n } else if (isPromiseLike(result)) {\n handle.start()\n results[step.title] = await result\n handle.complete()\n } else {\n handle.start()\n results[step.title] = result\n handle.complete()\n }\n }\n } finally {\n multi.stop(options?.clear ?? false)\n }\n\n return results\n },\n }\n\n return builder\n}\n\n/**\n * Process a yielded value:\n * - { declare: [...] } = declare all sub-steps upfront (show as pending)\n * - string = start/create a sub-step with that label\n * - { current, total } = update progress on current sub-step\n */\nfunction processYield(value: StepYield, state: GeneratorState, multi: MultiProgress): void {\n // Handle declaration of all sub-steps upfront\n if (isDeclareSteps(value)) {\n for (const label of value.declare) {\n const handle = multi.add(label, {\n type: \"spinner\",\n indent: 1,\n insertAfter: state.lastInsertId,\n })\n state.lastInsertId = handle.id\n state.declaredSteps.set(label, handle)\n }\n return\n }\n\n if (typeof value === \"string\") {\n // String = start a sub-step with this label\n if (state.currentHandle && state.currentLabel) {\n const elapsed = Date.now() - state.subStepStartTime\n state.currentHandle.complete(elapsed)\n }\n\n state.currentLabel = value\n state.subStepStartTime = Date.now()\n\n // Use pre-declared handle if available, otherwise create new one\n const declared = state.declaredSteps.get(value)\n if (declared) {\n state.currentHandle = declared\n state.currentHandle.start()\n } else {\n state.currentHandle = multi.add(value, {\n type: \"spinner\",\n indent: 1,\n insertAfter: state.lastInsertId,\n })\n state.lastInsertId = state.currentHandle.id\n state.currentHandle.start()\n }\n } else if (value && typeof value === \"object\") {\n // Object = progress update on current sub-step\n const { current, total } = value as ProgressUpdate\n if (state.currentHandle && total && total > 0) {\n state.currentHandle.setTitle(`${state.currentLabel} (${current ?? 0}/${total})`)\n }\n }\n}\n\nfunction isDeclareSteps(value: StepYield): value is DeclareSteps {\n return (\n value !== null && typeof value === \"object\" && \"declare\" in value && Array.isArray((value as DeclareSteps).declare)\n )\n}\n\n/** State for generator processing */\ninterface GeneratorState {\n currentLabel: string | undefined\n currentHandle: TaskHandle | null\n lastInsertId: string\n subStepStartTime: number\n startTime: number\n /** Pre-declared sub-steps (pending until started) */\n declaredSteps: Map<string, TaskHandle>\n}\n\n/**\n * Run an async generator step\n */\nasync function runAsyncGenerator<T>(\n gen: AsyncGenerator<StepYield, T, unknown>,\n parentHandle: TaskHandle,\n parentTitle: string,\n multi: MultiProgress,\n): Promise<T> {\n const state: GeneratorState = {\n currentLabel: undefined,\n currentHandle: null,\n lastInsertId: parentHandle.id,\n subStepStartTime: Date.now(),\n startTime: Date.now(),\n declaredSteps: new Map(),\n }\n\n let result = await gen.next()\n\n while (!result.done) {\n processYield(result.value, state, multi)\n\n // Yield to event loop for animation\n await new Promise((resolve) => setTimeout(resolve, 0))\n\n result = await gen.next()\n }\n\n // Complete final sub-step\n if (state.currentHandle && state.currentLabel) {\n const elapsed = Date.now() - state.subStepStartTime\n state.currentHandle.complete(elapsed)\n }\n\n // Complete parent step\n const totalElapsed = Date.now() - state.startTime\n parentHandle.complete(totalElapsed)\n\n return result.value\n}\n\n/**\n * Run a sync generator step\n */\nasync function runSyncGenerator<T>(\n gen: Generator<StepYield, T, unknown>,\n parentHandle: TaskHandle,\n parentTitle: string,\n multi: MultiProgress,\n): Promise<T> {\n const state: GeneratorState = {\n currentLabel: undefined,\n currentHandle: null,\n lastInsertId: parentHandle.id,\n subStepStartTime: Date.now(),\n startTime: Date.now(),\n declaredSteps: new Map(),\n }\n\n let result = gen.next()\n\n while (!result.done) {\n processYield(result.value, state, multi)\n\n // Yield to event loop for animation\n await new Promise((resolve) => setTimeout(resolve, 0))\n\n result = gen.next()\n }\n\n // Complete final sub-step\n if (state.currentHandle && state.currentLabel) {\n const elapsed = Date.now() - state.subStepStartTime\n state.currentHandle.complete(elapsed)\n }\n\n // Complete parent step\n const totalElapsed = Date.now() - state.startTime\n parentHandle.complete(totalElapsed)\n\n return result.value\n}\n\nfunction isAsyncGenerator(value: unknown): value is AsyncGenerator<StepYield, unknown, unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as AsyncGenerator).next === \"function\" &&\n typeof (value as AsyncGenerator)[Symbol.asyncIterator] === \"function\"\n )\n}\n\nfunction isSyncGenerator(value: unknown): value is Generator<StepYield, unknown, unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as Generator).next === \"function\" &&\n typeof (value as Generator)[Symbol.iterator] === \"function\"\n )\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return value !== null && typeof value === \"object\" && typeof (value as PromiseLike<unknown>).then === \"function\"\n}\n","/**\n * Fluent single-task wrapper\n *\n * @deprecated Use `steps()` from `@silvery/ag-react/ui/progress` instead.\n *\n * @example\n * ```typescript\n * // OLD (deprecated):\n * import { task } from \"./index\";\n * const data = await task(\"Loading data\").wrap(fetchData());\n *\n * // NEW:\n * import { steps } from \"./index\";\n * const results = await steps({ loadData: fetchData }).run();\n * ```\n */\n\nimport type { ProgressInfo } from \"../types.js\"\nimport { createSpinner } from \"../cli/spinner\"\n\n/** Phase labels for common operations */\nconst PHASE_LABELS: Record<string, string> = {\n reading: \"Reading events\",\n applying: \"Applying events\",\n rules: \"Evaluating rules\",\n scanning: \"Scanning files\",\n reconciling: \"Reconciling changes\",\n board: \"Building view\",\n}\n\nexport interface TaskWrapper {\n /**\n * Wrap work with a spinner indicator\n * @param work - Promise, function, or generator\n */\n wrap<T>(\n work: T | PromiseLike<T> | (() => T | PromiseLike<T>) | (() => Generator<ProgressInfo, T, unknown>),\n ): Promise<T>\n}\n\n/**\n * Create a task wrapper with spinner\n *\n * @param title - Display title for the task\n * @returns TaskWrapper with wrap() method\n */\nexport function task(title: string): TaskWrapper {\n return {\n async wrap<T>(\n work: T | PromiseLike<T> | (() => T | PromiseLike<T>) | (() => Generator<ProgressInfo, T, unknown>),\n ): Promise<T> {\n const spinner = createSpinner()\n spinner(title)\n\n try {\n // If it's a function, call it\n if (typeof work === \"function\") {\n const result = (work as () => unknown)()\n\n // Check if it's a generator\n if (isGenerator(result)) {\n return await runGenerator(result as Generator<ProgressInfo, T, unknown>, spinner, title)\n }\n\n // Check if it's a promise\n if (isPromiseLike(result)) {\n const value = await result\n spinner.succeed(title)\n return value as T\n }\n\n // Sync function\n spinner.succeed(title)\n return result as T\n }\n\n // If it's a promise-like, await it\n if (isPromiseLike(work)) {\n const value = await work\n spinner.succeed(title)\n return value as T\n }\n\n // Otherwise it's a direct value\n spinner.succeed(title)\n return work as T\n } catch (error) {\n spinner.fail(title)\n throw error\n }\n },\n }\n}\n\n/**\n * Run a generator with progress updates\n */\nasync function runGenerator<T>(\n gen: Generator<ProgressInfo, T, unknown>,\n spinner: ReturnType<typeof createSpinner>,\n baseTitle: string,\n): Promise<T> {\n let result = gen.next()\n\n while (!result.done) {\n const info = result.value\n const phase = info.phase ?? \"\"\n const phaseLabel = PHASE_LABELS[phase] ?? (phase || baseTitle)\n\n // Update spinner with phase and progress count\n if (info.total && info.total > 0) {\n spinner(`${phaseLabel} (${info.current}/${info.total})`)\n } else {\n spinner(phaseLabel)\n }\n\n // Yield to event loop for animation\n await new Promise((resolve) => setImmediate(resolve))\n\n result = gen.next()\n }\n\n spinner.succeed(baseTitle)\n return result.value\n}\n\nfunction isGenerator(value: unknown): value is Generator<ProgressInfo, unknown, unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as Generator).next === \"function\" &&\n typeof (value as Generator).throw === \"function\"\n )\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return value !== null && typeof value === \"object\" && typeof (value as PromiseLike<unknown>).then === \"function\"\n}\n","/**\n * Fluent sequential task builder\n *\n * @deprecated Use `steps()` from `@silvery/ag-react/ui/progress` instead.\n *\n * @example\n * ```typescript\n * // OLD (deprecated):\n * import { tasks } from \"./index\";\n * const results = await tasks()\n * .add(\"Loading\", loadModules)\n * .add(\"Processing\", processData)\n * .run({ clear: true });\n *\n * // NEW:\n * import { steps } from \"./index\";\n * const results = await steps({\n * loadModules,\n * processData,\n * }).run({ clear: true });\n * ```\n */\n\nimport type { ProgressInfo } from \"../types.js\"\nimport { MultiProgress, type TaskHandle } from \"../cli/multi-progress\"\n\n// Node.js globals for yielding to event loop\ndeclare function setImmediate(callback: (value?: unknown) => void): unknown\ndeclare function setTimeout(callback: (value?: unknown) => void, ms: number): unknown\n\n/** Phase labels for common operations */\nconst PHASE_LABELS: Record<string, string> = {\n // Repo loading phases\n discover: \"Discovering files\",\n parse: \"Parsing markdown\",\n apply: \"Applying changes\",\n resolve: \"Resolving links\",\n materialize: \"Evaluating rules\",\n // Board building\n board: \"Building view\",\n // Legacy/alternative names\n reading: \"Reading events\",\n applying: \"Applying events\",\n rules: \"Evaluating rules\",\n scanning: \"Scanning files\",\n reconciling: \"Reconciling changes\",\n}\n\n/** Task definition */\ninterface TaskDef<T = unknown> {\n title: string\n work: () => T | PromiseLike<T> | Generator<ProgressInfo, T, unknown>\n}\n\n/** Options for run() */\nexport interface RunOptions {\n /** Clear progress display after completion (default: false) */\n clear?: boolean\n}\n\nexport interface TaskBuilder {\n /**\n * Add a task to the sequence\n * @param title - Display title\n * @param work - Function, async function, or generator\n */\n add<T>(title: string, work: () => T | PromiseLike<T> | Generator<ProgressInfo, T, unknown>): TaskBuilder\n\n /**\n * Run all tasks in sequence\n * @param options - Run options\n * @returns Results keyed by task title\n */\n run(options?: RunOptions): Promise<Record<string, unknown>>\n}\n\n/**\n * Create a sequential task builder\n *\n * @returns TaskBuilder with add() and run() methods\n */\nexport function tasks(): TaskBuilder {\n const taskList: TaskDef[] = []\n\n const builder: TaskBuilder = {\n add<T>(title: string, work: () => T | PromiseLike<T> | Generator<ProgressInfo, T, unknown>): TaskBuilder {\n taskList.push({ title, work })\n return builder\n },\n\n async run(options?: RunOptions): Promise<Record<string, unknown>> {\n const multi = new MultiProgress()\n const handles = new Map<string, TaskHandle>()\n const results: Record<string, unknown> = {}\n\n // Register all tasks upfront (shows pending state)\n for (const task of taskList) {\n handles.set(task.title, multi.add(task.title, { type: \"spinner\" }))\n }\n\n multi.start()\n\n try {\n for (const task of taskList) {\n const handle = handles.get(task.title)!\n\n // Force render before potentially blocking operation\n await new Promise((resolve) => setImmediate(resolve))\n\n const result = task.work()\n\n if (isGenerator(result)) {\n // Generator: parent stays static, phases animate underneath\n results[task.title] = await runGenerator(result, handle, task.title, multi)\n } else if (isPromiseLike(result)) {\n handle.start()\n results[task.title] = await result\n handle.complete()\n } else {\n handle.start()\n results[task.title] = result\n handle.complete()\n }\n }\n } finally {\n multi.stop(options?.clear ?? false)\n }\n\n return results\n },\n }\n\n return builder\n}\n\n/**\n * Run a generator task with progress updates\n * Parent task stays visible while sub-phases are indented below\n */\nasync function runGenerator<T>(\n gen: Generator<ProgressInfo, T, unknown>,\n parentHandle: TaskHandle,\n baseTitle: string,\n multi: MultiProgress,\n): Promise<T> {\n let result = gen.next()\n let currentPhase: string | undefined\n let currentPhaseHandle: TaskHandle | null = null\n let lastInsertId = parentHandle.id // Insert phases after parent (then after each other)\n let phaseStartTime = Date.now()\n const taskStartTime = Date.now()\n\n while (!result.done) {\n const info = result.value\n const phase = info.phase ?? \"\"\n\n // When phase changes, complete current phase and start new one (indented)\n if (phase && phase !== currentPhase) {\n if (currentPhaseHandle && currentPhase) {\n // Complete previous phase with timing\n const elapsed = Date.now() - phaseStartTime\n const prevLabel = PHASE_LABELS[currentPhase] ?? currentPhase\n currentPhaseHandle.complete(`${prevLabel} (${elapsed}ms)`)\n }\n\n // Start new phase line (indented under parent, inserted after last phase)\n currentPhase = phase\n phaseStartTime = Date.now()\n const phaseLabel = PHASE_LABELS[phase] ?? phase\n currentPhaseHandle = multi.add(phaseLabel, {\n type: \"spinner\",\n indent: 1,\n insertAfter: lastInsertId,\n })\n lastInsertId = currentPhaseHandle.id\n currentPhaseHandle.start()\n }\n\n // Update progress count on current phase line\n if (currentPhaseHandle && info.total && info.total > 0) {\n const phaseLabel = PHASE_LABELS[phase] ?? phase\n currentPhaseHandle.setTitle(`${phaseLabel} (${info.current}/${info.total})`)\n }\n\n // Yield to event loop for animation\n await new Promise((resolve) => setTimeout(resolve, 0))\n\n result = gen.next()\n }\n\n // Complete final phase\n if (currentPhaseHandle && currentPhase) {\n const elapsed = Date.now() - phaseStartTime\n const finalLabel = PHASE_LABELS[currentPhase] ?? currentPhase\n currentPhaseHandle.complete(`${finalLabel} (${elapsed}ms)`)\n }\n\n // Complete parent task with total timing\n const totalElapsed = Date.now() - taskStartTime\n parentHandle.complete(`${baseTitle} (${totalElapsed}ms)`)\n\n return result.value\n}\n\nfunction isGenerator(value: unknown): value is Generator<ProgressInfo, unknown, unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as Generator).next === \"function\" &&\n typeof (value as Generator).throw === \"function\"\n )\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return value !== null && typeof value === \"object\" && typeof (value as PromiseLike<unknown>).then === \"function\"\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"progress.mjs","names":["isGenerator","runGenerator","isAsyncGenerator","runAsyncGenerator","isDeclareSteps","isPromiseLike","PHASE_LABELS","isGenerator","runGenerator","isPromiseLike"],"sources":["../../packages/ag-react/src/ui/progress/als-context.ts","../../packages/ag-react/src/ui/progress/step-node.ts","../../packages/ag-react/src/ui/progress/declarative.ts","../../packages/ag-react/src/ui/progress/steps.ts","../../packages/ag-react/src/ui/progress/task.ts","../../packages/ag-react/src/ui/progress/tasks.ts"],"sourcesContent":["/**\n * AsyncLocalStorage context for step progress reporting\n *\n * Provides a `step()` function that work functions can call to report progress.\n * Returns a no-op context when called outside of a steps() execution context,\n * so functions work in tests without the progress UI.\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\"\nimport type { TaskHandle } from \"../cli/multi-progress\"\n\n/**\n * Context available to work functions during step execution\n */\nexport interface StepContext {\n /** Update progress on current step */\n progress(current: number, total: number): void\n\n /** Create a sub-step (auto-completes previous sub-step) */\n sub(label: string): void\n\n /** Get current step label (for debugging) */\n readonly label: string\n}\n\n/**\n * Internal context with additional fields for the runner\n */\nexport interface InternalStepContext extends StepContext {\n /** TaskHandle for this step */\n readonly handle: TaskHandle\n\n /** Add a sub-step handle (called by runner) */\n _addSubHandle(label: string, handle: TaskHandle): void\n\n /** Get a pre-declared sub-step handle by label */\n _getSubHandle(label: string): TaskHandle | undefined\n\n /** Set the current sub-step (when starting a pre-declared step) */\n _setCurrentSubHandle(label: string, handle: TaskHandle): void\n\n /** Complete current sub-step (called by runner) */\n _completeSubStep(): void\n}\n\n// AsyncLocalStorage instance\nconst stepContext = new AsyncLocalStorage<InternalStepContext>()\n\n/**\n * Get the current step context\n *\n * Safe to call anywhere - returns a no-op context when called outside\n * of a steps() execution context.\n *\n * @example\n * ```typescript\n * async function processFiles(files: string[]) {\n * for (let i = 0; i < files.length; i++) {\n * step().progress(i + 1, files.length);\n * await process(files[i]);\n * }\n * }\n *\n * // In tests (no steps context)\n * await processFiles([\"a.md\", \"b.md\"]); // step() returns no-op, no errors\n *\n * // In production (with steps context)\n * await steps({ process: processFiles }).run(); // Shows progress\n * ```\n */\nexport function step(): StepContext {\n return stepContext.getStore() ?? NO_OP_CONTEXT\n}\n\n/**\n * Run a function with step context (internal use by runner)\n */\nexport function runWithStepContext<T>(ctx: InternalStepContext, fn: () => T): T {\n return stepContext.run(ctx, fn)\n}\n\n/**\n * Create an internal step context for the runner\n */\nexport function createStepContext(\n label: string,\n handle: TaskHandle,\n onSubStep?: (label: string) => TaskHandle,\n): InternalStepContext {\n let currentSubLabel: string | undefined\n let currentSubHandle: TaskHandle | null = null\n let subStepStartTime = 0\n const declaredHandles = new Map<string, TaskHandle>()\n\n return {\n get label() {\n return label\n },\n\n get handle() {\n return handle\n },\n\n progress(current: number, total: number) {\n if (currentSubHandle) {\n currentSubHandle.setTitle(`${currentSubLabel} (${current}/${total})`)\n } else {\n handle.setTitle(`${label} (${current}/${total})`)\n }\n },\n\n sub(subLabel: string) {\n // Complete previous sub-step if any\n this._completeSubStep()\n\n currentSubLabel = subLabel\n subStepStartTime = Date.now()\n\n if (onSubStep) {\n currentSubHandle = onSubStep(subLabel)\n currentSubHandle.start()\n }\n },\n\n _addSubHandle(subLabel: string, subHandle: TaskHandle) {\n declaredHandles.set(subLabel, subHandle)\n },\n\n _getSubHandle(subLabel: string) {\n return declaredHandles.get(subLabel)\n },\n\n _setCurrentSubHandle(subLabel: string, subHandle: TaskHandle) {\n currentSubLabel = subLabel\n currentSubHandle = subHandle\n subStepStartTime = Date.now()\n },\n\n _completeSubStep() {\n if (currentSubHandle && currentSubLabel) {\n const elapsed = Date.now() - subStepStartTime\n // Use numeric timing - preserves current title (which may have progress info)\n currentSubHandle.complete(elapsed)\n currentSubHandle = null\n currentSubLabel = undefined\n }\n },\n }\n}\n\n/**\n * No-op context for when step() is called outside execution context\n */\nconst NO_OP_CONTEXT: StepContext = {\n progress: () => {},\n sub: () => {},\n get label() {\n return \"\"\n },\n}\n","/**\n * Step node tree structure for declarative steps\n *\n * Parses the user's declarative object structure into an internal tree\n * that can be rendered and executed.\n */\n\n/**\n * A single step in the tree\n */\nexport interface StepNode {\n /** Display label (auto-generated or custom) */\n label: string\n\n /** Object key from the declaration */\n key: string\n\n /** Work function (if leaf node) */\n work?: (...args: unknown[]) => unknown\n\n /** Child steps (if group node) */\n children?: StepNode[]\n\n /** Indentation level for display */\n indent: number\n}\n\n/**\n * What users can declare as a step value\n */\nexport type StepValue =\n | ((...args: unknown[]) => unknown) // Function (auto-named)\n | [string, (...args: unknown[]) => unknown] // [label, function]\n | StepsDef // Nested group\n\n/**\n * The declarative structure users provide\n */\nexport type StepsDef = {\n [key: string]: StepValue\n}\n\n/**\n * Parse a declarative steps definition into a tree of StepNodes\n *\n * @param def - The declarative structure\n * @param indent - Current indentation level (internal)\n * @returns Array of StepNodes\n */\nexport function parseStepsDef(def: StepsDef, indent = 0): StepNode[] {\n const nodes: StepNode[] = []\n\n for (const [key, value] of Object.entries(def)) {\n if (typeof value === \"function\") {\n // Function: auto-generate label from key\n nodes.push({\n key,\n label: generateLabel(key),\n work: value,\n indent,\n })\n } else if (Array.isArray(value) && value.length === 2) {\n // Tuple: [label, function]\n const [label, work] = value as [string, (...args: unknown[]) => unknown]\n nodes.push({\n key,\n label,\n work,\n indent,\n })\n } else if (typeof value === \"object\" && value !== null) {\n // Nested group\n const children = parseStepsDef(value as StepsDef, indent + 1)\n nodes.push({\n key,\n label: generateLabel(key),\n children,\n indent,\n })\n }\n }\n\n return nodes\n}\n\n/**\n * Flatten the tree for sequential execution\n *\n * Returns nodes in depth-first order, with groups followed by their children.\n */\nexport function flattenStepNodes(nodes: StepNode[]): StepNode[] {\n const result: StepNode[] = []\n\n for (const node of nodes) {\n result.push(node)\n if (node.children) {\n result.push(...flattenStepNodes(node.children))\n }\n }\n\n return result\n}\n\n/**\n * Get only leaf nodes (nodes with work functions)\n */\nexport function getLeafNodes(nodes: StepNode[]): StepNode[] {\n const result: StepNode[] = []\n\n for (const node of nodes) {\n if (node.work) {\n result.push(node)\n }\n if (node.children) {\n result.push(...getLeafNodes(node.children))\n }\n }\n\n return result\n}\n\n/**\n * Generate a display label from a camelCase function name\n *\n * @example\n * generateLabel(\"loadModules\") // \"Load modules\"\n * generateLabel(\"parseMarkdown\") // \"Parse markdown\"\n * generateLabel(\"initBoardStateGenerator\") // \"Init board state generator\"\n */\nexport function generateLabel(fnName: string): string {\n return fnName\n .replace(/([A-Z])/g, \" $1\") // Insert space before capitals\n .replace(/(\\d+)/g, \" $1\") // Insert space before numbers\n .toLowerCase() // Convert all to lowercase\n .trim() // Remove leading/trailing spaces\n .replace(/\\s+/g, \" \") // Collapse multiple spaces\n .replace(/^./, (s) => s.toUpperCase()) // Capitalize only first letter\n}\n\n/**\n * Check if a value is a StepsDef (nested group)\n */\nexport function isStepsDef(value: unknown): value is StepsDef {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n typeof value !== \"function\"\n )\n}\n\n/**\n * Check if a value is a tuple [label, function]\n */\nexport function isLabelTuple(value: unknown): value is [string, (...args: unknown[]) => unknown] {\n return (\n Array.isArray(value) &&\n value.length === 2 &&\n typeof value[0] === \"string\" &&\n typeof value[1] === \"function\"\n )\n}\n","/**\n * Declarative steps implementation\n *\n * Provides the declarative overload for steps() that accepts an object\n * structure and shows all steps upfront before execution.\n */\n\nimport { MultiProgress, type TaskHandle } from \"../cli/multi-progress\"\nimport {\n step as getStepContext,\n createStepContext,\n runWithStepContext,\n type InternalStepContext,\n} from \"./als-context\"\nimport {\n parseStepsDef,\n flattenStepNodes,\n getLeafNodes,\n type StepNode,\n type StepsDef,\n} from \"./step-node\"\n\n// Re-export step() for convenience\nexport { step } from \"./als-context\"\n\n// Node.js globals for yielding to event loop\ndeclare function setImmediate(callback: (value?: unknown) => void): unknown\ndeclare function setTimeout(callback: (value?: unknown) => void, ms: number): unknown\n\n/**\n * Options for run() and pipe() execution\n */\nexport interface ExecuteOptions {\n /** Clear progress display after completion (default: false) */\n clear?: boolean\n}\n\n/**\n * Extract the return type from a generator or async generator\n */\ntype GeneratorReturn<T> =\n T extends Generator<unknown, infer R, unknown>\n ? R\n : T extends AsyncGenerator<unknown, infer R, unknown>\n ? R\n : T\n\n/**\n * Unwrap the result type, handling generators specially\n */\ntype UnwrapResult<T> = Awaited<GeneratorReturn<Awaited<T>>>\n\n/**\n * Result type: maps step keys to their return values\n */\ntype StepResults<T extends StepsDef> = {\n [K in keyof T]: T[K] extends (...args: unknown[]) => infer R\n ? UnwrapResult<R>\n : T[K] extends [string, (...args: unknown[]) => infer R]\n ? UnwrapResult<R>\n : T[K] extends StepsDef\n ? StepResults<T[K]>\n : unknown\n}\n\n/**\n * The runner object returned by steps()\n */\nexport interface StepsRunner<T extends StepsDef> {\n /** Internal: the parsed step nodes (for testing) */\n readonly _steps: StepNode[]\n\n /**\n * Execute all steps sequentially\n * @returns Results keyed by step name\n */\n run(options?: ExecuteOptions): Promise<StepResults<T>>\n\n /**\n * Execute all steps in a pipeline (each receives previous result)\n * @returns Final step's result\n */\n pipe(options?: ExecuteOptions): Promise<unknown>\n\n /**\n * Manually signal completion (for manual execution mode)\n */\n done(options?: { clear?: boolean }): void\n}\n\n/**\n * Create a declarative steps runner\n *\n * @param def - Object structure defining steps\n * @returns StepsRunner with run(), pipe(), and done() methods\n *\n * @example\n * ```typescript\n * const loader = stepsDeclarative({\n * loadModules, // \"Load modules\"\n * loadRepo: { // \"Load repo\" (group)\n * discover, // \"Discover\"\n * parse, // \"Parse\"\n * },\n * });\n *\n * const results = await loader.run({ clear: true });\n * ```\n */\nexport function stepsDeclarative<T extends StepsDef>(def: T): StepsRunner<T> {\n const rootNodes = parseStepsDef(def)\n const allNodes = flattenStepNodes(rootNodes)\n\n let multi: MultiProgress | null = null\n const handles = new Map<StepNode, TaskHandle>()\n\n // Build group tracking: map each group to its leaf nodes\n const groupLeaves = new Map<StepNode, StepNode[]>()\n const leafToGroups = new Map<StepNode, StepNode[]>()\n\n for (const node of allNodes) {\n if (node.children) {\n const leaves = getLeafNodes([node])\n groupLeaves.set(node, leaves)\n for (const leaf of leaves) {\n const groups = leafToGroups.get(leaf) ?? []\n groups.push(node)\n leafToGroups.set(leaf, groups)\n }\n }\n }\n\n return {\n get _steps() {\n return rootNodes\n },\n\n async run(options?: ExecuteOptions): Promise<StepResults<T>> {\n multi = new MultiProgress()\n\n // Register all steps upfront (shows pending state)\n registerAllSteps(allNodes, multi, handles)\n\n // Group timing tracking\n const groupStartTimes = new Map<StepNode, number>()\n const completedLeaves = new Set<StepNode>()\n\n multi.start()\n\n // Yield to event loop to ensure initial render is displayed\n // before we start modifying task states\n await new Promise((resolve) => setImmediate(resolve))\n\n const results: Record<string, unknown> = {}\n\n try {\n // Execute each step with work\n for (const node of allNodes) {\n if (node.work) {\n // Start parent groups if not started\n const groups = leafToGroups.get(node) ?? []\n for (const group of groups) {\n if (!groupStartTimes.has(group)) {\n groupStartTimes.set(group, Date.now())\n handles.get(group)?.start()\n }\n }\n\n const result = await executeStep(node, handles, multi)\n setNestedResult(results, node.key, result)\n\n // Mark leaf as complete and check group completion\n completedLeaves.add(node)\n for (const group of groups) {\n const leaves = groupLeaves.get(group) ?? []\n if (leaves.every((l) => completedLeaves.has(l))) {\n const elapsed = Date.now() - groupStartTimes.get(group)!\n handles.get(group)?.complete(elapsed)\n }\n }\n }\n }\n } finally {\n multi.stop(options?.clear ?? false)\n }\n\n return results as StepResults<T>\n },\n\n async pipe(options?: ExecuteOptions): Promise<unknown> {\n multi = new MultiProgress()\n\n // Register all steps upfront\n registerAllSteps(allNodes, multi, handles)\n\n // Group timing tracking\n const groupStartTimes = new Map<StepNode, number>()\n const completedLeaves = new Set<StepNode>()\n\n multi.start()\n\n // Yield to event loop to ensure initial render is displayed\n // before we start modifying task states\n await new Promise((resolve) => setImmediate(resolve))\n\n let previousResult: unknown = undefined\n\n try {\n // Execute each step, passing previous result\n for (const node of allNodes) {\n if (node.work) {\n // Start parent groups if not started\n const groups = leafToGroups.get(node) ?? []\n for (const group of groups) {\n if (!groupStartTimes.has(group)) {\n groupStartTimes.set(group, Date.now())\n handles.get(group)?.start()\n }\n }\n\n previousResult = await executeStep(node, handles, multi, previousResult)\n\n // Mark leaf as complete and check group completion\n completedLeaves.add(node)\n for (const group of groups) {\n const leaves = groupLeaves.get(group) ?? []\n if (leaves.every((l) => completedLeaves.has(l))) {\n const elapsed = Date.now() - groupStartTimes.get(group)!\n handles.get(group)?.complete(elapsed)\n }\n }\n }\n }\n } finally {\n multi.stop(options?.clear ?? false)\n }\n\n return previousResult\n },\n\n done(options?: { clear?: boolean }) {\n if (multi) {\n multi.stop(options?.clear ?? false)\n multi = null\n }\n },\n }\n}\n\n/**\n * Register all steps with MultiProgress upfront\n */\nfunction registerAllSteps(\n nodes: StepNode[],\n multi: MultiProgress,\n handles: Map<StepNode, TaskHandle>,\n): void {\n // Register in order without insertAfter - simpler and correct\n for (const node of nodes) {\n const isGroup = node.children && !node.work\n const handle = multi.add(node.label, {\n type: isGroup ? \"group\" : \"spinner\",\n indent: node.indent,\n })\n handles.set(node, handle)\n }\n}\n\n/**\n * Execute a single step\n */\nasync function executeStep(\n node: StepNode,\n handles: Map<StepNode, TaskHandle>,\n multi: MultiProgress,\n input?: unknown,\n): Promise<unknown> {\n const handle = handles.get(node)!\n const startTime = Date.now()\n\n // Yield to event loop before starting\n await new Promise((resolve) => setImmediate(resolve))\n\n // Create step context for ALS\n const ctx = createStepContext(node.label, handle, (subLabel) => {\n // Create sub-step handle when step().sub() is called\n return multi.add(subLabel, {\n type: \"spinner\",\n indent: node.indent + 1,\n insertAfter: handle.id,\n })\n })\n\n handle.start()\n\n try {\n // Run work function with ALS context\n const result = await runWithStepContext(ctx, () => {\n if (input !== undefined) {\n return (node.work as (input: unknown) => unknown)(input)\n }\n return node.work!()\n })\n\n // Handle generator results\n if (isGenerator(result)) {\n return await runGenerator(result, ctx, node, multi)\n }\n\n if (isAsyncGenerator(result)) {\n return await runAsyncGenerator(result, ctx, node, multi)\n }\n\n // Complete any remaining sub-step\n ctx._completeSubStep()\n\n // Complete the step with timing\n const elapsed = Date.now() - startTime\n handle.complete(elapsed)\n\n return result\n } catch (error) {\n handle.fail()\n throw error\n }\n}\n\n/**\n * Run a sync generator step\n */\nasync function runGenerator<T>(\n gen: Generator<unknown, T, unknown>,\n ctx: InternalStepContext,\n node: StepNode,\n multi: MultiProgress,\n): Promise<T> {\n const startTime = Date.now()\n let result = gen.next()\n let hasSubSteps = false\n // Track last inserted handle to maintain correct order\n // Each new sub-step inserts after the previous one, not after parent\n let lastInsertedId = ctx.handle.id\n\n while (!result.done) {\n const value = result.value\n\n // Handle yielded values\n if (isDeclareSteps(value)) {\n // Declare all sub-steps upfront (show as pending)\n if (!hasSubSteps) {\n hasSubSteps = true\n ctx.handle.setType(\"group\")\n }\n for (const label of value.declare) {\n const subHandle = multi.add(label, {\n type: \"spinner\",\n indent: node.indent + 1,\n insertAfter: lastInsertedId,\n })\n lastInsertedId = subHandle.id\n ctx._addSubHandle(label, subHandle)\n }\n } else if (typeof value === \"string\") {\n // String = start a sub-step with this label\n ctx._completeSubStep()\n\n // First sub-step: change parent from spinner to group (no animation)\n if (!hasSubSteps) {\n hasSubSteps = true\n ctx.handle.setType(\"group\")\n }\n\n // Check if already declared, otherwise create new\n const existingHandle = ctx._getSubHandle?.(value)\n if (existingHandle) {\n ctx._setCurrentSubHandle(value, existingHandle)\n existingHandle.start()\n } else {\n const subHandle = multi.add(value, {\n type: \"spinner\",\n indent: node.indent + 1,\n insertAfter: lastInsertedId,\n })\n lastInsertedId = subHandle.id\n ctx._addSubHandle(value, subHandle)\n subHandle.start()\n }\n } else if (isProgressUpdate(value)) {\n // Progress update\n ctx.progress(value.current ?? 0, value.total ?? 0)\n }\n\n // Yield to event loop for animation\n await new Promise((resolve) => setTimeout(resolve, 0))\n\n result = gen.next()\n }\n\n // Complete any remaining sub-step\n ctx._completeSubStep()\n\n // Complete the step with timing\n const elapsed = Date.now() - startTime\n ctx.handle.complete(elapsed)\n\n return result.value\n}\n\n/**\n * Run an async generator step\n */\nasync function runAsyncGenerator<T>(\n gen: AsyncGenerator<unknown, T, unknown>,\n ctx: InternalStepContext,\n node: StepNode,\n multi: MultiProgress,\n): Promise<T> {\n const startTime = Date.now()\n let result = await gen.next()\n let hasSubSteps = false\n // Track last inserted handle to maintain correct order\n // Each new sub-step inserts after the previous one, not after parent\n let lastInsertedId = ctx.handle.id\n\n while (!result.done) {\n const value = result.value\n\n // Handle yielded values\n if (isDeclareSteps(value)) {\n // Declare all sub-steps upfront (show as pending)\n if (!hasSubSteps) {\n hasSubSteps = true\n ctx.handle.setType(\"group\")\n }\n for (const label of value.declare) {\n const subHandle = multi.add(label, {\n type: \"spinner\",\n indent: node.indent + 1,\n insertAfter: lastInsertedId,\n })\n lastInsertedId = subHandle.id\n ctx._addSubHandle(label, subHandle)\n }\n } else if (typeof value === \"string\") {\n // String = start a sub-step with this label\n ctx._completeSubStep()\n\n // First sub-step: change parent from spinner to group (no animation)\n if (!hasSubSteps) {\n hasSubSteps = true\n ctx.handle.setType(\"group\")\n }\n\n // Check if already declared, otherwise create new\n const existingHandle = ctx._getSubHandle(value)\n if (existingHandle) {\n ctx._setCurrentSubHandle(value, existingHandle)\n existingHandle.start()\n } else {\n const subHandle = multi.add(value, {\n type: \"spinner\",\n indent: node.indent + 1,\n insertAfter: lastInsertedId,\n })\n lastInsertedId = subHandle.id\n ctx._addSubHandle(value, subHandle)\n subHandle.start()\n }\n } else if (isProgressUpdate(value)) {\n // Progress update\n ctx.progress(value.current ?? 0, value.total ?? 0)\n }\n\n // Yield to event loop for animation\n await new Promise((resolve) => setTimeout(resolve, 0))\n\n result = await gen.next()\n }\n\n // Complete any remaining sub-step\n ctx._completeSubStep()\n\n // Complete the step with timing\n const elapsed = Date.now() - startTime\n ctx.handle.complete(elapsed)\n\n return result.value\n}\n\n/**\n * Set a nested result value by key path\n */\nfunction setNestedResult(results: Record<string, unknown>, key: string, value: unknown): void {\n // For now, flat keys only - nested groups would need path handling\n results[key] = value\n}\n\n/**\n * Type guards\n */\nfunction isGenerator(value: unknown): value is Generator<unknown, unknown, unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as Generator).next === \"function\" &&\n typeof (value as Generator)[Symbol.iterator] === \"function\"\n )\n}\n\nfunction isAsyncGenerator(value: unknown): value is AsyncGenerator<unknown, unknown, unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as AsyncGenerator).next === \"function\" &&\n typeof (value as AsyncGenerator)[Symbol.asyncIterator] === \"function\"\n )\n}\n\ninterface ProgressUpdate {\n current?: number\n total?: number\n}\n\ninterface DeclareSteps {\n declare: string[]\n}\n\nfunction isProgressUpdate(value: unknown): value is ProgressUpdate {\n return (\n value !== null &&\n typeof value === \"object\" &&\n !Array.isArray(value) &&\n (\"current\" in value || \"total\" in value)\n )\n}\n\nfunction isDeclareSteps(value: unknown): value is DeclareSteps {\n return (\n value !== null &&\n typeof value === \"object\" &&\n \"declare\" in value &&\n Array.isArray((value as DeclareSteps).declare)\n )\n}\n","/**\n * Sequential step runner with progress display\n *\n * Supports two modes:\n *\n * ## Declarative Mode (recommended)\n *\n * Pass an object to declare all steps upfront:\n *\n * ```typescript\n * import { steps, step } from \"./index\";\n *\n * const loader = steps({\n * loadModules, // Auto-named: \"Load modules\"\n * loadRepo: { // Group: \"Load repo\"\n * discover, // \"Discover\"\n * parse, // \"Parse\"\n * },\n * });\n *\n * const results = await loader.run({ clear: true });\n *\n * // Inside work functions, use step() to report progress:\n * async function discover() {\n * const files = await glob(\"**\\/*.md\");\n * for (let i = 0; i < files.length; i++) {\n * step().progress(i + 1, files.length);\n * await process(files[i]);\n * }\n * return files;\n * }\n * ```\n *\n * ## Fluent Mode (legacy)\n *\n * Chain steps with `.run()` and execute with `.execute()`:\n *\n * ```typescript\n * await steps()\n * .run(\"Loading modules\", () => import(\"./app\"))\n * .run(\"Building view\", async () => buildView())\n * .execute();\n * ```\n *\n * Generators can yield sub-step progress:\n * - Yield a **string** to create a new sub-step\n * - Yield an **object** `{ current, total }` to update progress on current sub-step\n */\n\nimport { MultiProgress, type TaskHandle } from \"../cli/multi-progress\"\nimport { stepsDeclarative, type StepsRunner } from \"./declarative\"\nimport type { StepsDef } from \"./step-node\"\n\n// Re-export step() context helper\nexport { step } from \"./als-context\"\n\n// Re-export types from declarative\nexport type { StepsRunner } from \"./declarative\"\nexport type { StepsDef, StepNode } from \"./step-node\"\nexport type { StepContext } from \"./als-context\"\n\n// Node.js globals for yielding to event loop\ndeclare function setImmediate(callback: (value?: unknown) => void): unknown\ndeclare function setTimeout(callback: (value?: unknown) => void, ms: number): unknown\n\n/** Progress update (object form) */\ninterface ProgressUpdate {\n current?: number\n total?: number\n}\n\n/** Declare all sub-steps upfront (optional, yield as first value) */\ninterface DeclareSteps {\n declare: string[]\n}\n\n/** What generators can yield */\ntype StepYield = string | ProgressUpdate | DeclareSteps\n\n/**\n * Controller for creating and updating sub-steps\n *\n * Passed to work functions that need to report sub-step progress.\n */\nexport interface StepController {\n /** Create a new sub-step (auto-completes previous sub-step) */\n new (label: string): void\n\n /** Update progress on current sub-step */\n progress(current: number, total: number): void\n\n /** Explicitly complete current sub-step (optional - new() auto-completes) */\n done(): void\n}\n\n/** Work function types */\ntype SyncWork<T> = () => T\ntype AsyncWork<T> = () => PromiseLike<T>\ntype SyncGeneratorWork<T> = () => Generator<StepYield, T, unknown>\ntype AsyncGeneratorWork<T> = () => AsyncGenerator<StepYield, T, unknown>\n/** Work function with step controller for sub-step progress */\ntype WorkWithStep<T> = (step: StepController) => T | PromiseLike<T>\n\ntype WorkFn<T> =\n | SyncWork<T>\n | AsyncWork<T>\n | SyncGeneratorWork<T>\n | AsyncGeneratorWork<T>\n | WorkWithStep<T>\n\n/** Step definition */\ninterface StepDef<T = unknown> {\n title: string\n work: WorkFn<T>\n}\n\n/** Options for execute() */\nexport interface ExecuteOptions {\n /** Clear progress display after completion (default: false) */\n clear?: boolean\n}\n\nexport interface StepBuilder {\n /**\n * Add a step to run\n *\n * @param title - Display title for this step\n * @param work - Function to execute. Can be:\n * - Sync function: `() => result`\n * - Async function: `async () => result`\n * - Sync generator: `function* () { yield \"sub-step\"; return result; }`\n * - Async generator: `async function* () { yield \"sub-step\"; return result; }`\n *\n * Generators can yield:\n * - `\"string\"` - Creates a new sub-step with that label\n * - `{ current: N, total: M }` - Updates progress on current sub-step\n */\n run<T>(title: string, work: WorkFn<T>): StepBuilder\n\n /**\n * Execute all steps in sequence\n * @param options - Execution options\n * @returns Results keyed by step title\n */\n execute(options?: ExecuteOptions): Promise<Record<string, unknown>>\n}\n\n/**\n * Create a step runner\n *\n * @overload Declarative mode - pass an object to declare steps upfront\n * @overload Fluent mode - chain steps with .run() and execute with .execute()\n *\n * @example Declarative mode (recommended)\n * ```typescript\n * const loader = steps({\n * loadModules,\n * loadRepo: { discover, parse },\n * });\n * const results = await loader.run({ clear: true });\n * ```\n *\n * @example Fluent mode\n * ```typescript\n * await steps()\n * .run(\"Step 1\", doStep1)\n * .run(\"Step 2\", doStep2)\n * .execute();\n * ```\n */\nexport function steps<T extends StepsDef>(def: T): StepsRunner<T>\nexport function steps(): StepBuilder\nexport function steps<T extends StepsDef>(def?: T): StepsRunner<T> | StepBuilder {\n // Declarative mode: object passed\n if (def !== undefined) {\n return stepsDeclarative(def)\n }\n\n // Fluent mode: no arguments\n return createFluentBuilder()\n}\n\n/**\n * Create a no-op StepController for work functions that don't use sub-steps.\n * This satisfies the type union while being harmless if not used.\n */\nfunction createNoopStepController(): StepController {\n const controller = (_label: string) => {}\n controller.progress = (_current: number, _total: number) => {}\n controller.done = () => {}\n // StepController uses `new` as a callable signature, not a constructor\n return controller as unknown as StepController\n}\n\n/**\n * Create the fluent step builder (legacy mode)\n */\nfunction createFluentBuilder(): StepBuilder {\n const stepList: StepDef[] = []\n\n const builder: StepBuilder = {\n run<T>(title: string, work: WorkFn<T>): StepBuilder {\n stepList.push({ title, work: work as WorkFn<unknown> })\n return builder\n },\n\n async execute(options?: ExecuteOptions): Promise<Record<string, unknown>> {\n const multi = new MultiProgress()\n const handles = new Map<string, TaskHandle>()\n const results: Record<string, unknown> = {}\n\n // Register all steps upfront (shows pending state)\n for (const step of stepList) {\n handles.set(step.title, multi.add(step.title, { type: \"spinner\" }))\n }\n\n multi.start()\n\n try {\n for (const step of stepList) {\n const handle = handles.get(step.title)!\n\n // Yield to event loop before potentially blocking work\n await new Promise((resolve) => setImmediate(resolve))\n\n const result = step.work(createNoopStepController())\n\n if (isAsyncGenerator(result)) {\n // Async generator: parent stays static while sub-steps animate\n results[step.title] = await runAsyncGenerator(result, handle, step.title, multi)\n } else if (isSyncGenerator(result)) {\n // Sync generator: same handling\n results[step.title] = await runSyncGenerator(result, handle, step.title, multi)\n } else if (isPromiseLike(result)) {\n handle.start()\n results[step.title] = await result\n handle.complete()\n } else {\n handle.start()\n results[step.title] = result\n handle.complete()\n }\n }\n } finally {\n multi.stop(options?.clear ?? false)\n }\n\n return results\n },\n }\n\n return builder\n}\n\n/**\n * Process a yielded value:\n * - { declare: [...] } = declare all sub-steps upfront (show as pending)\n * - string = start/create a sub-step with that label\n * - { current, total } = update progress on current sub-step\n */\nfunction processYield(value: StepYield, state: GeneratorState, multi: MultiProgress): void {\n // Handle declaration of all sub-steps upfront\n if (isDeclareSteps(value)) {\n for (const label of value.declare) {\n const handle = multi.add(label, {\n type: \"spinner\",\n indent: 1,\n insertAfter: state.lastInsertId,\n })\n state.lastInsertId = handle.id\n state.declaredSteps.set(label, handle)\n }\n return\n }\n\n if (typeof value === \"string\") {\n // String = start a sub-step with this label\n if (state.currentHandle && state.currentLabel) {\n const elapsed = Date.now() - state.subStepStartTime\n state.currentHandle.complete(elapsed)\n }\n\n state.currentLabel = value\n state.subStepStartTime = Date.now()\n\n // Use pre-declared handle if available, otherwise create new one\n const declared = state.declaredSteps.get(value)\n if (declared) {\n state.currentHandle = declared\n state.currentHandle.start()\n } else {\n state.currentHandle = multi.add(value, {\n type: \"spinner\",\n indent: 1,\n insertAfter: state.lastInsertId,\n })\n state.lastInsertId = state.currentHandle.id\n state.currentHandle.start()\n }\n } else if (value && typeof value === \"object\") {\n // Object = progress update on current sub-step\n const { current, total } = value as ProgressUpdate\n if (state.currentHandle && total && total > 0) {\n state.currentHandle.setTitle(`${state.currentLabel} (${current ?? 0}/${total})`)\n }\n }\n}\n\nfunction isDeclareSteps(value: StepYield): value is DeclareSteps {\n return (\n value !== null &&\n typeof value === \"object\" &&\n \"declare\" in value &&\n Array.isArray((value as DeclareSteps).declare)\n )\n}\n\n/** State for generator processing */\ninterface GeneratorState {\n currentLabel: string | undefined\n currentHandle: TaskHandle | null\n lastInsertId: string\n subStepStartTime: number\n startTime: number\n /** Pre-declared sub-steps (pending until started) */\n declaredSteps: Map<string, TaskHandle>\n}\n\n/**\n * Run an async generator step\n */\nasync function runAsyncGenerator<T>(\n gen: AsyncGenerator<StepYield, T, unknown>,\n parentHandle: TaskHandle,\n parentTitle: string,\n multi: MultiProgress,\n): Promise<T> {\n const state: GeneratorState = {\n currentLabel: undefined,\n currentHandle: null,\n lastInsertId: parentHandle.id,\n subStepStartTime: Date.now(),\n startTime: Date.now(),\n declaredSteps: new Map(),\n }\n\n let result = await gen.next()\n\n while (!result.done) {\n processYield(result.value, state, multi)\n\n // Yield to event loop for animation\n await new Promise((resolve) => setTimeout(resolve, 0))\n\n result = await gen.next()\n }\n\n // Complete final sub-step\n if (state.currentHandle && state.currentLabel) {\n const elapsed = Date.now() - state.subStepStartTime\n state.currentHandle.complete(elapsed)\n }\n\n // Complete parent step\n const totalElapsed = Date.now() - state.startTime\n parentHandle.complete(totalElapsed)\n\n return result.value\n}\n\n/**\n * Run a sync generator step\n */\nasync function runSyncGenerator<T>(\n gen: Generator<StepYield, T, unknown>,\n parentHandle: TaskHandle,\n parentTitle: string,\n multi: MultiProgress,\n): Promise<T> {\n const state: GeneratorState = {\n currentLabel: undefined,\n currentHandle: null,\n lastInsertId: parentHandle.id,\n subStepStartTime: Date.now(),\n startTime: Date.now(),\n declaredSteps: new Map(),\n }\n\n let result = gen.next()\n\n while (!result.done) {\n processYield(result.value, state, multi)\n\n // Yield to event loop for animation\n await new Promise((resolve) => setTimeout(resolve, 0))\n\n result = gen.next()\n }\n\n // Complete final sub-step\n if (state.currentHandle && state.currentLabel) {\n const elapsed = Date.now() - state.subStepStartTime\n state.currentHandle.complete(elapsed)\n }\n\n // Complete parent step\n const totalElapsed = Date.now() - state.startTime\n parentHandle.complete(totalElapsed)\n\n return result.value\n}\n\nfunction isAsyncGenerator(value: unknown): value is AsyncGenerator<StepYield, unknown, unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as AsyncGenerator).next === \"function\" &&\n typeof (value as AsyncGenerator)[Symbol.asyncIterator] === \"function\"\n )\n}\n\nfunction isSyncGenerator(value: unknown): value is Generator<StepYield, unknown, unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as Generator).next === \"function\" &&\n typeof (value as Generator)[Symbol.iterator] === \"function\"\n )\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as PromiseLike<unknown>).then === \"function\"\n )\n}\n","/**\n * Fluent single-task wrapper\n *\n * @deprecated Use `steps()` from `@silvery/ag-react/ui/progress` instead.\n *\n * @example\n * ```typescript\n * // OLD (deprecated):\n * import { task } from \"./index\";\n * const data = await task(\"Loading data\").wrap(fetchData());\n *\n * // NEW:\n * import { steps } from \"./index\";\n * const results = await steps({ loadData: fetchData }).run();\n * ```\n */\n\nimport type { ProgressInfo } from \"../types.js\"\nimport { createSpinner } from \"../cli/spinner\"\n\n/** Phase labels for common operations */\nconst PHASE_LABELS: Record<string, string> = {\n reading: \"Reading events\",\n applying: \"Applying events\",\n rules: \"Evaluating rules\",\n scanning: \"Scanning files\",\n reconciling: \"Reconciling changes\",\n board: \"Building view\",\n}\n\nexport interface TaskWrapper {\n /**\n * Wrap work with a spinner indicator\n * @param work - Promise, function, or generator\n */\n wrap<T>(\n work:\n | T\n | PromiseLike<T>\n | (() => T | PromiseLike<T>)\n | (() => Generator<ProgressInfo, T, unknown>),\n ): Promise<T>\n}\n\n/**\n * Create a task wrapper with spinner\n *\n * @param title - Display title for the task\n * @returns TaskWrapper with wrap() method\n */\nexport function task(title: string): TaskWrapper {\n return {\n async wrap<T>(\n work:\n | T\n | PromiseLike<T>\n | (() => T | PromiseLike<T>)\n | (() => Generator<ProgressInfo, T, unknown>),\n ): Promise<T> {\n const spinner = createSpinner()\n spinner(title)\n\n try {\n // If it's a function, call it\n if (typeof work === \"function\") {\n const result = (work as () => unknown)()\n\n // Check if it's a generator\n if (isGenerator(result)) {\n return await runGenerator(result as Generator<ProgressInfo, T, unknown>, spinner, title)\n }\n\n // Check if it's a promise\n if (isPromiseLike(result)) {\n const value = await result\n spinner.succeed(title)\n return value as T\n }\n\n // Sync function\n spinner.succeed(title)\n return result as T\n }\n\n // If it's a promise-like, await it\n if (isPromiseLike(work)) {\n const value = await work\n spinner.succeed(title)\n return value as T\n }\n\n // Otherwise it's a direct value\n spinner.succeed(title)\n return work as T\n } catch (error) {\n spinner.fail(title)\n throw error\n }\n },\n }\n}\n\n/**\n * Run a generator with progress updates\n */\nasync function runGenerator<T>(\n gen: Generator<ProgressInfo, T, unknown>,\n spinner: ReturnType<typeof createSpinner>,\n baseTitle: string,\n): Promise<T> {\n let result = gen.next()\n\n while (!result.done) {\n const info = result.value\n const phase = info.phase ?? \"\"\n const phaseLabel = PHASE_LABELS[phase] ?? (phase || baseTitle)\n\n // Update spinner with phase and progress count\n if (info.total && info.total > 0) {\n spinner(`${phaseLabel} (${info.current}/${info.total})`)\n } else {\n spinner(phaseLabel)\n }\n\n // Yield to event loop for animation\n await new Promise((resolve) => setImmediate(resolve))\n\n result = gen.next()\n }\n\n spinner.succeed(baseTitle)\n return result.value\n}\n\nfunction isGenerator(value: unknown): value is Generator<ProgressInfo, unknown, unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as Generator).next === \"function\" &&\n typeof (value as Generator).throw === \"function\"\n )\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as PromiseLike<unknown>).then === \"function\"\n )\n}\n","/**\n * Fluent sequential task builder\n *\n * @deprecated Use `steps()` from `@silvery/ag-react/ui/progress` instead.\n *\n * @example\n * ```typescript\n * // OLD (deprecated):\n * import { tasks } from \"./index\";\n * const results = await tasks()\n * .add(\"Loading\", loadModules)\n * .add(\"Processing\", processData)\n * .run({ clear: true });\n *\n * // NEW:\n * import { steps } from \"./index\";\n * const results = await steps({\n * loadModules,\n * processData,\n * }).run({ clear: true });\n * ```\n */\n\nimport type { ProgressInfo } from \"../types.js\"\nimport { MultiProgress, type TaskHandle } from \"../cli/multi-progress\"\n\n// Node.js globals for yielding to event loop\ndeclare function setImmediate(callback: (value?: unknown) => void): unknown\ndeclare function setTimeout(callback: (value?: unknown) => void, ms: number): unknown\n\n/** Phase labels for common operations */\nconst PHASE_LABELS: Record<string, string> = {\n // Repo loading phases\n discover: \"Discovering files\",\n parse: \"Parsing markdown\",\n apply: \"Applying changes\",\n resolve: \"Resolving links\",\n materialize: \"Evaluating rules\",\n // Board building\n board: \"Building view\",\n // Legacy/alternative names\n reading: \"Reading events\",\n applying: \"Applying events\",\n rules: \"Evaluating rules\",\n scanning: \"Scanning files\",\n reconciling: \"Reconciling changes\",\n}\n\n/** Task definition */\ninterface TaskDef<T = unknown> {\n title: string\n work: () => T | PromiseLike<T> | Generator<ProgressInfo, T, unknown>\n}\n\n/** Options for run() */\nexport interface RunOptions {\n /** Clear progress display after completion (default: false) */\n clear?: boolean\n}\n\nexport interface TaskBuilder {\n /**\n * Add a task to the sequence\n * @param title - Display title\n * @param work - Function, async function, or generator\n */\n add<T>(\n title: string,\n work: () => T | PromiseLike<T> | Generator<ProgressInfo, T, unknown>,\n ): TaskBuilder\n\n /**\n * Run all tasks in sequence\n * @param options - Run options\n * @returns Results keyed by task title\n */\n run(options?: RunOptions): Promise<Record<string, unknown>>\n}\n\n/**\n * Create a sequential task builder\n *\n * @returns TaskBuilder with add() and run() methods\n */\nexport function tasks(): TaskBuilder {\n const taskList: TaskDef[] = []\n\n const builder: TaskBuilder = {\n add<T>(\n title: string,\n work: () => T | PromiseLike<T> | Generator<ProgressInfo, T, unknown>,\n ): TaskBuilder {\n taskList.push({ title, work })\n return builder\n },\n\n async run(options?: RunOptions): Promise<Record<string, unknown>> {\n const multi = new MultiProgress()\n const handles = new Map<string, TaskHandle>()\n const results: Record<string, unknown> = {}\n\n // Register all tasks upfront (shows pending state)\n for (const task of taskList) {\n handles.set(task.title, multi.add(task.title, { type: \"spinner\" }))\n }\n\n multi.start()\n\n try {\n for (const task of taskList) {\n const handle = handles.get(task.title)!\n\n // Force render before potentially blocking operation\n await new Promise((resolve) => setImmediate(resolve))\n\n const result = task.work()\n\n if (isGenerator(result)) {\n // Generator: parent stays static, phases animate underneath\n results[task.title] = await runGenerator(result, handle, task.title, multi)\n } else if (isPromiseLike(result)) {\n handle.start()\n results[task.title] = await result\n handle.complete()\n } else {\n handle.start()\n results[task.title] = result\n handle.complete()\n }\n }\n } finally {\n multi.stop(options?.clear ?? false)\n }\n\n return results\n },\n }\n\n return builder\n}\n\n/**\n * Run a generator task with progress updates\n * Parent task stays visible while sub-phases are indented below\n */\nasync function runGenerator<T>(\n gen: Generator<ProgressInfo, T, unknown>,\n parentHandle: TaskHandle,\n baseTitle: string,\n multi: MultiProgress,\n): Promise<T> {\n let result = gen.next()\n let currentPhase: string | undefined\n let currentPhaseHandle: TaskHandle | null = null\n let lastInsertId = parentHandle.id // Insert phases after parent (then after each other)\n let phaseStartTime = Date.now()\n const taskStartTime = Date.now()\n\n while (!result.done) {\n const info = result.value\n const phase = info.phase ?? \"\"\n\n // When phase changes, complete current phase and start new one (indented)\n if (phase && phase !== currentPhase) {\n if (currentPhaseHandle && currentPhase) {\n // Complete previous phase with timing\n const elapsed = Date.now() - phaseStartTime\n const prevLabel = PHASE_LABELS[currentPhase] ?? currentPhase\n currentPhaseHandle.complete(`${prevLabel} (${elapsed}ms)`)\n }\n\n // Start new phase line (indented under parent, inserted after last phase)\n currentPhase = phase\n phaseStartTime = Date.now()\n const phaseLabel = PHASE_LABELS[phase] ?? phase\n currentPhaseHandle = multi.add(phaseLabel, {\n type: \"spinner\",\n indent: 1,\n insertAfter: lastInsertId,\n })\n lastInsertId = currentPhaseHandle.id\n currentPhaseHandle.start()\n }\n\n // Update progress count on current phase line\n if (currentPhaseHandle && info.total && info.total > 0) {\n const phaseLabel = PHASE_LABELS[phase] ?? phase\n currentPhaseHandle.setTitle(`${phaseLabel} (${info.current}/${info.total})`)\n }\n\n // Yield to event loop for animation\n await new Promise((resolve) => setTimeout(resolve, 0))\n\n result = gen.next()\n }\n\n // Complete final phase\n if (currentPhaseHandle && currentPhase) {\n const elapsed = Date.now() - phaseStartTime\n const finalLabel = PHASE_LABELS[currentPhase] ?? currentPhase\n currentPhaseHandle.complete(`${finalLabel} (${elapsed}ms)`)\n }\n\n // Complete parent task with total timing\n const totalElapsed = Date.now() - taskStartTime\n parentHandle.complete(`${baseTitle} (${totalElapsed}ms)`)\n\n return result.value\n}\n\nfunction isGenerator(value: unknown): value is Generator<ProgressInfo, unknown, unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as Generator).next === \"function\" &&\n typeof (value as Generator).throw === \"function\"\n )\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return (\n value !== null &&\n typeof value === \"object\" &&\n typeof (value as PromiseLike<unknown>).then === \"function\"\n )\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { g as TaskStatus, l as SpinnerProps, m as TaskProps, n as ProgressBarProps, u as SpinnerStyle } from "../types-B4A8Ebba.mjs";
1
+ import { g as TaskStatus, l as SpinnerProps, m as TaskProps, n as ProgressBarProps, u as SpinnerStyle } from "../types-BH_v3iMT.mjs";
2
2
  import React from "react";
3
3
 
4
4
  //#region packages/ag-react/src/ui/react/Spinner.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"react.d.mts","names":[],"sources":["../../packages/ag-react/src/ui/react/Spinner.tsx","../../packages/ag-react/src/ui/react/ProgressBar.tsx","../../packages/ag-react/src/ui/react/Tasks.tsx","../../packages/ag-react/src/ui/react/context.tsx"],"mappings":";;;;;;;;;;;;;;;;;;;iBAuBgB,OAAA,CAAA;EAAU,KAAA;EAAO,KAAA;EAAgB;AAAA,GAAkB,YAAA,GAAe,KAAA,CAAM,YAAA;;;;;AAoCxF;;;;;;;iBAAgB,eAAA,CAAgB,KAAA,GAAO,YAAA;;;;;;;;;;;;;;;;;;;;;;iBChCvB,WAAA,CAAA;EACd,KAAA;EACA,KAAA;EACA,KAAA;EACA,cAAA;EACA,OAAA;EACA,KAAA;EACA;AAAA,GACC,gBAAA,GAAmB,KAAA,CAAM,YAAA;ADwB5B;;;;;;;;AChCA;;;;;;;;;ADgCA,iBC4CgB,cAAA,CAAe,YAAA;;;;;;;;YAAD,KAAA,CAAA,QAAA,CAAA,KAAA,CAAA,cAAA;AAAA;;;;;;;;;;;;;iBCnEd,IAAA,CAAA;EAAO,KAAA;EAAO,MAAA;EAAQ;AAAA,GAAY,SAAA,GAAY,KAAA,CAAM,YAAA;;;;;;;;;;AFuBpE;;;;;iBEKgB,KAAA,CAAA;EAAQ;AAAA;EAAc,QAAA,EAAU,KAAA,CAAM,SAAA;AAAA,IAAc,KAAA,CAAM,YAAA;ADrC1E;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iBCoEgB,QAAA,CAAS,YAAA,EAAc,KAAA;EAAQ,EAAA;EAAY,KAAA;AAAA;;;;YAK7C,UAAA;;MACK,OAAA;MAAiB,KAAA;IAAA;EAAA;;yBAqBN,KAAA;qBACJ,KAAA;qBACA,KAAA;+BACU,QAAA;IAAc,OAAA;IAAiB,KAAA;EAAA;2BAdrD,OAAA,EACD,OAAA;IACP,MAAA,EAAQ,UAAA;IACR,KAAA;IACA,QAAA;MAAY,OAAA;MAAiB,KAAA;IAAA;EAAA;;;;YAfrB,UAAA;;MACK,OAAA;MAAiB,KAAA;IAAA;EAAA;;;;;;;UC5F1B,oBAAA;EHcgB;EGZxB,SAAA;EHY+C;EGV/C,WAAA;EHUgF;EGRhF,YAAA,EAAc,YAAA;EHQoF;EGLlG,WAAA,GAAc,IAAA,UAAc,KAAA,GAAQ,YAAA;EHKZ;EGHxB,WAAA;EHG+B;EGA/B,QAAA;IAAY,OAAA;IAAiB,KAAA;EAAA;EHAyD;EGEtF,cAAA,GAAiB,OAAA,UAAiB,KAAA;EHFgE;EGIlG,aAAA;AAAA;;;;;;;AFAF;;;;;;;;;;;;;;;;;;iBE6BgB,gBAAA,CAAA;EAAmB;AAAA;EAAc,QAAA,EAAU,KAAA,CAAM,SAAA;AAAA,IAAc,KAAA,CAAM,YAAA;;;;;;;;;;;;;AF+CrF;;iBEYgB,WAAA,CAAA,GAAe,oBAAA;;;;;;;;;;;;iBAqBf,iBAAA,CAAA,GAAqB,KAAA,CAAM,YAAA"}
1
+ {"version":3,"file":"react.d.mts","names":[],"sources":["../../packages/ag-react/src/ui/react/Spinner.tsx","../../packages/ag-react/src/ui/react/ProgressBar.tsx","../../packages/ag-react/src/ui/react/Tasks.tsx","../../packages/ag-react/src/ui/react/context.tsx"],"mappings":";;;;;;;;;;;;;;;;;;;iBAuBgB,OAAA,CAAA;EACd,KAAA;EACA,KAAA;EACA;AAAA,GACC,YAAA,GAAe,KAAA,CAAM,YAAA;;;;;AAoCxB;;;;;;;iBAAgB,eAAA,CAAgB,KAAA,GAAO,YAAA;;;;;;;;;;;;;;;;;;;;;;iBCpCvB,WAAA,CAAA;EACd,KAAA;EACA,KAAA;EACA,KAAA;EACA,cAAA;EACA,OAAA;EACA,KAAA;EACA;AAAA,GACC,gBAAA,GAAmB,KAAA,CAAM,YAAA;AD4B5B;;;;;;;;ACpCA;;;;;;;;;ADoCA,iBCwCgB,cAAA,CAAe,YAAA;;;;;;;;YAAD,KAAA,CAAA,QAAA,CAAA,KAAA,CAAA,cAAA;AAAA;;;;;;;;;;;;;iBCnEd,IAAA,CAAA;EAAO,KAAA;EAAO,MAAA;EAAQ;AAAA,GAAY,SAAA,GAAY,KAAA,CAAM,YAAA;;;;;;;;;;AF2BpE;;;;;iBECgB,KAAA,CAAA;EAAQ;AAAA;EAAc,QAAA,EAAU,KAAA,CAAM,SAAA;AAAA,IAAc,KAAA,CAAM,YAAA;ADrC1E;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iBCoEgB,QAAA,CAAS,YAAA,EAAc,KAAA;EAAQ,EAAA;EAAY,KAAA;AAAA;;;;YAK7C,UAAA;;MACK,OAAA;MAAiB,KAAA;IAAA;EAAA;;yBAqBN,KAAA;qBAEJ,KAAA;qBAEA,KAAA;+BAEU,QAAA;IAAc,OAAA;IAAiB,KAAA;EAAA;2BAjBrD,OAAA,EACD,OAAA;IACP,MAAA,EAAQ,UAAA;IACR,KAAA;IACA,QAAA;MAAY,OAAA;MAAiB,KAAA;IAAA;EAAA;;;;YAfrB,UAAA;;MACK,OAAA;MAAiB,KAAA;IAAA;EAAA;;;;;;;UC5F1B,oBAAA;EHeR;EGbA,SAAA;EHeA;EGbA,WAAA;EHcgB;EGZhB,YAAA,EAAc,YAAA;EHYoB;EGTlC,WAAA,GAAc,IAAA,UAAc,KAAA,GAAQ,YAAA;EHMpC;EGJA,WAAA;EHKA;EGFA,QAAA;IAAY,OAAA;IAAiB,KAAA;EAAA;EHIP;EGFtB,cAAA,GAAiB,OAAA,UAAiB,KAAA;EHEA;EGAlC,aAAA;AAAA;;;;;;;AFAF;;;;;;;;;;;;;;;;;;iBE6BgB,gBAAA,CAAA;EAAmB;AAAA;EAAc,QAAA,EAAU,KAAA,CAAM,SAAA;AAAA,IAAc,KAAA,CAAM,YAAA;;;;;;;;;;;;;AF+CrF;;iBEYgB,WAAA,CAAA,GAAe,oBAAA;;;;;;;;;;;;iBAqBf,iBAAA,CAAA,GAAqB,KAAA,CAAM,YAAA"}
package/dist/ui/react.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { n as SPINNER_INTERVALS, t as SPINNER_FRAMES } from "../spinner-BmldKx0M.mjs";
2
- import { a as getETA } from "../eta-BnQSZcWf.mjs";
1
+ import { n as SPINNER_INTERVALS, t as SPINNER_FRAMES } from "../spinner-CeOmcuw_.mjs";
2
+ import { a as getETA } from "../eta-Bb3RH3wh.mjs";
3
3
  import React, { createContext, useCallback, useContext, useEffect, useRef, useState } from "react";
4
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
5
  //#region packages/ag-react/src/ui/react/Spinner.tsx
@@ -1 +1 @@
1
- {"version":3,"file":"react.mjs","names":[],"sources":["../../packages/ag-react/src/ui/react/Spinner.tsx","../../packages/ag-react/src/ui/react/ProgressBar.tsx","../../packages/ag-react/src/ui/react/Tasks.tsx","../../packages/ag-react/src/ui/react/context.tsx"],"sourcesContent":["/**\n * React Spinner component for silvery/Ink TUI apps\n */\n\nimport React, { useState, useEffect } from \"react\"\nimport type { SpinnerProps, SpinnerStyle } from \"../types.js\"\nimport { SPINNER_FRAMES, SPINNER_INTERVALS } from \"../cli/spinner\"\n\n/**\n * Animated spinner component for React TUI apps\n *\n * @example\n * ```tsx\n * import { Spinner } from \"./index\";\n *\n * function LoadingView() {\n * return <Spinner label=\"Loading...\" />;\n * }\n *\n * // With style\n * <Spinner label=\"Processing...\" style=\"arc\" color=\"yellow\" />\n * ```\n */\nexport function Spinner({ label, style = \"dots\", color = \"cyan\" }: SpinnerProps): React.ReactElement {\n const [frameIndex, setFrameIndex] = useState(0)\n const frames = SPINNER_FRAMES[style]\n const interval = SPINNER_INTERVALS[style]\n\n useEffect(() => {\n const timer = setInterval(() => {\n setFrameIndex((i) => (i + 1) % frames.length)\n }, interval)\n\n return () => clearInterval(timer)\n }, [frames.length, interval])\n\n const frame = frames[frameIndex]\n\n // Note: In a real silvery app, you'd use <Text color={color}> etc.\n // This is a generic React component that can be styled by the consumer\n return (\n <span data-progressx-spinner data-color={color}>\n {frame}\n {label && <span> {label}</span>}\n </span>\n )\n}\n\n/**\n * Hook for using spinner state in custom components\n *\n * @example\n * ```tsx\n * function CustomSpinner() {\n * const frame = useSpinnerFrame(\"dots\");\n * return <Text color=\"cyan\">{frame}</Text>;\n * }\n * ```\n */\nexport function useSpinnerFrame(style: SpinnerStyle = \"dots\"): string {\n const [frameIndex, setFrameIndex] = useState(0)\n const frames = SPINNER_FRAMES[style]\n const interval = SPINNER_INTERVALS[style]\n\n useEffect(() => {\n const timer = setInterval(() => {\n setFrameIndex((i) => (i + 1) % frames.length)\n }, interval)\n\n return () => clearInterval(timer)\n }, [frames.length, interval])\n\n return frames[frameIndex]!\n}\n","/**\n * React ProgressBar component for silvery/Ink TUI apps\n */\n\nimport React, { useState, useEffect, useRef } from \"react\"\nimport type { ProgressBarProps } from \"../types.js\"\nimport { getETA, DEFAULT_ETA_BUFFER_SIZE, type ETASample } from \"../utils/eta\"\n\n/**\n * Progress bar component for React TUI apps\n *\n * @example\n * ```tsx\n * import { ProgressBar } from \"./index\";\n *\n * function DownloadProgress({ current, total }) {\n * return (\n * <ProgressBar\n * value={current}\n * total={total}\n * showPercentage\n * showETA\n * />\n * );\n * }\n * ```\n */\nexport function ProgressBar({\n value,\n total,\n width = 40,\n showPercentage = true,\n showETA = false,\n label,\n color = \"cyan\",\n}: ProgressBarProps): React.ReactElement {\n // ETA calculation state\n const [eta, setEta] = useState<string>(\"--:--\")\n const etaBuffer = useRef<ETASample[]>([])\n\n // Update ETA buffer when value changes\n useEffect(() => {\n const now = Date.now()\n etaBuffer.current.push({ time: now, value })\n\n if (etaBuffer.current.length > DEFAULT_ETA_BUFFER_SIZE) {\n etaBuffer.current.shift()\n }\n\n // Calculate ETA using shared utility\n const result = getETA(etaBuffer.current, value, total)\n setEta(result.formatted)\n }, [value, total])\n\n const percent = total > 0 ? value / total : 0\n const percentDisplay = `${Math.round(percent * 100)}%`\n\n const filledWidth = Math.round(width * percent)\n const emptyWidth = width - filledWidth\n\n const bar = \"█\".repeat(filledWidth) + \"░\".repeat(emptyWidth)\n\n // Build the display parts\n const parts: string[] = []\n\n if (label) {\n parts.push(label)\n }\n\n parts.push(`[${bar}]`)\n\n if (showPercentage) {\n parts.push(percentDisplay.padStart(4))\n }\n\n if (showETA) {\n parts.push(`ETA: ${eta}`)\n }\n\n return (\n <span data-progressx-bar data-color={color} data-percent={percent}>\n {parts.join(\" \")}\n </span>\n )\n}\n\n/**\n * Hook for progress bar state management\n *\n * @example\n * ```tsx\n * function MyProgress() {\n * const { value, total, update, increment, eta, percent } = useProgressBar(100);\n *\n * useEffect(() => {\n * const timer = setInterval(() => increment(), 100);\n * return () => clearInterval(timer);\n * }, []);\n *\n * return <Text>{percent}% - ETA: {eta}</Text>;\n * }\n * ```\n */\nexport function useProgressBar(initialTotal: number) {\n const [value, setValue] = useState(0)\n const [total, setTotal] = useState(initialTotal)\n const etaBuffer = useRef<ETASample[]>([])\n const [eta, setEta] = useState<string>(\"--:--\")\n\n const update = (newValue: number) => {\n setValue(newValue)\n\n // Update ETA buffer\n const now = Date.now()\n etaBuffer.current.push({ time: now, value: newValue })\n if (etaBuffer.current.length > DEFAULT_ETA_BUFFER_SIZE) {\n etaBuffer.current.shift()\n }\n\n // Calculate ETA using shared utility\n const result = getETA(etaBuffer.current, newValue, total)\n setEta(result.formatted)\n }\n\n const increment = (amount = 1) => update(value + amount)\n\n const reset = (newTotal?: number) => {\n setValue(0)\n if (newTotal !== undefined) setTotal(newTotal)\n etaBuffer.current = []\n setEta(\"--:--\")\n }\n\n const percent = total > 0 ? Math.round((value / total) * 100) : 0\n\n return {\n value,\n total,\n percent,\n eta,\n update,\n increment,\n reset,\n setTotal,\n }\n}\n","/**\n * React Tasks component - listr2-style task list for TUI apps\n */\n\nimport React from \"react\"\nimport type { TaskProps, TaskStatus } from \"../types.js\"\nimport { useSpinnerFrame } from \"./Spinner\"\n\n/** Status icons for tasks */\nconst STATUS_ICONS: Record<TaskStatus, string> = {\n pending: \"○\",\n running: \"\", // Will use spinner\n completed: \"✔\",\n failed: \"✖\",\n skipped: \"⊘\",\n}\n\n/** Status colors */\nconst STATUS_COLORS: Record<TaskStatus, string> = {\n pending: \"gray\",\n running: \"cyan\",\n completed: \"green\",\n failed: \"red\",\n skipped: \"yellow\",\n}\n\n/**\n * Single task component\n *\n * @example\n * ```tsx\n * <Task title=\"Downloading files\" status=\"running\">\n * <ProgressBar value={50} total={100} />\n * </Task>\n * ```\n */\nexport function Task({ title, status, children }: TaskProps): React.ReactElement {\n const spinnerFrame = useSpinnerFrame(\"dots\")\n const icon = status === \"running\" ? spinnerFrame : STATUS_ICONS[status]\n const color = STATUS_COLORS[status]\n\n return (\n <div data-progressx-task data-status={status} data-color={color}>\n <span data-icon>{icon}</span>\n <span data-title> {title}</span>\n {children != null ? <div data-children>{children as React.ReactNode}</div> : null}\n </div>\n )\n}\n\n/**\n * Container for multiple tasks\n *\n * @example\n * ```tsx\n * <Tasks>\n * <Task title=\"Scanning files\" status=\"completed\" />\n * <Task title=\"Processing\" status=\"running\">\n * <ProgressBar value={current} total={total} />\n * </Task>\n * <Task title=\"Cleanup\" status=\"pending\" />\n * </Tasks>\n * ```\n */\nexport function Tasks({ children }: { children: React.ReactNode }): React.ReactElement {\n return <div data-progressx-tasks>{children}</div>\n}\n\n/**\n * Hook for managing task state\n *\n * @example\n * ```tsx\n * function MyTasks() {\n * const { tasks, start, complete, fail, updateProgress } = useTasks([\n * { id: 'scan', title: 'Scanning' },\n * { id: 'process', title: 'Processing' },\n * ]);\n *\n * useEffect(() => {\n * start('scan');\n * doScan().then(() => {\n * complete('scan');\n * start('process');\n * });\n * }, []);\n *\n * return (\n * <Tasks>\n * {tasks.map(t => <Task key={t.id} title={t.title} status={t.status} />)}\n * </Tasks>\n * );\n * }\n * ```\n */\nexport function useTasks(initialTasks: Array<{ id: string; title: string }>) {\n const [tasks, setTasks] = React.useState<\n Array<{\n id: string\n title: string\n status: TaskStatus\n progress?: { current: number; total: number }\n }>\n >(\n initialTasks.map((t) => ({\n ...t,\n status: \"pending\" as TaskStatus,\n })),\n )\n\n const updateTask = (\n id: string,\n updates: Partial<{\n status: TaskStatus\n title: string\n progress: { current: number; total: number }\n }>,\n ) => {\n setTasks((prev) => prev.map((t) => (t.id === id ? { ...t, ...updates } : t)))\n }\n\n const start = (id: string) => updateTask(id, { status: \"running\" })\n const complete = (id: string, title?: string) => updateTask(id, { status: \"completed\", ...(title && { title }) })\n const fail = (id: string, title?: string) => updateTask(id, { status: \"failed\", ...(title && { title }) })\n const skip = (id: string, title?: string) => updateTask(id, { status: \"skipped\", ...(title && { title }) })\n const updateProgress = (id: string, progress: { current: number; total: number }) => updateTask(id, { progress })\n\n const getTask = (id: string) => tasks.find((t) => t.id === id)\n const allCompleted = tasks.every((t) => t.status === \"completed\" || t.status === \"skipped\")\n const hasFailed = tasks.some((t) => t.status === \"failed\")\n\n return {\n tasks,\n start,\n complete,\n fail,\n skip,\n updateProgress,\n updateTask,\n getTask,\n allCompleted,\n hasFailed,\n }\n}\n","/**\n * React context for progress state management\n */\n\nimport React, { createContext, useContext, useState, useCallback } from \"react\"\nimport type { SpinnerStyle } from \"../types.js\"\nimport { Spinner } from \"./Spinner\"\n\n/** Progress context state */\ninterface ProgressContextState {\n /** Currently showing a spinner */\n isLoading: boolean\n /** Loading message */\n loadingText: string\n /** Spinner style */\n spinnerStyle: SpinnerStyle\n\n /** Show a spinner with message */\n showSpinner: (text: string, style?: SpinnerStyle) => void\n /** Hide the spinner */\n hideSpinner: () => void\n\n /** Progress bar state */\n progress: { current: number; total: number } | null\n /** Update progress */\n updateProgress: (current: number, total?: number) => void\n /** Clear progress */\n clearProgress: () => void\n}\n\nconst ProgressContext = createContext<ProgressContextState | null>(null)\n\n/**\n * Progress context provider\n *\n * @example\n * ```tsx\n * function App() {\n * return (\n * <ProgressProvider>\n * <MyApp />\n * </ProgressProvider>\n * );\n * }\n *\n * function DeepComponent() {\n * const { showSpinner, hideSpinner } = useProgress();\n *\n * const handleLoad = async () => {\n * showSpinner(\"Loading...\");\n * await loadData();\n * hideSpinner();\n * };\n * }\n * ```\n */\nexport function ProgressProvider({ children }: { children: React.ReactNode }): React.ReactElement {\n const [isLoading, setIsLoading] = useState(false)\n const [loadingText, setLoadingText] = useState(\"\")\n const [spinnerStyle, setSpinnerStyle] = useState<SpinnerStyle>(\"dots\")\n const [progress, setProgress] = useState<{\n current: number\n total: number\n } | null>(null)\n\n const showSpinner = useCallback((text: string, style: SpinnerStyle = \"dots\") => {\n setLoadingText(text)\n setSpinnerStyle(style)\n setIsLoading(true)\n }, [])\n\n const hideSpinner = useCallback(() => {\n setIsLoading(false)\n setLoadingText(\"\")\n }, [])\n\n const updateProgress = useCallback((current: number, total?: number) => {\n setProgress((prev) => ({\n current,\n total: total ?? prev?.total ?? 100,\n }))\n }, [])\n\n const clearProgress = useCallback(() => {\n setProgress(null)\n }, [])\n\n const value: ProgressContextState = {\n isLoading,\n loadingText,\n spinnerStyle,\n showSpinner,\n hideSpinner,\n progress,\n updateProgress,\n clearProgress,\n }\n\n return <ProgressContext.Provider value={value}>{children}</ProgressContext.Provider>\n}\n\n/**\n * Hook to access progress context\n *\n * @example\n * ```tsx\n * function LoadingOverlay() {\n * const { isLoading, loadingText, spinnerStyle } = useProgress();\n *\n * if (!isLoading) return null;\n *\n * return <Spinner label={loadingText} style={spinnerStyle} />;\n * }\n * ```\n */\nexport function useProgress(): ProgressContextState {\n const context = useContext(ProgressContext)\n\n if (!context) {\n throw new Error(\"useProgress must be used within a ProgressProvider\")\n }\n\n return context\n}\n\n/**\n * Component that renders spinner when loading\n *\n * @example\n * ```tsx\n * <ProgressProvider>\n * <ProgressIndicator />\n * <MainContent />\n * </ProgressProvider>\n * ```\n */\nexport function ProgressIndicator(): React.ReactElement | null {\n const { isLoading, loadingText, spinnerStyle } = useProgress()\n\n if (!isLoading) {\n return null\n }\n\n return <Spinner label={loadingText} style={spinnerStyle} />\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"react.mjs","names":[],"sources":["../../packages/ag-react/src/ui/react/Spinner.tsx","../../packages/ag-react/src/ui/react/ProgressBar.tsx","../../packages/ag-react/src/ui/react/Tasks.tsx","../../packages/ag-react/src/ui/react/context.tsx"],"sourcesContent":["/**\n * React Spinner component for silvery/Ink TUI apps\n */\n\nimport React, { useState, useEffect } from \"react\"\nimport type { SpinnerProps, SpinnerStyle } from \"../types.js\"\nimport { SPINNER_FRAMES, SPINNER_INTERVALS } from \"../cli/spinner\"\n\n/**\n * Animated spinner component for React TUI apps\n *\n * @example\n * ```tsx\n * import { Spinner } from \"./index\";\n *\n * function LoadingView() {\n * return <Spinner label=\"Loading...\" />;\n * }\n *\n * // With style\n * <Spinner label=\"Processing...\" style=\"arc\" color=\"yellow\" />\n * ```\n */\nexport function Spinner({\n label,\n style = \"dots\",\n color = \"cyan\",\n}: SpinnerProps): React.ReactElement {\n const [frameIndex, setFrameIndex] = useState(0)\n const frames = SPINNER_FRAMES[style]\n const interval = SPINNER_INTERVALS[style]\n\n useEffect(() => {\n const timer = setInterval(() => {\n setFrameIndex((i) => (i + 1) % frames.length)\n }, interval)\n\n return () => clearInterval(timer)\n }, [frames.length, interval])\n\n const frame = frames[frameIndex]\n\n // Note: In a real silvery app, you'd use <Text color={color}> etc.\n // This is a generic React component that can be styled by the consumer\n return (\n <span data-progressx-spinner data-color={color}>\n {frame}\n {label && <span> {label}</span>}\n </span>\n )\n}\n\n/**\n * Hook for using spinner state in custom components\n *\n * @example\n * ```tsx\n * function CustomSpinner() {\n * const frame = useSpinnerFrame(\"dots\");\n * return <Text color=\"cyan\">{frame}</Text>;\n * }\n * ```\n */\nexport function useSpinnerFrame(style: SpinnerStyle = \"dots\"): string {\n const [frameIndex, setFrameIndex] = useState(0)\n const frames = SPINNER_FRAMES[style]\n const interval = SPINNER_INTERVALS[style]\n\n useEffect(() => {\n const timer = setInterval(() => {\n setFrameIndex((i) => (i + 1) % frames.length)\n }, interval)\n\n return () => clearInterval(timer)\n }, [frames.length, interval])\n\n return frames[frameIndex]!\n}\n","/**\n * React ProgressBar component for silvery/Ink TUI apps\n */\n\nimport React, { useState, useEffect, useRef } from \"react\"\nimport type { ProgressBarProps } from \"../types.js\"\nimport { getETA, DEFAULT_ETA_BUFFER_SIZE, type ETASample } from \"../utils/eta\"\n\n/**\n * Progress bar component for React TUI apps\n *\n * @example\n * ```tsx\n * import { ProgressBar } from \"./index\";\n *\n * function DownloadProgress({ current, total }) {\n * return (\n * <ProgressBar\n * value={current}\n * total={total}\n * showPercentage\n * showETA\n * />\n * );\n * }\n * ```\n */\nexport function ProgressBar({\n value,\n total,\n width = 40,\n showPercentage = true,\n showETA = false,\n label,\n color = \"cyan\",\n}: ProgressBarProps): React.ReactElement {\n // ETA calculation state\n const [eta, setEta] = useState<string>(\"--:--\")\n const etaBuffer = useRef<ETASample[]>([])\n\n // Update ETA buffer when value changes\n useEffect(() => {\n const now = Date.now()\n etaBuffer.current.push({ time: now, value })\n\n if (etaBuffer.current.length > DEFAULT_ETA_BUFFER_SIZE) {\n etaBuffer.current.shift()\n }\n\n // Calculate ETA using shared utility\n const result = getETA(etaBuffer.current, value, total)\n setEta(result.formatted)\n }, [value, total])\n\n const percent = total > 0 ? value / total : 0\n const percentDisplay = `${Math.round(percent * 100)}%`\n\n const filledWidth = Math.round(width * percent)\n const emptyWidth = width - filledWidth\n\n const bar = \"█\".repeat(filledWidth) + \"░\".repeat(emptyWidth)\n\n // Build the display parts\n const parts: string[] = []\n\n if (label) {\n parts.push(label)\n }\n\n parts.push(`[${bar}]`)\n\n if (showPercentage) {\n parts.push(percentDisplay.padStart(4))\n }\n\n if (showETA) {\n parts.push(`ETA: ${eta}`)\n }\n\n return (\n <span data-progressx-bar data-color={color} data-percent={percent}>\n {parts.join(\" \")}\n </span>\n )\n}\n\n/**\n * Hook for progress bar state management\n *\n * @example\n * ```tsx\n * function MyProgress() {\n * const { value, total, update, increment, eta, percent } = useProgressBar(100);\n *\n * useEffect(() => {\n * const timer = setInterval(() => increment(), 100);\n * return () => clearInterval(timer);\n * }, []);\n *\n * return <Text>{percent}% - ETA: {eta}</Text>;\n * }\n * ```\n */\nexport function useProgressBar(initialTotal: number) {\n const [value, setValue] = useState(0)\n const [total, setTotal] = useState(initialTotal)\n const etaBuffer = useRef<ETASample[]>([])\n const [eta, setEta] = useState<string>(\"--:--\")\n\n const update = (newValue: number) => {\n setValue(newValue)\n\n // Update ETA buffer\n const now = Date.now()\n etaBuffer.current.push({ time: now, value: newValue })\n if (etaBuffer.current.length > DEFAULT_ETA_BUFFER_SIZE) {\n etaBuffer.current.shift()\n }\n\n // Calculate ETA using shared utility\n const result = getETA(etaBuffer.current, newValue, total)\n setEta(result.formatted)\n }\n\n const increment = (amount = 1) => update(value + amount)\n\n const reset = (newTotal?: number) => {\n setValue(0)\n if (newTotal !== undefined) setTotal(newTotal)\n etaBuffer.current = []\n setEta(\"--:--\")\n }\n\n const percent = total > 0 ? Math.round((value / total) * 100) : 0\n\n return {\n value,\n total,\n percent,\n eta,\n update,\n increment,\n reset,\n setTotal,\n }\n}\n","/**\n * React Tasks component - listr2-style task list for TUI apps\n */\n\nimport React from \"react\"\nimport type { TaskProps, TaskStatus } from \"../types.js\"\nimport { useSpinnerFrame } from \"./Spinner\"\n\n/** Status icons for tasks */\nconst STATUS_ICONS: Record<TaskStatus, string> = {\n pending: \"○\",\n running: \"\", // Will use spinner\n completed: \"✔\",\n failed: \"✖\",\n skipped: \"⊘\",\n}\n\n/** Status colors */\nconst STATUS_COLORS: Record<TaskStatus, string> = {\n pending: \"gray\",\n running: \"cyan\",\n completed: \"green\",\n failed: \"red\",\n skipped: \"yellow\",\n}\n\n/**\n * Single task component\n *\n * @example\n * ```tsx\n * <Task title=\"Downloading files\" status=\"running\">\n * <ProgressBar value={50} total={100} />\n * </Task>\n * ```\n */\nexport function Task({ title, status, children }: TaskProps): React.ReactElement {\n const spinnerFrame = useSpinnerFrame(\"dots\")\n const icon = status === \"running\" ? spinnerFrame : STATUS_ICONS[status]\n const color = STATUS_COLORS[status]\n\n return (\n <div data-progressx-task data-status={status} data-color={color}>\n <span data-icon>{icon}</span>\n <span data-title> {title}</span>\n {children != null ? <div data-children>{children as React.ReactNode}</div> : null}\n </div>\n )\n}\n\n/**\n * Container for multiple tasks\n *\n * @example\n * ```tsx\n * <Tasks>\n * <Task title=\"Scanning files\" status=\"completed\" />\n * <Task title=\"Processing\" status=\"running\">\n * <ProgressBar value={current} total={total} />\n * </Task>\n * <Task title=\"Cleanup\" status=\"pending\" />\n * </Tasks>\n * ```\n */\nexport function Tasks({ children }: { children: React.ReactNode }): React.ReactElement {\n return <div data-progressx-tasks>{children}</div>\n}\n\n/**\n * Hook for managing task state\n *\n * @example\n * ```tsx\n * function MyTasks() {\n * const { tasks, start, complete, fail, updateProgress } = useTasks([\n * { id: 'scan', title: 'Scanning' },\n * { id: 'process', title: 'Processing' },\n * ]);\n *\n * useEffect(() => {\n * start('scan');\n * doScan().then(() => {\n * complete('scan');\n * start('process');\n * });\n * }, []);\n *\n * return (\n * <Tasks>\n * {tasks.map(t => <Task key={t.id} title={t.title} status={t.status} />)}\n * </Tasks>\n * );\n * }\n * ```\n */\nexport function useTasks(initialTasks: Array<{ id: string; title: string }>) {\n const [tasks, setTasks] = React.useState<\n Array<{\n id: string\n title: string\n status: TaskStatus\n progress?: { current: number; total: number }\n }>\n >(\n initialTasks.map((t) => ({\n ...t,\n status: \"pending\" as TaskStatus,\n })),\n )\n\n const updateTask = (\n id: string,\n updates: Partial<{\n status: TaskStatus\n title: string\n progress: { current: number; total: number }\n }>,\n ) => {\n setTasks((prev) => prev.map((t) => (t.id === id ? { ...t, ...updates } : t)))\n }\n\n const start = (id: string) => updateTask(id, { status: \"running\" })\n const complete = (id: string, title?: string) =>\n updateTask(id, { status: \"completed\", ...(title && { title }) })\n const fail = (id: string, title?: string) =>\n updateTask(id, { status: \"failed\", ...(title && { title }) })\n const skip = (id: string, title?: string) =>\n updateTask(id, { status: \"skipped\", ...(title && { title }) })\n const updateProgress = (id: string, progress: { current: number; total: number }) =>\n updateTask(id, { progress })\n\n const getTask = (id: string) => tasks.find((t) => t.id === id)\n const allCompleted = tasks.every((t) => t.status === \"completed\" || t.status === \"skipped\")\n const hasFailed = tasks.some((t) => t.status === \"failed\")\n\n return {\n tasks,\n start,\n complete,\n fail,\n skip,\n updateProgress,\n updateTask,\n getTask,\n allCompleted,\n hasFailed,\n }\n}\n","/**\n * React context for progress state management\n */\n\nimport React, { createContext, useContext, useState, useCallback } from \"react\"\nimport type { SpinnerStyle } from \"../types.js\"\nimport { Spinner } from \"./Spinner\"\n\n/** Progress context state */\ninterface ProgressContextState {\n /** Currently showing a spinner */\n isLoading: boolean\n /** Loading message */\n loadingText: string\n /** Spinner style */\n spinnerStyle: SpinnerStyle\n\n /** Show a spinner with message */\n showSpinner: (text: string, style?: SpinnerStyle) => void\n /** Hide the spinner */\n hideSpinner: () => void\n\n /** Progress bar state */\n progress: { current: number; total: number } | null\n /** Update progress */\n updateProgress: (current: number, total?: number) => void\n /** Clear progress */\n clearProgress: () => void\n}\n\nconst ProgressContext = createContext<ProgressContextState | null>(null)\n\n/**\n * Progress context provider\n *\n * @example\n * ```tsx\n * function App() {\n * return (\n * <ProgressProvider>\n * <MyApp />\n * </ProgressProvider>\n * );\n * }\n *\n * function DeepComponent() {\n * const { showSpinner, hideSpinner } = useProgress();\n *\n * const handleLoad = async () => {\n * showSpinner(\"Loading...\");\n * await loadData();\n * hideSpinner();\n * };\n * }\n * ```\n */\nexport function ProgressProvider({ children }: { children: React.ReactNode }): React.ReactElement {\n const [isLoading, setIsLoading] = useState(false)\n const [loadingText, setLoadingText] = useState(\"\")\n const [spinnerStyle, setSpinnerStyle] = useState<SpinnerStyle>(\"dots\")\n const [progress, setProgress] = useState<{\n current: number\n total: number\n } | null>(null)\n\n const showSpinner = useCallback((text: string, style: SpinnerStyle = \"dots\") => {\n setLoadingText(text)\n setSpinnerStyle(style)\n setIsLoading(true)\n }, [])\n\n const hideSpinner = useCallback(() => {\n setIsLoading(false)\n setLoadingText(\"\")\n }, [])\n\n const updateProgress = useCallback((current: number, total?: number) => {\n setProgress((prev) => ({\n current,\n total: total ?? prev?.total ?? 100,\n }))\n }, [])\n\n const clearProgress = useCallback(() => {\n setProgress(null)\n }, [])\n\n const value: ProgressContextState = {\n isLoading,\n loadingText,\n spinnerStyle,\n showSpinner,\n hideSpinner,\n progress,\n updateProgress,\n clearProgress,\n }\n\n return <ProgressContext.Provider value={value}>{children}</ProgressContext.Provider>\n}\n\n/**\n * Hook to access progress context\n *\n * @example\n * ```tsx\n * function LoadingOverlay() {\n * const { isLoading, loadingText, spinnerStyle } = useProgress();\n *\n * if (!isLoading) return null;\n *\n * return <Spinner label={loadingText} style={spinnerStyle} />;\n * }\n * ```\n */\nexport function useProgress(): ProgressContextState {\n const context = useContext(ProgressContext)\n\n if (!context) {\n throw new Error(\"useProgress must be used within a ProgressProvider\")\n }\n\n return context\n}\n\n/**\n * Component that renders spinner when loading\n *\n * @example\n * ```tsx\n * <ProgressProvider>\n * <ProgressIndicator />\n * <MainContent />\n * </ProgressProvider>\n * ```\n */\nexport function ProgressIndicator(): React.ReactElement | null {\n const { isLoading, loadingText, spinnerStyle } = useProgress()\n\n if (!isLoading) {\n return null\n }\n\n return <Spinner label={loadingText} style={spinnerStyle} />\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAuBA,SAAgB,QAAQ,EACtB,OACA,QAAQ,QACR,QAAQ,UAC2B;CACnC,MAAM,CAAC,YAAY,iBAAiB,SAAS,EAAE;CAC/C,MAAM,SAAS,eAAe;CAC9B,MAAM,WAAW,kBAAkB;AAEnC,iBAAgB;EACd,MAAM,QAAQ,kBAAkB;AAC9B,kBAAe,OAAO,IAAI,KAAK,OAAO,OAAO;KAC5C,SAAS;AAEZ,eAAa,cAAc,MAAM;IAChC,CAAC,OAAO,QAAQ,SAAS,CAAC;CAE7B,MAAM,QAAQ,OAAO;AAIrB,QACE,qBAAC,QAAD;EAAM,0BAAA;EAAuB,cAAY;YAAzC,CACG,OACA,SAAS,qBAAC,QAAD,EAAA,UAAA,CAAM,KAAE,MAAa,EAAA,CAAA,CAC1B;;;;;;;;;;;;;;AAeX,SAAgB,gBAAgB,QAAsB,QAAgB;CACpE,MAAM,CAAC,YAAY,iBAAiB,SAAS,EAAE;CAC/C,MAAM,SAAS,eAAe;CAC9B,MAAM,WAAW,kBAAkB;AAEnC,iBAAgB;EACd,MAAM,QAAQ,kBAAkB;AAC9B,kBAAe,OAAO,IAAI,KAAK,OAAO,OAAO;KAC5C,SAAS;AAEZ,eAAa,cAAc,MAAM;IAChC,CAAC,OAAO,QAAQ,SAAS,CAAC;AAE7B,QAAO,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;ACjDhB,SAAgB,YAAY,EAC1B,OACA,OACA,QAAQ,IACR,iBAAiB,MACjB,UAAU,OACV,OACA,QAAQ,UAC+B;CAEvC,MAAM,CAAC,KAAK,UAAU,SAAiB,QAAQ;CAC/C,MAAM,YAAY,OAAoB,EAAE,CAAC;AAGzC,iBAAgB;EACd,MAAM,MAAM,KAAK,KAAK;AACtB,YAAU,QAAQ,KAAK;GAAE,MAAM;GAAK;GAAO,CAAC;AAE5C,MAAI,UAAU,QAAQ,SAAA,GACpB,WAAU,QAAQ,OAAO;AAK3B,SADe,OAAO,UAAU,SAAS,OAAO,MAAM,CACxC,UAAU;IACvB,CAAC,OAAO,MAAM,CAAC;CAElB,MAAM,UAAU,QAAQ,IAAI,QAAQ,QAAQ;CAC5C,MAAM,iBAAiB,GAAG,KAAK,MAAM,UAAU,IAAI,CAAC;CAEpD,MAAM,cAAc,KAAK,MAAM,QAAQ,QAAQ;CAC/C,MAAM,aAAa,QAAQ;CAE3B,MAAM,MAAM,IAAI,OAAO,YAAY,GAAG,IAAI,OAAO,WAAW;CAG5D,MAAM,QAAkB,EAAE;AAE1B,KAAI,MACF,OAAM,KAAK,MAAM;AAGnB,OAAM,KAAK,IAAI,IAAI,GAAG;AAEtB,KAAI,eACF,OAAM,KAAK,eAAe,SAAS,EAAE,CAAC;AAGxC,KAAI,QACF,OAAM,KAAK,QAAQ,MAAM;AAG3B,QACE,oBAAC,QAAD;EAAM,sBAAA;EAAmB,cAAY;EAAO,gBAAc;YACvD,MAAM,KAAK,IAAI;EACX,CAAA;;;;;;;;;;;;;;;;;;;AAqBX,SAAgB,eAAe,cAAsB;CACnD,MAAM,CAAC,OAAO,YAAY,SAAS,EAAE;CACrC,MAAM,CAAC,OAAO,YAAY,SAAS,aAAa;CAChD,MAAM,YAAY,OAAoB,EAAE,CAAC;CACzC,MAAM,CAAC,KAAK,UAAU,SAAiB,QAAQ;CAE/C,MAAM,UAAU,aAAqB;AACnC,WAAS,SAAS;EAGlB,MAAM,MAAM,KAAK,KAAK;AACtB,YAAU,QAAQ,KAAK;GAAE,MAAM;GAAK,OAAO;GAAU,CAAC;AACtD,MAAI,UAAU,QAAQ,SAAA,GACpB,WAAU,QAAQ,OAAO;AAK3B,SADe,OAAO,UAAU,SAAS,UAAU,MAAM,CAC3C,UAAU;;CAG1B,MAAM,aAAa,SAAS,MAAM,OAAO,QAAQ,OAAO;CAExD,MAAM,SAAS,aAAsB;AACnC,WAAS,EAAE;AACX,MAAI,aAAa,KAAA,EAAW,UAAS,SAAS;AAC9C,YAAU,UAAU,EAAE;AACtB,SAAO,QAAQ;;AAKjB,QAAO;EACL;EACA;EACA,SALc,QAAQ,IAAI,KAAK,MAAO,QAAQ,QAAS,IAAI,GAAG;EAM9D;EACA;EACA;EACA;EACA;EACD;;;;;;;;ACvIH,MAAM,eAA2C;CAC/C,SAAS;CACT,SAAS;CACT,WAAW;CACX,QAAQ;CACR,SAAS;CACV;;AAGD,MAAM,gBAA4C;CAChD,SAAS;CACT,SAAS;CACT,WAAW;CACX,QAAQ;CACR,SAAS;CACV;;;;;;;;;;;AAYD,SAAgB,KAAK,EAAE,OAAO,QAAQ,YAA2C;CAC/E,MAAM,eAAe,gBAAgB,OAAO;CAC5C,MAAM,OAAO,WAAW,YAAY,eAAe,aAAa;CAChE,MAAM,QAAQ,cAAc;AAE5B,QACE,qBAAC,OAAD;EAAK,uBAAA;EAAoB,eAAa;EAAQ,cAAY;YAA1D;GACE,oBAAC,QAAD;IAAM,aAAA;cAAW;IAAY,CAAA;GAC7B,qBAAC,QAAD;IAAM,cAAA;cAAN,CAAiB,KAAE,MAAa;;GAC/B,YAAY,OAAO,oBAAC,OAAD;IAAK,iBAAA;IAAe;IAAkC,CAAA,GAAG;GACzE;;;;;;;;;;;;;;;;;AAkBV,SAAgB,MAAM,EAAE,YAA+D;AACrF,QAAO,oBAAC,OAAD;EAAK,wBAAA;EAAsB;EAAe,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BnD,SAAgB,SAAS,cAAoD;CAC3E,MAAM,CAAC,OAAO,YAAY,MAAM,SAQ9B,aAAa,KAAK,OAAO;EACvB,GAAG;EACH,QAAQ;EACT,EAAE,CACJ;CAED,MAAM,cACJ,IACA,YAKG;AACH,YAAU,SAAS,KAAK,KAAK,MAAO,EAAE,OAAO,KAAK;GAAE,GAAG;GAAG,GAAG;GAAS,GAAG,EAAG,CAAC;;CAG/E,MAAM,SAAS,OAAe,WAAW,IAAI,EAAE,QAAQ,WAAW,CAAC;CACnE,MAAM,YAAY,IAAY,UAC5B,WAAW,IAAI;EAAE,QAAQ;EAAa,GAAI,SAAS,EAAE,OAAO;EAAG,CAAC;CAClE,MAAM,QAAQ,IAAY,UACxB,WAAW,IAAI;EAAE,QAAQ;EAAU,GAAI,SAAS,EAAE,OAAO;EAAG,CAAC;CAC/D,MAAM,QAAQ,IAAY,UACxB,WAAW,IAAI;EAAE,QAAQ;EAAW,GAAI,SAAS,EAAE,OAAO;EAAG,CAAC;CAChE,MAAM,kBAAkB,IAAY,aAClC,WAAW,IAAI,EAAE,UAAU,CAAC;CAE9B,MAAM,WAAW,OAAe,MAAM,MAAM,MAAM,EAAE,OAAO,GAAG;AAI9D,QAAO;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cAZmB,MAAM,OAAO,MAAM,EAAE,WAAW,eAAe,EAAE,WAAW,UAAU;EAazF,WAZgB,MAAM,MAAM,MAAM,EAAE,WAAW,SAAS;EAazD;;;;;;;ACpHH,MAAM,kBAAkB,cAA2C,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;AA0BxE,SAAgB,iBAAiB,EAAE,YAA+D;CAChG,MAAM,CAAC,WAAW,gBAAgB,SAAS,MAAM;CACjD,MAAM,CAAC,aAAa,kBAAkB,SAAS,GAAG;CAClD,MAAM,CAAC,cAAc,mBAAmB,SAAuB,OAAO;CACtE,MAAM,CAAC,UAAU,eAAe,SAGtB,KAAK;CAwBf,MAAM,QAA8B;EAClC;EACA;EACA;EACA,aA1BkB,aAAa,MAAc,QAAsB,WAAW;AAC9E,kBAAe,KAAK;AACpB,mBAAgB,MAAM;AACtB,gBAAa,KAAK;KACjB,EAAE,CAAC;EAuBJ,aArBkB,kBAAkB;AACpC,gBAAa,MAAM;AACnB,kBAAe,GAAG;KACjB,EAAE,CAAC;EAmBJ;EACA,gBAlBqB,aAAa,SAAiB,UAAmB;AACtE,gBAAa,UAAU;IACrB;IACA,OAAO,SAAS,MAAM,SAAS;IAChC,EAAE;KACF,EAAE,CAAC;EAcJ,eAZoB,kBAAkB;AACtC,eAAY,KAAK;KAChB,EAAE,CAAC;EAWL;AAED,QAAO,oBAAC,gBAAgB,UAAjB;EAAiC;EAAQ;EAAoC,CAAA;;;;;;;;;;;;;;;;AAiBtF,SAAgB,cAAoC;CAClD,MAAM,UAAU,WAAW,gBAAgB;AAE3C,KAAI,CAAC,QACH,OAAM,IAAI,MAAM,qDAAqD;AAGvE,QAAO;;;;;;;;;;;;;AAcT,SAAgB,oBAA+C;CAC7D,MAAM,EAAE,WAAW,aAAa,iBAAiB,aAAa;AAE9D,KAAI,CAAC,UACH,QAAO;AAGT,QAAO,oBAAC,SAAD;EAAS,OAAO;EAAa,OAAO;EAAgB,CAAA"}
package/dist/ui/utils.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import { a as getETA, i as formatETA, n as calculateETA, r as createETATracker, t as DEFAULT_ETA_BUFFER_SIZE } from "../eta-BnQSZcWf.mjs";
1
+ import { a as getETA, i as formatETA, n as calculateETA, r as createETATracker, t as DEFAULT_ETA_BUFFER_SIZE } from "../eta-Bb3RH3wh.mjs";
2
2
  export { DEFAULT_ETA_BUFFER_SIZE, calculateETA, createETATracker, formatETA, getETA };
@@ -1,3 +1,3 @@
1
- import { _ as TextInputOptions, a as ProgressInfo, r as ProgressCallback } from "../types-B4A8Ebba.mjs";
2
- import { a as waitForEvent, c as wrapGenerator, d as attachSpinner, f as withSpinner, i as withSelect, l as createProgressCallback, n as withTextInput, o as wrapEmitter, r as createSelect, s as withIterableProgress, t as createTextInput, u as withProgress } from "../with-text-input-lUh9gYAG.mjs";
1
+ import { _ as TextInputOptions, a as ProgressInfo, r as ProgressCallback } from "../types-BH_v3iMT.mjs";
2
+ import { a as waitForEvent, c as wrapGenerator, d as attachSpinner, f as withSpinner, i as withSelect, l as createProgressCallback, n as withTextInput, o as wrapEmitter, r as createSelect, s as withIterableProgress, t as createTextInput, u as withProgress } from "../with-text-input-CRfoiFFG.mjs";
3
3
  export { ProgressCallback, ProgressInfo, TextInputOptions, attachSpinner, createProgressCallback, createSelect, createTextInput, waitForEvent, withIterableProgress, withProgress, withSelect, withSpinner, withTextInput, wrapEmitter, wrapGenerator };
@@ -1,2 +1,2 @@
1
- import { a as waitForEvent, c as wrapGenerator, d as attachSpinner, f as withSpinner, i as withSelect, l as createProgressCallback, n as withTextInput, o as wrapEmitter, r as createSelect, s as withIterableProgress, t as createTextInput, u as withProgress } from "../wrappers-JrEYTuKA.mjs";
1
+ import { a as waitForEvent, c as wrapGenerator, d as attachSpinner, f as withSpinner, i as withSelect, l as createProgressCallback, n as withTextInput, o as wrapEmitter, r as createSelect, s as withIterableProgress, t as createTextInput, u as withProgress } from "../wrappers-UTADQkSY.mjs";
2
2
  export { attachSpinner, createProgressCallback, createSelect, createTextInput, waitForEvent, withIterableProgress, withProgress, withSelect, withSpinner, withTextInput, wrapEmitter, wrapGenerator };
package/dist/ui.d.mts CHANGED
@@ -1,6 +1,6 @@
1
- import { _ as TextInputOptions, a as ProgressInfo, b as WithSelectOptions, c as SpinnerOptions, d as StepProgress, f as TableColumn, g as TaskStatus, h as TaskState, i as ProgressGenerator, l as SpinnerProps, m as TaskProps, n as ProgressBarProps, o as SelectOption, p as TableProps, r as ProgressCallback, s as SelectProps, t as ProgressBarOptions, u as SpinnerStyle, v as TextInputProps, x as WithSpinnerOptions, y as WithProgressOptions } from "./types-B4A8Ebba.mjs";
2
- import { i as createSpinner, n as SPINNER_FRAMES, r as Spinner, t as CallableSpinner } from "./spinner-BRkaJI0N.mjs";
3
- import { n as TaskHandle, r as ProgressBar, t as MultiProgress } from "./multi-progress-DQ-uUzLf.mjs";
4
- import { a as CURSOR_RESTORE, c as CURSOR_TO_START, d as getTerminalWidth, f as isTTY, h as writeLine, i as CURSOR_HIDE, l as cursorDown, m as write, n as CLEAR_LINE_END, o as CURSOR_SAVE, p as withCursor, r as CLEAR_SCREEN, s as CURSOR_SHOW, t as CLEAR_LINE, u as cursorUp } from "./ansi-CsjnZtAw.mjs";
5
- import { a as waitForEvent, c as wrapGenerator, d as attachSpinner, f as withSpinner, i as withSelect, l as createProgressCallback, n as withTextInput, o as wrapEmitter, r as createSelect, s as withIterableProgress, t as createTextInput, u as withProgress } from "./with-text-input-lUh9gYAG.mjs";
1
+ import { _ as TextInputOptions, a as ProgressInfo, b as WithSelectOptions, c as SpinnerOptions, d as StepProgress, f as TableColumn, g as TaskStatus, h as TaskState, i as ProgressGenerator, l as SpinnerProps, m as TaskProps, n as ProgressBarProps, o as SelectOption, p as TableProps, r as ProgressCallback, s as SelectProps, t as ProgressBarOptions, u as SpinnerStyle, v as TextInputProps, x as WithSpinnerOptions, y as WithProgressOptions } from "./types-BH_v3iMT.mjs";
2
+ import { i as createSpinner, n as SPINNER_FRAMES, r as Spinner, t as CallableSpinner } from "./spinner-CGo34vyR.mjs";
3
+ import { n as TaskHandle, r as ProgressBar, t as MultiProgress } from "./multi-progress-DAQC7eap.mjs";
4
+ import { a as CURSOR_RESTORE, c as CURSOR_TO_START, d as getTerminalWidth, f as isTTY, h as writeLine, i as CURSOR_HIDE, l as cursorDown, m as write, n as CLEAR_LINE_END, o as CURSOR_SAVE, p as withCursor, r as CLEAR_SCREEN, s as CURSOR_SHOW, t as CLEAR_LINE, u as cursorUp } from "./ansi-Cc33mW54.mjs";
5
+ import { a as waitForEvent, c as wrapGenerator, d as attachSpinner, f as withSpinner, i as withSelect, l as createProgressCallback, n as withTextInput, o as wrapEmitter, r as createSelect, s as withIterableProgress, t as createTextInput, u as withProgress } from "./with-text-input-CRfoiFFG.mjs";
6
6
  export { CLEAR_LINE, CLEAR_LINE_END, CLEAR_SCREEN, CURSOR_HIDE, CURSOR_RESTORE, CURSOR_SAVE, CURSOR_SHOW, CURSOR_TO_START, CallableSpinner, MultiProgress, ProgressBar, ProgressBarOptions, ProgressBarProps, ProgressCallback, ProgressGenerator, ProgressInfo, SPINNER_FRAMES, SelectOption, SelectProps, Spinner, SpinnerOptions, SpinnerProps, SpinnerStyle, StepProgress, TableColumn, TableProps, TaskHandle, TaskProps, TaskState, TaskStatus, TextInputOptions, TextInputProps, WithProgressOptions, WithSelectOptions, WithSpinnerOptions, attachSpinner, createProgressCallback, createSelect, createSpinner, createTextInput, cursorDown, cursorUp, getTerminalWidth, isTTY, waitForEvent, withCursor, withIterableProgress, withProgress, withSelect, withSpinner, withTextInput, wrapEmitter, wrapGenerator, write, writeLine };
package/dist/ui.mjs CHANGED
@@ -1,7 +1,7 @@
1
- import { i as createSpinner, r as Spinner, t as SPINNER_FRAMES } from "./spinner-BmldKx0M.mjs";
2
- import { a as CURSOR_RESTORE, c as CURSOR_TO_START, d as getTerminalWidth, f as isTTY, h as writeLine, i as CURSOR_HIDE, l as cursorDown, m as write, n as CLEAR_LINE_END, o as CURSOR_SAVE, p as withCursor, r as CLEAR_SCREEN, s as CURSOR_SHOW, t as CLEAR_LINE, u as cursorUp } from "./ansi-C6Qs1Wn2.mjs";
3
- import { t as ProgressBar } from "./progress-bar-IrUjkLfU.mjs";
4
- import { t as MultiProgress } from "./multi-progress-CcdqJFlf.mjs";
5
- import "./cli-GwJ0S2In.mjs";
6
- import { a as waitForEvent, c as wrapGenerator, d as attachSpinner, f as withSpinner, i as withSelect, l as createProgressCallback, n as withTextInput, o as wrapEmitter, r as createSelect, s as withIterableProgress, t as createTextInput, u as withProgress } from "./wrappers-JrEYTuKA.mjs";
1
+ import { i as createSpinner, r as Spinner, t as SPINNER_FRAMES } from "./spinner-CeOmcuw_.mjs";
2
+ import { a as CURSOR_RESTORE, c as CURSOR_TO_START, d as getTerminalWidth, f as isTTY, h as writeLine, i as CURSOR_HIDE, l as cursorDown, m as write, n as CLEAR_LINE_END, o as CURSOR_SAVE, p as withCursor, r as CLEAR_SCREEN, s as CURSOR_SHOW, t as CLEAR_LINE, u as cursorUp } from "./ansi-CLOitHKx.mjs";
3
+ import { t as ProgressBar } from "./progress-bar-CXE5Qfkd.mjs";
4
+ import { t as MultiProgress } from "./multi-progress-Bq9Oi_WI.mjs";
5
+ import "./cli-BKp0YtBD.mjs";
6
+ import { a as waitForEvent, c as wrapGenerator, d as attachSpinner, f as withSpinner, i as withSelect, l as createProgressCallback, n as withTextInput, o as wrapEmitter, r as createSelect, s as withIterableProgress, t as createTextInput, u as withProgress } from "./wrappers-UTADQkSY.mjs";
7
7
  export { CLEAR_LINE, CLEAR_LINE_END, CLEAR_SCREEN, CURSOR_HIDE, CURSOR_RESTORE, CURSOR_SAVE, CURSOR_SHOW, CURSOR_TO_START, MultiProgress, ProgressBar, SPINNER_FRAMES, Spinner, attachSpinner, createProgressCallback, createSelect, createSpinner, createTextInput, cursorDown, cursorUp, getTerminalWidth, isTTY, waitForEvent, withCursor, withIterableProgress, withProgress, withSelect, withSpinner, withTextInput, wrapEmitter, wrapGenerator, write, writeLine };
@@ -151,4 +151,4 @@ declare function useLatest<T>(value: T): {
151
151
  };
152
152
  //#endregion
153
153
  export { useTransition as a, useAnimation as c, easings as d, resolveEasing as f, UseTransitionOptions as i, EasingFn as l, useTimeout as n, UseAnimationOptions as o, useInterval as r, UseAnimationResult as s, useLatest as t, EasingName as u };
154
- //# sourceMappingURL=useLatest-6xqnGIU6.d.mts.map
154
+ //# sourceMappingURL=useLatest-Bg2x4bfP.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useLatest-6xqnGIU6.d.mts","names":[],"sources":["../packages/ag-react/src/ui/animation/easing.ts","../packages/ag-react/src/ui/animation/useAnimation.ts","../packages/ag-react/src/ui/animation/useTransition.ts","../packages/ag-react/src/ui/animation/useInterval.ts","../packages/ag-react/src/ui/animation/useTimeout.ts","../packages/ag-react/src/ui/animation/useLatest.ts"],"mappings":";;AAYA;;;;;AAMA;AAAA,KANY,QAAA,IAAY,CAAA;AAAA,cAMX,OAAA;EAAA;;;;;;;;KAUD,UAAA,gBAA0B,OAAA;;iBAOtB,aAAA,CAAc,MAAA,EAAQ,UAAA,GAAa,QAAA,GAAW,QAAA;;;UCpB7C,mBAAA;EDW4B;ECT3C,QAAA;;EAEA,MAAA,GAAS,UAAA,GAAa,QAAA;;EAEtB,KAAA;;EAEA,UAAA;;EAEA,OAAA;AAAA;AAAA,UAGe,kBAAA;;EAEf,KAAA;;EAEA,WAAA;EDPwB;ECSxB,KAAA;AAAA;;;;ADCF;;;;;;;;iBCwBgB,YAAA,CAAa,OAAA,EAAS,mBAAA,GAAsB,kBAAA;;;UC5C3C,oBAAA;EFW4B;EET3C,QAAA;;EAEA,MAAA,GAAS,UAAA,GAAa,QAAA;AAAA;;;;;;;;;;;;;AFSxB;;;iBEoBgB,aAAA,CAAc,WAAA,UAAqB,OAAA,GAAU,oBAAA;;;;AFpC7D;;;;;AAMA;;;;;;;;;;AAAA,iBGKgB,WAAA,CAAY,QAAA,cAAsB,EAAA,UAAY,OAAA;;;;AHX9D;;;;;AAMA;;;;;;;;;;;;;iBIQgB,UAAA,CAAW,QAAA,cAAsB,EAAA,UAAY,OAAA;EAAmB,KAAA;EAAmB,KAAA;AAAA;;;;AJdnG;;;;;AAMA;;;;;;;;;;;;;;;;;iBKYgB,SAAA,GAAA,CAAa,KAAA,EAAO,CAAA;EAAA,SAAe,OAAA,EAAS,CAAA;AAAA"}
1
+ {"version":3,"file":"useLatest-Bg2x4bfP.d.mts","names":[],"sources":["../packages/ag-react/src/ui/animation/easing.ts","../packages/ag-react/src/ui/animation/useAnimation.ts","../packages/ag-react/src/ui/animation/useTransition.ts","../packages/ag-react/src/ui/animation/useInterval.ts","../packages/ag-react/src/ui/animation/useTimeout.ts","../packages/ag-react/src/ui/animation/useLatest.ts"],"mappings":";;AAYA;;;;;AAMA;AAAA,KANY,QAAA,IAAY,CAAA;AAAA,cAMX,OAAA;EAAA;;;;;;;;KAUD,UAAA,gBAA0B,OAAA;;iBAOtB,aAAA,CAAc,MAAA,EAAQ,UAAA,GAAa,QAAA,GAAW,QAAA;;;UCpB7C,mBAAA;EDW4B;ECT3C,QAAA;;EAEA,MAAA,GAAS,UAAA,GAAa,QAAA;;EAEtB,KAAA;;EAEA,UAAA;;EAEA,OAAA;AAAA;AAAA,UAGe,kBAAA;;EAEf,KAAA;;EAEA,WAAA;EDPwB;ECSxB,KAAA;AAAA;;;;ADCF;;;;;;;;iBCwBgB,YAAA,CAAa,OAAA,EAAS,mBAAA,GAAsB,kBAAA;;;UC5C3C,oBAAA;EFW4B;EET3C,QAAA;;EAEA,MAAA,GAAS,UAAA,GAAa,QAAA;AAAA;;;;;;;;;;;;;AFSxB;;;iBEoBgB,aAAA,CAAc,WAAA,UAAqB,OAAA,GAAU,oBAAA;;;;AFpC7D;;;;;AAMA;;;;;;;;;;AAAA,iBGKgB,WAAA,CAAY,QAAA,cAAsB,EAAA,UAAY,OAAA;;;;AHX9D;;;;;AAMA;;;;;;;;;;;;;iBIQgB,UAAA,CACd,QAAA,cACA,EAAA,UACA,OAAA;EACG,KAAA;EAAmB,KAAA;AAAA;;;;AJlBxB;;;;;AAMA;;;;;;;;;;;;;;;;;iBKYgB,SAAA,GAAA,CAAa,KAAA,EAAO,CAAA;EAAA,SAAe,OAAA,EAAS,CAAA;AAAA"}
@@ -1,5 +1,5 @@
1
- import { _ as TextInputOptions, b as WithSelectOptions, i as ProgressGenerator, o as SelectOption, r as ProgressCallback, x as WithSpinnerOptions, y as WithProgressOptions } from "./types-B4A8Ebba.mjs";
2
- import { r as Spinner } from "./spinner-BRkaJI0N.mjs";
1
+ import { _ as TextInputOptions, b as WithSelectOptions, i as ProgressGenerator, o as SelectOption, r as ProgressCallback, x as WithSpinnerOptions, y as WithProgressOptions } from "./types-BH_v3iMT.mjs";
2
+ import { r as Spinner } from "./spinner-CGo34vyR.mjs";
3
3
  import { EventEmitter } from "events";
4
4
 
5
5
  //#region packages/ag-react/src/ui/wrappers/with-spinner.d.ts
@@ -281,4 +281,4 @@ interface TextInputInstance {
281
281
  }
282
282
  //#endregion
283
283
  export { waitForEvent as a, wrapGenerator as c, attachSpinner as d, withSpinner as f, withSelect as i, createProgressCallback as l, withTextInput as n, wrapEmitter as o, createSelect as r, withIterableProgress as s, createTextInput as t, withProgress as u };
284
- //# sourceMappingURL=with-text-input-lUh9gYAG.d.mts.map
284
+ //# sourceMappingURL=with-text-input-CRfoiFFG.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-text-input-CRfoiFFG.d.mts","names":[],"sources":["../packages/ag-react/src/ui/wrappers/with-spinner.ts","../packages/ag-react/src/ui/wrappers/with-progress.ts","../packages/ag-react/src/ui/wrappers/wrap-generator.ts","../packages/ag-react/src/ui/wrappers/wrap-emitter.ts","../packages/ag-react/src/ui/wrappers/with-select.ts","../packages/ag-react/src/ui/wrappers/with-text-input.ts"],"mappings":";;;;;AA6BA;;;;;;;;;;;;;;;;;;;;;;AAAA,iBAAsB,WAAA,GAAA,CACpB,OAAA,EAAS,OAAA,CAAQ,CAAA,WAAY,CAAA,GAAI,OAAA,CAAQ,CAAA,IACzC,IAAA,aAAiB,cAAA,sBACjB,OAAA,GAAS,kBAAA,GACR,OAAA,CAAQ,CAAA;;;;;;AAmDX;;;;;;;iBAAgB,aAAA,GAAA,CACd,OAAA,EAAS,OAAA,CAAQ,CAAA,GACjB,IAAA,UACA,OAAA,GAAS,kBAAA,IACP,OAAA,CAAQ,CAAA,GAAI,OAAA;;;;;;;;;;;;;;;;AAJhB;;;;;;;;;;;;;;;;;;;;iBCnBsB,YAAA,GAAA,CACpB,EAAA,GAAK,UAAA,EAAY,gBAAA,KAAqB,CAAA,GAAI,OAAA,CAAQ,CAAA,GAClD,OAAA,GAAS,mBAAA,GACR,OAAA,CAAQ,CAAA;;;;;;AAHX;;;;;;;;;iBAsIgB,sBAAA,CACd,OAAA,GAAS,mBAAA,IACP,gBAAA;;;;AD5KJ;;;;;;;;;;;;;;;;;iBEHsB,aAAA,GAAA,CACpB,SAAA,EAAW,iBAAA,CAAkB,CAAA,GAC7B,YAAA,aAAyB,QAAA;EAAY,OAAA;EAAiB,KAAA;AAAA,eACtD,OAAA;EAAW,eAAA;AAAA,IACV,OAAA,CAAQ,CAAA;;;;;;AFsDX;;;;;;iBEeuB,oBAAA,GAAA,CACrB,QAAA,EAAU,QAAA,CAAS,CAAA,IAAK,aAAA,CAAc,CAAA,GACtC,KAAA,UACA,OAAA;EAAW,eAAA;AAAA,IACV,cAAA,CAAe,CAAA;;;;UC/FR,WAAA;EHqBuB;EGnB/B,IAAA;EHoBiB;EGlBjB,OAAA,IAAW,IAAA;EHkBkB;EGhB7B,OAAA;EHgBiC;EGdjC,IAAA;EHiBS;EGfT,IAAA;AAAA;;UAIQ,iBAAA;EHQC;EGNT,MAAA,EAAQ,MAAA,SAAe,WAAA;EHMM;EGJ7B,WAAA;AAAA;;;;;;;;;;AH0DF;;;;;;;;;;iBGpCgB,WAAA,CAAY,OAAA,EAAS,YAAA,EAAc,MAAA,EAAQ,iBAAA;;;;;;;;;;iBA0DrC,YAAA,CACpB,OAAA,EAAS,YAAA,EACT,SAAA,UACA,IAAA,UACA,OAAA;EACE,UAAA;EACA,OAAA;AAAA,IAED,OAAA;;;;AHrFH;;;;;;;;;;;;;;;;;;;iBIOsB,UAAA,GAAA,CACpB,MAAA,UACA,OAAA,EAAS,YAAA,CAAa,CAAA,KACtB,aAAA,GAAe,iBAAA,GACd,OAAA,CAAQ,CAAA;;;;;;;;;AJ4CX;;;;;iBIgHgB,YAAA,CACd,cAAA,GAAgB,iBAAA,OACX,MAAA,UAAgB,OAAA,EAAS,YAAA,CAAa,CAAA,KAAM,SAAA,GAAY,iBAAA,KAAsB,OAAA,CAAQ,CAAA;;;;AJzK7F;;;;;;;;;;;;;;;;;;;;;iBKQsB,aAAA,CACpB,MAAA,UACA,OAAA,GAAS,gBAAA,GACR,OAAA;;;;;;;AL4CH;;;;;;iBKkNgB,eAAA,CAAgB,MAAA,UAAgB,OAAA,GAAS,gBAAA,GAAwB,iBAAA;;UA0EhE,iBAAA;ELxRM;EK0RrB,KAAA;EL9R4B;EKgS5B,cAAA;EL/RiB;EKiSjB,MAAA;ELhSA;EKkSA,MAAA,CAAO,IAAA;ELjSP;EKmSA,SAAA;ELlSU;EKoSV,MAAA;ELpSqB;EKsSrB,KAAA;;EAEA,gBAAA;AAAA"}
@@ -1,6 +1,6 @@
1
- import { a as chalk, r as Spinner } from "./spinner-BmldKx0M.mjs";
2
- import { f as isTTY, i as CURSOR_HIDE, m as write, s as CURSOR_SHOW, u as cursorUp } from "./ansi-C6Qs1Wn2.mjs";
3
- import { t as ProgressBar } from "./progress-bar-IrUjkLfU.mjs";
1
+ import { a as chalk, r as Spinner } from "./spinner-CeOmcuw_.mjs";
2
+ import { f as isTTY, i as CURSOR_HIDE, m as write, s as CURSOR_SHOW, u as cursorUp } from "./ansi-CLOitHKx.mjs";
3
+ import { t as ProgressBar } from "./progress-bar-CXE5Qfkd.mjs";
4
4
  //#region packages/ag-react/src/ui/wrappers/with-spinner.ts
5
5
  /**
6
6
  * Wrap a promise with an animated spinner
@@ -807,4 +807,4 @@ function getAutocompleteSuggestion(value, autocomplete) {
807
807
  //#endregion
808
808
  export { waitForEvent as a, wrapGenerator as c, attachSpinner as d, withSpinner as f, withSelect as i, createProgressCallback as l, withTextInput as n, wrapEmitter as o, createSelect as r, withIterableProgress as s, createTextInput as t, withProgress as u };
809
809
 
810
- //# sourceMappingURL=wrappers-JrEYTuKA.mjs.map
810
+ //# sourceMappingURL=wrappers-UTADQkSY.mjs.map