@kenkaiiii/ggcoder 4.3.212 → 4.3.213

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 (312) hide show
  1. package/README.md +5 -8
  2. package/dist/cli.d.ts +3 -1
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +112 -61
  5. package/dist/cli.js.map +1 -1
  6. package/dist/core/continue-replay-inventory.test.d.ts +2 -0
  7. package/dist/core/continue-replay-inventory.test.d.ts.map +1 -0
  8. package/dist/core/continue-replay-inventory.test.js +42 -0
  9. package/dist/core/continue-replay-inventory.test.js.map +1 -0
  10. package/dist/core/goal-controller.d.ts +2 -0
  11. package/dist/core/goal-controller.d.ts.map +1 -1
  12. package/dist/core/goal-controller.js +283 -24
  13. package/dist/core/goal-controller.js.map +1 -1
  14. package/dist/core/goal-controller.test.js +413 -16
  15. package/dist/core/goal-controller.test.js.map +1 -1
  16. package/dist/core/goal-lifecycle-smoke.test.js +48 -6
  17. package/dist/core/goal-lifecycle-smoke.test.js.map +1 -1
  18. package/dist/core/goal-prerequisites.d.ts +5 -0
  19. package/dist/core/goal-prerequisites.d.ts.map +1 -1
  20. package/dist/core/goal-prerequisites.js +37 -0
  21. package/dist/core/goal-prerequisites.js.map +1 -1
  22. package/dist/core/goal-prerequisites.test.js +29 -1
  23. package/dist/core/goal-prerequisites.test.js.map +1 -1
  24. package/dist/core/goal-references.d.ts +14 -0
  25. package/dist/core/goal-references.d.ts.map +1 -0
  26. package/dist/core/goal-references.js +153 -0
  27. package/dist/core/goal-references.js.map +1 -0
  28. package/dist/core/goal-references.test.d.ts +2 -0
  29. package/dist/core/goal-references.test.d.ts.map +1 -0
  30. package/dist/core/goal-references.test.js +77 -0
  31. package/dist/core/goal-references.test.js.map +1 -0
  32. package/dist/core/goal-store.d.ts +25 -0
  33. package/dist/core/goal-store.d.ts.map +1 -1
  34. package/dist/core/goal-store.js +150 -36
  35. package/dist/core/goal-store.js.map +1 -1
  36. package/dist/core/goal-store.test.js +19 -2
  37. package/dist/core/goal-store.test.js.map +1 -1
  38. package/dist/core/goal-verifier.d.ts.map +1 -1
  39. package/dist/core/goal-verifier.js +4 -1
  40. package/dist/core/goal-verifier.js.map +1 -1
  41. package/dist/core/goal-verifier.test.js +43 -0
  42. package/dist/core/goal-verifier.test.js.map +1 -1
  43. package/dist/core/goal-worker.d.ts +2 -0
  44. package/dist/core/goal-worker.d.ts.map +1 -1
  45. package/dist/core/goal-worker.js +33 -9
  46. package/dist/core/goal-worker.js.map +1 -1
  47. package/dist/core/goal-worker.test.js +49 -1
  48. package/dist/core/goal-worker.test.js.map +1 -1
  49. package/dist/core/prompt-commands.d.ts.map +1 -1
  50. package/dist/core/prompt-commands.js +28 -846
  51. package/dist/core/prompt-commands.js.map +1 -1
  52. package/dist/core/prompt-commands.test.js +40 -78
  53. package/dist/core/prompt-commands.test.js.map +1 -1
  54. package/dist/core/runtime-mode.d.ts +14 -0
  55. package/dist/core/runtime-mode.d.ts.map +1 -0
  56. package/dist/core/runtime-mode.js +10 -0
  57. package/dist/core/runtime-mode.js.map +1 -0
  58. package/dist/core/session-restore-display.test.d.ts +2 -0
  59. package/dist/core/session-restore-display.test.d.ts.map +1 -0
  60. package/dist/core/session-restore-display.test.js +100 -0
  61. package/dist/core/session-restore-display.test.js.map +1 -0
  62. package/dist/core/verify-commands.js +4 -4
  63. package/dist/core/verify-commands.js.map +1 -1
  64. package/dist/system-prompt.d.ts +2 -1
  65. package/dist/system-prompt.d.ts.map +1 -1
  66. package/dist/system-prompt.js +51 -37
  67. package/dist/system-prompt.js.map +1 -1
  68. package/dist/system-prompt.test.js +147 -40
  69. package/dist/system-prompt.test.js.map +1 -1
  70. package/dist/tools/bash.d.ts +3 -2
  71. package/dist/tools/bash.d.ts.map +1 -1
  72. package/dist/tools/bash.js +11 -4
  73. package/dist/tools/bash.js.map +1 -1
  74. package/dist/tools/edit.d.ts +5 -3
  75. package/dist/tools/edit.d.ts.map +1 -1
  76. package/dist/tools/edit.js +14 -4
  77. package/dist/tools/edit.js.map +1 -1
  78. package/dist/tools/edit.test.js +0 -10
  79. package/dist/tools/edit.test.js.map +1 -1
  80. package/dist/tools/goal-mode.test.d.ts +2 -0
  81. package/dist/tools/goal-mode.test.d.ts.map +1 -0
  82. package/dist/tools/goal-mode.test.js +121 -0
  83. package/dist/tools/goal-mode.test.js.map +1 -0
  84. package/dist/tools/goals.d.ts +15 -3
  85. package/dist/tools/goals.d.ts.map +1 -1
  86. package/dist/tools/goals.js +336 -26
  87. package/dist/tools/goals.js.map +1 -1
  88. package/dist/tools/goals.test.js +346 -6
  89. package/dist/tools/goals.test.js.map +1 -1
  90. package/dist/tools/index.d.ts +7 -10
  91. package/dist/tools/index.d.ts.map +1 -1
  92. package/dist/tools/index.js +6 -19
  93. package/dist/tools/index.js.map +1 -1
  94. package/dist/tools/plan-mode.test.js +34 -224
  95. package/dist/tools/plan-mode.test.js.map +1 -1
  96. package/dist/tools/prompt-hints.d.ts.map +1 -1
  97. package/dist/tools/prompt-hints.js +2 -6
  98. package/dist/tools/prompt-hints.js.map +1 -1
  99. package/dist/tools/subagent.d.ts +3 -2
  100. package/dist/tools/subagent.d.ts.map +1 -1
  101. package/dist/tools/subagent.js +4 -9
  102. package/dist/tools/subagent.js.map +1 -1
  103. package/dist/tools/write.d.ts +5 -3
  104. package/dist/tools/write.d.ts.map +1 -1
  105. package/dist/tools/write.js +14 -13
  106. package/dist/tools/write.js.map +1 -1
  107. package/dist/tools/write.test.js +0 -16
  108. package/dist/tools/write.test.js.map +1 -1
  109. package/dist/ui/App.d.ts +144 -28
  110. package/dist/ui/App.d.ts.map +1 -1
  111. package/dist/ui/App.js +1143 -862
  112. package/dist/ui/App.js.map +1 -1
  113. package/dist/ui/activity-phrases.d.ts.map +1 -1
  114. package/dist/ui/activity-phrases.js +0 -2
  115. package/dist/ui/activity-phrases.js.map +1 -1
  116. package/dist/ui/app-state-persistence.test.js +173 -5
  117. package/dist/ui/app-state-persistence.test.js.map +1 -1
  118. package/dist/ui/chat-layout-pinning.test.d.ts +2 -0
  119. package/dist/ui/chat-layout-pinning.test.d.ts.map +1 -0
  120. package/dist/ui/chat-layout-pinning.test.js +407 -0
  121. package/dist/ui/chat-layout-pinning.test.js.map +1 -0
  122. package/dist/ui/components/ActivityIndicator.d.ts +1 -2
  123. package/dist/ui/components/ActivityIndicator.d.ts.map +1 -1
  124. package/dist/ui/components/ActivityIndicator.js +63 -94
  125. package/dist/ui/components/ActivityIndicator.js.map +1 -1
  126. package/dist/ui/components/AssistantMessage.d.ts +6 -2
  127. package/dist/ui/components/AssistantMessage.d.ts.map +1 -1
  128. package/dist/ui/components/AssistantMessage.js +9 -4
  129. package/dist/ui/components/AssistantMessage.js.map +1 -1
  130. package/dist/ui/components/AssistantMessage.test.d.ts +2 -0
  131. package/dist/ui/components/AssistantMessage.test.d.ts.map +1 -0
  132. package/dist/ui/components/AssistantMessage.test.js +369 -0
  133. package/dist/ui/components/AssistantMessage.test.js.map +1 -0
  134. package/dist/ui/components/BackgroundTasksBar.d.ts +1 -3
  135. package/dist/ui/components/BackgroundTasksBar.d.ts.map +1 -1
  136. package/dist/ui/components/BackgroundTasksBar.js +2 -4
  137. package/dist/ui/components/BackgroundTasksBar.js.map +1 -1
  138. package/dist/ui/components/Banner.d.ts +1 -3
  139. package/dist/ui/components/Banner.d.ts.map +1 -1
  140. package/dist/ui/components/Banner.js +7 -3
  141. package/dist/ui/components/Banner.js.map +1 -1
  142. package/dist/ui/components/Footer.d.ts +26 -4
  143. package/dist/ui/components/Footer.d.ts.map +1 -1
  144. package/dist/ui/components/Footer.js +73 -21
  145. package/dist/ui/components/Footer.js.map +1 -1
  146. package/dist/ui/components/GoalOverlay.d.ts +28 -20
  147. package/dist/ui/components/GoalOverlay.d.ts.map +1 -1
  148. package/dist/ui/components/GoalOverlay.js +283 -253
  149. package/dist/ui/components/GoalOverlay.js.map +1 -1
  150. package/dist/ui/components/InputArea.d.ts +2 -6
  151. package/dist/ui/components/InputArea.d.ts.map +1 -1
  152. package/dist/ui/components/InputArea.js +40 -32
  153. package/dist/ui/components/InputArea.js.map +1 -1
  154. package/dist/ui/components/InputArea.test.js +11 -1
  155. package/dist/ui/components/InputArea.test.js.map +1 -1
  156. package/dist/ui/components/Markdown.d.ts +11 -11
  157. package/dist/ui/components/Markdown.d.ts.map +1 -1
  158. package/dist/ui/components/Markdown.js +25 -198
  159. package/dist/ui/components/Markdown.js.map +1 -1
  160. package/dist/ui/components/PlanOverlay.d.ts.map +1 -1
  161. package/dist/ui/components/PlanOverlay.js +1 -1
  162. package/dist/ui/components/PlanOverlay.js.map +1 -1
  163. package/dist/ui/components/ServerToolExecution.d.ts.map +1 -1
  164. package/dist/ui/components/ServerToolExecution.js +3 -2
  165. package/dist/ui/components/ServerToolExecution.js.map +1 -1
  166. package/dist/ui/components/SlashCommandMenu.d.ts +4 -3
  167. package/dist/ui/components/SlashCommandMenu.d.ts.map +1 -1
  168. package/dist/ui/components/SlashCommandMenu.js +38 -26
  169. package/dist/ui/components/SlashCommandMenu.js.map +1 -1
  170. package/dist/ui/components/StreamingArea.d.ts +11 -2
  171. package/dist/ui/components/StreamingArea.d.ts.map +1 -1
  172. package/dist/ui/components/StreamingArea.js +20 -23
  173. package/dist/ui/components/StreamingArea.js.map +1 -1
  174. package/dist/ui/components/StreamingArea.test.d.ts +2 -0
  175. package/dist/ui/components/StreamingArea.test.d.ts.map +1 -0
  176. package/dist/ui/components/StreamingArea.test.js +18 -0
  177. package/dist/ui/components/StreamingArea.test.js.map +1 -0
  178. package/dist/ui/components/ToolExecution.d.ts.map +1 -1
  179. package/dist/ui/components/ToolExecution.js +11 -27
  180. package/dist/ui/components/ToolExecution.js.map +1 -1
  181. package/dist/ui/components/ToolGroupExecution.d.ts.map +1 -1
  182. package/dist/ui/components/ToolGroupExecution.js +9 -124
  183. package/dist/ui/components/ToolGroupExecution.js.map +1 -1
  184. package/dist/ui/components/UserMessage.d.ts.map +1 -1
  185. package/dist/ui/components/UserMessage.js +15 -10
  186. package/dist/ui/components/UserMessage.js.map +1 -1
  187. package/dist/ui/components/UserMessage.test.d.ts +2 -0
  188. package/dist/ui/components/UserMessage.test.d.ts.map +1 -0
  189. package/dist/ui/components/UserMessage.test.js +39 -0
  190. package/dist/ui/components/UserMessage.test.js.map +1 -0
  191. package/dist/ui/footer-status-layout.test.js +21 -7
  192. package/dist/ui/footer-status-layout.test.js.map +1 -1
  193. package/dist/ui/goal-events.d.ts +8 -0
  194. package/dist/ui/goal-events.d.ts.map +1 -1
  195. package/dist/ui/goal-events.js +28 -8
  196. package/dist/ui/goal-events.js.map +1 -1
  197. package/dist/ui/goal-events.test.js +40 -2
  198. package/dist/ui/goal-events.test.js.map +1 -1
  199. package/dist/ui/goal-lifecycle-orchestration.test.js +127 -34
  200. package/dist/ui/goal-lifecycle-orchestration.test.js.map +1 -1
  201. package/dist/ui/goal-overlay.test.js +121 -43
  202. package/dist/ui/goal-overlay.test.js.map +1 -1
  203. package/dist/ui/goal-summary.d.ts +14 -0
  204. package/dist/ui/goal-summary.d.ts.map +1 -0
  205. package/dist/ui/goal-summary.js +194 -0
  206. package/dist/ui/goal-summary.js.map +1 -0
  207. package/dist/ui/hooks/useAgentLoop.d.ts +8 -2
  208. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
  209. package/dist/ui/hooks/useAgentLoop.js +20 -9
  210. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  211. package/dist/ui/hooks/useAgentLoop.test.d.ts +2 -0
  212. package/dist/ui/hooks/useAgentLoop.test.d.ts.map +1 -0
  213. package/dist/ui/hooks/useAgentLoop.test.js +8 -0
  214. package/dist/ui/hooks/useAgentLoop.test.js.map +1 -0
  215. package/dist/ui/hooks/useTerminalSize.d.ts +5 -9
  216. package/dist/ui/hooks/useTerminalSize.d.ts.map +1 -1
  217. package/dist/ui/hooks/useTerminalSize.js +9 -14
  218. package/dist/ui/hooks/useTerminalSize.js.map +1 -1
  219. package/dist/ui/live-item-flush.d.ts +2 -2
  220. package/dist/ui/live-item-flush.d.ts.map +1 -1
  221. package/dist/ui/live-item-flush.js +8 -4
  222. package/dist/ui/live-item-flush.js.map +1 -1
  223. package/dist/ui/long-prompt-regression-harness.test.d.ts +2 -0
  224. package/dist/ui/long-prompt-regression-harness.test.d.ts.map +1 -0
  225. package/dist/ui/long-prompt-regression-harness.test.js +195 -0
  226. package/dist/ui/long-prompt-regression-harness.test.js.map +1 -0
  227. package/dist/ui/plan-overlay.test.js +7 -29
  228. package/dist/ui/plan-overlay.test.js.map +1 -1
  229. package/dist/ui/queued-message.test.d.ts.map +1 -1
  230. package/dist/ui/queued-message.test.js +76 -14
  231. package/dist/ui/queued-message.test.js.map +1 -1
  232. package/dist/ui/render.d.ts +21 -24
  233. package/dist/ui/render.d.ts.map +1 -1
  234. package/dist/ui/render.js +46 -28
  235. package/dist/ui/render.js.map +1 -1
  236. package/dist/ui/render.test.d.ts +2 -0
  237. package/dist/ui/render.test.d.ts.map +1 -0
  238. package/dist/ui/render.test.js +16 -0
  239. package/dist/ui/render.test.js.map +1 -0
  240. package/dist/ui/scroll-stabilization.test.js +1 -1
  241. package/dist/ui/scroll-stabilization.test.js.map +1 -1
  242. package/dist/ui/slash-command-images.test.js +79 -4
  243. package/dist/ui/slash-command-images.test.js.map +1 -1
  244. package/dist/ui/terminal-history.d.ts +26 -0
  245. package/dist/ui/terminal-history.d.ts.map +1 -0
  246. package/dist/ui/terminal-history.js +910 -0
  247. package/dist/ui/terminal-history.js.map +1 -0
  248. package/dist/ui/terminal-history.test.d.ts +2 -0
  249. package/dist/ui/terminal-history.test.d.ts.map +1 -0
  250. package/dist/ui/terminal-history.test.js +314 -0
  251. package/dist/ui/terminal-history.test.js.map +1 -0
  252. package/dist/ui/tool-group-summary.d.ts +16 -0
  253. package/dist/ui/tool-group-summary.d.ts.map +1 -0
  254. package/dist/ui/tool-group-summary.js +123 -0
  255. package/dist/ui/tool-group-summary.js.map +1 -0
  256. package/dist/ui/tui-history-parity.test.d.ts +2 -0
  257. package/dist/ui/tui-history-parity.test.d.ts.map +1 -0
  258. package/dist/ui/tui-history-parity.test.js +243 -0
  259. package/dist/ui/tui-history-parity.test.js.map +1 -0
  260. package/dist/ui/utils/assistant-stream-split.d.ts +6 -0
  261. package/dist/ui/utils/assistant-stream-split.d.ts.map +1 -0
  262. package/dist/ui/utils/assistant-stream-split.js +37 -0
  263. package/dist/ui/utils/assistant-stream-split.js.map +1 -0
  264. package/dist/ui/utils/assistant-stream-split.test.d.ts +2 -0
  265. package/dist/ui/utils/assistant-stream-split.test.d.ts.map +1 -0
  266. package/dist/ui/utils/assistant-stream-split.test.js +58 -0
  267. package/dist/ui/utils/assistant-stream-split.test.js.map +1 -0
  268. package/dist/ui/utils/latex-to-unicode.d.ts +22 -0
  269. package/dist/ui/utils/latex-to-unicode.d.ts.map +1 -0
  270. package/dist/ui/utils/latex-to-unicode.js +538 -0
  271. package/dist/ui/utils/latex-to-unicode.js.map +1 -0
  272. package/dist/ui/utils/markdown-renderer.d.ts +20 -0
  273. package/dist/ui/utils/markdown-renderer.d.ts.map +1 -0
  274. package/dist/ui/utils/markdown-renderer.js +327 -0
  275. package/dist/ui/utils/markdown-renderer.js.map +1 -0
  276. package/dist/ui/utils/markdown-table.d.ts +9 -0
  277. package/dist/ui/utils/markdown-table.d.ts.map +1 -0
  278. package/dist/ui/utils/markdown-table.js +95 -0
  279. package/dist/ui/utils/markdown-table.js.map +1 -0
  280. package/dist/ui/utils/text-utils.d.ts +8 -0
  281. package/dist/ui/utils/text-utils.d.ts.map +1 -0
  282. package/dist/ui/utils/text-utils.js +16 -0
  283. package/dist/ui/utils/text-utils.js.map +1 -0
  284. package/dist/ui/utils/token-to-ansi.js +19 -9
  285. package/dist/ui/utils/token-to-ansi.js.map +1 -1
  286. package/dist/ui/utils/user-message-display.d.ts +7 -0
  287. package/dist/ui/utils/user-message-display.d.ts.map +1 -0
  288. package/dist/ui/utils/user-message-display.js +26 -0
  289. package/dist/ui/utils/user-message-display.js.map +1 -0
  290. package/dist/utils/format.js +0 -9
  291. package/dist/utils/format.js.map +1 -1
  292. package/package.json +9 -5
  293. package/dist/tools/enter-plan.d.ts +0 -8
  294. package/dist/tools/enter-plan.d.ts.map +0 -1
  295. package/dist/tools/enter-plan.js +0 -30
  296. package/dist/tools/enter-plan.js.map +0 -1
  297. package/dist/tools/exit-plan.d.ts +0 -8
  298. package/dist/tools/exit-plan.d.ts.map +0 -1
  299. package/dist/tools/exit-plan.js +0 -36
  300. package/dist/tools/exit-plan.js.map +0 -1
  301. package/dist/tools/tasks.d.ts +0 -16
  302. package/dist/tools/tasks.d.ts.map +0 -1
  303. package/dist/tools/tasks.js +0 -133
  304. package/dist/tools/tasks.js.map +0 -1
  305. package/dist/ui/components/EyesOverlay.d.ts +0 -10
  306. package/dist/ui/components/EyesOverlay.d.ts.map +0 -1
  307. package/dist/ui/components/EyesOverlay.js +0 -220
  308. package/dist/ui/components/EyesOverlay.js.map +0 -1
  309. package/dist/ui/components/TaskOverlay.d.ts +0 -10
  310. package/dist/ui/components/TaskOverlay.d.ts.map +0 -1
  311. package/dist/ui/components/TaskOverlay.js +0 -267
  312. package/dist/ui/components/TaskOverlay.js.map +0 -1
