@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
@@ -1,19 +1,21 @@
1
- import "./chunk-U237JSLB.js";
2
- import "./chunk-U6GWFTKA.js";
1
+ import "./chunk-MSL7ROVK.js";
2
+ import "./chunk-4XMYOXGZ.js";
3
+ import "./chunk-R32Q3RGK.js";
3
4
  import {
4
5
  analyze
5
6
  } from "./chunk-B7TVVODN.js";
6
7
  import {
7
8
  loadConfig
8
- } from "./chunk-NZHKAPU6.js";
9
+ } from "./chunk-FJTZKAJA.js";
9
10
  import "./chunk-AKXDQH25.js";
10
11
  import {
11
12
  getGlobalDir
12
13
  } from "./chunk-TN2SYADO.js";
13
14
  import {
14
15
  createAIRunner
15
- } from "./chunk-SAMTXC4A.js";
16
- import "./chunk-AVGZH64A.js";
16
+ } from "./chunk-TFEPHOVE.js";
17
+ import "./chunk-G7QI5WDI.js";
18
+ import "./chunk-2RWGZPNF.js";
17
19
  import "./chunk-DAX3FD2O.js";
18
20
  import "./chunk-GF2RRYHB.js";
19
21
 
@@ -75,4 +77,4 @@ async function analyzeCommand(opts) {
75
77
  export {
76
78
  analyzeCommand
77
79
  };
78
- //# sourceMappingURL=analyze-ZIXNC5GN.js.map
80
+ //# sourceMappingURL=analyze-DBH4K3J7.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/commands/analyze.ts"],"sourcesContent":["import path from 'node:path';\nimport fs from 'node:fs';\nimport { loadConfig } from '../../config.js';\nimport { getGlobalDir } from '../../paths.js';\nimport { createAIRunner } from '../../ai-runner/index.js';\nimport { analyze } from '../../knowledge/KnowledgeAnalyzer.js';\n\ninterface AnalyzeCommandOptions {\n dir?: string;\n output?: string;\n force?: boolean;\n}\n\nfunction resolveOutputPath(explicitOutput?: string): string {\n if (explicitOutput) return path.resolve(explicitOutput);\n\n // Same search order as .env\n const envConfigPath = process.env.IAF_CONFIG_PATH;\n if (envConfigPath) {\n return path.join(path.dirname(envConfigPath), 'knowledge.json');\n }\n\n const cwdCandidate = path.resolve(process.cwd(), 'knowledge.json');\n const globalCandidate = path.join(getGlobalDir(), 'knowledge.json');\n\n // Prefer cwd if .env exists there, otherwise global\n if (fs.existsSync(path.resolve(process.cwd(), '.env'))) {\n return cwdCandidate;\n }\n\n return globalCandidate;\n}\n\nexport async function analyzeCommand(opts: AnalyzeCommandOptions): Promise<void> {\n const config = loadConfig();\n const workDir = opts.dir ? path.resolve(opts.dir) : config.project.workDir;\n const outputPath = resolveOutputPath(opts.output);\n\n if (fs.existsSync(outputPath) && !opts.force) {\n console.log(`\\n knowledge.json already exists at: ${outputPath}`);\n console.log(' Use --force to overwrite.\\n');\n process.exitCode = 1;\n return;\n }\n\n console.log(`\\n Analyzing project: ${workDir}`);\n console.log(` Output: ${outputPath}\\n`);\n\n const aiRunner = createAIRunner(config.ai);\n\n try {\n const knowledge = await analyze({\n workDir,\n aiRunner,\n outputPath,\n });\n\n console.log(' Analysis complete!\\n');\n console.log(` Language: ${knowledge.structure.primaryLanguage}`);\n console.log(` Frameworks: ${knowledge.structure.frameworks.join(', ') || 'none'}`);\n console.log(` Monorepo: ${knowledge.structure.isMonorepo ? 'yes' : 'no'}`);\n console.log(` Pkg Manager: ${knowledge.toolchain.packageManager}`);\n console.log(` Triggers: ${knowledge.ruleTriggers.length} rule(s)`);\n console.log(` Known Issues: ${knowledge.knownIssues.length}`);\n console.log(`\\n Saved to: ${outputPath}\\n`);\n } catch (err) {\n console.error(`\\n Analysis failed: ${(err as Error).message}\\n`);\n process.exitCode = 1;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,OAAO,UAAU;AACjB,OAAO,QAAQ;AAYf,SAAS,kBAAkB,gBAAiC;AAC1D,MAAI,eAAgB,QAAO,KAAK,QAAQ,cAAc;AAGtD,QAAM,gBAAgB,QAAQ,IAAI;AAClC,MAAI,eAAe;AACjB,WAAO,KAAK,KAAK,KAAK,QAAQ,aAAa,GAAG,gBAAgB;AAAA,EAChE;AAEA,QAAM,eAAe,KAAK,QAAQ,QAAQ,IAAI,GAAG,gBAAgB;AACjE,QAAM,kBAAkB,KAAK,KAAK,aAAa,GAAG,gBAAgB;AAGlE,MAAI,GAAG,WAAW,KAAK,QAAQ,QAAQ,IAAI,GAAG,MAAM,CAAC,GAAG;AACtD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,eAAsB,eAAe,MAA4C;AAC/E,QAAM,SAAS,WAAW;AAC1B,QAAM,UAAU,KAAK,MAAM,KAAK,QAAQ,KAAK,GAAG,IAAI,OAAO,QAAQ;AACnE,QAAM,aAAa,kBAAkB,KAAK,MAAM;AAEhD,MAAI,GAAG,WAAW,UAAU,KAAK,CAAC,KAAK,OAAO;AAC5C,YAAQ,IAAI;AAAA,sCAAyC,UAAU,EAAE;AACjE,YAAQ,IAAI,+BAA+B;AAC3C,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,UAAQ,IAAI;AAAA,uBAA0B,OAAO,EAAE;AAC/C,UAAQ,IAAI,aAAa,UAAU;AAAA,CAAI;AAEvC,QAAM,WAAW,eAAe,OAAO,EAAE;AAEzC,MAAI;AACF,UAAM,YAAY,MAAM,QAAQ;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,YAAQ,IAAI,wBAAwB;AACpC,YAAQ,IAAI,kBAAkB,UAAU,UAAU,eAAe,EAAE;AACnE,YAAQ,IAAI,kBAAkB,UAAU,UAAU,WAAW,KAAK,IAAI,KAAK,MAAM,EAAE;AACnF,YAAQ,IAAI,kBAAkB,UAAU,UAAU,aAAa,QAAQ,IAAI,EAAE;AAC7E,YAAQ,IAAI,kBAAkB,UAAU,UAAU,cAAc,EAAE;AAClE,YAAQ,IAAI,kBAAkB,UAAU,aAAa,MAAM,UAAU;AACrE,YAAQ,IAAI,mBAAmB,UAAU,YAAY,MAAM,EAAE;AAC7D,YAAQ,IAAI;AAAA,cAAiB,UAAU;AAAA,CAAI;AAAA,EAC7C,SAAS,KAAK;AACZ,YAAQ,MAAM;AAAA,qBAAyB,IAAc,OAAO;AAAA,CAAI;AAChE,YAAQ,WAAW;AAAA,EACrB;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/cli/commands/analyze.ts"],"sourcesContent":["import path from 'node:path';\nimport fs from 'node:fs';\nimport { loadConfig } from '../../config.js';\nimport { getGlobalDir } from '../../paths.js';\nimport { createAIRunner } from '../../ai-runner/index.js';\nimport { analyze } from '../../knowledge/KnowledgeAnalyzer.js';\n\ninterface AnalyzeCommandOptions {\n dir?: string;\n output?: string;\n force?: boolean;\n}\n\nfunction resolveOutputPath(explicitOutput?: string): string {\n if (explicitOutput) return path.resolve(explicitOutput);\n\n // Same search order as .env\n const envConfigPath = process.env.IAF_CONFIG_PATH;\n if (envConfigPath) {\n return path.join(path.dirname(envConfigPath), 'knowledge.json');\n }\n\n const cwdCandidate = path.resolve(process.cwd(), 'knowledge.json');\n const globalCandidate = path.join(getGlobalDir(), 'knowledge.json');\n\n // Prefer cwd if .env exists there, otherwise global\n if (fs.existsSync(path.resolve(process.cwd(), '.env'))) {\n return cwdCandidate;\n }\n\n return globalCandidate;\n}\n\nexport async function analyzeCommand(opts: AnalyzeCommandOptions): Promise<void> {\n const config = loadConfig();\n const workDir = opts.dir ? path.resolve(opts.dir) : config.project.workDir;\n const outputPath = resolveOutputPath(opts.output);\n\n if (fs.existsSync(outputPath) && !opts.force) {\n console.log(`\\n knowledge.json already exists at: ${outputPath}`);\n console.log(' Use --force to overwrite.\\n');\n process.exitCode = 1;\n return;\n }\n\n console.log(`\\n Analyzing project: ${workDir}`);\n console.log(` Output: ${outputPath}\\n`);\n\n const aiRunner = createAIRunner(config.ai);\n\n try {\n const knowledge = await analyze({\n workDir,\n aiRunner,\n outputPath,\n });\n\n console.log(' Analysis complete!\\n');\n console.log(` Language: ${knowledge.structure.primaryLanguage}`);\n console.log(` Frameworks: ${knowledge.structure.frameworks.join(', ') || 'none'}`);\n console.log(` Monorepo: ${knowledge.structure.isMonorepo ? 'yes' : 'no'}`);\n console.log(` Pkg Manager: ${knowledge.toolchain.packageManager}`);\n console.log(` Triggers: ${knowledge.ruleTriggers.length} rule(s)`);\n console.log(` Known Issues: ${knowledge.knownIssues.length}`);\n console.log(`\\n Saved to: ${outputPath}\\n`);\n } catch (err) {\n console.error(`\\n Analysis failed: ${(err as Error).message}\\n`);\n process.exitCode = 1;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,UAAU;AACjB,OAAO,QAAQ;AAYf,SAAS,kBAAkB,gBAAiC;AAC1D,MAAI,eAAgB,QAAO,KAAK,QAAQ,cAAc;AAGtD,QAAM,gBAAgB,QAAQ,IAAI;AAClC,MAAI,eAAe;AACjB,WAAO,KAAK,KAAK,KAAK,QAAQ,aAAa,GAAG,gBAAgB;AAAA,EAChE;AAEA,QAAM,eAAe,KAAK,QAAQ,QAAQ,IAAI,GAAG,gBAAgB;AACjE,QAAM,kBAAkB,KAAK,KAAK,aAAa,GAAG,gBAAgB;AAGlE,MAAI,GAAG,WAAW,KAAK,QAAQ,QAAQ,IAAI,GAAG,MAAM,CAAC,GAAG;AACtD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,eAAsB,eAAe,MAA4C;AAC/E,QAAM,SAAS,WAAW;AAC1B,QAAM,UAAU,KAAK,MAAM,KAAK,QAAQ,KAAK,GAAG,IAAI,OAAO,QAAQ;AACnE,QAAM,aAAa,kBAAkB,KAAK,MAAM;AAEhD,MAAI,GAAG,WAAW,UAAU,KAAK,CAAC,KAAK,OAAO;AAC5C,YAAQ,IAAI;AAAA,sCAAyC,UAAU,EAAE;AACjE,YAAQ,IAAI,+BAA+B;AAC3C,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,UAAQ,IAAI;AAAA,uBAA0B,OAAO,EAAE;AAC/C,UAAQ,IAAI,aAAa,UAAU;AAAA,CAAI;AAEvC,QAAM,WAAW,eAAe,OAAO,EAAE;AAEzC,MAAI;AACF,UAAM,YAAY,MAAM,QAAQ;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,YAAQ,IAAI,wBAAwB;AACpC,YAAQ,IAAI,kBAAkB,UAAU,UAAU,eAAe,EAAE;AACnE,YAAQ,IAAI,kBAAkB,UAAU,UAAU,WAAW,KAAK,IAAI,KAAK,MAAM,EAAE;AACnF,YAAQ,IAAI,kBAAkB,UAAU,UAAU,aAAa,QAAQ,IAAI,EAAE;AAC7E,YAAQ,IAAI,kBAAkB,UAAU,UAAU,cAAc,EAAE;AAClE,YAAQ,IAAI,kBAAkB,UAAU,aAAa,MAAM,UAAU;AACrE,YAAQ,IAAI,mBAAmB,UAAU,YAAY,MAAM,EAAE;AAC7D,YAAQ,IAAI;AAAA,cAAiB,UAAU;AAAA,CAAI;AAAA,EAC7C,SAAS,KAAK;AACZ,YAAQ,MAAM;AAAA,qBAAyB,IAAc,OAAO;AAAA,CAAI;AAChE,YAAQ,WAAW;AAAA,EACrB;AACF;","names":[]}
@@ -9,25 +9,27 @@ import {
9
9
  import {
10
10
  BraindumpOrchestrator,
11
11
  BraindumpTracker
12
- } from "./chunk-M5C2WILQ.js";
12
+ } from "./chunk-5M5SB6ZA.js";
13
13
  import {
14
14
  AsyncMutex,
15
15
  GitOperations
16
- } from "./chunk-2YQHKXLL.js";
17
- import "./chunk-U237JSLB.js";
18
- import "./chunk-U6GWFTKA.js";
16
+ } from "./chunk-GPZX4DSY.js";
17
+ import "./chunk-MSL7ROVK.js";
18
+ import "./chunk-4XMYOXGZ.js";
19
+ import "./chunk-R32Q3RGK.js";
19
20
  import "./chunk-ACVOOHAR.js";
