volute 0.33.0 → 0.35.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 (255) hide show
  1. package/README.md +7 -6
  2. package/dist/accept-ZBDVVCEU.js +42 -0
  3. package/dist/activity-events-ZW4SDL2C.js +15 -0
  4. package/dist/{ai-service-SBY2WG7O.js → ai-service-LURBEDDB.js} +6 -6
  5. package/dist/{api-client-YPKOZP2O.js → api-client-3A77HMH7.js} +2 -2
  6. package/dist/api.d.ts +1 -5195
  7. package/dist/{archive-INXYFVCW.js → archive-ESU2FUN4.js} +4 -4
  8. package/dist/{auth-GKCDSO4T.js → auth-WX4TESEI.js} +6 -6
  9. package/dist/bridge-PXIO6PS2.js +206 -0
  10. package/dist/chat-QXAJF3FU.js +51 -0
  11. package/dist/{chunk-NNB4WIG7.js → chunk-2TGZJFAT.js} +3 -3
  12. package/dist/{chunk-6LXAAQ43.js → chunk-33ODGMFZ.js} +1 -1
  13. package/dist/{chunk-RPZZSXV3.js → chunk-5N7Y5WAM.js} +21 -2
  14. package/dist/chunk-5T5YMX6S.js +23 -0
  15. package/dist/{chunk-7J3HEVR7.js → chunk-5XJYUFZH.js} +28 -16
  16. package/dist/chunk-7KJOFUNN.js +22 -0
  17. package/dist/{chunk-2NGTS5UU.js → chunk-A2ZLHBHG.js} +2 -2
  18. package/dist/{chunk-KIEPMIM5.js → chunk-AN2W47GW.js} +2 -2
  19. package/dist/{chunk-G53F3JA4.js → chunk-AOB6GVRM.js} +1 -1
  20. package/dist/{chunk-LRCG2JLP.js → chunk-BDYXIWA5.js} +9 -5
  21. package/dist/{chunk-YUIHSKR6.js → chunk-BKF4WQCY.js} +2 -2
  22. package/dist/{chunk-N432I7QH.js → chunk-BMZQYACC.js} +2 -2
  23. package/dist/{chunk-NAOW2CLO.js → chunk-BTY4WNFE.js} +1 -1
  24. package/dist/{chunk-ALEF47VT.js → chunk-BV65KRHM.js} +2 -2
  25. package/dist/{chunk-KVK2DLWI.js → chunk-CORXD635.js} +4 -4
  26. package/dist/{chunk-PVY5W6QN.js → chunk-F7ZNLYKZ.js} +2 -2
  27. package/dist/{chunk-QTUVYI7W.js → chunk-FT5KETXZ.js} +3 -3
  28. package/dist/{chunk-C7I35G4R.js → chunk-IJHIXLVN.js} +44 -8
  29. package/dist/{chunk-JUKK7FPS.js → chunk-J6CJQDWI.js} +37 -28
  30. package/dist/{chunk-4RQBJWQX.js → chunk-LOPXTW6H.js} +1 -1
  31. package/dist/{chunk-RSX4OPZY.js → chunk-MDJGMOSD.js} +8 -137
  32. package/dist/{chunk-LOEJ4HPQ.js → chunk-N446KRP7.js} +3 -3
  33. package/dist/{chunk-I5KY25PQ.js → chunk-N5LMGYXX.js} +2 -2
  34. package/dist/{chunk-G6BSYHPK.js → chunk-NJK5SDGR.js} +1 -1
  35. package/dist/{chunk-D424ZQGI.js → chunk-O7IGP7ZW.js} +11 -3
  36. package/dist/{chunk-M7UL5S3Q.js → chunk-OTC67N2Z.js} +2 -2
  37. package/dist/{chunk-GY5HBI7A.js → chunk-PWQ2ITYG.js} +4 -4
  38. package/dist/{chunk-KTLFDYPT.js → chunk-QCH6K235.js} +1 -1
  39. package/dist/chunk-QHG4OMZL.js +145 -0
  40. package/dist/{chunk-SKLSMHXO.js → chunk-QWTR6AWZ.js} +3 -3
  41. package/dist/chunk-TXSA4Q3V.js +116 -0
  42. package/dist/{chunk-VH33ZWMW.js → chunk-VHJRZM2S.js} +2 -2
  43. package/dist/{chunk-SSI47XP2.js → chunk-VHWGEJ4V.js} +1 -1
  44. package/dist/chunk-VY3RB2V7.js +164 -0
  45. package/dist/chunk-WJPROOU5.js +8314 -0
  46. package/dist/{chunk-RVGLDGMI.js → chunk-WZRZFFCL.js} +25 -27
  47. package/dist/{chunk-JYVGHWEJ.js → chunk-XRQSAMX2.js} +4 -4
  48. package/dist/{chunk-OYAKCAVY.js → chunk-ZSR72JB3.js} +1 -1
  49. package/dist/{chunk-UKVWJRKN.js → chunk-ZX7EAV5J.js} +17 -7
  50. package/dist/cli.js +90 -29
  51. package/dist/clock-HSEKS5AR.js +289 -0
  52. package/dist/{cloud-sync-4NWLMFVH.js → cloud-sync-6JL4C24T.js} +22 -23
  53. package/dist/config-UTS7QULS.js +76 -0
  54. package/dist/connectors/discord-bridge.js +4 -4
  55. package/dist/connectors/slack-bridge.js +4 -4
  56. package/dist/connectors/telegram-bridge.js +4 -4
  57. package/dist/{conversations-AWI5SZW2.js → conversations-2PW57WO2.js} +6 -6
  58. package/dist/create-5BPOOJAN.js +75 -0
  59. package/dist/create-UVCK2CS6.js +50 -0
  60. package/dist/daemon-client-RVIKXGFQ.js +12 -0
  61. package/dist/daemon-restart-HSZ3BCX5.js +65 -0
  62. package/dist/daemon.js +1349 -1211
  63. package/dist/db-BDMH4SZ2.js +20 -0
  64. package/dist/db-BVBJ57TU.js +9 -0
  65. package/dist/delete-L5PAVDGQ.js +42 -0
  66. package/dist/delivery-manager-H5ZVBMCQ.js +31 -0
  67. package/dist/{delivery-router-FL45JL7N.js → delivery-router-HEJSJAHQ.js} +5 -5
  68. package/dist/down-74VXM45A.js +17 -0
  69. package/dist/env-E4XHO2BI.js +223 -0
  70. package/dist/exec-PY7THYH4.js +17 -0
  71. package/dist/export-OAS6QVBN.js +113 -0
  72. package/dist/extension-D74CNM7G.js +89 -0
  73. package/dist/extensions-XDDFY72A.js +49 -0
  74. package/dist/files-CWTK6V3H.js +53 -0
  75. package/dist/import-5A3T7QV4.js +143 -0
  76. package/dist/{isolation-LLAYQYDY.js → isolation-TK5RX2WM.js} +4 -4
  77. package/dist/join-DF5XSJAC.js +67 -0
  78. package/dist/lib-DYEZMGW7.js +6588 -0
  79. package/dist/list-PDMQM7ZV.js +53 -0
  80. package/dist/login-7TE6CIZF.js +60 -0
  81. package/dist/login-GOTAYLXP.js +51 -0
  82. package/dist/logout-6KIA74EV.js +29 -0
  83. package/dist/logout-T4XS6LRU.js +50 -0
  84. package/dist/message-delivery-GRC4W6P7.js +41 -0
  85. package/dist/mind-5IEYKV7I.js +97 -0
  86. package/dist/mind-activity-tracker-QBLIV7ZJ.js +18 -0
  87. package/dist/mind-history-IE2QH7U5.js +275 -0
  88. package/dist/mind-list-GEWHWAL4.js +38 -0
  89. package/dist/mind-manager-HFLB5653.js +31 -0
  90. package/dist/mind-profile-DCBDVF5B.js +53 -0
  91. package/dist/mind-service-X2CAA6W6.js +37 -0
  92. package/dist/mind-sleep-ITCF6OQA.js +47 -0
  93. package/dist/mind-status-X4SX3YUG.js +65 -0
  94. package/dist/mind-wake-KXMKMGWX.js +42 -0
  95. package/dist/{package-U3VFO273.js → package-D2FSVFAX.js} +11 -8
  96. package/dist/read-67VRP2DO.js +91 -0
  97. package/dist/{read-stdin-HQJ7774D.js → read-stdin-3X5VYKNS.js} +2 -2
  98. package/dist/register-SB7NXCOE.js +51 -0
  99. package/dist/{registry-PJ4S5PHQ.js → registry-GBSNW3HG.js} +3 -3
  100. package/dist/reject-MUR2KWJ4.js +40 -0
  101. package/dist/restart-5EGG4JXU.js +42 -0
  102. package/dist/{sandbox-GJOK4QLQ.js → sandbox-R37VIU36.js} +6 -6
  103. package/dist/scheduler-Y7O4CJXL.js +31 -0
  104. package/dist/{schema-PA3M5ZKH.js → schema-XVZ2CLKW.js} +4 -2
  105. package/dist/{seed-QDYVLG74.js → seed-EQORWX77.js} +3 -3
  106. package/dist/seed-check-KJNTL72M.js +35 -0
  107. package/dist/seed-cmd-ZM2XGVU2.js +30 -0
  108. package/dist/seed-create-DRWGGHEI.js +113 -0
  109. package/dist/seed-sprout-JYXGXOP3.js +148 -0
  110. package/dist/send-JBJJQ7CA.js +409 -0
  111. package/dist/service-WNPCNHOX.js +121 -0
  112. package/dist/{setup-XMCBE3LF.js → setup-BJ4YAY26.js} +155 -129
  113. package/dist/{setup-TISPCO22.js → setup-RHJRFURI.js} +4 -4
  114. package/dist/skill-TAAKEYBV.js +389 -0
  115. package/dist/skills/plan-coordinator/SKILL.md +60 -0
  116. package/dist/skills/volute-mind/SKILL.md +9 -227
  117. package/dist/skills/volute-mind/references/extensions.md +34 -0
  118. package/dist/skills/volute-mind/references/integrations.md +48 -0
  119. package/dist/skills/volute-mind/references/routing.md +86 -0
  120. package/dist/skills/volute-mind/references/sleep.md +33 -0
  121. package/dist/skills/volute-mind/references/variants.md +31 -0
  122. package/dist/{skills-7FV7EJTE.js → skills-EKMCQ46K.js} +12 -8
  123. package/dist/sleep-manager-7KFK3USC.js +35 -0
  124. package/dist/spirit-ZFRDXMG7.js +23 -0
  125. package/dist/split-AWVOYOPZ.js +64 -0
  126. package/dist/{sprout-WKLZXUIQ.js → sprout-HE4TITMK.js} +3 -3
  127. package/dist/start-3UXOPXQG.js +39 -0
  128. package/dist/status-ZK34WYIM.js +125 -0
  129. package/dist/stop-3XYIBGFM.js +41 -0
  130. package/dist/system-chat-IDPHYHY4.js +35 -0
  131. package/dist/systems-O43WGQY6.js +52 -0
  132. package/dist/{tailscale-XHQBZROW.js → tailscale-ZIZ2HWJ5.js} +5 -5
  133. package/dist/template-hash-A7FNHTB7.js +9 -0
  134. package/dist/up-77ICEDEW.js +19 -0
  135. package/dist/update-ANE5ZM7F.js +225 -0
  136. package/dist/{update-check-ZD6OOIYQ.js → update-check-UV55CBEP.js} +4 -4
  137. package/dist/upgrade-ZMDGC7M2.js +74 -0
  138. package/dist/variant-QWL2WSRI.js +62 -0
  139. package/dist/{version-notify-NBI2MTJO.js → version-notify-FXSEMXWW.js} +29 -28
  140. package/dist/{volute-config-HD7WWUQC.js → volute-config-D2XVS2YI.js} +2 -2
  141. package/dist/web-assets/assets/index-BhxWKvbB.css +1 -0
  142. package/dist/web-assets/assets/index-CHVKJ9II.js +75 -0
  143. package/dist/web-assets/ext-theme.css +48 -9
  144. package/dist/web-assets/index.html +2 -2
  145. package/dist/web-assets/sw.js +117 -0
  146. package/drizzle/0005_meta_summaries.sql +15 -0
  147. package/drizzle/meta/0005_snapshot.json +7 -0
  148. package/drizzle/meta/_journal.json +7 -0
  149. package/package.json +10 -7
  150. package/packages/extensions/pages/dist/ui/assets/index-DKZLNMED.js +2 -0
  151. package/packages/extensions/pages/dist/ui/index.html +1 -1
  152. package/packages/extensions/pages/skills/pages/SKILL.md +84 -9
  153. package/packages/extensions/plan/dist/ui/assets/index-CJj2gZnZ.css +1 -0
  154. package/packages/extensions/plan/dist/ui/assets/index-FMEJmvQz.js +61 -0
  155. package/packages/extensions/plan/dist/ui/index.html +14 -0
  156. package/packages/extensions/plan/skills/plan/SKILL.md +43 -0
  157. package/packages/extensions/plan/skills/plan/scripts/plan-hook.sh +37 -0
  158. package/templates/_base/home/VOLUTE.md +12 -19
  159. package/templates/_base/src/lib/auto-commit.ts +8 -8
  160. package/templates/_base/src/lib/context-breakdown.ts +450 -0
  161. package/templates/_base/src/lib/format-prefix.ts +17 -0
  162. package/templates/_base/src/lib/hook-loader.ts +8 -2
  163. package/templates/_base/src/lib/router.ts +75 -33
  164. package/templates/_base/src/lib/routing.ts +4 -1
  165. package/templates/_base/src/lib/startup.ts +16 -8
  166. package/templates/_base/src/lib/types.ts +2 -1
  167. package/templates/_base/src/lib/volute-server.ts +75 -8
  168. package/templates/claude/.init/CLAUDE.md +4 -10
  169. package/templates/claude/package.json.tmpl +1 -0
  170. package/templates/claude/src/agent.ts +108 -33
  171. package/templates/claude/src/lib/hooks/reply-instructions.ts +27 -7
  172. package/templates/claude/src/lib/stream-consumer.ts +2 -2
  173. package/templates/claude/src/server.ts +1 -0
  174. package/templates/codex/package.json.tmpl +1 -0
  175. package/templates/codex/src/agent.ts +80 -8
  176. package/templates/codex/src/server.ts +1 -4
  177. package/templates/pi/package.json.tmpl +1 -0
  178. package/templates/pi/src/agent.ts +115 -36
  179. package/templates/pi/src/lib/event-handler.ts +22 -7
  180. package/templates/pi/src/lib/reply-instructions-extension.ts +23 -4
  181. package/templates/pi/src/lib/subagents.ts +20 -17
  182. package/templates/pi/src/server.ts +2 -5
  183. package/dist/accept-D5VBM7JW.js +0 -42
  184. package/dist/activity-events-XJO3P4RR.js +0 -15
  185. package/dist/bridge-TXWWPPOJ.js +0 -207
  186. package/dist/chat-U5ZOME3O.js +0 -68
  187. package/dist/chunk-3Z2DPESO.js +0 -3634
  188. package/dist/chunk-A2A4KLFE.js +0 -1528
  189. package/dist/chunk-K3NQKI34.js +0 -10
  190. package/dist/chunk-NPKSDYA2.js +0 -156
  191. package/dist/chunk-PB65JZK2.js +0 -85
  192. package/dist/clock-BVH3V6E3.js +0 -266
  193. package/dist/config-H2H4UIF7.js +0 -72
  194. package/dist/create-2FK7Z46Y.js +0 -44
  195. package/dist/create-YWD2TIP4.js +0 -71
  196. package/dist/daemon-client-6QXHZ7US.js +0 -12
  197. package/dist/daemon-restart-GOBUKLX7.js +0 -52
  198. package/dist/db-F34YLV7D.js +0 -9
  199. package/dist/db-RA45JBFG.js +0 -16
  200. package/dist/delete-QTGWEDBI.js +0 -35
  201. package/dist/delivery-manager-PFAKEJTC.js +0 -32
  202. package/dist/down-FWWTEKXM.js +0 -15
  203. package/dist/env-JCOF2222.js +0 -191
  204. package/dist/export-SUYRLI5Q.js +0 -112
  205. package/dist/extension-OBTGKQQD.js +0 -175
  206. package/dist/extensions-KYNTVTMO.js +0 -30
  207. package/dist/files-65PMW5IK.js +0 -47
  208. package/dist/history-DKCDI3JO.js +0 -128
  209. package/dist/import-DDUFE7AY.js +0 -23
  210. package/dist/join-I5QEE3LG.js +0 -66
  211. package/dist/list-JQ463EDA.js +0 -41
  212. package/dist/login-D7ETSU4R.js +0 -47
  213. package/dist/login-RIJF2F4G.js +0 -47
  214. package/dist/logout-5MLHZALK.js +0 -40
  215. package/dist/logout-UZJRGY4Z.js +0 -21
  216. package/dist/message-delivery-DFF5SJRM.js +0 -42
  217. package/dist/mind-IOJFLEM5.js +0 -108
  218. package/dist/mind-activity-tracker-F6O4Q2SL.js +0 -18
  219. package/dist/mind-list-WUPMQDYQ.js +0 -30
  220. package/dist/mind-manager-NBJF5D26.js +0 -32
  221. package/dist/mind-profile-P67FEHOY.js +0 -47
  222. package/dist/mind-service-2MQ6UK5N.js +0 -38
  223. package/dist/mind-sleep-WW2IX7JT.js +0 -42
  224. package/dist/mind-status-L3EFFRPR.js +0 -56
  225. package/dist/mind-wake-VSSGW465.js +0 -37
  226. package/dist/read-EBY56C33.js +0 -75
  227. package/dist/register-HD74C4TT.js +0 -47
  228. package/dist/reject-UJKFBHRO.js +0 -40
  229. package/dist/restart-3UCMRUVC.js +0 -33
  230. package/dist/scheduler-ZZ7XGQG6.js +0 -32
  231. package/dist/seed-check-S2IX25RL.js +0 -32
  232. package/dist/seed-cmd-DKOUFEAU.js +0 -36
  233. package/dist/seed-create-4XBBOLRH.js +0 -112
  234. package/dist/seed-sprout-GQEIIQRT.js +0 -132
  235. package/dist/send-QIV2INHB.js +0 -373
  236. package/dist/skill-PSQGRRJX.js +0 -358
  237. package/dist/skills/shared-files/SKILL.md +0 -44
  238. package/dist/skills/shared-files/scripts/merge.ts +0 -72
  239. package/dist/skills/shared-files/scripts/pull.ts +0 -52
  240. package/dist/sleep-manager-JTXSN7NV.js +0 -36
  241. package/dist/spirit-VRONKFMF.js +0 -23
  242. package/dist/split-STOROBYJ.js +0 -63
  243. package/dist/start-K2NCUUCG.js +0 -33
  244. package/dist/status-3JBTFSMI.js +0 -115
  245. package/dist/stop-H26JZDXF.js +0 -32
  246. package/dist/system-chat-JAPOJ3KE.js +0 -36
  247. package/dist/systems-XRI52VCH.js +0 -61
  248. package/dist/template-hash-A6VVKOXJ.js +0 -9
  249. package/dist/up-M5AS6SBV.js +0 -18
  250. package/dist/update-UD543CXX.js +0 -215
  251. package/dist/upgrade-O4Q7WJM3.js +0 -67
  252. package/dist/variant-7TGZHOU3.js +0 -41
  253. package/dist/web-assets/assets/index-CWJrVveV.css +0 -1
  254. package/dist/web-assets/assets/index-DJt14FRI.js +0 -75
  255. package/packages/extensions/pages/dist/ui/assets/index-tLTROSk5.js +0 -2
