@kenkaiiii/ggcoder 5.19.6 → 5.20.1

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 (125) hide show
  1. package/dist/app-sidecar-sessions.d.ts +8 -0
  2. package/dist/app-sidecar-sessions.d.ts.map +1 -0
  3. package/dist/app-sidecar-sessions.js +31 -0
  4. package/dist/app-sidecar-sessions.js.map +1 -0
  5. package/dist/app-sidecar-sessions.test.d.ts +2 -0
  6. package/dist/app-sidecar-sessions.test.d.ts.map +1 -0
  7. package/dist/app-sidecar-sessions.test.js +68 -0
  8. package/dist/app-sidecar-sessions.test.js.map +1 -0
  9. package/dist/app-sidecar.js +9 -34
  10. package/dist/app-sidecar.js.map +1 -1
  11. package/dist/cli.d.ts.map +1 -1
  12. package/dist/cli.js +8 -0
  13. package/dist/cli.js.map +1 -1
  14. package/dist/config.d.ts +4 -0
  15. package/dist/config.d.ts.map +1 -1
  16. package/dist/config.js +9 -0
  17. package/dist/config.js.map +1 -1
  18. package/dist/core/agent-session.d.ts +3 -0
  19. package/dist/core/agent-session.d.ts.map +1 -1
  20. package/dist/core/agent-session.js +31 -6
  21. package/dist/core/agent-session.js.map +1 -1
  22. package/dist/core/agents.d.ts +1 -1
  23. package/dist/core/agents.d.ts.map +1 -1
  24. package/dist/core/agents.js +4 -1
  25. package/dist/core/agents.js.map +1 -1
  26. package/dist/core/compaction/compactor.test.js +3 -3
  27. package/dist/core/event-bus.d.ts +4 -0
  28. package/dist/core/event-bus.d.ts.map +1 -1
  29. package/dist/core/event-bus.js +6 -0
  30. package/dist/core/event-bus.js.map +1 -1
  31. package/dist/core/input-normalization.test.d.ts +2 -0
  32. package/dist/core/input-normalization.test.d.ts.map +1 -0
  33. package/dist/core/input-normalization.test.js +75 -0
  34. package/dist/core/input-normalization.test.js.map +1 -0
  35. package/dist/core/loop-breaker.d.ts +38 -1
  36. package/dist/core/loop-breaker.d.ts.map +1 -1
  37. package/dist/core/loop-breaker.js +84 -2
  38. package/dist/core/loop-breaker.js.map +1 -1
  39. package/dist/core/loop-breaker.test.js +108 -1
  40. package/dist/core/loop-breaker.test.js.map +1 -1
  41. package/dist/core/settings-manager.d.ts +2 -0
  42. package/dist/core/settings-manager.d.ts.map +1 -1
  43. package/dist/core/settings-manager.js +7 -0
  44. package/dist/core/settings-manager.js.map +1 -1
  45. package/dist/core/skills.d.ts +1 -1
  46. package/dist/core/skills.d.ts.map +1 -1
  47. package/dist/core/skills.js +4 -1
  48. package/dist/core/skills.js.map +1 -1
  49. package/dist/core/subagent-manager.d.ts +7 -0
  50. package/dist/core/subagent-manager.d.ts.map +1 -1
  51. package/dist/core/subagent-manager.js +15 -0
  52. package/dist/core/subagent-manager.js.map +1 -1
  53. package/dist/core/subagent-manager.test.js +34 -0
  54. package/dist/core/subagent-manager.test.js.map +1 -1
  55. package/dist/core/workspace-guard.d.ts +38 -0
  56. package/dist/core/workspace-guard.d.ts.map +1 -0
  57. package/dist/core/workspace-guard.js +112 -0
  58. package/dist/core/workspace-guard.js.map +1 -0
  59. package/dist/core/workspace-guard.test.d.ts +2 -0
  60. package/dist/core/workspace-guard.test.d.ts.map +1 -0
  61. package/dist/core/workspace-guard.test.js +86 -0
  62. package/dist/core/workspace-guard.test.js.map +1 -0
  63. package/dist/modes/json-mode.d.ts.map +1 -1
  64. package/dist/modes/json-mode.js +3 -0
  65. package/dist/modes/json-mode.js.map +1 -1
  66. package/dist/modes/subagent-worker-mode.d.ts.map +1 -1
  67. package/dist/modes/subagent-worker-mode.js +1 -0
  68. package/dist/modes/subagent-worker-mode.js.map +1 -1
  69. package/dist/system-prompt.d.ts +12 -0
  70. package/dist/system-prompt.d.ts.map +1 -1
  71. package/dist/system-prompt.js +77 -9
  72. package/dist/system-prompt.js.map +1 -1
  73. package/dist/system-prompt.test.js +109 -1
  74. package/dist/system-prompt.test.js.map +1 -1
  75. package/dist/tools/bash.d.ts +2 -1
  76. package/dist/tools/bash.d.ts.map +1 -1
  77. package/dist/tools/bash.js +31 -5
  78. package/dist/tools/bash.js.map +1 -1
  79. package/dist/tools/bash.test.js +34 -1
  80. package/dist/tools/bash.test.js.map +1 -1
  81. package/dist/tools/edit.d.ts +2 -1
  82. package/dist/tools/edit.d.ts.map +1 -1
  83. package/dist/tools/edit.js +7 -1
  84. package/dist/tools/edit.js.map +1 -1
  85. package/dist/tools/edit.test.js +7 -0
  86. package/dist/tools/edit.test.js.map +1 -1
  87. package/dist/tools/exit-plan.d.ts.map +1 -1
  88. package/dist/tools/exit-plan.js +15 -4
  89. package/dist/tools/exit-plan.js.map +1 -1
  90. package/dist/tools/exit-plan.test.d.ts +2 -0
  91. package/dist/tools/exit-plan.test.d.ts.map +1 -0
  92. package/dist/tools/exit-plan.test.js +72 -0
  93. package/dist/tools/exit-plan.test.js.map +1 -0
  94. package/dist/tools/index.d.ts +8 -0
  95. package/dist/tools/index.d.ts.map +1 -1
  96. package/dist/tools/index.js +3 -2
  97. package/dist/tools/index.js.map +1 -1
  98. package/dist/tools/skill.d.ts.map +1 -1
  99. package/dist/tools/skill.js +4 -2
  100. package/dist/tools/skill.js.map +1 -1
  101. package/dist/tools/subagent-shared.test.js +16 -1
  102. package/dist/tools/subagent-shared.test.js.map +1 -1
  103. package/dist/tools/write.d.ts +2 -1
  104. package/dist/tools/write.d.ts.map +1 -1
  105. package/dist/tools/write.js +7 -1
  106. package/dist/tools/write.js.map +1 -1
  107. package/dist/tools/write.test.js +12 -0
  108. package/dist/tools/write.test.js.map +1 -1
  109. package/dist/ui/App.d.ts.map +1 -1
  110. package/dist/ui/App.js +17 -3
  111. package/dist/ui/App.js.map +1 -1
  112. package/dist/ui/app-items.d.ts +10 -0
  113. package/dist/ui/app-items.d.ts.map +1 -1
  114. package/dist/ui/app-items.js +10 -0
  115. package/dist/ui/app-items.js.map +1 -1
  116. package/dist/ui/components/Footer.test.js +1 -1
  117. package/dist/ui/hooks/useAgentLoop.d.ts +4 -1
  118. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
  119. package/dist/ui/hooks/useAgentLoop.js +49 -8
  120. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  121. package/dist/utils/text.d.ts +9 -0
  122. package/dist/utils/text.d.ts.map +1 -0
  123. package/dist/utils/text.js +11 -0
  124. package/dist/utils/text.js.map +1 -0
  125. package/package.json +4 -4
