@oratis/lisa 0.11.1 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/dist/agent.d.ts +2 -0
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +20 -1
  4. package/dist/agent.js.map +1 -1
  5. package/dist/agents/pty.d.ts.map +1 -1
  6. package/dist/agents/pty.js +13 -2
  7. package/dist/agents/pty.js.map +1 -1
  8. package/dist/autonomy/state.d.ts +14 -0
  9. package/dist/autonomy/state.d.ts.map +1 -0
  10. package/dist/autonomy/state.js +54 -0
  11. package/dist/autonomy/state.js.map +1 -0
  12. package/dist/cli/mail.d.ts +2 -0
  13. package/dist/cli/mail.d.ts.map +1 -0
  14. package/dist/cli/mail.js +209 -0
  15. package/dist/cli/mail.js.map +1 -0
  16. package/dist/cli/pair.d.ts +15 -0
  17. package/dist/cli/pair.d.ts.map +1 -0
  18. package/dist/cli/pair.js +152 -0
  19. package/dist/cli/pair.js.map +1 -0
  20. package/dist/cli.js +22 -14
  21. package/dist/cli.js.map +1 -1
  22. package/dist/consent/store.d.ts +2 -2
  23. package/dist/consent/store.d.ts.map +1 -1
  24. package/dist/consent/store.js +3 -2
  25. package/dist/consent/store.js.map +1 -1
  26. package/dist/edition.d.ts +24 -0
  27. package/dist/edition.d.ts.map +1 -0
  28. package/dist/edition.js +19 -0
  29. package/dist/edition.js.map +1 -0
  30. package/dist/heartbeat/runner.d.ts.map +1 -1
  31. package/dist/heartbeat/runner.js +8 -0
  32. package/dist/heartbeat/runner.js.map +1 -1
  33. package/dist/idle/runner.d.ts.map +1 -1
  34. package/dist/idle/runner.js +7 -0
  35. package/dist/idle/runner.js.map +1 -1
  36. package/dist/mail/accounts.d.ts +20 -0
  37. package/dist/mail/accounts.d.ts.map +1 -0
  38. package/dist/mail/accounts.js +113 -0
  39. package/dist/mail/accounts.js.map +1 -0
  40. package/dist/mail/alerts.d.ts +29 -0
  41. package/dist/mail/alerts.d.ts.map +1 -0
  42. package/dist/mail/alerts.js +40 -0
  43. package/dist/mail/alerts.js.map +1 -0
  44. package/dist/mail/classify.d.ts +26 -0
  45. package/dist/mail/classify.d.ts.map +1 -0
  46. package/dist/mail/classify.js +191 -0
  47. package/dist/mail/classify.js.map +1 -0
  48. package/dist/mail/connectors/gmail.d.ts +55 -0
  49. package/dist/mail/connectors/gmail.d.ts.map +1 -0
  50. package/dist/mail/connectors/gmail.js +87 -0
  51. package/dist/mail/connectors/gmail.js.map +1 -0
  52. package/dist/mail/connectors/imap.d.ts +13 -0
  53. package/dist/mail/connectors/imap.d.ts.map +1 -0
  54. package/dist/mail/connectors/imap.js +136 -0
  55. package/dist/mail/connectors/imap.js.map +1 -0
  56. package/dist/mail/digest.d.ts +21 -0
  57. package/dist/mail/digest.d.ts.map +1 -0
  58. package/dist/mail/digest.js +89 -0
  59. package/dist/mail/digest.js.map +1 -0
  60. package/dist/mail/google-oauth.d.ts +50 -0
  61. package/dist/mail/google-oauth.d.ts.map +1 -0
  62. package/dist/mail/google-oauth.js +74 -0
  63. package/dist/mail/google-oauth.js.map +1 -0
  64. package/dist/mail/hosts.d.ts +3 -0
  65. package/dist/mail/hosts.d.ts.map +1 -0
  66. package/dist/mail/hosts.js +19 -0
  67. package/dist/mail/hosts.js.map +1 -0
  68. package/dist/mail/scheduler.d.ts +9 -0
  69. package/dist/mail/scheduler.d.ts.map +1 -0
  70. package/dist/mail/scheduler.js +21 -0
  71. package/dist/mail/scheduler.js.map +1 -0
  72. package/dist/mail/service.d.ts +32 -0
  73. package/dist/mail/service.d.ts.map +1 -0
  74. package/dist/mail/service.js +129 -0
  75. package/dist/mail/service.js.map +1 -0
  76. package/dist/mail/store.d.ts +7 -0
  77. package/dist/mail/store.d.ts.map +1 -0
  78. package/dist/mail/store.js +58 -0
  79. package/dist/mail/store.js.map +1 -0
  80. package/dist/mail/types.d.ts +114 -0
  81. package/dist/mail/types.d.ts.map +1 -0
  82. package/dist/mail/types.js +26 -0
  83. package/dist/mail/types.js.map +1 -0
  84. package/dist/providers/anthropic.d.ts.map +1 -1
  85. package/dist/providers/anthropic.js +43 -21
  86. package/dist/providers/anthropic.js.map +1 -1
  87. package/dist/providers/gemini.d.ts.map +1 -1
  88. package/dist/providers/gemini.js +67 -64
  89. package/dist/providers/gemini.js.map +1 -1
  90. package/dist/providers/openai.d.ts.map +1 -1
  91. package/dist/providers/openai.js +77 -71
  92. package/dist/providers/openai.js.map +1 -1
  93. package/dist/providers/registry.d.ts +10 -0
  94. package/dist/providers/registry.d.ts.map +1 -1
  95. package/dist/providers/registry.js +26 -0
  96. package/dist/providers/registry.js.map +1 -1
  97. package/dist/providers/stream-retry.d.ts +37 -0
  98. package/dist/providers/stream-retry.d.ts.map +1 -0
  99. package/dist/providers/stream-retry.js +92 -0
  100. package/dist/providers/stream-retry.js.map +1 -0
  101. package/dist/providers/types.d.ts +3 -0
  102. package/dist/providers/types.d.ts.map +1 -1
  103. package/dist/subagent.d.ts +2 -0
  104. package/dist/subagent.d.ts.map +1 -1
  105. package/dist/subagent.js +1 -0
  106. package/dist/subagent.js.map +1 -1
  107. package/dist/web/cloudAuth.d.ts +57 -0
  108. package/dist/web/cloudAuth.d.ts.map +1 -0
  109. package/dist/web/cloudAuth.js +139 -0
  110. package/dist/web/cloudAuth.js.map +1 -0
  111. package/dist/web/island.d.ts.map +1 -1
  112. package/dist/web/island.js +1 -0
  113. package/dist/web/island.js.map +1 -1
  114. package/dist/web/lisa-client.d.ts +1 -1
  115. package/dist/web/lisa-client.d.ts.map +1 -1
  116. package/dist/web/lisa-client.js +703 -40
  117. package/dist/web/lisa-client.js.map +1 -1
  118. package/dist/web/lisa-css.d.ts +1 -1
  119. package/dist/web/lisa-css.d.ts.map +1 -1
  120. package/dist/web/lisa-css.js +568 -43
  121. package/dist/web/lisa-css.js.map +1 -1
  122. package/dist/web/lisa-html.d.ts +1 -1
  123. package/dist/web/lisa-html.d.ts.map +1 -1
  124. package/dist/web/lisa-html.js +71 -21
  125. package/dist/web/lisa-html.js.map +1 -1
  126. package/dist/web/pairing.d.ts +37 -0
  127. package/dist/web/pairing.d.ts.map +1 -0
  128. package/dist/web/pairing.js +79 -0
  129. package/dist/web/pairing.js.map +1 -0
  130. package/dist/web/push.d.ts +91 -0
  131. package/dist/web/push.d.ts.map +1 -1
  132. package/dist/web/push.js +250 -9
  133. package/dist/web/push.js.map +1 -1
  134. package/dist/web/qr-svg.d.ts +11 -0
  135. package/dist/web/qr-svg.d.ts.map +1 -0
  136. package/dist/web/qr-svg.js +41 -0
  137. package/dist/web/qr-svg.js.map +1 -0
  138. package/dist/web/server.d.ts +1 -1
  139. package/dist/web/server.d.ts.map +1 -1
  140. package/dist/web/server.js +378 -14
  141. package/dist/web/server.js.map +1 -1
  142. package/package.json +4 -1
