@kenkaiiii/ggcoder 5.20.0 → 5.20.2

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 (51) 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 +83 -0
  8. package/dist/app-sidecar-sessions.test.js.map +1 -0
  9. package/dist/app-sidecar.js +6 -34
  10. package/dist/app-sidecar.js.map +1 -1
  11. package/dist/cli.d.ts.map +1 -1
  12. package/dist/cli.js +19 -20
  13. package/dist/cli.js.map +1 -1
  14. package/dist/core/agent-session.d.ts +1 -0
  15. package/dist/core/agent-session.d.ts.map +1 -1
  16. package/dist/core/agent-session.js +43 -5
  17. package/dist/core/agent-session.js.map +1 -1
  18. package/dist/core/project-discovery.d.ts +1 -1
  19. package/dist/core/project-discovery.d.ts.map +1 -1
  20. package/dist/core/project-discovery.js +105 -53
  21. package/dist/core/project-discovery.js.map +1 -1
  22. package/dist/core/project-discovery.test.js +29 -0
  23. package/dist/core/project-discovery.test.js.map +1 -1
  24. package/dist/core/session-manager.d.ts +27 -7
  25. package/dist/core/session-manager.d.ts.map +1 -1
  26. package/dist/core/session-manager.js +257 -124
  27. package/dist/core/session-manager.js.map +1 -1
  28. package/dist/core/session-storage.d.ts +57 -0
  29. package/dist/core/session-storage.d.ts.map +1 -0
  30. package/dist/core/session-storage.js +568 -0
  31. package/dist/core/session-storage.js.map +1 -0
  32. package/dist/core/session-storage.test.d.ts +2 -0
  33. package/dist/core/session-storage.test.d.ts.map +1 -0
  34. package/dist/core/session-storage.test.js +269 -0
  35. package/dist/core/session-storage.test.js.map +1 -0
  36. package/dist/session.d.ts +4 -4
  37. package/dist/session.d.ts.map +1 -1
  38. package/dist/session.js +38 -101
  39. package/dist/session.js.map +1 -1
  40. package/dist/session.test.d.ts +2 -0
  41. package/dist/session.test.d.ts.map +1 -0
  42. package/dist/session.test.js +35 -0
  43. package/dist/session.test.js.map +1 -0
  44. package/dist/ui/App.d.ts.map +1 -1
  45. package/dist/ui/App.js +0 -2
  46. package/dist/ui/App.js.map +1 -1
  47. package/dist/ui/hooks/useTranscriptHistory.d.ts +8 -5
  48. package/dist/ui/hooks/useTranscriptHistory.d.ts.map +1 -1
  49. package/dist/ui/hooks/useTranscriptHistory.js +2 -30
  50. package/dist/ui/hooks/useTranscriptHistory.js.map +1 -1
  51. 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,83 @@
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
+ import { archiveColdSession, archiveSessionPath } from "./core/session-storage.js";
9
+ async function writeSessions(sessionsRoot, cwd, prefix, count) {
10
+ const projectSessionsDir = path.join(sessionsRoot, encodeCwd(cwd));
11
+ await fs.mkdir(projectSessionsDir, { recursive: true });
12
+ for (let index = 0; index < count; index++) {
13
+ const timestamp = new Date(Date.now() + index * 1_000).toISOString();
14
+ const file = path.join(projectSessionsDir, `${prefix}-${index}.jsonl`);
15
+ const records = [
16
+ {
17
+ type: "session",
18
+ version: 2,
19
+ id: `${prefix}-${index}`,
20
+ conversationId: `${prefix}-${index}`,
21
+ timestamp,
22
+ cwd,
23
+ provider: "anthropic",
24
+ model: "claude-sonnet-5",
25
+ },
26
+ {
27
+ type: "message",
28
+ id: `${prefix}-message-${index}`,
29
+ timestamp,
30
+ message: { role: "user", content: `Session ${index}` },
31
+ },
32
+ ];
33
+ await fs.writeFile(file, records.map((record) => JSON.stringify(record)).join("\n") + "\n");
34
+ const modified = new Date(timestamp);
35
+ await fs.utimes(file, modified, modified);
36
+ }
37
+ }
38
+ describe("gg-app sidecar session listings", () => {
39
+ let tmp;
40
+ let cwd;
41
+ let coderSessionsDir;
42
+ beforeEach(async () => {
43
+ tmp = await fs.mkdtemp(path.join(os.tmpdir(), "gg-sidecar-sessions-"));
44
+ cwd = path.join(tmp, "project");
45
+ coderSessionsDir = path.join(tmp, "sessions");
46
+ await fs.mkdir(cwd, { recursive: true });
47
+ });
48
+ afterEach(async () => {
49
+ await fs.rm(tmp, { recursive: true, force: true });
50
+ });
51
+ it("returns up to 30 chat sessions while coding remains capped at 5", async () => {
52
+ await writeSessions(coderSessionsDir, cwd, "coding", 31);
53
+ await writeSessions(chatAgentSessionsDir(coderSessionsDir, "general"), cwd, "chat", 31);
54
+ const codingSessions = await listSidecarSessions(cwd, null, coderSessionsDir);
55
+ const chatSessions = await listSidecarSessions(cwd, "all", coderSessionsDir);
56
+ expect(codingSessions).toHaveLength(5);
57
+ expect(codingSessions.map((session) => session.id)).toEqual([
58
+ "coding-30",
59
+ "coding-29",
60
+ "coding-28",
61
+ "coding-27",
62
+ "coding-26",
63
+ ]);
64
+ expect(chatSessions).toHaveLength(30);
65
+ expect(chatSessions[0]).toMatchObject({ id: "chat-30", chatAgent: "general" });
66
+ expect(chatSessions.at(-1)).toMatchObject({ id: "chat-1", chatAgent: "general" });
67
+ });
68
+ it("lists archived coding and chat sessions once despite their redirect counterparts", async () => {
69
+ const chatRoot = chatAgentSessionsDir(coderSessionsDir, "general");
70
+ await writeSessions(coderSessionsDir, cwd, "coding-archive", 1);
71
+ await writeSessions(chatRoot, cwd, "chat-archive", 1);
72
+ const codingPlain = path.join(coderSessionsDir, encodeCwd(cwd), "coding-archive-0.jsonl");
73
+ const chatPlain = path.join(chatRoot, encodeCwd(cwd), "chat-archive-0.jsonl");
74
+ await Promise.all([archiveColdSession(codingPlain), archiveColdSession(chatPlain)]);
75
+ const codingSessions = await listSidecarSessions(cwd, null, coderSessionsDir);
76
+ const chatSessions = await listSidecarSessions(cwd, "general", coderSessionsDir);
77
+ expect(codingSessions).toHaveLength(1);
78
+ expect(codingSessions[0]?.path).toBe(archiveSessionPath(codingPlain));
79
+ expect(chatSessions).toHaveLength(1);
80
+ expect(chatSessions[0]?.path).toBe(archiveSessionPath(chatPlain));
81
+ });
82
+ });
83
+ //# 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";
@@ -2272,38 +2273,9 @@ async function createSession(deps, opts) {
2272
2273
  return;
2273
2274
  }
