@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lisa-html.d.ts","sourceRoot":"","sources":["../../src/web/lisa-html.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAKH,eAAO,MAAM,SAAS
|
|
1
|
+
{"version":3,"file":"lisa-html.d.ts","sourceRoot":"","sources":["../../src/web/lisa-html.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAKH,eAAO,MAAM,SAAS,uz/JAgOP,CAAC"}
|
package/dist/web/lisa-html.js
CHANGED
|
@@ -66,6 +66,16 @@ ${MAIN_CSS}
|
|
|
66
66
|
</div>
|
|
67
67
|
</div>
|
|
68
68
|
|
|
69
|
+
<!-- Primary navigation (view switcher — wired in setupConsole) -->
|
|
70
|
+
<nav class="nav-list" id="navList">
|
|
71
|
+
<button class="nav-item active" type="button" data-view="chat"><span class="nav-ico">◍</span>Chat</button>
|
|
72
|
+
<button class="nav-item" type="button" data-view="dashboard"><span class="nav-ico">▦</span>Dashboard</button>
|
|
73
|
+
<button class="nav-item" type="button" data-view="control"><span class="nav-ico">⌘</span>Control<span class="nav-tag" id="navAgentCount">0</span></button>
|
|
74
|
+
<button class="nav-item" type="button" data-view="reve"><span class="nav-ico">☾</span>Rêve</button>
|
|
75
|
+
<button class="nav-item" type="button" data-view="sense"><span class="nav-ico">◉</span>Sense</button>
|
|
76
|
+
<button class="nav-item" type="button" data-view="memory"><span class="nav-ico">✦</span>Memory</button>
|
|
77
|
+
</nav>
|
|
78
|
+
|
|
69
79
|
<!-- Currently wanting -->
|
|
70
80
|
<div class="sb-section">
|
|
71
81
|
<h2>currently wanting</h2>
|
|
@@ -78,20 +88,28 @@ ${MAIN_CSS}
|
|
|
78
88
|
<div class="left">agents</div>
|
|
79
89
|
<div class="count">▶︎ <span id="sbClaudeCount">0</span></div>
|
|
80
90
|
</div>
|
|
81
|
-
<
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
<option value="claude">claude</option>
|
|
85
|
-
<option value="codex">codex</option>
|
|
86
|
-
</select>
|
|
87
|
-
<input id="sbDelegateTask" type="text" placeholder="delegate a task…" />
|
|
88
|
-
<button type="submit" title="Start an agent">▶</button>
|
|
89
|
-
</form>
|
|
91
|
+
<button id="sbDelegateBtn" class="delegate-btn" type="button" title="Start an agent">
|
|
92
|
+
+ delegate a task
|
|
93
|
+
</button>
|
|
90
94
|
<div id="sbClaudeRows">
|
|
91
95
|
<div class="session-empty">(idle)</div>
|
|
92
96
|
</div>
|
|
93
97
|
</div>
|
|
94
98
|
|
|
99
|
+
<!-- Mail digest (connect a mailbox → daily classified digest) -->
|
|
100
|
+
<div class="card tint-mail" id="sbMailCard">
|
|
101
|
+
<div class="h">
|
|
102
|
+
<div class="left">mail</div>
|
|
103
|
+
<div class="count" id="sbMailCount"></div>
|
|
104
|
+
</div>
|
|
105
|
+
<div id="sbMailBody">
|
|
106
|
+
<div class="session-empty">(not connected)</div>
|
|
107
|
+
</div>
|
|
108
|
+
<button id="sbMailConnectBtn" class="delegate-btn" type="button" title="Connect a mailbox">
|
|
109
|
+
+ connect mailbox
|
|
110
|
+
</button>
|
|
111
|
+
</div>
|
|
112
|
+
|
|
95
113
|
<!-- Last reflection (collapsed pointer to the most recent ★) -->
|
|
96
114
|
<div class="card tint-idle" id="sbReflection" style="display:none;">
|
|
97
115
|
<div class="h">
|
|
@@ -100,13 +118,19 @@ ${MAIN_CSS}
|
|
|
100
118
|
<p style="margin:0; font-size:11.5px; color:var(--fg-2); line-height:1.5;" id="sbReflectionBody"></p>
|
|
101
119
|
</div>
|
|
102
120
|
|
|
103
|
-
<!-- SOUL
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
<
|
|
108
|
-
<
|
|
109
|
-
|
|
121
|
+
<!-- (SOUL/SKILLS/TOOLS/PLANS → top function bar; MEMORY → rail view) -->
|
|
122
|
+
|
|
123
|
+
<!-- Proactive autonomy toggle (master switch — wired in setupConsole) -->
|
|
124
|
+
<div class="proactive-toggle" id="proactiveToggle" role="switch" aria-checked="false" tabindex="0" title="Let Lisa watch and act on her own when you're away">
|
|
125
|
+
<span class="pt-label">Proactive</span>
|
|
126
|
+
<span class="pt-track"><span class="pt-knob"></span></span>
|
|
127
|
+
</div>
|
|
128
|
+
|
|
129
|
+
<!-- Compact / sidebar-mode toggle (client-side; forces the narrow stacked
|
|
130
|
+
layout at any width so Lisa can dock as a skinny panel) -->
|
|
131
|
+
<div class="proactive-toggle" id="compactToggle" role="switch" aria-checked="false" tabindex="0" title="Compact / sidebar mode — dock Lisa as a narrow panel (also auto on a small window)">
|
|
132
|
+
<span class="pt-label">Compact</span>
|
|
133
|
+
<span class="pt-track"><span class="pt-knob"></span></span>
|
|
110
134
|
</div>
|
|
111
135
|
|
|
112
136
|
<!-- Footer: current session id -->
|
|
@@ -119,6 +143,21 @@ ${MAIN_CSS}
|
|
|
119
143
|
<!-- ╔════════════════ Main pane ════════════════╗ -->
|
|
120
144
|
<div class="main">
|
|
121
145
|
|
|
146
|
+
<!-- Chat view (default home) — function bar + log + attachments + composer -->
|
|
147
|
+
<div class="view active" id="viewChat">
|
|
148
|
+
|
|
149
|
+
<!-- Top icon function bar (功能区): quick panels + find -->
|
|
150
|
+
<div class="fnbar" id="fnbar">
|
|
151
|
+
<button class="fbtn" type="button" data-panel="soul" title="Soul" aria-label="Soul"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3l2.2 6.6L21 12l-6.8 2.4L12 21l-2.2-6.6L3 12l6.8-2.4z"/></svg></button>
|
|
152
|
+
<button class="fbtn" type="button" data-panel="skills" title="Skills" aria-label="Skills"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M13 2 4 14h7l-1 8 10-12h-7z"/></svg></button>
|
|
153
|
+
<button class="fbtn" type="button" data-panel="tools" title="Tools" aria-label="Tools"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"/></svg></button>
|
|
154
|
+
<button class="fbtn" type="button" data-panel="plans" title="Coding plans" aria-label="Coding plans"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><line x1="6" y1="3" x2="6" y2="15"/><circle cx="18" cy="6" r="3"/><circle cx="6" cy="18" r="3"/><path d="M18 9a9 9 0 0 1-9 9"/></svg></button>
|
|
155
|
+
<button class="fbtn" type="button" data-panel="pair" title="Pair phone" aria-label="Pair phone"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><rect x="7" y="2" width="10" height="20" rx="2"/><line x1="11" y1="18" x2="13" y2="18"/></svg></button>
|
|
156
|
+
<span class="fbar-spacer"></span>
|
|
157
|
+
<input id="fnFind" class="fn-find" type="text" placeholder="find in chat…" autocomplete="off" style="display:none">
|
|
158
|
+
<button class="fbtn" type="button" id="fnSearchBtn" title="Find in conversation" aria-label="Find"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="7"/><line x1="21" y1="21" x2="16.65" y2="16.65"/></svg></button>
|
|
159
|
+
</div>
|
|
160
|
+
|
|
122
161
|
<!-- Chat log (messages, tool blocks, idle blocks injected here) -->
|
|
123
162
|
<div id="log"></div>
|
|
124
163
|
|
|
@@ -127,11 +166,14 @@ ${MAIN_CSS}
|
|
|
127
166
|
|
|
128
167
|
<!-- Composer -->
|
|
129
168
|
<form id="form">
|
|
130
|
-
<
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
169
|
+
<input type="file" id="fileInput" accept="image/*,.pdf,.txt,.md,.csv,.json" multiple>
|
|
170
|
+
<div class="plus-wrap">
|
|
171
|
+
<button type="button" id="plusBtn" title="Attach or screenshot">+</button>
|
|
172
|
+
<div class="plus-menu" id="plusMenu">
|
|
173
|
+
<button type="button" id="pmAttach"><span class="g">📎</span> Attach file</button>
|
|
174
|
+
<button type="button" id="pmShot"><span class="g">📷</span> Screenshot</button>
|
|
175
|
+
</div>
|
|
176
|
+
</div>
|
|
135
177
|
<button type="button" id="recordBtn" title="Dictate — speak and Lisa drops polished text in the box (hold to record a summary)">🎙</button>
|
|
136
178
|
<textarea id="input" placeholder="Talk to Lisa… (Enter to send · Shift+Enter for newline)" autofocus></textarea>
|
|
137
179
|
<button type="submit" id="sendBtn">
|
|
@@ -139,6 +181,14 @@ ${MAIN_CSS}
|
|
|
139
181
|
SEND →
|
|
140
182
|
</button>
|
|
141
183
|
</form>
|
|
184
|
+
</div><!-- /#viewChat -->
|
|
185
|
+
|
|
186
|
+
<!-- Console views (populated lazily by setupConsole in lisa-client.ts) -->
|
|
187
|
+
<section class="view" id="viewDashboard"></section>
|
|
188
|
+
<section class="view" id="viewControl"></section>
|
|
189
|
+
<section class="view" id="viewReve"></section>
|
|
190
|
+
<section class="view" id="viewSense"></section>
|
|
191
|
+
<section class="view" id="viewMemory"></section>
|
|
142
192
|
</div>
|
|
143
193
|
</div>
|
|
144
194
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lisa-html.js","sourceRoot":"","sources":["../../src/web/lisa-html.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;EAavB,QAAQ
|
|
1
|
+
{"version":3,"file":"lisa-html.js","sourceRoot":"","sources":["../../src/web/lisa-html.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;EAavB,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiNR,cAAc;;eAED,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pairing helpers shared by the CLI (`lisa pair`), the web server's
|
|
3
|
+
* `/api/pair/start`, and (by mirroring) the Mac menu-bar app. Dependency-free so
|
|
4
|
+
* the always-loaded web server can reuse it without pulling in the CLI's
|
|
5
|
+
* `qrcode-terminal`. See docs/IOS_COMPANION_PLAN.md §5.3.
|
|
6
|
+
*/
|
|
7
|
+
import os from "node:os";
|
|
8
|
+
/**
|
|
9
|
+
* Rank a network interface by how likely a phone on the same Wi-Fi can reach it.
|
|
10
|
+
* Mirrors the Mac app's PairController.interfaceRank: real Ethernet/Wi-Fi (`en*`)
|
|
11
|
+
* beats unknowns, which beat VPN/virtual/Internet-Sharing, which beat Apple
|
|
12
|
+
* wireless-direct (`awdl`/`llw`, up but not LAN-routable).
|
|
13
|
+
*/
|
|
14
|
+
export declare function interfaceRank(name: string): number;
|
|
15
|
+
/**
|
|
16
|
+
* Best-guess LAN IPv4 for a phone to reach this Mac. Prefers `en*` interfaces and
|
|
17
|
+
* skips link-local (169.254). Among equal ranks the first interface wins (en0
|
|
18
|
+
* before en1), so a stable, reachable address surfaces. Pure (interfaces injected
|
|
19
|
+
* for tests).
|
|
20
|
+
*/
|
|
21
|
+
export declare function detectLanHost(ifaces?: NodeJS.Dict<os.NetworkInterfaceInfo[]>): string | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* True for a Tailscale IPv4 — the `100.64.0.0/10` CGNAT range Tailscale assigns
|
|
24
|
+
* (100.64.0.0 – 100.127.255.255). A phone that's ALSO on the tailnet can reach
|
|
25
|
+
* this address from anywhere (cellular, other Wi-Fi), unlike a LAN 192.168/10/172
|
|
26
|
+
* address that only works on the same Wi-Fi. Pure.
|
|
27
|
+
*/
|
|
28
|
+
export declare function isTailscaleIPv4(ip: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* The Mac's Tailscale IPv4, if Tailscale is up — a "reachable anywhere" pairing
|
|
31
|
+
* host (the phone must also be on the tailnet). Undefined if there's no tailnet
|
|
32
|
+
* address. Pure (interfaces injected for tests).
|
|
33
|
+
*/
|
|
34
|
+
export declare function detectTailscaleHost(ifaces?: NodeJS.Dict<os.NetworkInterfaceInfo[]>): string | undefined;
|
|
35
|
+
/** Build the `lisa-pair://` deep-link the phone scans/pastes. Pure. */
|
|
36
|
+
export declare function buildPairUrl(host: string, port: number, token: string, name: string): string;
|
|
37
|
+
//# sourceMappingURL=pairing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pairing.d.ts","sourceRoot":"","sources":["../../src/web/pairing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOlD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,MAAM,GAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAA0B,GACtE,MAAM,GAAG,SAAS,CAYpB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAInD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,GAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAA0B,GACtE,MAAM,GAAG,SAAS,CAOpB;AAED,uEAAuE;AACvE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAI5F"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pairing helpers shared by the CLI (`lisa pair`), the web server's
|
|
3
|
+
* `/api/pair/start`, and (by mirroring) the Mac menu-bar app. Dependency-free so
|
|
4
|
+
* the always-loaded web server can reuse it without pulling in the CLI's
|
|
5
|
+
* `qrcode-terminal`. See docs/IOS_COMPANION_PLAN.md §5.3.
|
|
6
|
+
*/
|
|
7
|
+
import os from "node:os";
|
|
8
|
+
/**
|
|
9
|
+
* Rank a network interface by how likely a phone on the same Wi-Fi can reach it.
|
|
10
|
+
* Mirrors the Mac app's PairController.interfaceRank: real Ethernet/Wi-Fi (`en*`)
|
|
11
|
+
* beats unknowns, which beat VPN/virtual/Internet-Sharing, which beat Apple
|
|
12
|
+
* wireless-direct (`awdl`/`llw`, up but not LAN-routable).
|
|
13
|
+
*/
|
|
14
|
+
export function interfaceRank(name) {
|
|
15
|
+
if (name.startsWith("awdl") || name.startsWith("llw"))
|
|
16
|
+
return 0; // not routable
|
|
17
|
+
for (const p of ["utun", "ipsec", "ppp", "bridge", "vmnet", "vnic", "tap", "tun"]) {
|
|
18
|
+
if (name.startsWith(p))
|
|
19
|
+
return 1; // VPN / virtualization / Internet Sharing
|
|
20
|
+
}
|
|
21
|
+
if (name.startsWith("en"))
|
|
22
|
+
return 3; // Ethernet / Wi-Fi — what we want
|
|
23
|
+
return 2; // unknown: beats VPN, loses to en*
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Best-guess LAN IPv4 for a phone to reach this Mac. Prefers `en*` interfaces and
|
|
27
|
+
* skips link-local (169.254). Among equal ranks the first interface wins (en0
|
|
28
|
+
* before en1), so a stable, reachable address surfaces. Pure (interfaces injected
|
|
29
|
+
* for tests).
|
|
30
|
+
*/
|
|
31
|
+
export function detectLanHost(ifaces = os.networkInterfaces()) {
|
|
32
|
+
let best;
|
|
33
|
+
for (const [name, addrs] of Object.entries(ifaces)) {
|
|
34
|
+
for (const a of addrs ?? []) {
|
|
35
|
+
if (a.family !== "IPv4" || a.internal)
|
|
36
|
+
continue;
|
|
37
|
+
if (a.address.startsWith("169.254"))
|
|
38
|
+
continue; // link-local
|
|
39
|
+
const rank = interfaceRank(name);
|
|
40
|
+
// Strictly-greater keeps the first interface at each rank as the tiebreak.
|
|
41
|
+
if (!best || rank > best.rank)
|
|
42
|
+
best = { rank, ip: a.address };
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return best?.ip;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* True for a Tailscale IPv4 — the `100.64.0.0/10` CGNAT range Tailscale assigns
|
|
49
|
+
* (100.64.0.0 – 100.127.255.255). A phone that's ALSO on the tailnet can reach
|
|
50
|
+
* this address from anywhere (cellular, other Wi-Fi), unlike a LAN 192.168/10/172
|
|
51
|
+
* address that only works on the same Wi-Fi. Pure.
|
|
52
|
+
*/
|
|
53
|
+
export function isTailscaleIPv4(ip) {
|
|
54
|
+
const m = /^(\d{1,3})\.(\d{1,3})\./.exec(ip.trim());
|
|
55
|
+
if (!m)
|
|
56
|
+
return false;
|
|
57
|
+
return Number(m[1]) === 100 && Number(m[2]) >= 64 && Number(m[2]) <= 127;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* The Mac's Tailscale IPv4, if Tailscale is up — a "reachable anywhere" pairing
|
|
61
|
+
* host (the phone must also be on the tailnet). Undefined if there's no tailnet
|
|
62
|
+
* address. Pure (interfaces injected for tests).
|
|
63
|
+
*/
|
|
64
|
+
export function detectTailscaleHost(ifaces = os.networkInterfaces()) {
|
|
65
|
+
for (const addrs of Object.values(ifaces)) {
|
|
66
|
+
for (const a of addrs ?? []) {
|
|
67
|
+
if (a.family === "IPv4" && !a.internal && isTailscaleIPv4(a.address))
|
|
68
|
+
return a.address;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
/** Build the `lisa-pair://` deep-link the phone scans/pastes. Pure. */
|
|
74
|
+
export function buildPairUrl(host, port, token, name) {
|
|
75
|
+
// %20 (not "+") for spaces so the device label round-trips through iOS URLComponents.
|
|
76
|
+
const q = new URLSearchParams({ host, port: String(port), token, name }).toString().replace(/\+/g, "%20");
|
|
77
|
+
return `lisa-pair://v1?${q}`;
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=pairing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pairing.js","sourceRoot":"","sources":["../../src/web/pairing.ts"],"names":[],"mappings":"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"}
|
package/dist/web/push.d.ts
CHANGED
|
@@ -5,6 +5,8 @@ export interface PushPrefs {
|
|
|
5
5
|
permission: boolean;
|
|
6
6
|
idle: boolean;
|
|
7
7
|
advisor: boolean;
|
|
8
|
+
/** Daily mail digest + important-mail alerts. */
|
|
9
|
+
mail: boolean;
|
|
8
10
|
}
|
|
9
11
|
export declare function defaultPushPrefs(): PushPrefs;
|
|
10
12
|
export declare function normalizePushPrefs(p: Partial<PushPrefs> | null | undefined): PushPrefs;
|
|
@@ -28,6 +30,20 @@ export declare function registerPush(input: {
|
|
|
28
30
|
export declare function unregisterPush(idOrTarget: string): boolean;
|
|
29
31
|
export declare function listPush(): PushSubscription[];
|
|
30
32
|
export declare function setPushPrefs(id: string, prefs: Partial<PushPrefs>): PushSubscription | null;
|
|
33
|
+
export interface LiveActivityReg {
|
|
34
|
+
sessionId: string;
|
|
35
|
+
/** The ActivityKit push token (hex) for this session's Live Activity. */
|
|
36
|
+
token: string;
|
|
37
|
+
createdAt: number;
|
|
38
|
+
}
|
|
39
|
+
export declare function listLiveActivities(): LiveActivityReg[];
|
|
40
|
+
export declare function registerLiveActivity(sessionId: string, token: string, now?: number): void;
|
|
41
|
+
export declare function unregisterLiveActivity(sessionId: string): boolean;
|
|
42
|
+
/** Custom URL scheme Lisa Pocket registers for push / widget deep-links. */
|
|
43
|
+
export declare const POCKET_SCHEME = "lisapocket";
|
|
44
|
+
/** Deep-link that opens Lisa Pocket at a specific roster session. Pure. The app
|
|
45
|
+
* routes on host="session" + the agent/id query (Lisa Pocket's URL handler). */
|
|
46
|
+
export declare function agentDeepLink(agent: string, sessionId: string): string;
|
|
31
47
|
export interface PushEvent {
|
|
32
48
|
pref: keyof PushPrefs;
|
|
33
49
|
title: string;
|
|
@@ -35,6 +51,8 @@ export interface PushEvent {
|
|
|
35
51
|
priority: "high" | "default";
|
|
36
52
|
/** Throttle/dedup tag within a session. */
|
|
37
53
|
tag: string;
|
|
54
|
+
/** Optional deep-link opened when the notification is tapped (ntfy `Click`). */
|
|
55
|
+
click?: string;
|
|
38
56
|
}
|
|
39
57
|
/** Which notifications a session's prev→next transition warrants. Pure. */
|
|
40
58
|
export declare function agentPushEvents(prev: AgentSession | undefined, next: AgentSession): PushEvent[];
|
|
@@ -49,11 +67,68 @@ export declare function sendNtfy(server: string, topic: string, ev: {
|
|
|
49
67
|
title: string;
|
|
50
68
|
body: string;
|
|
51
69
|
priority: "high" | "default";
|
|
70
|
+
click?: string;
|
|
52
71
|
}, fetchImpl?: FetchLike): Promise<boolean>;
|
|
72
|
+
export interface ApnsConfig {
|
|
73
|
+
keyId: string;
|
|
74
|
+
teamId: string;
|
|
75
|
+
/** The .p8 auth-key contents (PEM). */
|
|
76
|
+
key: string;
|
|
77
|
+
/** Bundle id, e.g. ai.meetlisa.main. */
|
|
78
|
+
topic: string;
|
|
79
|
+
/** api.push.apple.com (prod) or api.sandbox.push.apple.com (dev). */
|
|
80
|
+
host: string;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* APNs config from env, or null (→ stub). LISA_APNS_KEY is the .p8 contents (PEM)
|
|
84
|
+
* or a path to it; LISA_APNS_ENV=production switches to the prod host.
|
|
85
|
+
*/
|
|
86
|
+
export declare function apnsConfigFromEnv(env?: NodeJS.ProcessEnv): ApnsConfig | null;
|
|
87
|
+
/** Build a signed ES256 provider JWT for APNs. Pure given (cfg, nowSec). */
|
|
88
|
+
export declare function buildApnsJwt(cfg: Pick<ApnsConfig, "keyId" | "teamId" | "key">, nowSec: number): string;
|
|
89
|
+
/** Build the APNs JSON payload from a push event. Pure. */
|
|
90
|
+
export declare function buildApnsPayload(ev: {
|
|
91
|
+
title: string;
|
|
92
|
+
body: string;
|
|
93
|
+
click?: string;
|
|
94
|
+
}): Record<string, unknown>;
|
|
95
|
+
export type ApnsPoster = (o: {
|
|
96
|
+
host: string;
|
|
97
|
+
path: string;
|
|
98
|
+
headers: Record<string, string>;
|
|
99
|
+
body: string;
|
|
100
|
+
}) => Promise<{
|
|
101
|
+
status: number;
|
|
102
|
+
}>;
|
|
103
|
+
/** Send one APNs notification. The provider JWT is cached ~50min (Apple rate-
|
|
104
|
+
* limits regeneration). `post` is injectable for tests. */
|
|
105
|
+
export declare function sendApns(cfg: ApnsConfig, deviceToken: string, ev: {
|
|
106
|
+
title: string;
|
|
107
|
+
body: string;
|
|
108
|
+
priority: "high" | "default";
|
|
109
|
+
click?: string;
|
|
110
|
+
}, post?: ApnsPoster, nowSec?: number): Promise<boolean>;
|
|
111
|
+
export interface LiveActivityState {
|
|
112
|
+
state: string;
|
|
113
|
+
detail: string;
|
|
114
|
+
turns: number;
|
|
115
|
+
}
|
|
116
|
+
/** Content-state for a session's Live Activity — mirrors the app's
|
|
117
|
+
* AgentActivityAttributes.ContentState + its detail() logic. Pure. */
|
|
118
|
+
export declare function liveActivityState(s: AgentSession): LiveActivityState;
|
|
119
|
+
/** APNs Live Activity payload — `event:"update"` refreshes, `"end"` dismisses. Pure. */
|
|
120
|
+
export declare function buildLiveActivityPayload(cs: LiveActivityState, event: "update" | "end", nowSec: number): Record<string, unknown>;
|
|
121
|
+
/** Push a Live Activity update/end over APNs (push-type liveactivity). `post`
|
|
122
|
+
* injectable for tests. Reuses the cached provider JWT. */
|
|
123
|
+
export declare function sendLiveActivityUpdate(cfg: ApnsConfig, laToken: string, cs: LiveActivityState, event: "update" | "end", post?: ApnsPoster, nowSec?: number): Promise<boolean>;
|
|
53
124
|
export interface PushBridgeOpts {
|
|
54
125
|
subs?: () => PushSubscription[];
|
|
55
126
|
/** Injected delivery (tests). Default: real ntfy / apns-stub. */
|
|
56
127
|
deliver?: (sub: PushSubscription, ev: PushEvent) => void | Promise<void>;
|
|
128
|
+
/** Registered Live Activity tokens (tests). Default: the on-disk store. */
|
|
129
|
+
liveActivities?: () => LiveActivityReg[];
|
|
130
|
+
/** Injected Live Activity delivery (tests). Default: real APNs liveactivity. */
|
|
131
|
+
liveDeliver?: (token: string, cs: LiveActivityState, event: "update" | "end") => void | Promise<void>;
|
|
57
132
|
now?: () => number;
|
|
58
133
|
log?: (m: string) => void;
|
|
59
134
|
throttleMs?: number;
|
|
@@ -63,14 +138,30 @@ export declare class PushBridge {
|
|
|
63
138
|
private readonly lastSent;
|
|
64
139
|
private readonly subs;
|
|
65
140
|
private readonly deliverFn;
|
|
141
|
+
private readonly liveActivities;
|
|
142
|
+
private readonly liveDeliverFn;
|
|
66
143
|
private readonly now;
|
|
67
144
|
private readonly log;
|
|
68
145
|
private readonly throttleMs;
|
|
146
|
+
private readonly liveThrottleMs;
|
|
69
147
|
constructor(opts?: PushBridgeOpts);
|
|
70
148
|
onAgentUpdate(next: AgentSession): void;
|
|
149
|
+
/** Refresh a pinned session's Live Activity (throttled), ending it on a
|
|
150
|
+
* terminal state. No-op unless an LA token is registered for the session. */
|
|
151
|
+
private updateLiveActivity;
|
|
71
152
|
onIdleMessage(text: string): void;
|
|
153
|
+
/** Daily mail digest push (default priority). */
|
|
154
|
+
onMailDigest(text: string, click?: string): void;
|
|
155
|
+
/** Important-mail alert (high priority); `tag` dedups per message. */
|
|
156
|
+
onMailImportant(ev: {
|
|
157
|
+
title: string;
|
|
158
|
+
body: string;
|
|
159
|
+
click?: string;
|
|
160
|
+
tag: string;
|
|
161
|
+
}): void;
|
|
72
162
|
private fire;
|
|
73
163
|
private defaultDeliver;
|
|
164
|
+
private defaultLiveDeliver;
|
|
74
165
|
}
|
|
75
166
|
export {};
|
|
76
167
|
//# 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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"}
|