@@ -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,++kGA8KP,CAAC"}
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"}
@@ -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
- <form id="sbDelegate" class="delegate" autocomplete="off">
82
- <select id="sbDelegateKind" title="Agent type — managed (LISA-run) or a real CLI under a PTY (spike)">
83
- <option value="managed">managed</option>
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 / SKILLS / MEMORY / TOOLS row -->
104
- <div class="badges">
105
- <button class="badge" type="button" data-panel="soul"><img src="/assets/icon-soul.png" alt="">SOUL</button>
106
- <button class="badge" type="button" data-panel="skills"><img src="/assets/icon-skill.png" alt="">SKILLS</button>
107
- <button class="badge" type="button" data-panel="memory"><img src="/assets/icon-memory.png" alt="">MEMORY</button>
108
- <button class="badge" type="button" data-panel="tools"><img src="/assets/icon-tool.png" alt="">TOOLS</button>
109
- <button class="badge" type="button" data-panel="plans"><img src="/assets/icon-tool.png" alt="">PLANS</button>
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
- <label id="attachBtn" title="Attach file (or paste images directly into the textarea)">
131
- <input type="file" id="fileInput" accept="image/*,.pdf,.txt,.md,.csv,.json" multiple>
132
- 📎
133
- </label>
134
- <button type="button" id="captureBtn" title="Screenshot for Lisa (⌃⌥S anywhere)">📷</button>
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+JR,cAAc;;eAED,CAAC"}
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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"}
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/web/push.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../src/web/push.ts"],"names":[],"mappings":"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"}