@honeybee-ai/waggle-cli 1.0.19 → 1.0.21

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 (83) hide show
  1. package/dist/brood.d.ts +23 -9
  2. package/dist/brood.js +110 -1
  3. package/dist/brood.js.map +1 -1
  4. package/dist/cli.js +279 -936
  5. package/dist/cli.js.map +1 -7
  6. package/dist/commands/carapace.js +20 -5
  7. package/dist/commands/carapace.js.map +1 -1
  8. package/dist/commands/eval.d.ts +1 -0
  9. package/dist/commands/eval.js +221 -0
  10. package/dist/commands/eval.js.map +1 -0
  11. package/dist/commands/mcp.d.ts +13 -0
  12. package/dist/commands/mcp.js +17 -0
  13. package/dist/commands/mcp.js.map +1 -0
  14. package/dist/commands/scan.js +8 -8
  15. package/dist/commands/scan.js.map +1 -1
  16. package/dist/commands/up.js +13 -30
  17. package/dist/commands/up.js.map +1 -1
  18. package/dist/lib/capture.d.ts +6 -0
  19. package/dist/lib/capture.js +29 -0
  20. package/dist/lib/capture.js.map +1 -0
  21. package/dist/mcp/docs.d.ts +16 -0
  22. package/dist/mcp/docs.js +192 -0
  23. package/dist/mcp/docs.js.map +1 -0
  24. package/dist/mcp/handler.d.ts +27 -0
  25. package/dist/mcp/handler.js +397 -0
  26. package/dist/mcp/handler.js.map +1 -0
  27. package/dist/mcp/server.d.ts +19 -0
  28. package/dist/mcp/server.js +105 -0
  29. package/dist/mcp/server.js.map +1 -0
  30. package/dist/mcp/templates.d.ts +9 -0
  31. package/dist/mcp/templates.js +46 -0
  32. package/dist/mcp/templates.js.map +1 -0
  33. package/dist/repl/addressing.d.ts +34 -0
  34. package/dist/repl/addressing.js +103 -0
  35. package/dist/repl/addressing.js.map +1 -0
  36. package/dist/repl/agent-loop.d.ts +8 -0
  37. package/dist/repl/agent-loop.js +57 -0
  38. package/dist/repl/agent-loop.js.map +1 -0
  39. package/dist/repl/bang.d.ts +13 -0
  40. package/dist/repl/bang.js +207 -0
  41. package/dist/repl/bang.js.map +1 -0
  42. package/dist/repl/file-tools.d.ts +4 -0
  43. package/dist/repl/file-tools.js +121 -0
  44. package/dist/repl/file-tools.js.map +1 -0
  45. package/dist/repl/index-readline.d.ts +7 -0
  46. package/dist/repl/index-readline.js +91 -0
  47. package/dist/repl/index-readline.js.map +1 -0
  48. package/dist/repl/index.d.ts +1 -0
  49. package/dist/repl/index.js +341 -0
  50. package/dist/repl/index.js.map +1 -0
  51. package/dist/repl/input.d.ts +36 -0
  52. package/dist/repl/input.js +312 -0
  53. package/dist/repl/input.js.map +1 -0
  54. package/dist/repl/providers.d.ts +21 -0
  55. package/dist/repl/providers.js +373 -0
  56. package/dist/repl/providers.js.map +1 -0
  57. package/dist/repl/renderer.d.ts +38 -0
  58. package/dist/repl/renderer.js +167 -0
  59. package/dist/repl/renderer.js.map +1 -0
  60. package/dist/repl/system-pane.d.ts +28 -0
  61. package/dist/repl/system-pane.js +194 -0
  62. package/dist/repl/system-pane.js.map +1 -0
  63. package/dist/repl/system-prompt.d.ts +3 -0
  64. package/dist/repl/system-prompt.js +74 -0
  65. package/dist/repl/system-prompt.js.map +1 -0
  66. package/dist/repl/tool-handlers.d.ts +5 -0
  67. package/dist/repl/tool-handlers.js +118 -0
  68. package/dist/repl/tool-handlers.js.map +1 -0
  69. package/dist/repl/tools.d.ts +2 -0
  70. package/dist/repl/tools.js +205 -0
  71. package/dist/repl/tools.js.map +1 -0
  72. package/dist/repl/tui.d.ts +41 -0
  73. package/dist/repl/tui.js +280 -0
  74. package/dist/repl/tui.js.map +1 -0
  75. package/dist/repl/types.d.ts +53 -0
  76. package/dist/repl/types.js +3 -0
  77. package/dist/repl/types.js.map +1 -0
  78. package/dist/repl/ws-client.d.ts +39 -0
  79. package/dist/repl/ws-client.js +144 -0
  80. package/dist/repl/ws-client.js.map +1 -0
  81. package/dist/wgl.js +1396 -0
  82. package/dist/wgl.js.map +7 -0
  83. package/package.json +6 -8
