@xdevops/issue-auto-finish 1.0.87 → 1.0.89

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 (134) 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-UBQLXQ7I.js → chunk-5JBADEKR.js} +7 -7
  33. package/dist/{chunk-M5C2WILQ.js → chunk-5M5SB6ZA.js} +7 -5
  34. package/dist/{chunk-M5C2WILQ.js.map → chunk-5M5SB6ZA.js.map} +1 -1
  35. package/dist/{chunk-HDFNMVRQ.js → chunk-DVNAH2GV.js} +2 -2
  36. package/dist/{chunk-GXFG4JU6.js → chunk-EU4XFZ2T.js} +2 -2
  37. package/dist/{chunk-NZHKAPU6.js → chunk-FJTZKAJA.js} +9 -3
  38. package/dist/chunk-FJTZKAJA.js.map +1 -0
  39. package/dist/chunk-G7QI5WDI.js +14 -0
  40. package/dist/chunk-G7QI5WDI.js.map +1 -0
  41. package/dist/{chunk-2YQHKXLL.js → chunk-GPZX4DSY.js} +22 -6
  42. package/dist/chunk-GPZX4DSY.js.map +1 -0
  43. package/dist/{chunk-IP3QTP5A.js → chunk-IWSMQXBL.js} +189 -48
  44. package/dist/chunk-IWSMQXBL.js.map +1 -0
  45. package/dist/{chunk-O3WEV5W3.js → chunk-JMACM7AJ.js} +47 -9
  46. package/dist/chunk-JMACM7AJ.js.map +1 -0
  47. package/dist/chunk-MSL7ROVK.js +1 -0
  48. package/dist/{chunk-YCYVNRLF.js → chunk-OBGEEGQ3.js} +61 -19
  49. package/dist/chunk-OBGEEGQ3.js.map +1 -0
  50. package/dist/chunk-R32Q3RGK.js +666 -0
  51. package/dist/chunk-R32Q3RGK.js.map +1 -0
  52. package/dist/{chunk-SAMTXC4A.js → chunk-TFEPHOVE.js} +12 -17
  53. package/dist/chunk-TFEPHOVE.js.map +1 -0
  54. package/dist/{chunk-QZZGIZWC.js → chunk-XSX3PGQW.js} +63 -20
  55. package/dist/chunk-XSX3PGQW.js.map +1 -0
  56. package/dist/{chunk-2MESXJEZ.js → chunk-YNRKPQLS.js} +3 -3
  57. package/dist/cli/setup/PreflightChecker.d.ts +1 -0
  58. package/dist/cli/setup/PreflightChecker.d.ts.map +1 -1
  59. package/dist/cli/setup/env-metadata.d.ts.map +1 -1
  60. package/dist/cli.js +10 -9
  61. package/dist/cli.js.map +1 -1
  62. package/dist/{config-WTRSZLOC.js → config-23TBYFP5.js} +5 -4
  63. package/dist/config-schema.d.ts +6 -0
  64. package/dist/config-schema.d.ts.map +1 -1
  65. package/dist/config.d.ts +6 -0
  66. package/dist/config.d.ts.map +1 -1
  67. package/dist/{doctor-37JNBGDN.js → doctor-ZG3DO7J5.js} +3 -3
  68. package/dist/errors/AIExecutionError.d.ts +3 -0
  69. package/dist/errors/AIExecutionError.d.ts.map +1 -1
  70. package/dist/{errors-S3BWYA4I.js → errors-J3ZRP66W.js} +2 -2
  71. package/dist/events/EventBus.d.ts +1 -1
  72. package/dist/events/EventBus.d.ts.map +1 -1
  73. package/dist/i18n/locales/en.d.ts.map +1 -1
  74. package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +16 -14
  77. package/dist/{init-QQDXGTPB.js → init-37DLQ5AJ.js} +9 -8
  78. package/dist/{init-QQDXGTPB.js.map → init-37DLQ5AJ.js.map} +1 -1
  79. package/dist/lib.js +10 -8
  80. package/dist/lib.js.map +1 -1
  81. package/dist/orchestrator/PendingDialogStore.d.ts +12 -0
  82. package/dist/orchestrator/PendingDialogStore.d.ts.map +1 -0
  83. package/dist/orchestrator/steps/FailureHandler.d.ts.map +1 -1
  84. package/dist/orchestrator/steps/PhaseLoopStep.d.ts.map +1 -1
  85. package/dist/persistence/PlanPersistence.d.ts +5 -0
  86. package/dist/persistence/PlanPersistence.d.ts.map +1 -1
  87. package/dist/persistence/TodolistExtractor.d.ts +31 -0
  88. package/dist/persistence/TodolistExtractor.d.ts.map +1 -0
  89. package/dist/phases/BasePhase.d.ts.map +1 -1
  90. package/dist/phases/PhaseOutcome.d.ts +2 -0
  91. package/dist/phases/PhaseOutcome.d.ts.map +1 -1
  92. package/dist/phases/PlanPhase.d.ts.map +1 -1
  93. package/dist/prompts/templates.d.ts +2 -2
  94. package/dist/prompts/templates.d.ts.map +1 -1
  95. package/dist/{restart-BMILTP5X.js → restart-C7QBXT44.js} +9 -8
  96. package/dist/{restart-BMILTP5X.js.map → restart-C7QBXT44.js.map} +1 -1
  97. package/dist/run.js +16 -14
  98. package/dist/run.js.map +1 -1
  99. package/dist/start-66JO56AW.js +16 -0
  100. package/dist/start-66JO56AW.js.map +1 -0
  101. package/dist/tracker/IssueTracker.d.ts +6 -0
  102. package/dist/tracker/IssueTracker.d.ts.map +1 -1
  103. package/dist/web/routes/api.d.ts.map +1 -1
  104. package/package.json +5 -1
  105. package/src/web/frontend/dist/assets/index-DJzC2saL.css +1 -0
  106. package/src/web/frontend/dist/assets/{index-D_oTMuJU.js → index-Mnu8M3ww.js} +57 -57
  107. package/src/web/frontend/dist/index.html +2 -2
  108. package/dist/PtyRunner-6UGI5STW.js +0 -22
  109. package/dist/chunk-2YQHKXLL.js.map +0 -1
  110. package/dist/chunk-AVGZH64A.js.map +0 -1
  111. package/dist/chunk-IP3QTP5A.js.map +0 -1
  112. package/dist/chunk-NZHKAPU6.js.map +0 -1
  113. package/dist/chunk-O3WEV5W3.js.map +0 -1
  114. package/dist/chunk-QZZGIZWC.js.map +0 -1
  115. package/dist/chunk-SAMTXC4A.js.map +0 -1
  116. package/dist/chunk-U237JSLB.js +0 -1
  117. package/dist/chunk-U6GWFTKA.js +0 -657
  118. package/dist/chunk-U6GWFTKA.js.map +0 -1
  119. package/dist/chunk-YCYVNRLF.js.map +0 -1
  120. package/dist/start-6QRW6IJI.js +0 -15
  121. package/src/web/frontend/dist/assets/index-COYziOhv.css +0 -1
  122. /package/dist/{AIRunnerRegistry-II3WWSFN.js.map → AIRunnerRegistry-CFDNWSXC.js.map} +0 -0
  123. /package/dist/{LockNote-Z2CLDZNN.js.map → LockNote-W2JNVMW7.js.map} +0 -0
  124. /package/dist/{PtyRunner-6UGI5STW.js.map → PtyRunner-NYASBTRP.js.map} +0 -0
  125. /package/dist/{ai-runner-HLA44WI6.js.map → SdkRunner-U2OTOMZU.js.map} +0 -0
  126. /package/dist/{chunk-U237JSLB.js.map → ai-runner-TOHVJJ76.js.map} +0 -0
  127. /package/dist/{chunk-UBQLXQ7I.js.map → chunk-5JBADEKR.js.map} +0 -0
  128. /package/dist/{chunk-HDFNMVRQ.js.map → chunk-DVNAH2GV.js.map} +0 -0
  129. /package/dist/{chunk-GXFG4JU6.js.map → chunk-EU4XFZ2T.js.map} +0 -0
  130. /package/dist/{config-WTRSZLOC.js.map → chunk-MSL7ROVK.js.map} +0 -0
  131. /package/dist/{chunk-2MESXJEZ.js.map → chunk-YNRKPQLS.js.map} +0 -0
  132. /package/dist/{errors-S3BWYA4I.js.map → config-23TBYFP5.js.map} +0 -0
  133. /package/dist/{doctor-37JNBGDN.js.map → doctor-ZG3DO7J5.js.map} +0 -0
  134. /package/dist/{start-6QRW6IJI.js.map → errors-J3ZRP66W.js.map} +0 -0
