@kenkaiiii/ggcoder 4.3.199 → 4.3.200

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 (73) hide show
  1. package/package.json +6 -5
  2. package/dist/core/bridge-client.d.ts +0 -31
  3. package/dist/core/bridge-client.d.ts.map +0 -1
  4. package/dist/core/bridge-client.js +0 -124
  5. package/dist/core/bridge-client.js.map +0 -1
  6. package/dist/core/bridge-config.d.ts +0 -8
  7. package/dist/core/bridge-config.d.ts.map +0 -1
  8. package/dist/core/bridge-config.js +0 -52
  9. package/dist/core/bridge-config.js.map +0 -1
  10. package/dist/core/bridge-protocol.d.ts +0 -76
  11. package/dist/core/bridge-protocol.d.ts.map +0 -1
  12. package/dist/core/bridge-protocol.js +0 -30
  13. package/dist/core/bridge-protocol.js.map +0 -1
  14. package/dist/core/oauth/gemini.d.ts +0 -4
  15. package/dist/core/oauth/gemini.d.ts.map +0 -1
  16. package/dist/core/oauth/gemini.js +0 -293
  17. package/dist/core/oauth/gemini.js.map +0 -1
  18. package/dist/core/socket-server.d.ts +0 -15
  19. package/dist/core/socket-server.d.ts.map +0 -1
  20. package/dist/core/socket-server.js +0 -140
  21. package/dist/core/socket-server.js.map +0 -1
  22. package/dist/modes/bridge-mode.d.ts +0 -22
  23. package/dist/modes/bridge-mode.d.ts.map +0 -1
  24. package/dist/modes/bridge-mode.js +0 -281
  25. package/dist/modes/bridge-mode.js.map +0 -1
  26. package/dist/ui/buddy/Buddy.d.ts +0 -15
  27. package/dist/ui/buddy/Buddy.d.ts.map +0 -1
  28. package/dist/ui/buddy/Buddy.js +0 -118
  29. package/dist/ui/buddy/Buddy.js.map +0 -1
  30. package/dist/ui/buddy/gacha.d.ts +0 -8
  31. package/dist/ui/buddy/gacha.d.ts.map +0 -1
  32. package/dist/ui/buddy/gacha.js +0 -94
  33. package/dist/ui/buddy/gacha.js.map +0 -1
  34. package/dist/ui/buddy/species.d.ts +0 -52
  35. package/dist/ui/buddy/species.d.ts.map +0 -1
  36. package/dist/ui/buddy/species.js +0 -257
  37. package/dist/ui/buddy/species.js.map +0 -1
  38. package/dist/ui/components/ScrollableContent.d.ts +0 -22
  39. package/dist/ui/components/ScrollableContent.d.ts.map +0 -1
  40. package/dist/ui/components/ScrollableContent.js +0 -44
  41. package/dist/ui/components/ScrollableContent.js.map +0 -1
  42. package/dist/ui/components/ShimmerLine.d.ts +0 -6
  43. package/dist/ui/components/ShimmerLine.d.ts.map +0 -1
  44. package/dist/ui/components/ShimmerLine.js +0 -46
  45. package/dist/ui/components/ShimmerLine.js.map +0 -1
  46. package/dist/ui/components/SplashScreen.d.ts +0 -7
  47. package/dist/ui/components/SplashScreen.d.ts.map +0 -1
  48. package/dist/ui/components/SplashScreen.js +0 -113
  49. package/dist/ui/components/SplashScreen.js.map +0 -1
  50. package/dist/ui/components/ThinkingIndicator.d.ts +0 -6
  51. package/dist/ui/components/ThinkingIndicator.d.ts.map +0 -1
  52. package/dist/ui/components/ThinkingIndicator.js +0 -145
  53. package/dist/ui/components/ThinkingIndicator.js.map +0 -1
  54. package/dist/ui/hooks/useMouseScroll.d.ts.map +0 -1
  55. package/dist/ui/hooks/useMouseScroll.js.map +0 -1
  56. package/dist/ui/hooks/useScrollViewport.d.ts +0 -25
  57. package/dist/ui/hooks/useScrollViewport.d.ts.map +0 -1
  58. package/dist/ui/hooks/useScrollViewport.js +0 -32
  59. package/dist/ui/hooks/useScrollViewport.js.map +0 -1
  60. package/dist/ui/utils/item-heights.d.ts +0 -17
  61. package/dist/ui/utils/item-heights.d.ts.map +0 -1
  62. package/dist/ui/utils/item-heights.js +0 -73
  63. package/dist/ui/utils/item-heights.js.map +0 -1
  64. package/dist/ui/utils/scroll-pause.d.ts +0 -13
  65. package/dist/ui/utils/scroll-pause.d.ts.map +0 -1
  66. package/dist/ui/utils/sync-output.d.ts +0 -16
  67. package/dist/ui/utils/sync-output.d.ts.map +0 -1
  68. package/dist/ui/utils/sync-output.js +0 -70
  69. package/dist/ui/utils/sync-output.js.map +0 -1
  70. package/dist/utils/markdown.d.ts +0 -6
  71. package/dist/utils/markdown.d.ts.map +0 -1
  72. package/dist/utils/markdown.js +0 -25
  73. package/dist/utils/markdown.js.map +0 -1
