@oratis/lisa 0.9.0 → 0.11.1

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 (296) hide show
  1. package/README.md +123 -16
  2. package/README.zh-CN.md +101 -15
  3. package/completions/_lisa +56 -0
  4. package/completions/lisa.bash +35 -1
  5. package/completions/lisa.fish +18 -1
  6. package/dist/advisor/engine.d.ts +7 -0
  7. package/dist/advisor/engine.d.ts.map +1 -1
  8. package/dist/advisor/engine.js +12 -0
  9. package/dist/advisor/engine.js.map +1 -1
  10. package/dist/agent.d.ts +14 -0
  11. package/dist/agent.d.ts.map +1 -1
  12. package/dist/agent.js +58 -7
  13. package/dist/agent.js.map +1 -1
  14. package/dist/agents/managed.d.ts +108 -0
  15. package/dist/agents/managed.d.ts.map +1 -0
  16. package/dist/agents/managed.js +241 -0
  17. package/dist/agents/managed.js.map +1 -0
  18. package/dist/agents/pty.d.ts +155 -0
  19. package/dist/agents/pty.d.ts.map +1 -0
  20. package/dist/agents/pty.js +299 -0
  21. package/dist/agents/pty.js.map +1 -0
  22. package/dist/approval.d.ts +13 -0
  23. package/dist/approval.d.ts.map +1 -1
  24. package/dist/approval.js +25 -2
  25. package/dist/approval.js.map +1 -1
  26. package/dist/autonomy/runs.d.ts +33 -0
  27. package/dist/autonomy/runs.d.ts.map +1 -0
  28. package/dist/autonomy/runs.js +106 -0
  29. package/dist/autonomy/runs.js.map +1 -0
  30. package/dist/channels/feishu.d.ts.map +1 -1
  31. package/dist/channels/feishu.js +65 -0
  32. package/dist/channels/feishu.js.map +1 -1
  33. package/dist/channels/router.d.ts +7 -0
  34. package/dist/channels/router.d.ts.map +1 -1
  35. package/dist/channels/router.js +1 -1
  36. package/dist/channels/router.js.map +1 -1
  37. package/dist/cli/agents-pty.d.ts +18 -0
  38. package/dist/cli/agents-pty.d.ts.map +1 -0
  39. package/dist/cli/agents-pty.js +182 -0
  40. package/dist/cli/agents-pty.js.map +1 -0
  41. package/dist/cli/agents.d.ts +2 -0
  42. package/dist/cli/agents.d.ts.map +1 -0
  43. package/dist/cli/agents.js +65 -0
  44. package/dist/cli/agents.js.map +1 -0
  45. package/dist/cli/consent.d.ts +2 -0
  46. package/dist/cli/consent.d.ts.map +1 -0
  47. package/dist/cli/consent.js +57 -0
  48. package/dist/cli/consent.js.map +1 -0
  49. package/dist/cli/model.d.ts +2 -0
  50. package/dist/cli/model.d.ts.map +1 -0
  51. package/dist/cli/model.js +121 -0
  52. package/dist/cli/model.js.map +1 -0
  53. package/dist/cli/sense.d.ts +2 -0
  54. package/dist/cli/sense.d.ts.map +1 -0
  55. package/dist/cli/sense.js +36 -0
  56. package/dist/cli/sense.js.map +1 -0
  57. package/dist/cli.js +117 -12
  58. package/dist/cli.js.map +1 -1
  59. package/dist/consent/blacklist.d.ts +28 -0
  60. package/dist/consent/blacklist.d.ts.map +1 -0
  61. package/dist/consent/blacklist.js +78 -0
  62. package/dist/consent/blacklist.js.map +1 -0
  63. package/dist/consent/store.d.ts +45 -0
  64. package/dist/consent/store.d.ts.map +1 -0
  65. package/dist/consent/store.js +126 -0
  66. package/dist/consent/store.js.map +1 -0
  67. package/dist/control/policy.d.ts +13 -0
  68. package/dist/control/policy.d.ts.map +1 -0
  69. package/dist/control/policy.js +57 -0
  70. package/dist/control/policy.js.map +1 -0
  71. package/dist/heartbeat/runner.d.ts.map +1 -1
  72. package/dist/heartbeat/runner.js +70 -14
  73. package/dist/heartbeat/runner.js.map +1 -1
  74. package/dist/idle/runner.d.ts.map +1 -1
  75. package/dist/idle/runner.js +87 -17
  76. package/dist/idle/runner.js.map +1 -1
  77. package/dist/integrations/aider/observer.d.ts +21 -1
  78. package/dist/integrations/aider/observer.d.ts.map +1 -1
  79. package/dist/integrations/aider/observer.js +110 -1
  80. package/dist/integrations/aider/observer.js.map +1 -1
  81. package/dist/integrations/claude-code/liveness.d.ts +10 -0
  82. package/dist/integrations/claude-code/liveness.d.ts.map +1 -0
  83. package/dist/integrations/claude-code/liveness.js +62 -0
  84. package/dist/integrations/claude-code/liveness.js.map +1 -0
  85. package/dist/integrations/claude-code/watcher.d.ts +39 -4
  86. package/dist/integrations/claude-code/watcher.d.ts.map +1 -1
  87. package/dist/integrations/claude-code/watcher.js +94 -57
  88. package/dist/integrations/claude-code/watcher.js.map +1 -1
  89. package/dist/integrations/codex/observer.d.ts +19 -6
  90. package/dist/integrations/codex/observer.d.ts.map +1 -1
  91. package/dist/integrations/codex/observer.js +228 -4
  92. package/dist/integrations/codex/observer.js.map +1 -1
  93. package/dist/integrations/dispatch-ledger.d.ts +30 -1
  94. package/dist/integrations/dispatch-ledger.d.ts.map +1 -1
  95. package/dist/integrations/dispatch-ledger.js +75 -9
  96. package/dist/integrations/dispatch-ledger.js.map +1 -1
  97. package/dist/integrations/git/branch.d.ts +11 -0
  98. package/dist/integrations/git/branch.d.ts.map +1 -0
  99. package/dist/integrations/git/branch.js +49 -0
  100. package/dist/integrations/git/branch.js.map +1 -0
  101. package/dist/integrations/git/observer.d.ts +39 -0
  102. package/dist/integrations/git/observer.d.ts.map +1 -0
  103. package/dist/integrations/git/observer.js +252 -0
  104. package/dist/integrations/git/observer.js.map +1 -0
  105. package/dist/integrations/github-pr/observer.d.ts.map +1 -1
  106. package/dist/integrations/github-pr/observer.js +7 -2
  107. package/dist/integrations/github-pr/observer.js.map +1 -1
  108. package/dist/integrations/hub.d.ts +8 -0
  109. package/dist/integrations/hub.d.ts.map +1 -1
  110. package/dist/integrations/hub.js +39 -1
  111. package/dist/integrations/hub.js.map +1 -1
  112. package/dist/integrations/managed/observer.d.ts +17 -0
  113. package/dist/integrations/managed/observer.d.ts.map +1 -0
  114. package/dist/integrations/managed/observer.js +46 -0
  115. package/dist/integrations/managed/observer.js.map +1 -0
  116. package/dist/integrations/opencode/observer.d.ts +53 -5
  117. package/dist/integrations/opencode/observer.d.ts.map +1 -1
  118. package/dist/integrations/opencode/observer.js +242 -20
  119. package/dist/integrations/opencode/observer.js.map +1 -1
  120. package/dist/integrations/pty/observer.d.ts +25 -0
  121. package/dist/integrations/pty/observer.d.ts.map +1 -0
  122. package/dist/integrations/pty/observer.js +48 -0
  123. package/dist/integrations/pty/observer.js.map +1 -0
  124. package/dist/integrations/registry.d.ts.map +1 -1
  125. package/dist/integrations/registry.js +5 -0
  126. package/dist/integrations/registry.js.map +1 -1
  127. package/dist/integrations/shell/observer.d.ts +33 -0
  128. package/dist/integrations/shell/observer.d.ts.map +1 -0
  129. package/dist/integrations/shell/observer.js +223 -0
  130. package/dist/integrations/shell/observer.js.map +1 -0
  131. package/dist/integrations/takoapi/a2a.d.ts +38 -0
  132. package/dist/integrations/takoapi/a2a.d.ts.map +1 -0
  133. package/dist/integrations/takoapi/a2a.js +70 -0
  134. package/dist/integrations/takoapi/a2a.js.map +1 -0
  135. package/dist/integrations/takoapi/ledger.d.ts +32 -0
  136. package/dist/integrations/takoapi/ledger.d.ts.map +1 -0
  137. package/dist/integrations/takoapi/ledger.js +96 -0
  138. package/dist/integrations/takoapi/ledger.js.map +1 -0
  139. package/dist/integrations/takoapi/observer.d.ts +39 -0
  140. package/dist/integrations/takoapi/observer.d.ts.map +1 -0
  141. package/dist/integrations/takoapi/observer.js +102 -0
  142. package/dist/integrations/takoapi/observer.js.map +1 -0
  143. package/dist/integrations/types.d.ts +17 -0
  144. package/dist/integrations/types.d.ts.map +1 -1
  145. package/dist/mcp/client.d.ts +5 -0
  146. package/dist/mcp/client.d.ts.map +1 -1
  147. package/dist/mcp/client.js +1 -1
  148. package/dist/mcp/client.js.map +1 -1
  149. package/dist/memory/embedding.d.ts +45 -0
  150. package/dist/memory/embedding.d.ts.map +1 -0
  151. package/dist/memory/embedding.js +139 -0
  152. package/dist/memory/embedding.js.map +1 -0
  153. package/dist/memory/search_tool.d.ts.map +1 -1
  154. package/dist/memory/search_tool.js +6 -2
  155. package/dist/memory/search_tool.js.map +1 -1
  156. package/dist/memory/vector.d.ts +14 -3
  157. package/dist/memory/vector.d.ts.map +1 -1
  158. package/dist/memory/vector.js +50 -0
  159. package/dist/memory/vector.js.map +1 -1
  160. package/dist/model/local.d.ts +43 -0
  161. package/dist/model/local.d.ts.map +1 -0
  162. package/dist/model/local.js +118 -0
  163. package/dist/model/local.js.map +1 -0
  164. package/dist/model/plan-usage.d.ts +41 -0
  165. package/dist/model/plan-usage.d.ts.map +1 -0
  166. package/dist/model/plan-usage.js +168 -0
  167. package/dist/model/plan-usage.js.map +1 -0
  168. package/dist/model/plans.d.ts +73 -0
  169. package/dist/model/plans.d.ts.map +1 -0
  170. package/dist/model/plans.js +246 -0
  171. package/dist/model/plans.js.map +1 -0
  172. package/dist/orchestrator/recent-recap.d.ts +2 -0
  173. package/dist/orchestrator/recent-recap.d.ts.map +1 -0
  174. package/dist/orchestrator/recent-recap.js +20 -0
  175. package/dist/orchestrator/recent-recap.js.map +1 -0
  176. package/dist/providers/anthropic.d.ts +1 -0
  177. package/dist/providers/anthropic.d.ts.map +1 -1
  178. package/dist/providers/anthropic.js +10 -2
  179. package/dist/providers/anthropic.js.map +1 -1
  180. package/dist/providers/fallback.d.ts +23 -0
  181. package/dist/providers/fallback.d.ts.map +1 -0
  182. package/dist/providers/fallback.js +29 -0
  183. package/dist/providers/fallback.js.map +1 -0
  184. package/dist/providers/gemini.d.ts +2 -0
  185. package/dist/providers/gemini.d.ts.map +1 -1
  186. package/dist/providers/gemini.js +24 -10
  187. package/dist/providers/gemini.js.map +1 -1
  188. package/dist/providers/openai.d.ts.map +1 -1
  189. package/dist/providers/openai.js +4 -1
  190. package/dist/providers/openai.js.map +1 -1
  191. package/dist/providers/registry.d.ts +18 -2
  192. package/dist/providers/registry.d.ts.map +1 -1
  193. package/dist/providers/registry.js +56 -9
  194. package/dist/providers/registry.js.map +1 -1
  195. package/dist/reflect.d.ts +55 -0
  196. package/dist/reflect.d.ts.map +1 -1
  197. package/dist/reflect.js +148 -54
  198. package/dist/reflect.js.map +1 -1
  199. package/dist/sense/log.d.ts +9 -0
  200. package/dist/sense/log.d.ts.map +1 -0
  201. package/dist/sense/log.js +63 -0
  202. package/dist/sense/log.js.map +1 -0
  203. package/dist/sense/screen.d.ts +43 -0
  204. package/dist/sense/screen.d.ts.map +1 -0
  205. package/dist/sense/screen.js +107 -0
  206. package/dist/sense/screen.js.map +1 -0
  207. package/dist/sense/service.d.ts +16 -0
  208. package/dist/sense/service.d.ts.map +1 -0
  209. package/dist/sense/service.js +33 -0
  210. package/dist/sense/service.js.map +1 -0
  211. package/dist/sense/types.d.ts +35 -0
  212. package/dist/sense/types.d.ts.map +1 -0
  213. package/dist/sense/types.js +11 -0
  214. package/dist/sense/types.js.map +1 -0
  215. package/dist/sense/voice.d.ts +28 -0
  216. package/dist/sense/voice.d.ts.map +1 -0
  217. package/dist/sense/voice.js +64 -0
  218. package/dist/sense/voice.js.map +1 -0
  219. package/dist/soul/git.d.ts.map +1 -1
  220. package/dist/soul/git.js +35 -16
  221. package/dist/soul/git.js.map +1 -1
  222. package/dist/soul/store.d.ts +22 -0
  223. package/dist/soul/store.d.ts.map +1 -1
  224. package/dist/soul/store.js +69 -14
  225. package/dist/soul/store.js.map +1 -1
  226. package/dist/soul/summary.d.ts +10 -0
  227. package/dist/soul/summary.d.ts.map +1 -0
  228. package/dist/soul/summary.js +57 -0
  229. package/dist/soul/summary.js.map +1 -0
  230. package/dist/soul/tools.d.ts.map +1 -1
  231. package/dist/soul/tools.js +13 -24
  232. package/dist/soul/tools.js.map +1 -1
  233. package/dist/soul/types.d.ts +9 -0
  234. package/dist/soul/types.d.ts.map +1 -1
  235. package/dist/soul/types.js.map +1 -1
  236. package/dist/subagent.d.ts +7 -0
  237. package/dist/subagent.d.ts.map +1 -1
  238. package/dist/subagent.js +3 -1
  239. package/dist/subagent.js.map +1 -1
  240. package/dist/tools/dispatch_agent.d.ts +13 -1
  241. package/dist/tools/dispatch_agent.d.ts.map +1 -1
  242. package/dist/tools/dispatch_agent.js +56 -12
  243. package/dist/tools/dispatch_agent.js.map +1 -1
  244. package/dist/tools/dispatch_status.d.ts +22 -0
  245. package/dist/tools/dispatch_status.d.ts.map +1 -0
  246. package/dist/tools/dispatch_status.js +57 -0
  247. package/dist/tools/dispatch_status.js.map +1 -0
  248. package/dist/tools/registry.d.ts +29 -0
  249. package/dist/tools/registry.d.ts.map +1 -1
  250. package/dist/tools/registry.js +67 -0
  251. package/dist/tools/registry.js.map +1 -1
  252. package/dist/tools/run_on_plan.d.ts +46 -0
  253. package/dist/tools/run_on_plan.d.ts.map +1 -0
  254. package/dist/tools/run_on_plan.js +89 -0
  255. package/dist/tools/run_on_plan.js.map +1 -0
  256. package/dist/tools/takoapi.d.ts +60 -0
  257. package/dist/tools/takoapi.d.ts.map +1 -0
  258. package/dist/tools/takoapi.js +181 -0
  259. package/dist/tools/takoapi.js.map +1 -0
  260. package/dist/tools/validate.d.ts +22 -0
  261. package/dist/tools/validate.d.ts.map +1 -0
  262. package/dist/tools/validate.js +50 -0
  263. package/dist/tools/validate.js.map +1 -0
  264. package/dist/web/agent-roster.d.ts +56 -0
  265. package/dist/web/agent-roster.d.ts.map +1 -0
  266. package/dist/web/agent-roster.js +109 -0
  267. package/dist/web/agent-roster.js.map +1 -0
  268. package/dist/web/devices.d.ts +27 -0
  269. package/dist/web/devices.d.ts.map +1 -0
  270. package/dist/web/devices.js +113 -0
  271. package/dist/web/devices.js.map +1 -0
  272. package/dist/web/island.d.ts +5 -1
  273. package/dist/web/island.d.ts.map +1 -1
  274. package/dist/web/island.js +410 -63
  275. package/dist/web/island.js.map +1 -1
  276. package/dist/web/lisa-client.d.ts +20 -0
  277. package/dist/web/lisa-client.d.ts.map +1 -0
  278. package/dist/web/lisa-client.js +1358 -0
  279. package/dist/web/lisa-client.js.map +1 -0
  280. package/dist/web/lisa-css.d.ts +13 -0
  281. package/dist/web/lisa-css.d.ts.map +1 -0
  282. package/dist/web/lisa-css.js +1163 -0
  283. package/dist/web/lisa-css.js.map +1 -0
  284. package/dist/web/lisa-html.d.ts +1 -1
  285. package/dist/web/lisa-html.d.ts.map +1 -1
  286. package/dist/web/lisa-html.js +15 -2136
  287. package/dist/web/lisa-html.js.map +1 -1
  288. package/dist/web/push.d.ts +76 -0
  289. package/dist/web/push.d.ts.map +1 -0
  290. package/dist/web/push.js +163 -0
  291. package/dist/web/push.js.map +1 -0
  292. package/dist/web/server.d.ts +19 -0
  293. package/dist/web/server.d.ts.map +1 -1
  294. package/dist/web/server.js +878 -64
  295. package/dist/web/server.js.map +1 -1
  296. package/package.json +5 -2
