@xdevops/issue-auto-finish 1.0.83 → 1.0.85

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 (86) hide show
  1. package/dist/{LockNote-7OF7ADI2.js → LockNote-Z2CLDZNN.js} +3 -3
  2. package/dist/{ai-runner-MCGEQGXS.js → ai-runner-SVUNA3FX.js} +2 -2
  3. package/dist/{analyze-ZITN3CSH.js → analyze-SXXPE5XL.js} +3 -3
  4. package/dist/{braindump-LQU65XND.js → braindump-4E5SDMSZ.js} +6 -6
  5. package/dist/{chunk-7FLKETBC.js → chunk-4LFNFRCL.js} +13 -1
  6. package/dist/chunk-4LFNFRCL.js.map +1 -0
  7. package/dist/{chunk-HKI3BON6.js → chunk-4QV6D34Y.js} +3 -3
  8. package/dist/{chunk-UDCMSDNT.js → chunk-5UPYA6KH.js} +528 -214
  9. package/dist/chunk-5UPYA6KH.js.map +1 -0
  10. package/dist/{chunk-MV2CADMB.js → chunk-FWEW5E3B.js} +2 -2
  11. package/dist/{chunk-NZ7K73B7.js → chunk-GXFG4JU6.js} +2 -2
  12. package/dist/{chunk-3V3GQCB7.js → chunk-HDFNMVRQ.js} +2 -2
  13. package/dist/{chunk-3RNGPMRE.js → chunk-HOFYJEJ4.js} +7 -7
  14. package/dist/{chunk-LFN7NUFS.js → chunk-JINMYD56.js} +3 -3
  15. package/dist/{chunk-GV2ORWT3.js → chunk-K2OTLYJI.js} +118 -17
  16. package/dist/chunk-K2OTLYJI.js.map +1 -0
  17. package/dist/{chunk-GDTS2J2P.js → chunk-KTYPZTF4.js} +2 -2
  18. package/dist/{chunk-6S7ERGQ7.js → chunk-P4O4ZXEC.js} +10 -5
  19. package/dist/chunk-P4O4ZXEC.js.map +1 -0
  20. package/dist/{chunk-KWODU7HB.js → chunk-YCYVNRLF.js} +15 -1
  21. package/dist/chunk-YCYVNRLF.js.map +1 -0
  22. package/dist/cli.js +8 -8
  23. package/dist/{config-C7AKWCPA.js → config-QLINHCHD.js} +3 -3
  24. package/dist/{doctor-P2ZH6PFX.js → doctor-37JNBGDN.js} +3 -3
  25. package/dist/errors/PhaseAbortedError.d.ts +13 -0
  26. package/dist/errors/PhaseAbortedError.d.ts.map +1 -0
  27. package/dist/errors/index.d.ts +1 -0
  28. package/dist/errors/index.d.ts.map +1 -1
  29. package/dist/events/EventBus.d.ts +1 -1
  30. package/dist/events/EventBus.d.ts.map +1 -1
  31. package/dist/i18n/locales/en.d.ts.map +1 -1
  32. package/dist/i18n/locales/zh-CN.d.ts.map +1 -1
  33. package/dist/index.js +11 -11
  34. package/dist/{init-D2BQIVVD.js → init-TDKDC6YP.js} +7 -7
  35. package/dist/lib.js +5 -5
  36. package/dist/lifecycle/ActionLifecycle.d.ts +1 -1
  37. package/dist/lifecycle/ActionLifecycle.d.ts.map +1 -1
  38. package/dist/lifecycle/ActionLifecycleManager.d.ts.map +1 -1
  39. package/dist/orchestrator/IssueProcessingContext.d.ts +3 -0
  40. package/dist/orchestrator/IssueProcessingContext.d.ts.map +1 -1
  41. package/dist/orchestrator/PipelineOrchestrator.d.ts +19 -0
  42. package/dist/orchestrator/PipelineOrchestrator.d.ts.map +1 -1
  43. package/dist/orchestrator/steps/FailureHandler.d.ts.map +1 -1
  44. package/dist/orchestrator/steps/PhaseLoopStep.d.ts.map +1 -1
  45. package/dist/phases/BasePhase.d.ts +10 -8
  46. package/dist/phases/BasePhase.d.ts.map +1 -1
  47. package/dist/phases/UatPhase.d.ts +32 -1
  48. package/dist/phases/UatPhase.d.ts.map +1 -1
  49. package/dist/pipeline/PipelineDefinition.d.ts.map +1 -1
  50. package/dist/prompts/templates.d.ts.map +1 -1
  51. package/dist/{restart-KFRHCALK.js → restart-RNXGTDWZ.js} +5 -5
  52. package/dist/run.js +11 -11
  53. package/dist/{start-46GW453L.js → start-27GRO4DP.js} +5 -5
  54. package/dist/tracker/IssueState.d.ts +4 -0
  55. package/dist/tracker/IssueState.d.ts.map +1 -1
  56. package/dist/tracker/IssueTracker.d.ts +2 -0
  57. package/dist/tracker/IssueTracker.d.ts.map +1 -1
  58. package/dist/webhook/CommandExecutor.d.ts +3 -0
  59. package/dist/webhook/CommandExecutor.d.ts.map +1 -1
  60. package/dist/webhook/CommandParser.d.ts +1 -1
  61. package/dist/webhook/CommandParser.d.ts.map +1 -1
  62. package/package.json +2 -1
  63. package/src/web/frontend/dist/assets/{index-GfpCL9Wn.js → index-C4NXoH9S.js} +55 -49
  64. package/src/web/frontend/dist/assets/{index-CPNbFsHB.css → index-C7lorIa0.css} +1 -1
  65. package/src/web/frontend/dist/index.html +2 -2
  66. package/dist/chunk-6S7ERGQ7.js.map +0 -1
  67. package/dist/chunk-7FLKETBC.js.map +0 -1
  68. package/dist/chunk-GV2ORWT3.js.map +0 -1
  69. package/dist/chunk-KWODU7HB.js.map +0 -1
  70. package/dist/chunk-UDCMSDNT.js.map +0 -1
  71. /package/dist/{LockNote-7OF7ADI2.js.map → LockNote-Z2CLDZNN.js.map} +0 -0
  72. /package/dist/{ai-runner-MCGEQGXS.js.map → ai-runner-SVUNA3FX.js.map} +0 -0
  73. /package/dist/{analyze-ZITN3CSH.js.map → analyze-SXXPE5XL.js.map} +0 -0
  74. /package/dist/{braindump-LQU65XND.js.map → braindump-4E5SDMSZ.js.map} +0 -0
  75. /package/dist/{chunk-HKI3BON6.js.map → chunk-4QV6D34Y.js.map} +0 -0
  76. /package/dist/{chunk-MV2CADMB.js.map → chunk-FWEW5E3B.js.map} +0 -0
  77. /package/dist/{chunk-NZ7K73B7.js.map → chunk-GXFG4JU6.js.map} +0 -0
  78. /package/dist/{chunk-3V3GQCB7.js.map → chunk-HDFNMVRQ.js.map} +0 -0
  79. /package/dist/{chunk-3RNGPMRE.js.map → chunk-HOFYJEJ4.js.map} +0 -0
  80. /package/dist/{chunk-LFN7NUFS.js.map → chunk-JINMYD56.js.map} +0 -0
  81. /package/dist/{chunk-GDTS2J2P.js.map → chunk-KTYPZTF4.js.map} +0 -0
  82. /package/dist/{config-C7AKWCPA.js.map → config-QLINHCHD.js.map} +0 -0
  83. /package/dist/{doctor-P2ZH6PFX.js.map → doctor-37JNBGDN.js.map} +0 -0
  84. /package/dist/{init-D2BQIVVD.js.map → init-TDKDC6YP.js.map} +0 -0
  85. /package/dist/{restart-KFRHCALK.js.map → restart-RNXGTDWZ.js.map} +0 -0
  86. /package/dist/{start-46GW453L.js.map → start-27GRO4DP.js.map} +0 -0