package/dist/lib.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/e2e/E2EBrowserRunner.ts","../src/e2e/E2EScriptRunner.ts","../src/e2e/E2ETestHelper.ts"],"sourcesContent":["import { spawn, type ChildProcess } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { setTimeout as sleep } from 'node:timers/promises';\nimport { logger } from '../logger.js';\nimport type { E2eConfig } from '../config.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nexport interface BrowserRunnerOptions {\n pythonBin?: string;\n projectRoot?: string;\n configFile?: string;\n headless?: boolean;\n baseUrl?: string;\n storageState?: string;\n outputDir?: string;\n timeout?: number;\n}\n\nexport interface ReplCommand {\n cmd: string;\n [key: string]: unknown;\n}\n\nexport interface ReplResponse {\n ok: boolean;\n data?: unknown;\n error?: string;\n}\n\nexport interface PageMeta {\n url: string;\n title: string;\n ready_state: string;\n}\n\nexport interface StepResult {\n path: string | null;\n label: string;\n}\n\nexport interface ScreenshotResult {\n path?: string;\n base64?: string;\n size: number;\n}\n\n/**\n * TypeScript wrapper around the Python Playwright REPL from oa_pc_uat.\n *\n * Spawns a Python process in interactive REPL mode and communicates via\n * the file-polling protocol (cmd.jsonl / resp.jsonl). This enables\n * issue-auto-finish E2E tests to drive a real browser for verifying\n * web UI changes end-to-end.\n */\nexport class E2EBrowserRunner {\n private proc: ChildProcess | null = null;\n private sessionId: string | null = null;\n private sockDir: string | null = null;\n private cmdFile: string | null = null;\n private respFile: string | null = null;\n private respLinesSeen = 0;\n private readonly options: Required<BrowserRunnerOptions>;\n\n constructor(\n private readonly e2eConfig: E2eConfig,\n opts: BrowserRunnerOptions = {},\n ) {\n const vendorRoot = opts.projectRoot\n ?? path.resolve(__dirname, '../../vendor/oa_pc_uat');\n\n this.options = {\n pythonBin: opts.pythonBin ?? this.e2eConfig.pythonBin ?? 'python3',\n projectRoot: vendorRoot,\n configFile: opts.configFile ?? '',\n headless: opts.headless ?? true,\n baseUrl: opts.baseUrl ?? e2eConfig.baseUrl,\n storageState: opts.storageState ?? '',\n outputDir: opts.outputDir ?? path.join(vendorRoot, 'outputs'),\n timeout: opts.timeout ?? 60_000,\n };\n }\n\n async start(): Promise<void> {\n const args = [\n 'main.py',\n '--headless',\n '-i',\n '--reuse-session',\n '--url', this.options.baseUrl,\n ];\n\n if (this.options.configFile) {\n args.push('--config', this.options.configFile);\n }\n if (this.options.storageState) {\n args.push('--storage-state', this.options.storageState);\n }\n if (this.options.outputDir) {\n args.push('--output-dir', this.options.outputDir);\n }\n\n logger.info('Starting E2E browser REPL', {\n cwd: this.options.projectRoot,\n args: [this.options.pythonBin, ...args],\n });\n\n this.proc = spawn(this.options.pythonBin, args, {\n cwd: this.options.projectRoot,\n stdio: ['pipe', 'pipe', 'pipe'],\n env: {\n ...process.env,\n PYTHONUNBUFFERED: '1',\n },\n });\n\n let stderr = '';\n this.proc.stderr?.on('data', (chunk) => {\n stderr += chunk.toString();\n });\n\n const readyInfo = await this.waitForReady(stderr);\n this.sessionId = readyInfo.session_id;\n this.sockDir = readyInfo.sock_dir;\n this.cmdFile = path.join(this.sockDir, 'cmd.jsonl');\n this.respFile = path.join(this.sockDir, 'resp.jsonl');\n this.respLinesSeen = 1; // skip the __ready__ line in resp.jsonl\n\n logger.info('E2E browser REPL started', {\n sessionId: this.sessionId,\n sockDir: this.sockDir,\n url: readyInfo.url,\n });\n }\n\n async stop(): Promise<void> {\n if (!this.proc) return;\n\n try {\n await this.send({ cmd: 'quit' });\n } catch {\n // ignore errors during quit\n }\n\n await sleep(500);\n\n if (this.proc.exitCode === null) {\n this.proc.kill('SIGTERM');\n await sleep(1000);\n if (this.proc.exitCode === null) {\n this.proc.kill('SIGKILL');\n }\n }\n\n this.proc = null;\n this.sessionId = null;\n this.sockDir = null;\n logger.info('E2E browser REPL stopped');\n }\n\n async send(command: ReplCommand): Promise<ReplResponse> {\n if (!this.cmdFile || !this.respFile) {\n throw new Error('REPL not started — call start() first');\n }\n\n const line = JSON.stringify(command) + '\\n';\n fs.appendFileSync(this.cmdFile, line, 'utf-8');\n\n const deadline = Date.now() + this.options.timeout;\n while (Date.now() < deadline) {\n const content = fs.readFileSync(this.respFile, 'utf-8');\n const lines = content.split('\\n').filter(Boolean);\n\n if (lines.length > this.respLinesSeen) {\n const newLine = lines[this.respLinesSeen]!;\n this.respLinesSeen = lines.length;\n return JSON.parse(newLine) as ReplResponse;\n }\n\n await sleep(100);\n }\n\n throw new Error(`REPL command timed out after ${this.options.timeout}ms: ${command.cmd}`);\n }\n\n // -- High-level helpers -----------------------------------------------\n\n async goto(url: string, waitUntil = 'domcontentloaded'): Promise<PageMeta> {\n const resp = await this.send({ cmd: 'goto', url, wait_until: waitUntil });\n this.assertOk(resp);\n return resp.data as PageMeta;\n }\n\n async navigate(url: string): Promise<PageMeta> {\n const resp = await this.send({ cmd: 'navigate', url });\n this.assertOk(resp);\n return resp.data as PageMeta;\n }\n\n async click(selector: string, timeout = 5000): Promise<void> {\n const resp = await this.send({ cmd: 'click', selector, timeout });\n this.assertOk(resp);\n }\n\n async fill(selector: string, value: string, timeout = 5000): Promise<void> {\n const resp = await this.send({ cmd: 'fill', selector, value, timeout });\n this.assertOk(resp);\n }\n\n async type(selector: string, text: string, delay = 50): Promise<void> {\n const resp = await this.send({ cmd: 'type', selector, text, delay });\n this.assertOk(resp);\n }\n\n async press(key: string, selector?: string): Promise<void> {\n const resp = await this.send({ cmd: 'press', key, selector });\n this.assertOk(resp);\n }\n\n async hover(selector: string): Promise<void> {\n const resp = await this.send({ cmd: 'hover', selector });\n this.assertOk(resp);\n }\n\n async select(selector: string, value: string | string[]): Promise<void> {\n const resp = await this.send({ cmd: 'select', selector, value });\n this.assertOk(resp);\n }\n\n async waitFor(selector: string, state = 'visible', timeout = 10000): Promise<void> {\n const resp = await this.send({ cmd: 'wait_for', selector, state, timeout });\n this.assertOk(resp);\n }\n\n async waitForUrl(url: string, timeout = 15000): Promise<string> {\n const resp = await this.send({ cmd: 'wait_for_url', url, timeout });\n this.assertOk(resp);\n return (resp.data as { current_url: string }).current_url;\n }\n\n async waitIdle(timeout = 15000): Promise<void> {\n const resp = await this.send({ cmd: 'wait_idle', timeout });\n this.assertOk(resp);\n }\n\n async wait(ms: number): Promise<void> {\n const resp = await this.send({ cmd: 'wait', ms });\n this.assertOk(resp);\n }\n\n async screenshot(opts?: { fullPage?: boolean; selector?: string; encode?: boolean; name?: string }): Promise<ScreenshotResult> {\n const resp = await this.send({\n cmd: 'screenshot',\n full_page: opts?.fullPage ?? true,\n selector: opts?.selector,\n encode: opts?.encode ?? false,\n name: opts?.name,\n });\n this.assertOk(resp);\n return resp.data as ScreenshotResult;\n }\n\n async step(label: string): Promise<StepResult> {\n const resp = await this.send({ cmd: 'step', label });\n this.assertOk(resp);\n return resp.data as StepResult;\n }\n\n async meta(): Promise<PageMeta> {\n const resp = await this.send({ cmd: 'meta' });\n this.assertOk(resp);\n return resp.data as PageMeta;\n }\n\n async snapshot(include?: string[]): Promise<Record<string, unknown>> {\n const resp = await this.send({ cmd: 'snapshot', include });\n this.assertOk(resp);\n return resp.data as Record<string, unknown>;\n }\n\n async queryText(text: string, exact = false): Promise<unknown[]> {\n const resp = await this.send({ cmd: 'query_text', text, exact });\n this.assertOk(resp);\n return resp.data as unknown[];\n }\n\n async querySelector(selector: string, max = 50): Promise<unknown[]> {\n const resp = await this.send({ cmd: 'query', selector, max });\n this.assertOk(resp);\n return resp.data as unknown[];\n }\n\n async evaluate(expression: string, arg?: unknown): Promise<unknown> {\n const resp = await this.send({ cmd: 'evaluate', expression, arg });\n this.assertOk(resp);\n return resp.data;\n }\n\n async text(selector = 'body', maxLength = 20000): Promise<string> {\n const resp = await this.send({ cmd: 'text', selector, max_length: maxLength });\n this.assertOk(resp);\n return (resp.data as { text: string }).text;\n }\n\n async html(selector?: string, maxLength = 50000): Promise<string> {\n const resp = await this.send({ cmd: 'html', selector, max_length: maxLength });\n this.assertOk(resp);\n return (resp.data as { html: string }).html;\n }\n\n async networkLog(opts?: { since?: number; type?: string; urlContains?: string; tail?: number }): Promise<{ count: number; entries: unknown[] }> {\n const resp = await this.send({\n cmd: 'network_log',\n since: opts?.since,\n type: opts?.type,\n url_contains: opts?.urlContains,\n tail: opts?.tail,\n });\n this.assertOk(resp);\n return resp.data as { count: number; entries: unknown[] };\n }\n\n async consoleLog(opts?: { since?: number; type?: string; tail?: number }): Promise<{ count: number; entries: unknown[] }> {\n const resp = await this.send({\n cmd: 'console_log',\n since: opts?.since,\n type: opts?.type,\n tail: opts?.tail,\n });\n this.assertOk(resp);\n return resp.data as { count: number; entries: unknown[] };\n }\n\n async requestPairs(opts?: { urlContains?: string; method?: string; statusMin?: number; statusMax?: number }): Promise<{ count: number; entries: unknown[] }> {\n const resp = await this.send({\n cmd: 'request_pairs',\n url_contains: opts?.urlContains,\n method: opts?.method,\n status_min: opts?.statusMin,\n status_max: opts?.statusMax,\n });\n this.assertOk(resp);\n return resp.data as { count: number; entries: unknown[] };\n }\n\n async clearLogs(): Promise<void> {\n const resp = await this.send({ cmd: 'clear_logs' });\n this.assertOk(resp);\n }\n\n get isRunning(): boolean {\n return this.proc !== null && this.proc.exitCode === null;\n }\n\n // -- Private ----------------------------------------------------------\n\n private assertOk(resp: ReplResponse): void {\n if (!resp.ok) {\n throw new Error(`REPL error: ${resp.error}`);\n }\n }\n\n private async waitForReady(stderr: string): Promise<{\n session_id: string;\n sock_dir: string;\n url: string;\n }> {\n if (!this.proc?.stdout) {\n throw new Error('REPL process has no stdout');\n }\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(\n `REPL did not become ready within ${this.options.timeout}ms.\\nStderr: ${stderr}`,\n ));\n }, this.options.timeout);\n\n let buffer = '';\n const onData = (chunk: Buffer) => {\n buffer += chunk.toString();\n const lines = buffer.split('\\n');\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const msg = JSON.parse(line);\n if (msg.__ready__) {\n clearTimeout(timeout);\n this.proc!.stdout!.off('data', onData);\n resolve({\n session_id: msg.session_id,\n sock_dir: msg.sock_dir,\n url: msg.url,\n });\n return;\n }\n } catch {\n // not JSON yet, keep buffering\n }\n }\n };\n\n this.proc!.stdout!.on('data', onData);\n this.proc!.on('error', (err) => {\n clearTimeout(timeout);\n reject(new Error(`REPL process error: ${err.message}`));\n });\n this.proc!.on('exit', (code) => {\n clearTimeout(timeout);\n reject(new Error(`REPL process exited prematurely (code ${code}).\\nStderr: ${stderr}`));\n });\n });\n }\n}\n","import { spawn } from 'node:child_process';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { logger } from '../logger.js';\nimport type { E2eConfig } from '../config.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nexport interface ScriptRunResult {\n success: boolean;\n exitCode: number;\n stdout: string;\n stderr: string;\n outputDir?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface ScriptRunnerOptions {\n pythonBin?: string;\n projectRoot?: string;\n configFile?: string;\n timeoutMs?: number;\n env?: Record<string, string>;\n}\n\n/**\n * Run a Python UAT script (non-interactive) and collect results.\n *\n * Executes `python3 main.py --script <script> --headless` from oa_pc_uat.\n * Suitable for batch E2E verification where each script performs a series\n * of page operations, captures screenshots/logs, then exits.\n */\nexport class E2EScriptRunner {\n private readonly opts: Required<ScriptRunnerOptions>;\n\n constructor(\n private readonly e2eConfig: E2eConfig,\n options: ScriptRunnerOptions = {},\n ) {\n const vendorRoot = options.projectRoot\n ?? path.resolve(__dirname, '../../vendor/oa_pc_uat');\n\n this.opts = {\n pythonBin: options.pythonBin ?? this.e2eConfig.pythonBin ?? 'python3',\n projectRoot: vendorRoot,\n configFile: options.configFile ?? '',\n timeoutMs: options.timeoutMs ?? 300_000,\n env: options.env ?? {},\n };\n }\n\n async runScript(\n scriptPath: string,\n runOpts?: {\n baseUrl?: string;\n outputPath?: string;\n storageState?: string;\n extraArgs?: string[];\n },\n ): Promise<ScriptRunResult> {\n const args = [\n 'main.py',\n '--headless',\n '--reuse-session',\n '--script', scriptPath,\n '--url', runOpts?.baseUrl ?? this.e2eConfig.baseUrl,\n ];\n\n if (this.opts.configFile) {\n args.push('--config', this.opts.configFile);\n }\n if (runOpts?.outputPath) {\n args.push('--output-path', runOpts.outputPath);\n }\n if (runOpts?.storageState) {\n args.push('--storage-state', runOpts.storageState);\n }\n if (runOpts?.extraArgs) {\n args.push(...runOpts.extraArgs);\n }\n\n logger.info('Running E2E script', {\n script: scriptPath,\n cwd: this.opts.projectRoot,\n });\n\n return new Promise<ScriptRunResult>((resolve, reject) => {\n const proc = spawn(this.opts.pythonBin, args, {\n cwd: this.opts.projectRoot,\n env: {\n ...process.env,\n PYTHONUNBUFFERED: '1',\n ...this.opts.env,\n },\n timeout: this.opts.timeoutMs,\n });\n\n let stdout = '';\n let stderr = '';\n\n proc.stdout?.on('data', (chunk) => { stdout += chunk.toString(); });\n proc.stderr?.on('data', (chunk) => { stderr += chunk.toString(); });\n\n proc.on('error', (err) => {\n reject(new Error(`E2E script process error: ${err.message}`));\n });\n\n proc.on('close', (code) => {\n let metadata: Record<string, unknown> | undefined;\n try {\n metadata = JSON.parse(stdout.trim());\n } catch {\n // stdout may not be valid JSON\n }\n\n const exitCode = code ?? 1;\n resolve({\n success: exitCode === 0,\n exitCode,\n stdout,\n stderr,\n outputDir: metadata?.output_dir as string | undefined,\n metadata,\n });\n });\n });\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { E2EBrowserRunner, type BrowserRunnerOptions } from './E2EBrowserRunner.js';\nimport { E2EScriptRunner, type ScriptRunnerOptions } from './E2EScriptRunner.js';\nimport type { E2eConfig } from '../config.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nexport interface E2ETestContext {\n browser: E2EBrowserRunner;\n scriptRunner: E2EScriptRunner;\n outputDir: string;\n cleanup: () => Promise<void>;\n}\n\n/**\n * Bootstrap an E2E test context with browser runner, script runner,\n * and temporary output directory. Call `cleanup()` in afterAll/afterEach.\n */\nexport async function createE2ETestContext(\n e2eConfig: E2eConfig,\n opts?: {\n browser?: BrowserRunnerOptions;\n script?: ScriptRunnerOptions;\n outputDir?: string;\n },\n): Promise<E2ETestContext> {\n const outputDir = opts?.outputDir\n ?? fs.mkdtempSync(path.join(process.env.TMPDIR ?? '/tmp', 'iaf-e2e-'));\n\n const browser = new E2EBrowserRunner(e2eConfig, {\n ...opts?.browser,\n outputDir,\n });\n\n const scriptRunner = new E2EScriptRunner(e2eConfig, opts?.script);\n\n return {\n browser,\n scriptRunner,\n outputDir,\n cleanup: async () => {\n if (browser.isRunning) {\n await browser.stop();\n }\n try {\n fs.rmSync(outputDir, { recursive: true, force: true });\n } catch {\n // ignore\n }\n },\n };\n}\n\n/**\n * Resolve the vendor oa_pc_uat root directory.\n * Checks both the submodule path and common fallback locations.\n */\nexport function resolveVendorRoot(fromDir?: string): string {\n const candidates = [\n path.resolve(fromDir ?? __dirname, '../../vendor/oa_pc_uat'),\n path.resolve(fromDir ?? process.cwd(), 'vendor/oa_pc_uat'),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(path.join(candidate, 'main.py'))) {\n return candidate;\n }\n }\n\n throw new Error(\n 'oa_pc_uat vendor directory not found. Run:\\n'\n + ' git submodule update --init vendor/oa_pc_uat\\n'\n + 'Or clone manually:\\n'\n + ' git clone git@git.woa.com:fishcui/oa_pc_uat.git vendor/oa_pc_uat',\n );\n}\n\n/**\n * Check that the Python environment for oa_pc_uat is properly set up.\n * Returns diagnostic info about missing dependencies.\n */\nexport async function checkE2EPrerequisites(\n vendorRoot: string,\n pythonBin = 'python3',\n): Promise<{\n ready: boolean;\n pythonAvailable: boolean;\n playwrightInstalled: boolean;\n chromiumInstalled: boolean;\n issues: string[];\n}> {\n const issues: string[] = [];\n let pythonAvailable = false;\n let playwrightInstalled = false;\n let chromiumInstalled = false;\n\n const { execFileSync } = await import('node:child_process');\n\n try {\n execFileSync(pythonBin, ['--version'], { encoding: 'utf-8' });\n pythonAvailable = true;\n } catch {\n issues.push(`${pythonBin} not found in PATH`);\n }\n\n if (pythonAvailable) {\n try {\n execFileSync(pythonBin, ['-c', 'import playwright'], {\n encoding: 'utf-8',\n cwd: vendorRoot,\n });\n playwrightInstalled = true;\n } catch {\n issues.push(`playwright not installed: run \\`${pythonBin} -m pip install -r vendor/oa_pc_uat/requirements.txt\\``);\n }\n }\n\n if (playwrightInstalled) {\n try {\n execFileSync(pythonBin, ['-c', 'from playwright.sync_api import sync_playwright; p = sync_playwright().start(); b = p.chromium; p.stop()'], {\n encoding: 'utf-8',\n cwd: vendorRoot,\n timeout: 10_000,\n });\n chromiumInstalled = true;\n } catch {\n issues.push(`Chromium not installed: run \\`${pythonBin} -m playwright install chromium\\``);\n }\n }\n\n return {\n ready: issues.length === 0,\n pythonAvailable,\n playwrightInstalled,\n chromiumInstalled,\n issues,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,aAAgC;AACzC,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAC9B,SAAS,cAAc,aAAa;AAIpC,IAAM,YAAY,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAiDtD,IAAM,mBAAN,MAAuB;AAAA,EAS5B,YACmB,WACjB,OAA6B,CAAC,GAC9B;AAFiB;AAGjB,UAAM,aAAa,KAAK,eACnB,KAAK,QAAQ,WAAW,wBAAwB;AAErD,SAAK,UAAU;AAAA,MACb,WAAW,KAAK,aAAa,KAAK,UAAU,aAAa;AAAA,MACzD,aAAa;AAAA,MACb,YAAY,KAAK,cAAc;AAAA,MAC/B,UAAU,KAAK,YAAY;AAAA,MAC3B,SAAS,KAAK,WAAW,UAAU;AAAA,MACnC,cAAc,KAAK,gBAAgB;AAAA,MACnC,WAAW,KAAK,aAAa,KAAK,KAAK,YAAY,SAAS;AAAA,MAC5D,SAAS,KAAK,WAAW;AAAA,IAC3B;AAAA,EACF;AAAA,EAzBQ,OAA4B;AAAA,EAC5B,YAA2B;AAAA,EAC3B,UAAyB;AAAA,EACzB,UAAyB;AAAA,EACzB,WAA0B;AAAA,EAC1B,gBAAgB;AAAA,EACP;AAAA,EAqBjB,MAAM,QAAuB;AAC3B,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAAS,KAAK,QAAQ;AAAA,IACxB;AAEA,QAAI,KAAK,QAAQ,YAAY;AAC3B,WAAK,KAAK,YAAY,KAAK,QAAQ,UAAU;AAAA,IAC/C;AACA,QAAI,KAAK,QAAQ,cAAc;AAC7B,WAAK,KAAK,mBAAmB,KAAK,QAAQ,YAAY;AAAA,IACxD;AACA,QAAI,KAAK,QAAQ,WAAW;AAC1B,WAAK,KAAK,gBAAgB,KAAK,QAAQ,SAAS;AAAA,IAClD;AAEA,WAAO,KAAK,6BAA6B;AAAA,MACvC,KAAK,KAAK,QAAQ;AAAA,MAClB,MAAM,CAAC,KAAK,QAAQ,WAAW,GAAG,IAAI;AAAA,IACxC,CAAC;AAED,SAAK,OAAO,MAAM,KAAK,QAAQ,WAAW,MAAM;AAAA,MAC9C,KAAK,KAAK,QAAQ;AAAA,MAClB,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,MAC9B,KAAK;AAAA,QACH,GAAG,QAAQ;AAAA,QACX,kBAAkB;AAAA,MACpB;AAAA,IACF,CAAC;AAED,QAAI,SAAS;AACb,SAAK,KAAK,QAAQ,GAAG,QAAQ,CAAC,UAAU;AACtC,gBAAU,MAAM,SAAS;AAAA,IAC3B,CAAC;AAED,UAAM,YAAY,MAAM,KAAK,aAAa,MAAM;AAChD,SAAK,YAAY,UAAU;AAC3B,SAAK,UAAU,UAAU;AACzB,SAAK,UAAU,KAAK,KAAK,KAAK,SAAS,WAAW;AAClD,SAAK,WAAW,KAAK,KAAK,KAAK,SAAS,YAAY;AACpD,SAAK,gBAAgB;AAErB,WAAO,KAAK,4BAA4B;AAAA,MACtC,WAAW,KAAK;AAAA,MAChB,SAAS,KAAK;AAAA,MACd,KAAK,UAAU;AAAA,IACjB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OAAsB;AAC1B,QAAI,CAAC,KAAK,KAAM;AAEhB,QAAI;AACF,YAAM,KAAK,KAAK,EAAE,KAAK,OAAO,CAAC;AAAA,IACjC,QAAQ;AAAA,IAER;AAEA,UAAM,MAAM,GAAG;AAEf,QAAI,KAAK,KAAK,aAAa,MAAM;AAC/B,WAAK,KAAK,KAAK,SAAS;AACxB,YAAM,MAAM,GAAI;AAChB,UAAI,KAAK,KAAK,aAAa,MAAM;AAC/B,aAAK,KAAK,KAAK,SAAS;AAAA,MAC1B;AAAA,IACF;AAEA,SAAK,OAAO;AACZ,SAAK,YAAY;AACjB,SAAK,UAAU;AACf,WAAO,KAAK,0BAA0B;AAAA,EACxC;AAAA,EAEA,MAAM,KAAK,SAA6C;AACtD,QAAI,CAAC,KAAK,WAAW,CAAC,KAAK,UAAU;AACnC,YAAM,IAAI,MAAM,4CAAuC;AAAA,IACzD;AAEA,UAAM,OAAO,KAAK,UAAU,OAAO,IAAI;AACvC,OAAG,eAAe,KAAK,SAAS,MAAM,OAAO;AAE7C,UAAM,WAAW,KAAK,IAAI,IAAI,KAAK,QAAQ;AAC3C,WAAO,KAAK,IAAI,IAAI,UAAU;AAC5B,YAAM,UAAU,GAAG,aAAa,KAAK,UAAU,OAAO;AACtD,YAAM,QAAQ,QAAQ,MAAM,IAAI,EAAE,OAAO,OAAO;AAEhD,UAAI,MAAM,SAAS,KAAK,eAAe;AACrC,cAAM,UAAU,MAAM,KAAK,aAAa;AACxC,aAAK,gBAAgB,MAAM;AAC3B,eAAO,KAAK,MAAM,OAAO;AAAA,MAC3B;AAEA,YAAM,MAAM,GAAG;AAAA,IACjB;AAEA,UAAM,IAAI,MAAM,gCAAgC,KAAK,QAAQ,OAAO,OAAO,QAAQ,GAAG,EAAE;AAAA,EAC1F;AAAA;AAAA,EAIA,MAAM,KAAK,KAAa,YAAY,oBAAuC;AACzE,UAAM,OAAO,MAAM,KAAK,KAAK,EAAE,KAAK,QAAQ,KAAK,YAAY,UAAU,CAAC;AACxE,SAAK,SAAS,IAAI;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,SAAS,KAAgC;AAC7C,UAAM,OAAO,MAAM,KAAK,KAAK,EAAE,KAAK,YAAY,IAAI,CAAC;AACrD,SAAK,SAAS,IAAI;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,MAAM,UAAkB,UAAU,KAAqB;AAC3D,UAAM,OAAO,MAAM,KAAK,KAAK,EAAE,KAAK,SAAS,UAAU,QAAQ,CAAC;AAChE,SAAK,SAAS,IAAI;AAAA,EACpB;AAAA,EAEA,MAAM,KAAK,UAAkB,OAAe,UAAU,KAAqB;AACzE,UAAM,OAAO,MAAM,KAAK,KAAK,EAAE,KAAK,QAAQ,UAAU,OAAO,QAAQ,CAAC;AACtE,SAAK,SAAS,IAAI;AAAA,EACpB;AAAA,EAEA,MAAM,KAAK,UAAkB,MAAc,QAAQ,IAAmB;AACpE,UAAM,OAAO,MAAM,KAAK,KAAK,EAAE,KAAK,QAAQ,UAAU,MAAM,MAAM,CAAC;AACnE,SAAK,SAAS,IAAI;AAAA,EACpB;AAAA,EAEA,MAAM,MAAM,KAAa,UAAkC;AACzD,UAAM,OAAO,MAAM,KAAK,KAAK,EAAE,KAAK,SAAS,KAAK,SAAS,CAAC;AAC5D,SAAK,SAAS,IAAI;AAAA,EACpB;AAAA,EAEA,MAAM,MAAM,UAAiC;AAC3C,UAAM,OAAO,MAAM,KAAK,KAAK,EAAE,KAAK,SAAS,SAAS,CAAC;AACvD,SAAK,SAAS,IAAI;AAAA,EACpB;AAAA,EAEA,MAAM,OAAO,UAAkB,OAAyC;AACtE,UAAM,OAAO,MAAM,KAAK,KAAK,EAAE,KAAK,UAAU,UAAU,MAAM,CAAC;AAC/D,SAAK,SAAS,IAAI;AAAA,EACpB;AAAA,EAEA,MAAM,QAAQ,UAAkB,QAAQ,WAAW,UAAU,KAAsB;AACjF,UAAM,OAAO,MAAM,KAAK,KAAK,EAAE,KAAK,YAAY,UAAU,OAAO,QAAQ,CAAC;AAC1E,SAAK,SAAS,IAAI;AAAA,EACpB;AAAA,EAEA,MAAM,WAAW,KAAa,UAAU,MAAwB;AAC9D,UAAM,OAAO,MAAM,KAAK,KAAK,EAAE,KAAK,gBAAgB,KAAK,QAAQ,CAAC;AAClE,SAAK,SAAS,IAAI;AAClB,WAAQ,KAAK,KAAiC;AAAA,EAChD;AAAA,EAEA,MAAM,SAAS,UAAU,MAAsB;AAC7C,UAAM,OAAO,MAAM,KAAK,KAAK,EAAE,KAAK,aAAa,QAAQ,CAAC;AAC1D,SAAK,SAAS,IAAI;AAAA,EACpB;AAAA,EAEA,MAAM,KAAK,IAA2B;AACpC,UAAM,OAAO,MAAM,KAAK,KAAK,EAAE,KAAK,QAAQ,GAAG,CAAC;AAChD,SAAK,SAAS,IAAI;AAAA,EACpB;AAAA,EAEA,MAAM,WAAW,MAA8G;AAC7H,UAAM,OAAO,MAAM,KAAK,KAAK;AAAA,MAC3B,KAAK;AAAA,MACL,WAAW,MAAM,YAAY;AAAA,MAC7B,UAAU,MAAM;AAAA,MAChB,QAAQ,MAAM,UAAU;AAAA,MACxB,MAAM,MAAM;AAAA,IACd,CAAC;AACD,SAAK,SAAS,IAAI;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,KAAK,OAAoC;AAC7C,UAAM,OAAO,MAAM,KAAK,KAAK,EAAE,KAAK,QAAQ,MAAM,CAAC;AACnD,SAAK,SAAS,IAAI;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,OAA0B;AAC9B,UAAM,OAAO,MAAM,KAAK,KAAK,EAAE,KAAK,OAAO,CAAC;AAC5C,SAAK,SAAS,IAAI;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,SAAS,SAAsD;AACnE,UAAM,OAAO,MAAM,KAAK,KAAK,EAAE,KAAK,YAAY,QAAQ,CAAC;AACzD,SAAK,SAAS,IAAI;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,UAAU,MAAc,QAAQ,OAA2B;AAC/D,UAAM,OAAO,MAAM,KAAK,KAAK,EAAE,KAAK,cAAc,MAAM,MAAM,CAAC;AAC/D,SAAK,SAAS,IAAI;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,cAAc,UAAkB,MAAM,IAAwB;AAClE,UAAM,OAAO,MAAM,KAAK,KAAK,EAAE,KAAK,SAAS,UAAU,IAAI,CAAC;AAC5D,SAAK,SAAS,IAAI;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,SAAS,YAAoB,KAAiC;AAClE,UAAM,OAAO,MAAM,KAAK,KAAK,EAAE,KAAK,YAAY,YAAY,IAAI,CAAC;AACjE,SAAK,SAAS,IAAI;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,KAAK,WAAW,QAAQ,YAAY,KAAwB;AAChE,UAAM,OAAO,MAAM,KAAK,KAAK,EAAE,KAAK,QAAQ,UAAU,YAAY,UAAU,CAAC;AAC7E,SAAK,SAAS,IAAI;AAClB,WAAQ,KAAK,KAA0B;AAAA,EACzC;AAAA,EAEA,MAAM,KAAK,UAAmB,YAAY,KAAwB;AAChE,UAAM,OAAO,MAAM,KAAK,KAAK,EAAE,KAAK,QAAQ,UAAU,YAAY,UAAU,CAAC;AAC7E,SAAK,SAAS,IAAI;AAClB,WAAQ,KAAK,KAA0B;AAAA,EACzC;AAAA,EAEA,MAAM,WAAW,MAA+H;AAC9I,UAAM,OAAO,MAAM,KAAK,KAAK;AAAA,MAC3B,KAAK;AAAA,MACL,OAAO,MAAM;AAAA,MACb,MAAM,MAAM;AAAA,MACZ,cAAc,MAAM;AAAA,MACpB,MAAM,MAAM;AAAA,IACd,CAAC;AACD,SAAK,SAAS,IAAI;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,WAAW,MAAyG;AACxH,UAAM,OAAO,MAAM,KAAK,KAAK;AAAA,MAC3B,KAAK;AAAA,MACL,OAAO,MAAM;AAAA,MACb,MAAM,MAAM;AAAA,MACZ,MAAM,MAAM;AAAA,IACd,CAAC;AACD,SAAK,SAAS,IAAI;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,aAAa,MAA0I;AAC3J,UAAM,OAAO,MAAM,KAAK,KAAK;AAAA,MAC3B,KAAK;AAAA,MACL,cAAc,MAAM;AAAA,MACpB,QAAQ,MAAM;AAAA,MACd,YAAY,MAAM;AAAA,MAClB,YAAY,MAAM;AAAA,IACpB,CAAC;AACD,SAAK,SAAS,IAAI;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,YAA2B;AAC/B,UAAM,OAAO,MAAM,KAAK,KAAK,EAAE,KAAK,aAAa,CAAC;AAClD,SAAK,SAAS,IAAI;AAAA,EACpB;AAAA,EAEA,IAAI,YAAqB;AACvB,WAAO,KAAK,SAAS,QAAQ,KAAK,KAAK,aAAa;AAAA,EACtD;AAAA;AAAA,EAIQ,SAAS,MAA0B;AACzC,QAAI,CAAC,KAAK,IAAI;AACZ,YAAM,IAAI,MAAM,eAAe,KAAK,KAAK,EAAE;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,MAAc,aAAa,QAIxB;AACD,QAAI,CAAC,KAAK,MAAM,QAAQ;AACtB,YAAM,IAAI,MAAM,4BAA4B;AAAA,IAC9C;AAEA,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,YAAM,UAAU,WAAW,MAAM;AAC/B,eAAO,IAAI;AAAA,UACT,oCAAoC,KAAK,QAAQ,OAAO;AAAA,UAAgB,MAAM;AAAA,QAChF,CAAC;AAAA,MACH,GAAG,KAAK,QAAQ,OAAO;AAEvB,UAAI,SAAS;AACb,YAAM,SAAS,CAAC,UAAkB;AAChC,kBAAU,MAAM,SAAS;AACzB,cAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,mBAAW,QAAQ,OAAO;AACxB,cAAI,CAAC,KAAK,KAAK,EAAG;AAClB,cAAI;AACF,kBAAM,MAAM,KAAK,MAAM,IAAI;AAC3B,gBAAI,IAAI,WAAW;AACjB,2BAAa,OAAO;AACpB,mBAAK,KAAM,OAAQ,IAAI,QAAQ,MAAM;AACrC,sBAAQ;AAAA,gBACN,YAAY,IAAI;AAAA,gBAChB,UAAU,IAAI;AAAA,gBACd,KAAK,IAAI;AAAA,cACX,CAAC;AACD;AAAA,YACF;AAAA,UACF,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAEA,WAAK,KAAM,OAAQ,GAAG,QAAQ,MAAM;AACpC,WAAK,KAAM,GAAG,SAAS,CAAC,QAAQ;AAC9B,qBAAa,OAAO;AACpB,eAAO,IAAI,MAAM,uBAAuB,IAAI,OAAO,EAAE,CAAC;AAAA,MACxD,CAAC;AACD,WAAK,KAAM,GAAG,QAAQ,CAAC,SAAS;AAC9B,qBAAa,OAAO;AACpB,eAAO,IAAI,MAAM,yCAAyC,IAAI;AAAA,UAAe,MAAM,EAAE,CAAC;AAAA,MACxF,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;;;AC/ZA,SAAS,SAAAA,cAAa;AACtB,OAAOC,WAAU;AACjB,SAAS,iBAAAC,sBAAqB;AAI9B,IAAMC,aAAYC,MAAK,QAAQC,eAAc,YAAY,GAAG,CAAC;AA0BtD,IAAM,kBAAN,MAAsB;AAAA,EAG3B,YACmB,WACjB,UAA+B,CAAC,GAChC;AAFiB;AAGjB,UAAM,aAAa,QAAQ,eACtBD,MAAK,QAAQD,YAAW,wBAAwB;AAErD,SAAK,OAAO;AAAA,MACV,WAAW,QAAQ,aAAa,KAAK,UAAU,aAAa;AAAA,MAC5D,aAAa;AAAA,MACb,YAAY,QAAQ,cAAc;AAAA,MAClC,WAAW,QAAQ,aAAa;AAAA,MAChC,KAAK,QAAQ,OAAO,CAAC;AAAA,IACvB;AAAA,EACF;AAAA,EAhBiB;AAAA,EAkBjB,MAAM,UACJ,YACA,SAM0B;AAC1B,UAAM,OAAO;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAAY;AAAA,MACZ;AAAA,MAAS,SAAS,WAAW,KAAK,UAAU;AAAA,IAC9C;AAEA,QAAI,KAAK,KAAK,YAAY;AACxB,WAAK,KAAK,YAAY,KAAK,KAAK,UAAU;AAAA,IAC5C;AACA,QAAI,SAAS,YAAY;AACvB,WAAK,KAAK,iBAAiB,QAAQ,UAAU;AAAA,IAC/C;AACA,QAAI,SAAS,cAAc;AACzB,WAAK,KAAK,mBAAmB,QAAQ,YAAY;AAAA,IACnD;AACA,QAAI,SAAS,WAAW;AACtB,WAAK,KAAK,GAAG,QAAQ,SAAS;AAAA,IAChC;AAEA,WAAO,KAAK,sBAAsB;AAAA,MAChC,QAAQ;AAAA,MACR,KAAK,KAAK,KAAK;AAAA,IACjB,CAAC;AAED,WAAO,IAAI,QAAyB,CAAC,SAAS,WAAW;AACvD,YAAM,OAAOG,OAAM,KAAK,KAAK,WAAW,MAAM;AAAA,QAC5C,KAAK,KAAK,KAAK;AAAA,QACf,KAAK;AAAA,UACH,GAAG,QAAQ;AAAA,UACX,kBAAkB;AAAA,UAClB,GAAG,KAAK,KAAK;AAAA,QACf;AAAA,QACA,SAAS,KAAK,KAAK;AAAA,MACrB,CAAC;AAED,UAAI,SAAS;AACb,UAAI,SAAS;AAEb,WAAK,QAAQ,GAAG,QAAQ,CAAC,UAAU;AAAE,kBAAU,MAAM,SAAS;AAAA,MAAG,CAAC;AAClE,WAAK,QAAQ,GAAG,QAAQ,CAAC,UAAU;AAAE,kBAAU,MAAM,SAAS;AAAA,MAAG,CAAC;AAElE,WAAK,GAAG,SAAS,CAAC,QAAQ;AACxB,eAAO,IAAI,MAAM,6BAA6B,IAAI,OAAO,EAAE,CAAC;AAAA,MAC9D,CAAC;AAED,WAAK,GAAG,SAAS,CAAC,SAAS;AACzB,YAAI;AACJ,YAAI;AACF,qBAAW,KAAK,MAAM,OAAO,KAAK,CAAC;AAAA,QACrC,QAAQ;AAAA,QAER;AAEA,cAAM,WAAW,QAAQ;AACzB,gBAAQ;AAAA,UACN,SAAS,aAAa;AAAA,UACtB;AAAA,UACA;AAAA,UACA;AAAA,UACA,WAAW,UAAU;AAAA,UACrB;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AACF;;;AC/HA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AACjB,SAAS,iBAAAC,sBAAqB;AAK9B,IAAMC,aAAYC,MAAK,QAAQC,eAAc,YAAY,GAAG,CAAC;AAa7D,eAAsB,qBACpB,WACA,MAKyB;AACzB,QAAM,YAAY,MAAM,aACnBC,IAAG,YAAYF,MAAK,KAAK,QAAQ,IAAI,UAAU,QAAQ,UAAU,CAAC;AAEvE,QAAM,UAAU,IAAI,iBAAiB,WAAW;AAAA,IAC9C,GAAG,MAAM;AAAA,IACT;AAAA,EACF,CAAC;AAED,QAAM,eAAe,IAAI,gBAAgB,WAAW,MAAM,MAAM;AAEhE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,YAAY;AACnB,UAAI,QAAQ,WAAW;AACrB,cAAM,QAAQ,KAAK;AAAA,MACrB;AACA,UAAI;AACF,QAAAE,IAAG,OAAO,WAAW,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,MACvD,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACF;AAMO,SAAS,kBAAkB,SAA0B;AAC1D,QAAM,aAAa;AAAA,IACjBF,MAAK,QAAQ,WAAWD,YAAW,wBAAwB;AAAA,IAC3DC,MAAK,QAAQ,WAAW,QAAQ,IAAI,GAAG,kBAAkB;AAAA,EAC3D;AAEA,aAAW,aAAa,YAAY;AAClC,QAAIE,IAAG,WAAWF,MAAK,KAAK,WAAW,SAAS,CAAC,GAAG;AAClD,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,IAAI;AAAA,IACR;AAAA,EAIF;AACF;AAMA,eAAsB,sBACpB,YACA,YAAY,WAOX;AACD,QAAM,SAAmB,CAAC;AAC1B,MAAI,kBAAkB;AACtB,MAAI,sBAAsB;AAC1B,MAAI,oBAAoB;AAExB,QAAM,EAAE,aAAa,IAAI,MAAM,OAAO,eAAoB;AAE1D,MAAI;AACF,iBAAa,WAAW,CAAC,WAAW,GAAG,EAAE,UAAU,QAAQ,CAAC;AAC5D,sBAAkB;AAAA,EACpB,QAAQ;AACN,WAAO,KAAK,GAAG,SAAS,oBAAoB;AAAA,EAC9C;AAEA,MAAI,iBAAiB;AACnB,QAAI;AACF,mBAAa,WAAW,CAAC,MAAM,mBAAmB,GAAG;AAAA,QACnD,UAAU;AAAA,QACV,KAAK;AAAA,MACP,CAAC;AACD,4BAAsB;AAAA,IACxB,QAAQ;AACN,aAAO,KAAK,mCAAmC,SAAS,wDAAwD;AAAA,IAClH;AAAA,EACF;AAEA,MAAI,qBAAqB;AACvB,QAAI;AACF,mBAAa,WAAW,CAAC,MAAM,0GAA0G,GAAG;AAAA,QAC1I,UAAU;AAAA,QACV,KAAK;AAAA,QACL,SAAS;AAAA,MACX,CAAC;AACD,0BAAoB;AAAA,IACtB,QAAQ;AACN,aAAO,KAAK,iCAAiC,SAAS,mCAAmC;AAAA,IAC3F;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","names":["spawn","path","fileURLToPath","__dirname","path","fileURLToPath","spawn","fs","path","fileURLToPath","__dirname","path","fileURLToPath","fs"]}
1
+ {"version":3,"sources":["../src/e2e/E2EBrowserRunner.ts","../src/e2e/E2EScriptRunner.ts","../src/e2e/E2ETestHelper.ts"],"sourcesContent":["import { spawn, type ChildProcess } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { setTimeout as sleep } from 'node:timers/promises';\nimport { logger } from '../logger.js';\nimport type { E2eConfig } from '../config.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nexport interface BrowserRunnerOptions {\n pythonBin?: string;\n projectRoot?: string;\n configFile?: string;\n headless?: boolean;\n baseUrl?: string;\n storageState?: string;\n outputDir?: string;\n timeout?: number;\n}\n\nexport interface ReplCommand {\n cmd: string;\n [key: string]: unknown;\n}\n\nexport interface ReplResponse {\n ok: boolean;\n data?: unknown;\n error?: string;\n}\n\nexport interface PageMeta {\n url: string;\n title: string;\n ready_state: string;\n}\n\nexport interface StepResult {\n path: string | null;\n label: string;\n}\n\nexport interface ScreenshotResult {\n path?: string;\n base64?: string;\n size: number;\n}\n\n/**\n * TypeScript wrapper around the Python Playwright REPL from oa_pc_uat.\n *\n * Spawns a Python process in interactive REPL mode and communicates via\n * the file-polling protocol (cmd.jsonl / resp.jsonl). This enables\n * issue-auto-finish E2E tests to drive a real browser for verifying\n * web UI changes end-to-end.\n */\nexport class E2EBrowserRunner {\n private proc: ChildProcess | null = null;\n private sessionId: string | null = null;\n private sockDir: string | null = null;\n private cmdFile: string | null = null;\n private respFile: string | null = null;\n private respLinesSeen = 0;\n private readonly options: Required<BrowserRunnerOptions>;\n\n constructor(\n private readonly e2eConfig: E2eConfig,\n opts: BrowserRunnerOptions = {},\n ) {\n const vendorRoot = opts.projectRoot\n ?? path.resolve(__dirname, '../../vendor/oa_pc_uat');\n\n this.options = {\n pythonBin: opts.pythonBin ?? this.e2eConfig.pythonBin ?? 'python3',\n projectRoot: vendorRoot,\n configFile: opts.configFile ?? '',\n headless: opts.headless ?? true,\n baseUrl: opts.baseUrl ?? e2eConfig.baseUrl,\n storageState: opts.storageState ?? '',\n outputDir: opts.outputDir ?? path.join(vendorRoot, 'outputs'),\n timeout: opts.timeout ?? 60_000,\n };\n }\n\n async start(): Promise<void> {\n const args = [\n 'main.py',\n '--headless',\n '-i',\n '--reuse-session',\n '--url', this.options.baseUrl,\n ];\n\n if (this.options.configFile) {\n args.push('--config', this.options.configFile);\n }\n if (this.options.storageState) {\n args.push('--storage-state', this.options.storageState);\n }\n if (this.options.outputDir) {\n args.push('--output-dir', this.options.outputDir);\n }\n\n logger.info('Starting E2E browser REPL', {\n cwd: this.options.projectRoot,\n args: [this.options.pythonBin, ...args],\n });\n\n this.proc = spawn(this.options.pythonBin, args, {\n cwd: this.options.projectRoot,\n stdio: ['pipe', 'pipe', 'pipe'],\n env: {\n ...process.env,\n PYTHONUNBUFFERED: '1',\n },\n });\n\n let stderr = '';\n this.proc.stderr?.on('data', (chunk) => {\n stderr += chunk.toString();\n });\n\n const readyInfo = await this.waitForReady(stderr);\n this.sessionId = readyInfo.session_id;\n this.sockDir = readyInfo.sock_dir;\n this.cmdFile = path.join(this.sockDir, 'cmd.jsonl');\n this.respFile = path.join(this.sockDir, 'resp.jsonl');\n this.respLinesSeen = 1; // skip the __ready__ line in resp.jsonl\n\n logger.info('E2E browser REPL started', {\n sessionId: this.sessionId,\n sockDir: this.sockDir,\n url: readyInfo.url,\n });\n }\n\n async stop(): Promise<void> {\n if (!this.proc) return;\n\n try {\n await this.send({ cmd: 'quit' });\n } catch {\n // ignore errors during quit\n }\n\n await sleep(500);\n\n if (this.proc.exitCode === null) {\n this.proc.kill('SIGTERM');\n await sleep(1000);\n if (this.proc.exitCode === null) {\n this.proc.kill('SIGKILL');\n }\n }\n\n this.proc = null;\n this.sessionId = null;\n this.sockDir = null;\n logger.info('E2E browser REPL stopped');\n }\n\n async send(command: ReplCommand): Promise<ReplResponse> {\n if (!this.cmdFile || !this.respFile) {\n throw new Error('REPL not started — call start() first');\n }\n\n const line = JSON.stringify(command) + '\\n';\n fs.appendFileSync(this.cmdFile, line, 'utf-8');\n\n const deadline = Date.now() + this.options.timeout;\n while (Date.now() < deadline) {\n const content = fs.readFileSync(this.respFile, 'utf-8');\n const lines = content.split('\\n').filter(Boolean);\n\n if (lines.length > this.respLinesSeen) {\n const newLine = lines[this.respLinesSeen]!;\n this.respLinesSeen = lines.length;\n return JSON.parse(newLine) as ReplResponse;\n }\n\n await sleep(100);\n }\n\n throw new Error(`REPL command timed out after ${this.options.timeout}ms: ${command.cmd}`);\n }\n\n // -- High-level helpers -----------------------------------------------\n\n async goto(url: string, waitUntil = 'domcontentloaded'): Promise<PageMeta> {\n const resp = await this.send({ cmd: 'goto', url, wait_until: waitUntil });\n this.assertOk(resp);\n return resp.data as PageMeta;\n }\n\n async navigate(url: string): Promise<PageMeta> {\n const resp = await this.send({ cmd: 'navigate', url });\n this.assertOk(resp);\n return resp.data as PageMeta;\n }\n\n async click(selector: string, timeout = 5000): Promise<void> {\n const resp = await this.send({ cmd: 'click', selector, timeout });\n this.assertOk(resp);\n }\n\n async fill(selector: string, value: string, timeout = 5000): Promise<void> {\n const resp = await this.send({ cmd: 'fill', selector, value, timeout });\n this.assertOk(resp);\n }\n\n async type(selector: string, text: string, delay = 50): Promise<void> {\n const resp = await this.send({ cmd: 'type', selector, text, delay });\n this.assertOk(resp);\n }\n\n async press(key: string, selector?: string): Promise<void> {\n const resp = await this.send({ cmd: 'press', key, selector });\n this.assertOk(resp);\n }\n\n async hover(selector: string): Promise<void> {\n const resp = await this.send({ cmd: 'hover', selector });\n this.assertOk(resp);\n }\n\n async select(selector: string, value: string | string[]): Promise<void> {\n const resp = await this.send({ cmd: 'select', selector, value });\n this.assertOk(resp);\n }\n\n async waitFor(selector: string, state = 'visible', timeout = 10000): Promise<void> {\n const resp = await this.send({ cmd: 'wait_for', selector, state, timeout });\n this.assertOk(resp);\n }\n\n async waitForUrl(url: string, timeout = 15000): Promise<string> {\n const resp = await this.send({ cmd: 'wait_for_url', url, timeout });\n this.assertOk(resp);\n return (resp.data as { current_url: string }).current_url;\n }\n\n async waitIdle(timeout = 15000): Promise<void> {\n const resp = await this.send({ cmd: 'wait_idle', timeout });\n this.assertOk(resp);\n }\n\n async wait(ms: number): Promise<void> {\n const resp = await this.send({ cmd: 'wait', ms });\n this.assertOk(resp);\n }\n\n async screenshot(opts?: { fullPage?: boolean; selector?: string; encode?: boolean; name?: string }): Promise<ScreenshotResult> {\n const resp = await this.send({\n cmd: 'screenshot',\n full_page: opts?.fullPage ?? true,\n selector: opts?.selector,\n encode: opts?.encode ?? false,\n name: opts?.name,\n });\n this.assertOk(resp);\n return resp.data as ScreenshotResult;\n }\n\n async step(label: string): Promise<StepResult> {\n const resp = await this.send({ cmd: 'step', label });\n this.assertOk(resp);\n return resp.data as StepResult;\n }\n\n async meta(): Promise<PageMeta> {\n const resp = await this.send({ cmd: 'meta' });\n this.assertOk(resp);\n return resp.data as PageMeta;\n }\n\n async snapshot(include?: string[]): Promise<Record<string, unknown>> {\n const resp = await this.send({ cmd: 'snapshot', include });\n this.assertOk(resp);\n return resp.data as Record<string, unknown>;\n }\n\n async queryText(text: string, exact = false): Promise<unknown[]> {\n const resp = await this.send({ cmd: 'query_text', text, exact });\n this.assertOk(resp);\n return resp.data as unknown[];\n }\n\n async querySelector(selector: string, max = 50): Promise<unknown[]> {\n const resp = await this.send({ cmd: 'query', selector, max });\n this.assertOk(resp);\n return resp.data as unknown[];\n }\n\n async evaluate(expression: string, arg?: unknown): Promise<unknown> {\n const resp = await this.send({ cmd: 'evaluate', expression, arg });\n this.assertOk(resp);\n return resp.data;\n }\n\n async text(selector = 'body', maxLength = 20000): Promise<string> {\n const resp = await this.send({ cmd: 'text', selector, max_length: maxLength });\n this.assertOk(resp);\n return (resp.data as { text: string }).text;\n }\n\n async html(selector?: string, maxLength = 50000): Promise<string> {\n const resp = await this.send({ cmd: 'html', selector, max_length: maxLength });\n this.assertOk(resp);\n return (resp.data as { html: string }).html;\n }\n\n async networkLog(opts?: { since?: number; type?: string; urlContains?: string; tail?: number }): Promise<{ count: number; entries: unknown[] }> {\n const resp = await this.send({\n cmd: 'network_log',\n since: opts?.since,\n type: opts?.type,\n url_contains: opts?.urlContains,\n tail: opts?.tail,\n });\n this.assertOk(resp);\n return resp.data as { count: number; entries: unknown[] };\n }\n\n async consoleLog(opts?: { since?: number; type?: string; tail?: number }): Promise<{ count: number; entries: unknown[] }> {\n const resp = await this.send({\n cmd: 'console_log',\n since: opts?.since,\n type: opts?.type,\n tail: opts?.tail,\n });\n this.assertOk(resp);\n return resp.data as { count: number; entries: unknown[] };\n }\n\n async requestPairs(opts?: { urlContains?: string; method?: string; statusMin?: number; statusMax?: number }): Promise<{ count: number; entries: unknown[] }> {\n const resp = await this.send({\n cmd: 'request_pairs',\n url_contains: opts?.urlContains,\n method: opts?.method,\n status_min: opts?.statusMin,\n status_max: opts?.statusMax,\n });\n this.assertOk(resp);\n return resp.data as { count: number; entries: unknown[] };\n }\n\n async clearLogs(): Promise<void> {\n const resp = await this.send({ cmd: 'clear_logs' });\n this.assertOk(resp);\n }\n\n get isRunning(): boolean {\n return this.proc !== null && this.proc.exitCode === null;\n }\n\n // -- Private ----------------------------------------------------------\n\n private assertOk(resp: ReplResponse): void {\n if (!resp.ok) {\n throw new Error(`REPL error: ${resp.error}`);\n }\n }\n\n private async waitForReady(stderr: string): Promise<{\n session_id: string;\n sock_dir: string;\n url: string;\n }> {\n if (!this.proc?.stdout) {\n throw new Error('REPL process has no stdout');\n }\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(\n `REPL did not become ready within ${this.options.timeout}ms.\\nStderr: ${stderr}`,\n ));\n }, this.options.timeout);\n\n let buffer = '';\n const onData = (chunk: Buffer) => {\n buffer += chunk.toString();\n const lines = buffer.split('\\n');\n for (const line of lines) {\n if (!line.trim()) continue;\n try {\n const msg = JSON.parse(line);\n if (msg.__ready__) {\n clearTimeout(timeout);\n this.proc!.stdout!.off('data', onData);\n resolve({\n session_id: msg.session_id,\n sock_dir: msg.sock_dir,\n url: msg.url,\n });\n return;\n }\n } catch {\n // not JSON yet, keep buffering\n }\n }\n };\n\n this.proc!.stdout!.on('data', onData);\n this.proc!.on('error', (err) => {\n clearTimeout(timeout);\n reject(new Error(`REPL process error: ${err.message}`));\n });\n this.proc!.on('exit', (code) => {\n clearTimeout(timeout);\n reject(new Error(`REPL process exited prematurely (code ${code}).\\nStderr: ${stderr}`));\n });\n });\n }\n}\n","import { spawn } from 'node:child_process';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { logger } from '../logger.js';\nimport type { E2eConfig } from '../config.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nexport interface ScriptRunResult {\n success: boolean;\n exitCode: number;\n stdout: string;\n stderr: string;\n outputDir?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface ScriptRunnerOptions {\n pythonBin?: string;\n projectRoot?: string;\n configFile?: string;\n timeoutMs?: number;\n env?: Record<string, string>;\n}\n\n/**\n * Run a Python UAT script (non-interactive) and collect results.\n *\n * Executes `python3 main.py --script <script> --headless` from oa_pc_uat.\n * Suitable for batch E2E verification where each script performs a series\n * of page operations, captures screenshots/logs, then exits.\n */\nexport class E2EScriptRunner {\n private readonly opts: Required<ScriptRunnerOptions>;\n\n constructor(\n private readonly e2eConfig: E2eConfig,\n options: ScriptRunnerOptions = {},\n ) {\n const vendorRoot = options.projectRoot\n ?? path.resolve(__dirname, '../../vendor/oa_pc_uat');\n\n this.opts = {\n pythonBin: options.pythonBin ?? this.e2eConfig.pythonBin ?? 'python3',\n projectRoot: vendorRoot,\n configFile: options.configFile ?? '',\n timeoutMs: options.timeoutMs ?? 300_000,\n env: options.env ?? {},\n };\n }\n\n async runScript(\n scriptPath: string,\n runOpts?: {\n baseUrl?: string;\n outputPath?: string;\n storageState?: string;\n extraArgs?: string[];\n },\n ): Promise<ScriptRunResult> {\n const args = [\n 'main.py',\n '--headless',\n '--reuse-session',\n '--script', scriptPath,\n '--url', runOpts?.baseUrl ?? this.e2eConfig.baseUrl,\n ];\n\n if (this.opts.configFile) {\n args.push('--config', this.opts.configFile);\n }\n if (runOpts?.outputPath) {\n args.push('--output-path', runOpts.outputPath);\n }\n if (runOpts?.storageState) {\n args.push('--storage-state', runOpts.storageState);\n }\n if (runOpts?.extraArgs) {\n args.push(...runOpts.extraArgs);\n }\n\n logger.info('Running E2E script', {\n script: scriptPath,\n cwd: this.opts.projectRoot,\n });\n\n return new Promise<ScriptRunResult>((resolve, reject) => {\n const proc = spawn(this.opts.pythonBin, args, {\n cwd: this.opts.projectRoot,\n env: {\n ...process.env,\n PYTHONUNBUFFERED: '1',\n ...this.opts.env,\n },\n timeout: this.opts.timeoutMs,\n });\n\n let stdout = '';\n let stderr = '';\n\n proc.stdout?.on('data', (chunk) => { stdout += chunk.toString(); });\n proc.stderr?.on('data', (chunk) => { stderr += chunk.toString(); });\n\n proc.on('error', (err) => {\n reject(new Error(`E2E script process error: ${err.message}`));\n });\n\n proc.on('close', (code) => {\n let metadata: Record<string, unknown> | undefined;\n try {\n metadata = JSON.parse(stdout.trim());\n } catch {\n // stdout may not be valid JSON\n }\n\n const exitCode = code ?? 1;\n resolve({\n success: exitCode === 0,\n exitCode,\n stdout,\n stderr,\n outputDir: metadata?.output_dir as string | undefined,\n metadata,\n });\n });\n });\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { E2EBrowserRunner, type BrowserRunnerOptions } from './E2EBrowserRunner.js';\nimport { E2EScriptRunner, type ScriptRunnerOptions } from './E2EScriptRunner.js';\nimport type { E2eConfig } from '../config.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nexport interface E2ETestContext {\n browser: E2EBrowserRunner;\n scriptRunner: E2EScriptRunner;\n outputDir: string;\n cleanup: () => Promise<void>;\n}\n\n/**\n * Bootstrap an E2E test context with browser runner, script runner,\n * and temporary output directory. Call `cleanup()` in afterAll/afterEach.\n */\nexport async function createE2ETestContext(\n e2eConfig: E2eConfig,\n opts?: {\n browser?: BrowserRunnerOptions;\n script?: ScriptRunnerOptions;\n outputDir?: string;\n },\n): Promise<E2ETestContext> {\n const outputDir = opts?.outputDir\n ?? fs.mkdtempSync(path.join(process.env.TMPDIR ?? '/tmp', 'iaf-e2e-'));\n\n const browser = new E2EBrowserRunner(e2eConfig, {\n ...opts?.browser,\n outputDir,\n });\n\n const scriptRunner = new E2EScriptRunner(e2eConfig, opts?.script);\n\n return {\n browser,\n scriptRunner,\n outputDir,\n cleanup: async () => {\n if (browser.isRunning) {\n await browser.stop();\n }\n try {\n fs.rmSync(outputDir, { recursive: true, force: true });\n } catch {\n // ignore\n }\n },\n };\n}\n\n/**\n * Resolve the vendor oa_pc_uat root directory.\n * Checks both the submodule path and common fallback locations.\n */\nexport function resolveVendorRoot(fromDir?: string): string {\n const candidates = [\n path.resolve(fromDir ?? __dirname, '../../vendor/oa_pc_uat'),\n path.resolve(fromDir ?? process.cwd(), 'vendor/oa_pc_uat'),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(path.join(candidate, 'main.py'))) {\n return candidate;\n }\n }\n\n throw new Error(\n 'oa_pc_uat vendor directory not found. Run:\\n'\n + ' git submodule update --init vendor/oa_pc_uat\\n'\n + 'Or clone manually:\\n'\n + ' git clone git@git.woa.com:fishcui/oa_pc_uat.git vendor/oa_pc_uat',\n );\n}\n\n/**\n * Check that the Python environment for oa_pc_uat is properly set up.\n * Returns diagnostic info about missing dependencies.\n */\nexport async function checkE2EPrerequisites(\n vendorRoot: string,\n pythonBin = 'python3',\n): Promise<{\n ready: boolean;\n pythonAvailable: boolean;\n playwrightInstalled: boolean;\n chromiumInstalled: boolean;\n issues: string[];\n}> {\n const issues: string[] = [];\n let pythonAvailable = false;\n let playwrightInstalled = false;\n let chromiumInstalled = false;\n\n const { execFileSync } = await import('node:child_process');\n\n try {\n execFileSync(pythonBin, ['--version'], { encoding: 'utf-8' });\n pythonAvailable = true;\n } catch {\n issues.push(`${pythonBin} not found in PATH`);\n }\n\n if (pythonAvailable) {\n try {\n execFileSync(pythonBin, ['-c', 'import playwright'], {\n encoding: 'utf-8',\n cwd: vendorRoot,\n });\n playwrightInstalled = true;\n } catch {\n issues.push(`playwright not installed: run \\`${pythonBin} -m pip install -r vendor/oa_pc_uat/requirements.txt\\``);\n }\n }\n\n if (playwrightInstalled) {\n try {\n execFileSync(pythonBin, ['-c', 'from playwright.sync_api import sync_playwright; p = sync_playwright().start(); b = p.chromium; p.stop()'], {\n encoding: 'utf-8',\n cwd: vendorRoot,\n timeout: 10_000,\n });\n chromiumInstalled = true;\n } catch {\n issues.push(`Chromium not installed: run \\`${pythonBin} -m playwright install chromium\\``);\n }\n }\n\n return {\n ready: issues.length === 0,\n pythonAvailable,\n playwrightInstalled,\n chromiumInstalled,\n issues,\n };\n}\n"],"mappings":"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","names":["spawn","path","fileURLToPath","__dirname","path","fileURLToPath","spawn","fs","path","fileURLToPath","__dirname","path","fileURLToPath","fs"]}
@@ -0,0 +1,12 @@
1
+ import type { DialogOption } from '../ai-runner/AIRunner.js';
2
+ export interface PendingDialogInfo {
3
+ issueIid: number;
4
+ question: string;
5
+ options: DialogOption[];
6
+ phase: string;
7
+ timestamp: string;
8
+ }
9
+ export declare function setPendingDialog(info: PendingDialogInfo): void;
10
+ export declare function getPendingDialog(issueIid: number): PendingDialogInfo | undefined;
11
+ export declare function clearPendingDialog(issueIid: number): void;
12
+ //# sourceMappingURL=PendingDialogStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PendingDialogStore.d.ts","sourceRoot":"","sources":["../../src/orchestrator/PendingDialogStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAYD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAE9D;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAEhF;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEzD"}
@@ -1 +1 @@
1
- {"version":3,"file":"FailureHandler.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/steps/FailureHandler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAOrE,wBAAsB,aAAa,CACjC,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,IAAI,CAAC,CA4Df"}
1
+ {"version":3,"file":"FailureHandler.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/steps/FailureHandler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAOrE,wBAAsB,aAAa,CACjC,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,IAAI,CAAC,CAiEf"}
@@ -1 +1 @@
1
- {"version":3,"file":"PhaseLoopStep.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/steps/PhaseLoopStep.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAe5E,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAyP9G;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,sBAAsB,EAC3B,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,eAAe,EACvB,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GACpC,OAAO,CAAC,eAAe,GAAG;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAwNhD"}
1
+ {"version":3,"file":"PhaseLoopStep.d.ts","sourceRoot":"","sources":["../../../src/orchestrator/steps/PhaseLoopStep.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAe5E,OAAO,KAAK,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAyU9G;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,sBAAsB,EAC3B,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,eAAe,EACvB,QAAQ,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GACpC,OAAO,CAAC,eAAe,GAAG;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAwNhD"}
@@ -43,5 +43,10 @@ export declare class PlanPersistence {
43
43
  isArtifactReady(filename: string, minBytes?: number): boolean;
44
44
  /** 写入 planDir 下指定文件(自动 ensureDir) */
45
45
  writeFile(filename: string, content: string): void;
46
+ /**
47
+ * Copy a plan file from an external source (e.g. ~/.claude/plans/) into planDir.
48
+ * Returns the destination path, or null if the source is empty/unreadable.
49
+ */
50
+ copyPlanFromExternal(sourcePath: string, targetFilename?: string): string | null;
46
51
  }
47
52
  //# sourceMappingURL=PlanPersistence.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PlanPersistence.d.ts","sourceRoot":"","sources":["../../src/persistence/PlanPersistence.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAiB,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAOrE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAK7C,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,SAAS,IAAI,IAAI;IAMjB,cAAc,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAOvG,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAOvC,YAAY,IAAI,YAAY,GAAG,IAAI;IAUnC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMpC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMlC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMpC,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,SAAwB,GAAG,IAAI;IAM1E,eAAe,IAAI,MAAM,EAAE;IAK3B,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,WAAW,GAAG,YAAY;IA8B5G,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMhC,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAsB1C,kBAAkB,IAAI,MAAM,GAAG,IAAI;IAUnC,iBAAiB,IAAI,WAAW,EAAE;IAWlC,MAAM,CAAC,2BAA2B,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM;IAalE,mBAAmB,CACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE,GACxC,IAAI;IA+BP,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAOhE,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IASxD,kCAAkC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAUzC,6CAA6C;IAC7C,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,SAAK,GAAG,OAAO;IAUzD,qCAAqC;IACrC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;CAInD"}
1
+ {"version":3,"file":"PlanPersistence.d.ts","sourceRoot":"","sources":["../../src/persistence/PlanPersistence.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAiB,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACzF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAOrE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAS;gBAEb,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAK7C,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,SAAS,IAAI,IAAI;IAMjB,cAAc,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAOvG,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAOvC,YAAY,IAAI,YAAY,GAAG,IAAI;IAUnC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMpC,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMlC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMpC,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,SAAwB,GAAG,IAAI;IAM1E,eAAe,IAAI,MAAM,EAAE;IAK3B,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,WAAW,GAAG,YAAY;IA8B5G,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAMhC,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAsB1C,kBAAkB,IAAI,MAAM,GAAG,IAAI;IAUnC,iBAAiB,IAAI,WAAW,EAAE;IAWlC,MAAM,CAAC,2BAA2B,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM;IAalE,mBAAmB,CACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,WAAW,EACnB,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QAAE,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE,GACxC,IAAI;IA+BP,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAOhE,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IASxD,kCAAkC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAUzC,6CAA6C;IAC7C,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,SAAK,GAAG,OAAO;IAUzD,qCAAqC;IACrC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAKlD;;;OAGG;IACH,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,SAAe,GAAG,MAAM,GAAG,IAAI;CAqBvF"}
@@ -0,0 +1,31 @@
1
+ export interface TodoItem {
2
+ /** Zero-based index in the extracted list */
3
+ index: number;
4
+ /** Whether the checkbox is checked (- [x]) */
5
+ completed: boolean;
6
+ /** The text content of the todo item (without the checkbox syntax) */
7
+ text: string;
8
+ /** Nesting depth (0 = top-level, 1 = sub-item, etc.) */
9
+ depth: number;
10
+ }
11
+ export interface TodolistSummary {
12
+ items: TodoItem[];
13
+ total: number;
14
+ completed: number;
15
+ pending: number;
16
+ }
17
+ /**
18
+ * Extracts structured todolist items from a Markdown plan document.
19
+ * Recognizes standard GitHub-flavored checkbox syntax: `- [ ] text` / `- [x] text`
20
+ */
21
+ export declare function extractTodolist(markdown: string): TodolistSummary;
22
+ /**
23
+ * Render a TodolistSummary back to Markdown checkbox format.
24
+ * Useful for status display in comments or Web UI.
25
+ */
26
+ export declare function renderTodolistMarkdown(summary: TodolistSummary): string;
27
+ /**
28
+ * Generate a progress string like "5/8 完成 (62%)"
29
+ */
30
+ export declare function todolistProgressText(summary: TodolistSummary): string;
31
+ //# sourceMappingURL=TodolistExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TodolistExtractor.d.ts","sourceRoot":"","sources":["../../src/persistence/TodolistExtractor.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,QAAQ;IACvB,6CAA6C;IAC7C,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,SAAS,EAAE,OAAO,CAAC;IACnB,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAID;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,CAoCjE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAQvE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAIrE"}
@@ -1 +1 @@
1
- {"version":3,"file":"BasePhase.d.ts","sourceRoot":"","sources":["../../src/phases/BasePhase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BasePhase.d.ts","sourceRoot":"","sources":["../../src/phases/BasePhase.ts"],"names":[],"mappings":"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"}
@@ -20,6 +20,8 @@ export interface PhaseOutcome {
20
20
  isRetryable: boolean;
21
21
  /** 完整 AI 输出(供编排器构造 AIExecutionError) */
22
22
  rawOutput?: string;
23
+ /** Agent was still actively outputting when timeout fired — treat as soft failure */
24
+ wasActiveAtTimeout?: boolean;
23
25
  };
24
26
  /** 异步完成句柄(仅 status='running')— 编排器 await 此 Promise 获取最终结果 */
25
27
  awaitCompletion?: Promise<PhaseOutcome>;
@@ -1 +1 @@
1
- {"version":3,"file":"PhaseOutcome.d.ts","sourceRoot":"","sources":["../../src/phases/PhaseOutcome.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE7D;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,WAAW;IACX,MAAM,EAAE,WAAW,CAAC;IACpB,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,8BAA8B;IAC9B,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,OAAO,CAAC;QACrB,wCAAwC;QACxC,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,6DAA6D;IAC7D,eAAe,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACxC,uBAAuB;IACvB,IAAI,CAAC,EAAE;QACL,YAAY,CAAC,EAAE,kBAAkB,CAAC;QAClC,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAC/B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,iCAAiC;IACjC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAC7C,mCAAmC;IACnC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9D"}
1
+ {"version":3,"file":"PhaseOutcome.d.ts","sourceRoot":"","sources":["../../src/phases/PhaseOutcome.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE7D;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,WAAW;IACX,MAAM,EAAE,WAAW,CAAC;IACpB,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,yBAAyB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,8BAA8B;IAC9B,KAAK,CAAC,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,OAAO,CAAC;QACrB,wCAAwC;QACxC,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,qFAAqF;QACrF,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B,CAAC;IACF,6DAA6D;IAC7D,eAAe,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACxC,uBAAuB;IACvB,IAAI,CAAC,EAAE;QACL,YAAY,CAAC,EAAE,kBAAkB,CAAC;QAClC,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAC/B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,iCAAiC;IACjC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IAC7C,mCAAmC;IACnC,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9D"}
@@ -1 +1 @@
1
- {"version":3,"file":"PlanPhase.d.ts","sourceRoot":"","sources":["../../src/phases/PlanPhase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAKzD,qBAAa,SAAU,SAAQ,SAAS;IACtC,QAAQ,CAAC,SAAS,EAAG,MAAM,CAAU;IAErC,cAAc;;;;IAId,SAAS,CAAC,UAAU,IAAI,MAAM,GAAG,OAAO,GAAG,SAAS;IAIpD,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM;CA0BjD"}
1
+ {"version":3,"file":"PlanPhase.d.ts","sourceRoot":"","sources":["../../src/phases/PlanPhase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAKzD,qBAAa,SAAU,SAAQ,SAAS;IACtC,QAAQ,CAAC,SAAS,EAAG,MAAM,CAAU;IAErC,cAAc;;;;IAId,SAAS,CAAC,UAAU,IAAI,MAAM,GAAG,OAAO,GAAG,SAAS;IAIpD,SAAS,CAAC,WAAW,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM;CA2BjD"}
@@ -34,14 +34,14 @@ export declare function designPrompt(ctx: PromptContext): string;
34
34
  export declare function implementPrompt(ctx: PromptContext): string;
35
35
  export declare function verifyPrompt(ctx: PromptContext): string;
36
36
  export declare function planModeVerifyPrompt(ctx: PromptContext): string;
37
- export declare function planPrompt(ctx: PromptContext): string;
37
+ export declare function planPrompt(ctx: PromptContext, deterministicCopy?: boolean): string;
38
38
  export declare function buildPrompt(ctx: PromptContext): string;
39
39
  export interface ReviewRoundForPrompt {
40
40
  round: number;
41
41
  feedback: string;
42
42
  timestamp: string;
43
43
  }
44
- export declare function rePlanPrompt(ctx: PromptContext, history: ReviewRoundForPrompt[]): string;
44
+ export declare function rePlanPrompt(ctx: PromptContext, history: ReviewRoundForPrompt[], deterministicCopy?: boolean): string;
45
45
  export interface E2ePromptPorts {
46
46
  backendPort: number;
47
47
  frontendPort: number;
@@ -1 +1 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/prompts/templates.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAMD;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAmC9D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,GAAG;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB,CAeA;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,CAAC,EAAE,eAAe,GAAG,MAAM,CAwBzE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAUzD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CASvD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAS1D;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CASvD;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAW/D;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAYrD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAWtD;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,oBAAoB,EAAE,GAAG,MAAM,CAiBxF;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAoCD,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,aAAa,EAClB,KAAK,CAAC,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,aAAa,GACtB,MAAM,CAKR;AA2LD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,sBAAsB,GAAG,MAAM,CAQzE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAa3F"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/prompts/templates.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAMD;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAmC9D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,GAAG;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;CACxB,CAeA;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,CAAC,EAAE,eAAe,GAAG,MAAM,CAwBzE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAUzD;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CASvD;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAS1D;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CASvD;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAW/D;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,aAAa,EAAE,iBAAiB,UAAQ,GAAG,MAAM,CAsBhF;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAWtD;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,oBAAoB,EAAE,EAAE,iBAAiB,UAAQ,GAAG,MAAM,CA+BnH;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAoCD,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,aAAa,EAClB,KAAK,CAAC,EAAE,cAAc,EACtB,OAAO,CAAC,EAAE,aAAa,GACtB,MAAM,CAKR;AA2LD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,sBAAsB,GAAG,MAAM,CAQzE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAa3F"}
@@ -1,19 +1,20 @@
1
- import {
2
- startCommand
3
- } from "./chunk-2MESXJEZ.js";
4
1
  import {
5
2
  stopCommand
6
3
  } from "./chunk-WIEUIU6L.js";
4
+ import {
5
+ startCommand
6
+ } from "./chunk-YNRKPQLS.js";
7
7
  import {
8
8
  dim,
9
9
  yellow
10
10
  } from "./chunk-B7XUZJOK.js";
11
- import "./chunk-O3WEV5W3.js";
12
- import "./chunk-NZHKAPU6.js";
11
+ import "./chunk-JMACM7AJ.js";
12
+ import "./chunk-FJTZKAJA.js";
13
13
  import "./chunk-AKXDQH25.js";
14
14
  import "./chunk-TN2SYADO.js";
15
- import "./chunk-SAMTXC4A.js";
16
- import "./chunk-AVGZH64A.js";
15
+ import "./chunk-TFEPHOVE.js";
16
+ import "./chunk-G7QI5WDI.js";
17
+ import "./chunk-2RWGZPNF.js";
17
18
  import "./chunk-GF2RRYHB.js";
18
19
 
19
20
  // src/cli/commands/restart.ts
@@ -44,4 +45,4 @@ async function restartCommand(options) {
44
45
  export {
45
46
  restartCommand
46
47
  };
47
- //# sourceMappingURL=restart-BMILTP5X.js.map
48
+ //# sourceMappingURL=restart-C7QBXT44.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/commands/restart.ts"],"sourcesContent":["import { stopCommand } from './stop.js';\nimport { startCommand } from './start.js';\nimport { yellow, dim } from '../utils/format.js';\n\nexport interface RestartOptions {\n config?: string;\n host: string;\n port: number;\n daemon?: boolean;\n}\n\nexport async function restartCommand(options: RestartOptions): Promise<void> {\n // Detect PM2 environment\n if (process.env.PM2_HOME || process.env.pm_id) {\n console.log(`\\n ${yellow('PM2 detected.')} Use ${dim('pm2 restart issue-auto-finish')} instead.\\n`);\n process.exitCode = 1;\n return;\n }\n\n console.log(' Stopping service...');\n await stopCommand({\n host: options.host,\n port: options.port,\n force: false,\n });\n\n if (process.exitCode === 1) {\n // Stop failed — still try to start\n process.exitCode = undefined as unknown as number;\n console.log(' Previous stop had issues, attempting start anyway...');\n }\n\n console.log(' Starting service...');\n await startCommand({\n config: options.config,\n daemon: options.daemon,\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAWA,eAAsB,eAAe,SAAwC;AAE3E,MAAI,QAAQ,IAAI,YAAY,QAAQ,IAAI,OAAO;AAC7C,YAAQ,IAAI;AAAA,IAAO,OAAO,eAAe,CAAC,QAAQ,IAAI,+BAA+B,CAAC;AAAA,CAAa;AACnG,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,UAAQ,IAAI,uBAAuB;AACnC,QAAM,YAAY;AAAA,IAChB,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ;AAAA,IACd,OAAO;AAAA,EACT,CAAC;AAED,MAAI,QAAQ,aAAa,GAAG;AAE1B,YAAQ,WAAW;AACnB,YAAQ,IAAI,wDAAwD;AAAA,EACtE;AAEA,UAAQ,IAAI,uBAAuB;AACnC,QAAM,aAAa;AAAA,IACjB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,EAClB,CAAC;AACH;","names":[]}
1
+ {"version":3,"sources":["../src/cli/commands/restart.ts"],"sourcesContent":["import { stopCommand } from './stop.js';\nimport { startCommand } from './start.js';\nimport { yellow, dim } from '../utils/format.js';\n\nexport interface RestartOptions {\n config?: string;\n host: string;\n port: number;\n daemon?: boolean;\n}\n\nexport async function restartCommand(options: RestartOptions): Promise<void> {\n // Detect PM2 environment\n if (process.env.PM2_HOME || process.env.pm_id) {\n console.log(`\\n ${yellow('PM2 detected.')} Use ${dim('pm2 restart issue-auto-finish')} instead.\\n`);\n process.exitCode = 1;\n return;\n }\n\n console.log(' Stopping service...');\n await stopCommand({\n host: options.host,\n port: options.port,\n force: false,\n });\n\n if (process.exitCode === 1) {\n // Stop failed — still try to start\n process.exitCode = undefined as unknown as number;\n console.log(' Previous stop had issues, attempting start anyway...');\n }\n\n console.log(' Starting service...');\n await startCommand({\n config: options.config,\n daemon: options.daemon,\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAWA,eAAsB,eAAe,SAAwC;AAE3E,MAAI,QAAQ,IAAI,YAAY,QAAQ,IAAI,OAAO;AAC7C,YAAQ,IAAI;AAAA,IAAO,OAAO,eAAe,CAAC,QAAQ,IAAI,+BAA+B,CAAC;AAAA,CAAa;AACnG,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,UAAQ,IAAI,uBAAuB;AACnC,QAAM,YAAY;AAAA,IAChB,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ;AAAA,IACd,OAAO;AAAA,EACT,CAAC;AAED,MAAI,QAAQ,aAAa,GAAG;AAE1B,YAAQ,WAAW;AACnB,YAAQ,IAAI,wDAAwD;AAAA,EACtE;AAEA,UAAQ,IAAI,uBAAuB;AACnC,QAAM,aAAa;AAAA,IACjB,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,EAClB,CAAC;AACH;","names":[]}
package/dist/run.js CHANGED
@@ -1,24 +1,26 @@
1
1
  import {
2
2
  main
3
- } from "./chunk-QZZGIZWC.js";
4
- import "./chunk-M5C2WILQ.js";
5
- import "./chunk-UBQLXQ7I.js";
6
- import "./chunk-HDFNMVRQ.js";
7
- import "./chunk-GXFG4JU6.js";
3
+ } from "./chunk-XSX3PGQW.js";
4
+ import "./chunk-5M5SB6ZA.js";
5
+ import "./chunk-5JBADEKR.js";
6
+ import "./chunk-DVNAH2GV.js";
7
+ import "./chunk-EU4XFZ2T.js";
8
8
  import "./chunk-KC5S66OZ.js";
9
- import "./chunk-O3WEV5W3.js";
10
- import "./chunk-IP3QTP5A.js";
11
- import "./chunk-2YQHKXLL.js";
12
- import "./chunk-U237JSLB.js";
13
- import "./chunk-U6GWFTKA.js";
9
+ import "./chunk-JMACM7AJ.js";
10
+ import "./chunk-IWSMQXBL.js";
11
+ import "./chunk-GPZX4DSY.js";
12
+ import "./chunk-MSL7ROVK.js";
13
+ import "./chunk-4XMYOXGZ.js";
14
+ import "./chunk-R32Q3RGK.js";
14
15
  import "./chunk-ACVOOHAR.js";
15
16
  import "./chunk-B7TVVODN.js";
16
- import "./chunk-YCYVNRLF.js";
17
- import "./chunk-NZHKAPU6.js";
17
+ import "./chunk-OBGEEGQ3.js";
18
+ import "./chunk-FJTZKAJA.js";
18
19
  import "./chunk-AKXDQH25.js";
19
20
  import "./chunk-TN2SYADO.js";
20
- import "./chunk-SAMTXC4A.js";
21
- import "./chunk-AVGZH64A.js";
21
+ import "./chunk-TFEPHOVE.js";
22
+ import "./chunk-G7QI5WDI.js";
23
+ import "./chunk-2RWGZPNF.js";
22
24
  import "./chunk-DAX3FD2O.js";
23
25
  import "./chunk-GF2RRYHB.js";
24
26
 
package/dist/run.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/run.ts"],"sourcesContent":["import { main } from './index.js';\n\nmain().catch((err) => {\n console.error('Fatal error', (err as Error).message, (err as Error).stack);\n process.exit(1);\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAEA,KAAK,EAAE,MAAM,CAAC,QAAQ;AACpB,UAAQ,MAAM,eAAgB,IAAc,SAAU,IAAc,KAAK;AACzE,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":[]}
1
+ {"version":3,"sources":["../src/run.ts"],"sourcesContent":["import { main } from './index.js';\n\nmain().catch((err) => {\n console.error('Fatal error', (err as Error).message, (err as Error).stack);\n process.exit(1);\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,KAAK,EAAE,MAAM,CAAC,QAAQ;AACpB,UAAQ,MAAM,eAAgB,IAAc,SAAU,IAAc,KAAK;AACzE,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":[]}
@@ -0,0 +1,16 @@
1
+ import {
2
+ startCommand
3
+ } from "./chunk-YNRKPQLS.js";
4
+ import "./chunk-B7XUZJOK.js";
5
+ import "./chunk-JMACM7AJ.js";
6
+ import "./chunk-FJTZKAJA.js";
7
+ import "./chunk-AKXDQH25.js";
8
+ import "./chunk-TN2SYADO.js";
9
+ import "./chunk-TFEPHOVE.js";
10
+ import "./chunk-G7QI5WDI.js";
11
+ import "./chunk-2RWGZPNF.js";
12
+ import "./chunk-GF2RRYHB.js";
13
+ export {
14
+ startCommand
15
+ };
16
+ //# sourceMappingURL=start-66JO56AW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -26,6 +26,12 @@ export declare class IssueTracker extends BaseTracker<IssueRecord> {
26
26
  /** 更新单个阶段的进度(原子保存 + SSE 推送) */
27
27
  updatePhaseProgress(issueIid: number, phase: string, update: Partial<PhaseProgress>): void;
28
28
  markFailed(issueIid: number, error: string, failedAtState: IssueState, isRetryable?: boolean): void;
29
+ /**
30
+ * Mark as failed WITHOUT incrementing attempts. Used when the agent was still
31
+ * actively producing output at timeout — a slow-but-progressing run should not
32
+ * consume the retry budget.
33
+ */
34
+ markFailedSoft(issueIid: number, error: string, failedAtState: IssueState): void;
29
35
  pauseIssue(issueIid: number, currentPhase: string): void;
30
36
  resumeFromPause(issueIid: number, def: PipelineDef, clearSession: boolean): boolean;
31
37
  /** 持久化锁超时阈值(默认 30 分钟,与 PHASE_TIMEOUT 一致) */
@@ -1 +1 @@
1
- {"version":3,"file":"IssueTracker.d.ts","sourceRoot":"","sources":["../../src/tracker/IssueTracker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"IssueTracker.d.ts","sourceRoot":"","sources":["../../src/tracker/IssueTracker.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/web/routes/api.ts"],"names":[],"mappings":"AAAA,OAAO,OAAwC,MAAM,SAAS,CAAC;AAC/D,QAAA,MAAQ,MAAM,uBAAY,CAAC;AAK3B,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAI7D,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAatE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAG1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAgCnE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,oBAAoB,CAAC;IACnC,QAAQ,EAAE,cAAc,CAAC;IACzB,eAAe,EAAE,eAAe,CAAC;IACjC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAeD,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;AAChF,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,oBAAoB,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../src/web/routes/api.ts"],"names":[],"mappings":"AAAA,OAAO,OAAwC,MAAM,SAAS,CAAC;AAC/D,QAAA,MAAQ,MAAM,uBAAY,CAAC;AAK3B,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAI7D,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AActE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAG1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAgCnE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,aAAa,CAAC;IAC7B,YAAY,EAAE,oBAAoB,CAAC;IACnC,QAAQ,EAAE,cAAc,CAAC;IACzB,eAAe,EAAE,eAAe,CAAC;IACjC,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAeD,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC;AAChF,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,oBAAoB,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,UAAU,CAAC,OAAO,MAAM,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xdevops/issue-auto-finish",
3
- "version": "1.0.87",
3
+ "version": "1.0.89",
4
4
  "description": "Issue Auto-Finish: AI-powered issue resolution daemon",
5
5
  "type": "module",
6
6
  "main": "./dist/lib.js",
@@ -83,10 +83,14 @@
83
83
  "lint": "eslint src/ tests/",
84
84
  "lint:fix": "eslint src/ tests/ --fix",
85
85
  "test": "vitest run --exclude 'tests/e2e/**'",
86
+ "test:unit": "vitest run tests/unit/",
86
87
  "test:integration": "vitest run tests/integration/",
88
+ "test:contracts": "vitest run tests/contracts/",
87
89
  "test:e2e": "vitest run --include 'tests/e2e/**'",
88
90
  "test:e2e:browser": "RUN_E2E_BROWSER=true vitest run --include 'tests/e2e/**'",
89
91
  "test:e2e:prereq": "vitest run tests/e2e/prerequisites.test.ts",
92
+ "test:e2e:smoke": "AI_SMOKE_TEST=true vitest run tests/e2e/ai-smoke.test.ts",
93
+ "test:ci": "vitest run --exclude 'tests/e2e/**'",
90
94
  "test:all": "vitest run",
91
95
  "test:watch": "vitest --exclude 'tests/e2e/**'",
92
96
  "e2e:setup": "git submodule update --init vendor/oa_pc_uat && cd vendor/oa_pc_uat && python3 -m pip install -r requirements.txt && python3 -m playwright install chromium"