volute 0.18.0 → 0.20.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 (117) hide show
  1. package/README.md +67 -67
  2. package/dist/activity-events-OMXKXD5N.js +16 -0
  3. package/dist/archive-ZCFOSTKB.js +15 -0
  4. package/dist/{channel-SLURLIRV.js → channel-PUQKGSQM.js} +60 -7
  5. package/dist/{chunk-6BDNWYKG.js → chunk-32VR2EOH.js} +2 -2
  6. package/dist/chunk-5XNT2472.js +36 -0
  7. package/dist/{chunk-QJIIHU32.js → chunk-7NO7EV5Z.js} +2 -2
  8. package/dist/{chunk-6DVBMLVN.js → chunk-7UFKREVW.js} +2 -2
  9. package/dist/chunk-AW7P4EVV.js +159 -0
  10. package/dist/{chunk-2Y77MCFG.js → chunk-DYZGP3EW.js} +2 -2
  11. package/dist/{chunk-M77QBTEH.js → chunk-EBGCNDMM.js} +24 -14
  12. package/dist/{chunk-37X7ECMF.js → chunk-FCDU5BFX.js} +1 -1
  13. package/dist/chunk-FGSYHIS3.js +891 -0
  14. package/dist/chunk-GZ7DW4YL.js +97 -0
  15. package/dist/chunk-IKMY5X76.js +375 -0
  16. package/dist/chunk-NSE7VJQA.js +159 -0
  17. package/dist/{chunk-GSPWIM5E.js → chunk-O6ASDHFO.js} +79 -7
  18. package/dist/{chunk-ZCEYUUID.js → chunk-OGXOMR65.js} +2 -1
  19. package/dist/{chunk-AYB7XAWO.js → chunk-PUVXOZ6T.js} +120 -279
  20. package/dist/{chunk-GK4E7LM7.js → chunk-RHEGSQFJ.js} +1 -1
  21. package/dist/{chunk-MVSXRMJJ.js → chunk-SCUDS4US.js} +1 -1
  22. package/dist/chunk-TIWH32HP.js +227 -0
  23. package/dist/{chunk-FW5API7X.js → chunk-UJ6GHNR7.js} +2 -2
  24. package/dist/chunk-UU7A7KLB.js +58 -0
  25. package/dist/{chunk-OYSZNX5I.js → chunk-VDWCHYTS.js} +1 -1
  26. package/dist/{chunk-OJQ47SCA.js → chunk-WC6ZHVRL.js} +1 -1
  27. package/dist/chunk-YUIHSKR6.js +72 -0
  28. package/dist/cli.js +43 -25
  29. package/dist/{connector-3ELFMI2R.js → connector-JBVNZ7VK.js} +6 -6
  30. package/dist/connectors/discord.js +2 -2
  31. package/dist/connectors/slack.js +2 -2
  32. package/dist/connectors/telegram.js +2 -2
  33. package/dist/{create-ZWHCRT5F.js → create-HP4OVVHF.js} +6 -4
  34. package/dist/{daemon-client-ODKDUYDE.js → daemon-client-ITWUCNFO.js} +2 -2
  35. package/dist/{daemon-restart-2HVTHZAT.js → daemon-restart-KPSWNYTH.js} +6 -6
  36. package/dist/daemon.js +2463 -1707
  37. package/dist/db-C2CJ46ZU.js +10 -0
  38. package/dist/{delete-6G6WEX4F.js → delete-BSU7K3RY.js} +1 -1
  39. package/dist/delivery-manager-CSG7LXA4.js +16 -0
  40. package/dist/down-ZY35KMHR.js +14 -0
  41. package/dist/{env-6IDWGBUH.js → env-A3LMO777.js} +6 -6
  42. package/dist/export-6QBUOQGC.js +100 -0
  43. package/dist/file-C57SK5DK.js +204 -0
  44. package/dist/{history-YUEKTJ2N.js → history-WNK3DFUM.js} +6 -6
  45. package/dist/{import-EDGRLIGO.js → import-XEC34Y4Z.js} +3 -3
  46. package/dist/log-PPPZDVEF.js +39 -0
  47. package/dist/{login-ORQDXLBM.js → login-HNH3EUQV.js} +2 -2
  48. package/dist/{logout-XC5AUO5I.js → logout-I5CB5UZS.js} +2 -2
  49. package/dist/{logs-GYOR3L2L.js → logs-SF2IMJN4.js} +6 -6
  50. package/dist/merge-33C237A4.js +46 -0
  51. package/dist/{mind-OJN6RBZW.js → mind-Z7CKD6DG.js} +14 -10
  52. package/dist/mind-activity-tracker-624QLQLC.js +19 -0
  53. package/dist/mind-manager-3DMYKZPB.js +18 -0
  54. package/dist/{package-OKLFO7UY.js → package-4NHAVUUI.js} +5 -3
  55. package/dist/{pages-6IV4VQTU.js → pages-4DGQT7ZA.js} +2 -2
  56. package/dist/{publish-Q4RPSJLL.js → publish-TAJUET4I.js} +22 -5
  57. package/dist/pull-XAEWQJ47.js +39 -0
  58. package/dist/{register-LDE6LRXY.js → register-VSPCMHKX.js} +2 -2
  59. package/dist/{restart-YFAWFS5T.js → restart-IQKMCK5M.js} +6 -6
  60. package/dist/{schedule-AGYLDMNS.js → schedule-FFZG23IW.js} +31 -11
  61. package/dist/schema-GFH6RV3W.js +26 -0
  62. package/dist/{seed-AP4Q7RZ7.js → seed-J43YDKXG.js} +7 -4
  63. package/dist/{send-BNDTLUPM.js → send-KVIZIGCE.js} +8 -8
  64. package/dist/{service-U7MZ2H7F.js → service-LUR7WDO7.js} +6 -6
  65. package/dist/{setup-DJKIZKGW.js → setup-52YRV7VP.js} +23 -7
  66. package/dist/shared-KO35ZM44.js +39 -0
  67. package/dist/{skill-2Y42P4JY.js → skill-BCVNI6TV.js} +6 -6
  68. package/{templates/_base/_skills → dist/skills}/orientation/SKILL.md +1 -1
  69. package/{templates/_base/_skills → dist/skills}/sessions/SKILL.md +2 -2
  70. package/{templates/_base/_skills → dist/skills}/volute-mind/SKILL.md +51 -3
  71. package/dist/{sprout-TJ3BHVOG.js → sprout-QN7Y4VVO.js} +38 -20
  72. package/dist/{start-3YYRXBKP.js → start-I5JYB65M.js} +6 -6
  73. package/dist/{status-VSFZYX7S.js → status-4ESFLGH4.js} +5 -5
  74. package/dist/status-D7E5HHBV.js +35 -0
  75. package/dist/{status-OKNA6AR3.js → status-FU2PFVVF.js} +5 -4
  76. package/dist/{stop-AA5K5LYG.js → stop-NBVKEFQQ.js} +6 -6
  77. package/dist/{up-7B3BWF2U.js → up-FS7CKM6V.js} +5 -5
  78. package/dist/{update-YAGN5ODG.js → update-FJIHDJKM.js} +5 -5
  79. package/dist/{update-check-APLTH4IN.js → update-check-MWE5AH4U.js} +2 -2
  80. package/dist/{upgrade-KXZCQSZN.js → upgrade-AIT24B5I.js} +1 -1
  81. package/dist/{variant-X5QFG6KK.js → variant-63ZWO2W7.js} +4 -4
  82. package/dist/variants-JAGWGBXG.js +26 -0
  83. package/dist/web-assets/assets/index-CUZTZzaW.js +64 -0
  84. package/dist/web-assets/assets/index-adVuCkqy.css +1 -0
  85. package/dist/web-assets/index.html +2 -2
  86. package/drizzle/0010_delivery_queue.sql +12 -0
  87. package/drizzle/0011_rename_human_to_brain.sql +1 -0
  88. package/drizzle/0012_activity.sql +11 -0
  89. package/drizzle/meta/0010_snapshot.json +7 -0
  90. package/drizzle/meta/0011_snapshot.json +7 -0
  91. package/drizzle/meta/0012_snapshot.json +7 -0
  92. package/drizzle/meta/_journal.json +21 -0
  93. package/package.json +5 -3
  94. package/templates/_base/.init/.config/hooks/startup-context.sh +1 -1
  95. package/templates/_base/.init/.config/scripts/session-reader.ts +3 -3
  96. package/templates/_base/home/.config/routes.json +2 -2
  97. package/templates/_base/home/VOLUTE.md +16 -1
  98. package/templates/_base/src/lib/auto-commit.ts +51 -14
  99. package/templates/_base/src/lib/daemon-client.ts +22 -0
  100. package/templates/_base/src/lib/router.ts +123 -1
  101. package/templates/_base/src/lib/transparency.ts +1 -1
  102. package/templates/_base/src/lib/types.ts +4 -0
  103. package/templates/_base/src/lib/volute-server.ts +91 -2
  104. package/templates/claude/.init/.config/routes.json +7 -1
  105. package/templates/claude/src/server.ts +2 -2
  106. package/templates/claude/volute-template.json +1 -2
  107. package/templates/pi/.init/.config/routes.json +7 -1
  108. package/templates/pi/src/agent.ts +12 -6
  109. package/templates/pi/src/lib/session-context-extension.ts +6 -4
  110. package/templates/pi/src/server.ts +2 -0
  111. package/templates/pi/volute-template.json +1 -2
  112. package/dist/chunk-PO5Q2AYN.js +0 -121
  113. package/dist/down-A56B5JLK.js +0 -14
  114. package/dist/mind-manager-Z7O7PN2O.js +0 -15
  115. package/dist/web-assets/assets/index-CtiimdWK.css +0 -1
  116. package/dist/web-assets/assets/index-kt1_EcuO.js +0 -63
  117. /package/{templates/_base/_skills → dist/skills}/memory/SKILL.md +0 -0
