@kenkaiiii/ggcoder 4.2.72 → 4.2.74

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 (121) hide show
  1. package/dist/cli.js +174 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/config.d.ts +1 -0
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +1 -0
  6. package/dist/config.js.map +1 -1
  7. package/dist/core/settings-manager.d.ts +1 -0
  8. package/dist/core/settings-manager.d.ts.map +1 -1
  9. package/dist/core/settings-manager.js +2 -0
  10. package/dist/core/settings-manager.js.map +1 -1
  11. package/dist/core/slash-commands.d.ts.map +1 -1
  12. package/dist/core/slash-commands.js +14 -0
  13. package/dist/core/slash-commands.js.map +1 -1
  14. package/dist/modes/agent-home-mode.d.ts +21 -0
  15. package/dist/modes/agent-home-mode.d.ts.map +1 -0
  16. package/dist/modes/agent-home-mode.js +553 -0
  17. package/dist/modes/agent-home-mode.js.map +1 -0
  18. package/dist/ui/App.d.ts.map +1 -1
  19. package/dist/ui/App.js +25 -3
  20. package/dist/ui/App.js.map +1 -1
  21. package/dist/ui/buddy/Buddy.d.ts +15 -0
  22. package/dist/ui/buddy/Buddy.d.ts.map +1 -0
  23. package/dist/ui/buddy/Buddy.js +118 -0
  24. package/dist/ui/buddy/Buddy.js.map +1 -0
  25. package/dist/ui/buddy/gacha.d.ts +8 -0
  26. package/dist/ui/buddy/gacha.d.ts.map +1 -0
  27. package/dist/ui/buddy/gacha.js +94 -0
  28. package/dist/ui/buddy/gacha.js.map +1 -0
  29. package/dist/ui/buddy/species.d.ts +52 -0
  30. package/dist/ui/buddy/species.d.ts.map +1 -0
  31. package/dist/ui/buddy/species.js +257 -0
  32. package/dist/ui/buddy/species.js.map +1 -0
  33. package/dist/ui/components/ActivityIndicator.d.ts +6 -1
  34. package/dist/ui/components/ActivityIndicator.d.ts.map +1 -1
  35. package/dist/ui/components/ActivityIndicator.js +52 -8
  36. package/dist/ui/components/ActivityIndicator.js.map +1 -1
  37. package/dist/ui/components/AnimationContext.d.ts +5 -0
  38. package/dist/ui/components/AnimationContext.d.ts.map +1 -1
  39. package/dist/ui/components/AnimationContext.js +8 -1
  40. package/dist/ui/components/AnimationContext.js.map +1 -1
  41. package/dist/ui/components/AssistantMessage.d.ts.map +1 -1
  42. package/dist/ui/components/AssistantMessage.js +3 -2
  43. package/dist/ui/components/AssistantMessage.js.map +1 -1
  44. package/dist/ui/components/BackgroundTasksBar.js +2 -2
  45. package/dist/ui/components/BackgroundTasksBar.js.map +1 -1
  46. package/dist/ui/components/Footer.d.ts +3 -1
  47. package/dist/ui/components/Footer.d.ts.map +1 -1
  48. package/dist/ui/components/Footer.js +23 -48
  49. package/dist/ui/components/Footer.js.map +1 -1
  50. package/dist/ui/components/Markdown.d.ts +4 -0
  51. package/dist/ui/components/Markdown.d.ts.map +1 -1
  52. package/dist/ui/components/Markdown.js +109 -6
  53. package/dist/ui/components/Markdown.js.map +1 -1
  54. package/dist/ui/components/MessageResponse.d.ts +25 -0
  55. package/dist/ui/components/MessageResponse.d.ts.map +1 -0
  56. package/dist/ui/components/MessageResponse.js +42 -0
  57. package/dist/ui/components/MessageResponse.js.map +1 -0
  58. package/dist/ui/components/NoSelect.d.ts +20 -0
  59. package/dist/ui/components/NoSelect.d.ts.map +1 -0
  60. package/dist/ui/components/NoSelect.js +14 -0
  61. package/dist/ui/components/NoSelect.js.map +1 -0
  62. package/dist/ui/components/Ratchet.d.ts +20 -0
  63. package/dist/ui/components/Ratchet.d.ts.map +1 -0
  64. package/dist/ui/components/Ratchet.js +30 -0
  65. package/dist/ui/components/Ratchet.js.map +1 -0
  66. package/dist/ui/components/ServerToolExecution.d.ts.map +1 -1
  67. package/dist/ui/components/ServerToolExecution.js +5 -6
  68. package/dist/ui/components/ServerToolExecution.js.map +1 -1
  69. package/dist/ui/components/Spinner.d.ts +8 -2
  70. package/dist/ui/components/Spinner.d.ts.map +1 -1
  71. package/dist/ui/components/Spinner.js +51 -5
  72. package/dist/ui/components/Spinner.js.map +1 -1
  73. package/dist/ui/components/StreamingArea.d.ts.map +1 -1
  74. package/dist/ui/components/StreamingArea.js +4 -3
  75. package/dist/ui/components/StreamingArea.js.map +1 -1
  76. package/dist/ui/components/SubAgentPanel.d.ts.map +1 -1
  77. package/dist/ui/components/SubAgentPanel.js +4 -3
  78. package/dist/ui/components/SubAgentPanel.js.map +1 -1
  79. package/dist/ui/components/ToolExecution.d.ts.map +1 -1
  80. package/dist/ui/components/ToolExecution.js +38 -12
  81. package/dist/ui/components/ToolExecution.js.map +1 -1
  82. package/dist/ui/components/ToolGroupExecution.d.ts.map +1 -1
  83. package/dist/ui/components/ToolGroupExecution.js +21 -17
  84. package/dist/ui/components/ToolGroupExecution.js.map +1 -1
  85. package/dist/ui/components/ToolUseLoader.d.ts +19 -0
  86. package/dist/ui/components/ToolUseLoader.d.ts.map +1 -0
  87. package/dist/ui/components/ToolUseLoader.js +42 -0
  88. package/dist/ui/components/ToolUseLoader.js.map +1 -0
  89. package/dist/ui/constants/figures.d.ts +30 -0
  90. package/dist/ui/constants/figures.d.ts.map +1 -0
  91. package/dist/ui/constants/figures.js +41 -0
  92. package/dist/ui/constants/figures.js.map +1 -0
  93. package/dist/ui/hooks/useAgentLoop.d.ts +8 -0
  94. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
  95. package/dist/ui/hooks/useAgentLoop.js +16 -0
  96. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  97. package/dist/ui/hooks/useBlink.d.ts +11 -0
  98. package/dist/ui/hooks/useBlink.d.ts.map +1 -0
  99. package/dist/ui/hooks/useBlink.js +19 -0
  100. package/dist/ui/hooks/useBlink.js.map +1 -0
  101. package/dist/ui/hooks/useMinDisplayTime.d.ts +11 -0
  102. package/dist/ui/hooks/useMinDisplayTime.d.ts.map +1 -0
  103. package/dist/ui/hooks/useMinDisplayTime.js +34 -0
  104. package/dist/ui/hooks/useMinDisplayTime.js.map +1 -0
  105. package/dist/ui/spinner-frames.d.ts +1 -0
  106. package/dist/ui/spinner-frames.d.ts.map +1 -1
  107. package/dist/ui/spinner-frames.js +15 -5
  108. package/dist/ui/spinner-frames.js.map +1 -1
  109. package/dist/ui/theme/dark.json +2 -1
  110. package/dist/ui/theme/light.json +2 -1
  111. package/dist/ui/theme/theme.d.ts +1 -0
  112. package/dist/ui/theme/theme.d.ts.map +1 -1
  113. package/dist/ui/utils/markdown-cache.d.ts +12 -0
  114. package/dist/ui/utils/markdown-cache.d.ts.map +1 -0
  115. package/dist/ui/utils/markdown-cache.js +43 -0
  116. package/dist/ui/utils/markdown-cache.js.map +1 -0
  117. package/dist/ui/utils/word-diff.d.ts +11 -0
  118. package/dist/ui/utils/word-diff.d.ts.map +1 -0
  119. package/dist/ui/utils/word-diff.js +23 -0
  120. package/dist/ui/utils/word-diff.js.map +1 -0
  121. package/package.json +4 -3