@@ -1,281 +0,0 @@
1
- import path from "node:path";
2
- import crypto from "node:crypto";
3
- import { isAbortError } from "@kenkaiiii/gg-agent";
4
- import chalk from "chalk";
5
- import { AgentSession } from "../core/agent-session.js";
6
- import { BridgeClient } from "../core/bridge-client.js";
7
- import { MessageType } from "../core/bridge-protocol.js";
8
- import { formatUserError } from "../utils/error-handler.js";
9
- import { log, closeLogger } from "../core/logger.js";
10
- /**
11
- * Bridge mode: run ggcoder as an Agent Home agent.
12
- *
13
- * Connects to the relay server via WebSocket and registers the current
14
- * project directory as an agent. Messages from the iOS app are forwarded
15
- * here, processed by AgentSession, and streamed back.
16
- */
17
- export async function runBridgeMode(options) {
18
- const agentId = crypto.createHash("sha256").update(options.cwd).digest("hex").slice(0, 16);
19
- const agentName = options.agentName ?? path.basename(options.cwd);
20
- const client = new BridgeClient(options.bridge.relayUrl, options.bridge.token);
21
- client.setAgentIds([agentId]);
22
- let session = null;
23
- const ac = new AbortController();
24
- let isProcessing = false;
25
- let textBuffer = "";
26
- let currentMessageId = "";
27
- const activeTools = new Map();
28
- // ── Session lifecycle ──────────────────────────────────
29
- async function getOrCreateSession() {
30
- if (session)
31
- return session;
32
- session = new AgentSession({
33
- provider: options.provider,
34
- model: options.model,
35
- cwd: options.cwd,
36
- thinkingLevel: options.thinkingLevel,
37
- signal: ac.signal,
38
- });
39
- await session.initialize();
40
- wireSessionEvents();
41
- log("INFO", "bridge", `Session initialized`, { cwd: options.cwd });
42
- return session;
43
- }
44
- // ── Agent → Relay bridge ───────────────────────────────
45
- function wireSessionEvents() {
46
- if (!session)
47
- return;
48
- session.eventBus.on("text_delta", ({ text }) => {
49
- textBuffer += text;
50
- // Stream tokens to relay
51
- client.send({
52
- id: BridgeClient.newId(),
53
- type: MessageType.CHAT_STREAM,
54
- timestamp: Date.now(),
55
- agentId,
56
- token: text,
57
- messageId: currentMessageId,
58
- });
59
- });
60
- session.eventBus.on("tool_call_start", ({ toolCallId, name, args }) => {
61
- activeTools.set(toolCallId, { name, startTime: Date.now(), args });
62
- const argsStr = formatArgs(args);
63
- const token = `\n🔧 \`${name}\` ${argsStr}\n`;
64
- client.send({
65
- id: BridgeClient.newId(),
66
- type: MessageType.CHAT_STREAM,
67
- timestamp: Date.now(),
68
- agentId,
69
- token,
70
- messageId: currentMessageId,
71
- });
72
- });
73
- session.eventBus.on("tool_call_end", ({ toolCallId, isError, durationMs }) => {
74
- const tool = activeTools.get(toolCallId);
75
- activeTools.delete(toolCallId);
76
- if (tool) {
77
- const icon = isError ? "✗" : "✓";
78
- const token = `${icon} \`${tool.name}\` ${formatDuration(durationMs)}\n`;
79
- client.send({
80
- id: BridgeClient.newId(),
81
- type: MessageType.CHAT_STREAM,
82
- timestamp: Date.now(),
83
- agentId,
84
- token,
85
- messageId: currentMessageId,
86
- });
87
- }
88
- });
89
- session.eventBus.on("agent_done", () => {
90
- const content = textBuffer.trim();
91
- client.send({
92
- id: BridgeClient.newId(),
93
- type: MessageType.CHAT_STREAM_END,
94
- timestamp: Date.now(),
95
- agentId,
96
- messageId: currentMessageId,
97
- content,
98
- });
99
- textBuffer = "";
100
- isProcessing = false;
101
- currentMessageId = "";
102
- log("INFO", "bridge", `Agent done`);
103
- });
104
- session.eventBus.on("error", ({ error }) => {
105
- const content = textBuffer.trim() + `\n\n✗ Error: ${error.message}`;
106
- client.send({
107
- id: BridgeClient.newId(),
108
- type: MessageType.CHAT_STREAM_END,
109
- timestamp: Date.now(),
110
- agentId,
111
- messageId: currentMessageId,
112
- content,
113
- });
114
- textBuffer = "";
115
- isProcessing = false;
116
- currentMessageId = "";
117
- });
118
- session.eventBus.on("compaction_end", ({ originalCount, newCount }) => {
119
- const token = `\n✓ Compacted — ${originalCount} → ${newCount} messages\n`;
120
- client.send({
121
- id: BridgeClient.newId(),
122
- type: MessageType.CHAT_STREAM,
123
- timestamp: Date.now(),
124
- agentId,
125
- token,
126
- messageId: currentMessageId,
127
- });
128
- });
129
- }
130
- // ── Handle incoming messages ───────────────────────────
131
- client.on(MessageType.CHAT_FORWARD, async (msg) => {
132
- const forward = msg;
133
- if (forward.agentId !== agentId)
134
- return;
135
- if (isProcessing) {
136
- client.send({
137
- id: BridgeClient.newId(),
138
- type: MessageType.CHAT_STREAM_END,
139
- timestamp: Date.now(),
140
- agentId,
141
- messageId: BridgeClient.newId(),
142
- content: "Agent is busy processing a previous message. Please wait.",
143
- });
144
- return;
145
- }
146
- isProcessing = true;
147
- textBuffer = "";
148
- activeTools.clear();
149
- currentMessageId = BridgeClient.newId();
150
- console.log(chalk.hex("#60a5fa")(` ← ${forward.content.slice(0, 80)}${forward.content.length > 80 ? "..." : ""}`));
151
- try {
152
- const s = await getOrCreateSession();
153
- await s.prompt(forward.content);
154
- }
155
- catch (err) {
156
- if (!isAbortError(err)) {
157
- const content = `Error: ${formatUserError(err)}`;
158
- client.send({
159
- id: BridgeClient.newId(),
160
- type: MessageType.CHAT_STREAM_END,
161
- timestamp: Date.now(),
162
- agentId,
163
- messageId: currentMessageId,
164
- content,
165
- });
166
- }
167
- isProcessing = false;
168
- currentMessageId = "";
169
- }
170
- });
171
- // ── Connect and register ───────────────────────────────
172
- client.onConnect(() => {
173
- client.send({
174
- id: BridgeClient.newId(),
175
- type: MessageType.AGENT_REGISTER,
176
- timestamp: Date.now(),
177
- agent: {
178
- id: agentId,
179
- name: agentName,
180
- description: `GG Coder agent — ${options.cwd}`,
181
- capabilities: ["chat"],
182
- },
183
- });
184
- console.log(chalk.hex("#4ade80")(" Connected to relay"));
185
- console.log(chalk.hex("#6b7280")(` Agent registered: ${agentName} (${agentId})`));
186
- });
187
- client.onDisconnect(() => {
188
- console.log(chalk.hex("#f59e0b")(" Disconnected from relay — reconnecting..."));
189
- });
190
- // ── Display banner ─────────────────────────────────────
191
- process.stdout.write("\x1b[2J\x1b[3J\x1b[H");
192
- const LOGO = [
193
- " \u2584\u2580\u2580\u2580 \u2584\u2580\u2580\u2580",
194
- " \u2588 \u2580\u2588 \u2588 \u2580\u2588",
195
- " \u2580\u2584\u2584\u2580 \u2580\u2584\u2584\u2580",
196
- ];
197
- const GRADIENT = [
198
- "#60a5fa",
199
- "#6da1f9",
200
- "#7a9df7",
201
- "#8799f5",
202
- "#9495f3",
203
- "#a18ff1",
204
- "#a78bfa",
205
- "#a18ff1",
206
- "#9495f3",
207
- "#8799f5",
208
- "#7a9df7",
209
- "#6da1f9",
210
- ];
211
- function gradientText(text) {
212
- let colorIdx = 0;
213
- return text
214
- .split("")
215
- .map((ch) => {
216
- if (ch === " ")
217
- return ch;
218
- const color = GRADIENT[colorIdx++ % GRADIENT.length];
219
- return chalk.hex(color)(ch);
220
- })
221
- .join("");
222
- }
223
- const home = process.env.HOME ?? "";
224
- const displayPath = home && options.cwd.startsWith(home) ? "~" + options.cwd.slice(home.length) : options.cwd;
225
- const GAP = " ";
226
- console.log();
227
- console.log(` ${gradientText(LOGO[0])}${GAP}` +
228
- chalk.hex("#60a5fa").bold("GG Coder") +
229
- chalk.hex("#6b7280")(` v${options.version}`) +
230
- chalk.hex("#6b7280")(" · By ") +
231
- chalk.white.bold("Ken Kai"));
232
- console.log(` ${gradientText(LOGO[1])}${GAP}` + chalk.hex("#a78bfa")(agentName));
233
- console.log(` ${gradientText(LOGO[2])}${GAP}` + chalk.hex("#6b7280")(displayPath));
234
- console.log();
235
- console.log(chalk.hex("#6b7280")(" Mode ") +
236
- chalk.hex("#a78bfa")("Agent Home Bridge") +
237
- chalk.hex("#6b7280")(" · Agent ") +
238
- chalk.white(agentName));
239
- console.log();
240
- console.log(chalk.hex("#6b7280")(" Connecting to relay..."));
241
- console.log();
242
- // ── Start connection ───────────────────────────────────
243
- client.connect();
244
- // ── Graceful shutdown ──────────────────────────────────
245
- const shutdown = async () => {
246
- console.log("\nShutting down...");
247
- client.send({
248
- id: BridgeClient.newId(),
249
- type: MessageType.AGENT_UNREGISTER,
250
- timestamp: Date.now(),
251
- agentId,
252
- });
253
- client.disconnect();
254
- if (session) {
255
- ac.abort();
256
- await session.dispose();
257
- }
258
- closeLogger();
259
- process.exit(0);
260
- };
261
- process.on("SIGINT", shutdown);
262
- process.on("SIGTERM", shutdown);
263
- // Keep the process alive
264
- await new Promise(() => { });
265
- }
266
- // ── Helpers ───────────────────────────────────────────────
267
- function formatArgs(args) {
268
- const entries = Object.entries(args);
269
- if (entries.length === 0)
270
- return "";
271
- const [_key, value] = entries[0];
272
- const str = typeof value === "string" ? value : JSON.stringify(value);
273
- const truncated = str.length > 60 ? str.slice(0, 57) + "..." : str;
274
- return `\`${truncated}\``;
275
- }
276
- function formatDuration(ms) {
277
- if (ms < 1000)
278
- return `${ms}ms`;
279
- return `${(ms / 1000).toFixed(1)}s`;
280
- }
281
- //# sourceMappingURL=bridge-mode.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bridge-mode.js","sourceRoot":"","sources":["../../src/modes/bridge-mode.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- import type { ActivityPhase } from "../hooks/useAgentLoop.js";
2
- interface BuddyProps {
3
- phase?: ActivityPhase;
4
- /** Speech bubble text to display. */
5
- reaction?: string;
6
- /** Timestamp of last /buddy pet command. */
7
- petAt?: number;
8
- /** Callback to clear reaction after display. */
9
- onReactionDone?: () => void;
10
- }
11
- export declare function Buddy({ phase, reaction, petAt, onReactionDone }: BuddyProps): import("react/jsx-runtime").JSX.Element;
12
- /** How many columns the buddy sprite area reserves. */
13
- export declare function companionReservedColumns(): number;
14
- export {};
15
- //# sourceMappingURL=Buddy.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Buddy.d.ts","sourceRoot":"","sources":["../../../src/ui/buddy/Buddy.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAgF9D,UAAU,UAAU;IAClB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;CAC7B;AAED,wBAAgB,KAAK,CAAC,EAAE,KAAc,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE,UAAU,2CA2GpF;AAED,uDAAuD;AACvD,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD"}
@@ -1,118 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import React, { useState, useEffect, useMemo, useRef } from "react";
3
- import { Text, Box } from "ink";
4
- import { getPlayerBuddy } from "./gacha.js";
5
- import { renderSprite, renderBlink, renderFace, spriteFrameCount, RARITY_THEME_KEYS, RARITY_STARS, } from "./species.js";
6
- import { useTheme } from "../theme/theme.js";
7
- import { useAnimationTick, useAnimationActive, deriveFrame, useReducedMotion, } from "../components/AnimationContext.js";
8
- import { useTerminalSize } from "../hooks/useTerminalSize.js";
9
- // ── Constants (matching Claude Code) ─────────────────────────
10
- const TICK_MS = 500;
11
- const IDLE_SEQUENCE = [0, 0, 0, 0, 1, 0, 0, 0, -1, 0, 0, 2, 0, 0, 0];
12
- const MIN_COLS_FOR_FULL_SPRITE = 100;
13
- const BUBBLE_SHOW = 20; // ticks (~10s)
14
- const FADE_WINDOW = 6; // ticks (~3s fade before dismiss)
15
- const PET_BURST_MS = 2500;
16
- const PET_HEARTS = [
17
- " \u2665 \u2665 ",
18
- " \u2665 \u2665 \u2665 ",
19
- " \u2665 \u2665 \u2665 ",
20
- " \u2665 \u2665 \u2665 ",
21
- " \u2665 \u2665 ",
22
- ];
23
- // ── Speech Bubble ────────────────────────────────────────────
24
- function SpeechBubble({ text, color, fading }) {
25
- // Wrap to 30 chars max
26
- const maxWidth = 30;
27
- const words = text.split(" ");
28
- const lines = [];
29
- let current = "";
30
- for (const word of words) {
31
- if (current.length + word.length + 1 > maxWidth && current.length > 0) {
32
- lines.push(current);
33
- current = word;
34
- }
35
- else {
36
- current = current ? `${current} ${word}` : word;
37
- }
38
- }
39
- if (current)
40
- lines.push(current);
41
- const width = Math.max(...lines.map((l) => l.length), 1);
42
- const top = "\u256D" + "\u2500".repeat(width + 2) + "\u256E";
43
- const bottom = "\u2570" + "\u2500".repeat(width + 2) + "\u256F";
44
- return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { color: color, dimColor: fading, children: top }), lines.map((line, i) => (_jsxs(Text, { color: color, dimColor: fading, children: ["\u2502 ", line.padEnd(width), " \u2502"] }, i))), _jsx(Text, { color: color, dimColor: fading, children: bottom }), _jsx(Text, { color: color, dimColor: fading, children: " \\" })] }));
45
- }
46
- // ── Resolve rarity color from theme ──────────────────────────
47
- function getRarityColor(rarity, theme) {
48
- const key = RARITY_THEME_KEYS[rarity] ?? "textDim";
49
- return theme[key] ?? theme.textDim;
50
- }
51
- export function Buddy({ phase = "idle", reaction, petAt, onReactionDone }) {
52
- const theme = useTheme();
53
- const reducedMotion = useReducedMotion();
54
- const { columns } = useTerminalSize();
55
- useAnimationActive();
56
- const tick = useAnimationTick();
57
- const buddy = useMemo(() => getPlayerBuddy(), []);
58
- const color = getRarityColor(buddy.rarity, theme);
59
- const shinyColor = "#fef08a";
60
- const displayColor = buddy.isShiny ? shinyColor : color;
61
- // ── Speech bubble state ──────────────────────────────────
62
- const [bubbleText, setBubbleText] = useState(null);
63
- const bubbleTickRef = useRef(0);
64
- const lastReactionRef = useRef(undefined);
65
- useEffect(() => {
66
- if (reaction && reaction !== lastReactionRef.current) {
67
- lastReactionRef.current = reaction;
68
- setBubbleText(reaction);
69
- bubbleTickRef.current = 0;
70
- }
71
- }, [reaction]);
72
- // Advance bubble timer
73
- useEffect(() => {
74
- if (!bubbleText)
75
- return;
76
- bubbleTickRef.current++;
77
- if (bubbleTickRef.current >= BUBBLE_SHOW) {
78
- setBubbleText(null);
79
- onReactionDone?.();
80
- }
81
- }, [tick, bubbleText, onReactionDone]);
82
- const bubbleFading = bubbleText ? bubbleTickRef.current >= BUBBLE_SHOW - FADE_WINDOW : false;
83
- // ── Pet hearts state ─────────────────────────────────────
84
- const showHearts = petAt ? Date.now() - petAt < PET_BURST_MS : false;
85
- const heartFrame = showHearts ? deriveFrame(tick, TICK_MS, PET_HEARTS.length) : -1;
86
- // ── Animation ────────────────────────────────────────────
87
- const seqIdx = deriveFrame(tick, TICK_MS, IDLE_SEQUENCE.length);
88
- const seqValue = IDLE_SEQUENCE[seqIdx];
89
- const frameCount = spriteFrameCount(buddy.species);
90
- const isActive = phase !== "idle";
91
- let spriteLines;
92
- if (reducedMotion) {
93
- spriteLines = renderSprite(buddy, 0);
94
- }
95
- else if (showHearts || isActive) {
96
- // Cycle all frames fast when petting or active
97
- spriteLines = renderSprite(buddy, tick % frameCount);
98
- }
99
- else if (seqValue === -1) {
100
- spriteLines = renderBlink(buddy);
101
- }
102
- else {
103
- spriteLines = renderSprite(buddy, seqValue);
104
- }
105
- // ── Narrow mode ──────────────────────────────────────────
106
- if (columns < MIN_COLS_FOR_FULL_SPRITE) {
107
- const face = renderFace(buddy);
108
- const stars = RARITY_STARS[buddy.rarity];
109
- return (_jsxs(Box, { children: [_jsxs(Text, { color: displayColor, children: [face, " ", buddy.species] }), _jsxs(Text, { color: displayColor, dimColor: true, children: [" ", stars, buddy.isShiny ? " \u2726" : ""] }), bubbleText && (_jsxs(Text, { color: displayColor, dimColor: bubbleFading, children: [' "', bubbleText.length > 24 ? bubbleText.slice(0, 21) + "..." : bubbleText, '"'] }))] }));
110
- }
111
- // ── Wide mode: full sprite ───────────────────────────────
112
- return (_jsxs(Box, { flexDirection: "row", gap: 1, children: [_jsxs(Box, { flexDirection: "column", children: [showHearts && heartFrame >= 0 && _jsx(Text, { color: "#f87171", children: PET_HEARTS[heartFrame] }), spriteLines.map((line, i) => (_jsx(Text, { color: displayColor, children: line }, i))), _jsxs(Text, { color: displayColor, dimColor: true, children: [buddy.species, buddy.isShiny ? " \u2726" : ""] })] }), bubbleText && (_jsx(Box, { children: _jsx(SpeechBubble, { text: bubbleText, color: displayColor, fading: bubbleFading }) }))] }));
113
- }
114
- /** How many columns the buddy sprite area reserves. */
115
- export function companionReservedColumns() {
116
- return 14; // 12 char sprite + 2 gap
117
- }
118
- //# sourceMappingURL=Buddy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Buddy.js","sourceRoot":"","sources":["../../../src/ui/buddy/Buddy.tsx"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- import { type CompanionBones } from "./species.js";
2
- /**
3
- * Get the user's deterministic buddy companion.
4
- * Same machine always gets the same species, eyes, hat, stats.
5
- * Result is cached for hot paths (500ms sprite tick).
6
- */
7
- export declare function getPlayerBuddy(): CompanionBones;
8
- //# sourceMappingURL=gacha.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gacha.d.ts","sourceRoot":"","sources":["../../../src/ui/buddy/gacha.ts"],"names":[],"mappings":"AACA,OAAO,EAML,KAAK,cAAc,EAIpB,MAAM,cAAc,CAAC;AAiFtB;;;;GAIG;AACH,wBAAgB,cAAc,IAAI,cAAc,CAoB/C"}
@@ -1,94 +0,0 @@
1
- import { hostname, userInfo, homedir } from "node:os";
2
- import { ALL_SPECIES, SPECIES_RARITY, RARITY_WEIGHTS, RARITY_STAT_FLOORS, EYE_STYLES, } from "./species.js";
3
- // ── FNV-1a hash ──────────────────────────────────────────────
4
- function fnv1a(str) {
5
- let hash = 0x811c9dc5;
6
- for (let i = 0; i < str.length; i++) {
7
- hash ^= str.charCodeAt(i);
8
- hash = Math.imul(hash, 0x01000193);
9
- }
10
- return hash >>> 0;
11
- }
12
- // ── Mulberry32 PRNG ──────────────────────────────────────────
13
- function mulberry32(seed) {
14
- let s = seed | 0;
15
- return () => {
16
- s = (s + 0x6d2b79f5) | 0;
17
- let t = Math.imul(s ^ (s >>> 15), 1 | s);
18
- t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
19
- return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
20
- };
21
- }
22
- // ── Seed ─────────────────────────────────────────────────────
23
- function getUserSeed() {
24
- const identity = `${hostname()}:${userInfo().username}:${homedir()}:friend-2026-401`;
25
- return fnv1a(identity);
26
- }
27
- // ── Roll helpers ─────────────────────────────────────────────
28
- function rollRarity(rand) {
29
- const roll = rand * 100;
30
- let cumulative = 0;
31
- for (const [rarity, weight] of RARITY_WEIGHTS) {
32
- cumulative += weight;
33
- if (roll < cumulative)
34
- return rarity;
35
- }
36
- return "common";
37
- }
38
- function rollStats(rng, rarity) {
39
- const floor = RARITY_STAT_FLOORS[rarity];
40
- const keys = ["debugging", "patience", "chaos", "wisdom", "snark"];
41
- const peakIdx = Math.floor(rng() * keys.length);
42
- let dumpIdx = Math.floor(rng() * keys.length);
43
- while (dumpIdx === peakIdx)
44
- dumpIdx = Math.floor(rng() * keys.length);
45
- const stats = { debugging: 0, patience: 0, chaos: 0, wisdom: 0, snark: 0 };
46
- for (let i = 0; i < keys.length; i++) {
47
- const key = keys[i];
48
- if (i === peakIdx) {
49
- stats[key] = Math.min(100, 50 + Math.floor(rng() * 30) + floor);
50
- }
51
- else if (i === dumpIdx) {
52
- stats[key] = Math.max(1, -10 + Math.floor(rng() * 15) + floor);
53
- }
54
- else {
55
- stats[key] = floor + Math.floor(rng() * 40);
56
- }
57
- }
58
- return stats;
59
- }
60
- // ── Main roll (cached) ───────────────────────────────────────
61
- const HATS = [
62
- "none",
63
- "crown",
64
- "tophat",
65
- "propeller",
66
- "halo",
67
- "wizard",
68
- "beanie",
69
- "tinyduck",
70
- ];
71
- let rollCache = null;
72
- /**
73
- * Get the user's deterministic buddy companion.
74
- * Same machine always gets the same species, eyes, hat, stats.
75
- * Result is cached for hot paths (500ms sprite tick).
76
- */
77
- export function getPlayerBuddy() {
78
- if (rollCache)
79
- return rollCache;
80
- const seed = getUserSeed();
81
- const rng = mulberry32(seed);
82
- const rarity = rollRarity(rng());
83
- // Pick species from this rarity tier
84
- const candidates = ALL_SPECIES.filter((s) => SPECIES_RARITY[s] === rarity);
85
- const speciesIdx = Math.floor(rng() * candidates.length);
86
- const species = candidates[speciesIdx];
87
- const eyes = EYE_STYLES[Math.floor(rng() * EYE_STYLES.length)];
88
- const hat = rarity === "common" ? "none" : HATS[Math.floor(rng() * HATS.length)];
89
- const stats = rollStats(rng, rarity);
90
- const isShiny = rng() < 0.01;
91
- rollCache = { species, eyes, hat, stats, isShiny, rarity };
92
- return rollCache;
93
- }
94
- //# sourceMappingURL=gacha.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gacha.js","sourceRoot":"","sources":["../../../src/ui/buddy/gacha.ts"],"names":[],"mappings":"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"}
@@ -1,52 +0,0 @@
1
- /**
2
- * Buddy companion species definitions.
3
- *
4
- * Each species has ASCII art frames (5 lines tall, 12 chars wide),
5
- * eye placeholder {E} for expression variants, and a rarity tier.
6
- * Matches Claude Code's buddy system architecture.
7
- *
8
- * Line 0 is the hat slot — left blank so hats can overlay it.
9
- * {E} is replaced with the companion's eye character at render time.
10
- * Blink replaces {E} with "-" rather than using separate frames.
11
- */
12
- export type Rarity = "common" | "uncommon" | "rare" | "epic" | "legendary";
13
- export type EyeStyle = "\u00B7" | "\u2726" | "\u00D7" | "\u25C9" | "@" | "\u00B0";
14
- export type Hat = "none" | "crown" | "tophat" | "propeller" | "halo" | "wizard" | "beanie" | "tinyduck";
15
- export type Species = "duck" | "goose" | "blob" | "cat" | "dragon" | "octopus" | "owl" | "penguin" | "turtle" | "snail" | "ghost" | "axolotl" | "capybara" | "cactus" | "robot" | "rabbit" | "mushroom" | "chonk" | "phoenix";
16
- /** Hat art for line 0 (replaces blank first line when hat present). */
17
- export declare const HAT_LINES: Record<Hat, string>;
18
- export interface CompanionStats {
19
- debugging: number;
20
- patience: number;
21
- chaos: number;
22
- wisdom: number;
23
- snark: number;
24
- }
25
- export declare const RARITY_WEIGHTS: [Rarity, number][];
26
- export declare const RARITY_STAT_FLOORS: Record<Rarity, number>;
27
- export declare const RARITY_STARS: Record<Rarity, string>;
28
- export declare const RARITY_THEME_KEYS: Record<Rarity, string>;
29
- export declare const BODIES: Record<Species, string[][]>;
30
- /** All species names. */
31
- export declare const ALL_SPECIES: Species[];
32
- /** Species rarity mapping. */
33
- export declare const SPECIES_RARITY: Record<Species, Rarity>;
34
- /** All available eye styles. */
35
- export declare const EYE_STYLES: EyeStyle[];
36
- export interface CompanionBones {
37
- species: Species;
38
- eyes: EyeStyle;
39
- hat: Hat;
40
- stats: CompanionStats;
41
- isShiny: boolean;
42
- rarity: Rarity;
43
- }
44
- /** Render sprite lines with eyes and hat applied. */
45
- export declare function renderSprite(bones: CompanionBones, frame: number): string[];
46
- /** Render blink frame (eyes replaced with -). */
47
- export declare function renderBlink(bones: CompanionBones): string[];
48
- /** Compact one-line face for narrow terminals. */
49
- export declare function renderFace(bones: CompanionBones): string;
50
- /** Number of animation frames for a species (always 3). */
51
- export declare function spriteFrameCount(_species: Species): number;
52
- //# sourceMappingURL=species.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"species.d.ts","sourceRoot":"","sources":["../../../src/ui/buddy/species.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,MAAM,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC;AAE3E,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,GAAG,GAAG,QAAQ,CAAC;AAElF,MAAM,MAAM,GAAG,GACX,MAAM,GACN,OAAO,GACP,QAAQ,GACR,WAAW,GACX,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,UAAU,CAAC;AAEf,MAAM,MAAM,OAAO,GACf,MAAM,GACN,OAAO,GACP,MAAM,GACN,KAAK,GACL,QAAQ,GACR,SAAS,GACT,KAAK,GACL,SAAS,GACT,QAAQ,GACR,OAAO,GACP,OAAO,GACP,SAAS,GACT,UAAU,GACV,QAAQ,GACR,OAAO,GACP,QAAQ,GACR,UAAU,GACV,OAAO,GACP,SAAS,CAAC;AAEd,uEAAuE;AACvE,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,CASzC,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAID,eAAO,MAAM,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAM5C,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMrD,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAM/C,CAAC;AAGF,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMpD,CAAC;AAMF,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAgG9C,CAAC;AAEF,yBAAyB;AACzB,eAAO,MAAM,WAAW,EAAE,OAAO,EAoBhC,CAAC;AAEF,8BAA8B;AAC9B,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAoBlD,CAAC;AAEF,gCAAgC;AAChC,eAAO,MAAM,UAAU,EAAE,QAAQ,EAA4D,CAAC;AAI9F,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,GAAG,EAAE,GAAG,CAAC;IACT,KAAK,EAAE,cAAc,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qDAAqD;AACrD,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAgB3E;AAED,iDAAiD;AACjD,wBAAgB,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,EAAE,CAU3D;AAED,kDAAkD;AAClD,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAuBxD;AAED,2DAA2D;AAC3D,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAE1D"}