@kenkaiiii/ggcoder 5.23.2 → 5.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/dist/app-sidecar.js +32 -0
  2. package/dist/app-sidecar.js.map +1 -1
  3. package/dist/chat-agents/general.test.js +6 -3
  4. package/dist/chat-agents/general.test.js.map +1 -1
  5. package/dist/chat-agents/specialists.test.js +3 -2
  6. package/dist/chat-agents/specialists.test.js.map +1 -1
  7. package/dist/core/agent-session-add-dir.test.d.ts +2 -0
  8. package/dist/core/agent-session-add-dir.test.d.ts.map +1 -0
  9. package/dist/core/agent-session-add-dir.test.js +94 -0
  10. package/dist/core/agent-session-add-dir.test.js.map +1 -0
  11. package/dist/core/agent-session-compaction.test.js +4 -7
  12. package/dist/core/agent-session-compaction.test.js.map +1 -1
  13. package/dist/core/agent-session-marker-anchors.test.js +4 -7
  14. package/dist/core/agent-session-marker-anchors.test.js.map +1 -1
  15. package/dist/core/agent-session-memory-tail.test.js +4 -7
  16. package/dist/core/agent-session-memory-tail.test.js.map +1 -1
  17. package/dist/core/agent-session-queue.test.js +4 -7
  18. package/dist/core/agent-session-queue.test.js.map +1 -1
  19. package/dist/core/agent-session.d.ts +21 -0
  20. package/dist/core/agent-session.d.ts.map +1 -1
  21. package/dist/core/agent-session.js +62 -4
  22. package/dist/core/agent-session.js.map +1 -1
  23. package/dist/core/encode-cwd.d.ts +17 -0
  24. package/dist/core/encode-cwd.d.ts.map +1 -1
  25. package/dist/core/encode-cwd.js +20 -7
  26. package/dist/core/encode-cwd.js.map +1 -1
  27. package/dist/core/encode-cwd.test.js +20 -1
  28. package/dist/core/encode-cwd.test.js.map +1 -1
  29. package/dist/core/ideal-review.d.ts.map +1 -1
  30. package/dist/core/ideal-review.js +6 -1
  31. package/dist/core/ideal-review.js.map +1 -1
  32. package/dist/core/ideal-review.test.js +7 -2
  33. package/dist/core/ideal-review.test.js.map +1 -1
  34. package/dist/core/lsp/client.d.ts +50 -0
  35. package/dist/core/lsp/client.d.ts.map +1 -1
  36. package/dist/core/lsp/client.js +158 -13
  37. package/dist/core/lsp/client.js.map +1 -1
  38. package/dist/core/lsp/jsonrpc.d.ts +38 -1
  39. package/dist/core/lsp/jsonrpc.d.ts.map +1 -1
  40. package/dist/core/lsp/jsonrpc.js +13 -1
  41. package/dist/core/lsp/jsonrpc.js.map +1 -1
  42. package/dist/core/lsp/manager.d.ts.map +1 -1
  43. package/dist/core/lsp/manager.js +23 -2
  44. package/dist/core/lsp/manager.js.map +1 -1
  45. package/dist/core/lsp/manager.test.js +32 -1
  46. package/dist/core/lsp/manager.test.js.map +1 -1
  47. package/dist/core/lsp/test-support.d.ts +18 -0
  48. package/dist/core/lsp/test-support.d.ts.map +1 -0
  49. package/dist/core/lsp/test-support.js +27 -0
  50. package/dist/core/lsp/test-support.js.map +1 -0
  51. package/dist/core/lsp/uri.test.d.ts +2 -0
  52. package/dist/core/lsp/uri.test.d.ts.map +1 -0
  53. package/dist/core/lsp/uri.test.js +56 -0
  54. package/dist/core/lsp/uri.test.js.map +1 -0
  55. package/dist/core/lsp/windows.test.d.ts +2 -0
  56. package/dist/core/lsp/windows.test.d.ts.map +1 -0
  57. package/dist/core/lsp/windows.test.js +251 -0
  58. package/dist/core/lsp/windows.test.js.map +1 -0
  59. package/dist/core/mcp/resolve-stdio.d.ts +35 -0
  60. package/dist/core/mcp/resolve-stdio.d.ts.map +1 -1
  61. package/dist/core/mcp/resolve-stdio.js +80 -1
  62. package/dist/core/mcp/resolve-stdio.js.map +1 -1
  63. package/dist/core/mcp/resolve-stdio.test.js +99 -4
  64. package/dist/core/mcp/resolve-stdio.test.js.map +1 -1
  65. package/dist/core/network-guard.d.ts +47 -0
  66. package/dist/core/network-guard.d.ts.map +1 -0
  67. package/dist/core/network-guard.js +208 -0
  68. package/dist/core/network-guard.js.map +1 -0
  69. package/dist/core/network-guard.test.d.ts +2 -0
  70. package/dist/core/network-guard.test.d.ts.map +1 -0
  71. package/dist/core/network-guard.test.js +72 -0
  72. package/dist/core/network-guard.test.js.map +1 -0
  73. package/dist/core/persistent-shell.d.ts +3 -1
  74. package/dist/core/persistent-shell.d.ts.map +1 -1
  75. package/dist/core/persistent-shell.js +13 -3
  76. package/dist/core/persistent-shell.js.map +1 -1
  77. package/dist/core/process-manager-dev-server-repro.test.js +34 -12
  78. package/dist/core/process-manager-dev-server-repro.test.js.map +1 -1
  79. package/dist/core/process-manager.d.ts +1 -1
  80. package/dist/core/process-manager.d.ts.map +1 -1
  81. package/dist/core/process-manager.js +23 -13
  82. package/dist/core/process-manager.js.map +1 -1
  83. package/dist/core/project-discovery.d.ts +10 -0
  84. package/dist/core/project-discovery.d.ts.map +1 -1
  85. package/dist/core/project-discovery.js +42 -8
  86. package/dist/core/project-discovery.js.map +1 -1
  87. package/dist/core/project-discovery.test.js +102 -1
  88. package/dist/core/project-discovery.test.js.map +1 -1
  89. package/dist/core/prompt-commands.d.ts.map +1 -1
  90. package/dist/core/prompt-commands.js +55 -36
  91. package/dist/core/prompt-commands.js.map +1 -1
  92. package/dist/core/prompt-commands.test.js +49 -2
  93. package/dist/core/prompt-commands.test.js.map +1 -1
  94. package/dist/core/radio.test.js +4 -1
  95. package/dist/core/radio.test.js.map +1 -1
  96. package/dist/core/session-export.d.ts +98 -0
  97. package/dist/core/session-export.d.ts.map +1 -0
  98. package/dist/core/session-export.js +356 -0
  99. package/dist/core/session-export.js.map +1 -0
  100. package/dist/core/session-export.test.d.ts +2 -0
  101. package/dist/core/session-export.test.d.ts.map +1 -0
  102. package/dist/core/session-export.test.js +353 -0
  103. package/dist/core/session-export.test.js.map +1 -0
  104. package/dist/core/session-storage.d.ts.map +1 -1
  105. package/dist/core/session-storage.js +25 -1
  106. package/dist/core/session-storage.js.map +1 -1
  107. package/dist/core/session-storage.test.js +4 -1
  108. package/dist/core/session-storage.test.js.map +1 -1
  109. package/dist/core/settings-manager.d.ts +5 -0
  110. package/dist/core/settings-manager.d.ts.map +1 -1
  111. package/dist/core/settings-manager.js +10 -0
  112. package/dist/core/settings-manager.js.map +1 -1
  113. package/dist/core/skills-routing.test.js +3 -1
  114. package/dist/core/skills-routing.test.js.map +1 -1
  115. package/dist/core/slash-commands.d.ts +10 -0
  116. package/dist/core/slash-commands.d.ts.map +1 -1
  117. package/dist/core/slash-commands.js +16 -0
  118. package/dist/core/slash-commands.js.map +1 -1
  119. package/dist/core/slash-commands.test.d.ts +2 -0
  120. package/dist/core/slash-commands.test.d.ts.map +1 -0
  121. package/dist/core/slash-commands.test.js +48 -0
  122. package/dist/core/slash-commands.test.js.map +1 -0
  123. package/dist/core/speed-benchmark.test.js +9 -3
  124. package/dist/core/speed-benchmark.test.js.map +1 -1
  125. package/dist/core/subagent-store.test.js +14 -2
  126. package/dist/core/subagent-store.test.js.map +1 -1
  127. package/dist/core/workspace-guard.d.ts +2 -0
  128. package/dist/core/workspace-guard.d.ts.map +1 -1
  129. package/dist/core/workspace-guard.js +4 -1
  130. package/dist/core/workspace-guard.js.map +1 -1
  131. package/dist/core/workspace-guard.test.js +21 -0
  132. package/dist/core/workspace-guard.test.js.map +1 -1
  133. package/dist/system-prompt.d.ts +11 -1
  134. package/dist/system-prompt.d.ts.map +1 -1
  135. package/dist/system-prompt.js +19 -4
  136. package/dist/system-prompt.js.map +1 -1
  137. package/dist/system-prompt.test.js +9 -0
  138. package/dist/system-prompt.test.js.map +1 -1
  139. package/dist/test-support/fake-home.d.ts +20 -0
  140. package/dist/test-support/fake-home.d.ts.map +1 -0
  141. package/dist/test-support/fake-home.js +37 -0
  142. package/dist/test-support/fake-home.js.map +1 -0
  143. package/dist/tools/bash.d.ts +2 -1
  144. package/dist/tools/bash.d.ts.map +1 -1
  145. package/dist/tools/bash.js +16 -4
  146. package/dist/tools/bash.js.map +1 -1
  147. package/dist/tools/bash.test.js +122 -7
  148. package/dist/tools/bash.test.js.map +1 -1
  149. package/dist/tools/edit-robustness.test.js +3 -1
  150. package/dist/tools/edit-robustness.test.js.map +1 -1
  151. package/dist/tools/find.d.ts.map +1 -1
  152. package/dist/tools/find.js +4 -1
  153. package/dist/tools/find.js.map +1 -1
  154. package/dist/tools/grep.d.ts +3 -1
  155. package/dist/tools/grep.d.ts.map +1 -1
  156. package/dist/tools/grep.js +135 -11
  157. package/dist/tools/grep.js.map +1 -1
  158. package/dist/tools/grep.test.js +53 -0
  159. package/dist/tools/grep.test.js.map +1 -1
  160. package/dist/tools/index.d.ts +6 -0
  161. package/dist/tools/index.d.ts.map +1 -1
  162. package/dist/tools/index.js +3 -3
  163. package/dist/tools/index.js.map +1 -1
  164. package/dist/tools/overflow.test.js +4 -7
  165. package/dist/tools/overflow.test.js.map +1 -1
  166. package/dist/tools/path-utils.d.ts +15 -0
  167. package/dist/tools/path-utils.d.ts.map +1 -1
  168. package/dist/tools/path-utils.js +17 -0
  169. package/dist/tools/path-utils.js.map +1 -1
  170. package/dist/tools/path-utils.test.js +7 -2
  171. package/dist/tools/path-utils.test.js.map +1 -1
  172. package/dist/tools/search-code.d.ts.map +1 -1
  173. package/dist/tools/search-code.js +6 -4
  174. package/dist/tools/search-code.js.map +1 -1
  175. package/dist/tools/web-fetch.d.ts +2 -1
  176. package/dist/tools/web-fetch.d.ts.map +1 -1
  177. package/dist/tools/web-fetch.js +17 -6
  178. package/dist/tools/web-fetch.js.map +1 -1
  179. package/dist/tools/web-fetch.test.js +34 -0
  180. package/dist/tools/web-fetch.test.js.map +1 -1
  181. package/dist/tools/web-search.d.ts +2 -1
  182. package/dist/tools/web-search.d.ts.map +1 -1
  183. package/dist/tools/web-search.js +21 -5
  184. package/dist/tools/web-search.js.map +1 -1
  185. package/dist/utils/process.d.ts +26 -3
  186. package/dist/utils/process.d.ts.map +1 -1
  187. package/dist/utils/process.js +68 -10
  188. package/dist/utils/process.js.map +1 -1
  189. package/dist/utils/process.test.d.ts +2 -0
  190. package/dist/utils/process.test.d.ts.map +1 -0
  191. package/dist/utils/process.test.js +42 -0
  192. package/dist/utils/process.test.js.map +1 -0
  193. package/package.json +4 -4
