@goondocks/myco 0.6.4 → 0.9.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 (288) hide show
  1. package/.claude-plugin/marketplace.json +2 -3
  2. package/.claude-plugin/plugin.json +3 -3
  3. package/CONTRIBUTING.md +37 -30
  4. package/README.md +64 -28
  5. package/bin/myco-run +2 -0
  6. package/dist/agent-run-EFICNTAU.js +34 -0
  7. package/dist/agent-run-EFICNTAU.js.map +1 -0
  8. package/dist/agent-tasks-RXJ7Z5NG.js +180 -0
  9. package/dist/agent-tasks-RXJ7Z5NG.js.map +1 -0
  10. package/dist/chunk-2T7RPVPP.js +116 -0
  11. package/dist/chunk-2T7RPVPP.js.map +1 -0
  12. package/dist/chunk-3K5WGSJ4.js +165 -0
  13. package/dist/chunk-3K5WGSJ4.js.map +1 -0
  14. package/dist/chunk-46PWOKSI.js +26 -0
  15. package/dist/chunk-46PWOKSI.js.map +1 -0
  16. package/dist/chunk-4LPQ26CK.js +277 -0
  17. package/dist/chunk-4LPQ26CK.js.map +1 -0
  18. package/dist/chunk-5PEUFJ6U.js +92 -0
  19. package/dist/chunk-5PEUFJ6U.js.map +1 -0
  20. package/dist/chunk-5VZ52A4T.js +136 -0
  21. package/dist/chunk-5VZ52A4T.js.map +1 -0
  22. package/dist/chunk-BUSP3OJB.js +103 -0
  23. package/dist/chunk-BUSP3OJB.js.map +1 -0
  24. package/dist/chunk-D7TYRPRM.js +7312 -0
  25. package/dist/chunk-D7TYRPRM.js.map +1 -0
  26. package/dist/chunk-DCXRSSBP.js +22 -0
  27. package/dist/chunk-DCXRSSBP.js.map +1 -0
  28. package/dist/chunk-E4VLWIJC.js +2 -0
  29. package/dist/chunk-FFAYUQ5N.js +39 -0
  30. package/dist/chunk-FFAYUQ5N.js.map +1 -0
  31. package/dist/chunk-IB76KGBY.js +2 -0
  32. package/dist/chunk-JMJJEQ3P.js +486 -0
  33. package/dist/chunk-JMJJEQ3P.js.map +1 -0
  34. package/dist/{chunk-N33KUCFP.js → chunk-JTYZRPX5.js} +1 -9
  35. package/dist/chunk-JTYZRPX5.js.map +1 -0
  36. package/dist/{chunk-NLUE6CYG.js → chunk-JYOOJCPQ.js} +33 -17
  37. package/dist/chunk-JYOOJCPQ.js.map +1 -0
  38. package/dist/{chunk-Z74SDEKE.js → chunk-KB4DGYIY.js} +91 -9
  39. package/dist/chunk-KB4DGYIY.js.map +1 -0
  40. package/dist/{chunk-ERG2IEWX.js → chunk-KH64DHOY.js} +3 -7413
  41. package/dist/chunk-KH64DHOY.js.map +1 -0
  42. package/dist/chunk-KV4OC4H3.js +498 -0
  43. package/dist/chunk-KV4OC4H3.js.map +1 -0
  44. package/dist/chunk-KYLDNM7H.js +66 -0
  45. package/dist/chunk-KYLDNM7H.js.map +1 -0
  46. package/dist/chunk-LPUQPDC2.js +19 -0
  47. package/dist/chunk-LPUQPDC2.js.map +1 -0
  48. package/dist/chunk-M5XWW7UI.js +97 -0
  49. package/dist/chunk-M5XWW7UI.js.map +1 -0
  50. package/dist/chunk-MHSCMET3.js +275 -0
  51. package/dist/chunk-MHSCMET3.js.map +1 -0
  52. package/dist/chunk-MYX5NCRH.js +45 -0
  53. package/dist/chunk-MYX5NCRH.js.map +1 -0
  54. package/dist/chunk-OXZSXYAT.js +877 -0
  55. package/dist/chunk-OXZSXYAT.js.map +1 -0
  56. package/dist/chunk-PB6TOLRQ.js +35 -0
  57. package/dist/chunk-PB6TOLRQ.js.map +1 -0
  58. package/dist/chunk-PT5IC642.js +162 -0
  59. package/dist/chunk-PT5IC642.js.map +1 -0
  60. package/dist/chunk-QIK2XSDQ.js +187 -0
  61. package/dist/chunk-QIK2XSDQ.js.map +1 -0
  62. package/dist/chunk-RJ6ZQKG5.js +26 -0
  63. package/dist/chunk-RJ6ZQKG5.js.map +1 -0
  64. package/dist/{chunk-YIQLYIHW.js → chunk-TRUJLI6K.js} +29 -43
  65. package/dist/chunk-TRUJLI6K.js.map +1 -0
  66. package/dist/chunk-U3IBO3O3.js +41 -0
  67. package/dist/chunk-U3IBO3O3.js.map +1 -0
  68. package/dist/{chunk-7WHF2OIZ.js → chunk-UBZPD4HN.js} +25 -7
  69. package/dist/chunk-UBZPD4HN.js.map +1 -0
  70. package/dist/{chunk-HIN3UVOG.js → chunk-V7XG6V6C.js} +20 -11
  71. package/dist/chunk-V7XG6V6C.js.map +1 -0
  72. package/dist/chunk-WGTCA2NU.js +84 -0
  73. package/dist/chunk-WGTCA2NU.js.map +1 -0
  74. package/dist/{chunk-O6PERU7U.js → chunk-XNOCTDHF.js} +2 -2
  75. package/dist/chunk-YDN4OM33.js +80 -0
  76. package/dist/chunk-YDN4OM33.js.map +1 -0
  77. package/dist/cli-ODLFRIYS.js +128 -0
  78. package/dist/cli-ODLFRIYS.js.map +1 -0
  79. package/dist/client-EYOTW3JU.js +19 -0
  80. package/dist/client-MXRNQ5FI.js +13 -0
  81. package/dist/{config-IBS6KOLQ.js → config-UR5BSGVX.js} +21 -34
  82. package/dist/config-UR5BSGVX.js.map +1 -0
  83. package/dist/detect-H5OPI7GD.js +17 -0
  84. package/dist/detect-H5OPI7GD.js.map +1 -0
  85. package/dist/detect-providers-Q42OD4OS.js +26 -0
  86. package/dist/detect-providers-Q42OD4OS.js.map +1 -0
  87. package/dist/doctor-JLKTXDEH.js +258 -0
  88. package/dist/doctor-JLKTXDEH.js.map +1 -0
  89. package/dist/executor-ONSDHPGX.js +1441 -0
  90. package/dist/executor-ONSDHPGX.js.map +1 -0
  91. package/dist/init-6GWY345B.js +198 -0
  92. package/dist/init-6GWY345B.js.map +1 -0
  93. package/dist/init-wizard-UONLDYLI.js +294 -0
  94. package/dist/init-wizard-UONLDYLI.js.map +1 -0
  95. package/dist/llm-BV3QNVRD.js +17 -0
  96. package/dist/llm-BV3QNVRD.js.map +1 -0
  97. package/dist/loader-SH67XD54.js +28 -0
  98. package/dist/loader-SH67XD54.js.map +1 -0
  99. package/dist/loader-XVXKZZDH.js +18 -0
  100. package/dist/loader-XVXKZZDH.js.map +1 -0
  101. package/dist/{chunk-H7PRCVGQ.js → logs-QZVYF6FP.js} +74 -5
  102. package/dist/logs-QZVYF6FP.js.map +1 -0
  103. package/dist/main-BMCL7CPO.js +4393 -0
  104. package/dist/main-BMCL7CPO.js.map +1 -0
  105. package/dist/openai-embeddings-C265WRNK.js +14 -0
  106. package/dist/openai-embeddings-C265WRNK.js.map +1 -0
  107. package/dist/openrouter-U6VFCRX2.js +14 -0
  108. package/dist/openrouter-U6VFCRX2.js.map +1 -0
  109. package/dist/post-compact-OWFSOITU.js +26 -0
  110. package/dist/post-compact-OWFSOITU.js.map +1 -0
  111. package/dist/post-tool-use-DOUM7CGQ.js +56 -0
  112. package/dist/post-tool-use-DOUM7CGQ.js.map +1 -0
  113. package/dist/post-tool-use-failure-SG3C7PE6.js +28 -0
  114. package/dist/post-tool-use-failure-SG3C7PE6.js.map +1 -0
  115. package/dist/pre-compact-3J33CHXQ.js +25 -0
  116. package/dist/pre-compact-3J33CHXQ.js.map +1 -0
  117. package/dist/provider-check-3WBPZADE.js +12 -0
  118. package/dist/provider-check-3WBPZADE.js.map +1 -0
  119. package/dist/registry-J4XTWARS.js +25 -0
  120. package/dist/registry-J4XTWARS.js.map +1 -0
  121. package/dist/resolution-events-TFEQPVKS.js +12 -0
  122. package/dist/resolution-events-TFEQPVKS.js.map +1 -0
  123. package/dist/resolve-3FEUV462.js +9 -0
  124. package/dist/resolve-3FEUV462.js.map +1 -0
  125. package/dist/{restart-XCMILOL5.js → restart-2VM33WOB.js} +10 -6
  126. package/dist/{restart-XCMILOL5.js.map → restart-2VM33WOB.js.map} +1 -1
  127. package/dist/search-ZGQR5MDE.js +91 -0
  128. package/dist/search-ZGQR5MDE.js.map +1 -0
  129. package/dist/{server-6UDN35QN.js → server-6KMBJCHZ.js} +308 -517
  130. package/dist/server-6KMBJCHZ.js.map +1 -0
  131. package/dist/session-Z2FXDDG6.js +68 -0
  132. package/dist/session-Z2FXDDG6.js.map +1 -0
  133. package/dist/session-end-FLVX32LE.js +38 -0
  134. package/dist/session-end-FLVX32LE.js.map +1 -0
  135. package/dist/session-start-UCLK7PXE.js +169 -0
  136. package/dist/session-start-UCLK7PXE.js.map +1 -0
  137. package/dist/setup-digest-4KDSXAIV.js +15 -0
  138. package/dist/setup-digest-4KDSXAIV.js.map +1 -0
  139. package/dist/setup-llm-GKMCHURK.js +81 -0
  140. package/dist/setup-llm-GKMCHURK.js.map +1 -0
  141. package/dist/src/agent/definitions/agent.yaml +35 -0
  142. package/dist/src/agent/definitions/tasks/digest-only.yaml +84 -0
  143. package/dist/src/agent/definitions/tasks/extract-only.yaml +87 -0
  144. package/dist/src/agent/definitions/tasks/full-intelligence.yaml +472 -0
  145. package/dist/src/agent/definitions/tasks/graph-maintenance.yaml +92 -0
  146. package/dist/src/agent/definitions/tasks/review-session.yaml +132 -0
  147. package/dist/src/agent/definitions/tasks/supersession-sweep.yaml +86 -0
  148. package/dist/src/agent/definitions/tasks/title-summary.yaml +88 -0
  149. package/dist/src/agent/prompts/agent.md +121 -0
  150. package/dist/src/agent/prompts/orchestrator.md +91 -0
  151. package/dist/src/cli.js +1 -8
  152. package/dist/src/cli.js.map +1 -1
  153. package/dist/src/daemon/main.js +1 -8
  154. package/dist/src/daemon/main.js.map +1 -1
  155. package/dist/src/hooks/post-tool-use.js +3 -50
  156. package/dist/src/hooks/post-tool-use.js.map +1 -1
  157. package/dist/src/hooks/session-end.js +3 -32
  158. package/dist/src/hooks/session-end.js.map +1 -1
  159. package/dist/src/hooks/session-start.js +2 -8
  160. package/dist/src/hooks/session-start.js.map +1 -1
  161. package/dist/src/hooks/stop.js +3 -42
  162. package/dist/src/hooks/stop.js.map +1 -1
  163. package/dist/src/hooks/user-prompt-submit.js +3 -53
  164. package/dist/src/hooks/user-prompt-submit.js.map +1 -1
  165. package/dist/src/mcp/server.js +1 -8
  166. package/dist/src/mcp/server.js.map +1 -1
  167. package/dist/src/prompts/digest-system.md +1 -1
  168. package/dist/src/symbionts/manifests/claude-code.yaml +16 -0
  169. package/dist/src/symbionts/manifests/cursor.yaml +14 -0
  170. package/dist/stats-IUJPZSVZ.js +94 -0
  171. package/dist/stats-IUJPZSVZ.js.map +1 -0
  172. package/dist/stop-XRQLLXST.js +42 -0
  173. package/dist/stop-XRQLLXST.js.map +1 -0
  174. package/dist/stop-failure-2CAJJKRG.js +26 -0
  175. package/dist/stop-failure-2CAJJKRG.js.map +1 -0
  176. package/dist/subagent-start-MWWQTZMQ.js +26 -0
  177. package/dist/subagent-start-MWWQTZMQ.js.map +1 -0
  178. package/dist/subagent-stop-PJXYGRXB.js +28 -0
  179. package/dist/subagent-stop-PJXYGRXB.js.map +1 -0
  180. package/dist/task-completed-4LFRJVGI.js +27 -0
  181. package/dist/task-completed-4LFRJVGI.js.map +1 -0
  182. package/dist/ui/assets/index-DZrElonz.js +744 -0
  183. package/dist/ui/assets/index-TkeiYbZB.css +1 -0
  184. package/dist/ui/favicon.svg +7 -7
  185. package/dist/ui/fonts/Inter-Variable.woff2 +0 -0
  186. package/dist/ui/fonts/JetBrainsMono-Variable.woff2 +0 -0
  187. package/dist/ui/fonts/Newsreader-Italic-Variable.woff2 +0 -0
  188. package/dist/ui/fonts/Newsreader-Variable.woff2 +0 -0
  189. package/dist/ui/index.html +2 -2
  190. package/dist/user-prompt-submit-KSM3AR6P.js +59 -0
  191. package/dist/user-prompt-submit-KSM3AR6P.js.map +1 -0
  192. package/dist/{verify-TOWQHPBX.js → verify-UDAYVX37.js} +17 -22
  193. package/dist/verify-UDAYVX37.js.map +1 -0
  194. package/dist/{version-36RVCQA6.js → version-KLBN4HZT.js} +3 -4
  195. package/dist/version-KLBN4HZT.js.map +1 -0
  196. package/hooks/hooks.json +82 -5
  197. package/package.json +6 -3
  198. package/skills/myco/SKILL.md +10 -10
  199. package/skills/myco/references/cli-usage.md +15 -13
  200. package/skills/myco/references/vault-status.md +3 -3
  201. package/skills/myco/references/wisdom.md +4 -4
  202. package/skills/myco-curate/SKILL.md +86 -0
  203. package/dist/chunk-2ZIBCEYO.js +0 -113
  204. package/dist/chunk-2ZIBCEYO.js.map +0 -1
  205. package/dist/chunk-4RMSHZE4.js +0 -107
  206. package/dist/chunk-4RMSHZE4.js.map +0 -1
  207. package/dist/chunk-4XVKZ3WA.js +0 -1078
  208. package/dist/chunk-4XVKZ3WA.js.map +0 -1
  209. package/dist/chunk-6FQISQNA.js +0 -61
  210. package/dist/chunk-6FQISQNA.js.map +0 -1
  211. package/dist/chunk-7WHF2OIZ.js.map +0 -1
  212. package/dist/chunk-ERG2IEWX.js.map +0 -1
  213. package/dist/chunk-FPRXMJLT.js +0 -56
  214. package/dist/chunk-FPRXMJLT.js.map +0 -1
  215. package/dist/chunk-GENQ5QGP.js +0 -37
  216. package/dist/chunk-GENQ5QGP.js.map +0 -1
  217. package/dist/chunk-H7PRCVGQ.js.map +0 -1
  218. package/dist/chunk-HIN3UVOG.js.map +0 -1
  219. package/dist/chunk-HYVT345Y.js +0 -159
  220. package/dist/chunk-HYVT345Y.js.map +0 -1
  221. package/dist/chunk-J4D4CROB.js +0 -143
  222. package/dist/chunk-J4D4CROB.js.map +0 -1
  223. package/dist/chunk-MDLSAFPP.js +0 -99
  224. package/dist/chunk-MDLSAFPP.js.map +0 -1
  225. package/dist/chunk-N33KUCFP.js.map +0 -1
  226. package/dist/chunk-NL6WQO56.js +0 -65
  227. package/dist/chunk-NL6WQO56.js.map +0 -1
  228. package/dist/chunk-NLUE6CYG.js.map +0 -1
  229. package/dist/chunk-P723N2LP.js +0 -147
  230. package/dist/chunk-P723N2LP.js.map +0 -1
  231. package/dist/chunk-QLUE3BUL.js +0 -161
  232. package/dist/chunk-QLUE3BUL.js.map +0 -1
  233. package/dist/chunk-QN4W3JUA.js +0 -43
  234. package/dist/chunk-QN4W3JUA.js.map +0 -1
  235. package/dist/chunk-RGVBGTD6.js +0 -21
  236. package/dist/chunk-RGVBGTD6.js.map +0 -1
  237. package/dist/chunk-TWSTAVLO.js +0 -132
  238. package/dist/chunk-TWSTAVLO.js.map +0 -1
  239. package/dist/chunk-UP4P4OAA.js +0 -4423
  240. package/dist/chunk-UP4P4OAA.js.map +0 -1
  241. package/dist/chunk-YIQLYIHW.js.map +0 -1
  242. package/dist/chunk-YTFXA4RX.js +0 -86
  243. package/dist/chunk-YTFXA4RX.js.map +0 -1
  244. package/dist/chunk-Z74SDEKE.js.map +0 -1
  245. package/dist/cli-IHILSS6N.js +0 -97
  246. package/dist/cli-IHILSS6N.js.map +0 -1
  247. package/dist/client-AGFNR2S4.js +0 -12
  248. package/dist/config-IBS6KOLQ.js.map +0 -1
  249. package/dist/curate-3D4GHKJH.js +0 -78
  250. package/dist/curate-3D4GHKJH.js.map +0 -1
  251. package/dist/detect-providers-XEP4QA3R.js +0 -35
  252. package/dist/detect-providers-XEP4QA3R.js.map +0 -1
  253. package/dist/digest-7HLJXL77.js +0 -85
  254. package/dist/digest-7HLJXL77.js.map +0 -1
  255. package/dist/init-ARQ53JOR.js +0 -109
  256. package/dist/init-ARQ53JOR.js.map +0 -1
  257. package/dist/logs-IENORIYR.js +0 -84
  258. package/dist/logs-IENORIYR.js.map +0 -1
  259. package/dist/main-6AGPIMH2.js +0 -5715
  260. package/dist/main-6AGPIMH2.js.map +0 -1
  261. package/dist/rebuild-Q2ACEB6F.js +0 -64
  262. package/dist/rebuild-Q2ACEB6F.js.map +0 -1
  263. package/dist/reprocess-CDEFGQOV.js +0 -79
  264. package/dist/reprocess-CDEFGQOV.js.map +0 -1
  265. package/dist/search-7W25SKCB.js +0 -120
  266. package/dist/search-7W25SKCB.js.map +0 -1
  267. package/dist/server-6UDN35QN.js.map +0 -1
  268. package/dist/session-F326AWCH.js +0 -44
  269. package/dist/session-F326AWCH.js.map +0 -1
  270. package/dist/session-start-K6IGAC7H.js +0 -192
  271. package/dist/session-start-K6IGAC7H.js.map +0 -1
  272. package/dist/setup-digest-X5PN27F4.js +0 -15
  273. package/dist/setup-llm-S5OHQJXK.js +0 -15
  274. package/dist/src/prompts/classification.md +0 -43
  275. package/dist/stats-TTSDXGJV.js +0 -58
  276. package/dist/stats-TTSDXGJV.js.map +0 -1
  277. package/dist/templates-XPRBOWCE.js +0 -38
  278. package/dist/templates-XPRBOWCE.js.map +0 -1
  279. package/dist/ui/assets/index-08wKT7wS.css +0 -1
  280. package/dist/ui/assets/index-CMSMi4Jb.js +0 -369
  281. package/dist/verify-TOWQHPBX.js.map +0 -1
  282. package/skills/setup/SKILL.md +0 -174
  283. package/skills/setup/references/model-recommendations.md +0 -83
  284. /package/dist/{client-AGFNR2S4.js.map → chunk-E4VLWIJC.js.map} +0 -0
  285. /package/dist/{setup-digest-X5PN27F4.js.map → chunk-IB76KGBY.js.map} +0 -0
  286. /package/dist/{chunk-O6PERU7U.js.map → chunk-XNOCTDHF.js.map} +0 -0
  287. /package/dist/{setup-llm-S5OHQJXK.js.map → client-EYOTW3JU.js.map} +0 -0
  288. /package/dist/{version-36RVCQA6.js.map → client-MXRNQ5FI.js.map} +0 -0