@@ -0,0 +1 @@
1
+ .settings.svelte-4b0ckc{max-width:720px;margin:0 auto;animation:fadeIn .2s ease both}.error.svelte-4b0ckc{color:var(--red);font-size:12px;margin-bottom:16px}.loading.svelte-4b0ckc{color:var(--text-2);font-size:12px;padding:40px 0;text-align:center}.section.svelte-4b0ckc{margin-bottom:32px}.section-header.svelte-4b0ckc{display:flex;align-items:baseline;gap:10px;margin-bottom:12px}.section-title.svelte-4b0ckc{font-size:14px;font-weight:600;color:var(--text-0)}.section-subtitle.svelte-4b0ckc{font-size:11px;color:var(--text-2)}.prompt-card.svelte-4b0ckc{background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius-lg);padding:14px 16px;margin-bottom:10px}.prompt-card.custom.svelte-4b0ckc{border-color:var(--yellow-dim)}.prompt-header.svelte-4b0ckc{display:flex;align-items:center;gap:8px;margin-bottom:4px}.prompt-key.svelte-4b0ckc{font-family:var(--mono);font-size:13px;font-weight:600;color:var(--text-0)}.custom-badge.svelte-4b0ckc{font-size:10px;padding:1px 6px;border-radius:3px;background:var(--yellow-dim);color:var(--yellow)}.prompt-desc.svelte-4b0ckc{font-size:12px;color:var(--text-2);margin-bottom:8px;line-height:1.5}.var-tags.svelte-4b0ckc{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:10px}.var-tag.svelte-4b0ckc{font-family:var(--mono);font-size:10px;padding:2px 6px;border-radius:3px;background:var(--bg-3);color:var(--accent);border:1px solid var(--border)}.prompt-content.svelte-4b0ckc{background:var(--bg-3);border:1px solid var(--border);border-radius:var(--radius);padding:10px 12px;overflow-x:auto;font-family:var(--mono);font-size:12px;line-height:1.5;color:var(--text-1);white-space:pre-wrap;word-break:break-word;margin-bottom:8px}.prompt-content.svelte-4b0ckc code:where(.svelte-4b0ckc){font-family:inherit;font-size:inherit}.edit-area.svelte-4b0ckc{width:100%;min-height:120px;background:var(--bg-3);border:1px solid var(--accent-dim);border-radius:var(--radius);padding:10px 12px;font-family:var(--mono);font-size:13px;line-height:1.5;color:var(--text-0);resize:vertical;margin-bottom:8px}.edit-area.svelte-4b0ckc:focus{outline:none;border-color:var(--accent)}.actions.svelte-4b0ckc{display:flex;gap:6px}.btn.svelte-4b0ckc{font-family:var(--mono);font-size:11px;padding:4px 10px;border-radius:var(--radius);cursor:pointer;border:1px solid transparent;transition:opacity .15s}.btn.svelte-4b0ckc:disabled{opacity:.5;cursor:not-allowed}.btn-edit.svelte-4b0ckc{background:var(--bg-3);color:var(--text-1);border-color:var(--border)}.btn-edit.svelte-4b0ckc:hover{color:var(--text-0);border-color:var(--border-bright)}.btn-save.svelte-4b0ckc{background:var(--accent-dim);color:var(--accent);border-color:var(--accent-border)}.btn-save.svelte-4b0ckc:hover:not(:disabled){border-color:var(--accent)}.btn-cancel.svelte-4b0ckc{background:var(--bg-3);color:var(--text-2);border-color:var(--border)}.btn-cancel.svelte-4b0ckc:hover:not(:disabled){color:var(--text-1)}.btn-reset.svelte-4b0ckc{background:var(--red-bg);color:var(--red);border-color:var(--red-border)}.btn-reset.svelte-4b0ckc:hover:not(:disabled){border-color:var(--red)}.modal-overlay.svelte-b3ltw6{position:fixed;inset:0;background:var(--overlay);display:flex;align-items:center;justify-content:center;z-index:200;animation:fadeIn .15s ease}.modal.svelte-b3ltw6{max-width:90vw;background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius-lg);display:flex;flex-direction:column;overflow:hidden}.modal.full.svelte-b3ltw6{width:80vw;height:70vh;max-width:960px}.modal-header.svelte-b3ltw6{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--border);padding:12px 16px;flex-shrink:0}.title.svelte-b3ltw6{font-size:13px;font-weight:600;color:var(--text-0)}.close-btn.svelte-b3ltw6{background:none;color:var(--text-2);font-size:14px;padding:4px 8px}.close-btn.svelte-b3ltw6:hover{color:var(--text-0)}.error.svelte-14apx5e{color:var(--red);padding:8px 12px;font-size:12px}.empty.svelte-14apx5e{color:var(--text-2);padding:24px;text-align:center;font-size:13px}.section-header.svelte-14apx5e{display:flex;align-items:center;justify-content:space-between;padding:0 0 12px}.section-title.svelte-14apx5e{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-2)}.upload-area.svelte-14apx5e{display:flex;align-items:center;gap:8px}.file-input.svelte-14apx5e{display:none}.upload-btn.svelte-14apx5e{padding:4px 12px;font-size:11px;border-radius:var(--radius);background:var(--accent-dim);color:var(--accent);font-weight:500}.upload-btn.svelte-14apx5e:disabled{opacity:.5}.skill-list.svelte-14apx5e{display:flex;flex-direction:column}.skill-row.svelte-14apx5e{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 0;border-bottom:1px solid var(--border)}.skill-row.svelte-14apx5e:last-child{border-bottom:none}.skill-row.svelte-14apx5e:hover{background:var(--bg-2)}.skill-info.svelte-14apx5e{flex:1;min-width:0}.skill-name.svelte-14apx5e{font-size:13px;font-weight:500;color:var(--text-0)}.skill-desc.svelte-14apx5e{font-size:12px;color:var(--text-1);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.skill-meta.svelte-14apx5e{font-size:11px;color:var(--text-2);margin-top:2px}.skill-actions.svelte-14apx5e{display:flex;gap:4px;flex-shrink:0}.action-btn.svelte-14apx5e{padding:4px 10px;font-size:11px;border-radius:var(--radius);font-weight:500}.action-btn.svelte-14apx5e:disabled{opacity:.5}.remove-btn.svelte-14apx5e{background:var(--bg-3);color:var(--text-2)}.remove-btn.svelte-14apx5e:hover{color:var(--red)}.system-logs.svelte-y6pt47{display:flex;flex-direction:column;height:100%}.header.svelte-y6pt47{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;flex-shrink:0}.title.svelte-y6pt47{color:var(--text-1);font-size:13px;font-weight:500}.count.svelte-y6pt47{color:var(--text-2);font-size:11px}.filter-bar.svelte-y6pt47{display:flex;align-items:center;gap:6px;margin-bottom:8px;flex-shrink:0;flex-wrap:wrap}.filter-group.svelte-y6pt47{display:flex;gap:4px;flex-wrap:wrap}.filter-sep.svelte-y6pt47{width:1px;height:16px;background:var(--border);margin:0 4px}.pill.svelte-y6pt47{padding:2px 8px;border-radius:10px;font-size:10px;font-family:var(--mono);cursor:pointer;border:1px solid transparent;transition:opacity .1s}.pill-info.svelte-y6pt47,.pill-debug.svelte-y6pt47{background:color-mix(in srgb,var(--text-2) 15%,transparent);color:var(--text-2)}.pill-warn.svelte-y6pt47{background:color-mix(in srgb,var(--yellow) 15%,transparent);color:var(--yellow)}.pill-error.svelte-y6pt47{background:color-mix(in srgb,var(--red) 15%,transparent);color:var(--red)}.pill-cat.svelte-y6pt47{background:var(--bg-3);color:var(--text-2)}.pill-clear.svelte-y6pt47{background:none;color:var(--text-2);border:1px dashed var(--border);margin-left:4px}.pill-clear.svelte-y6pt47:hover{color:var(--text-1);border-color:var(--text-2)}.pill.inactive.svelte-y6pt47{opacity:.3}.pause-bar.svelte-y6pt47{padding:6px 12px;background:var(--bg-3);border-bottom:1px solid var(--border);display:flex;align-items:center;justify-content:space-between;font-size:11px;color:var(--text-2);flex-shrink:0}.resume-btn.svelte-y6pt47{background:var(--accent-dim);color:var(--accent);padding:2px 10px;border-radius:var(--radius);font-size:11px}.log-output.svelte-y6pt47{flex:1;overflow:auto;padding:12px;font-family:var(--mono);font-size:11px;line-height:1.7;color:var(--text-1);background:var(--bg-0);border:1px solid var(--border);border-radius:var(--radius-lg)}.waiting.svelte-y6pt47{color:var(--text-2)}.error.svelte-y6pt47{color:var(--red)}.log-line.svelte-y6pt47{animation:fadeIn .1s ease both;display:flex;gap:1ch}.ts.svelte-y6pt47{color:var(--text-2);flex-shrink:0}.level.svelte-y6pt47{flex-shrink:0;width:5ch}.cat.svelte-y6pt47{color:var(--text-2);opacity:.6;flex-shrink:0;width:12ch;overflow:hidden;text-overflow:ellipsis}.msg.svelte-y6pt47{color:var(--text-0);white-space:pre-wrap;word-break:break-word;min-width:0}.data.svelte-y6pt47{color:var(--text-2);white-space:pre-wrap;word-break:break-word}.tab-bar.svelte-1tbaq71{display:flex}.tab.svelte-1tbaq71{padding:10px 16px;background:transparent;color:var(--text-2);font-size:12px;font-weight:500;border-bottom:2px solid transparent;transition:all .15s;margin-bottom:-1px}.tab.active.svelte-1tbaq71{color:var(--accent);border-bottom-color:var(--accent)}.container.svelte-1j9xdsd{max-width:600px;animation:fadeIn .2s ease both}.header.svelte-1j9xdsd{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px}.title.svelte-1j9xdsd{font-size:15px;font-weight:600}.user-list.svelte-1j9xdsd{display:flex;flex-direction:column;gap:8px}.user-row.svelte-1j9xdsd{display:flex;align-items:center;justify-content:space-between;padding:10px 14px;background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius)}.username.svelte-1j9xdsd{color:var(--text-0);margin-right:12px}.role.svelte-1j9xdsd{font-size:11px;color:var(--text-2)}.role.admin.svelte-1j9xdsd{color:var(--accent)}.role.pending.svelte-1j9xdsd{color:var(--yellow)}.approve-btn.svelte-1j9xdsd{padding:4px 12px;background:var(--accent-dim);color:var(--accent);border-radius:var(--radius);font-size:11px;font-weight:500}.error.svelte-1j9xdsd{color:var(--red);font-size:12px;margin-bottom:12px}.empty.svelte-1j9xdsd{color:var(--text-2);text-align:center;padding:24px}.modal-header.svelte-1r58s0h{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--border);padding:0 16px;flex-shrink:0}.close-btn.svelte-1r58s0h{background:none;color:var(--text-2);font-size:14px;padding:4px 8px}.close-btn.svelte-1r58s0h:hover{color:var(--text-0)}.modal-body.svelte-1r58s0h{flex:1;overflow:auto;padding:16px}.error.svelte-16qbe83{padding:8px 16px;font-size:12px;color:var(--red)}.channel-list.svelte-16qbe83{flex:1;overflow:auto;padding:8px}.empty.svelte-16qbe83{color:var(--text-2);font-size:12px;text-align:center;padding:20px}.channel-row.svelte-16qbe83{display:flex;align-items:center;justify-content:space-between;padding:8px;border-radius:var(--radius)}.channel-row.svelte-16qbe83:hover{background:var(--bg-2)}.channel-info.svelte-16qbe83{display:flex;flex-direction:column;gap:2px}.channel-name.svelte-16qbe83{font-size:13px;color:var(--text-0);font-weight:500}.channel-meta.svelte-16qbe83{font-size:11px;color:var(--text-2)}.action-btn.svelte-16qbe83{padding:4px 12px;font-size:11px;border-radius:var(--radius);background:var(--accent-dim);color:var(--accent);font-weight:500}.action-btn.leave.svelte-16qbe83{background:var(--bg-3);color:var(--text-2)}.create-section.svelte-16qbe83{display:flex;gap:8px;padding:12px 16px;border-top:1px solid var(--border)}.name-input.svelte-16qbe83{flex:1;background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);padding:8px 10px;color:var(--text-0);font-size:12px;font-family:var(--mono);outline:none}.name-input.svelte-16qbe83:focus{border-color:var(--border-bright)}.create-btn.svelte-16qbe83{padding:8px 14px;background:var(--accent-dim);color:var(--accent);border-radius:var(--radius);font-size:12px;font-weight:500}.create-btn.svelte-16qbe83:disabled{opacity:.4}.container.svelte-zwrylj{display:flex;align-items:center;justify-content:center;height:100%;padding:24px}.card.svelte-zwrylj{width:320px;padding:32px;background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius-lg)}.branding.svelte-zwrylj{margin-bottom:24px;text-align:center}.logo.svelte-zwrylj{font-size:18px;font-weight:600;margin-bottom:4px}.accent.svelte-zwrylj{color:var(--accent)}.subtitle.svelte-zwrylj{color:var(--text-2);font-size:12px}.input.svelte-zwrylj{width:100%;padding:10px 12px;background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);color:var(--text-0);font-family:var(--mono);font-size:13px;outline:none}.input.svelte-zwrylj:focus{border-color:var(--border-bright)}.mt-8.svelte-zwrylj{margin-top:8px}.error.svelte-zwrylj{color:var(--red);font-size:12px;margin-top:8px}.submit-btn.svelte-zwrylj{width:100%;padding:10px 16px;margin-top:16px;background:var(--accent-dim);color:var(--accent);border-radius:var(--radius);font-size:13px;font-weight:500;font-family:var(--mono);border:none;cursor:pointer}.link-btn.svelte-zwrylj{background:transparent;color:var(--text-2);font-size:12px;font-family:var(--mono);border:none;cursor:pointer;padding:0}.toggle.svelte-zwrylj{margin-top:16px;text-align:center}.pending-msg.svelte-zwrylj{color:var(--yellow);margin-bottom:16px}.badge.svelte-w1qana{display:inline-flex;align-items:center;gap:5px;padding:2px 8px;border-radius:var(--radius);font-size:11px;font-weight:500;letter-spacing:.02em;text-transform:uppercase}.dot.svelte-w1qana{width:5px;height:5px;border-radius:50%}.home.svelte-1egy5tu{max-width:800px;animation:fadeIn .2s ease both}.section.svelte-1egy5tu{margin-bottom:24px}.section-header.svelte-1egy5tu{display:flex;align-items:center;gap:8px;font-size:11px;text-transform:uppercase;letter-spacing:.05em;margin-bottom:8px}.section-title.svelte-1egy5tu{color:var(--text-2)}.empty-hint.svelte-1egy5tu{color:var(--text-2);font-size:12px}.code-hint.svelte-1egy5tu{color:var(--text-1)}.mind-row.svelte-1egy5tu{display:flex;gap:10px;overflow-x:auto;padding-bottom:4px}.home-mind-card.svelte-1egy5tu{display:flex;flex-direction:column;gap:6px;padding:10px 14px;border-radius:var(--radius-lg);background:var(--bg-2);border:1px solid var(--border);min-width:150px;transition:border-color .15s;flex-shrink:0;cursor:pointer;text-align:left;color:inherit;font-size:inherit}.home-mind-card.svelte-1egy5tu:hover{border-color:var(--border-bright)}.mind-card-header.svelte-1egy5tu{display:flex;align-items:center;gap:6px}.mind-name.svelte-1egy5tu{color:var(--text-0);font-weight:500;font-size:13px}.seed-tag.svelte-1egy5tu{font-size:9px;color:var(--yellow)}.channel-row.svelte-1egy5tu{display:flex;gap:4px;flex-wrap:wrap}.channel-chip.svelte-1egy5tu{font-size:10px;padding:1px 5px;border-radius:3px;background:var(--accent-dim);color:var(--accent)}.mind-activity.svelte-1egy5tu{font-size:10px;color:var(--text-2)}.timeline.svelte-1egy5tu{display:flex;flex-direction:column}.timeline-row.svelte-1egy5tu{display:flex;align-items:center;gap:10px;padding:7px 10px;border-radius:var(--radius-lg);background:none;border:none;cursor:pointer;text-align:left;color:inherit;font-size:12px;transition:background .12s;width:100%}.timeline-row.svelte-1egy5tu:hover{background:var(--bg-2)}.timeline-dot.svelte-1egy5tu{width:6px;height:6px;border-radius:50%;flex-shrink:0;background:var(--text-2)}.dot-started.svelte-1egy5tu{background:var(--accent)}.dot-stopped.svelte-1egy5tu{background:var(--text-2)}.dot-active.svelte-1egy5tu{background:var(--accent)}.dot-idle.svelte-1egy5tu{background:var(--text-2)}.dot-page.svelte-1egy5tu{background:var(--yellow)}.dot-message.svelte-1egy5tu{background:var(--blue, var(--accent))}.timeline-text.svelte-1egy5tu{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-1)}.timeline-text.svelte-1egy5tu .conv-label:where(.svelte-1egy5tu){color:var(--text-0);font-weight:500}.timeline-time.svelte-1egy5tu{color:var(--text-2);font-size:10px;flex-shrink:0}.thumbnail-card.svelte-15o3gk6{display:flex;flex-direction:column;gap:6px;background:none;cursor:pointer;text-align:left;color:inherit;padding:0}.thumbnail-frame.svelte-15o3gk6{width:280px;height:180px;overflow:hidden;border-radius:var(--radius-lg);border:1px solid var(--border);background:var(--bg-0);transition:border-color .15s}.thumbnail-card.svelte-15o3gk6:hover .thumbnail-frame:where(.svelte-15o3gk6){border-color:var(--border-bright)}iframe.svelte-15o3gk6{width:1280px;height:960px;transform:scale(.219);transform-origin:top left;pointer-events:none;border:none;background:#fff}.thumbnail-label.svelte-15o3gk6{font-size:12px;font-weight:500;color:var(--text-0);padding:0 2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:280px}.thumbnail-sublabel.svelte-15o3gk6{font-size:10px;color:var(--text-2);padding:0 2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:280px}.dashboard.svelte-pd71n3{max-width:1200px;animation:fadeIn .2s ease both}.section.svelte-pd71n3{margin-bottom:24px}.section-header.svelte-pd71n3{font-size:11px;text-transform:uppercase;letter-spacing:.05em;margin-bottom:12px}.section-title.svelte-pd71n3{color:var(--text-2)}.thumbnail-grid.svelte-pd71n3{display:flex;flex-wrap:wrap;gap:16px}.empty.svelte-pd71n3{color:var(--text-2);font-size:12px}.site-view.svelte-s0ylih{max-width:1200px;animation:fadeIn .2s ease both}.site-header.svelte-s0ylih{display:flex;align-items:baseline;gap:8px;margin-bottom:16px}.site-name.svelte-s0ylih{font-size:16px;font-weight:500;color:var(--text-0)}.page-count.svelte-s0ylih{font-size:11px;color:var(--text-2)}.thumbnail-grid.svelte-s0ylih{display:flex;flex-wrap:wrap;gap:16px}.empty.svelte-s0ylih{color:var(--text-2);font-size:12px}.feedback.svelte-19tj18b{padding:8px 16px;font-size:12px}.feedback.error.svelte-19tj18b{color:var(--red)}.feedback.success.svelte-19tj18b{color:var(--accent)}.invite-section.svelte-19tj18b{display:flex;gap:8px;padding:16px}.name-input.svelte-19tj18b{flex:1;background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);padding:8px 10px;color:var(--text-0);font-size:12px;font-family:var(--mono);outline:none}.name-input.svelte-19tj18b:focus{border-color:var(--border-bright)}.invite-btn.svelte-19tj18b{padding:8px 14px;background:var(--accent-dim);color:var(--accent);border-radius:var(--radius);font-size:12px;font-weight:500}.invite-btn.svelte-19tj18b:disabled{opacity:.4}.hint.svelte-19tj18b{padding:0 16px 16px;font-size:11px;color:var(--text-2);margin:0}.chat.svelte-6z343n{display:flex;flex-direction:column;height:100%}.orientation-bar.svelte-6z343n{padding:6px 12px;text-align:center;color:var(--yellow);font-size:11px;font-weight:500;letter-spacing:.05em;text-transform:uppercase;opacity:.6;border-bottom:1px solid var(--yellow-bg)}.channel-header.svelte-6z343n{display:flex;align-items:center;gap:10px;padding:8px 12px;border-bottom:1px solid var(--border);flex-shrink:0}.channel-title.svelte-6z343n{font-size:13px;font-weight:600;color:var(--text-0)}.channel-members.svelte-6z343n{font-size:11px;color:var(--text-2);flex:1}.channel-header.svelte-6z343n .invite-btn:where(.svelte-6z343n){padding:4px 12px;font-size:11px;border-radius:var(--radius);background:var(--bg-3);color:var(--text-1);font-weight:500}.channel-header.svelte-6z343n .invite-btn:where(.svelte-6z343n):hover{background:var(--accent-dim);color:var(--accent)}.messages.svelte-6z343n{flex:1;overflow:auto;padding:16px 0}.empty.svelte-6z343n{color:var(--text-2);text-align:center;padding:40px;font-size:13px}.error.svelte-6z343n{color:var(--red)}.entry.svelte-6z343n{display:flex;gap:10px;margin-bottom:16px;animation:fadeIn .2s ease both}.sender.svelte-6z343n{font-size:11px;font-weight:600;flex-shrink:0;margin-top:2px;text-transform:uppercase}.sender-link.svelte-6z343n{background:none;border:none;padding:0;font:inherit;font-size:11px;font-weight:600;text-transform:uppercase;cursor:pointer}.sender-link.svelte-6z343n:hover{text-decoration:underline}.entry-content.svelte-6z343n{flex:1;min-width:0}.user-text.svelte-6z343n{color:var(--text-0);white-space:pre-wrap}.chat-image.svelte-6z343n{max-width:300px;max-height:200px;border-radius:var(--radius);margin-top:4px}.divider.svelte-6z343n{display:flex;align-items:center;gap:12px;margin:20px 0;color:var(--text-2);font-size:11px;letter-spacing:.03em}.divider-line.svelte-6z343n{flex:1;height:1px;background:var(--border)}.tool-block.svelte-6z343n{margin-bottom:8px;border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;font-size:12px}.tool-header.svelte-6z343n{width:100%;display:flex;align-items:center;justify-content:space-between;padding:6px 10px;background:var(--bg-3);font-size:12px;font-family:var(--mono);text-align:left}.tool-label.svelte-6z343n{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}.tool-arrow.svelte-6z343n{color:var(--text-2);margin-right:6px}.tool-status.svelte-6z343n{color:var(--accent);font-size:10px;flex-shrink:0;margin-left:8px}.tool-status.error.svelte-6z343n{color:var(--red)}.tool-detail.svelte-6z343n{padding:10px;background:var(--bg-1)}.tool-section-label.svelte-6z343n{margin-bottom:6px;color:var(--text-2)}.tool-pre.svelte-6z343n{color:var(--text-1);white-space:pre-wrap;word-break:break-all;font-size:11px;line-height:1.5}.tool-output.svelte-6z343n{max-height:200px;overflow:auto}.tool-output.error.svelte-6z343n{color:var(--red)}.image-strip.svelte-6z343n{display:flex;gap:8px;padding:8px 0;border-top:1px solid var(--border);overflow-x:auto}.image-preview.svelte-6z343n{position:relative;flex-shrink:0}.preview-thumb.svelte-6z343n{height:60px;border-radius:var(--radius);border:1px solid var(--border)}.remove-image.svelte-6z343n{position:absolute;top:-4px;right:-4px;width:18px;height:18px;border-radius:50%;background:var(--bg-3);color:var(--text-1);font-size:11px;display:flex;align-items:center;justify-content:center;border:1px solid var(--border);cursor:pointer;padding:0}.typing.svelte-6z343n{padding:4px 0;font-size:12px;color:var(--text-2);animation:pulse 1.5s ease infinite}.input-area.svelte-6z343n{border-top:1px solid var(--border);padding:12px 0 0;display:flex;gap:8px}.attach-btn.svelte-6z343n{padding:0 10px;background:var(--bg-2);color:var(--text-1);border-radius:var(--radius);font-size:16px;border:1px solid var(--border);cursor:pointer;flex-shrink:0}.chat-input.svelte-6z343n{flex:1;background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);padding:10px 12px;color:var(--text-0);font-family:var(--mono);font-size:13px;resize:none;outline:none;overflow:hidden;transition:border-color .15s}.chat-input.svelte-6z343n:focus{border-color:var(--border-bright)}.send-btn.svelte-6z343n{padding:0 16px;background:var(--bg-3);color:var(--text-2);border-radius:var(--radius);font-size:12px;font-weight:500;transition:all .15s}.send-btn.active.svelte-6z343n{background:var(--accent-dim);color:var(--accent)}.main-frame.svelte-n1trtr{height:100%;overflow:hidden;display:flex;flex-direction:column}.frame-content.svelte-n1trtr{flex:1;overflow:auto;min-height:0}.frame-content.padded.svelte-n1trtr{padding:24px}.breadcrumbs.svelte-n1trtr{display:flex;align-items:center;gap:6px;padding:8px 16px;font-family:var(--font-mono, monospace);font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--text-2);border-bottom:1px solid var(--border);flex-shrink:0}.breadcrumb-link.svelte-n1trtr{background:none;border:none;padding:0;font:inherit;text-transform:inherit;letter-spacing:inherit;color:var(--text-1);cursor:pointer}.breadcrumb-link.svelte-n1trtr:hover{color:var(--accent)}.breadcrumb-sep.svelte-n1trtr,.breadcrumb-current.svelte-n1trtr{color:var(--text-2)}.page-iframe.svelte-n1trtr{width:100%;height:100%;border:none;background:#fff}.event.svelte-173x8i5{position:relative;padding:6px 8px 6px 20px;animation:fadeIn .2s ease both}.event.svelte-173x8i5:after{content:"";position:absolute;left:-2px;top:12px;bottom:-12px;width:2px;background:var(--type-color);opacity:0;transition:opacity .15s}.event.svelte-173x8i5:hover:after{opacity:1}.event.collapsible.svelte-173x8i5{cursor:pointer}.marker.svelte-173x8i5{position:absolute;left:-5px;top:12px;width:8px;height:8px;border-radius:50%;z-index:1}.event-header.svelte-173x8i5{display:flex;align-items:center;gap:8px;margin-bottom:4px}.time.svelte-173x8i5{font-size:10px;color:var(--text-2);flex-shrink:0}.type-badge.svelte-173x8i5{font-size:10px;padding:1px 6px;border-radius:12px;font-weight:500}.channel-tag.svelte-173x8i5{font-size:10px;color:var(--text-2);background:var(--bg-3);padding:1px 6px;border-radius:var(--radius)}.chevron.svelte-173x8i5{font-size:9px;color:var(--text-2)}.event-body.svelte-173x8i5{font-size:13px;line-height:1.6}.sender.svelte-173x8i5{font-size:11px;font-weight:600;text-transform:uppercase;margin-right:8px}.sender.inbound.svelte-173x8i5{color:var(--blue)}.sender.outbound.svelte-173x8i5{color:var(--accent)}.user-text.svelte-173x8i5{display:inline;white-space:pre-wrap;color:var(--text-0)}.summary.svelte-173x8i5{font-size:12px;color:var(--text-1)}.summary.error.svelte-173x8i5{color:var(--red)}.dim.svelte-173x8i5{color:var(--text-2)}.detail.svelte-173x8i5,.detail-text.svelte-173x8i5{margin-top:6px;font-size:11px;background:var(--bg-3);border:1px solid var(--border);border-radius:var(--radius);padding:8px 10px;overflow-x:auto;max-height:400px;overflow-y:auto;white-space:pre-wrap;word-break:break-all}.detail.svelte-173x8i5{font-family:var(--mono)}.detail.error.svelte-173x8i5{color:var(--red);border-color:var(--red-dim)}.detail-text.svelte-173x8i5{color:var(--text-2)}.usage-line.svelte-173x8i5{font-size:12px;color:var(--purple)}.model.svelte-173x8i5{color:var(--text-2);margin-left:6px;font-size:11px}.session-id.svelte-173x8i5{font-size:11px;color:var(--text-1);font-weight:600;margin-left:4px}.filters.svelte-h6u4xu{display:flex;gap:8px;align-items:center;flex-wrap:wrap;padding:8px 0 12px;border-bottom:1px solid var(--border)}.custom-select.svelte-h6u4xu{position:relative}.select-trigger.svelte-h6u4xu{display:flex;align-items:center;gap:6px;background:var(--bg-2);color:var(--text-1);border:1px solid var(--border);border-radius:var(--radius);padding:4px 8px 4px 10px;font-size:12px;font-family:var(--mono);cursor:pointer;transition:border-color .15s,color .15s;min-width:120px;text-align:left}.select-trigger.svelte-h6u4xu:hover{border-color:var(--border-bright);color:var(--text-0)}.custom-select.open.svelte-h6u4xu .select-trigger:where(.svelte-h6u4xu){border-color:var(--border-bright);color:var(--text-0)}.select-value.svelte-h6u4xu{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select-arrow.svelte-h6u4xu{font-size:10px;color:var(--text-2);flex-shrink:0}.select-menu.svelte-h6u4xu{position:absolute;top:calc(100% + 4px);left:0;min-width:100%;max-height:240px;overflow-y:auto;background:var(--bg-2);border:1px solid var(--border-bright);border-radius:var(--radius);z-index:10;box-shadow:0 4px 16px #0006}.select-option.svelte-h6u4xu{display:block;width:100%;text-align:left;padding:6px 10px;font-size:12px;font-family:var(--mono);color:var(--text-1);background:none;border:none;cursor:pointer;white-space:nowrap;transition:background .1s,color .1s}.select-option.svelte-h6u4xu:hover{background:var(--bg-3);color:var(--text-0)}.select-option.selected.svelte-h6u4xu{color:var(--accent)}.option-meta.svelte-h6u4xu{color:var(--text-2);margin-left:6px}.types-menu.svelte-h6u4xu{min-width:140px}.types-actions.svelte-h6u4xu{display:flex;gap:4px;padding:4px 8px;border-bottom:1px solid var(--border)}.types-action.svelte-h6u4xu{font-size:10px;font-family:var(--mono);color:var(--text-2);background:none;border:none;cursor:pointer;padding:2px 6px;border-radius:var(--radius)}.types-action.svelte-h6u4xu:hover{color:var(--text-1);background:var(--bg-3)}.type-option.svelte-h6u4xu{display:flex;align-items:center;gap:8px}.type-dot.svelte-h6u4xu{width:6px;height:6px;border-radius:50%;flex-shrink:0;transition:background .15s}.live-pill.svelte-h6u4xu{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:12px;font-size:11px;cursor:pointer;border:1px solid var(--border);background:var(--bg-3);color:var(--text-2);font-family:var(--mono);transition:all .15s}.live-pill.svelte-h6u4xu:hover{border-color:var(--border-bright);color:var(--text-1)}.live-pill.active.svelte-h6u4xu{border-color:var(--accent-border);background:color-mix(in srgb,var(--accent) 8%,transparent);color:var(--text-0)}.live-dot.svelte-h6u4xu{width:6px;height:6px;border-radius:50%;background:var(--text-2);flex-shrink:0;transition:background .15s}.live-dot.active.svelte-h6u4xu{background:var(--accent);animation:pulse 2s infinite}.divider.svelte-c707oo{display:flex;align-items:center;gap:12px;margin:20px 0 16px}.line.svelte-c707oo{flex:1;border-top:1px solid var(--border)}.label.svelte-c707oo{font-size:11px;color:var(--text-2);white-space:nowrap;display:flex;align-items:center;gap:6px}.session-id.svelte-c707oo{color:var(--text-1);font-weight:600}.sep.svelte-c707oo{color:var(--border-bright)}.history.svelte-i5te79{display:flex;flex-direction:column;height:100%;overflow:hidden;position:relative}.timeline.svelte-i5te79{flex:1;overflow:auto;padding-top:8px}.timeline-rail.svelte-i5te79{position:relative;padding-left:4px;margin-left:3px}.timeline-rail.svelte-i5te79:before{content:"";position:absolute;left:2px;top:0;bottom:0;width:2px;background:var(--timeline-rail)}.error.svelte-i5te79{color:var(--red);text-align:center;padding:40px;font-size:13px}.empty.svelte-i5te79{color:var(--text-2);text-align:center;padding:40px;font-size:13px}.load-older.svelte-i5te79{padding:8px 0 16px;text-align:center}.load-older-btn.svelte-i5te79{padding:4px 14px;background:var(--bg-3);color:var(--text-1);border-radius:var(--radius);font-size:11px}.loading-more.svelte-i5te79{text-align:center;color:var(--text-2);font-size:12px;padding:12px;animation:pulse 1.5s infinite}.jump-btn.svelte-i5te79{position:absolute;bottom:16px;left:50%;transform:translate(-50%);padding:6px 16px;background:var(--accent-dim);color:var(--accent);border-radius:var(--radius);font-size:12px;animation:fadeIn .2s ease both;z-index:10}.empty.svelte-wh20l9{color:var(--text-2);padding:24px;text-align:center;font-size:13px}.empty.small.svelte-wh20l9{padding:12px}.error.svelte-wh20l9{color:var(--red);padding:8px 0;font-size:12px}.section.svelte-wh20l9{margin-bottom:24px}.section-title.svelte-wh20l9{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-2);margin-bottom:8px}.section-header.svelte-wh20l9{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.info-grid.svelte-wh20l9{display:grid;grid-template-columns:100px 1fr;gap:6px 12px;font-size:13px}.info-label.svelte-wh20l9{color:var(--text-2)}.info-value.svelte-wh20l9{color:var(--text-0)}.setting-row.svelte-wh20l9{display:flex;align-items:center;gap:12px;padding:6px 0}.setting-label.svelte-wh20l9{width:100px;flex-shrink:0;font-size:13px;color:var(--text-1)}.setting-control.svelte-wh20l9{display:flex;align-items:center;gap:6px;flex:1}.setting-input.svelte-wh20l9{background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);padding:4px 8px;font-size:13px;color:var(--text-0);flex:1;font-family:inherit}.setting-input.narrow.svelte-wh20l9{width:80px;flex:0 0 80px}.setting-input.svelte-wh20l9:focus{border-color:var(--accent);outline:none}.setting-select.svelte-wh20l9{background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);padding:4px 8px;font-size:13px;color:var(--text-0);font-family:inherit}.setting-hint.svelte-wh20l9{font-size:12px;color:var(--text-2);flex-shrink:0}.save-btn.svelte-wh20l9{padding:4px 10px;font-size:11px;border-radius:var(--radius);background:var(--accent-dim);color:var(--accent);font-weight:500;flex-shrink:0}.save-btn.svelte-wh20l9:disabled{opacity:.5}.cancel-btn.svelte-wh20l9{padding:4px 10px;font-size:11px;border-radius:var(--radius);background:var(--bg-3);color:var(--text-2);font-weight:500;flex-shrink:0}.add-btn.svelte-wh20l9{padding:4px 12px;font-size:11px;border-radius:var(--radius);background:var(--accent-dim);color:var(--accent);font-weight:500}.env-list.svelte-wh20l9{display:flex;flex-direction:column}.env-row.svelte-wh20l9{display:flex;align-items:center;gap:8px;padding:6px 0;border-bottom:1px solid var(--border);font-size:13px}.env-row.svelte-wh20l9:last-child{border-bottom:none}.env-add-row.svelte-wh20l9{display:flex;align-items:center;gap:6px;padding:6px 0;margin-bottom:8px}.env-key.svelte-wh20l9{font-family:monospace;font-size:12px;color:var(--text-0);flex-shrink:0;min-width:100px;display:flex;align-items:center;gap:6px}.env-source.svelte-wh20l9{font-family:inherit;font-size:10px;padding:1px 4px;border-radius:4px;background:var(--bg-3);color:var(--text-2)}.env-value.svelte-wh20l9{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:monospace;font-size:12px;color:var(--text-1)}.env-value.masked.svelte-wh20l9{color:var(--text-2)}.env-input.svelte-wh20l9{background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);padding:4px 8px;font-size:12px;color:var(--text-0);font-family:monospace}.env-input.key.svelte-wh20l9{width:120px;flex-shrink:0}.env-input.value.svelte-wh20l9{flex:1}.icon-btn.svelte-wh20l9{padding:2px 6px;font-size:10px;border-radius:var(--radius);background:var(--bg-3);color:var(--text-2);flex-shrink:0}.icon-btn.svelte-wh20l9:hover{color:var(--text-0)}.icon-btn.danger.svelte-wh20l9:hover{color:var(--red)}.modal-body.svelte-l4ioia{flex:1;overflow:auto;padding:8px 16px 16px}.error.svelte-l4ioia{color:var(--red);padding:8px 0;font-size:12px}.empty.svelte-l4ioia{color:var(--text-2);padding:24px;text-align:center;font-size:13px}.skill-list.svelte-l4ioia{display:flex;flex-direction:column}.skill-row.svelte-l4ioia{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 0;border-bottom:1px solid var(--border)}.skill-row.svelte-l4ioia:last-child{border-bottom:none}.skill-info.svelte-l4ioia{flex:1;min-width:0}.skill-name.svelte-l4ioia{font-size:13px;font-weight:500;color:var(--text-0)}.skill-desc.svelte-l4ioia{font-size:12px;color:var(--text-1);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.skill-meta.svelte-l4ioia{font-size:11px;color:var(--text-2);margin-top:2px}.skill-actions.svelte-l4ioia{flex-shrink:0}.installed-tag.svelte-l4ioia{font-size:11px;color:var(--text-2);font-style:italic}.action-btn.svelte-l4ioia{padding:4px 10px;font-size:11px;border-radius:var(--radius);font-weight:500}.action-btn.svelte-l4ioia:disabled{opacity:.5}.install-btn.svelte-l4ioia{background:var(--accent-dim);color:var(--accent)}.error.svelte-jfofjj{color:var(--red);padding:8px 12px;font-size:12px}.empty.svelte-jfofjj{color:var(--text-2);padding:24px;text-align:center;font-size:13px}.section-header.svelte-jfofjj{display:flex;align-items:center;justify-content:space-between;padding:8px 12px}.section-title.svelte-jfofjj{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-2)}.add-btn.svelte-jfofjj{padding:4px 12px;font-size:11px;border-radius:var(--radius);background:var(--accent-dim);color:var(--accent);font-weight:500}.skill-list.svelte-jfofjj{display:flex;flex-direction:column}.skill-row.svelte-jfofjj{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 12px;border-bottom:1px solid var(--border)}.skill-row.svelte-jfofjj:last-child{border-bottom:none}.skill-row.svelte-jfofjj:hover{background:var(--bg-2)}.skill-info.svelte-jfofjj{flex:1;min-width:0}.skill-name.svelte-jfofjj{font-size:13px;font-weight:500;color:var(--text-0);display:flex;align-items:center;gap:8px}.skill-desc.svelte-jfofjj{font-size:12px;color:var(--text-1);margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.skill-meta.svelte-jfofjj{font-size:11px;color:var(--text-2);margin-top:2px}.update-badge.svelte-jfofjj{font-size:10px;padding:1px 6px;border-radius:8px;background:var(--accent-dim);color:var(--accent);font-weight:500}.upstream-tag.svelte-jfofjj{color:var(--text-2)}.local-tag.svelte-jfofjj{font-style:italic;color:var(--text-2)}.skill-actions.svelte-jfofjj{display:flex;gap:4px;flex-shrink:0}.action-btn.svelte-jfofjj{padding:4px 10px;font-size:11px;border-radius:var(--radius);font-weight:500}.action-btn.svelte-jfofjj:disabled{opacity:.5}.update-btn.svelte-jfofjj{background:var(--accent-dim);color:var(--accent)}.publish-btn.svelte-jfofjj{background:var(--bg-3);color:var(--text-1)}.remove-btn.svelte-jfofjj{background:var(--bg-3);color:var(--text-2)}.remove-btn.svelte-jfofjj:hover{color:var(--red)}.error.svelte-16y8q82{color:var(--red);padding:16px}.empty.svelte-16y8q82{color:var(--text-2);padding:24px;text-align:center}.table-wrap.svelte-16y8q82{overflow:auto}.variant-table.svelte-16y8q82{width:100%;border-collapse:collapse;font-size:13px}.variant-table.svelte-16y8q82 th:where(.svelte-16y8q82){text-align:left;color:var(--text-2);font-size:11px;text-transform:uppercase;letter-spacing:.04em;padding:8px 12px;border-bottom:1px solid var(--border);font-weight:500}.variant-row.svelte-16y8q82{animation:fadeIn .2s ease both}.variant-row.svelte-16y8q82 td:where(.svelte-16y8q82){padding:10px 12px;border-bottom:1px solid var(--border)}.name-cell.svelte-16y8q82{color:var(--text-0);font-weight:500}.branch-cell.svelte-16y8q82{color:var(--text-1)}.port-cell.svelte-16y8q82{color:var(--text-2)}.modal-header.svelte-5k8fm{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--border);padding:0 16px;flex-shrink:0}.header-left.svelte-5k8fm{display:flex;align-items:center;gap:10px}.mind-name.svelte-5k8fm{font-size:14px;font-weight:600;color:var(--text-0)}.header-right.svelte-5k8fm{display:flex;align-items:center;gap:0}.close-btn.svelte-5k8fm{background:none;color:var(--text-2);font-size:14px;padding:4px 8px;margin-left:8px}.close-btn.svelte-5k8fm:hover{color:var(--text-0)}.modal-body.svelte-5k8fm{flex:1;overflow:auto;padding:16px}.error-msg.svelte-5k8fm{color:var(--red);margin-bottom:12px;font-size:13px}.action-btn.svelte-5k8fm{padding:4px 12px;border-radius:var(--radius);font-size:11px;font-weight:500;transition:opacity .15s}.start-btn.svelte-5k8fm{background:var(--accent-dim);color:var(--accent)}.stop-btn.svelte-5k8fm{background:var(--red-dim);color:var(--red)}.connections-empty.svelte-5k8fm{color:var(--text-2);padding:24px;text-align:center}.connections-list.svelte-5k8fm{padding:8px 0;display:flex;flex-direction:column;gap:12px}.connection-card.svelte-5k8fm{display:flex;align-items:flex-start;gap:16px;padding:16px;background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius-lg)}.connection-icon.svelte-5k8fm{width:40px;height:40px;border-radius:var(--radius);background:var(--bg-3);display:flex;align-items:center;justify-content:center;font-size:18px;color:var(--accent);flex-shrink:0}.connection-info.svelte-5k8fm{flex:1;min-width:0}.connection-header.svelte-5k8fm{display:flex;align-items:center;gap:8px;margin-bottom:6px}.connection-name.svelte-5k8fm{font-weight:600;color:var(--text-0)}.connection-bot.svelte-5k8fm{font-size:13px;color:var(--text-1);margin-bottom:4px}.bot-name.svelte-5k8fm{color:var(--text-0)}.connection-time.svelte-5k8fm{font-size:11px;color:var(--text-2)}.modal-content.svelte-sa0ylk{padding:20px;display:flex;flex-direction:column;gap:12px;max-height:60vh;overflow:auto}.modal-title.svelte-sa0ylk{font-weight:600;color:var(--text-0);font-size:14px}.title-input.svelte-sa0ylk{background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);padding:8px 10px;color:var(--text-0);font-size:12px;outline:none;font-family:var(--mono)}.hint.svelte-sa0ylk{color:var(--text-2);font-size:11px;padding:8px}.error.svelte-sa0ylk{color:var(--red);font-size:11px}.tag-input-wrapper.svelte-sa0ylk{position:relative}.tag-input.svelte-sa0ylk{display:flex;flex-wrap:wrap;align-items:center;gap:4px;background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);padding:6px 8px;min-height:32px;cursor:text}.tag-input.svelte-sa0ylk:focus-within{border-color:var(--accent)}.tag.svelte-sa0ylk{display:flex;align-items:center;gap:4px;background:var(--bg-3);border-radius:3px;padding:2px 6px;font-size:11px;color:var(--text-0);white-space:nowrap}.tag-name.svelte-sa0ylk{line-height:1}.tag-remove.svelte-sa0ylk{cursor:pointer;color:var(--text-2);font-size:13px;line-height:1;margin-left:2px}.tag-remove.svelte-sa0ylk:hover{color:var(--text-0)}.dot.svelte-sa0ylk{width:6px;height:6px;border-radius:50%;flex-shrink:0}.tag-text-input.svelte-sa0ylk{flex:1;min-width:60px;background:none;border:none;outline:none;color:var(--text-0);font-size:12px;padding:2px 0;font-family:var(--mono)}.tag-text-input.svelte-sa0ylk::placeholder{color:var(--text-2)}.dropdown.svelte-sa0ylk{position:absolute;top:100%;left:0;right:0;margin-top:4px;background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius);max-height:200px;overflow:auto;z-index:10}.dropdown-item.svelte-sa0ylk{display:flex;align-items:center;gap:8px;padding:6px 10px;cursor:pointer;font-size:12px;color:var(--text-0)}.dropdown-item.svelte-sa0ylk:hover{background:var(--bg-2)}.item-name.svelte-sa0ylk{flex:1;overflow:hidden;text-overflow:ellipsis}.item-badge.svelte-sa0ylk{color:var(--accent);font-size:10px;flex-shrink:0}.actions.svelte-sa0ylk{display:flex;gap:8px;justify-content:flex-end}.cancel-btn.svelte-sa0ylk{padding:6px 14px;background:var(--bg-2);color:var(--text-1);border-radius:var(--radius);font-size:12px;border:1px solid var(--border)}.create-btn.svelte-sa0ylk{padding:6px 14px;background:var(--accent-dim);color:var(--accent);border-radius:var(--radius);font-size:12px;font-weight:500}.modal-content.svelte-esytdb{padding:24px;display:flex;flex-direction:column;gap:14px}.modal-title.svelte-esytdb{font-weight:600;color:var(--text-0);font-size:14px}.field.svelte-esytdb{display:flex;flex-direction:column;gap:4px}.label.svelte-esytdb{color:var(--text-2);font-size:11px}.input.svelte-esytdb{background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);padding:8px 10px;color:var(--text-0);font-size:13px;outline:none;font-family:var(--mono)}.select.svelte-esytdb{appearance:auto}.error.svelte-esytdb{color:var(--red);font-size:11px}.actions.svelte-esytdb{display:flex;gap:8px;justify-content:flex-end}.cancel-btn.svelte-esytdb{padding:6px 14px;background:var(--bg-2);color:var(--text-1);border-radius:var(--radius);font-size:12px;border:1px solid var(--border)}.plant-btn.svelte-esytdb{padding:6px 14px;background:var(--yellow);color:var(--bg-0);border-radius:var(--radius);font-size:12px;font-weight:600}.advanced-toggle.svelte-esytdb{background:transparent;color:var(--text-2);font-size:11px;font-family:var(--mono);border:none;cursor:pointer;padding:0;display:flex;align-items:center;gap:4px;transition:color .15s}.advanced-toggle.svelte-esytdb:hover{color:var(--text-1)}.caret.svelte-esytdb{font-size:8px}.textarea.svelte-esytdb{resize:vertical;min-height:80px;font-size:12px;line-height:1.5}.hint.svelte-esytdb{color:var(--text-2);font-size:10px;font-family:var(--mono)}.skill-list.svelte-esytdb{display:flex;flex-direction:column;gap:4px}.skill-item.svelte-esytdb{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--text-1);cursor:pointer}.skill-name.svelte-esytdb{font-family:var(--mono)}.conv-list.svelte-2bx51q{display:flex;flex-direction:column}.section-header.svelte-2bx51q{display:flex;align-items:center;justify-content:space-between;padding:10px 12px 4px;font-size:10px;font-weight:600;color:var(--text-2);letter-spacing:.05em;text-transform:uppercase}.browse-btn.svelte-2bx51q{font-size:10px;color:var(--accent);background:none;padding:0;text-transform:lowercase;letter-spacing:0;font-weight:500}.conv-item.svelte-2bx51q{padding:6px 12px;margin:0 4px;cursor:pointer;border-radius:var(--radius);display:flex;flex-direction:column;gap:2px;transition:background .1s}.conv-item.svelte-2bx51q:hover{background:var(--bg-2)}.conv-item.active.svelte-2bx51q{background:var(--bg-3)}.conv-item-header.svelte-2bx51q{display:flex;align-items:center;justify-content:space-between;gap:4px}.conv-item-label.svelte-2bx51q{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px;color:var(--text-1);display:flex;align-items:center;gap:6px}.conv-item-label.active.svelte-2bx51q{color:var(--text-0)}.conv-label-text.svelte-2bx51q{overflow:hidden;text-overflow:ellipsis}.conv-label-mind.svelte-2bx51q{overflow:hidden;text-overflow:ellipsis;background:none;border:none;padding:0;font:inherit;color:inherit;cursor:pointer}.conv-label-mind.svelte-2bx51q:hover{text-decoration:underline}.seed-tag.svelte-2bx51q{font-size:9px;color:var(--yellow);flex-shrink:0}.delete-btn.svelte-2bx51q{background:transparent;color:var(--text-2);font-size:11px;padding:0 4px;flex-shrink:0}.menu-btn.svelte-2bx51q{background:transparent;color:var(--text-2);font-size:11px;padding:0 4px;flex-shrink:0;opacity:0;transition:opacity .1s;letter-spacing:1px}.conv-item.svelte-2bx51q:hover .menu-btn:where(.svelte-2bx51q),.menu-btn.visible.svelte-2bx51q{opacity:1}.menu-btn.svelte-2bx51q:hover{color:var(--text-0)}.member-count.svelte-2bx51q{font-size:10px;color:var(--text-2);padding-left:1px}.status-dot.svelte-2bx51q{width:7px;height:7px;border-radius:50%;flex-shrink:0;border:none;padding:0;cursor:pointer}.status-dot.iridescent.svelte-2bx51q{animation:svelte-2bx51q-iridescent 3s ease-in-out infinite}@keyframes svelte-2bx51q-iridescent{0%{background:#4ade80}16%{background:#60a5fa}33%{background:#c084fc}50%{background:#f472b6}66%{background:#fbbf24}83%{background:#34d399}to{background:#4ade80}}.status-dot.svelte-2bx51q:hover{transform:scale(1.3)}.empty.svelte-2bx51q{color:var(--text-2);font-size:11px;padding:8px 12px;text-align:center}.context-menu.svelte-2bx51q{position:fixed;background:var(--bg-1);border:1px solid var(--border);border-radius:var(--radius);padding:4px 0;z-index:200;min-width:120px;box-shadow:0 4px 12px #0000004d}.context-item.svelte-2bx51q{display:block;width:100%;padding:6px 12px;background:none;color:var(--text-1);font-size:12px;text-align:left;white-space:nowrap}.context-item.svelte-2bx51q:hover{background:var(--bg-2);color:var(--text-0)}.sidebar-inner.svelte-k3swf5{display:flex;flex-direction:column;height:100%;overflow:hidden}.sidebar-header.svelte-k3swf5{padding:12px 12px 8px;font-size:13px;font-weight:600;color:var(--text-1);letter-spacing:.02em;flex-shrink:0;background:none;text-align:left;cursor:pointer}.sidebar-header.svelte-k3swf5:hover{color:var(--text-0)}.sections.svelte-k3swf5{flex:1;overflow-y:auto;overflow-x:hidden;padding-top:4px}.section.svelte-k3swf5{margin-bottom:2px}.section-header-row.svelte-k3swf5{display:flex;align-items:center;padding-right:8px}.section-toggle.svelte-k3swf5{display:flex;align-items:center;gap:4px;flex:1;padding:6px 12px;background:none;color:var(--text-2);font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;text-align:left}.section-toggle.svelte-k3swf5:hover{color:var(--text-1)}.toggle-icon.svelte-k3swf5{font-size:9px;width:10px}.section-add.svelte-k3swf5{background:none;color:var(--text-2);font-size:14px;padding:2px 6px;border-radius:var(--radius);flex-shrink:0}.section-add.svelte-k3swf5:hover{color:var(--text-0);background:var(--bg-2)}.site-list.svelte-k3swf5{display:flex;flex-direction:column}.site-item.svelte-k3swf5{display:block;width:100%;padding:6px 12px 6px 26px;font-size:11px;color:var(--text-1);border-radius:var(--radius);transition:background .1s;cursor:pointer;background:none;text-align:left;margin:0 4px}.site-item.svelte-k3swf5:hover{background:var(--bg-2)}.status-bar.svelte-cuxhxk{height:28px;display:flex;align-items:center;justify-content:space-between;padding:0 12px;background:var(--bg-1);border-top:1px solid var(--border);font-size:11px;color:var(--text-2);flex-shrink:0}.status-left.svelte-cuxhxk,.status-right.svelte-cuxhxk{display:flex;align-items:center;gap:8px}.dot.svelte-cuxhxk{width:6px;height:6px;border-radius:50%;background:var(--accent);display:inline-block;flex-shrink:0}.dot.disconnected.svelte-cuxhxk{background:var(--red)}.sep.svelte-cuxhxk{color:var(--border)}.menu-anchor.svelte-cuxhxk{position:relative}.status-btn.svelte-cuxhxk{background:none;color:var(--text-2);font-size:11px;padding:2px 4px;display:flex;align-items:center;gap:5px;border-radius:3px}.status-btn.svelte-cuxhxk:hover{color:var(--text-0);background:var(--bg-2)}.username-btn.svelte-cuxhxk{color:var(--text-1)}.dropdown.svelte-cuxhxk{position:absolute;bottom:calc(100% + 4px);left:0;background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);min-width:120px;padding:4px 0;z-index:100;box-shadow:0 -2px 8px #0000004d}.dropdown.right.svelte-cuxhxk{left:auto;right:0}.dropdown-item.svelte-cuxhxk{display:block;width:100%;text-align:left;padding:6px 12px;background:none;color:var(--text-1);font-size:11px;white-space:nowrap}.dropdown-item.svelte-cuxhxk:hover{background:var(--bg-3);color:var(--text-0)}.minds-dropdown.svelte-cuxhxk{min-width:160px}.mind-item.svelte-cuxhxk{display:flex;align-items:center;gap:8px}.mind-dot.svelte-cuxhxk{width:6px;height:6px;border-radius:50%;flex-shrink:0}.mind-dot.iridescent.svelte-cuxhxk{animation:svelte-cuxhxk-iridescent 3s ease-in-out infinite}@keyframes svelte-cuxhxk-iridescent{0%{background:#4ade80}16%{background:#60a5fa}33%{background:#c084fc}50%{background:#f472b6}66%{background:#fbbf24}83%{background:#34d399}to{background:#4ade80}}.dropdown-divider.svelte-cuxhxk{height:1px;background:var(--border);margin:4px 0}.seed-item.svelte-cuxhxk{color:var(--accent)}.banner.svelte-h3c10m{display:flex;align-items:center;justify-content:center;gap:12px;padding:6px 16px;background:var(--accent-bg);border-bottom:1px solid var(--accent-dim);color:var(--accent);font-size:12px;font-family:var(--mono);flex-shrink:0}.update-btn.svelte-h3c10m{background:var(--accent-dim);color:var(--accent);border:1px solid var(--accent);border-radius:var(--radius);padding:2px 10px;font-size:11px;font-family:var(--mono);cursor:pointer}.dismiss-btn.svelte-h3c10m{background:transparent;color:var(--accent);border:none;font-size:16px;line-height:1;cursor:pointer;padding:0 4px}.error.svelte-h3c10m{color:var(--red)}.updating.svelte-h3c10m{animation:pulse 1.5s ease-in-out infinite}.modal-body.svelte-1453wyc{padding:16px}.section-title.svelte-1453wyc{font-size:12px;font-weight:600;color:var(--text-1);margin:0 0 12px}.field.svelte-1453wyc{display:block;margin-bottom:10px}.label.svelte-1453wyc{display:block;font-size:11px;color:var(--text-2);margin-bottom:4px}input.svelte-1453wyc{width:100%;padding:6px 10px;background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);color:var(--text-0);font-size:12px;font-family:var(--mono);box-sizing:border-box}input.svelte-1453wyc:focus{outline:none;border-color:var(--accent)}.save-btn.svelte-1453wyc{margin-top:4px;padding:6px 14px;background:var(--accent-dim);color:var(--accent);border-radius:var(--radius);font-size:11px;font-weight:500}.save-btn.svelte-1453wyc:hover:not(:disabled){background:var(--accent);color:var(--bg-0)}.save-btn.svelte-1453wyc:disabled{opacity:.5}.message.svelte-1453wyc{font-size:11px;padding:6px 10px;border-radius:var(--radius);margin-bottom:10px}.message.error.svelte-1453wyc{color:var(--red);background:var(--red-bg)}.message.success.svelte-1453wyc{color:var(--accent);background:var(--accent-dim)}.loading.svelte-14lg4b7{color:var(--text-2);padding:24px;text-align:center}.full-height.svelte-14lg4b7{height:100%}.shell.svelte-14lg4b7{height:100%;display:flex;flex-direction:column}.shell-body.svelte-14lg4b7{flex:1;display:flex;overflow:hidden}.sidebar.svelte-14lg4b7{display:flex;flex-direction:column;flex-shrink:0;border-right:1px solid var(--border);background:var(--bg-1);overflow:hidden}.resize-handle.svelte-14lg4b7{width:4px;cursor:col-resize;flex-shrink:0;background:transparent;transition:background .15s}.resize-handle.svelte-14lg4b7:hover{background:var(--border)}.main-frame.svelte-14lg4b7{flex:1;overflow:hidden;min-width:0}:root{--bg-0: #0a0c0f;--bg-1: #11141a;--bg-2: #181c24;--bg-3: #1f2430;--border: #2a3040;--border-bright: #3a4560;--text-0: #e8ecf4;--text-1: #a0aabb;--text-2: #6a7588;--accent: #4ade80;--accent-dim: #22613e;--accent-bg: rgba(74, 222, 128, .08);--red: #f87171;--red-dim: #7f1d1d;--yellow: #fbbf24;--yellow-dim: #78350f;--blue: #60a5fa;--purple: #c084fc;--overlay: rgba(0, 0, 0, .6);--yellow-bg: rgba(251, 191, 36, .08);--blue-bg: rgba(96, 165, 250, .08);--red-bg: rgba(248, 113, 113, .08);--muted-bg: rgba(106, 117, 136, .08);--red-border: rgba(248, 113, 113, .2);--accent-border: rgba(74, 222, 128, .2);--timeline-rail: #333;--mono: "IBM Plex Mono", "SF Mono", "Fira Code", monospace;--radius: 6px;--radius-lg: 10px}*{margin:0;padding:0;box-sizing:border-box}html,body,#root{height:100%;background:var(--bg-0);color:var(--text-0);font-family:var(--mono);font-size:13px;line-height:1.6;-webkit-font-smoothing:antialiased}::selection{background:var(--accent-dim);color:var(--accent)}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--border-bright)}a{color:inherit;text-decoration:none}button{font-family:var(--mono);cursor:pointer;border:none}button:focus{outline:none}button:focus-visible{outline:1px solid var(--accent);outline-offset:2px}a:focus-visible{outline:1px solid var(--accent);outline-offset:2px}.app{height:100%;display:flex;flex-direction:column}@keyframes fadeIn{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}@keyframes slideIn{0%{opacity:0;transform:translate(-8px)}to{opacity:1;transform:translate(0)}}.markdown-body{word-break:break-word;color:var(--text-0);line-height:1.6}.markdown-body p{margin:0 0 8px}.markdown-body p:last-child{margin-bottom:0}.markdown-body pre{background:var(--bg-3);border:1px solid var(--border);border-radius:var(--radius);padding:10px 12px;overflow-x:auto;margin:8px 0;font-size:12px;line-height:1.5}.markdown-body code{font-family:var(--mono);font-size:12px;background:var(--bg-3);padding:1px 4px;border-radius:3px}.markdown-body pre code{background:none;padding:0}.markdown-body a{color:var(--blue);text-decoration:underline}.markdown-body ul,.markdown-body ol{margin:4px 0;padding-left:20px}.markdown-body li{margin:2px 0}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin:12px 0 6px;font-weight:600;color:var(--text-0)}.markdown-body h1{font-size:18px}.markdown-body h2{font-size:16px}.markdown-body h3{font-size:14px}.markdown-body blockquote{border-left:3px solid var(--border-bright);margin:8px 0;padding:4px 12px;color:var(--text-1)}.markdown-body table{border-collapse:collapse;margin:8px 0}.markdown-body th,.markdown-body td{border:1px solid var(--border);padding:6px 10px;font-size:12px}.markdown-body th{background:var(--bg-3);font-weight:600}.markdown-body hr{border:none;border-top:1px solid var(--border);margin:12px 0}
@@ -7,8 +7,8 @@
7
7
  <link rel="preconnect" href="https://fonts.googleapis.com" />
8
8
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
9
9
  <link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,300;0,400;0,500;0,600;1,400&display=swap" rel="stylesheet" />
10
- <script type="module" crossorigin src="/assets/index-kt1_EcuO.js"></script>
11
- <link rel="stylesheet" crossorigin href="/assets/index-CtiimdWK.css">
10
+ <script type="module" crossorigin src="/assets/index-CUZTZzaW.js"></script>
11
+ <link rel="stylesheet" crossorigin href="/assets/index-adVuCkqy.css">
12
12
  </head>
13
13
  <body>
14
14
  <div id="root"></div>
@@ -0,0 +1,12 @@
1
+ CREATE TABLE `delivery_queue` (
2
+ `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
3
+ `mind` text NOT NULL,
4
+ `session` text NOT NULL,
5
+ `channel` text,
6
+ `sender` text,
7
+ `status` text NOT NULL DEFAULT 'pending',
8
+ `payload` text NOT NULL,
9
+ `created_at` text DEFAULT (datetime('now')) NOT NULL
10
+ );--> statement-breakpoint
11
+ CREATE INDEX `idx_delivery_queue_mind_session` ON `delivery_queue` (`mind`, `session`);--> statement-breakpoint
12
+ CREATE INDEX `idx_delivery_queue_mind_status` ON `delivery_queue` (`mind`, `status`);
@@ -0,0 +1 @@
1
+ UPDATE `users` SET `user_type` = 'brain' WHERE `user_type` = 'human';
@@ -0,0 +1,11 @@
1
+ CREATE TABLE `activity` (
2
+ `id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
3
+ `type` text NOT NULL,
4
+ `mind` text NOT NULL,
5
+ `summary` text NOT NULL,
6
+ `metadata` text,
7
+ `created_at` text DEFAULT (datetime('now')) NOT NULL
8
+ );
9
+ --> statement-breakpoint
10
+ CREATE INDEX `idx_activity_created_at` ON `activity` (`created_at`);--> statement-breakpoint
11
+ CREATE INDEX `idx_activity_mind` ON `activity` (`mind`);
@@ -0,0 +1,7 @@
1
+ {
2
+ "id": "0010_delivery_queue",
3
+ "prevId": "0009_shared_skills",
4
+ "version": "6",
5
+ "dialect": "sqlite",
6
+ "tables": {}
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "id": "0011_rename_human_to_brain",
3
+ "prevId": "0010_delivery_queue",
4
+ "version": "6",
5
+ "dialect": "sqlite",
6
+ "tables": {}
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "id": "0012_activity",
3
+ "prevId": "0011_rename_human_to_brain",
4
+ "version": "6",
5
+ "dialect": "sqlite",
6
+ "tables": {}
7
+ }
@@ -71,6 +71,27 @@
71
71
  "when": 1771800000000,
72
72
  "tag": "0009_shared_skills",
73
73
  "breakpoints": true
74
+ },
75
+ {
76
+ "idx": 10,
77
+ "version": "6",
78
+ "when": 1771900000000,
79
+ "tag": "0010_delivery_queue",
80
+ "breakpoints": true
81
+ },
82
+ {
83
+ "idx": 11,
84
+ "version": "6",
85
+ "when": 1772000000000,
86
+ "tag": "0011_rename_human_to_brain",
87
+ "breakpoints": true
88
+ },
89
+ {
90
+ "idx": 12,
91
+ "version": "6",
92
+ "when": 1772100000000,
93
+ "tag": "0012_activity",
94
+ "breakpoints": true
74
95
  }
