@kenkaiiii/ggcoder 4.3.234 → 4.3.236

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 (57) hide show
  1. package/dist/cli/command-routing.d.ts +1 -1
  2. package/dist/cli/command-routing.d.ts.map +1 -1
  3. package/dist/cli/command-routing.js +2 -0
  4. package/dist/cli/command-routing.js.map +1 -1
  5. package/dist/cli/command-routing.test.js +1 -0
  6. package/dist/cli/command-routing.test.js.map +1 -1
  7. package/dist/cli/mcp.d.ts +2 -0
  8. package/dist/cli/mcp.d.ts.map +1 -0
  9. package/dist/cli/mcp.js +309 -0
  10. package/dist/cli/mcp.js.map +1 -0
  11. package/dist/cli.d.ts.map +1 -1
  12. package/dist/cli.js +6 -2
  13. package/dist/cli.js.map +1 -1
  14. package/dist/config.d.ts +1 -0
  15. package/dist/config.d.ts.map +1 -1
  16. package/dist/config.js +1 -0
  17. package/dist/config.js.map +1 -1
  18. package/dist/core/mcp/client.d.ts +20 -0
  19. package/dist/core/mcp/client.d.ts.map +1 -1
  20. package/dist/core/mcp/client.js +55 -11
  21. package/dist/core/mcp/client.js.map +1 -1
  22. package/dist/core/mcp/defaults.d.ts +7 -0
  23. package/dist/core/mcp/defaults.d.ts.map +1 -1
  24. package/dist/core/mcp/defaults.js +14 -0
  25. package/dist/core/mcp/defaults.js.map +1 -1
  26. package/dist/core/mcp/index.d.ts +6 -1
  27. package/dist/core/mcp/index.d.ts.map +1 -1
  28. package/dist/core/mcp/index.js +3 -1
  29. package/dist/core/mcp/index.js.map +1 -1
  30. package/dist/core/mcp/parse-add-command.d.ts +25 -0
  31. package/dist/core/mcp/parse-add-command.d.ts.map +1 -0
  32. package/dist/core/mcp/parse-add-command.js +220 -0
  33. package/dist/core/mcp/parse-add-command.js.map +1 -0
  34. package/dist/core/mcp/parse-add-command.test.d.ts +2 -0
  35. package/dist/core/mcp/parse-add-command.test.d.ts.map +1 -0
  36. package/dist/core/mcp/parse-add-command.test.js +75 -0
  37. package/dist/core/mcp/parse-add-command.test.js.map +1 -0
  38. package/dist/core/mcp/store.d.ts +80 -0
  39. package/dist/core/mcp/store.d.ts.map +1 -0
  40. package/dist/core/mcp/store.js +157 -0
  41. package/dist/core/mcp/store.js.map +1 -0
  42. package/dist/core/mcp/store.test.d.ts +2 -0
  43. package/dist/core/mcp/store.test.d.ts.map +1 -0
  44. package/dist/core/mcp/store.test.js +101 -0
  45. package/dist/core/mcp/store.test.js.map +1 -0
  46. package/dist/ui/mcp.d.ts +62 -0
  47. package/dist/ui/mcp.d.ts.map +1 -0
  48. package/dist/ui/mcp.js +302 -0
  49. package/dist/ui/mcp.js.map +1 -0
  50. package/dist/ui/terminal-history-retry-dedup.test.d.ts +2 -0
  51. package/dist/ui/terminal-history-retry-dedup.test.d.ts.map +1 -0
  52. package/dist/ui/terminal-history-retry-dedup.test.js +61 -0
  53. package/dist/ui/terminal-history-retry-dedup.test.js.map +1 -0
  54. package/dist/ui/terminal-history.d.ts.map +1 -1
  55. package/dist/ui/terminal-history.js +36 -0
  56. package/dist/ui/terminal-history.js.map +1 -1
  57. package/package.json +4 -4
