@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
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Message actions
3
+ *
4
+ * Message types: 'user' | 'agent' | 'tool' | 'status' | 'error'
5
+ */
6
+ import type { Message } from '../types.js';
7
+ interface AddMessageOptions {
8
+ taskId?: string;
9
+ toolCalls?: Message['toolCalls'];
10
+ agentMessage?: string | null;
11
+ tokens?: {
12
+ input: number;
13
+ output: number;
14
+ } | null;
15
+ linkUrl?: string;
16
+ }
17
+ /**
18
+ * Add a message to the list
19
+ */
20
+ export declare function addMessage(type: Message['type'], content: string, options?: AddMessageOptions): Message;
21
+ /**
22
+ * Append to stream buffer (for streaming responses)
23
+ */
24
+ export declare function appendStream(chunk: string): void;
25
+ /**
26
+ * Flush stream buffer to a message
27
+ */
28
+ export declare function flushStream(taskId?: string): void;
29
+ /**
30
+ * Clear messages (when switching tasks)
31
+ */
32
+ export declare function clearMessages(): void;
33
+ /**
34
+ * Get messages for current task (or all if no task selected)
35
+ */
36
+ export declare function getVisibleMessages(): Message[];
37
+ /**
38
+ * Check if the current task is running
39
+ */
40
+ export declare function isCurrentTaskRunning(): boolean;
41
+ export {};
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Message actions
3
+ *
4
+ * Message types: 'user' | 'agent' | 'tool' | 'status' | 'error'
5
+ */
6
+ import { state, markDirty } from '../state.js';
7
+ let messageIdCounter = 0;
8
+ const MAX_MESSAGES = 100;
9
+ /**
10
+ * Add a message to the list
11
+ */
12
+ export function addMessage(type, content, options = {}) {
13
+ const message = {
14
+ id: `msg-${++messageIdCounter}`,
15
+ type,
16
+ content,
17
+ taskId: options.taskId || state.currentTaskId || undefined,
18
+ toolCalls: options.toolCalls || null,
19
+ agentMessage: options.agentMessage || null,
20
+ tokens: options.tokens || null,
21
+ linkUrl: options.linkUrl,
22
+ timestamp: Date.now(),
23
+ };
24
+ state.messages.push(message);
25
+ // Trim old messages
26
+ if (state.messages.length > MAX_MESSAGES) {
27
+ const trimCount = state.messages.length - MAX_MESSAGES;
28
+ state.messages = state.messages.slice(trimCount);
29
+ }
30
+ markDirty();
31
+ return message;
32
+ }
33
+ /**
34
+ * Append to stream buffer (for streaming responses)
35
+ */
36
+ export function appendStream(chunk) {
37
+ state.streamBuffer += chunk;
38
+ markDirty();
39
+ }
40
+ /**
41
+ * Flush stream buffer to a message
42
+ */
43
+ export function flushStream(taskId) {
44
+ if (state.streamBuffer.trim()) {
45
+ addMessage('agent', state.streamBuffer, { taskId });
46
+ }
47
+ state.streamBuffer = '';
48
+ }
49
+ /**
50
+ * Clear messages (when switching tasks)
51
+ */
52
+ export function clearMessages() {
53
+ state.messages = [];
54
+ state.streamBuffer = '';
55
+ markDirty();
56
+ }
57
+ /**
58
+ * Get messages for current task (or all if no task selected)
59
+ */
60
+ export function getVisibleMessages() {
61
+ if (!state.currentTaskId) {
62
+ return state.messages;
63
+ }
64
+ return state.messages.filter(m => !m.taskId || m.taskId === state.currentTaskId);
65
+ }
66
+ /**
67
+ * Check if the current task is running
68
+ */
69
+ export function isCurrentTaskRunning() {
70
+ if (state.submitting)
71
+ return true;
72
+ if (!state.currentTaskId)
73
+ return false;
74
+ const task = state.tasks.find(t => t.id === state.currentTaskId);
75
+ return !!task && (task.status === 'running' || task.status === 'pending');
76
+ }
77
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/actions/messages.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG/C,IAAI,gBAAgB,GAAG,CAAC,CAAC;AACzB,MAAM,YAAY,GAAG,GAAG,CAAC;AAUzB;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAqB,EAAE,OAAe,EAAE,UAA6B,EAAE;IAC9F,MAAM,OAAO,GAAY;QACrB,EAAE,EAAE,OAAO,EAAE,gBAAgB,EAAE;QAC/B,IAAI;QACJ,OAAO;QACP,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,SAAS;QAC1D,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;QACpC,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,IAAI;QAC1C,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;QAC9B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACxB,CAAC;IAEF,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAE7B,oBAAoB;IACpB,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,YAAY,CAAC;QACvD,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACrD,CAAC;IAED,SAAS,EAAE,CAAC;IACZ,OAAO,OAAO,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACtC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC;IAC5B,SAAS,EAAE,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAAe;IACvC,IAAI,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5B,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IACzB,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;IACpB,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC;IACxB,SAAS,EAAE,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAC9B,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC;QACvB,OAAO,KAAK,CAAC,QAAQ,CAAC;IAC1B,CAAC;IACD,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC7B,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,aAAa,CAChD,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAChC,IAAI,KAAK,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAClC,IAAI,CAAC,KAAK,CAAC,aAAa;QAAE,OAAO,KAAK,CAAC;IACvC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,aAAa,CAAC,CAAC;IACjE,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Prompt state actions
3
+ */
4
+ import type { PendingPrompt } from '../types.js';
5
+ export declare function setPendingPrompt(data: PendingPrompt): void;
6
+ export declare function clearPrompt(): void;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Prompt state actions
3
+ */
4
+ import { state, markDirty } from '../state.js';
5
+ export function setPendingPrompt(data) {
6
+ state.pendingPrompt = data;
7
+ markDirty();
8
+ }
9
+ export function clearPrompt() {
10
+ state.pendingPrompt = null;
11
+ state.promptFreeInput = false;
12
+ state.promptInputText = '';
13
+ state.promptInputCursor = 0;
14
+ state.promptPickerIndex = 0;
15
+ state.promptPickerPage = 0;
16
+ markDirty();
17
+ }
18
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/actions/prompts.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG/C,MAAM,UAAU,gBAAgB,CAAC,IAAmB;IAChD,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,WAAW;IACvB,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC;IAC3B,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC;IAC9B,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC;IAC3B,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAC;IAC5B,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAC;IAC5B,KAAK,CAAC,gBAAgB,GAAG,CAAC,CAAC;IAC3B,SAAS,EAAE,CAAC;AAChB,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Task & connection state actions
3
+ */
4
+ import type { Task, Widget } from '../types.js';
5
+ export declare function setConnected(clientId: string): void;
6
+ export declare function setDisconnected(): void;
7
+ export declare function setServerStatus(status: unknown): void;
8
+ export declare function setServerUrl(url: string): void;
9
+ export declare function setTasks(tasks: Task[]): void;
10
+ export declare function updateTask(taskId: string | undefined, updates: Record<string, unknown>): void;
11
+ export declare function setCurrentTask(taskId: string | null): void;
12
+ export declare function setSubmitting(val: boolean): void;
13
+ export declare function setWidgets(widgets: Widget[]): void;
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Task & connection state actions
3
+ */
4
+ import { state, markDirty } from '../state.js';
5
+ // --- Connection state ---
6
+ export function setConnected(clientId) {
7
+ state.connected = true;
8
+ state.clientId = clientId;
9
+ state.statusMessage = null;
10
+ markDirty();
11
+ }
12
+ export function setDisconnected() {
13
+ state.connected = false;
14
+ markDirty();
15
+ }
16
+ export function setServerStatus(status) {
17
+ state.serverStatus = status;
18
+ markDirty();
19
+ }
20
+ export function setServerUrl(url) {
21
+ state.serverUrl = url;
22
+ }
23
+ // --- Task list ---
24
+ export function setTasks(tasks) {
25
+ state.tasks = tasks;
26
+ state.tasksLoaded = true;
27
+ markDirty();
28
+ }
29
+ export function updateTask(taskId, updates) {
30
+ if (!taskId)
31
+ return;
32
+ const task = state.tasks.find(t => t.id === taskId);
33
+ if (task) {
34
+ // Handle token accumulation separately
35
+ if (updates.tokensDelta) {
36
+ const delta = updates.tokensDelta;
37
+ const prev = task.tokens || { input: 0, output: 0, cacheRead: 0, cacheCreate: 0 };
38
+ task.tokens = {
39
+ input: prev.input + (delta.input || 0),
40
+ output: prev.output + (delta.output || 0),
41
+ cacheRead: prev.cacheRead + (delta.cacheRead || 0),
42
+ cacheCreate: prev.cacheCreate + (delta.cacheCreate || 0),
43
+ };
44
+ const { tokensDelta: _, ...rest } = updates;
45
+ Object.assign(task, rest, { updatedAt: new Date().toISOString() });
46
+ }
47
+ else {
48
+ Object.assign(task, updates, { updatedAt: new Date().toISOString() });
49
+ }
50
+ }
51
+ }
52
+ export function setCurrentTask(taskId) {
53
+ state.currentTaskId = taskId;
54
+ markDirty();
55
+ }
56
+ export function setSubmitting(val) {
57
+ state.submitting = val;
58
+ markDirty();
59
+ }
60
+ // --- Widgets ---
61
+ export function setWidgets(widgets) {
62
+ state.widgets = widgets;
63
+ state.widgetsLoaded = true;
64
+ markDirty();
65
+ }
66
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/actions/tasks.ts"],"names":[],"mappings":"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"}
package/dist/auth.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Auth — device authorization flow for TUI authentication.
3
+ */
4
+ interface LoginResult {
5
+ success: boolean;
6
+ error?: string;
7
+ alreadyLoggedIn?: boolean;
8
+ name?: string;
9
+ }
10
+ export declare function loginFromTUI(onProgress: (msg: string) => void): Promise<LoginResult>;
11
+ export declare function fetchUserName(): Promise<string | null>;
12
+ export {};
package/dist/auth.js ADDED
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Auth — device authorization flow for TUI authentication.
3
+ */
4
+ import { loadConfig, saveConfig } from './config.js';
5
+ import { API_HTTP_URL } from './constants.js';
6
+ import { exec } from 'child_process';
7
+ import http from 'http';
8
+ import https from 'https';
9
+ function getApiBaseUrl(config) {
10
+ if (config.apiHttpUrl) {
11
+ return config.apiHttpUrl.replace(/\/+$/, '');
12
+ }
13
+ const wsUrl = config.apiUrl || 'ws://127.0.0.1:8765/ws';
14
+ // Auth endpoints only exist on the cloud API gateway, not the local server
15
+ if (/^wss?:\/\/(127\.0\.0\.1|localhost)(:\d+)?(\/|$)/i.test(wsUrl)) {
16
+ return API_HTTP_URL.replace(/\/+$/, '');
17
+ }
18
+ return wsUrl
19
+ .replace(/^wss:/, 'https:')
20
+ .replace(/^ws:/, 'http:')
21
+ .replace(/\/ws\/?$/, '');
22
+ }
23
+ function request(url, options = {}) {
24
+ return new Promise((resolve, reject) => {
25
+ const parsedUrl = new URL(url);
26
+ const mod = parsedUrl.protocol === 'https:' ? https : http;
27
+ const body = options.body ? JSON.stringify(options.body) : null;
28
+ const req = mod.request(parsedUrl, {
29
+ method: options.method || 'GET',
30
+ headers: {
31
+ 'Content-Type': 'application/json',
32
+ ...(options.headers || {}),
33
+ 'Content-Length': String(body ? Buffer.byteLength(body) : 0),
34
+ },
35
+ }, (res) => {
36
+ let data = '';
37
+ res.on('data', (chunk) => { data += chunk; });
38
+ res.on('end', () => {
39
+ try {
40
+ resolve({ status: res.statusCode, data: JSON.parse(data) });
41
+ }
42
+ catch {
43
+ resolve({ status: res.statusCode, data: { raw: data } });
44
+ }
45
+ });
46
+ });
47
+ req.on('error', reject);
48
+ if (body)
49
+ req.write(body);
50
+ req.end();
51
+ });
52
+ }
53
+ function openBrowser(url) {
54
+ const cmd = process.platform === 'darwin' ? 'open'
55
+ : process.platform === 'win32' ? 'start'
56
+ : 'xdg-open';
57
+ exec(`${cmd} "${url}"`);
58
+ }
59
+ function sleep(ms) {
60
+ return new Promise(resolve => setTimeout(resolve, ms));
61
+ }
62
+ export async function loginFromTUI(onProgress) {
63
+ const config = loadConfig();
64
+ const baseUrl = getApiBaseUrl(config);
65
+ if (config.apiKey) {
66
+ try {
67
+ const res = await request(`${baseUrl}/me`, {
68
+ headers: { 'Authorization': `Bearer ${config.apiKey}` },
69
+ });
70
+ if (res.status === 200) {
71
+ return { success: true, alreadyLoggedIn: true, name: (res.data.name || res.data.id) };
72
+ }
73
+ }
74
+ catch { /* invalid key, proceed */ }
75
+ }
76
+ onProgress('Requesting code...');
77
+ let deviceRes;
78
+ try {
79
+ deviceRes = await request(`${baseUrl}/auth/device`, { method: 'POST' });
80
+ }
81
+ catch (err) {
82
+ return { success: false, error: `Failed to connect to API: ${err.message}` };
83
+ }
84
+ if (deviceRes.status !== 200) {
85
+ return { success: false, error: deviceRes.data?.detail || 'Failed to start device auth' };
86
+ }
87
+ const { device_code, verification_url, expires_in, interval } = deviceRes.data;
88
+ onProgress('Opening browser...');
89
+ openBrowser(verification_url);
90
+ const pollInterval = (interval || 5) * 1000;
91
+ const deadline = Date.now() + (expires_in || 600) * 1000;
92
+ onProgress('Waiting for approval...');
93
+ while (Date.now() < deadline) {
94
+ await sleep(pollInterval);
95
+ try {
96
+ const pollRes = await request(`${baseUrl}/auth/token`, {
97
+ method: 'POST',
98
+ body: { device_code },
99
+ });
100
+ if (pollRes.status === 200 && pollRes.data.status === 'approved') {
101
+ saveConfig({ apiKey: pollRes.data.api_key });
102
+ return { success: true, name: pollRes.data.name };
103
+ }
104
+ if (pollRes.status === 410 || pollRes.data.status === 'expired') {
105
+ return { success: false, error: 'Device code expired. Try again.' };
106
+ }
107
+ onProgress('Waiting for approval...');
108
+ }
109
+ catch {
110
+ onProgress('Waiting for approval (retrying...)');
111
+ }
112
+ }
113
+ return { success: false, error: 'Device code expired. Try again.' };
114
+ }
115
+ export async function fetchUserName() {
116
+ const config = loadConfig();
117
+ if (!config.apiKey)
118
+ return null;
119
+ const baseUrl = getApiBaseUrl(config);
120
+ try {
121
+ const res = await request(`${baseUrl}/me`, {
122
+ headers: { 'Authorization': `Bearer ${config.apiKey}` },
123
+ });
124
+ if (res.status === 200) {
125
+ return (res.data.name || res.data.id || null);
126
+ }
127
+ }
128
+ catch { /* ignore */ }
129
+ return null;
130
+ }
131
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Clipboard Module
3
+ * Handles text and image pasting from system clipboard
4
+ */
5
+ declare const PASTE_START = "\u001B[200~";
6
+ declare const PASTE_END = "\u001B[201~";
7
+ export declare function hasClipboardImage(): Promise<boolean>;
8
+ export declare function readClipboardImage(): Promise<{
9
+ base64: string;
10
+ mimeType: string;
11
+ } | null>;
12
+ export declare function pasteImageFromClipboard(onImage: (base64: string, mimeType: string) => void, onError: (err: Error) => void): Promise<boolean>;
13
+ export { PASTE_START, PASTE_END };
14
+ declare const _default: {
15
+ hasClipboardImage: typeof hasClipboardImage;
16
+ readClipboardImage: typeof readClipboardImage;
17
+ pasteImageFromClipboard: typeof pasteImageFromClipboard;
18
+ PASTE_START: string;
19
+ PASTE_END: string;
20
+ };
21
+ export default _default;
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Clipboard Module
3
+ * Handles text and image pasting from system clipboard
4
+ */
5
+ import { spawn } from 'child_process';
6
+ import * as fs from 'fs';
7
+ import * as path from 'path';
8
+ import * as os from 'os';
9
+ const PASTE_START = '\x1b[200~';
10
+ const PASTE_END = '\x1b[201~';
11
+ const TEMP_IMAGE_PATH = path.join(os.tmpdir(), 'bergamot_clipboard_image.png');
12
+ function getClipboardCommands() {
13
+ const platform = process.platform;
14
+ const commands = {
15
+ darwin: {
16
+ checkImage: ['osascript', ['-e', 'the clipboard as «class PNGf»']],
17
+ saveImage: ['osascript', [
18
+ '-e', 'set png_data to (the clipboard as «class PNGf»)',
19
+ '-e', `set fp to open for access POSIX file "${TEMP_IMAGE_PATH}" with write permission`,
20
+ '-e', 'write png_data to fp',
21
+ '-e', 'close access fp'
22
+ ]],
23
+ getTextPath: ['osascript', ['-e', 'get POSIX path of (the clipboard as «class furl»)']]
24
+ },
25
+ linux: {
26
+ checkImage: ['sh', ['-c', 'xclip -selection clipboard -t TARGETS -o 2>/dev/null | grep -qE "image/(png|jpeg|jpg|gif|webp)" || wl-paste -l 2>/dev/null | grep -qE "image/(png|jpeg|jpg|gif|webp)"']],
27
+ saveImage: ['sh', ['-c', `xclip -selection clipboard -t image/png -o > "${TEMP_IMAGE_PATH}" 2>/dev/null || wl-paste --type image/png > "${TEMP_IMAGE_PATH}"`]],
28
+ getTextPath: ['sh', ['-c', 'xclip -selection clipboard -t text/plain -o 2>/dev/null || wl-paste 2>/dev/null']]
29
+ },
30
+ win32: {
31
+ checkImage: ['powershell', ['-NoProfile', '-Command', '(Get-Clipboard -Format Image) -ne $null']],
32
+ saveImage: ['powershell', ['-NoProfile', '-Command', `$img = Get-Clipboard -Format Image; if ($img) { $img.Save('${TEMP_IMAGE_PATH.replace(/\\/g, '\\\\')}', [System.Drawing.Imaging.ImageFormat]::Png) }`]],
33
+ getTextPath: ['powershell', ['-NoProfile', '-Command', 'Get-Clipboard']]
34
+ }
35
+ };
36
+ return commands[platform] || commands.linux;
37
+ }
38
+ function runCommand(cmd, args) {
39
+ return new Promise((resolve) => {
40
+ const proc = spawn(cmd, args, { stdio: ['pipe', 'pipe', 'pipe'] });
41
+ let stdout = '';
42
+ let stderr = '';
43
+ proc.stdout?.on('data', (data) => { stdout += data.toString(); });
44
+ proc.stderr?.on('data', (data) => { stderr += data.toString(); });
45
+ proc.on('close', (code) => {
46
+ resolve({ code, stdout, stderr });
47
+ });
48
+ proc.on('error', (err) => {
49
+ resolve({ code: 1, stdout: '', stderr: err.message });
50
+ });
51
+ });
52
+ }
53
+ export async function hasClipboardImage() {
54
+ const commands = getClipboardCommands();
55
+ const [cmd, args] = commands.checkImage;
56
+ const result = await runCommand(cmd, args);
57
+ return result.code === 0;
58
+ }
59
+ export async function readClipboardImage() {
60
+ const commands = getClipboardCommands();
61
+ try {
62
+ const hasImage = await hasClipboardImage();
63
+ if (!hasImage)
64
+ return null;
65
+ const [saveCmd, saveArgs] = commands.saveImage;
66
+ const saveResult = await runCommand(saveCmd, saveArgs);
67
+ if (saveResult.code !== 0)
68
+ return null;
69
+ if (!fs.existsSync(TEMP_IMAGE_PATH))
70
+ return null;
71
+ const imageBuffer = fs.readFileSync(TEMP_IMAGE_PATH);
72
+ if (imageBuffer.length === 0)
73
+ return null;
74
+ const base64 = imageBuffer.toString('base64');
75
+ const mimeType = detectImageMimeType(imageBuffer);
76
+ try {
77
+ fs.unlinkSync(TEMP_IMAGE_PATH);
78
+ }
79
+ catch {
80
+ // Ignore cleanup errors
81
+ }
82
+ return { base64, mimeType };
83
+ }
84
+ catch {
85
+ return null;
86
+ }
87
+ }
88
+ function detectImageMimeType(buffer) {
89
+ if (buffer[0] === 0x89 && buffer[1] === 0x50 && buffer[2] === 0x4E && buffer[3] === 0x47) {
90
+ return 'image/png';
91
+ }
92
+ if (buffer[0] === 0xFF && buffer[1] === 0xD8 && buffer[2] === 0xFF) {
93
+ return 'image/jpeg';
94
+ }
95
+ if (buffer[0] === 0x47 && buffer[1] === 0x49 && buffer[2] === 0x46) {
96
+ return 'image/gif';
97
+ }
98
+ if (buffer[0] === 0x52 && buffer[1] === 0x49 && buffer[2] === 0x46 && buffer[3] === 0x46) {
99
+ return 'image/webp';
100
+ }
101
+ return 'image/png';
102
+ }
103
+ export async function pasteImageFromClipboard(onImage, onError) {
104
+ try {
105
+ const image = await readClipboardImage();
106
+ if (image) {
107
+ onImage(image.base64, image.mimeType);
108
+ return true;
109
+ }
110
+ return false;
111
+ }
112
+ catch (err) {
113
+ if (onError)
114
+ onError(err);
115
+ return false;
116
+ }
117
+ }
118
+ export { PASTE_START, PASTE_END };
119
+ export default {
120
+ hasClipboardImage,
121
+ readClipboardImage,
122
+ pasteImageFromClipboard,
123
+ PASTE_START,
124
+ PASTE_END
125
+ };
126
+ //# sourceMappingURL=clipboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clipboard.js","sourceRoot":"","sources":["../src/clipboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Command Registry — single source of truth for all discoverable actions
3
+ */
4
+ export interface HotkeyDef {
5
+ key: string;
6
+ label: string;
7
+ }
8
+ export interface CommandDef {
9
+ command: string;
10
+ desc: string;
11
+ }
12
+ export declare const HOTKEYS: HotkeyDef[];
13
+ export declare const SLASH_COMMANDS: CommandDef[];
14
+ export declare const COLON_COMMANDS: CommandDef[];
15
+ export declare function filterCommands(defs: CommandDef[], typed: string): CommandDef[];
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Command Registry — single source of truth for all discoverable actions
3
+ */
4
+ export const HOTKEYS = [
5
+ { key: 'Tab', label: 'chats' },
6
+ { key: '^F', label: 'files' },
7
+ { key: '^W', label: 'widgets' },
8
+ { key: '^C', label: 'quit' },
9
+ ];
10
+ export const SLASH_COMMANDS = [
11
+ { command: '/clear', desc: 'reset view' },
12
+ { command: '/login', desc: 'authenticate' },
13
+ { command: '/logout', desc: 'sign out' },
14
+ ];
15
+ export const COLON_COMMANDS = [
16
+ { command: ':chats', desc: 'open chats' },
17
+ { command: ':widgets', desc: 'open widgets' },
18
+ ];
19
+ export function filterCommands(defs, typed) {
20
+ const lower = typed.toLowerCase();
21
+ return defs.filter(d => d.command.toLowerCase().startsWith(lower));
22
+ }
23
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH,MAAM,CAAC,MAAM,OAAO,GAAgB;IAChC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE;IAC9B,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE;IAC7B,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE;IAC/B,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;CAC/B,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAiB;IACxC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE;IACzC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE;IAC3C,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE;CAC3C,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAiB;IACxC,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE;IACzC,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,cAAc,EAAE;CAChD,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,IAAkB,EAAE,KAAa;IAC5D,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Configuration loader
3
+ * Loads from ~/.jacq/config.json
4
+ */
5
+ export interface Config {
6
+ apiUrl: string;
7
+ apiHttpUrl: string | null;
8
+ apiKey: string | null;
9
+ }
10
+ export declare function loadConfig(): Config;
11
+ export declare function saveConfig(updates: Partial<Record<string, string | null>>): void;
12
+ export declare function getConfigPath(): string;