@@ -1,6 +1,29 @@
1
+ import { spawnSync } from "node:child_process";
2
+ export interface ProcessTreeKillOptions {
3
+ platform?: NodeJS.Platform;
4
+ kill?: typeof process.kill;
5
+ spawnSync?: typeof spawnSync;
6
+ env?: NodeJS.ProcessEnv;
7
+ taskkillTimeoutMs?: number;
8
+ }
1
9
  /**
2
- * Kill a process and all its children by sending SIGKILL to the process group.
3
- * Falls back to killing just the process if process group kill fails.
10
+ * Absolute path to `taskkill.exe`.
11
+ *
12
+ * Bare `"taskkill"` depends on `System32` being on PATH — not guaranteed for a
13
+ * GUI-launched app whose PATH we also mutate — and is spoofable by a
14
+ * `taskkill.exe` sitting in the project cwd. Resolve it from `SystemRoot`
15
+ * (falling back to `WINDIR`, then `C:\Windows`), rejecting anything that isn't
16
+ * a plain drive-rooted path.
4
17
  */
5
- export declare function killProcessTree(pid: number): void;
18
+ export declare function resolveWindowsTaskkillPath(env?: NodeJS.ProcessEnv): string;
19
+ /**
20
+ * Kill a process and every descendant.
21
+ *
22
+ * POSIX: SIGKILL the process group (negative pid), falling back to the single
23
+ * pid. Windows has no process groups and negative pids are invalid there — the
24
+ * POSIX path silently left the whole child tree running, so a timed-out or
25
+ * cancelled `bash` command kept its `npm`/`node`/`pnpm` descendants alive
26
+ * forever. Use `taskkill /T /F` instead, falling back to the direct pid.
27
+ */
28
+ export declare function killProcessTree(pid: number, options?: ProcessTreeKillOptions): void;
6
29
  //# sourceMappingURL=process.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/utils/process.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAWjD"}