@@ -1,9 +1,11 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import React, { useCallback, useEffect, useRef, useState } from "react";
3
- import { Box, Text, useInput } from "ink";
3
+ import { Box, Static, Text, useInput, useStdout } from "ink";
4
4
  import { basename } from "node:path";
5
5
  import { formatGoalPrerequisiteInstruction, goalHasBlockingPrerequisites, isBlockingGoalPrerequisite, loadGoalRuns, saveGoalRuns, summarizeGoalCountsFromRuns, } from "../../core/goal-store.js";
6
6
  import { useTerminalSize } from "../hooks/useTerminalSize.js";
7
+ import { buildGoalFinalSummarySections } from "../goal-summary.js";
8
+ import { Markdown } from "./Markdown.js";
7
9
  import { useTheme } from "../theme/theme.js";
8
10
  const GOAL_LOGO = [" ▄▀▀▀ ▄▀▀▀", " █ ▀█ █ ▀█", " ▀▄▄▀ ▀▄▄▀"];
9
11
  const GRADIENT = [
@@ -21,6 +23,7 @@ const GOAL_ACTIVE = "#fbbf24";
21
23
  const GAP = " ";
22
24
  const LOGO_WIDTH = 9;
23
25
  const SIDE_BY_SIDE_MIN = LOGO_WIDTH + GAP.length + 20;
26
+ const PREFIX_WIDTH = 2;
24
27
  export function clampGoalSelectedIndex(index, length) {
25
28
  if (length <= 0)
26
29
  return 0;
@@ -110,40 +113,6 @@ export function getGoalScrollOffsetForSelection({ selectedIndex, currentOffset,
110
113
  return clampGoalScrollOffset(selected - rows + 1, itemCount, rows);
111
114
  return offset;
112
115
  }
113
- export function getGoalDetailRowCount(run) {
114
- let count = 2;
115
- count += 1 + Math.max(1, run.successCriteria.length);
116
- if (run.prerequisites.length > 0) {
117
- count += 1;
118
- for (const prerequisite of run.prerequisites) {
119
- count += 1;
120
- if (isBlockingGoalPrerequisite(prerequisite) || prerequisite.evidence)
121
- count += 1;
122
- }
123
- }
124
- count += 1;
125
- if (run.tasks.length === 0) {
126
- count += 1;
127
- }
128
- else {
129
- for (const task of run.tasks) {
130
- count += 1;
131
- if (task.lastSummary)
132
- count += 1;
133
- }
134
- }
135
- if (run.harness.length > 0)
136
- count += 1 + run.harness.length;
137
- if (run.evidencePlan.length > 0)
138
- count += 1 + run.evidencePlan.length;
139
- if (run.verifier)
140
- count += 2;
141
- if (run.blockers.length > 0)
142
- count += 1 + run.blockers.length;
143
- if (run.evidence.length > 0)
144
- count += 1 + Math.min(5, run.evidence.length);
145
- return count;
146
- }
147
116
  export function getGoalCardExtraRowCount(run) {
148
117
  let count = 0;
149
118
  if (goalHasBlockingPrerequisites(run))
@@ -224,44 +193,17 @@ export function getGoalListWindow({ runs, selectedIndex, viewportRows, }) {
224
193
  rowsUsed: fixedRows + indicatorRows + cardRows,
225
194
  };
226
195
  }
227
- export function getGoalExpandedDetailViewportRows({ viewportRows, cardExtraRows, }) {
228
- const rows = Number.isFinite(viewportRows) ? Math.max(1, Math.floor(viewportRows)) : 8;
229
- const selectedCardRows = 1 + Math.max(0, Math.floor(cardExtraRows));
230
- const fixedRows = 1 + // Goals heading
231
- selectedCardRows +
232
- 2 + // selected card border
233
- 1 + // detail top margin
234
- 1; // selected card bottom margin
235
- return Math.max(1, rows - fixedRows);
236
- }
237
- export function clampGoalDetailScrollOffset(offset, detailRowCount, viewportRows) {
238
- const visibleRows = Math.max(1, Math.floor(viewportRows));
239
- const scrolledBodyRows = Math.max(1, visibleRows - 1);
240
- const maxOffset = Math.max(0, detailRowCount - scrolledBodyRows);
241
- if (!Number.isFinite(offset))
242
- return 0;
243
- return Math.min(Math.max(0, Math.floor(offset)), maxOffset);
244
- }
245
- export function getGoalDetailScrollWindow({ detailRowCount, scrollOffset, viewportRows, }) {
246
- const rows = Math.max(1, Math.floor(viewportRows));
247
- const start = clampGoalDetailScrollOffset(scrollOffset, detailRowCount, rows);
248
- const topIndicatorRows = start > 0 && rows > 2 ? 1 : 0;
249
- let bodyRows = Math.max(1, rows - topIndicatorRows);
250
- let hiddenAfter = Math.max(0, detailRowCount - start - bodyRows);
251
- if (hiddenAfter > 0 && bodyRows > 1) {
252
- bodyRows -= 1;
253
- hiddenAfter = Math.max(0, detailRowCount - start - bodyRows);
254
- }
255
- return {
256
- start,
257
- end: Math.min(detailRowCount, start + bodyRows),
258
- hiddenBefore: start,
259
- hiddenAfter,
260
- };
261
- }
262
196
  export function sortGoalRunsForOverlay(runs) {
263
197
  return [...runs].sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
264
198
  }
199
+ export function getGoalAutoExpandedState({ autoExpandNewest, loaded, runs, alreadyExpanded, }) {
200
+ if (!autoExpandNewest || !loaded || runs.length === 0 || alreadyExpanded)
201
+ return null;
202
+ const newestRun = runs[0];
203
+ if (!newestRun)
204
+ return null;
205
+ return { selectedIndex: 0, expandedRunId: newestRun.id };
206
+ }
265
207
  export function shouldPersistGoalOverlayRuns(previousRuns, nextRuns) {
266
208
  if (nextRuns.length > 0)
267
209
  return true;
@@ -323,41 +265,6 @@ function verifierSummaryColor(run, fallbackColor) {
323
265
  return "magenta";
324
266
  return fallbackColor;
325
267
  }
326
- function taskStatusColor(status) {
327
- switch (status) {
328
- case "done":
329
- return "green";
330
- case "failed":
331
- return "red";
332
- case "blocked":
333
- return "yellow";
334
- case "running":
335
- case "verifying":
336
- return "cyan";
337
- case "pending":
338
- return "blue";
339
- }
340
- }
341
- function prerequisiteStatusColor(status) {
342
- switch (status) {
343
- case "met":
344
- return "green";
345
- case "missing":
346
- return "yellow";
347
- case "unknown":
348
- return "cyan";
349
- }
350
- }
351
- function evidencePlanStatusColor(status) {
352
- switch (status) {
353
- case "ready":
354
- return "green";
355
- case "blocked":
356
- return "yellow";
357
- case "planned":
358
- return "cyan";
359
- }
360
- }
361
268
  function verifierStatusColor(status) {
362
269
  switch (status) {
363
270
  case "pass":
@@ -368,139 +275,229 @@ function verifierStatusColor(status) {
368
275
  return "yellow";
369
276
  }
370
277
  }
371
- function evidenceKindColor(kind) {
372
- switch (kind) {
373
- case "command":
374
- return "cyan";
375
- case "file":
376
- return "blue";
377
- case "log":
378
- return "yellow";
379
- case "screenshot":
380
- return "magenta";
381
- case "summary":
382
- return "green";
383
- }
384
- }
385
- export function getGoalDetailTaskHeading(run) {
386
- return run.prerequisites.length > 0 ? "2. Worker tasks" : "Worker tasks";
387
- }
388
- export function getGoalUserPrerequisiteHeading(run) {
389
- return run.prerequisites.length > 0 ? "1. User prerequisites" : null;
390
- }
391
- export function formatGoalTaskDetailSummary(summary) {
392
- const firstLine = summary
393
- .split("\n")
394
- .map((line) => line.trim())
395
- .find((line) => line.length > 0);
396
- if (!firstLine)
397
- return "";
398
- return firstLine.length > 180 ? `${firstLine.slice(0, 177)}…` : firstLine;
399
- }
400
- function truncateGoalDetailText(text, maxLength = 220) {
401
- const collapsed = text.replace(/\s+/g, " ").trim();
402
- return collapsed.length > maxLength ? `${collapsed.slice(0, maxLength - 1)}…` : collapsed;
403
- }
404
- function GoalHeader({ cwd, runs, agentRunning, }) {
405
- const theme = useTheme();
406
- const { columns } = useTerminalSize();
407
- const displayPath = formatDisplayPath(cwd);
408
- const counts = summarizeGoalCountsFromRuns(runs);
409
- if (columns < SIDE_BY_SIDE_MIN) {
410
- return (_jsxs(Box, { flexDirection: "column", marginTop: 1, marginBottom: 1, width: columns, children: [_jsx(GoalGradientText, { text: GOAL_LOGO[0] }), _jsx(GoalGradientText, { text: GOAL_LOGO[1] }), _jsx(GoalGradientText, { text: GOAL_LOGO[2] }), _jsxs(Box, { marginTop: 1, children: [_jsx(Text, { color: GOAL_SUCCESS, bold: true, children: "Goal Pane" }), agentRunning && _jsx(Text, { color: GOAL_ACTIVE, children: " (agent running)" }), _jsxs(Text, { color: theme.textDim, children: [" \u00B7 ", basename(cwd)] })] }), _jsx(Text, { color: theme.textDim, wrap: "truncate", children: displayPath }), _jsxs(Text, { children: [_jsxs(Text, { color: GOAL_SUCCESS, children: [counts.passed, " passed"] }), _jsx(Text, { color: theme.textDim, children: " \u00B7 " }), _jsxs(Text, { color: GOAL_ACTIVE, children: [counts.running, " active"] }), _jsx(Text, { color: theme.textDim, children: " \u00B7 " }), _jsxs(Text, { color: theme.text, children: [counts.pending, " pending"] }), _jsx(Text, { color: theme.textDim, children: " \u00B7 " }), _jsxs(Text, { color: GOAL_ACTIVE, children: [counts.blocked, " blocked"] })] })] }));
411
- }
412
- return (_jsxs(Box, { flexDirection: "column", marginTop: 1, marginBottom: 1, width: columns, children: [_jsxs(Box, { children: [_jsx(GoalGradientText, { text: GOAL_LOGO[0] }), _jsx(Text, { children: GAP }), _jsx(Text, { color: GOAL_SUCCESS, bold: true, children: "Goal Pane" }), agentRunning && _jsx(Text, { color: GOAL_ACTIVE, children: " (agent running)" })] }), _jsxs(Box, { children: [_jsx(GoalGradientText, { text: GOAL_LOGO[1] }), _jsx(Text, { children: GAP }), _jsx(Text, { color: theme.textDim, wrap: "truncate", children: displayPath })] }), _jsxs(Box, { children: [_jsx(GoalGradientText, { text: GOAL_LOGO[2] }), _jsx(Text, { children: GAP }), _jsxs(Text, { children: [_jsxs(Text, { color: GOAL_SUCCESS, children: [counts.passed, " passed"] }), _jsx(Text, { color: theme.textDim, children: " \u00B7 " }), _jsxs(Text, { color: GOAL_ACTIVE, children: [counts.running, " active"] }), _jsx(Text, { color: theme.textDim, children: " \u00B7 " }), _jsxs(Text, { color: theme.text, children: [counts.pending, " pending"] }), _jsx(Text, { color: theme.textDim, children: " \u00B7 " }), _jsxs(Text, { color: GOAL_ACTIVE, children: [counts.blocked, " blocked"] })] })] })] }));
413
- }
414
- function StatusChip({ label, color }) {
415
- return (_jsxs(Text, { color: color, bold: true, children: ["\u25D6 ", label, " \u25D7"] }));
416
- }
417
- function GoalDetail({ run, maxRows, scrollOffset, }) {
418
- const theme = useTheme();
419
- const rows = [
420
- _jsxs(Text, { children: [_jsx(Text, { color: theme.primary, bold: true, children: "Goal" }), _jsx(Text, { color: theme.textDim, children: " \u00B7 " }), _jsx(Text, { color: statusColor(run.status) || theme.secondary, children: getGoalReadinessText(run) }), _jsxs(Text, { color: theme.textDim, children: [" \u00B7 ", formatGoalProgressText(run)] })] }, "goal-heading"),
421
- _jsx(Text, { color: theme.text, children: truncateGoalDetailText(run.goal || run.title) }, "goal-text"),
422
- _jsx(Text, { color: theme.primary, bold: true, children: "Success criteria" }, "success-heading"),
278
+ function normalizeGoalPlanText(text) {
279
+ return text.replace(/\s+/g, " ").trim();
280
+ }
281
+ function markdownListItem(text) {
282
+ const normalized = normalizeGoalPlanText(text);
283
+ return `- ${normalized || "not recorded"}`;
284
+ }
285
+ function markdownCode(value) {
286
+ return `\`${value.replace(/`/g, "\\`")}\``;
287
+ }
288
+ function appendGoalMetadataLine(lines, label, value) {
289
+ if (!value)
290
+ return;
291
+ lines.push(` - ${label}: ${value}`);
292
+ }
293
+ export function formatGoalPlanMarkdown(run) {
294
+ const lines = [
295
+ `# ${run.title}`,
296
+ "",
297
+ `**Status:** ${run.status}`,
298
+ `**Readiness:** ${getGoalReadinessText(run)}`,
299
+ `**Progress:** ${formatGoalProgressText(run)}`,
300
+ `**Verifier:** ${formatGoalVerifierSummary(run)}`,
301
+ `**Goal ID:** ${run.id}`,
302
+ `**Project:** ${run.projectPath}`,
303
+ `**Updated:** ${run.updatedAt}`,
304
+ "",
305
+ "## Goal",
306
+ "",
307
+ run.goal || run.title,
308
+ "",
309
+ "## Success criteria",
310
+ "",
423
311
  ];
424
312
  if (run.successCriteria.length === 0) {
425
- rows.push(_jsx(Text, { color: theme.textDim, children: "- none recorded" }, "success-none"));
313
+ lines.push("- none recorded");
426
314
  }
427
315
  else {
428
- for (const [index, criterion] of run.successCriteria.entries()) {
429
- rows.push(_jsxs(Text, { children: [_jsx(Text, { color: "green", children: "\u2713 " }), _jsx(Text, { color: theme.text, children: truncateGoalDetailText(criterion) })] }, `success-${index}`));
316
+ lines.push(...run.successCriteria.map(markdownListItem));
317
+ }
318
+ const finalSummarySections = buildGoalFinalSummarySections(run);
319
+ if (finalSummarySections.length > 0) {
320
+ lines.push("", "## Final summary", "");
321
+ for (const section of finalSummarySections) {
322
+ lines.push(`### ${section.title}`, "", ...section.lines.map(markdownListItem), "");
430
323
  }
431
324
  }
432
- if (run.prerequisites.length > 0) {
433
- rows.push(_jsx(Text, { color: theme.primary, bold: true, children: getGoalUserPrerequisiteHeading(run) }, "prereq-heading"));
325
+ lines.push("", "## User prerequisites", "");
326
+ if (run.prerequisites.length === 0) {
327
+ lines.push("- none recorded");
328
+ }
329
+ else {
434
330
  for (const prerequisite of run.prerequisites) {
435
- rows.push(_jsxs(Text, { children: [_jsxs(Text, { color: prerequisiteStatusColor(prerequisite.status), children: ["\u25CF ", prerequisite.status] }), _jsxs(Text, { color: theme.text, bold: isBlockingGoalPrerequisite(prerequisite), children: [" ", prerequisite.label] }), isBlockingGoalPrerequisite(prerequisite) ? (_jsx(Text, { color: theme.warning, children: " \u00B7 user action required" })) : null] }, `prereq-${prerequisite.id}`));
331
+ lines.push(`- **${prerequisite.status}** ${prerequisite.label}`);
332
+ appendGoalMetadataLine(lines, "ID", markdownCode(prerequisite.id));
333
+ appendGoalMetadataLine(lines, "Check", prerequisite.checkCommand ? markdownCode(prerequisite.checkCommand) : undefined);
334
+ appendGoalMetadataLine(lines, "Instructions", prerequisite.instructions);
335
+ appendGoalMetadataLine(lines, "Evidence", prerequisite.evidence);
436
336
  if (isBlockingGoalPrerequisite(prerequisite)) {
437
- rows.push(_jsxs(Text, { color: theme.textDim, wrap: "truncate", children: ["\u2514\u2500 ", formatGoalPrerequisiteInstruction(prerequisite)] }, `prereq-${prerequisite.id}-instruction`));
438
- }
439
- else if (prerequisite.evidence) {
440
- rows.push(_jsxs(Text, { color: theme.textDim, wrap: "truncate", children: ["\u2514\u2500 ", prerequisite.evidence] }, `prereq-${prerequisite.id}-evidence`));
337
+ appendGoalMetadataLine(lines, "User action required", formatGoalPrerequisiteInstruction(prerequisite));
441
338
  }
442
339
  }
443
340
  }
444
- rows.push(_jsx(Text, { color: theme.primary, bold: true, children: getGoalDetailTaskHeading(run) }, "task-heading"));
341
+ lines.push("", "## Worker tasks", "");
445
342
  if (run.tasks.length === 0) {
446
- rows.push(_jsx(Text, { color: theme.textDim, children: goalHasBlockingPrerequisites(run)
447
- ? " Waiting for prerequisites before workers can start."
448
- : " No worker tasks yet — run the goal to generate focused work." }, "no-tasks"));
343
+ lines.push(goalHasBlockingPrerequisites(run)
344
+ ? "- Waiting for prerequisites before workers can start."
345
+ : "- No worker tasks yet — run the goal to generate focused work.");
449
346
  }
450
347
  else {
451
348
  for (const task of run.tasks) {
452
- rows.push(_jsxs(Text, { children: [_jsxs(Text, { color: taskStatusColor(task.status), children: ["\u25CF ", task.status] }), _jsxs(Text, { color: theme.text, children: [" ", task.title] }), _jsxs(Text, { color: theme.textDim, children: [" \u00B7 try ", task.attempts] }), task.workerId ? _jsxs(Text, { color: theme.textDim, children: [" \u00B7 ", task.workerId] }) : null] }, `task-${task.id}`));
453
- if (task.lastSummary) {
454
- rows.push(_jsxs(Text, { color: theme.textDim, wrap: "truncate", children: ["\u2514\u2500 ", formatGoalTaskDetailSummary(task.lastSummary)] }, `task-${task.id}-summary`));
349
+ lines.push(`- **${task.status}** ${task.title}`);
350
+ appendGoalMetadataLine(lines, "ID", markdownCode(task.id));
351
+ appendGoalMetadataLine(lines, "Attempts", String(task.attempts));
352
+ appendGoalMetadataLine(lines, "Worker", task.workerId ? markdownCode(task.workerId) : undefined);
353
+ appendGoalMetadataLine(lines, "Prompt", task.prompt);
354
+ if (task.verification) {
355
+ appendGoalMetadataLine(lines, "Verification", task.verification.status);
356
+ appendGoalMetadataLine(lines, "Verification summary", task.verification.summary);
357
+ appendGoalMetadataLine(lines, "Verification command", task.verification.command ? markdownCode(task.verification.command) : undefined);
358
+ appendGoalMetadataLine(lines, "Verification output", task.verification.outputPath);
455
359
  }
360
+ appendGoalMetadataLine(lines, "Last summary", task.lastSummary);
456
361
  }
457
362
  }
458
- if (run.harness.length > 0) {
459
- rows.push(_jsx(Text, { color: theme.primary, bold: true, children: "Harness" }, "harness-heading"));
363
+ lines.push("", "## Harness", "");
364
+ if (run.harness.length === 0) {
365
+ lines.push("- none recorded");
366
+ }
367
+ else {
460
368
  for (const item of run.harness) {
461
- rows.push(_jsxs(Text, { children: [_jsx(Text, { color: "cyan", children: "\u25E6 " }), _jsx(Text, { color: theme.text, children: item.label }), item.command ? _jsxs(Text, { color: theme.secondary, children: [" \u00B7 ", item.command] }) : null, !item.command && item.path ? _jsxs(Text, { color: theme.secondary, children: [" \u00B7 ", item.path] }) : null] }, `harness-${item.id}`));
369
+ lines.push(`- ${item.label}`);
370
+ appendGoalMetadataLine(lines, "ID", markdownCode(item.id));
371
+ appendGoalMetadataLine(lines, "Command", item.command ? markdownCode(item.command) : undefined);
372
+ appendGoalMetadataLine(lines, "Path", item.path ? markdownCode(item.path) : undefined);
373
+ appendGoalMetadataLine(lines, "Description", item.description);
462
374
  }
463
375
  }
464
- if (run.evidencePlan.length > 0) {
465
- rows.push(_jsx(Text, { color: theme.primary, bold: true, children: "Evidence plan" }, "evidence-plan-heading"));
376
+ lines.push("", "## Evidence plan", "");
377
+ if (run.evidencePlan.length === 0) {
378
+ lines.push("- none recorded");
379
+ }
380
+ else {
466
381
  for (const item of run.evidencePlan) {
467
- rows.push(_jsxs(Text, { children: [_jsxs(Text, { color: evidencePlanStatusColor(item.status), children: ["\u25CF ", item.status] }), _jsxs(Text, { color: theme.text, children: [" \u00B7 ", item.label] }), item.command ? _jsxs(Text, { color: theme.secondary, children: [" \u00B7 ", item.command] }) : null, !item.command && item.path ? _jsxs(Text, { color: theme.secondary, children: [" \u00B7 ", item.path] }) : null] }, `evidence-plan-${item.id}`));
382
+ lines.push(`- **${item.status}** ${item.label} (${item.mechanism})`);
383
+ appendGoalMetadataLine(lines, "ID", markdownCode(item.id));
384
+ appendGoalMetadataLine(lines, "Description", item.description);
385
+ appendGoalMetadataLine(lines, "Command", item.command ? markdownCode(item.command) : undefined);
386
+ appendGoalMetadataLine(lines, "Path", item.path ? markdownCode(item.path) : undefined);
387
+ appendGoalMetadataLine(lines, "Instructions", item.instructions);
388
+ appendGoalMetadataLine(lines, "Evidence", item.evidence);
468
389
  }
469
390
  }
470
- if (run.verifier) {
471
- rows.push(_jsx(Text, { color: theme.primary, bold: true, children: "Verifier" }, "verifier-heading"), _jsxs(Text, { wrap: "truncate", children: [run.verifier.lastResult ? (_jsxs(Text, { color: verifierStatusColor(run.verifier.lastResult.status), children: ["\u25CF ", formatGoalVerifierSummary(run)] })) : (_jsxs(Text, { color: run.verifier.command ? "cyan" : theme.textDim, children: ["\u25CF ", formatGoalVerifierSummary(run)] })), run.verifier.command ? (_jsxs(Text, { color: theme.secondary, children: [" \u00B7 ", run.verifier.command] })) : null] }, "verifier-summary"));
391
+ lines.push("", "## Verifier", "");
392
+ if (!run.verifier) {
393
+ lines.push("- none recorded");
472
394
  }
473
- if (run.blockers.length > 0) {
474
- rows.push(_jsx(Text, { color: theme.warning, bold: true, children: "Blockers" }, "blockers-heading"));
475
- for (const [index, blocker] of run.blockers.entries()) {
476
- rows.push(_jsxs(Text, { color: theme.warning, children: ["- ", truncateGoalDetailText(blocker)] }, `blocker-${index}`));
395
+ else {
396
+ lines.push(markdownListItem(run.verifier.description));
397
+ appendGoalMetadataLine(lines, "Command", run.verifier.command ? markdownCode(run.verifier.command) : undefined);
398
+ if (run.verifier.lastResult) {
399
+ appendGoalMetadataLine(lines, "Last result", run.verifier.lastResult.status);
400
+ appendGoalMetadataLine(lines, "Summary", run.verifier.lastResult.summary);
401
+ appendGoalMetadataLine(lines, "Exit code", run.verifier.lastResult.exitCode?.toString());
402
+ appendGoalMetadataLine(lines, "Output", run.verifier.lastResult.outputPath);
403
+ appendGoalMetadataLine(lines, "Checked at", run.verifier.lastResult.checkedAt);
477
404
  }
478
405
  }
479
- if (run.evidence.length > 0) {
480
- rows.push(_jsx(Text, { color: theme.primary, bold: true, children: "Recent evidence" }, "evidence-heading"));
481
- for (const item of run.evidence.slice(-5)) {
482
- rows.push(_jsxs(Text, { children: [_jsxs(Text, { color: evidenceKindColor(item.kind), children: ["[", item.kind, "]"] }), _jsxs(Text, { color: theme.text, children: [" ", item.label] }), item.path ? _jsxs(Text, { color: theme.secondary, children: [" \u00B7 ", item.path] }) : null] }, `evidence-${item.id}`));
406
+ lines.push("", "## Final audit", "");
407
+ if (!run.completionAudit) {
408
+ lines.push("- none recorded");
409
+ }
410
+ else {
411
+ lines.push(`- **${run.completionAudit.status}** ${run.completionAudit.summary}`);
412
+ appendGoalMetadataLine(lines, "Checked at", run.completionAudit.checkedAt);
413
+ appendGoalMetadataLine(lines, "Verifier checked at", run.completionAudit.verifierCheckedAt);
414
+ appendGoalMetadataLine(lines, "Output", run.completionAudit.outputPath);
415
+ }
416
+ lines.push("", "## Evidence", "");
417
+ if (run.evidence.length === 0) {
418
+ lines.push("- none recorded");
419
+ }
420
+ else {
421
+ for (const item of run.evidence) {
422
+ lines.push(`- **${item.kind}** ${item.label}`);
423
+ appendGoalMetadataLine(lines, "ID", markdownCode(item.id));
424
+ appendGoalMetadataLine(lines, "Path", item.path ? markdownCode(item.path) : undefined);
425
+ appendGoalMetadataLine(lines, "Content", item.content);
426
+ appendGoalMetadataLine(lines, "Created", item.createdAt);
483
427
  }
484
428
  }
485
- const window = getGoalDetailScrollWindow({
486
- detailRowCount: rows.length,
487
- scrollOffset,
488
- viewportRows: maxRows,
489
- });
490
- return (_jsxs(Box, { flexDirection: "column", marginTop: 1, paddingLeft: 2, height: maxRows, overflowY: "hidden", children: [window.hiddenBefore > 0 ? (_jsxs(Text, { color: theme.secondary, children: ["\u2191 ", window.hiddenBefore, " detail row(s) above \u00B7 PgUp"] })) : null, rows.slice(window.start, window.end), window.hiddenAfter > 0 ? (_jsxs(Text, { color: theme.secondary, children: ["\u2193 ", window.hiddenAfter, " more detail row(s) \u00B7 PgDn"] })) : null] }));
429
+ lines.push("", "## Blockers", "");
430
+ if (run.blockers.length === 0) {
431
+ lines.push("- none recorded");
432
+ }
433
+ else {
434
+ lines.push(...run.blockers.map(markdownListItem));
435
+ }
436
+ return lines
437
+ .join("\n")
438
+ .replace(/\n{3,}/g, "\n\n")
439
+ .trim();
491
440
  }
492
- export function GoalOverlay({ cwd, onClose, onRunGoal, onVerifyGoal, onPauseGoal, agentRunning, }) {
441
+ function GoalHeader({ cwd, runs, agentRunning, }) {
442
+ const theme = useTheme();
443
+ const { columns } = useTerminalSize();
444
+ const displayPath = formatDisplayPath(cwd);
445
+ const counts = summarizeGoalCountsFromRuns(runs);
446
+ if (columns < SIDE_BY_SIDE_MIN) {
447
+ return (_jsxs(Box, { flexDirection: "column", marginTop: 1, marginBottom: 1, width: columns, children: [_jsx(GoalGradientText, { text: GOAL_LOGO[0] }), _jsx(GoalGradientText, { text: GOAL_LOGO[1] }), _jsx(GoalGradientText, { text: GOAL_LOGO[2] }), _jsxs(Box, { marginTop: 1, children: [_jsx(Text, { color: GOAL_SUCCESS, bold: true, children: "Goal Pane" }), agentRunning && _jsx(Text, { color: GOAL_ACTIVE, children: " (agent running)" }), _jsxs(Text, { color: theme.textDim, children: [" \u00B7 ", basename(cwd)] })] }), _jsx(Text, { color: theme.textDim, wrap: "truncate", children: displayPath }), _jsxs(Text, { children: [_jsxs(Text, { color: GOAL_SUCCESS, children: [counts.passed, " passed"] }), _jsx(Text, { color: theme.textDim, children: " \u00B7 " }), _jsxs(Text, { color: GOAL_ACTIVE, children: [counts.running, " active"] }), _jsx(Text, { color: theme.textDim, children: " \u00B7 " }), _jsxs(Text, { color: theme.text, children: [counts.pending, " pending"] }), _jsx(Text, { color: theme.textDim, children: " \u00B7 " }), _jsxs(Text, { color: GOAL_ACTIVE, children: [counts.blocked, " blocked"] })] })] }));
448
+ }
449
+ return (_jsxs(Box, { flexDirection: "column", marginTop: 1, marginBottom: 1, width: columns, children: [_jsxs(Box, { children: [_jsx(GoalGradientText, { text: GOAL_LOGO[0] }), _jsx(Text, { children: GAP }), _jsx(Text, { color: GOAL_SUCCESS, bold: true, children: "Goal Pane" }), agentRunning && _jsx(Text, { color: GOAL_ACTIVE, children: " (agent running)" })] }), _jsxs(Box, { children: [_jsx(GoalGradientText, { text: GOAL_LOGO[1] }), _jsx(Text, { children: GAP }), _jsx(Text, { color: theme.textDim, wrap: "truncate", children: displayPath })] }), _jsxs(Box, { children: [_jsx(GoalGradientText, { text: GOAL_LOGO[2] }), _jsx(Text, { children: GAP }), _jsxs(Text, { children: [_jsxs(Text, { color: GOAL_SUCCESS, children: [counts.passed, " passed"] }), _jsx(Text, { color: theme.textDim, children: " \u00B7 " }), _jsxs(Text, { color: GOAL_ACTIVE, children: [counts.running, " active"] }), _jsx(Text, { color: theme.textDim, children: " \u00B7 " }), _jsxs(Text, { color: theme.text, children: [counts.pending, " pending"] }), _jsx(Text, { color: theme.textDim, children: " \u00B7 " }), _jsxs(Text, { color: GOAL_ACTIVE, children: [counts.blocked, " blocked"] })] })] })] }));
450
+ }
451
+ function StatusChip({ label, color }) {
452
+ return (_jsxs(Text, { color: color, bold: true, children: ["\u25D6 ", label, " \u25D7"] }));
453
+ }
454
+ export function createGoalReviewSnapshot({ run, markdownWidth, }) {
455
+ const safeMarkdownWidth = Number.isFinite(markdownWidth)
456
+ ? Math.max(40, Math.floor(markdownWidth))
457
+ : 80;
458
+ return {
459
+ id: `${run.id}:${run.updatedAt}:${safeMarkdownWidth}`,
460
+ run,
461
+ content: formatGoalPlanMarkdown(run),
462
+ markdownWidth: safeMarkdownWidth,
463
+ };
464
+ }
465
+ export function getGoalExpandedDetailViewModel({ run, markdownWidth, }) {
466
+ return createGoalReviewSnapshot({ run, markdownWidth });
467
+ }
468
+ function GoalReviewDocument({ snapshot }) {
469
+ const theme = useTheme();
470
+ return (_jsxs(Box, { flexDirection: "column", paddingRight: 1, children: [_jsx(GoalHeader, { cwd: snapshot.run.projectPath, runs: [snapshot.run], agentRunning: false }), _jsxs(Box, { marginBottom: 1, children: [_jsxs(Text, { color: GOAL_SUCCESS, bold: true, children: ["◆ ", snapshot.run.title] }), _jsxs(Text, { color: theme.textDim, children: [" \u00B7 ", snapshot.run.status] })] }), _jsxs(Box, { flexDirection: "row", marginTop: 1, paddingRight: 1, children: [_jsx(Box, { width: PREFIX_WIDTH, flexShrink: 0, children: _jsx(Text, { color: GOAL_SUCCESS, children: "◇ " }) }), _jsx(Box, { flexDirection: "column", flexGrow: 1, width: snapshot.markdownWidth, children: _jsx(Markdown, { width: snapshot.markdownWidth, children: snapshot.content }) })] }), _jsx(Box, { marginTop: 1, marginBottom: 1, children: _jsx(Text, { color: theme.textDim, children: "Mouse-wheel scroll this terminal output to review the full Goal plan." }) })] }));
471
+ }
472
+ export function GoalOverlay({ cwd, onClose, onRunGoal, onVerifyGoal, onPauseGoal, onRefineGoal, agentRunning, autoExpandNewest, }) {
493
473
  const theme = useTheme();
494
474
  const [runs, setRuns] = useState([]);
495
475
  const [selectedIndex, setSelectedIndex] = useState(0);
496
476
  const [loaded, setLoaded] = useState(false);
497
477
  const [expandedRunId, setExpandedRunId] = useState(null);
478
+ const [reviewSnapshot, setReviewSnapshot] = useState(null);
498
479
  const [mode, setMode] = useState("normal");
480
+ const [refineFeedback, setRefineFeedback] = useState("");
499
481
  const [status, setStatus] = useState("");
500
- const [detailScrollOffset, setDetailScrollOffset] = useState(0);
482
+ const autoExpandedRef = useRef(false);
501
483
  const statusTimer = useRef(null);
502
484
  const saveTimer = useRef(null);
503
485
  const lastPersistedRunsRef = useRef([]);
486
+ const { stdout } = useStdout();
487
+ const { rows, columns } = useTerminalSize();
488
+ const markdownWidth = Math.max(40, columns - PREFIX_WIDTH);
489
+ function expandGoal(run) {
490
+ setExpandedRunId(run.id);
491
+ setReviewSnapshot(createGoalReviewSnapshot({ run, markdownWidth }));
492
+ }
493
+ function collapseGoal() {
494
+ stdout?.write("\x1b[2J\x1b[3J\x1b[H");
495
+ setExpandedRunId(null);
496
+ setReviewSnapshot(null);
497
+ setMode("normal");
498
+ setRefineFeedback("");
499
+ autoExpandedRef.current = true;
500
+ }
504
501
  const showStatus = useCallback((message) => {
505
502
  setStatus(message);
506
503
  if (statusTimer.current)
@@ -537,7 +534,27 @@ export function GoalOverlay({ cwd, onClose, onRunGoal, onVerifyGoal, onPauseGoal
537
534
  }, [cwd]);
538
535
  useEffect(() => {
539
536
  setSelectedIndex((index) => clampGoalSelectedIndex(index, runs.length));
540
- }, [runs.length]);
537
+ if (expandedRunId && !runs.some((run) => run.id === expandedRunId)) {
538
+ setExpandedRunId(null);
539
+ setReviewSnapshot(null);
540
+ }
541
+ }, [expandedRunId, runs]);
542
+ useEffect(() => {
543
+ const nextState = getGoalAutoExpandedState({
544
+ autoExpandNewest,
545
+ loaded,
546
+ runs,
547
+ alreadyExpanded: autoExpandedRef.current,
548
+ });
549
+ if (!nextState)
550
+ return;
551
+ const run = runs[nextState.selectedIndex];
552
+ if (!run)
553
+ return;
554
+ autoExpandedRef.current = true;
555
+ setSelectedIndex(nextState.selectedIndex);
556
+ expandGoal(run);
557
+ }, [autoExpandNewest, loaded, runs, markdownWidth]);
541
558
  useEffect(() => {
542
559
  if (!loaded)
543
560
  return;
@@ -552,39 +569,42 @@ export function GoalOverlay({ cwd, onClose, onRunGoal, onVerifyGoal, onPauseGoal
552
569
  void saveGoalRuns(cwd, runs);
553
570
  }, 100);
554
571
  }, [cwd, loaded, runs]);
555
- const { rows } = useTerminalSize();
556
572
  const viewportRows = getGoalOverlayViewportRows(rows);
557
573
  const selectedRun = runs[selectedIndex];
558
- const expandedRun = selectedRun && selectedRun.id === expandedRunId ? selectedRun : null;
559
- const selectedCardExtraRows = selectedRun ? getGoalCardExtraRowCount(selectedRun) : 0;
560
- const expandedCardExtraRows = expandedRun ? selectedCardExtraRows : 0;
561
- const detailViewportRows = expandedRun
562
- ? getGoalExpandedDetailViewportRows({
563
- viewportRows,
564
- cardExtraRows: expandedCardExtraRows,
565
- })
566
- : 0;
567
- const listWindow = expandedRun
568
- ? null
569
- : getGoalListWindow({
570
- runs,
571
- selectedIndex,
572
- viewportRows,
573
- });
574
- const scrollOffset = expandedRun ? selectedIndex : (listWindow?.start ?? 0);
575
- const visibleRuns = expandedRun
576
- ? [expandedRun]
577
- : runs.slice(listWindow?.start ?? 0, listWindow?.end ?? 0);
578
- const hiddenBefore = expandedRun ? 0 : (listWindow?.hiddenBefore ?? 0);
579
- const hiddenAfter = expandedRun ? 0 : (listWindow?.hiddenAfter ?? 0);
580
- const detailRowCount = expandedRun ? getGoalDetailRowCount(expandedRun) : 0;
581
- useEffect(() => {
582
- setDetailScrollOffset(0);
583
- }, [expandedRunId]);
584
- useEffect(() => {
585
- setDetailScrollOffset((offset) => clampGoalDetailScrollOffset(offset, detailRowCount, detailViewportRows));
586
- }, [detailRowCount, detailViewportRows]);
574
+ const expandedRun = runs.find((run) => run.id === expandedRunId) ?? reviewSnapshot?.run ?? null;
575
+ const listWindow = getGoalListWindow({
576
+ runs,
577
+ selectedIndex,
578
+ viewportRows,
579
+ });
580
+ const scrollOffset = listWindow.start;
581
+ const visibleRuns = runs.slice(listWindow.start, listWindow.end);
582
+ const hiddenBefore = listWindow.hiddenBefore;
583
+ const hiddenAfter = listWindow.hiddenAfter;
587
584
  useInput((input, key) => {
585
+ if (mode === "refine") {
586
+ if (key.return) {
587
+ if (expandedRun) {
588
+ onRefineGoal?.(expandedRun, refineFeedback || "Please refine this Goal setup.");
589
+ }
590
+ setMode("normal");
591
+ setRefineFeedback("");
592
+ return;
593
+ }
594
+ if (key.escape) {
595
+ setMode("normal");
596
+ setRefineFeedback("");
597
+ return;
598
+ }
599
+ if (key.backspace || key.delete) {
600
+ setRefineFeedback((previous) => previous.slice(0, -1));
601
+ return;
602
+ }
603
+ if (input && !key.ctrl && !key.meta) {
604
+ setRefineFeedback((previous) => previous + input);
605
+ }
606
+ return;
607
+ }
588
608
  if (mode === "confirmDelete") {
589
609
  if (key.escape || input === "n") {
590
610
  setMode("normal");
@@ -594,39 +614,36 @@ export function GoalOverlay({ cwd, onClose, onRunGoal, onVerifyGoal, onPauseGoal
594
614
  if (input === "y" && selectedRun) {
595
615
  setRuns((previousRuns) => previousRuns.filter((run) => run.id !== selectedRun.id));
596
616
  setExpandedRunId(null);
617
+ setReviewSnapshot(null);
597
618
  setMode("normal");
598
619
  showStatus("Goal archived");
599
620
  }
600
621
  return;
601
622
  }
602
623
  if (key.escape) {
603
- onClose();
604
- return;
605
- }
606
- if (expandedRun && (key.pageUp || input === "[")) {
607
- setDetailScrollOffset((offset) => clampGoalDetailScrollOffset(offset - Math.max(1, detailViewportRows - 1), detailRowCount, detailViewportRows));
608
- return;
609
- }
610
- if (expandedRun && (key.pageDown || input === "]")) {
611
- setDetailScrollOffset((offset) => clampGoalDetailScrollOffset(offset + Math.max(1, detailViewportRows - 1), detailRowCount, detailViewportRows));
624
+ if (expandedRun) {
625
+ collapseGoal();
626
+ }
627
+ else {
628
+ onClose();
629
+ }
612
630
  return;
613
631
  }
614
- if (expandedRun && key.home) {
615
- setDetailScrollOffset(0);
632
+ if (expandedRun && input === "a") {
633
+ onRunGoal(expandedRun);
616
634
  return;
617
635
  }
618
- if (expandedRun && key.end) {
619
- setDetailScrollOffset(clampGoalDetailScrollOffset(detailRowCount, detailRowCount, detailViewportRows));
636
+ if (expandedRun && input === "r") {
637
+ setMode("refine");
638
+ setRefineFeedback("");
620
639
  return;
621
640
  }
622
- if (expandedRun && (key.upArrow || input === "k")) {
623
- setDetailScrollOffset((offset) => clampGoalDetailScrollOffset(offset - 1, detailRowCount, detailViewportRows));
641
+ if (expandedRun && (input === "q" || key.return)) {
642
+ collapseGoal();
624
643
  return;
625
644
  }
626
- if (expandedRun && (key.downArrow || input === "j")) {
627
- setDetailScrollOffset((offset) => clampGoalDetailScrollOffset(offset + 1, detailRowCount, detailViewportRows));
645
+ if (expandedRun)
628
646
  return;
629
- }
630
647
  if (key.upArrow || input === "k") {
631
648
  setSelectedIndex((index) => clampGoalSelectedIndex(index - 1, runs.length));
632
649
  return;
@@ -636,13 +653,23 @@ export function GoalOverlay({ cwd, onClose, onRunGoal, onVerifyGoal, onPauseGoal
636
653
  return;
637
654
  }
638
655
  if ((key.return || input === "d") && selectedRun) {
639
- setExpandedRunId((current) => (current === selectedRun.id ? null : selectedRun.id));
656
+ expandGoal(selectedRun);
640
657
  return;
641
658
  }
642
- if (input === "r" && selectedRun) {
659
+ if (input === "a" && selectedRun) {
643
660
  onRunGoal(selectedRun);
644
661
  return;
645
662
  }
663
+ if (input === "r" && selectedRun) {
664
+ if (expandedRun) {
665
+ setMode("refine");
666
+ setRefineFeedback("");
667
+ }
668
+ else {
669
+ expandGoal(selectedRun);
670
+ }
671
+ return;
672
+ }
646
673
  if (input === "v" && selectedRun) {
647
674
  onVerifyGoal(selectedRun);
648
675
  return;
@@ -656,11 +683,14 @@ export function GoalOverlay({ cwd, onClose, onRunGoal, onVerifyGoal, onPauseGoal
656
683
  showStatus("Archive goal? y/n");
657
684
  }
658
685
  });
686
+ if (expandedRun && reviewSnapshot) {
687
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Static, { items: [reviewSnapshot], style: { width: "100%" }, children: (snapshot) => _jsx(GoalReviewDocument, { snapshot: snapshot }, snapshot.id) }, reviewSnapshot.id), _jsx(Box, { marginTop: 1, children: mode === "confirmDelete" ? (_jsx(Text, { color: theme.warning, children: "Confirm archive selected goal: y/n" })) : mode === "refine" ? (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: theme.primary, children: "Feedback (Enter to submit, Esc to cancel):" }), _jsxs(Text, { color: theme.text, children: ["> ", refineFeedback, "▍"] })] })) : (_jsxs(Text, { color: theme.textDim, children: [_jsx(Text, { color: theme.success, children: "a" }), " approve/run · ", _jsx(Text, { color: theme.error, children: "r" }), " refine · ", _jsx(Text, { color: theme.primary, children: "q" }), " back · ", _jsx(Text, { color: theme.primary, children: "ESC" }), " close"] })) }), status ? (_jsx(Box, { children: _jsx(Text, { color: theme.secondary, children: status }) })) : null] }));
688
+ }
659
689
  return (_jsxs(Box, { flexDirection: "column", height: rows, overflow: "hidden", children: [_jsx(GoalHeader, { cwd: cwd, runs: runs, agentRunning: agentRunning }), agentRunning ? (_jsx(Box, { marginBottom: 1, children: _jsx(Text, { color: theme.textDim, children: "Agent is running; Goal pane stays available without resetting chat." }) })) : null, !loaded ? (_jsx(Box, { borderStyle: "round", borderColor: theme.textDim, paddingX: 1, children: _jsx(Text, { color: theme.textDim, children: "Loading goals\u2026" }) })) : runs.length === 0 ? (_jsxs(Box, { flexDirection: "column", marginTop: 1, borderStyle: "round", borderColor: theme.primary, paddingX: 1, paddingY: 1, children: [_jsx(Text, { color: theme.primary, bold: true, children: "Start a durable Goal run" }), _jsx(Text, { color: theme.textDim, children: "No goals yet. Ask the agent to start a durable Goal." }), _jsx(Text, { color: theme.textDim, children: "Prerequisites, worker tasks, evidence, and verifier results will appear in this pane." })] })) : (_jsxs(Box, { flexDirection: "column", height: viewportRows, overflowY: "hidden", children: [_jsx(Text, { color: theme.textDim, bold: true, children: "Goals" }), hiddenBefore > 0 ? (_jsxs(Text, { color: theme.textDim, children: ["\u2191 ", hiddenBefore, " earlier goal", hiddenBefore === 1 ? "" : "s"] })) : null, visibleRuns.map((run, visibleIndex) => {
660
690
  const index = scrollOffset + visibleIndex;
661
691
  const selected = index === selectedIndex;
662
692
  const blocked = goalHasBlockingPrerequisites(run);
663
- return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, borderStyle: expandedRun?.id === run.id ? "round" : undefined, borderColor: expandedRun?.id === run.id ? theme.primary : undefined, paddingX: expandedRun?.id === run.id ? 1 : 0, children: [_jsxs(Text, { wrap: "truncate", children: [_jsx(Text, { color: selected ? theme.primary : theme.textDim, children: selected ? "❯ " : " " }), _jsx(StatusChip, { label: run.status, color: getGoalCardStatusColor({
693
+ return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Text, { wrap: "truncate", children: [_jsx(Text, { color: selected ? theme.primary : theme.textDim, children: selected ? "❯ " : " " }), _jsx(StatusChip, { label: run.status, color: getGoalCardStatusColor({
664
694
  status: run.status,
665
695
  selected,
666
696
  primaryColor: theme.primary,
@@ -669,7 +699,7 @@ export function GoalOverlay({ cwd, onClose, onRunGoal, onVerifyGoal, onPauseGoal
669
699
  selected,
670
700
  primaryColor: theme.primary,
671
701
  textColor: theme.text,
672
- }), bold: selected, children: [" ", run.title] }), _jsxs(Text, { color: theme.textDim, children: [" \u00B7 ", run.id.slice(0, 8)] })] }), expandedRun?.id === run.id ? null : (_jsxs(_Fragment, { children: [_jsxs(Text, { wrap: "truncate", children: [_jsx(Text, { color: theme.textDim, children: selected ? " " : " " }), _jsx(Text, { color: statusColor(run.status) || theme.secondary, children: getGoalReadinessText(run) }), _jsx(Text, { color: theme.textDim, children: " \u00B7 " }), _jsx(Text, { color: theme.text, children: formatGoalProgressText(run) }), _jsx(Text, { color: theme.textDim, children: " \u00B7 " }), _jsx(Text, { color: verifierSummaryColor(run, theme.textDim), children: formatGoalVerifierSummary(run) })] }), _jsxs(Text, { wrap: "truncate", children: [_jsx(Text, { color: theme.textDim, children: selected ? " " : " " }), _jsx(Text, { color: goalHasBlockingPrerequisites(run) ? theme.warning : GOAL_SUCCESS, children: formatGoalPrerequisiteSummary(run) }), _jsx(Text, { color: theme.textDim, children: " \u00B7 " }), _jsx(Text, { color: run.tasks.length > 0 ? GOAL_SUCCESS : theme.text, children: formatGoalTaskSummary(run) })] })] })), blocked ? (_jsxs(Text, { color: theme.warning, wrap: "truncate", children: [selected ? " " : " ", "\u26A0 prerequisite needed before workers continue"] })) : run.status === "running" || run.status === "verifying" ? (_jsxs(Text, { color: GOAL_ACTIVE, wrap: "truncate", children: [selected ? " " : " ", "\u25CF active \u2014 watching worker/verifier progress"] })) : null, run.blockers.length > 0 ? (_jsxs(Text, { color: theme.warning, wrap: "truncate", children: [selected ? " " : " ", "blocker: ", run.blockers[0]] })) : null, expandedRun?.id === run.id ? (_jsx(GoalDetail, { run: run, maxRows: detailViewportRows, scrollOffset: detailScrollOffset })) : null] }, run.id));
673
- }), hiddenAfter > 0 ? (_jsxs(Text, { color: theme.textDim, children: ["\u2193 ", hiddenAfter, " later goal", hiddenAfter === 1 ? "" : "s"] })) : null] })), _jsx(Box, { marginTop: 1, children: mode === "confirmDelete" ? (_jsx(Text, { color: theme.warning, children: "Confirm archive selected goal: y/n" })) : (_jsxs(Text, { color: theme.textDim, children: [_jsx(Text, { color: theme.primary, children: "\u2191\u2193/jk" }), expandedRun ? " scroll detail · " : " select · ", _jsx(Text, { color: theme.primary, children: "Enter/d" }), expandedRun ? " close detail · " : " detail · ", expandedRun ? (_jsxs(_Fragment, { children: [_jsx(Text, { color: theme.primary, children: "PgUp/PgDn" }), " page detail · "] })) : null, _jsx(Text, { color: theme.primary, children: "r" }), " run · ", _jsx(Text, { color: theme.primary, children: "v" }), " verify · ", _jsx(Text, { color: theme.primary, children: "p" }), " pause · ", _jsx(Text, { color: theme.primary, children: "x" }), " archive · ", _jsx(Text, { color: theme.primary, children: "Esc" }), " close"] })) }), status ? (_jsx(Box, { children: _jsx(Text, { color: theme.secondary, children: status }) })) : null] }));
702
+ }), bold: selected, children: [" ", run.title] }), _jsxs(Text, { color: theme.textDim, children: [" \u00B7 ", run.id.slice(0, 8)] })] }), _jsxs(Text, { wrap: "truncate", children: [_jsx(Text, { color: theme.textDim, children: selected ? " " : " " }), _jsx(Text, { color: statusColor(run.status) || theme.secondary, children: getGoalReadinessText(run) }), _jsx(Text, { color: theme.textDim, children: " \u00B7 " }), _jsx(Text, { color: theme.text, children: formatGoalProgressText(run) }), _jsx(Text, { color: theme.textDim, children: " \u00B7 " }), _jsx(Text, { color: verifierSummaryColor(run, theme.textDim), children: formatGoalVerifierSummary(run) })] }), _jsxs(Text, { wrap: "truncate", children: [_jsx(Text, { color: theme.textDim, children: selected ? " " : " " }), _jsx(Text, { color: goalHasBlockingPrerequisites(run) ? theme.warning : GOAL_SUCCESS, children: formatGoalPrerequisiteSummary(run) }), _jsx(Text, { color: theme.textDim, children: " \u00B7 " }), _jsx(Text, { color: run.tasks.length > 0 ? GOAL_SUCCESS : theme.text, children: formatGoalTaskSummary(run) })] }), blocked ? (_jsxs(Text, { color: theme.warning, wrap: "truncate", children: [selected ? " " : " ", "\u26A0 prerequisite needed before workers continue"] })) : run.status === "running" || run.status === "verifying" ? (_jsxs(Text, { color: GOAL_ACTIVE, wrap: "truncate", children: [selected ? " " : " ", "\u25CF active \u2014 watching worker/verifier progress"] })) : null, run.blockers.length > 0 ? (_jsxs(Text, { color: theme.warning, wrap: "truncate", children: [selected ? " " : " ", "blocker: ", run.blockers[0]] })) : null] }, run.id));
703
+ }), hiddenAfter > 0 ? (_jsxs(Text, { color: theme.textDim, children: ["\u2193 ", hiddenAfter, " later goal", hiddenAfter === 1 ? "" : "s"] })) : null] })), _jsx(Box, { marginTop: 1, children: mode === "confirmDelete" ? (_jsx(Text, { color: theme.warning, children: "Confirm archive selected goal: y/n" })) : mode === "refine" ? (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: theme.primary, children: "Feedback (Enter to submit, Esc to cancel):" }), _jsxs(Text, { color: theme.text, children: ["> ", refineFeedback, "▍"] })] })) : (_jsxs(Text, { color: theme.textDim, children: [_jsx(Text, { color: theme.primary, children: "\u2191\u2193/jk" }), " select · ", _jsx(Text, { color: theme.primary, children: "Enter/d" }), " detail · ", _jsx(Text, { color: theme.primary, children: "a" }), " run · ", _jsx(Text, { color: theme.primary, children: "v" }), " verify · ", _jsx(Text, { color: theme.primary, children: "p" }), " pause · ", _jsx(Text, { color: theme.primary, children: "x" }), " archive · ", _jsx(Text, { color: theme.primary, children: "Esc" }), " close"] })) }), status ? (_jsx(Box, { children: _jsx(Text, { color: theme.secondary, children: status }) })) : null] }));
674
704
  }
675
705
  //# sourceMappingURL=GoalOverlay.js.map