@kenkaiiii/ggcoder 4.15.0 → 5.0.0

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 (183) hide show
  1. package/dist/cli/command-routing.d.ts +1 -1
  2. package/dist/cli/command-routing.d.ts.map +1 -1
  3. package/dist/cli/command-routing.js +1 -3
  4. package/dist/cli/command-routing.js.map +1 -1
  5. package/dist/cli/command-routing.test.js +0 -1
  6. package/dist/cli/command-routing.test.js.map +1 -1
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +1 -29
  9. package/dist/cli.js.map +1 -1
  10. package/dist/core/agent-session.d.ts.map +1 -1
  11. package/dist/core/agent-session.js +6 -3
  12. package/dist/core/agent-session.js.map +1 -1
  13. package/dist/core/ideal-review.d.ts +12 -1
  14. package/dist/core/ideal-review.d.ts.map +1 -1
  15. package/dist/core/ideal-review.js +52 -2
  16. package/dist/core/ideal-review.js.map +1 -1
  17. package/dist/core/ideal-review.test.js +41 -1
  18. package/dist/core/ideal-review.test.js.map +1 -1
  19. package/dist/ui/App.d.ts +3 -7
  20. package/dist/ui/App.d.ts.map +1 -1
  21. package/dist/ui/App.js +17 -105
  22. package/dist/ui/App.js.map +1 -1
  23. package/dist/ui/components/ActivityIndicator.d.ts +1 -1
  24. package/dist/ui/components/ActivityIndicator.d.ts.map +1 -1
  25. package/dist/ui/components/AnimationContext.d.ts +1 -1
  26. package/dist/ui/components/AnimationContext.d.ts.map +1 -1
  27. package/dist/ui/components/AssistantMessage.d.ts +1 -1
  28. package/dist/ui/components/AssistantMessage.d.ts.map +1 -1
  29. package/dist/ui/components/BackgroundTasksBar.d.ts +1 -2
  30. package/dist/ui/components/BackgroundTasksBar.d.ts.map +1 -1
  31. package/dist/ui/components/Banner.d.ts +1 -2
  32. package/dist/ui/components/Banner.d.ts.map +1 -1
  33. package/dist/ui/components/ChatFooterPane.d.ts +1 -2
  34. package/dist/ui/components/ChatFooterPane.d.ts.map +1 -1
  35. package/dist/ui/components/ChatInputStack.d.ts +1 -1
  36. package/dist/ui/components/ChatInputStack.d.ts.map +1 -1
  37. package/dist/ui/components/ChatLayout.d.ts +4 -4
  38. package/dist/ui/components/ChatLayout.d.ts.map +1 -1
  39. package/dist/ui/components/ChatLivePane.d.ts +1 -1
  40. package/dist/ui/components/ChatLivePane.d.ts.map +1 -1
  41. package/dist/ui/components/ChatScreen.d.ts +1 -2
  42. package/dist/ui/components/ChatScreen.d.ts.map +1 -1
  43. package/dist/ui/components/ChatScreen.js +1 -1
  44. package/dist/ui/components/ChatScreen.js.map +1 -1
  45. package/dist/ui/components/ChatStatusRow.d.ts +1 -1
  46. package/dist/ui/components/ChatStatusRow.d.ts.map +1 -1
  47. package/dist/ui/components/CompactionNotice.d.ts +2 -3
  48. package/dist/ui/components/CompactionNotice.d.ts.map +1 -1
  49. package/dist/ui/components/DiffFrame.d.ts +1 -1
  50. package/dist/ui/components/DiffFrame.d.ts.map +1 -1
  51. package/dist/ui/components/DiffView.d.ts +1 -2
  52. package/dist/ui/components/DiffView.d.ts.map +1 -1
  53. package/dist/ui/components/Footer.d.ts +1 -2
  54. package/dist/ui/components/Footer.d.ts.map +1 -1
  55. package/dist/ui/components/FooterStatusRow.d.ts +1 -2
  56. package/dist/ui/components/FooterStatusRow.d.ts.map +1 -1
  57. package/dist/ui/components/FullScreenOverlayRouter.d.ts +2 -9
  58. package/dist/ui/components/FullScreenOverlayRouter.d.ts.map +1 -1
  59. package/dist/ui/components/FullScreenOverlayRouter.js +1 -5
  60. package/dist/ui/components/FullScreenOverlayRouter.js.map +1 -1
  61. package/dist/ui/components/IdealHookMessage.d.ts +1 -1
  62. package/dist/ui/components/IdealHookMessage.d.ts.map +1 -1
  63. package/dist/ui/components/InputArea.d.ts +1 -2
  64. package/dist/ui/components/InputArea.d.ts.map +1 -1
  65. package/dist/ui/components/InputArea.js +1 -6
  66. package/dist/ui/components/InputArea.js.map +1 -1
  67. package/dist/ui/components/LiveToolPanel.d.ts +1 -2
  68. package/dist/ui/components/LiveToolPanel.d.ts.map +1 -1
  69. package/dist/ui/components/Markdown.d.ts +2 -2
  70. package/dist/ui/components/Markdown.d.ts.map +1 -1
  71. package/dist/ui/components/ModelSelector.d.ts +1 -2
  72. package/dist/ui/components/ModelSelector.d.ts.map +1 -1
  73. package/dist/ui/components/Overlay.d.ts +1 -1
  74. package/dist/ui/components/Overlay.d.ts.map +1 -1
  75. package/dist/ui/components/PlanApproval.d.ts +1 -2
  76. package/dist/ui/components/PlanApproval.d.ts.map +1 -1
  77. package/dist/ui/components/PlanBanner.d.ts +1 -2
  78. package/dist/ui/components/PlanBanner.d.ts.map +1 -1
  79. package/dist/ui/components/PlanModeLogo.d.ts +1 -2
  80. package/dist/ui/components/PlanModeLogo.d.ts.map +1 -1
  81. package/dist/ui/components/PlanOverlay.d.ts +2 -3
  82. package/dist/ui/components/PlanOverlay.d.ts.map +1 -1
  83. package/dist/ui/components/PlanProgress.d.ts +1 -2
  84. package/dist/ui/components/PlanProgress.d.ts.map +1 -1
  85. package/dist/ui/components/QueueIndicator.d.ts +1 -2
  86. package/dist/ui/components/QueueIndicator.d.ts.map +1 -1
  87. package/dist/ui/components/RewindOverlay.d.ts +1 -2
  88. package/dist/ui/components/RewindOverlay.d.ts.map +1 -1
  89. package/dist/ui/components/SelectList.d.ts +1 -2
  90. package/dist/ui/components/SelectList.d.ts.map +1 -1
  91. package/dist/ui/components/ServerToolExecution.d.ts +1 -2
  92. package/dist/ui/components/ServerToolExecution.d.ts.map +1 -1
  93. package/dist/ui/components/SessionSelector.d.ts +1 -2
  94. package/dist/ui/components/SessionSelector.d.ts.map +1 -1
  95. package/dist/ui/components/SessionSummary.d.ts +1 -2
  96. package/dist/ui/components/SessionSummary.d.ts.map +1 -1
  97. package/dist/ui/components/SettingsSelector.d.ts +1 -2
  98. package/dist/ui/components/SettingsSelector.d.ts.map +1 -1
  99. package/dist/ui/components/SkillsOverlay.d.ts +1 -2
  100. package/dist/ui/components/SkillsOverlay.d.ts.map +1 -1
  101. package/dist/ui/components/SlashCommandMenu.d.ts +1 -2
  102. package/dist/ui/components/SlashCommandMenu.d.ts.map +1 -1
  103. package/dist/ui/components/SlashStyledSelectList.d.ts +1 -2
  104. package/dist/ui/components/SlashStyledSelectList.d.ts.map +1 -1
  105. package/dist/ui/components/Spinner.d.ts +1 -2
  106. package/dist/ui/components/Spinner.d.ts.map +1 -1
  107. package/dist/ui/components/StreamingArea.d.ts +1 -1
  108. package/dist/ui/components/StreamingArea.d.ts.map +1 -1
  109. package/dist/ui/components/SubAgentPanel.d.ts +1 -2
  110. package/dist/ui/components/SubAgentPanel.d.ts.map +1 -1
  111. package/dist/ui/components/TaskPickerMenu.d.ts +1 -2
  112. package/dist/ui/components/TaskPickerMenu.d.ts.map +1 -1
  113. package/dist/ui/components/ThemeSelector.d.ts +1 -2
  114. package/dist/ui/components/ThemeSelector.d.ts.map +1 -1
  115. package/dist/ui/components/ThinkingBlock.d.ts +1 -1
  116. package/dist/ui/components/ThinkingBlock.d.ts.map +1 -1
  117. package/dist/ui/components/ToolExecution.d.ts +1 -2
  118. package/dist/ui/components/ToolExecution.d.ts.map +1 -1
  119. package/dist/ui/components/ToolGroupExecution.d.ts +1 -2
  120. package/dist/ui/components/ToolGroupExecution.d.ts.map +1 -1
  121. package/dist/ui/components/TranscriptViewport.d.ts +1 -1
  122. package/dist/ui/components/TranscriptViewport.d.ts.map +1 -1
  123. package/dist/ui/components/UserMessage.d.ts +1 -2
  124. package/dist/ui/components/UserMessage.d.ts.map +1 -1
  125. package/dist/ui/hooks/useAgentLoop.d.ts +1 -1
  126. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
  127. package/dist/ui/hooks/useAgentLoop.js +1 -3
  128. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  129. package/dist/ui/layout-decisions.d.ts +1 -1
  130. package/dist/ui/layout-decisions.d.ts.map +1 -1
  131. package/dist/ui/render.d.ts +4 -12
  132. package/dist/ui/render.d.ts.map +1 -1
  133. package/dist/ui/render.js +1 -3
  134. package/dist/ui/render.js.map +1 -1
  135. package/dist/ui/transcript/MiscRows.d.ts +7 -8
  136. package/dist/ui/transcript/MiscRows.d.ts.map +1 -1
  137. package/dist/ui/transcript/StatusRow.d.ts +1 -1
  138. package/dist/ui/transcript/StatusRow.d.ts.map +1 -1
  139. package/dist/ui/transcript/ToolRows.d.ts +6 -7
  140. package/dist/ui/transcript/ToolRows.d.ts.map +1 -1
  141. package/dist/ui/transcript/TranscriptItemFrame.d.ts +1 -1
  142. package/dist/ui/transcript/TranscriptItemFrame.d.ts.map +1 -1
  143. package/package.json +4 -5
  144. package/dist/cli/pixel.d.ts +0 -27
  145. package/dist/cli/pixel.d.ts.map +0 -1
  146. package/dist/cli/pixel.js +0 -103
  147. package/dist/cli/pixel.js.map +0 -1
  148. package/dist/core/pixel-fix-agent.d.ts +0 -24
  149. package/dist/core/pixel-fix-agent.d.ts.map +0 -1
  150. package/dist/core/pixel-fix-agent.js +0 -49
  151. package/dist/core/pixel-fix-agent.js.map +0 -1
  152. package/dist/core/pixel-fix.d.ts +0 -70
  153. package/dist/core/pixel-fix.d.ts.map +0 -1
  154. package/dist/core/pixel-fix.js +0 -338
  155. package/dist/core/pixel-fix.js.map +0 -1
  156. package/dist/core/pixel-fix.test.d.ts +0 -2
  157. package/dist/core/pixel-fix.test.d.ts.map +0 -1
  158. package/dist/core/pixel-fix.test.js +0 -310
  159. package/dist/core/pixel-fix.test.js.map +0 -1
  160. package/dist/core/pixel.d.ts +0 -37
  161. package/dist/core/pixel.d.ts.map +0 -1
  162. package/dist/core/pixel.js +0 -378
  163. package/dist/core/pixel.js.map +0 -1
  164. package/dist/core/pixel.test.d.ts +0 -2
  165. package/dist/core/pixel.test.d.ts.map +0 -1
  166. package/dist/core/pixel.test.js +0 -269
  167. package/dist/core/pixel.test.js.map +0 -1
  168. package/dist/ui/components/PixelOverlay.d.ts +0 -12
  169. package/dist/ui/components/PixelOverlay.d.ts.map +0 -1
  170. package/dist/ui/components/PixelOverlay.js +0 -117
  171. package/dist/ui/components/PixelOverlay.js.map +0 -1
  172. package/dist/ui/hooks/usePixelFixFlow.d.ts +0 -57
  173. package/dist/ui/hooks/usePixelFixFlow.d.ts.map +0 -1
  174. package/dist/ui/hooks/usePixelFixFlow.js +0 -102
  175. package/dist/ui/hooks/usePixelFixFlow.js.map +0 -1
  176. package/dist/ui/pixel.d.ts +0 -23
  177. package/dist/ui/pixel.d.ts.map +0 -1
  178. package/dist/ui/pixel.js +0 -393
  179. package/dist/ui/pixel.js.map +0 -1
  180. package/dist/ui/pixel.test.d.ts +0 -2
  181. package/dist/ui/pixel.test.d.ts.map +0 -1
  182. package/dist/ui/pixel.test.js +0 -138
  183. package/dist/ui/pixel.test.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ideal-review.d.ts","sourceRoot":"","sources":["../../src/core/ideal-review.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,eAAO,MAAM,mBAAmB,QAM6C,CAAC;AAI9E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,mBAAmB,CAyChF;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAM3E;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEhE"}