@@ -0,0 +1,8 @@
1
+ import { type ChatAgentId } from "./chat-agents/index.js";
2
+ import { type RecentSession } from "./core/project-discovery.js";
3
+ export type SidecarSession = RecentSession & {
4
+ chatAgent?: ChatAgentId;
5
+ };
6
+ /** List coding or chat sessions using the caps exposed by the gg-app sidecar. */
7
+ export declare function listSidecarSessions(cwd: string, requestedAgent: string | null, coderSessionsDir: string): Promise<SidecarSession[]>;
8
+ //# sourceMappingURL=app-sidecar-sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-sidecar-sessions.d.ts","sourceRoot":"","sources":["../src/app-sidecar-sessions.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAKrF,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG;IAAE,SAAS,CAAC,EAAE,WAAW,CAAA;CAAE,CAAC;AAEzE,iFAAiF;AACjF,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,cAAc,EAAE,MAAM,GAAG,IAAI,EAC7B,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,cAAc,EAAE,CAAC,CAgC3B"}
@@ -0,0 +1,31 @@
1
+ import fs from "node:fs/promises";
2
+ import { CHAT_AGENT_IDS, chatAgentSessionsDir, sessionsDirForChatAgent, } from "./chat-agents/index.js";
3
+ import { listRecentSessions } from "./core/project-discovery.js";
4
+ const CODING_SESSION_LIMIT = 5;
5
+ const CHAT_SESSION_LIMIT = 30;
6
+ /** List coding or chat sessions using the caps exposed by the gg-app sidecar. */
7
+ export async function listSidecarSessions(cwd, requestedAgent, coderSessionsDir) {
8
+ if (requestedAgent !== "all") {
9
+ const sessionsDir = requestedAgent
10
+ ? sessionsDirForChatAgent(coderSessionsDir, requestedAgent)
11
+ : coderSessionsDir;
12
+ const sessionLimit = requestedAgent ? CHAT_SESSION_LIMIT : CODING_SESSION_LIMIT;
13
+ return listRecentSessions(cwd, sessionLimit, sessionsDir);
14
+ }
15
+ const groups = await Promise.all(CHAT_AGENT_IDS.map(async (agentId) => {
16
+ const sessions = await listRecentSessions(cwd, CHAT_SESSION_LIMIT, chatAgentSessionsDir(coderSessionsDir, agentId));
17
+ return sessions.map((session) => ({ ...session, chatAgent: agentId }));
18
+ }));
19
+ const dated = await Promise.all(groups.flat().map(async (session) => ({
20
+ session,
21
+ mtime: await fs
22
+ .stat(session.path)
23
+ .then((stat) => stat.mtimeMs)
24
+ .catch(() => 0),
25
+ })));
26
+ return dated
27
+ .sort((left, right) => right.mtime - left.mtime)
28
+ .slice(0, CHAT_SESSION_LIMIT)
29
+ .map(({ session }) => session);
30
+ }
31
+ //# sourceMappingURL=app-sidecar-sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-sidecar-sessions.js","sourceRoot":"","sources":["../src/app-sidecar-sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAElC,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,uBAAuB,GAExB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAsB,MAAM,6BAA6B,CAAC;AAErF,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAC/B,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAI9B,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,GAAW,EACX,cAA6B,EAC7B,gBAAwB;IAExB,IAAI,cAAc,KAAK,KAAK,EAAE,CAAC;QAC7B,MAAM,WAAW,GAAG,cAAc;YAChC,CAAC,CAAC,uBAAuB,CAAC,gBAAgB,EAAE,cAAc,CAAC;YAC3D,CAAC,CAAC,gBAAgB,CAAC;QACrB,MAAM,YAAY,GAAG,cAAc,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,oBAAoB,CAAC;QAChF,OAAO,kBAAkB,CAAC,GAAG,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACnC,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CACvC,GAAG,EACH,kBAAkB,EAClB,oBAAoB,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAChD,CAAC;QACF,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CACH,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QACpC,OAAO;QACP,KAAK,EAAE,MAAM,EAAE;aACZ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;aAClB,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;aAC5B,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;KAClB,CAAC,CAAC,CACJ,CAAC;IACF,OAAO,KAAK;SACT,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;SAC/C,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC;SAC5B,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=app-sidecar-sessions.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-sidecar-sessions.test.d.ts","sourceRoot":"","sources":["../src/app-sidecar-sessions.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,68 @@
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
5
+ import { chatAgentSessionsDir } from "./chat-agents/index.js";
6
+ import { listSidecarSessions } from "./app-sidecar-sessions.js";
7
+ import { encodeCwd } from "./core/encode-cwd.js";
8
+ async function writeSessions(sessionsRoot, cwd, prefix, count) {
9
+ const projectSessionsDir = path.join(sessionsRoot, encodeCwd(cwd));
10
+ await fs.mkdir(projectSessionsDir, { recursive: true });
11
+ for (let index = 0; index < count; index++) {
12
+ const timestamp = new Date(Date.now() + index * 1_000).toISOString();
13
+ const file = path.join(projectSessionsDir, `${prefix}-${index}.jsonl`);
14
+ const records = [
15
+ {
16
+ type: "session",
17
+ version: 2,
18
+ id: `${prefix}-${index}`,
19
+ conversationId: `${prefix}-${index}`,
20
+ timestamp,
21
+ cwd,
22
+ provider: "anthropic",
23
+ model: "claude-sonnet-5",
24
+ },
25
+ {
26
+ type: "message",
27
+ id: `${prefix}-message-${index}`,
28
+ timestamp,
29
+ message: { role: "user", content: `Session ${index}` },
30
+ },
31
+ ];
32
+ await fs.writeFile(file, records.map((record) => JSON.stringify(record)).join("\n") + "\n");
33
+ const modified = new Date(timestamp);
34
+ await fs.utimes(file, modified, modified);
35
+ }
36
+ }
37
+ describe("gg-app sidecar session listings", () => {
38
+ let tmp;
39
+ let cwd;
40
+ let coderSessionsDir;
41
+ beforeEach(async () => {
42
+ tmp = await fs.mkdtemp(path.join(os.tmpdir(), "gg-sidecar-sessions-"));
43
+ cwd = path.join(tmp, "project");
44
+ coderSessionsDir = path.join(tmp, "sessions");
45
+ await fs.mkdir(cwd, { recursive: true });
46
+ });
47
+ afterEach(async () => {
48
+ await fs.rm(tmp, { recursive: true, force: true });
49
+ });
50
+ it("returns up to 30 chat sessions while coding remains capped at 5", async () => {
51
+ await writeSessions(coderSessionsDir, cwd, "coding", 31);
52
+ await writeSessions(chatAgentSessionsDir(coderSessionsDir, "general"), cwd, "chat", 31);
53
+ const codingSessions = await listSidecarSessions(cwd, null, coderSessionsDir);
54
+ const chatSessions = await listSidecarSessions(cwd, "all", coderSessionsDir);
55
+ expect(codingSessions).toHaveLength(5);
56
+ expect(codingSessions.map((session) => session.id)).toEqual([
57
+ "coding-30",
58
+ "coding-29",
59
+ "coding-28",
60
+ "coding-27",
61
+ "coding-26",
62
+ ]);
63
+ expect(chatSessions).toHaveLength(30);
64
+ expect(chatSessions[0]).toMatchObject({ id: "chat-30", chatAgent: "general" });
65
+ expect(chatSessions.at(-1)).toMatchObject({ id: "chat-1", chatAgent: "general" });
66
+ });
67
+ });
68
+ //# sourceMappingURL=app-sidecar-sessions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-sidecar-sessions.test.js","sourceRoot":"","sources":["../src/app-sidecar-sessions.test.ts"],"names":[],"mappings":"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"}
@@ -23,7 +23,7 @@ import { runJsonMode } from "./modes/json-mode.js";
23
23
  import { runSubagentWorkerMode } from "./modes/subagent-worker-mode.js";
