silvery 0.23.0 → 0.23.1

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 (141) hide show
  1. package/dist/{Text-Ci6UCSTL.mjs → Text-4tWKabKH.mjs} +5 -5
  2. package/dist/{Text-Ci6UCSTL.mjs.map → Text-4tWKabKH.mjs.map} +1 -1
  3. package/dist/{ag-q9lRlKlt.mjs → ag-B-7XAHL8.mjs} +9 -9
  4. package/dist/{ag-q9lRlKlt.mjs.map → ag-B-7XAHL8.mjs.map} +1 -1
  5. package/dist/animation-CZ4x2R7C.mjs.map +1 -1
  6. package/dist/{ansi-zmNzgkPB.d.mts → ansi-qYRTDp5m.d.mts} +1 -1
  7. package/dist/{ansi-zmNzgkPB.d.mts.map → ansi-qYRTDp5m.d.mts.map} +1 -1
  8. package/dist/{chain-bridge-CkYcMxlq.mjs → chain-bridge-B7LNJwVF.mjs} +8 -8
  9. package/dist/{chain-bridge-CkYcMxlq.mjs.map → chain-bridge-B7LNJwVF.mjs.map} +1 -1
  10. package/dist/{chunk-BEJ448es.mjs → chunk-hT5z_Zn9.mjs} +1 -1
  11. package/dist/cli-CuNV0hTE.mjs +4 -0
  12. package/dist/devtools-BuTq07Zb.mjs +2 -0
  13. package/dist/{devtools-td2AjFwc.mjs → devtools-akTjVxxX.mjs} +4 -5
  14. package/dist/{devtools-td2AjFwc.mjs.map → devtools-akTjVxxX.mjs.map} +1 -1
  15. package/dist/{easing-C5MrdO7V.d.mts → easing-8OlNopWv.d.mts} +1 -1
  16. package/dist/{easing-C5MrdO7V.d.mts.map → easing-8OlNopWv.d.mts.map} +1 -1
  17. package/dist/{eta-BwYWEjfS.mjs → eta-CPZ45g_P.mjs} +5 -1
  18. package/dist/{eta-BwYWEjfS.mjs.map → eta-CPZ45g_P.mjs.map} +1 -1
  19. package/dist/flexily-zero-adapter-VoBGHG14.mjs.map +1 -1
  20. package/dist/{hit-registry-D_nxOivS.d.mts → hit-registry-DRV2ig-Y.d.mts} +2 -2
  21. package/dist/{hit-registry-D_nxOivS.d.mts.map → hit-registry-DRV2ig-Y.d.mts.map} +1 -1
  22. package/dist/{image-CIF75xMr.mjs → image-o2WpbrD1.mjs} +22 -22
  23. package/dist/image-o2WpbrD1.mjs.map +1 -0
  24. package/dist/{index-377zdPLP.d.mts → index-3vAxA_EQ.d.mts} +1 -1
  25. package/dist/{index-377zdPLP.d.mts.map → index-3vAxA_EQ.d.mts.map} +1 -1
  26. package/dist/{index-BcSr0RAQ.d.mts → index-BKujGENR.d.mts} +6 -6
  27. package/dist/index-BKujGENR.d.mts.map +1 -0
  28. package/dist/{index-DlNmckTq.d.mts → index-C6oOd9eE.d.mts} +2 -2
  29. package/dist/{index-DlNmckTq.d.mts.map → index-C6oOd9eE.d.mts.map} +1 -1
  30. package/dist/{index-DLnpxDAm.d.mts → index-DhYF3m7V.d.mts} +2 -2
  31. package/dist/{index-DLnpxDAm.d.mts.map → index-DhYF3m7V.d.mts.map} +1 -1
  32. package/dist/index.d.mts +9 -9
  33. package/dist/index.mjs +14 -14
  34. package/dist/index.mjs.map +1 -1
  35. package/dist/{layout-engine-BgR58vL0.mjs → layout-engine-BYp49XPD.mjs} +2 -2
  36. package/dist/{layout-engine-BgR58vL0.mjs.map → layout-engine-BYp49XPD.mjs.map} +1 -1
  37. package/dist/{layout-engine-DNjTha8f.mjs → layout-engine-D0dXw5fr.mjs} +1 -1
  38. package/dist/{layout-signals-CGYbHmxy.mjs → layout-signals-uQadGDmO.mjs} +2 -2
  39. package/dist/{layout-signals-CGYbHmxy.mjs.map → layout-signals-uQadGDmO.mjs.map} +1 -1
  40. package/dist/{mouse-events-WQ2h-uqG.mjs → mouse-events-Pg-XKR3T.mjs} +24 -3
  41. package/dist/{mouse-events-WQ2h-uqG.mjs.map → mouse-events-Pg-XKR3T.mjs.map} +1 -1
  42. package/dist/{mouse-events-B2z5tbsL.d.mts → mouse-events-UoUWNIdS.d.mts} +22 -3
  43. package/dist/{mouse-events-B2z5tbsL.d.mts.map → mouse-events-UoUWNIdS.d.mts.map} +1 -1
  44. package/dist/{multi-progress-zCWHEm9P.mjs → multi-progress-Bvd1BYED.mjs} +2 -2
  45. package/dist/{multi-progress-zCWHEm9P.mjs.map → multi-progress-Bvd1BYED.mjs.map} +1 -1
  46. package/dist/{multi-progress-BaEFfHKP.d.mts → multi-progress-DPOCjomS.d.mts} +2 -2
  47. package/dist/{multi-progress-BaEFfHKP.d.mts.map → multi-progress-DPOCjomS.d.mts.map} +1 -1
  48. package/dist/{node-CJ3J_rW-.mjs → node-Cl-kzQcl.mjs} +4 -4
  49. package/dist/node-Cl-kzQcl.mjs.map +1 -0
  50. package/dist/{progress-6vJ7nxUg.mjs → progress-1r6M_ZAP.mjs} +4 -4
  51. package/dist/{progress-6vJ7nxUg.mjs.map → progress-1r6M_ZAP.mjs.map} +1 -1
  52. package/dist/{progress-bar-BlFNsZL8.mjs → progress-bar-DzW1DzNj.mjs} +3 -3
  53. package/dist/{progress-bar-BlFNsZL8.mjs.map → progress-bar-DzW1DzNj.mjs.map} +1 -1
  54. package/dist/{reconciler--_-biN23.mjs → reconciler-lsTL1y8i.mjs} +45 -5
  55. package/dist/{reconciler--_-biN23.mjs.map → reconciler-lsTL1y8i.mjs.map} +1 -1
  56. package/dist/{render-string-DtHZP0cU.mjs → render-string-2ZcV8n3B.mjs} +6 -6
  57. package/dist/{render-string-DtHZP0cU.mjs.map → render-string-2ZcV8n3B.mjs.map} +1 -1
  58. package/dist/{render-string-DaghHpLN.mjs → render-string-BJZqo5Rr.mjs} +1 -1
  59. package/dist/runtime.d.mts +3 -3
  60. package/dist/runtime.mjs +3 -3
  61. package/dist/{schemes-DWQPxXAi.mjs → schemes-C4SUgVea.mjs} +2 -2
  62. package/dist/{schemes-DWQPxXAi.mjs.map → schemes-C4SUgVea.mjs.map} +1 -1
  63. package/dist/{spinner-B50hILqx.mjs → spinner-Ck3SdCpW.mjs} +2 -2
  64. package/dist/{spinner-B50hILqx.mjs.map → spinner-Ck3SdCpW.mjs.map} +1 -1
  65. package/dist/{spinner-DN10UfF0.d.mts → spinner-CpcGtQ9L.d.mts} +2 -2
  66. package/dist/{spinner-DN10UfF0.d.mts.map → spinner-CpcGtQ9L.d.mts.map} +1 -1
  67. package/dist/{src-BqeBFB3X.mjs → src-B6MuVlOK.mjs} +3 -3
  68. package/dist/src-B6MuVlOK.mjs.map +1 -0
  69. package/dist/{src-DbqcSrhy.mjs → src-BZOfzNeo.mjs} +32 -9
  70. package/dist/src-BZOfzNeo.mjs.map +1 -0
  71. package/dist/{src-BXeTHHlL.mjs → src-ChuXo--x.mjs} +25 -23
  72. package/dist/src-ChuXo--x.mjs.map +1 -0
  73. package/dist/{src-BOLdi3WG.mjs → src-DdGaRDi9.mjs} +3 -3
  74. package/dist/{src-BOLdi3WG.mjs.map → src-DdGaRDi9.mjs.map} +1 -1
  75. package/dist/{src-B8lf1kiR.mjs → src-DorsnS70.mjs} +8 -1
  76. package/dist/src-DorsnS70.mjs.map +1 -0
  77. package/dist/{steps-B2kBmFpb.d.mts → steps-DV34gm_Z.d.mts} +1 -1
  78. package/dist/{steps-B2kBmFpb.d.mts.map → steps-DV34gm_Z.d.mts.map} +1 -1
  79. package/dist/svg-NmV9dgB9.mjs.map +1 -1
  80. package/dist/{svg-VUr78l5d.d.mts → svg-wvIEu-RS.d.mts} +1 -1
  81. package/dist/{svg-VUr78l5d.d.mts.map → svg-wvIEu-RS.d.mts.map} +1 -1
  82. package/dist/term.d.mts +3 -3
  83. package/dist/term.mjs +4 -4
  84. package/dist/test.d.mts +3 -3
  85. package/dist/test.mjs +9 -9
  86. package/dist/test.mjs.map +1 -1
  87. package/dist/theme.d.mts +2 -2
  88. package/dist/theme.mjs +3 -3
  89. package/dist/{types-D_E0FbqA.d.mts → types-VyreAPAB.d.mts} +1 -1
  90. package/dist/{types-D_E0FbqA.d.mts.map → types-VyreAPAB.d.mts.map} +1 -1
  91. package/dist/ui/animation.d.mts +2 -2
  92. package/dist/ui/ansi.d.mts +1 -1
  93. package/dist/ui/cli.d.mts +3 -3
  94. package/dist/ui/cli.mjs +4 -4
  95. package/dist/ui/image.d.mts +1 -1
  96. package/dist/ui/image.mjs +1 -1
  97. package/dist/ui/progress.d.mts +4 -4
  98. package/dist/ui/progress.mjs +4 -4
  99. package/dist/ui/react.d.mts +1 -1
  100. package/dist/ui/react.mjs +2 -2
  101. package/dist/ui/react.mjs.map +1 -1
  102. package/dist/ui/recording-chrome-react.d.mts +1 -1
  103. package/dist/ui/recording-chrome-react.mjs +1 -1
  104. package/dist/ui/recording-chrome.d.mts +1 -1
  105. package/dist/ui/utils.mjs +1 -1
  106. package/dist/ui/wrappers.d.mts +2 -2
  107. package/dist/ui/wrappers.mjs +1 -1
  108. package/dist/ui.d.mts +6 -6
  109. package/dist/ui.mjs +6 -6
  110. package/dist/{unicode-CxyxVGmB.mjs → unicode-X43-fdGF.mjs} +3 -3
  111. package/dist/unicode-X43-fdGF.mjs.map +1 -0
  112. package/dist/{useLatest-UOvWy0ZW.d.mts → useLatest-D9p0ZDAC.d.mts} +2 -2
  113. package/dist/{useLatest-UOvWy0ZW.d.mts.map → useLatest-D9p0ZDAC.d.mts.map} +1 -1
  114. package/dist/{useLayout-D5cE8OCI.mjs → useLayout-Cx01rHVI.mjs} +3 -3
  115. package/dist/{useLayout-D5cE8OCI.mjs.map → useLayout-Cx01rHVI.mjs.map} +1 -1
  116. package/dist/{with-text-input-DLoSCBrm.d.mts → with-text-input-CW8MR9Th.d.mts} +3 -3
  117. package/dist/{with-text-input-DLoSCBrm.d.mts.map → with-text-input-CW8MR9Th.d.mts.map} +1 -1
  118. package/dist/{wrap-measurer-registration-IV2HtcCd.d.mts → wrap-measurer-registration-DNBmtFNM.d.mts} +3 -3
  119. package/dist/{wrap-measurer-registration-IV2HtcCd.d.mts.map → wrap-measurer-registration-DNBmtFNM.d.mts.map} +1 -1
  120. package/dist/{wrapper-CD29afOs.mjs → wrapper-DpMauwdI.mjs} +51 -33
  121. package/dist/wrapper-DpMauwdI.mjs.map +1 -0
  122. package/dist/{wrappers-CInBJm44.mjs → wrappers-DHMzvbRo.mjs} +5 -5
  123. package/dist/{wrappers-CInBJm44.mjs.map → wrappers-DHMzvbRo.mjs.map} +1 -1
  124. package/dist/yoga-adapter-B-DCP4Bx.mjs +2 -0
  125. package/dist/{yoga-adapter-9uab5Qn-.mjs → yoga-adapter-CB_7pLyl.mjs} +2 -2
  126. package/dist/{yoga-adapter-9uab5Qn-.mjs.map → yoga-adapter-CB_7pLyl.mjs.map} +1 -1
  127. package/package.json +2 -2
  128. package/dist/backend-DSiSIc-h.mjs +0 -13396
  129. package/dist/backend-DSiSIc-h.mjs.map +0 -1
  130. package/dist/cli-VNqUKlXw.mjs +0 -4
  131. package/dist/devtools-BF4IMumr.mjs +0 -2
  132. package/dist/image-CIF75xMr.mjs.map +0 -1
  133. package/dist/index-BcSr0RAQ.d.mts.map +0 -1
  134. package/dist/node-CJ3J_rW-.mjs.map +0 -1
  135. package/dist/src-B8lf1kiR.mjs.map +0 -1
  136. package/dist/src-BXeTHHlL.mjs.map +0 -1
  137. package/dist/src-BqeBFB3X.mjs.map +0 -1
  138. package/dist/src-DbqcSrhy.mjs.map +0 -1
  139. package/dist/unicode-CxyxVGmB.mjs.map +0 -1
  140. package/dist/wrapper-CD29afOs.mjs.map +0 -1
  141. package/dist/yoga-adapter-yqTl1aXK.mjs +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"progress-6vJ7nxUg.mjs","names":["isAsyncGenerator","runAsyncGenerator","isDeclareSteps"],"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"],"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"],"mappings":"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"}
