zilmate 1.10.3 → 1.10.4

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 (40) hide show
  1. package/README.md +364 -360
  2. package/SDK.md +1 -1
  3. package/dist/agents/manager.d.ts.map +1 -1
  4. package/dist/agents/manager.js +18 -3
  5. package/dist/agents/manager.js.map +1 -1
  6. package/dist/cli/doctor.d.ts.map +1 -1
  7. package/dist/cli/doctor.js +27 -0
  8. package/dist/cli/doctor.js.map +1 -1
  9. package/dist/cli/format.d.ts.map +1 -1
  10. package/dist/cli/format.js +183 -38
  11. package/dist/cli/format.js.map +1 -1
  12. package/dist/cli/setup.d.ts.map +1 -1
  13. package/dist/cli/setup.js +1 -0
  14. package/dist/cli/setup.js.map +1 -1
  15. package/dist/config/env.d.ts +1 -0
  16. package/dist/config/env.d.ts.map +1 -1
  17. package/dist/config/env.js +1 -0
  18. package/dist/config/env.js.map +1 -1
  19. package/dist/daemon/mac-installer.d.ts +4 -0
  20. package/dist/daemon/mac-installer.d.ts.map +1 -0
  21. package/dist/daemon/mac-installer.js +353 -0
  22. package/dist/daemon/mac-installer.js.map +1 -0
  23. package/dist/daemon/service.d.ts +15 -0
  24. package/dist/daemon/service.d.ts.map +1 -0
  25. package/dist/daemon/service.js +196 -0
  26. package/dist/daemon/service.js.map +1 -0
  27. package/dist/daemon/win-listener.ps1 +222 -0
  28. package/dist/index.js +48 -1
  29. package/dist/index.js.map +1 -1
  30. package/dist/runtime/progress.d.ts +7 -0
  31. package/dist/runtime/progress.d.ts.map +1 -1
  32. package/dist/runtime/progress.js +10 -0
  33. package/dist/runtime/progress.js.map +1 -1
  34. package/dist/runtime/swarm.d.ts.map +1 -1
  35. package/dist/runtime/swarm.js +19 -12
  36. package/dist/runtime/swarm.js.map +1 -1
  37. package/install.ps1 +1 -1
  38. package/package.json +6 -5
  39. package/scripts/copy-resources.mjs +18 -0
  40. package/scripts/release-github.mjs +6 -1
