@oratis/lisa 0.11.1 → 0.14.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.
Files changed (142) hide show
  1. package/dist/agent.d.ts +2 -0
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +20 -1
  4. package/dist/agent.js.map +1 -1
  5. package/dist/agents/pty.d.ts.map +1 -1
  6. package/dist/agents/pty.js +13 -2
  7. package/dist/agents/pty.js.map +1 -1
  8. package/dist/autonomy/state.d.ts +14 -0
  9. package/dist/autonomy/state.d.ts.map +1 -0
  10. package/dist/autonomy/state.js +54 -0
  11. package/dist/autonomy/state.js.map +1 -0
  12. package/dist/cli/mail.d.ts +2 -0
  13. package/dist/cli/mail.d.ts.map +1 -0
  14. package/dist/cli/mail.js +209 -0
  15. package/dist/cli/mail.js.map +1 -0
  16. package/dist/cli/pair.d.ts +15 -0
  17. package/dist/cli/pair.d.ts.map +1 -0
  18. package/dist/cli/pair.js +152 -0
  19. package/dist/cli/pair.js.map +1 -0
  20. package/dist/cli.js +22 -14
  21. package/dist/cli.js.map +1 -1
  22. package/dist/consent/store.d.ts +2 -2
  23. package/dist/consent/store.d.ts.map +1 -1
  24. package/dist/consent/store.js +3 -2
  25. package/dist/consent/store.js.map +1 -1
  26. package/dist/edition.d.ts +24 -0
  27. package/dist/edition.d.ts.map +1 -0
  28. package/dist/edition.js +19 -0
  29. package/dist/edition.js.map +1 -0
  30. package/dist/heartbeat/runner.d.ts.map +1 -1
  31. package/dist/heartbeat/runner.js +8 -0
  32. package/dist/heartbeat/runner.js.map +1 -1
  33. package/dist/idle/runner.d.ts.map +1 -1
  34. package/dist/idle/runner.js +7 -0
  35. package/dist/idle/runner.js.map +1 -1
  36. package/dist/mail/accounts.d.ts +20 -0
  37. package/dist/mail/accounts.d.ts.map +1 -0
  38. package/dist/mail/accounts.js +113 -0
  39. package/dist/mail/accounts.js.map +1 -0
  40. package/dist/mail/alerts.d.ts +29 -0
  41. package/dist/mail/alerts.d.ts.map +1 -0
  42. package/dist/mail/alerts.js +40 -0
  43. package/dist/mail/alerts.js.map +1 -0
  44. package/dist/mail/classify.d.ts +26 -0
  45. package/dist/mail/classify.d.ts.map +1 -0
  46. package/dist/mail/classify.js +191 -0
  47. package/dist/mail/classify.js.map +1 -0
  48. package/dist/mail/connectors/gmail.d.ts +55 -0
  49. package/dist/mail/connectors/gmail.d.ts.map +1 -0
  50. package/dist/mail/connectors/gmail.js +87 -0
  51. package/dist/mail/connectors/gmail.js.map +1 -0
  52. package/dist/mail/connectors/imap.d.ts +13 -0
  53. package/dist/mail/connectors/imap.d.ts.map +1 -0
  54. package/dist/mail/connectors/imap.js +136 -0
  55. package/dist/mail/connectors/imap.js.map +1 -0
  56. package/dist/mail/digest.d.ts +21 -0
  57. package/dist/mail/digest.d.ts.map +1 -0
  58. package/dist/mail/digest.js +89 -0
  59. package/dist/mail/digest.js.map +1 -0
  60. package/dist/mail/google-oauth.d.ts +50 -0
  61. package/dist/mail/google-oauth.d.ts.map +1 -0
  62. package/dist/mail/google-oauth.js +74 -0
  63. package/dist/mail/google-oauth.js.map +1 -0
  64. package/dist/mail/hosts.d.ts +3 -0
  65. package/dist/mail/hosts.d.ts.map +1 -0
  66. package/dist/mail/hosts.js +19 -0
  67. package/dist/mail/hosts.js.map +1 -0
  68. package/dist/mail/scheduler.d.ts +9 -0
  69. package/dist/mail/scheduler.d.ts.map +1 -0
  70. package/dist/mail/scheduler.js +21 -0
  71. package/dist/mail/scheduler.js.map +1 -0
  72. package/dist/mail/service.d.ts +32 -0
  73. package/dist/mail/service.d.ts.map +1 -0
  74. package/dist/mail/service.js +129 -0
  75. package/dist/mail/service.js.map +1 -0
  76. package/dist/mail/store.d.ts +7 -0
  77. package/dist/mail/store.d.ts.map +1 -0
  78. package/dist/mail/store.js +58 -0
  79. package/dist/mail/store.js.map +1 -0
  80. package/dist/mail/types.d.ts +114 -0
  81. package/dist/mail/types.d.ts.map +1 -0
  82. package/dist/mail/types.js +26 -0
  83. package/dist/mail/types.js.map +1 -0
  84. package/dist/providers/anthropic.d.ts.map +1 -1
  85. package/dist/providers/anthropic.js +43 -21
  86. package/dist/providers/anthropic.js.map +1 -1
  87. package/dist/providers/gemini.d.ts.map +1 -1
  88. package/dist/providers/gemini.js +67 -64
  89. package/dist/providers/gemini.js.map +1 -1
  90. package/dist/providers/openai.d.ts.map +1 -1
  91. package/dist/providers/openai.js +77 -71
  92. package/dist/providers/openai.js.map +1 -1
  93. package/dist/providers/registry.d.ts +10 -0
  94. package/dist/providers/registry.d.ts.map +1 -1
  95. package/dist/providers/registry.js +26 -0
  96. package/dist/providers/registry.js.map +1 -1
  97. package/dist/providers/stream-retry.d.ts +37 -0
  98. package/dist/providers/stream-retry.d.ts.map +1 -0
  99. package/dist/providers/stream-retry.js +92 -0
  100. package/dist/providers/stream-retry.js.map +1 -0
  101. package/dist/providers/types.d.ts +3 -0
  102. package/dist/providers/types.d.ts.map +1 -1
  103. package/dist/subagent.d.ts +2 -0
  104. package/dist/subagent.d.ts.map +1 -1
  105. package/dist/subagent.js +1 -0
  106. package/dist/subagent.js.map +1 -1
  107. package/dist/web/cloudAuth.d.ts +57 -0
  108. package/dist/web/cloudAuth.d.ts.map +1 -0
  109. package/dist/web/cloudAuth.js +139 -0
  110. package/dist/web/cloudAuth.js.map +1 -0
  111. package/dist/web/island.d.ts.map +1 -1
  112. package/dist/web/island.js +1 -0
  113. package/dist/web/island.js.map +1 -1
  114. package/dist/web/lisa-client.d.ts +1 -1
  115. package/dist/web/lisa-client.d.ts.map +1 -1
  116. package/dist/web/lisa-client.js +703 -40
  117. package/dist/web/lisa-client.js.map +1 -1
  118. package/dist/web/lisa-css.d.ts +1 -1
  119. package/dist/web/lisa-css.d.ts.map +1 -1
  120. package/dist/web/lisa-css.js +568 -43
  121. package/dist/web/lisa-css.js.map +1 -1
  122. package/dist/web/lisa-html.d.ts +1 -1
  123. package/dist/web/lisa-html.d.ts.map +1 -1
  124. package/dist/web/lisa-html.js +71 -21
  125. package/dist/web/lisa-html.js.map +1 -1
  126. package/dist/web/pairing.d.ts +37 -0
  127. package/dist/web/pairing.d.ts.map +1 -0
  128. package/dist/web/pairing.js +79 -0
  129. package/dist/web/pairing.js.map +1 -0
  130. package/dist/web/push.d.ts +91 -0
  131. package/dist/web/push.d.ts.map +1 -1
  132. package/dist/web/push.js +250 -9
  133. package/dist/web/push.js.map +1 -1
  134. package/dist/web/qr-svg.d.ts +11 -0
  135. package/dist/web/qr-svg.d.ts.map +1 -0
  136. package/dist/web/qr-svg.js +41 -0
  137. package/dist/web/qr-svg.js.map +1 -0
  138. package/dist/web/server.d.ts +1 -1
  139. package/dist/web/server.d.ts.map +1 -1
  140. package/dist/web/server.js +378 -14
  141. package/dist/web/server.js.map +1 -1
  142. package/package.json +4 -1
