@relace-ai/jacq 0.1.1-beta.1 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/dist/actions/messages.d.ts +41 -0
  2. package/dist/actions/messages.js +77 -0
  3. package/dist/actions/messages.js.map +1 -0
  4. package/dist/actions/prompts.d.ts +6 -0
  5. package/dist/actions/prompts.js +18 -0
  6. package/dist/actions/prompts.js.map +1 -0
  7. package/dist/actions/tasks.d.ts +13 -0
  8. package/dist/actions/tasks.js +66 -0
  9. package/dist/actions/tasks.js.map +1 -0
  10. package/dist/auth.d.ts +12 -0
  11. package/dist/auth.js +131 -0
  12. package/dist/auth.js.map +1 -0
  13. package/dist/clipboard.d.ts +21 -0
  14. package/dist/clipboard.js +126 -0
  15. package/dist/clipboard.js.map +1 -0
  16. package/dist/commands.d.ts +15 -0
  17. package/dist/commands.js +23 -0
  18. package/dist/commands.js.map +1 -0
  19. package/dist/config.d.ts +12 -0
  20. package/dist/config.js +63 -0
  21. package/dist/config.js.map +1 -0
  22. package/dist/connection.d.ts +43 -0
  23. package/dist/connection.js +231 -0
  24. package/dist/connection.js.map +1 -0
  25. package/dist/constants.d.ts +2 -0
  26. package/dist/constants.js +3 -0
  27. package/dist/constants.js.map +1 -0
  28. package/dist/debug.d.ts +96 -0
  29. package/dist/debug.js +144 -0
  30. package/dist/debug.js.map +1 -0
  31. package/dist/index.d.ts +10 -0
  32. package/dist/index.js +390 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/markdown/index.d.ts +11 -0
  35. package/dist/markdown/index.js +12 -0
  36. package/dist/markdown/index.js.map +1 -0
  37. package/dist/markdown/parser.d.ts +22 -0
  38. package/dist/markdown/parser.js +310 -0
  39. package/dist/markdown/parser.js.map +1 -0
  40. package/dist/markdown/renderer.d.ts +23 -0
  41. package/dist/markdown/renderer.js +358 -0
  42. package/dist/markdown/renderer.js.map +1 -0
  43. package/dist/markdown/types.d.ts +74 -0
  44. package/dist/markdown/types.js +12 -0
  45. package/dist/markdown/types.js.map +1 -0
  46. package/dist/protocol.d.ts +46 -0
  47. package/dist/protocol.js +608 -0
  48. package/dist/protocol.js.map +1 -0
  49. package/dist/renderer.d.ts +46 -0
  50. package/dist/renderer.js +144 -0
  51. package/dist/renderer.js.map +1 -0
  52. package/dist/screen.d.ts +34 -0
  53. package/dist/screen.js +167 -0
  54. package/dist/screen.js.map +1 -0
  55. package/dist/state.d.ts +6 -0
  56. package/dist/state.js +77 -0
  57. package/dist/state.js.map +1 -0
  58. package/dist/styles.d.ts +16 -0
  59. package/dist/styles.js +68 -0
  60. package/dist/styles.js.map +1 -0
  61. package/dist/terminal.d.ts +46 -0
  62. package/dist/terminal.js +67 -0
  63. package/dist/terminal.js.map +1 -0
  64. package/dist/tools/executor.d.ts +8 -0
  65. package/dist/tools/executor.js +20 -0
  66. package/dist/tools/executor.js.map +1 -0
  67. package/dist/tools/index.d.ts +5 -0
  68. package/dist/tools/index.js +6 -0
  69. package/dist/tools/index.js.map +1 -0
  70. package/dist/tools/registry.d.ts +32 -0
  71. package/dist/tools/registry.js +344 -0
  72. package/dist/tools/registry.js.map +1 -0
  73. package/dist/types.d.ts +200 -0
  74. package/dist/types.js +5 -0
  75. package/dist/types.js.map +1 -0
  76. package/dist/ui/backgroundTasks.d.ts +7 -0
  77. package/dist/ui/backgroundTasks.js +192 -0
  78. package/dist/ui/backgroundTasks.js.map +1 -0
  79. package/dist/ui/filePicker.d.ts +9 -0
  80. package/dist/ui/filePicker.js +315 -0
  81. package/dist/ui/filePicker.js.map +1 -0
  82. package/dist/ui/index.d.ts +33 -0
  83. package/dist/ui/index.js +289 -0
  84. package/dist/ui/index.js.map +1 -0
  85. package/dist/ui/input.d.ts +7 -0
  86. package/dist/ui/input.js +320 -0
  87. package/dist/ui/input.js.map +1 -0
  88. package/dist/ui/messages.d.ts +9 -0
  89. package/dist/ui/messages.js +329 -0
  90. package/dist/ui/messages.js.map +1 -0
  91. package/dist/ui/primitives.d.ts +35 -0
  92. package/dist/ui/primitives.js +94 -0
  93. package/dist/ui/primitives.js.map +1 -0
  94. package/dist/ui/promptInput.d.ts +8 -0
  95. package/dist/ui/promptInput.js +198 -0
  96. package/dist/ui/promptInput.js.map +1 -0
  97. package/dist/ui/promptPicker.d.ts +7 -0
  98. package/dist/ui/promptPicker.js +214 -0
  99. package/dist/ui/promptPicker.js.map +1 -0
  100. package/dist/ui/sessions.d.ts +6 -0
  101. package/dist/ui/sessions.js +214 -0
  102. package/dist/ui/sessions.js.map +1 -0
  103. package/dist/ui/welcome.d.ts +6 -0
  104. package/dist/ui/welcome.js +114 -0
  105. package/dist/ui/welcome.js.map +1 -0
  106. package/package.json +1 -1