@@ -0,0 +1,34 @@
1
+ import { useState, useRef, useEffect } from "react";
2
+ /**
3
+ * Hold a value for at least `minMs` milliseconds before switching to the
4
+ * next value. Prevents rapid visual flicker when values change faster
5
+ * than a human can read (e.g. collapsed tool group hints).
6
+ *
7
+ * If the value changes again before the timer fires the timer restarts
8
+ * with the newest value, so the displayed value is never stale by more
9
+ * than one transition.
10
+ */
11
+ export function useMinDisplayTime(value, minMs = 700) {
12
+ const [displayed, setDisplayed] = useState(value);
13
+ const timerRef = useRef(null);
14
+ const latestRef = useRef(value);
15
+ latestRef.current = value;
16
+ useEffect(() => {
17
+ // First render — sync immediately
18
+ if (displayed === value)
19
+ return;
20
+ // Clear any pending timer
21
+ if (timerRef.current)
22
+ clearTimeout(timerRef.current);
23
+ timerRef.current = setTimeout(() => {
24
+ setDisplayed(latestRef.current);
25
+ timerRef.current = null;
26
+ }, minMs);
27
+ return () => {
28
+ if (timerRef.current)
29
+ clearTimeout(timerRef.current);
30
+ };
31
+ }, [value, minMs, displayed]);
32
+ return displayed;
33
+ }
34
+ //# sourceMappingURL=useMinDisplayTime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMinDisplayTime.js","sourceRoot":"","sources":["../../../src/ui/hooks/useMinDisplayTime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEpD;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAI,KAAQ,EAAE,KAAK,GAAG,GAAG;IACxD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,CAAuC,IAAI,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAEhC,SAAS,CAAC,OAAO,GAAG,KAAK,CAAC;IAE1B,SAAS,CAAC,GAAG,EAAE;QACb,kCAAkC;QAClC,IAAI,SAAS,KAAK,KAAK;YAAE,OAAO;QAEhC,0BAA0B;QAC1B,IAAI,QAAQ,CAAC,OAAO;YAAE,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAErD,QAAQ,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YACjC,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAChC,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC;QAC1B,CAAC,EAAE,KAAK,CAAC,CAAC;QAEV,OAAO,GAAG,EAAE;YACV,IAAI,QAAQ,CAAC,OAAO;gBAAE,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACvD,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;IAE9B,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export declare const SPINNER_FRAMES: string[];
2
2
  export declare const SPINNER_INTERVAL = 120;