75
96
  ]
76
97
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "volute",
3
- "version": "0.18.0",
3
+ "version": "0.20.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",
@@ -28,10 +28,12 @@
28
28
  ],
29
29
  "scripts": {
30
30
  "dev": "tsx src/cli.ts",
31
- "build": "tsup && npm run build:web",
31
+ "build": "tsup && cp -r skills dist/skills && npm run build:web",
32
32
  "build:web": "vite build --config src/web/ui/vite.config.ts",
33
33
  "dev:web": "vite --config src/web/ui/vite.config.ts",
34
- "test": "node --import tsx --import ./test/setup.ts --test --test-force-exit --test-concurrency=1 test/*.test.ts",
34
+ "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)",
35
+ "test:e2e": "node --import tsx --import ./test/setup.ts --test --test-force-exit --test-concurrency=1 test/daemon-e2e.test.ts",
36
+ "test:all": "npm test && npm run test:e2e",
35
37
  "lint": "biome check src/ test/",
36
38
  "lint:fix": "biome check --write src/ test/",
37
39
  "format": "biome format --write src/ test/",
@@ -11,7 +11,7 @@ SOURCE=$(echo "$INPUT" | jq -r '.source // "startup"')
11
11
  CONTEXT="Session ${SOURCE} at $(date '+%Y-%m-%d %H:%M')."
12
12
 
13
13
  # Active sessions
14
- SESSIONS_DIR=".volute/sessions"
14
+ SESSIONS_DIR=".mind/sessions"
15
15
  if [ -d "$SESSIONS_DIR" ]; then
16
16
  SESSION_LIST=$(ls -1 "$SESSIONS_DIR"/*.json 2>/dev/null | xargs -I{} basename {} .json | sort)
17
17
  if [ -n "$SESSION_LIST" ]; then
@@ -33,8 +33,8 @@ if (!sessionName) {
33
33
 
34
34
  // Detect template type and resolve JSONL path
35
35
  const cwd = process.cwd();
36
- const agentSdkSessions = resolve(cwd, "../.volute/sessions");
37
- const piSessions = resolve(cwd, "../.volute/pi-sessions");
36
+ const agentSdkSessions = resolve(cwd, "../.mind/sessions");
37
+ const piSessions = resolve(cwd, "../.mind/pi-sessions");
38
38
 
39
39
  let jsonlPath: string | null = null;
40
40
  let format: "agent-sdk" | "pi";
@@ -46,7 +46,7 @@ if (existsSync(agentSdkSessions)) {
46
46
  format = "pi";
47
47
  jsonlPath = resolvePiJsonl(piSessions, sessionName);
48
48
  } else {
49
- console.error("No session directory found. Expected .volute/sessions/ or .volute/pi-sessions/");
49
+ console.error("No session directory found. Expected .mind/sessions/ or .mind/pi-sessions/");
50
50
  process.exit(1);
51
51
  }
52
52
 
@@ -1,6 +1,6 @@
1
1
  {
2
- "rules": [{ "channel": "volute:*", "isDM": false, "session": "${channel}" }],
2
+ "rules": [{ "channel": "volute:*", "isDM": false, "session": "group-${channel}" }],
3
3
  "sessions": {
4
- "volute:*": { "batch": { "debounce": 20, "maxWait": 120, "triggers": ["@{{name}}"] } }
4
+ "group-*": { "batch": { "debounce": 20, "maxWait": 120, "triggers": ["@{{name}}"] } }
5
5
  }
6
6
  }
@@ -7,7 +7,7 @@ You are a volute mind — a persistent being that communicates across multiple c
7
7
  **Your text output stays in your session — it is not sent to anyone.** To send a message, you must use the `volute send` command:
8
8
 
9
9
  ```sh
10
- volute send @other-mind "hello" # DM another mind or user
10
+ volute send @other-mind "hello" # DM another user
11
11
  volute send discord:server/channel "hello" # send to a channel
12
12
  volute send animal-chat "hello" # send to a volute channel
13
13
  ```
@@ -34,6 +34,21 @@ Messages are routed to named sessions based on rules in `.config/routes.json`. E
34
34
 
35
35
  Messages from unrecognized channels are held until you add a routing rule. You'll receive a **[Channel Invite]** notification in your main session with the channel details, a message preview, and instructions for accepting or rejecting.
36
36
 
37
+ ## Shared Files
38
+
39
+ Your `shared/` directory is a collaborative space where all minds can work on files together. Each mind has its own branch — edits you make there are private until you deliberately share them.
40
+
41
+ ```sh
42
+ volute shared status # see what you've changed vs main
43
+ volute shared merge "msg" # share your changes with everyone
44
+ volute shared pull # get the latest from other minds
45
+ volute shared log # see recent shared history
46
+ ```
47
+
48
+ Files you edit in `shared/` are auto-committed to your branch. When you're ready to share, merge to main. Other minds get your changes by pulling. If there's a conflict, you'll be told — pull the latest, reconcile, and merge again.
49
+
50
+ The `shared/pages/` directory can be published as the system's shared website with `volute pages publish --system`.
51
+
37
52
  ## Reference
38
53
 
39
54
  See the **volute-mind** skill for routing config syntax, batch options, channel management, and all CLI commands.
@@ -2,6 +2,10 @@ import { execFile } from "node:child_process";
2
2
  import { resolve } from "node:path";
3
3
  import { log } from "./logger.js";
4
4
 
5
+ function gitArgs(args: string[]): string[] {
6
+ return process.env.VOLUTE_ISOLATION === "user" ? ["-c", "safe.directory=*", ...args] : args;
7
+ }
8
+
5
9
  function exec(cmd: string, args: string[], cwd: string): Promise<{ code: number; stdout: string }> {
6
10
  return new Promise((r) => {
7
11
  execFile(cmd, args, { cwd }, (_err, stdout) => {
@@ -16,6 +20,9 @@ let pending = Promise.resolve();
16
20
  /**
17
21
  * Commit a file change in the mind's home directory.
18
22
  * Called by the PostToolUse hook when Edit or Write completes.
23
+ *
24
+ * Files under home/shared/ are committed to the shared worktree repo
25
+ * with mind attribution. All other files go to the mind's own repo.
19
26
  */
20
27
  export function commitFileChange(filePath: string, cwd: string): void {
21
28
  // Only commit files under the home directory
@@ -26,21 +33,51 @@ export function commitFileChange(filePath: string, cwd: string): void {
26
33
  const relativePath = resolved.slice(homeDir.length + 1);
27
34
  if (!relativePath) return;
28
35
 
36
+ // Check if this file is under the shared/ worktree
37
+ const sharedPrefix = "shared/";
38
+ const isShared = relativePath.startsWith(sharedPrefix);
39
+
29
40
  pending = pending.then(async () => {
30
- if ((await exec("git", ["add", relativePath], cwd)).code !== 0) {
31
- log("auto-commit", `git add failed for ${relativePath}`);
32
- return;
33
- }
34
- // Check if there are staged changes
35
- if ((await exec("git", ["diff", "--cached", "--quiet"], cwd)).code === 0) return;
36
-
37
- const message = `Update ${relativePath}`;
38
- if ((await exec("git", ["commit", "-m", message], cwd)).code === 0) {
39
- log("auto-commit", message);
40
- // Push if a remote is configured
41
- const { stdout: remote } = await exec("git", ["remote"], cwd);
42
- if (remote) {
43
- await exec("git", ["push"], cwd);
41
+ if (isShared) {
42
+ // Route to shared worktree
43
+ const sharedCwd = resolve(cwd, "shared");
44
+ const sharedRelative = relativePath.slice(sharedPrefix.length);
45
+ const mindName = process.env.VOLUTE_MIND ?? "unknown";
46
+
47
+ if ((await exec("git", gitArgs(["add", sharedRelative]), sharedCwd)).code !== 0) {
48
+ log("auto-commit", `git add failed for shared/${sharedRelative}`);
49
+ return;
50
+ }
51
+ if ((await exec("git", gitArgs(["diff", "--cached", "--quiet"]), sharedCwd)).code === 0)
52
+ return;
53
+
54
+ const message = `Update ${sharedRelative}`;
55
+ const authorFlag = `${mindName} <${mindName}@volute>`;
56
+ if (
57
+ (await exec("git", gitArgs(["commit", "--author", authorFlag, "-m", message]), sharedCwd))
58
+ .code === 0
59
+ ) {
60
+ log("auto-commit", `[shared] ${message}`);
61
+ } else {
62
+ log("auto-commit", `[shared] commit failed for ${sharedRelative}`);
63
+ }
64
+ // No auto-push for shared files — sharing is deliberate
65
+ } else {
66
+ // Existing behavior: commit to mind's own repo
67
+ if ((await exec("git", ["add", relativePath], cwd)).code !== 0) {
68
+ log("auto-commit", `git add failed for ${relativePath}`);
69
+ return;
70
+ }
71
+ if ((await exec("git", ["diff", "--cached", "--quiet"], cwd)).code === 0) return;
72
+
73
+ const message = `Update ${relativePath}`;
74
+ if ((await exec("git", ["commit", "-m", message], cwd)).code === 0) {
75
+ log("auto-commit", message);
76
+ // Push if a remote is configured
77
+ const { stdout: remote } = await exec("git", ["remote"], cwd);
78
+ if (remote) {
79
+ await exec("git", ["push"], cwd);
80
+ }
44
81
  }
45
82
  }
46
83
  });
@@ -74,6 +74,28 @@ export async function daemonEmit(event: DaemonEvent): Promise<void> {
74
74
  }
75
75
  }
76
76
 
77
+ export async function daemonSendFile(
78
+ targetMind: string,
79
+ filePath: string,
80
+ ): Promise<{ status: string; id?: string; destPath?: string }> {
81
+ if (!port || !mind) {
82
+ throw new Error("[volute] daemonSendFile: VOLUTE_DAEMON_PORT or VOLUTE_MIND not set");
83
+ }
84
+ const res = await fetch(
85
+ `http://127.0.0.1:${port}/api/minds/${encodeURIComponent(mind)}/files/send`,
86
+ {
87
+ method: "POST",
88
+ headers: headers(),
89
+ body: JSON.stringify({ targetMind, filePath }),
90
+ },
91
+ );
92
+ if (!res.ok) {
93
+ const body = await res.text().catch(() => "");
94
+ throw new Error(`daemonSendFile failed (${res.status}): ${body}`);
95
+ }
96
+ return (await res.json()) as { status: string; id?: string; destPath?: string };
97
+ }
98
+
77
99
  export async function daemonSend(channel: string, text: string): Promise<void> {
78
100
  if (!port || !mind) {
79
101
  console.error("[volute] daemonSend: VOLUTE_DAEMON_PORT or VOLUTE_MIND not set");
@@ -15,6 +15,18 @@ export type Router = {
15
15
  meta: ChannelMeta,
16
16
  listener?: Listener,
17
17
  ): { messageId: string; unsubscribe: () => void };
18
+ /** Direct dispatch to a pre-routed session (daemon has already resolved the route). */
19
+ dispatch(
20
+ content: VoluteContentPart[],
21
+ session: string,
22
+ meta: ChannelMeta,
23
+ listener?: Listener,
24
+ ): { messageId: string; unsubscribe: () => void };
25
+ dispatchBatch(
26
+ batch: { channels: Record<string, any[]> },
27
+ session: string,
28
+ meta: ChannelMeta,
29
+ ): void;
18
30
  close(): void;
19
31
  };
20
32
 
@@ -247,6 +259,45 @@ export function createRouter(options: {
247
259
  }
248
260
  }
249
261
 
262
+ /**
263
+ * Direct dispatch to a pre-routed session. The daemon delivery manager has already
264
+ * resolved the route and session — just format and send.
265
+ */
266
+ function dispatch(
267
+ content: VoluteContentPart[],
268
+ session: string,
269
+ meta: ChannelMeta,
270
+ listener?: Listener,
271
+ ): { messageId: string; unsubscribe: () => void } {
272
+ const text = content
273
+ .filter((p): p is { type: "text"; text: string } => p.type === "text")
274
+ .map((p) => p.text)
275
+ .join(" ");
276
+ logMessage("in", text, meta.channel);
277
+
278
+ const messageId = generateMessageId();
279
+ const noop = () => {};
280
+ const safeListener = listener ?? noop;
281
+
282
+ // Apply formatting
283
+ const formatted = applyPrefix(content, { ...meta, sessionName: session });
284
+ const withTyping = appendTypingSuffix(formatted, meta.typing);
285
+
286
+ // Resolve session config for instructions
287
+ const config = options.configPath ? loadRoutingConfig(options.configPath) : {};
288
+ const sessionConfig = resolveSessionConfig(config, session);
289
+ const withInstructions = prependInstructions(withTyping, sessionConfig.instructions);
290
+
291
+ const handler = options.mindHandler(session);
292
+ const interrupt = (meta as any).interrupt ?? sessionConfig.interrupt;
293
+ const unsubscribe = handler.handle(
294
+ withInstructions,
295
+ { ...meta, sessionName: session, messageId, interrupt },
296
+ safeListener,
297
+ );
298
+ return { messageId, unsubscribe };
299
+ }
300
+
250
301
  function route(
251
302
  content: VoluteContentPart[],
252
303
  meta: ChannelMeta,
@@ -400,6 +451,77 @@ export function createRouter(options: {
400
451
  return { messageId, unsubscribe };
401
452
  }
402
453
 
454
+ /**
455
+ * Handle a pre-batched payload from the daemon delivery manager.
456
+ * Formats messages grouped by channel into a single SDK message.
457
+ */
458
+ function dispatchBatch(
459
+ batch: { channels: Record<string, any[]> },
460
+ session: string,
461
+ _meta: ChannelMeta,
462
+ ): void {
463
+ const allMessages: { channel: string; payload: any }[] = [];
464
+ for (const [channel, messages] of Object.entries(batch.channels)) {
465
+ for (const msg of messages) {
466
+ allMessages.push({ channel, payload: msg });
467
+ }
468
+ }
469
+
470
+ if (allMessages.length === 0) return;
471
+
472
+ // Build channel summary
473
+ const channelCounts = new Map<string, number>();
474
+ for (const msg of allMessages) {
475
+ channelCounts.set(msg.channel, (channelCounts.get(msg.channel) ?? 0) + 1);
476
+ }
477
+ const channelLabels = [...channelCounts.entries()].map(([ch, n]) => `${n} from ${ch}`);
478
+ const summary = channelLabels.join(", ");
479
+
480
+ const header = `[Batch: ${allMessages.length} message${allMessages.length === 1 ? "" : "s"} — ${summary}]`;
481
+ const multiChannel = channelCounts.size > 1;
482
+
483
+ const body = allMessages
484
+ .map((m) => {
485
+ const sender = m.payload.sender ?? "unknown";
486
+ const text =
487
+ typeof m.payload.content === "string"
488
+ ? m.payload.content
489
+ : Array.isArray(m.payload.content)
490
+ ? (m.payload.content as { type: string; text?: string }[])
491
+ .filter((p) => p.type === "text" && p.text)
492
+ .map((p) => p.text)
493
+ .join("\n")
494
+ : JSON.stringify(m.payload.content);
495
+ const time = new Date().toLocaleTimeString("en-US", {
496
+ hour: "numeric",
497
+ minute: "2-digit",
498
+ });
499
+ const prefix = multiChannel
500
+ ? `[${sender} in ${m.channel} — ${time}]`
501
+ : `[${sender} — ${time}]`;
502
+ return `${prefix}\n${text}`;
503
+ })
504
+ .join("\n\n");
505
+
506
+ const content: VoluteContentPart[] = [{ type: "text", text: `${header}\n\n${body}` }];
507
+
508
+ // Resolve session config for instructions
509
+ const config = options.configPath ? loadRoutingConfig(options.configPath) : {};
510
+ const sessionConfig = resolveSessionConfig(config, session);
511
+ const withInstructions = prependInstructions(content, sessionConfig.instructions);
512
+
513
+ const messageId = generateMessageId();
514
+ const handler = options.mindHandler(session);
515
+ const noop = () => {};
516
+
517
+ try {
518
+ handler.handle(withInstructions, { sessionName: session, messageId }, noop);
519
+ log("router", `dispatched batch for session ${session}: ${allMessages.length} messages`);
520
+ } catch (err) {
521
+ log("router", `error dispatching batch for session ${session}:`, err);
522
+ }
523
+ }
524
+
403
525
  function close() {
404
526
  for (const [key, buffer] of batchBuffers) {
405
527
  if (buffer.debounceTimer) clearTimeout(buffer.debounceTimer);
@@ -409,5 +531,5 @@ export function createRouter(options: {
409
531
  batchBuffers.clear();
410
532
  }
411
533
 
412
- return { route, close };
534
+ return { route, dispatch, dispatchBatch, close };
413
535
  }
@@ -66,7 +66,7 @@ export function loadTransparencyPreset(): TransparencyPreset {
66
66
  // try next
67
67
  }
68
68
  }
69
- return "standard";
69
+ return "transparent";
70
70
  }
71
71
 
72
72
  export function filterEvent(preset: TransparencyPreset, event: DaemonEvent): DaemonEvent | null {
@@ -13,6 +13,10 @@ export type ChannelMeta = {
13
13
  participants?: string[];
14
14
  participantCount?: number;
15
15
  typing?: string[];
16
+ signature?: string;
17
+ signatureTimestamp?: string;
18
+ signerFingerprint?: string;
19
+ verified?: boolean;
16
20
  };
17
21
 
18
22
  /** ChannelMeta enriched by the router with dispatch info. */