@@ -7,7 +7,7 @@ import {
7
7
  import {
8
8
  getBinaryEnvKey,
9
9
  getDefaultBinary
10
- } from "./chunk-7FLKETBC.js";
10
+ } from "./chunk-4LFNFRCL.js";
11
11
 
12
12
  // src/config.ts
13
13
  import { config as loadDotenv } from "dotenv";
@@ -428,4 +428,4 @@ export {
428
428
  resetDotenvCache,
429
429
  reloadConfig
430
430
  };
431
- //# sourceMappingURL=chunk-MV2CADMB.js.map
431
+ //# sourceMappingURL=chunk-FWEW5E3B.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  t
3
- } from "./chunk-KWODU7HB.js";
3
+ } from "./chunk-YCYVNRLF.js";
4
4
 
5
5
  // src/coordination/LockNote.ts
6
6
  var LOCK_NOTE_REGEX = /<!-- iaf-lock:(\{.*?\}) -->/;
@@ -66,4 +66,4 @@ export {
66
66
  findAllLockNotes,
67
67
  isLockStale
68
68
  };
69
- //# sourceMappingURL=chunk-NZ7K73B7.js.map
69
+ //# sourceMappingURL=chunk-GXFG4JU6.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  t
3
- } from "./chunk-KWODU7HB.js";
3
+ } from "./chunk-YCYVNRLF.js";
4
4
 