@@ -0,0 +1,101 @@
1
+ import { describe, expect, it, beforeEach, afterEach, vi } from "vitest";
2
+ import path from "node:path";
3
+ import os from "node:os";
4
+ import fs from "node:fs/promises";
5
+ // Point the global mcp file at a temp home so tests don't touch the real ~/.gg.
6
+ let tmpHome;
7
+ let tmpProject;
8
+ vi.mock("../../config.js", async () => {
9
+ const actual = await vi.importActual("../../config.js");
10
+ return {
11
+ ...actual,
12
+ getAppPaths: () => ({
13
+ ...actual.getAppPaths(),
14
+ mcpFile: path.join(process.env.GG_TEST_HOME, ".gg", "mcp.json"),
15
+ }),
16
+ };
17
+ });
18
+ import { addServer, loadServers, removeServer, getServer, fromStoredEntry, globalMcpPath, projectMcpPath, } from "./store.js";
19
+ beforeEach(async () => {
20
+ tmpHome = await fs.mkdtemp(path.join(os.tmpdir(), "gg-mcp-home-"));
21
+ tmpProject = await fs.mkdtemp(path.join(os.tmpdir(), "gg-mcp-proj-"));
22
+ process.env.GG_TEST_HOME = tmpHome;
23
+ });
24
+ afterEach(async () => {
25
+ await fs.rm(tmpHome, { recursive: true, force: true });
26
+ await fs.rm(tmpProject, { recursive: true, force: true });
27
+ delete process.env.GG_TEST_HOME;
28
+ });
29
+ describe("mcp store", () => {
30
+ it("round-trips an http server in global scope", async () => {
31
+ const res = await addServer({ name: "notion", url: "https://mcp.notion.com/mcp" }, "global", tmpProject);
32
+ expect(res.ok).toBe(true);
33
+ const servers = await loadServers(tmpProject);
34
+ expect(servers).toEqual([
35
+ { config: { name: "notion", url: "https://mcp.notion.com/mcp" }, scope: "global" },
36
+ ]);
37
+ // On-disk shape uses Claude's `type` field.
38
+ const raw = JSON.parse(await fs.readFile(globalMcpPath(), "utf-8"));
39
+ expect(raw.mcpServers.notion.type).toBe("http");
40
+ });
41
+ it("round-trips a stdio server with env in project scope", async () => {
42
+ await addServer({
43
+ name: "airtable",
44
+ command: "npx",
45
+ args: ["-y", "airtable-mcp-server"],
46
+ env: { AIRTABLE_API_KEY: "key" },
47
+ }, "project", tmpProject);
48
+ const servers = await loadServers(tmpProject);
49
+ expect(servers[0]).toEqual({
50
+ config: {
51
+ name: "airtable",
52
+ command: "npx",
53
+ args: ["-y", "airtable-mcp-server"],
54
+ env: { AIRTABLE_API_KEY: "key" },
55
+ },
56
+ scope: "project",
57
+ });
58
+ // Project file lives at ./.gg/mcp.json.
59
+ await fs.access(projectMcpPath(tmpProject));
60
+ });
61
+ it("project overrides global on name collision", async () => {
62
+ await addServer({ name: "dup", url: "https://global.example/mcp" }, "global", tmpProject);
63
+ await addServer({ name: "dup", url: "https://project.example/mcp" }, "project", tmpProject);
64
+ const servers = await loadServers(tmpProject);
65
+ expect(servers).toHaveLength(1);
66
+ expect(servers[0].scope).toBe("project");
67
+ expect(servers[0].config.url).toBe("https://project.example/mcp");
68
+ });
69
+ it("rejects duplicate name in the same scope unless overwrite", async () => {
70
+ await addServer({ name: "x", url: "https://a.example/mcp" }, "global", tmpProject);
71
+ const dup = await addServer({ name: "x", url: "https://b.example/mcp" }, "global", tmpProject);
72
+ expect(dup.ok).toBe(false);
73
+ const ow = await addServer({ name: "x", url: "https://b.example/mcp" }, "global", tmpProject, true);
74
+ expect(ow.ok).toBe(true);
75
+ const found = await getServer("x", tmpProject);
76
+ expect(found?.config.url).toBe("https://b.example/mcp");
77
+ });
78
+ it("removes a server", async () => {
79
+ await addServer({ name: "gone", url: "https://x.example/mcp" }, "global", tmpProject);
80
+ expect(await removeServer("gone", "global", tmpProject)).toBe(true);
81
+ expect(await removeServer("gone", "global", tmpProject)).toBe(false);
82
+ expect(await loadServers(tmpProject)).toEqual([]);
83
+ });
84
+ it("tolerates a malformed config file", async () => {
85
+ await fs.mkdir(path.dirname(globalMcpPath()), { recursive: true });
86
+ await fs.writeFile(globalMcpPath(), "{ not valid json", "utf-8");
87
+ expect(await loadServers(tmpProject)).toEqual([]);
88
+ });
89
+ it("parses Claude's .mcp.json type field for http and sse", () => {
90
+ expect(fromStoredEntry("n", { type: "http", url: "https://x/mcp" })).toEqual({
91
+ name: "n",
92
+ url: "https://x/mcp",
93
+ });
94
+ expect(fromStoredEntry("s", {
95
+ type: "sse",
96
+ url: "https://x/sse",
97
+ headers: { Authorization: "Bearer t" },
98
+ })).toEqual({ name: "s", url: "https://x/sse", headers: { Authorization: "Bearer t" } });
99
+ });
100
+ });
101
+ //# sourceMappingURL=store.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.test.js","sourceRoot":"","sources":["../../../src/core/mcp/store.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import type { MCPScope, MCPServerConfig } from "../core/mcp/index.js";
2
+ declare function gradientLine(text: string): string;
3
+ declare function bannerLines(version: string, subtitle: string): string[];
4
+ /** A server row joined with its live connection status. */
5
+ export interface McpServerRow {
6
+ config: MCPServerConfig;
7
+ scope: MCPScope;
8
+ ok: boolean;
9
+ toolCount: number;
10
+ error?: string;
11
+ }
12
+ export type McpDashboardAction = {
13
+ kind: "add";
14
+ } | {
15
+ kind: "remove";
16
+ name: string;
17
+ scope: MCPScope;
18
+ } | {
19
+ kind: "retry";
20
+ } | {
21
+ kind: "details";
22
+ name: string;
23
+ scope: MCPScope;
24
+ } | {
25
+ kind: "close";
26
+ };
27
+ declare function transportSummary(config: MCPServerConfig): string;
28
+ /**
29
+ * Render the interactive dashboard. Resolves with the chosen action so the
30
+ * flow controller in cli/mcp.ts can re-run connect + redraw afterwards.
31
+ */
32
+ export declare function renderMcpDashboard(options: {
33
+ version: string;
34
+ rows: McpServerRow[];
35
+ }): Promise<McpDashboardAction>;
36
+ export declare function renderScopeSelector(version: string, cwd: string): Promise<MCPScope | null>;
37
+ /** Read one line of input via readline (used for the paste prompt). */
38
+ export declare function promptLine(question: string): Promise<string>;
39
+ export interface BannerPromptOptions {
40
+ /** Subtitle shown under the logo. */
41
+ subtitle: string;
42
+ /** The input prompt label, e.g. "Command: ". */
43
+ question: string;
44
+ /** Hint text shown above the prompt (default: leave empty to go back). */
45
+ hint?: string;
46
+ }
47
+ /**
48
+ * Paint the MCP banner from the home position (same anchor as every other
49
+ * screen, so nothing drifts), then read one line. Returns null when the user
50
+ * submits an empty line (treated as "go back").
51
+ */
52
+ export declare function promptWithBanner(version: string, options: BannerPromptOptions): Promise<string | null>;
53
+ export declare const mcpColors: {
54
+ primary: string;
55
+ accent: string;
56
+ text: string;
57
+ dim: string;
58
+ good: string;
59
+ bad: string;
60
+ };
61
+ export { bannerLines, transportSummary, gradientLine };
62
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/ui/mcp.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAkCtE,iBAAS,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAY1C;AAED,iBAAS,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAWhE;AAED,2DAA2D;AAC3D,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE,QAAQ,CAAC;IAChB,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GACf;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,GACjB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtB,iBAAS,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAIzD;AA4ED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,YAAY,EAAE,CAAC;CACtB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAsE9B;AA6ED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAS1F;AAED,uEAAuE;AACvE,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQlE;AAED,MAAM,WAAW,mBAAmB;IAClC,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYxB;AAED,eAAO,MAAM,SAAS;;;;;;;CAOrB,CAAC;AAEF,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,YAAY,EAAE,CAAC"}
package/dist/ui/mcp.js ADDED
@@ -0,0 +1,302 @@
1
+ import readline from "node:readline/promises";
2
+ import chalk from "chalk";
3
+ const LOGO_LINES = [
4
+ " \u2584\u2580\u2580\u2580 \u2584\u2580\u2580\u2580",
5
+ " \u2588 \u2580\u2588 \u2588 \u2580\u2588",
6
+ " \u2580\u2584\u2584\u2580 \u2580\u2584\u2584\u2580",
7
+ ];
8
+ const GRADIENT = [
9
+ "#60a5fa",
10
+ "#6da1f9",
11
+ "#7a9df7",
12
+ "#8799f5",
13
+ "#9495f3",
14
+ "#a18ff1",
15
+ "#a78bfa",
16
+ "#a18ff1",
17
+ "#9495f3",
18
+ "#8799f5",
19
+ "#7a9df7",
20
+ "#6da1f9",
21
+ ];
22
+ const PRIMARY = "#60a5fa";
23
+ const ACCENT = "#a78bfa";
24
+ const TEXT = "#e2e8f0";
25
+ const TEXT_DIM = "#64748b";
26
+ const GOOD = "#4ade80";
27
+ const BAD = "#ef4444";
28
+ const GAP = " ";
29
+ // Every MCP screen paints from the home position after a full clear, so the
30
+ // banner sits at the same row no matter which screen you came from. Mixing
31
+ // save/restore-cursor with full-clear screens is what made the banner drift.
32
+ const CLEAR_HOME = "\x1b[2J\x1b[H";
33
+ function gradientLine(text) {
34
+ let result = "";
35
+ let colorIdx = 0;
36
+ for (const ch of text) {
37
+ if (ch === " ") {
38
+ result += ch;
39
+ }
40
+ else {
41
+ result += chalk.hex(GRADIENT[colorIdx % GRADIENT.length])(ch);
42
+ colorIdx++;
43
+ }
44
+ }
45
+ return result;
46
+ }
47
+ function bannerLines(version, subtitle) {
48
+ return [
49
+ gradientLine(LOGO_LINES[0]) +
50
+ GAP +
51
+ chalk.hex(PRIMARY).bold("GG Coder") +
52
+ chalk.hex(TEXT_DIM)(` v${version}`) +
53
+ chalk.hex(TEXT_DIM)(" · By ") +
54
+ chalk.hex(TEXT).bold("Ken Kai"),
55
+ gradientLine(LOGO_LINES[1]) + GAP + chalk.hex(ACCENT)("MCP Servers"),
56
+ gradientLine(LOGO_LINES[2]) + GAP + chalk.hex(TEXT_DIM)(subtitle),
57
+ ];
58
+ }
59
+ function transportSummary(config) {
60
+ if (config.url)
61
+ return config.url;
62
+ const parts = [config.command, ...(config.args ?? [])].filter(Boolean);
63
+ return parts.join(" ");
64
+ }
65
+ /** Render a `key label` hint with the key emphasized and the label dimmed. */
66
+ function keyHint(key, label) {
67
+ return chalk.hex(ACCENT).bold(key) + " " + chalk.hex(TEXT_DIM)(label);
68
+ }
69
+ function footerHints(hints) {
70
+ return " " + hints.map(([k, l]) => keyHint(k, l)).join(chalk.hex(TEXT_DIM)(" "));
71
+ }
72
+ /**
73
+ * Build the navigable list: every server row, then a trailing "add" row. The
74
+ * add row is index === rows.length so Enter on it triggers the add flow.
75
+ */
76
+ function renderDashboard(rows, selectedIndex, version) {
77
+ const lines = [];
78
+ lines.push(...bannerLines(version, "Manage your servers"));
79
+ lines.push("");
80
+ if (rows.length === 0) {
81
+ lines.push(chalk.hex(TEXT_DIM)(" No MCP servers configured yet."));
82
+ lines.push("");
83
+ }
84
+ for (let i = 0; i < rows.length; i++) {
85
+ const row = rows[i];
86
+ const selected = i === selectedIndex;
87
+ const marker = selected ? chalk.hex(PRIMARY)("❯ ") : " ";
88
+ const dot = row.ok ? "🟢" : "🔴";
89
+ const nameColor = selected ? PRIMARY : TEXT;
90
+ const meta = row.ok
91
+ ? chalk.hex(TEXT_DIM)(` · ${row.toolCount} tool${row.toolCount === 1 ? "" : "s"} · ${row.scope}`)
92
+ : chalk.hex(TEXT_DIM)(` · ${row.scope} · `) + chalk.hex(BAD)(shortError(row.error));
93
+ lines.push(`${marker}${dot} ` + chalk.hex(nameColor)(row.config.name) + meta);
94
+ }
95
+ // Trailing selectable "add" row.
96
+ const addIndex = rows.length;
97
+ const addSelected = selectedIndex === addIndex;
98
+ const addMarker = addSelected ? chalk.hex(PRIMARY)("❯ ") : " ";
99
+ const addColor = addSelected ? PRIMARY : GOOD;
100
+ lines.push(addMarker + chalk.hex(addColor)("➕ Add a new MCP server"));
101
+ lines.push("");
102
+ const hints = selectedIndex === addIndex
103
+ ? [
104
+ ["↑↓", "navigate"],
105
+ ["⏎", "add a server"],
106
+ ["esc", "close"],
107
+ ]
108
+ : [
109
+ ["↑↓", "navigate"],
110
+ ["⏎", "view details"],
111
+ ["d", "remove"],
112
+ ["r", "retry"],
113
+ ["esc", "close"],
114
+ ];
115
+ lines.push(footerHints(hints));
116
+ return lines.join("\n");
117
+ }
118
+ /** Paint a fully-built screen string from the home position. */
119
+ function paint(content) {
120
+ process.stdout.write(CLEAR_HOME + content + "\n");
121
+ }
122
+ function shortError(error) {
123
+ if (!error)
124
+ return "failed";
125
+ const oneLine = error.replace(/\s+/g, " ").trim();
126
+ return oneLine.length > 48 ? oneLine.slice(0, 47) + "…" : oneLine;
127
+ }
128
+ /**
129
+ * Render the interactive dashboard. Resolves with the chosen action so the
130
+ * flow controller in cli/mcp.ts can re-run connect + redraw afterwards.
131
+ */
132
+ export function renderMcpDashboard(options) {
133
+ const { version, rows } = options;
134
+ return new Promise((resolve) => {
135
+ let selectedIndex = 0;
136
+ const draw = () => paint(renderDashboard(rows, selectedIndex, version));
137
+ draw();
138
+ process.stdin.setRawMode(true);
139
+ process.stdin.resume();
140
+ const cleanup = () => {
141
+ process.stdin.removeListener("data", onData);
142
+ process.stdin.setRawMode(false);
143
+ process.stdin.pause();
144
+ process.stdout.write(CLEAR_HOME);
145
+ };
146
+ const finish = (action) => {
147
+ cleanup();
148
+ resolve(action);
149
+ };
150
+ // The trailing "add" row lives at index rows.length, so the last navigable
151
+ // index is rows.length (one past the server rows).
152
+ const addIndex = rows.length;
153
+ const onData = (chunk) => {
154
+ const key = chunk.toString();
155
+ const onAddRow = selectedIndex === addIndex;
156
+ if (key === "\x1b" || key === "\x03") {
157
+ finish({ kind: "close" });
158
+ return;
159
+ }
160
+ if (key === "a" || key === "A") {
161
+ finish({ kind: "add" });
162
+ return;
163
+ }
164
+ if (key === "r" || key === "R") {
165
+ finish({ kind: "retry" });
166
+ return;
167
+ }
168
+ if ((key === "d" || key === "D") && !onAddRow) {
169
+ const row = rows[selectedIndex];
170
+ finish({ kind: "remove", name: row.config.name, scope: row.scope });
171
+ return;
172
+ }
173
+ if (key === "\r" || key === "\n") {
174
+ if (onAddRow) {
175
+ finish({ kind: "add" });
176
+ }
177
+ else {
178
+ const row = rows[selectedIndex];
179
+ finish({ kind: "details", name: row.config.name, scope: row.scope });
180
+ }
181
+ return;
182
+ }
183
+ if (key === "\x1b[A" && selectedIndex > 0) {
184
+ selectedIndex--;
185
+ draw();
186
+ }
187
+ if (key === "\x1b[B" && selectedIndex < addIndex) {
188
+ selectedIndex++;
189
+ draw();
190
+ }
191
+ };
192
+ process.stdin.on("data", onData);
193
+ });
194
+ }
195
+ /** Generic single-select menu mirroring renderLoginSelector. */
196
+ function renderSelector(options) {
197
+ const { version, subtitle, items } = options;
198
+ return new Promise((resolve) => {
199
+ let selectedIndex = 0;
200
+ const screen = () => {
201
+ const lines = [];
202
+ lines.push(...bannerLines(version, subtitle));
203
+ lines.push("");
204
+ for (let i = 0; i < items.length; i++) {
205
+ const item = items[i];
206
+ const selected = i === selectedIndex;
207
+ const marker = selected ? chalk.hex(PRIMARY)("❯ ") : " ";
208
+ const labelColor = selected ? PRIMARY : TEXT;
209
+ lines.push(marker +
210
+ chalk.hex(labelColor)(item.label) +
211
+ (item.description ? chalk.hex(TEXT_DIM)(` — ${item.description}`) : ""));
212
+ }
213
+ lines.push("");
214
+ lines.push(footerHints([
215
+ ["↑↓", "navigate"],
216
+ ["⏎", "select"],
217
+ ["esc", "cancel"],
218
+ ]));
219
+ return lines.join("\n");
220
+ };
221
+ const draw = () => paint(screen());
222
+ draw();
223
+ process.stdin.setRawMode(true);
224
+ process.stdin.resume();
225
+ const cleanup = () => {
226
+ process.stdin.removeListener("data", onData);
227
+ process.stdin.setRawMode(false);
228
+ process.stdin.pause();
229
+ process.stdout.write(CLEAR_HOME);
230
+ };
231
+ const onData = (chunk) => {
232
+ const key = chunk.toString();
233
+ if (key === "\x1b" || key === "\x03") {
234
+ cleanup();
235
+ resolve(null);
236
+ return;
237
+ }
238
+ if (key === "\r" || key === "\n") {
239
+ cleanup();
240
+ resolve(items[selectedIndex].value);
241
+ return;
242
+ }
243
+ if (key === "\x1b[A" && selectedIndex > 0) {
244
+ selectedIndex--;
245
+ draw();
246
+ }
247
+ if (key === "\x1b[B" && selectedIndex < items.length - 1) {
248
+ selectedIndex++;
249
+ draw();
250
+ }
251
+ };
252
+ process.stdin.on("data", onData);
253
+ });
254
+ }
255
+ export function renderScopeSelector(version, cwd) {
256
+ return renderSelector({
257
+ version,
258
+ subtitle: "Choose a scope",
259
+ items: [
260
+ { label: "Global (all GG Coder sessions)", value: "global", description: "~/.gg/mcp.json" },
261
+ { label: `This project (${cwd})`, value: "project", description: "./.gg/mcp.json" },
262
+ ],
263
+ });
264
+ }
265
+ /** Read one line of input via readline (used for the paste prompt). */
266
+ export async function promptLine(question) {
267
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
268
+ try {
269
+ const answer = await rl.question(chalk.hex(PRIMARY)(question));
270
+ return answer.trim();
271
+ }
272
+ finally {
273
+ rl.close();
274
+ }
275
+ }
276
+ /**
277
+ * Paint the MCP banner from the home position (same anchor as every other
278
+ * screen, so nothing drifts), then read one line. Returns null when the user
279
+ * submits an empty line (treated as "go back").
280
+ */
281
+ export async function promptWithBanner(version, options) {
282
+ const { subtitle, question, hint } = options;
283
+ const lines = [
284
+ ...bannerLines(version, subtitle),
285
+ "",
286
+ chalk.hex(TEXT_DIM)(" " + (hint ?? "Leave empty and press Enter to go back.")),
287
+ "",
288
+ ];
289
+ process.stdout.write(CLEAR_HOME + lines.join("\n") + "\n");
290
+ const answer = (await promptLine(" " + question)).trim();
291
+ return answer === "" ? null : answer;
292
+ }
293
+ export const mcpColors = {
294
+ primary: PRIMARY,
295
+ accent: ACCENT,
296
+ text: TEXT,
297
+ dim: TEXT_DIM,
298
+ good: GOOD,
299
+ bad: BAD,
300
+ };
301
+ export { bannerLines, transportSummary, gradientLine };
302
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/ui/mcp.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=terminal-history-retry-dedup.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-history-retry-dedup.test.d.ts","sourceRoot":"","sources":["../../src/ui/terminal-history-retry-dedup.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,61 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { createTerminalHistoryPrinter } from "./terminal-history.js";
3
+ import { loadTheme } from "./theme/theme.js";
4
+ const context = {
5
+ theme: loadTheme("dark"),
6
+ columns: 80,
7
+ version: "0.0.0-test",
8
+ model: "test-model",
9
+ provider: "openai",
10
+ cwd: "/tmp/project",
11
+ };
12
+ function stripAnsi(value) {
13
+ const escape = String.fromCharCode(27);
14
+ return value.replace(new RegExp(`${escape}\\[[0-9;]*m`, "g"), "");
15
+ }
16
+ function count(value, needle) {
17
+ return value.split(needle).length - 1;
18
+ }
19
+ const PARAGRAPH = "No email tools — removed the open my email and reply example.";
20
+ describe("terminal history retry de-duplication", () => {
21
+ // Reproduces the reported bug: while streaming a large response, the agent
22
+ // loop hits a transient stall/overload and emits a `retry`. The stream
23
+ // restarts from scratch and re-emits the same leading paragraphs. The
24
+ // progressive mid-stream flush re-flushes those paragraphs with FRESH ids
25
+ // (because `flushedChars` resets when streamingText goes empty on retry).
26
+ // The printer dedupes by id only, so each re-flush prints the identical
27
+ // paragraph again — N retries => N+1 stacked copies in scrollback.
28
+ it("prints identical assistant text once even when re-flushed with new ids across retries", () => {
29
+ let output = "";
30
+ const printer = createTerminalHistoryPrinter();
31
+ const write = (data) => {
32
+ output += data;
33
+ };
34
+ // Initial stream flushes the paragraph (id from first attempt).
35
+ printer.print([{ kind: "assistant", text: PARAGRAPH, id: "ui-1" }], context, { write });
36
+ // Retry 1 + Retry 2: provider re-streams the SAME paragraph; the
37
+ // progressive-flush effect emits it again with new ids each time.
38
+ printer.print([{ kind: "assistant", text: PARAGRAPH, id: "ui-2" }], context, { write });
39
+ printer.print([{ kind: "assistant", text: PARAGRAPH, id: "ui-3" }], context, { write });
40
+ // Final successful turn flushes the whole response (yet another id).
41
+ printer.print([{ kind: "assistant", text: PARAGRAPH, id: "ui-4" }], context, { write });
42
+ const scrollback = stripAnsi(output);
43
+ expect(count(scrollback, PARAGRAPH)).toBe(1);
44
+ });
45
+ it("still prints genuinely distinct assistant paragraphs", () => {
46
+ let output = "";
47
+ const printer = createTerminalHistoryPrinter();
48
+ const write = (data) => {
49
+ output += data;
50
+ };
51
+ const items = [
52
+ { kind: "assistant", text: "First paragraph of the answer.", id: "ui-1" },
53
+ { kind: "assistant", text: "Second distinct paragraph.", id: "ui-2" },
54
+ ];
55
+ printer.print(items, context, { write });
56
+ const scrollback = stripAnsi(output);
57
+ expect(count(scrollback, "First paragraph of the answer.")).toBe(1);
58
+ expect(count(scrollback, "Second distinct paragraph.")).toBe(1);
59
+ });
60
+ });
61
+ //# sourceMappingURL=terminal-history-retry-dedup.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-history-retry-dedup.test.js","sourceRoot":"","sources":["../../src/ui/terminal-history-retry-dedup.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"terminal-history.d.ts","sourceRoot":"","sources":["../../src/ui/terminal-history.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAK9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AA0F9C,MAAM,WAAW,sBAAsB;IACrC,KAAK,CACH,KAAK,EAAE,SAAS,aAAa,EAAE,EAC/B,OAAO,EAAE,sBAAsB,EAC/B,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,GAC5D,IAAI,CAAC;IACR,KAAK,IAAI,IAAI,CAAC;IACd,YAAY,IAAI,IAAI,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,6BAA6B;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;CAC7B;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,4BAA4B,CAAC,EAC3C,MAAuB,GACxB,GAAE,6BAAkC,GAAG,sBAAsB,CAmF7D;AAED,wBAAgB,uCAAuC,CACrD,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,sBAAsB,GAC9B,MAAM,CAmIR"}
1
+ {"version":3,"file":"terminal-history.d.ts","sourceRoot":"","sources":["../../src/ui/terminal-history.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAK9C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AA0F9C,MAAM,WAAW,sBAAsB;IACrC,KAAK,CACH,KAAK,EAAE,SAAS,aAAa,EAAE,EAC/B,OAAO,EAAE,sBAAsB,EAC/B,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,GAC5D,IAAI,CAAC;IACR,KAAK,IAAI,IAAI,CAAC;IACd,YAAY,IAAI,IAAI,CAAC;IACrB,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,6BAA6B;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,CAAC;CAC7B;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,KAAK,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb;AASD,wBAAgB,4BAA4B,CAAC,EAC3C,MAAuB,GACxB,GAAE,6BAAkC,GAAG,sBAAsB,CAiH7D;AAED,wBAAgB,uCAAuC,CACrD,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,sBAAsB,GAC9B,MAAM,CAmIR"}