24
24
  import { AgentSession } from "./core/agent-session.js";
25
25
  import { RunLifecycle } from "./core/run-lifecycle.js";
26
- import { CHAT_AGENT_IDS, chatAgentSessionsDir, createChatAgent, parseChatAgentId, sessionsDirForChatAgent, switchChatAgent, } from "./chat-agents/index.js";
26
+ import { CHAT_AGENT_IDS, chatAgentSessionsDir, createChatAgent, parseChatAgentId, switchChatAgent, } from "./chat-agents/index.js";
27
27
  import { buildJiwaTools, JiwaStore } from "./chat-agents/jiwa.js";
28
28
  import { buildMemoryTools, MemoryStore } from "./chat-agents/memory.js";
29
29
  import { buildKenSystemPrompt, buildKenAutopilotSystemPrompt } from "./core/ken-prompt.js";
@@ -50,7 +50,8 @@ import { extractPlanSteps } from "./utils/plan-steps.js";
50
50
  import { getNextThinkingLevel, getSupportedThinkingLevels, isThinkingLevelSupported, } from "./core/thinking-level.js";
51
51
  import { PROMPT_COMMANDS } from "./core/prompt-commands.js";
52
52
  import { loadCustomCommands } from "./core/custom-commands.js";
53
- import { discoverProjects, listRecentSessions } from "./core/project-discovery.js";
53
+ import { discoverProjects } from "./core/project-discovery.js";
54
+ import { listSidecarSessions } from "./app-sidecar-sessions.js";
54
55
  import { loadTasksSync, saveTasksSync, pruneDoneTasksSync, getNextPendingTask, markTaskInProgress, } from "./core/tasks-store.js";