2274
2275
  const requestedAgent = new URL(url, `http://${host}`).searchParams.get("chatAgent");
2275
- if (requestedAgent === "all") {
2276
- void Promise.all(CHAT_AGENT_IDS.map(async (agentId) => {
2277
- const agentSessions = await listRecentSessions(target, 5, chatAgentSessionsDir(paths.sessionsDir, agentId));
2278
- return agentSessions.map((item) => ({ ...item, chatAgent: agentId }));
2279
- }))
2280
- .then(async (groups) => {
2281
- const dated = await Promise.all(groups.flat().map(async (item) => ({
2282
- item,
2283
- mtime: await fs
2284
- .stat(item.path)
2285
- .then((stat) => stat.mtimeMs)
2286
- .catch(() => 0),
2287
- })));
2288
- const recent = dated
2289
- .sort((left, right) => right.mtime - left.mtime)
2290
- .slice(0, 5)
2291
- .map(({ item }) => item);
2292
- json(res, 200, { sessions: recent });
2293
- })
2294
- .catch((error) => {
2295
- captureSidecarError(error, "app-sidecar.sessions.list-chat");
2296
- json(res, 200, { sessions: [] });
2297
- });
2298
- return;
2299
- }
2300
- // The picker may be served by a sidecar currently running in Chat mode.
2301
- // An omitted chatAgent always means coding history; chat callers identify
2302
- // their namespace explicitly (one agent or "all").
2303
- const sessionsDir = requestedAgent
2304
- ? sessionsDirForChatAgent(paths.sessionsDir, requestedAgent)
2305
- : paths.sessionsDir;
2306
- 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)
2307
2279
  .then((sessions) => json(res, 200, { sessions }))
2308
2280
  .catch((error) => {
2309
2281
  captureSidecarError(error, "app-sidecar.sessions.list");