a2acalling 0.6.44 → 0.6.45

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.
package/README.md CHANGED
@@ -49,6 +49,32 @@ a2a call "Alice's Agent" "Hey! Want to collaborate on the a2a protocol?"
49
49
  a2a call "a2a://their-host.com/fed_xyz789" "Hello!"
50
50
  ```
51
51
 
52
+ ## 🖥️ Native macOS App
53
+
54
+ A2A Callbook is also available as a native macOS app that wraps the dashboard in a proper macOS window with native integrations.
55
+
56
+ **Features:**
57
+ - Native macOS notifications for incoming calls
58
+ - Keyboard shortcuts: Cmd+1–5 for tab switching, Cmd+R to refresh
59
+ - Menu bar tray icon with server status
60
+ - Deep link support (`a2a://` URLs open in the app)
61
+ - Cmd+W hides the window (stays in tray), Cmd+Q quits
62
+
63
+ **Auto-installed** on macOS when you run `npm install -g a2acalling`. The app is placed in `~/Applications/`.
64
+
65
+ **Manual install:** Download the `.dmg` from [GitHub Releases](https://github.com/onthegonow/a2a_calling/releases).
66
+
67
+ **Build from source:**
68
+
69
+ ```bash
70
+ # Requires Rust: https://rustup.rs
71
+ cargo install tauri-cli --version "^2"
72
+ cd native/macos/src-tauri
73
+ cargo tauri build --target universal-apple-darwin
74
+ ```
75
+
76
+ To open the app via CLI: `a2a gui` (prefers native app; use `--browser` to force browser).
77
+
52
78
  ## 📦 Installation
53
79
 
54
80
  ```bash
package/bin/cli.js CHANGED
@@ -149,6 +149,23 @@ function openInBrowser(url) {
149
149
  }
150
150
  }
151
151
 
152
+ function findNativeApp() {
153
+ if (os.platform() !== 'darwin') return null;
154
+
155
+ const candidates = [
156
+ path.join(os.homedir(), 'Applications', 'A2A Callbook.app'),
157
+ '/Applications/A2A Callbook.app',
158
+ ];
159
+
160
+ for (const appPath of candidates) {
161
+ try {
162
+ if (fs.existsSync(appPath)) return appPath;
163
+ } catch (_) {}
164
+ }
165
+
166
+ return null;
167
+ }
168
+
152
169
  async function findLocalServerPort(preferredPorts = []) {
153
170
  const http = require('http');
154
171
 
@@ -1476,6 +1493,18 @@ a2a add "${inviteUrl}" "${ownerText || 'friend'}" && a2a call "${ownerText || 'f
1476
1493
  return;
1477
1494
  }
1478
1495
 
1496
+ // Prefer native app on macOS (--browser flag forces browser)
1497
+ if (!args.flags.browser) {
1498
+ const nativeApp = findNativeApp();
1499
+ if (nativeApp) {
1500
+ console.log('Opening A2A Callbook native app...');
1501
+ const result = openInBrowser(nativeApp);
1502
+ if (result.attempted) {
1503
+ return;
1504
+ }
1505
+ }
1506
+ }
1507
+
1479
1508
  const preferred = [];
1480
1509
  if (args.flags.port || args.flags.p) preferred.push(args.flags.port || args.flags.p);
1481
1510
  if (process.env.A2A_PORT) preferred.push(process.env.A2A_PORT);
@@ -2244,6 +2273,24 @@ a2a add "${inviteUrl}" "${ownerText || 'friend'}" && a2a call "${ownerText || 'f
2244
2273
  console.log('Removing database... ⏭️');
2245
2274
  }
2246
2275
 
2276
+ // Remove native macOS app if present
2277
+ if (os.platform() === 'darwin') {
2278
+ const appCandidates = [
2279
+ path.join(os.homedir(), 'Applications', 'A2A Callbook.app'),
2280
+ '/Applications/A2A Callbook.app',
2281
+ ];
2282
+ for (const appPath of appCandidates) {
2283
+ if (fs.existsSync(appPath)) {
2284
+ try {
2285
+ fs.rmSync(appPath, { recursive: true, force: true });
2286
+ console.log(`Removed ${appPath}`);
2287
+ } catch (err) {
2288
+ console.log(`Could not remove ${appPath}: ${err.message}`);
2289
+ }
2290
+ }
2291
+ }
2292
+ }
2293
+
2247
2294
  console.log('\nTo complete removal:');
2248
2295
  console.log(' npm uninstall -g a2acalling\n');
2249
2296
  console.log(`Config preserved: ${keepConfig ? 'yes' : 'no'}`);