3
+ export declare const REDUCED_MOTION_DOT = "\u25CF";
3
4
  //# sourceMappingURL=spinner-frames.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spinner-frames.d.ts","sourceRoot":"","sources":["../../src/ui/spinner-frames.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,UAGkC,CAAC;AAE9D,eAAO,MAAM,gBAAgB,MAAM,CAAC"}
1
+ {"version":3,"file":"spinner-frames.d.ts","sourceRoot":"","sources":["../../src/ui/spinner-frames.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,cAAc,UAAiC,CAAC;AAE7D,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAGpC,eAAO,MAAM,kBAAkB,WAAW,CAAC"}
@@ -1,7 +1,17 @@
1
- // Sparkle character set — gives a more distinctive, playful feel
2
- // compared to the standard braille dots every other CLI uses.
3
- export const SPINNER_FRAMES = process.platform === "darwin"
4
- ? ["\u00B7", "\u2726", "\u2733", "\u2217", "\u273B", "\u273D"]
5
- : ["\u00B7", "\u2726", "*", "\u2217", "\u273B", "\u273D"];
1
+ // Sparkle character set — ping-pong cycle (forward then reverse)
2
+ // for a distinctive, playful feel. Ghostty gets a variant to avoid
3
+ // offset rendering of ✽.
4
+ function getSpinnerChars() {
5
+ if (process.env.TERM === "xterm-ghostty") {
6
+ return ["\u00B7", "\u2722", "\u2733", "\u2736", "\u273B", "*"];
7
+ }
8
+ return process.platform === "darwin"
9
+ ? ["\u00B7", "\u2722", "\u2733", "\u2736", "\u273B", "\u273D"]
10
+ : ["\u00B7", "\u2722", "*", "\u2736", "\u273B", "\u273D"];
11
+ }
12
+ const chars = getSpinnerChars();
13
+ export const SPINNER_FRAMES = [...chars, ...chars.reverse()];
6
14
  export const SPINNER_INTERVAL = 120;
15
+ // Reduced-motion: static filled circle with slow dim/undim cycle
16
+ export const REDUCED_MOTION_DOT = "\u25CF"; // ●
7
17
  //# sourceMappingURL=spinner-frames.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"spinner-frames.js","sourceRoot":"","sources":["../../src/ui/spinner-frames.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,8DAA8D;AAC9D,MAAM,CAAC,MAAM,cAAc,GACzB,OAAO,CAAC,QAAQ,KAAK,QAAQ;IAC3B,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;IAC9D,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAE9D,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC"}
1
+ {"version":3,"file":"spinner-frames.js","sourceRoot":"","sources":["../../src/ui/spinner-frames.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,mEAAmE;AACnE,yBAAyB;AACzB,SAAS,eAAe;IACtB,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QACzC,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAClC,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;QAC9D,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;AAChC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;AAE7D,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAEpC,iEAAiE;AACjE,MAAM,CAAC,MAAM,kBAAkB,GAAG,QAAQ,CAAC,CAAC,IAAI"}
@@ -22,5 +22,6 @@
22
22
  "footerText": "#6b7280",
23
23
  "commandColor": "#818cf8",
24
24
  "planPrimary": "#f59e0b",
25
- "planBorder": "#92400e"
25
+ "planBorder": "#92400e",
26
+ "subtle": "#4b5563"
26
27
  }
@@ -22,5 +22,6 @@
22
22
  "footerText": "#9ca3af",
23
23
  "commandColor": "#4f46e5",
24
24
  "planPrimary": "#d97706",
25
- "planBorder": "#b45309"
25
+ "planBorder": "#b45309",
26
+ "subtle": "#d1d5db"
26
27
  }
