bajaclaw 0.17.1 → 0.17.2

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
@@ -7,7 +7,7 @@
7
7
  ██╔══██╗██╔══██║██ ██║██╔══██║ ██║ ██║ ██╔══██║██║███╗██║
8
8
  ██████╔╝██║ ██║╚█████╔╝██║ ██║ ╚██████╗███████╗██║ ██║╚███╔███╔╝
9
9
  ╚═════╝ ╚═╝ ╚═╝ ╚════╝ ╚═╝ ╚═╝ ╚═════╝╚══════╝╚═╝ ╚═╝ ╚══╝╚══╝
10
- autonomous agents on your terms · MIT · v0.17.1
10
+ autonomous agents on your terms · MIT · v0.17.2
11
11
  ```
12
12
 
13
13
  ## What BajaClaw is
@@ -17,7 +17,7 @@
17
17
  // attachments. Inbound attachments are noted in the body as
18
18
  // `[attachment]` markers; agents still see them and can ask the user
19
19
  // to forward through another channel.
20
- import { spawnSync } from "node:child_process";
20
+ import { spawnSync, spawn } from "node:child_process";
21
21
  import { existsSync, readFileSync, writeFileSync, renameSync, openSync, closeSync, statSync } from "node:fs";
22
22
  import { homedir } from "node:os";
23
23
  import { dirname, join } from "node:path";
@@ -168,6 +168,65 @@ export function sendTypingIndicator(handle, typing, log) {
168
168
  log?.warn("gateway.imessage.typing-fail", { verb, handle: norm, status: r.status, err: err.slice(0, 200) });
169
169
  return { ok: false, exitCode: r.status ?? -1, error: err };
170
170
  }
171
+ function startTypingHelperProcess(log) {
172
+ if (process.platform !== "darwin")
173
+ return null;
174
+ const helperPath = resolveTypingHelperPath();
175
+ if (!helperPath)
176
+ return null;
177
+ let proc = null;
178
+ let helperStopped = false;
179
+ let retried = false;
180
+ function launchHelper() {
181
+ // helperPath is checked non-null at the top of startTypingHelperProcess.
182
+ const child = spawn(helperPath, ["serve"], { stdio: ["pipe", "pipe", "pipe"] });
183
+ proc = child;
184
+ child.stderr?.on("data", (d) => {
185
+ const msg = d.toString().trim();
186
+ if (msg)
187
+ log.warn("gateway.imessage.helper-stderr", { msg: msg.slice(0, 200) });
188
+ });
189
+ child.stdout?.on("data", (d) => {
190
+ const lines = d.toString().trim().split(/\r?\n/);
191
+ for (const line of lines) {
192
+ if (line.startsWith("err ")) {
193
+ log.warn("gateway.imessage.helper-err", { msg: line.slice(4, 200) });
194
+ }
195
+ }
196
+ });
197
+ child.on("error", (e) => {
198
+ log.warn("gateway.imessage.helper-spawn-error", { error: e.message });
199
+ });
200
+ child.on("exit", (code) => {
201
+ if (!helperStopped && !retried) {
202
+ retried = true;
203
+ log.info("gateway.imessage.helper-respawn", { code });
204
+ launchHelper();
205
+ }
206
+ });
207
+ }
208
+ launchHelper();
209
+ return {
210
+ send: (cmd) => {
211
+ try {
212
+ proc?.stdin?.write(cmd + "\n");
213
+ }
214
+ catch { /* typing is best-effort */ }
215
+ },
216
+ stop: () => {
217
+ helperStopped = true;
218
+ try {
219
+ proc?.stdin?.write("quit\n");
220
+ }
221
+ catch { /* ignore */ }
222
+ // Give it 1s to exit cleanly, then SIGTERM.
223
+ setTimeout(() => { try {
224
+ proc?.kill("SIGTERM");
225
+ }
226
+ catch { /* ignore */ } }, 1000);
227
+ },
228
+ };
229
+ }
171
230
  // The inbound query. ROWID is monotonic and indexed, so "everything
172
231
  // after the last one we saw" is an O(log n) lookup plus a sequential
173
232
  // scan over only the new rows. Joins to handle.id for the sender
@@ -279,6 +338,7 @@ export async function startIMessage(profile, config, log, deps) {
279
338
  }
280
339
  const allowlist = (config.allowlist ?? []).map((h) => normalizeHandle(String(h)));
281
340
  const useAllowlist = allowlist.length > 0;
341
+ const typingHelper = startTypingHelperProcess(log);
282
342
  let stopped = false;
283
343
  let timer = null;
284
344
  const tick = async () => {
@@ -323,22 +383,34 @@ export async function startIMessage(profile, config, log, deps) {
323
383
  // chatId here is the normalized handle string for the adapter.
324
384
  await sendViaAppleScript(String(chatId), text, log);
325
385
  },
326
- startTyping: (_chatId) => {
327
- // iMessage typing indicators are not wired as of v0.17.1. v0.17.0
328
- // shipped a native helper that talks to IMCore, but the registry
329
- // stays empty in a standalone process because we don't register
330
- // as a proper IMDaemonListener - imagent only pushes chat state
331
- // to subscribed listeners (that's how BlueBubbles works, with a
332
- // full Obj-C delegate). The helper binary is retained for a
333
- // future pass that implements the listener properly; for now we
334
- // keep the shape (startTyping returns a stop fn) so the gateway
335
- // plumbing stays consistent.
336
- return () => { };
386
+ startTyping: (chatId) => {
387
+ if (!typingHelper)
388
+ return () => { };
389
+ const handle = normalizeHandle(String(chatId));
390
+ let indicatorStopped = false;
391
+ const sendStart = () => typingHelper.send(`start ${handle}`);
392
+ sendStart();
393
+ // iMessage "..." indicator stays on until the sender replies or
394
+ // ~60s elapse. Refresh every 30s to keep it alive across long
395
+ // cycles. Also retry at 10s in case the first call raced against
396
+ // the helper's registry population (imagent may take a few seconds
397
+ // to push chat state after the listener is registered).
398
+ const initialRetry = setTimeout(() => { if (!indicatorStopped)
399
+ sendStart(); }, 10_000);
400
+ const refreshTimer = setInterval(() => { if (!indicatorStopped)
401
+ sendStart(); }, 30_000);
402
+ return () => {
403
+ indicatorStopped = true;
404
+ clearTimeout(initialRetry);
405
+ clearInterval(refreshTimer);
406
+ typingHelper.send(`stop ${handle}`);
407
+ };
337
408
  },
338
409
  stop: async () => {
339
410
  stopped = true;
340
411
  if (timer)
341
412
  clearTimeout(timer);
413
+ typingHelper?.stop();
342
414
  try {
343
415
  db.close();
344
416
  }
@@ -1 +1 @@
1
- {"version":3,"file":"imessage.js","sourceRoot":"","sources":["../../src/channels/imessage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"imessage.js","sourceRoot":"","sources":["../../src/channels/imessage.ts"],"names":[],"mappings":"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"}
Binary file
@@ -54,8 +54,23 @@
54
54
  - (NSString *)chatIdentifier;
55
55
  @end
56
56
 
57
+ // Listener class. Registered with imagent so it pushes chat state
58
+ // to this process. Without this registration, IMChatRegistry stays
59
+ // empty even after a successful connectToDaemon + blockUntilConnected.
60
+ //
61
+ // Key insight from BlueBubbles: imagent only delivers chat state to
62
+ // processes registered via [[daemon listener] addHandler:] with an
63
+ // appropriate capabilities bitmask.
64
+ @interface BajaCrawListener : NSObject
65
+ @end
66
+
57
67
  static NSString * const IMCORE_PATH = @"/System/Library/PrivateFrameworks/IMCore.framework/IMCore";
58
68
  static BOOL gVerbose = NO;
69
+ // Set to YES by listener callbacks once imagent has pushed at least
70
+ // the initial chat state. Used as an early-exit signal in waitForChats.
71
+ static BOOL gReady = NO;
72
+ // Kept alive for process lifetime; ARC retains through this global.
73
+ static id gListenerInstance = nil;
59
74
 
60
75
  static void logDebug(NSString *fmt, ...) {
61
76
  if (!gVerbose) return;
@@ -66,6 +81,77 @@ static void logDebug(NSString *fmt, ...) {
66
81
  fprintf(stderr, "DEBUG: %s\n", [s UTF8String]);
67
82
  }
68
83
 
84
+ @implementation BajaCrawListener
85
+
86
+ // imagent calls setupComplete: / setupCompleted: when the connection
87
+ // handshake finishes. Either name can appear depending on macOS version.
88
+ - (void)setupComplete:(id)arg {
89
+ logDebug(@"setupComplete:");
90
+ gReady = YES;
91
+ }
92
+ - (void)setupCompleted:(id)arg {
93
+ logDebug(@"setupCompleted:");
94
+ gReady = YES;
95
+ }
96
+ - (void)didConnectToIMAgent:(id)arg {
97
+ logDebug(@"didConnectToIMAgent:");
98
+ gReady = YES;
99
+ }
100
+
101
+ // imagent calls these when chat state becomes available.
102
+ - (void)chatLoaded:(id)arg1 chatProperties:(id)arg2 {
103
+ logDebug(@"chatLoaded:chatProperties:");
104
+ gReady = YES;
105
+ }
106
+ - (void)chatsDidChange:(id)arg1 {
107
+ logDebug(@"chatsDidChange:");
108
+ gReady = YES;
109
+ }
110
+ - (void)chatsLoaded:(id)arg1 {
111
+ logDebug(@"chatsLoaded:");
112
+ gReady = YES;
113
+ }
114
+
115
+ // No-op stubs for other common imagent callbacks.
116
+ - (void)messageReceived:(id)arg1 { }
117
+ - (void)account:(id)arg1 updatedSettings:(id)arg2 { }
118
+ - (void)account:(id)arg1 status:(id)arg2 { }
119
+ - (void)account:(id)arg1 loginStatusChanged:(id)arg2 { }
120
+ - (void)didDisconnectFromIMAgent:(id)arg1 { }
121
+
122
+ // imagent queries capabilities to decide which events to push.
123
+ // Return all bits so we receive chat list and setup events.
124
+ - (unsigned long long)capabilities {
125
+ return 0xFFFFFFFFFFFFFFFFULL;
126
+ }
127
+
128
+ // Safe fallback: imagent sends many selectors we haven't declared.
129
+ // Without methodSignatureForSelector: + forwardInvocation:, any
130
+ // unknown selector would crash with "unrecognized selector".
131
+ - (NSMethodSignature *)methodSignatureForSelector:(SEL)sel {
132
+ NSMethodSignature *sig = [super methodSignatureForSelector:sel];
133
+ if (!sig) {
134
+ // Generic void(id) signature covers the vast majority of
135
+ // imagent callbacks that deliver a single object argument.
136
+ sig = [NSMethodSignature signatureWithObjCTypes:"v@:@"];
137
+ }
138
+ return sig;
139
+ }
140
+ - (void)forwardInvocation:(NSInvocation *)inv {
141
+ NSString *selName = NSStringFromSelector([inv selector]);
142
+ logDebug(@"unhandled imagent callback: %@", selName);
143
+ // Treat any "chat"/"setup"/"chats" prefixed callback as a ready
144
+ // signal - imagent may rename these methods across macOS versions.
145
+ if ([selName hasPrefix:@"chat"]
146
+ || [selName hasPrefix:@"setup"]
147
+ || [selName hasPrefix:@"chats"]
148
+ || [selName hasPrefix:@"didConnect"]) {
149
+ gReady = YES;
150
+ }
151
+ }
152
+
153
+ @end
154
+
69
155
  static BOOL loadIMCore(void) {
70
156
  void *h = dlopen([IMCORE_PATH UTF8String], RTLD_NOW);
71
157
  if (!h) {
@@ -80,18 +166,53 @@ static BOOL connectDaemon(void) {
80
166
  if (!daemonClass) return NO;
81
167
  id daemon = [daemonClass performSelector:@selector(sharedInstance)];
82
168
  if (!daemon) return NO;
169
+
170
+ // Create the listener before connecting so it is ready when imagent
171
+ // delivers the initial connection callbacks.
172
+ gListenerInstance = [[BajaCrawListener alloc] init];
173
+
83
174
  if ([daemon respondsToSelector:@selector(connectToDaemon)]) {
84
175
  [daemon performSelector:@selector(connectToDaemon)];
85
176
  }
86
177
  if ([daemon respondsToSelector:@selector(blockUntilConnected)]) {
87
178
  [daemon performSelector:@selector(blockUntilConnected)];
88
179
  }
180
+
181
+ // Register as a listener. imagent will begin pushing chat state
182
+ // once the handler is added with appropriate capabilities.
183
+ // Primary path: [[daemon listener] addHandler:]
184
+ id daemonListener = [daemon respondsToSelector:@selector(listener)]
185
+ ? [daemon performSelector:@selector(listener)] : nil;
186
+
187
+ SEL addHandlerSel = NSSelectorFromString(@"addHandler:");
188
+ if (daemonListener && [daemonListener respondsToSelector:addHandlerSel]) {
189
+ // Dynamic selector: ARC warns about potential leak but gListenerInstance
190
+ // is a strong global so there is no actual leak.
191
+ #pragma clang diagnostic push
192
+ #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
193
+ [daemonListener performSelector:addHandlerSel withObject:gListenerInstance];
194
+ #pragma clang diagnostic pop
195
+ logDebug(@"listener registered via [daemonListener addHandler:]");
196
+ } else {
197
+ // Fallback: some macOS versions expose addListener: on the daemon itself.
198
+ SEL addListenerSel = NSSelectorFromString(@"addListener:");
199
+ if ([daemon respondsToSelector:addListenerSel]) {
200
+ #pragma clang diagnostic push
201
+ #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
202
+ [daemon performSelector:addListenerSel withObject:gListenerInstance];
203
+ #pragma clang diagnostic pop
204
+ logDebug(@"listener registered via [daemon addListener:]");
205
+ } else {
206
+ logDebug(@"WARNING: no listener registration API found - chat list may not load");
207
+ }
208
+ }
209
+
89
210
  return YES;
90
211
  }
91
212
 
92
213
  // Wait up to `seconds` for the registry to report at least one chat.
93
- // Returns the number of chats when it gave up (may be 0 if the wait
94
- // expired).
214
+ // Now also watches gReady (set by listener callbacks) as an early exit.
215
+ // Returns the chat count when it gives up (may be 0 on timeout).
95
216
  static NSUInteger waitForChats(NSTimeInterval seconds) {
96
217
  NSDate *deadline = [NSDate dateWithTimeIntervalSinceNow:seconds];
97
218
  NSUInteger last = 0;
@@ -105,6 +226,18 @@ static NSUInteger waitForChats(NSTimeInterval seconds) {
105
226
  last = [(NSArray *)chats count];
106
227
  if (last > 0) return last;
107
228
  }
229
+ // gReady means the listener received a chat-state callback.
230
+ // Give the registry one extra tick to settle, then return
231
+ // whatever we have (even if count is still 0 - some macOS
232
+ // versions populate via chatIdentifier lookup only).
233
+ if (gReady) {
234
+ [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.3]];
235
+ id chats2 = [reg performSelector:@selector(allExistingChats)];
236
+ if ([chats2 isKindOfClass:[NSArray class]]) {
237
+ last = [(NSArray *)chats2 count];
238
+ }
239
+ return last;
240
+ }
108
241
  }
109
242
  }
110
243
  return last;
@@ -173,48 +306,72 @@ static NSString *toggleTyping(NSString *target, BOOL typing) {
173
306
  return nil;
174
307
  }
175
308
 
176
- // Long-running stdin loop. Reads line-delimited commands; writes
177
- // "ok"/"err ..." lines to stdout. Returns when stdin is closed or a
178
- // "quit" command arrives.
309
+ // Long-running stdin loop. Reads commands on a GCD background thread
310
+ // so the main thread can keep spinning NSRunLoop, which is required
311
+ // for imagent to deliver callbacks to gListenerInstance.
312
+ //
313
+ // Commands are dispatched back to the main thread for toggleTyping
314
+ // because IMCore is not thread-safe.
179
315
  static int runDaemonLoop(void) {
180
316
  logDebug(@"entering daemon loop");
181
- // Warm up the registry once. A few seconds of waiting at start is
182
- // fine because we only pay it once per helper lifetime.
183
- waitForChats(5.0);
184
-
185
- char *buf = NULL;
186
- size_t bufSize = 0;
187
- ssize_t len;
188
- setvbuf(stdout, NULL, _IOLBF, 0); // line-buffered
189
- while ((len = getline(&buf, &bufSize, stdin)) != -1) {
190
- @autoreleasepool {
191
- // Trim trailing newline.
192
- while (len > 0 && (buf[len-1] == '\n' || buf[len-1] == '\r')) { buf[--len] = '\0'; }
193
- if (len == 0) continue;
194
- NSString *line = [NSString stringWithUTF8String:buf];
195
- NSArray<NSString *> *parts = [line componentsSeparatedByString:@" "];
196
- NSString *cmd = parts.count > 0 ? parts[0] : @"";
197
- NSString *arg = parts.count > 1 ? [[parts subarrayWithRange:NSMakeRange(1, parts.count - 1)] componentsJoinedByString:@" "] : @"";
198
-
199
- if ([cmd isEqualToString:@"ping"]) {
200
- printf("ok\n");
201
- } else if ([cmd isEqualToString:@"quit"]) {
202
- printf("ok\n");
203
- break;
204
- } else if ([cmd isEqualToString:@"start"] || [cmd isEqualToString:@"stop"]) {
205
- BOOL typing = [cmd isEqualToString:@"start"];
206
- NSString *err = toggleTyping(arg, typing);
207
- if (err) {
208
- printf("err %s\n", [err UTF8String]);
209
- } else {
317
+ setvbuf(stdout, NULL, _IOLBF, 0);
318
+
319
+ __block volatile BOOL done = NO;
320
+
321
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
322
+ char *buf = NULL;
323
+ size_t bufSize = 0;
324
+ ssize_t len;
325
+ while (!done && (len = getline(&buf, &bufSize, stdin)) != -1) {
326
+ @autoreleasepool {
327
+ while (len > 0 && (buf[len-1] == '\n' || buf[len-1] == '\r')) { buf[--len] = '\0'; }
328
+ if (len == 0) continue;
329
+ NSString *line = [NSString stringWithUTF8String:buf];
330
+ NSArray<NSString *> *parts = [line componentsSeparatedByString:@" "];
331
+ NSString *cmd = parts.count > 0 ? parts[0] : @"";
332
+ NSString *arg = parts.count > 1
333
+ ? [[parts subarrayWithRange:NSMakeRange(1, parts.count - 1)] componentsJoinedByString:@" "]
334
+ : @"";
335
+
336
+ if ([cmd isEqualToString:@"ping"]) {
210
337
  printf("ok\n");
338
+ } else if ([cmd isEqualToString:@"quit"]) {
339
+ printf("ok\n");
340
+ done = YES;
341
+ break;
342
+ } else if ([cmd isEqualToString:@"start"] || [cmd isEqualToString:@"stop"]) {
343
+ BOOL typing = [cmd isEqualToString:@"start"];
344
+ __block NSString *err = nil;
345
+ // Dispatch to main thread: IMCore callbacks and toggleTyping
346
+ // must run on the same thread as the runloop.
347
+ dispatch_sync(dispatch_get_main_queue(), ^{
348
+ err = toggleTyping(arg, typing);
349
+ });
350
+ if (err) {
351
+ printf("err %s\n", [err UTF8String]);
352
+ } else {
353
+ printf("ok\n");
354
+ }
355
+ } else {
356
+ printf("err unknown command\n");
211
357
  }
212
- } else {
213
- printf("err unknown command\n");
214
358
  }
215
359
  }
360
+ free(buf);
361
+ done = YES;
362
+ dispatch_async(dispatch_get_main_queue(), ^{
363
+ CFRunLoopStop(CFRunLoopGetMain());
364
+ });
365
+ });
366
+
367
+ // Spin the main runloop indefinitely. This is what keeps imagent
368
+ // able to fire callbacks on gListenerInstance. Without this, the
369
+ // listener is registered but never invoked.
370
+ while (!done) {
371
+ @autoreleasepool {
372
+ [[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]];
373
+ }
216
374
  }
217
- free(buf);
218
375
  return 0;
219
376
  }
220
377
 
@@ -251,9 +408,9 @@ int main(int argc, char *argv[]) {
251
408
 
252
409
  NSString *target = [NSString stringWithUTF8String:argv[2]];
253
410
 
254
- // One-shot mode: wait up to 5s for registry. If still empty,
255
- // we won't find the chat. Callers in long-running setups
256
- // should use `serve` instead.
411
+ // One-shot mode: wait up to 5s for registry. The listener registered
412
+ // in connectDaemon() will receive callbacks while the runloop spins
413
+ // inside waitForChats(), which now exits early when gReady is set.
257
414
  waitForChats(5.0);
258
415
 
259
416
  NSString *err = toggleTyping(target, typing);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bajaclaw",
3
- "version": "0.17.1",
3
+ "version": "0.17.2",
4
4
  "description": "BajaClaw - autonomous agents on your terms",
5
5
  "type": "module",
6
6
  "bajaclaw": {