aibroker 0.7.4 → 0.7.6

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.
@@ -8,11 +8,13 @@
8
8
  *
9
9
  * See Notes/SPEC-mqtt-pailot.md for the full protocol specification.
10
10
  */
11
- import { createServer } from "node:net";
11
+ import { createServer as createTlsServer } from "node:tls";
12
12
  import { randomUUID } from "node:crypto";
13
- import { dirname } from "node:path";
13
+ import { join, dirname } from "node:path";
14
14
  import { fileURLToPath } from "node:url";
15
15
  import { createRequire } from "node:module";
16
+ import { existsSync, mkdirSync, readFileSync } from "node:fs";
17
+ import { execFileSync } from "node:child_process";
16
18
  import { log } from "../../core/log.js";
17
19
  import { enqueue } from "./message-queue.js";
18
20
  const __filename = fileURLToPath(import.meta.url);
@@ -39,11 +41,60 @@ async function loadAedes() {
39
41
  return false;
40
42
  }
41
43
  }
44
+ // --- TLS certificate management ---
45
+ const TLS_DIR = join(process.env.HOME ?? "/tmp", ".aibroker", "tls");
46
+ const TLS_CERT = join(TLS_DIR, "cert.pem");
47
+ const TLS_KEY = join(TLS_DIR, "key.pem");
48
+ /**
49
+ * Ensure a self-signed TLS certificate exists at ~/.aibroker/tls/.
50
+ * Generates one using openssl if missing. Returns { key, cert } buffers.
51
+ */
52
+ function ensureTlsCert() {
53
+ try {
54
+ if (!existsSync(TLS_CERT) || !existsSync(TLS_KEY)) {
55
+ log("[MQTT] TLS: generating self-signed certificate...");
56
+ mkdirSync(TLS_DIR, { recursive: true });
57
+ // Generate a 2048-bit RSA key and a self-signed cert valid for 10 years
58
+ execFileSync("openssl", [
59
+ "req",
60
+ "-x509",
61
+ "-newkey", "rsa:2048",
62
+ "-keyout", TLS_KEY,
63
+ "-out", TLS_CERT,
64
+ "-days", "3650",
65
+ "-nodes",
66
+ "-subj", "/CN=aibroker.local/O=AIBroker/C=CH",
67
+ "-addext", "subjectAltName=DNS:aibroker.local,DNS:localhost,IP:127.0.0.1",
68
+ ], { stdio: "pipe" });
69
+ log(`[MQTT] TLS: certificate generated at ${TLS_DIR}`);
70
+ }
71
+ else {
72
+ log("[MQTT] TLS: using existing certificate");
73
+ }
74
+ return {
75
+ key: readFileSync(TLS_KEY),
76
+ cert: readFileSync(TLS_CERT),
77
+ };
78
+ }
79
+ catch (err) {
80
+ log(`[MQTT] TLS: certificate setup failed: ${err instanceof Error ? err.message : err}`);
81
+ return null;
82
+ }
83
+ }
84
+ // --- Loopback MQTT client for server-side publishing ---
85
+ let loopbackClient = null;
86
+ let loopbackReady = false;
42
87
  // --- State ---
43
88
  let broker = null;
44
89
  let mqttServer = null;
45
90
  let bonjourInstance = null;
46
91
  let bonjourService = null;
92
+ /** Set of currently connected MQTT client IDs. */
93
+ const connectedClients = new Set();
94
+ /** Returns the number of currently connected MQTT clients. */
95
+ export function getMqttClientCount() {
96
+ return connectedClients.size;
97
+ }
47
98
  /** Dedup set for inbound messages from app clients. */
48
99
  const seenInboundIds = new Set();
49
100
  const SEEN_MAX = 500;
@@ -66,10 +117,18 @@ function mqttPublish(topic, payload, opts) {
66
117
  log(`[MQTT] publish skipped (no broker): ${topic}`);
67
118
  return;
68
119
  }
69
- log(`[MQTT] ${topic} (${JSON.stringify(payload).length} bytes)`);
120
+ const json = JSON.stringify(payload);
121
+ log(`[MQTT] → ${topic} (${json.length} bytes)`);
70
122
  const qos = opts?.qos ?? 1;
71
123
  const retain = opts?.retain ?? false;