1
+ {"version":3,"file":"progress-1r6M_ZAP.mjs","names":["isAsyncGenerator","runAsyncGenerator","isDeclareSteps"],"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"],"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"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { a as chalk } from "./spinner-B50hILqx.mjs";
1
+ import { a as chalk } from "./spinner-Ck3SdCpW.mjs";
2
2
  import { d as getTerminalWidth, f as isTTY, i as CURSOR_HIDE, m as write, s as CURSOR_SHOW } from "./ansi-CLmIMnop.mjs";
3
- import { i as formatETA, n as calculateETA } from "./eta-BwYWEjfS.mjs";
3
+ import { i as formatETA, n as calculateETA } from "./eta-CPZ45g_P.mjs";
4
4
  //#region packages/ag-react/src/ui/cli/progress-bar.ts
5
5
  /**
6
6
  * CLI ProgressBar - Determinate progress indicator with ETA
@@ -152,4 +152,4 @@ var ProgressBar = class {
152
152
  //#endregion
153
153
  export { ProgressBar as t };
154
154
 
155
- //# sourceMappingURL=progress-bar-BlFNsZL8.mjs.map
155
+ //# sourceMappingURL=progress-bar-DzW1DzNj.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"progress-bar-BlFNsZL8.mjs","names":[],"sources":["../packages/ag-react/src/ui/cli/progress-bar.ts"],"sourcesContent":["/**\n * CLI ProgressBar - Determinate progress indicator with ETA\n */\n\nimport chalk from \"@silvery/ink/chalk\"\nimport type { ProgressBarOptions } from \"../types.js\"\nimport {\n CURSOR_HIDE,\n CURSOR_SHOW,\n CURSOR_TO_START,\n CLEAR_LINE_END,\n write,\n isTTY,\n getTerminalWidth,\n} from \"./ansi\"\nimport { calculateETA, formatETA, DEFAULT_ETA_BUFFER_SIZE, type ETASample } from \"../utils/eta\"\n\n/** Default format string */\nconst DEFAULT_FORMAT = \":bar :percent | :current/:total | ETA: :eta\"\n\n/**\n * ProgressBar class for CLI progress indication\n *\n * @example\n * ```ts\n * const bar = new ProgressBar({ total: 100 });\n * bar.start();\n * for (let i = 0; i <= 100; i++) {\n * await doWork();\n * bar.update(i);\n * }\n * bar.stop();\n * ```\n */\nexport class ProgressBar {\n private total: number\n private format: string\n private width: number\n private complete: string\n private incomplete: string\n private stream: NodeJS.WriteStream\n private hideCursor: boolean\n private phases: Record<string, string>\n\n private current = 0\n private phase: string | null = null\n private startTime: number | null = null\n private isActive = false\n\n // ETA smoothing - track last N update times\n private etaBuffer: ETASample[] = []\n\n constructor(options: ProgressBarOptions = {}) {\n this.total = options.total ?? 100\n this.format = options.format ?? DEFAULT_FORMAT\n this.width = options.width ?? 40\n this.complete = options.complete ?? \"█\"\n this.incomplete = options.incomplete ?? \"░\"\n this.stream = options.stream ?? process.stdout\n this.hideCursor = options.hideCursor ?? true\n this.phases = options.phases ?? {}\n }\n\n /**\n * Start the progress bar\n */\n start(initialValue = 0, initialTotal?: number): this {\n if (initialTotal !== undefined) {\n this.total = initialTotal\n }\n\n this.current = initialValue\n this.startTime = Date.now()\n this.isActive = true\n this.etaBuffer = [{ time: this.startTime, value: initialValue }]\n\n if (this.hideCursor && isTTY(this.stream)) {\n write(CURSOR_HIDE, this.stream)\n }\n\n this.render()\n return this\n }\n\n /**\n * Update progress value\n */\n update(value: number, tokens?: Record<string, string | number>): this {\n this.current = Math.min(value, this.total)\n\n // Update ETA buffer\n const now = Date.now()\n this.etaBuffer.push({ time: now, value: this.current })\n if (this.etaBuffer.length > DEFAULT_ETA_BUFFER_SIZE) {\n this.etaBuffer.shift()\n }\n\n if (this.isActive) {\n this.render(tokens)\n }\n\n return this\n }\n\n /**\n * Increment progress by amount (default: 1)\n */\n increment(amount = 1, tokens?: Record<string, string | number>): this {\n return this.update(this.current + amount, tokens)\n }\n\n /**\n * Set the current phase (for multi-phase progress)\n */\n setPhase(phaseName: string, options?: { current?: number; total?: number }): this {\n this.phase = phaseName\n\n if (options?.total !== undefined) {\n this.total = options.total\n }\n if (options?.current !== undefined) {\n this.current = options.current\n // Reset ETA buffer on phase change\n this.etaBuffer = [{ time: Date.now(), value: this.current }]\n }\n\n if (this.isActive) {\n this.render()\n }\n\n return this\n }\n\n /**\n * Stop the progress bar\n */\n stop(clear = false): this {\n if (!this.isActive) {\n return this\n }\n\n this.isActive = false\n\n if (clear && isTTY(this.stream)) {\n write(`${CURSOR_TO_START}${CLEAR_LINE_END}`, this.stream)\n } else {\n write(\"\\n\", this.stream)\n }\n\n if (this.hideCursor && isTTY(this.stream)) {\n write(CURSOR_SHOW, this.stream)\n }\n\n return this\n }\n\n /** Get ETA in seconds using smoothed rate */\n private getETASeconds(): number | null {\n return calculateETA(this.etaBuffer, this.current, this.total)\n }\n\n /**\n * Render the progress bar\n */\n private render(tokens?: Record<string, string | number>): void {\n const percent = this.total > 0 ? this.current / this.total : 0\n const eta = this.getETASeconds()\n\n // Build the bar\n const completeLength = Math.round(this.width * percent)\n const incompleteLength = this.width - completeLength\n const bar = this.complete.repeat(completeLength) + this.incomplete.repeat(incompleteLength)\n\n // Get phase display name\n const phaseDisplay = this.phase ? (this.phases[this.phase] ?? this.phase) : \"\"\n\n // Calculate rate\n const elapsed = this.startTime ? (Date.now() - this.startTime) / 1000 : 0\n const rate = elapsed > 0 ? this.current / elapsed : 0\n\n // Replace tokens in format string\n let output = this.format\n .replace(\":bar\", chalk.cyan(bar))\n .replace(\":percent\", `${Math.round(percent * 100)}%`.padStart(4))\n .replace(\":current\", String(this.current))\n .replace(\":total\", String(this.total))\n .replace(\":eta\", formatETA(eta))\n .replace(\":elapsed\", formatETA(elapsed))\n .replace(\":rate\", rate.toFixed(1))\n .replace(\":phase\", chalk.dim(phaseDisplay))\n\n // Replace custom tokens\n if (tokens) {\n for (const [key, value] of Object.entries(tokens)) {\n output = output.replace(`:${key}`, String(value))\n }\n }\n\n // Truncate to terminal width\n const termWidth = getTerminalWidth(this.stream)\n if (output.length > termWidth) {\n output = output.slice(0, termWidth - 1)\n }\n\n if (isTTY(this.stream)) {\n write(`${CURSOR_TO_START}${output}${CLEAR_LINE_END}`, this.stream)\n }\n }\n\n /**\n * Get current progress ratio (0-1)\n */\n get ratio(): number {\n return this.total > 0 ? this.current / this.total : 0\n }\n\n /**\n * Get current progress percentage (0-100)\n */\n get percentage(): number {\n return Math.round(this.ratio * 100)\n }\n\n /**\n * Dispose the progress bar (calls stop)\n */\n [Symbol.dispose](): void {\n this.stop()\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"progress-bar-DzW1DzNj.mjs","names":[],"sources":["../packages/ag-react/src/ui/cli/progress-bar.ts"],"sourcesContent":["/**\n * CLI ProgressBar - Determinate progress indicator with ETA\n */\n\nimport chalk from \"@silvery/ink/chalk\"\nimport type { ProgressBarOptions } from \"../types.js\"\nimport {\n CURSOR_HIDE,\n CURSOR_SHOW,\n CURSOR_TO_START,\n CLEAR_LINE_END,\n write,\n isTTY,\n getTerminalWidth,\n} from \"./ansi\"\nimport { calculateETA, formatETA, DEFAULT_ETA_BUFFER_SIZE, type ETASample } from \"../utils/eta\"\n\n/** Default format string */\nconst DEFAULT_FORMAT = \":bar :percent | :current/:total | ETA: :eta\"\n\n/**\n * ProgressBar class for CLI progress indication\n *\n * @example\n * ```ts\n * const bar = new ProgressBar({ total: 100 });\n * bar.start();\n * for (let i = 0; i <= 100; i++) {\n * await doWork();\n * bar.update(i);\n * }\n * bar.stop();\n * ```\n */\nexport class ProgressBar {\n private total: number\n private format: string\n private width: number\n private complete: string\n private incomplete: string\n private stream: NodeJS.WriteStream\n private hideCursor: boolean\n private phases: Record<string, string>\n\n private current = 0\n private phase: string | null = null\n private startTime: number | null = null\n private isActive = false\n\n // ETA smoothing - track last N update times\n private etaBuffer: ETASample[] = []\n\n constructor(options: ProgressBarOptions = {}) {\n this.total = options.total ?? 100\n this.format = options.format ?? DEFAULT_FORMAT\n this.width = options.width ?? 40\n this.complete = options.complete ?? \"█\"\n this.incomplete = options.incomplete ?? \"░\"\n this.stream = options.stream ?? process.stdout\n this.hideCursor = options.hideCursor ?? true\n this.phases = options.phases ?? {}\n }\n\n /**\n * Start the progress bar\n */\n start(initialValue = 0, initialTotal?: number): this {\n if (initialTotal !== undefined) {\n this.total = initialTotal\n }\n\n this.current = initialValue\n this.startTime = Date.now()\n this.isActive = true\n this.etaBuffer = [{ time: this.startTime, value: initialValue }]\n\n if (this.hideCursor && isTTY(this.stream)) {\n write(CURSOR_HIDE, this.stream)\n }\n\n this.render()\n return this\n }\n\n /**\n * Update progress value\n */\n update(value: number, tokens?: Record<string, string | number>): this {\n this.current = Math.min(value, this.total)\n\n // Update ETA buffer\n const now = Date.now()\n this.etaBuffer.push({ time: now, value: this.current })\n if (this.etaBuffer.length > DEFAULT_ETA_BUFFER_SIZE) {\n this.etaBuffer.shift()\n }\n\n if (this.isActive) {\n this.render(tokens)\n }\n\n return this\n }\n\n /**\n * Increment progress by amount (default: 1)\n */\n increment(amount = 1, tokens?: Record<string, string | number>): this {\n return this.update(this.current + amount, tokens)\n }\n\n /**\n * Set the current phase (for multi-phase progress)\n */\n setPhase(phaseName: string, options?: { current?: number; total?: number }): this {\n this.phase = phaseName\n\n if (options?.total !== undefined) {\n this.total = options.total\n }\n if (options?.current !== undefined) {\n this.current = options.current\n // Reset ETA buffer on phase change\n this.etaBuffer = [{ time: Date.now(), value: this.current }]\n }\n\n if (this.isActive) {\n this.render()\n }\n\n return this\n }\n\n /**\n * Stop the progress bar\n */\n stop(clear = false): this {\n if (!this.isActive) {\n return this\n }\n\n this.isActive = false\n\n if (clear && isTTY(this.stream)) {\n write(`${CURSOR_TO_START}${CLEAR_LINE_END}`, this.stream)\n } else {\n write(\"\\n\", this.stream)\n }\n\n if (this.hideCursor && isTTY(this.stream)) {\n write(CURSOR_SHOW, this.stream)\n }\n\n return this\n }\n\n /** Get ETA in seconds using smoothed rate */\n private getETASeconds(): number | null {\n return calculateETA(this.etaBuffer, this.current, this.total)\n }\n\n /**\n * Render the progress bar\n */\n private render(tokens?: Record<string, string | number>): void {\n const percent = this.total > 0 ? this.current / this.total : 0\n const eta = this.getETASeconds()\n\n // Build the bar\n const completeLength = Math.round(this.width * percent)\n const incompleteLength = this.width - completeLength\n const bar = this.complete.repeat(completeLength) + this.incomplete.repeat(incompleteLength)\n\n // Get phase display name\n const phaseDisplay = this.phase ? (this.phases[this.phase] ?? this.phase) : \"\"\n\n // Calculate rate\n const elapsed = this.startTime ? (Date.now() - this.startTime) / 1000 : 0\n const rate = elapsed > 0 ? this.current / elapsed : 0\n\n // Replace tokens in format string\n let output = this.format\n .replace(\":bar\", chalk.cyan(bar))\n .replace(\":percent\", `${Math.round(percent * 100)}%`.padStart(4))\n .replace(\":current\", String(this.current))\n .replace(\":total\", String(this.total))\n .replace(\":eta\", formatETA(eta))\n .replace(\":elapsed\", formatETA(elapsed))\n .replace(\":rate\", rate.toFixed(1))\n .replace(\":phase\", chalk.dim(phaseDisplay))\n\n // Replace custom tokens\n if (tokens) {\n for (const [key, value] of Object.entries(tokens)) {\n output = output.replace(`:${key}`, String(value))\n }\n }\n\n // Truncate to terminal width\n const termWidth = getTerminalWidth(this.stream)\n if (output.length > termWidth) {\n output = output.slice(0, termWidth - 1)\n }\n\n if (isTTY(this.stream)) {\n write(`${CURSOR_TO_START}${output}${CLEAR_LINE_END}`, this.stream)\n }\n }\n\n /**\n * Get current progress ratio (0-1)\n */\n get ratio(): number {\n return this.total > 0 ? this.current / this.total : 0\n }\n\n /**\n * Get current progress percentage (0-100)\n */\n get percentage(): number {\n return Math.round(this.ratio * 100)\n }\n\n /**\n * Dispose the progress bar (calls stop)\n */\n [Symbol.dispose](): void {\n this.stop()\n }\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { m as syncTextContentSignal } from "./layout-signals-CGYbHmxy.mjs";
2
- import { I as wrapText, i as displayWidth, l as getActiveLineHeight, v as isSoftBreakPoint } from "./unicode-CxyxVGmB.mjs";
3
- import { O as warnOnce } from "./src-B8lf1kiR.mjs";
4
- import { a as requireCapability, n as getConstants, r as getLayoutEngine } from "./layout-engine-BgR58vL0.mjs";
1
+ import { m as syncTextContentSignal } from "./layout-signals-uQadGDmO.mjs";
2
+ import { I as wrapText, i as displayWidth, l as getActiveLineHeight, v as isSoftBreakPoint } from "./unicode-X43-fdGF.mjs";
3
+ import { O as warnOnce } from "./src-DorsnS70.mjs";
4
+ import { a as requireCapability, n as getConstants, r as getLayoutEngine } from "./layout-engine-BYp49XPD.mjs";
5
5
  import { createLogger } from "loggily";