@@ -1,44 +0,0 @@
1
- import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
- import {
3
- MycoIndex
4
- } from "./chunk-TWSTAVLO.js";
5
- import "./chunk-PZUWP5VK.js";
6
-
7
- // src/cli/session.ts
8
- import fs from "fs";
9
- import path from "path";
10
- function run(args, vaultDir) {
11
- const idOrLatest = args[0];
12
- const index = new MycoIndex(path.join(vaultDir, "index.db"));
13
- const sessions = index.query({ type: "session" });
14
- if (sessions.length === 0) {
15
- console.log("No sessions found");
16
- index.close();
17
- return;
18
- }
19
- let target;
20
- if (!idOrLatest || idOrLatest === "latest") {
21
- target = sessions[sessions.length - 1];
22
- } else {
23
- target = sessions.find((s) => s.id.includes(idOrLatest));
24
- }
25
- if (!target) {
26
- console.error(`Session not found: ${idOrLatest}`);
27
- console.log("Available:", sessions.map((s) => s.id).join(", "));
28
- index.close();
29
- return;
30
- }
31
- const fullPath = path.join(vaultDir, target.path);
32
- if (fs.existsSync(fullPath)) {
33
- console.log(fs.readFileSync(fullPath, "utf-8"));
34
- } else {
35
- console.log(`Title: ${target.title}`);
36
- console.log(`Content:
37
- ${target.content?.slice(0, 2e3)}`);
38
- }
39
- index.close();
40
- }
41
- export {
42
- run
43
- };
44
- //# sourceMappingURL=session-F326AWCH.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/session.ts"],"sourcesContent":["import { MycoIndex } from '../index/sqlite.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport function run(args: string[], vaultDir: string): void {\n const idOrLatest = args[0];\n const index = new MycoIndex(path.join(vaultDir, 'index.db'));\n const sessions = index.query({ type: 'session' });\n\n if (sessions.length === 0) {\n console.log('No sessions found');\n index.close();\n return;\n }\n\n let target;\n if (!idOrLatest || idOrLatest === 'latest') {\n target = sessions[sessions.length - 1];\n } else {\n target = sessions.find((s) => s.id.includes(idOrLatest));\n }\n\n if (!target) {\n console.error(`Session not found: ${idOrLatest}`);\n console.log('Available:', sessions.map((s) => s.id).join(', '));\n index.close();\n return;\n }\n\n // Read the raw markdown file\n const fullPath = path.join(vaultDir, target.path);\n if (fs.existsSync(fullPath)) {\n console.log(fs.readFileSync(fullPath, 'utf-8'));\n } else {\n console.log(`Title: ${target.title}`);\n console.log(`Content:\\n${target.content?.slice(0, 2000)}`);\n }\n\n index.close();\n}\n"],"mappings":";;;;;;;AACA,OAAO,QAAQ;AACf,OAAO,UAAU;AAEV,SAAS,IAAI,MAAgB,UAAwB;AAC1D,QAAM,aAAa,KAAK,CAAC;AACzB,QAAM,QAAQ,IAAI,UAAU,KAAK,KAAK,UAAU,UAAU,CAAC;AAC3D,QAAM,WAAW,MAAM,MAAM,EAAE,MAAM,UAAU,CAAC;AAEhD,MAAI,SAAS,WAAW,GAAG;AACzB,YAAQ,IAAI,mBAAmB;AAC/B,UAAM,MAAM;AACZ;AAAA,EACF;AAEA,MAAI;AACJ,MAAI,CAAC,cAAc,eAAe,UAAU;AAC1C,aAAS,SAAS,SAAS,SAAS,CAAC;AAAA,EACvC,OAAO;AACL,aAAS,SAAS,KAAK,CAAC,MAAM,EAAE,GAAG,SAAS,UAAU,CAAC;AAAA,EACzD;AAEA,MAAI,CAAC,QAAQ;AACX,YAAQ,MAAM,sBAAsB,UAAU,EAAE;AAChD,YAAQ,IAAI,cAAc,SAAS,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,IAAI,CAAC;AAC9D,UAAM,MAAM;AACZ;AAAA,EACF;AAGA,QAAM,WAAW,KAAK,KAAK,UAAU,OAAO,IAAI;AAChD,MAAI,GAAG,WAAW,QAAQ,GAAG;AAC3B,YAAQ,IAAI,GAAG,aAAa,UAAU,OAAO,CAAC;AAAA,EAChD,OAAO;AACL,YAAQ,IAAI,UAAU,OAAO,KAAK,EAAE;AACpC,YAAQ,IAAI;AAAA,EAAa,OAAO,SAAS,MAAM,GAAG,GAAI,CAAC,EAAE;AAAA,EAC3D;AAEA,QAAM,MAAM;AACd;","names":[]}
@@ -1,192 +0,0 @@
1
- import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
- import {
3
- planFm,
4
- sporeFm
5
- } from "./chunk-GENQ5QGP.js";
6
- import {
7
- MycoIndex
8
- } from "./chunk-TWSTAVLO.js";
9
- import {
10
- loadConfig
11
- } from "./chunk-HYVT345Y.js";
12
- import "./chunk-ERG2IEWX.js";
13
- import {
14
- readStdin
15
- } from "./chunk-O6PERU7U.js";
16
- import {
17
- DaemonClient
18
- } from "./chunk-YIQLYIHW.js";
19
- import "./chunk-QN4W3JUA.js";
20
- import {
21
- resolveVaultDir
22
- } from "./chunk-N33KUCFP.js";
23
- import "./chunk-Z74SDEKE.js";
24
- import {
25
- CONTEXT_PLAN_PREVIEW_CHARS,
26
- CONTEXT_SESSION_PREVIEW_CHARS,
27
- CONTEXT_SPORE_PREVIEW_CHARS,
28
- estimateTokens
29
- } from "./chunk-J4D4CROB.js";
30
- import "./chunk-PZUWP5VK.js";
31
-
32
- // src/context/relevance.ts
33
- var RECENCY_TIERS = [
34
- { maxHours: 24, score: 3, label: "recent (<24h)" },
35
- { maxHours: 72, score: 2, label: "recent (<72h)" },
36
- { maxHours: 168, score: 1, label: "recent (<1w)" }
37
- ];
38
- var BRANCH_MATCH_SCORE = 3;
39
- var PLAN_MATCH_SCORE = 2;
40
- var MS_PER_HOUR = 36e5;
41
- function scoreRelevance(notes, input) {
42
- return notes.map((note) => {
43
- let score = 0;
44
- const reasons = [];
45
- const fm = note.frontmatter;
46
- const age = Date.now() - new Date(note.created).getTime();
47
- const hoursOld = age / MS_PER_HOUR;
48
- for (const tier of RECENCY_TIERS) {
49
- if (hoursOld < tier.maxHours) {
50
- score += tier.score;
51
- reasons.push(tier.label);
52
- break;
53
- }
54
- }
55
- if (input.branch && fm.branch === input.branch) {
56
- score += BRANCH_MATCH_SCORE;
57
- reasons.push("same branch");
58
- }
59
- if (input.activePlanIds?.length) {
60
- const planRef = fm.plan;
61
- if (planRef && input.activePlanIds.some(
62
- (id) => planRef === `[[${id}]]` || planRef === id
63
- )) {
64
- score += PLAN_MATCH_SCORE;
65
- reasons.push("active plan");
66
- }
67
- }
68
- return { note, score, reason: reasons.join(", ") };
69
- }).filter((s) => s.score > 0).sort((a, b) => b.score - a.score);
70
- }
71
-
72
- // src/context/injector.ts
73
- function buildInjectedContext(index, config, context) {
74
- const budgets = config.context.layers;
75
- const plans = index.query({ type: "plan" });
76
- const activePlans = plans.filter(
77
- (p) => ["active", "in_progress"].includes(planFm(p).status ?? "")
78
- );
79
- const plansText = formatLayer(
80
- "Active Plans",
81
- activePlans.map((p) => `- **${p.title}** (${planFm(p).status}): ${p.content.slice(0, CONTEXT_PLAN_PREVIEW_CHARS)}`),
82
- budgets.plans
83
- );
84
- const sessions = index.query({ type: "session", limit: 10 });
85
- const activePlanIds = activePlans.map((p) => p.id);
86
- const scoredSessions = scoreRelevance(sessions, {
87
- branch: context.branch,
88
- activePlanIds
89
- });
90
- const sessionsText = formatLayer(
91
- "Recent Sessions",
92
- scoredSessions.slice(0, 5).map(
93
- (s) => `- **${s.note.title}**: ${s.note.content.slice(0, CONTEXT_SESSION_PREVIEW_CHARS)} (${s.reason})`
94
- ),
95
- budgets.sessions
96
- );
97
- const spores = index.query({ type: "spore", limit: 20 }).filter((m) => {
98
- const status = sporeFm(m).status;
99
- return status !== "superseded" && status !== "archived";
100
- });
101
- const scoredSpores = scoreRelevance(spores, {
102
- branch: context.branch,
103
- activePlanIds
104
- });
105
- const sporesText = formatLayer(
106
- "Relevant Spores",
107
- scoredSpores.slice(0, 5).map(
108
- (m) => `- **${m.note.title}** (${sporeFm(m.note).observation_type}): ${m.note.content.slice(0, CONTEXT_SPORE_PREVIEW_CHARS)}`
109
- ),
110
- budgets.spores
111
- );
112
- const teamText = formatLayer("Team Activity", [], budgets.team);
113
- const allLayers = [plansText, sessionsText, sporesText, teamText].filter(Boolean);
114
- const parts = [];
115
- let totalTokens = 0;
116
- for (const layer of allLayers) {
117
- const layerTokens = estimateTokens(layer);
118
- if (totalTokens + layerTokens > config.context.max_tokens) break;
119
- parts.push(layer);
120
- totalTokens += layerTokens;
121
- }
122
- const fullText = parts.join("\n\n");
123
- return {
124
- text: fullText,
125
- tokenEstimate: totalTokens,
126
- layers: {
127
- plans: plansText,
128
- sessions: sessionsText,
129
- spores: sporesText,
130
- team: teamText
131
- }
132
- };
133
- }
134
- function formatLayer(heading, items, budget) {
135
- if (items.length === 0) return "";
136
- let text = `### ${heading}
137
- `;
138
- let currentTokens = estimateTokens(text);
139
- for (const item of items) {
140
- const itemTokens = estimateTokens(item);
141
- if (currentTokens + itemTokens > budget) break;
142
- text += item + "\n";
143
- currentTokens += itemTokens;
144
- }
145
- return text.trim();
146
- }
147
-
148
- // src/hooks/session-start.ts
149
- import { execFileSync } from "child_process";
150
- import fs from "fs";
151
- import path from "path";
152
- async function main() {
153
- const VAULT_DIR = resolveVaultDir();
154
- if (!fs.existsSync(path.join(VAULT_DIR, "myco.yaml"))) return;
155
- try {
156
- const config = loadConfig(VAULT_DIR);
157
- const client = new DaemonClient(VAULT_DIR);
158
- const healthy = await client.ensureRunning();
159
- const input = JSON.parse(await readStdin());
160
- const sessionId = input.session_id ?? `s-${Date.now()}`;
161
- let branch;
162
- try {
163
- branch = execFileSync("git", ["rev-parse", "--abbrev-ref", "HEAD"], { encoding: "utf-8" }).trim();
164
- } catch {
165
- }
166
- if (healthy) {
167
- await client.post("/sessions/register", {
168
- session_id: sessionId,
169
- branch,
170
- started_at: (/* @__PURE__ */ new Date()).toISOString()
171
- });
172
- const contextResult = await client.post("/context", { session_id: sessionId, branch });
173
- if (contextResult.ok && contextResult.data?.text) {
174
- if (contextResult.data.source === "digest") {
175
- process.stderr.write(`[myco] Injecting digest extract (tier ${contextResult.data.tier})
176
- `);
177
- }
178
- process.stdout.write(contextResult.data.text);
179
- return;
180
- }
181
- }
182
- const index = new MycoIndex(path.join(VAULT_DIR, "index.db"));
183
- const injected = buildInjectedContext(index, config, { branch });
184
- if (injected.text) process.stdout.write(injected.text);
185
- index.close();
186
- } catch (error) {
187
- process.stderr.write(`[myco] session-start error: ${error.message}
188
- `);
189
- }
190
- }
191
- main();
192
- //# sourceMappingURL=session-start-K6IGAC7H.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/context/relevance.ts","../src/context/injector.ts","../src/hooks/session-start.ts"],"sourcesContent":["import type { IndexedNote } from '../index/sqlite.js';\n\nexport interface ScoredNote {\n note: IndexedNote;\n score: number;\n reason: string;\n}\n\ninterface RelevanceInput {\n branch?: string;\n activePlanIds?: string[];\n}\n\n// --- Recency thresholds (hours) and score weights ---\nconst RECENCY_TIERS = [\n { maxHours: 24, score: 3, label: 'recent (<24h)' },\n { maxHours: 72, score: 2, label: 'recent (<72h)' },\n { maxHours: 168, score: 1, label: 'recent (<1w)' },\n] as const;\n\nconst BRANCH_MATCH_SCORE = 3;\nconst PLAN_MATCH_SCORE = 2;\n\nconst MS_PER_HOUR = 3_600_000;\n\nexport function scoreRelevance(\n notes: IndexedNote[],\n input: RelevanceInput,\n): ScoredNote[] {\n return notes\n .map((note) => {\n let score = 0;\n const reasons: string[] = [];\n\n const fm = note.frontmatter as Record<string, unknown>;\n\n // Recency boost\n const age = Date.now() - new Date(note.created).getTime();\n const hoursOld = age / MS_PER_HOUR;\n for (const tier of RECENCY_TIERS) {\n if (hoursOld < tier.maxHours) {\n score += tier.score;\n reasons.push(tier.label);\n break;\n }\n }\n\n // Branch match\n if (input.branch && fm.branch === input.branch) {\n score += BRANCH_MATCH_SCORE;\n reasons.push('same branch');\n }\n\n // Plan match\n if (input.activePlanIds?.length) {\n const planRef = fm.plan as string | undefined;\n if (planRef && input.activePlanIds.some((id) =>\n planRef === `[[${id}]]` || planRef === id,\n )) {\n score += PLAN_MATCH_SCORE;\n reasons.push('active plan');\n }\n }\n\n return { note, score, reason: reasons.join(', ') };\n })\n .filter((s) => s.score > 0)\n .sort((a, b) => b.score - a.score);\n}\n","import type { MycoIndex } from '../index/sqlite.js';\nimport type { MycoConfig } from '../config/schema.js';\nimport { planFm, sporeFm } from '../vault/frontmatter.js';\nimport { scoreRelevance } from './relevance.js';\nimport { estimateTokens, CONTEXT_PLAN_PREVIEW_CHARS, CONTEXT_SESSION_PREVIEW_CHARS, CONTEXT_SPORE_PREVIEW_CHARS } from '../constants.js';\n\ninterface InjectionContext {\n branch?: string;\n}\n\ninterface InjectedContext {\n text: string;\n tokenEstimate: number;\n layers: {\n plans: string;\n sessions: string;\n spores: string;\n team: string;\n };\n}\n\nexport function buildInjectedContext(\n index: MycoIndex,\n config: MycoConfig,\n context: InjectionContext,\n): InjectedContext {\n const budgets = config.context.layers;\n\n // Layer 1: Active plans\n const plans = index.query({ type: 'plan' });\n const activePlans = plans.filter((p) =>\n ['active', 'in_progress'].includes(planFm(p).status ?? ''),\n );\n const plansText = formatLayer(\n 'Active Plans',\n activePlans.map((p) => `- **${p.title}** (${planFm(p).status}): ${p.content.slice(0, CONTEXT_PLAN_PREVIEW_CHARS)}`),\n budgets.plans,\n );\n\n // Layer 2: Recent sessions\n const sessions = index.query({ type: 'session', limit: 10 });\n const activePlanIds = activePlans.map((p) => p.id);\n const scoredSessions = scoreRelevance(sessions, {\n branch: context.branch,\n activePlanIds,\n });\n const sessionsText = formatLayer(\n 'Recent Sessions',\n scoredSessions.slice(0, 5).map((s) =>\n `- **${s.note.title}**: ${s.note.content.slice(0, CONTEXT_SESSION_PREVIEW_CHARS)} (${s.reason})`,\n ),\n budgets.sessions,\n );\n\n // Layer 3: Relevant spores (exclude superseded/archived)\n const spores = index.query({ type: 'spore', limit: 20 })\n .filter((m) => {\n const status = sporeFm(m).status;\n return status !== 'superseded' && status !== 'archived';\n });\n const scoredSpores = scoreRelevance(spores, {\n branch: context.branch,\n activePlanIds,\n });\n const sporesText = formatLayer(\n 'Relevant Spores',\n scoredSpores.slice(0, 5).map((m) =>\n `- **${m.note.title}** (${sporeFm(m.note).observation_type}): ${m.note.content.slice(0, CONTEXT_SPORE_PREVIEW_CHARS)}`,\n ),\n budgets.spores,\n );\n\n // Layer 4: Team activity\n const teamText = formatLayer('Team Activity', [], budgets.team);\n\n // Enforce total max_tokens budget\n const allLayers = [plansText, sessionsText, sporesText, teamText].filter(Boolean);\n const parts: string[] = [];\n let totalTokens = 0;\n\n for (const layer of allLayers) {\n const layerTokens = estimateTokens(layer);\n if (totalTokens + layerTokens > config.context.max_tokens) break;\n parts.push(layer);\n totalTokens += layerTokens;\n }\n\n const fullText = parts.join('\\n\\n');\n\n return {\n text: fullText,\n tokenEstimate: totalTokens,\n layers: {\n plans: plansText,\n sessions: sessionsText,\n spores: sporesText,\n team: teamText,\n },\n };\n}\n\nfunction formatLayer(heading: string, items: string[], budget: number): string {\n if (items.length === 0) return '';\n\n let text = `### ${heading}\\n`;\n let currentTokens = estimateTokens(text);\n\n for (const item of items) {\n const itemTokens = estimateTokens(item);\n if (currentTokens + itemTokens > budget) break;\n text += item + '\\n';\n currentTokens += itemTokens;\n }\n\n return text.trim();\n}\n\n","import { DaemonClient } from './client.js';\nimport { readStdin } from './read-stdin.js';\nimport { loadConfig } from '../config/loader.js';\nimport { MycoIndex } from '../index/sqlite.js';\nimport { buildInjectedContext } from '../context/injector.js';\nimport { resolveVaultDir } from '../vault/resolve.js';\nimport { execFileSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nasync function main() {\n const VAULT_DIR = resolveVaultDir();\n if (!fs.existsSync(path.join(VAULT_DIR, 'myco.yaml'))) return;\n\n try {\n const config = loadConfig(VAULT_DIR);\n const client = new DaemonClient(VAULT_DIR);\n const healthy = await client.ensureRunning();\n\n const input = JSON.parse(await readStdin());\n const sessionId = input.session_id ?? `s-${Date.now()}`;\n\n let branch: string | undefined;\n try {\n branch = execFileSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { encoding: 'utf-8' }).trim();\n } catch { /* not a git repo */ }\n\n if (healthy) {\n await client.post('/sessions/register', {\n session_id: sessionId,\n branch,\n started_at: new Date().toISOString(),\n });\n\n const contextResult = await client.post('/context', { session_id: sessionId, branch });\n\n if (contextResult.ok && contextResult.data?.text) {\n if (contextResult.data.source === 'digest') {\n process.stderr.write(`[myco] Injecting digest extract (tier ${contextResult.data.tier})\\n`);\n }\n process.stdout.write(contextResult.data.text);\n return;\n }\n }\n\n // Degraded: local FTS context only\n const index = new MycoIndex(path.join(VAULT_DIR, 'index.db'));\n const injected = buildInjectedContext(index, config, { branch });\n if (injected.text) process.stdout.write(injected.text);\n index.close();\n } catch (error) {\n process.stderr.write(`[myco] session-start error: ${(error as Error).message}\\n`);\n }\n}\n\nmain();\n"],"mappings":"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","names":[]}
@@ -1,15 +0,0 @@
1
- import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
- import {
3
- run
4
- } from "./chunk-P723N2LP.js";
5
- import "./chunk-YTFXA4RX.js";
6
- import "./chunk-SAKJMNSR.js";
7
- import "./chunk-7WHF2OIZ.js";
8
- import "./chunk-ERG2IEWX.js";
9
- import "./chunk-Z74SDEKE.js";
10
- import "./chunk-J4D4CROB.js";
11
- import "./chunk-PZUWP5VK.js";
12
- export {
13
- run
14
- };
15
- //# sourceMappingURL=setup-digest-X5PN27F4.js.map
@@ -1,15 +0,0 @@
1
- import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
- import {
3
- run
4
- } from "./chunk-MDLSAFPP.js";
5
- import "./chunk-YTFXA4RX.js";
6
- import "./chunk-SAKJMNSR.js";
7
- import "./chunk-7WHF2OIZ.js";
8
- import "./chunk-ERG2IEWX.js";
9
- import "./chunk-Z74SDEKE.js";
10
- import "./chunk-J4D4CROB.js";
11
- import "./chunk-PZUWP5VK.js";
12
- export {
13
- run
14
- };
15
- //# sourceMappingURL=setup-llm-S5OHQJXK.js.map
@@ -1,43 +0,0 @@
1
- You are classifying files from coding session "{{sessionId}}" to determine which are substantive **project** artifacts worth preserving in a knowledge vault.
2
- You have a budget of ~{{maxTokens}} tokens for your response.
3
-
4
- ## Candidate Files
5
-
6
- {{fileList}}
7
-
8
- ## Task
9
-
10
- For each file that is a substantive project artifact (design doc, specification, implementation plan, RFC, or project documentation), classify it.
11
-
12
- **DO NOT classify these — they are tooling, not project artifacts:**
13
- - Agent/LLM instruction files (CLAUDE.md, AGENTS.md, GEMINI.md, rules files)
14
- - Plugin components: slash commands, skills, hooks, plugin manifests
15
- - Configuration files, dotfiles, settings
16
- - Implementation code, test files, generated output
17
- - Prompt templates used by the tool/plugin itself
18
- - README, CONTRIBUTING, CHANGELOG, LICENSE files
19
- - GitHub/CI templates: pull request templates, issue templates, workflow files
20
- - Documentation that describes how to use the tool or repo (quickstart guides, lifecycle docs)
21
-
22
- **DO classify these — they are project artifacts:**
23
- - Design specifications and architecture documents
24
- - Implementation plans and roadmaps
25
- - RFCs and proposals
26
- - Project documentation that captures decisions, context, or knowledge
27
-
28
- Artifact types:
29
- {{artifactTypes}}
30
-
31
- Respond with valid JSON only, no markdown fences:
32
- {
33
- "artifacts": [
34
- {
35
- "source_path": "exact/path/from/above",
36
- "artifact_type": "{{validTypes}}",
37
- "title": "Human-readable title",
38
- "tags": ["single_word_tags", "no spaces"]
39
- }
40
- ]
41
- }
42
-
43
- If none of the candidates are artifacts, respond with: {"artifacts": []}
@@ -1,58 +0,0 @@
1
- import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
- import {
3
- gatherStats
4
- } from "./chunk-NL6WQO56.js";
5
- import "./chunk-4RMSHZE4.js";
6
- import {
7
- MycoIndex
8
- } from "./chunk-TWSTAVLO.js";
9
- import "./chunk-YTFXA4RX.js";
10
- import "./chunk-SAKJMNSR.js";
11
- import "./chunk-7WHF2OIZ.js";
12
- import "./chunk-Z74SDEKE.js";
13
- import "./chunk-J4D4CROB.js";
14
- import "./chunk-PZUWP5VK.js";
15
-
16
- // src/cli/stats.ts
17
- import fs from "fs";
18
- import path from "path";
19
- function run(_args, vaultDir) {
20
- const index = new MycoIndex(path.join(vaultDir, "index.db"));
21
- const stats = gatherStats(vaultDir, index);
22
- console.log("=== Myco Vault ===");
23
- console.log(`Path: ${stats.vault.path}`);
24
- console.log();
25
- console.log("--- Index ---");
26
- console.log(`Sessions: ${stats.vault.session_count}`);
27
- console.log(`Spores: ${Object.values(stats.vault.spore_counts).reduce((a, b) => a + b, 0)}`);
28
- console.log(`Plans: ${stats.vault.plan_count}`);
29
- if (Object.keys(stats.vault.spore_counts).length > 0) {
30
- console.log("\n--- Spores by Type ---");
31
- for (const [t, c] of Object.entries(stats.vault.spore_counts).sort((a, b) => b[1] - a[1])) {
32
- console.log(` ${t}: ${c}`);
33
- }
34
- }
35
- const vecDb = path.join(vaultDir, "vectors.db");
36
- if (fs.existsSync(vecDb)) {
37
- console.log(`
38
- --- Vectors ---`);
39
- console.log(`Embeddings: ${stats.index.vector_count}`);
40
- } else {
41
- console.log("\nVectors: not initialized");
42
- }
43
- if (stats.daemon) {
44
- const d = stats.daemon;
45
- console.log(`
46
- --- Daemon ---`);
47
- console.log(`PID: ${d.pid} (${d.alive ? "running" : "dead"})`);
48
- console.log(`Port: ${d.port}`);
49
- console.log(`Dashboard: http://localhost:${d.port}/`);
50
- console.log(`Started: ${d.started}`);
51
- console.log(`Sessions: ${d.active_sessions.length}`);
52
- }
53
- index.close();
54
- }
55
- export {
56
- run
57
- };
58
- //# sourceMappingURL=stats-TTSDXGJV.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/stats.ts"],"sourcesContent":["import { MycoIndex } from '../index/sqlite.js';\nimport { gatherStats } from '../services/stats.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport function run(_args: string[], vaultDir: string): void {\n const index = new MycoIndex(path.join(vaultDir, 'index.db'));\n\n const stats = gatherStats(vaultDir, index);\n\n console.log('=== Myco Vault ===');\n console.log(`Path: ${stats.vault.path}`);\n console.log();\n console.log('--- Index ---');\n console.log(`Sessions: ${stats.vault.session_count}`);\n console.log(`Spores: ${Object.values(stats.vault.spore_counts).reduce((a, b) => a + b, 0)}`);\n console.log(`Plans: ${stats.vault.plan_count}`);\n\n if (Object.keys(stats.vault.spore_counts).length > 0) {\n console.log('\\n--- Spores by Type ---');\n for (const [t, c] of Object.entries(stats.vault.spore_counts).sort((a, b) => b[1] - a[1])) {\n console.log(` ${t}: ${c}`);\n }\n }\n\n const vecDb = path.join(vaultDir, 'vectors.db');\n if (fs.existsSync(vecDb)) {\n console.log(`\\n--- Vectors ---`);\n console.log(`Embeddings: ${stats.index.vector_count}`);\n } else {\n console.log('\\nVectors: not initialized');\n }\n\n if (stats.daemon) {\n const d = stats.daemon;\n console.log(`\\n--- Daemon ---`);\n console.log(`PID: ${d.pid} (${d.alive ? 'running' : 'dead'})`);\n console.log(`Port: ${d.port}`);\n console.log(`Dashboard: http://localhost:${d.port}/`);\n console.log(`Started: ${d.started}`);\n console.log(`Sessions: ${d.active_sessions.length}`);\n }\n\n index.close();\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAEA,OAAO,QAAQ;AACf,OAAO,UAAU;AAEV,SAAS,IAAI,OAAiB,UAAwB;AAC3D,QAAM,QAAQ,IAAI,UAAU,KAAK,KAAK,UAAU,UAAU,CAAC;AAE3D,QAAM,QAAQ,YAAY,UAAU,KAAK;AAEzC,UAAQ,IAAI,oBAAoB;AAChC,UAAQ,IAAI,SAAS,MAAM,MAAM,IAAI,EAAE;AACvC,UAAQ,IAAI;AACZ,UAAQ,IAAI,eAAe;AAC3B,UAAQ,IAAI,cAAc,MAAM,MAAM,aAAa,EAAE;AACrD,UAAQ,IAAI,cAAc,OAAO,OAAO,MAAM,MAAM,YAAY,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE;AAC9F,UAAQ,IAAI,cAAc,MAAM,MAAM,UAAU,EAAE;AAElD,MAAI,OAAO,KAAK,MAAM,MAAM,YAAY,EAAE,SAAS,GAAG;AACpD,YAAQ,IAAI,0BAA0B;AACtC,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,MAAM,MAAM,YAAY,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG;AACzF,cAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,QAAQ,KAAK,KAAK,UAAU,YAAY;AAC9C,MAAI,GAAG,WAAW,KAAK,GAAG;AACxB,YAAQ,IAAI;AAAA,gBAAmB;AAC/B,YAAQ,IAAI,eAAe,MAAM,MAAM,YAAY,EAAE;AAAA,EACvD,OAAO;AACL,YAAQ,IAAI,4BAA4B;AAAA,EAC1C;AAEA,MAAI,MAAM,QAAQ;AAChB,UAAM,IAAI,MAAM;AAChB,YAAQ,IAAI;AAAA,eAAkB;AAC9B,YAAQ,IAAI,aAAa,EAAE,GAAG,KAAK,EAAE,QAAQ,YAAY,MAAM,GAAG;AAClE,YAAQ,IAAI,aAAa,EAAE,IAAI,EAAE;AACjC,YAAQ,IAAI,+BAA+B,EAAE,IAAI,GAAG;AACpD,YAAQ,IAAI,aAAa,EAAE,OAAO,EAAE;AACpC,YAAQ,IAAI,aAAa,EAAE,gBAAgB,MAAM,EAAE;AAAA,EACrD;AAEA,QAAM,MAAM;AACd;","names":[]}
@@ -1,38 +0,0 @@
1
- import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
- import "./chunk-PZUWP5VK.js";
3
-
4
- // src/templates/index.ts
5
- import fs from "fs";
6
- import path from "path";
7
- import { fileURLToPath } from "url";
8
- function resolveTemplatesDir() {
9
- let dir = path.dirname(fileURLToPath(import.meta.url));
10
- for (let i = 0; i < 5; i++) {
11
- if (fs.existsSync(path.join(dir, "package.json"))) {
12
- return path.join(dir, "dist", "src", "templates");
13
- }
14
- if (fs.existsSync(path.join(dir, "portal.md"))) {
15
- return dir;
16
- }
17
- dir = path.dirname(dir);
18
- }
19
- return path.dirname(fileURLToPath(import.meta.url));
20
- }
21
- var TEMPLATES_DIR = resolveTemplatesDir();
22
- var templateCache = /* @__PURE__ */ new Map();
23
- function loadTemplate(name, vars = {}) {
24
- let raw = templateCache.get(name);
25
- if (!raw) {
26
- raw = fs.readFileSync(path.join(TEMPLATES_DIR, `${name}.md`), "utf-8");
27
- templateCache.set(name, raw);
28
- }
29
- let result = raw;
30
- for (const [key, value] of Object.entries(vars)) {
31
- result = result.replaceAll(`{{${key}}}`, value);
32
- }
33
- return result;
34
- }
35
- export {
36
- loadTemplate
37
- };
38
- //# sourceMappingURL=templates-XPRBOWCE.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/templates/index.ts"],"sourcesContent":["/**\n * Template loader — reads .md templates from disk and interpolates variables.\n * Templates are markdown files in this directory, shipped to dist/src/templates/.\n * Used for vault files that the daemon writes (e.g., _portal.md).\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n/**\n * Resolve the templates directory. Same strategy as prompts loader:\n * walk up from the current file to find package.json, then use dist/src/templates/.\n */\nfunction resolveTemplatesDir(): string {\n let dir = path.dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 5; i++) {\n if (fs.existsSync(path.join(dir, 'package.json'))) {\n return path.join(dir, 'dist', 'src', 'templates');\n }\n if (fs.existsSync(path.join(dir, 'portal.md'))) {\n return dir;\n }\n dir = path.dirname(dir);\n }\n return path.dirname(fileURLToPath(import.meta.url));\n}\n\nconst TEMPLATES_DIR = resolveTemplatesDir();\n\nconst templateCache = new Map<string, string>();\n\n/** Load a template by name (without .md extension) and interpolate {{variables}}. */\nexport function loadTemplate(name: string, vars: Record<string, string> = {}): string {\n let raw = templateCache.get(name);\n if (!raw) {\n raw = fs.readFileSync(path.join(TEMPLATES_DIR, `${name}.md`), 'utf-8');\n templateCache.set(name, raw);\n }\n\n let result = raw;\n for (const [key, value] of Object.entries(vars)) {\n result = result.replaceAll(`{{${key}}}`, value);\n }\n return result;\n}\n"],"mappings":";;;;AAMA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAM9B,SAAS,sBAA8B;AACrC,MAAI,MAAM,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AACrD,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,QAAI,GAAG,WAAW,KAAK,KAAK,KAAK,cAAc,CAAC,GAAG;AACjD,aAAO,KAAK,KAAK,KAAK,QAAQ,OAAO,WAAW;AAAA,IAClD;AACA,QAAI,GAAG,WAAW,KAAK,KAAK,KAAK,WAAW,CAAC,GAAG;AAC9C,aAAO;AAAA,IACT;AACA,UAAM,KAAK,QAAQ,GAAG;AAAA,EACxB;AACA,SAAO,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AACpD;AAEA,IAAM,gBAAgB,oBAAoB;AAE1C,IAAM,gBAAgB,oBAAI,IAAoB;AAGvC,SAAS,aAAa,MAAc,OAA+B,CAAC,GAAW;AACpF,MAAI,MAAM,cAAc,IAAI,IAAI;AAChC,MAAI,CAAC,KAAK;AACR,UAAM,GAAG,aAAa,KAAK,KAAK,eAAe,GAAG,IAAI,KAAK,GAAG,OAAO;AACrE,kBAAc,IAAI,MAAM,GAAG;AAAA,EAC7B;AAEA,MAAI,SAAS;AACb,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,IAAI,GAAG;AAC/C,aAAS,OAAO,WAAW,KAAK,GAAG,MAAM,KAAK;AAAA,EAChD;AACA,SAAO;AACT;","names":[]}
@@ -1 +0,0 @@
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, ui-monospace, monospace);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-ui, ui-monospace, 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{--background: 0 0% 100%;--foreground: 140 20% 6%;--card: 0 0% 98%;--card-foreground: 140 20% 6%;--primary: 142 71% 45%;--primary-foreground: 0 0% 100%;--secondary: 142 20% 94%;--secondary-foreground: 142 40% 15%;--muted: 140 10% 96%;--muted-foreground: 140 5% 40%;--accent: 142 50% 90%;--accent-foreground: 142 40% 15%;--destructive: 0 84% 60%;--border: 140 10% 90%;--input: 140 10% 90%;--ring: 142 71% 45%;--radius: .5rem}.dark{--background: 145 30% 4%;--foreground: 215 20% 90%;--card: 145 25% 7%;--card-foreground: 215 20% 90%;--primary: 142 71% 45%;--primary-foreground: 0 0% 100%;--secondary: 145 20% 12%;--secondary-foreground: 142 50% 75%;--muted: 145 15% 10%;--muted-foreground: 215 10% 60%;--accent: 145 25% 15%;--accent-foreground: 142 50% 75%;--destructive: 0 63% 50%;--border: 145 15% 15%;--input: 145 15% 15%;--ring: 142 71% 45%}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-family:var(--font-ui, "Geist Mono", "SF Mono", "Fira Code", monospace)}.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}.collapse{visibility:collapse}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.-right-2{right:-.5rem}.-top-2{top:-.5rem}.bottom-4{bottom:1rem}.left-1\/2,.left-\[50\%\]{left:50%}.right-2{right:.5rem}.right-4{right:1rem}.top-4{top:1rem}.top-\[50\%\]{top:50%}.z-50{z-index:50}.-mx-2{margin-left:-.5rem;margin-right:-.5rem}.mb-1{margin-bottom:.25rem}.mb-3{margin-bottom:.75rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.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}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.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-\[var\(--radix-select-trigger-height\)\]{height:var(--radix-select-trigger-height)}.h-full{height:100%}.h-screen{height:100vh}.max-h-64{max-height:16rem}.max-h-96{max-height:24rem}.max-h-\[400px\]{max-height:400px}.min-h-\[24px\]{min-height:24px}.w-0\.5{width:.125rem}.w-11{width:2.75rem}.w-14{width:3.5rem}.w-2{width:.5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-36{width:9rem}.w-4{width:1rem}.w-40{width:10rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[120px\]{width:120px}.w-\[54px\]{width:54px}.w-\[68px\]{width:68px}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[120px\]{min-width:120px}.min-w-\[80px\]{min-width:80px}.min-w-\[8rem\]{min-width:8rem}.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width)}.max-w-\[120px\]{max-width:120px}.max-w-lg{max-width:32rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.basis-full{flex-basis:100%}.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-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))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-x-6{-moz-column-gap:1.5rem;column-gap:1.5rem}.gap-y-1{row-gap:.25rem}.gap-y-3{row-gap:.75rem}.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-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-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}.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:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-none{border-style:none}.border-amber-400\/40{border-color:#fbbf2466}.border-amber-400\/50{border-color:#fbbf2480}.border-amber-500\/30{border-color:#f59e0b4d}.border-border{border-color:hsl(var(--border))}.border-border\/40{border-color:hsl(var(--border) / .4)}.border-destructive\/20{border-color:hsl(var(--destructive) / .2)}.border-destructive\/30{border-color:hsl(var(--destructive) / .3)}.border-destructive\/50{border-color:hsl(var(--destructive) / .5)}.border-emerald-500\/30{border-color:#10b9814d}.border-emerald-500\/50{border-color:#10b98180}.border-input{border-color:hsl(var(--input))}.border-primary{border-color:hsl(var(--primary))}.border-primary\/50{border-color:hsl(var(--primary) / .5)}.border-red-500\/40{border-color:#ef444466}.border-red-500\/50{border-color:#ef444480}.border-red-600\/30{border-color:#dc26264d}.border-transparent{border-color:transparent}.border-yellow-500\/50{border-color:#eab30880}.bg-amber-400{--tw-bg-opacity: 1;background-color:rgb(251 191 36 / var(--tw-bg-opacity, 1))}.bg-amber-400\/5{background-color:#fbbf240d}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-amber-500\/15{background-color:#f59e0b26}.bg-background{background-color:hsl(var(--background))}.bg-black\/80{background-color:#000c}.bg-card{background-color:hsl(var(--card))}.bg-card\/50{background-color:hsl(var(--card) / .5)}.bg-destructive{background-color:hsl(var(--destructive))}.bg-destructive\/5{background-color:hsl(var(--destructive) / .05)}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-emerald-500\/15{background-color:#10b98126}.bg-emerald-500\/5{background-color:#10b9810d}.bg-muted{background-color:hsl(var(--muted))}.bg-muted-foreground\/30{background-color:hsl(var(--muted-foreground) / .3)}.bg-muted-foreground\/40{background-color:hsl(var(--muted-foreground) / .4)}.bg-muted\/30{background-color:hsl(var(--muted) / .3)}.bg-primary{background-color:hsl(var(--primary))}.bg-primary\/10{background-color:hsl(var(--primary) / .1)}.bg-red-400{--tw-bg-opacity: 1;background-color:rgb(248 113 113 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-500\/10{background-color:#ef44441a}.bg-red-500\/15{background-color:#ef444426}.bg-red-500\/5{background-color:#ef44440d}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-red-600\/15{background-color:#dc262626}.bg-secondary{background-color:hsl(var(--secondary))}.bg-transparent{background-color:transparent}.bg-yellow-500\/10{background-color:#eab3081a}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.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-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-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-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pl-2{padding-left:.5rem}.pl-4{padding-left:1rem}.pl-8{padding-left:2rem}.pl-\[60px\]{padding-left:60px}.pr-3{padding-right:.75rem}.pr-4{padding-right:1rem}.pr-8{padding-right:2rem}.pt-0{padding-top:0}.pt-2{padding-top:.5rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.align-top{vertical-align:top}.font-mono{font-family:var(--font-ui, ui-monospace, monospace)}.text-\[10px\]{font-size:10px}.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-semibold{font-weight:600}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.leading-none{line-height:1}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.text-amber-500{--tw-text-opacity: 1;color:rgb(245 158 11 / var(--tw-text-opacity, 1))}.text-amber-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-card-foreground{color:hsl(var(--card-foreground))}.text-destructive{color:hsl(var(--destructive))}.text-destructive\/70{color:hsl(var(--destructive) / .7)}.text-destructive\/80{color:hsl(var(--destructive) / .8)}.text-emerald-500{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.text-emerald-600{--tw-text-opacity: 1;color:rgb(5 150 105 / var(--tw-text-opacity, 1))}.text-emerald-700{--tw-text-opacity: 1;color:rgb(4 120 87 / var(--tw-text-opacity, 1))}.text-foreground{color:hsl(var(--foreground))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-muted-foreground\/50{color:hsl(var(--muted-foreground) / .5)}.text-muted-foreground\/60{color:hsl(var(--muted-foreground) / .6)}.text-muted-foreground\/70{color:hsl(var(--muted-foreground) / .7)}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-600\/70{color:#dc2626b3}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-yellow-500{--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.text-yellow-600{--tw-text-opacity: 1;color:rgb(202 138 4 / var(--tw-text-opacity, 1))}.text-yellow-700{--tw-text-opacity: 1;color:rgb(161 98 7 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.decoration-dotted{text-decoration-style:dotted}.underline-offset-4{text-underline-offset:4px}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -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)}.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-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px 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)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.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-offset-background{--tw-ring-offset-color: hsl(var(--background))}.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)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;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-200{transition-duration:.2s}.duration-300{transition-duration:.3s}@font-face{font-family:Geist Mono;src:url(/fonts/GeistMono-Variable.woff2) format("woff2");font-weight:100 900;font-style:normal;font-display:swap}.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-foreground::file-selector-button{color:hsl(var(--foreground))}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.last\:border-b-0:last-child{border-bottom-width:0px}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-accent\/30:hover{background-color:hsl(var(--accent) / .3)}.hover\:bg-accent\/50:hover{background-color:hsl(var(--accent) / .5)}.hover\:bg-destructive\/10:hover{background-color:hsl(var(--destructive) / .1)}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-muted:hover{background-color:hsl(var(--muted))}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary) / .9)}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary) / .8)}.hover\:bg-yellow-500\/10:hover{background-color:#eab3081a}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-foreground:hover{color:hsl(var(--foreground))}.hover\:text-muted-foreground:hover{color:hsl(var(--muted-foreground))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:opacity-80:hover{opacity:.8}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:text-accent-foreground:focus{color:hsl(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: hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.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-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width: 2px}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-default:disabled{cursor:default}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-70:disabled{opacity:.7}.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-accent[data-state=on],.data-\[state\=open\]\:bg-accent[data-state=open]{background-color:hsl(var(--accent))}.data-\[state\=on\]\:text-accent-foreground[data-state=on]{color:hsl(var(--accent-foreground))}.data-\[state\=open\]\:text-muted-foreground[data-state=open]{color:hsl(var(--muted-foreground))}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.dark\:text-amber-400:is(.dark *){--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.dark\:text-emerald-400:is(.dark *){--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.dark\:text-red-400:is(.dark *){--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.dark\:text-red-400\/70:is(.dark *){color:#f87171b3}.dark\:text-yellow-400:is(.dark *){--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}@media(min-width:640px){.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\: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:var(--radius)}.sm\:text-left{text-align:left}}@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))}}.\[\&\>span\]\:line-clamp-1>span{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}