1
+ {"version":3,"file":"ideal-review.d.ts","sourceRoot":"","sources":["../../src/core/ideal-review.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,OAAO,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,eAAO,MAAM,mBAAmB,QAM6C,CAAC;AAI9E,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,mBAAmB,CAyChF;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,YAAY,GAAE,SAAS,MAAM,EAAO,GACnC,OAAO,CAYT;AAOD;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,EAC9B,GAAG,EAAE,MAAM,EACX,UAAU,GAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAoB,GAC9C,MAAM,EAAE,CAwBV;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEhE"}
@@ -1,3 +1,5 @@
1
+ import { existsSync } from "node:fs";
2
+ import path from "node:path";
1
3
  export const IDEAL_REVIEW_PROMPT = "Ideal? Review the actual work against the user's request before the final response. " +
2
4
  "Is it simple, focused, correct, and aligned? Did you over-edit, leave TODOs, miss an obvious " +
3
5
  "case the request called for, or introduce risk? Judge this by reading the code you changed \u2014 " +
@@ -42,13 +44,61 @@ export function evaluateIdealReview(stats) {
42
44
  }
43
45
  return { shouldReview: score >= 4, score, reasons };
44
46
  }
45
- export function buildIdealReviewMessage(reasons) {
47
+ export function buildIdealReviewMessage(reasons, driftedFiles = []) {
46
48
  const reasonText = reasons.length > 0 ? ` Triggered because: ${reasons.join(", ")}.` : "";
49
+ const driftText = driftedFiles.length > 0
50
+ ? ` Also: you changed ${driftedFiles.join(", ")} but the matching test file was not updated. ` +
51
+ `Update the test to match the new behavior, or state plainly why the existing test is still valid. ` +
52
+ `Edit the test only \u2014 do not run the suite now.`
53
+ : "";
47
54
  return {
48
55
  role: "user",
49
- content: `${IDEAL_REVIEW_PROMPT}${reasonText}`,
56
+ content: `${IDEAL_REVIEW_PROMPT}${reasonText}${driftText}`,
50
57
  };
51
58
  }
59
+ // A test file: foo.test.ts, foo.spec.tsx, foo.test.mjs, etc.
60
+ const TEST_FILE_RE = /\.(test|spec)\.[cm]?[jt]sx?$/;
61
+ // A source code file we can pair with a sibling test.
62
+ const CODE_EXT_RE = /\.([cm]?[jt]sx?)$/;
63
+ /**
64
+ * Test-drift detector \u2014 the one stranding signal a typechecker is blind to.
65
+ * Given the set of files the run mutated, return the source files whose sibling
66
+ * test exists on disk but was NOT touched this run (a green-but-stale test).
67
+ *
68
+ * Pure structural check: no sibling test on disk \u2192 no signal, so it stays
69
+ * silent on projects (or files) without co-located tests. `fileExists` is
70
+ * injectable for tests; paths are resolved against `cwd` so relative tool paths
71
+ * and absolute ones compare consistently.
72
+ */
73
+ export function detectTestDrift(touchedFiles, cwd, fileExists = existsSync) {
74
+ const resolved = new Map(); // absolute -> original (as the model wrote it)
75
+ for (const f of touchedFiles)
76
+ resolved.set(path.resolve(cwd, f), f);
77
+ const touchedSet = new Set(resolved.keys());
78
+ const drifted = [];
79
+ for (const [abs, original] of resolved) {
80
+ const base = path.basename(abs);
81
+ if (TEST_FILE_RE.test(base))
82
+ continue; // the file itself is a test
83
+ const match = base.match(CODE_EXT_RE);
84
+ if (!match)
85
+ continue; // not a code file
86
+ const ext = match[1];
87
+ const dir = path.dirname(abs);
88
+ const stem = base.slice(0, base.length - ext.length - 1);
89
+ // Tests commonly drop the JSX `x` (Button.tsx -> Button.test.ts), so try the
90
+ // source ext and its non-JSX variant against both .test and .spec.
91
+ const testExts = ext.endsWith("x") ? [ext, ext.slice(0, -1)] : [ext];
92
+ const candidates = testExts
93
+ .flatMap((e) => [`${stem}.test.${e}`, `${stem}.spec.${e}`])
94
+ .map((c) => path.join(dir, c));
95
+ if (candidates.some((c) => touchedSet.has(c)))
96
+ continue; // sibling test was updated
97
+ if (candidates.some((c) => fileExists(c)))
98
+ drifted.push(original);
99
+ }
100
+ return drifted;
101
+ }
52
102
  export function shouldCountAsRiskyTool(toolName) {
53
103
  return RISKY_TOOL_NAMES.has(toolName);
54
104
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ideal-review.js","sourceRoot":"","sources":["../../src/core/ideal-review.ts"],"names":[],"mappings":"AAkBA,MAAM,CAAC,MAAM,mBAAmB,GAC9B,sFAAsF;IACtF,+FAA+F;IAC/F,oGAAoG;IACpG,8FAA8F;IAC9F,2FAA2F;IAC3F,2EAA2E,CAAC;AAE9E,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAE5D,MAAM,UAAU,mBAAmB,CAAC,KAAuB;IACzD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,IAAI,KAAK,CAAC,YAAY,IAAI,GAAG,EAAE,CAAC;QAC9B,KAAK,IAAI,CAAC,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,YAAY,gBAAgB,CAAC,CAAC;IACtD,CAAC;SAAM,IAAI,KAAK,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;QACpC,KAAK,IAAI,CAAC,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,YAAY,gBAAgB,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;QACzB,KAAK,IAAI,CAAC,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,SAAS,aAAa,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;QAC5C,KAAK,IAAI,CAAC,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,SAAS,sBAAsB,CAAC,CAAC;IAC5E,CAAC;SAAM,IAAI,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC;QACnD,KAAK,IAAI,CAAC,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,SAAS,sBAAsB,CAAC,CAAC;IAC5E,CAAC;IAED,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;QAClE,KAAK,IAAI,CAAC,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,KAAK,CAAC,YAAY,GAAG,CAAC,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,YAAY,oBAAoB,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;QACrB,KAAK,IAAI,CAAC,CAAC;QACX,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,cAAc,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAA0B;IAChE,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,uBAAuB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1F,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,GAAG,mBAAmB,GAAG,UAAU,EAAE;KAC/C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAgB;IACrD,OAAO,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACxC,CAAC"}
1
+ {"version":3,"file":"ideal-review.js","sourceRoot":"","sources":["../../src/core/ideal-review.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, it } from "vitest";
2
- import { buildIdealReviewMessage, evaluateIdealReview } from "./ideal-review.js";
2
+ import { buildIdealReviewMessage, detectTestDrift, evaluateIdealReview } from "./ideal-review.js";
3
3
  describe("evaluateIdealReview", () => {
4
4
  it("skips tiny text-only changes", () => {
5
5
  const decision = evaluateIdealReview({
@@ -55,5 +55,45 @@ describe("buildIdealReviewMessage", () => {
55
55
  expect(message.content).toContain("do NOT run builds, typechecks, linters, or test suites now");
56
56
  expect(message.content).toContain("/commit");
57
57
  });
58
+ it("calls out drifted files and their stale tests", () => {
59
+ const message = buildIdealReviewMessage([], ["src/foo.ts"]);
60
+ expect(message.content).toContain("src/foo.ts");
61
+ expect(message.content).toContain("matching test file was not updated");
62
+ });
63
+ });
64
+ describe("detectTestDrift", () => {
65
+ const cwd = "/proj";
66
+ const exists = (files) => {
67
+ const set = new Set(files);
68
+ return (p) => set.has(p);
69
+ };
70
+ it("flags a changed source whose sibling test exists but was not touched", () => {
71
+ const drift = detectTestDrift(["src/foo.ts"], cwd, exists(["/proj/src/foo.test.ts"]));
72
+ expect(drift).toEqual(["src/foo.ts"]);
73
+ });
74
+ it("stays silent when the sibling test was updated in the same run", () => {
75
+ const drift = detectTestDrift(["src/foo.ts", "src/foo.test.ts"], cwd, exists(["/proj/src/foo.test.ts"]));
76
+ expect(drift).toEqual([]);
77
+ });
78
+ it("stays silent when no sibling test exists on disk", () => {
79
+ const drift = detectTestDrift(["src/foo.ts"], cwd, exists([]));
80
+ expect(drift).toEqual([]);
81
+ });
82
+ it("ignores test files that are themselves the change", () => {
83
+ const drift = detectTestDrift(["src/foo.test.ts"], cwd, exists(["/proj/src/foo.test.ts"]));
84
+ expect(drift).toEqual([]);
85
+ });
86
+ it("ignores non-code files", () => {
87
+ const drift = detectTestDrift(["README.md"], cwd, exists(["/proj/README.test.md"]));
88
+ expect(drift).toEqual([]);
89
+ });
90
+ it("matches .spec siblings and resolves absolute paths", () => {
91
+ const drift = detectTestDrift(["/proj/src/bar.tsx"], cwd, exists(["/proj/src/bar.spec.tsx"]));
92
+ expect(drift).toEqual(["/proj/src/bar.tsx"]);
93
+ });
94
+ it("matches a .test.ts sibling for a .tsx source (test drops the x)", () => {
95
+ const drift = detectTestDrift(["src/Button.tsx"], cwd, exists(["/proj/src/Button.test.ts"]));
96
+ expect(drift).toEqual(["src/Button.tsx"]);
97
+ });
58
98
  });
59
99
  //# sourceMappingURL=ideal-review.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ideal-review.test.js","sourceRoot":"","sources":["../../src/core/ideal-review.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ideal-review.test.js","sourceRoot":"","sources":["../../src/core/ideal-review.test.ts"],"names":[],"mappings":"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"}
package/dist/ui/App.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- import React from "react";
2
1
  import { type Message, type Provider, type ThinkingLevel } from "@kenkaiiii/gg-ai";
3
2
  import type { AgentTool } from "@kenkaiiii/gg-agent";
4
3
  import type { ProcessManager } from "../core/process-manager.js";
@@ -55,8 +54,6 @@ export interface AppProps {
55
54
  skills?: Skill[];
56
55
  /** Per-session file checkpoint store backing the /rewind command. */
57
56
  checkpointStore?: CheckpointStore;
58
- initialOverlay?: "pixel";
59
- rebuildToolsForCwd?: (cwd: string) => Promise<AgentTool[]>;
60
57
  /** Rebuild the `read` tool for a model (reuses the read tracker). Used on
61
58
  * model switch so the tool's video capability tracks the active model. */
62
59
  rebuildReadTool?: (model: string) => AgentTool;
@@ -97,7 +94,7 @@ export interface AppProps {
97
94
  * a full unmount/remount is the only consistent reset.
98
95
  *
99
96
  * Used by every path that previously did a bare ANSI screen clear:
100
- * `/clear`, plan accept/reject, overlay open/close, pixel fix.
97
+ * `/clear`, plan accept/reject, overlay open/close.
101
98
  *
102
99
  * Runtime state (model, provider, thinking) survives via
103
100
  * `onRuntimeStateChange`; conversation/session state survives via
@@ -146,7 +143,7 @@ export interface AppProps {
146
143
  sessionId?: string;
147
144
  sessionTitle?: string;
148
145
  sessionTitleGenerated: boolean;
149
- overlay?: "model" | "skills" | "plan" | "theme" | "pixel" | null;
146
+ overlay?: "model" | "skills" | "plan" | "theme" | null;
150
147
  planAutoExpand?: boolean;
151
148
  pendingAction?: {
152
149
  prompt: string;
@@ -159,11 +156,10 @@ export interface AppProps {
159
156
  isAgentRunning?: boolean;
160
157
  pendingResetUI?: boolean;
161
158
  runAllTasks?: boolean;
162
- runAllPixel?: boolean;
163
159
  planMode?: boolean;
164
160
  sessionStats?: SessionStats;
165
161
  idealReviewEnabled?: boolean;
166
162
  };
167
163
  }
168
- export declare function App(props: AppProps): React.JSX.Element;
164
+ export declare function App(props: AppProps): import("react/jsx-runtime").JSX.Element;
169
165
  //# sourceMappingURL=App.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAC;AAqBjF,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,aAAa,EAEnB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAcrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAwBjE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,EAAkB,eAAe,EAAe,MAAM,6BAA6B,CAAC;AAEhG,OAAO,EAOL,KAAK,QAAQ,EACd,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAa3D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAQpE,OAAO,EAIL,KAAK,UAAU,EAChB,MAAM,uBAAuB,CAAC;AAS/B,OAAO,EAOL,KAAK,YAAY,EAClB,MAAM,sBAAsB,CAAC;AAY9B,OAAO,KAAK,EACV,aAAa,EAYd,MAAM,gBAAgB,CAAC;AAExB,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAOnE,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,+BAA+B,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC/F,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EACL,6BAA6B,EAC7B,oBAAoB,EACpB,8BAA8B,EAC9B,mBAAmB,EACnB,gCAAgC,EAChC,qBAAqB,EACrB,+BAA+B,EAC/B,mCAAmC,EACnC,kCAAkC,EAClC,uCAAuC,EACvC,wCAAwC,EACxC,gCAAgC,GACjC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,kBAAkB,EAClB,kCAAkC,GACnC,MAAM,mBAAmB,CAAC;AAiB3B,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC3D,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAC5B,MAAM,EACN;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAClF,CAAC;IACF,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC;IACnC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,qEAAqE;IACrE,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC3D;+EAC2E;IAC3E,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;IAC/C,sBAAsB,CAAC,EAAE,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACpD,aAAa,CAAC,EAAE;QACd,WAAW,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACxD,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;KACpD,CAAC;IACF,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;IAChD;;;;;;;OAOG;IACH,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACjD;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE;QACnB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;QACrB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;QAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE;YACd,MAAM,EAAE,MAAM,CAAC;YACf,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,SAAS,CAAC,EAAE;gBAAE,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;gBAAC,MAAM,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;SAC/E,CAAC;KACH,KAAK,IAAI,CAAC;IACX;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,CAAC,OAAO,EAAE;QAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,QAAQ,CAAC,EAAE,aAAa,CAAC;KAC1B,KAAK,IAAI,CAAC;IACX;;;;;OAKG;IACH,YAAY,CAAC,EAAE;QACb,QAAQ,EAAE,OAAO,EAAE,CAAC;QACpB,OAAO,EAAE,aAAa,EAAE,CAAC;QACzB,SAAS,CAAC,EAAE,aAAa,EAAE,CAAC;QAC5B,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;QAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,SAAS,EAAE,QAAQ,EAAE,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,qBAAqB,EAAE,OAAO,CAAC;QAC/B,OAAO,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,IAAI,CAAC;QACjE,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,aAAa,CAAC,EAAE;YACd,MAAM,EAAE,MAAM,CAAC;YACf,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,SAAS,CAAC,EAAE;gBAAE,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;gBAAC,MAAM,CAAC,EAAE,MAAM,CAAA;aAAE,CAAC;SAC/E,CAAC;QACF,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,YAAY,CAAC,EAAE,YAAY,CAAC;QAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B,CAAC;CACH;AAuBD,wBAAgB,GAAG,CAAC,KAAK,EAAE,QAAQ,qBA24FlC"}
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../src/ui/App.tsx"],"names":[],"mappings":"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"}
package/dist/ui/App.js CHANGED
@@ -7,7 +7,6 @@ import { useTaskPickerController } from "./hooks/useTaskPickerController.js";
7
7
  import { useModeState } from "./hooks/useModeState.js";
8
8
  import { useSessionPersistence } from "./hooks/useSessionPersistence.js";
9
9
  import { useContextCompaction } from "./hooks/useContextCompaction.js";
10
- import { usePixelFixFlow } from "./hooks/usePixelFixFlow.js";
11
10
  import { useDoublePress } from "./hooks/useDoublePress.js";
12
11
  import { useTaskBarStore, useTaskBarPolling, focusTaskBar, exitTaskBar, expandTaskBar, collapseTaskBar, navigateTaskBar, killTask, } from "./stores/taskbar-store.js";
13
12
  import { playNotificationSound } from "../utils/sound.js";
@@ -43,7 +42,7 @@ import { getNextPendingTask, markTaskInProgress } from "../core/tasks-store.js";
43
42
  import { buildUserContentWithAttachments } from "./prompt-routing.js";
44
43
  import { submitPromptCommand } from "./submit-prompt-command.js";
45
44
  import { handleUiSlashCommand } from "./submit-slash-commands.js";
46
- import { buildIdealReviewMessage, evaluateIdealReview } from "../core/ideal-review.js";
45
+ import { buildIdealReviewMessage, evaluateIdealReview, detectTestDrift, } from "../core/ideal-review.js";
47
46
  import { buildLoopBreakMessage, evaluateLoopBreak } from "../core/loop-breaker.js";
48
47
  import { buildRegroundingMessage } from "../core/regrounding.js";
49
48
  import { getNextThinkingLevel, isThinkingLevelSupported } from "./thinking-level.js";
@@ -143,9 +142,8 @@ export function App(props) {
143
142
  // separate from `liveItems` (the scrollback record) so tool calls mutate in
144
143
  // place above the activity bar instead of spamming the transcript.
145
144
  const [liveToolFeed, setLiveToolFeed] = useState([]);
146
- // overlay seeded from sessionStore (lives across remount). Falls back to
147
- // props.initialOverlay (CLI launched with one), then null.
148
- const [overlay, setOverlay] = useState(props.sessionStore?.overlay ?? props.initialOverlay ?? null);
145
+ // overlay seeded from sessionStore (lives across remount), then null.
146
+ const [overlay, setOverlay] = useState(props.sessionStore?.overlay ?? null);
149
147
  const [updatePending, setUpdatePending] = useState(() => getPendingUpdate(props.version) !== null);
150
148
  // Signal that pushes text into the InputArea composer (e.g. restoring queued
151
149
  // messages after an interrupt). Bumping `nonce` triggers the injection even
@@ -155,11 +153,9 @@ export function App(props) {
155
153
  const [runAllTasks, setRunAllTasks] = useState(props.sessionStore?.runAllTasks ?? false);
156
154
  const runAllTasksRef = useRef(props.sessionStore?.runAllTasks ?? false);
157
155
  const startTaskRef = useRef(() => { });
158
- const runAllPixelRef = useRef(props.sessionStore?.runAllPixel ?? false);
159
- const currentPixelFixRef = useRef(null);
160
- const startPixelFixRef = useRef(() => { });
161
156
  const cwdRef = useRef(props.cwd);
162
- const [displayedCwd, setDisplayedCwd] = useState(props.cwd);
157
+ // The project root is fixed for the session's lifetime, so this never changes.
158
+ const displayedCwd = props.cwd;
163
159
  // /rewind overlay: holds the checkpoint list while the picker is open.
164
160
  const [rewindCheckpoints, setRewindCheckpoints] = useState(null);
165
161
  // Monotonic user-turn counter keying per-turn checkpoints.
@@ -214,7 +210,7 @@ export function App(props) {
214
210
  /**
215
211
  * Languages whose style packs are currently injected into the system prompt.
216
212
  * Grown by `maybeInjectLanguagePacks` after `write`/`bash` tool results when
217
- * the language detector sees new marker files. Reset on `chdir` (pixel-fix).
213
+ * the language detector sees new marker files.
218
214
  * Only grows within a session; we never strip packs once injected (cheaper
219
215
  * than invalidating prompt caching, and stale guidance is harmless).
220
216
  */
@@ -362,8 +358,7 @@ export function App(props) {
362
358
  const activeProjectId = currentCreds?.projectId ?? props.projectId;
363
359
  const activeBaseUrl = currentProvider === "gemini" ? undefined : (currentCreds?.baseUrl ?? props.baseUrl);
364
360
  const contextWindowOptions = useMemo(() => ({ provider: currentProvider, accountId: activeAccountId }), [currentProvider, activeAccountId]);
365
- // Load git branch — re-runs whenever the displayed cwd changes (e.g. when
366
- // a pixel fix moves the agent into a different project root).
361
+ // Load git branch — re-runs whenever the displayed cwd changes.
367
362
  useEffect(() => {
368
363
  getGitBranch(displayedCwd).then(setGitBranch);
369
364
  }, [displayedCwd]);
@@ -513,8 +508,7 @@ export function App(props) {
513
508
  * tools that can introduce new marker files (package.json, Cargo.toml, etc.).
514
509
  * Other tool kinds skip detection entirely to avoid wasted filesystem stats.
515
510
  *
516
- * No restart required: the system prompt is mutated in place, same mechanism
517
- * used for pixel-fix chdir.
511
+ * No restart required: the system prompt is mutated in place.
518
512
  *
519
513
  * Stored in a ref so `onToolEnd` (whose useCallback dep array is intentionally
520
514
  * empty to keep agent-loop options stable) can call the freshest version.
@@ -597,21 +591,25 @@ export function App(props) {
597
591
  projectId: activeProjectId,
598
592
  resolveCredentials,
599
593
  transformContext,
600
- getIdealReviewMessage: (stats) => {
594
+ getIdealReviewMessage: (stats, touchedFiles) => {
601
595
  if (!idealReviewEnabledRef.current)
602
596
  return null;
603
597
  const decision = evaluateIdealReview(stats);
604
- if (!decision.shouldReview)
598
+ // Test drift fires the review even when the volume score is too low to
599
+ // trigger on its own \u2014 a stale sibling test is invisible to typecheck.
600
+ const driftedFiles = detectTestDrift(touchedFiles, process.cwd()).slice(0, 5);
601
+ if (!decision.shouldReview && driftedFiles.length === 0)
605
602
  return null;
606
603
  log("INFO", "ideal", "Injecting ideal review before final response", {
607
604
  score: String(decision.score),
608
605
  reasons: decision.reasons.join(", "),
606
+ testDrift: driftedFiles.join(", "),
609
607
  });
610
608
  setLiveItems((prev) => [
611
609
  ...prev,
612
610
  { kind: "ideal_hook", text: IDEAL_HOOK_NOTICE_TEXT, tone: "review", id: getId() },
613
611
  ]);
614
- return buildIdealReviewMessage(decision.reasons);
612
+ return buildIdealReviewMessage(decision.reasons, driftedFiles);
615
613
  },
616
614
  getLoopBreakMessage: (stats) => {
617
615
  if (!idealReviewEnabledRef.current)
@@ -1252,46 +1250,9 @@ export function App(props) {
1252
1250
  }
1253
1251
  }, 500);
1254
1252
  }
1255
- // Pixel fix: observe branch + commits, patch status, optionally pick
1256
- // up the next open error if run-all is active.
1257
- const pendingFix = currentPixelFixRef.current;
1258
- if (pendingFix) {
1259
- currentPixelFixRef.current = null;
1260
- void (async () => {
1261
- try {
1262
- const { finalizePixelFix } = await import("../core/pixel-fix.js");
1263
- const result = await finalizePixelFix(pendingFix);
1264
- log("INFO", "pixel", `Pixel fix done: ${result.outcome}`, {
1265
- errorId: pendingFix.errorId,
1266
- reason: result.reason,
1267
- });
1268
- }
1269
- catch (err) {
1270
- log("ERROR", "pixel", `Pixel finalize failed: ${err.message}`);
1271
- }
1272
- if (runAllPixelRef.current) {
1273
- setTimeout(() => {
1274
- void (async () => {
1275
- const { fetchPixelEntries } = await import("../core/pixel.js");
1276
- const data = await fetchPixelEntries();
1277
- const next = data.entries.find((e) => e.status === "open");
1278
- if (next) {
1279
- startPixelFixRef.current(next.errorId);
1280
- }
1281
- else {
1282
- setRunAllPixel(false);
1283
- log("INFO", "pixel", "Run-all complete — no more open errors");
1284
- }
1285
- })();
1286
- }, 500);
1287
- }
1288
- })();
1289
- }
1290
1253
  }, []),
1291
1254
  onAborted: useCallback(() => {
1292
1255
  log("WARN", "agent", "Agent run aborted by user");
1293
- setRunAllPixel(false);
1294
- currentPixelFixRef.current = null;
1295
1256
  setDoneStatus(null);
1296
1257
  setLiveItems((prev) => {
1297
1258
  const next = prev.map((item) => {
@@ -2082,35 +2043,6 @@ export function App(props) {
2082
2043
  useEffect(() => {
2083
2044
  agentRunningRef.current = agentLoop.isRunning;
2084
2045
  }, [agentLoop.isRunning]);
2085
- const { startPixelFix, setRunAllPixel } = usePixelFixFlow({
2086
- agentLoop,
2087
- cwd: props.cwd,
2088
- currentProvider,
2089
- currentModel,
2090
- rebuildToolsForCwd: props.rebuildToolsForCwd,
2091
- sessionStore: props.sessionStore,
2092
- currentPixelFixRef,
2093
- runAllPixelRef,
2094
- startPixelFixRef,
2095
- cwdRef,
2096
- currentToolsRef,
2097
- injectedLanguagesRef,
2098
- setupHintShownRef,
2099
- messagesRef,
2100
- persistedIndexRef,
2101
- sessionManagerRef,
2102
- sessionPathRef,
2103
- setDisplayedCwd,
2104
- setCurrentTools,
2105
- setHistory,
2106
- setLiveItems,
2107
- setLastUserMessage,
2108
- setDoneStatus,
2109
- rebuildSystemPrompt,
2110
- clearPendingHistory,
2111
- getId,
2112
- initialRunAllPixel: props.sessionStore?.runAllPixel ?? false,
2113
- });
2114
2046
  // Starts a single task: opens a fresh session + chat and runs the task
2115
2047
  // prompt through the agent loop. Wired into startTaskRef so both the task
2116
2048
  // picker (Enter = start one, r = run all) and the run-all auto-advance in
@@ -2210,7 +2142,6 @@ export function App(props) {
2210
2142
  useEffect(() => {
2211
2143
  liveLayoutRef.current = { columns, liveAreaRows: measuredLiveAreaRows };
2212
2144
  }, [columns, measuredLiveAreaRows]);
2213
- const isPixelView = overlay === "pixel";
2214
2145
  const hasLiveAssistantItem = liveItems.some((item) => item.kind === "assistant");
2215
2146
  const rawVisibleStreamingText = hasLiveAssistantItem ? "" : agentLoop.streamingText;
2216
2147
  // The live text is sliced by the COMMITTED `flushedChars` only. When the
@@ -2520,18 +2451,6 @@ export function App(props) {
2520
2451
  setPlanAutoExpand(false);
2521
2452
  setOverlay(null);
2522
2453
  };
2523
- const handlePixelFixOne = (entry) => {
2524
- setOverlay(null);
2525
- startPixelFix(entry.errorId);
2526
- };
2527
- const handlePixelFixAll = (entries) => {
2528
- const first = entries.find((entry) => entry.status === "open") ?? entries[0];
2529
- if (!first)
2530
- return;
2531
- setOverlay(null);
2532
- setRunAllPixel(true);
2533
- startPixelFix(first.errorId);
2534
- };
2535
2454
  const handleApprovePlan = (planPath) => {
2536
2455
  log("INFO", "plan", "Plan approved — transitioning to implementation", {
2537
2456
  planPath,
@@ -2640,17 +2559,11 @@ export function App(props) {
2640
2559
  const handleToggleTasks = () => {
2641
2560
  taskPicker.toggle();
2642
2561
  };
2643
- const fullScreenOverlay = isPixelView
2644
- ? "pixel"
2645
- : isSkillsView
2646
- ? "skills"
2647
- : isPlanView
2648
- ? "plan"
2649
- : null;
2562
+ const fullScreenOverlay = isSkillsView ? "skills" : isPlanView ? "plan" : null;
2650
2563
  if (quittingSummary) {
2651
2564
  return (_jsx(Box, { flexDirection: "column", width: columns, flexShrink: 0, flexGrow: 0, children: _jsx(SessionSummaryDisplay, { summary: quittingSummary }) }));
2652
2565
  }
2653
- return (_jsx(Box, { flexDirection: "column", width: columns, flexShrink: 0, flexGrow: 0, children: rewindCheckpoints ? (_jsx(RewindOverlay, { checkpoints: rewindCheckpoints, onRestore: handleRewindRestore, onCancel: handleRewindCancel })) : fullScreenOverlay ? (_jsx(FullScreenOverlayRouter, { overlay: fullScreenOverlay, version: props.version, cwd: props.cwd, agentRunning: agentLoop.isRunning, planAutoExpand: planAutoExpand, onClosePixel: handleCloseRemountableOverlay, onPixelFixOne: handlePixelFixOne, onPixelFixAll: handlePixelFixAll, onCloseSkills: handleCloseRemountableOverlay, onClosePlan: handleClosePlanOverlay, onApprovePlan: handleApprovePlan, onRejectPlan: handleRejectPlan })) : (_jsx(ChatScreen, { columns: columns, liveItems: uniqueItemsById(liveItems), renderItem: renderItem, isRunning: agentLoop.isRunning, visibleStreamingText: visibleStreamingText, streamingThinking: agentLoop.streamingThinking, thinkingMs: agentLoop.thinkingMs, reserveStreamingSpacing: shouldReserveStreamingSpacing, renderMarkdown: renderMarkdown, measuredLiveAreaRows: measuredLiveAreaRows, fullscreen: props.fullscreen, rows: rows, transcriptLines: transcriptLines, viewportRows: viewportRows, assistantMarginTop: shouldTopSpaceStreamingText || streamingContinuesFlushed ? 1 : 0, streamingContinuation: streamingContinuesFlushed, controlsRef: mainControlsRef, hiddenQueuedCount: hiddenQueuedCount, queueIndicatorMarginTop: shouldTopSpaceQueueIndicator ? 2 : 1, theme: theme, statusSlotVisible: statusSlotVisible, activityVisible: activityVisible, stallStatusVisible: stallStatusVisible, liveToolFeed: liveToolFeed, doneStatus: doneStatus, activityPhase: agentLoop.activityPhase, elapsedMs: agentLoop.elapsedMs, runStartRef: agentLoop.runStartRef, isThinking: agentLoop.isThinking, thinkingLevel: thinkingLevel, tokenEstimate: agentLoop.streamedTokenEstimate, charCountRef: agentLoop.charCountRef, realTokensAccumRef: agentLoop.realTokensAccumRef, lastUserMessage: lastUserMessage, activeToolNames: agentLoop.activeToolCalls.map((tc) => tc.name), retryInfo: agentLoop.retryInfo, planDone: planSteps.filter((s) => s.completed).length, planTotal: planSteps.length, formatDuration: formatDuration, inputControls: {
2566
+ return (_jsx(Box, { flexDirection: "column", width: columns, flexShrink: 0, flexGrow: 0, children: rewindCheckpoints ? (_jsx(RewindOverlay, { checkpoints: rewindCheckpoints, onRestore: handleRewindRestore, onCancel: handleRewindCancel })) : fullScreenOverlay ? (_jsx(FullScreenOverlayRouter, { overlay: fullScreenOverlay, cwd: props.cwd, planAutoExpand: planAutoExpand, onCloseSkills: handleCloseRemountableOverlay, onClosePlan: handleClosePlanOverlay, onApprovePlan: handleApprovePlan, onRejectPlan: handleRejectPlan })) : (_jsx(ChatScreen, { columns: columns, liveItems: uniqueItemsById(liveItems), renderItem: renderItem, isRunning: agentLoop.isRunning, visibleStreamingText: visibleStreamingText, streamingThinking: agentLoop.streamingThinking, thinkingMs: agentLoop.thinkingMs, reserveStreamingSpacing: shouldReserveStreamingSpacing, renderMarkdown: renderMarkdown, measuredLiveAreaRows: measuredLiveAreaRows, fullscreen: props.fullscreen, rows: rows, transcriptLines: transcriptLines, viewportRows: viewportRows, assistantMarginTop: shouldTopSpaceStreamingText || streamingContinuesFlushed ? 1 : 0, streamingContinuation: streamingContinuesFlushed, controlsRef: mainControlsRef, hiddenQueuedCount: hiddenQueuedCount, queueIndicatorMarginTop: shouldTopSpaceQueueIndicator ? 2 : 1, theme: theme, statusSlotVisible: statusSlotVisible, activityVisible: activityVisible, stallStatusVisible: stallStatusVisible, liveToolFeed: liveToolFeed, doneStatus: doneStatus, activityPhase: agentLoop.activityPhase, elapsedMs: agentLoop.elapsedMs, runStartRef: agentLoop.runStartRef, isThinking: agentLoop.isThinking, thinkingLevel: thinkingLevel, tokenEstimate: agentLoop.streamedTokenEstimate, charCountRef: agentLoop.charCountRef, realTokensAccumRef: agentLoop.realTokensAccumRef, lastUserMessage: lastUserMessage, activeToolNames: agentLoop.activeToolCalls.map((tc) => tc.name), retryInfo: agentLoop.retryInfo, planDone: planSteps.filter((s) => s.completed).length, planTotal: planSteps.length, formatDuration: formatDuration, inputControls: {
2654
2567
  onSubmit: handleSubmit,
2655
2568
  onAbort: handleAbort,
2656
2569
  injectText: composerInject,
@@ -2659,7 +2572,6 @@ export function App(props) {
2659
2572
  onShiftTab: handleToggleThinking,
2660
2573
  onToggleTasks: handleToggleTasks,
2661
2574
  onToggleSkills: () => openOverlay("skills"),
2662
- onTogglePixel: () => openOverlay("pixel"),
2663
2575
  onToggleMarkdown: () => setRenderMarkdown((prev) => !prev),
2664
2576
  cwd: props.cwd,
2665
2577
  commands: allCommands,