whazaa 0.8.0 → 0.9.0
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/dist/watcher/index.d.ts +8 -0
- package/dist/watcher/index.d.ts.map +1 -1
- package/dist/watcher/index.js +105 -16
- package/dist/watcher/index.js.map +1 -1
- package/package.json +1 -1
package/dist/watcher/index.d.ts
CHANGED
|
@@ -45,6 +45,14 @@
|
|
|
45
45
|
* Start the Whazaa watcher — the long-running process that bridges WhatsApp
|
|
46
46
|
* and iTerm2 Claude Code sessions.
|
|
47
47
|
*
|
|
48
|
+
* Supports two modes:
|
|
49
|
+
* - **Hub mode**: AIBroker daemon is running. Whazaa acts as a thin transport
|
|
50
|
+
* adapter — incoming WA messages are forwarded to the hub for routing.
|
|
51
|
+
* PAILot gateway is NOT started (hub owns it). Outgoing messages arrive
|
|
52
|
+
* via the `deliver` IPC handler (Phase 2).
|
|
53
|
+
* - **Embedded mode**: No daemon. Whazaa runs everything locally (current
|
|
54
|
+
* behavior, fully backward compatible).
|
|
55
|
+
*
|
|
48
56
|
* Suspends the event loop indefinitely via `await new Promise(() => {})`;
|
|
49
57
|
* exits only on SIGINT or SIGTERM.
|
|
50
58
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/watcher/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/watcher/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAuEH;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,KAAK,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0JhE"}
|
package/dist/watcher/index.js
CHANGED
|
@@ -52,12 +52,65 @@ import { createMessageHandler } from "./commands.js";
|
|
|
52
52
|
import { setAppDir, loadSessionRegistry } from "./persistence.js";
|
|
53
53
|
import { log, setLogPrefix } from "./log.js";
|
|
54
54
|
import { handleScreenshot } from "./screenshot.js";
|
|
55
|
-
import { router, APIBackend, HybridSessionManager, setHybridManager, snapshotAllSessions, startWsGateway, stopWsGateway, setScreenshotHandler, WatcherClient, DAEMON_SOCKET_PATH } from "aibroker";
|
|
55
|
+
import { router, APIBackend, HybridSessionManager, setHybridManager, snapshotAllSessions, startWsGateway, stopWsGateway, setScreenshotHandler, WatcherClient, DAEMON_SOCKET_PATH, createBrokerMessage } from "aibroker";
|
|
56
|
+
// ── Hub mode detection ───────────────────────────────────────────────────────
|
|
57
|
+
/**
|
|
58
|
+
* Probe the AIBroker hub daemon to determine whether it is running.
|
|
59
|
+
*
|
|
60
|
+
* Connects to `/tmp/aibroker.sock` and calls `status`. If the call succeeds
|
|
61
|
+
* within 2 seconds, the hub is considered alive and Whazaa enters hub mode.
|
|
62
|
+
* On any failure (socket missing, refused, timeout), returns false and
|
|
63
|
+
* Whazaa falls back to embedded mode (current behavior unchanged).
|
|
64
|
+
*/
|
|
65
|
+
async function detectHubMode() {
|
|
66
|
+
const client = new WatcherClient(DAEMON_SOCKET_PATH);
|
|
67
|
+
try {
|
|
68
|
+
const result = await Promise.race([
|
|
69
|
+
client.call_raw("status", {}),
|
|
70
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error("timeout")), 2000)),
|
|
71
|
+
]);
|
|
72
|
+
return result !== null;
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Slash commands that must be handled locally even in hub mode.
|
|
80
|
+
*
|
|
81
|
+
* These commands require direct iTerm2/Baileys access that only the Whazaa
|
|
82
|
+
* process has. They should never be forwarded to the hub.
|
|
83
|
+
*/
|
|
84
|
+
const LOCAL_SLASH_COMMANDS = new Set([
|
|
85
|
+
"/h", "/help",
|
|
86
|
+
"/cc", "/esc", "/enter", "/tab",
|
|
87
|
+
"/up", "/down", "/left", "/right",
|
|
88
|
+
"/restart", "/login",
|
|
89
|
+
]);
|
|
90
|
+
/** Check if a message matches a local-only slash command. */
|
|
91
|
+
function isLocalSlashCommand(text) {
|
|
92
|
+
const trimmed = text.trim();
|
|
93
|
+
// Exact matches
|
|
94
|
+
if (LOCAL_SLASH_COMMANDS.has(trimmed))
|
|
95
|
+
return true;
|
|
96
|
+
// /pick N pattern
|
|
97
|
+
if (/^\/pick\s+\d+/.test(trimmed))
|
|
98
|
+
return true;
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
56
101
|
// --- Main loop ---------------------------------------------------------------
|
|
57
102
|
/**
|
|
58
103
|
* Start the Whazaa watcher — the long-running process that bridges WhatsApp
|
|
59
104
|
* and iTerm2 Claude Code sessions.
|
|
60
105
|
*
|
|
106
|
+
* Supports two modes:
|
|
107
|
+
* - **Hub mode**: AIBroker daemon is running. Whazaa acts as a thin transport
|
|
108
|
+
* adapter — incoming WA messages are forwarded to the hub for routing.
|
|
109
|
+
* PAILot gateway is NOT started (hub owns it). Outgoing messages arrive
|
|
110
|
+
* via the `deliver` IPC handler (Phase 2).
|
|
111
|
+
* - **Embedded mode**: No daemon. Whazaa runs everything locally (current
|
|
112
|
+
* behavior, fully backward compatible).
|
|
113
|
+
*
|
|
61
114
|
* Suspends the event loop indefinitely via `await new Promise(() => {})`;
|
|
62
115
|
* exits only on SIGINT or SIGTERM.
|
|
63
116
|
*
|
|
@@ -89,10 +142,14 @@ export async function watch(rawSessionId) {
|
|
|
89
142
|
manager.createApiSession("Default", process.env.AIBROKER_CWD ?? homedir());
|
|
90
143
|
// Set APIBackend as default for backward-compat (deliverViaApi reads it)
|
|
91
144
|
router.setDefaultBackend(apiBackend);
|
|
145
|
+
// ── Detect hub mode ──
|
|
146
|
+
const hubMode = await detectHubMode();
|
|
147
|
+
const hubClient = hubMode ? new WatcherClient(DAEMON_SOCKET_PATH) : null;
|
|
92
148
|
console.log(`Whazaa Watch`);
|
|
93
149
|
console.log(` Session: ${activeSessionId || "(auto-discover)"}`);
|
|
94
150
|
console.log(` Backend: hybrid (api=${apiBackend.model})`);
|
|
95
151
|
console.log(` Socket: ${IPC_SOCKET_PATH}`);
|
|
152
|
+
console.log(` Mode: ${hubMode ? "hub (daemon detected)" : "embedded (standalone)"}`);
|
|
96
153
|
console.log();
|
|
97
154
|
let consecutiveFailures = 0;
|
|
98
155
|
// Graceful shutdown
|
|
@@ -102,7 +159,8 @@ export async function watch(rawSessionId) {
|
|
|
102
159
|
console.log(`\n[whazaa-watch] ${signal} received. Stopping.`);
|
|
103
160
|
if (cleanupWatcher)
|
|
104
161
|
cleanupWatcher();
|
|
105
|
-
|
|
162
|
+
if (!hubMode)
|
|
163
|
+
stopWsGateway();
|
|
106
164
|
if (ipcServer) {
|
|
107
165
|
ipcServer.close();
|
|
108
166
|
try {
|
|
@@ -110,6 +168,10 @@ export async function watch(rawSessionId) {
|
|
|
110
168
|
}
|
|
111
169
|
catch { /* ignore */ }
|
|
112
170
|
}
|
|
171
|
+
// Unregister from hub on shutdown
|
|
172
|
+
if (hubClient) {
|
|
173
|
+
hubClient.call_raw("unregister_adapter", { name: "whazaa" }).catch(() => { });
|
|
174
|
+
}
|
|
113
175
|
process.exit(0);
|
|
114
176
|
};
|
|
115
177
|
process.on("SIGINT", () => shutdown("SIGINT"));
|
|
@@ -123,7 +185,28 @@ export async function watch(rawSessionId) {
|
|
|
123
185
|
console.log(`Connecting to WhatsApp...\n`);
|
|
124
186
|
const { cleanup, triggerLogin } = await connectWatcher((body, _msgId, timestamp) => {
|
|
125
187
|
console.log(`[whazaa-watch] (direct) -> ${body}`);
|
|
126
|
-
|
|
188
|
+
if (hubMode && hubClient) {
|
|
189
|
+
// Hub mode: forward non-local messages to the hub for routing.
|
|
190
|
+
// Local slash commands (keyboard, /restart, /help) stay in Whazaa.
|
|
191
|
+
if (isLocalSlashCommand(body)) {
|
|
192
|
+
handleMessage(body, timestamp);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
// Create a BrokerMessage and route through the hub
|
|
196
|
+
const message = createBrokerMessage("whazaa", body.trim().startsWith("/") ? "command" : "text", { text: body });
|
|
197
|
+
message.timestamp = timestamp;
|
|
198
|
+
hubClient.call_raw("route_message", {
|
|
199
|
+
message: message,
|
|
200
|
+
}).catch((err) => {
|
|
201
|
+
// Hub delivery failed — fall back to local handling
|
|
202
|
+
log(`Hub route_message failed, falling back to local: ${err instanceof Error ? err.message : String(err)}`);
|
|
203
|
+
handleMessage(body, timestamp);
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
// Embedded mode: handle everything locally (unchanged)
|
|
208
|
+
handleMessage(body, timestamp);
|
|
209
|
+
}
|
|
127
210
|
});
|
|
128
211
|
cleanupWatcher = cleanup;
|
|
129
212
|
// Restore persisted sessions and auto-discover active iTerm2 sessions
|
|
@@ -146,19 +229,25 @@ export async function watch(rawSessionId) {
|
|
|
146
229
|
}
|
|
147
230
|
// Start the IPC server
|
|
148
231
|
ipcServer = startIpcServer(triggerLogin);
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
}
|
|
232
|
+
if (hubMode && hubClient) {
|
|
233
|
+
// Hub mode: do NOT start PAILot WsGateway — the hub owns it.
|
|
234
|
+
// Register with the hub so it can route messages to us.
|
|
235
|
+
log("Hub mode: skipping WsGateway (hub owns PAILot gateway)");
|
|
236
|
+
hubClient.call_raw("register_adapter", {
|
|
237
|
+
name: "whazaa",
|
|
238
|
+
socketPath: IPC_SOCKET_PATH,
|
|
239
|
+
}).then(() => {
|
|
240
|
+
log("Registered with AIBroker hub daemon");
|
|
241
|
+
}).catch((err) => {
|
|
242
|
+
log(`Hub registration failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
// Embedded mode: start WsGateway locally (current behavior)
|
|
247
|
+
setScreenshotHandler(handleScreenshot);
|
|
248
|
+
startWsGateway(handleMessage);
|
|
249
|
+
log("Embedded mode: started local WsGateway");
|
|
250
|
+
}
|
|
162
251
|
// Keep process alive
|
|
163
252
|
await new Promise(() => { });
|
|
164
253
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/watcher/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAEL,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAkB,oBAAoB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,cAAc,EAAE,aAAa,EAAE,oBAAoB,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/watcher/index.ts"],"names":[],"mappings":"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"}
|