p-spore 0.1.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 (261) hide show
  1. package/README.md +97 -0
  2. package/dist/agents/agent-manager.d.ts +57 -0
  3. package/dist/agents/agent-manager.d.ts.map +1 -0
  4. package/dist/agents/agent-manager.js +559 -0
  5. package/dist/agents/agent-manager.js.map +1 -0
  6. package/dist/agents/agent-tools.d.ts +4 -0
  7. package/dist/agents/agent-tools.d.ts.map +1 -0
  8. package/dist/agents/agent-tools.js +111 -0
  9. package/dist/agents/agent-tools.js.map +1 -0
  10. package/dist/agents/types.d.ts +52 -0
  11. package/dist/agents/types.d.ts.map +1 -0
  12. package/dist/agents/types.js +2 -0
  13. package/dist/agents/types.js.map +1 -0
  14. package/dist/application/agent-application.d.ts +89 -0
  15. package/dist/application/agent-application.d.ts.map +1 -0
  16. package/dist/application/agent-application.js +542 -0
  17. package/dist/application/agent-application.js.map +1 -0
  18. package/dist/automation/automation-tools.d.ts +4 -0
  19. package/dist/automation/automation-tools.d.ts.map +1 -0
  20. package/dist/automation/automation-tools.js +35 -0
  21. package/dist/automation/automation-tools.js.map +1 -0
  22. package/dist/automation/cron-adapter.d.ts +11 -0
  23. package/dist/automation/cron-adapter.d.ts.map +1 -0
  24. package/dist/automation/cron-adapter.js +48 -0
  25. package/dist/automation/cron-adapter.js.map +1 -0
  26. package/dist/automation/daemon-run-executor.d.ts +18 -0
  27. package/dist/automation/daemon-run-executor.d.ts.map +1 -0
  28. package/dist/automation/daemon-run-executor.js +69 -0
  29. package/dist/automation/daemon-run-executor.js.map +1 -0
  30. package/dist/automation/job-store.d.ts +12 -0
  31. package/dist/automation/job-store.d.ts.map +1 -0
  32. package/dist/automation/job-store.js +185 -0
  33. package/dist/automation/job-store.js.map +1 -0
  34. package/dist/automation/run-ledger.d.ts +25 -0
  35. package/dist/automation/run-ledger.d.ts.map +1 -0
  36. package/dist/automation/run-ledger.js +148 -0
  37. package/dist/automation/run-ledger.js.map +1 -0
  38. package/dist/automation/scheduler.d.ts +36 -0
  39. package/dist/automation/scheduler.d.ts.map +1 -0
  40. package/dist/automation/scheduler.js +300 -0
  41. package/dist/automation/scheduler.js.map +1 -0
  42. package/dist/automation/types.d.ts +81 -0
  43. package/dist/automation/types.d.ts.map +1 -0
  44. package/dist/automation/types.js +2 -0
  45. package/dist/automation/types.js.map +1 -0
  46. package/dist/cli/main.d.ts +4 -0
  47. package/dist/cli/main.d.ts.map +1 -0
  48. package/dist/cli/main.js +768 -0
  49. package/dist/cli/main.js.map +1 -0
  50. package/dist/config/config.d.ts +52 -0
  51. package/dist/config/config.d.ts.map +1 -0
  52. package/dist/config/config.js +345 -0
  53. package/dist/config/config.js.map +1 -0
  54. package/dist/daemon/daemon.d.ts +30 -0
  55. package/dist/daemon/daemon.d.ts.map +1 -0
  56. package/dist/daemon/daemon.js +437 -0
  57. package/dist/daemon/daemon.js.map +1 -0
  58. package/dist/daemon/supervisor.d.ts +18 -0
  59. package/dist/daemon/supervisor.d.ts.map +1 -0
  60. package/dist/daemon/supervisor.js +37 -0
  61. package/dist/daemon/supervisor.js.map +1 -0
  62. package/dist/desktop/daemon-bridge.d.ts +32 -0
  63. package/dist/desktop/daemon-bridge.d.ts.map +1 -0
  64. package/dist/desktop/daemon-bridge.js +204 -0
  65. package/dist/desktop/daemon-bridge.js.map +1 -0
  66. package/dist/desktop/daemon-supervisor.d.ts +2 -0
  67. package/dist/desktop/daemon-supervisor.d.ts.map +1 -0
  68. package/dist/desktop/daemon-supervisor.js +2 -0
  69. package/dist/desktop/daemon-supervisor.js.map +1 -0
  70. package/dist/desktop/ipc-contract.d.ts +153 -0
  71. package/dist/desktop/ipc-contract.d.ts.map +1 -0
  72. package/dist/desktop/ipc-contract.js +219 -0
  73. package/dist/desktop/ipc-contract.js.map +1 -0
  74. package/dist/desktop/main.d.ts +2 -0
  75. package/dist/desktop/main.d.ts.map +1 -0
  76. package/dist/desktop/main.js +594 -0
  77. package/dist/desktop/main.js.map +1 -0
  78. package/dist/desktop/preload.cjs +32 -0
  79. package/dist/desktop/renderer/index.html +284 -0
  80. package/dist/desktop/renderer/renderer.d.ts +2 -0
  81. package/dist/desktop/renderer/renderer.d.ts.map +1 -0
  82. package/dist/desktop/renderer/renderer.js +895 -0
  83. package/dist/desktop/renderer/renderer.js.map +1 -0
  84. package/dist/desktop/renderer/store.d.ts +33 -0
  85. package/dist/desktop/renderer/store.d.ts.map +1 -0
  86. package/dist/desktop/renderer/store.js +144 -0
  87. package/dist/desktop/renderer/store.js.map +1 -0
  88. package/dist/desktop/renderer/styles.css +540 -0
  89. package/dist/desktop/security.d.ts +5 -0
  90. package/dist/desktop/security.d.ts.map +1 -0
  91. package/dist/desktop/security.js +49 -0
  92. package/dist/desktop/security.js.map +1 -0
  93. package/dist/desktop/smoke-fixture.d.ts +3 -0
  94. package/dist/desktop/smoke-fixture.d.ts.map +1 -0
  95. package/dist/desktop/smoke-fixture.js +223 -0
  96. package/dist/desktop/smoke-fixture.js.map +1 -0
  97. package/dist/desktop/validation.d.ts +8 -0
  98. package/dist/desktop/validation.d.ts.map +1 -0
  99. package/dist/desktop/validation.js +341 -0
  100. package/dist/desktop/validation.js.map +1 -0
  101. package/dist/domain/runtime.d.ts +116 -0
  102. package/dist/domain/runtime.d.ts.map +1 -0
  103. package/dist/domain/runtime.js +2 -0
  104. package/dist/domain/runtime.js.map +1 -0
  105. package/dist/gateway/local-gateway.d.ts +23 -0
  106. package/dist/gateway/local-gateway.d.ts.map +1 -0
  107. package/dist/gateway/local-gateway.js +265 -0
  108. package/dist/gateway/local-gateway.js.map +1 -0
  109. package/dist/kernel/loop.d.ts +10 -0
  110. package/dist/kernel/loop.d.ts.map +1 -0
  111. package/dist/kernel/loop.js +41 -0
  112. package/dist/kernel/loop.js.map +1 -0
  113. package/dist/kernel/reducer.d.ts +3 -0
  114. package/dist/kernel/reducer.d.ts.map +1 -0
  115. package/dist/kernel/reducer.js +102 -0
  116. package/dist/kernel/reducer.js.map +1 -0
  117. package/dist/kernel/state.d.ts +93 -0
  118. package/dist/kernel/state.d.ts.map +1 -0
  119. package/dist/kernel/state.js +15 -0
  120. package/dist/kernel/state.js.map +1 -0
  121. package/dist/mcp/mcp-manager.d.ts +55 -0
  122. package/dist/mcp/mcp-manager.d.ts.map +1 -0
  123. package/dist/mcp/mcp-manager.js +591 -0
  124. package/dist/mcp/mcp-manager.js.map +1 -0
  125. package/dist/mcp/mcp-tools.d.ts +4 -0
  126. package/dist/mcp/mcp-tools.d.ts.map +1 -0
  127. package/dist/mcp/mcp-tools.js +53 -0
  128. package/dist/mcp/mcp-tools.js.map +1 -0
  129. package/dist/mcp/types.d.ts +73 -0
  130. package/dist/mcp/types.d.ts.map +1 -0
  131. package/dist/mcp/types.js +2 -0
  132. package/dist/mcp/types.js.map +1 -0
  133. package/dist/memory/bm25.d.ts +14 -0
  134. package/dist/memory/bm25.d.ts.map +1 -0
  135. package/dist/memory/bm25.js +40 -0
  136. package/dist/memory/bm25.js.map +1 -0
  137. package/dist/memory/context-loader.d.ts +26 -0
  138. package/dist/memory/context-loader.d.ts.map +1 -0
  139. package/dist/memory/context-loader.js +97 -0
  140. package/dist/memory/context-loader.js.map +1 -0
  141. package/dist/memory/memory-service.d.ts +30 -0
  142. package/dist/memory/memory-service.d.ts.map +1 -0
  143. package/dist/memory/memory-service.js +133 -0
  144. package/dist/memory/memory-service.js.map +1 -0
  145. package/dist/memory/memory-tools.d.ts +4 -0
  146. package/dist/memory/memory-tools.d.ts.map +1 -0
  147. package/dist/memory/memory-tools.js +49 -0
  148. package/dist/memory/memory-tools.js.map +1 -0
  149. package/dist/memory/search-service.d.ts +38 -0
  150. package/dist/memory/search-service.d.ts.map +1 -0
  151. package/dist/memory/search-service.js +463 -0
  152. package/dist/memory/search-service.js.map +1 -0
  153. package/dist/memory/tokenizer.d.ts +5 -0
  154. package/dist/memory/tokenizer.d.ts.map +1 -0
  155. package/dist/memory/tokenizer.js +42 -0
  156. package/dist/memory/tokenizer.js.map +1 -0
  157. package/dist/notifications/notification-service.d.ts +47 -0
  158. package/dist/notifications/notification-service.d.ts.map +1 -0
  159. package/dist/notifications/notification-service.js +163 -0
  160. package/dist/notifications/notification-service.js.map +1 -0
  161. package/dist/notifications/notification-tools.d.ts +4 -0
  162. package/dist/notifications/notification-tools.d.ts.map +1 -0
  163. package/dist/notifications/notification-tools.js +31 -0
  164. package/dist/notifications/notification-tools.js.map +1 -0
  165. package/dist/pi/pi-runtime-adapter.d.ts +38 -0
  166. package/dist/pi/pi-runtime-adapter.d.ts.map +1 -0
  167. package/dist/pi/pi-runtime-adapter.js +483 -0
  168. package/dist/pi/pi-runtime-adapter.js.map +1 -0
  169. package/dist/plugins/extension-manager.d.ts +32 -0
  170. package/dist/plugins/extension-manager.d.ts.map +1 -0
  171. package/dist/plugins/extension-manager.js +562 -0
  172. package/dist/plugins/extension-manager.js.map +1 -0
  173. package/dist/plugins/resource-inspector.d.ts +18 -0
  174. package/dist/plugins/resource-inspector.d.ts.map +1 -0
  175. package/dist/plugins/resource-inspector.js +386 -0
  176. package/dist/plugins/resource-inspector.js.map +1 -0
  177. package/dist/plugins/types.d.ts +96 -0
  178. package/dist/plugins/types.d.ts.map +1 -0
  179. package/dist/plugins/types.js +2 -0
  180. package/dist/plugins/types.js.map +1 -0
  181. package/dist/policy/approval-service.d.ts +68 -0
  182. package/dist/policy/approval-service.d.ts.map +1 -0
  183. package/dist/policy/approval-service.js +349 -0
  184. package/dist/policy/approval-service.js.map +1 -0
  185. package/dist/policy/policy.d.ts +26 -0
  186. package/dist/policy/policy.d.ts.map +1 -0
  187. package/dist/policy/policy.js +228 -0
  188. package/dist/policy/policy.js.map +1 -0
  189. package/dist/protocol/client.d.ts +25 -0
  190. package/dist/protocol/client.d.ts.map +1 -0
  191. package/dist/protocol/client.js +188 -0
  192. package/dist/protocol/client.js.map +1 -0
  193. package/dist/protocol/errors.d.ts +5 -0
  194. package/dist/protocol/errors.d.ts.map +1 -0
  195. package/dist/protocol/errors.js +9 -0
  196. package/dist/protocol/errors.js.map +1 -0
  197. package/dist/protocol/schema.d.ts +71 -0
  198. package/dist/protocol/schema.d.ts.map +1 -0
  199. package/dist/protocol/schema.js +155 -0
  200. package/dist/protocol/schema.js.map +1 -0
  201. package/dist/settings/llm-settings-service.d.ts +9 -0
  202. package/dist/settings/llm-settings-service.d.ts.map +1 -0
  203. package/dist/settings/llm-settings-service.js +199 -0
  204. package/dist/settings/llm-settings-service.js.map +1 -0
  205. package/dist/settings/llm-settings.d.ts +29 -0
  206. package/dist/settings/llm-settings.d.ts.map +1 -0
  207. package/dist/settings/llm-settings.js +113 -0
  208. package/dist/settings/llm-settings.js.map +1 -0
  209. package/dist/shell/shell-service.d.ts +88 -0
  210. package/dist/shell/shell-service.d.ts.map +1 -0
  211. package/dist/shell/shell-service.js +459 -0
  212. package/dist/shell/shell-service.js.map +1 -0
  213. package/dist/storage/atomic.d.ts +4 -0
  214. package/dist/storage/atomic.d.ts.map +1 -0
  215. package/dist/storage/atomic.js +49 -0
  216. package/dist/storage/atomic.js.map +1 -0
  217. package/dist/storage/daemon-lock.d.ts +17 -0
  218. package/dist/storage/daemon-lock.d.ts.map +1 -0
  219. package/dist/storage/daemon-lock.js +97 -0
  220. package/dist/storage/daemon-lock.js.map +1 -0
  221. package/dist/storage/home.d.ts +29 -0
  222. package/dist/storage/home.d.ts.map +1 -0
  223. package/dist/storage/home.js +108 -0
  224. package/dist/storage/home.js.map +1 -0
  225. package/dist/storage/jsonl.d.ts +2 -0
  226. package/dist/storage/jsonl.d.ts.map +1 -0
  227. package/dist/storage/jsonl.js +45 -0
  228. package/dist/storage/jsonl.js.map +1 -0
  229. package/dist/tools/core-tools.d.ts +16 -0
  230. package/dist/tools/core-tools.d.ts.map +1 -0
  231. package/dist/tools/core-tools.js +283 -0
  232. package/dist/tools/core-tools.js.map +1 -0
  233. package/dist/ui/shared/presentation.d.ts +46 -0
  234. package/dist/ui/shared/presentation.d.ts.map +1 -0
  235. package/dist/ui/shared/presentation.js +81 -0
  236. package/dist/ui/shared/presentation.js.map +1 -0
  237. package/dist/ui/shared/protocol-state.d.ts +30 -0
  238. package/dist/ui/shared/protocol-state.d.ts.map +1 -0
  239. package/dist/ui/shared/protocol-state.js +165 -0
  240. package/dist/ui/shared/protocol-state.js.map +1 -0
  241. package/dist/ui/tui/commands.d.ts +2 -0
  242. package/dist/ui/tui/commands.d.ts.map +1 -0
  243. package/dist/ui/tui/commands.js +33 -0
  244. package/dist/ui/tui/commands.js.map +1 -0
  245. package/dist/ui/tui/store.d.ts +32 -0
  246. package/dist/ui/tui/store.d.ts.map +1 -0
  247. package/dist/ui/tui/store.js +62 -0
  248. package/dist/ui/tui/store.js.map +1 -0
  249. package/dist/ui/tui/tui-app.d.ts +21 -0
  250. package/dist/ui/tui/tui-app.d.ts.map +1 -0
  251. package/dist/ui/tui/tui-app.js +643 -0
  252. package/dist/ui/tui/tui-app.js.map +1 -0
  253. package/dist/ui/tui/view.d.ts +29 -0
  254. package/dist/ui/tui/view.d.ts.map +1 -0
  255. package/dist/ui/tui/view.js +255 -0
  256. package/dist/ui/tui/view.js.map +1 -0
  257. package/dist/version.d.ts +5 -0
  258. package/dist/version.d.ts.map +1 -0
  259. package/dist/version.js +5 -0
  260. package/dist/version.js.map +1 -0
  261. package/package.json +62 -0