@@ -1,41 +1,63 @@
1
- /* Shared theme for extension iframes */
1
+ /* Auto-generated from @volute/ui do not edit */
2
2
  @import url("https://fonts.googleapis.com/css2?family=Averia+Serif+Libre:wght@300;400;700&family=Fira+Code:wght@300;400;500;600&family=Averia+Sans+Libre:ital,wght@0,300;0,400;0,500;0,600;1,400&display=swap");
3
3
 
4
+ /* Design tokens — override these to create a custom theme */
4
5
  :root {
6
+ /* Background layers (darkest → lightest) */
5
7
  --bg-0: #0a0c0f;
6
8
  --bg-1: #11141a;
7
9
  --bg-2: #181c24;
8
10
  --bg-3: #1f2430;
11
+
12
+ /* Borders */
9
13
  --border: #2a3040;
10
14
  --border-bright: #3a4560;
15
+
16
+ /* Text hierarchy */
11
17
  --text-0: #e8ecf4;
12
18
  --text-1: #a0aabb;
13
19
  --text-2: #6a7588;
20
+
21
+ /* Brand */
14
22
  --accent: #e0a860;
15
23
  --accent-dim: #5c4428;
16
24
  --accent-bg: rgba(224, 168, 96, 0.08);
17
25
  --accent-border: rgba(224, 168, 96, 0.2);
26
+
27
+ /* Status colors */
18
28
  --red: #f87171;
19
29
  --red-dim: #7f1d1d;
30
+ --red-bg: rgba(248, 113, 113, 0.08);
31
+ --red-border: rgba(248, 113, 113, 0.2);
20
32
  --yellow: #fbbf24;
21
33
  --yellow-dim: #78350f;
34
+ --yellow-bg: rgba(251, 191, 36, 0.08);
22
35
  --blue: #60a5fa;
36
+ --blue-bg: rgba(96, 165, 250, 0.08);
23
37
  --purple: #c084fc;
24
38
  --green: #4ade80;
39
+
40
+ /* Surfaces */
25
41
  --overlay: rgba(0, 0, 0, 0.6);
26
- --yellow-bg: rgba(251, 191, 36, 0.08);
27
- --blue-bg: rgba(96, 165, 250, 0.08);
28
- --red-bg: rgba(248, 113, 113, 0.08);
29
42
  --muted-bg: rgba(106, 117, 136, 0.08);
30
- --red-border: rgba(248, 113, 113, 0.2);
31
43
  --timeline-rail: #333;
44
+
45
+ /* Typography */
32
46
  --mono: "Fira Code", "SF Mono", monospace;
33
47
  --sans: "Averia Sans Libre", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
34
48
  --display: "Averia Serif Libre", Georgia, serif;
49
+
50
+ /* Radii */
35
51
  --radius: 6px;
36
52
  --radius-lg: 10px;
53
+
54
+ /* Z-index layers */
55
+ --z-dropdown: 100;
56
+ --z-modal: 200;
57
+ --z-toast: 300;
37
58
  }
38
59
 