55
56
  import { initLogger, log } from "./core/logger.js";
56
57
  import { RADIO_STATIONS, getCurrentStation, getRadioVolume, playRadio, setRadioVolume, stopRadio, } from "./core/radio.js";
@@ -1285,6 +1286,9 @@ async function createSession(deps, opts) {
1285
1286
  session.eventBus.on("server_tool_call", (d) => broadcast("server_tool_call", d));
1286
1287
  session.eventBus.on("turn_end", (d) => broadcast("turn_end", d));
1287
1288
  session.eventBus.on("agent_done", (d) => broadcast("agent_done", d));
1289
+ // Non-clean stop (max_tokens/refusal/provider error) — info-style frame so
1290
+ // the webview can warn instead of presenting truncated output as complete.
1291
+ session.eventBus.on("truncated", (d) => broadcast("truncated", d));
1288
1292
  session.eventBus.on("error", (d) => {
1289
1293
  broadcastError("error", "agent error", d.error);
1290
1294
  });
@@ -2269,38 +2273,9 @@ async function createSession(deps, opts) {
2269
2273
  return;
2270
2274
  }
2271
2275
  const requestedAgent = new URL(url, `http://${host}`).searchParams.get("chatAgent");
2272
- if (requestedAgent === "all") {
2273
- void Promise.all(CHAT_AGENT_IDS.map(async (agentId) => {
2274
- const agentSessions = await listRecentSessions(target, 5, chatAgentSessionsDir(paths.sessionsDir, agentId));
2275
- return agentSessions.map((item) => ({ ...item, chatAgent: agentId }));
2276
- }))
2277
- .then(async (groups) => {
2278
- const dated = await Promise.all(groups.flat().map(async (item) => ({
2279
- item,
2280
- mtime: await fs
2281
- .stat(item.path)
2282
- .then((stat) => stat.mtimeMs)
2283
- .catch(() => 0),
2284
- })));
2285
- const recent = dated
2286
- .sort((left, right) => right.mtime - left.mtime)
2287
- .slice(0, 5)
2288
- .map(({ item }) => item);
2289
- json(res, 200, { sessions: recent });
2290
- })
2291
- .catch((error) => {
2292
- captureSidecarError(error, "app-sidecar.sessions.list-chat");
2293
- json(res, 200, { sessions: [] });
2294
- });
2295
- return;
2296
- }
2297
- // The picker may be served by a sidecar currently running in Chat mode.
2298
- // An omitted chatAgent always means coding history; chat callers identify
2299
- // their namespace explicitly (one agent or "all").
2300
- const sessionsDir = requestedAgent
2301
- ? sessionsDirForChatAgent(paths.sessionsDir, requestedAgent)
2302
- : paths.sessionsDir;
2303
- void listRecentSessions(target, 5, sessionsDir)
2276
+ // An omitted chatAgent means coding history; chat callers identify one
2277
+ // agent or request the combined, recency-sorted "all" listing.
2278
+ void listSidecarSessions(target, requestedAgent, paths.sessionsDir)
2304
2279
  .then((sessions) => json(res, 200, { sessions }))
2305
2280
  .catch((error) => {
2306
2281
  captureSidecarError(error, "app-sidecar.sessions.list");