@@ -0,0 +1,540 @@
1
+ :root {
2
+ color-scheme: dark;
3
+ --canvas: #0e110f;
4
+ --canvas-glow: rgba(132, 181, 99, 0.08);
5
+ --surface: #151815;
6
+ --surface-raised: #1a1e1a;
7
+ --surface-soft: #111411;
8
+ --surface-input: #121512;
9
+ --surface-hover: #202520;
10
+ --surface-selected: #202a1e;
11
+ --overlay: rgba(7, 9, 7, 0.72);
12
+ --border: #303630;
13
+ --border-soft: #252b26;
14
+ --border-strong: #485149;
15
+ --text: #f1f2ed;
16
+ --text-soft: #d1d6ce;
17
+ --muted: #9da69d;
18
+ --faint: #747e75;
19
+ --accent: #a9de7d;
20
+ --accent-strong: #bbe993;
21
+ --accent-ink: #15210f;
22
+ --accent-soft: rgba(149, 211, 103, 0.12);
23
+ --amber: #e6ba68;
24
+ --amber-soft: rgba(230, 186, 104, 0.1);
25
+ --red: #ed8b83;
26
+ --red-soft: rgba(237, 139, 131, 0.1);
27
+ --blue: #8abbd9;
28
+ --shadow: 0 24px 70px rgba(0, 0, 0, 0.3);
29
+ --shadow-soft: 0 10px 32px rgba(0, 0, 0, 0.18);
30
+ --radius-lg: 16px;
31
+ --radius-md: 11px;
32
+ --radius-sm: 8px;
33
+ --motion-out: cubic-bezier(0.16, 1, 0.3, 1);
34
+ --font-sans: "Noto Sans CJK SC", "Noto Sans SC", "Source Han Sans SC", sans-serif;
35
+ --font-mono: "JetBrains Mono", "SFMono-Regular", Consolas, monospace;
36
+ font-family: var(--font-sans);
37
+ font-synthesis: none;
38
+ }
39
+
40
+ :root[data-theme="light"] {
41
+ color-scheme: light;
42
+ --canvas: #eeece5;
43
+ --canvas-glow: rgba(77, 120, 75, 0.08);
44
+ --surface: #faf9f4;
45
+ --surface-raised: #f3f2eb;
46
+ --surface-soft: #f6f5ef;
47
+ --surface-input: #f7f6f0;
48
+ --surface-hover: #efeee6;
49
+ --surface-selected: #e6eee0;
50
+ --overlay: rgba(37, 40, 35, 0.38);
51
+ --border: #d2d4cc;
52
+ --border-soft: #e2e2db;
53
+ --border-strong: #aeb4aa;
54
+ --text: #20231f;
55
+ --text-soft: #3a413a;
56
+ --muted: #677067;
57
+ --faint: #899088;
58
+ --accent: #3f774d;
59
+ --accent-strong: #326640;
60
+ --accent-ink: #f7f8f3;
61
+ --accent-soft: rgba(63, 119, 77, 0.1);
62
+ --amber: #966b27;
63
+ --amber-soft: rgba(150, 107, 39, 0.08);
64
+ --red: #a54e47;
65
+ --red-soft: rgba(165, 78, 71, 0.08);
66
+ --blue: #426f8b;
67
+ --shadow: 0 22px 64px rgba(47, 51, 44, 0.11);
68
+ --shadow-soft: 0 9px 28px rgba(47, 51, 44, 0.08);
69
+ }
70
+
71
+ * { box-sizing: border-box; }
72
+ [hidden] { display: none !important; }
73
+
74
+ html,
75
+ body {
76
+ width: 100%;
77
+ height: 100%;
78
+ margin: 0;
79
+ overflow: hidden;
80
+ }
81
+
82
+ body {
83
+ color: var(--text);
84
+ background:
85
+ radial-gradient(circle at 8% -20%, var(--canvas-glow), transparent 36rem),
86
+ var(--canvas);
87
+ font-size: 15px;
88
+ -webkit-font-smoothing: antialiased;
89
+ text-rendering: optimizeLegibility;
90
+ }
91
+
92
+ body,
93
+ .topbar,
94
+ .panel,
95
+ .composer,
96
+ .settings-dialog,
97
+ textarea,
98
+ input,
99
+ select,
100
+ button {
101
+ transition:
102
+ color 210ms var(--motion-out),
103
+ background-color 210ms var(--motion-out),
104
+ border-color 210ms var(--motion-out),
105
+ box-shadow 210ms var(--motion-out);
106
+ }
107
+
108
+ ::selection { color: var(--accent-ink); background: var(--accent); }
109
+ button,
110
+ textarea,
111
+ input,
112
+ select { font: inherit; }
113
+ button { color: inherit; touch-action: manipulation; }
114
+ button:disabled { cursor: not-allowed; opacity: 0.45; }
115
+
116
+ button:focus-visible,
117
+ textarea:focus-visible,
118
+ input:focus-visible,
119
+ select:focus-visible,
120
+ [tabindex]:focus-visible,
121
+ .skip-link:focus-visible {
122
+ outline: 2px solid var(--accent);
123
+ outline-offset: 3px;
124
+ }
125
+
126
+ .skip-link {
127
+ position: fixed;
128
+ z-index: 100;
129
+ top: 10px;
130
+ left: 16px;
131
+ padding: 9px 13px;
132
+ border-radius: var(--radius-sm);
133
+ color: var(--accent-ink);
134
+ background: var(--accent);
135
+ font-weight: 700;
136
+ transform: translateY(-160%);
137
+ transition: transform 180ms var(--motion-out);
138
+ }
139
+ .skip-link:focus { transform: translateY(0); }
140
+
141
+ .app-shell {
142
+ height: 100%;
143
+ display: grid;
144
+ grid-template-rows: 64px auto minmax(0, 1fr);
145
+ gap: 8px;
146
+ padding: 10px;
147
+ }
148
+
149
+ .topbar {
150
+ display: grid;
151
+ grid-template-columns: minmax(260px, 1fr) auto minmax(420px, 1fr);
152
+ align-items: center;
153
+ gap: 20px;
154
+ padding: 0 12px;
155
+ border: 1px solid var(--border);
156
+ border-radius: var(--radius-lg);
157
+ background: color-mix(in srgb, var(--surface) 97%, transparent);
158
+ box-shadow: var(--shadow-soft);
159
+ animation: surface-enter 480ms var(--motion-out) both;
160
+ }
161
+
162
+ .topbar-leading,
163
+ .topbar-actions,
164
+ .runtime-status,
165
+ .brand-lockup,
166
+ .session-health,
167
+ .composer-actions,
168
+ .settings-footer > div { display: flex; align-items: center; }
169
+ .topbar-leading { gap: 12px; min-width: 0; }
170
+ .topbar-actions { justify-self: end; gap: 7px; }
171
+ .runtime-status { justify-self: center; gap: 12px; min-width: 0; }
172
+ .brand-lockup { gap: 11px; min-width: 0; }
173
+ .brand-lockup h1 { margin: 0; font-size: 21px; line-height: 1; font-weight: 760; letter-spacing: -0.045em; }
174
+ .brand-lockup span:not(.brand-mark) { display: block; margin-top: 5px; color: var(--muted); font: 650 11.5px/1 var(--font-mono); letter-spacing: 0.12em; }
175
+
176
+ .brand-mark { position: relative; width: 28px; height: 28px; display: block; flex: 0 0 auto; }
177
+ .brand-mark i { position: absolute; display: block; width: 10px; height: 10px; border: 2px solid var(--accent); border-radius: 50%; }
178
+ .brand-mark i:nth-child(1) { left: 0; top: 9px; }
179
+ .brand-mark i:nth-child(2) { right: 0; top: 1px; }
180
+ .brand-mark i:nth-child(3) { right: 0; bottom: 0; }
181
+ .brand-mark::before,
182
+ .brand-mark::after { content: ""; position: absolute; left: 8px; width: 12px; height: 1.5px; background: var(--accent); transform-origin: left; }
183
+ .brand-mark::before { top: 13px; transform: rotate(-32deg); }
184
+ .brand-mark::after { top: 15px; transform: rotate(32deg); }
185
+
186
+ .connection-badge {
187
+ display: inline-flex;
188
+ align-items: center;
189
+ gap: 7px;
190
+ padding: 7px 10px;
191
+ border: 1px solid var(--border);
192
+ border-radius: 999px;
193
+ color: var(--muted);
194
+ font: 700 11.5px/1 var(--font-mono);
195
+ letter-spacing: 0.06em;
196
+ }
197
+ .connection-badge i { width: 7px; height: 7px; border-radius: 50%; background: var(--faint); }
198
+ .connection-badge.connected { color: var(--accent); border-color: color-mix(in srgb, var(--accent) 42%, var(--border)); background: var(--accent-soft); }
199
+ .connection-badge.connected i { background: var(--accent); box-shadow: 0 0 9px var(--accent); }
200
+ .connection-badge.connecting { color: var(--amber); border-color: color-mix(in srgb, var(--amber) 42%, var(--border)); }
201
+ .connection-badge.connecting i { background: var(--amber); }
202
+
203
+ .topbar-metrics { display: flex; align-items: stretch; margin-right: 3px; }
204
+ .topbar-metrics > span { min-width: 70px; padding: 2px 11px; border-left: 1px solid var(--border-soft); }
205
+ .topbar-metrics small { display: block; color: var(--faint); font-size: 11.5px; line-height: 1; }
206
+ .topbar-metrics b { display: block; margin-top: 6px; font: 650 13px/1 var(--font-mono); font-variant-numeric: tabular-nums; }
207
+
208
+ .icon-button,
209
+ .quiet-icon-button,
210
+ .quiet-text-button,
211
+ .ghost-button,
212
+ .danger-ghost-button,
213
+ .secondary-button,
214
+ .primary-button {
215
+ min-height: 36px;
216
+ border: 1px solid var(--border);
217
+ border-radius: var(--radius-sm);
218
+ cursor: pointer;
219
+ transition:
220
+ color 160ms var(--motion-out),
221
+ border-color 160ms var(--motion-out),
222
+ background-color 160ms var(--motion-out),
223
+ transform 160ms var(--motion-out),
224
+ box-shadow 160ms var(--motion-out);
225
+ }
226
+ .icon-button:hover,
227
+ .ghost-button:hover,
228
+ .secondary-button:hover { color: var(--text); border-color: var(--border-strong); background: var(--surface-hover); }
229
+ .icon-button:active,
230
+ .ghost-button:active,
231
+ .secondary-button:active,
232
+ .primary-button:active { transform: translateY(1px); }
233
+ .icon-button { width: 36px; padding: 0; display: grid; place-items: center; background: var(--surface-raised); color: var(--muted); }
234
+ .icon-button svg,
235
+ .wide-button svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }
236
+ .theme-icon.moon { display: none; }
237
+ :root[data-theme="light"] .theme-icon.sun { display: none; }
238
+ :root[data-theme="light"] .theme-icon.moon { display: block; }
239
+ .quiet-icon-button { width: 34px; padding: 0; border-color: transparent; background: transparent; color: var(--muted); font-size: 24px; line-height: 1; }
240
+ .quiet-icon-button:hover { color: var(--text); background: var(--surface-hover); }
241
+ .quiet-text-button { min-height: 32px; padding: 0 10px; border-color: transparent; background: transparent; color: var(--accent); font-size: 12.5px; }
242
+ .ghost-button,
243
+ .danger-ghost-button { padding: 7px 12px; background: transparent; color: var(--muted); font-size: 13px; }
244
+ .danger-ghost-button { border-color: color-mix(in srgb, var(--red) 35%, var(--border)); color: var(--red); }
245
+ .danger-ghost-button:hover { border-color: var(--red); background: var(--red-soft); }
246
+ .secondary-button { padding: 8px 13px; background: var(--surface-raised); color: var(--text); font-size: 13.5px; }
247
+ .primary-button { padding: 9px 16px; color: var(--accent-ink); border-color: var(--accent); background: var(--accent); font-size: 13.5px; font-weight: 730; box-shadow: 0 7px 20px color-mix(in srgb, var(--accent) 12%, transparent); }
248
+ .primary-button:hover { border-color: var(--accent-strong); background: var(--accent-strong); box-shadow: 0 9px 24px color-mix(in srgb, var(--accent) 18%, transparent); }
249
+ .wide-button { width: 100%; display: flex; align-items: center; justify-content: center; gap: 8px; }
250
+ kbd { margin-left: 8px; padding: 2px 5px; border-radius: 4px; color: color-mix(in srgb, var(--accent-ink) 76%, transparent); background: color-mix(in srgb, var(--accent-ink) 11%, transparent); font: 650 11.5px/1 var(--font-mono); }
251
+
252
+ .connection-banner { display: none; align-items: center; justify-content: center; gap: 9px; min-height: 38px; padding: 8px 13px; border: 1px solid color-mix(in srgb, var(--amber) 42%, var(--border)); border-radius: var(--radius-md); background: var(--amber-soft); color: var(--amber); font-size: 13.5px; }
253
+ .connection-banner.visible { display: flex; }
254
+ .spinner { width: 12px; height: 12px; border: 2px solid color-mix(in srgb, var(--amber) 22%, transparent); border-top-color: var(--amber); border-radius: 50%; animation: spin 900ms cubic-bezier(0.5, 0, 0.5, 1) infinite; }
255
+
256
+ .workspace-grid {
257
+ position: relative;
258
+ min-height: 0;
259
+ display: grid;
260
+ grid-template-columns: clamp(228px, 14vw, 264px) minmax(520px, 1fr) clamp(320px, 20vw, 378px);
261
+ gap: 8px;
262
+ }
263
+ :root[data-navigation="closed"] .workspace-grid { grid-template-columns: minmax(520px, 1fr) clamp(320px, 20vw, 378px); }
264
+ :root[data-inspector="closed"] .workspace-grid { grid-template-columns: clamp(228px, 14vw, 264px) minmax(520px, 1fr); }
265
+ :root[data-navigation="closed"][data-inspector="closed"] .workspace-grid { grid-template-columns: minmax(0, 1fr); }
266
+ :root[data-navigation="closed"] .left-rail,
267
+ :root[data-inspector="closed"] .right-rail { display: none; }
268
+
269
+ .panel { min-width: 0; min-height: 0; overflow: hidden; border: 1px solid var(--border); border-radius: var(--radius-lg); background: color-mix(in srgb, var(--surface) 98%, transparent); box-shadow: var(--shadow-soft); animation: surface-enter 520ms var(--motion-out) both; }
270
+ .left-rail { display: flex; flex-direction: column; animation-delay: 40ms; }
271
+ .conversation { animation-delay: 80ms; }
272
+ .right-rail { animation-delay: 120ms; }
273
+
274
+ .panel-header,
275
+ .inspector-header { padding: 20px; border-bottom: 1px solid var(--border-soft); }
276
+ .navigation-header .section-heading { margin-bottom: 8px; }
277
+ .panel-header p,
278
+ .section-description { margin: 0; color: var(--muted); font-size: 12.5px; line-height: 1.55; }
279
+ .section-description code { color: var(--text-soft); font: 12px var(--font-mono); }
280
+ .section-heading { display: flex; align-items: center; justify-content: space-between; margin-bottom: 16px; }
281
+ .section-heading h2,
282
+ .inspector-header h2 { margin: 5px 0 0; font-size: 16px; line-height: 1.2; font-weight: 700; letter-spacing: -0.02em; }
283
+ .eyebrow { color: var(--accent); font: 700 11.5px/1 var(--font-mono); letter-spacing: 0.1em; }
284
+ .eyebrow.warning { color: var(--amber); }
285
+ .count-pill { min-width: 27px; padding: 5px 7px; text-align: center; border: 1px solid var(--border); border-radius: 999px; color: var(--muted); font: 650 11.5px/1 var(--font-mono); font-variant-numeric: tabular-nums; }
286
+ .muted { color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
287
+
288
+ .sessions-section { min-height: 0; flex: 1 1 auto; overflow: auto; padding: 12px; }
289
+ .session-list { display: flex; flex-direction: column; gap: 6px; }
290
+ .session-item { width: 100%; min-height: 54px; display: grid; grid-template-columns: 9px minmax(0, 1fr) auto; align-items: center; gap: 10px; padding: 10px; text-align: left; border: 1px solid transparent; border-radius: var(--radius-md); background: transparent; cursor: pointer; }
291
+ .session-item:hover { background: var(--surface-hover); }
292
+ .session-item.selected { border-color: color-mix(in srgb, var(--accent) 36%, var(--border)); background: var(--surface-selected); }
293
+ .session-item .node-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--faint); }
294
+ .session-item.running .node-dot { background: var(--accent); box-shadow: 0 0 8px color-mix(in srgb, var(--accent) 70%, transparent); }
295
+ .session-item.failed .node-dot { background: var(--red); }
296
+ .session-item .session-copy { min-width: 0; }
297
+ .session-item strong,
298
+ .session-item small { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
299
+ .session-item strong { font-size: 14px; font-weight: 690; }
300
+ .session-item small { margin-top: 4px; color: var(--muted); font-size: 12px; }
301
+ .session-item .depth-mark { color: var(--faint); font: 11.5px/1 var(--font-mono); }
302
+
303
+ .navigation-actions { flex: 0 0 auto; display: flex; flex-direction: column; gap: 8px; padding: 12px; border-top: 1px solid var(--border-soft); }
304
+ .inline-editor { padding: 13px; border: 1px solid var(--border); border-radius: var(--radius-md); background: var(--surface-soft); box-shadow: var(--shadow-soft); }
305
+ .inline-editor-heading { display: flex; align-items: flex-start; justify-content: space-between; margin-bottom: 12px; }
306
+ .inline-editor-heading h3 { margin: 5px 0 0; font-size: 14px; }
307
+ .compact-form { display: flex; flex-direction: column; gap: 9px; }
308
+ .compact-form label,
309
+ .settings-form label > span:first-child { color: var(--muted); font-size: 12.5px; }
310
+ textarea,
311
+ input,
312
+ select { color: var(--text); border: 1px solid var(--border); background-color: var(--surface-input); }
313
+ textarea,
314
+ input { width: 100%; border-radius: var(--radius-sm); padding: 10px 11px; resize: none; font-size: 14px; line-height: 1.5; }
315
+ textarea::placeholder,
316
+ input::placeholder { color: var(--faint); }
317
+ select { min-height: 40px; border-radius: var(--radius-sm); padding: 7px 34px 7px 10px; font-size: 13.5px; }
318
+ .inline-form > div { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 8px; }
319
+ .child-controls { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
320
+ .rail-footer { padding: 4px 3px 0; color: var(--faint); font: 11.5px/1.55 var(--font-mono); }
321
+ .rail-footer span { display: block; }
322
+
323
+ .conversation { display: grid; grid-template-rows: 76px minmax(0, 1fr) auto; overflow: hidden; }
324
+ .conversation-header { display: flex; align-items: center; justify-content: space-between; gap: 20px; padding: 0 24px; border-bottom: 1px solid var(--border-soft); }
325
+ .conversation-header h2 { max-width: min(70%, 780px); margin: 5px 0 0; overflow: hidden; color: var(--text); font-size: clamp(22px, 1.45vw, 28px); line-height: 1.08; font-weight: 740; letter-spacing: -0.04em; text-overflow: ellipsis; white-space: nowrap; }
326
+ .session-health { justify-content: flex-end; gap: 11px; max-width: 45%; }
327
+ .status-chip { padding: 6px 8px; border: 1px solid var(--border); border-radius: 7px; color: var(--muted); font: 700 11.5px/1 var(--font-mono); letter-spacing: 0.05em; }
328
+ .status-chip.running { border-color: color-mix(in srgb, var(--accent) 40%, var(--border)); color: var(--accent); background: var(--accent-soft); }
329
+ .status-chip.failed { border-color: color-mix(in srgb, var(--red) 40%, var(--border)); color: var(--red); background: var(--red-soft); }
330
+
331
+ .transcript { min-height: 0; overflow: auto; padding: 34px clamp(28px, 5vw, 84px) 44px; scroll-behavior: smooth; scroll-padding-block: 24px; }
332
+ .empty-transcript { min-height: 100%; display: grid; place-items: center; color: var(--muted); text-align: center; }
333
+ .empty-transcript strong { display: block; margin-bottom: 8px; color: var(--text); font-size: 20px; font-weight: 690; letter-spacing: -0.025em; }
334
+ .empty-transcript span { font-size: 14.5px; }
335
+ .message { max-width: 980px; margin: 0 auto 32px; }
336
+ .message-meta { display: flex; align-items: center; gap: 9px; margin-bottom: 11px; color: var(--muted); font: 650 11.5px/1 var(--font-mono); text-transform: uppercase; letter-spacing: 0.06em; }
337
+ .message-meta .role-dot { width: 7px; height: 7px; border-radius: 2px; background: var(--faint); }
338
+ .message.user .role-dot { background: var(--blue); }
339
+ .message.assistant .role-dot,
340
+ .message.streaming .role-dot { background: var(--accent); }
341
+ .message.tool .role-dot { background: var(--amber); }
342
+ .message-body { color: var(--text-soft); font-size: 15.5px; line-height: 1.72; overflow-wrap: anywhere; white-space: pre-wrap; }
343
+ .message.user .message-body { padding: 14px 16px; border: 1px solid color-mix(in srgb, var(--blue) 24%, var(--border)); border-radius: var(--radius-md); background: color-mix(in srgb, var(--blue) 5%, var(--surface-soft)); }
344
+ .message pre,
345
+ .activity-detail,
346
+ .approval-command { max-width: 100%; overflow: auto; padding: 14px; border: 1px solid var(--border); border-radius: var(--radius-sm); background: var(--surface-soft); color: var(--text-soft); font: 12.5px/1.65 var(--font-mono); white-space: pre; tab-size: 2; }
347
+ .message details { border: 1px solid var(--border); border-radius: var(--radius-md); background: var(--surface-soft); }
348
+ .message details summary { padding: 12px 14px; cursor: pointer; color: var(--amber); font-size: 13px; }
349
+ .message details pre { margin: 0; border-width: 1px 0 0; border-radius: 0 0 var(--radius-md) var(--radius-md); max-height: 360px; }
350
+ .stream-cursor { display: inline-block; width: 7px; height: 16px; margin-left: 4px; vertical-align: -2px; background: var(--accent); animation: blink 1s step-end infinite; }
351
+
352
+ .composer-wrap { position: relative; padding: 0 20px 18px; background: linear-gradient(180deg, transparent, var(--surface) 18%); }
353
+ .notice-line { height: 28px; padding: 6px 3px 0; color: var(--muted); font-size: 12px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
354
+ .composer { border: 1px solid var(--border-strong); border-radius: 14px; background: var(--surface-input); box-shadow: var(--shadow-soft); }
355
+ .composer:focus-within { border-color: color-mix(in srgb, var(--accent) 58%, var(--border)); box-shadow: 0 0 0 2px var(--accent-soft), var(--shadow-soft); }
356
+ .composer textarea { min-height: 66px; max-height: 180px; border: 0; border-radius: 14px 14px 0 0; background: transparent; padding: 13px 15px; font-size: 15px; line-height: 1.55; }
357
+ .composer textarea:focus-visible { outline-offset: -3px; }
358
+ .composer-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 8px; border-top: 1px solid var(--border-soft); }
359
+ .mode-select { display: flex; align-items: center; gap: 8px; color: var(--muted); font-size: 12px; }
360
+ .mode-select select { min-height: 34px; padding-block: 5px; font-size: 13px; }
361
+ .composer-actions { gap: 7px; }
362
+
363
+ .right-rail { display: grid; grid-template-rows: auto auto minmax(0, 1fr); }
364
+ .inspector-header { display: flex; align-items: center; justify-content: space-between; padding: 18px 20px 15px; }
365
+ .inspector-tabs { display: grid; grid-template-columns: repeat(4, 1fr); padding: 8px 10px; border-bottom: 1px solid var(--border-soft); }
366
+ .inspector-tab { min-height: 38px; padding: 0 4px; border: 0; border-radius: 7px; color: var(--muted); background: transparent; cursor: pointer; font-size: 12.5px; }
367
+ .inspector-tab:hover { color: var(--text); background: var(--surface-hover); }
368
+ .inspector-tab.selected { color: var(--text); background: var(--surface-raised); box-shadow: inset 0 0 0 1px var(--border); }
369
+ .inspector-content { min-height: 0; overflow: auto; }
370
+ .inspector-view { padding: 20px; }
371
+ .subsection-heading { display: flex; align-items: center; gap: 10px; margin: 22px 0 10px; color: var(--muted); font-size: 12px; }
372
+ .subsection-heading::after { content: ""; height: 1px; flex: 1; background: var(--border-soft); }
373
+ .section-description { margin: -4px 0 16px; }
374
+
375
+ .activity-list,
376
+ .dense-list { display: flex; flex-direction: column; gap: 9px; }
377
+ .activity-card,
378
+ .dense-item { padding: 11px 12px; border: 1px solid var(--border-soft); border-radius: var(--radius-md); background: var(--surface-soft); min-width: 0; }
379
+ .activity-card header,
380
+ .dense-item header { display: flex; align-items: center; justify-content: space-between; gap: 9px; }
381
+ .activity-card b,
382
+ .dense-item b { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13.5px; font-weight: 670; }
383
+ .activity-card time,
384
+ .dense-item small { color: var(--faint); font: 11.5px/1 var(--font-mono); white-space: nowrap; font-variant-numeric: tabular-nums; }
385
+ .activity-card p,
386
+ .dense-item p { margin: 7px 0 0; color: var(--muted); font-size: 12.5px; line-height: 1.5; overflow-wrap: anywhere; }
387
+ .activity-card details { margin-top: 8px; }
388
+ .activity-card summary { color: var(--muted); cursor: pointer; font-size: 12px; }
389
+ .activity-detail { max-height: 230px; margin: 8px 0 0; font-size: 11.5px; }
390
+ .dense-item .item-actions { display: flex; gap: 7px; margin-top: 10px; }
391
+ .dense-item .item-actions button { flex: 1; min-height: 34px; padding: 5px 8px; }
392
+ .state-dot { display: inline-block; width: 6px; height: 6px; margin-right: 7px; border-radius: 50%; background: var(--faint); }
393
+ .state-dot.ready,
394
+ .state-dot.active,
395
+ .state-dot.succeeded { background: var(--accent); }
396
+ .state-dot.running,
397
+ .state-dot.connecting,
398
+ .state-dot.starting { background: var(--amber); }
399
+ .state-dot.failed,
400
+ .state-dot.degraded,
401
+ .state-dot.blocked { background: var(--red); }
402
+ .empty-list { padding: 10px 0; color: var(--faint); font-size: 12.5px; }
403
+ .inspection-result { margin-top: 14px; padding: 12px; border: 1px solid var(--border); border-radius: var(--radius-md); background: var(--surface-soft); color: var(--muted); font-size: 12.5px; overflow-wrap: anywhere; }
404
+ .inspection-result b { display: block; color: var(--text); margin-bottom: 6px; font-size: 13.5px; }
405
+ .inspection-result p { line-height: 1.5; }
406
+ .inspection-result code { display: block; color: var(--accent); font: 11.5px/1.5 var(--font-mono); }
407
+ .inspection-result button { width: 100%; margin-top: 10px; }
408
+
409
+ .settings-overlay,
410
+ .approval-overlay { position: fixed; inset: 0; z-index: 50; display: grid; place-items: center; padding: 28px; background: var(--overlay); backdrop-filter: blur(12px); overscroll-behavior: contain; }
411
+ .settings-dialog { width: min(680px, 100%); max-height: calc(100vh - 56px); overflow: auto; border: 1px solid var(--border-strong); border-radius: 20px; background: var(--surface); box-shadow: var(--shadow); animation: dialog-enter 260ms var(--motion-out) both; }
412
+ .settings-header { position: sticky; top: 0; z-index: 1; display: flex; align-items: flex-start; justify-content: space-between; padding: 25px 28px 20px; border-bottom: 1px solid var(--border-soft); background: color-mix(in srgb, var(--surface) 96%, transparent); backdrop-filter: blur(14px); }
413
+ .settings-header h2 { margin: 7px 0 5px; color: var(--text); font-size: 27px; line-height: 1.1; letter-spacing: -0.04em; }
414
+ .settings-header p { margin: 0; color: var(--muted); font-size: 13.5px; }
415
+ .settings-form { display: flex; flex-direction: column; }
416
+ .settings-section { padding: 22px 28px; border-bottom: 1px solid var(--border-soft); }
417
+ .settings-section-title { display: grid; grid-template-columns: 32px minmax(0, 1fr); gap: 12px; margin-bottom: 17px; }
418
+ .settings-section-title > span { color: var(--accent); font: 700 12px/1.4 var(--font-mono); }
419
+ .settings-section-title h3 { margin: 0 0 4px; color: var(--text); font-size: 16px; }
420
+ .settings-section-title p { margin: 0; color: var(--muted); font-size: 12.5px; line-height: 1.5; }
421
+ .settings-field-note { margin: 12px 0 0; color: var(--muted); font-size: 12.5px; line-height: 1.55; }
422
+ .settings-section > label:not(.checkbox-field),
423
+ .field-grid > label { display: flex; flex-direction: column; gap: 7px; }
424
+ .settings-section > label + .field-grid,
425
+ .settings-section > .field-grid + label,
426
+ .settings-section > label + label { margin-top: 14px; }
427
+ .field-grid { display: grid; gap: 12px; }
428
+ .field-grid.two-columns { grid-template-columns: repeat(2, minmax(0, 1fr)); }
429
+ .settings-form input,
430
+ .settings-form select { min-height: 42px; font-size: 14px; }
431
+ .checkbox-field { display: flex; align-items: flex-start; gap: 11px; padding: 11px 12px; border: 1px solid var(--border-soft); border-radius: var(--radius-md); background: var(--surface-soft); cursor: pointer; }
432
+ .checkbox-field input { width: 16px; min-height: 16px; margin: 2px 0 0; accent-color: var(--accent); }
433
+ .checkbox-field span { display: block; min-width: 0; }
434
+ .checkbox-field b,
435
+ .checkbox-field small { display: block; }
436
+ .checkbox-field b { color: var(--text); font-size: 13.5px; font-weight: 650; }
437
+ .checkbox-field small { margin-top: 3px; color: var(--muted); font-size: 12px; line-height: 1.4; }
438
+ .checkbox-field.destructive:has(input:checked) { border-color: color-mix(in srgb, var(--red) 45%, var(--border)); background: var(--red-soft); }
439
+ .secret-input { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; border: 1px solid var(--border); border-radius: var(--radius-sm); background: var(--surface-input); }
440
+ .secret-input:focus-within { outline: 2px solid var(--accent); outline-offset: 2px; }
441
+ .secret-input input { border: 0; background: transparent; }
442
+ .secret-input input:focus-visible { outline: 0; }
443
+ .settings-footer { position: sticky; bottom: 0; display: flex; align-items: center; justify-content: space-between; gap: 18px; padding: 16px 28px; background: color-mix(in srgb, var(--surface) 96%, transparent); backdrop-filter: blur(14px); }
444
+ .settings-footer p { min-width: 0; margin: 0; color: var(--muted); font-size: 12.5px; line-height: 1.4; }
445
+ .settings-footer > div { flex: 0 0 auto; gap: 8px; }
446
+
447
+ .approval-dialog { width: min(590px, 100%); max-height: calc(100vh - 64px); overflow: auto; padding: 30px; border: 1px solid color-mix(in srgb, var(--amber) 48%, var(--border)); border-radius: var(--radius-lg); background: var(--surface); box-shadow: var(--shadow), 0 0 50px var(--amber-soft); }
448
+ .approval-icon { float: right; display: grid; place-items: center; width: 42px; height: 42px; border: 1px solid color-mix(in srgb, var(--amber) 52%, var(--border)); border-radius: 50%; color: var(--amber); font: 750 20px/1 var(--font-mono); }
449
+ .approval-dialog h2 { margin: 9px 0; font-size: 24px; line-height: 1.2; letter-spacing: -0.03em; }
450
+ .approval-dialog > p { margin: 0 0 20px; color: var(--text-soft); font-size: 14.5px; line-height: 1.6; }
451
+ .approval-details { display: grid; grid-template-columns: 1fr; gap: 1px; overflow: hidden; border: 1px solid var(--border); border-radius: var(--radius-md); }
452
+ .approval-details div { display: grid; grid-template-columns: 94px minmax(0, 1fr); padding: 11px; background: var(--surface-soft); }
453
+ .approval-details dt { color: var(--muted); font-size: 12px; }
454
+ .approval-details dd { margin: 0; overflow-wrap: anywhere; font: 12.5px/1.5 var(--font-mono); }
455
+ .approval-command { margin: 13px 0 0; max-height: 200px; border-color: color-mix(in srgb, var(--amber) 30%, var(--border)); }
456
+ .approval-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; margin-top: 22px; }
457
+ .approval-actions button { padding: 9px 13px; }
458
+
459
+ ::-webkit-scrollbar { width: 10px; height: 10px; }
460
+ ::-webkit-scrollbar-track { background: transparent; }
461
+ ::-webkit-scrollbar-thumb { border: 3px solid transparent; border-radius: 999px; background: color-mix(in srgb, var(--muted) 42%, transparent); background-clip: padding-box; }
462
+ ::-webkit-scrollbar-thumb:hover { background: color-mix(in srgb, var(--muted) 65%, transparent); background-clip: padding-box; }
463
+
464
+ @keyframes surface-enter {
465
+ from { opacity: 0; transform: translateY(7px); }
466
+ to { opacity: 1; transform: translateY(0); }
467
+ }
468
+ @keyframes dialog-enter {
469
+ from { opacity: 0; transform: translateY(12px) scale(0.985); }
470
+ to { opacity: 1; transform: translateY(0) scale(1); }
471
+ }
472
+ @keyframes spin { to { transform: rotate(360deg); } }
473
+ @keyframes blink { 50% { opacity: 0; } }
474
+
475
+ @media (max-width: 1480px) {
476
+ .workspace-grid { grid-template-columns: 236px minmax(500px, 1fr) 340px; }
477
+ :root[data-navigation="closed"] .workspace-grid { grid-template-columns: minmax(500px, 1fr) 340px; }
478
+ :root[data-inspector="closed"] .workspace-grid { grid-template-columns: 236px minmax(500px, 1fr); }
479
+ .topbar { grid-template-columns: minmax(240px, 1fr) auto minmax(390px, 1fr); }
480
+ .topbar-metrics > span { min-width: 63px; padding-inline: 9px; }
481
+ .transcript { padding-inline: clamp(26px, 4vw, 60px); }
482
+ }
483
+
484
+ @media (max-width: 1320px) {
485
+ .workspace-grid,
486
+ :root[data-inspector="closed"] .workspace-grid { grid-template-columns: 236px minmax(0, 1fr); }
487
+ :root[data-navigation="closed"] .workspace-grid,
488
+ :root[data-navigation="closed"][data-inspector="closed"] .workspace-grid { grid-template-columns: minmax(0, 1fr); }
489
+ :root[data-inspector="open"] .right-rail {
490
+ position: absolute;
491
+ z-index: 12;
492
+ inset-block: 0;
493
+ right: 0;
494
+ display: grid;
495
+ width: min(380px, calc(100% - 54px));
496
+ box-shadow: var(--shadow);
497
+ }
498
+ .runtime-status .muted { display: none; }
499
+ .topbar { grid-template-columns: 1fr auto auto; }
500
+ }
501
+
502
+ @media (max-width: 1160px) {
503
+ .topbar-metrics { display: none; }
504
+ .workspace-grid,
505
+ :root[data-inspector="closed"] .workspace-grid,
506
+ :root[data-navigation="closed"] .workspace-grid { grid-template-columns: minmax(0, 1fr); }
507
+ :root[data-navigation="open"] .left-rail {
508
+ position: absolute;
509
+ z-index: 11;
510
+ inset-block: 0;
511
+ left: 0;
512
+ display: flex;
513
+ width: min(280px, calc(100% - 54px));
514
+ box-shadow: var(--shadow);
515
+ }
516
+ .conversation-header { padding-inline: 20px; }
517
+ }
518
+
519
+ @media (max-height: 780px) {
520
+ .app-shell { grid-template-rows: 58px auto minmax(0, 1fr); }
521
+ .conversation { grid-template-rows: 66px minmax(0, 1fr) auto; }
522
+ .transcript { padding-block: 22px 30px; }
523
+ .message { margin-bottom: 24px; }
524
+ .composer-wrap { padding: 0 14px 12px; }
525
+ .composer textarea { min-height: 52px; }
526
+ .panel-header { padding-block: 16px; }
527
+ .settings-section { padding-block: 17px; }
528
+ .settings-section-title { margin-bottom: 13px; }
529
+ }
530
+
531
+ @media (prefers-reduced-motion: reduce) {
532
+ *,
533
+ *::before,
534
+ *::after {
535
+ scroll-behavior: auto !important;
536
+ animation-duration: 0.01ms !important;
537
+ animation-iteration-count: 1 !important;
538
+ transition-duration: 0.01ms !important;
539
+ }
540
+ }
@@ -0,0 +1,5 @@
1
+ import type { BrowserWindowConstructorOptions } from "electron";
2
+ export declare const DESKTOP_CSP: string;
3
+ export declare function desktopWindowOptions(preloadPath: string): BrowserWindowConstructorOptions;
4
+ export declare function isTrustedRendererUrl(candidate: string, rendererUrl: string): boolean;
5
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/desktop/security.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,+BAA+B,EAAE,MAAM,UAAU,CAAC;AAEhE,eAAO,MAAM,WAAW,QAWZ,CAAC;AAEb,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,+BAA+B,CAyBzF;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAQpF"}
@@ -0,0 +1,49 @@
1
+ export const DESKTOP_CSP = [
2
+ "default-src 'none'",
3
+ "script-src 'self'",
4
+ "style-src 'self'",
5
+ "img-src 'self' data:",
6
+ "font-src 'self'",
7
+ "connect-src 'none'",
8
+ "object-src 'none'",
9
+ "base-uri 'none'",
10
+ "form-action 'none'",
11
+ "frame-src 'none'",
12
+ ].join("; ");
13
+ export function desktopWindowOptions(preloadPath) {
14
+ return {
15
+ width: 1_920,
16
+ height: 1_080,
17
+ minWidth: 1_180,
18
+ minHeight: 720,
19
+ useContentSize: true,
20
+ show: false,
21
+ backgroundColor: "#0b0d0c",
22
+ title: "pSpore",
23
+ autoHideMenuBar: true,
24
+ webPreferences: {
25
+ preload: preloadPath,
26
+ contextIsolation: true,
27
+ sandbox: true,
28
+ nodeIntegration: false,
29
+ nodeIntegrationInWorker: false,
30
+ nodeIntegrationInSubFrames: false,
31
+ webSecurity: true,
32
+ allowRunningInsecureContent: false,
33
+ webviewTag: false,
34
+ spellcheck: false,
35
+ navigateOnDragDrop: false,
36
+ },
37
+ };
38
+ }
39
+ export function isTrustedRendererUrl(candidate, rendererUrl) {
40
+ try {
41
+ const actual = new URL(candidate);
42
+ const expected = new URL(rendererUrl);
43
+ return actual.protocol === "file:" && actual.href === expected.href;
44
+ }
45
+ catch {
46
+ return false;
47
+ }
48
+ }
49
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/desktop/security.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,oBAAoB;IACpB,mBAAmB;IACnB,kBAAkB;IAClB,sBAAsB;IACtB,iBAAiB;IACjB,oBAAoB;IACpB,mBAAmB;IACnB,iBAAiB;IACjB,oBAAoB;IACpB,kBAAkB;CACnB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEb,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,OAAO;QACL,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,KAAK;QACf,SAAS,EAAE,GAAG;QACd,cAAc,EAAE,IAAI;QACpB,IAAI,EAAE,KAAK;QACX,eAAe,EAAE,SAAS;QAC1B,KAAK,EAAE,QAAQ;QACf,eAAe,EAAE,IAAI;QACrB,cAAc,EAAE;YACd,OAAO,EAAE,WAAW;YACpB,gBAAgB,EAAE,IAAI;YACtB,OAAO,EAAE,IAAI;YACb,eAAe,EAAE,KAAK;YACtB,uBAAuB,EAAE,KAAK;YAC9B,0BAA0B,EAAE,KAAK;YACjC,WAAW,EAAE,IAAI;YACjB,2BAA2B,EAAE,KAAK;YAClC,UAAU,EAAE,KAAK;YACjB,UAAU,EAAE,KAAK;YACjB,kBAAkB,EAAE,KAAK;SAC1B;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,SAAiB,EAAE,WAAmB;IACzE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;QACtC,OAAO,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type KernelState } from "../kernel/state.js";
2
+ export declare function createDesktopSmokeState(base: KernelState | null, includeApproval: boolean): KernelState;
3
+ //# sourceMappingURL=smoke-fixture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"smoke-fixture.d.ts","sourceRoot":"","sources":["../../src/desktop/smoke-fixture.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAK1E,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,EAAE,eAAe,EAAE,OAAO,GAAG,WAAW,CA8MvG"}