1
+ {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/utils/process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAG/C,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,IAAI,CAAC,EAAE,OAAO,OAAO,CAAC,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,SAAS,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AASD;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAavF;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,sBAA2B,GAAG,IAAI,CA0BvF"}
@@ -1,19 +1,77 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import path from "node:path";
3
+ const DEFAULT_TASKKILL_TIMEOUT_MS = 5_000;
4
+ function getEnvCaseInsensitive(env, name) {
5
+ const wanted = name.toLowerCase();
6
+ return Object.entries(env).find(([key]) => key.toLowerCase() === wanted)?.[1];
7
+ }
1
8
  /**
2
- * Kill a process and all its children by sending SIGKILL to the process group.
3
- * Falls back to killing just the process if process group kill fails.
9
+ * Absolute path to `taskkill.exe`.
10
+ *
11
+ * Bare `"taskkill"` depends on `System32` being on PATH — not guaranteed for a
12
+ * GUI-launched app whose PATH we also mutate — and is spoofable by a
13
+ * `taskkill.exe` sitting in the project cwd. Resolve it from `SystemRoot`
14
+ * (falling back to `WINDIR`, then `C:\Windows`), rejecting anything that isn't
15
+ * a plain drive-rooted path.
4
16
  */
5
- export function killProcessTree(pid) {
6
- try {
7
- // Kill the entire process group (negative pid)
8
- process.kill(-pid, "SIGKILL");
9
- }
10
- catch {
17
+ export function resolveWindowsTaskkillPath(env = process.env) {
18
+ const normalize = (value) => {
19
+ if (value === undefined)
20
+ return undefined;
21
+ const root = value.trim();
22
+ const unsafe = [...root].some((ch) => ch === ";" || ch.charCodeAt(0) <= 31);
23
+ if (!/^[A-Za-z]:[\\/]/.test(root) || unsafe)
24
+ return undefined;
25
+ return path.win32.normalize(root);
26
+ };
27
+ const systemRoot = normalize(getEnvCaseInsensitive(env, "SystemRoot")) ??
28
+ normalize(getEnvCaseInsensitive(env, "WINDIR")) ??
29
+ "C:\\Windows";
30
+ return path.win32.join(systemRoot, "System32", "taskkill.exe");
31
+ }
32
+ /**
33
+ * Kill a process and every descendant.
34
+ *
35
+ * POSIX: SIGKILL the process group (negative pid), falling back to the single
36
+ * pid. Windows has no process groups and negative pids are invalid there — the
37
+ * POSIX path silently left the whole child tree running, so a timed-out or
38
+ * cancelled `bash` command kept its `npm`/`node`/`pnpm` descendants alive
39
+ * forever. Use `taskkill /T /F` instead, falling back to the direct pid.
40
+ */
41
+ export function killProcessTree(pid, options = {}) {
42
+ const platform = options.platform ?? process.platform;
43
+ const kill = options.kill ?? process.kill;
44
+ if (platform !== "win32") {
11
45
  try {
12
- process.kill(pid, "SIGKILL");
46
+ kill(-pid, "SIGKILL");
47
+ return;
13
48
  }
14
49
  catch {
15
- // Process already exited
50
+ killSingleProcess(pid, kill);
51
+ return;
16
52
  }
17
53
  }
54
+ const executable = resolveWindowsTaskkillPath(options.env);
55
+ try {
56
+ const result = (options.spawnSync ?? spawnSync)(executable, ["/PID", String(pid), "/T", "/F"], {
57
+ stdio: "ignore",
58
+ windowsHide: true,
59
+ timeout: options.taskkillTimeoutMs ?? DEFAULT_TASKKILL_TIMEOUT_MS,
60
+ });
61
+ if (result.status === 0 && result.error === undefined)
62
+ return;
63
+ }
64
+ catch {
65
+ // Fall through to the direct-pid fallback below.
66
+ }
67
+ killSingleProcess(pid, kill);
68
+ }
69
+ function killSingleProcess(pid, kill) {
70
+ try {
71
+ kill(pid, "SIGKILL");
72
+ }
73
+ catch {
74
+ // Process already exited.
75
+ }
18
76
  }
19
77
  //# sourceMappingURL=process.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/utils/process.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,IAAI,CAAC;QACH,+CAA+C;QAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,yBAAyB;QAC3B,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/utils/process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=process.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.test.d.ts","sourceRoot":"","sources":["../../src/utils/process.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,42 @@
1
+ import { describe, expect, it, vi } from "vitest";
2
+ import { killProcessTree, resolveWindowsTaskkillPath } from "./process.js";
3
+ describe("resolveWindowsTaskkillPath", () => {
4
+ it("resolves taskkill from SystemRoot", () => {
5
+ expect(resolveWindowsTaskkillPath({ SystemRoot: "C:\\Windows" })).toBe("C:\\Windows\\System32\\taskkill.exe");
6
+ });
7
+ it("is case-insensitive about the env var name and falls back to WINDIR", () => {
8
+ expect(resolveWindowsTaskkillPath({ systemroot: "D:/Win" })).toBe("D:\\Win\\System32\\taskkill.exe");
9
+ expect(resolveWindowsTaskkillPath({ WINDIR: "E:\\W" })).toBe("E:\\W\\System32\\taskkill.exe");
10
+ });
11
+ it("rejects relative or injected roots and falls back to C:\\Windows", () => {
12
+ expect(resolveWindowsTaskkillPath({ SystemRoot: "windows" })).toBe("C:\\Windows\\System32\\taskkill.exe");
13
+ expect(resolveWindowsTaskkillPath({ SystemRoot: "C:\\Win;C:\\evil" })).toBe("C:\\Windows\\System32\\taskkill.exe");
14
+ expect(resolveWindowsTaskkillPath({})).toBe("C:\\Windows\\System32\\taskkill.exe");
15
+ });
16
+ });
17
+ describe("killProcessTree", () => {
18
+ it("kills the whole tree with taskkill on Windows (never a negative pid)", () => {
19
+ const spawnSync = vi.fn().mockReturnValue({ status: 0 });
20
+ const kill = vi.fn();
21
+ killProcessTree(4242, {
22
+ platform: "win32",
23
+ kill,
24
+ spawnSync: spawnSync,
25
+ env: { SystemRoot: "C:\\Windows" },
26
+ });
27
+ expect(spawnSync).toHaveBeenCalledWith("C:\\Windows\\System32\\taskkill.exe", ["/PID", "4242", "/T", "/F"], expect.objectContaining({ windowsHide: true }));
28
+ expect(kill).not.toHaveBeenCalled();
29
+ });
30
+ it("falls back to the direct pid when taskkill fails", () => {
31
+ const spawnSync = vi.fn().mockReturnValue({ status: 1 });
32
+ const kill = vi.fn();
33
+ killProcessTree(7, { platform: "win32", kill, spawnSync: spawnSync, env: {} });
34
+ expect(kill).toHaveBeenCalledWith(7, "SIGKILL");
35
+ });
36
+ it("signals the process group on POSIX", () => {
37
+ const kill = vi.fn();
38
+ killProcessTree(99, { platform: "darwin", kill });
39
+ expect(kill).toHaveBeenCalledWith(-99, "SIGKILL");
40
+ });
41
+ });
42
+ //# sourceMappingURL=process.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.test.js","sourceRoot":"","sources":["../../src/utils/process.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kenkaiiii/ggcoder",
3
- "version": "5.23.2",
3
+ "version": "5.24.0",
4
4
  "type": "module",
5
5
  "description": "CLI coding agent with OAuth authentication for Anthropic, OpenAI, and Gemini",
6
6
  "license": "MIT",
@@ -114,9 +114,9 @@
114
114
  "typescript-language-server": "^5.3.0",
115
115
  "wrap-ansi": "^10.0.0",
116
116
  "zod": "^4.4.3",
117
- "@kenkaiiii/gg-core": "5.23.2",
118
- "@kenkaiiii/gg-agent": "5.23.2",
119
- "@kenkaiiii/gg-ai": "5.23.2"
117
+ "@kenkaiiii/gg-agent": "5.24.0",
118
+ "@kenkaiiii/gg-core": "5.24.0",
119
+ "@kenkaiiii/gg-ai": "5.24.0"
120
120
  },
121
121
  "optionalDependencies": {
122
122
  "@huggingface/transformers": "^3.6.0",