5
5
  // src/cli/setup/DependencyChecker.ts
6
6
  import { spawn } from "child_process";
@@ -407,4 +407,4 @@ async function* streamProcessLines(proc, timeoutMs) {
407
407
  export {
408
408
  DependencyChecker
409
409
  };
410
- //# sourceMappingURL=chunk-3V3GQCB7.js.map
410
+ //# sourceMappingURL=chunk-HDFNMVRQ.js.map
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  ConfigGenerator,
3
3
  PreflightChecker
4
- } from "./chunk-GDTS2J2P.js";
4
+ } from "./chunk-KTYPZTF4.js";
5
5
  import {
6
6
  DependencyChecker
7
- } from "./chunk-3V3GQCB7.js";
7
+ } from "./chunk-HDFNMVRQ.js";
8
8
  import {
9
9
  getProjectKnowledge
10
10
  } from "./chunk-ACVOOHAR.js";
11
11
  import {
12
12
  resolveConfigFilePath
13
- } from "./chunk-MV2CADMB.js";
13
+ } from "./chunk-FWEW5E3B.js";
14
14
  import {
15
15
  analyze,
16
16
  collectStaticInfo
@@ -172,7 +172,7 @@ var E2ESetupRunner = class {
172
172
  const step = "reload";
173
173
  yield { step, status: "running", message: "Reloading configuration..." };
174
174
  try {
175
- const { reloadConfig } = await import("./config-C7AKWCPA.js");
175
+ const { reloadConfig } = await import("./config-QLINHCHD.js");
176
176
  reloadConfig();
177
177
  yield { step, status: "done", message: "Configuration reloaded" };
178
178
  } catch (err) {
@@ -468,8 +468,8 @@ function createSetupRouter(deps = {}) {
468
468
  sse.write({ step: "collected", message: "Static info collected" });
469
469
  sse.write({ step: "analyzing", message: "Running AI analysis..." });
470
470
  try {
471
- const { loadConfig } = await import("./config-C7AKWCPA.js");
472
- const { createAIRunner } = await import("./ai-runner-MCGEQGXS.js");
471
+ const { loadConfig } = await import("./config-QLINHCHD.js");
472
+ const { createAIRunner } = await import("./ai-runner-SVUNA3FX.js");
473
473
  const config = loadConfig();
474
474
  const runner = createAIRunner(config.ai);
475
475
  const knowledge = await analyze({ workDir, aiRunner: runner });
@@ -549,4 +549,4 @@ function createSetupRouter(deps = {}) {
549
549
  export {
550
550
  createSetupRouter
551
551
  };
552
- //# sourceMappingURL=chunk-3RNGPMRE.js.map
552
+ //# sourceMappingURL=chunk-HOFYJEJ4.js.map
@@ -6,10 +6,10 @@ import {
6
6
  import {
7
7
  ConfigGenerator,
8
8
  PreflightChecker
9
- } from "./chunk-GDTS2J2P.js";
9
+ } from "./chunk-KTYPZTF4.js";
10
10
  import {
11
11
  resolveConfigFilePath
12
- } from "./chunk-MV2CADMB.js";
12
+ } from "./chunk-FWEW5E3B.js";
13
13
  import {
14
14
  ensureDir,
15
15
  resolveLogsDir
@@ -110,4 +110,4 @@ async function startDaemon(configPath) {
110
110
  export {
111
111
  startCommand
112
112
  };
113
- //# sourceMappingURL=chunk-LFN7NUFS.js.map
113
+ //# sourceMappingURL=chunk-JINMYD56.js.map
@@ -1,16 +1,16 @@
1
1
  import {
2
2
  BraindumpOrchestrator,
3
3
  BraindumpTracker
4
- } from "./chunk-HKI3BON6.js";
4
+ } from "./chunk-4QV6D34Y.js";
5
5
  import {
6
6
  createSetupRouter
7
- } from "./chunk-3RNGPMRE.js";
7
+ } from "./chunk-HOFYJEJ4.js";
8
8
  import {
9
9
  buildLockNoteBody,
10
10
  buildReleaseNoteBody,
11
11
  findAllLockNotes,
12
12
  findLockNote
13
- } from "./chunk-NZ7K73B7.js";
13
+ } from "./chunk-GXFG4JU6.js";
14
14
  import {
15
15
  BrainstormService,
16
16
  GongfengClient,
@@ -33,7 +33,7 @@ import {
33
33
  setE2eOverride,
34
34
  setNoteSyncOverride,
35
35
  validatePhaseRegistry
36
- } from "./chunk-UDCMSDNT.js";
36
+ } from "./chunk-5UPYA6KH.js";
37
37
  import {
38
38
  AsyncMutex,
39
39
  BaseTracker,
@@ -42,7 +42,7 @@ import {
42
42
  getExternalId,
43
43
  getIid,
44
44
  getTitle
45
- } from "./chunk-6S7ERGQ7.js";
45
+ } from "./chunk-P4O4ZXEC.js";
46
46
  import {
47
47
  IwikiImporter,
48
48
  getProjectKnowledge,
@@ -51,11 +51,11 @@ import {
51
51
  import {
52
52
  setLocale,
53
53
  t
54
- } from "./chunk-KWODU7HB.js";
54
+ } from "./chunk-YCYVNRLF.js";
55
55
  import {
56
56
  loadConfig,
57
57
  reloadConfig
58
- } from "./chunk-MV2CADMB.js";
58
+ } from "./chunk-FWEW5E3B.js";
59
59
  import {
60
60
  resolveDisplayHost
61
61
  } from "./chunk-AKXDQH25.js";
@@ -80,7 +80,7 @@ import {
80
80
  resolveModelForRunner,
81
81
  setShuttingDown,
82
82
  validateRunnerRegistry
83
- } from "./chunk-7FLKETBC.js";
83
+ } from "./chunk-4LFNFRCL.js";
84
84
  import {
85
85
  logger
86
86
  } from "./chunk-GF2RRYHB.js";
@@ -985,6 +985,41 @@ function createApiRouter(trackerOrDeps, config, agentLogStore, orchestrator, mai
985
985
  res.status(400).json({ error: msg });
986
986
  }
987
987
  });
988
+ router.post("/api/issues/:iid/abort", (req, res) => {
989
+ const iid = parseInt(req.params.iid, 10);
990
+ try {
991
+ poller?.forceReleaseIssue(iid);
992
+ orch.abortIssue(iid);
993
+ res.json({ success: true, message: `Issue #${iid} aborted` });
994
+ } catch (err) {
995
+ const msg = err.message;
996
+ logger7.error("Abort failed", { iid, error: msg });
997
+ res.status(400).json({ error: msg });
998
+ }
999
+ });
1000
+ router.post("/api/issues/:iid/continue", (req, res) => {
1001
+ const iid = parseInt(req.params.iid, 10);
1002
+ try {
1003
+ orch.continueIssue(iid);
1004
+ res.json({ success: true, message: `Issue #${iid} continued` });
1005
+ } catch (err) {
1006
+ const msg = err.message;
1007
+ logger7.error("Continue failed", { iid, error: msg });
1008
+ res.status(400).json({ error: msg });
1009
+ }
1010
+ });
1011
+ router.post("/api/issues/:iid/redo-phase", (req, res) => {
1012
+ const iid = parseInt(req.params.iid, 10);
1013
+ try {
1014
+ poller?.forceReleaseIssue(iid);
1015
+ orch.redoPhase(iid);
1016
+ res.json({ success: true, message: `Issue #${iid} phase redone` });
1017
+ } catch (err) {
1018
+ const msg = err.message;
1019
+ logger7.error("Redo-phase failed", { iid, error: msg });
1020
+ res.status(400).json({ error: msg });
1021
+ }
1022
+ });
988
1023
  router.put("/api/issues/:iid/plans/:filename", (req, res) => {
989
1024
  const iid = parseInt(req.params.iid, 10);
990
1025
  const filename = req.params.filename;
@@ -1560,7 +1595,7 @@ data: ${JSON.stringify({ time: (/* @__PURE__ */ new Date()).toISOString() })}
1560
1595
  const issueId = getExternalId(record);
1561
1596
  const iid = getIid(record);
1562
1597
  const notes = await gongfeng.listIssueNotes(issueId);
1563
- const { findLockNote: findLockNote2 } = await import("./LockNote-7OF7ADI2.js");
1598
+ const { findLockNote: findLockNote2 } = await import("./LockNote-Z2CLDZNN.js");
1564
1599
  const existingLock = findLockNote2(notes);
1565
1600
  if (!existingLock) {
1566
1601
  const result = await claimer.tryClaim(
@@ -1964,6 +1999,10 @@ function buildPhaseStatusMap(def, lm) {
1964
1999
  const failedKey = `failed:${phase.name}`;
1965
2000
  result[failedKey] = lm.derivePhaseStatuses("failed" /* Failed */, phase.name);
1966
2001
  }
2002
+ {
2003
+ const pausedKey = `paused:${phase.name}`;
2004
+ result[pausedKey] = lm.derivePhaseStatuses("paused" /* Paused */, phase.name);
2005
+ }
1967
2006
  }
1968
2007
  return result;
1969
2008
  }
@@ -2365,7 +2404,7 @@ function createKnowledgeRouter(deps) {
2365
2404
  heartbeat = setInterval(() => {
2366
2405
  sendProgress({ step: "analyzing", current: 2, total, message: "AI \u5206\u6790\u4E2D...", elapsed: Date.now() - aiStart });
2367
2406
  }, 3e3);
2368
- const { createAIRunner: createAIRunner2 } = await import("./ai-runner-MCGEQGXS.js");
2407
+ const { createAIRunner: createAIRunner2 } = await import("./ai-runner-SVUNA3FX.js");
2369
2408
  const runner = createAIRunner2(config.ai);
2370
2409
  const { analyze } = await import("./KnowledgeAnalyzer-MTTTSSHX.js");
2371
2410
  const knowledge = await analyze({ workDir, aiRunner: runner, syncToProject: config.sync.knowledgeToProject });
@@ -2410,7 +2449,7 @@ function createKnowledgeRouter(deps) {
2410
2449
  (async () => {
2411
2450
  try {
2412
2451
  sendProgress({ step: "collecting", current: 1, total, message: "\u68C0\u6D4B\u53D8\u66F4\u5E76\u6536\u96C6\u4FE1\u606F..." });
2413
- const { createAIRunner: createAIRunner2 } = await import("./ai-runner-MCGEQGXS.js");
2452
+ const { createAIRunner: createAIRunner2 } = await import("./ai-runner-SVUNA3FX.js");
2414
2453
  const { analyzeIncremental } = await import("./KnowledgeAnalyzer-MTTTSSHX.js");
2415
2454
  const runner = createAIRunner2(config.ai);
2416
2455
  sendProgress({ step: "analyzing", current: 2, total, message: "\u589E\u91CF\u5206\u6790\u4E2D..." });
@@ -2694,7 +2733,7 @@ function createDomainModelRouter(deps) {
2694
2733
  }
2695
2734
  (async () => {
2696
2735
  try {
2697
- const { createAIRunner: createAIRunner2 } = await import("./ai-runner-MCGEQGXS.js");
2736
+ const { createAIRunner: createAIRunner2 } = await import("./ai-runner-SVUNA3FX.js");
2698
2737
  const runner = createAIRunner2(config.ai);
2699
2738
  const model = await analyzer.analyze({
2700
2739
  workDir: config.project.workDir,
@@ -2908,7 +2947,7 @@ function createSystemUseCaseRouter(deps) {
2908
2947
  }
2909
2948
  (async () => {
2910
2949
  try {
2911
- const { createAIRunner: createAIRunner2 } = await import("./ai-runner-MCGEQGXS.js");
2950
+ const { createAIRunner: createAIRunner2 } = await import("./ai-runner-SVUNA3FX.js");
2912
2951
  const runner = createAIRunner2(config.ai);
2913
2952
  const model = await analyzer.analyze({
2914
2953
  workDir: config.project.workDir,
@@ -3098,7 +3137,7 @@ function createSystemUseCaseRouter(deps) {
3098
3137
  res.status(404).json({ error: "No domain model loaded \u2014 run domain analysis first" });
3099
3138
  return;
3100
3139
  }
3101
- const { createAIRunner: createAIRunner2 } = await import("./ai-runner-MCGEQGXS.js");
3140
+ const { createAIRunner: createAIRunner2 } = await import("./ai-runner-SVUNA3FX.js");
3102
3141
  const runner = createAIRunner2(config.ai);
3103
3142
  const associations = await analyzer.suggestDomainAssociations(
3104
3143
  useCaseModel,
@@ -5225,15 +5264,39 @@ var EXACT_PATTERNS = [
5225
5264
  build: () => ({ intent: "restart" })
5226
5265
  },
5227
5266
  {
5228
- regex: /(?:重新开始|从头(?:开始|来|做)|重做)/,
5267
+ regex: /(?:重新开始|从头(?:开始|来|做))/,
5229
5268
  build: () => ({ intent: "restart" })
5230
5269
  },
5270
+ {
5271
+ regex: /abort\b/i,
5272
+ build: () => ({ intent: "abort" })
5273
+ },
5274
+ {
5275
+ regex: /(?:暂停|中止|中断)/,
5276
+ build: () => ({ intent: "abort" })
5277
+ },
5278
+ {
5279
+ regex: /continue\b/i,
5280
+ build: () => ({ intent: "continue" })
5281
+ },
5282
+ {
5283
+ regex: /(?:继续|恢复|恢复执行|继续执行)/,
5284
+ build: () => ({ intent: "continue" })
5285
+ },
5286
+ {
5287
+ regex: /redo\b/i,
5288
+ build: () => ({ intent: "redo" })
5289
+ },
5290
+ {
5291
+ regex: /(?:重做|重来|重做当前|当前阶段重[来做])/,
5292
+ build: () => ({ intent: "redo" })
5293
+ },
5231
5294
  {
5232
5295
  regex: /cancel\b/i,
5233
5296
  build: () => ({ intent: "cancel" })
5234
5297
  },
5235
5298
  {
5236
- regex: /(?:取消|中止|停止处理)/,
5299
+ regex: /(?:取消|取消跟踪|停止处理)/,
5237
5300
  build: () => ({ intent: "cancel" })
5238
5301
  },
5239
5302
  {
@@ -5405,6 +5468,12 @@ var CommandExecutor = class {
5405
5468
  return this.handleRestart(iid);
5406
5469
  case "cancel":
5407
5470
  return this.handleCancel(iid);
5471
+ case "abort":
5472
+ return this.handleAbort(iid);
5473
+ case "continue":
5474
+ return this.handleContinue(iid);
5475
+ case "redo":
5476
+ return this.handleRedo(iid);
5408
5477
  case "preview":
5409
5478
  return this.handlePreview(iid);
5410
5479
  case "stop-preview":
@@ -5539,6 +5608,38 @@ var CommandExecutor = class {
5539
5608
  return this.fail(err.message);
5540
5609
  }
5541
5610
  }
5611
+ handleAbort(iid) {
5612
+ const record = this.tracker.get(iid);
5613
+ if (!record) return this.notTracked(iid);
5614
+ try {
5615
+ this.poller?.forceReleaseIssue(iid);
5616
+ this.orchestrator.abortIssue(iid);
5617
+ } catch (err) {
5618
+ return this.fail(err.message);
5619
+ }
5620
+ return this.ok(t("cmd.abortSuccess", { iid }));
5621
+ }
5622
+ handleContinue(iid) {
5623
+ const record = this.tracker.get(iid);
5624
+ if (!record) return this.notTracked(iid);
5625
+ try {
5626
+ this.orchestrator.continueIssue(iid);
5627
+ } catch (err) {
5628
+ return this.fail(err.message);
5629
+ }
5630
+ return this.ok(t("cmd.continueSuccess", { iid }));
5631
+ }
5632
+ handleRedo(iid) {
5633
+ const record = this.tracker.get(iid);
5634
+ if (!record) return this.notTracked(iid);
5635
+ try {
5636
+ this.poller?.forceReleaseIssue(iid);
5637
+ this.orchestrator.redoPhase(iid);
5638
+ } catch (err) {
5639
+ return this.fail(err.message);
5640
+ }
5641
+ return this.ok(t("cmd.redoSuccess", { iid }));
5642
+ }
5542
5643
  handlePreview(iid) {
5543
5644
  const record = this.tracker.get(iid);
5544
5645
  if (!record) return this.notTracked(iid);
@@ -8904,4 +9005,4 @@ function migrateKnowledgeDir(srcDir, destDir) {
8904
9005
  export {
8905
9006
  main
8906
9007
  };
8907
- //# sourceMappingURL=chunk-GV2ORWT3.js.map
9008
+ //# sourceMappingURL=chunk-K2OTLYJI.js.map