package/dist/web/push.js CHANGED
@@ -7,8 +7,11 @@
7
7
  * Transport is pluggable:
8
8
  * - `ntfy` works today with zero Apple infra — a plain HTTP POST to a topic on
9
9
  * ntfy.sh (or your self-hosted server); the topic name is the shared secret.
10
- * - `apns` is the iOS-native path and needs an Apple push key, so it's a
11
- * documented stub here (logs "would notify").
10
+ * - `apns` is the iOS-native path (token-based auth, HTTP/2). It's fully wired
11
+ * here but inert until you provide an Apple push key via env:
12
+ * LISA_APNS_KEY_ID, LISA_APNS_TEAM_ID, LISA_APNS_KEY (.p8 PEM or a path),
13
+ * LISA_APNS_TOPIC (default ai.meetlisa.main), LISA_APNS_ENV=production.
14
+ * Without those, apnsConfigFromEnv() returns null and delivery logs a stub.
12
15
  * Payloads carry low-sensitivity metadata only (agent / project / state / reason)
13
16
  * — never prompts, replies, full commands, or terminal output.
14
17
  */
@@ -16,15 +19,23 @@ import fs from "node:fs";
16
19
  import os from "node:os";
17
20
  import path from "node:path";
18
21
  import crypto from "node:crypto";
