@mragentix/cli 4.2.39 → 4.2.53

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 (223) hide show
  1. package/README.md +15 -6
  2. package/defaults/agents/bee.md +22 -0
  3. package/defaults/agents/db-manager.md +31 -0
  4. package/defaults/agents/deployer.md +35 -0
  5. package/defaults/agents/devops.md +36 -0
  6. package/defaults/agents/owl.md +24 -0
  7. package/defaults/agents/payments.md +29 -0
  8. package/defaults/agents/workspace.md +37 -0
  9. package/defaults/skills/act.md +65 -0
  10. package/defaults/skills/docker.md +84 -0
  11. package/defaults/skills/doppler.md +89 -0
  12. package/defaults/skills/drizzle.md +81 -0
  13. package/defaults/skills/firebase.md +83 -0
  14. package/defaults/skills/gh.md +91 -0
  15. package/defaults/skills/gws.md +72 -0
  16. package/defaults/skills/netlify.md +69 -0
  17. package/defaults/skills/prisma.md +62 -0
  18. package/defaults/skills/railway.md +69 -0
  19. package/defaults/skills/stripe.md +69 -0
  20. package/defaults/skills/supabase.md +84 -0
  21. package/defaults/skills/turso.md +78 -0
  22. package/defaults/skills/vercel.md +72 -0
  23. package/defaults/skills/wrangler.md +105 -0
  24. package/dist/cli.js +5 -5
  25. package/dist/cli.js.map +1 -1
  26. package/dist/config.d.ts.map +1 -1
  27. package/dist/config.js +4 -63
  28. package/dist/config.js.map +1 -1
  29. package/dist/core/agent-session.d.ts +1 -1
  30. package/dist/core/agent-session.d.ts.map +1 -1
  31. package/dist/core/agent-session.js +7 -7
  32. package/dist/core/agent-session.js.map +1 -1
  33. package/dist/core/agents.d.ts +9 -4
  34. package/dist/core/agents.d.ts.map +1 -1
  35. package/dist/core/agents.js +53 -8
  36. package/dist/core/agents.js.map +1 -1
  37. package/dist/core/auto-update.js +1 -1
  38. package/dist/core/auto-update.js.map +1 -1
  39. package/dist/core/compaction/compactor.d.ts +1 -1
  40. package/dist/core/compaction/compactor.d.ts.map +1 -1
  41. package/dist/core/compaction/compactor.js +1 -1
  42. package/dist/core/compaction/compactor.js.map +1 -1
  43. package/dist/core/compaction/compactor.test.js +2 -2
  44. package/dist/core/compaction/compactor.test.js.map +1 -1
  45. package/dist/core/compaction/token-estimator.d.ts +1 -1
  46. package/dist/core/compaction/token-estimator.d.ts.map +1 -1
  47. package/dist/core/event-bus.d.ts +1 -1
  48. package/dist/core/event-bus.d.ts.map +1 -1
  49. package/dist/core/extensions/types.d.ts +1 -1
  50. package/dist/core/extensions/types.d.ts.map +1 -1
  51. package/dist/core/index.d.ts +2 -3
  52. package/dist/core/index.d.ts.map +1 -1
  53. package/dist/core/index.js +2 -3
  54. package/dist/core/index.js.map +1 -1
  55. package/dist/core/mcp/client.d.ts +1 -1
  56. package/dist/core/mcp/client.d.ts.map +1 -1
  57. package/dist/core/mcp/defaults.d.ts +1 -1
  58. package/dist/core/mcp/defaults.d.ts.map +1 -1
  59. package/dist/core/model-registry.d.ts +1 -1
  60. package/dist/core/model-registry.d.ts.map +1 -1
  61. package/dist/core/process-manager.d.ts.map +1 -1
  62. package/dist/core/process-manager.js +2 -7
  63. package/dist/core/process-manager.js.map +1 -1
  64. package/dist/core/session-manager.d.ts +1 -1
  65. package/dist/core/session-manager.d.ts.map +1 -1
  66. package/dist/core/skills.d.ts +7 -1
  67. package/dist/core/skills.d.ts.map +1 -1
  68. package/dist/core/skills.js +53 -7
  69. package/dist/core/skills.js.map +1 -1
  70. package/dist/core/slash-commands.d.ts.map +1 -1
  71. package/dist/core/slash-commands.js +1 -97
  72. package/dist/core/slash-commands.js.map +1 -1
  73. package/dist/core/telegram.d.ts +19 -0
  74. package/dist/core/telegram.d.ts.map +1 -1
  75. package/dist/core/telegram.js +22 -0
  76. package/dist/core/telegram.js.map +1 -1
  77. package/dist/core/voice-transcriber.d.ts +33 -0
  78. package/dist/core/voice-transcriber.d.ts.map +1 -0
  79. package/dist/core/voice-transcriber.js +113 -0
  80. package/dist/core/voice-transcriber.js.map +1 -0
  81. package/dist/core/voice-transcriber.test.d.ts +2 -0
  82. package/dist/core/voice-transcriber.test.d.ts.map +1 -0
  83. package/dist/core/voice-transcriber.test.js +88 -0
  84. package/dist/core/voice-transcriber.test.js.map +1 -0
  85. package/dist/interactive.js +6 -6
  86. package/dist/interactive.js.map +1 -1
  87. package/dist/modes/json-mode.d.ts +1 -1
  88. package/dist/modes/json-mode.d.ts.map +1 -1
  89. package/dist/modes/json-mode.js +1 -1
  90. package/dist/modes/json-mode.js.map +1 -1
  91. package/dist/modes/print-mode.d.ts +1 -1
  92. package/dist/modes/print-mode.d.ts.map +1 -1
  93. package/dist/modes/print-mode.js +1 -1
  94. package/dist/modes/print-mode.js.map +1 -1
  95. package/dist/modes/rpc-mode.d.ts +1 -1
  96. package/dist/modes/rpc-mode.d.ts.map +1 -1
  97. package/dist/modes/rpc-mode.js +1 -1
  98. package/dist/modes/rpc-mode.js.map +1 -1
  99. package/dist/modes/serve-mode.d.ts +1 -1
  100. package/dist/modes/serve-mode.d.ts.map +1 -1
  101. package/dist/modes/serve-mode.js +41 -4
  102. package/dist/modes/serve-mode.js.map +1 -1
  103. package/dist/session.d.ts +1 -1
  104. package/dist/session.d.ts.map +1 -1
  105. package/dist/session.js +1 -8
  106. package/dist/session.js.map +1 -1
  107. package/dist/system-prompt.js +2 -2
  108. package/dist/system-prompt.js.map +1 -1
  109. package/dist/tools/bash.d.ts +1 -2
  110. package/dist/tools/bash.d.ts.map +1 -1
  111. package/dist/tools/bash.js +1 -1
  112. package/dist/tools/bash.js.map +1 -1
  113. package/dist/tools/edit.d.ts +1 -1
  114. package/dist/tools/edit.d.ts.map +1 -1
  115. package/dist/tools/enter-plan.d.ts +1 -1
  116. package/dist/tools/enter-plan.d.ts.map +1 -1
  117. package/dist/tools/exit-plan.d.ts +1 -1
  118. package/dist/tools/exit-plan.d.ts.map +1 -1
  119. package/dist/tools/exit-plan.js +2 -3
  120. package/dist/tools/exit-plan.js.map +1 -1
  121. package/dist/tools/find.d.ts +1 -1
  122. package/dist/tools/find.d.ts.map +1 -1
  123. package/dist/tools/grep.d.ts +1 -1
  124. package/dist/tools/grep.d.ts.map +1 -1
  125. package/dist/tools/index.d.ts +5 -2
  126. package/dist/tools/index.d.ts.map +1 -1
  127. package/dist/tools/index.js.map +1 -1
  128. package/dist/tools/ls.d.ts +1 -1
  129. package/dist/tools/ls.d.ts.map +1 -1
  130. package/dist/tools/plan-mode.test.js +6 -6
  131. package/dist/tools/plan-mode.test.js.map +1 -1
  132. package/dist/tools/read.d.ts +1 -1
  133. package/dist/tools/read.d.ts.map +1 -1
  134. package/dist/tools/skill.d.ts +1 -1
  135. package/dist/tools/skill.d.ts.map +1 -1
  136. package/dist/tools/subagent.d.ts +1 -1
  137. package/dist/tools/subagent.d.ts.map +1 -1
  138. package/dist/tools/task-output.d.ts +1 -1
  139. package/dist/tools/task-output.d.ts.map +1 -1
  140. package/dist/tools/task-stop.d.ts +1 -1
  141. package/dist/tools/task-stop.d.ts.map +1 -1
  142. package/dist/tools/tasks.d.ts +1 -1
  143. package/dist/tools/tasks.d.ts.map +1 -1
  144. package/dist/tools/tasks.js +1 -1
  145. package/dist/tools/tasks.js.map +1 -1
  146. package/dist/tools/web-fetch.d.ts +1 -1
  147. package/dist/tools/web-fetch.d.ts.map +1 -1
  148. package/dist/tools/web-fetch.js +1 -1
  149. package/dist/tools/web-fetch.js.map +1 -1
  150. package/dist/tools/write.d.ts +1 -1
  151. package/dist/tools/write.d.ts.map +1 -1
  152. package/dist/tools/write.js +3 -1
  153. package/dist/tools/write.js.map +1 -1
  154. package/dist/types.d.ts +1 -1
  155. package/dist/types.d.ts.map +1 -1
  156. package/dist/ui/App.d.ts +9 -3
  157. package/dist/ui/App.d.ts.map +1 -1
  158. package/dist/ui/App.js +49 -121
  159. package/dist/ui/App.js.map +1 -1
  160. package/dist/ui/activity-phrases.d.ts +10 -0
  161. package/dist/ui/activity-phrases.d.ts.map +1 -0
  162. package/dist/ui/activity-phrases.js +227 -0
  163. package/dist/ui/activity-phrases.js.map +1 -0
  164. package/dist/ui/components/ActivityIndicator.d.ts.map +1 -1
  165. package/dist/ui/components/ActivityIndicator.js +1 -225
  166. package/dist/ui/components/ActivityIndicator.js.map +1 -1
  167. package/dist/ui/components/Banner.d.ts +1 -1
  168. package/dist/ui/components/Banner.d.ts.map +1 -1
  169. package/dist/ui/components/Banner.js +7 -4
  170. package/dist/ui/components/Banner.js.map +1 -1
  171. package/dist/ui/components/InputArea.d.ts.map +1 -1
  172. package/dist/ui/components/InputArea.js +453 -39
  173. package/dist/ui/components/InputArea.js.map +1 -1
  174. package/dist/ui/components/ModelSelector.d.ts +1 -1
  175. package/dist/ui/components/ModelSelector.d.ts.map +1 -1
  176. package/dist/ui/components/PlanOverlay.d.ts.map +1 -1
  177. package/dist/ui/components/PlanOverlay.js +7 -3
  178. package/dist/ui/components/PlanOverlay.js.map +1 -1
  179. package/dist/ui/components/SkillsOverlay.d.ts.map +1 -1
  180. package/dist/ui/components/SkillsOverlay.js +6 -2
  181. package/dist/ui/components/SkillsOverlay.js.map +1 -1
  182. package/dist/ui/components/TaskOverlay.d.ts.map +1 -1
  183. package/dist/ui/components/TaskOverlay.js +8 -4
  184. package/dist/ui/components/TaskOverlay.js.map +1 -1
  185. package/dist/ui/hooks/useAgentLoop.d.ts +2 -2
  186. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
  187. package/dist/ui/hooks/useAgentLoop.js +3 -2
  188. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  189. package/dist/ui/hooks/useSessionManager.d.ts +2 -2
  190. package/dist/ui/hooks/useSessionManager.d.ts.map +1 -1
  191. package/dist/ui/hooks/useTerminalSize.d.ts +12 -2
  192. package/dist/ui/hooks/useTerminalSize.d.ts.map +1 -1
  193. package/dist/ui/hooks/useTerminalSize.js +27 -6
  194. package/dist/ui/hooks/useTerminalSize.js.map +1 -1
  195. package/dist/ui/hooks/useTerminalTitle.d.ts +8 -1
  196. package/dist/ui/hooks/useTerminalTitle.d.ts.map +1 -1
  197. package/dist/ui/hooks/useTerminalTitle.js +20 -23
  198. package/dist/ui/hooks/useTerminalTitle.js.map +1 -1
  199. package/dist/ui/login.d.ts +1 -1
  200. package/dist/ui/login.d.ts.map +1 -1
  201. package/dist/ui/login.js +5 -1
  202. package/dist/ui/login.js.map +1 -1
  203. package/dist/ui/plan-overlay.test.d.ts +2 -0
  204. package/dist/ui/plan-overlay.test.d.ts.map +1 -0
  205. package/dist/ui/plan-overlay.test.js +327 -0
  206. package/dist/ui/plan-overlay.test.js.map +1 -0
  207. package/dist/ui/render.d.ts +2 -2
  208. package/dist/ui/render.d.ts.map +1 -1
  209. package/dist/ui/render.js +1 -1
  210. package/dist/ui/render.js.map +1 -1
  211. package/dist/ui/sessions.d.ts.map +1 -1
  212. package/dist/ui/sessions.js +5 -1
  213. package/dist/ui/sessions.js.map +1 -1
  214. package/package.json +17 -14
  215. package/LICENSE +0 -21
  216. package/dist/core/branding.d.ts +0 -11
  217. package/dist/core/branding.d.ts.map +0 -1
  218. package/dist/core/branding.js +0 -11
  219. package/dist/core/branding.js.map +0 -1
  220. package/dist/core/update.d.ts +0 -34
  221. package/dist/core/update.d.ts.map +0 -1
  222. package/dist/core/update.js +0 -231
  223. package/dist/core/update.js.map +0 -1