@@ -0,0 +1,353 @@
1
+ import { writeFileSync, mkdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { execSync } from 'node:child_process';
5
+ import { theme } from '../cli/theme.js';
6
+ export function installMacDaemon() {
7
+ if (process.platform !== 'darwin') {
8
+ console.error(theme.error('macOS installation is only supported on macOS hosts.'));
9
+ return;
10
+ }
11
+ const plistLabel = 'com.zilmate.daemon';
12
+ const launchAgentsDir = join(homedir(), 'Library', 'LaunchAgents');
13
+ const plistPath = join(launchAgentsDir, `${plistLabel}.plist`);
14
+ // Resolve absolute paths dynamically
15
+ const nodePath = process.execPath;
16
+ const entryPath = join(process.cwd(), 'dist', 'index.js');
17
+ const plistContent = `<?xml version="1.0" encoding="UTF-8"?>
18
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
19
+ <plist version="1.0">
20
+ <dict>
21
+ <key>Label</key>
22
+ <string>${plistLabel}</string>
23
+ <key>ProgramArguments</key>
24
+ <array>
25
+ <string>${nodePath}</string>
26
+ <string>${entryPath}</string>
27
+ <string>daemon</string>
28
+ <string>start</string>
29
+ </array>
30
+ <key>RunAtLoad</key>
31
+ <true/>
32
+ <key>KeepAlive</key>
33
+ <true/>
34
+ <key>StandardOutPath</key>
35
+ <string>/tmp/zilmate-daemon.log</string>
36
+ <key>StandardErrorPath</key>
37
+ <string>/tmp/zilmate-daemon.err</string>
38
+ </dict>
39
+ </plist>`;
40
+ try {
41
+ mkdirSync(launchAgentsDir, { recursive: true });
42
+ writeFileSync(plistPath, plistContent, 'utf8');
43
+ // Unload if already loaded to avoid duplicate errors
44
+ try {
45
+ execSync(`launchctl unload ${plistPath}`, { stdio: 'ignore' });
46
+ }
47
+ catch {
48
+ // Ignore failures on unload
49
+ }
50
+ // Load LaunchAgent
51
+ execSync(`launchctl load ${plistPath}`);
52
+ console.log(theme.ok('Successfully registered ZilMate Daemon as a macOS LaunchAgent.'));
53
+ console.log(theme.muted(`Daemon will now automatically start on login. Plist saved to: ${plistPath}`));
54
+ // Install the native Quick Action Service and automatic keyboard shortcut
55
+ installMacQuickAction();
56
+ }
57
+ catch (error) {
58
+ console.error(theme.error('Failed to install macOS LaunchAgent:'), error);
59
+ }
60
+ }
61
+ export function installMacQuickAction() {
62
+ const servicesDir = join(homedir(), 'Library', 'Services');
63
+ const workflowName = 'ZilMate Ubiquity.workflow';
64
+ const workflowDir = join(servicesDir, workflowName);
65
+ const contentsDir = join(workflowDir, 'Contents');
66
+ console.log(theme.muted(`\n[Ubiquity] Creating automated macOS Quick Action at ${workflowDir}...`));
67
+ try {
68
+ mkdirSync(contentsDir, { recursive: true });
69
+ // 1. Write Contents/Info.plist
70
+ const infoPlistContent = `<?xml version="1.0" encoding="UTF-8"?>
71
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
72
+ <plist version="1.0">
73
+ <dict>
74
+ <key>NSServices</key>
75
+ <array>
76
+ <dict>
77
+ <key>NSBackgroundColorName</key>
78
+ <string>background</string>
79
+ <key>NSMenuItem</key>
80
+ <dict>
81
+ <key>default</key>
82
+ <string>ZilMate Ubiquity</string>
83
+ </dict>
84
+ <key>NSMessage</key>
85
+ <string>runWorkflowAsService</string>
86
+ <key>NSReturnTypes</key>
87
+ <array>
88
+ <string>public.utf8-plain-text</string>
89
+ </array>
90
+ <key>NSSendTypes</key>
91
+ <array>
92
+ <string>public.utf8-plain-text</string>
93
+ </array>
94
+ </dict>
95
+ </array>
96
+ </dict>
97
+ </plist>`;
98
+ writeFileSync(join(contentsDir, 'Info.plist'), infoPlistContent, 'utf8');
99
+ // 2. Write Contents/document.wflow
100
+ const commandScript = `TOKEN=$(cat ~/.zilmate-token 2>/dev/null || cat .zilmate-token 2>/dev/null)
101
+ INPUT_TEXT=$(cat)
102
+ RESPONSE=$(/usr/bin/curl -s -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" -d "{\\"text\\":\\"$INPUT_TEXT\\"}" http://127.0.0.1:8124/process)
103
+ /usr/bin/osascript -l JavaScript -e "function run(argv) { try { return JSON.parse(argv[0]).result || ''; } catch(e) { return 'Error: ' + e.message; } }" "$RESPONSE"`;
104
+ const escapedScript = commandScript
105
+ .replace(/&/g, '&amp;')
106
+ .replace(/</g, '&lt;')
107
+ .replace(/>/g, '&gt;')
108
+ .replace(/"/g, '&quot;');
109
+ const documentWflowContent = `<?xml version="1.0" encoding="UTF-8"?>
110
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
111
+ <plist version="1.0">
112
+ <dict>
113
+ <key>AMApplicationBuild</key>
114
+ <string>523</string>
115
+ <key>AMApplicationVersion</key>
116
+ <string>2.10</string>
117
+ <key>AMDocumentVersion</key>
118
+ <string>2</string>
119
+ <key>actions</key>
120
+ <array>
121
+ <dict>
122
+ <key>action</key>
123
+ <dict>
124
+ <key>AMAccepts</key>
125
+ <dict>
126
+ <key>Container</key>
127
+ <string>List</string>
128
+ <key>Optional</key>
129
+ <true/>
130
+ <key>Types</key>
131
+ <array>
132
+ <string>com.apple.cocoa.string</string>
133
+ </array>
134
+ </dict>
135
+ <key>AMActionVersion</key>
136
+ <string>2.0.3</string>
137
+ <key>AMApplication</key>
138
+ <array>
139
+ <string>Automator</string>
140
+ </array>
141
+ <key>AMBundleID</key>
142
+ <string>com.apple.RunShellScript</string>
143
+ <key>AMInitializationProvisioner</key>
144
+ <string>customInit</string>
145
+ <key>AMName</key>
146
+ <string>Run Shell Script</string>
147
+ <key>AMParameterProperties</key>
148
+ <dict>
149
+ <key>COMMAND_STRING</key>
150
+ <dict/>
151
+ <key>CheckedForUserDefaultShell</key>
152
+ <dict/>
153
+ <key>inputMethod</key>
154
+ <dict/>
155
+ <key>shell</key>
156
+ <dict/>
157
+ <key>source</key>
158
+ <dict/>
159
+ </dict>
160
+ <key>AMProvides</key>
161
+ <dict>
162
+ <key>Container</key>
163
+ <string>List</string>
164
+ <key>Types</key>
165
+ <array>
166
+ <string>com.apple.cocoa.string</string>
167
+ </array>
168
+ </dict>
169
+ <key>ActionBundlePath</key>
170
+ <string>/System/Library/Automator/Run Shell Script.action</string>
171
+ <key>ActionName</key>
172
+ <string>Run Shell Script</string>
173
+ <key>ActionParameters</key>
174
+ <dict>
175
+ <key>COMMAND_STRING</key>
176
+ <string>${escapedScript}</string>
177
+ <key>CheckedForUserDefaultShell</key>
178
+ <true/>
179
+ <key>inputMethod</key>
180
+ <integer>0</integer>
181
+ <key>shell</key>
182
+ <string>/bin/zsh</string>
183
+ <key>source</key>
184
+ <string></string>
185
+ </dict>
186
+ <key>BundleIdentifier</key>
187
+ <string>com.apple.RunShellScript</string>
188
+ <key>CFBundleVersion</key>
189
+ <string>2.0.3</string>
190
+ <key>CanShowSelectedItemsWhenRun</key>
191
+ <false/>
192
+ <key>CanShowWhenRun</key>
193
+ <true/>
194
+ <key>Category</key>
195
+ <array>
196
+ <string>AMCategoryUtilities</string>
197
+ </array>
198
+ <key>Class Name</key>
199
+ <string>RunShellScriptAction</string>
200
+ <key>InputUUID</key>
201
+ <string>F914DB64-0731-4F29-87DB-C559981B85FF</string>
202
+ <key>Keywords</key>
203
+ <array>
204
+ <string>Shell</string>
205
+ <string>Script</string>
206
+ <string>Command</string>
207
+ <string>Run</string>
208
+ <string>Unix</string>
209
+ </array>
210
+ <key>OutputUUID</key>
211
+ <string>98CCED4A-B6A0-449D-BB1A-D74EE8A7E004</string>
212
+ <key>UUID</key>
213
+ <string>C5177FA8-6D70-4E80-879E-158223EC9042</string>
214
+ <key>UnlocalizedApplications</key>
215
+ <array>
216
+ <string>Automator</string>
217
+ </array>
218
+ <key>arguments</key>
219
+ <dict>
220
+ <key>0</key>
221
+ <dict>
222
+ <key>default value</key>
223
+ <integer>0</integer>
224
+ <key>name</key>
225
+ <string>inputMethod</string>
226
+ <key>required</key>
227
+ <string>0</string>
228
+ <key>type</key>
229
+ <string>0</string>
230
+ <key>uuid</key>
231
+ <string>0</string>
232
+ </dict>
233
+ <key>1</key>
234
+ <dict>
235
+ <key>default value</key>
236
+ <false/>
237
+ <key>name</key>
238
+ <string>CheckedForUserDefaultShell</string>
239
+ <key>required</key>
240
+ <string>0</string>
241
+ <key>type</key>
242
+ <string>0</string>
243
+ <key>uuid</key>
244
+ <string>1</string>
245
+ </dict>
246
+ <key>2</key>
247
+ <dict>
248
+ <key>default value</key>
249
+ <string></string>
250
+ <key>name</key>
251
+ <string>source</string>
252
+ <key>required</key>
253
+ <string>0</string>
254
+ <key>type</key>
255
+ <string>0</string>
256
+ <key>uuid</key>
257
+ <string>2</string>
258
+ </dict>
259
+ <key>3</key>
260
+ <dict>
261
+ <key>default value</key>
262
+ <string></string>
263
+ <key>name</key>
264
+ <string>COMMAND_STRING</string>
265
+ <key>required</key>
266
+ <string>0</string>
267
+ <key>type</key>
268
+ <string>0</string>
269
+ <key>uuid</key>
270
+ <string>3</string>
271
+ </dict>
272
+ <key>4</key>
273
+ <dict>
274
+ <key>default value</key>
275
+ <string>/bin/sh</string>
276
+ <key>name</key>
277
+ <string>shell</string>
278
+ <key>required</key>
279
+ <string>0</string>
280
+ <key>type</key>
281
+ <string>0</string>
282
+ <key>uuid</key>
283
+ <string>4</string>
284
+ </dict>
285
+ </dict>
286
+ <key>isViewVisible</key>
287
+ <true/>
288
+ <key>location</key>
289
+ <string>309.000000:305.000000</string>
290
+ <key>nibPath</key>
291
+ <string>/System/Library/Automator/Run Shell Script.action/Contents/Resources/Base.lproj/main.nib</string>
292
+ </dict>
293
+ <key>isViewVisible</key>
294
+ <true/>
295
+ </dict>
296
+ </array>
297
+ <key>connectors</key>
298
+ <dict/>
299
+ <key>workflowMetaData</key>
300
+ <dict>
301
+ <key>serviceInputTypeIdentifier</key>
302
+ <string>com.apple.Automator.text</string>
303
+ <key>serviceOutputTypeIdentifier</key>
304
+ <string>com.apple.Automator.text</string>
305
+ <key>serviceProcessesInput</key>
306
+ <integer>0</integer>
307
+ </dict>
308
+ </dict>
309
+ </plist>`;
310
+ writeFileSync(join(contentsDir, 'document.wflow'), documentWflowContent, 'utf8');
311
+ console.log(theme.ok('✓ Programmatically created native macOS Quick Action service!'));
312
+ // 3. Attempt programmatical key binding in pbs.plist
313
+ try {
314
+ const pbsPath = join(homedir(), 'Library', 'Preferences', 'pbs.plist');
315
+ // Set key equivalent in pbs.plist for this service to CMD+Shift+Z ("@$z")
316
+ execSync(`/usr/libexec/PlistBuddy -c "Add :NSServicesStatus:'com.apple.Automator.ZilMate Ubiquity':key_equivalent string '@\\$z'" "${pbsPath}" 2>/dev/null || /usr/libexec/PlistBuddy -c "Set :NSServicesStatus:'com.apple.Automator.ZilMate Ubiquity':key_equivalent string '@\\$z'" "${pbsPath}"`);
317
+ const theDate = Date.now() / 1000;
318
+ execSync(`defaults write com.apple.systempreferences NSServicesStatusModDate -float ${theDate}`);
319
+ // Update pbs services database
320
+ try {
321
+ execSync('/System/Library/CoreServices/pbs -update', { stdio: 'ignore' });
322
+ }
323
+ catch { }
324
+ console.log(theme.ok('✓ Automatically bound keyboard shortcut Cmd+Shift+Z to the Quick Action!'));
325
+ }
326
+ catch {
327
+ // Quietly fall back, manual setting is printed as instruction anyway
328
+ }
329
+ printMacShortcutInstructions();
330
+ }
331
+ catch (error) {
332
+ console.error(theme.error('Failed to create macOS Quick Action:'), error);
333
+ }
334
+ }
335
+ export function printMacShortcutInstructions() {
336
+ console.log('\n' + '='.repeat(60));
337
+ console.log(theme.textBright('🍎 macOS global Hotkey (Cmd+Shift+Z) Verification 🍎'));
338
+ console.log('='.repeat(60));
339
+ console.log('ZilMate Ubiquity has been installed natively as a macOS Service Quick Action.');
340
+ console.log('We have attempted to automatically bind it to your keyboard shortcut **Cmd+Shift+Z**.\n');
341
+ console.log(`${theme.brand('How to Verify or Customize the Shortcut:')}`);
342
+ console.log(`1. Open your Mac's **System Settings**.`);
343
+ console.log(`2. Navigate to: **Keyboard** > **Keyboard Shortcuts** (button) > **Services** > **Text**.`);
344
+ console.log(`3. Locate **"ZilMate Ubiquity"** in the list.`);
345
+ console.log(`4. Verify it has **⌘⇧Z** assigned. If it's empty, double-click on the right side and press **Cmd+Shift+Z**.`);
346
+ console.log(`5. Click **Done**.\n`);
347
+ console.log(`${theme.brand('Usage:')}`);
348
+ console.log(`- Select any text (e.g., "@zilmate rewrite: hello") in **any** app (WhatsApp, Slack, Safari, Notes, etc.).`);
349
+ console.log(`- Press **Cmd + Shift + Z**.`);
350
+ console.log(`- The text will automatically be sent, processed by ZilMate, and replaced in-place!`);
351
+ console.log('='.repeat(60) + '\n');
352
+ }
353
+ //# sourceMappingURL=mac-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mac-installer.js","sourceRoot":"","sources":["../../src/daemon/mac-installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type IncomingMessage, type ServerResponse } from 'node:http';
2
+ /**
3
+ * Triggers native OS notification toasts
4
+ */
5
+ export declare function sendOsNotification(title: string, message: string): void;
6
+ /**
7
+ * Strips the @zilmate prefix if present and extracts clean prompt instructions
8
+ */
9
+ export declare function parseUbiquityPrompt(text: string): {
10
+ prompt: string;
11
+ isTriggered: boolean;
12
+ };
13
+ export declare function handleProcessRequest(req: IncomingMessage, res: ServerResponse): Promise<void>;
14
+ export declare function startDaemon(): void;
15
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/daemon/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAepF;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,QA4BhE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAe1F;AAED,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,iBAmCnF;AAED,wBAAgB,WAAW,SAmG1B"}
@@ -0,0 +1,196 @@
1
+ import { createServer } from 'node:http';
2
+ import { runManager } from '../agents/manager.js';
3
+ import { theme } from '../cli/theme.js';
4
+ import { spawn } from 'node:child_process';
5
+ import { existsSync, writeFileSync, rmSync, openSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ import { fileURLToPath } from 'node:url';
8
+ import { env } from '../config/env.js';
9
+ import { randomBytes } from 'node:crypto';
10
+ import { homedir } from 'node:os';
11
+ const __dirname = fileURLToPath(new URL('.', import.meta.url));
12
+ const PORT = env.zilmateDaemonPort;
13
+ let sessionToken = '';
14
+ /**
15
+ * Triggers native OS notification toasts
16
+ */
17
+ export function sendOsNotification(title, message) {
18
+ if (process.platform === 'win32') {
19
+ // Windows PowerShell Toast
20
+ const psCommand = `
21
+ [Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null
22
+ [Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] | Out-Null
23
+ $xml = @"
24
+ <toast>
25
+ <visual>
26
+ <binding template="ToastGeneric">
27
+ <text>${title}</text>
28
+ <text>${message}</text>
29
+ </binding>
30
+ </visual>
31
+ </toast>
32
+ "@
33
+ $xmlDoc = [Windows.Data.Xml.Dom.XmlDocument]::New()
34
+ $xmlDoc.LoadXml($xml)
35
+ $toast = [Windows.UI.Notifications.ToastNotification]::new($xmlDoc)
36
+ $notifier = [Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier('{1AC14E77-02E7-4E5D-B744-2EB1AE5198B7}\\WindowsPowerShell\\v1.0\\powershell.exe')
37
+ $notifier.Show($toast)
38
+ `;
39
+ spawn('powershell', ['-NoProfile', '-NonInteractive', '-Command', psCommand], { stdio: 'ignore' });
40
+ }
41
+ else if (process.platform === 'darwin') {
42
+ // macOS Notification Center
43
+ const appleScript = `display notification "${message.replace(/"/g, '\\"')}" with title "${title.replace(/"/g, '\\"')}"`;
44
+ spawn('osascript', ['-e', appleScript], { stdio: 'ignore' });
45
+ }
46
+ }
47
+ /**
48
+ * Strips the @zilmate prefix if present and extracts clean prompt instructions
49
+ */
50
+ export function parseUbiquityPrompt(text) {
51
+ const trimmed = text.trim();
52
+ const triggerRegex = /^@zilmate\s*(?:rewrite\s+professionally\s*:\s*|rewrite\s*:\s*|answer\s+this\s*:\s*|answer\s*:\s*|:)?\s*([\s\S]+)$/i;
53
+ const match = trimmed.match(triggerRegex);
54
+ if (match && match[1] !== undefined) {
55
+ return { prompt: match[1].trim(), isTriggered: true };
56
+ }
57
+ // Fallback: If it starts with @zilmate but doesn't match the specific modifiers
58
+ if (trimmed.toLowerCase().startsWith('@zilmate')) {
59
+ return { prompt: trimmed.slice(8).trim(), isTriggered: true };
60
+ }
61
+ return { prompt: trimmed, isTriggered: false };
62
+ }
63
+ export async function handleProcessRequest(req, res) {
64
+ let body = '';
65
+ req.on('data', (chunk) => {
66
+ body += chunk;
67
+ });
68
+ req.on('end', async () => {
69
+ try {
70
+ const data = JSON.parse(body);
71
+ const text = data.text || '';
72
+ if (!text.trim()) {
73
+ res.writeHead(400, { 'Content-Type': 'application/json' });
74
+ res.end(JSON.stringify({ error: 'Text cannot be empty' }));
75
+ return;
76
+ }
77
+ console.log(theme.muted(`[Ubiquity] Received text length: ${text.length}`));
78
+ const { prompt, isTriggered } = parseUbiquityPrompt(text);
79
+ sendOsNotification('ZilMate Ubiquity', 'Thinking... 🧠');
80
+ const response = await runManager(prompt, {
81
+ sessionId: 'ubiquity',
82
+ });
83
+ sendOsNotification('ZilMate Ubiquity', 'Response ready! 🚀');
84
+ res.writeHead(200, { 'Content-Type': 'application/json' });
85
+ res.end(JSON.stringify({ result: response }));
86
+ }
87
+ catch (error) {
88
+ console.error(theme.error('[Ubiquity] Error processing text:'), error);
89
+ res.writeHead(500, { 'Content-Type': 'application/json' });
90
+ res.end(JSON.stringify({ error: error instanceof Error ? error.message : String(error) }));
91
+ }
92
+ });
93
+ }
94
+ export function startDaemon() {
95
+ // Generate secure single-use CSRF defense token
96
+ sessionToken = randomBytes(24).toString('hex');
97
+ const tokenPath = join(homedir(), '.zilmate-token');
98
+ try {
99
+ writeFileSync(tokenPath, sessionToken, { encoding: 'utf8', mode: 0o600 });
100
+ }
101
+ catch {
102
+ // Fallback if writing to homedir has permission issues
103
+ try {
104
+ writeFileSync('.zilmate-token', sessionToken, 'utf8');
105
+ }
106
+ catch { }
107
+ }
108
+ // Cleanup on process terminations
109
+ const cleanup = () => {
110
+ try {
111
+ rmSync(tokenPath);
112
+ }
113
+ catch { }
114
+ try {
115
+ rmSync('.zilmate-token');
116
+ }
117
+ catch { }
118
+ };
119
+ process.on('exit', cleanup);
120
+ process.on('SIGINT', cleanup);
121
+ process.on('SIGTERM', cleanup);
122
+ const server = createServer(async (req, res) => {
123
+ // Add simple CORS headers
124
+ res.setHeader('Access-Control-Allow-Origin', '*');
125
+ res.setHeader('Access-Control-Allow-Methods', 'POST, OPTIONS');
126
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization');
127
+ if (req.method === 'OPTIONS') {
128
+ res.writeHead(200);
129
+ res.end();
130
+ return;
131
+ }
132
+ // CSRF & Cross-Origin Security: Require Authorization header matching local sessionToken
133
+ const authHeader = req.headers['authorization'];
134
+ if (!authHeader || authHeader !== `Bearer ${sessionToken}`) {
135
+ console.warn(theme.error('[Ubiquity] CSRF/Unauthorized request blocked from origin:'), req.headers['origin']);
136
+ res.writeHead(401, { 'Content-Type': 'application/json' });
137
+ res.end(JSON.stringify({ error: 'Unauthorized: Local session token mismatch' }));
138
+ return;
139
+ }
140
+ if (req.method === 'POST' && req.url === '/process') {
141
+ await handleProcessRequest(req, res);
142
+ }
143
+ else {
144
+ res.writeHead(404, { 'Content-Type': 'application/json' });
145
+ res.end(JSON.stringify({ error: 'Not Found' }));
146
+ }
147
+ });
148
+ server.listen(PORT, '127.0.0.1', () => {
149
+ console.log(theme.ok(`[Ubiquity] ZilMate Daemon listening on http://127.0.0.1:${PORT}`));
150
+ sendOsNotification('ZilMate Daemon', 'ZilMate Ubiquity Service Started 🟢');
151
+ });
152
+ // Start keyboard listener on Windows
153
+ if (process.platform === 'win32') {
154
+ const listenerPath = join(__dirname, 'win-listener.ps1');
155
+ if (existsSync(listenerPath)) {
156
+ console.log(theme.muted(`[Ubiquity] Launching Windows Hotkey Listener at ${listenerPath}...`));
157
+ const logPath = join(homedir(), '.zilmate-listener-error.log');
158
+ let stdioOption = 'ignore';
159
+ try {
160
+ const logFile = openSync(logPath, 'a');
161
+ stdioOption = ['ignore', logFile, logFile];
162
+ }
163
+ catch {
164
+ // Fallback
165
+ }
166
+ const psArgs = [
167
+ '-NoProfile',
168
+ '-NonInteractive',
169
+ '-ExecutionPolicy', 'Bypass',
170
+ '-WindowStyle', 'Hidden',
171
+ '-Sta',
172
+ '-File', `"${listenerPath}"`,
173
+ '-Port', PORT.toString(),
174
+ '-Token', `"${sessionToken}"`
175
+ ];
176
+ const cmdString = `powershell ${psArgs.join(' ')}`;
177
+ const ps = spawn(cmdString, {
178
+ detached: true,
179
+ shell: true,
180
+ windowsHide: true,
181
+ stdio: stdioOption
182
+ });
183
+ ps.on('error', (err) => {
184
+ console.error(theme.error('[Ubiquity] Failed to start keyboard listener:'), err);
185
+ });
186
+ ps.on('exit', (code, signal) => {
187
+ console.warn(theme.warn(`[Ubiquity] Keyboard listener exited with code ${code} and signal ${signal}`));
188
+ });
189
+ ps.unref();
190
+ }
191
+ else {
192
+ console.warn(theme.warn(`[Ubiquity] Warning: win-listener.ps1 not found at ${listenerPath}`));
193
+ }
194
+ }
195
+ }
196
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/daemon/service.ts"],"names":[],"mappings":"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"}