22
+ import http2 from "node:http2";
19
23
  export function defaultPushPrefs() {
20
- return { done: true, error: true, permission: true, idle: true, advisor: false };
24
+ return { done: true, error: true, permission: true, idle: true, advisor: false, mail: true };
21
25
  }
22
26
  export function normalizePushPrefs(p) {
23
27
  const base = defaultPushPrefs();
24
28
  if (!p || typeof p !== "object")
25
29
  return base;
26
30
  const pick = (k) => (typeof p[k] === "boolean" ? p[k] : base[k]);
27
- return { done: pick("done"), error: pick("error"), permission: pick("permission"), idle: pick("idle"), advisor: pick("advisor") };
31
+ return {
32
+ done: pick("done"),
33
+ error: pick("error"),
34
+ permission: pick("permission"),
35
+ idle: pick("idle"),
36
+ advisor: pick("advisor"),
37
+ mail: pick("mail"),
38
+ };
28
39
  }
29
40
  function lisaHome() {
30
41
  return process.env.LISA_HOME ?? path.join(os.homedir(), ".lisa");
@@ -86,17 +97,58 @@ export function setPushPrefs(id, prefs) {
86
97
  savePush(list);
87
98
  return s;
88
99
  }
100
+ function liveActivitiesPath() {
101
+ return path.join(lisaHome(), "live-activities.json");
102
+ }
103
+ export function listLiveActivities() {
104
+ try {
105
+ const parsed = JSON.parse(fs.readFileSync(liveActivitiesPath(), "utf8"));
106
+ if (!Array.isArray(parsed))
107
+ return [];
108
+ return parsed.filter((r) => !!r && typeof r.sessionId === "string" && typeof r.token === "string");
109
+ }
110
+ catch {
111
+ return [];
112
+ }
113
+ }
114
+ export function registerLiveActivity(sessionId, token, now = Date.now()) {
115
+ const list = listLiveActivities().filter((r) => r.sessionId !== sessionId);
116
+ list.push({ sessionId, token, createdAt: now });
117
+ const file = liveActivitiesPath();
118
+ fs.mkdirSync(path.dirname(file), { recursive: true });
119
+ fs.writeFileSync(file, JSON.stringify(list, null, 2));
120
+ }
121
+ export function unregisterLiveActivity(sessionId) {
122
+ const list = listLiveActivities();
123
+ const next = list.filter((r) => r.sessionId !== sessionId);
124
+ if (next.length === list.length)
125
+ return false;
126
+ fs.writeFileSync(liveActivitiesPath(), JSON.stringify(next, null, 2));
127
+ return true;
128
+ }
129
+ // ── pure trigger ──────────────────────────────────────────────────────────
130
+ /** Custom URL scheme Lisa Pocket registers for push / widget deep-links. */
131
+ export const POCKET_SCHEME = "lisapocket";
132
+ /** Deep-link that opens Lisa Pocket at a specific roster session. Pure. The app
133
+ * routes on host="session" + the agent/id query (Lisa Pocket's URL handler). */
134
+ export function agentDeepLink(agent, sessionId) {
135
+ // URLSearchParams encodes spaces as "+", which iOS URLComponents reads literally
136
+ // (not as a space); use %20 so values round-trip on the app side.
137
+ const q = new URLSearchParams({ agent, id: sessionId }).toString().replace(/\+/g, "%20");
138
+ return `${POCKET_SCHEME}://session?${q}`;
139
+ }
89
140
  /** Which notifications a session's prev→next transition warrants. Pure. */
90
141
  export function agentPushEvents(prev, next) {
91
142
  const out = [];
92
143
  const who = `${next.agent} · ${next.project || next.agent}`;
144
+ const click = agentDeepLink(next.agent, next.sessionId);
93
145
  if (next.state === "done" && prev?.state !== "done")
94
- out.push({ pref: "done", title: `${who} — done`, body: "Finished.", priority: "default", tag: "done" });
146
+ out.push({ pref: "done", title: `${who} — done`, body: "Finished.", priority: "default", tag: "done", click });
95
147
  if (next.state === "error" && prev?.state !== "error")
96
- out.push({ pref: "error", title: `${who} — error`, body: next.stateReason || "errored", priority: "high", tag: "error" });
148
+ out.push({ pref: "error", title: `${who} — error`, body: next.stateReason || "errored", priority: "high", tag: "error", click });
97
149
  const pend = next.activity?.pendingPermission;
98
150
  if (pend && pend !== prev?.activity?.pendingPermission)
99
- out.push({ pref: "permission", title: `${who} — needs permission`, body: `waiting on: ${pend}`, priority: "high", tag: "permission" });
151
+ out.push({ pref: "permission", title: `${who} — needs permission`, body: `waiting on: ${pend}`, priority: "high", tag: "permission", click });
100
152
  return out;
101
153
  }
102
154
  export async function sendNtfy(server, topic, ev, fetchImpl = fetch) {
@@ -105,7 +157,13 @@ export async function sendNtfy(server, topic, ev, fetchImpl = fetch) {
105
157
  const res = await fetchImpl(`${base}/${encodeURIComponent(topic)}`, {
106
158
  method: "POST",
107
159
  body: ev.body,
108
- headers: { Title: ev.title, Priority: ev.priority === "high" ? "high" : "default" },
160
+ headers: {
161
+ Title: ev.title,
162
+ Priority: ev.priority === "high" ? "high" : "default",
163
+ // ntfy opens this URL when the notification is tapped — a lisapocket://
164
+ // deep-link routes into the app (see agentDeepLink).
165
+ ...(ev.click ? { Click: ev.click } : {}),
166
+ },
109
167
  });
110
168
  return res.ok;
111
169
  }
@@ -113,20 +171,161 @@ export async function sendNtfy(server, topic, ev, fetchImpl = fetch) {
113
171
  return false;
114
172
  }
115
173
  }
174
+ /**
175
+ * APNs config from env, or null (→ stub). LISA_APNS_KEY is the .p8 contents (PEM)
176
+ * or a path to it; LISA_APNS_ENV=production switches to the prod host.
177
+ */
178
+ export function apnsConfigFromEnv(env = process.env) {
179
+ const keyId = env.LISA_APNS_KEY_ID;
180
+ const teamId = env.LISA_APNS_TEAM_ID;
181
+ const raw = env.LISA_APNS_KEY;
182
+ if (!keyId || !teamId || !raw)
183
+ return null;
184
+ let key = raw;
185
+ if (!raw.includes("BEGIN")) {
186
+ try {
187
+ key = fs.readFileSync(raw, "utf8");
188
+ }
189
+ catch {
190
+ return null;
191
+ }
192
+ }
193
+ const topic = env.LISA_APNS_TOPIC || "ai.meetlisa.main";
194
+ const host = env.LISA_APNS_ENV === "production" ? "api.push.apple.com" : "api.sandbox.push.apple.com";
195
+ return { keyId, teamId, key, topic, host };
196
+ }
197
+ function b64url(buf) {
198
+ return buf.toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
199
+ }
200
+ /** Build a signed ES256 provider JWT for APNs. Pure given (cfg, nowSec). */
201
+ export function buildApnsJwt(cfg, nowSec) {
202
+ const header = b64url(Buffer.from(JSON.stringify({ alg: "ES256", kid: cfg.keyId })));
203
+ const claims = b64url(Buffer.from(JSON.stringify({ iss: cfg.teamId, iat: nowSec })));
204
+ const signingInput = `${header}.${claims}`;
205
+ const signer = crypto.createSign("SHA256");
206
+ signer.update(signingInput);
207
+ // ES256 JWTs use raw R||S (IEEE-P1363), not the DER that sign() defaults to.
208
+ const sig = signer.sign({ key: crypto.createPrivateKey(cfg.key), dsaEncoding: "ieee-p1363" });
209
+ return `${signingInput}.${b64url(sig)}`;
210
+ }
211
+ /** Build the APNs JSON payload from a push event. Pure. */
212
+ export function buildApnsPayload(ev) {
213
+ return {
214
+ aps: { alert: { title: ev.title, body: ev.body }, sound: "default" },
215
+ // Custom key the app reads on tap to deep-link (mirrors the ntfy Click URL).
216
+ ...(ev.click ? { link: ev.click } : {}),
217
+ };
218
+ }
219
+ /** Real APNs POST over HTTP/2. Settles exactly once and always closes the client;
220
+ * resolves status 0 on a connection error or a 10s timeout. */
221
+ const realApnsPost = (o) => new Promise((resolve) => {
222
+ const client = http2.connect(`https://${o.host}`);
223
+ let status = 0;
224
+ let settled = false;
225
+ const done = (s) => {
226
+ if (settled)
227
+ return;
228
+ settled = true;
229
+ try {
230
+ client.close();
231
+ }
232
+ catch { /* already closing */ }
233
+ resolve({ status: s });
234
+ };
235
+ client.on("error", () => done(0));
236
+ const req = client.request({ ":method": "POST", ":path": o.path, ...o.headers });
237
+ req.setEncoding("utf8");
238
+ req.setTimeout(10_000, () => done(0)); // don't leak a hung connection
239
+ req.on("response", (h) => { status = Number(h[":status"]) || 0; });
240
+ req.on("data", () => { });
241
+ req.on("end", () => done(status));
242
+ req.on("error", () => done(0));
243
+ req.end(o.body);
244
+ });
245
+ // JWT cache keyed by config identity (not just time) — a different key/team must
246
+ // not reuse a stale token (wrong kid/iss → APNs 403).
247
+ let cachedApnsJwt = null;
248
+ /** Send one APNs notification. The provider JWT is cached ~50min (Apple rate-
249
+ * limits regeneration). `post` is injectable for tests. */
250
+ export async function sendApns(cfg, deviceToken, ev, post = realApnsPost, nowSec = Math.floor(Date.now() / 1000)) {
251
+ const cacheId = `${cfg.keyId}/${cfg.teamId}`;
252
+ if (!cachedApnsJwt || cachedApnsJwt.id !== cacheId || nowSec - cachedApnsJwt.at > 50 * 60) {
253
+ cachedApnsJwt = { token: buildApnsJwt(cfg, nowSec), at: nowSec, id: cacheId };
254
+ }
255
+ const res = await post({
256
+ host: cfg.host,
257
+ path: `/3/device/${deviceToken}`,
258
+ headers: {
259
+ authorization: `bearer ${cachedApnsJwt.token}`,
260
+ "apns-topic": cfg.topic,
261
+ "apns-push-type": "alert",
262
+ "apns-priority": ev.priority === "high" ? "10" : "5",
263
+ // Operational alerts are time-sensitive — don't let APNs store & deliver
264
+ // a stale one later if the device is offline.
265
+ "apns-expiration": ev.priority === "high" ? "0" : String(nowSec + 3600),
266
+ },
267
+ body: JSON.stringify(buildApnsPayload(ev)),
268
+ });
269
+ return res.status === 200;
270
+ }
271
+ /** Content-state for a session's Live Activity — mirrors the app's
272
+ * AgentActivityAttributes.ContentState + its detail() logic. Pure. */
273
+ export function liveActivityState(s) {
274
+ const a = s.activity;
275
+ const last = a?.lastTools && a.lastTools.length ? a.lastTools[a.lastTools.length - 1] : undefined;
276
+ const detail = a?.pendingPermission ? `⚠ ${a.pendingPermission}` : (s.stateReason || last || s.state);
277
+ return { state: s.state, detail, turns: a?.turnCount ?? 0 };
278
+ }
279
+ /** APNs Live Activity payload — `event:"update"` refreshes, `"end"` dismisses. Pure. */
280
+ export function buildLiveActivityPayload(cs, event, nowSec) {
281
+ return {
282
+ aps: {
283
+ timestamp: nowSec,
284
+ event,
285
+ "content-state": { state: cs.state, detail: cs.detail, turns: cs.turns },
286
+ ...(event === "end" ? { "dismissal-date": nowSec } : {}),
287
+ },
288
+ };
289
+ }
290
+ /** Push a Live Activity update/end over APNs (push-type liveactivity). `post`
291
+ * injectable for tests. Reuses the cached provider JWT. */
292
+ export async function sendLiveActivityUpdate(cfg, laToken, cs, event, post = realApnsPost, nowSec = Math.floor(Date.now() / 1000)) {
293
+ const cacheId = `${cfg.keyId}/${cfg.teamId}`;
294
+ if (!cachedApnsJwt || cachedApnsJwt.id !== cacheId || nowSec - cachedApnsJwt.at > 50 * 60) {
295
+ cachedApnsJwt = { token: buildApnsJwt(cfg, nowSec), at: nowSec, id: cacheId };
296
+ }
297
+ const res = await post({
298
+ host: cfg.host,
299
+ path: `/3/device/${laToken}`,
300
+ headers: {
301
+ authorization: `bearer ${cachedApnsJwt.token}`,
302
+ "apns-topic": `${cfg.topic}.push-type.liveactivity`,
303
+ "apns-push-type": "liveactivity",
304
+ "apns-priority": "10",
305
+ },
306
+ body: JSON.stringify(buildLiveActivityPayload(cs, event, nowSec)),
307
+ });
308
+ return res.status === 200;
309
+ }
116
310
  export class PushBridge {
117
311
  prev = new Map();
118
312
  lastSent = new Map();
119
313
  subs;
120
314
  deliverFn;
315
+ liveActivities;
316
+ liveDeliverFn;
121
317
  now;
122
318
  log;
123
319
  throttleMs;
320
+ liveThrottleMs = 3000;
124
321
  constructor(opts = {}) {
125
322
  this.subs = opts.subs ?? listPush;
126
323
  this.now = opts.now ?? Date.now;
127
324
  this.log = opts.log ?? (() => { });
128
325
  this.throttleMs = opts.throttleMs ?? 30_000;
129
326
  this.deliverFn = opts.deliver ?? ((sub, ev) => this.defaultDeliver(sub, ev));
327
+ this.liveActivities = opts.liveActivities ?? listLiveActivities;
328
+ this.liveDeliverFn = opts.liveDeliver ?? ((token, cs, event) => this.defaultLiveDeliver(token, cs, event));
130
329
  }
131
330
  onAgentUpdate(next) {
132
331
  const key = `${next.agent}/${next.sessionId}`;
@@ -134,10 +333,35 @@ export class PushBridge {
134
333
  this.prev.set(key, next);
135
334
  for (const ev of events)
136
335
  this.fire(ev, `${key}#${ev.tag}`);
336
+ this.updateLiveActivity(next);
337
+ }
338
+ /** Refresh a pinned session's Live Activity (throttled), ending it on a
339
+ * terminal state. No-op unless an LA token is registered for the session. */
340
+ updateLiveActivity(next) {
341
+ const reg = this.liveActivities().find((r) => r.sessionId === next.sessionId);
342
+ if (!reg)
343
+ return;
344
+ const terminal = next.state === "done" || next.state === "error";
345
+ const key = `la#${next.sessionId}`;
346
+ // Throttle progress refreshes, but always let a terminal "end" through.
347
+ if (!terminal && this.now() - (this.lastSent.get(key) ?? -Infinity) < this.liveThrottleMs)
348
+ return;
349
+ this.lastSent.set(key, this.now());
350
+ void Promise.resolve(this.liveDeliverFn(reg.token, liveActivityState(next), terminal ? "end" : "update")).catch(() => { });
351
+ if (terminal)
352
+ unregisterLiveActivity(next.sessionId);
137
353
  }
138
354
  onIdleMessage(text) {
139
355
  this.fire({ pref: "idle", title: "Lisa — while you were away", body: text.slice(0, 200), priority: "default", tag: "idle" }, `idle#${this.now()}`);
140
356
  }
357
+ /** Daily mail digest push (default priority). */
358
+ onMailDigest(text, click) {
359
+ this.fire({ pref: "mail", title: "📬 Mail digest", body: text.slice(0, 240), priority: "default", tag: "mail-digest", click }, `mail-digest#${this.now()}`);
360
+ }
361
+ /** Important-mail alert (high priority); `tag` dedups per message. */
362
+ onMailImportant(ev) {
363
+ this.fire({ pref: "mail", title: ev.title, body: ev.body.slice(0, 240), priority: "high", tag: ev.tag, click: ev.click }, `mail#${ev.tag}`);
364
+ }
141
365
  fire(ev, throttleKey) {
142
366
  const subs = this.subs().filter((s) => s.prefs[ev.pref]);
143
367
  if (subs.length === 0)
@@ -156,8 +380,25 @@ export class PushBridge {
156
380
  this.log(`[push] ntfy send failed for ${sub.id}`);
157
381
  }
158
382
  else {
159
- this.log(`[push] apns not wired (needs an Apple push key) — would notify ${sub.id}: ${ev.title}`);
383
+ const cfg = apnsConfigFromEnv();
384
+ if (!cfg) {
385
+ this.log(`[push] apns not configured (set LISA_APNS_KEY/_KEY_ID/_TEAM_ID) — would notify ${sub.id}: ${ev.title}`);
386
+ return;
387
+ }
388
+ const ok = await sendApns(cfg, sub.target, ev);
389
+ if (!ok)
390
+ this.log(`[push] apns send failed for ${sub.id}`);
391
+ }
392
+ }
393
+ async defaultLiveDeliver(token, cs, event) {
394
+ const cfg = apnsConfigFromEnv();
395
+ if (!cfg) {
396
+ this.log(`[push] live-activity ${event} skipped (no APNs key)`);
397
+ return;
160
398
  }
399
+ const ok = await sendLiveActivityUpdate(cfg, token, cs, event);
400
+ if (!ok)
401
+ this.log(`[push] live-activity ${event} failed`);
161
402
  }
162
403
  }
163
404
  //# sourceMappingURL=push.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/web/push.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/web/push.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Encode `data` as a QR and return a square SVG (black modules on white, with a
3
+ * quiet-zone margin). `size` is the rendered pixel size; the viewBox is in module
4
+ * units so it stays crisp at any size. Error-correction level M (matches the Mac
5
+ * app) tolerates some camera noise.
6
+ */
7
+ export declare function qrSvg(data: string, opts?: {
8
+ size?: number;
9
+ margin?: number;
10
+ }): string;
11
+ //# sourceMappingURL=qr-svg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qr-svg.d.ts","sourceRoot":"","sources":["../../src/web/qr-svg.ts"],"names":[],"mappings":"AA0BA;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CAuBzF"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Render a scannable QR code as an inline SVG string, reusing the QR encoder
3
+ * bundled inside `qrcode-terminal` (vendor/QRCode) — no extra dependency. Used by
4
+ * the web "Pair phone" modal so a phone can scan the `lisa-pair://` link instead
5
+ * of copy-pasting it. (The CLI renders the same data as a terminal QR; the Mac
6
+ * app via CoreImage — this is the browser equivalent.)
7
+ */
8
+ import { createRequire } from "node:module";
9
+ const require = createRequire(import.meta.url);
10
+ // qrcode-terminal vendors a CommonJS QR encoder with no type declarations; load
11
+ // it via require so TS doesn't need a .d.ts for the deep subpath.
12
+ const QRCode = require("qrcode-terminal/vendor/QRCode");
13
+ const QRErrorCorrectLevel = require("qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel");
14
+ /**
15
+ * Encode `data` as a QR and return a square SVG (black modules on white, with a
16
+ * quiet-zone margin). `size` is the rendered pixel size; the viewBox is in module
17
+ * units so it stays crisp at any size. Error-correction level M (matches the Mac
18
+ * app) tolerates some camera noise.
19
+ */
20
+ export function qrSvg(data, opts = {}) {
21
+ const qr = new QRCode(-1, QRErrorCorrectLevel.M);
22
+ qr.addData(data);
23
+ qr.make();
24
+ const count = qr.getModuleCount();
25
+ const margin = opts.margin ?? 4; // quiet zone (modules) — scanners need ≥4
26
+ const total = count + margin * 2;
27
+ const size = opts.size ?? 240;
28
+ let rects = "";
29
+ for (let row = 0; row < count; row++) {
30
+ for (let col = 0; col < count; col++) {
31
+ if (qr.isDark(row, col)) {
32
+ rects += `<rect x="${col + margin}" y="${row + margin}" width="1" height="1"/>`;
33
+ }
34
+ }
35
+ }
36
+ return (`<svg xmlns="http://www.w3.org/2000/svg" width="${size}" height="${size}" ` +
37
+ `viewBox="0 0 ${total} ${total}" shape-rendering="crispEdges" role="img" ` +
38
+ `aria-label="Pairing QR code"><rect width="${total}" height="${total}" fill="#fff"/>` +
39
+ `<g fill="#000">${rects}</g></svg>`);
40
+ }
41
+ //# sourceMappingURL=qr-svg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qr-svg.js","sourceRoot":"","sources":["../../src/web/qr-svg.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAU/C,gFAAgF;AAChF,kEAAkE;AAClE,MAAM,MAAM,GAAG,OAAO,CAAC,+BAA+B,CAAe,CAAC;AACtE,MAAM,mBAAmB,GAAG,OAAO,CACjC,mDAAmD,CACF,CAAC;AAEpD;;;;;GAKG;AACH,MAAM,UAAU,KAAK,CAAC,IAAY,EAAE,OAA2C,EAAE;IAC/E,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;IACjD,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,EAAE,CAAC,IAAI,EAAE,CAAC;IACV,MAAM,KAAK,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,0CAA0C;IAC3E,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;IAE9B,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;QACrC,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC;YACrC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;gBACxB,KAAK,IAAI,YAAY,GAAG,GAAG,MAAM,QAAQ,GAAG,GAAG,MAAM,0BAA0B,CAAC;YAClF,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,CACL,kDAAkD,IAAI,aAAa,IAAI,IAAI;QAC3E,gBAAgB,KAAK,IAAI,KAAK,4CAA4C;QAC1E,6CAA6C,KAAK,aAAa,KAAK,iBAAiB;QACrF,kBAAkB,KAAK,YAAY,CACpC,CAAC;AACJ,CAAC"}
@@ -27,6 +27,6 @@ export declare function isLoopbackAddress(addr: string): boolean;
27
27
  * is authorized iff it's loopback (the local user) OR it presents the correct
28
28
  * LISA_WEB_TOKEN. No token configured ⇒ no non-loopback request can pass. Pure.
29
29
  */
30
- export declare function isRequestAuthorized(remoteAddr: string, webToken: string | null, presented: string | null): boolean;
30
+ export declare function isRequestAuthorized(remoteAddr: string, webToken: string | null, presented: string | null, trustLoopback?: boolean): boolean;
31
31
  export declare function startWebServer(opts: WebServerOptions): Promise<http.Server>;
32
32
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAO7B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAqDpD,OAAO,KAAK,EAAE,cAAc,EAAiB,MAAM,aAAa,CAAC;AAMjE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;CACpB;AAED,8EAA8E;AAC9E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGvD;AASD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,SAAS,EAAE,MAAM,GAAG,IAAI,GACvB,OAAO,CAGT;AA2DD,wBAAsB,cAAc,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CA+kDjF"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAO7B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAwEpD,OAAO,KAAK,EAAE,cAAc,EAAiB,MAAM,aAAa,CAAC;AAMjE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6DAA6D;IAC7D,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;CACpB;AAED,8EAA8E;AAC9E,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGvD;AASD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,aAAa,UAAO,GACnB,OAAO,CAGT;AA2DD,wBAAsB,cAAc,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAq4DjF"}