@@ -8,14 +8,24 @@ interface TerminalSizeValue {
8
8
  * Provider that attaches a single resize listener to stdout and shares
9
9
  * { columns, rows, resizeKey } with all descendants via context.
10
10
  *
11
- * Mount this once near the root of the component tree (e.g. in render.ts)
12
- * to avoid MaxListenersExceededWarning.
11
+ * Mount this once near the root of the component tree (e.g. in render.ts
12
+ * or App.tsx) to avoid the MaxListenersExceededWarning that occurs when
13
+ * every component independently listens for resize events.
13
14
  */
14
15
  export declare function TerminalSizeProvider({ children }: {
15
16
  children: React.ReactNode;
16
17
  }): React.FunctionComponentElement<React.ProviderProps<TerminalSizeValue | null>>;
17
18
  /**
18
19
  * Returns { columns, rows, resizeKey } from the nearest TerminalSizeProvider.
20
+ *
21
+ * All values (`columns`, `rows`, `resizeKey`) update together after resize
22
+ * events settle (300ms debounce). Updating dimensions immediately would
23
+ * trigger React re-renders on every resize event while Ink's internal
24
+ * line-tracking still assumes the old width, causing ghost/duplicate renders.
25
+ *
26
+ * `resizeKey` can be used as a React `key` to force a full remount — this
27
+ * is the only reliable way to make Ink re-render <Static> content that was
28
+ * already printed to scrollback and got corrupted by terminal text reflow.
19
29
  */
20
30
  export declare function useTerminalSize(): TerminalSizeValue;
21
31
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"useTerminalSize.d.ts","sourceRoot":"","sources":["../../../src/ui/hooks/useTerminalSize.ts"],"names":[],"mappings":"AAAA,OAAO,KAA8E,MAAM,OAAO,CAAC;AAGnG,UAAU,iBAAiB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAOD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,iFAuC/E;AAED;;GAEG;AACH,wBAAgB,eAAe,sBAM9B"}
1
+ {"version":3,"file":"useTerminalSize.d.ts","sourceRoot":"","sources":["../../../src/ui/hooks/useTerminalSize.ts"],"names":[],"mappings":"AAAA,OAAO,KAA8E,MAAM,OAAO,CAAC;AAGnG,UAAU,iBAAiB;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAWD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,iFAgD/E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,sBAM9B"}
@@ -1,5 +1,9 @@
1
1
  import React, { useState, useEffect, useRef, useCallback, useContext, createContext } from "react";