6
6
  import { createContext } from "react";
7
7
  import Reconciler from "react-reconciler";
@@ -285,7 +285,18 @@ function isBrandedHandle(value) {
285
285
  function defineHandle(kind) {
286
286
  Symbol(`silvery.handle:${kind}`);
287
287
  return {
288
+ /** Diagnostic label for this handle kind. */
288
289
  kind,
290
+ /**
291
+ * Create an opaque, frozen handle that wraps `value` with `dispose`
292
+ * cleanup. The returned value is registered in the module-private
293
+ * `branded` WeakSet so the library can authenticate it later.
294
+ *
295
+ * The handle is `Object.freeze`d before return so callers cannot
296
+ * overwrite `[Symbol.asyncDispose]`, `[Symbol.dispose]`, or any
297
+ * surface property the consuming factory adds via `Object.assign`.
298
+ * Add public surface BEFORE returning from your factory.
299
+ */
289
300
  create(_value, dispose) {
290
301
  const handle = Object.create(null);
291
302
  let _disposed = false;
@@ -1953,6 +1964,15 @@ const hostConfig = {
1953
1964
  waitForCommitToBeReady() {
1954
1965
  return null;
1955
1966
  },
1967
+ /**
1968
+ * Hide an instance during Suspense.
1969
+ * Called when React needs to hide content while showing a fallback.
1970
+ *
1971
+ * Must set stylePropsDirty (render phase fast-path skip includes stylePropsDirty check),
1972
+ * layoutNode.markDirty() (hiding changes measured content — the layout engine
1973
+ * must recalculate dimensions), and markLayoutAncestorDirty (virtual text nodes
1974
+ * without layoutNode need the nearest layout ancestor dirty).
1975
+ */
1956
1976
  hideInstance(instance) {
1957
1977
  instance.hidden = true;
1958
1978
  const epoch = getRenderEpoch();
@@ -1971,6 +1991,13 @@ const hostConfig = {
1971
1991
  markLayoutAncestorDirty(instance);
1972
1992
  markSubtreeDirty(instance);
1973
1993
  },
1994
+ /**
1995
+ * Unhide an instance after Suspense resolves.
1996
+ * Called when the suspended content is ready to show.
1997
+ *
1998
+ * Same invalidation as hideInstance — the node's visibility change affects
1999
+ * layout (measured content changes) and paint (content must be re-rendered).
2000
+ */
1974
2001
  unhideInstance(instance, _props) {
1975
2002
  instance.hidden = false;
1976
2003
  const epoch = getRenderEpoch();
@@ -1989,6 +2016,13 @@ const hostConfig = {
1989
2016
  markLayoutAncestorDirty(instance);
1990
2017
  markSubtreeDirty(instance);
1991
2018
  },
2019
+ /**
2020
+ * Hide a text instance during Suspense.
2021
+ *
2022
+ * Text instances don't have layout nodes. markLayoutAncestorDirty walks up
2023
+ * to the nearest layout ancestor and marks it dirty so the measure function
2024
+ * re-collects descendant text (collectNodeTextContent skips hidden children).
2025
+ */
1992
2026
  hideTextInstance(textInstance) {
1993
2027
  textInstance.hidden = true;
1994
2028
  const epoch = getRenderEpoch();
@@ -2006,6 +2040,12 @@ const hostConfig = {
2006
2040
  markLayoutAncestorDirty(textInstance);
2007
2041
  markSubtreeDirty(textInstance);
2008
2042
  },
2043
+ /**
2044
+ * Unhide a text instance after Suspense resolves.
2045
+ *
2046
+ * Same invalidation as hideTextInstance — the text content changes when
2047
+ * hidden children become visible again.
2048
+ */
2009
2049
  unhideTextInstance(textInstance, _text) {
2010
2050
  textInstance.hidden = false;
2011
2051
  const epoch = getRenderEpoch();
@@ -2136,4 +2176,4 @@ function releaseContainer(container) {
2136
2176
  //#endregion
2137
2177
  export { isDirty as C, isCurrentEpoch as S, measureStats as _, releaseContainer as a, getRenderEpoch as b, runWithDiscreteEvent as c, reportDisposeError as d, defineHandle as f, trackContentDirty as g, hasScrollDirty as h, reconciler as i, setContainerNodeLifecycle as l, clearDirtyTracking as m, createFiberRoot as n, unmountFiberRoot as o, finaliseHandle as p, getContainerRoot as r, hostConfig as s, createContainer as t, createScope as u, collectPlainText as v, isAnyDirty as x, advanceRenderEpoch as y };
2138
2178
 
2139
- //# sourceMappingURL=reconciler--_-biN23.mjs.map
2179
+ //# sourceMappingURL=reconciler-lsTL1y8i.mjs.map