@oratis/lisa 0.11.0 → 0.12.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/agents/pty.d.ts.map +1 -1
- package/dist/agents/pty.js +13 -2
- package/dist/agents/pty.js.map +1 -1
- package/dist/cli/pair.d.ts +19 -0
- package/dist/cli/pair.d.ts.map +1 -0
- package/dist/cli/pair.js +114 -0
- package/dist/cli/pair.js.map +1 -0
- package/dist/cli.js +8 -1
- package/dist/cli.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 +41 -6
- package/dist/web/lisa-client.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/push.d.ts +80 -0
- package/dist/web/push.d.ts.map +1 -1
- package/dist/web/push.js +233 -7
- package/dist/web/push.js.map +1 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +36 -2
- package/dist/web/server.js.map +1 -1
- package/package.json +3 -1
package/dist/web/push.d.ts
CHANGED
|
@@ -28,6 +28,20 @@ export declare function registerPush(input: {
|
|
|
28
28
|
export declare function unregisterPush(idOrTarget: string): boolean;
|
|
29
29
|
export declare function listPush(): PushSubscription[];
|
|
30
30
|
export declare function setPushPrefs(id: string, prefs: Partial<PushPrefs>): PushSubscription | null;
|
|
31
|
+
export interface LiveActivityReg {
|
|
32
|
+
sessionId: string;
|
|
33
|
+
/** The ActivityKit push token (hex) for this session's Live Activity. */
|
|
34
|
+
token: string;
|
|
35
|
+
createdAt: number;
|
|
36
|
+
}
|
|
37
|
+
export declare function listLiveActivities(): LiveActivityReg[];
|
|
38
|
+
export declare function registerLiveActivity(sessionId: string, token: string, now?: number): void;
|
|
39
|
+
export declare function unregisterLiveActivity(sessionId: string): boolean;
|
|
40
|
+
/** Custom URL scheme Lisa Pocket registers for push / widget deep-links. */
|
|
41
|
+
export declare const POCKET_SCHEME = "lisapocket";
|
|
42
|
+
/** Deep-link that opens Lisa Pocket at a specific roster session. Pure. The app
|
|
43
|
+
* routes on host="session" + the agent/id query (Lisa Pocket's URL handler). */
|
|
44
|
+
export declare function agentDeepLink(agent: string, sessionId: string): string;
|
|
31
45
|
export interface PushEvent {
|
|
32
46
|
pref: keyof PushPrefs;
|
|
33
47
|
title: string;
|
|
@@ -35,6 +49,8 @@ export interface PushEvent {
|
|
|
35
49
|
priority: "high" | "default";
|
|
36
50
|
/** Throttle/dedup tag within a session. */
|
|
37
51
|
tag: string;
|
|
52
|
+
/** Optional deep-link opened when the notification is tapped (ntfy `Click`). */
|
|
53
|
+
click?: string;
|
|
38
54
|
}
|
|
39
55
|
/** Which notifications a session's prev→next transition warrants. Pure. */
|
|
40
56
|
export declare function agentPushEvents(prev: AgentSession | undefined, next: AgentSession): PushEvent[];
|
|
@@ -49,11 +65,68 @@ export declare function sendNtfy(server: string, topic: string, ev: {
|
|
|
49
65
|
title: string;
|
|
50
66
|
body: string;
|
|
51
67
|
priority: "high" | "default";
|
|
68
|
+
click?: string;
|
|
52
69
|
}, fetchImpl?: FetchLike): Promise<boolean>;
|
|
70
|
+
export interface ApnsConfig {
|
|
71
|
+
keyId: string;
|
|
72
|
+
teamId: string;
|
|
73
|
+
/** The .p8 auth-key contents (PEM). */
|
|
74
|
+
key: string;
|
|
75
|
+
/** Bundle id, e.g. ai.meetlisa.pocket. */
|
|
76
|
+
topic: string;
|
|
77
|
+
/** api.push.apple.com (prod) or api.sandbox.push.apple.com (dev). */
|
|
78
|
+
host: string;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* APNs config from env, or null (→ stub). LISA_APNS_KEY is the .p8 contents (PEM)
|
|
82
|
+
* or a path to it; LISA_APNS_ENV=production switches to the prod host.
|
|
83
|
+
*/
|
|
84
|
+
export declare function apnsConfigFromEnv(env?: NodeJS.ProcessEnv): ApnsConfig | null;
|
|
85
|
+
/** Build a signed ES256 provider JWT for APNs. Pure given (cfg, nowSec). */
|
|
86
|
+
export declare function buildApnsJwt(cfg: Pick<ApnsConfig, "keyId" | "teamId" | "key">, nowSec: number): string;
|
|
87
|
+
/** Build the APNs JSON payload from a push event. Pure. */
|
|
88
|
+
export declare function buildApnsPayload(ev: {
|
|
89
|
+
title: string;
|
|
90
|
+
body: string;
|
|
91
|
+
click?: string;
|
|
92
|
+
}): Record<string, unknown>;
|
|
93
|
+
export type ApnsPoster = (o: {
|
|
94
|
+
host: string;
|
|
95
|
+
path: string;
|
|
96
|
+
headers: Record<string, string>;
|
|
97
|
+
body: string;
|
|
98
|
+
}) => Promise<{
|
|
99
|
+
status: number;
|
|
100
|
+
}>;
|
|
101
|
+
/** Send one APNs notification. The provider JWT is cached ~50min (Apple rate-
|
|
102
|
+
* limits regeneration). `post` is injectable for tests. */
|
|
103
|
+
export declare function sendApns(cfg: ApnsConfig, deviceToken: string, ev: {
|
|
104
|
+
title: string;
|
|
105
|
+
body: string;
|
|
106
|
+
priority: "high" | "default";
|
|
107
|
+
click?: string;
|
|
108
|
+
}, post?: ApnsPoster, nowSec?: number): Promise<boolean>;
|
|
109
|
+
export interface LiveActivityState {
|
|
110
|
+
state: string;
|
|
111
|
+
detail: string;
|
|
112
|
+
turns: number;
|
|
113
|
+
}
|
|
114
|
+
/** Content-state for a session's Live Activity — mirrors the app's
|
|
115
|
+
* AgentActivityAttributes.ContentState + its detail() logic. Pure. */
|
|
116
|
+
export declare function liveActivityState(s: AgentSession): LiveActivityState;
|
|
117
|
+
/** APNs Live Activity payload — `event:"update"` refreshes, `"end"` dismisses. Pure. */
|
|
118
|
+
export declare function buildLiveActivityPayload(cs: LiveActivityState, event: "update" | "end", nowSec: number): Record<string, unknown>;
|
|
119
|
+
/** Push a Live Activity update/end over APNs (push-type liveactivity). `post`
|
|
120
|
+
* injectable for tests. Reuses the cached provider JWT. */
|
|
121
|
+
export declare function sendLiveActivityUpdate(cfg: ApnsConfig, laToken: string, cs: LiveActivityState, event: "update" | "end", post?: ApnsPoster, nowSec?: number): Promise<boolean>;
|
|
53
122
|
export interface PushBridgeOpts {
|
|
54
123
|
subs?: () => PushSubscription[];
|
|
55
124
|
/** Injected delivery (tests). Default: real ntfy / apns-stub. */
|
|
56
125
|
deliver?: (sub: PushSubscription, ev: PushEvent) => void | Promise<void>;
|
|
126
|
+
/** Registered Live Activity tokens (tests). Default: the on-disk store. */
|
|
127
|
+
liveActivities?: () => LiveActivityReg[];
|
|
128
|
+
/** Injected Live Activity delivery (tests). Default: real APNs liveactivity. */
|
|
129
|
+
liveDeliver?: (token: string, cs: LiveActivityState, event: "update" | "end") => void | Promise<void>;
|
|
57
130
|
now?: () => number;
|
|
58
131
|
log?: (m: string) => void;
|
|
59
132
|
throttleMs?: number;
|
|
@@ -63,14 +136,21 @@ export declare class PushBridge {
|
|
|
63
136
|
private readonly lastSent;
|
|
64
137
|
private readonly subs;
|
|
65
138
|
private readonly deliverFn;
|
|
139
|
+
private readonly liveActivities;
|
|
140
|
+
private readonly liveDeliverFn;
|
|
66
141
|
private readonly now;
|
|
67
142
|
private readonly log;
|
|
68
143
|
private readonly throttleMs;
|
|
144
|
+
private readonly liveThrottleMs;
|
|
69
145
|
constructor(opts?: PushBridgeOpts);
|
|
70
146
|
onAgentUpdate(next: AgentSession): void;
|
|
147
|
+
/** Refresh a pinned session's Live Activity (throttled), ending it on a
|
|
148
|
+
* terminal state. No-op unless an LA token is registered for the session. */
|
|
149
|
+
private updateLiveActivity;
|
|
71
150
|
onIdleMessage(text: string): void;
|
|
72
151
|
private fire;
|
|
73
152
|
private defaultDeliver;
|
|
153
|
+
private defaultLiveDeliver;
|
|
74
154
|
}
|
|
75
155
|
export {};
|
|
76
156
|
//# sourceMappingURL=push.d.ts.map
|
package/dist/web/push.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/web/push.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/web/push.ts"],"names":[],"mappings":"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"}
|
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.pocket), 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,6 +19,7 @@ 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
24
|
return { done: true, error: true, permission: true, idle: true, advisor: false };
|
|
21
25
|
}
|
|
@@ -86,17 +90,58 @@ export function setPushPrefs(id, prefs) {
|
|
|
86
90
|
savePush(list);
|
|
87
91
|
return s;
|
|
88
92
|
}
|
|
93
|
+
function liveActivitiesPath() {
|
|
94
|
+
return path.join(lisaHome(), "live-activities.json");
|
|
95
|
+
}
|
|
96
|
+
export function listLiveActivities() {
|
|
97
|
+
try {
|
|
98
|
+
const parsed = JSON.parse(fs.readFileSync(liveActivitiesPath(), "utf8"));
|
|
99
|
+
if (!Array.isArray(parsed))
|
|
100
|
+
return [];
|
|
101
|
+
return parsed.filter((r) => !!r && typeof r.sessionId === "string" && typeof r.token === "string");
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
export function registerLiveActivity(sessionId, token, now = Date.now()) {
|
|
108
|
+
const list = listLiveActivities().filter((r) => r.sessionId !== sessionId);
|
|
109
|
+
list.push({ sessionId, token, createdAt: now });
|
|
110
|
+
const file = liveActivitiesPath();
|
|
111
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
112
|
+
fs.writeFileSync(file, JSON.stringify(list, null, 2));
|
|
113
|
+
}
|
|
114
|
+
export function unregisterLiveActivity(sessionId) {
|
|
115
|
+
const list = listLiveActivities();
|
|
116
|
+
const next = list.filter((r) => r.sessionId !== sessionId);
|
|
117
|
+
if (next.length === list.length)
|
|
118
|
+
return false;
|
|
119
|
+
fs.writeFileSync(liveActivitiesPath(), JSON.stringify(next, null, 2));
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
// ── pure trigger ──────────────────────────────────────────────────────────
|
|
123
|
+
/** Custom URL scheme Lisa Pocket registers for push / widget deep-links. */
|
|
124
|
+
export const POCKET_SCHEME = "lisapocket";
|
|
125
|
+
/** Deep-link that opens Lisa Pocket at a specific roster session. Pure. The app
|
|
126
|
+
* routes on host="session" + the agent/id query (Lisa Pocket's URL handler). */
|
|
127
|
+
export function agentDeepLink(agent, sessionId) {
|
|
128
|
+
// URLSearchParams encodes spaces as "+", which iOS URLComponents reads literally
|
|
129
|
+
// (not as a space); use %20 so values round-trip on the app side.
|
|
130
|
+
const q = new URLSearchParams({ agent, id: sessionId }).toString().replace(/\+/g, "%20");
|
|
131
|
+
return `${POCKET_SCHEME}://session?${q}`;
|
|
132
|
+
}
|
|
89
133
|
/** Which notifications a session's prev→next transition warrants. Pure. */
|
|
90
134
|
export function agentPushEvents(prev, next) {
|
|
91
135
|
const out = [];
|
|
92
136
|
const who = `${next.agent} · ${next.project || next.agent}`;
|
|
137
|
+
const click = agentDeepLink(next.agent, next.sessionId);
|
|
93
138
|
if (next.state === "done" && prev?.state !== "done")
|
|
94
|
-
out.push({ pref: "done", title: `${who} — done`, body: "Finished.", priority: "default", tag: "done" });
|
|
139
|
+
out.push({ pref: "done", title: `${who} — done`, body: "Finished.", priority: "default", tag: "done", click });
|
|
95
140
|
if (next.state === "error" && prev?.state !== "error")
|
|
96
|
-
out.push({ pref: "error", title: `${who} — error`, body: next.stateReason || "errored", priority: "high", tag: "error" });
|
|
141
|
+
out.push({ pref: "error", title: `${who} — error`, body: next.stateReason || "errored", priority: "high", tag: "error", click });
|
|
97
142
|
const pend = next.activity?.pendingPermission;
|
|
98
143
|
if (pend && pend !== prev?.activity?.pendingPermission)
|
|
99
|
-
out.push({ pref: "permission", title: `${who} — needs permission`, body: `waiting on: ${pend}`, priority: "high", tag: "permission" });
|
|
144
|
+
out.push({ pref: "permission", title: `${who} — needs permission`, body: `waiting on: ${pend}`, priority: "high", tag: "permission", click });
|
|
100
145
|
return out;
|
|
101
146
|
}
|
|
102
147
|
export async function sendNtfy(server, topic, ev, fetchImpl = fetch) {
|
|
@@ -105,7 +150,13 @@ export async function sendNtfy(server, topic, ev, fetchImpl = fetch) {
|
|
|
105
150
|
const res = await fetchImpl(`${base}/${encodeURIComponent(topic)}`, {
|
|
106
151
|
method: "POST",
|
|
107
152
|
body: ev.body,
|
|
108
|
-
headers: {
|
|
153
|
+
headers: {
|
|
154
|
+
Title: ev.title,
|
|
155
|
+
Priority: ev.priority === "high" ? "high" : "default",
|
|
156
|
+
// ntfy opens this URL when the notification is tapped — a lisapocket://
|
|
157
|
+
// deep-link routes into the app (see agentDeepLink).
|
|
158
|
+
...(ev.click ? { Click: ev.click } : {}),
|
|
159
|
+
},
|
|
109
160
|
});
|
|
110
161
|
return res.ok;
|
|
111
162
|
}
|
|
@@ -113,20 +164,161 @@ export async function sendNtfy(server, topic, ev, fetchImpl = fetch) {
|
|
|
113
164
|
return false;
|
|
114
165
|
}
|
|
115
166
|
}
|
|
167
|
+
/**
|
|
168
|
+
* APNs config from env, or null (→ stub). LISA_APNS_KEY is the .p8 contents (PEM)
|
|
169
|
+
* or a path to it; LISA_APNS_ENV=production switches to the prod host.
|
|
170
|
+
*/
|
|
171
|
+
export function apnsConfigFromEnv(env = process.env) {
|
|
172
|
+
const keyId = env.LISA_APNS_KEY_ID;
|
|
173
|
+
const teamId = env.LISA_APNS_TEAM_ID;
|
|
174
|
+
const raw = env.LISA_APNS_KEY;
|
|
175
|
+
if (!keyId || !teamId || !raw)
|
|
176
|
+
return null;
|
|
177
|
+
let key = raw;
|
|
178
|
+
if (!raw.includes("BEGIN")) {
|
|
179
|
+
try {
|
|
180
|
+
key = fs.readFileSync(raw, "utf8");
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
const topic = env.LISA_APNS_TOPIC || "ai.meetlisa.pocket";
|
|
187
|
+
const host = env.LISA_APNS_ENV === "production" ? "api.push.apple.com" : "api.sandbox.push.apple.com";
|
|
188
|
+
return { keyId, teamId, key, topic, host };
|
|
189
|
+
}
|
|
190
|
+
function b64url(buf) {
|
|
191
|
+
return buf.toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
192
|
+
}
|
|
193
|
+
/** Build a signed ES256 provider JWT for APNs. Pure given (cfg, nowSec). */
|
|
194
|
+
export function buildApnsJwt(cfg, nowSec) {
|
|
195
|
+
const header = b64url(Buffer.from(JSON.stringify({ alg: "ES256", kid: cfg.keyId })));
|
|
196
|
+
const claims = b64url(Buffer.from(JSON.stringify({ iss: cfg.teamId, iat: nowSec })));
|
|
197
|
+
const signingInput = `${header}.${claims}`;
|
|
198
|
+
const signer = crypto.createSign("SHA256");
|
|
199
|
+
signer.update(signingInput);
|
|
200
|
+
// ES256 JWTs use raw R||S (IEEE-P1363), not the DER that sign() defaults to.
|
|
201
|
+
const sig = signer.sign({ key: crypto.createPrivateKey(cfg.key), dsaEncoding: "ieee-p1363" });
|
|
202
|
+
return `${signingInput}.${b64url(sig)}`;
|
|
203
|
+
}
|
|
204
|
+
/** Build the APNs JSON payload from a push event. Pure. */
|
|
205
|
+
export function buildApnsPayload(ev) {
|
|
206
|
+
return {
|
|
207
|
+
aps: { alert: { title: ev.title, body: ev.body }, sound: "default" },
|
|
208
|
+
// Custom key the app reads on tap to deep-link (mirrors the ntfy Click URL).
|
|
209
|
+
...(ev.click ? { link: ev.click } : {}),
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
/** Real APNs POST over HTTP/2. Settles exactly once and always closes the client;
|
|
213
|
+
* resolves status 0 on a connection error or a 10s timeout. */
|
|
214
|
+
const realApnsPost = (o) => new Promise((resolve) => {
|
|
215
|
+
const client = http2.connect(`https://${o.host}`);
|
|
216
|
+
let status = 0;
|
|
217
|
+
let settled = false;
|
|
218
|
+
const done = (s) => {
|
|
219
|
+
if (settled)
|
|
220
|
+
return;
|
|
221
|
+
settled = true;
|
|
222
|
+
try {
|
|
223
|
+
client.close();
|
|
224
|
+
}
|
|
225
|
+
catch { /* already closing */ }
|
|
226
|
+
resolve({ status: s });
|
|
227
|
+
};
|
|
228
|
+
client.on("error", () => done(0));
|
|
229
|
+
const req = client.request({ ":method": "POST", ":path": o.path, ...o.headers });
|
|
230
|
+
req.setEncoding("utf8");
|
|
231
|
+
req.setTimeout(10_000, () => done(0)); // don't leak a hung connection
|
|
232
|
+
req.on("response", (h) => { status = Number(h[":status"]) || 0; });
|
|
233
|
+
req.on("data", () => { });
|
|
234
|
+
req.on("end", () => done(status));
|
|
235
|
+
req.on("error", () => done(0));
|
|
236
|
+
req.end(o.body);
|
|
237
|
+
});
|
|
238
|
+
// JWT cache keyed by config identity (not just time) — a different key/team must
|
|
239
|
+
// not reuse a stale token (wrong kid/iss → APNs 403).
|
|
240
|
+
let cachedApnsJwt = null;
|
|
241
|
+
/** Send one APNs notification. The provider JWT is cached ~50min (Apple rate-
|
|
242
|
+
* limits regeneration). `post` is injectable for tests. */
|
|
243
|
+
export async function sendApns(cfg, deviceToken, ev, post = realApnsPost, nowSec = Math.floor(Date.now() / 1000)) {
|
|
244
|
+
const cacheId = `${cfg.keyId}/${cfg.teamId}`;
|
|
245
|
+
if (!cachedApnsJwt || cachedApnsJwt.id !== cacheId || nowSec - cachedApnsJwt.at > 50 * 60) {
|
|
246
|
+
cachedApnsJwt = { token: buildApnsJwt(cfg, nowSec), at: nowSec, id: cacheId };
|
|
247
|
+
}
|
|
248
|
+
const res = await post({
|
|
249
|
+
host: cfg.host,
|
|
250
|
+
path: `/3/device/${deviceToken}`,
|
|
251
|
+
headers: {
|
|
252
|
+
authorization: `bearer ${cachedApnsJwt.token}`,
|
|
253
|
+
"apns-topic": cfg.topic,
|
|
254
|
+
"apns-push-type": "alert",
|
|
255
|
+
"apns-priority": ev.priority === "high" ? "10" : "5",
|
|
256
|
+
// Operational alerts are time-sensitive — don't let APNs store & deliver
|
|
257
|
+
// a stale one later if the device is offline.
|
|
258
|
+
"apns-expiration": ev.priority === "high" ? "0" : String(nowSec + 3600),
|
|
259
|
+
},
|
|
260
|
+
body: JSON.stringify(buildApnsPayload(ev)),
|
|
261
|
+
});
|
|
262
|
+
return res.status === 200;
|
|
263
|
+
}
|
|
264
|
+
/** Content-state for a session's Live Activity — mirrors the app's
|
|
265
|
+
* AgentActivityAttributes.ContentState + its detail() logic. Pure. */
|
|
266
|
+
export function liveActivityState(s) {
|
|
267
|
+
const a = s.activity;
|
|
268
|
+
const last = a?.lastTools && a.lastTools.length ? a.lastTools[a.lastTools.length - 1] : undefined;
|
|
269
|
+
const detail = a?.pendingPermission ? `⚠ ${a.pendingPermission}` : (s.stateReason || last || s.state);
|
|
270
|
+
return { state: s.state, detail, turns: a?.turnCount ?? 0 };
|
|
271
|
+
}
|
|
272
|
+
/** APNs Live Activity payload — `event:"update"` refreshes, `"end"` dismisses. Pure. */
|
|
273
|
+
export function buildLiveActivityPayload(cs, event, nowSec) {
|
|
274
|
+
return {
|
|
275
|
+
aps: {
|
|
276
|
+
timestamp: nowSec,
|
|
277
|
+
event,
|
|
278
|
+
"content-state": { state: cs.state, detail: cs.detail, turns: cs.turns },
|
|
279
|
+
...(event === "end" ? { "dismissal-date": nowSec } : {}),
|
|
280
|
+
},
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
/** Push a Live Activity update/end over APNs (push-type liveactivity). `post`
|
|
284
|
+
* injectable for tests. Reuses the cached provider JWT. */
|
|
285
|
+
export async function sendLiveActivityUpdate(cfg, laToken, cs, event, post = realApnsPost, nowSec = Math.floor(Date.now() / 1000)) {
|
|
286
|
+
const cacheId = `${cfg.keyId}/${cfg.teamId}`;
|
|
287
|
+
if (!cachedApnsJwt || cachedApnsJwt.id !== cacheId || nowSec - cachedApnsJwt.at > 50 * 60) {
|
|
288
|
+
cachedApnsJwt = { token: buildApnsJwt(cfg, nowSec), at: nowSec, id: cacheId };
|
|
289
|
+
}
|
|
290
|
+
const res = await post({
|
|
291
|
+
host: cfg.host,
|
|
292
|
+
path: `/3/device/${laToken}`,
|
|
293
|
+
headers: {
|
|
294
|
+
authorization: `bearer ${cachedApnsJwt.token}`,
|
|
295
|
+
"apns-topic": `${cfg.topic}.push-type.liveactivity`,
|
|
296
|
+
"apns-push-type": "liveactivity",
|
|
297
|
+
"apns-priority": "10",
|
|
298
|
+
},
|
|
299
|
+
body: JSON.stringify(buildLiveActivityPayload(cs, event, nowSec)),
|
|
300
|
+
});
|
|
301
|
+
return res.status === 200;
|
|
302
|
+
}
|
|
116
303
|
export class PushBridge {
|
|
117
304
|
prev = new Map();
|
|
118
305
|
lastSent = new Map();
|
|
119
306
|
subs;
|
|
120
307
|
deliverFn;
|
|
308
|
+
liveActivities;
|
|
309
|
+
liveDeliverFn;
|
|
121
310
|
now;
|
|
122
311
|
log;
|
|
123
312
|
throttleMs;
|
|
313
|
+
liveThrottleMs = 3000;
|
|
124
314
|
constructor(opts = {}) {
|
|
125
315
|
this.subs = opts.subs ?? listPush;
|
|
126
316
|
this.now = opts.now ?? Date.now;
|
|
127
317
|
this.log = opts.log ?? (() => { });
|
|
128
318
|
this.throttleMs = opts.throttleMs ?? 30_000;
|
|
129
319
|
this.deliverFn = opts.deliver ?? ((sub, ev) => this.defaultDeliver(sub, ev));
|
|
320
|
+
this.liveActivities = opts.liveActivities ?? listLiveActivities;
|
|
321
|
+
this.liveDeliverFn = opts.liveDeliver ?? ((token, cs, event) => this.defaultLiveDeliver(token, cs, event));
|
|
130
322
|
}
|
|
131
323
|
onAgentUpdate(next) {
|
|
132
324
|
const key = `${next.agent}/${next.sessionId}`;
|
|
@@ -134,6 +326,23 @@ export class PushBridge {
|
|
|
134
326
|
this.prev.set(key, next);
|
|
135
327
|
for (const ev of events)
|
|
136
328
|
this.fire(ev, `${key}#${ev.tag}`);
|
|
329
|
+
this.updateLiveActivity(next);
|
|
330
|
+
}
|
|
331
|
+
/** Refresh a pinned session's Live Activity (throttled), ending it on a
|
|
332
|
+
* terminal state. No-op unless an LA token is registered for the session. */
|
|
333
|
+
updateLiveActivity(next) {
|
|
334
|
+
const reg = this.liveActivities().find((r) => r.sessionId === next.sessionId);
|
|
335
|
+
if (!reg)
|
|
336
|
+
return;
|
|
337
|
+
const terminal = next.state === "done" || next.state === "error";
|
|
338
|
+
const key = `la#${next.sessionId}`;
|
|
339
|
+
// Throttle progress refreshes, but always let a terminal "end" through.
|
|
340
|
+
if (!terminal && this.now() - (this.lastSent.get(key) ?? -Infinity) < this.liveThrottleMs)
|
|
341
|
+
return;
|
|
342
|
+
this.lastSent.set(key, this.now());
|
|
343
|
+
void Promise.resolve(this.liveDeliverFn(reg.token, liveActivityState(next), terminal ? "end" : "update")).catch(() => { });
|
|
344
|
+
if (terminal)
|
|
345
|
+
unregisterLiveActivity(next.sessionId);
|
|
137
346
|
}
|
|
138
347
|
onIdleMessage(text) {
|
|
139
348
|
this.fire({ pref: "idle", title: "Lisa — while you were away", body: text.slice(0, 200), priority: "default", tag: "idle" }, `idle#${this.now()}`);
|
|
@@ -156,8 +365,25 @@ export class PushBridge {
|
|
|
156
365
|
this.log(`[push] ntfy send failed for ${sub.id}`);
|
|
157
366
|
}
|
|
158
367
|
else {
|
|
159
|
-
|
|
368
|
+
const cfg = apnsConfigFromEnv();
|
|
369
|
+
if (!cfg) {
|
|
370
|
+
this.log(`[push] apns not configured (set LISA_APNS_KEY/_KEY_ID/_TEAM_ID) — would notify ${sub.id}: ${ev.title}`);
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
const ok = await sendApns(cfg, sub.target, ev);
|
|
374
|
+
if (!ok)
|
|
375
|
+
this.log(`[push] apns send failed for ${sub.id}`);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
async defaultLiveDeliver(token, cs, event) {
|
|
379
|
+
const cfg = apnsConfigFromEnv();
|
|
380
|
+
if (!cfg) {
|
|
381
|
+
this.log(`[push] live-activity ${event} skipped (no APNs key)`);
|
|
382
|
+
return;
|
|
160
383
|
}
|
|
384
|
+
const ok = await sendLiveActivityUpdate(cfg, token, cs, event);
|
|
385
|
+
if (!ok)
|
|
386
|
+
this.log(`[push] live-activity ${event} failed`);
|
|
161
387
|
}
|
|
162
388
|
}
|
|
163
389
|
//# 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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"}
|
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;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,
|
|
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,CA0mDjF"}
|
package/dist/web/server.js
CHANGED
|
@@ -31,12 +31,12 @@ import { polishDictation } from "../voice/dictation.js";
|
|
|
31
31
|
import { listGrants, grant, revoke, revokeAll, isGranted, SENSE_SIGNALS, SIGNAL_DESCRIPTIONS } from "../consent/store.js";
|
|
32
32
|
import { signalAgentTool } from "../tools/signal_agent.js";
|
|
33
33
|
import { managedRegistry } from "../agents/managed.js";
|
|
34
|
-
import { ptyRegistry, ptyEnabled } from "../agents/pty.js";
|
|
34
|
+
import { ptyRegistry, ptyEnabled, normalizeAgentKind } from "../agents/pty.js";
|
|
35
35
|
import { liveClaudeSessionIds } from "../integrations/claude-code/liveness.js";
|
|
36
36
|
import { listRecentDispatches, isAlive, toDispatchView, readDispatchOutput } from "../integrations/dispatch-ledger.js";
|
|
37
37
|
import { loadControlPolicy, saveControlPolicy } from "../control/policy.js";
|
|
38
38
|
import { mintDevice, verifyDeviceToken, touchDevice, listDevices, revokeDevice } from "./devices.js";
|
|
39
|
-
import { PushBridge, listPush, registerPush, unregisterPush, setPushPrefs } from "./push.js";
|
|
39
|
+
import { PushBridge, listPush, registerPush, unregisterPush, setPushPrefs, registerLiveActivity, unregisterLiveActivity } from "./push.js";
|
|
40
40
|
import { SenseService } from "../sense/service.js";
|
|
41
41
|
import { ScreenSource } from "../sense/screen.js";
|
|
42
42
|
import { VoiceSource } from "../sense/voice.js";
|
|
@@ -848,6 +848,32 @@ export async function startWebServer(opts) {
|
|
|
848
848
|
res.end(JSON.stringify({ ok: removed }));
|
|
849
849
|
return;
|
|
850
850
|
}
|
|
851
|
+
// Register/unregister a Live Activity push token for a pinned session — the
|
|
852
|
+
// push-bridge then refreshes that activity over APNs as the agent updates.
|
|
853
|
+
if (req.method === "POST" && url === "/api/push/live-activity") {
|
|
854
|
+
let laBody = "";
|
|
855
|
+
for await (const chunk of req)
|
|
856
|
+
laBody += chunk.toString("utf8");
|
|
857
|
+
let payload = {};
|
|
858
|
+
try {
|
|
859
|
+
payload = laBody ? JSON.parse(laBody) : {};
|
|
860
|
+
}
|
|
861
|
+
catch { /* tolerate */ }
|
|
862
|
+
if (typeof payload.sessionId !== "string" || !payload.sessionId) {
|
|
863
|
+
res.writeHead(400, { "content-type": "text/plain" });
|
|
864
|
+
res.end("sessionId required");
|
|
865
|
+
return;
|
|
866
|
+
}
|
|
867
|
+
if (typeof payload.token === "string" && payload.token) {
|
|
868
|
+
registerLiveActivity(payload.sessionId, payload.token);
|
|
869
|
+
}
|
|
870
|
+
else {
|
|
871
|
+
unregisterLiveActivity(payload.sessionId);
|
|
872
|
+
}
|
|
873
|
+
res.writeHead(200, { "content-type": "application/json" });
|
|
874
|
+
res.end(JSON.stringify({ ok: true }));
|
|
875
|
+
return;
|
|
876
|
+
}
|
|
851
877
|
if (req.method === "GET" && url === "/api/push/list") {
|
|
852
878
|
res.writeHead(200, { "content-type": "application/json" });
|
|
853
879
|
res.end(JSON.stringify({ subscriptions: listPush() }));
|
|
@@ -1029,6 +1055,14 @@ export async function startWebServer(opts) {
|
|
|
1029
1055
|
// behind remoteAdoptExternal; starting a fresh agent is ordinary control.
|
|
1030
1056
|
if (denyRemote(resumeSessionId ? "adoptExternal" : "control"))
|
|
1031
1057
|
return;
|
|
1058
|
+
// Resume-adopt is claude-only (docs/PTY_AGENTS.md). Codex has no liveness
|
|
1059
|
+
// signal, so we can't guard against resuming a *live* rollout and corrupting
|
|
1060
|
+
// it — refuse with a clear 400 rather than silently spawning a fresh session.
|
|
1061
|
+
if (resumeSessionId && normalizeAgentKind(agent) !== "claude-code") {
|
|
1062
|
+
res.writeHead(400, { "content-type": "text/plain" });
|
|
1063
|
+
res.end(`resume-adopt is only supported for claude sessions (got "${agent}"); start a fresh agent instead`);
|
|
1064
|
+
return;
|
|
1065
|
+
}
|
|
1032
1066
|
// Adopting an existing session needs no task (it continues the convo); a
|
|
1033
1067
|
// fresh agent does. Guard: never resume a session that's currently live.
|
|
1034
1068
|
if (!resumeSessionId && (typeof payload.task !== "string" || !payload.task.trim())) {
|