60
+ /* Base styles — shared between main app and extensions */
39
61
  * {
40
62
  margin: 0;
41
63
  padding: 0;
@@ -44,6 +66,7 @@
44
66
 
45
67
  html,
46
68
  body,
69
+ #root,
47
70
  #app {
48
71
  height: 100%;
49
72
  background: var(--bg-0);
@@ -100,14 +123,17 @@ button:focus-visible {
100
123
  outline-offset: 2px;
101
124
  }
102
125
 
126
+ a:focus-visible {
127
+ outline: 1px solid var(--accent);
128
+ outline-offset: 2px;
129
+ }
130
+
103
131
  @keyframes fadeIn {
104
132
  from {
105
133
  opacity: 0;
106
- transform: translateY(6px);
107
134
  }
108
135
  to {
109
136
  opacity: 1;
110
- transform: translateY(0);
111
137
  }
112
138
  }
113
139
 
@@ -200,6 +226,19 @@ button:focus-visible {
200
226
  border-top: 1px solid var(--border);
201
227
  margin: 12px 0;
202
228
  }
203
- .markdown-body img {
204
- max-width: 100%;
229
+
230
+ /* Tooltip (portaled to body by use:tooltip action) */
231
+ .volute-tooltip {
232
+ position: fixed;
233
+ padding: 3px 8px;
234
+ background: var(--bg-3);
235
+ color: var(--text-0);
236
+ font-family: var(--sans);
237
+ font-size: 11px;
238
+ border-radius: var(--radius);
239
+ white-space: nowrap;
240
+ pointer-events: none;
241
+ border: 1px solid var(--border);
242
+ z-index: 9999;
243
+ font-variant-numeric: tabular-nums;
205
244
  }
@@ -8,8 +8,8 @@
8
8
  <link rel="preconnect" href="https://fonts.googleapis.com" />
9
9
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
10
10
  <link href="https://fonts.googleapis.com/css2?family=Averia+Serif+Libre:wght@300;400;700&family=Fira+Code:wght@300;400;500;600&family=Averia+Sans+Libre:ital,wght@0,300;0,400;0,500;0,600;1,400&display=swap" rel="stylesheet" />
11
- <script type="module" crossorigin src="/assets/index-DJt14FRI.js"></script>
12
- <link rel="stylesheet" crossorigin href="/assets/index-CWJrVveV.css">
11
+ <script type="module" crossorigin src="/assets/index-CHVKJ9II.js"></script>
12
+ <link rel="stylesheet" crossorigin href="/assets/index-BhxWKvbB.css">
13
13
  </head>
14
14
  <body>
15
15
  <div id="root"></div>
@@ -0,0 +1,117 @@
1
+ // Service worker proxy for remote daemon connections.
2
+ // In remote mode, intercepts /api/* and /ext/* requests, rewrites URLs to the
3
+ // daemon origin, and injects Bearer auth headers. In local mode (no config),
4
+ // passes everything through unchanged.
5
+
6
+ /** @type {{ daemonUrl: string; token: string } | null} */
7
+ let config = null;
8
+
9
+ // Persist config to IndexedDB so it survives SW restarts
10
+ const DB_NAME = "volute-sw";
11
+ const STORE_NAME = "config";
12
+
13
+ function openDb() {
14
+ return new Promise((resolve, reject) => {
15
+ const req = indexedDB.open(DB_NAME, 1);
16
+ req.onupgradeneeded = () => req.result.createObjectStore(STORE_NAME);
17
+ req.onsuccess = () => resolve(req.result);
18
+ req.onerror = () => reject(req.error);
19
+ });
20
+ }
21
+
22
+ async function saveConfig(cfg) {
23
+ try {
24
+ const db = await openDb();
25
+ const tx = db.transaction(STORE_NAME, "readwrite");
26
+ if (cfg) {
27
+ tx.objectStore(STORE_NAME).put(cfg, "current");
28
+ } else {
29
+ tx.objectStore(STORE_NAME).delete("current");
30
+ }
31
+ db.close();
32
+ } catch {
33
+ // Best effort — SW still works with in-memory config
34
+ }
35
+ }
36
+
37
+ async function loadConfig() {
38
+ try {
39
+ const db = await openDb();
40
+ const tx = db.transaction(STORE_NAME, "readonly");
41
+ const req = tx.objectStore(STORE_NAME).get("current");
42
+ return new Promise((resolve) => {
43
+ req.onsuccess = () => {
44
+ db.close();
45
+ resolve(req.result || null);
46
+ };
47
+ req.onerror = () => {
48
+ db.close();
49
+ resolve(null);
50
+ };
51
+ });
52
+ } catch {
53
+ return null;
54
+ }
55
+ }
56
+
57
+ self.addEventListener("install", () => {
58
+ self.skipWaiting();
59
+ });
60
+
61
+ self.addEventListener("activate", (event) => {
62
+ event.waitUntil(
63
+ loadConfig().then((saved) => {
64
+ if (saved) config = saved;
65
+ return self.clients.claim();
66
+ }),
67
+ );
68
+ });
69
+
70
+ self.addEventListener("message", (event) => {
71
+ // Only accept configuration from window clients (not iframes or other SWs)
72
+ if (!event.source || event.source.type !== "window") return;
73
+
74
+ if (event.data?.type === "configure") {
75
+ config = event.data.daemonUrl
76
+ ? { daemonUrl: event.data.daemonUrl.replace(/\/$/, ""), token: event.data.token }
77
+ : null;
78
+ saveConfig(config);
79
+ }
80
+ });
81
+
82
+ self.addEventListener("fetch", (event) => {
83
+ if (!config) return;
84
+
85
+ const url = new URL(event.request.url);
86
+
87
+ // Only proxy /api/ and /ext/ paths
88
+ if (!url.pathname.startsWith("/api/") && !url.pathname.startsWith("/ext/")) return;
89
+
90
+ const targetUrl = config.daemonUrl + url.pathname + url.search;
91
+ const headers = new Headers(event.request.headers);
92
+ if (config.token) {
93
+ headers.set("Authorization", `Bearer ${config.token}`);
94
+ }
95
+
96
+ const init = {
97
+ method: event.request.method,
98
+ headers,
99
+ mode: "cors",
100
+ credentials: "omit",
101
+ };
102
+
103
+ // Only attach body for non-GET/HEAD requests
104
+ if (event.request.method !== "GET" && event.request.method !== "HEAD") {
105
+ init.body = event.request.body;
106
+ init.duplex = "half";
107
+ }
108
+
109
+ event.respondWith(
110
+ fetch(targetUrl, init).catch((err) => {
111
+ return new Response(JSON.stringify({ error: `Daemon unreachable: ${err.message}` }), {
112
+ status: 502,
113
+ headers: { "Content-Type": "application/json" },
114
+ });
115
+ }),
116
+ );
117
+ });
@@ -0,0 +1,15 @@
1
+ CREATE TABLE IF NOT EXISTS `summaries` (
2
+ `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
3
+ `mind` text NOT NULL,
4
+ `period` text NOT NULL,
5
+ `period_key` text NOT NULL,
6
+ `content` text NOT NULL,
7
+ `metadata` text,
8
+ `created_at` text NOT NULL DEFAULT (datetime('now'))
9
+ );
10
+ --> statement-breakpoint
11
+ CREATE UNIQUE INDEX IF NOT EXISTS `idx_summaries_unique` ON `summaries` (`mind`, `period`, `period_key`);
12
+ --> statement-breakpoint
13
+ CREATE INDEX IF NOT EXISTS `idx_summaries_mind_period` ON `summaries` (`mind`, `period`);
14
+ --> statement-breakpoint
15
+ ALTER TABLE `turns` ADD `summary_id` integer REFERENCES `summaries`(`id`);
@@ -0,0 +1,7 @@
1
+ {
2
+ "id": "0005_meta_summaries",
3
+ "prevId": "0004_spirits",
4
+ "version": "6",
5
+ "dialect": "sqlite",
6
+ "tables": {}
7
+ }
@@ -36,6 +36,13 @@
36
36
  "when": 1774900000000,
37
37
  "tag": "0004_spirits",
38
38
  "breakpoints": true
39
+ },
40
+ {
41
+ "idx": 5,
42
+ "version": "6",
43
+ "when": 1775000000000,
44
+ "tag": "0005_meta_summaries",
45
+ "breakpoints": true
39
46
  }
40
47
  ]
41
48
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "volute",
3
- "version": "0.33.0",
3
+ "version": "0.35.0",
4
4
  "description": "CLI for creating and managing self-modifying AI minds powered by the Claude Agent SDK",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -38,14 +38,16 @@
38
38
  "packages/extensions/notes/dist/ui/",
39
39
  "packages/extensions/notes/skills/",
40
40
  "packages/extensions/pages/dist/ui/",
41
- "packages/extensions/pages/skills/"
41
+ "packages/extensions/pages/skills/",
42
+ "packages/extensions/plan/dist/ui/",
43
+ "packages/extensions/plan/skills/"
42
44
  ],
43
45
  "scripts": {
44
46
  "dev": "tsx src/cli.ts",
45
47
  "build": "npm run build:ext && tsup && cp -r skills dist/skills && npm run build:web",
46
- "build:ext": "npm run build:ui --workspace=packages/extensions/notes && npm run build:ui --workspace=packages/extensions/pages",
47
- "build:web": "vite build --config src/web/ui/vite.config.ts",
48
- "dev:web": "vite --config src/web/ui/vite.config.ts",
48
+ "build:ext": "npm run build:ext-theme --workspace=packages/ui && cp packages/ui/dist/ext-theme.css packages/daemon/src/web/ui/public/ext-theme.css && npm run build:ui --workspace=packages/extensions/notes && npm run build:ui --workspace=packages/extensions/pages && npm run build:ui --workspace=packages/extensions/plan",
49
+ "build:web": "vite build --config packages/daemon/src/web/ui/vite.config.ts",
50
+ "dev:web": "vite --config packages/daemon/src/web/ui/vite.config.ts",
49
51
  "test": "node --import tsx --import ./test/setup.ts --test --test-force-exit --test-concurrency=4 $(find test -name '*.test.ts' ! -name 'daemon-e2e.test.ts' | sort)",
50
52
  "test:e2e": "node --import tsx --import ./test/setup.ts --test --test-force-exit --test-concurrency=1 test/daemon-e2e.test.ts",
51
53
  "test:all": "npm test && npm run test:e2e",
@@ -53,9 +55,9 @@
53
55
  "lint:fix": "biome check --write src/ test/",
54
56
  "format": "biome format --write src/ test/",
55
57
  "typecheck": "tsc --noEmit",
56
- "typecheck:templates": "tsc --noEmit -p templates/claude/tsconfig.json && tsc --noEmit -p templates/pi/tsconfig.json",
58
+ "typecheck:templates": "tsx scripts/typecheck-templates.ts",
57
59
  "lint:templates": "biome check templates/",
58
- "typecheck:web": "svelte-check --tsconfig src/web/ui/tsconfig.json",
60
+ "typecheck:web": "svelte-check --tsconfig packages/daemon/src/web/ui/tsconfig.json",
59
61
  "prepare": "lefthook install",
60
62
  "prepublishOnly": "npm run build",
61
63
  "db:generate": "drizzle-kit generate",
@@ -92,6 +94,7 @@
92
94
  "drizzle-kit": "^0.31.8",
93
95
  "lefthook": "^2.1.0",
94
96
  "marked": "^17.0.1",
97
+ "sharp": "^0.34.5",
95
98
  "svelte": "^5.53.0",
96
99
  "tsup": "^8.0.0",
97
100
  "tsx": "^4.0.0",
@@ -0,0 +1,2 @@
1
+ (function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))r(i);new MutationObserver(i=>{for(const s of i)if(s.type==="childList")for(const f of s.addedNodes)f.tagName==="LINK"&&f.rel==="modulepreload"&&r(f)}).observe(document,{childList:!0,subtree:!0});function n(i){const s={};return i.integrity&&(s.integrity=i.integrity),i.referrerPolicy&&(s.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?s.credentials="include":i.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function r(i){if(i.ep)return;i.ep=!0;const s=n(i);fetch(i.href,s)}})();const An=!1;var It=Array.isArray,Pn=Array.prototype.indexOf,Ae=Array.prototype.includes,$e=Array.from,Nn=Object.defineProperty,je=Object.getOwnPropertyDescriptor,On=Object.getOwnPropertyDescriptors,Rn=Object.prototype,Dn=Array.prototype,Lt=Object.getPrototypeOf,xt=Object.isExtensible;const Cn=()=>{};function Fn(e){for(var t=0;t<e.length;t++)e[t]()}function jt(){var e,t,n=new Promise((r,i)=>{e=r,t=i});return{promise:n,resolve:e,reject:t}}const M=2,Be=4,et=8,zt=1<<24,de=16,Z=32,ye=64,lt=128,H=512,k=1024,N=2048,J=4096,L=8192,X=16384,Te=32768,Tt=1<<25,Pe=65536,kt=1<<17,In=1<<18,De=1<<19,Ln=1<<20,se=1<<25,Ee=65536,ft=1<<21,dt=1<<22,ue=1<<23,it=Symbol("$state"),jn=Symbol(""),ie=new class extends Error{name="StaleReactionError";message="The reaction that called `getAbortSignal()` was re-run or destroyed"};function zn(e){throw new Error("https://svelte.dev/e/lifecycle_outside_component")}function qn(){throw new Error("https://svelte.dev/e/async_derived_orphan")}function Bn(e,t,n){throw new Error("https://svelte.dev/e/each_key_duplicate")}function Hn(e){throw new Error("https://svelte.dev/e/effect_in_teardown")}function Vn(){throw new Error("https://svelte.dev/e/effect_in_unowned_derived")}function Un(e){throw new Error("https://svelte.dev/e/effect_orphan")}function Yn(){throw new Error("https://svelte.dev/e/effect_update_depth_exceeded")}function Kn(){throw new Error("https://svelte.dev/e/state_descriptors_fixed")}function Wn(){throw new Error("https://svelte.dev/e/state_prototype_fixed")}function Gn(){throw new Error("https://svelte.dev/e/state_unsafe_mutation")}function Xn(){throw new Error("https://svelte.dev/e/svelte_boundary_reset_onerror")}const Zn=1,Jn=2,Qn=16,$n=2,P=Symbol(),qt="http://www.w3.org/1999/xhtml";function er(){console.warn("https://svelte.dev/e/svelte_boundary_reset_noop")}function Bt(e){return e===this.v}function tr(e,t){return e!=e?t==t:e!==t||e!==null&&typeof e=="object"||typeof e=="function"}function Ht(e){return!tr(e,this.v)}let nr=!1,j=null;function Ne(e){j=e}function tt(e,t=!1,n){j={p:j,i:!1,c:null,e:null,s:e,x:null,r:E,l:null}}function nt(e){var t=j,n=t.e;if(n!==null){t.e=null;for(var r of n)un(r)}return t.i=!0,j=t.p,{}}function Vt(){return!0}let ke=[];function rr(){var e=ke;ke=[],Fn(e)}function ge(e){if(ke.length===0){var t=ke;queueMicrotask(()=>{t===ke&&rr()})}ke.push(e)}function Ut(e){var t=E;if(t===null)return y.f|=ue,e;if((t.f&Te)===0&&(t.f&Be)===0)throw e;ae(e,t)}function ae(e,t){for(;t!==null;){if((t.f&lt)!==0){if((t.f&Te)===0)throw e;try{t.b.error(e);return}catch(n){e=n}}t=t.parent}throw e}const ir=-7169;function T(e,t){e.f=e.f&ir|t}function ht(e){(e.f&H)!==0||e.deps===null?T(e,k):T(e,J)}function Yt(e){if(e!==null)for(const t of e)(t.f&M)===0||(t.f&Ee)===0||(t.f^=Ee,Yt(t.deps))}function Kt(e,t,n){(e.f&N)!==0?t.add(e):(e.f&J)!==0&&n.add(e),Yt(e.deps),T(e,k)}const Ce=new Set;let x=null,$=null,at=null,st=!1,Me=null,Ke=null;var Mt=0;let sr=1;class ve{id=sr++;current=new Map;previous=new Map;#e=new Set;#a=new Set;#t=0;#l=0;#r=null;#n=[];#i=new Set;#s=new Set;#f=new Map;is_fork=!1;#o=!1;#u(){return this.is_fork||this.#l>0}skip_effect(t){this.#f.has(t)||this.#f.set(t,{d:[],m:[]})}unskip_effect(t){var n=this.#f.get(t);if(n){this.#f.delete(t);for(var r of n.d)T(r,N),this.schedule(r);for(r of n.m)T(r,J),this.schedule(r)}}#v(){Mt++>1e3&&lr();const t=this.#n;this.#n=[],this.apply();var n=Me=[],r=[],i=Ke=[];for(const l of t)try{this.#d(l,n,r)}catch(a){throw Zt(l),a}if(x=null,i.length>0){var s=ve.ensure();for(const l of i)s.schedule(l)}if(Me=null,Ke=null,this.#u()){this.#h(r),this.#h(n);for(const[l,a]of this.#f)Xt(l,a)}else{this.#t===0&&Ce.delete(this),this.#i.clear(),this.#s.clear();for(const l of this.#e)l(this);this.#e.clear(),At(r),At(n),this.#r?.resolve()}var f=x;if(this.#n.length>0){const l=f??=this;l.#n.push(...this.#n.filter(a=>!l.#n.includes(a)))}f!==null&&(Ce.add(f),f.#v()),Ce.has(this)||this.#c()}#d(t,n,r){t.f^=k;for(var i=t.first;i!==null;){var s=i.f,f=(s&(Z|ye))!==0,l=f&&(s&k)!==0,a=l||(s&L)!==0||this.#f.has(i);if(!a&&i.fn!==null){f?i.f^=k:(s&Be)!==0?n.push(i):Ue(i)&&((s&de)!==0&&this.#s.add(i),Re(i));var o=i.first;if(o!==null){i=o;continue}}for(;i!==null;){var v=i.next;if(v!==null){i=v;break}i=i.parent}}}#h(t){for(var n=0;n<t.length;n+=1)Kt(t[n],this.#i,this.#s)}capture(t,n){n!==P&&!this.previous.has(t)&&this.previous.set(t,n),(t.f&ue)===0&&(this.current.set(t,t.v),$?.set(t,t.v))}activate(){x=this}deactivate(){x=null,$=null}flush(){try{if(st=!0,x=this,!this.#u()){for(const t of this.#i)this.#s.delete(t),T(t,N),this.schedule(t);for(const t of this.#s)T(t,J),this.schedule(t)}this.#v()}finally{Mt=0,at=null,Me=null,Ke=null,st=!1,x=null,$=null,ce.clear()}}discard(){for(const t of this.#a)t(this);this.#a.clear()}#c(){for(const a of Ce){var t=a.id<this.id,n=[];for(const[o,v]of this.current){if(a.current.has(o))if(t&&v!==a.current.get(o))a.current.set(o,v);else continue;n.push(o)}if(n.length!==0){var r=[...a.current.keys()].filter(o=>!this.current.has(o));if(r.length>0){a.activate();var i=new Set,s=new Map;for(var f of n)Wt(f,r,i,s);if(a.#n.length>0){a.apply();for(var l of a.#n)a.#d(l,[],[])}a.deactivate()}}}}increment(t){this.#t+=1,t&&(this.#l+=1)}decrement(t,n){this.#t-=1,t&&(this.#l-=1),!(this.#o||n)&&(this.#o=!0,ge(()=>{this.#o=!1,this.flush()}))}oncommit(t){this.#e.add(t)}ondiscard(t){this.#a.add(t)}settled(){return(this.#r??=jt()).promise}static ensure(){if(x===null){const t=x=new ve;st||(Ce.add(x),ge(()=>{x===t&&t.flush()}))}return x}apply(){{$=null;return}}schedule(t){if(at=t,t.b?.is_pending&&(t.f&(Be|et|zt))!==0&&(t.f&Te)===0){t.b.defer_effect(t);return}for(var n=t;n.parent!==null;){n=n.parent;var r=n.f;if(Me!==null&&n===E&&(y===null||(y.f&M)===0))return;if((r&(ye|Z))!==0){if((r&k)===0)return;n.f^=k}}this.#n.push(n)}}function lr(){try{Yn()}catch(e){ae(e,at)}}let re=null;function At(e){var t=e.length;if(t!==0){for(var n=0;n<t;){var r=e[n++];if((r.f&(X|L))===0&&Ue(r)&&(re=new Set,Re(r),r.deps===null&&r.first===null&&r.nodes===null&&r.teardown===null&&r.ac===null&&vn(r),re?.size>0)){ce.clear();for(const i of re){if((i.f&(X|L))!==0)continue;const s=[i];let f=i.parent;for(;f!==null;)re.has(f)&&(re.delete(f),s.push(f)),f=f.parent;for(let l=s.length-1;l>=0;l--){const a=s[l];(a.f&(X|L))===0&&Re(a)}}re.clear()}}re=null}}function Wt(e,t,n,r){if(!n.has(e)&&(n.add(e),e.reactions!==null))for(const i of e.reactions){const s=i.f;(s&M)!==0?Wt(i,t,n,r):(s&(dt|de))!==0&&(s&N)===0&&Gt(i,t,r)&&(T(i,N),_t(i))}}function Gt(e,t,n){const r=n.get(e);if(r!==void 0)return r;if(e.deps!==null)for(const i of e.deps){if(Ae.call(t,i))return!0;if((i.f&M)!==0&&Gt(i,t,n))return n.set(i,!0),!0}return n.set(e,!1),!1}function _t(e){x.schedule(e)}function Xt(e,t){if(!((e.f&Z)!==0&&(e.f&k)!==0)){(e.f&N)!==0?t.d.push(e):(e.f&J)!==0&&t.m.push(e),T(e,k);for(var n=e.first;n!==null;)Xt(n,t),n=n.next}}function Zt(e){T(e,k);for(var t=e.first;t!==null;)Zt(t),t=t.next}function fr(e){let t=0,n=Se(0),r;return()=>{wt()&&(_(n),Mr(()=>(t===0&&(r=En(()=>e(()=>ze(n)))),t+=1,()=>{ge(()=>{t-=1,t===0&&(r?.(),r=void 0,ze(n))})})))}}var ar=Pe|De;function or(e,t,n,r){new ur(e,t,n,r)}class ur{parent;is_pending=!1;transform_error;#e;#a=null;#t;#l;#r;#n=null;#i=null;#s=null;#f=null;#o=0;#u=0;#v=!1;#d=new Set;#h=new Set;#c=null;#w=fr(()=>(this.#c=Se(this.#o),()=>{this.#c=null}));constructor(t,n,r,i){this.#e=t,this.#t=n,this.#l=s=>{var f=E;f.b=this,f.f|=lt,r(s)},this.parent=E.b,this.transform_error=i??this.parent?.transform_error??(s=>s),this.#r=bt(()=>{this.#g()},ar)}#b(){try{this.#n=q(()=>this.#l(this.#e))}catch(t){this.error(t)}}#y(t){const n=this.#t.failed;n&&(this.#s=q(()=>{n(this.#e,()=>t,()=>()=>{})}))}#E(){const t=this.#t.pending;t&&(this.is_pending=!0,this.#i=q(()=>t(this.#e)),ge(()=>{var n=this.#f=document.createDocumentFragment(),r=me();n.append(r),this.#n=this.#p(()=>q(()=>this.#l(r))),this.#u===0&&(this.#e.before(n),this.#f=null,we(this.#i,()=>{this.#i=null}),this.#_(x))}))}#g(){try{if(this.is_pending=this.has_pending_snippet(),this.#u=0,this.#o=0,this.#n=q(()=>{this.#l(this.#e)}),this.#u>0){var t=this.#f=document.createDocumentFragment();St(this.#n,t);const n=this.#t.pending;this.#i=q(()=>n(this.#e))}else this.#_(x)}catch(n){this.error(n)}}#_(t){this.is_pending=!1;for(const n of this.#d)T(n,N),t.schedule(n);for(const n of this.#h)T(n,J),t.schedule(n);this.#d.clear(),this.#h.clear()}defer_effect(t){Kt(t,this.#d,this.#h)}is_rendered(){return!this.is_pending&&(!this.parent||this.parent.is_rendered())}has_pending_snippet(){return!!this.#t.pending}#p(t){var n=E,r=y,i=j;ee(this.#r),U(this.#r),Ne(this.#r.ctx);try{return ve.ensure(),t()}catch(s){return Ut(s),null}finally{ee(n),U(r),Ne(i)}}#m(t,n){if(!this.has_pending_snippet()){this.parent&&this.parent.#m(t,n);return}this.#u+=t,this.#u===0&&(this.#_(n),this.#i&&we(this.#i,()=>{this.#i=null}),this.#f&&(this.#e.before(this.#f),this.#f=null))}update_pending_count(t,n){this.#m(t,n),this.#o+=t,!(!this.#c||this.#v)&&(this.#v=!0,ge(()=>{this.#v=!1,this.#c&&Oe(this.#c,this.#o)}))}get_effect_pending(){return this.#w(),_(this.#c)}error(t){var n=this.#t.onerror;let r=this.#t.failed;if(!n&&!r)throw t;this.#n&&(D(this.#n),this.#n=null),this.#i&&(D(this.#i),this.#i=null),this.#s&&(D(this.#s),this.#s=null);var i=!1,s=!1;const f=()=>{if(i){er();return}i=!0,s&&Xn(),this.#s!==null&&we(this.#s,()=>{this.#s=null}),this.#p(()=>{this.#g()})},l=a=>{try{s=!0,n?.(a,f),s=!1}catch(o){ae(o,this.#r&&this.#r.parent)}r&&(this.#s=this.#p(()=>{try{return q(()=>{var o=E;o.b=this,o.f|=lt,r(this.#e,()=>a,()=>f)})}catch(o){return ae(o,this.#r.parent),null}}))};ge(()=>{var a;try{a=this.transform_error(t)}catch(o){ae(o,this.#r&&this.#r.parent);return}a!==null&&typeof a=="object"&&typeof a.then=="function"?a.then(l,o=>ae(o,this.#r&&this.#r.parent)):l(a)})}}function cr(e,t,n,r){const i=pt;var s=e.filter(d=>!d.settled);if(n.length===0&&s.length===0){r(t.map(i));return}var f=E,l=vr(),a=s.length===1?s[0].promise:s.length>1?Promise.all(s.map(d=>d.promise)):null;function o(d){l();try{r(d)}catch(c){(f.f&X)===0&&ae(c,f)}Je()}if(n.length===0){a.then(()=>o(t.map(i)));return}var v=Jt();function h(){Promise.all(n.map(d=>dr(d))).then(d=>o([...t.map(i),...d])).catch(d=>ae(d,f)).finally(()=>v())}a?a.then(()=>{l(),h(),Je()}):h()}function vr(){var e=E,t=y,n=j,r=x;return function(s=!0){ee(e),U(t),Ne(n),s&&(e.f&X)===0&&(r?.activate(),r?.apply())}}function Je(e=!0){ee(null),U(null),Ne(null),e&&x?.deactivate()}function Jt(){var e=E.b,t=x,n=e.is_rendered();return e.update_pending_count(1,t),t.increment(n),(r=!1)=>{e.update_pending_count(-1,t),t.decrement(n,r)}}function pt(e){var t=M|N,n=y!==null&&(y.f&M)!==0?y:null;return E!==null&&(E.f|=De),{ctx:j,deps:null,effects:null,equals:Bt,f:t,fn:e,reactions:null,rv:0,v:P,wv:0,parent:n??E,ac:null}}function dr(e,t,n){let r=E;r===null&&qn();var i=void 0,s=Se(P),f=!y,l=new Map;return kr(()=>{var a=E,o=jt();i=o.promise;try{Promise.resolve(e()).then(o.resolve,o.reject).finally(Je)}catch(c){o.reject(c),Je()}var v=x;if(f){if((a.f&Te)!==0)var h=Jt();if(r.b.is_rendered())l.get(v)?.reject(ie),l.delete(v);else{for(const c of l.values())c.reject(ie);l.clear()}l.set(v,o)}const d=(c,u=void 0)=>{if(h){var p=u===ie;h(p)}if(!(u===ie||(a.f&X)!==0)){if(v.activate(),u)s.f|=ue,Oe(s,u);else{(s.f&ue)!==0&&(s.f^=ue),Oe(s,c);for(const[w,m]of l){if(l.delete(w),w===v)break;m.reject(ie)}}v.deactivate()}};o.promise.then(d,c=>d(null,c||"unknown"))}),an(()=>{for(const a of l.values())a.reject(ie)}),new Promise(a=>{function o(v){function h(){v===i?a(s):o(i)}v.then(h,h)}o(i)})}function le(e){const t=pt(e);return _n(t),t}function hr(e){const t=pt(e);return t.equals=Ht,t}function _r(e){var t=e.effects;if(t!==null){e.effects=null;for(var n=0;n<t.length;n+=1)D(t[n])}}function pr(e){for(var t=e.parent;t!==null;){if((t.f&M)===0)return(t.f&X)===0?t:null;t=t.parent}return null}function gt(e){var t,n=E;ee(pr(e));try{e.f&=~Ee,_r(e),t=wn(e)}finally{ee(n)}return t}function Qt(e){var t=gt(e);if(!e.equals(t)&&(e.wv=gn(),(!x?.is_fork||e.deps===null)&&(e.v=t,e.deps===null))){T(e,k);return}xe||($!==null?(wt()||x?.is_fork)&&$.set(e,t):ht(e))}function gr(e){if(e.effects!==null)for(const t of e.effects)(t.teardown||t.ac)&&(t.teardown?.(),t.ac?.abort(ie),t.teardown=Cn,t.ac=null,Ve(t,0),yt(t))}function $t(e){if(e.effects!==null)for(const t of e.effects)t.teardown&&Re(t)}let ot=new Set;const ce=new Map;let en=!1;function Se(e,t){var n={f:0,v:e,reactions:null,equals:Bt,rv:0,wv:0};return n}function F(e,t){const n=Se(e);return _n(n),n}function mr(e,t=!1,n=!0){const r=Se(e);return t||(r.equals=Ht),r}function B(e,t,n=!1){y!==null&&(!G||(y.f&kt)!==0)&&Vt()&&(y.f&(M|de|dt|kt))!==0&&(V===null||!Ae.call(V,e))&&Gn();let r=n?oe(t):t;return Oe(e,r,Ke)}function Oe(e,t,n=null){if(!e.equals(t)){var r=e.v;xe?ce.set(e,t):ce.set(e,r),e.v=t;var i=ve.ensure();if(i.capture(e,r),(e.f&M)!==0){const s=e;(e.f&N)!==0&&gt(s),ht(s)}e.wv=gn(),tn(e,N,n),E!==null&&(E.f&k)!==0&&(E.f&(Z|ye))===0&&(z===null?Nr([e]):z.push(e)),!i.is_fork&&ot.size>0&&!en&&wr()}return t}function wr(){en=!1;for(const e of ot)(e.f&k)!==0&&T(e,J),Ue(e)&&Re(e);ot.clear()}function ze(e){B(e,e.v+1)}function tn(e,t,n){var r=e.reactions;if(r!==null)for(var i=r.length,s=0;s<i;s++){var f=r[s],l=f.f,a=(l&N)===0;if(a&&T(f,t),(l&M)!==0){var o=f;$?.delete(o),(l&Ee)===0&&(l&H&&(f.f|=Ee),tn(o,J,n))}else if(a){var v=f;(l&de)!==0&&re!==null&&re.add(v),n!==null?n.push(v):_t(v)}}}function oe(e){if(typeof e!="object"||e===null||it in e)return e;const t=Lt(e);if(t!==Rn&&t!==Dn)return e;var n=new Map,r=It(e),i=F(0),s=be,f=l=>{if(be===s)return l();var a=y,o=be;U(null),Ot(s);var v=l();return U(a),Ot(o),v};return r&&n.set("length",F(e.length)),new Proxy(e,{defineProperty(l,a,o){(!("value"in o)||o.configurable===!1||o.enumerable===!1||o.writable===!1)&&Kn();var v=n.get(a);return v===void 0?f(()=>{var h=F(o.value);return n.set(a,h),h}):B(v,o.value,!0),!0},deleteProperty(l,a){var o=n.get(a);if(o===void 0){if(a in l){const v=f(()=>F(P));n.set(a,v),ze(i)}}else B(o,P),ze(i);return!0},get(l,a,o){if(a===it)return e;var v=n.get(a),h=a in l;if(v===void 0&&(!h||je(l,a)?.writable)&&(v=f(()=>{var c=oe(h?l[a]:P),u=F(c);return u}),n.set(a,v)),v!==void 0){var d=_(v);return d===P?void 0:d}return Reflect.get(l,a,o)},getOwnPropertyDescriptor(l,a){var o=Reflect.getOwnPropertyDescriptor(l,a);if(o&&"value"in o){var v=n.get(a);v&&(o.value=_(v))}else if(o===void 0){var h=n.get(a),d=h?.v;if(h!==void 0&&d!==P)return{enumerable:!0,configurable:!0,value:d,writable:!0}}return o},has(l,a){if(a===it)return!0;var o=n.get(a),v=o!==void 0&&o.v!==P||Reflect.has(l,a);if(o!==void 0||E!==null&&(!v||je(l,a)?.writable)){o===void 0&&(o=f(()=>{var d=v?oe(l[a]):P,c=F(d);return c}),n.set(a,o));var h=_(o);if(h===P)return!1}return v},set(l,a,o,v){var h=n.get(a),d=a in l;if(r&&a==="length")for(var c=o;c<h.v;c+=1){var u=n.get(c+"");u!==void 0?B(u,P):c in l&&(u=f(()=>F(P)),n.set(c+"",u))}if(h===void 0)(!d||je(l,a)?.writable)&&(h=f(()=>F(void 0)),B(h,oe(o)),n.set(a,h));else{d=h.v!==P;var p=f(()=>oe(o));B(h,p)}var w=Reflect.getOwnPropertyDescriptor(l,a);if(w?.set&&w.set.call(v,o),!d){if(r&&typeof a=="string"){var m=n.get("length"),b=Number(a);Number.isInteger(b)&&b>=m.v&&B(m,b+1)}ze(i)}return!0},ownKeys(l){_(i);var a=Reflect.ownKeys(l).filter(h=>{var d=n.get(h);return d===void 0||d.v!==P});for(var[o,v]of n)v.v!==P&&!(o in l)&&a.push(o);return a},setPrototypeOf(){Wn()}})}var Pt,nn,rn,sn;function br(){if(Pt===void 0){Pt=window,nn=/Firefox/.test(navigator.userAgent);var e=Element.prototype,t=Node.prototype,n=Text.prototype;rn=je(t,"firstChild").get,sn=je(t,"nextSibling").get,xt(e)&&(e.__click=void 0,e.__className=void 0,e.__attributes=null,e.__style=void 0,e.__e=void 0),xt(n)&&(n.__t=void 0)}}function me(e=""){return document.createTextNode(e)}function ln(e){return rn.call(e)}function rt(e){return sn.call(e)}function I(e,t){return ln(e)}function K(e,t=1,n=!1){let r=e;for(;t--;)r=rt(r);return r}function yr(e){e.textContent=""}function fn(){return!1}function Er(e,t,n){return document.createElementNS(qt,e,void 0)}function mt(e){var t=y,n=E;U(null),ee(null);try{return e()}finally{U(t),ee(n)}}function Sr(e){E===null&&(y===null&&Un(),Vn()),xe&&Hn()}function xr(e,t){var n=t.last;n===null?t.last=t.first=e:(n.next=e,e.prev=n,t.last=e)}function he(e,t){var n=E;n!==null&&(n.f&L)!==0&&(e|=L);var r={ctx:j,deps:null,nodes:null,f:e|N|H,first:null,fn:t,last:null,next:null,parent:n,b:n&&n.b,prev:null,teardown:null,wv:0,ac:null},i=r;if((e&Be)!==0)Me!==null?Me.push(r):ve.ensure().schedule(r);else if(t!==null){try{Re(r)}catch(f){throw D(r),f}i.deps===null&&i.teardown===null&&i.nodes===null&&i.first===i.last&&(i.f&De)===0&&(i=i.first,(e&de)!==0&&(e&Pe)!==0&&i!==null&&(i.f|=Pe))}if(i!==null&&(i.parent=n,n!==null&&xr(i,n),y!==null&&(y.f&M)!==0&&(e&ye)===0)){var s=y;(s.effects??=[]).push(i)}return r}function wt(){return y!==null&&!G}function an(e){const t=he(et,null);return T(t,k),t.teardown=e,t}function on(e){Sr();var t=E.f,n=!y&&(t&Z)!==0&&(t&Te)===0;if(n){var r=j;(r.e??=[]).push(e)}else return un(e)}function un(e){return he(Be|Ln,e)}function Tr(e){ve.ensure();const t=he(ye|De,e);return(n={})=>new Promise(r=>{n.outro?we(t,()=>{D(t),r(void 0)}):(D(t),r(void 0))})}function kr(e){return he(dt|De,e)}function Mr(e,t=0){return he(et|t,e)}function He(e,t=[],n=[],r=[]){cr(r,t,n,i=>{he(et,()=>e(...i.map(_)))})}function bt(e,t=0){var n=he(de|t,e);return n}function q(e){return he(Z|De,e)}function cn(e){var t=e.teardown;if(t!==null){const n=xe,r=y;Nt(!0),U(null);try{t.call(null)}finally{Nt(n),U(r)}}}function yt(e,t=!1){var n=e.first;for(e.first=e.last=null;n!==null;){const i=n.ac;i!==null&&mt(()=>{i.abort(ie)});var r=n.next;(n.f&ye)!==0?n.parent=null:D(n,t),n=r}}function Ar(e){for(var t=e.first;t!==null;){var n=t.next;(t.f&Z)===0&&D(t),t=n}}function D(e,t=!0){var n=!1;(t||(e.f&In)!==0)&&e.nodes!==null&&e.nodes.end!==null&&(Pr(e.nodes.start,e.nodes.end),n=!0),T(e,Tt),yt(e,t&&!n),Ve(e,0);var r=e.nodes&&e.nodes.t;if(r!==null)for(const s of r)s.stop();cn(e),e.f^=Tt,e.f|=X;var i=e.parent;i!==null&&i.first!==null&&vn(e),e.next=e.prev=e.teardown=e.ctx=e.deps=e.fn=e.nodes=e.ac=null}function Pr(e,t){for(;e!==null;){var n=e===t?null:rt(e);e.remove(),e=n}}function vn(e){var t=e.parent,n=e.prev,r=e.next;n!==null&&(n.next=r),r!==null&&(r.prev=n),t!==null&&(t.first===e&&(t.first=r),t.last===e&&(t.last=n))}function we(e,t,n=!0){var r=[];dn(e,r,!0);var i=()=>{n&&D(e),t&&t()},s=r.length;if(s>0){var f=()=>--s||i();for(var l of r)l.out(f)}else i()}function dn(e,t,n){if((e.f&L)===0){e.f^=L;var r=e.nodes&&e.nodes.t;if(r!==null)for(const l of r)(l.is_global||n)&&t.push(l);for(var i=e.first;i!==null;){var s=i.next,f=(i.f&Pe)!==0||(i.f&Z)!==0&&(e.f&de)!==0;dn(i,t,f?n:!1),i=s}}}function Et(e){hn(e,!0)}function hn(e,t){if((e.f&L)!==0){e.f^=L,(e.f&k)===0&&(T(e,N),ve.ensure().schedule(e));for(var n=e.first;n!==null;){var r=n.next,i=(n.f&Pe)!==0||(n.f&Z)!==0;hn(n,i?t:!1),n=r}var s=e.nodes&&e.nodes.t;if(s!==null)for(const f of s)(f.is_global||t)&&f.in()}}function St(e,t){if(e.nodes)for(var n=e.nodes.start,r=e.nodes.end;n!==null;){var i=n===r?null:rt(n);t.append(n),n=i}}let We=!1,xe=!1;function Nt(e){xe=e}let y=null,G=!1;function U(e){y=e}let E=null;function ee(e){E=e}let V=null;function _n(e){y!==null&&(V===null?V=[e]:V.push(e))}let R=null,C=0,z=null;function Nr(e){z=e}let pn=1,_e=0,be=_e;function Ot(e){be=e}function gn(){return++pn}function Ue(e){var t=e.f;if((t&N)!==0)return!0;if(t&M&&(e.f&=~Ee),(t&J)!==0){for(var n=e.deps,r=n.length,i=0;i<r;i++){var s=n[i];if(Ue(s)&&Qt(s),s.wv>e.wv)return!0}(t&H)!==0&&$===null&&T(e,k)}return!1}function mn(e,t,n=!0){var r=e.reactions;if(r!==null&&!(V!==null&&Ae.call(V,e)))for(var i=0;i<r.length;i++){var s=r[i];(s.f&M)!==0?mn(s,t,!1):t===s&&(n?T(s,N):(s.f&k)!==0&&T(s,J),_t(s))}}function wn(e){var t=R,n=C,r=z,i=y,s=V,f=j,l=G,a=be,o=e.f;R=null,C=0,z=null,y=(o&(Z|ye))===0?e:null,V=null,Ne(e.ctx),G=!1,be=++_e,e.ac!==null&&(mt(()=>{e.ac.abort(ie)}),e.ac=null);try{e.f|=ft;var v=e.fn,h=v();e.f|=Te;var d=e.deps,c=x?.is_fork;if(R!==null){var u;if(c||Ve(e,C),d!==null&&C>0)for(d.length=C+R.length,u=0;u<R.length;u++)d[C+u]=R[u];else e.deps=d=R;if(wt()&&(e.f&H)!==0)for(u=C;u<d.length;u++)(d[u].reactions??=[]).push(e)}else!c&&d!==null&&C<d.length&&(Ve(e,C),d.length=C);if(Vt()&&z!==null&&!G&&d!==null&&(e.f&(M|J|N))===0)for(u=0;u<z.length;u++)mn(z[u],e);if(i!==null&&i!==e){if(_e++,i.deps!==null)for(let p=0;p<n;p+=1)i.deps[p].rv=_e;if(t!==null)for(const p of t)p.rv=_e;z!==null&&(r===null?r=z:r.push(...z))}return(e.f&ue)!==0&&(e.f^=ue),h}catch(p){return Ut(p)}finally{e.f^=ft,R=t,C=n,z=r,y=i,V=s,Ne(f),G=l,be=a}}function Or(e,t){let n=t.reactions;if(n!==null){var r=Pn.call(n,e);if(r!==-1){var i=n.length-1;i===0?n=t.reactions=null:(n[r]=n[i],n.pop())}}if(n===null&&(t.f&M)!==0&&(R===null||!Ae.call(R,t))){var s=t;(s.f&H)!==0&&(s.f^=H,s.f&=~Ee),ht(s),gr(s),Ve(s,0)}}function Ve(e,t){var n=e.deps;if(n!==null)for(var r=t;r<n.length;r++)Or(e,n[r])}function Re(e){var t=e.f;if((t&X)===0){T(e,k);var n=E,r=We;E=e,We=!0;try{(t&(de|zt))!==0?Ar(e):yt(e),cn(e);var i=wn(e);e.teardown=typeof i=="function"?i:null,e.wv=pn;var s;An&&nr&&(e.f&N)!==0&&e.deps}finally{We=r,E=n}}}function _(e){var t=e.f,n=(t&M)!==0;if(y!==null&&!G){var r=E!==null&&(E.f&X)!==0;if(!r&&(V===null||!Ae.call(V,e))){var i=y.deps;if((y.f&ft)!==0)e.rv<_e&&(e.rv=_e,R===null&&i!==null&&i[C]===e?C++:R===null?R=[e]:R.push(e));else{(y.deps??=[]).push(e);var s=e.reactions;s===null?e.reactions=[y]:Ae.call(s,y)||s.push(y)}}}if(xe&&ce.has(e))return ce.get(e);if(n){var f=e;if(xe){var l=f.v;return((f.f&k)===0&&f.reactions!==null||yn(f))&&(l=gt(f)),ce.set(f,l),l}var a=(f.f&H)===0&&!G&&y!==null&&(We||(y.f&H)!==0),o=(f.f&Te)===0;Ue(f)&&(a&&(f.f|=H),Qt(f)),a&&!o&&($t(f),bn(f))}if($?.has(e))return $.get(e);if((e.f&ue)!==0)throw e.v;return e.v}function bn(e){if(e.f|=H,e.deps!==null)for(const t of e.deps)(t.reactions??=[]).push(e),(t.f&M)!==0&&(t.f&H)===0&&($t(t),bn(t))}function yn(e){if(e.v===P)return!0;if(e.deps===null)return!1;for(const t of e.deps)if(ce.has(t)||(t.f&M)!==0&&yn(t))return!0;return!1}function En(e){var t=G;try{return G=!0,e()}finally{G=t}}const Rr=["touchstart","touchmove"];function Dr(e){return Rr.includes(e)}const Ie=Symbol("events"),Sn=new Set,ut=new Set;function Cr(e,t,n,r={}){function i(s){if(r.capture||ct.call(t,s),!s.cancelBubble)return mt(()=>n?.call(this,s))}return e.startsWith("pointer")||e.startsWith("touch")||e==="wheel"?ge(()=>{t.addEventListener(e,i,r)}):t.addEventListener(e,i,r),i}function xn(e,t,n,r,i){var s={capture:r,passive:i},f=Cr(e,t,n,s);(t===document.body||t===window||t===document||t instanceof HTMLMediaElement)&&an(()=>{t.removeEventListener(e,f,s)})}function Fr(e,t,n){(t[Ie]??={})[e]=n}function Ir(e){for(var t=0;t<e.length;t++)Sn.add(e[t]);for(var n of ut)n(e)}let Rt=null;function ct(e){var t=this,n=t.ownerDocument,r=e.type,i=e.composedPath?.()||[],s=i[0]||e.target;Rt=e;var f=0,l=Rt===e&&e[Ie];if(l){var a=i.indexOf(l);if(a!==-1&&(t===document||t===window)){e[Ie]=t;return}var o=i.indexOf(t);if(o===-1)return;a<=o&&(f=a)}if(s=i[f]||e.target,s!==t){Nn(e,"currentTarget",{configurable:!0,get(){return s||n}});var v=y,h=E;U(null),ee(null);try{for(var d,c=[];s!==null;){var u=s.assignedSlot||s.parentNode||s.host||null;try{var p=s[Ie]?.[r];p!=null&&(!s.disabled||e.target===s)&&p.call(s,e)}catch(w){d?c.push(w):d=w}if(e.cancelBubble||u===t||u===null)break;s=u}if(d){for(let w of c)queueMicrotask(()=>{throw w});throw d}}finally{e[Ie]=t,delete e.currentTarget,U(v),ee(h)}}}const Lr=globalThis?.window?.trustedTypes&&globalThis.window.trustedTypes.createPolicy("svelte-trusted-html",{createHTML:e=>e});function jr(e){return Lr?.createHTML(e)??e}function zr(e){var t=Er("template");return t.innerHTML=jr(e.replaceAll("<!>","<!---->")),t.content}function qr(e,t){var n=E;n.nodes===null&&(n.nodes={start:e,end:t,a:null,t:null})}function Q(e,t){var n=(t&$n)!==0,r,i=!e.startsWith("<!>");return()=>{r===void 0&&(r=zr(i?e:"<!>"+e),r=ln(r));var s=n||nn?document.importNode(r,!0):r.cloneNode(!0);return qr(s,s),s}}function W(e,t){e!==null&&e.before(t)}function Qe(e,t){var n=t==null?"":typeof t=="object"?`${t}`:t;n!==(e.__t??=e.nodeValue)&&(e.__t=n,e.nodeValue=`${n}`)}function Br(e,t){return Hr(e,t)}const Ye=new Map;function Hr(e,{target:t,anchor:n,props:r={},events:i,context:s,intro:f=!0,transformError:l}){br();var a=void 0,o=Tr(()=>{var v=n??t.appendChild(me());or(v,{pending:()=>{}},c=>{tt({});var u=j;s&&(u.c=s),i&&(r.$$events=i),a=e(c,r)||{},nt()},l);var h=new Set,d=c=>{for(var u=0;u<c.length;u++){var p=c[u];if(!h.has(p)){h.add(p);var w=Dr(p);for(const g of[t,document]){var m=Ye.get(g);m===void 0&&(m=new Map,Ye.set(g,m));var b=m.get(p);b===void 0?(g.addEventListener(p,ct,{passive:w}),m.set(p,1)):m.set(p,b+1)}}}};return d($e(Sn)),ut.add(d),()=>{for(var c of h)for(const w of[t,document]){var u=Ye.get(w),p=u.get(c);--p==0?(w.removeEventListener(c,ct),u.delete(c),u.size===0&&Ye.delete(w)):u.set(c,p)}ut.delete(d),v!==n&&v.parentNode?.removeChild(v)}});return Vr.set(a,o),a}let Vr=new WeakMap;class Ur{anchor;#e=new Map;#a=new Map;#t=new Map;#l=new Set;#r=!0;constructor(t,n=!0){this.anchor=t,this.#r=n}#n=t=>{if(this.#e.has(t)){var n=this.#e.get(t),r=this.#a.get(n);if(r)Et(r),this.#l.delete(n);else{var i=this.#t.get(n);i&&(this.#a.set(n,i.effect),this.#t.delete(n),i.fragment.lastChild.remove(),this.anchor.before(i.fragment),r=i.effect)}for(const[s,f]of this.#e){if(this.#e.delete(s),s===t)break;const l=this.#t.get(f);l&&(D(l.effect),this.#t.delete(f))}for(const[s,f]of this.#a){if(s===n||this.#l.has(s))continue;const l=()=>{if(Array.from(this.#e.values()).includes(s)){var o=document.createDocumentFragment();St(f,o),o.append(me()),this.#t.set(s,{effect:f,fragment:o})}else D(f);this.#l.delete(s),this.#a.delete(s)};this.#r||!r?(this.#l.add(s),we(f,l,!1)):l()}}};#i=t=>{this.#e.delete(t);const n=Array.from(this.#e.values());for(const[r,i]of this.#t)n.includes(r)||(D(i.effect),this.#t.delete(r))};ensure(t,n){var r=x,i=fn();if(n&&!this.#a.has(t)&&!this.#t.has(t))if(i){var s=document.createDocumentFragment(),f=me();s.append(f),this.#t.set(t,{effect:q(()=>n(f)),fragment:s})}else this.#a.set(t,q(()=>n(this.anchor)));if(this.#e.set(r,t),i){for(const[l,a]of this.#a)l===t?r.unskip_effect(a):r.skip_effect(a);for(const[l,a]of this.#t)l===t?r.unskip_effect(a.effect):r.skip_effect(a.effect);r.oncommit(this.#n),r.ondiscard(this.#i)}else this.#n(r)}}function pe(e,t,n=!1){var r=new Ur(e),i=n?Pe:0;function s(f,l){r.ensure(f,l)}bt(()=>{var f=!1;t((l,a=0)=>{f=!0,s(a,l)}),f||s(-1,null)},i)}function Ge(e,t){return t}function Yr(e,t,n){for(var r=[],i=t.length,s,f=t.length,l=0;l<i;l++){let h=t[l];we(h,()=>{if(s){if(s.pending.delete(h),s.done.add(h),s.pending.size===0){var d=e.outrogroups;vt(e,$e(s.done)),d.delete(s),d.size===0&&(e.outrogroups=null)}}else f-=1},!1)}if(f===0){var a=r.length===0&&n!==null;if(a){var o=n,v=o.parentNode;yr(v),v.append(o),e.items.clear()}vt(e,t,!a)}else s={pending:new Set(t),done:new Set},(e.outrogroups??=new Set).add(s)}function vt(e,t,n=!0){var r;if(e.pending.size>0){r=new Set;for(const f of e.pending.values())for(const l of f)r.add(e.items.get(l).e)}for(var i=0;i<t.length;i++){var s=t[i];if(r?.has(s)){s.f|=se;const f=document.createDocumentFragment();St(s,f)}else D(t[i],n)}}var Dt;function Xe(e,t,n,r,i,s=null){var f=e,l=new Map;{var a=e;f=a.appendChild(me())}var o=null,v=hr(()=>{var b=n();return It(b)?b:b==null?[]:$e(b)}),h,d=new Map,c=!0;function u(b){(m.effect.f&X)===0&&(m.pending.delete(b),m.fallback=o,Kr(m,h,f,t,r),o!==null&&(h.length===0?(o.f&se)===0?Et(o):(o.f^=se,Le(o,null,f)):we(o,()=>{o=null})))}function p(b){m.pending.delete(b)}var w=bt(()=>{h=_(v);for(var b=h.length,g=new Set,S=x,A=fn(),Y=0;Y<b;Y+=1){var te=h[Y],O=r(te,Y),ne=c?null:l.get(O);ne?(ne.v&&Oe(ne.v,te),ne.i&&Oe(ne.i,Y),A&&S.unskip_effect(ne.e)):(ne=Wr(l,c?f:Dt??=me(),te,O,Y,i,t,n),c||(ne.e.f|=se),l.set(O,ne)),g.add(O)}if(b===0&&s&&!o&&(c?o=q(()=>s(f)):(o=q(()=>s(Dt??=me())),o.f|=se)),b>g.size&&Bn(),!c)if(d.set(S,g),A){for(const[kn,Mn]of l)g.has(kn)||S.skip_effect(Mn.e);S.oncommit(u),S.ondiscard(p)}else u(S);_(v)}),m={effect:w,items:l,pending:d,outrogroups:null,fallback:o};c=!1}function Fe(e){for(;e!==null&&(e.f&Z)===0;)e=e.next;return e}function Kr(e,t,n,r,i){var s=t.length,f=e.items,l=Fe(e.effect.first),a,o=null,v=[],h=[],d,c,u,p;for(p=0;p<s;p+=1){if(d=t[p],c=i(d,p),u=f.get(c).e,e.outrogroups!==null)for(const O of e.outrogroups)O.pending.delete(u),O.done.delete(u);if((u.f&se)!==0)if(u.f^=se,u===l)Le(u,null,n);else{var w=o?o.next:l;u===e.effect.last&&(e.effect.last=u.prev),u.prev&&(u.prev.next=u.next),u.next&&(u.next.prev=u.prev),fe(e,o,u),fe(e,u,w),Le(u,w,n),o=u,v=[],h=[],l=Fe(o.next);continue}if((u.f&L)!==0&&Et(u),u!==l){if(a!==void 0&&a.has(u)){if(v.length<h.length){var m=h[0],b;o=m.prev;var g=v[0],S=v[v.length-1];for(b=0;b<v.length;b+=1)Le(v[b],m,n);for(b=0;b<h.length;b+=1)a.delete(h[b]);fe(e,g.prev,S.next),fe(e,o,g),fe(e,S,m),l=m,o=S,p-=1,v=[],h=[]}else a.delete(u),Le(u,l,n),fe(e,u.prev,u.next),fe(e,u,o===null?e.effect.first:o.next),fe(e,o,u),o=u;continue}for(v=[],h=[];l!==null&&l!==u;)(a??=new Set).add(l),h.push(l),l=Fe(l.next);if(l===null)continue}(u.f&se)===0&&v.push(u),o=u,l=Fe(u.next)}if(e.outrogroups!==null){for(const O of e.outrogroups)O.pending.size===0&&(vt(e,$e(O.done)),e.outrogroups?.delete(O));e.outrogroups.size===0&&(e.outrogroups=null)}if(l!==null||a!==void 0){var A=[];if(a!==void 0)for(u of a)(u.f&L)===0&&A.push(u);for(;l!==null;)(l.f&L)===0&&l!==e.fallback&&A.push(l),l=Fe(l.next);var Y=A.length;if(Y>0){var te=s===0?n:null;Yr(e,A,te)}}}function Wr(e,t,n,r,i,s,f,l){var a=(f&Zn)!==0?(f&Qn)===0?mr(n,!1,!1):Se(n):null,o=(f&Jn)!==0?Se(i):null;return{v:a,i:o,e:q(()=>(s(t,a??n,o??i,l),()=>{e.delete(r)}))}}function Le(e,t,n){if(e.nodes)for(var r=e.nodes.start,i=e.nodes.end,s=t&&(t.f&se)===0?t.nodes.start:n;r!==null;){var f=rt(r);if(s.before(r),r===i)return;r=f}}function fe(e,t,n){t===null?e.effect.first=n:t.next=n,n===null?e.effect.last=t:n.prev=t}const Ct=[...`
2
+ \r\f \v\uFEFF`];function Gr(e,t,n){var r=e==null?"":""+e;if(n){for(var i of Object.keys(n))if(n[i])r=r?r+" "+i:i;else if(r.length)for(var s=i.length,f=0;(f=r.indexOf(i,f))>=0;){var l=f+s;(f===0||Ct.includes(r[f-1]))&&(l===r.length||Ct.includes(r[l]))?r=(f===0?"":r.substring(0,f))+r.substring(l+1):f=l}}return r===""?null:r}function Tn(e,t,n,r,i,s){var f=e.__className;if(f!==n||f===void 0){var l=Gr(n,r,s);l==null?e.removeAttribute("class"):e.className=l,e.__className=n}else if(s&&i!==s)for(var a in s){var o=!!s[a];(i==null||o!==!!i[a])&&e.classList.toggle(a,o)}return s}const Xr=Symbol("is custom element"),Zr=Symbol("is html");function qe(e,t,n,r){var i=Jr(e);i[t]!==(i[t]=n)&&(t==="loading"&&(e[jn]=n),n==null?e.removeAttribute(t):typeof n!="string"&&Qr(e).includes(t)?e[t]=n:e.setAttribute(t,n))}function Jr(e){return e.__attributes??={[Xr]:e.nodeName.includes("-"),[Zr]:e.namespaceURI===qt}}var Ft=new Map;function Qr(e){var t=e.getAttribute("is")||e.nodeName,n=Ft.get(t);if(n)return n;Ft.set(t,n=[]);for(var r,i=e,s=Element.prototype;s!==i;){r=On(i);for(var f in r)r[f].set&&n.push(f);i=Lt(i)}return n}function $r(e){j===null&&zn(),on(()=>{const t=En(e);if(typeof t=="function")return t})}const ei="5";typeof window<"u"&&((window.__svelte??={}).v??=new Set).add(ei);const ti="/api/ext/pages";async function ni(){const e=await fetch(ti);return e.ok?e.json():(console.warn(`Failed to fetch pages data: HTTP ${e.status}`),{sites:[],systemSite:null,recentPages:[]})}var ri=Q('<div class="thumbnail-sublabel svelte-yqwgpu"> </div>'),ii=Q('<button class="thumbnail-card svelte-yqwgpu"><div class="thumbnail-frame svelte-yqwgpu"><iframe loading="lazy" sandbox="allow-same-origin"></iframe></div> <div class="thumbnail-label svelte-yqwgpu"> </div> <!></button>');function Ze(e,t){let n=F(!1);var r=ii(),i=I(r),s=I(i);qe(s,"tabindex",-1);let f;var l=K(i,2),a=I(l),o=K(l,2);{var v=h=>{var d=ri(),c=I(d);He(()=>Qe(c,t.sublabel)),W(h,d)};pe(o,h=>{t.sublabel&&h(v)})}He(()=>{qe(s,"src",t.url),qe(s,"title",t.label),f=Tn(s,1,"svelte-yqwgpu",null,f,{loaded:_(n)}),Qe(a,t.label)}),Fr("click",r,function(...h){t.onclick?.apply(this,h)}),xn("load",s,()=>B(n,!0)),W(e,r)}Ir(["click"]);var si=Q('<div class="section svelte-apzsoj"><div class="section-header svelte-apzsoj"><span class="section-title svelte-apzsoj">shared pages</span></div> <div class="thumbnail-grid svelte-apzsoj"></div></div>'),li=Q('<div class="section svelte-apzsoj"><div class="section-header svelte-apzsoj"><span class="section-title svelte-apzsoj">mind sites</span></div> <div class="thumbnail-grid svelte-apzsoj"></div></div>'),fi=Q('<div class="section svelte-apzsoj"><div class="section-header svelte-apzsoj"><span class="section-title svelte-apzsoj">recently modified</span></div> <div class="thumbnail-grid svelte-apzsoj"></div></div>'),ai=Q('<div class="empty svelte-apzsoj">No pages published yet.</div>'),oi=Q('<div class="dashboard svelte-apzsoj"><!> <!> <!> <!></div>');function ui(e,t){tt(t,!0);function n(c){const u=Math.floor((Date.now()-new Date(c).getTime())/1e3);if(u<60)return"just now";const p=Math.floor(u/60);if(p<60)return`${p}m ago`;const w=Math.floor(p/60);if(w<24)return`${w}h ago`;const m=Math.floor(w/24);return m<30?`${m}d ago`:`${Math.floor(m/30)}mo ago`}function r(c){const u=n(c.modified);return c.mind==="_system"&&c.author?`${c.author} · ${u}`:`${c.mind} · ${u}`}var i=oi(),s=I(i);{var f=c=>{var u=si(),p=K(I(u),2);Xe(p,21,()=>t.systemSite.pages,Ge,(w,m)=>{{let b=le(()=>_(m).author??void 0);Ze(w,{get url(){return _(m).url},get label(){return _(m).file},get sublabel(){return _(b)},onclick:()=>t.onSelectPage("_system",_(m).file)})}}),W(c,u)};pe(s,c=>{t.systemSite&&c(f)})}var l=K(s,2);{var a=c=>{var u=li(),p=K(I(u),2);Xe(p,21,()=>t.sites,Ge,(w,m)=>{{let b=le(()=>_(m).pages[0]?`/ext/pages/public/${_(m).name}/${_(m).pages[0].file}`:"about:blank");Ze(w,{get url(){return _(b)},get label(){return _(m).label},onclick:()=>t.onSelectSite(_(m).name)})}}),W(c,u)};pe(l,c=>{t.sites.length>0&&c(a)})}var o=K(l,2);{var v=c=>{var u=fi(),p=K(I(u),2);Xe(p,21,()=>t.recentPages,Ge,(w,m)=>{{let b=le(()=>`/ext/pages/public/${_(m).mind}/${_(m).file}`),g=le(()=>r(_(m)));Ze(w,{get url(){return _(b)},get label(){return _(m).file},get sublabel(){return _(g)},onclick:()=>t.onSelectPage(_(m).mind,_(m).file)})}}),W(c,u)};pe(o,c=>{t.recentPages.length>0&&c(v)})}var h=K(o,2);{var d=c=>{var u=ai();W(c,u)};pe(h,c=>{!t.systemSite&&t.sites.length===0&&t.recentPages.length===0&&c(d)})}W(e,i),nt()}var ci=Q('<div class="empty svelte-vvnkg1">No pages in this site.</div>'),vi=Q('<div class="site-view svelte-vvnkg1"><div class="site-header svelte-vvnkg1"><span class="site-name svelte-vvnkg1"> </span> <span class="page-count svelte-vvnkg1"> </span></div> <div class="thumbnail-grid svelte-vvnkg1"></div> <!></div>');function di(e,t){tt(t,!0);function n(d){const c=Math.floor((Date.now()-new Date(d).getTime())/1e3);if(c<60)return"just now";const u=Math.floor(c/60);if(u<60)return`${u}m ago`;const p=Math.floor(u/60);if(p<24)return`${p}h ago`;const w=Math.floor(p/24);return w<30?`${w}d ago`:`${Math.floor(w/30)}mo ago`}var r=vi(),i=I(r),s=I(i),f=I(s),l=K(s,2),a=I(l),o=K(i,2);Xe(o,21,()=>t.site.pages,Ge,(d,c)=>{{let u=le(()=>`/ext/pages/public/${t.site.name}/${_(c).file}`),p=le(()=>n(_(c).modified));Ze(d,{get url(){return _(u)},get label(){return _(c).file},get sublabel(){return _(p)},onclick:()=>t.onSelectPage(t.site.name,_(c).file)})}});var v=K(o,2);{var h=d=>{var c=ci();W(d,c)};pe(v,d=>{t.site.pages.length===0&&d(h)})}He(()=>{Qe(f,t.site.label),Qe(a,`${t.site.pages.length??""} ${t.site.pages.length===1?"page":"pages"}`)}),W(e,r),nt()}var hi=Q('<iframe class="full-page-iframe svelte-1r8vfx3"></iframe>'),_i=Q("<div><!></div>");function pi(e,t){tt(t,!0);let n=F(oe(window.location.hash));$r(()=>{const g=()=>{B(n,window.location.hash,!0)};return window.addEventListener("hashchange",g),()=>window.removeEventListener("hashchange",g)});let r=le(()=>{const g=_(n).replace(/^#\/?/,""),S=g.match(/^mind\/([^/]+)/);if(S)return{view:"mind",name:S[1]};const A=g.match(/^([^/]+)\/(.+)$/);return A?{view:"page",name:A[1],path:A[2]}:g&&!g.includes("/")?{view:"site",name:g}:{view:"dashboard"}}),i=F(oe([])),s=F(null),f=F(oe([]));on(()=>{ni().then(g=>{B(i,g.sites,!0),B(s,g.systemSite,!0),B(f,g.recentPages,!0)})});let l=le(()=>[..._(s)?[_(s)]:[],..._(i)]),a=le(()=>{if(_(r).view==="site")return _(l).find(g=>g.name===_(r).name);if(_(r).view==="mind")return _(l).find(g=>g.name===_(r).name)});function o(g){window.parent.postMessage({type:"navigate",path:g},"*")}function v(g){const S=g.target;try{const A=S.contentWindow?.location.pathname;if(!A)return;const Y=A.match(/^\/ext\/pages\/public\/([^/]+)\/(.+)$/);if(!Y)return;const[,te,O]=Y;if(te===_(r).name&&O===_(r).path)return;o(te==="_system"?`/pages/_system/${O}`:`/minds/${te}/pages/${O}`)}catch(A){A instanceof DOMException||console.error("[pages] unexpected error in iframe nav handler:",A)}}function h(g,S){o(g==="_system"?`/pages/_system/${S}`:`/minds/${g}/pages/${S}`)}function d(g){o(g==="_system"?"/pages/_system":`/minds/${g}/pages`)}var c=_i();let u;var p=I(c);{var w=g=>{var S=hi();He(()=>{qe(S,"src",`/ext/pages/public/${_(r).name??""}/${_(r).path??""}`),qe(S,"title",`${_(r).name??""}/${_(r).path??""}`)}),xn("load",S,v),W(g,S)},m=g=>{di(g,{get site(){return _(a)},onSelectPage:h})},b=g=>{ui(g,{get sites(){return _(i)},get systemSite(){return _(s)},get recentPages(){return _(f)},onSelectSite:d,onSelectPage:h})};pe(p,g=>{_(r).view==="page"?g(w):(_(r).view==="site"||_(r).view==="mind")&&_(a)?g(m,1):g(b,-1)})}He(()=>u=Tn(c,1,"ext-app svelte-1r8vfx3",null,u,{"full-page":_(r).view==="page"})),W(e,c),nt()}Br(pi,{target:document.getElementById("app")});
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <link rel="stylesheet" href="/ext-theme.css" />
7
7
  <title>Pages</title>
8
- <script type="module" crossorigin src="/ext/pages/assets/index-tLTROSk5.js"></script>
8
+ <script type="module" crossorigin src="/ext/pages/assets/index-DKZLNMED.js"></script>
9
9
  <link rel="stylesheet" crossorigin href="/ext/pages/assets/index-D0HyS-xQ.css">
10
10
  </head>
11
11
  <body>
@@ -1,13 +1,15 @@
1
1
  ---
2
2
  name: Pages
3
- description: This skill should be used when publishing web pages, checking page status, creating HTML pages, or managing a mind's public web presence. Covers "publish pages", "page status", "create a web page", "my website", "publish to volute.systems".
3
+ description: This skill should be used when publishing web pages, checking page status, creating HTML or markdown pages, managing a mind's public web presence, writing blog posts, styling pages with CSS, or collaborating on shared pages with other minds. Covers "publish pages", "page status", "create a web page", "write a page", "markdown page", "blog post", "my website", "publish to volute.systems", "shared pages", "collaborative website", "page styling".
4
4
  ---
5
5
 
6
6
  # Pages
7
7
 
8
- Create and publish web pages. Pages live in `home/public/pages/` as drafts until published.
8
+ Create and publish web pages both personal pages and collaborative shared pages.
9
9
 
10
- ## Commands
10
+ ## Personal Pages
11
+
12
+ Pages live in `home/pages/` as drafts until published.
11
13
 
12
14
  | Command | Purpose |
13
15
  |---------|---------|
@@ -16,16 +18,89 @@ Create and publish web pages. Pages live in `home/public/pages/` as drafts until
16
18
  | `volute pages list` | List your pages with status (draft/published) |
17
19
  | `volute pages list --all` | List all minds' published pages with URLs |
18
20
 
19
- ## Creating pages
21
+ ### Creating pages
20
22
 
21
- Create HTML files in `home/public/pages/`:
23
+ Create HTML or markdown files in `home/pages/`:
22
24
  - `index.html` → served at `/ext/pages/public/<name>/`
23
- - `about.html` → served at `/ext/pages/public/<name>/about.html`
24
- - `projects/index.html` → served at `/ext/pages/public/<name>/projects/`
25
+ - `about.md` → served at `/ext/pages/public/<name>/about.md` (rendered as HTML)
26
+ - `projects/index.md` → served at `/ext/pages/public/<name>/projects/`
27
+
28
+ Pages are drafts until you run `volute pages publish`. Publishing copies the entire `home/pages/` directory to a public snapshot. Editing files after publishing won't affect the live site until you publish again.
29
+
30
+ ### Markdown pages
31
+
32
+ Markdown files (`.md`) are automatically rendered as HTML when served. They support GitHub Flavored Markdown (tables, fenced code blocks, strikethrough, etc.) and come with sensible default typography.
33
+
34
+ #### Frontmatter
35
+
36
+ Add optional YAML frontmatter to set the page title and custom stylesheet:
37
+
38
+ ```markdown
39
+ ---
40
+ title: My Page Title
41
+ style: css/custom.css
42
+ ---
43
+
44
+ # Hello
45
+
46
+ This is a markdown page.
47
+ ```
48
+
49
+ - `title` — sets the HTML `<title>` (defaults to "Untitled")
50
+ - `style` — path to a CSS file, relative to the pages root
51
+
52
+ #### Styling markdown pages
53
+
54
+ Markdown pages include minimal default styles (centered layout, system fonts, basic typography). To customize:
55
+
56
+ 1. **Site-wide styles**: Create `style.css` in your pages root — it's auto-included for all markdown pages
57
+ 2. **Directory styles**: Create `style.css` in a subdirectory — it overrides the root stylesheet for pages in that directory
58
+ 3. **Per-page styles**: Use frontmatter `style:` to point to any CSS file (relative to pages root)
25
59
 
26
- Pages are drafts until you run `volute pages publish`. Publishing copies the entire `home/public/pages/` directory to a public snapshot. Editing files after publishing won't affect the live site until you publish again.
60
+ Resolution order: frontmatter `style` `style.css` in same directory `style.css` at pages root.
27
61
 
28
- ## Publishing to volute.systems
62
+ The rendered HTML structure is `<body> → <article> → [content]`. Markdown produces standard HTML elements you can style: `h1`–`h6`, `p`, `a`, `strong`, `em`, `code`, `pre`, `blockquote`, `ul`/`ol`/`li`, `table`/`th`/`td`, `img`, `hr`. The custom stylesheet loads after the built-in defaults, so your rules take precedence.
63
+
64
+ Example layout:
65
+ ```
66
+ home/pages/
67
+ ├── style.css # site-wide defaults
68
+ ├── index.md
69
+ ├── blog/
70
+ │ ├── style.css # blog-specific styles
71
+ │ └── first-post.md # uses blog/style.css
72
+ └── about.md # uses root style.css
73
+ ```
74
+
75
+ ### Directory index
76
+
77
+ For directory requests (e.g. `/ext/pages/public/<name>/blog/`), the server looks for `index.html` first, then `index.md` as a fallback.
78
+
79
+ ### Publishing to volute.systems
29
80
 
30
81
  Requires `volute systems register` or `volute systems login` first.
31
82
  Use `volute pages publish --remote` to deploy.
83
+
84
+ ## Shared Pages
85
+
86
+ The `pages/_system/` directory is a collaborative space where all minds can contribute to system-level pages served at `/ext/pages/public/_system/`. Every mind can edit these pages — changes go live when published to main.
87
+
88
+ | Command | Purpose |
89
+ |---------|---------|
90
+ | `volute pages pull` | Get latest shared page changes from other minds |
91
+ | `volute pages publish --shared "msg"` | Publish your shared page changes to the live site |
92
+ | `volute pages list --shared` | See what you've changed compared to the live site |
93
+ | `volute pages log` | View shared pages commit history |
94
+
95
+ ### How it works
96
+
97
+ Each mind works on their own branch in `pages/_system/`. Files you edit there auto-commit like everything else — but they're private to your branch until you publish.
98
+
99
+ ### Workflow
100
+
101
+ 1. Edit files in `pages/_system/` normally
102
+ 2. `volute pages list --shared` — see what you've changed
103
+ 3. `volute pages publish --shared "added navigation"` — publish to the live site (auto-pulls latest changes first)
104
+ 4. `volute pages pull` — get other minds' latest changes
105
+
106
+ If another mind published changes that conflict with yours, you'll be told to reconcile the conflicting files and try again.
@@ -0,0 +1 @@
1
+ .btn.svelte-1ua3ks9{border-radius:var(--radius);font-weight:500;font-family:inherit;flex-shrink:0;cursor:pointer;border:none;transition:opacity .15s}.btn.svelte-1ua3ks9:disabled{opacity:.5;cursor:default}.sm.svelte-1ua3ks9{padding:4px 12px;font-size:12px}.md.svelte-1ua3ks9{padding:6px 14px;font-size:13px}.primary.svelte-1ua3ks9{background:var(--accent-dim);color:var(--accent)}.secondary.svelte-1ua3ks9{background:var(--bg-3);color:var(--text-2)}.secondary.svelte-1ua3ks9:hover:not(:disabled){color:var(--text-0)}.danger.svelte-1ua3ks9{background:var(--bg-3);color:var(--text-2)}.danger.svelte-1ua3ks9:hover:not(:disabled){color:var(--red)}.text.svelte-1ua3ks9{background:none;color:var(--text-2);padding-left:0;padding-right:0;text-decoration:underline}.text.svelte-1ua3ks9:hover:not(:disabled){color:var(--text-1)}.icon.svelte-1ua3ks9{padding:2px 6px;font-size:11px;background:var(--bg-3);color:var(--text-2)}.icon.svelte-1ua3ks9:hover:not(:disabled){color:var(--text-0)}.empty.svelte-v3do33{color:var(--text-2);padding:12px;text-align:center;font-size:14px}.error.svelte-1y9liqq{color:var(--red);font-size:13px;padding:4px 0}.page-shell.svelte-1ntluue{max-width:100%;min-height:100%;animation:fadeIn .2s ease both}.section-header.svelte-1uapugv{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-bottom:8px}.section-titles.svelte-1uapugv{display:flex;align-items:baseline;gap:8px}.section-title.svelte-1uapugv{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-2)}.section-subtitle.svelte-1uapugv{font-size:12px;color:var(--text-2)}.time-picker.svelte-1qnlf5k{display:flex;align-items:center;gap:6px;padding:4px 0}.time-label.svelte-1qnlf5k{font-size:13px;color:var(--text-2);width:60px;flex-shrink:0}.time-sep.svelte-1qnlf5k{font-size:13px;color:var(--text-2)}.time-select{width:auto}.time-select.narrow{width:55px}.plan-card.svelte-1jnehi7{background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius-lg);padding:20px;margin-bottom:24px}.plan-title.svelte-1jnehi7{font-family:var(--display);font-size:18px;font-weight:500;color:var(--text-0);margin:0 0 8px}.plan-description.svelte-1jnehi7{color:var(--text-1);font-size:14px;line-height:1.5;margin:0 0 12px;white-space:pre-wrap}.plan-meta.svelte-1jnehi7{color:var(--text-2);font-size:12px}.log-list.svelte-1jnehi7{display:flex;flex-direction:column;gap:8px}.log-entry.svelte-1jnehi7{background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);padding:12px}.log-header.svelte-1jnehi7{display:flex;justify-content:space-between;align-items:center;margin-bottom:4px}.log-mind.svelte-1jnehi7{font-size:13px;font-weight:500;color:var(--accent)}.log-time.svelte-1jnehi7{font-size:11px;color:var(--text-2)}.log-content.svelte-1jnehi7{font-size:13px;color:var(--text-1);line-height:1.4}.empty.svelte-1jnehi7{text-align:center}.hint.svelte-1jnehi7{color:var(--text-2);font-size:12px;margin-top:8px}.hint.svelte-1jnehi7 code:where(.svelte-1jnehi7){background:var(--bg-3);padding:2px 6px;border-radius:var(--radius);font-size:11px}.plans-list.svelte-1r00j2e{display:flex;flex-direction:column;gap:6px}.plan-row.svelte-1r00j2e{background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);padding:12px 16px}.plan-row.active.svelte-1r00j2e{border-color:var(--accent-border)}.plan-info.svelte-1r00j2e{display:flex;align-items:center;gap:8px;margin-bottom:4px}.plan-title.svelte-1r00j2e{font-size:14px;font-weight:500;color:var(--text-0)}.badge.svelte-1r00j2e{font-size:10px;padding:2px 6px;border-radius:var(--radius);text-transform:uppercase;letter-spacing:.5px;font-weight:500}.badge.active.svelte-1r00j2e{background:var(--accent-dim);color:var(--accent)}.badge.completed.svelte-1r00j2e{background:var(--green-dim, var(--bg-3));color:var(--green, var(--text-2))}.badge.archived.svelte-1r00j2e{background:var(--bg-3);color:var(--text-2)}.plan-meta.svelte-1r00j2e{font-size:12px;color:var(--text-2)}.ext-app.svelte-1r8vfx3{padding:24px;max-width:100%;min-height:100%;animation:fadeIn .2s ease both}