72
- const buf = Buffer.from(JSON.stringify(payload));
124
+ if (loopbackClient && loopbackReady) {
125
+ loopbackClient.publish(topic, json, { qos, retain }, (err) => {
126
+ if (err)
127
+ log(`[MQTT] loopback publish error on ${topic}: ${err.message}`);
128
+ });
129
+ return;
130
+ }
131
+ const buf = Buffer.from(json);
73
132
  broker.publish({ topic, payload: buf, qos, retain, cmd: "publish" }, (err) => {
74
133
  if (err)
75
134
  log(`[MQTT] publish error on ${topic}: ${err.message}`);
@@ -88,7 +147,7 @@ export function mqttPublishText(sessionId, content, messageId) {
88
147
  const seq = enqueue(sessionId, "text", payload);
89
148
  if (seq > 0)
90
149
  payload.seq = seq;
91
- mqttPublish(`pailot/${sessionId}/out`, payload);
150
+ mqttPublish("pailot/out", payload);
92
151
  }
93
152
  /** Publish a voice message to a session output topic. */
94
153
  export function mqttPublishVoice(sessionId, audioBase64, transcript, messageId, chunkMeta) {
@@ -109,7 +168,7 @@ export function mqttPublishVoice(sessionId, audioBase64, transcript, messageId,
109
168
  const seq = enqueue(sessionId, "voice", payload);
110
169
  if (seq > 0)
111
170
  payload.seq = seq;
112
- mqttPublish(`pailot/${sessionId}/out`, payload);
171
+ mqttPublish("pailot/out", payload);
113
172
  }
114
173
  /** Publish an image message to a session output topic. */
115
174
  export function mqttPublishImage(sessionId, imageBase64, caption, messageId) {
@@ -126,11 +185,11 @@ export function mqttPublishImage(sessionId, imageBase64, caption, messageId) {
126
185
  const seq = enqueue(sessionId, "image", payload);
127
186
  if (seq > 0)
128
187
  payload.seq = seq;
129
- mqttPublish(`pailot/${sessionId}/out`, payload);
188
+ mqttPublish("pailot/out", payload);
130
189
  }
131
190
  /** Publish a typing indicator (QoS 0, no msgId — ephemeral). */
132
191
  export function mqttPublishTyping(sessionId, active) {
133
- mqttPublish(`pailot/${sessionId}/typing`, {
192
+ mqttPublish("pailot/out", {
134
193
  type: "typing",
135
194
  sessionId,
136
195
  active,
@@ -148,7 +207,7 @@ export function mqttPublishSessions(sessions) {
148
207
  }
149
208
  /** Publish a screenshot for a session (retained). */
150
209
  export function mqttPublishScreenshot(sessionId, imageBase64) {
151
- mqttPublish(`pailot/${sessionId}/screenshot`, {
210
+ mqttPublish("pailot/out", {
152
211
  msgId: randomUUID(),
153
212
  type: "screenshot",
154
213
  sessionId,
@@ -159,7 +218,7 @@ export function mqttPublishScreenshot(sessionId, imageBase64) {
159
218
  }
160
219
  /** Publish a voice transcript reflection. */
161
220
  export function mqttPublishTranscript(messageId, content, sessionId) {
162
- mqttPublish("pailot/voice/transcript", {
221
+ mqttPublish("pailot/out", {
163
222
  msgId: randomUUID(),
164
223
  type: "transcript",
165
224
  messageId,
@@ -222,6 +281,7 @@ export async function startMqttBroker(version) {
222
281
  }
223
282
  // Authorization: only allow pailot/ topics
224
283
  aedesOpts.authorizePublish = (_client, packet, callback) => {
284
+ // Allow pailot/ topics and the device token registration topic
225
285
  if (packet.topic.startsWith("pailot/")) {
226
286
  callback(null);
227
287
  }
@@ -271,6 +331,22 @@ export async function startMqttBroker(version) {
271
331
  }
272
332
  return;
273
333
  }
334
+ // Match pailot/device/token — APNs device token registration from app
335
+ if (topic === "pailot/device/token") {
336
+ try {
337
+ const raw = packet.payload.toString();
338
+ const sanitized = raw.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F]/g, "");
339
+ const payload = JSON.parse(sanitized);
340
+ const token = payload.token;
341
+ if (token) {
342
+ inboundHandler?.(undefined, "apns_token", { token });
343
+ }
344
+ }
345
+ catch (err) {
346
+ log(`[MQTT] invalid device token message: ${err}`);
347
+ }
348
+ return;
349
+ }
274
350
  // Match pailot/control/in — commands from app
275
351
  if (topic === "pailot/control/in") {
276
352
  try {
@@ -297,25 +373,76 @@ export async function startMqttBroker(version) {
297
373
  return;
298
374
  }
299
375
  });
376
+ // --- Delivery confirmation: log when broker delivers to a subscriber ---
377
+ broker.on("delivered", (packet, client) => {
378
+ const clientId = client?.id ?? "unknown";
379
+ const topic = packet?.topic ?? "?";
380
+ log(`[TRACE] delivered to ${clientId} on ${topic}`);
381
+ });
300
382
  // --- Connection events ---
301
383
  broker.on("client", (client) => {
302
- log(`[MQTT] client connected: ${client?.id ?? "unknown"}`);
384
+ const id = client?.id ?? "unknown";
385
+ connectedClients.add(id);
386
+ log(`[MQTT] client connected: ${id} (total: ${connectedClients.size})`);
387
+ // Reset APNs badge counter when a real PAILot app connects
388
+ if (id.startsWith("pailot")) {
389
+ import("../../apns/client.js").then(m => m.resetBadge()).catch(() => { });
390
+ }
303
391
  });
304
392
  broker.on("clientDisconnect", (client) => {
305
- log(`[MQTT] client disconnected: ${client?.id ?? "unknown"}`);
393
+ const id = client?.id ?? "unknown";
394
+ connectedClients.delete(id);
395
+ log(`[MQTT] client disconnected: ${id} (total: ${connectedClients.size})`);
306
396
  });
307
397
  broker.on("clientError", (client, err) => {
308
398
  log(`[MQTT] client error (${client?.id ?? "unknown"}): ${err.message}`);
309
399
  });
310
- // --- Start TCP server ---
311
- mqttServer = createServer(broker.handle);
400
+ // --- Start TLS server ---
401
+ const tlsCreds = ensureTlsCert();
402
+ if (tlsCreds) {
403
+ mqttServer = createTlsServer({ key: tlsCreds.key, cert: tlsCreds.cert }, broker.handle);
404
+ log("[MQTT] TLS enabled");
405
+ }
406
+ else {
407
+ // Fallback: plain TCP if TLS setup fails (openssl not available, etc.)
408
+ log("[MQTT] WARNING: TLS setup failed — falling back to plain TCP (not recommended)");
409
+ const { createServer: createTcpServer } = await import("node:net");
410
+ mqttServer = createTcpServer(broker.handle);
411
+ }
312
412
  mqttServer.on("error", (err) => {
313
413
  log(`[MQTT] server error: ${err.message}`);
314
414
  });
315
- mqttServer.listen(MQTT_PORT, () => {
316
- log(`[MQTT] broker listening on port ${MQTT_PORT}${MQTT_TOKEN ? " (auth enabled)" : " (no auth)"}`);
317
- // Publish initial "ready" status (overwrites any stale LWT from previous crash)
318
- mqttPublishStatus("ready", version);
415
+ mqttServer.listen(MQTT_PORT, async () => {
416
+ log(`[MQTT] broker listening on port ${MQTT_PORT}${MQTT_TOKEN ? " (auth enabled)" : " (no auth)"}${tlsCreds ? " [TLS]" : " [PLAIN TCP]"}`);
417
+ // Start loopback MQTT client for server-side publishing.
418
+ // broker.publish() doesn't deliver to MQTT protocol clients in aedes 1.0.x.
419
+ try {
420
+ const mqtt = await import("mqtt");
421
+ const connectOpts = {
422
+ clientId: "aibroker-loopback",
423
+ clean: true,
424
+ connectTimeout: 3000,
425
+ };
426
+ if (MQTT_TOKEN) {
427
+ connectOpts.username = "pailot";
428
+ connectOpts.password = MQTT_TOKEN;
429
+ }
430
+ const protocol = tlsCreds ? "mqtts" : "mqtt";
431
+ if (tlsCreds)
432
+ connectOpts.rejectUnauthorized = false;
433
+ loopbackClient = mqtt.connect(`${protocol}://localhost:${MQTT_PORT}`, connectOpts);
434
+ loopbackClient.on("connect", () => {
435
+ loopbackReady = true;
436
+ log("[MQTT] loopback client connected");
437
+ });
438
+ loopbackClient.on("error", (err) => log(`[MQTT] loopback error: ${err.message}`));
439
+ loopbackClient.on("close", () => { loopbackReady = false; });
440
+ }
441
+ catch (err) {
442
+ log(`[MQTT] loopback client failed: ${err instanceof Error ? err.message : err}`);
443
+ }
444
+ // Publish initial "ready" status — delay for loopback to connect
445
+ setTimeout(() => mqttPublishStatus("ready", version), 500);
319
446
  // Advertise via Bonjour/mDNS so PAILot app can auto-discover on LAN
320
447
  try {
321
448
  const { Bonjour } = require("bonjour-service");
@@ -336,6 +463,14 @@ export async function startMqttBroker(version) {
336
463
  * Stop the MQTT broker and TCP server.
337
464
  */
338
465
  export function stopMqttBroker() {
466
+ if (loopbackClient) {
467
+ try {
468
+ loopbackClient.end(true);
469
+ }
470
+ catch { /* ignore */ }
471
+ loopbackClient = null;
472
+ loopbackReady = false;
473
+ }
339
474
  if (bonjourService) {
340
475
  try {
341
476
  bonjourService.stop();
@@ -1 +1 @@
1
- {"version":3,"file":"mqtt-broker.js","sourceRoot":"","sources":["../../../src/adapters/pailot/mqtt-broker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mqtt-broker.js","sourceRoot":"","sources":["../../../src/adapters/pailot/mqtt-broker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * apns/client.ts — Apple Push Notification service (APNs) client for AIBroker.
3
+ *
4
+ * Sends push notifications to PAILot devices when no MQTT clients are connected.
5
+ * Device tokens are stored in ~/.aibroker/apns-tokens.json.
6
+ *
7
+ * Configuration (loaded from ~/.aibroker/env or process.env):
8
+ * APNS_KEY_PATH — path to the .p8 auth key file
9
+ * APNS_KEY_ID — 10-character key ID (e.g., C9Z39FRQ2N)
10
+ * APNS_TEAM_ID — 10-character Apple Team ID (e.g., 7KU642K5ZL)
11
+ * APNS_PRODUCTION — set to "1" or "true" to use production APNs host
12
+ */
13
+ /**
14
+ * Register a device token. Silently ignores duplicates.
15
+ */
16
+ export declare function registerToken(token: string): void;
17
+ /**
18
+ * Remove a device token (e.g., on InvalidToken APNs error).
19
+ */
20
+ export declare function removeToken(token: string): void;
21
+ /**
22
+ * Returns all registered device tokens.
23
+ */
24
+ export declare function getTokens(): string[];
25
+ /** Reset badge counter — call when the app connects via MQTT. */
26
+ export declare function resetBadge(): void;
27
+ export interface PushPayload {
28
+ title: string;
29
+ body: string;
30
+ badge?: number;
31
+ data?: Record<string, unknown>;
32
+ }
33
+ /**
34
+ * Send a push notification to a single device token.
35
+ * Returns true on success, false on failure.
36
+ */
37
+ export declare function sendPushToToken(token: string, payload: PushPayload): Promise<boolean>;
38
+ /**
39
+ * Send a push notification to all registered device tokens.
40
+ * Returns the number of tokens that succeeded.
41
+ */
42
+ export declare function sendPush(title: string, body: string, data?: Record<string, unknown>, badge?: number): Promise<number>;
43
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/apns/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAsFH;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAQjD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAI/C;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,EAAE,CAEpC;AAOD,iEAAiE;AACjE,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAID,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CA8B3F;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAuBjB"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * apns/client.ts — Apple Push Notification service (APNs) client for AIBroker.
3
+ *
4
+ * Sends push notifications to PAILot devices when no MQTT clients are connected.
5
+ * Device tokens are stored in ~/.aibroker/apns-tokens.json.
6
+ *
7
+ * Configuration (loaded from ~/.aibroker/env or process.env):
8
+ * APNS_KEY_PATH — path to the .p8 auth key file
9
+ * APNS_KEY_ID — 10-character key ID (e.g., C9Z39FRQ2N)
10
+ * APNS_TEAM_ID — 10-character Apple Team ID (e.g., 7KU642K5ZL)
11
+ * APNS_PRODUCTION — set to "1" or "true" to use production APNs host
12
+ */
13
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs";
14
+ import { join } from "node:path";
15
+ import { homedir } from "node:os";
16
+ import { createRequire } from "node:module";
17
+ import { log } from "../core/log.js";
18
+ const require = createRequire(import.meta.url);
19
+ const APNS_BUNDLE_ID = "com.tekmidian.pailot";
20
+ const TOKENS_FILE = join(homedir(), ".aibroker", "apns-tokens.json");
21
+ // Lazy-loaded APNs client instance.
22
+ let apnsClient = null;
23
+ let apnsLoaded = false;
24
+ /**
25
+ * Load and initialise the APNs client from environment variables.
26
+ * Returns null if required config is missing or apns2 fails to load.
27
+ */
28
+ function getApnsClient() {
29
+ if (apnsLoaded)
30
+ return apnsClient;
31
+ apnsLoaded = true;
32
+ const keyPath = process.env.APNS_KEY_PATH;
33
+ const keyId = process.env.APNS_KEY_ID;
34
+ const teamId = process.env.APNS_TEAM_ID;
35
+ if (!keyPath || !keyId || !teamId) {
36
+ log("[APNs] missing config (APNS_KEY_PATH / APNS_KEY_ID / APNS_TEAM_ID) — push disabled");
37
+ return null;
38
+ }
39
+ if (!existsSync(keyPath)) {
40
+ log(`[APNs] key file not found: ${keyPath} — push disabled`);
41
+ return null;
42
+ }
43
+ try {
44
+ const { ApnsClient, Host } = require("apns2");
45
+ const production = process.env.APNS_PRODUCTION === "1" || process.env.APNS_PRODUCTION === "true";
46
+ const host = production ? Host.production : Host.development;
47
+ const signingKey = readFileSync(keyPath, "utf-8");
48
+ apnsClient = new ApnsClient({
49
+ team: teamId,
50
+ keyId,
51
+ signingKey,
52
+ host,
53
+ defaultTopic: APNS_BUNDLE_ID,
54
+ });
55
+ log(`[APNs] client initialised (${production ? "production" : "sandbox"}, key=${keyId}, team=${teamId})`);
56
+ return apnsClient;
57
+ }
58
+ catch (err) {
59
+ log(`[APNs] failed to initialise client: ${err instanceof Error ? err.message : String(err)}`);
60
+ return null;
61
+ }
62
+ }
63
+ // --- Token storage ---
64
+ function loadTokens() {
65
+ try {
66
+ if (!existsSync(TOKENS_FILE))
67
+ return [];
68
+ const raw = readFileSync(TOKENS_FILE, "utf-8");
69
+ const parsed = JSON.parse(raw);
70
+ return Array.isArray(parsed) ? parsed.filter((t) => typeof t === "string") : [];
71
+ }
72
+ catch {
73
+ return [];
74
+ }
75
+ }
76
+ function saveTokens(tokens) {
77
+ try {
78
+ const dir = join(homedir(), ".aibroker");
79
+ mkdirSync(dir, { recursive: true });
80
+ writeFileSync(TOKENS_FILE, JSON.stringify(tokens, null, 2), "utf-8");
81
+ }
82
+ catch (err) {
83
+ log(`[APNs] failed to save tokens: ${err instanceof Error ? err.message : String(err)}`);
84
+ }
85
+ }
86
+ /**
87
+ * Register a device token. Silently ignores duplicates.
88
+ */
89
+ export function registerToken(token) {
90
+ if (!token || typeof token !== "string")
91
+ return;
92
+ const tokens = loadTokens();
93
+ if (!tokens.includes(token)) {
94
+ tokens.push(token);
95
+ saveTokens(tokens);
96
+ log(`[APNs] registered token: ${token.slice(0, 16)}... (total: ${tokens.length})`);
97
+ }
98
+ }
99
+ /**
100
+ * Remove a device token (e.g., on InvalidToken APNs error).
101
+ */
102
+ export function removeToken(token) {
103
+ const tokens = loadTokens().filter((t) => t !== token);
104
+ saveTokens(tokens);
105
+ log(`[APNs] removed token: ${token.slice(0, 16)}...`);
106
+ }
107
+ /**
108
+ * Returns all registered device tokens.
109
+ */
110
+ export function getTokens() {
111
+ return loadTokens();
112
+ }
113
+ // --- Badge counter ---
114
+ // Tracks pending (unseen) push count. Incremented with each push,
115
+ // reset to 0 when an MQTT client connects (app is opened).
116
+ let pendingBadge = 0;
117
+ /** Reset badge counter — call when the app connects via MQTT. */
118
+ export function resetBadge() {
119
+ pendingBadge = 0;
120
+ }
121
+ /**
122
+ * Send a push notification to a single device token.
123
+ * Returns true on success, false on failure.
124
+ */
125
+ export async function sendPushToToken(token, payload) {
126
+ const client = getApnsClient();
127
+ if (!client)
128
+ return false;
129
+ try {
130
+ const { Notification } = require("apns2");
131
+ const notification = new Notification(token, {
132
+ alert: {
133
+ title: payload.title,
134
+ body: payload.body,
135
+ },
136
+ badge: payload.badge ?? 1,
137
+ sound: "default",
138
+ data: payload.data ?? {},
139
+ });
140
+ await client.send(notification);
141
+ log(`[APNs] push sent to ${token.slice(0, 16)}... — "${payload.title}: ${payload.body.slice(0, 40)}"`);
142
+ return true;
143
+ }
144
+ catch (err) {
145
+ const reason = err?.response?.reason ?? err?.message ?? String(err);
146
+ log(`[APNs] push failed for ${token.slice(0, 16)}...: ${reason}`);
147
+ // Clean up stale/invalid tokens automatically
148
+ if (reason === "BadDeviceToken" || reason === "Unregistered" || reason === "DeviceTokenNotForTopic") {
149
+ removeToken(token);
150
+ }
151
+ return false;
152
+ }
153
+ }
154
+ /**
155
+ * Send a push notification to all registered device tokens.
156
+ * Returns the number of tokens that succeeded.
157
+ */
158
+ export async function sendPush(title, body, data, badge) {
159
+ const tokens = getTokens();
160
+ if (tokens.length === 0) {
161
+ log("[APNs] no registered tokens — skipping push");
162
+ return 0;
163
+ }
164
+ const client = getApnsClient();
165
+ if (!client)
166
+ return 0;
167
+ // Increment pending badge counter
168
+ pendingBadge++;
169
+ const actualBadge = badge ?? pendingBadge;
170
+ log(`[APNs] sending push to ${tokens.length} token(s): "${title}" (badge=${actualBadge})`);
171
+ const results = await Promise.allSettled(tokens.map((token) => sendPushToToken(token, { title, body, badge: actualBadge, data })));
172
+ const succeeded = results.filter((r) => r.status === "fulfilled" && r.value === true).length;
173
+ log(`[APNs] push delivery: ${succeeded}/${tokens.length} succeeded`);
174
+ return succeeded;
175
+ }
176
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/apns/client.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"core-handlers.d.ts","sourceRoot":"","sources":["../../src/daemon/core-handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAkC9D,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,eAAe,EACzB,WAAW,EAAE,UAAU,EACvB,OAAO,EAAE,oBAAoB,GAC5B,IAAI,CA+8BN"}
1
+ {"version":3,"file":"core-handlers.d.ts","sourceRoot":"","sources":["../../src/daemon/core-handlers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAmC9D,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,eAAe,EACzB,WAAW,EAAE,UAAU,EACvB,OAAO,EAAE,oBAAoB,GAC5B,IAAI,CAg+BN"}
@@ -17,6 +17,7 @@
17
17
  * status — hub health/connection summary
18
18
  */
19
19
  import { randomUUID } from "node:crypto";
20
+ import { registerToken as apnsRegisterToken, getTokens as apnsGetTokens } from "../apns/client.js";
20
21
  import { createBrokerMessage } from "../types/broker.js";
21
22
  import { broadcastStatus, broadcastVoice, broadcastImage, broadcastText } from "../adapters/pailot/gateway.js";
22
23
  import { WatcherClient } from "../ipc/client.js";
@@ -915,5 +916,20 @@ export function registerCoreHandlers(server, registry, _apiBackend, manager) {
915
916
  }
916
917
  return { ok: false, error: result.error ?? "Routing failed" };
917
918
  });
919
+ // APNs device token registration (from MCP or direct IPC callers)
920
+ server.on("apns_register_token", async (req) => {
921
+ const { token } = req.params;
922
+ if (!token || typeof token !== "string") {
923
+ return { ok: false, error: "token is required" };
924
+ }
925
+ apnsRegisterToken(token);
926
+ return { ok: true, result: { tokens: apnsGetTokens().length } };
927
+ });
928
+ // trace_log — return the last 100 message delivery trace entries
929
+ server.on("trace_log", async (_req) => {
930
+ const { getTraces } = await import("./trace-log.js");
931
+ const traces = getTraces();
932
+ return { ok: true, result: { traces, count: traces.length } };
933
+ });
918
934
  }
919
935
  //# sourceMappingURL=core-handlers.js.map