@@ -0,0 +1,1163 @@
1
+ /**
2
+ * Inline <style> CSS for the Lisa chat shell (MAIN_HTML).
3
+ *
4
+ * Extracted verbatim from lisa-html.ts so the big stylesheet can be
5
+ * maintained on its own. lisa-html.ts re-embeds this between its
6
+ * <style> tags as `<style>\n${MAIN_CSS}\n</style>` — the byte-for-byte
7
+ * concatenation is asserted by lisa-html-snapshot.test.ts.
8
+ *
9
+ * No interpolation or backticks appear in the original CSS text, so it is
10
+ * a plain template literal with no ${} placeholders.
11
+ */
12
+ export const MAIN_CSS = ` :root {
13
+ color-scheme: dark;
14
+
15
+ /* New design tokens (mockup) */
16
+ --accent: #6ad4ff;
17
+ --accent-soft: rgba(106, 212, 255, 0.13);
18
+ --accent-glow: rgba(106, 212, 255, 0.27);
19
+ --warm: #ffd066;
20
+ --dream: #b487ff;
21
+ --claude: #ff8c42;
22
+ --err-color: #ff5577;
23
+
24
+ --bg-deep: #07091a;
25
+ --bg-1: #0b1024;
26
+ --bg-2: #11163a;
27
+ --bg-3: #1a1f4a;
28
+ --bg-card: rgba(20, 26, 64, 0.65);
29
+ --bg-card-strong: rgba(20, 26, 64, 0.88);
30
+ --border-new: rgba(255, 255, 255, 0.07);
31
+ --border-strong: rgba(255, 255, 255, 0.14);
32
+
33
+ --fg: #e8eaff;
34
+ --fg-2: #aeb5d3;
35
+ --fg-3: #6c7398;
36
+ --fg-faint: #444a6e;
37
+
38
+ /* Legacy tokens — kept so the unchanged modal / cfg / birth
39
+ overlay styles below still resolve. The new shell + chat use
40
+ the modern tokens above. */
41
+ --bg: #0a0d2b;
42
+ --panel: #1a1f4d;
43
+ --panel-light: #2a3270;
44
+ --border: #6a7ad9;
45
+ --border-light: #a4b2ff;
46
+ --text: #e7ecff;
47
+ --text-dim: #8090c0;
48
+ --you: #6cf6e1;
49
+ --lisa: #ffd167;
50
+ --tool: #ff7eb6;
51
+ --error: #ff5577;
52
+ }
53
+ * { box-sizing: border-box; }
54
+ html, body {
55
+ height: 100%;
56
+ margin: 0;
57
+ background: #000;
58
+ font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "Inter", system-ui, sans-serif;
59
+ -webkit-font-smoothing: antialiased;
60
+ color: var(--fg);
61
+ overflow: hidden;
62
+ }
63
+
64
+ /* ── App shell ─────────────────────────────────────────────── */
65
+ .frame {
66
+ height: 100vh;
67
+ width: 100vw;
68
+ display: grid;
69
+ grid-template-columns: 280px 1fr;
70
+ grid-template-rows: 36px 1fr;
71
+ grid-template-areas:
72
+ "titlebar titlebar"
73
+ "sidebar main";
74
+ background:
75
+ radial-gradient(ellipse at 30% 20%, #1a1238 0%, transparent 50%),
76
+ radial-gradient(ellipse at 80% 70%, #0a1f3a 0%, transparent 60%),
77
+ linear-gradient(180deg, var(--bg-1) 0%, var(--bg-deep) 100%);
78
+ overflow: hidden;
79
+ }
80
+
81
+ /* Title bar — visually shows "Lisa · session-id". The actual drag
82
+ behavior is handled Swift-side by a transparent NSView overlay
83
+ (DragHandleView) placed on top of the WKWebView for the same 36pt
84
+ strip — WebKit ignores the CSS -webkit-app-region: drag property,
85
+ so the cosmetic HTML and the functional drag region are two
86
+ separate things.
87
+ Padding-left reserves the ~78pt that the macOS traffic-light
88
+ buttons occupy at top-left. */
89
+ .titlebar {
90
+ grid-area: titlebar;
91
+ background: rgba(7, 9, 26, 0.55);
92
+ backdrop-filter: blur(20px);
93
+ -webkit-backdrop-filter: blur(20px);
94
+ border-bottom: 1px solid var(--border-new);
95
+ display: flex;
96
+ align-items: center;
97
+ justify-content: center;
98
+ padding: 0 14px 0 78px;
99
+ font-size: 12px;
100
+ font-weight: 600;
101
+ letter-spacing: 0.04em;
102
+ color: var(--fg-2);
103
+ /* nothing here should ever capture pointer events — the NSView
104
+ overlay above handles dragging, and there are no interactive
105
+ elements in the HTML titlebar. */
106
+ user-select: none;
107
+ pointer-events: none;
108
+ }
109
+ .titlebar .session-tag {
110
+ color: var(--fg-3);
111
+ font-weight: 400;
112
+ margin-left: 6px;
113
+ font-family: ui-monospace, "SF Mono", Menlo, monospace;
114
+ font-size: 11px;
115
+ letter-spacing: 0;
116
+ }
117
+
118
+ /* ── Sidebar ───────────────────────────────────────────────── */
119
+ .sidebar {
120
+ grid-area: sidebar;
121
+ background: rgba(7, 9, 26, 0.4);
122
+ backdrop-filter: blur(30px);
123
+ -webkit-backdrop-filter: blur(30px);
124
+ border-right: 1px solid var(--border-new);
125
+ overflow-y: auto;
126
+ padding: 20px 16px 16px;
127
+ display: flex;
128
+ flex-direction: column;
129
+ gap: 18px;
130
+ }
131
+
132
+ /* Identity card */
133
+ .identity {
134
+ display: grid;
135
+ grid-template-columns: 56px 1fr;
136
+ gap: 12px;
137
+ align-items: center;
138
+ padding: 12px;
139
+ background: var(--bg-card);
140
+ border: 1px solid var(--border-new);
141
+ border-radius: 14px;
142
+ }
143
+ .identity .avatar-wrap {
144
+ width: 56px;
145
+ height: 56px;
146
+ border-radius: 50%;
147
+ position: relative;
148
+ border: 1px solid var(--border-strong);
149
+ box-shadow: 0 0 0 3px var(--accent-soft);
150
+ background: #15192a;
151
+ }
152
+ .identity .avatar-wrap img {
153
+ width: 100%;
154
+ height: 100%;
155
+ border-radius: 50%;
156
+ object-fit: cover;
157
+ object-position: 50% 22%;
158
+ image-rendering: pixelated;
159
+ display: block;
160
+ transition: opacity 250ms ease;
161
+ user-select: none;
162
+ -webkit-user-drag: none;
163
+ }
164
+ .identity .avatar-wrap img.fading { opacity: 0; }
165
+ .identity .avatar-wrap::after {
166
+ content: "";
167
+ position: absolute;
168
+ right: -2px;
169
+ bottom: -2px;
170
+ width: 14px;
171
+ height: 14px;
172
+ border-radius: 50%;
173
+ background: #4ade80;
174
+ border: 2px solid var(--bg-1);
175
+ }
176
+ .identity h1 {
177
+ margin: 0 0 2px;
178
+ font-size: 15px;
179
+ font-weight: 700;
180
+ letter-spacing: 0.02em;
181
+ color: var(--fg);
182
+ }
183
+ .identity .sub {
184
+ margin: 0;
185
+ font-size: 11px;
186
+ color: var(--fg-3);
187
+ }
188
+ .identity .mood {
189
+ display: inline-flex;
190
+ align-items: center;
191
+ gap: 5px;
192
+ margin-top: 4px;
193
+ font-size: 10.5px;
194
+ color: var(--accent);
195
+ text-transform: uppercase;
196
+ letter-spacing: 0.08em;
197
+ font-weight: 600;
198
+ }
199
+ .identity .mood::before {
200
+ content: "";
201
+ width: 6px;
202
+ height: 6px;
203
+ border-radius: 50%;
204
+ background: var(--accent);
205
+ box-shadow: 0 0 6px var(--accent-glow);
206
+ }
207
+
208
+ /* Sidebar plain text section ("currently wanting") */
209
+ .sb-section { display: flex; flex-direction: column; gap: 6px; }
210
+ .sb-section h2 {
211
+ margin: 0 0 2px;
212
+ font-size: 10.5px;
213
+ font-weight: 700;
214
+ text-transform: uppercase;
215
+ letter-spacing: 0.10em;
216
+ color: var(--fg-3);
217
+ padding-left: 4px;
218
+ }
219
+ .sb-section .body-text {
220
+ margin: 0;
221
+ font-size: 12px;
222
+ line-height: 1.55;
223
+ color: var(--fg-2);
224
+ padding: 0 4px;
225
+ }
226
+
227
+ /* Live mini-cards (Claude monitor / last reflection) */
228
+ .card {
229
+ background: var(--bg-card);
230
+ border: 1px solid var(--border-new);
231
+ border-radius: 12px;
232
+ padding: 10px 12px;
233
+ font-size: 12px;
234
+ color: var(--fg-2);
235
+ line-height: 1.5;
236
+ }
237
+ .card.tint-claude {
238
+ border-color: rgba(255, 140, 66, 0.20);
239
+ background: linear-gradient(180deg, rgba(255, 140, 66, 0.06), rgba(255, 140, 66, 0.02));
240
+ }
241
+ .card.tint-idle {
242
+ border-color: rgba(255, 208, 102, 0.22);
243
+ background: linear-gradient(180deg, rgba(255, 208, 102, 0.07), rgba(255, 208, 102, 0.02));
244
+ }
245
+ .card .h {
246
+ display: flex;
247
+ justify-content: space-between;
248
+ align-items: center;
249
+ margin-bottom: 4px;
250
+ }
251
+ .card .h .left {
252
+ display: flex;
253
+ align-items: center;
254
+ gap: 6px;
255
+ font-size: 10.5px;
256
+ font-weight: 700;
257
+ text-transform: uppercase;
258
+ letter-spacing: 0.10em;
259
+ color: var(--claude);
260
+ }
261
+ .card.tint-idle .h .left { color: var(--warm); }
262
+ .card .h .count {
263
+ background: rgba(255, 140, 66, 0.16);
264
+ color: var(--claude);
265
+ font-size: 11px;
266
+ font-weight: 600;
267
+ padding: 2px 7px;
268
+ border-radius: 8px;
269
+ }
270
+ .card.tint-idle .h .count {
271
+ background: rgba(255, 208, 102, 0.16);
272
+ color: var(--warm);
273
+ }
274
+ .session-row {
275
+ display: grid;
276
+ grid-template-columns: 7px 1fr auto;
277
+ align-items: center;
278
+ gap: 7px;
279
+ padding: 5px 0;
280
+ font-size: 11.5px;
281
+ border-top: 1px dashed rgba(255, 140, 66, 0.10);
282
+ cursor: default;
283
+ }
284
+ .session-row:first-of-type { border-top: 0; }
285
+ .session-row .pip {
286
+ width: 7px;
287
+ height: 7px;
288
+ border-radius: 50%;
289
+ background: var(--fg-faint);
290
+ }
291
+ /* working = calm slow breathe (running, not actionable);
292
+ waiting = solid + a soft halo that draws the eye ("needs you"). */
293
+ .session-row .pip.working { background: var(--claude); opacity: 1; animation: breathe 2.6s ease-in-out infinite; }
294
+ .session-row .pip.waiting { background: var(--claude); opacity: 1; animation: needsYou 2s ease-in-out infinite; }
295
+ .session-row .pip.error { background: var(--err-color); }
296
+ .session-row .name {
297
+ color: var(--fg);
298
+ font-weight: 600;
299
+ overflow: hidden;
300
+ white-space: nowrap;
301
+ text-overflow: ellipsis;
302
+ }
303
+ /* D4a — agent-kind chip rendered inline before the project name, so the
304
+ multi-agent sidebar reads which tool each row belongs to. */
305
+ .session-row .agent-badge {
306
+ display: inline-block;
307
+ font-size: 9px;
308
+ font-weight: 700;
309
+ letter-spacing: 0.02em;
310
+ text-transform: lowercase;
311
+ color: var(--claude);
312
+ background: rgba(255, 140, 66, 0.12);
313
+ border: 1px solid rgba(255, 140, 66, 0.22);
314
+ border-radius: 999px;
315
+ padding: 0 5px;
316
+ margin-right: 5px;
317
+ vertical-align: 1px;
318
+ }
319
+ .session-row .when {
320
+ color: var(--fg-3);
321
+ font-variant-numeric: tabular-nums;
322
+ font-size: 10.5px;
323
+ }
324
+ /* Second line under name/when: structural activity (turns/tokens/tool·file). */
325
+ .session-row .session-act {
326
+ grid-column: 2 / -1;
327
+ margin-top: 2px;
328
+ font-size: 10px;
329
+ color: var(--fg-3);
330
+ font-family: ui-monospace, "SF Mono", Menlo, monospace;
331
+ overflow: hidden;
332
+ text-overflow: ellipsis;
333
+ white-space: nowrap;
334
+ }
335
+ /* Managed-agent controls (approve/deny · send follow-up · cancel). */
336
+ .session-row .session-ctrl {
337
+ grid-column: 2 / -1;
338
+ margin-top: 4px;
339
+ display: flex;
340
+ gap: 6px;
341
+ align-items: center;
342
+ flex-wrap: wrap;
343
+ }
344
+ .session-ctrl .mc {
345
+ font-size: 10px;
346
+ padding: 2px 8px;
347
+ border-radius: 6px;
348
+ border: 1px solid var(--border);
349
+ background: var(--panel2, rgba(255,255,255,0.05));
350
+ color: var(--fg);
351
+ cursor: pointer;
352
+ }
353
+ .session-ctrl .mc.approve { color: var(--green, #6bff9d); border-color: rgba(107,255,157,0.4); }
354
+ .session-ctrl .mc.deny,
355
+ .session-ctrl .mc.cancel { color: var(--err-color, #ff5577); border-color: rgba(255,85,119,0.4); }
356
+ .session-ctrl .mc.adopt { color: var(--brand, #6ad4ff); border-color: rgba(106,212,255,0.4); }
357
+ .session-ctrl .mc:hover { background: rgba(255,255,255,0.10); }
358
+ .session-ctrl .mc-send {
359
+ flex: 1;
360
+ min-width: 90px;
361
+ font-size: 10.5px;
362
+ padding: 2px 7px;
363
+ border-radius: 6px;
364
+ border: 1px solid var(--border);
365
+ background: rgba(0,0,0,0.25);
366
+ color: var(--fg);
367
+ }
368
+ /* "Delegate a task" composer at the top of the agents card. */
369
+ .delegate {
370
+ display: flex;
371
+ gap: 6px;
372
+ margin: 2px 0 8px;
373
+ }
374
+ .delegate input {
375
+ flex: 1;
376
+ font-size: 11px;
377
+ padding: 4px 8px;
378
+ border-radius: 7px;
379
+ border: 1px solid var(--border);
380
+ background: rgba(0,0,0,0.25);
381
+ color: var(--fg);
382
+ }
383
+ .delegate select {
384
+ font-size: 10.5px;
385
+ padding: 3px 4px;
386
+ border-radius: 7px;
387
+ border: 1px solid var(--border);
388
+ background: rgba(0,0,0,0.25);
389
+ color: var(--fg-2);
390
+ cursor: pointer;
391
+ }
392
+ .delegate button {
393
+ font-size: 11px;
394
+ padding: 4px 10px;
395
+ border-radius: 7px;
396
+ border: 1px solid var(--claude, #ff8c42);
397
+ background: rgba(255,140,66,0.16);
398
+ color: var(--claude, #ff8c42);
399
+ cursor: pointer;
400
+ }
401
+ .delegate button:hover { background: rgba(255,140,66,0.28); }
402
+ .session-empty {
403
+ color: var(--fg-faint);
404
+ font-size: 11.5px;
405
+ font-style: italic;
406
+ padding: 4px 0 2px;
407
+ }
408
+ @keyframes pulse {
409
+ 0%, 100% { opacity: 0.35; }
410
+ 50% { opacity: 1; }
411
+ }
412
+ /* Gentle breathing for "working" — present but not jumpy. */
413
+ @keyframes breathe {
414
+ 0%, 100% { opacity: 0.55; }
415
+ 50% { opacity: 1; }
416
+ }
417
+ /* "needs you" — solid dot with a pulsing warm halo, prominent without the
418
+ harsh on/off flash. */
419
+ @keyframes needsYou {
420
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(255, 140, 66, 0); }
421
+ 50% { box-shadow: 0 0 7px 2px rgba(255, 140, 66, 0.65); }
422
+ }
423
+
424
+ /* Compact SOUL / SKILLS / MEMORY / TOOLS row */
425
+ .badges {
426
+ display: grid;
427
+ grid-template-columns: repeat(2, 1fr);
428
+ gap: 6px;
429
+ }
430
+ .badge {
431
+ background: var(--bg-card);
432
+ border: 1px solid var(--border-new);
433
+ color: var(--fg-2);
434
+ font-family: inherit;
435
+ font-size: 10.5px;
436
+ font-weight: 600;
437
+ letter-spacing: 0.06em;
438
+ text-transform: uppercase;
439
+ padding: 7px 8px;
440
+ border-radius: 8px;
441
+ cursor: pointer;
442
+ display: flex;
443
+ align-items: center;
444
+ justify-content: center;
445
+ gap: 6px;
446
+ transition: background 120ms ease, color 120ms ease, border-color 120ms ease;
447
+ }
448
+ .badge:hover {
449
+ background: var(--bg-card-strong);
450
+ color: var(--fg);
451
+ border-color: var(--border-strong);
452
+ }
453
+ .badge img {
454
+ width: 14px;
455
+ height: 14px;
456
+ image-rendering: pixelated;
457
+ opacity: 0.8;
458
+ }
459
+
460
+ /* Sidebar footer — session id + sessions count */
461
+ .sb-footer {
462
+ margin-top: auto;
463
+ padding-top: 12px;
464
+ border-top: 1px solid var(--border-new);
465
+ display: flex;
466
+ align-items: center;
467
+ gap: 8px;
468
+ color: var(--fg-3);
469
+ font-size: 11px;
470
+ }
471
+ .sb-footer .session-id {
472
+ font-family: ui-monospace, "SF Mono", Menlo, monospace;
473
+ font-size: 10px;
474
+ color: var(--fg-3);
475
+ overflow: hidden;
476
+ white-space: nowrap;
477
+ text-overflow: ellipsis;
478
+ flex: 1;
479
+ min-width: 0;
480
+ }
481
+ .sb-footer .badge-count {
482
+ background: var(--bg-3);
483
+ color: var(--fg-2);
484
+ border-radius: 6px;
485
+ padding: 1px 6px;
486
+ font-size: 10px;
487
+ font-variant-numeric: tabular-nums;
488
+ flex-shrink: 0;
489
+ }
490
+
491
+ /* ── Main pane ─────────────────────────────────────────────── */
492
+ .main {
493
+ grid-area: main;
494
+ display: grid;
495
+ grid-template-rows: 1fr auto auto;
496
+ overflow: hidden;
497
+ background:
498
+ radial-gradient(ellipse at 50% -30%, rgba(106, 212, 255, 0.06) 0%, transparent 60%),
499
+ linear-gradient(180deg, transparent, rgba(106, 212, 255, 0.015));
500
+ }
501
+
502
+ #log {
503
+ overflow-y: auto;
504
+ padding: 22px 28px 24px;
505
+ display: flex;
506
+ flex-direction: column;
507
+ gap: 8px;
508
+ scroll-behavior: smooth;
509
+ }
510
+
511
+ /* Chat author label (.role .you/.lisa) */
512
+ .role {
513
+ font-size: 10px;
514
+ font-weight: 700;
515
+ letter-spacing: 0.14em;
516
+ text-transform: uppercase;
517
+ padding: 6px 2px 0;
518
+ margin-top: 6px;
519
+ }
520
+ .role.you { color: var(--accent); text-align: right; }
521
+ .role.lisa { color: var(--warm); }
522
+
523
+ /* Message bubble */
524
+ .msg {
525
+ display: block;
526
+ max-width: 88%;
527
+ background: var(--bg-card);
528
+ border: 1px solid var(--border-new);
529
+ border-radius: 14px;
530
+ padding: 9px 13px;
531
+ font-size: 13px;
532
+ line-height: 1.55;
533
+ color: var(--fg);
534
+ white-space: pre-wrap;
535
+ word-wrap: break-word;
536
+ }
537
+ /* "you" bubbles sit on the right with cyan tint */
538
+ .role.you + .msg {
539
+ margin-left: auto;
540
+ background: linear-gradient(160deg, rgba(106, 212, 255, 0.12), rgba(106, 212, 255, 0.06));
541
+ border-color: rgba(106, 212, 255, 0.25);
542
+ }
543
+ /* attachment label sits compactly under the user bubble */
544
+ .msg.attach-label {
545
+ margin-top: 2px;
546
+ background: transparent;
547
+ border: 0;
548
+ padding: 0 2px;
549
+ font-size: 10.5px;
550
+ color: var(--fg-3);
551
+ max-width: 88%;
552
+ margin-left: auto;
553
+ }
554
+
555
+ /* Thinking indicator */
556
+ .thinking {
557
+ font-size: 12px;
558
+ color: var(--fg-3);
559
+ font-style: italic;
560
+ padding: 4px 2px;
561
+ letter-spacing: 0.03em;
562
+ }
563
+
564
+ /* Tool call card */
565
+ .tool-block {
566
+ background: var(--bg-card);
567
+ border: 1px solid var(--border-new);
568
+ border-radius: 10px;
569
+ padding: 8px 12px;
570
+ font-family: ui-monospace, "SF Mono", Menlo, monospace;
571
+ font-size: 11px;
572
+ color: var(--fg-2);
573
+ margin: 4px 0;
574
+ max-width: 92%;
575
+ }
576
+ .tool-block.tool-error {
577
+ border-color: rgba(255, 85, 119, 0.30);
578
+ background: rgba(255, 85, 119, 0.05);
579
+ }
580
+ .tool-head {
581
+ display: flex;
582
+ align-items: center;
583
+ gap: 8px;
584
+ color: var(--accent);
585
+ font-weight: 600;
586
+ }
587
+ .tool-block.tool-error .tool-head { color: var(--err-color); }
588
+ .tool-icon { font-size: 12px; }
589
+ .tool-spinner { color: var(--fg-3); font-weight: 400; margin-left: auto; font-size: 12px; }
590
+ .tool-input {
591
+ color: var(--fg-3);
592
+ margin-top: 4px;
593
+ white-space: pre-wrap;
594
+ word-break: break-word;
595
+ }
596
+ .tool-result {
597
+ color: var(--fg-2);
598
+ margin-top: 4px;
599
+ padding-top: 4px;
600
+ border-top: 1px dashed var(--border-new);
601
+ white-space: pre-wrap;
602
+ max-height: 160px;
603
+ overflow-y: auto;
604
+ }
605
+
606
+ .err {
607
+ color: var(--err-color);
608
+ font-size: 12px;
609
+ padding: 6px 2px;
610
+ }
611
+
612
+ /* Idle pulse + while-you-were-away banner injected into #log */
613
+ .idle-pulse {
614
+ color: var(--dream);
615
+ font-size: 12px;
616
+ font-style: italic;
617
+ padding: 4px 2px;
618
+ letter-spacing: 0.03em;
619
+ }
620
+ .idle-block {
621
+ background: linear-gradient(180deg, rgba(180, 135, 255, 0.10), rgba(180, 135, 255, 0.02));
622
+ border: 1px solid rgba(180, 135, 255, 0.30);
623
+ border-radius: 14px;
624
+ padding: 12px 14px;
625
+ margin: 6px 0;
626
+ font-size: 12.5px;
627
+ line-height: 1.6;
628
+ color: var(--fg);
629
+ }
630
+ .idle-head {
631
+ font-size: 11px;
632
+ text-transform: uppercase;
633
+ letter-spacing: 0.10em;
634
+ color: var(--dream);
635
+ font-weight: 700;
636
+ margin-bottom: 6px;
637
+ display: flex;
638
+ align-items: center;
639
+ gap: 8px;
640
+ }
641
+ .idle-time {
642
+ margin-left: auto;
643
+ font-weight: 400;
644
+ letter-spacing: 0.05em;
645
+ color: var(--fg-3);
646
+ font-size: 10px;
647
+ }
648
+
649
+ /* Composer */
650
+ #attachPreview {
651
+ padding: 4px 22px 0;
652
+ display: flex;
653
+ flex-wrap: wrap;
654
+ gap: 6px;
655
+ min-height: 0;
656
+ }
657
+ #attachPreview:empty { padding: 0; }
658
+ .attach-chip {
659
+ background: var(--bg-card-strong);
660
+ border: 1px solid var(--border-strong);
661
+ color: var(--fg-2);
662
+ font-size: 11px;
663
+ padding: 3px 8px;
664
+ border-radius: 8px;
665
+ display: inline-flex;
666
+ align-items: center;
667
+ gap: 6px;
668
+ }
669
+ .attach-rm {
670
+ background: transparent;
671
+ border: 0;
672
+ color: var(--fg-3);
673
+ cursor: pointer;
674
+ font-size: 13px;
675
+ padding: 0;
676
+ line-height: 1;
677
+ }
678
+ .attach-rm:hover { color: var(--err-color); }
679
+
680
+ #form {
681
+ padding: 14px 20px 18px;
682
+ background: rgba(7, 9, 26, 0.6);
683
+ backdrop-filter: blur(30px);
684
+ -webkit-backdrop-filter: blur(30px);
685
+ border-top: 1px solid var(--border-new);
686
+ display: grid;
687
+ grid-template-columns: 36px 36px 36px 1fr 96px;
688
+ gap: 10px;
689
+ align-items: end;
690
+ }
691
+
692
+ #attachBtn, #captureBtn, #recordBtn {
693
+ align-self: stretch;
694
+ display: flex;
695
+ align-items: center;
696
+ justify-content: center;
697
+ background: transparent;
698
+ border: 0;
699
+ color: var(--fg-3);
700
+ font-size: 17px;
701
+ cursor: pointer;
702
+ border-radius: 10px;
703
+ transition: background 120ms ease, color 120ms ease;
704
+ min-height: 44px;
705
+ padding: 0;
706
+ }
707
+ #attachBtn:hover, #captureBtn:hover, #recordBtn:hover { background: var(--bg-card); color: var(--fg); }
708
+ #captureBtn.flash { background: var(--accent); color: var(--bg-deep); }
709
+ /* Pulsing red while recording. */
710
+ #recordBtn.recording {
711
+ background: var(--err-color);
712
+ color: #fff;
713
+ animation: rec-pulse 1.1s ease-in-out infinite;
714
+ }
715
+ @keyframes rec-pulse { 0%,100% { opacity: 1; } 50% { opacity: 0.55; } }
716
+ /* Off-screen the file input instead of display:none. WKWebView's
717
+ implicit <label>→<input type=file> click forward doesn't fire on a
718
+ fully display:none input — the OS file picker silently no-ops.
719
+ Off-screening keeps the input "live" while invisible. */
720
+ #fileInput {
721
+ position: absolute;
722
+ width: 1px;
723
+ height: 1px;
724
+ opacity: 0;
725
+ pointer-events: none;
726
+ overflow: hidden;
727
+ }
728
+
729
+ #input {
730
+ background: var(--bg-card-strong);
731
+ border: 1px solid var(--border-strong);
732
+ border-radius: 14px;
733
+ color: var(--fg);
734
+ font-family: inherit;
735
+ font-size: 13.5px;
736
+ line-height: 1.45;
737
+ padding: 11px 13px;
738
+ resize: none;
739
+ outline: none;
740
+ width: 100%;
741
+ min-height: 44px;
742
+ max-height: 200px;
743
+ transition: border-color 120ms ease, box-shadow 120ms ease;
744
+ }
745
+ #input:focus {
746
+ border-color: var(--accent);
747
+ box-shadow: 0 0 0 3px var(--accent-soft);
748
+ }
749
+ #input::placeholder { color: var(--fg-3); }
750
+
751
+ #sendBtn {
752
+ background: linear-gradient(180deg, var(--accent) 0%, #4eb8e5 100%);
753
+ color: #0a1024;
754
+ border: 0;
755
+ border-radius: 14px;
756
+ height: 100%;
757
+ font-family: inherit;
758
+ font-size: 12.5px;
759
+ font-weight: 700;
760
+ letter-spacing: 0.06em;
761
+ cursor: pointer;
762
+ display: flex;
763
+ align-items: center;
764
+ justify-content: center;
765
+ gap: 6px;
766
+ padding: 10px 14px;
767
+ transition: transform 120ms ease, box-shadow 120ms ease, opacity 120ms ease;
768
+ box-shadow: 0 4px 14px rgba(106, 212, 255, 0.25);
769
+ }
770
+ #sendBtn:hover:not(:disabled) {
771
+ transform: translateY(-1px);
772
+ box-shadow: 0 6px 18px rgba(106, 212, 255, 0.35);
773
+ }
774
+ #sendBtn:active:not(:disabled) { transform: translateY(0); }
775
+ #sendBtn:disabled { opacity: 0.5; cursor: wait; }
776
+ /* Hide the legacy pixel send icon; the text label is enough in the new theme. */
777
+ #sendBtn img { display: none; }
778
+
779
+ /* ── Mobile / narrow ───────────────────────────────────────── */
780
+ @media (max-width: 720px) {
781
+ body {
782
+ padding-top: env(safe-area-inset-top);
783
+ padding-bottom: env(safe-area-inset-bottom);
784
+ }
785
+ .frame {
786
+ grid-template-columns: 1fr;
787
+ grid-template-rows: auto 1fr auto;
788
+ }
789
+ .sidebar {
790
+ max-height: 38vh;
791
+ padding: 14px 14px 12px;
792
+ gap: 14px;
793
+ }
794
+ #form {
795
+ grid-template-columns: 36px 36px 36px 1fr 84px;
796
+ padding: 10px 14px 14px;
797
+ }
798
+ #input { font-size: 16px; /* prevents iOS Safari auto-zoom */ }
799
+ }
800
+
801
+ /* ===================================================================
802
+ Modal panel (skills / memory / tools / soul) — unchanged from the
803
+ legacy pixel-art shell. Uses the legacy CSS vars declared above.
804
+ =================================================================== */
805
+ .modal-bg {
806
+ position: fixed; inset: 0;
807
+ background: rgba(0, 0, 0, 0.7);
808
+ display: none;
809
+ align-items: center; justify-content: center;
810
+ z-index: 100;
811
+ }
812
+ .modal-bg.open { display: flex; }
813
+ .modal {
814
+ background: var(--bg-card-strong);
815
+ border: 1px solid var(--border-strong);
816
+ border-radius: 16px;
817
+ backdrop-filter: blur(30px);
818
+ -webkit-backdrop-filter: blur(30px);
819
+ box-shadow: 0 24px 80px rgba(0, 0, 0, 0.6);
820
+ max-width: 720px;
821
+ width: 90vw;
822
+ max-height: 80vh;
823
+ display: flex;
824
+ flex-direction: column;
825
+ }
826
+ .modal-head {
827
+ padding: 14px 18px;
828
+ border-bottom: 1px solid var(--border-new);
829
+ display: flex;
830
+ justify-content: space-between;
831
+ align-items: center;
832
+ }
833
+ .modal-title {
834
+ font-size: 13px;
835
+ font-weight: 700;
836
+ letter-spacing: 0.10em;
837
+ text-transform: uppercase;
838
+ color: var(--accent);
839
+ }
840
+ .modal-close {
841
+ background: transparent;
842
+ border: 1px solid var(--border-new);
843
+ color: var(--fg-2);
844
+ font-family: inherit;
845
+ font-size: 11px;
846
+ letter-spacing: 0.06em;
847
+ padding: 5px 10px;
848
+ border-radius: 8px;
849
+ cursor: pointer;
850
+ }
851
+ .modal-close:hover { color: var(--err-color); border-color: rgba(255, 85, 119, 0.40); }
852
+ .modal-body {
853
+ padding: 16px 18px;
854
+ overflow-y: auto;
855
+ font-size: 12.5px;
856
+ line-height: 1.55;
857
+ color: var(--fg-2);
858
+ }
859
+ .modal-body h3 {
860
+ font-size: 11px;
861
+ font-weight: 700;
862
+ letter-spacing: 0.10em;
863
+ text-transform: uppercase;
864
+ color: var(--accent);
865
+ margin: 14px 0 6px 0;
866
+ border-bottom: 1px dashed var(--border-new);
867
+ padding-bottom: 5px;
868
+ }
869
+ .modal-body h3:first-child { margin-top: 0; }
870
+ .modal-body .item {
871
+ padding: 7px 0;
872
+ border-bottom: 1px dotted var(--border-new);
873
+ }
874
+ .modal-body .item:last-child { border: none; }
875
+ .modal-body .name {
876
+ color: var(--warm);
877
+ font-weight: 600;
878
+ font-size: 12px;
879
+ }
880
+ .modal-body .desc { color: var(--fg-3); margin-top: 2px; }
881
+ .modal-body .plan-select {
882
+ margin-top: 6px;
883
+ font-family: inherit;
884
+ font-size: 11px;
885
+ font-weight: 700;
886
+ padding: 4px 12px;
887
+ border: 0;
888
+ border-radius: 8px;
889
+ cursor: pointer;
890
+ background: var(--accent);
891
+ color: #07091a;
892
+ }
893
+ .modal-body .plan-select:hover { filter: brightness(1.08); }
894
+ .modal-body .plan-select[disabled] {
895
+ background: var(--fg-faint);
896
+ color: var(--fg-3);
897
+ cursor: default;
898
+ }
899
+ .modal-body pre {
900
+ background: rgba(0, 0, 0, 0.30);
901
+ padding: 10px 12px;
902
+ border-left: 2px solid var(--accent);
903
+ border-radius: 4px;
904
+ white-space: pre-wrap;
905
+ margin: 6px 0;
906
+ color: var(--fg);
907
+ font-family: ui-monospace, "SF Mono", Menlo, monospace;
908
+ font-size: 11.5px;
909
+ line-height: 1.5;
910
+ }
911
+ .modal-body .empty { color: var(--fg-faint); font-style: italic; }
912
+
913
+ /* ===================================================================
914
+ Birth ritual overlay — full-screen, one-time. Uses legacy palette
915
+ intentionally (it's a separate ceremonial moment).
916
+ =================================================================== */
917
+ .birth-overlay {
918
+ position: fixed;
919
+ inset: 0;
920
+ background:
921
+ radial-gradient(ellipse at center, rgba(40, 30, 80, 0.95) 0%, rgba(5, 5, 20, 1) 70%);
922
+ z-index: 9999;
923
+ display: none;
924
+ flex-direction: column;
925
+ align-items: center;
926
+ justify-content: center;
927
+ padding: 32px;
928
+ }
929
+ .birth-overlay.open { display: flex; }
930
+ .birth-content {
931
+ position: relative;
932
+ z-index: 2;
933
+ width: min(800px, 95vw);
934
+ max-height: 90vh;
935
+ overflow-y: auto;
936
+ }
937
+ .birth-stars {
938
+ text-align: center;
939
+ color: var(--accent);
940
+ font-size: 14px;
941
+ letter-spacing: 8px;
942
+ text-shadow: 0 0 8px var(--accent-glow);
943
+ animation: starBlink 1.5s steps(3) infinite;
944
+ }
945
+ @keyframes starBlink {
946
+ 0%, 30%, 100% { opacity: 1; }
947
+ 50% { opacity: 0.4; }
948
+ }
949
+ .birth-title {
950
+ text-align: center;
951
+ color: var(--warm);
952
+ font-size: 22px;
953
+ font-weight: 700;
954
+ letter-spacing: 6px;
955
+ margin: 24px 0 32px;
956
+ text-shadow: 0 0 12px rgba(255, 208, 102, 0.45);
957
+ }
958
+ .birth-step {
959
+ margin: 14px 0;
960
+ padding: 10px 16px;
961
+ border-left: 3px solid var(--border-new);
962
+ background: rgba(20, 26, 64, 0.55);
963
+ border-radius: 0 8px 8px 0;
964
+ opacity: 0;
965
+ transform: translateY(8px);
966
+ transition: opacity 0.4s ease-out, transform 0.4s ease-out;
967
+ }
968
+ .birth-step.shown { opacity: 1; transform: translateY(0); }
969
+ .birth-step.active {
970
+ border-left-color: var(--warm);
971
+ background: rgba(255, 208, 102, 0.08);
972
+ }
973
+ .birth-step.done { border-left-color: var(--accent); }
974
+ .birth-step .step-name {
975
+ font-size: 10.5px;
976
+ font-weight: 700;
977
+ letter-spacing: 0.10em;
978
+ color: var(--fg-3);
979
+ text-transform: uppercase;
980
+ margin-bottom: 4px;
981
+ }
982
+ .birth-step.active .step-name { color: var(--warm); }
983
+ .birth-step.done .step-name { color: var(--accent); }
984
+ .birth-step .step-detail {
985
+ color: var(--fg);
986
+ font-size: 13px;
987
+ line-height: 1.55;
988
+ word-break: break-word;
989
+ }
990
+ .birth-step .step-cursor {
991
+ display: inline-block;
992
+ width: 6px;
993
+ background: var(--warm);
994
+ height: 0.9em;
995
+ vertical-align: middle;
996
+ animation: blink 0.8s steps(2) infinite;
997
+ }
998
+ @keyframes blink { 50% { opacity: 0; } }
999
+ .birth-final {
1000
+ margin-top: 36px;
1001
+ text-align: center;
1002
+ color: var(--warm);
1003
+ font-size: 15px;
1004
+ font-weight: 700;
1005
+ letter-spacing: 0.10em;
1006
+ text-shadow: 0 0 10px rgba(255, 208, 102, 0.4);
1007
+ opacity: 0;
1008
+ transition: opacity 0.6s ease-in;
1009
+ }
1010
+ .birth-final.shown { opacity: 1; }
1011
+ .birth-enter {
1012
+ margin: 24px auto 0;
1013
+ display: block;
1014
+ background: linear-gradient(180deg, var(--accent) 0%, #4eb8e5 100%);
1015
+ border: 0;
1016
+ color: #0a1024;
1017
+ font-family: inherit;
1018
+ font-weight: 700;
1019
+ font-size: 13px;
1020
+ padding: 12px 32px;
1021
+ border-radius: 12px;
1022
+ cursor: pointer;
1023
+ letter-spacing: 0.10em;
1024
+ opacity: 0;
1025
+ transition: opacity 0.6s ease-in, transform 120ms ease;
1026
+ box-shadow: 0 6px 18px rgba(106, 212, 255, 0.35);
1027
+ }
1028
+ .birth-enter.shown { opacity: 1; }
1029
+ .birth-enter:hover { transform: translateY(-1px); }
1030
+ .birth-error {
1031
+ color: var(--err-color);
1032
+ text-align: center;
1033
+ margin-top: 24px;
1034
+ font-size: 11.5px;
1035
+ letter-spacing: 0.05em;
1036
+ }
1037
+
1038
+ /* ===================================================================
1039
+ API-key config overlay — same modernized treatment.
1040
+ =================================================================== */
1041
+ .cfg-overlay {
1042
+ position: fixed;
1043
+ inset: 0;
1044
+ background:
1045
+ radial-gradient(ellipse at center, rgba(40, 30, 80, 0.95) 0%, rgba(5, 5, 20, 1) 70%);
1046
+ z-index: 9998;
1047
+ display: none;
1048
+ align-items: center;
1049
+ justify-content: center;
1050
+ padding: 32px;
1051
+ }
1052
+ .cfg-overlay.open { display: flex; }
1053
+ .cfg-card {
1054
+ position: relative;
1055
+ z-index: 2;
1056
+ width: min(520px, 95vw);
1057
+ background: var(--bg-card-strong);
1058
+ border: 1px solid var(--border-strong);
1059
+ border-radius: 16px;
1060
+ backdrop-filter: blur(30px);
1061
+ -webkit-backdrop-filter: blur(30px);
1062
+ box-shadow: 0 24px 80px rgba(0, 0, 0, 0.6);
1063
+ padding: 28px 32px;
1064
+ }
1065
+ .cfg-stars {
1066
+ text-align: center;
1067
+ color: var(--accent);
1068
+ font-size: 12px;
1069
+ letter-spacing: 6px;
1070
+ text-shadow: 0 0 8px var(--accent-glow);
1071
+ animation: starBlink 1.5s steps(3) infinite;
1072
+ }
1073
+ .cfg-title {
1074
+ text-align: center;
1075
+ color: var(--warm);
1076
+ font-size: 16px;
1077
+ font-weight: 700;
1078
+ letter-spacing: 6px;
1079
+ margin: 16px 0 6px;
1080
+ }
1081
+ .cfg-sub {
1082
+ text-align: center;
1083
+ color: var(--fg-3);
1084
+ font-size: 12.5px;
1085
+ margin-bottom: 22px;
1086
+ line-height: 1.5;
1087
+ }
1088
+ .cfg-sub a { color: var(--accent); text-decoration: underline; }
1089
+ .cfg-field { display: block; margin: 14px 0; }
1090
+ .cfg-label {
1091
+ display: block;
1092
+ font-size: 10.5px;
1093
+ font-weight: 700;
1094
+ letter-spacing: 0.08em;
1095
+ text-transform: uppercase;
1096
+ color: var(--accent);
1097
+ margin-bottom: 6px;
1098
+ }
1099
+ .cfg-label .opt {
1100
+ color: var(--fg-3);
1101
+ font-size: 9.5px;
1102
+ margin-left: 6px;
1103
+ text-transform: none;
1104
+ letter-spacing: 0;
1105
+ font-weight: 400;
1106
+ }
1107
+ .cfg-input {
1108
+ width: 100%;
1109
+ background: var(--bg-card);
1110
+ border: 1px solid var(--border-strong);
1111
+ border-radius: 10px;
1112
+ color: var(--fg);
1113
+ font-family: ui-monospace, "SF Mono", Menlo, monospace;
1114
+ font-size: 13px;
1115
+ padding: 10px 12px;
1116
+ }
1117
+ .cfg-input:focus {
1118
+ outline: none;
1119
+ border-color: var(--accent);
1120
+ box-shadow: 0 0 0 3px var(--accent-soft);
1121
+ }
1122
+ .cfg-help {
1123
+ color: var(--fg-3);
1124
+ font-size: 11px;
1125
+ margin-top: 6px;
1126
+ }
1127
+ .cfg-help code {
1128
+ color: var(--fg-2);
1129
+ background: rgba(0, 0, 0, 0.3);
1130
+ padding: 1px 5px;
1131
+ border-radius: 3px;
1132
+ font-size: 11px;
1133
+ }
1134
+ .cfg-actions {
1135
+ margin-top: 22px;
1136
+ display: flex;
1137
+ justify-content: center;
1138
+ }
1139
+ .cfg-save {
1140
+ background: linear-gradient(180deg, var(--accent) 0%, #4eb8e5 100%);
1141
+ border: 0;
1142
+ color: #0a1024;
1143
+ font-family: inherit;
1144
+ font-size: 12.5px;
1145
+ font-weight: 700;
1146
+ padding: 11px 28px;
1147
+ border-radius: 12px;
1148
+ cursor: pointer;
1149
+ letter-spacing: 0.10em;
1150
+ box-shadow: 0 4px 14px rgba(106, 212, 255, 0.25);
1151
+ transition: transform 120ms ease, box-shadow 120ms ease, opacity 120ms ease;
1152
+ }
1153
+ .cfg-save:hover { transform: translateY(-1px); box-shadow: 0 6px 18px rgba(106, 212, 255, 0.35); }
1154
+ .cfg-save:active { transform: translateY(0); }
1155
+ .cfg-save:disabled { opacity: 0.55; cursor: wait; }
1156
+ .cfg-error {
1157
+ color: var(--err-color);
1158
+ font-size: 11px;
1159
+ text-align: center;
1160
+ margin-top: 14px;
1161
+ min-height: 14px;
1162
+ }`;
1163
+ //# sourceMappingURL=lisa-css.js.map