2
2
  import { useStdout } from "ink";
3
+ // Minimum terminal dimensions — below these values layout calculations can
4
+ // produce zero/negative widths that cause Ink to enter infinite re-render
5
+ // loops with ghost/duplicate content. Every consumer of useTerminalSize()
6
+ // is guaranteed at least these values.
3
7
  const MIN_COLUMNS = 40;
4
8
  const MIN_ROWS = 10;
5
9
  const TerminalSizeContext = createContext(null);
@@ -7,8 +11,9 @@ const TerminalSizeContext = createContext(null);
7
11
  * Provider that attaches a single resize listener to stdout and shares
8
12
  * { columns, rows, resizeKey } with all descendants via context.
9
13
  *
10
- * Mount this once near the root of the component tree (e.g. in render.ts)
11
- * to avoid MaxListenersExceededWarning.
14
+ * Mount this once near the root of the component tree (e.g. in render.ts
15
+ * or App.tsx) to avoid the MaxListenersExceededWarning that occurs when
16
+ * every component independently listens for resize events.
12
17
  */
13
18
  export function TerminalSizeProvider({ children }) {
14
19
  const { stdout } = useStdout();
@@ -21,14 +26,21 @@ export function TerminalSizeProvider({ children }) {
21
26
  const onResize = useCallback(() => {
22
27
  if (!stdout)
23
28
  return;
24
- // Debounce everything so we update once after the user finishes dragging.
29
+ // Do NOT update dimensions immediately doing so triggers React
30
+ // re-renders on every resize event (many per drag), but Ink's internal
31
+ // line-tracking still assumes the old width, so each re-render at the
32
+ // new width is positioned incorrectly, leaving ghost/duplicate copies
33
+ // of the input area in the terminal. Instead, debounce everything so
34
+ // we update once after the user finishes dragging.
25
35
  if (debounceRef.current)
26
36
  clearTimeout(debounceRef.current);
27
37
  debounceRef.current = setTimeout(() => {
28
38
  // Clear visible screen + scrollback to remove deformed ghost renders
29
- if (stdout.isTTY) {
30
- stdout.write("\x1b[2J" + "\x1b[3J" + "\x1b[H");
31
- }
39
+ // left behind by Ink re-rendering at different terminal widths during
40
+ // a resize drag.
41
+ stdout.write("\x1b[2J" + // clear visible screen
42
+ "\x1b[3J" + // clear scrollback buffer
43
+ "\x1b[H");
32
44
  setSize({
33
45
  columns: Math.max(MIN_COLUMNS, stdout.columns ?? 80),
34
46
  rows: Math.max(MIN_ROWS, stdout.rows ?? 24),
@@ -51,6 +63,15 @@ export function TerminalSizeProvider({ children }) {
51
63
  }
52
64
  /**
53
65
  * Returns { columns, rows, resizeKey } from the nearest TerminalSizeProvider.
66
+ *
67
+ * All values (`columns`, `rows`, `resizeKey`) update together after resize
68
+ * events settle (300ms debounce). Updating dimensions immediately would
69
+ * trigger React re-renders on every resize event while Ink's internal
70
+ * line-tracking still assumes the old width, causing ghost/duplicate renders.
71
+ *
72
+ * `resizeKey` can be used as a React `key` to force a full remount — this
73
+ * is the only reliable way to make Ink re-render <Static> content that was
74
+ * already printed to scrollback and got corrupted by terminal text reflow.
54
75
  */
55
76
  export function useTerminalSize() {
56
77
  const ctx = useContext(TerminalSizeContext);
@@ -1 +1 @@
1
- {"version":3,"file":"useTerminalSize.js","sourceRoot":"","sources":["../../../src/ui/hooks/useTerminalSize.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useTerminalSize.js","sourceRoot":"","sources":["../../../src/ui/hooks/useTerminalSize.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,10 @@
1
1
  import type { ActivityPhase } from "./useAgentLoop.js";
2
- export declare function useTerminalTitle(phase: ActivityPhase, isRunning: boolean): void;
2
+ export interface TerminalTitleOptions {
3
+ phase: ActivityPhase;
4
+ isRunning: boolean;
5
+ userMessage?: string;
6
+ activeToolNames?: string[];
7
+ planMode?: boolean;
8
+ }
9
+ export declare function useTerminalTitle({ phase, isRunning, userMessage, activeToolNames, planMode, }: TerminalTitleOptions): void;
3
10
  //# sourceMappingURL=useTerminalTitle.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTerminalTitle.d.ts","sourceRoot":"","sources":["../../../src/ui/hooks/useTerminalTitle.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAqBvD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,GAAG,IAAI,CAqB/E"}
1
+ {"version":3,"file":"useTerminalTitle.d.ts","sourceRoot":"","sources":["../../../src/ui/hooks/useTerminalTitle.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAQvD,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,SAAS,EACT,WAAgB,EAChB,eAAoB,EACpB,QAAgB,GACjB,EAAE,oBAAoB,GAAG,IAAI,CAwC7B"}
@@ -1,40 +1,37 @@
1
- import { useEffect } from "react";
1
+ import { useEffect, useMemo, useRef } from "react";
2
2
  import { useStdout } from "ink";
3
3
  import { SPINNER_FRAMES, SPINNER_INTERVAL } from "../spinner-frames.js";
4
4
  import { useAnimationTick, deriveFrame } from "../components/AnimationContext.js";
5
- function getTitleText(phase, isRunning) {
6
- if (!isRunning)
7
- return "MR Agentix";
8
- switch (phase) {
9
- case "thinking":
10
- return "Thinking...";
11
- case "generating":
12
- return "Generating...";
13
- case "tools":
14
- return "Running tools...";
15
- case "waiting":
16
- return "Thinking...";
17
- default:
18
- return "MR Agentix";
19
- }
20
- }
21
- export function useTerminalTitle(phase, isRunning) {
5
+ import { PLANNING_PHRASES, selectPhrases, shuffleArray } from "../activity-phrases.js";
6
+ const PHRASE_INTERVAL = 3000;
7
+ export function useTerminalTitle({ phase, isRunning, userMessage = "", activeToolNames = [], planMode = false, }) {
22
8
  const { stdout } = useStdout();
23
9
  // Derive spinner frame from global animation tick — no independent timer
24
10
  const tick = useAnimationTick();
25
11
  const spinnerFrame = isRunning ? deriveFrame(tick, SPINNER_INTERVAL, SPINNER_FRAMES.length) : 0;
12
+ // Phrase rotation — mirrors ActivityIndicator logic
13
+ const toolNamesKey = activeToolNames.sort().join(",");
14
+ const phrases = useMemo(() => shuffleArray(planMode && phase === "waiting"
15
+ ? PLANNING_PHRASES
16
+ : selectPhrases(phase, userMessage, activeToolNames)), [phase, userMessage, toolNamesKey, planMode]);
17
+ const phraseIndex = Math.floor(deriveFrame(tick, PHRASE_INTERVAL, phrases.length * 1000) / 1000);
18
+ const phrase = phrases[phraseIndex] ?? phrases[0];
19
+ // Track previous title to avoid redundant writes
20
+ const prevTitleRef = useRef("");
26
21
  // Write terminal title
27
22
  useEffect(() => {
28
23
  if (!stdout)
29
24
  return;
30
- const text = getTitleText(phase, isRunning);
31
- const title = isRunning ? `${SPINNER_FRAMES[spinnerFrame]} ${text}` : text;
32
- stdout.write(`\x1b]0;${title}\x1b\\`);
33
- }, [stdout, phase, isRunning, spinnerFrame]);
25
+ const title = isRunning ? `${SPINNER_FRAMES[spinnerFrame]} ${phrase}...` : "MR Agentix Coder";
26
+ if (title !== prevTitleRef.current) {
27
+ prevTitleRef.current = title;
28
+ stdout.write(`\x1b]0;${title}\x1b\\`);
29
+ }
30
+ }, [stdout, phrase, isRunning, spinnerFrame]);
34
31
  // Reset title on unmount
35
32
  useEffect(() => {
36
33
  return () => {
37
- stdout?.write(`\x1b]0;MR Agentix\x1b\\`);
34
+ stdout?.write(`\x1b]0;MR Agentix Coder\x1b\\`);
38
35
  };
39
36
  }, [stdout]);
40
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"useTerminalTitle.js","sourceRoot":"","sources":["../../../src/ui/hooks/useTerminalTitle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAGhC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAElF,SAAS,YAAY,CAAC,KAAoB,EAAE,SAAkB;IAC5D,IAAI,CAAC,SAAS;QAAE,OAAO,YAAY,CAAC;IACpC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,UAAU;YACb,OAAO,aAAa,CAAC;QACvB,KAAK,YAAY;YACf,OAAO,eAAe,CAAC;QACzB,KAAK,OAAO;YACV,OAAO,kBAAkB,CAAC;QAC5B,KAAK,SAAS;YACZ,OAAO,aAAa,CAAC;QACvB;YACE,OAAO,YAAY,CAAC;IACxB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAoB,EAAE,SAAkB;IACvE,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAE/B,yEAAyE;IACzE,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAChC,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,gBAAgB,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEhG,uBAAuB;IACvB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3E,MAAM,CAAC,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC;IACxC,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;IAE7C,yBAAyB;IACzB,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE;YACV,MAAM,EAAE,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC3C,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"useTerminalTitle.js","sourceRoot":"","sources":["../../../src/ui/hooks/useTerminalTitle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AAGhC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAClF,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEvF,MAAM,eAAe,GAAG,IAAI,CAAC;AAU7B,MAAM,UAAU,gBAAgB,CAAC,EAC/B,KAAK,EACL,SAAS,EACT,WAAW,GAAG,EAAE,EAChB,eAAe,GAAG,EAAE,EACpB,QAAQ,GAAG,KAAK,GACK;IACrB,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAE/B,yEAAyE;IACzE,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAChC,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,gBAAgB,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEhG,oDAAoD;IACpD,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,OAAO,CACrB,GAAG,EAAE,CACH,YAAY,CACV,QAAQ,IAAI,KAAK,KAAK,SAAS;QAC7B,CAAC,CAAC,gBAAgB;QAClB,CAAC,CAAC,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,eAAe,CAAC,CACvD,EACH,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,CAAC,CAC7C,CAAC;IACF,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACjG,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;IAElD,iDAAiD;IACjD,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;IAEhC,uBAAuB;IACvB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,cAAc,CAAC,YAAY,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC;QAC9F,IAAI,KAAK,KAAK,YAAY,CAAC,OAAO,EAAE,CAAC;YACnC,YAAY,CAAC,OAAO,GAAG,KAAK,CAAC;YAC7B,MAAM,CAAC,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC;QACxC,CAAC;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;IAE9C,yBAAyB;IACzB,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE;YACV,MAAM,EAAE,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACjD,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;AACf,CAAC"}
@@ -1,3 +1,3 @@
1
- import type { Provider } from "@mragentix/ai";
1
+ import type { Provider } from "@kenkaiiii/gg-ai";
2
2
  export declare function renderLoginSelector(version?: string): Promise<Provider | null>;
3
3
  //# sourceMappingURL=login.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/ui/login.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AA8E9C,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAyD9E"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/ui/login.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAkFjD,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAyD9E"}
package/dist/ui/login.js CHANGED
@@ -1,5 +1,9 @@
1
1
  import chalk from "chalk";
2
- const LOGO_LINES = [" ╭●╮ ", " [◉‿◉]", " ╰┬╯ "];
2
+ const LOGO_LINES = [
3
+ " \u2584\u2580\u2580\u2580 \u2584\u2580\u2580\u2580",
4
+ " \u2588 \u2580\u2588 \u2588 \u2580\u2588",
5
+ " \u2580\u2584\u2584\u2580 \u2580\u2584\u2584\u2580",
6
+ ];
3
7
  const GRADIENT = [
4
8
  "#60a5fa",
5
9
  "#6da1f9",
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/ui/login.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,UAAU,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAClD,MAAM,QAAQ,GAAG;IACf,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;CACV,CAAC;AACF,MAAM,GAAG,GAAG,KAAK,CAAC;AAElB,MAAM,OAAO,GAAG,SAAS,CAAC;AAC1B,MAAM,IAAI,GAAG,SAAS,CAAC;AACvB,MAAM,QAAQ,GAAG,SAAS,CAAC;AAE3B,IAAI,QAAQ,GAAG,EAAE,CAAC;AAElB,MAAM,SAAS,GAA8D;IAC3E,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,4BAA4B,EAAE;IACrF,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,mCAAmC,EAAE;IACtF,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE;IACpE,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE;CACnE,CAAC;AAEF,SAAS,YAAY,CAAC,IAAY;IAChC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;QACtB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,MAAM,IAAI,EAAE,CAAC;QACf,CAAC;aAAM,CAAC;YACN,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;YAChE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YAC/B,QAAQ,EAAE,CAAC;QACb,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,YAAY,CAAC,aAAqB;IACzC,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CACR,YAAY,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC;QAC1B,GAAG;QACH,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC;QAC3C,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC;QAC7B,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAC1C,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/E,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC1F,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,QAAQ,GAAG,CAAC,KAAK,aAAa,CAAC;QACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACtC,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7C,KAAK,CAAC,IAAI,CACR,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAC3F,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,yCAAyC,CAAC,CAAC,CAAC;IAE3E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,QAAQ,GAAG,OAAO,IAAI,EAAE,CAAC;IACzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,aAAa,GAAG,CAAC,CAAC;QAEtB,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,mEAAmE;YACnE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,GAAG,YAAY,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,CAAC;QAC5E,CAAC,CAAC;QAEF,kCAAkC;QAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACjC,IAAI,EAAE,CAAC;QAEP,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAEvB,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAC7C,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACtB,6BAA6B;YAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACvC,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE;YAC/B,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;YAE7B,4BAA4B;YAC5B,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;gBACrC,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YAED,iBAAiB;YACjB,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACjC,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,KAAK,CAAC,CAAC;gBACxC,OAAO;YACT,CAAC;YAED,WAAW;YACX,IAAI,GAAG,KAAK,QAAQ,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;gBAC1C,aAAa,EAAE,CAAC;gBAChB,IAAI,EAAE,CAAC;YACT,CAAC;YAED,aAAa;YACb,IAAI,GAAG,KAAK,QAAQ,IAAI,aAAa,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7D,aAAa,EAAE,CAAC;gBAChB,IAAI,EAAE,CAAC;YACT,CAAC;QACH,CAAC,CAAC;QAEF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/ui/login.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plan-overlay.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-overlay.test.d.ts","sourceRoot":"","sources":["../../src/ui/plan-overlay.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,327 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import fs from "node:fs/promises";
3
+ import path from "node:path";
4
+ import os from "node:os";
5
+ async function loadPlanEntries(cwd) {
6
+ const plansDir = path.join(cwd, ".mragentix", "plans");
7
+ let files;
8
+ try {
9
+ files = await fs.readdir(plansDir);
10
+ }
11
+ catch {
12
+ return [];
13
+ }
14
+ const entries = [];
15
+ for (const file of files) {
16
+ if (!file.endsWith(".md"))
17
+ continue;
18
+ const filePath = path.join(plansDir, file);
19
+ try {
20
+ const stat = await fs.stat(filePath);
21
+ entries.push({
22
+ name: file.replace(/\.md$/, ""),
23
+ path: filePath,
24
+ modifiedMs: stat.mtimeMs,
25
+ });
26
+ }
27
+ catch {
28
+ entries.push({ name: file.replace(/\.md$/, ""), path: filePath, modifiedMs: 0 });
29
+ }
30
+ }
31
+ // Sort newest first
32
+ entries.sort((a, b) => b.modifiedMs - a.modifiedMs);
33
+ return entries;
34
+ }
35
+ function createAppState(overrides) {
36
+ return {
37
+ overlay: null,
38
+ planAutoExpand: false,
39
+ planMode: false,
40
+ pending: false,
41
+ doneStatus: null,
42
+ ...overrides,
43
+ };
44
+ }
45
+ function simulateOnDone(state, durationMs, toolsUsed) {
46
+ // Mirrors App.tsx line 1071
47
+ if (state.pending)
48
+ return;
49
+ state.doneStatus = { durationMs, toolsUsed, verb: "done" };
50
+ }
51
+ // ── Auto-expand helper (mirrors PlanOverlay.tsx lines 168-173) ──
52
+ function tryAutoExpand(autoExpandNewest, loaded, plans, alreadyExpanded) {
53
+ if (autoExpandNewest && loaded && plans.length > 0 && !alreadyExpanded) {
54
+ return { expanded: true, plan: plans[0] };
55
+ }
56
+ return { expanded: alreadyExpanded, plan: null };
57
+ }
58
+ // ── Index clamping (mirrors PlanOverlay.tsx lines 176-182) ──
59
+ function clampIndex(selectedIndex, plansLength) {
60
+ if (plansLength === 0)
61
+ return 0;
62
+ if (selectedIndex >= plansLength)
63
+ return plansLength - 1;
64
+ return selectedIndex;
65
+ }
66
+ // ── Tests ────────────────────────────────────────────────────
67
+ let tmpDir;
68
+ beforeEach(async () => {
69
+ tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "plan-overlay-test-"));
70
+ });
71
+ afterEach(async () => {
72
+ await fs.rm(tmpDir, { recursive: true, force: true });
73
+ });
74
+ // ── loadPlanEntries ──────────────────────────────────────────
75
+ describe("loadPlanEntries", () => {
76
+ it("returns empty array when .mragentix/plans/ does not exist", async () => {
77
+ const entries = await loadPlanEntries(tmpDir);
78
+ expect(entries).toEqual([]);
79
+ });
80
+ it("returns empty array when .mragentix/plans/ exists but is empty", async () => {
81
+ await fs.mkdir(path.join(tmpDir, ".mragentix", "plans"), { recursive: true });
82
+ const entries = await loadPlanEntries(tmpDir);
83
+ expect(entries).toEqual([]);
84
+ });
85
+ it("ignores non-.md files", async () => {
86
+ const plansDir = path.join(tmpDir, ".mragentix", "plans");
87
+ await fs.mkdir(plansDir, { recursive: true });
88
+ await fs.writeFile(path.join(plansDir, "notes.txt"), "not a plan");
89
+ await fs.writeFile(path.join(plansDir, "data.json"), "{}");
90
+ await fs.writeFile(path.join(plansDir, "real-plan.md"), "# Plan");
91
+ const entries = await loadPlanEntries(tmpDir);
92
+ expect(entries).toHaveLength(1);
93
+ expect(entries[0].name).toBe("real-plan");
94
+ });
95
+ it("loads multiple plans and strips .md extension", async () => {
96
+ const plansDir = path.join(tmpDir, ".mragentix", "plans");
97
+ await fs.mkdir(plansDir, { recursive: true });
98
+ await fs.writeFile(path.join(plansDir, "alpha.md"), "# Alpha");
99
+ await fs.writeFile(path.join(plansDir, "beta.md"), "# Beta");
100
+ await fs.writeFile(path.join(plansDir, "gamma.md"), "# Gamma");
101
+ const entries = await loadPlanEntries(tmpDir);
102
+ expect(entries).toHaveLength(3);
103
+ const names = entries.map((e) => e.name);
104
+ expect(names).toContain("alpha");
105
+ expect(names).toContain("beta");
106
+ expect(names).toContain("gamma");
107
+ });
108
+ it("sorts plans by modification time (newest first)", async () => {
109
+ const plansDir = path.join(tmpDir, ".mragentix", "plans");
110
+ await fs.mkdir(plansDir, { recursive: true });
111
+ const oldPath = path.join(plansDir, "old.md");
112
+ const newPath = path.join(plansDir, "new.md");
113
+ await fs.writeFile(oldPath, "# Old");
114
+ const pastTime = new Date(Date.now() - 60_000);
115
+ await fs.utimes(oldPath, pastTime, pastTime);
116
+ await fs.writeFile(newPath, "# New");
117
+ const entries = await loadPlanEntries(tmpDir);
118
+ expect(entries).toHaveLength(2);
119
+ expect(entries[0].name).toBe("new");
120
+ expect(entries[1].name).toBe("old");
121
+ expect(entries[0].modifiedMs).toBeGreaterThan(entries[1].modifiedMs);
122
+ });
123
+ it("sets modifiedMs to 0 when stat fails (e.g., broken symlink)", async () => {
124
+ const plansDir = path.join(tmpDir, ".mragentix", "plans");
125
+ await fs.mkdir(plansDir, { recursive: true });
126
+ const brokenLink = path.join(plansDir, "broken.md");
127
+ await fs.symlink("/nonexistent/path/file.md", brokenLink);
128
+ const entries = await loadPlanEntries(tmpDir);
129
+ expect(entries).toHaveLength(1);
130
+ expect(entries[0].name).toBe("broken");
131
+ expect(entries[0].modifiedMs).toBe(0);
132
+ });
133
+ it("includes correct absolute paths", async () => {
134
+ const plansDir = path.join(tmpDir, ".mragentix", "plans");
135
+ await fs.mkdir(plansDir, { recursive: true });
136
+ await fs.writeFile(path.join(plansDir, "my-plan.md"), "# Plan");
137
+ const entries = await loadPlanEntries(tmpDir);
138
+ expect(entries[0].path).toBe(path.join(plansDir, "my-plan.md"));
139
+ });
140
+ });
141
+ // ── Plan overlay pending guard ──────────────────────────────
142
+ describe("planOverlayPending guard (onDone suppression)", () => {
143
+ it("returns done status when overlay is NOT pending", () => {
144
+ const state = createAppState({ pending: false });
145
+ simulateOnDone(state, 1500, ["read", "write"]);
146
+ expect(state.doneStatus).toEqual({
147
+ durationMs: 1500,
148
+ toolsUsed: ["read", "write"],
149
+ verb: "done",
150
+ });
151
+ });
152
+ it("returns null (suppresses done) when overlay IS pending", () => {
153
+ const state = createAppState({ pending: true });
154
+ simulateOnDone(state, 1500, ["read", "write"]);
155
+ expect(state.doneStatus).toBeNull();
156
+ });
157
+ it("suppresses done status even with empty tool list", () => {
158
+ const state = createAppState({ pending: true });
159
+ simulateOnDone(state, 500, []);
160
+ expect(state.doneStatus).toBeNull();
161
+ });
162
+ });
163
+ // ── Plan overlay pending race condition simulation ──────────
164
+ describe("planOverlayPending race condition", () => {
165
+ it("onDone fires BEFORE setTimeout — done status suppressed", () => {
166
+ // Step 1: exit_plan tool finishes → pending = true
167
+ const state = createAppState({ pending: true });
168
+ // Step 2: onDone fires immediately (agent loop finishes)
169
+ simulateOnDone(state, 2000, ["write"]);
170
+ expect(state.doneStatus).toBeNull(); // correctly suppressed
171
+ // Step 3: setTimeout fires (300ms later)
172
+ state.overlay = "plan";
173
+ state.pending = false;
174
+ expect(state.overlay).toBe("plan");
175
+ expect(state.pending).toBe(false);
176
+ });
177
+ it("onDone fires AFTER setTimeout — done status shows (edge case)", () => {
178
+ // Step 1: exit_plan → pending = true
179
+ const state = createAppState({ pending: true });
180
+ // Step 2: setTimeout fires first
181
+ state.overlay = "plan";
182
+ state.pending = false;
183
+ // Step 3: onDone fires after timeout — NOT suppressed
184
+ simulateOnDone(state, 2000, ["write"]);
185
+ expect(state.doneStatus).not.toBeNull();
186
+ // This is the race condition: done status leaks through while overlay is open
187
+ expect(state.overlay).toBe("plan");
188
+ expect(state.doneStatus).toEqual({ durationMs: 2000, toolsUsed: ["write"], verb: "done" });
189
+ });
190
+ it("multiple rapid plan mode toggles don't cause inconsistent state", () => {
191
+ const state = createAppState();
192
+ const stateLog = [];
193
+ for (let i = 0; i < 10; i++) {
194
+ state.planMode = !state.planMode;
195
+ stateLog.push(state.planMode);
196
+ }
197
+ // After even number of toggles, should be back to false
198
+ expect(state.planMode).toBe(false);
199
+ expect(stateLog).toHaveLength(10);
200
+ expect(stateLog.filter(Boolean)).toHaveLength(5);
201
+ expect(stateLog.filter((v) => !v)).toHaveLength(5);
202
+ });
203
+ });
204
+ // ── Auto-expand logic ──────────────────────────────────────
205
+ describe("auto-expand newest plan", () => {
206
+ const testPlan = { name: "test", path: "/tmp/test.md", modifiedMs: Date.now() };
207
+ it("auto-expands when autoExpandNewest=true, loaded=true, plans exist, not yet expanded", () => {
208
+ const result = tryAutoExpand(true, true, [testPlan], false);
209
+ expect(result.expanded).toBe(true);
210
+ expect(result.plan).toBe(testPlan);
211
+ });
212
+ it("does NOT auto-expand when already expanded once", () => {
213
+ const result = tryAutoExpand(true, true, [testPlan], true);
214
+ expect(result.plan).toBeNull();
215
+ });
216
+ it("does NOT auto-expand when plans array is empty", () => {
217
+ const result = tryAutoExpand(true, true, [], false);
218
+ expect(result.expanded).toBe(false);
219
+ expect(result.plan).toBeNull();
220
+ });
221
+ it("does NOT auto-expand when autoExpandNewest is false", () => {
222
+ const result = tryAutoExpand(false, true, [testPlan], false);
223
+ expect(result.expanded).toBe(false);
224
+ expect(result.plan).toBeNull();
225
+ });
226
+ it("does NOT auto-expand when not yet loaded", () => {
227
+ const result = tryAutoExpand(true, false, [testPlan], false);
228
+ expect(result.expanded).toBe(false);
229
+ expect(result.plan).toBeNull();
230
+ });
231
+ });
232
+ // ── Plan file readability ──────────────────────────────────
233
+ describe("plan file reading edge cases", () => {
234
+ it("handles plan file that exists during listing but is deleted before reading", async () => {
235
+ const plansDir = path.join(tmpDir, ".mragentix", "plans");
236
+ await fs.mkdir(plansDir, { recursive: true });
237
+ const planPath = path.join(plansDir, "ephemeral.md");
238
+ await fs.writeFile(planPath, "# Short-lived plan");
239
+ const entries = await loadPlanEntries(tmpDir);
240
+ expect(entries).toHaveLength(1);
241
+ await fs.unlink(planPath);
242
+ let content;
243
+ try {
244
+ content = await fs.readFile(planPath, "utf-8");
245
+ }
246
+ catch {
247
+ content = "(could not read plan)";
248
+ }
249
+ expect(content).toBe("(could not read plan)");
250
+ });
251
+ it("handles plan file with empty content", async () => {
252
+ const plansDir = path.join(tmpDir, ".mragentix", "plans");
253
+ await fs.mkdir(plansDir, { recursive: true });
254
+ await fs.writeFile(path.join(plansDir, "empty.md"), "");
255
+ const entries = await loadPlanEntries(tmpDir);
256
+ expect(entries).toHaveLength(1);
257
+ const content = await fs.readFile(entries[0].path, "utf-8");
258
+ expect(content).toBe("");
259
+ });
260
+ it("handles plan file with very large content", async () => {
261
+ const plansDir = path.join(tmpDir, ".mragentix", "plans");
262
+ await fs.mkdir(plansDir, { recursive: true });
263
+ const largeContent = "# Plan\n\n" + "Step ".repeat(100_000);
264
+ await fs.writeFile(path.join(plansDir, "large.md"), largeContent);
265
+ const entries = await loadPlanEntries(tmpDir);
266
+ expect(entries).toHaveLength(1);
267
+ const content = await fs.readFile(entries[0].path, "utf-8");
268
+ expect(content.length).toBeGreaterThan(400_000);
269
+ });
270
+ });
271
+ // ── Overlay state machine ──────────────────────────────────
272
+ describe("overlay state transitions", () => {
273
+ it("opening plan overlay replaces any existing overlay", () => {
274
+ const state = createAppState({ overlay: "tasks" });
275
+ state.overlay = "plan";
276
+ expect(state.overlay).toBe("plan");
277
+ });
278
+ it("closing plan overlay returns to null", () => {
279
+ const state = createAppState({ overlay: "plan" });
280
+ state.overlay = null;
281
+ expect(state.overlay).toBeNull();
282
+ });
283
+ it("approving a plan closes the overlay and resets autoExpand", () => {
284
+ const state = createAppState({ overlay: "plan", planAutoExpand: true });
285
+ // onApprove handler
286
+ state.planAutoExpand = false;
287
+ state.overlay = null;
288
+ expect(state.overlay).toBeNull();
289
+ expect(state.planAutoExpand).toBe(false);
290
+ });
291
+ it("plan overlay from exit_plan uses autoExpand", () => {
292
+ const state = createAppState();
293
+ // Simulates the setTimeout in onExitPlan
294
+ state.planAutoExpand = true;
295
+ state.overlay = "plan";
296
+ expect(state.overlay).toBe("plan");
297
+ expect(state.planAutoExpand).toBe(true);
298
+ });
299
+ it("/plans command does NOT set autoExpand", () => {
300
+ const state = createAppState({ planAutoExpand: true });
301
+ // Simulates /plans handler
302
+ state.planAutoExpand = false;
303
+ state.overlay = "plan";
304
+ expect(state.overlay).toBe("plan");
305
+ expect(state.planAutoExpand).toBe(false);
306
+ });
307
+ });
308
+ // ── Index clamping ──────────────────────────────────────────
309
+ describe("selectedIndex clamping", () => {
310
+ it("returns 0 when plans list is empty", () => {
311
+ expect(clampIndex(5, 0)).toBe(0);
312
+ });
313
+ it("returns last index when selectedIndex exceeds plans length", () => {
314
+ expect(clampIndex(10, 3)).toBe(2);
315
+ });
316
+ it("returns selectedIndex unchanged when within bounds", () => {
317
+ expect(clampIndex(1, 5)).toBe(1);
318
+ });
319
+ it("handles edge case: selectedIndex equals plans length", () => {
320
+ expect(clampIndex(3, 3)).toBe(2);
321
+ });
322
+ it("handles single plan", () => {
323
+ expect(clampIndex(0, 1)).toBe(0);
324
+ expect(clampIndex(5, 1)).toBe(0);
325
+ });
326
+ });
327
+ //# sourceMappingURL=plan-overlay.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-overlay.test.js","sourceRoot":"","sources":["../../src/ui/plan-overlay.test.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import type { Message, Provider, ThinkingLevel } from "@mragentix/ai";
2
- import type { AgentTool } from "@mragentix/agent";
1
+ import type { Message, Provider, ThinkingLevel } from "@kenkaiiii/gg-ai";
2
+ import type { AgentTool } from "@kenkaiiii/gg-agent";
3
3
  import type { ProcessManager } from "../core/process-manager.js";
4
4
  import type { MCPClientManager } from "../core/mcp/index.js";
5
5
  import type { AuthStorage } from "../core/auth-storage.js";