@xdevops/issue-auto-finish 1.0.88 → 1.0.90

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/dist/{AIRunnerRegistry-II3WWSFN.js → AIRunnerRegistry-CFDNWSXC.js} +6 -3
  2. package/dist/{LockNote-Z2CLDZNN.js → LockNote-W2JNVMW7.js} +3 -3
  3. package/dist/PtyRunner-NYASBTRP.js +33 -0
  4. package/dist/SdkRunner-U2OTOMZU.js +9 -0
  5. package/dist/ai-runner/AIRunner.d.ts +19 -1
  6. package/dist/ai-runner/AIRunner.d.ts.map +1 -1
  7. package/dist/ai-runner/AIRunnerRegistry.d.ts +8 -0
  8. package/dist/ai-runner/AIRunnerRegistry.d.ts.map +1 -1
  9. package/dist/ai-runner/PlanFileResolver.d.ts +53 -0
  10. package/dist/ai-runner/PlanFileResolver.d.ts.map +1 -0
  11. package/dist/ai-runner/PtyRunner.d.ts +45 -4
  12. package/dist/ai-runner/PtyRunner.d.ts.map +1 -1
  13. package/dist/ai-runner/SdkRunner.d.ts +22 -0
  14. package/dist/ai-runner/SdkRunner.d.ts.map +1 -0
  15. package/dist/ai-runner/index.d.ts +5 -2
  16. package/dist/ai-runner/index.d.ts.map +1 -1
  17. package/dist/ai-runner/sdk/ClaudeCodeSDK.d.ts +37 -0
  18. package/dist/ai-runner/sdk/ClaudeCodeSDK.d.ts.map +1 -0
  19. package/dist/ai-runner/sdk/Stream.d.ts +22 -0
  20. package/dist/ai-runner/sdk/Stream.d.ts.map +1 -0
  21. package/dist/ai-runner/sdk/types.d.ts +146 -0
  22. package/dist/ai-runner/sdk/types.d.ts.map +1 -0
  23. package/dist/{ai-runner-HLA44WI6.js → ai-runner-TOHVJJ76.js} +14 -5
  24. package/dist/{analyze-ZIXNC5GN.js → analyze-DBH4K3J7.js} +8 -6
  25. package/dist/{analyze-ZIXNC5GN.js.map → analyze-DBH4K3J7.js.map} +1 -1
  26. package/dist/{braindump-56WAY2RD.js → braindump-RYI4BGMG.js} +11 -9
  27. package/dist/{braindump-56WAY2RD.js.map → braindump-RYI4BGMG.js.map} +1 -1
  28. package/dist/{chunk-AVGZH64A.js → chunk-2RWGZPNF.js} +4 -1
  29. package/dist/chunk-2RWGZPNF.js.map +1 -0
  30. package/dist/chunk-4XMYOXGZ.js +1153 -0
  31. package/dist/chunk-4XMYOXGZ.js.map +1 -0
  32. package/dist/{chunk-M5C2WILQ.js → chunk-5M5SB6ZA.js} +7 -5
  33. package/dist/{chunk-M5C2WILQ.js.map → chunk-5M5SB6ZA.js.map} +1 -1
  34. package/dist/{chunk-D47Q5745.js → chunk-ENF24C44.js} +7 -7
  35. package/dist/{chunk-GXFG4JU6.js → chunk-EU4XFZ2T.js} +2 -2
  36. package/dist/{chunk-NZHKAPU6.js → chunk-FJTZKAJA.js} +9 -3
  37. package/dist/chunk-FJTZKAJA.js.map +1 -0
  38. package/dist/chunk-G7QI5WDI.js +14 -0
  39. package/dist/chunk-G7QI5WDI.js.map +1 -0
  40. package/dist/{chunk-2YQHKXLL.js → chunk-GPZX4DSY.js} +22 -6
  41. package/dist/chunk-GPZX4DSY.js.map +1 -0
  42. package/dist/{chunk-IP3QTP5A.js → chunk-IWSMQXBL.js} +189 -48
  43. package/dist/chunk-IWSMQXBL.js.map +1 -0
  44. package/dist/chunk-MSL7ROVK.js +1 -0
  45. package/dist/{chunk-YCYVNRLF.js → chunk-OBGEEGQ3.js} +61 -19
  46. package/dist/chunk-OBGEEGQ3.js.map +1 -0
  47. package/dist/chunk-R32Q3RGK.js +666 -0
  48. package/dist/chunk-R32Q3RGK.js.map +1 -0
  49. package/dist/{chunk-LNFMARKQ.js → chunk-SEO57UYI.js} +25 -8
  50. package/dist/chunk-SEO57UYI.js.map +1 -0
  51. package/dist/{chunk-2GJ2KA4Z.js → chunk-TDKTI363.js} +3 -3
  52. package/dist/{chunk-SAMTXC4A.js → chunk-TFEPHOVE.js} +12 -17
  53. package/dist/chunk-TFEPHOVE.js.map +1 -0
  54. package/dist/{chunk-C4MFVASL.js → chunk-Y62E72TA.js} +63 -20
  55. package/dist/chunk-Y62E72TA.js.map +1 -0
  56. package/dist/{chunk-HDFNMVRQ.js → chunk-Z3OBKODV.js} +12 -11
  57. package/dist/chunk-Z3OBKODV.js.map +1 -0
  58. package/dist/cli/setup/ConfigGenerator.d.ts +2 -0
  59. package/dist/cli/setup/ConfigGenerator.d.ts.map +1 -1
  60. package/dist/cli/setup/DependencyChecker.d.ts +1 -1
  61. package/dist/cli/setup/DependencyChecker.d.ts.map +1 -1
  62. package/dist/cli/setup/PreflightChecker.d.ts.map +1 -1
  63. package/dist/cli/setup/env-metadata.d.ts.map +1 -1
  64. package/dist/cli.js +10 -9
  65. package/dist/cli.js.map +1 -1
  66. package/dist/{config-WTRSZLOC.js → config-23TBYFP5.js} +5 -4
  67. package/dist/config-schema.d.ts +6 -0
  68. package/dist/config-schema.d.ts.map +1 -1
  69. package/dist/config.d.ts +6 -0
  70. package/dist/config.d.ts.map +1 -1
  71. package/dist/{doctor-37JNBGDN.js → doctor-LLETZLW2.js} +3 -3
  72. package/dist/errors/AIExecutionError.d.ts +3 -0
  73. package/dist/errors/AIExecutionError.d.ts.map +1 -1
  74. package/dist/{errors-S3BWYA4I.js → errors-J3ZRP66W.js} +2 -2
  75. package/dist/events/EventBus.d.ts +1 -1
  76. package/dist/events/EventBus.d.ts.map +1 -1
  77. package/dist/i18n/locales/en.d.ts.map +1 -1
  78. package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +16 -14
  81. package/dist/{init-4THZTNXY.js → init-UKTP7LXS.js} +9 -8
  82. package/dist/{init-4THZTNXY.js.map → init-UKTP7LXS.js.map} +1 -1
  83. package/dist/lib.js +10 -8
  84. package/dist/lib.js.map +1 -1
  85. package/dist/orchestrator/PendingDialogStore.d.ts +12 -0
  86. package/dist/orchestrator/PendingDialogStore.d.ts.map +1 -0
  87. package/dist/orchestrator/steps/FailureHandler.d.ts.map +1 -1
  88. package/dist/orchestrator/steps/PhaseLoopStep.d.ts.map +1 -1
  89. package/dist/persistence/PlanPersistence.d.ts +5 -0
  90. package/dist/persistence/PlanPersistence.d.ts.map +1 -1
  91. package/dist/persistence/TodolistExtractor.d.ts +31 -0
  92. package/dist/persistence/TodolistExtractor.d.ts.map +1 -0
  93. package/dist/phases/BasePhase.d.ts.map +1 -1
  94. package/dist/phases/PhaseOutcome.d.ts +2 -0
  95. package/dist/phases/PhaseOutcome.d.ts.map +1 -1
  96. package/dist/phases/PlanPhase.d.ts.map +1 -1
  97. package/dist/prompts/templates.d.ts +2 -2
  98. package/dist/prompts/templates.d.ts.map +1 -1
  99. package/dist/{restart-VEDIKB6M.js → restart-2BCP6AMK.js} +9 -8
  100. package/dist/{restart-VEDIKB6M.js.map → restart-2BCP6AMK.js.map} +1 -1
  101. package/dist/run.js +16 -14
  102. package/dist/run.js.map +1 -1
  103. package/dist/start-ECUOKGM2.js +16 -0
  104. package/dist/start-ECUOKGM2.js.map +1 -0
  105. package/dist/tracker/IssueTracker.d.ts +6 -0
  106. package/dist/tracker/IssueTracker.d.ts.map +1 -1
  107. package/dist/web/routes/api.d.ts.map +1 -1
  108. package/package.json +5 -1
  109. package/src/web/frontend/dist/assets/index-DWOHf3bd.css +1 -0
  110. package/src/web/frontend/dist/assets/index-Dby4j-V_.js +151 -0
  111. package/src/web/frontend/dist/index.html +2 -2
  112. package/dist/PtyRunner-6UGI5STW.js +0 -22
  113. package/dist/chunk-2YQHKXLL.js.map +0 -1
  114. package/dist/chunk-AVGZH64A.js.map +0 -1
  115. package/dist/chunk-C4MFVASL.js.map +0 -1
  116. package/dist/chunk-HDFNMVRQ.js.map +0 -1
  117. package/dist/chunk-IP3QTP5A.js.map +0 -1
  118. package/dist/chunk-LNFMARKQ.js.map +0 -1
  119. package/dist/chunk-NZHKAPU6.js.map +0 -1
  120. package/dist/chunk-SAMTXC4A.js.map +0 -1
  121. package/dist/chunk-U237JSLB.js +0 -1
  122. package/dist/chunk-U6GWFTKA.js +0 -657
  123. package/dist/chunk-U6GWFTKA.js.map +0 -1
  124. package/dist/chunk-YCYVNRLF.js.map +0 -1
  125. package/dist/start-5N6DIWM2.js +0 -15
  126. package/src/web/frontend/dist/assets/index-COYziOhv.css +0 -1
  127. package/src/web/frontend/dist/assets/index-D_oTMuJU.js +0 -151
  128. /package/dist/{AIRunnerRegistry-II3WWSFN.js.map → AIRunnerRegistry-CFDNWSXC.js.map} +0 -0
  129. /package/dist/{LockNote-Z2CLDZNN.js.map → LockNote-W2JNVMW7.js.map} +0 -0
  130. /package/dist/{PtyRunner-6UGI5STW.js.map → PtyRunner-NYASBTRP.js.map} +0 -0
  131. /package/dist/{ai-runner-HLA44WI6.js.map → SdkRunner-U2OTOMZU.js.map} +0 -0
  132. /package/dist/{chunk-U237JSLB.js.map → ai-runner-TOHVJJ76.js.map} +0 -0
  133. /package/dist/{chunk-D47Q5745.js.map → chunk-ENF24C44.js.map} +0 -0
  134. /package/dist/{chunk-GXFG4JU6.js.map → chunk-EU4XFZ2T.js.map} +0 -0
  135. /package/dist/{config-WTRSZLOC.js.map → chunk-MSL7ROVK.js.map} +0 -0
  136. /package/dist/{chunk-2GJ2KA4Z.js.map → chunk-TDKTI363.js.map} +0 -0
  137. /package/dist/{errors-S3BWYA4I.js.map → config-23TBYFP5.js.map} +0 -0
  138. /package/dist/{doctor-37JNBGDN.js.map → doctor-LLETZLW2.js.map} +0 -0
  139. /package/dist/{start-5N6DIWM2.js.map → errors-J3ZRP66W.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/setup/DependencyChecker.ts"],"sourcesContent":["import { ChildProcess, spawn } from 'node:child_process';\nimport { platform, arch } from 'node:os';\nimport { t } from '../../i18n/index.js';\n\nconst INSTALL_TIMEOUT_MS = 120_000;\nconst AI_INSTALL_TIMEOUT_MS = 180_000;\n\nexport type AuthStatus = 'logged_in' | 'not_logged_in' | 'unknown';\n\nexport interface DepCheckResult {\n name: string;\n displayName: string;\n required: boolean;\n installed: boolean;\n version?: string;\n installCommand?: string;\n installHint?: string;\n aiInstallable?: boolean;\n category: 'ai-cli' | 'toolchain';\n authStatus?: AuthStatus;\n loginCommand?: string;\n}\n\nexport interface InstallAllEvent {\n phase?: string;\n dep?: string;\n status?: 'start' | 'done';\n installed?: boolean;\n line?: string;\n}\n\nasync function checkAuth(binary: string, args: string[]): Promise<AuthStatus> {\n return new Promise((resolve) => {\n const proc = spawn(binary, args, { stdio: ['ignore', 'pipe', 'pipe'] });\n const timer = setTimeout(() => { proc.kill('SIGTERM'); resolve('unknown'); }, 10_000);\n proc.on('close', (code) => { clearTimeout(timer); resolve(code === 0 ? 'logged_in' : 'not_logged_in'); });\n proc.on('error', () => { clearTimeout(timer); resolve('unknown'); });\n });\n}\n\nasync function which(binary: string): Promise<string | null> {\n return new Promise((resolve) => {\n const proc = spawn('which', [binary], { stdio: ['ignore', 'pipe', 'ignore'] });\n let out = '';\n proc.stdout.on('data', (d) => { out += d.toString(); });\n proc.on('close', (code) => resolve(code === 0 ? out.trim() : null));\n proc.on('error', () => resolve(null));\n });\n}\n\nasync function getVersion(binary: string, args: string[] = ['--version']): Promise<string | null> {\n return new Promise((resolve) => {\n const proc = spawn(binary, args, { stdio: ['ignore', 'pipe', 'pipe'] });\n let out = '';\n proc.stdout.on('data', (d) => { out += d.toString(); });\n proc.stderr.on('data', (d) => { out += d.toString(); });\n proc.on('close', (code) => {\n if (code === 0 && out.trim()) {\n const match = out.trim().match(/[\\d]+\\.[\\d]+[\\d.a-z-]*/);\n resolve(match ? match[0] : out.trim().split('\\n')[0]);\n } else {\n resolve(null);\n }\n });\n proc.on('error', () => resolve(null));\n });\n}\n\nexport class DependencyChecker {\n async checkAll(_aiMode?: string): Promise<DepCheckResult[]> {\n const results = await Promise.all([\n this.checkNode(),\n this.checkGit(),\n this.checkCursor(true), // cursor-agent 始终 required\n this.checkClaudeInternal(false), // 可选\n this.checkCodebuddy(false), // 可选\n ]);\n return results;\n }\n\n async checkNode(): Promise<DepCheckResult> {\n const version = await getVersion('node');\n return {\n name: 'node',\n displayName: 'Node.js (>= 20)',\n required: true,\n installed: version !== null,\n version: version ?? undefined,\n installCommand: platform() === 'linux' ? 'curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - && sudo apt-get install -y nodejs' : undefined,\n installHint: 'https://nodejs.org/ or nvm install 20',\n category: 'toolchain',\n aiInstallable: true,\n };\n }\n\n async checkGit(): Promise<DepCheckResult> {\n const version = await getVersion('git');\n return {\n name: 'git',\n displayName: 'Git',\n required: true,\n installed: version !== null,\n version: version ?? undefined,\n installCommand: platform() === 'linux' ? 'sudo apt-get install -y git' : undefined,\n installHint: 'sudo apt install git / brew install git',\n category: 'toolchain',\n aiInstallable: true,\n };\n }\n\n async checkClaudeInternal(required: boolean): Promise<DepCheckResult> {\n const binPath = await which('claude-internal');\n const version = binPath ? await getVersion('claude-internal') : null;\n const cmd = 'npm install -g claude-code-internal';\n const authStatus: AuthStatus = binPath ? await checkAuth('claude-internal', ['auth', 'status']) : 'unknown';\n return {\n name: 'claude-internal',\n displayName: 'Claude Internal CLI',\n required,\n installed: binPath !== null,\n version: version ?? undefined,\n installCommand: cmd,\n installHint: cmd,\n category: 'ai-cli',\n aiInstallable: false,\n authStatus,\n loginCommand: 'claude-internal auth login',\n };\n }\n\n async checkCursor(required: boolean): Promise<DepCheckResult> {\n const binPath = await which('cursor-agent');\n const version = binPath ? await getVersion('cursor-agent', ['-v']) : null;\n const authStatus: AuthStatus = binPath ? await checkAuth('cursor-agent', ['auth', 'whoami']) : 'unknown';\n return {\n name: 'cursor-agent',\n displayName: 'Cursor Agent CLI',\n required,\n installed: version !== null,\n version: version ?? undefined,\n // 不设置 installCommand → 前端不显示自动安装按钮\n // cursor-agent 使用 curl | bash 管道安装,在非 TTY 环境下无输出,改为手动安装\n installHint: t('cli.cursorInstallHint'),\n category: 'ai-cli',\n aiInstallable: false,\n authStatus,\n loginCommand: 'cursor-agent auth login',\n };\n }\n\n async checkCodebuddy(required: boolean): Promise<DepCheckResult> {\n const binPath = await which('codebuddy');\n const version = binPath ? await getVersion('codebuddy') : null;\n const cmd = 'npm install -g codebuddy-code';\n const authStatus: AuthStatus = binPath ? await checkAuth('codebuddy', ['auth', 'status']) : 'unknown';\n return {\n name: 'codebuddy',\n displayName: 'CodeBuddy CLI',\n required,\n installed: binPath !== null,\n version: version ?? undefined,\n installCommand: cmd,\n installHint: cmd,\n category: 'ai-cli',\n aiInstallable: false,\n authStatus,\n loginCommand: 'codebuddy auth login',\n };\n }\n\n async checkOne(name: string): Promise<DepCheckResult | null> {\n switch (name) {\n case 'node': return this.checkNode();\n case 'git': return this.checkGit();\n case 'claude-internal': return this.checkClaudeInternal(true);\n case 'cursor-agent': return this.checkCursor(true);\n case 'codebuddy': return this.checkCodebuddy(true);\n default: return null;\n }\n }\n\n async *install(name: string): AsyncGenerator<string> {\n yield t('cli.checkingDep', { name });\n const dep = await this.checkOne(name);\n if (!dep) {\n yield t('cli.unknownDep', { name });\n return;\n }\n if (dep.installed) {\n yield t('cli.alreadyInstalled', { name: dep.displayName, version: dep.version ?? '' });\n return;\n }\n if (!dep.installCommand) {\n yield t('cli.manualInstall', { name: dep.displayName, hint: dep.installHint ?? '' });\n return;\n }\n\n yield t('cli.installing', { name: dep.displayName });\n yield `$ ${dep.installCommand}`;\n\n const proc = spawn(dep.installCommand, {\n stdio: ['ignore', 'pipe', 'pipe'],\n shell: true,\n });\n\n const { exitCode, timedOut, lineCount } = yield* streamProcess(proc, INSTALL_TIMEOUT_MS);\n\n if (timedOut) {\n yield t('cli.installTimeout', { name: dep.displayName, seconds: INSTALL_TIMEOUT_MS / 1000 });\n return;\n }\n\n if (lineCount === 0) {\n yield t('cli.noOutput');\n }\n\n yield t('cli.verifyingInstall');\n\n if (exitCode === 0) {\n yield t('cli.installSuccess', { name: dep.displayName });\n } else {\n yield t('cli.installFailed', { name: dep.displayName, code: exitCode });\n }\n }\n\n async *installWithAI(dep: DepCheckResult): AsyncGenerator<string> {\n const claudePath = await which('claude-internal');\n if (!claudePath) {\n yield t('cli.aiInstallUnavailable');\n return;\n }\n\n yield t('cli.aiInstalling', { name: dep.displayName });\n\n const osInfo = `${platform()} ${arch()}`;\n const prompt = `Please install ${dep.displayName} on the current system (${osInfo}).\\nReference hint: ${dep.installHint ?? dep.installCommand ?? dep.name}\\nAfter installation, verify it was successful by running the version check command.\\nIf you need to modify shell config files (e.g. .bashrc), do it directly.`;\n\n // Remove CLAUDECODE env var to prevent nested session detection\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { CLAUDECODE, ...env } = process.env;\n const proc = spawn('claude-internal', [\n '-p', prompt,\n '--dangerously-skip-permissions',\n ], {\n stdio: ['ignore', 'pipe', 'pipe'],\n shell: false,\n env,\n });\n\n const { exitCode, timedOut } = yield* streamProcess(proc, AI_INSTALL_TIMEOUT_MS, true);\n\n if (timedOut) {\n yield t('cli.aiInstallTimeout', { name: dep.displayName, seconds: AI_INSTALL_TIMEOUT_MS / 1000 });\n return;\n }\n\n if (exitCode === 0) {\n yield t('cli.aiInstallSuccess', { name: dep.displayName });\n } else {\n yield t('cli.aiInstallFailed', { name: dep.displayName, code: exitCode });\n }\n }\n\n async *installAll(aiMode?: string): AsyncGenerator<InstallAllEvent> {\n yield { line: t('cli.installAllStart') };\n\n const installOrder: string[] = ['claude-internal'];\n if (aiMode === 'cursor-agent') {\n installOrder.push('cursor-agent');\n } else if (aiMode === 'codebuddy') {\n installOrder.push('codebuddy');\n }\n installOrder.push('node', 'git');\n\n let checks = await this.checkAll(aiMode);\n\n for (const depName of installOrder) {\n let dep = checks.find((d) => d.name === depName);\n if (!dep) continue;\n\n if (dep.installed) {\n yield { line: t('cli.skippingInstalled', { name: dep.displayName, version: dep.version ?? '' }) };\n continue;\n }\n\n const phase = dep.category === 'ai-cli' ? 'ai-cli' : 'toolchain';\n yield { phase, dep: depName, status: 'start' };\n\n let installed = false;\n let lineCount = 0;\n\n // Skip deps without installCommand (e.g. cursor-agent needs manual install)\n if (!dep.installCommand) {\n yield { line: t('cli.manualInstallRequired', { name: dep.displayName, hint: dep.installHint ?? '' }), dep: depName };\n yield { phase, dep: depName, status: 'done', installed: false };\n continue;\n }\n\n // Try installCommand first\n if (dep.installCommand) {\n yield { line: t('cli.installing', { name: dep.displayName }), dep: depName };\n yield { line: `$ ${dep.installCommand}`, dep: depName };\n\n const proc = spawn(dep.installCommand, {\n stdio: ['ignore', 'pipe', 'pipe'],\n shell: true,\n });\n\n for await (const chunk of streamProcessLines(proc, INSTALL_TIMEOUT_MS)) {\n yield { line: chunk.line, dep: depName };\n lineCount += chunk.count;\n }\n\n if (lineCount === 0) {\n yield { line: t('cli.noOutput'), dep: depName };\n }\n\n yield { line: t('cli.verifyingInstall'), dep: depName };\n\n // Re-check installation\n checks = await this.checkAll(aiMode);\n dep = checks.find((d) => d.name === depName)!;\n installed = dep.installed;\n }\n\n // AI fallback for toolchain deps\n if (!installed && dep.aiInstallable) {\n const claudePath = await which('claude-internal');\n if (claudePath) {\n yield { line: t('cli.tryingAiFallback', { name: dep.displayName }), dep: depName };\n yield { phase: 'ai-fallback', dep: depName, status: 'start' };\n\n for await (const chunk of this.installWithAILines(dep)) {\n yield { line: chunk, dep: depName };\n }\n\n // Re-check installation\n checks = await this.checkAll(aiMode);\n dep = checks.find((d) => d.name === depName)!;\n installed = dep.installed;\n }\n }\n\n yield { phase, dep: depName, status: 'done', installed };\n }\n\n yield { line: t('cli.installAllDone') };\n }\n\n private async *installWithAILines(dep: DepCheckResult): AsyncGenerator<string> {\n for await (const line of this.installWithAI(dep)) {\n yield line;\n }\n }\n}\n\nasync function* streamProcess(\n proc: ChildProcess,\n timeoutMs: number,\n markStderr = false,\n): AsyncGenerator<string, { exitCode: number; timedOut: boolean; lineCount: number }> {\n const chunks: string[] = [];\n let notify: (() => void) | null = null;\n let closed = false;\n let closedCode = 1;\n let timedOut = false;\n let lineCount = 0;\n\n const onStdout = (d: Buffer) => {\n chunks.push(d.toString());\n notify?.();\n };\n const onStderr = (d: Buffer) => {\n const text = d.toString();\n chunks.push(markStderr ? `[stderr] ${text}` : text);\n notify?.();\n };\n proc.stdout?.on('data', onStdout);\n proc.stderr?.on('data', onStderr);\n\n proc.on('close', (code) => {\n closed = true;\n closedCode = code ?? 1;\n notify?.();\n });\n\n const timer = setTimeout(() => {\n timedOut = true;\n proc.kill('SIGTERM');\n setTimeout(() => { if (!closed) proc.kill('SIGKILL'); }, 5000);\n notify?.();\n }, timeoutMs);\n\n try {\n while (!closed || chunks.length > 0) {\n if (chunks.length > 0) {\n lineCount++;\n yield chunks.shift()!;\n } else if (!closed) {\n await new Promise<void>((r) => { notify = r; });\n notify = null;\n }\n }\n } finally {\n clearTimeout(timer);\n }\n\n return { exitCode: closedCode, timedOut, lineCount };\n}\n\nasync function* streamProcessLines(\n proc: ChildProcess,\n timeoutMs: number,\n): AsyncGenerator<{ line: string; count: number }> {\n const chunks: string[] = [];\n let notify: (() => void) | null = null;\n let closed = false;\n let timedOut = false;\n let count = 0;\n\n const onStdout = (d: Buffer) => {\n chunks.push(d.toString());\n notify?.();\n };\n const onStderr = (d: Buffer) => {\n chunks.push(`[stderr] ${d.toString()}`);\n notify?.();\n };\n proc.stdout?.on('data', onStdout);\n proc.stderr?.on('data', onStderr);\n\n proc.on('close', () => {\n closed = true;\n notify?.();\n });\n\n const timer = setTimeout(() => {\n timedOut = true;\n proc.kill('SIGTERM');\n setTimeout(() => { if (!closed) proc.kill('SIGKILL'); }, 5000);\n notify?.();\n }, timeoutMs);\n\n try {\n while (!closed || chunks.length > 0) {\n if (chunks.length > 0) {\n count++;\n yield { line: chunks.shift()!, count };\n } else if (!closed) {\n await new Promise<void>((r) => { notify = r; });\n notify = null;\n }\n }\n } finally {\n clearTimeout(timer);\n }\n\n if (timedOut) {\n yield { line: '[stderr] Process timed out', count };\n }\n}\n"],"mappings":"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","names":[]}