@@ -26,6 +26,7 @@ export declare const ThemeContext: import("react").Context<{
26
26
  commandColor: string;
27
27
  planPrimary: string;
28
28
  planBorder: string;
29
+ subtle: string;
29
30
  }>;
30
31
  export declare function useTheme(): Theme;
31
32
  //# sourceMappingURL=theme.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../../src/ui/theme/theme.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,aAAa,CAAuB;AAG1D,MAAM,MAAM,KAAK,GAAG,OAAO,SAAS,CAAC;AAErC,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,CAEvD;AAED,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;EAAkC,CAAC;AAE5D,wBAAgB,QAAQ,IAAI,KAAK,CAEhC"}
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../../src/ui/theme/theme.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,aAAa,CAAuB;AAG1D,MAAM,MAAM,KAAK,GAAG,OAAO,SAAS,CAAC;AAErC,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,CAEvD;AAED,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;EAAkC,CAAC;AAE5D,wBAAgB,QAAQ,IAAI,KAAK,CAEhC"}
@@ -0,0 +1,12 @@
1
+ import type { Token } from "marked";
2
+ /** Simple LRU cache for parsed markdown tokens. */
3
+ declare class MarkdownLRUCache {
4
+ private cache;
5
+ get(body: string): Token[] | undefined;
6
+ set(body: string, tokens: Token[]): void;
7
+ private hash;
8
+ }
9
+ export declare const markdownTokenCache: MarkdownLRUCache;
10
+ export declare function containsMarkdownSyntax(text: string): boolean;
11
+ export {};
12
+ //# sourceMappingURL=markdown-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-cache.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/markdown-cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAIpC,mDAAmD;AACnD,cAAM,gBAAgB;IACpB,OAAO,CAAC,KAAK,CAA8B;IAE3C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,SAAS;IAUtC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;IAYxC,OAAO,CAAC,IAAI;CAGb;AAED,eAAO,MAAM,kBAAkB,kBAAyB,CAAC;AASzD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAI5D"}
@@ -0,0 +1,43 @@
1
+ import { createHash } from "node:crypto";
2
+ const MAX_SIZE = 500;
3
+ /** Simple LRU cache for parsed markdown tokens. */
4
+ class MarkdownLRUCache {
5
+ cache = new Map();
6
+ get(body) {
7
+ const key = this.hash(body);
8
+ const entry = this.cache.get(key);
9
+ if (!entry)
10
+ return undefined;
11
+ // Move to end (most recently used)
12
+ this.cache.delete(key);
13
+ this.cache.set(key, entry);
14
+ return entry;
15
+ }
16
+ set(body, tokens) {
17
+ const key = this.hash(body);
18
+ // Delete first to reset insertion order
19
+ this.cache.delete(key);
20
+ this.cache.set(key, tokens);
21
+ // Evict oldest if over capacity
22
+ if (this.cache.size > MAX_SIZE) {
23
+ const oldest = this.cache.keys().next().value;
24
+ this.cache.delete(oldest);
25
+ }
26
+ }
27
+ hash(body) {
28
+ return createHash("sha256").update(body).digest("hex");
29
+ }
30
+ }
31
+ export const markdownTokenCache = new MarkdownLRUCache();
32
+ /**
33
+ * Check whether text contains markdown syntax worth parsing.
34
+ * If it doesn't, the caller can skip marked.lexer() entirely.
35
+ * Matches Claude Code's MD_SYNTAX_RE patterns.
36
+ */
37
+ const MARKDOWN_SYNTAX_RE = /[#*`|[>\-_~]|\n\n|^\d+\. |\n\d+\. /m;
38
+ export function containsMarkdownSyntax(text) {
39
+ // Only check the first 500 chars for performance
40
+ const sample = text.length > 500 ? text.slice(0, 500) : text;
41
+ return MARKDOWN_SYNTAX_RE.test(sample);
42
+ }
43
+ //# sourceMappingURL=markdown-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-cache.js","sourceRoot":"","sources":["../../../src/ui/utils/markdown-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,QAAQ,GAAG,GAAG,CAAC;AAErB,mDAAmD;AACnD,MAAM,gBAAgB;IACZ,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;IAE3C,GAAG,CAAC,IAAY;QACd,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC7B,mCAAmC;QACnC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,GAAG,CAAC,IAAY,EAAE,MAAe;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,wCAAwC;QACxC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC5B,gCAAgC;QAChC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,QAAQ,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAC;YAC/C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAEO,IAAI,CAAC,IAAY;QACvB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC;CACF;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAEzD;;;;GAIG;AACH,MAAM,kBAAkB,GAAG,qCAAqC,CAAC;AAEjE,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,iDAAiD;IACjD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7D,OAAO,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface WordSegment {
2
+ text: string;
3
+ type: "added" | "removed" | "unchanged";
4
+ }
5
+ /**
6
+ * Compute word-level diff between two strings.
7
+ * Uses diffWordsWithSpace (not diffWords) so that whitespace/indentation
8
+ * changes are visible — critical for code where indentation is meaningful.
9
+ */
10
+ export declare function computeWordDiff(oldLine: string, newLine: string): WordSegment[];
11
+ //# sourceMappingURL=word-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"word-diff.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/word-diff.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,WAAW,CAAC;CACzC;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAe/E"}
@@ -0,0 +1,23 @@
1
+ import { diffWordsWithSpace } from "diff";
2
+ /**
3
+ * Compute word-level diff between two strings.
4
+ * Uses diffWordsWithSpace (not diffWords) so that whitespace/indentation
5
+ * changes are visible — critical for code where indentation is meaningful.
6
+ */
7
+ export function computeWordDiff(oldLine, newLine) {
8
+ const changes = diffWordsWithSpace(oldLine, newLine);
9
+ const segments = [];
10
+ for (const change of changes) {
11
+ if (change.added) {
12
+ segments.push({ text: change.value, type: "added" });
13
+ }
14
+ else if (change.removed) {
15
+ segments.push({ text: change.value, type: "removed" });
16
+ }
17
+ else {
18
+ segments.push({ text: change.value, type: "unchanged" });
19
+ }
20
+ }
21
+ return segments;
22
+ }
23
+ //# sourceMappingURL=word-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"word-diff.js","sourceRoot":"","sources":["../../../src/ui/utils/word-diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,MAAM,CAAC;AAO1C;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,OAAe;IAC9D,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAkB,EAAE,CAAC;IAEnC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACvD,CAAC;aAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kenkaiiii/ggcoder",
3
- "version": "4.2.72",
3
+ "version": "4.2.74",
4
4
  "type": "module",
5
5
  "description": "CLI coding agent with OAuth authentication for Anthropic and OpenAI",
6
6
  "license": "MIT",
@@ -37,9 +37,10 @@
37
37
  "sharp": "^0.34.5",
38
38
  "string-width": "^8.2.0",
39
39
  "wrap-ansi": "^10.0.0",
40
+ "@kenkaiiii/agent-home-sdk": "^0.3.8",
40
41
  "zod": "^4.3.6",
41
- "@kenkaiiii/gg-agent": "4.2.72",
42
- "@kenkaiiii/gg-ai": "4.2.72"
42
+ "@kenkaiiii/gg-ai": "4.2.74",
43
+ "@kenkaiiii/gg-agent": "4.2.74"
43
44
  },
44
45
  "devDependencies": {
45
46
  "@types/node": "^25.5.0",