@goondocks/myco 0.9.0 → 0.11.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 (223) hide show
  1. package/CONTRIBUTING.md +3 -19
  2. package/README.md +35 -11
  3. package/dist/{agent-run-EFICNTAU.js → agent-run-CGM75RS6.js} +7 -7
  4. package/dist/{agent-tasks-RXJ7Z5NG.js → agent-tasks-3RQKPRSW.js} +7 -7
  5. package/dist/{chunk-RJ6ZQKG5.js → chunk-5QERXFH7.js} +2 -2
  6. package/dist/{chunk-UBZPD4HN.js → chunk-5SDH75YC.js} +2 -2
  7. package/dist/{chunk-BUSP3OJB.js → chunk-6LL2MQHP.js} +6 -6
  8. package/dist/{chunk-5VZ52A4T.js → chunk-76ZO5RGT.js} +16 -2
  9. package/dist/{chunk-5VZ52A4T.js.map → chunk-76ZO5RGT.js.map} +1 -1
  10. package/dist/{chunk-46PWOKSI.js → chunk-AEJS57ZK.js} +2 -2
  11. package/dist/{chunk-DCXRSSBP.js → chunk-C3AEZ3BZ.js} +3 -3
  12. package/dist/{chunk-QIK2XSDQ.js → chunk-CHG652UO.js} +4 -4
  13. package/dist/{chunk-4LPQ26CK.js → chunk-CUDM5YJY.js} +25 -8
  14. package/dist/chunk-CUDM5YJY.js.map +1 -0
  15. package/dist/{chunk-YDN4OM33.js → chunk-D6DXYAFK.js} +20 -7
  16. package/dist/chunk-D6DXYAFK.js.map +1 -0
  17. package/dist/chunk-ENWBFX7F.js +50 -0
  18. package/dist/chunk-ENWBFX7F.js.map +1 -0
  19. package/dist/{chunk-OXZSXYAT.js → chunk-FFQES5MC.js} +48 -21
  20. package/dist/chunk-FFQES5MC.js.map +1 -0
  21. package/dist/{chunk-KYLDNM7H.js → chunk-FPMEIN2W.js} +2 -2
  22. package/dist/{chunk-U3IBO3O3.js → chunk-IXOHLPH7.js} +9 -8
  23. package/dist/chunk-IXOHLPH7.js.map +1 -0
  24. package/dist/{chunk-PB6TOLRQ.js → chunk-JYXMRW3T.js} +2 -2
  25. package/dist/chunk-K2UZNK25.js +83 -0
  26. package/dist/chunk-K2UZNK25.js.map +1 -0
  27. package/dist/chunk-LYFDTF7G.js +792 -0
  28. package/dist/chunk-LYFDTF7G.js.map +1 -0
  29. package/dist/{chunk-MHSCMET3.js → chunk-MAZOVVDU.js} +33 -3
  30. package/dist/chunk-MAZOVVDU.js.map +1 -0
  31. package/dist/{chunk-JYOOJCPQ.js → chunk-MKKXCCQ5.js} +5 -5
  32. package/dist/{chunk-5PEUFJ6U.js → chunk-QFMBZ72S.js} +24 -8
  33. package/dist/chunk-QFMBZ72S.js.map +1 -0
  34. package/dist/{chunk-FFAYUQ5N.js → chunk-RJMXDUMA.js} +2 -1
  35. package/dist/{chunk-WGTCA2NU.js → chunk-S6I62FAH.js} +10 -2
  36. package/dist/{chunk-WGTCA2NU.js.map → chunk-S6I62FAH.js.map} +1 -1
  37. package/dist/{chunk-3K5WGSJ4.js → chunk-U7UUJ4FD.js} +23 -8
  38. package/dist/chunk-U7UUJ4FD.js.map +1 -0
  39. package/dist/{chunk-PT5IC642.js → chunk-W6HI4CCS.js} +2 -2
  40. package/dist/{chunk-KV4OC4H3.js → chunk-WZZH3YXJ.js} +119 -16
  41. package/dist/chunk-WZZH3YXJ.js.map +1 -0
  42. package/dist/chunk-XLY3REL3.js +165 -0
  43. package/dist/chunk-XLY3REL3.js.map +1 -0
  44. package/dist/{chunk-TRUJLI6K.js → chunk-YKOEMLJJ.js} +9 -5
  45. package/dist/chunk-YKOEMLJJ.js.map +1 -0
  46. package/dist/{chunk-JMJJEQ3P.js → chunk-ZAHDA2PQ.js} +9 -9
  47. package/dist/{chunk-2T7RPVPP.js → chunk-ZESTWGJT.js} +2 -2
  48. package/dist/{cli-ODLFRIYS.js → cli-FL754H6S.js} +49 -36
  49. package/dist/cli-FL754H6S.js.map +1 -0
  50. package/dist/client-4NP7ZMLV.js +15 -0
  51. package/dist/{config-UR5BSGVX.js → config-G3CSGI7P.js} +2 -2
  52. package/dist/{detect-H5OPI7GD.js → detect-27DN6UTL.js} +3 -3
  53. package/dist/{detect-providers-Q42OD4OS.js → detect-providers-AZ6DEQU7.js} +5 -5
  54. package/dist/{doctor-JLKTXDEH.js → doctor-OFGWOYBC.js} +24 -30
  55. package/dist/doctor-OFGWOYBC.js.map +1 -0
  56. package/dist/{executor-ONSDHPGX.js → executor-SWXSN7ZC.js} +38 -25
  57. package/dist/executor-SWXSN7ZC.js.map +1 -0
  58. package/dist/{init-6GWY345B.js → init-JZJJKC4G.js} +46 -65
  59. package/dist/init-JZJJKC4G.js.map +1 -0
  60. package/dist/{init-wizard-UONLDYLI.js → init-wizard-4VHNOYFO.js} +8 -8
  61. package/dist/llm-XJFHRFHB.js +17 -0
  62. package/dist/{loader-SH67XD54.js → loader-DGWP4EFB.js} +6 -6
  63. package/dist/{loader-XVXKZZDH.js → loader-PZ7ZRSA4.js} +8 -4
  64. package/dist/{logs-QZVYF6FP.js → logs-LXHPDKUA.js} +3 -3
  65. package/dist/machine-id-RCM7TXPJ.js +13 -0
  66. package/dist/{main-BMCL7CPO.js → main-UBUZTMGV.js} +1367 -107
  67. package/dist/main-UBUZTMGV.js.map +1 -0
  68. package/dist/{openai-embeddings-C265WRNK.js → openai-embeddings-ST3B6GW7.js} +5 -5
  69. package/dist/{openrouter-U6VFCRX2.js → openrouter-HJHOO3EO.js} +5 -5
  70. package/dist/post-compact-O7HMEFKP.js +30 -0
  71. package/dist/post-compact-O7HMEFKP.js.map +1 -0
  72. package/dist/{post-tool-use-DOUM7CGQ.js → post-tool-use-OVNMZ3UG.js} +22 -15
  73. package/dist/post-tool-use-OVNMZ3UG.js.map +1 -0
  74. package/dist/post-tool-use-failure-HPXTFYBY.js +32 -0
  75. package/dist/post-tool-use-failure-HPXTFYBY.js.map +1 -0
  76. package/dist/{pre-compact-3J33CHXQ.js → pre-compact-JD3D4PBB.js} +12 -8
  77. package/dist/pre-compact-JD3D4PBB.js.map +1 -0
  78. package/dist/{provider-check-3WBPZADE.js → provider-check-SOTDYLJE.js} +5 -5
  79. package/dist/{registry-J4XTWARS.js → registry-33MEKDHT.js} +7 -7
  80. package/dist/remove-XDFMOYUL.js +92 -0
  81. package/dist/remove-XDFMOYUL.js.map +1 -0
  82. package/dist/{resolution-events-TFEQPVKS.js → resolution-events-UPHJJLDQ.js} +5 -2
  83. package/dist/{restart-2VM33WOB.js → restart-JBAMRKRJ.js} +8 -8
  84. package/dist/{search-ZGQR5MDE.js → search-43TS5RGA.js} +8 -8
  85. package/dist/{server-6KMBJCHZ.js → server-UBU7NALJ.js} +14 -14
  86. package/dist/{session-Z2FXDDG6.js → session-CPBLMD7M.js} +9 -8
  87. package/dist/{session-Z2FXDDG6.js.map → session-CPBLMD7M.js.map} +1 -1
  88. package/dist/{session-end-FLVX32LE.js → session-end-DUHUYE6J.js} +13 -8
  89. package/dist/session-end-DUHUYE6J.js.map +1 -0
  90. package/dist/{session-start-UCLK7PXE.js → session-start-I7XM3CME.js} +19 -15
  91. package/dist/{session-start-UCLK7PXE.js.map → session-start-I7XM3CME.js.map} +1 -1
  92. package/dist/{setup-llm-GKMCHURK.js → setup-llm-TTHEUWDA.js} +10 -10
  93. package/dist/src/cli.js +1 -1
  94. package/dist/src/daemon/main.js +1 -1
  95. package/dist/src/hooks/post-tool-use.js +1 -1
  96. package/dist/src/hooks/session-end.js +1 -1
  97. package/dist/src/hooks/session-start.js +1 -1
  98. package/dist/src/hooks/stop.js +1 -1
  99. package/dist/src/hooks/user-prompt-submit.js +1 -1
  100. package/dist/src/mcp/server.js +1 -1
  101. package/dist/src/symbionts/manifests/claude-code.yaml +8 -4
  102. package/dist/src/symbionts/manifests/codex.yaml +19 -0
  103. package/dist/src/symbionts/manifests/cursor.yaml +6 -3
  104. package/dist/src/symbionts/manifests/gemini.yaml +20 -0
  105. package/dist/src/symbionts/manifests/vscode-copilot.yaml +17 -0
  106. package/dist/src/symbionts/manifests/windsurf.yaml +16 -0
  107. package/dist/src/symbionts/templates/claude-code/hooks.json +134 -0
  108. package/dist/src/symbionts/templates/claude-code/mcp.json +7 -0
  109. package/dist/src/symbionts/templates/claude-code/settings.json +10 -0
  110. package/dist/src/symbionts/templates/codex/hooks.json +46 -0
  111. package/dist/src/symbionts/templates/codex/mcp.json +6 -0
  112. package/dist/src/symbionts/templates/cursor/mcp.json +7 -0
  113. package/dist/src/symbionts/templates/cursor/settings.json +6 -0
  114. package/dist/src/symbionts/templates/gemini/hooks.json +74 -0
  115. package/dist/src/symbionts/templates/gemini/mcp.json +6 -0
  116. package/dist/src/symbionts/templates/gemini/settings.json +6 -0
  117. package/dist/src/symbionts/templates/instructions-stub.md +9 -0
  118. package/dist/src/symbionts/templates/vscode-copilot/hooks.json +79 -0
  119. package/dist/src/symbionts/templates/vscode-copilot/mcp.json +7 -0
  120. package/dist/src/symbionts/templates/vscode-copilot/settings.json +6 -0
  121. package/dist/src/symbionts/templates/windsurf/hooks.json +22 -0
  122. package/dist/src/symbionts/templates/windsurf/settings.json +6 -0
  123. package/dist/{stats-IUJPZSVZ.js → stats-7CE6GEWE.js} +11 -11
  124. package/dist/{stop-XRQLLXST.js → stop-BF3AWA7S.js} +18 -12
  125. package/dist/stop-BF3AWA7S.js.map +1 -0
  126. package/dist/stop-failure-7Q2LQF2R.js +30 -0
  127. package/dist/stop-failure-7Q2LQF2R.js.map +1 -0
  128. package/dist/subagent-start-QG2J3AN4.js +30 -0
  129. package/dist/{subagent-start-MWWQTZMQ.js.map → subagent-start-QG2J3AN4.js.map} +1 -1
  130. package/dist/subagent-stop-WVA7RDIM.js +32 -0
  131. package/dist/subagent-stop-WVA7RDIM.js.map +1 -0
  132. package/dist/task-completed-AQVQ7GFL.js +31 -0
  133. package/dist/task-completed-AQVQ7GFL.js.map +1 -0
  134. package/dist/team-LC3K7UXD.js +251 -0
  135. package/dist/team-LC3K7UXD.js.map +1 -0
  136. package/dist/ui/assets/index-BGbil7f1.css +1 -0
  137. package/dist/ui/assets/index-UFE9l-Hb.js +794 -0
  138. package/dist/ui/index.html +2 -2
  139. package/dist/update-3EKXZF3H.js +70 -0
  140. package/dist/update-3EKXZF3H.js.map +1 -0
  141. package/dist/{user-prompt-submit-KSM3AR6P.js → user-prompt-submit-22YQD4XM.js} +16 -9
  142. package/dist/user-prompt-submit-22YQD4XM.js.map +1 -0
  143. package/dist/{verify-UDAYVX37.js → verify-DVIWHZXA.js} +9 -9
  144. package/dist/{version-KLBN4HZT.js → version-VPI6ERF7.js} +2 -2
  145. package/dist/version-VPI6ERF7.js.map +1 -0
  146. package/package.json +3 -3
  147. package/skills/rules/SKILL.md +32 -9
  148. package/.claude-plugin/marketplace.json +0 -29
  149. package/.claude-plugin/plugin.json +0 -27
  150. package/dist/chunk-3K5WGSJ4.js.map +0 -1
  151. package/dist/chunk-4LPQ26CK.js.map +0 -1
  152. package/dist/chunk-5PEUFJ6U.js.map +0 -1
  153. package/dist/chunk-KB4DGYIY.js +0 -436
  154. package/dist/chunk-KB4DGYIY.js.map +0 -1
  155. package/dist/chunk-KV4OC4H3.js.map +0 -1
  156. package/dist/chunk-MHSCMET3.js.map +0 -1
  157. package/dist/chunk-OXZSXYAT.js.map +0 -1
  158. package/dist/chunk-TRUJLI6K.js.map +0 -1
  159. package/dist/chunk-U3IBO3O3.js.map +0 -1
  160. package/dist/chunk-XNOCTDHF.js +0 -21
  161. package/dist/chunk-XNOCTDHF.js.map +0 -1
  162. package/dist/chunk-YDN4OM33.js.map +0 -1
  163. package/dist/cli-ODLFRIYS.js.map +0 -1
  164. package/dist/client-MXRNQ5FI.js +0 -13
  165. package/dist/doctor-JLKTXDEH.js.map +0 -1
  166. package/dist/executor-ONSDHPGX.js.map +0 -1
  167. package/dist/init-6GWY345B.js.map +0 -1
  168. package/dist/llm-BV3QNVRD.js +0 -17
  169. package/dist/main-BMCL7CPO.js.map +0 -1
  170. package/dist/post-compact-OWFSOITU.js +0 -26
  171. package/dist/post-compact-OWFSOITU.js.map +0 -1
  172. package/dist/post-tool-use-DOUM7CGQ.js.map +0 -1
  173. package/dist/post-tool-use-failure-SG3C7PE6.js +0 -28
  174. package/dist/post-tool-use-failure-SG3C7PE6.js.map +0 -1
  175. package/dist/pre-compact-3J33CHXQ.js.map +0 -1
  176. package/dist/session-end-FLVX32LE.js.map +0 -1
  177. package/dist/stop-XRQLLXST.js.map +0 -1
  178. package/dist/stop-failure-2CAJJKRG.js +0 -26
  179. package/dist/stop-failure-2CAJJKRG.js.map +0 -1
  180. package/dist/subagent-start-MWWQTZMQ.js +0 -26
  181. package/dist/subagent-stop-PJXYGRXB.js +0 -28
  182. package/dist/subagent-stop-PJXYGRXB.js.map +0 -1
  183. package/dist/task-completed-4LFRJVGI.js +0 -27
  184. package/dist/task-completed-4LFRJVGI.js.map +0 -1
  185. package/dist/ui/assets/index-DZrElonz.js +0 -744
  186. package/dist/ui/assets/index-TkeiYbZB.css +0 -1
  187. package/dist/user-prompt-submit-KSM3AR6P.js.map +0 -1
  188. /package/dist/{agent-run-EFICNTAU.js.map → agent-run-CGM75RS6.js.map} +0 -0
  189. /package/dist/{agent-tasks-RXJ7Z5NG.js.map → agent-tasks-3RQKPRSW.js.map} +0 -0
  190. /package/dist/{chunk-RJ6ZQKG5.js.map → chunk-5QERXFH7.js.map} +0 -0
  191. /package/dist/{chunk-UBZPD4HN.js.map → chunk-5SDH75YC.js.map} +0 -0
  192. /package/dist/{chunk-BUSP3OJB.js.map → chunk-6LL2MQHP.js.map} +0 -0
  193. /package/dist/{chunk-46PWOKSI.js.map → chunk-AEJS57ZK.js.map} +0 -0
  194. /package/dist/{chunk-DCXRSSBP.js.map → chunk-C3AEZ3BZ.js.map} +0 -0
  195. /package/dist/{chunk-QIK2XSDQ.js.map → chunk-CHG652UO.js.map} +0 -0
  196. /package/dist/{chunk-KYLDNM7H.js.map → chunk-FPMEIN2W.js.map} +0 -0
  197. /package/dist/{chunk-PB6TOLRQ.js.map → chunk-JYXMRW3T.js.map} +0 -0
  198. /package/dist/{chunk-JYOOJCPQ.js.map → chunk-MKKXCCQ5.js.map} +0 -0
  199. /package/dist/{chunk-FFAYUQ5N.js.map → chunk-RJMXDUMA.js.map} +0 -0
  200. /package/dist/{chunk-PT5IC642.js.map → chunk-W6HI4CCS.js.map} +0 -0
  201. /package/dist/{chunk-JMJJEQ3P.js.map → chunk-ZAHDA2PQ.js.map} +0 -0
  202. /package/dist/{chunk-2T7RPVPP.js.map → chunk-ZESTWGJT.js.map} +0 -0
  203. /package/dist/{client-MXRNQ5FI.js.map → client-4NP7ZMLV.js.map} +0 -0
  204. /package/dist/{config-UR5BSGVX.js.map → config-G3CSGI7P.js.map} +0 -0
  205. /package/dist/{detect-H5OPI7GD.js.map → detect-27DN6UTL.js.map} +0 -0
  206. /package/dist/{detect-providers-Q42OD4OS.js.map → detect-providers-AZ6DEQU7.js.map} +0 -0
  207. /package/dist/{init-wizard-UONLDYLI.js.map → init-wizard-4VHNOYFO.js.map} +0 -0
  208. /package/dist/{llm-BV3QNVRD.js.map → llm-XJFHRFHB.js.map} +0 -0
  209. /package/dist/{loader-SH67XD54.js.map → loader-DGWP4EFB.js.map} +0 -0
  210. /package/dist/{loader-XVXKZZDH.js.map → loader-PZ7ZRSA4.js.map} +0 -0
  211. /package/dist/{logs-QZVYF6FP.js.map → logs-LXHPDKUA.js.map} +0 -0
  212. /package/dist/{openai-embeddings-C265WRNK.js.map → machine-id-RCM7TXPJ.js.map} +0 -0
  213. /package/dist/{openrouter-U6VFCRX2.js.map → openai-embeddings-ST3B6GW7.js.map} +0 -0
  214. /package/dist/{provider-check-3WBPZADE.js.map → openrouter-HJHOO3EO.js.map} +0 -0
  215. /package/dist/{registry-J4XTWARS.js.map → provider-check-SOTDYLJE.js.map} +0 -0
  216. /package/dist/{resolution-events-TFEQPVKS.js.map → registry-33MEKDHT.js.map} +0 -0
  217. /package/dist/{version-KLBN4HZT.js.map → resolution-events-UPHJJLDQ.js.map} +0 -0
  218. /package/dist/{restart-2VM33WOB.js.map → restart-JBAMRKRJ.js.map} +0 -0
  219. /package/dist/{search-ZGQR5MDE.js.map → search-43TS5RGA.js.map} +0 -0
  220. /package/dist/{server-6KMBJCHZ.js.map → server-UBU7NALJ.js.map} +0 -0
  221. /package/dist/{setup-llm-GKMCHURK.js.map → setup-llm-TTHEUWDA.js.map} +0 -0
  222. /package/dist/{stats-IUJPZSVZ.js.map → stats-7CE6GEWE.js.map} +0 -0
  223. /package/dist/{verify-UDAYVX37.js.map → verify-DVIWHZXA.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/team.ts"],"sourcesContent":["/**\n * CLI team commands — provision and manage Cloudflare team sync infrastructure.\n *\n * `myco team init` — Provision D1 database, Vectorize index, deploy worker.\n * `myco team upgrade` — Redeploy worker with updated source.\n */\n\nimport { execFileSync } from 'node:child_process';\nimport crypto from 'node:crypto';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { loadConfig, updateTeamConfig } from '../config/loader.js';\nimport { writeSecret } from '../config/secrets.js';\nimport { findPackageRoot } from '../utils/find-package-root.js';\nimport { WRANGLER_COMMAND_TIMEOUT_MS, TEAM_API_KEY_SECRET } from '../constants.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Number of random bytes for API key generation. */\nconst API_KEY_BYTES = 32;\n\n/** Vectorize index dimensions (must match the embedding model). */\nconst VECTORIZE_DIMENSIONS = '1024';\n\n/** Vectorize distance metric. */\nconst VECTORIZE_METRIC = 'cosine';\n\n/** Prefix for team resource names. */\nconst TEAM_RESOURCE_PREFIX = 'myco-team';\n\n/** Length of the project hash suffix for unique resource naming. */\nconst PROJECT_HASH_LENGTH = 8;\n\n\n/** Source directory for worker files (relative to package root). */\nconst WORKER_SOURCE_DIR = 'src/worker';\n\n/** Deployment directory name within the vault. */\nconst TEAM_WORKER_DIR = '.team-worker';\n\n/** Regex to extract D1 database ID from wrangler d1 create output (JSON format). */\nconst D1_ID_JSON_REGEX = /\"database_id\"\\s*:\\s*\"([0-9a-f-]{36})\"/i;\n\n/** Regex to extract D1 database ID from wrangler d1 create output (text format). */\nconst D1_ID_TEXT_REGEX = /id:\\s*([0-9a-f-]{36})/i;\n\n/** Regex to extract worker URL from wrangler deploy output. */\nconst WORKER_URL_REGEX = /(https:\\/\\/[^\\s]+\\.workers\\.dev)/;\n\n/** Regex to match wrangler.toml name field. */\nconst TOML_NAME_REGEX = /^name\\s*=\\s*\"[^\"]*\"/m;\n\n/** Regex to match wrangler.toml D1 placeholder. */\nconst TOML_D1_PLACEHOLDER_REGEX = /<YOUR_D1_DATABASE_ID>/g;\n\n/** Regex to match wrangler.toml database_name field. */\nconst TOML_DB_NAME_REGEX = /database_name\\s*=\\s*\"[^\"]*\"/g;\n\n/** Regex to match wrangler.toml index_name field. */\nconst TOML_INDEX_NAME_REGEX = /index_name\\s*=\\s*\"[^\"]*\"/g;\n\n/** Regex to match database_id in existing wrangler.toml. */\nconst TOML_DB_ID_REGEX = /database_id\\s*=\\s*\"([^\"]+)\"/;\n\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Generate a project hash from cwd for unique resource naming. */\nfunction projectHash(): string {\n const hash = crypto.createHash('sha256').update(process.cwd()).digest('hex');\n return hash.slice(0, PROJECT_HASH_LENGTH);\n}\n\n/** Build the unique resource name for this project's team infrastructure. */\nfunction resourceName(): string {\n return `${TEAM_RESOURCE_PREFIX}-${projectHash()}`;\n}\n\n/** Run a wrangler command and return stdout. Throws on failure. */\nfunction wrangler(args: string[], options?: { cwd?: string }): string {\n return execFileSync('wrangler', args, {\n encoding: 'utf-8',\n timeout: WRANGLER_COMMAND_TIMEOUT_MS,\n stdio: ['pipe', 'pipe', 'pipe'],\n ...options,\n });\n}\n\n/** Find the package root (where src/worker/ lives). */\nfunction locatePackageRoot(): string {\n // Check CLAUDE_PLUGIN_ROOT first (dogfooding), then traverse up\n const pluginRoot = process.env.CLAUDE_PLUGIN_ROOT ?? process.env.CURSOR_PLUGIN_ROOT;\n if (pluginRoot && fs.existsSync(path.join(pluginRoot, WORKER_SOURCE_DIR))) {\n return pluginRoot;\n }\n\n // Walk up from this file's compiled location\n const scriptDir = path.dirname(fileURLToPath(import.meta.url));\n const root = findPackageRoot(scriptDir);\n if (root && fs.existsSync(path.join(root, WORKER_SOURCE_DIR))) return root;\n\n throw new Error(`Cannot find ${WORKER_SOURCE_DIR} — are you running from the myco package?`);\n}\n\n/**\n * Copy worker source to the vault deployment directory and patch wrangler.toml\n * with actual D1 database ID and resource names.\n */\nfunction prepareDeployDir(vaultDir: string, d1Id: string): string {\n const pkgRoot = locatePackageRoot();\n const srcDir = path.join(pkgRoot, WORKER_SOURCE_DIR);\n const deployDir = path.join(vaultDir, TEAM_WORKER_DIR);\n\n // Copy all worker source files\n fs.cpSync(srcDir, deployDir, { recursive: true });\n\n // Patch wrangler.toml with actual IDs\n const tomlPath = path.join(deployDir, 'wrangler.toml');\n let toml = fs.readFileSync(tomlPath, 'utf-8');\n const name = resourceName();\n toml = toml.replace(TOML_NAME_REGEX, `name = \"${name}\"`);\n toml = toml.replace(TOML_D1_PLACEHOLDER_REGEX, d1Id);\n toml = toml.replace(TOML_DB_NAME_REGEX, `database_name = \"${name}\"`);\n toml = toml.replace(TOML_INDEX_NAME_REGEX, `index_name = \"${name}-vectors\"`);\n fs.writeFileSync(tomlPath, toml, 'utf-8');\n\n return deployDir;\n}\n\n/** Extract D1 database ID from wrangler d1 create output (handles both JSON and text formats). */\nfunction parseD1Id(output: string): string {\n const jsonMatch = output.match(D1_ID_JSON_REGEX);\n if (jsonMatch) return jsonMatch[1];\n const textMatch = output.match(D1_ID_TEXT_REGEX);\n if (textMatch) return textMatch[1];\n throw new Error(`Could not parse D1 database ID from wrangler output:\\n${output}`);\n}\n\n/** Extract worker URL from wrangler deploy output. */\nfunction parseWorkerUrl(output: string): string {\n // Output typically contains: \"https://<name>.<subdomain>.workers.dev\"\n const match = output.match(WORKER_URL_REGEX);\n if (!match) throw new Error(`Could not parse worker URL from deploy output:\\n${output}`);\n return match[1];\n}\n\n// ---------------------------------------------------------------------------\n// Commands\n// ---------------------------------------------------------------------------\n\nexport async function teamInit(vaultDir: string): Promise<void> {\n console.log('Provisioning team sync infrastructure...\\n');\n\n // 1. Check for wrangler\n try {\n const version = wrangler(['--version']).trim();\n console.log(`wrangler: ${version}`);\n } catch {\n console.error('Error: wrangler CLI not found. Install it with: npm install -g wrangler');\n process.exit(1);\n }\n\n // 2. Check auth\n try {\n wrangler(['whoami']);\n console.log('Cloudflare auth: OK\\n');\n } catch {\n console.error('Error: Not authenticated with Cloudflare. Run: wrangler login');\n process.exit(1);\n }\n\n const name = resourceName();\n console.log(`Resource name: ${name}\\n`);\n\n // 3. Create D1 database (or reuse existing)\n console.log('Creating D1 database...');\n let d1Id: string;\n try {\n const d1Output = wrangler(['d1', 'create', name]);\n d1Id = parseD1Id(d1Output);\n console.log(`D1 database created: ${d1Id}\\n`);\n } catch (err) {\n const errMsg = (err as Error).message;\n if (errMsg.includes('already exists')) {\n console.log('D1 database already exists, looking up ID...');\n const listOutput = wrangler(['d1', 'list', '--json']);\n const databases = JSON.parse(listOutput) as Array<{ name: string; uuid: string }>;\n const existing = databases.find((db) => db.name === name);\n if (!existing) {\n console.error(`D1 database \"${name}\" reported as existing but not found in list`);\n process.exit(1);\n }\n d1Id = existing.uuid;\n console.log(`Reusing D1 database: ${d1Id}\\n`);\n } else {\n console.error(`Failed to create D1 database: ${errMsg}`);\n process.exit(1);\n }\n }\n\n // 4. Create Vectorize index (or reuse existing)\n console.log('Creating Vectorize index...');\n try {\n wrangler(['vectorize', 'create', `${name}-vectors`, '--dimensions', VECTORIZE_DIMENSIONS, '--metric', VECTORIZE_METRIC]);\n console.log('Vectorize index created\\n');\n } catch (err) {\n const errMsg = (err as Error).message;\n if (errMsg.includes('already exists')) {\n console.log('Vectorize index already exists, reusing\\n');\n } else {\n console.error(`Failed to create Vectorize index: ${errMsg}`);\n process.exit(1);\n }\n }\n\n // 5. Generate API key\n const apiKey = crypto.randomBytes(API_KEY_BYTES).toString('hex');\n\n // 6. Prepare deployment directory\n console.log('Preparing worker deployment...');\n const deployDir = prepareDeployDir(vaultDir, d1Id);\n\n // 7. Set API key secret via wrangler\n console.log('Setting API key secret...');\n try {\n execFileSync('wrangler', ['secret', 'put', TEAM_API_KEY_SECRET, '--name', name], {\n encoding: 'utf-8',\n timeout: WRANGLER_COMMAND_TIMEOUT_MS,\n input: apiKey,\n stdio: ['pipe', 'pipe', 'pipe'],\n cwd: deployDir,\n });\n console.log('Secret set\\n');\n } catch (err) {\n console.error(`Failed to set API key secret: ${(err as Error).message}`);\n process.exit(1);\n }\n\n // 8. Deploy worker\n console.log('Deploying worker...');\n let workerUrl: string;\n try {\n const deployOutput = wrangler(['deploy'], { cwd: deployDir });\n workerUrl = parseWorkerUrl(deployOutput);\n console.log(`Worker deployed: ${workerUrl}\\n`);\n } catch (err) {\n console.error(`Failed to deploy worker: ${(err as Error).message}`);\n process.exit(1);\n }\n\n // 9. Seed team config in the Worker\n console.log('Setting team configuration...');\n try {\n const { getMachineId } = await import('../daemon/machine-id.js');\n const creatorMachineId = await getMachineId(vaultDir);\n await fetch(`${workerUrl}/config`, {\n method: 'PUT',\n headers: { 'Authorization': `Bearer ${apiKey}`, 'Content-Type': 'application/json' },\n body: JSON.stringify({\n team_name: name,\n embedding_model: '@cf/baai/bge-m3',\n embedding_dimensions: '1024',\n created_at: String(Math.floor(Date.now() / 1000)),\n created_by: creatorMachineId,\n }),\n });\n console.log('Team config saved\\n');\n } catch {\n console.log('Warning: could not seed team config (non-fatal)\\n');\n }\n\n // 10. Save config and API key locally\n updateTeamConfig(vaultDir, {\n enabled: true,\n worker_url: workerUrl,\n });\n writeSecret(vaultDir, TEAM_API_KEY_SECRET, apiKey);\n\n console.log('Team sync configured!\\n');\n console.log(` URL: ${workerUrl}`);\n console.log(` API Key: ${apiKey.slice(0, 8)}...${apiKey.slice(-4)}`);\n console.log('\\nShare the URL and API key with teammates so they can connect.');\n}\n\nexport async function teamUpgrade(vaultDir: string): Promise<void> {\n console.log('Upgrading team sync worker...\\n');\n\n const config = loadConfig(vaultDir);\n if (!config.team.worker_url) {\n console.error('No team sync configured. Run: myco team init');\n process.exit(1);\n }\n\n const deployDir = path.join(vaultDir, TEAM_WORKER_DIR);\n const tomlPath = path.join(deployDir, 'wrangler.toml');\n\n if (!fs.existsSync(tomlPath)) {\n console.error('No deployment directory found. Run: myco team init');\n process.exit(1);\n }\n\n // Read existing D1 ID from current wrangler.toml\n const existingToml = fs.readFileSync(tomlPath, 'utf-8');\n const d1Match = existingToml.match(TOML_DB_ID_REGEX);\n if (!d1Match || d1Match[1] === '<YOUR_D1_DATABASE_ID>') {\n console.error('Cannot determine D1 database ID from existing deployment. Run: myco team init');\n process.exit(1);\n }\n const d1Id = d1Match[1];\n\n // Re-copy worker source and patch\n console.log('Updating worker source...');\n prepareDeployDir(vaultDir, d1Id);\n\n // Redeploy\n console.log('Deploying...');\n try {\n const deployOutput = wrangler(['deploy'], { cwd: deployDir });\n const workerUrl = parseWorkerUrl(deployOutput);\n console.log(`Worker deployed: ${workerUrl}\\n`);\n\n // Update URL in config in case it changed\n updateTeamConfig(vaultDir, { worker_url: workerUrl });\n } catch (err) {\n console.error(`Failed to deploy worker: ${(err as Error).message}`);\n process.exit(1);\n }\n\n console.log('Upgrade complete.');\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1 @@
1
+ *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:var(--font-ui, Inter),system-ui,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--font-data, JetBrains Mono),Fira Code,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--surface: #111111;--surface-dim: #0c0c0c;--surface-bright: #444444;--surface-container-lowest: #080808;--surface-container-low: #1a1a1a;--surface-container: #242424;--surface-container-high: #333333;--surface-container-highest: #424242;--surface-variant: #3a3a3a;--on-surface: #e5e2e1;--on-surface-variant: #c1c8c2;--outline: #8b928c;--outline-variant: #424843;--primary: #abcfb8;--on-primary: #163627;--primary-container: #7b9e89;--on-primary-container: #143525;--secondary: #edbf7f;--on-secondary: #442b00;--secondary-container: #60410b;--tertiary: #ffb4a1;--on-tertiary: #5d1806;--tertiary-container: #df7a60;--inverse-surface: #e5e2e1;--inverse-on-surface: #303030;--inverse-primary: #446553;--shadow-tint: 96, 65, 11;--ghost-border: color-mix(in srgb, var(--outline-variant), transparent 75%);--background: var(--surface);--foreground: var(--on-surface);--card: var(--surface-container-low);--card-foreground: var(--on-surface);--muted: var(--surface-container);--muted-foreground: var(--on-surface-variant);--accent: var(--surface-container-high);--accent-foreground: var(--on-surface);--border: var(--outline-variant);--input: var(--outline-variant);--ring: var(--primary);--destructive: var(--tertiary);--primary-foreground: var(--on-primary);--secondary-foreground: var(--on-surface);--radius: .375rem}.light{--surface: #F9F5E6;--surface-dim: #E8E1D1;--surface-bright: #FFFFFF;--surface-container-lowest: #F4EED8;--surface-container-low: #FFFFFF;--surface-container: #E8E1D1;--surface-container-high: #DDD6C6;--surface-container-highest: #D2CABB;--surface-variant: #D2CABB;--on-surface: #131313;--on-surface-variant: #424843;--outline: #8b928c;--outline-variant: #c1c8c2;--primary: #446553;--on-primary: #FFFFFF;--primary-container: #7b9e89;--on-primary-container: #002113;--secondary: #60410b;--on-secondary: #FFFFFF;--secondary-container: #ffddb2;--tertiary: #8B5C44;--on-tertiary: #FFFFFF;--tertiary-container: #ffdbd2;--inverse-surface: #303030;--inverse-on-surface: #e5e2e1;--inverse-primary: #abcfb8;--shadow-tint: 96, 65, 11;--ghost-border: color-mix(in srgb, var(--outline-variant), transparent 75%);--background: var(--surface);--foreground: var(--on-surface);--card: var(--surface-container-low);--card-foreground: var(--on-surface);--muted: var(--surface-container);--muted-foreground: var(--on-surface-variant);--accent: var(--surface-container-high);--accent-foreground: var(--on-surface);--border: var(--outline-variant);--input: var(--outline-variant);--ring: var(--primary);--destructive: var(--tertiary);--primary-foreground: var(--on-primary);--secondary-foreground: var(--on-surface);--radius: .375rem}*{border-color:var(--ghost-border)}body{background-color:var(--surface);color:var(--on-surface);font-family:var(--font-ui, "Inter", system-ui, sans-serif);pointer-events:auto!important}.container{width:100%}@media(min-width:640px){.container{max-width:640px}}@media(min-width:768px){.container{max-width:768px}}@media(min-width:1024px){.container{max-width:1024px}}@media(min-width:1280px){.container{max-width:1280px}}@media(min-width:1536px){.container{max-width:1536px}}.config-slider{-webkit-appearance:none;-moz-appearance:none;appearance:none;height:4px;border-radius:2px;background:var(--surface-container-high);outline:none;cursor:pointer}.config-slider:disabled{opacity:.5;cursor:not-allowed}.config-slider::-webkit-slider-thumb{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:14px;height:14px;border-radius:50%;background:var(--primary);border:2px solid var(--surface);box-shadow:0 0 0 1px var(--primary-container);cursor:pointer;-webkit-transition:box-shadow .15s ease;transition:box-shadow .15s ease}.config-slider::-webkit-slider-thumb:hover{box-shadow:0 0 0 4px color-mix(in srgb,var(--primary),transparent 75%)}.config-slider::-moz-range-thumb{width:14px;height:14px;border-radius:50%;background:var(--primary);border:2px solid var(--surface);box-shadow:0 0 0 1px var(--primary-container);cursor:pointer}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.\!visible{visibility:visible!important}.visible{visibility:visible}.collapse{visibility:collapse}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.-right-0\.5{right:-.125rem}.-top-0\.5{top:-.125rem}.bottom-0{bottom:0}.bottom-3{bottom:.75rem}.bottom-4{bottom:1rem}.left-0{left:0}.left-1\/2{left:50%}.left-2{left:.5rem}.left-3{left:.75rem}.left-4{left:1rem}.left-\[50\%\]{left:50%}.right-0{right:0}.right-2{right:.5rem}.right-3{right:.75rem}.right-4{right:1rem}.top-0{top:0}.top-1\/2{top:50%}.top-12{top:3rem}.top-3{top:.75rem}.top-4{top:1rem}.top-\[50\%\]{top:50%}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.col-span-2{grid-column:span 2 / span 2}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.mx-auto{margin-left:auto;margin-right:auto}.-mt-\[60px\]{margin-top:-60px}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-\[14px\]{margin-bottom:14px}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-auto{margin-top:auto}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-24{height:6rem}.h-28{height:7rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-40{height:10rem}.h-48{height:12rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[calc\(100vh-180px\)\]{height:calc(100vh - 180px)}.h-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-auto{height:auto}.h-fit{height:-moz-fit-content;height:fit-content}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-32{max-height:8rem}.max-h-40{max-height:10rem}.max-h-48{max-height:12rem}.max-h-96{max-height:24rem}.max-h-\[140px\]{max-height:140px}.max-h-\[32rem\]{max-height:32rem}.max-h-\[400px\]{max-height:400px}.max-h-\[90vh\]{max-height:90vh}.max-h-full{max-height:100%}.min-h-\[200px\]{min-height:200px}.min-h-\[300px\]{min-height:300px}.min-h-\[320px\]{min-height:320px}.min-h-full{min-height:100%}.w-0\.5{width:.125rem}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-2\/5{width:40%}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-3\/4{width:75%}.w-3\/5{width:60%}.w-32{width:8rem}.w-4{width:1rem}.w-4\/5{width:80%}.w-40{width:10rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-52{width:13rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[12px\]{width:12px}.w-\[20px\]{width:20px}.w-\[320px\]{width:320px}.w-\[48px\]{width:48px}.w-\[54px\]{width:54px}.w-\[68px\]{width:68px}.w-\[90px\]{width:90px}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-\[140px\]{min-width:140px}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-7xl{max-width:80rem}.max-w-\[140px\]{max-width:140px}.max-w-\[160px\]{max-width:160px}.max-w-\[200px\]{max-width:200px}.max-w-\[80px\]{max-width:80px}.max-w-\[90px\]{max-width:90px}.max-w-\[90vw\]{max-width:90vw}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-x-full{--tw-translate-x: -100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-5{--tw-translate-x: 1.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-\[-50\%\]{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-y-\[-50\%\]{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-90{--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize-y{resize:vertical}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0px}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-8{gap:2rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-0{row-gap:0px}.gap-y-2{row-gap:.5rem}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(0px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(0px * var(--tw-space-y-reverse))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-wrap{text-wrap:wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:var(--radius)}.rounded-sm{border-radius:.25rem}.rounded-xl{border-radius:.75rem}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.border{border-width:1px}.border-0{border-width:0px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-l-4{border-left-width:4px}.border-t{border-top-width:1px}.border-t-2{border-top-width:2px}.border-none{border-style:none}.border-\[var\(--ghost-border\)\]{border-color:var(--ghost-border)}.border-blue-500\/30{border-color:#3b82f64d}.border-border{border-color:var(--border)}.border-green-500\/30{border-color:#22c55e4d}.border-input{border-color:var(--input)}.border-orange-500\/30{border-color:#f973164d}.border-primary{border-color:var(--primary)}.border-purple-500\/30{border-color:#a855f74d}.border-surface{border-color:var(--surface)}.border-transparent{border-color:transparent}.border-l-ochre{border-left-color:var(--secondary)}.border-l-sage{border-left-color:var(--primary)}.border-l-terracotta{border-left-color:var(--tertiary)}.border-t-amber-500{--tw-border-opacity: 1;border-top-color:rgb(245 158 11 / var(--tw-border-opacity, 1))}.border-t-ochre{border-top-color:var(--secondary)}.border-t-outline{border-top-color:var(--outline)}.border-t-sage{border-top-color:var(--primary)}.border-t-terracotta{border-top-color:var(--tertiary)}.bg-background{background-color:var(--background)}.bg-black\/60{background-color:#0009}.bg-blue-500\/10{background-color:#3b82f61a}.bg-blue-500\/15{background-color:#3b82f626}.bg-border{background-color:var(--border)}.bg-card{background-color:var(--card)}.bg-green-500\/10{background-color:#22c55e1a}.bg-green-500\/15{background-color:#22c55e26}.bg-muted{background-color:var(--muted)}.bg-ochre{background-color:var(--secondary)}.bg-on-surface{background-color:var(--on-surface)}.bg-on-surface-variant{background-color:var(--on-surface-variant)}.bg-orange-500\/15{background-color:#f9731626}.bg-outline{background-color:var(--outline)}.bg-primary{background-color:var(--primary)}.bg-purple-500\/15{background-color:#a855f726}.bg-sage{background-color:var(--primary)}.bg-secondary{background-color:var(--secondary)}.bg-surface{background-color:var(--surface)}.bg-surface-bright{background-color:var(--surface-bright)}.bg-surface-container{background-color:var(--surface-container)}.bg-surface-container-high{background-color:var(--surface-container-high)}.bg-surface-container-highest{background-color:var(--surface-container-highest)}.bg-surface-container-low{background-color:var(--surface-container-low)}.bg-surface-container-lowest{background-color:var(--surface-container-lowest)}.bg-terracotta,.bg-tertiary{background-color:var(--tertiary)}.bg-transparent{background-color:transparent}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.from-primary{--tw-gradient-from: var(--primary) var(--tw-gradient-from-position);--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-tertiary{--tw-gradient-from: var(--tertiary) var(--tw-gradient-from-position);--tw-gradient-to: rgb(255 255 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-primary-container{--tw-gradient-to: var(--primary-container) var(--tw-gradient-to-position)}.to-tertiary-container{--tw-gradient-to: var(--tertiary-container) var(--tw-gradient-to-position)}.object-contain{-o-object-fit:contain;object-fit:contain}.object-cover{-o-object-fit:cover;object-fit:cover}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-1{padding-bottom:.25rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-6{padding-bottom:1.5rem}.pl-11{padding-left:2.75rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-7{padding-left:1.75rem}.pr-1{padding-right:.25rem}.pr-12{padding-right:3rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-8{padding-right:2rem}.pt-0{padding-top:0}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-12{padding-top:3rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.font-mono{font-family:var(--font-data, JetBrains Mono),Fira Code,monospace}.font-sans{font-family:var(--font-ui, Inter),system-ui,sans-serif}.font-serif{font-family:var(--font-heading, Newsreader),Georgia,serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-5xl{font-size:3rem;line-height:1}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-\[0\.3em\]{letter-spacing:.3em}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-card-foreground{color:var(--card-foreground)}.text-destructive{color:var(--destructive, var(--tertiary))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-muted-foreground{color:var(--muted-foreground)}.text-ochre{color:var(--secondary)}.text-on-primary{color:var(--on-primary)}.text-on-surface{color:var(--on-surface)}.text-on-surface-variant{color:var(--on-surface-variant)}.text-orange-600{--tw-text-opacity: 1;color:rgb(234 88 12 / var(--tw-text-opacity, 1))}.text-outline{color:var(--outline)}.text-primary{color:var(--primary)}.text-purple-600{--tw-text-opacity: 1;color:rgb(147 51 234 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-sage{color:var(--primary)}.text-secondary{color:var(--secondary)}.text-terracotta,.text-tertiary{color:var(--tertiary)}.no-underline{text-decoration-line:none}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-20{opacity:.2}.opacity-30{opacity:.3}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-\[0\.04\]{opacity:.04}.shadow-\[inset_0_0_12px_rgba\(171\,207\,184\,0\.08\)\]{--tw-shadow: inset 0 0 12px rgba(171,207,184,.08);--tw-shadow-colored: inset 0 0 12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[inset_0_0_12px_rgba\(171\,207\,184\,0\.2\)\]{--tw-shadow: inset 0 0 12px rgba(171,207,184,.2);--tw-shadow-colored: inset 0 0 12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-ambient{--tw-shadow: 0 24px 48px rgba(var(--shadow-tint), .06);--tw-shadow-colored: 0 24px 48px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-none{--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-ochre-glow{--tw-shadow: 0 0 8px var(--secondary);--tw-shadow-colored: 0 0 8px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sage-glow{--tw-shadow: 0 0 8px var(--primary);--tw-shadow-colored: 0 0 8px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-terracotta-glow{--tw-shadow: 0 0 8px var(--tertiary);--tw-shadow-colored: 0 0 8px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-0{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-offset-background{--tw-ring-offset-color: var(--background)}.drop-shadow-sm{--tw-drop-shadow: drop-shadow(0 1px 1px rgb(0 0 0 / .05));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-md{--tw-backdrop-blur: blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-xl{--tw-backdrop-blur: blur(24px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-\[border-color\,background-color\]{transition-property:border-color,background-color;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[border-color\]{transition-property:border-color;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[grid-template-rows\]{transition-property:grid-template-rows;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-700{transition-duration:.7s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}@font-face{font-family:Geist Mono;src:url(/fonts/GeistMono-Variable.woff2) format("woff2");font-weight:100 900;font-style:normal;font-display:swap}@font-face{font-family:Newsreader;src:url(/fonts/Newsreader-Variable.woff2) format("woff2");font-weight:200 800;font-style:normal;font-display:swap}@font-face{font-family:Newsreader;src:url(/fonts/Newsreader-Italic-Variable.woff2) format("woff2");font-weight:200 800;font-style:italic;font-display:swap}@font-face{font-family:Inter;src:url(/fonts/Inter-Variable.woff2) format("woff2");font-weight:100 900;font-style:normal;font-display:swap}@font-face{font-family:JetBrains Mono;src:url(/fonts/JetBrainsMono-Variable.woff2) format("woff2");font-weight:100 800;font-style:normal;font-display:swap}.glass-panel{background:color-mix(in srgb,var(--surface-container) 60%,transparent);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.hover-lift{transition:transform .2s ease,box-shadow .2s ease}.hover-lift:hover{transform:translateY(-2px);box-shadow:0 8px 24px rgba(var(--shadow-tint),.12)}.mycelial-connector{stroke-dasharray:4;opacity:.3}@keyframes pulse-slow{0%,to{opacity:.4}50%{opacity:.8}}.animate-pulse-slow{animation:pulse-slow 3s ease-in-out infinite}.prose-myco{font-family:var(--font-ui, "Inter", system-ui, sans-serif);font-size:.875rem;line-height:1.625;color:var(--on-surface-variant)}.prose-myco h1,.prose-myco h2,.prose-myco h3,.prose-myco h4{font-family:var(--font-heading, "Newsreader", serif);color:var(--on-surface);margin-top:1.25em;margin-bottom:.5em;font-weight:500}.prose-myco h1{font-size:1.25rem}.prose-myco h2{font-size:1.1rem}.prose-myco h3{font-size:.95rem}.prose-myco p{margin-top:.5em;margin-bottom:.5em}.prose-myco strong{color:var(--on-surface);font-weight:600}.prose-myco em{font-style:italic}.prose-myco ul,.prose-myco ol{padding-left:1.25em;margin-top:.5em;margin-bottom:.5em}.prose-myco li{margin-top:.25em}.prose-myco code{font-family:var(--font-data, "JetBrains Mono", monospace);font-size:.8em;padding:.15em .35em;border-radius:.2rem;background:var(--surface-container);color:var(--primary)}.prose-myco pre{font-family:var(--font-data, "JetBrains Mono", monospace);font-size:.75rem;padding:.75rem 1rem;border-radius:.375rem;background:var(--surface-container-lowest);color:var(--on-surface-variant);overflow-x:auto;margin-top:.75em;margin-bottom:.75em}.prose-myco pre code{background:transparent;padding:0;color:inherit}.prose-myco blockquote{border-left:2px solid var(--primary-container);padding-left:1em;margin-left:0;color:var(--on-surface-variant);font-style:italic}.prose-myco hr{border:none;border-top:1px solid var(--outline-variant);margin:1em 0}.prose-myco table{width:100%;border-collapse:collapse;font-size:.8rem}.prose-myco th,.prose-myco td{border:1px solid var(--outline-variant);padding:.35em .5em;text-align:left}.prose-myco th{background:var(--surface-container);font-weight:600;color:var(--on-surface)}.prose-myco a{color:var(--primary);text-decoration:underline}.prose-myco *:first-child{margin-top:0}.prose-myco *:last-child{margin-bottom:0}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.file\:text-on-surface::file-selector-button{color:var(--on-surface)}.placeholder\:text-muted-foreground::-moz-placeholder{color:var(--muted-foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.last\:border-0:last-child{border-width:0px}.last\:border-b-0:last-child{border-bottom-width:0px}.hover\:translate-x-1:hover{--tw-translate-x: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:bg-surface-container-high:hover{background-color:var(--surface-container-high)}.hover\:bg-surface-container-highest:hover{background-color:var(--surface-container-highest)}.hover\:text-on-surface:hover{color:var(--on-surface)}.hover\:text-on-surface-variant:hover{color:var(--on-surface-variant)}.hover\:text-primary:hover{color:var(--primary)}.hover\:text-tertiary:hover{color:var(--tertiary)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-\[0_0_0_1px_rgba\(171\,207\,184\,0\.4\)\]:hover{--tw-shadow: 0 0 0 1px rgba(171,207,184,.4);--tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:shadow-\[0_0_0_1px_rgba\(255\,180\,161\,0\.4\)\]:hover{--tw-shadow: 0 0 0 1px rgba(255,180,161,.4);--tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:shadow-\[inset_3px_0_0_var\(--primary\)\]:hover{--tw-shadow: inset 3px 0 0 var(--primary);--tw-shadow-colored: inset 3px 0 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:ring-2:hover{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.hover\:brightness-110:hover{--tw-brightness: brightness(1.1);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.hover\:brightness-\[1\.08\]:hover{--tw-brightness: brightness(1.08);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.focus\:bg-surface-bright:focus{background-color:var(--surface-bright)}.focus\:text-accent-foreground:focus{color:var(--accent-foreground)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color: var(--ring)}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:opacity-100:focus-visible{opacity:1}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-0:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-inset:focus-visible{--tw-ring-inset: inset}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: var(--ring)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.focus-visible\:ring-offset-surface:focus-visible{--tw-ring-offset-color: var(--surface)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:translate-x-0\.5{--tw-translate-x: .125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.group:hover .group-hover\:text-primary{color:var(--primary)}.group:hover .group-hover\:opacity-100{opacity:1}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[side\=bottom\]\:translate-y-1[data-side=bottom]{--tw-translate-y: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=left\]\:-translate-x-1[data-side=left]{--tw-translate-x: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=right\]\:translate-x-1[data-side=right]{--tw-translate-x: .25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[side\=top\]\:-translate-y-1[data-side=top]{--tw-translate-y: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.data-\[state\=on\]\:bg-primary[data-state=on]{background-color:var(--primary)}.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:var(--accent)}.data-\[state\=on\]\:text-on-primary[data-state=on]{color:var(--on-primary)}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:var(--muted-foreground)}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.dark\:text-blue-400:is(.dark *){--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.dark\:text-green-400:is(.dark *){--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.dark\:text-orange-400:is(.dark *){--tw-text-opacity: 1;color:rgb(251 146 60 / var(--tw-text-opacity, 1))}.dark\:text-purple-400:is(.dark *){--tw-text-opacity: 1;color:rgb(192 132 252 / var(--tw-text-opacity, 1))}.dark\:hover\:brightness-\[1\.04\]:hover:is(.dark *){--tw-brightness: brightness(1.04);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}@media(min-width:640px){.sm\:max-w-md{max-width:28rem}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.sm\:rounded-lg{border-radius:.5rem}.sm\:text-left{text-align:left}}@media(min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:1024px){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:p-8{padding:2rem}}.\[\&\>\*\]\:min-w-0>*{min-width:0px}.\[\&\>\*\]\:text-on-surface-variant>*{color:var(--on-surface-variant)}.\[\&\>button\:last-child\]\:hidden>button:last-child{display:none}.\[\&\>span\]\:line-clamp-1>span{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}