20
21
  import "./chunk-B7TVVODN.js";
21
- import "./chunk-YCYVNRLF.js";
22
+ import "./chunk-OBGEEGQ3.js";
22
23
  import {
23
24
  loadConfig
24
- } from "./chunk-NZHKAPU6.js";
25
+ } from "./chunk-FJTZKAJA.js";
25
26
  import "./chunk-AKXDQH25.js";
26
27
  import "./chunk-TN2SYADO.js";
27
28
  import {
28
29
  createAIRunner
29
- } from "./chunk-SAMTXC4A.js";
30
- import "./chunk-AVGZH64A.js";
30
+ } from "./chunk-TFEPHOVE.js";
31
+ import "./chunk-G7QI5WDI.js";
32
+ import "./chunk-2RWGZPNF.js";
31
33
  import "./chunk-DAX3FD2O.js";
32
34
  import "./chunk-GF2RRYHB.js";
33
35
 
@@ -207,4 +209,4 @@ ${bold("\u786E\u8BA4\u6267\u884C\uFF1F")} (${green("y")}=\u786E\u8BA4 / ${red("q
207
209
  export {
208
210
  braindumpCommand
209
211
  };
210
- //# sourceMappingURL=braindump-56WAY2RD.js.map
212
+ //# sourceMappingURL=braindump-RYI4BGMG.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/commands/braindump.ts"],"sourcesContent":["import { loadConfig } from '../../config.js';\nimport { GitOperations } from '../../git/GitOperations.js';\nimport { createAIRunner } from '../../ai-runner/index.js';\nimport { AsyncMutex } from '../../utils/AsyncMutex.js';\nimport { BraindumpOrchestrator } from '../../braindump/BraindumpOrchestrator.js';\nimport { BraindumpTracker } from '../../braindump/BraindumpTracker.js';\nimport { BatchStatus } from '../../braindump/BraindumpState.js';\nimport { bold, dim, green, red, cyan, buildServiceUrl } from '../utils/format.js';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport fs from 'node:fs';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nexport interface BraindumpOptions {\n file?: string;\n target?: string;\n concurrency?: number;\n runner?: string;\n auto?: boolean;\n port?: string;\n host?: string;\n}\n\nexport async function braindumpCommand(opts: BraindumpOptions): Promise<void> {\n // 1. Try to proxy to running service\n const baseUrl = buildServiceUrl(opts.host || 'localhost', parseInt(opts.port || '3000', 10));\n try {\n const probe = await fetch(`${baseUrl}/api/status`);\n if (probe.ok) {\n await proxyToService(baseUrl, opts);\n return;\n }\n } catch {\n // Service not running, execute locally\n }\n\n console.log(bold('🧠 Braindump Mode — 批量任务拆分与并行执行\\n'));\n\n // 2. Read input\n let rawInput: string;\n if (opts.file) {\n if (!fs.existsSync(opts.file)) {\n console.error(red(`File not found: ${opts.file}`));\n process.exit(1);\n }\n rawInput = fs.readFileSync(opts.file, 'utf-8');\n } else if (!process.stdin.isTTY) {\n // Read from stdin (pipe)\n rawInput = await readStdin();\n } else {\n console.log(dim('请输入你的想法(按 Ctrl+D 结束输入):'));\n rawInput = await readStdin();\n }\n\n if (!rawInput.trim()) {\n console.error(red('输入为空'));\n process.exit(1);\n }\n\n console.log(dim(`\\n输入内容: ${rawInput.length} 字符\\n`));\n\n // 3. Initialize local orchestrator\n const config = loadConfig();\n const dataDir = path.resolve(__dirname, '../../../data');\n if (!fs.existsSync(dataDir)) fs.mkdirSync(dataDir, { recursive: true });\n\n const mainGit = new GitOperations(config.project.gitRootDir);\n const mainGitMutex = new AsyncMutex();\n const aiRunner = createAIRunner(config.ai);\n const tracker = new BraindumpTracker(dataDir);\n\n const orchestrator = new BraindumpOrchestrator(\n config, mainGit, mainGitMutex, aiRunner, tracker,\n );\n\n // 4. Create batch and split\n const batch = orchestrator.createBatch(rawInput, {\n targetBranch: opts.target,\n maxConcurrent: opts.concurrency,\n defaultAiRunnerMode: opts.runner,\n });\n\n console.log(cyan('正在分析输入内容并拆分任务...\\n'));\n\n await orchestrator.splitBatch(batch.id, (_event) => {\n process.stdout.write(dim('.'));\n });\n console.log('\\n');\n\n // 5. Display tasks\n const currentBatch = tracker.getBatch(batch.id)!;\n console.log(bold(`拆分出 ${currentBatch.tasks.length} 个任务:\\n`));\n console.log(formatTaskTable(currentBatch.tasks));\n\n // 6. Confirm\n if (!opts.auto) {\n const readline = await import('node:readline');\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => {\n rl.question(\n `\\n${bold('确认执行?')} (${green('y')}=确认 / ${red('q')}=取消): `,\n resolve,\n );\n });\n rl.close();\n\n if (answer.trim().toLowerCase() !== 'y') {\n console.log(dim('已取消'));\n process.exit(0);\n }\n }\n\n // 7. Execute\n console.log(cyan('\\n开始并行执行...\\n'));\n orchestrator.confirmBatch(batch.id);\n await orchestrator.executeBatch(batch.id);\n\n const finalBatch = tracker.getBatch(batch.id)!;\n if (finalBatch.status === BatchStatus.Completed) {\n console.log(green(bold('\\n✅ 全部任务完成!')));\n console.log(dim(`Integration 分支: ${finalBatch.integrationBranch}`));\n } else {\n console.log(red(bold('\\n❌ 部分任务失败')));\n for (const task of finalBatch.tasks) {\n if (task.lastError) {\n console.log(red(` - ${task.title}: ${task.lastError}`));\n }\n }\n }\n}\n\nfunction formatTaskTable(tasks: { index: number; title: string; dependsOn: string[]; status: string }[]): string {\n const lines = [' # 标题 依赖 状态', ' ─ ───────────────────────────── ────── ──────'];\n for (const task of tasks) {\n const deps = task.dependsOn.length > 0\n ? task.dependsOn.map((_, i) => `#${i}`).join(',')\n : '-';\n const title = task.title.length > 30 ? task.title.slice(0, 27) + '...' : task.title.padEnd(30);\n lines.push(` ${String(task.index).padEnd(3)}${title} ${deps.padEnd(8)}${task.status}`);\n }\n return lines.join('\\n');\n}\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString('utf-8');\n}\n\nasync function proxyToService(baseUrl: string, opts: BraindumpOptions): Promise<void> {\n console.log(dim(`代理到运行中的服务 (${baseUrl})\\n`));\n\n let rawInput: string;\n if (opts.file) {\n rawInput = fs.readFileSync(opts.file, 'utf-8');\n } else if (!process.stdin.isTTY) {\n rawInput = await readStdin();\n } else {\n console.log(dim('请输入你的想法(按 Ctrl+D 结束输入):'));\n rawInput = await readStdin();\n }\n\n // Create batch via API\n const createRes = await fetch(`${baseUrl}/api/braindump/batches`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n rawInput,\n targetBranch: opts.target,\n maxConcurrent: opts.concurrency,\n defaultAiRunnerMode: opts.runner,\n }),\n });\n const { batch } = await createRes.json() as { batch: { id: string } };\n\n // Split via API (non-streaming for CLI simplicity)\n console.log(cyan('正在拆分任务...'));\n const splitRes = await fetch(`${baseUrl}/api/braindump/batches/${batch.id}/split`, { method: 'POST' });\n\n // Read SSE stream\n if (splitRes.body) {\n const reader = splitRes.body.getReader();\n const decoder = new TextDecoder();\n let done = false;\n while (!done) {\n const { value, done: streamDone } = await reader.read();\n done = streamDone;\n if (value) {\n const text = decoder.decode(value);\n if (text.includes('event: done')) break;\n }\n }\n }\n\n // Get updated batch\n const detailRes = await fetch(`${baseUrl}/api/braindump/batches/${batch.id}`);\n const detail = await detailRes.json() as { batch: { tasks: Array<{ index: number; title: string; dependsOn: string[]; status: string }> } };\n\n console.log(bold(`\\n拆分出 ${detail.batch.tasks.length} 个任务:\\n`));\n console.log(formatTaskTable(detail.batch.tasks));\n\n if (!opts.auto) {\n const readline = await import('node:readline');\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => {\n rl.question(`\\n${bold('确认执行?')} (${green('y')}=确认 / ${red('q')}=取消): `, resolve);\n });\n rl.close();\n if (answer.trim().toLowerCase() !== 'y') {\n console.log(dim('已取消'));\n process.exit(0);\n }\n }\n\n // Confirm and execute\n await fetch(`${baseUrl}/api/braindump/batches/${batch.id}/confirm`, { method: 'POST' });\n console.log(green('\\n执行已启动,可通过 Web UI 查看进度'));\n console.log(dim(`批次 ID: ${batch.id}`));\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/cli/commands/braindump.ts"],"sourcesContent":["import { loadConfig } from '../../config.js';\nimport { GitOperations } from '../../git/GitOperations.js';\nimport { createAIRunner } from '../../ai-runner/index.js';\nimport { AsyncMutex } from '../../utils/AsyncMutex.js';\nimport { BraindumpOrchestrator } from '../../braindump/BraindumpOrchestrator.js';\nimport { BraindumpTracker } from '../../braindump/BraindumpTracker.js';\nimport { BatchStatus } from '../../braindump/BraindumpState.js';\nimport { bold, dim, green, red, cyan, buildServiceUrl } from '../utils/format.js';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport fs from 'node:fs';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nexport interface BraindumpOptions {\n file?: string;\n target?: string;\n concurrency?: number;\n runner?: string;\n auto?: boolean;\n port?: string;\n host?: string;\n}\n\nexport async function braindumpCommand(opts: BraindumpOptions): Promise<void> {\n // 1. Try to proxy to running service\n const baseUrl = buildServiceUrl(opts.host || 'localhost', parseInt(opts.port || '3000', 10));\n try {\n const probe = await fetch(`${baseUrl}/api/status`);\n if (probe.ok) {\n await proxyToService(baseUrl, opts);\n return;\n }\n } catch {\n // Service not running, execute locally\n }\n\n console.log(bold('🧠 Braindump Mode — 批量任务拆分与并行执行\\n'));\n\n // 2. Read input\n let rawInput: string;\n if (opts.file) {\n if (!fs.existsSync(opts.file)) {\n console.error(red(`File not found: ${opts.file}`));\n process.exit(1);\n }\n rawInput = fs.readFileSync(opts.file, 'utf-8');\n } else if (!process.stdin.isTTY) {\n // Read from stdin (pipe)\n rawInput = await readStdin();\n } else {\n console.log(dim('请输入你的想法(按 Ctrl+D 结束输入):'));\n rawInput = await readStdin();\n }\n\n if (!rawInput.trim()) {\n console.error(red('输入为空'));\n process.exit(1);\n }\n\n console.log(dim(`\\n输入内容: ${rawInput.length} 字符\\n`));\n\n // 3. Initialize local orchestrator\n const config = loadConfig();\n const dataDir = path.resolve(__dirname, '../../../data');\n if (!fs.existsSync(dataDir)) fs.mkdirSync(dataDir, { recursive: true });\n\n const mainGit = new GitOperations(config.project.gitRootDir);\n const mainGitMutex = new AsyncMutex();\n const aiRunner = createAIRunner(config.ai);\n const tracker = new BraindumpTracker(dataDir);\n\n const orchestrator = new BraindumpOrchestrator(\n config, mainGit, mainGitMutex, aiRunner, tracker,\n );\n\n // 4. Create batch and split\n const batch = orchestrator.createBatch(rawInput, {\n targetBranch: opts.target,\n maxConcurrent: opts.concurrency,\n defaultAiRunnerMode: opts.runner,\n });\n\n console.log(cyan('正在分析输入内容并拆分任务...\\n'));\n\n await orchestrator.splitBatch(batch.id, (_event) => {\n process.stdout.write(dim('.'));\n });\n console.log('\\n');\n\n // 5. Display tasks\n const currentBatch = tracker.getBatch(batch.id)!;\n console.log(bold(`拆分出 ${currentBatch.tasks.length} 个任务:\\n`));\n console.log(formatTaskTable(currentBatch.tasks));\n\n // 6. Confirm\n if (!opts.auto) {\n const readline = await import('node:readline');\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => {\n rl.question(\n `\\n${bold('确认执行?')} (${green('y')}=确认 / ${red('q')}=取消): `,\n resolve,\n );\n });\n rl.close();\n\n if (answer.trim().toLowerCase() !== 'y') {\n console.log(dim('已取消'));\n process.exit(0);\n }\n }\n\n // 7. Execute\n console.log(cyan('\\n开始并行执行...\\n'));\n orchestrator.confirmBatch(batch.id);\n await orchestrator.executeBatch(batch.id);\n\n const finalBatch = tracker.getBatch(batch.id)!;\n if (finalBatch.status === BatchStatus.Completed) {\n console.log(green(bold('\\n✅ 全部任务完成!')));\n console.log(dim(`Integration 分支: ${finalBatch.integrationBranch}`));\n } else {\n console.log(red(bold('\\n❌ 部分任务失败')));\n for (const task of finalBatch.tasks) {\n if (task.lastError) {\n console.log(red(` - ${task.title}: ${task.lastError}`));\n }\n }\n }\n}\n\nfunction formatTaskTable(tasks: { index: number; title: string; dependsOn: string[]; status: string }[]): string {\n const lines = [' # 标题 依赖 状态', ' ─ ───────────────────────────── ────── ──────'];\n for (const task of tasks) {\n const deps = task.dependsOn.length > 0\n ? task.dependsOn.map((_, i) => `#${i}`).join(',')\n : '-';\n const title = task.title.length > 30 ? task.title.slice(0, 27) + '...' : task.title.padEnd(30);\n lines.push(` ${String(task.index).padEnd(3)}${title} ${deps.padEnd(8)}${task.status}`);\n }\n return lines.join('\\n');\n}\n\nasync function readStdin(): Promise<string> {\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(Buffer.from(chunk));\n }\n return Buffer.concat(chunks).toString('utf-8');\n}\n\nasync function proxyToService(baseUrl: string, opts: BraindumpOptions): Promise<void> {\n console.log(dim(`代理到运行中的服务 (${baseUrl})\\n`));\n\n let rawInput: string;\n if (opts.file) {\n rawInput = fs.readFileSync(opts.file, 'utf-8');\n } else if (!process.stdin.isTTY) {\n rawInput = await readStdin();\n } else {\n console.log(dim('请输入你的想法(按 Ctrl+D 结束输入):'));\n rawInput = await readStdin();\n }\n\n // Create batch via API\n const createRes = await fetch(`${baseUrl}/api/braindump/batches`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n rawInput,\n targetBranch: opts.target,\n maxConcurrent: opts.concurrency,\n defaultAiRunnerMode: opts.runner,\n }),\n });\n const { batch } = await createRes.json() as { batch: { id: string } };\n\n // Split via API (non-streaming for CLI simplicity)\n console.log(cyan('正在拆分任务...'));\n const splitRes = await fetch(`${baseUrl}/api/braindump/batches/${batch.id}/split`, { method: 'POST' });\n\n // Read SSE stream\n if (splitRes.body) {\n const reader = splitRes.body.getReader();\n const decoder = new TextDecoder();\n let done = false;\n while (!done) {\n const { value, done: streamDone } = await reader.read();\n done = streamDone;\n if (value) {\n const text = decoder.decode(value);\n if (text.includes('event: done')) break;\n }\n }\n }\n\n // Get updated batch\n const detailRes = await fetch(`${baseUrl}/api/braindump/batches/${batch.id}`);\n const detail = await detailRes.json() as { batch: { tasks: Array<{ index: number; title: string; dependsOn: string[]; status: string }> } };\n\n console.log(bold(`\\n拆分出 ${detail.batch.tasks.length} 个任务:\\n`));\n console.log(formatTaskTable(detail.batch.tasks));\n\n if (!opts.auto) {\n const readline = await import('node:readline');\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>((resolve) => {\n rl.question(`\\n${bold('确认执行?')} (${green('y')}=确认 / ${red('q')}=取消): `, resolve);\n });\n rl.close();\n if (answer.trim().toLowerCase() !== 'y') {\n console.log(dim('已取消'));\n process.exit(0);\n }\n }\n\n // Confirm and execute\n await fetch(`${baseUrl}/api/braindump/batches/${batch.id}/confirm`, { method: 'POST' });\n console.log(green('\\n执行已启动,可通过 Web UI 查看进度'));\n console.log(dim(`批次 ID: ${batch.id}`));\n}\n"],"mappings":"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","names":[]}
@@ -48,12 +48,15 @@ var AIExecutionError = class extends AppError {
48
48
  output;
49
49
  exitCode;
50
50
  isRetryable;
51
+ /** Agent was still actively producing output when timeout fired — soft failure */
52
+ wasActiveAtTimeout;
51
53
  constructor(phase, message, opts) {
52
54
  super("AI_EXECUTION_ERROR", message, opts?.cause);
53
55
  this.phase = phase;
54
56
  this.output = opts?.output;
55
57
  this.exitCode = opts?.exitCode;
56
58
  this.isRetryable = opts?.isRetryable ?? true;
59
+ this.wasActiveAtTimeout = opts?.wasActiveAtTimeout ?? false;
57
60
  }
58
61
  };
59
62
 
@@ -208,4 +211,4 @@ export {
208
211
  PipelineNotFoundError,
209
212
  UnregisteredPhasesError
210
213
  };
211
- //# sourceMappingURL=chunk-AVGZH64A.js.map
214
+ //# sourceMappingURL=chunk-2RWGZPNF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors/BaseError.ts","../src/errors/ApiError.ts","../src/errors/AIExecutionError.ts","../src/errors/NotFoundError.ts","../src/errors/InvalidOperationError.ts","../src/errors/ShutdownError.ts","../src/errors/PhaseAbortedError.ts","../src/errors/ParseError.ts","../src/errors/RegistryError.ts"],"sourcesContent":["/**\n * Base application error with structured error code and cause chain.\n */\nexport class AppError extends Error {\n /** Unique error code for programmatic matching (e.g. 'GONGFENG_API_ERROR'). */\n public readonly code: string;\n /** Original cause, if any. */\n public override readonly cause?: Error;\n\n constructor(code: string, message: string, cause?: Error) {\n super(message, { cause });\n this.name = this.constructor.name;\n this.code = code;\n this.cause = cause;\n }\n\n toJSON(): Record<string, unknown> {\n return {\n name: this.name,\n code: this.code,\n message: this.message,\n ...(this.cause ? { cause: this.cause.message } : {}),\n };\n }\n}\n","import { AppError } from './BaseError.js';\n\nexport class GongfengApiError extends AppError {\n public readonly statusCode: number;\n public readonly responseBody?: string;\n\n constructor(statusCode: number, message: string, responseBody?: string) {\n super('GONGFENG_API_ERROR', message);\n this.statusCode = statusCode;\n this.responseBody = responseBody;\n }\n\n /** Whether this error is potentially retryable (5xx or network). */\n get isRetryable(): boolean {\n return this.statusCode >= 500 || this.statusCode === 0;\n }\n}\n\nexport class GongfengUploadError extends GongfengApiError {\n constructor(statusCode: number, message: string, responseBody?: string) {\n super(statusCode, message, responseBody);\n this.name = 'GongfengUploadError';\n // Override code\n Object.defineProperty(this, 'code', { value: 'GONGFENG_UPLOAD_ERROR' });\n }\n}\n","import { AppError } from './BaseError.js';\n\nexport class AIExecutionError extends AppError {\n public readonly phase: string;\n public readonly output?: string;\n public readonly exitCode?: number | null;\n public readonly isRetryable: boolean;\n /** Agent was still actively producing output when timeout fired — soft failure */\n public readonly wasActiveAtTimeout: boolean;\n\n constructor(phase: string, message: string, opts?: { output?: string; exitCode?: number | null; cause?: Error; isRetryable?: boolean; wasActiveAtTimeout?: boolean }) {\n super('AI_EXECUTION_ERROR', message, opts?.cause);\n this.phase = phase;\n this.output = opts?.output;\n this.exitCode = opts?.exitCode;\n this.isRetryable = opts?.isRetryable ?? true;\n this.wasActiveAtTimeout = opts?.wasActiveAtTimeout ?? false;\n }\n}\n","import { AppError } from './BaseError.js';\n\nexport class IssueNotFoundError extends AppError {\n public readonly issueIid: number;\n constructor(issueIid: number) {\n super('ISSUE_NOT_FOUND', `Issue ${issueIid} not found in tracker`);\n this.issueIid = issueIid;\n }\n}\n\nexport class BatchNotFoundError extends AppError {\n public readonly batchId: string;\n constructor(batchId: string) {\n super('BATCH_NOT_FOUND', `Braindump batch not found: ${batchId}`);\n this.batchId = batchId;\n }\n}\n\nexport class SessionNotFoundError extends AppError {\n public readonly sessionId: string;\n constructor(sessionId: string) {\n super('SESSION_NOT_FOUND', `Chat session not found: ${sessionId}`);\n this.sessionId = sessionId;\n }\n}\n\nexport class TaskNotFoundError extends AppError {\n public readonly taskId: string;\n constructor(taskId: string) {\n super('TASK_NOT_FOUND', `Braindump task not found: ${taskId}`);\n this.taskId = taskId;\n }\n}\n","import { AppError } from './BaseError.js';\n\nexport class InvalidPhaseError extends AppError {\n public readonly phase: string;\n constructor(phase: string, message?: string) {\n super('INVALID_PHASE', message ?? `Invalid phase for retry: ${phase}`);\n this.phase = phase;\n }\n}\n\nexport class InvalidStateError extends AppError {\n public readonly state: string;\n constructor(state: string, message?: string) {\n super('INVALID_STATE', message ?? `Invalid state: ${state}`);\n this.state = state;\n }\n}\n\nexport class PortExhaustionError extends AppError {\n constructor(message?: string) {\n super('PORT_EXHAUSTION', message ?? 'No available ports in the configured range');\n }\n}\n\nexport class SessionLimitError extends AppError {\n public readonly limit: number;\n constructor(limit: number) {\n super('SESSION_LIMIT', `Session message limit reached (${limit})`);\n this.limit = limit;\n }\n}\n","import { AppError } from './BaseError.js';\n\nexport class ServiceShutdownError extends AppError {\n constructor() {\n super('SERVICE_SHUTDOWN', 'Service shutting down');\n }\n}\n","import { AppError } from './BaseError.js';\n\n/**\n * 用户主动中止/重做/重启阶段时抛出,中断 PhaseLoopStep 循环。\n *\n * 在 PipelineOrchestrator 的 catch 块中被特殊处理,\n * 不会进入 handleFailure 路径。\n */\nexport class PhaseAbortedError extends AppError {\n public readonly phaseName: string;\n public readonly action: 'abort' | 'redo' | 'restart';\n\n constructor(phaseName: string, action: 'abort' | 'redo' | 'restart') {\n super('PHASE_ABORTED', `Phase '${phaseName}' interrupted by user action '${action}'`);\n this.phaseName = phaseName;\n this.action = action;\n }\n}\n","import { AppError } from './BaseError.js';\n\nexport class AIOutputParseError extends AppError {\n public readonly rawOutput?: string;\n constructor(message: string, rawOutput?: string) {\n super('AI_OUTPUT_PARSE_ERROR', message);\n this.rawOutput = rawOutput;\n }\n}\n","import { AppError } from './BaseError.js';\n\nexport class PhaseNotRegisteredError extends AppError {\n public readonly phaseName: string;\n public readonly registeredPhases: string[];\n constructor(phaseName: string, registeredPhases: string[]) {\n super(\n 'PHASE_NOT_REGISTERED',\n `Unknown phase: ${phaseName}. Registered phases: ${registeredPhases.join(', ')}`,\n );\n this.phaseName = phaseName;\n this.registeredPhases = registeredPhases;\n }\n}\n\nexport class RunnerNotRegisteredError extends AppError {\n public readonly mode: string;\n public readonly registeredModes: string[];\n constructor(mode: string, registeredModes: string[]) {\n super(\n 'RUNNER_NOT_REGISTERED',\n `Unknown AI runner mode: ${mode}. Registered modes: ${registeredModes.join(', ')}`,\n );\n this.mode = mode;\n this.registeredModes = registeredModes;\n }\n}\n\nexport class PipelineNotFoundError extends AppError {\n public readonly pipelineMode: string;\n constructor(pipelineMode: string) {\n super('PIPELINE_NOT_FOUND', `Unknown pipeline mode: ${pipelineMode}`);\n this.pipelineMode = pipelineMode;\n }\n}\n\nexport class UnregisteredPhasesError extends AppError {\n public readonly missingPhases: string[];\n public readonly registeredPhases: string[];\n constructor(missingPhases: string[], registeredPhases: string[]) {\n super(\n 'UNREGISTERED_PHASES',\n `Pipeline defines unregistered phases: ${missingPhases.join(', ')}. Registered: ${registeredPhases.join(', ')}`,\n );\n this.missingPhases = missingPhases;\n this.registeredPhases = registeredPhases;\n }\n}\n"],"mappings":"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","names":[]}