@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.
- package/dist/agent.d.ts +2 -0
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +20 -1
- package/dist/agent.js.map +1 -1
- package/dist/agents/pty.d.ts.map +1 -1
- package/dist/agents/pty.js +13 -2
- package/dist/agents/pty.js.map +1 -1
- package/dist/autonomy/state.d.ts +14 -0
- package/dist/autonomy/state.d.ts.map +1 -0
- package/dist/autonomy/state.js +54 -0
- package/dist/autonomy/state.js.map +1 -0
- package/dist/cli/mail.d.ts +2 -0
- package/dist/cli/mail.d.ts.map +1 -0
- package/dist/cli/mail.js +209 -0
- package/dist/cli/mail.js.map +1 -0
- package/dist/cli/pair.d.ts +15 -0
- package/dist/cli/pair.d.ts.map +1 -0
- package/dist/cli/pair.js +152 -0
- package/dist/cli/pair.js.map +1 -0
- package/dist/cli.js +22 -14
- package/dist/cli.js.map +1 -1
- package/dist/consent/store.d.ts +2 -2
- package/dist/consent/store.d.ts.map +1 -1
- package/dist/consent/store.js +3 -2
- package/dist/consent/store.js.map +1 -1
- package/dist/edition.d.ts +24 -0
- package/dist/edition.d.ts.map +1 -0
- package/dist/edition.js +19 -0
- package/dist/edition.js.map +1 -0
- package/dist/heartbeat/runner.d.ts.map +1 -1
- package/dist/heartbeat/runner.js +8 -0
- package/dist/heartbeat/runner.js.map +1 -1
- package/dist/idle/runner.d.ts.map +1 -1
- package/dist/idle/runner.js +7 -0
- package/dist/idle/runner.js.map +1 -1
- package/dist/mail/accounts.d.ts +20 -0
- package/dist/mail/accounts.d.ts.map +1 -0
- package/dist/mail/accounts.js +113 -0
- package/dist/mail/accounts.js.map +1 -0
- package/dist/mail/alerts.d.ts +29 -0
- package/dist/mail/alerts.d.ts.map +1 -0
- package/dist/mail/alerts.js +40 -0
- package/dist/mail/alerts.js.map +1 -0
- package/dist/mail/classify.d.ts +26 -0
- package/dist/mail/classify.d.ts.map +1 -0
- package/dist/mail/classify.js +191 -0
- package/dist/mail/classify.js.map +1 -0
- package/dist/mail/connectors/gmail.d.ts +55 -0
- package/dist/mail/connectors/gmail.d.ts.map +1 -0
- package/dist/mail/connectors/gmail.js +87 -0
- package/dist/mail/connectors/gmail.js.map +1 -0
- package/dist/mail/connectors/imap.d.ts +13 -0
- package/dist/mail/connectors/imap.d.ts.map +1 -0
- package/dist/mail/connectors/imap.js +136 -0
- package/dist/mail/connectors/imap.js.map +1 -0
- package/dist/mail/digest.d.ts +21 -0
- package/dist/mail/digest.d.ts.map +1 -0
- package/dist/mail/digest.js +89 -0
- package/dist/mail/digest.js.map +1 -0
- package/dist/mail/google-oauth.d.ts +50 -0
- package/dist/mail/google-oauth.d.ts.map +1 -0
- package/dist/mail/google-oauth.js +74 -0
- package/dist/mail/google-oauth.js.map +1 -0
- package/dist/mail/hosts.d.ts +3 -0
- package/dist/mail/hosts.d.ts.map +1 -0
- package/dist/mail/hosts.js +19 -0
- package/dist/mail/hosts.js.map +1 -0
- package/dist/mail/scheduler.d.ts +9 -0
- package/dist/mail/scheduler.d.ts.map +1 -0
- package/dist/mail/scheduler.js +21 -0
- package/dist/mail/scheduler.js.map +1 -0
- package/dist/mail/service.d.ts +32 -0
- package/dist/mail/service.d.ts.map +1 -0
- package/dist/mail/service.js +129 -0
- package/dist/mail/service.js.map +1 -0
- package/dist/mail/store.d.ts +7 -0
- package/dist/mail/store.d.ts.map +1 -0
- package/dist/mail/store.js +58 -0
- package/dist/mail/store.js.map +1 -0
- package/dist/mail/types.d.ts +114 -0
- package/dist/mail/types.d.ts.map +1 -0
- package/dist/mail/types.js +26 -0
- package/dist/mail/types.js.map +1 -0
- package/dist/providers/anthropic.d.ts.map +1 -1
- package/dist/providers/anthropic.js +43 -21
- package/dist/providers/anthropic.js.map +1 -1
- package/dist/providers/gemini.d.ts.map +1 -1
- package/dist/providers/gemini.js +67 -64
- package/dist/providers/gemini.js.map +1 -1
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +77 -71
- package/dist/providers/openai.js.map +1 -1
- package/dist/providers/registry.d.ts +10 -0
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +26 -0
- package/dist/providers/registry.js.map +1 -1
- package/dist/providers/stream-retry.d.ts +37 -0
- package/dist/providers/stream-retry.d.ts.map +1 -0
- package/dist/providers/stream-retry.js +92 -0
- package/dist/providers/stream-retry.js.map +1 -0
- package/dist/providers/types.d.ts +3 -0
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/subagent.d.ts +2 -0
- package/dist/subagent.d.ts.map +1 -1
- package/dist/subagent.js +1 -0
- package/dist/subagent.js.map +1 -1
- package/dist/web/cloudAuth.d.ts +57 -0
- package/dist/web/cloudAuth.d.ts.map +1 -0
- package/dist/web/cloudAuth.js +139 -0
- package/dist/web/cloudAuth.js.map +1 -0
- package/dist/web/island.d.ts.map +1 -1
- package/dist/web/island.js +1 -0
- package/dist/web/island.js.map +1 -1
- package/dist/web/lisa-client.d.ts +1 -1
- package/dist/web/lisa-client.d.ts.map +1 -1
- package/dist/web/lisa-client.js +703 -40
- package/dist/web/lisa-client.js.map +1 -1
- package/dist/web/lisa-css.d.ts +1 -1
- package/dist/web/lisa-css.d.ts.map +1 -1
- package/dist/web/lisa-css.js +568 -43
- package/dist/web/lisa-css.js.map +1 -1
- package/dist/web/lisa-html.d.ts +1 -1
- package/dist/web/lisa-html.d.ts.map +1 -1
- package/dist/web/lisa-html.js +71 -21
- package/dist/web/lisa-html.js.map +1 -1
- package/dist/web/pairing.d.ts +37 -0
- package/dist/web/pairing.d.ts.map +1 -0
- package/dist/web/pairing.js +79 -0
- package/dist/web/pairing.js.map +1 -0
- package/dist/web/push.d.ts +91 -0
- package/dist/web/push.d.ts.map +1 -1
- package/dist/web/push.js +250 -9
- package/dist/web/push.js.map +1 -1
- package/dist/web/qr-svg.d.ts +11 -0
- package/dist/web/qr-svg.d.ts.map +1 -0
- package/dist/web/qr-svg.js +41 -0
- package/dist/web/qr-svg.js.map +1 -0
- package/dist/web/server.d.ts +1 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +378 -14
- package/dist/web/server.js.map +1 -1
- 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
|
|
11
|
-
*
|
|
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 {
|
|
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: {
|
|
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
|
-
|
|
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
|
package/dist/web/push.js.map
CHANGED
|
@@ -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"}
|
package/dist/web/server.d.ts
CHANGED
|
@@ -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
|
package/dist/web/server.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|