package/dist/config.js ADDED
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Configuration loader
3
+ * Loads from ~/.jacq/config.json
4
+ */
5
+ import fs from 'fs';
6
+ import path from 'path';
7
+ import os from 'os';
8
+ import { API_HTTP_URL, API_WS_URL } from './constants.js';
9
+ const CONFIG_DIR = path.join(os.homedir(), '.jacq');
10
+ const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
11
+ const DEFAULT_CONFIG = {
12
+ apiUrl: API_WS_URL,
13
+ apiHttpUrl: API_HTTP_URL,
14
+ apiKey: null,
15
+ };
16
+ export function loadConfig() {
17
+ try {
18
+ if (fs.existsSync(CONFIG_FILE)) {
19
+ const content = fs.readFileSync(CONFIG_FILE, 'utf-8');
20
+ const parsed = JSON.parse(content);
21
+ return {
22
+ apiUrl: parsed.api_url || parsed.apiUrl || DEFAULT_CONFIG.apiUrl,
23
+ apiHttpUrl: parsed.api_http_url || parsed.apiHttpUrl || null,
24
+ apiKey: parsed.api_key || parsed.apiKey || null,
25
+ };
26
+ }
27
+ }
28
+ catch {
29
+ // Ignore errors, use defaults
30
+ }
31
+ return { ...DEFAULT_CONFIG };
32
+ }
33
+ export function saveConfig(updates) {
34
+ let existing = {};
35
+ try {
36
+ if (fs.existsSync(CONFIG_FILE)) {
37
+ existing = JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf-8'));
38
+ }
39
+ }
40
+ catch {
41
+ // Start fresh if config is corrupted
42
+ }
43
+ const keyMap = { apiUrl: 'api_url', apiHttpUrl: 'api_http_url', apiKey: 'api_key' };
44
+ for (const [key, value] of Object.entries(updates)) {
45
+ const fileKey = keyMap[key] || key;
46
+ if (value === null) {
47
+ delete existing[fileKey];
48
+ }
49
+ else {
50
+ existing[fileKey] = value;
51
+ }
52
+ }
53
+ if (!fs.existsSync(CONFIG_DIR)) {
54
+ fs.mkdirSync(CONFIG_DIR, { recursive: true });
55
+ }
56
+ const tmpFile = CONFIG_FILE + '.tmp';
57
+ fs.writeFileSync(tmpFile, JSON.stringify(existing, null, 2) + '\n', 'utf-8');
58
+ fs.renameSync(tmpFile, CONFIG_FILE);
59
+ }
60
+ export function getConfigPath() {
61
+ return CONFIG_FILE;
62
+ }
63
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE1D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AACpD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAQzD,MAAM,cAAc,GAAW;IAC3B,MAAM,EAAE,UAAU;IAClB,UAAU,EAAE,YAAY;IACxB,MAAM,EAAE,IAAI;CACf,CAAC;AAEF,MAAM,UAAU,UAAU;IACtB,IAAI,CAAC;QACD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;YACtD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEnC,OAAO;gBACH,MAAM,EAAE,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,IAAI,cAAc,CAAC,MAAM;gBAChE,UAAU,EAAE,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,UAAU,IAAI,IAAI;gBAC5D,MAAM,EAAE,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI;aAClD,CAAC;QACN,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACL,8BAA8B;IAClC,CAAC;IAED,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAA+C;IACtE,IAAI,QAAQ,GAA4B,EAAE,CAAC;IAC3C,IAAI,CAAC;QACD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7B,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;QACjE,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACL,qCAAqC;IACzC,CAAC;IAED,MAAM,MAAM,GAA2B,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC5G,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;QACnC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACjB,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACJ,QAAQ,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;QAC9B,CAAC;IACL,CAAC;IAED,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,OAAO,GAAG,WAAW,GAAG,MAAM,CAAC;IACrC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,CAAC;IAC7E,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,aAAa;IACzB,OAAO,WAAW,CAAC;AACvB,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Connection — WebSocket connection manager with remote tool execution
3
+ *
4
+ * Manages WebSocket lifecycle, request/response pairing, and handles
5
+ * server-initiated tool execution requests and health pings.
6
+ */
7
+ import WebSocket from 'ws';
8
+ interface PendingRequest {
9
+ resolve: (value: WsMessage) => void;
10
+ reject: (reason: Error) => void;
11
+ timeout: ReturnType<typeof setTimeout>;
12
+ }
13
+ export interface WsMessage {
14
+ type: string;
15
+ id?: string;
16
+ taskId?: string;
17
+ requestId?: string;
18
+ payload?: Record<string, unknown>;
19
+ success?: boolean;
20
+ error?: string;
21
+ }
22
+ declare class Connection {
23
+ ws: WebSocket | null;
24
+ clientId: string | null;
25
+ alias: string | null;
26
+ pendingRequests: Map<string, PendingRequest>;
27
+ onMessage: ((message: WsMessage) => void) | null;
28
+ onDisconnect: ((code?: number, reason?: string) => void) | null;
29
+ constructor();
30
+ connect(url: string, apiKey?: string | null): void;
31
+ disconnect(): void;
32
+ get isConnected(): boolean;
33
+ send(message: Record<string, unknown>): void;
34
+ request(message: Record<string, unknown>, timeout?: number): Promise<WsMessage>;
35
+ getWsState(): string;
36
+ registerAsToolClient(): Promise<void>;
37
+ _handleRawMessage(message: WsMessage): void;
38
+ _handleToolExecute(message: WsMessage): Promise<void>;
39
+ _handlePing(message: WsMessage): void;
40
+ _rejectAllPending(error: Error): void;
41
+ }
42
+ export declare const connection: Connection;
43
+ export {};
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Connection — WebSocket connection manager with remote tool execution
3
+ *
4
+ * Manages WebSocket lifecycle, request/response pairing, and handles
5
+ * server-initiated tool execution requests and health pings.
6
+ */
7
+ import os from 'os';
8
+ import { createHash, randomUUID } from 'crypto';
9
+ import WebSocket from 'ws';
10
+ import debug from './debug.js';
11
+ import { TOOL_DEFINITIONS } from './tools/index.js';
12
+ import { executeToolRequest } from './tools/index.js';
13
+ /**
14
+ * Generate a stable machine ID from system info.
15
+ */
16
+ function getMachineId() {
17
+ const info = `${os.hostname()}-${os.platform()}-${os.arch()}-${os.userInfo().username}`;
18
+ return createHash('sha256').update(info).digest('hex').slice(0, 16);
19
+ }
20
+ class Connection {
21
+ ws;
22
+ clientId;
23
+ alias;
24
+ pendingRequests;
25
+ // Callbacks — set by protocol.ts
26
+ onMessage;
27
+ onDisconnect;
28
+ constructor() {
29
+ this.ws = null;
30
+ this.clientId = null;
31
+ this.alias = null;
32
+ this.pendingRequests = new Map();
33
+ this.onMessage = null;
34
+ this.onDisconnect = null;
35
+ }
36
+ connect(url, apiKey = null) {
37
+ let wsUrl = url;
38
+ if (apiKey) {
39
+ const separator = url.includes('?') ? '&' : '?';
40
+ wsUrl = `${url}${separator}token=${encodeURIComponent(apiKey)}`;
41
+ }
42
+ const ws = new WebSocket(wsUrl);
43
+ this.ws = ws;
44
+ debug.updateWsState('connecting');
45
+ ws.on('open', () => {
46
+ // Ignore events from stale sockets (e.g. rapid reconnect).
47
+ if (this.ws !== ws)
48
+ return;
49
+ debug.updateWsState('open');
50
+ });
51
+ ws.on('message', (data) => {
52
+ if (this.ws !== ws)
53
+ return;
54
+ try {
55
+ const message = JSON.parse(data.toString());
56
+ this._handleRawMessage(message);
57
+ }
58
+ catch (err) {
59
+ debug.recordError(`WS parse error: ${err.message}`);
60
+ }
61
+ });
62
+ ws.on('close', (code, reason) => {
63
+ if (this.ws !== ws)
64
+ return;
65
+ this.clientId = null;
66
+ this.alias = null;
67
+ debug.updateWsState('closed');
68
+ this._rejectAllPending(new Error('Connection closed'));
69
+ const reasonStr = reason != null
70
+ ? (Buffer.isBuffer(reason) ? reason.toString() : String(reason))
71
+ : undefined;
72
+ this.onDisconnect?.(code, reasonStr);
73
+ });
74
+ ws.on('error', (err) => {
75
+ if (this.ws !== ws)
76
+ return;
77
+ debug.updateWsState('closed');
78
+ debug.recordError(err.message || 'WebSocket error');
79
+ this.onDisconnect?.(undefined, err?.message);
80
+ });
81
+ }
82
+ disconnect() {
83
+ if (this.ws) {
84
+ // Best-effort: detach listeners so close/error from the old socket can't
85
+ // clobber state after a subsequent connect().
86
+ this.ws.removeAllListeners();
87
+ this.ws.close();
88
+ this.ws = null;
89
+ }
90
+ this.alias = null;
91
+ debug.updateWsState('closed');
92
+ }
93
+ get isConnected() {
94
+ return this.ws !== null && this.ws.readyState === WebSocket.OPEN;
95
+ }
96
+ send(message) {
97
+ if (this.ws && this.ws.readyState === WebSocket.OPEN) {
98
+ this.ws.send(JSON.stringify(message));
99
+ }
100
+ }
101
+ request(message, timeout = 30000) {
102
+ return new Promise((resolve, reject) => {
103
+ if (!this.isConnected) {
104
+ reject(new Error('Not connected'));
105
+ return;
106
+ }
107
+ const id = randomUUID();
108
+ message.id = id;
109
+ const timeoutId = setTimeout(() => {
110
+ this.pendingRequests.delete(id);
111
+ reject(new Error('Request timed out'));
112
+ }, timeout);
113
+ this.pendingRequests.set(id, { resolve, reject, timeout: timeoutId });
114
+ this.send(message);
115
+ });
116
+ }
117
+ getWsState() {
118
+ if (!this.ws)
119
+ return 'null';
120
+ return ['connecting', 'open', 'closing', 'closed'][this.ws.readyState] || 'unknown';
121
+ }
122
+ async registerAsToolClient() {
123
+ if (!this.isConnected)
124
+ return;
125
+ try {
126
+ const response = await this.request({
127
+ type: 'client.register',
128
+ payload: {
129
+ machineId: getMachineId(),
130
+ hostname: os.hostname(),
131
+ friendlyName: null,
132
+ cwd: process.cwd(),
133
+ os: process.platform,
134
+ username: os.userInfo().username,
135
+ tools: TOOL_DEFINITIONS,
136
+ },
137
+ });
138
+ if (response.payload) {
139
+ if (response.payload.alias) {
140
+ this.alias = response.payload.alias;
141
+ }
142
+ debug.log('TOOLS', 'Registered as tool client', {
143
+ alias: this.alias,
144
+ tools: response.payload.tools,
145
+ });
146
+ }
147
+ }
148
+ catch (err) {
149
+ debug.log('TOOLS', 'Registration failed (non-fatal)', { error: err.message });
150
+ }
151
+ }
152
+ _handleRawMessage(message) {
153
+ debug.log('WS', `Received: ${message.type}`, {
154
+ id: message.id?.slice(0, 8),
155
+ taskId: message.taskId?.slice(0, 8),
156
+ success: message.success,
157
+ hasPending: message.id ? this.pendingRequests.has(message.id) : false,
158
+ });
159
+ if (message.id && this.pendingRequests.has(message.id)) {
160
+ const pending = this.pendingRequests.get(message.id);
161
+ clearTimeout(pending.timeout);
162
+ this.pendingRequests.delete(message.id);
163
+ debug.log('WS', 'Resolved pending request', {
164
+ id: message.id.slice(0, 8),
165
+ type: message.type,
166
+ success: message.success,
167
+ });
168
+ pending.resolve(message);
169
+ return;
170
+ }
171
+ if (message.type === 'tool.execute') {
172
+ this._handleToolExecute(message);
173
+ return;
174
+ }
175
+ if (message.type === 'ping') {
176
+ this._handlePing(message);
177
+ return;
178
+ }
179
+ this.onMessage?.(message);
180
+ }
181
+ async _handleToolExecute(message) {
182
+ const requestId = message.requestId;
183
+ const payload = message.payload;
184
+ if (!payload || !requestId)
185
+ return;
186
+ debug.log('TOOLS', `Executing ${payload.tool}`, {
187
+ requestId: requestId.slice(0, 8),
188
+ args: Object.keys(payload.args || {}),
189
+ });
190
+ try {
191
+ const result = await executeToolRequest(payload.tool, payload.args || {}, process.cwd());
192
+ this.send({
193
+ type: 'tool.result',
194
+ payload: {
195
+ requestId,
196
+ success: result.success,
197
+ result: result.result,
198
+ error: result.error,
199
+ },
200
+ });
201
+ }
202
+ catch (err) {
203
+ this.send({
204
+ type: 'tool.result',
205
+ payload: {
206
+ requestId,
207
+ success: false,
208
+ error: `Tool execution failed: ${err}`,
209
+ },
210
+ });
211
+ }
212
+ }
213
+ _handlePing(message) {
214
+ this.send({
215
+ type: 'pong',
216
+ payload: {
217
+ requestId: message.requestId,
218
+ },
219
+ });
220
+ }
221
+ _rejectAllPending(error) {
222
+ for (const [id, pending] of this.pendingRequests) {
223
+ clearTimeout(pending.timeout);
224
+ pending.reject(error);
225
+ }
226
+ this.pendingRequests.clear();
227
+ }
228
+ }
229
+ // Singleton
230
+ export const connection = new Connection();
231
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const API_HTTP_URL: "https://jacquard-api.fly.dev";
2
+ export declare const API_WS_URL: "wss://jacquard-api.fly.dev/ws";
@@ -0,0 +1,3 @@
1
+ export const API_HTTP_URL = "https://jacquard-api.fly.dev";
2
+ export const API_WS_URL = "wss://jacquard-api.fly.dev/ws";
3
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,8BAAuC,CAAC;AACpE,MAAM,CAAC,MAAM,UAAU,GAAG,+BAAwC,CAAC"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Debug logging and stats
3
+ */
4
+ import type { Screen } from './screen.js';
5
+ export declare const stats: {
6
+ fps: number;
7
+ frameTime: number;
8
+ cellsChanged: number;
9
+ damageRegion: {
10
+ x: number;
11
+ y: number;
12
+ w: number;
13
+ h: number;
14
+ } | null;
15
+ charPoolSize: number;
16
+ messageCount: number;
17
+ taskId: string | null;
18
+ taskStatus: string | null;
19
+ lastEvent: string | null;
20
+ wsState: string;
21
+ lastPing: number | null;
22
+ lastPingTime: number | null;
23
+ serverTasks: number;
24
+ serverRunning: number;
25
+ lastError: string | null;
26
+ };
27
+ export declare function updateFps(): void;
28
+ export declare function setDebugEnabled(enabled: boolean): void;
29
+ export declare function isDebugEnabled(): boolean;
30
+ export declare function log(category: string, message: string, data?: unknown): void;
31
+ export declare function logState(action: string, details?: Record<string, unknown>): void;
32
+ export declare function logRender(frameStats: {
33
+ time?: number;
34
+ changes?: number;
35
+ damage?: unknown;
36
+ charPoolSize?: number;
37
+ }): void;
38
+ export declare function logMessage(type: string, content: string, options?: {
39
+ taskId?: string;
40
+ toolCalls?: unknown[];
41
+ agentMessage?: string;
42
+ }): void;
43
+ export declare function logTask(event: string, taskId: string | null | undefined, details?: Record<string, unknown>): void;
44
+ export declare function logError(context: string, error: unknown): void;
45
+ export declare function updateWsState(wsOrState: string | {
46
+ readyState: number;
47
+ }): void;
48
+ export declare function recordPing(latencyMs: number): void;
49
+ export declare function updateServerStats(status: {
50
+ totalTasks?: number;
51
+ tasks?: unknown[];
52
+ runningTasks?: number;
53
+ }): void;
54
+ export declare function recordError(msg: string): void;
55
+ export declare function getLogPath(): string;
56
+ export declare function drawDebugOverlay(_screen: Screen, _width: number, _styles: Record<string, number>): void;
57
+ declare const _default: {
58
+ stats: {
59
+ fps: number;
60
+ frameTime: number;
61
+ cellsChanged: number;
62
+ damageRegion: {
63
+ x: number;
64
+ y: number;
65
+ w: number;
66
+ h: number;
67
+ } | null;
68
+ charPoolSize: number;
69
+ messageCount: number;
70
+ taskId: string | null;
71
+ taskStatus: string | null;
72
+ lastEvent: string | null;
73
+ wsState: string;
74
+ lastPing: number | null;
75
+ lastPingTime: number | null;
76
+ serverTasks: number;
77
+ serverRunning: number;
78
+ lastError: string | null;
79
+ };
80
+ log: typeof log;
81
+ logState: typeof logState;
82
+ logRender: typeof logRender;
83
+ logMessage: typeof logMessage;
84
+ logTask: typeof logTask;
85
+ logError: typeof logError;
86
+ setDebugEnabled: typeof setDebugEnabled;
87
+ isDebugEnabled: typeof isDebugEnabled;
88
+ updateFps: typeof updateFps;
89
+ updateWsState: typeof updateWsState;
90
+ updateServerStats: typeof updateServerStats;
91
+ recordPing: typeof recordPing;
92
+ recordError: typeof recordError;
93
+ getLogPath: typeof getLogPath;
94
+ drawDebugOverlay: typeof drawDebugOverlay;
95
+ };
96
+ export default _default;
package/dist/debug.js ADDED
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Debug logging and stats
3
+ */
4
+ import { appendFileSync, writeFileSync } from 'fs';
5
+ import { homedir } from 'os';
6
+ import { join } from 'path';
7
+ const LOG_PATH = join(homedir(), '.bergamot-debug.log');
8
+ let debugEnabled = process.env.BERGAMOT_DEBUG === '1';
9
+ export const stats = {
10
+ fps: 0,
11
+ frameTime: 0,
12
+ cellsChanged: 0,
13
+ damageRegion: null,
14
+ charPoolSize: 0,
15
+ messageCount: 0,
16
+ taskId: null,
17
+ taskStatus: null,
18
+ lastEvent: null,
19
+ wsState: 'closed',
20
+ lastPing: null,
21
+ lastPingTime: null,
22
+ serverTasks: 0,
23
+ serverRunning: 0,
24
+ lastError: null,
25
+ };
26
+ let frameCount = 0;
27
+ let lastFpsTime = Date.now();
28
+ export function updateFps() {
29
+ frameCount++;
30
+ const now = Date.now();
31
+ if (now - lastFpsTime >= 1000) {
32
+ stats.fps = frameCount;
33
+ frameCount = 0;
34
+ lastFpsTime = now;
35
+ }
36
+ }
37
+ export function setDebugEnabled(enabled) {
38
+ debugEnabled = enabled;
39
+ if (enabled) {
40
+ writeFileSync(LOG_PATH, `=== Debug Log ===\nStarted: ${new Date().toISOString()}\n\n`);
41
+ log('DEBUG', 'Debug logging enabled');
42
+ }
43
+ }
44
+ export function isDebugEnabled() {
45
+ return debugEnabled;
46
+ }
47
+ export function log(category, message, data = null) {
48
+ if (!debugEnabled)
49
+ return;
50
+ const timestamp = new Date().toISOString().split('T')[1].slice(0, -1);
51
+ let line = `[${timestamp}] [${category}] ${message}`;
52
+ if (data !== null) {
53
+ line += '\n ' + JSON.stringify(data, null, 2).replace(/\n/g, '\n ');
54
+ }
55
+ line += '\n';
56
+ try {
57
+ appendFileSync(LOG_PATH, line);
58
+ }
59
+ catch {
60
+ // Ignore write errors
61
+ }
62
+ }
63
+ export function logState(action, details = {}) {
64
+ log('STATE', action, details);
65
+ stats.lastEvent = action;
66
+ }
67
+ export function logRender(frameStats) {
68
+ stats.frameTime = Number(frameStats.time?.toFixed(1)) || 0;
69
+ stats.cellsChanged = frameStats.changes || 0;
70
+ stats.damageRegion = frameStats.damage;
71
+ stats.charPoolSize = frameStats.charPoolSize || 0;
72
+ if ((frameStats.changes || 0) > 100) {
73
+ log('RENDER', `Large frame: ${frameStats.changes} cells`, {
74
+ damage: frameStats.damage,
75
+ charPoolSize: frameStats.charPoolSize,
76
+ });
77
+ }
78
+ }
79
+ export function logMessage(type, content, options = {}) {
80
+ log('MSG', `${type}: ${content.slice(0, 50)}${content.length > 50 ? '...' : ''}`, {
81
+ taskId: options.taskId?.slice(0, 8),
82
+ toolCalls: options.toolCalls?.length || 0,
83
+ });
84
+ }
85
+ export function logTask(event, taskId, details = {}) {
86
+ stats.taskId = taskId?.slice(0, 8) || null;
87
+ stats.taskStatus = details.status || null;
88
+ log('TASK', `${event} ${taskId?.slice(0, 8) || 'none'}`, details);
89
+ }
90
+ export function logError(context, error) {
91
+ log('ERROR', context, {
92
+ message: error instanceof Error ? error.message : String(error),
93
+ stack: error instanceof Error ? error.stack?.split('\n').slice(0, 3) : undefined,
94
+ });
95
+ }
96
+ export function updateWsState(wsOrState) {
97
+ if (typeof wsOrState === 'string') {
98
+ stats.wsState = wsOrState;
99
+ }
100
+ else if (wsOrState) {
101
+ const states = ['connecting', 'open', 'closing', 'closed'];
102
+ stats.wsState = states[wsOrState.readyState] || 'unknown';
103
+ }
104
+ }
105
+ export function recordPing(latencyMs) {
106
+ stats.lastPing = latencyMs;
107
+ stats.lastPingTime = Date.now();
108
+ log('PING', `Server responded in ${latencyMs}ms`);
109
+ }
110
+ export function updateServerStats(status) {
111
+ if (status) {
112
+ stats.serverTasks = status.totalTasks || status.tasks?.length || 0;
113
+ stats.serverRunning = status.runningTasks || 0;
114
+ }
115
+ }
116
+ export function recordError(msg) {
117
+ stats.lastError = msg?.slice(0, 20);
118
+ log('ERROR', msg);
119
+ }
120
+ export function getLogPath() {
121
+ return LOG_PATH;
122
+ }
123
+ export function drawDebugOverlay(_screen, _width, _styles) {
124
+ // Debug overlay drawn directly to screen in full-screen mode could be added here
125
+ }
126
+ export default {
127
+ stats,
128
+ log,
129
+ logState,
130
+ logRender,
131
+ logMessage,
132
+ logTask,
133
+ logError,
134
+ setDebugEnabled,
135
+ isDebugEnabled,
136
+ updateFps,
137
+ updateWsState,
138
+ updateServerStats,
139
+ recordPing,
140
+ recordError,
141
+ getLogPath,
142
+ drawDebugOverlay,
143
+ };
144
+ //# sourceMappingURL=debug.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug.js","sourceRoot":"","sources":["../src/debug.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * jacq — Full-screen terminal chat client
4
+ *
5
+ * Uses a double-buffered full-screen rendering model:
6
+ * - Alt screen buffer (like vim) preserves terminal history on exit
7
+ * - Cell-based Screen with damage-tracked diffing for minimal redraws
8
+ * - Page Up/Down, Shift+Up/Down scrolling through message history
9
+ */
10
+ export {};