@@ -0,0 +1,41 @@
1
+ export declare class TUI {
2
+ private chat;
3
+ private system;
4
+ private W;
5
+ private H;
6
+ private splitMode;
7
+ private splitCol;
8
+ private statusRow;
9
+ private inputStartRow;
10
+ private chatHeight;
11
+ private inputHeight;
12
+ private buf;
13
+ private inputLine;
14
+ private inputCursorCol;
15
+ private providerLabel;
16
+ private tokenCount;
17
+ private costAmount;
18
+ private spinnerLine;
19
+ start(): void;
20
+ stop(): void;
21
+ private resizeHandler;
22
+ private computeLayout;
23
+ private clampScroll;
24
+ get chatWidth(): number;
25
+ get systemWidth(): number;
26
+ get hasSplitPane(): boolean;
27
+ appendChat(lines: string[]): void;
28
+ updateSpinner(line: string | null): void;
29
+ appendSystem(lines: string[]): void;
30
+ clearSystem(): void;
31
+ updateStatus(provider: string, tokens: number, cost: number): void;
32
+ renderInput(displayLine: string, cursorCol: number): void;
33
+ private fullRedraw;
34
+ private renderPane;
35
+ private renderDivider;
36
+ private renderStatusBar;
37
+ private renderInputArea;
38
+ private parkCursor;
39
+ private writeClipped;
40
+ private flush;
41
+ }
@@ -0,0 +1,280 @@
1
+ // Terminal UI engine — 3-pane layout (chat + system + input)
2
+ // Pure ANSI escape codes, zero deps
3
+ // Alternate screen buffer, raw mode, virtual scroll buffers
4
+ import { clipLine, visibleWidth, gray, dim } from './renderer.js';
5
+ // ─── ANSI sequences ─────────────────────────────────────────────────
6
+ const ALT_SCREEN_ON = '\x1b[?1049h';
7
+ const ALT_SCREEN_OFF = '\x1b[?1049l';
8
+ const CURSOR_HIDE = '\x1b[?25l';
9
+ const CURSOR_SHOW = '\x1b[?25h';
10
+ const CLEAR_SCREEN = '\x1b[2J';
11
+ function moveTo(row, col) {
12
+ return `\x1b[${row};${col}H`;
13
+ }
14
+ class Pane {
15
+ buffer = [];
16
+ scrollOffset = 0;
17
+ geo = { startRow: 1, startCol: 1, width: 0, height: 0 };
18
+ append(lines) {
19
+ this.buffer.push(...lines);
20
+ // Auto-scroll to bottom
21
+ this.scrollOffset = Math.max(0, this.buffer.length - this.geo.height);
22
+ }
23
+ clear() {
24
+ this.buffer = [];
25
+ this.scrollOffset = 0;
26
+ }
27
+ /** Get visible lines for current viewport */
28
+ visible() {
29
+ return this.buffer.slice(this.scrollOffset, this.scrollOffset + this.geo.height);
30
+ }
31
+ }
32
+ // ─── TUI ────────────────────────────────────────────────────────────
33
+ export class TUI {
34
+ chat = new Pane();
35
+ system = new Pane();
36
+ W = 80;
37
+ H = 24;
38
+ splitMode = false;
39
+ splitCol = 0;
40
+ statusRow = 0;
41
+ inputStartRow = 0;
42
+ chatHeight = 0;
43
+ inputHeight = 3;
44
+ buf = '';
45
+ // Current input state (rendered by TUI, controlled by InputHandler)
46
+ inputLine = '\u276F ';
47
+ inputCursorCol = 2;
48
+ // Status bar data
49
+ providerLabel = '';
50
+ tokenCount = 0;
51
+ costAmount = 0;
52
+ // Spinner state
53
+ spinnerLine = null;
54
+ // ── Lifecycle ──
55
+ start() {
56
+ this.W = process.stdout.columns || 80;
57
+ this.H = process.stdout.rows || 24;
58
+ process.stdout.write(ALT_SCREEN_ON + CURSOR_HIDE);
59
+ this.computeLayout();
60
+ process.stdout.on('resize', this.resizeHandler);
61
+ this.fullRedraw();
62
+ }
63
+ stop() {
64
+ process.stdout.removeListener('resize', this.resizeHandler);
65
+ process.stdout.write(CURSOR_SHOW + ALT_SCREEN_OFF);
66
+ }
67
+ resizeHandler = () => {
68
+ this.W = process.stdout.columns || 80;
69
+ this.H = process.stdout.rows || 24;
70
+ this.computeLayout();
71
+ this.fullRedraw();
72
+ };
73
+ // ── Layout ──
74
+ computeLayout() {
75
+ this.splitMode = this.W >= 100;
76
+ this.statusRow = this.H - this.inputHeight;
77
+ this.inputStartRow = this.statusRow + 1;
78
+ this.chatHeight = this.statusRow - 1;
79
+ if (this.splitMode) {
80
+ this.splitCol = Math.floor(this.W * 0.6);
81
+ this.chat.geo = {
82
+ startRow: 1,
83
+ startCol: 1,
84
+ width: this.splitCol - 1,
85
+ height: this.chatHeight,
86
+ };
87
+ this.system.geo = {
88
+ startRow: 1,
89
+ startCol: this.splitCol + 1,
90
+ width: this.W - this.splitCol,
91
+ height: this.chatHeight,
92
+ };
93
+ }
94
+ else {
95
+ this.splitCol = 0;
96
+ this.chat.geo = {
97
+ startRow: 1,
98
+ startCol: 1,
99
+ width: this.W,
100
+ height: this.chatHeight,
101
+ };
102
+ this.system.geo = {
103
+ startRow: 1,
104
+ startCol: 1,
105
+ width: 0,
106
+ height: 0,
107
+ };
108
+ }
109
+ // Clamp scroll offsets
110
+ this.clampScroll(this.chat);
111
+ this.clampScroll(this.system);
112
+ }
113
+ clampScroll(pane) {
114
+ if (pane.geo.height <= 0)
115
+ return;
116
+ const maxOffset = Math.max(0, pane.buffer.length - pane.geo.height);
117
+ pane.scrollOffset = Math.min(pane.scrollOffset, maxOffset);
118
+ }
119
+ // ── Public getters ──
120
+ get chatWidth() { return this.chat.geo.width; }
121
+ get systemWidth() { return this.system.geo.width; }
122
+ get hasSplitPane() { return this.splitMode; }
123
+ // ── Chat pane ──
124
+ appendChat(lines) {
125
+ // Clear spinner if it was showing
126
+ if (this.spinnerLine) {
127
+ this.spinnerLine = null;
128
+ }
129
+ this.chat.append(lines);
130
+ this.renderPane(this.chat);
131
+ this.flush();
132
+ this.parkCursor();
133
+ }
134
+ updateSpinner(line) {
135
+ this.spinnerLine = line;
136
+ if (!line) {
137
+ // Clear the spinner row
138
+ this.renderPane(this.chat);
139
+ this.flush();
140
+ this.parkCursor();
141
+ return;
142
+ }
143
+ // Render spinner below the last chat content
144
+ const visibleEnd = Math.min(this.chat.buffer.length - this.chat.scrollOffset, this.chat.geo.height);
145
+ const spinnerRow = this.chat.geo.startRow + visibleEnd;
146
+ if (spinnerRow < this.statusRow) {
147
+ this.buf += moveTo(spinnerRow, this.chat.geo.startCol);
148
+ this.writeClipped(` ${line}`, this.chat.geo.width);
149
+ this.flush();
150
+ }
151
+ this.parkCursor();
152
+ }
153
+ // ── System pane ──
154
+ appendSystem(lines) {
155
+ if (!this.splitMode) {
156
+ // Narrow mode: show inline in chat (dim)
157
+ this.appendChat(lines.map(l => dim(l)));
158
+ return;
159
+ }
160
+ this.system.append(lines);
161
+ this.renderPane(this.system);
162
+ this.flush();
163
+ this.parkCursor();
164
+ }
165
+ clearSystem() {
166
+ this.system.clear();
167
+ if (this.splitMode) {
168
+ this.renderPane(this.system);
169
+ this.flush();
170
+ this.parkCursor();
171
+ }
172
+ }
173
+ // ── Status bar ──
174
+ updateStatus(provider, tokens, cost) {
175
+ this.providerLabel = provider;
176
+ this.tokenCount = tokens;
177
+ this.costAmount = cost;
178
+ this.renderStatusBar();
179
+ this.flush();
180
+ this.parkCursor();
181
+ }
182
+ // ── Input pane ──
183
+ renderInput(displayLine, cursorCol) {
184
+ this.inputLine = displayLine;
185
+ this.inputCursorCol = cursorCol;
186
+ this.renderInputArea();
187
+ this.flush();
188
+ this.parkCursor();
189
+ }
190
+ // ── Full redraw ──
191
+ fullRedraw() {
192
+ this.buf += CLEAR_SCREEN;
193
+ this.renderPane(this.chat);
194
+ if (this.splitMode) {
195
+ this.renderDivider();
196
+ this.renderPane(this.system);
197
+ }
198
+ this.renderStatusBar();
199
+ this.renderInputArea();
200
+ this.flush();
201
+ this.parkCursor();
202
+ }
203
+ // ── Low-level rendering ──
204
+ renderPane(pane) {
205
+ const { startRow, startCol, width, height } = pane.geo;
206
+ if (height <= 0 || width <= 0)
207
+ return;
208
+ const visible = pane.visible();
209
+ for (let i = 0; i < height; i++) {
210
+ this.buf += moveTo(startRow + i, startCol);
211
+ if (i < visible.length) {
212
+ this.writeClipped(visible[i], width);
213
+ }
214
+ else {
215
+ this.buf += ' '.repeat(width);
216
+ }
217
+ }
218
+ }
219
+ renderDivider() {
220
+ const ch = gray('\u2502');
221
+ for (let row = 1; row <= this.chatHeight; row++) {
222
+ this.buf += moveTo(row, this.splitCol);
223
+ this.buf += ch;
224
+ }
225
+ }
226
+ renderStatusBar() {
227
+ this.buf += moveTo(this.statusRow, 1);
228
+ // Horizontal line with optional ┴ at split point
229
+ if (this.splitMode && this.splitCol > 0) {
230
+ const left = '\u2500'.repeat(this.splitCol - 1);
231
+ const right = '\u2500'.repeat(this.W - this.splitCol);
232
+ this.buf += gray(left + '\u2534' + right);
233
+ }
234
+ else {
235
+ this.buf += gray('\u2500'.repeat(this.W));
236
+ }
237
+ // Provider + stats overlay
238
+ if (this.providerLabel) {
239
+ const tokStr = this.tokenCount >= 1000
240
+ ? `${(this.tokenCount / 1000).toFixed(1)}k`
241
+ : String(this.tokenCount);
242
+ const costStr = this.costAmount > 0 ? ` $${this.costAmount.toFixed(4)}` : '';
243
+ const statusContent = ` ${this.providerLabel} ${gray('\u2502')} ${tokStr} tokens${costStr} `;
244
+ this.buf += moveTo(this.statusRow, 2);
245
+ this.writeClipped(statusContent, this.W - 2);
246
+ }
247
+ }
248
+ renderInputArea() {
249
+ // Clear input area
250
+ for (let i = 0; i < this.inputHeight; i++) {
251
+ this.buf += moveTo(this.inputStartRow + i, 1);
252
+ this.buf += ' '.repeat(this.W);
253
+ }
254
+ // Render prompt line on the middle row of the input area
255
+ const promptRow = this.inputStartRow + 1;
256
+ this.buf += moveTo(promptRow, 3);
257
+ this.writeClipped(this.inputLine, this.W - 4);
258
+ }
259
+ parkCursor() {
260
+ // Position cursor in the input area at the correct column
261
+ const promptRow = this.inputStartRow + 1;
262
+ const col = 3 + this.inputCursorCol;
263
+ process.stdout.write(`${moveTo(promptRow, col)}${CURSOR_SHOW}`);
264
+ }
265
+ writeClipped(line, width) {
266
+ const clipped = clipLine(line, width);
267
+ const clippedWidth = visibleWidth(clipped);
268
+ this.buf += clipped;
269
+ if (clippedWidth < width) {
270
+ this.buf += ' '.repeat(width - clippedWidth);
271
+ }
272
+ }
273
+ flush() {
274
+ if (this.buf) {
275
+ process.stdout.write(this.buf);
276
+ this.buf = '';
277
+ }
278
+ }
279
+ }
280
+ //# sourceMappingURL=tui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/repl/tui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ export interface ProviderConfig {
2
+ type: 'ollama' | 'openai' | 'anthropic';
3
+ baseUrl: string;
4
+ apiKey?: string;
5
+ model: string;
6
+ providerName?: string;
7
+ }
8
+ export interface ChatMessage {
9
+ role: 'system' | 'user' | 'assistant' | 'tool';
10
+ content?: string | null;
11
+ tool_calls?: ToolCall[];
12
+ tool_call_id?: string;
13
+ }
14
+ export interface ToolCall {
15
+ id?: string;
16
+ type?: 'function';
17
+ function: {
18
+ name: string;
19
+ arguments: string | Record<string, unknown>;
20
+ };
21
+ }
22
+ export interface ToolDef {
23
+ type: 'function';
24
+ function: {
25
+ name: string;
26
+ description: string;
27
+ parameters: {
28
+ type: 'object';
29
+ properties: Record<string, {
30
+ type: string;
31
+ description: string;
32
+ enum?: string[];
33
+ }>;
34
+ required: string[];
35
+ };
36
+ };
37
+ }
38
+ export interface TokenUsage {
39
+ promptTokens: number;
40
+ completionTokens: number;
41
+ totalTokens: number;
42
+ }
43
+ export interface CompletionResult {
44
+ message: ChatMessage;
45
+ usage: TokenUsage;
46
+ }
47
+ export interface LoopCallbacks {
48
+ onAssistantMessage: (content: string) => void;
49
+ onToolCall: (name: string, args: Record<string, unknown>) => void;
50
+ onToolResult: (name: string, result: string) => void;
51
+ onThinking: (thinking: boolean) => void;
52
+ onUsage: (usage: TokenUsage) => void;
53
+ }
@@ -0,0 +1,3 @@
1
+ // REPL types — subset of incubator/src/agent/types.ts
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/repl/types.ts"],"names":[],"mappings":"AAAA,sDAAsD"}
@@ -0,0 +1,39 @@
1
+ export interface WsEvent {
2
+ type: string;
3
+ data?: Record<string, unknown>;
4
+ agentId?: string;
5
+ timestamp?: string;
6
+ id?: number;
7
+ }
8
+ export interface WsClientCallbacks {
9
+ onEvent: (event: WsEvent) => void;
10
+ onConnect: () => void;
11
+ onDisconnect: () => void;
12
+ }
13
+ /**
14
+ * Lightweight WS client for incubator event streaming.
15
+ * Connects to /ws, pushes events to callbacks.
16
+ * Auto-reconnects on disconnect (up to maxRetries).
17
+ */
18
+ export declare class ReplWsClient {
19
+ private ws;
20
+ private serverUrl;
21
+ private namespace;
22
+ private agentId;
23
+ private callbacks;
24
+ private reconnectTimer;
25
+ private retryCount;
26
+ private maxRetries;
27
+ private closing;
28
+ private lastEventId;
29
+ constructor(serverUrl: string, namespace: string, agentId: string, callbacks: WsClientCallbacks);
30
+ /** Connect to the incubator WS endpoint */
31
+ connect(): void;
32
+ /** Disconnect cleanly */
33
+ close(): void;
34
+ /** Whether we have an active connection */
35
+ get connected(): boolean;
36
+ private buildWsUrl;
37
+ private handleMessage;
38
+ private scheduleReconnect;
39
+ }
@@ -0,0 +1,144 @@
1
+ // WebSocket client for live incubator events
2
+ // Uses Node 22 native WebSocket — no npm dependency
3
+ /**
4
+ * Lightweight WS client for incubator event streaming.
5
+ * Connects to /ws, pushes events to callbacks.
6
+ * Auto-reconnects on disconnect (up to maxRetries).
7
+ */
8
+ export class ReplWsClient {
9
+ ws = null;
10
+ serverUrl;
11
+ namespace;
12
+ agentId;
13
+ callbacks;
14
+ reconnectTimer = null;
15
+ retryCount = 0;
16
+ maxRetries = 5;
17
+ closing = false;
18
+ lastEventId = 0;
19
+ constructor(serverUrl, namespace, agentId, callbacks) {
20
+ this.serverUrl = serverUrl.replace(/\/$/, '');
21
+ this.namespace = namespace;
22
+ this.agentId = agentId;
23
+ this.callbacks = callbacks;
24
+ }
25
+ /** Connect to the incubator WS endpoint */
26
+ connect() {
27
+ if (this.ws)
28
+ return;
29
+ this.closing = false;
30
+ const wsUrl = this.buildWsUrl();
31
+ try {
32
+ this.ws = new WebSocket(wsUrl);
33
+ }
34
+ catch {
35
+ this.scheduleReconnect();
36
+ return;
37
+ }
38
+ this.ws.addEventListener('open', () => {
39
+ this.retryCount = 0;
40
+ this.callbacks.onConnect();
41
+ });
42
+ this.ws.addEventListener('message', (ev) => {
43
+ this.handleMessage(ev.data);
44
+ });
45
+ this.ws.addEventListener('close', () => {
46
+ this.ws = null;
47
+ if (!this.closing) {
48
+ this.callbacks.onDisconnect();
49
+ this.scheduleReconnect();
50
+ }
51
+ });
52
+ this.ws.addEventListener('error', () => {
53
+ // error fires before close — close handler will reconnect
54
+ });
55
+ }
56
+ /** Disconnect cleanly */
57
+ close() {
58
+ this.closing = true;
59
+ if (this.reconnectTimer) {
60
+ clearTimeout(this.reconnectTimer);
61
+ this.reconnectTimer = null;
62
+ }
63
+ if (this.ws) {
64
+ this.ws.close();
65
+ this.ws = null;
66
+ }
67
+ }
68
+ /** Whether we have an active connection */
69
+ get connected() {
70
+ return this.ws !== null && this.ws.readyState === WebSocket.OPEN;
71
+ }
72
+ buildWsUrl() {
73
+ const base = this.serverUrl.replace(/^http/, 'ws');
74
+ const params = new URLSearchParams({
75
+ namespace: this.namespace,
76
+ agentId: this.agentId,
77
+ role: 'observer',
78
+ });
79
+ if (this.lastEventId > 0) {
80
+ params.set('since', String(this.lastEventId));
81
+ }
82
+ return `${base}/ws?${params.toString()}`;
83
+ }
84
+ handleMessage(raw) {
85
+ const text = typeof raw === 'string' ? raw : String(raw);
86
+ let msg;
87
+ try {
88
+ msg = JSON.parse(text);
89
+ }
90
+ catch {
91
+ return; // malformed — skip
92
+ }
93
+ const msgType = String(msg.type ?? '');
94
+ switch (msgType) {
95
+ case 'event': {
96
+ const event = {
97
+ type: String(msg.event?.type ?? msg.eventType ?? ''),
98
+ data: msg.event?.data ?? msg.data,
99
+ agentId: String(msg.agentId ?? msg.event?.agentId ?? ''),
100
+ timestamp: String(msg.timestamp ?? ''),
101
+ id: typeof msg.id === 'number' ? msg.id : undefined,
102
+ };
103
+ if (event.id && event.id > this.lastEventId) {
104
+ this.lastEventId = event.id;
105
+ }
106
+ this.callbacks.onEvent(event);
107
+ break;
108
+ }
109
+ case 'ping':
110
+ // Respond with pong if needed — native WS handles this
111
+ break;
112
+ case 'replay_done':
113
+ // Initial replay complete — now receiving live events
114
+ break;
115
+ case 'metrics':
116
+ // Dashboard metrics push — show in system pane
117
+ this.callbacks.onEvent({
118
+ type: '_metrics',
119
+ data: msg,
120
+ });
121
+ break;
122
+ default:
123
+ // Unknown message type — emit as generic event
124
+ if (msgType) {
125
+ this.callbacks.onEvent({
126
+ type: msgType,
127
+ data: msg,
128
+ });
129
+ }
130
+ break;
131
+ }
132
+ }
133
+ scheduleReconnect() {
134
+ if (this.closing || this.retryCount >= this.maxRetries)
135
+ return;
136
+ const delay = Math.min(1000 * Math.pow(2, this.retryCount), 30000);
137
+ this.retryCount++;
138
+ this.reconnectTimer = setTimeout(() => {
139
+ this.reconnectTimer = null;
140
+ this.connect();
141
+ }, delay);
142
+ }
143
+ }
144
+ //# sourceMappingURL=ws-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws-client.js","sourceRoot":"","sources":["../../src/repl/ws-client.ts"],"names":[],"mappings":"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"}