@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,56 +0,0 @@
1
- import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
- import {
3
- AgentRegistry
4
- } from "./chunk-Z74SDEKE.js";
5
-
6
- // src/native-deps.ts
7
- import { execFileSync } from "child_process";
8
- import { createRequire } from "module";
9
- import path from "path";
10
- import fs from "fs";
11
- var NATIVE_PACKAGES = ["better-sqlite3", "sqlite-vec"];
12
- function findPluginRoot() {
13
- const fromRegistry = new AgentRegistry().resolvePluginRoot();
14
- if (fromRegistry) return fromRegistry;
15
- let dir = path.dirname(new URL(import.meta.url).pathname);
16
- for (let i = 0; i < 5; i++) {
17
- if (fs.existsSync(path.join(dir, "package.json"))) return dir;
18
- dir = path.dirname(dir);
19
- }
20
- return process.cwd();
21
- }
22
- function ensureNativeDeps() {
23
- const pluginRoot = findPluginRoot();
24
- const require2 = createRequire(path.join(pluginRoot, "node_modules", ".package.json"));
25
- const missing = [];
26
- for (const pkg of NATIVE_PACKAGES) {
27
- try {
28
- require2.resolve(pkg);
29
- } catch {
30
- missing.push(pkg);
31
- }
32
- }
33
- if (missing.length === 0) return;
34
- const nodeModulesDir = path.join(pluginRoot, "node_modules");
35
- if (!fs.existsSync(nodeModulesDir)) {
36
- fs.mkdirSync(nodeModulesDir, { recursive: true });
37
- }
38
- try {
39
- execFileSync("npm", ["install", "--no-save", "--no-package-lock", ...missing], {
40
- cwd: pluginRoot,
41
- stdio: "pipe",
42
- timeout: 12e4
43
- });
44
- } catch (error) {
45
- const msg = error.message;
46
- process.stderr.write(`[myco] Failed to install native dependencies: ${msg}
47
- `);
48
- process.stderr.write(`[myco] You can install them manually: cd ${pluginRoot} && npm install ${missing.join(" ")}
49
- `);
50
- }
51
- }
52
-
53
- export {
54
- ensureNativeDeps
55
- };
56
- //# sourceMappingURL=chunk-FPRXMJLT.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/native-deps.ts"],"sourcesContent":["/**\n * Ensures native npm dependencies (better-sqlite3, sqlite-vec) are available.\n *\n * When the plugin is installed from a marketplace, only the bundled\n * JS files are present in the cache directory — node_modules is stripped.\n * Native modules cannot be bundled by tsup/esbuild, so we install them on\n * first use into the plugin's cache directory.\n */\nimport { execFileSync } from 'node:child_process';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport { AgentRegistry } from './agents/registry.js';\n\nconst NATIVE_PACKAGES = ['better-sqlite3', 'sqlite-vec'] as const;\n\n/**\n * Detect the plugin root via the active agent's env var (CLAUDE_PLUGIN_ROOT,\n * CURSOR_PLUGIN_ROOT, etc.), falling back to walking up from this file.\n */\nfunction findPluginRoot(): string {\n const fromRegistry = new AgentRegistry().resolvePluginRoot();\n if (fromRegistry) return fromRegistry;\n\n // Fallback: walk up from dist/src/ to find package.json\n let dir = path.dirname(new URL(import.meta.url).pathname);\n for (let i = 0; i < 5; i++) {\n if (fs.existsSync(path.join(dir, 'package.json'))) return dir;\n dir = path.dirname(dir);\n }\n return process.cwd();\n}\n\nexport function ensureNativeDeps(): void {\n const pluginRoot = findPluginRoot();\n const require = createRequire(path.join(pluginRoot, 'node_modules', '.package.json'));\n\n const missing: string[] = [];\n for (const pkg of NATIVE_PACKAGES) {\n try {\n require.resolve(pkg);\n } catch {\n missing.push(pkg);\n }\n }\n\n if (missing.length === 0) return;\n\n const nodeModulesDir = path.join(pluginRoot, 'node_modules');\n if (!fs.existsSync(nodeModulesDir)) {\n fs.mkdirSync(nodeModulesDir, { recursive: true });\n }\n\n try {\n execFileSync('npm', ['install', '--no-save', '--no-package-lock', ...missing], {\n cwd: pluginRoot,\n stdio: 'pipe',\n timeout: 120_000,\n });\n } catch (error) {\n const msg = (error as Error).message;\n process.stderr.write(`[myco] Failed to install native dependencies: ${msg}\\n`);\n process.stderr.write(`[myco] You can install them manually: cd ${pluginRoot} && npm install ${missing.join(' ')}\\n`);\n }\n}\n"],"mappings":";;;;;;AAQA,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAC9B,OAAO,UAAU;AACjB,OAAO,QAAQ;AAGf,IAAM,kBAAkB,CAAC,kBAAkB,YAAY;AAMvD,SAAS,iBAAyB;AAChC,QAAM,eAAe,IAAI,cAAc,EAAE,kBAAkB;AAC3D,MAAI,aAAc,QAAO;AAGzB,MAAI,MAAM,KAAK,QAAQ,IAAI,IAAI,YAAY,GAAG,EAAE,QAAQ;AACxD,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,QAAI,GAAG,WAAW,KAAK,KAAK,KAAK,cAAc,CAAC,EAAG,QAAO;AAC1D,UAAM,KAAK,QAAQ,GAAG;AAAA,EACxB;AACA,SAAO,QAAQ,IAAI;AACrB;AAEO,SAAS,mBAAyB;AACvC,QAAM,aAAa,eAAe;AAClC,QAAMA,WAAU,cAAc,KAAK,KAAK,YAAY,gBAAgB,eAAe,CAAC;AAEpF,QAAM,UAAoB,CAAC;AAC3B,aAAW,OAAO,iBAAiB;AACjC,QAAI;AACF,MAAAA,SAAQ,QAAQ,GAAG;AAAA,IACrB,QAAQ;AACN,cAAQ,KAAK,GAAG;AAAA,IAClB;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,EAAG;AAE1B,QAAM,iBAAiB,KAAK,KAAK,YAAY,cAAc;AAC3D,MAAI,CAAC,GAAG,WAAW,cAAc,GAAG;AAClC,OAAG,UAAU,gBAAgB,EAAE,WAAW,KAAK,CAAC;AAAA,EAClD;AAEA,MAAI;AACF,iBAAa,OAAO,CAAC,WAAW,aAAa,qBAAqB,GAAG,OAAO,GAAG;AAAA,MAC7E,KAAK;AAAA,MACL,OAAO;AAAA,MACP,SAAS;AAAA,IACX,CAAC;AAAA,EACH,SAAS,OAAO;AACd,UAAM,MAAO,MAAgB;AAC7B,YAAQ,OAAO,MAAM,iDAAiD,GAAG;AAAA,CAAI;AAC7E,YAAQ,OAAO,MAAM,4CAA4C,UAAU,mBAAmB,QAAQ,KAAK,GAAG,CAAC;AAAA,CAAI;AAAA,EACrH;AACF;","names":["require"]}
@@ -1,37 +0,0 @@
1
- import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
- import {
3
- require_dist
4
- } from "./chunk-ERG2IEWX.js";
5
- import {
6
- __toESM
7
- } from "./chunk-PZUWP5VK.js";
8
-
9
- // src/vault/frontmatter.ts
10
- var import_yaml = __toESM(require_dist(), 1);
11
- function stripFrontmatter(raw) {
12
- const match = raw.match(/^---\n([\s\S]*?)\n---\n*/);
13
- if (!match) return { body: raw.trim(), frontmatter: {} };
14
- let frontmatter = {};
15
- try {
16
- frontmatter = import_yaml.default.parse(match[1]);
17
- } catch {
18
- }
19
- return { body: raw.slice(match[0].length).trim(), frontmatter };
20
- }
21
- function planFm(note) {
22
- return note.frontmatter;
23
- }
24
- function sessionFm(note) {
25
- return note.frontmatter;
26
- }
27
- function sporeFm(note) {
28
- return note.frontmatter;
29
- }
30
-
31
- export {
32
- stripFrontmatter,
33
- planFm,
34
- sessionFm,
35
- sporeFm
36
- };
37
- //# sourceMappingURL=chunk-GENQ5QGP.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/vault/frontmatter.ts"],"sourcesContent":["import YAML from 'yaml';\nimport type { IndexedNote } from '../index/sqlite.js';\nimport type { PlanFrontmatter, SessionFrontmatter, SporeFrontmatter } from './types.js';\n\n/** Strip YAML frontmatter from a markdown string, returning the body and parsed frontmatter. */\nexport function stripFrontmatter(raw: string): { body: string; frontmatter: Record<string, unknown> } {\n const match = raw.match(/^---\\n([\\s\\S]*?)\\n---\\n*/);\n if (!match) return { body: raw.trim(), frontmatter: {} };\n\n let frontmatter: Record<string, unknown> = {};\n try {\n frontmatter = YAML.parse(match[1]) as Record<string, unknown>;\n } catch { /* malformed frontmatter */ }\n\n return { body: raw.slice(match[0].length).trim(), frontmatter };\n}\n\nexport function planFm(note: IndexedNote): PlanFrontmatter {\n return note.frontmatter as unknown as PlanFrontmatter;\n}\n\nexport function sessionFm(note: IndexedNote): SessionFrontmatter {\n return note.frontmatter as unknown as SessionFrontmatter;\n}\n\nexport function sporeFm(note: IndexedNote): SporeFrontmatter {\n return note.frontmatter as unknown as SporeFrontmatter;\n}\n"],"mappings":";;;;;;;;;AAAA,kBAAiB;AAKV,SAAS,iBAAiB,KAAqE;AACpG,QAAM,QAAQ,IAAI,MAAM,0BAA0B;AAClD,MAAI,CAAC,MAAO,QAAO,EAAE,MAAM,IAAI,KAAK,GAAG,aAAa,CAAC,EAAE;AAEvD,MAAI,cAAuC,CAAC;AAC5C,MAAI;AACF,kBAAc,YAAAA,QAAK,MAAM,MAAM,CAAC,CAAC;AAAA,EACnC,QAAQ;AAAA,EAA8B;AAEtC,SAAO,EAAE,MAAM,IAAI,MAAM,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,GAAG,YAAY;AAChE;AAEO,SAAS,OAAO,MAAoC;AACzD,SAAO,KAAK;AACd;AAEO,SAAS,UAAU,MAAuC;AAC/D,SAAO,KAAK;AACd;AAEO,SAAS,QAAQ,MAAqC;AAC3D,SAAO,KAAK;AACd;","names":["YAML"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/logs/reader.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport type { LogEntry } from '../daemon/logger.js';\nimport { LEVEL_ORDER } from '../daemon/logger.js';\nimport type { LogLevel } from '../daemon/logger.js';\n\nexport { LEVEL_ORDER };\nexport type { LogEntry, LogLevel };\n\nexport interface LogQuery {\n limit?: number;\n level?: LogLevel;\n component?: string;\n since?: string;\n until?: string;\n}\n\nexport interface LogQueryResult {\n entries: LogEntry[];\n total: number;\n truncated: boolean;\n}\n\n/** Default number of entries returned when no limit is specified. */\nexport const DEFAULT_LOG_TAIL = 50;\n\n/** Hard ceiling on entries returned to prevent memory issues. */\nconst MAX_LOG_QUERY_LIMIT = 10_000;\n\n/** Matches daemon.log, rotated daemon.N.log, and mcp.jsonl. */\nconst DAEMON_LOG_PATTERN = /^daemon(?:\\.(\\d+))?\\.log$/;\nconst MCP_LOG_FILE = 'mcp.jsonl';\n\n/**\n * Query parsed log entries from all JSONL log files on disk.\n * Reads both daemon logs and MCP activity logs.\n * Returns the last N matching entries (tail behavior).\n */\nexport function queryLogs(logDir: string, query: LogQuery = {}): LogQueryResult {\n const limit = Math.min(query.limit ?? DEFAULT_LOG_TAIL, MAX_LOG_QUERY_LIMIT);\n\n const logFiles = discoverLogFiles(logDir);\n if (logFiles.length === 0) {\n return { entries: [], total: 0, truncated: false };\n }\n const allEntries = readAndParse(logFiles);\n\n // Sort all entries by timestamp so daemon + MCP logs interleave correctly\n allEntries.sort((a, b) => (a.timestamp ?? '').localeCompare(b.timestamp ?? ''));\n\n const filtered = applyFilters(allEntries, query);\n\n const total = filtered.length;\n const truncated = total > limit;\n const entries = truncated ? filtered.slice(total - limit) : filtered;\n\n return { entries, total, truncated };\n}\n\n/** Discover and sort log files: MCP first, then rotated daemon logs oldest-first, current daemon last. */\nfunction discoverLogFiles(logDir: string): string[] {\n let files: string[];\n try {\n files = fs.readdirSync(logDir);\n } catch {\n return [];\n }\n\n const matched: Array<{ path: string; order: number }> = [];\n for (const file of files) {\n if (file === MCP_LOG_FILE) {\n matched.push({ path: path.join(logDir, file), order: -1 });\n continue;\n }\n const m = DAEMON_LOG_PATTERN.exec(file);\n if (!m) continue;\n const rotationNum = m[1] ? parseInt(m[1], 10) : 0;\n matched.push({ path: path.join(logDir, file), order: rotationNum });\n }\n\n matched.sort((a, b) => {\n if (a.order === 0) return 1;\n if (b.order === 0) return -1;\n return b.order - a.order;\n });\n\n return matched.map((m) => m.path);\n}\n\n/** Read all log files and parse each line as JSON. Malformed lines are skipped. */\nfunction readAndParse(filePaths: string[]): LogEntry[] {\n const entries: LogEntry[] = [];\n for (const filePath of filePaths) {\n let content: string;\n try {\n content = fs.readFileSync(filePath, 'utf-8');\n } catch {\n continue;\n }\n for (const line of content.split('\\n')) {\n if (!line.trim()) continue;\n try {\n entries.push(JSON.parse(line) as LogEntry);\n } catch {\n // Malformed line — skip\n }\n }\n }\n return entries;\n}\n\n/** Test whether a single entry matches the query filters. */\nexport function matchesFilter(entry: LogEntry, query: LogQuery): boolean {\n if (query.level) {\n const entryOrder = LEVEL_ORDER[entry.level as LogLevel] ?? 0;\n const minOrder = LEVEL_ORDER[query.level];\n if (entryOrder < minOrder) return false;\n }\n if (query.component && entry.component !== query.component) return false;\n if (query.since && entry.timestamp < query.since) return false;\n if (query.until && entry.timestamp > query.until) return false;\n return true;\n}\n\n/** Apply level, component, and time range filters. */\nfunction applyFilters(entries: LogEntry[], query: LogQuery): LogEntry[] {\n return entries.filter((entry) => matchesFilter(entry, query));\n}\n"],"mappings":";;;;;;AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AAuBV,IAAM,mBAAmB;AAGhC,IAAM,sBAAsB;AAG5B,IAAM,qBAAqB;AAC3B,IAAM,eAAe;AAOd,SAAS,UAAU,QAAgB,QAAkB,CAAC,GAAmB;AAC9E,QAAM,QAAQ,KAAK,IAAI,MAAM,SAAS,kBAAkB,mBAAmB;AAE3E,QAAM,WAAW,iBAAiB,MAAM;AACxC,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,EAAE,SAAS,CAAC,GAAG,OAAO,GAAG,WAAW,MAAM;AAAA,EACnD;AACA,QAAM,aAAa,aAAa,QAAQ;AAGxC,aAAW,KAAK,CAAC,GAAG,OAAO,EAAE,aAAa,IAAI,cAAc,EAAE,aAAa,EAAE,CAAC;AAE9E,QAAM,WAAW,aAAa,YAAY,KAAK;AAE/C,QAAM,QAAQ,SAAS;AACvB,QAAM,YAAY,QAAQ;AAC1B,QAAM,UAAU,YAAY,SAAS,MAAM,QAAQ,KAAK,IAAI;AAE5D,SAAO,EAAE,SAAS,OAAO,UAAU;AACrC;AAGA,SAAS,iBAAiB,QAA0B;AAClD,MAAI;AACJ,MAAI;AACF,YAAQ,GAAG,YAAY,MAAM;AAAA,EAC/B,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,UAAkD,CAAC;AACzD,aAAW,QAAQ,OAAO;AACxB,QAAI,SAAS,cAAc;AACzB,cAAQ,KAAK,EAAE,MAAM,KAAK,KAAK,QAAQ,IAAI,GAAG,OAAO,GAAG,CAAC;AACzD;AAAA,IACF;AACA,UAAM,IAAI,mBAAmB,KAAK,IAAI;AACtC,QAAI,CAAC,EAAG;AACR,UAAM,cAAc,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC,GAAG,EAAE,IAAI;AAChD,YAAQ,KAAK,EAAE,MAAM,KAAK,KAAK,QAAQ,IAAI,GAAG,OAAO,YAAY,CAAC;AAAA,EACpE;AAEA,UAAQ,KAAK,CAAC,GAAG,MAAM;AACrB,QAAI,EAAE,UAAU,EAAG,QAAO;AAC1B,QAAI,EAAE,UAAU,EAAG,QAAO;AAC1B,WAAO,EAAE,QAAQ,EAAE;AAAA,EACrB,CAAC;AAED,SAAO,QAAQ,IAAI,CAAC,MAAM,EAAE,IAAI;AAClC;AAGA,SAAS,aAAa,WAAiC;AACrD,QAAM,UAAsB,CAAC;AAC7B,aAAW,YAAY,WAAW;AAChC,QAAI;AACJ,QAAI;AACF,gBAAU,GAAG,aAAa,UAAU,OAAO;AAAA,IAC7C,QAAQ;AACN;AAAA,IACF;AACA,eAAW,QAAQ,QAAQ,MAAM,IAAI,GAAG;AACtC,UAAI,CAAC,KAAK,KAAK,EAAG;AAClB,UAAI;AACF,gBAAQ,KAAK,KAAK,MAAM,IAAI,CAAa;AAAA,MAC3C,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,cAAc,OAAiB,OAA0B;AACvE,MAAI,MAAM,OAAO;AACf,UAAM,aAAa,YAAY,MAAM,KAAiB,KAAK;AAC3D,UAAM,WAAW,YAAY,MAAM,KAAK;AACxC,QAAI,aAAa,SAAU,QAAO;AAAA,EACpC;AACA,MAAI,MAAM,aAAa,MAAM,cAAc,MAAM,UAAW,QAAO;AACnE,MAAI,MAAM,SAAS,MAAM,YAAY,MAAM,MAAO,QAAO;AACzD,MAAI,MAAM,SAAS,MAAM,YAAY,MAAM,MAAO,QAAO;AACzD,SAAO;AACT;AAGA,SAAS,aAAa,SAAqB,OAA6B;AACtE,SAAO,QAAQ,OAAO,CAAC,UAAU,cAAc,OAAO,KAAK,CAAC;AAC9D;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/capture/buffer.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\n\ninterface BufferOptions {\n maxEvents?: number;\n}\n\nexport class EventBuffer {\n private filePath: string;\n private maxEvents: number;\n private eventCount = 0;\n\n constructor(\n private bufferDir: string,\n private sessionId: string,\n options: BufferOptions = {},\n ) {\n this.filePath = path.join(bufferDir, `${sessionId}.jsonl`);\n this.maxEvents = options.maxEvents ?? 500;\n\n if (fs.existsSync(this.filePath)) {\n const content = fs.readFileSync(this.filePath, 'utf-8').trim();\n this.eventCount = content ? content.split('\\n').length : 0;\n }\n }\n\n append(event: Record<string, unknown>): void {\n fs.mkdirSync(this.bufferDir, { recursive: true });\n\n const line = JSON.stringify({\n ...event,\n timestamp: event.timestamp ?? new Date().toISOString(),\n });\n\n fs.appendFileSync(this.filePath, line + '\\n');\n this.eventCount++;\n }\n\n readAll(): Array<Record<string, unknown>> {\n if (!fs.existsSync(this.filePath)) return [];\n const content = fs.readFileSync(this.filePath, 'utf-8').trim();\n if (!content) return [];\n return content.split('\\n').map((line) => JSON.parse(line));\n }\n\n count(): number {\n return this.eventCount;\n }\n\n exists(): boolean {\n return fs.existsSync(this.filePath);\n }\n\n delete(): void {\n if (fs.existsSync(this.filePath)) {\n fs.unlinkSync(this.filePath);\n }\n this.eventCount = 0;\n }\n\n isOverflow(): boolean {\n return this.eventCount > this.maxEvents;\n }\n\n getFilePath(): string {\n return this.filePath;\n }\n}\n\n/**\n * Find the most recently active session by buffer file mtime.\n * The UserPromptSubmit hook appends to the session's buffer on every prompt,\n * so the most recently modified buffer is the calling session.\n */\nexport function resolveSessionFromBuffer(bufferDir: string): string | undefined {\n try {\n let bestSession: string | undefined;\n let bestMtime = 0;\n for (const file of fs.readdirSync(bufferDir)) {\n if (!file.endsWith('.jsonl')) continue;\n const mtime = fs.statSync(path.join(bufferDir, file)).mtimeMs;\n if (mtime > bestMtime) {\n bestMtime = mtime;\n bestSession = file.replace('.jsonl', '');\n }\n }\n return bestSession;\n } catch {\n return undefined;\n }\n}\n"],"mappings":";;;AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;AAMV,IAAM,cAAN,MAAkB;AAAA,EAKvB,YACU,WACA,WACR,UAAyB,CAAC,GAC1B;AAHQ;AACA;AAGR,SAAK,WAAW,KAAK,KAAK,WAAW,GAAG,SAAS,QAAQ;AACzD,SAAK,YAAY,QAAQ,aAAa;AAEtC,QAAI,GAAG,WAAW,KAAK,QAAQ,GAAG;AAChC,YAAM,UAAU,GAAG,aAAa,KAAK,UAAU,OAAO,EAAE,KAAK;AAC7D,WAAK,aAAa,UAAU,QAAQ,MAAM,IAAI,EAAE,SAAS;AAAA,IAC3D;AAAA,EACF;AAAA,EAhBQ;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EAgBrB,OAAO,OAAsC;AAC3C,OAAG,UAAU,KAAK,WAAW,EAAE,WAAW,KAAK,CAAC;AAEhD,UAAM,OAAO,KAAK,UAAU;AAAA,MAC1B,GAAG;AAAA,MACH,WAAW,MAAM,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACvD,CAAC;AAED,OAAG,eAAe,KAAK,UAAU,OAAO,IAAI;AAC5C,SAAK;AAAA,EACP;AAAA,EAEA,UAA0C;AACxC,QAAI,CAAC,GAAG,WAAW,KAAK,QAAQ,EAAG,QAAO,CAAC;AAC3C,UAAM,UAAU,GAAG,aAAa,KAAK,UAAU,OAAO,EAAE,KAAK;AAC7D,QAAI,CAAC,QAAS,QAAO,CAAC;AACtB,WAAO,QAAQ,MAAM,IAAI,EAAE,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAAC;AAAA,EAC3D;AAAA,EAEA,QAAgB;AACd,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,SAAkB;AAChB,WAAO,GAAG,WAAW,KAAK,QAAQ;AAAA,EACpC;AAAA,EAEA,SAAe;AACb,QAAI,GAAG,WAAW,KAAK,QAAQ,GAAG;AAChC,SAAG,WAAW,KAAK,QAAQ;AAAA,IAC7B;AACA,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,aAAsB;AACpB,WAAO,KAAK,aAAa,KAAK;AAAA,EAChC;AAAA,EAEA,cAAsB;AACpB,WAAO,KAAK;AAAA,EACd;AACF;AAOO,SAAS,yBAAyB,WAAuC;AAC9E,MAAI;AACF,QAAI;AACJ,QAAI,YAAY;AAChB,eAAW,QAAQ,GAAG,YAAY,SAAS,GAAG;AAC5C,UAAI,CAAC,KAAK,SAAS,QAAQ,EAAG;AAC9B,YAAM,QAAQ,GAAG,SAAS,KAAK,KAAK,WAAW,IAAI,CAAC,EAAE;AACtD,UAAI,QAAQ,WAAW;AACrB,oBAAY;AACZ,sBAAc,KAAK,QAAQ,UAAU,EAAE;AAAA,MACzC;AAAA,IACF;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -1,159 +0,0 @@
1
- import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
- import {
3
- MycoConfigSchema,
4
- require_dist
5
- } from "./chunk-ERG2IEWX.js";
6
- import {
7
- __toESM
8
- } from "./chunk-PZUWP5VK.js";
9
-
10
- // src/config/loader.ts
11
- var import_yaml = __toESM(require_dist(), 1);
12
- import fs2 from "fs";
13
- import path2 from "path";
14
-
15
- // src/config/migrations.ts
16
- import fs from "fs";
17
- import path from "path";
18
- var MEMORY_TYPE_PATTERN = /type:\s*["']?memory["']?/g;
19
- var MIGRATIONS = [
20
- {
21
- version: 1,
22
- name: "rename-memories-to-spores",
23
- migrate: (doc, vaultDir) => {
24
- const context = doc.context;
25
- const layers = context?.layers;
26
- if (layers && "memories" in layers && !("spores" in layers)) {
27
- layers.spores = layers.memories;
28
- delete layers.memories;
29
- }
30
- const memoriesDir = path.join(vaultDir, "memories");
31
- const sporesDir = path.join(vaultDir, "spores");
32
- if (!fs.existsSync(memoriesDir)) return;
33
- if (fs.existsSync(sporesDir)) {
34
- const moveRemaining = (srcDir, destDir) => {
35
- for (const entry of fs.readdirSync(srcDir, { withFileTypes: true })) {
36
- const srcPath = path.join(srcDir, entry.name);
37
- const destPath = path.join(destDir, entry.name);
38
- if (entry.isDirectory()) {
39
- if (!fs.existsSync(destPath)) fs.mkdirSync(destPath, { recursive: true });
40
- moveRemaining(srcPath, destPath);
41
- } else if (!fs.existsSync(destPath)) {
42
- fs.renameSync(srcPath, destPath);
43
- }
44
- }
45
- };
46
- moveRemaining(memoriesDir, sporesDir);
47
- fs.rmSync(memoriesDir, { recursive: true, force: true });
48
- } else {
49
- fs.renameSync(memoriesDir, sporesDir);
50
- }
51
- const walkUpdate = (dir) => {
52
- for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
53
- const fullPath = path.join(dir, entry.name);
54
- if (entry.isDirectory()) {
55
- walkUpdate(fullPath);
56
- continue;
57
- }
58
- if (!entry.name.endsWith(".md")) continue;
59
- const content = fs.readFileSync(fullPath, "utf-8");
60
- MEMORY_TYPE_PATTERN.lastIndex = 0;
61
- if (MEMORY_TYPE_PATTERN.test(content)) {
62
- MEMORY_TYPE_PATTERN.lastIndex = 0;
63
- fs.writeFileSync(fullPath, content.replace(MEMORY_TYPE_PATTERN, "type: spore"));
64
- }
65
- }
66
- };
67
- walkUpdate(sporesDir);
68
- const walkLinks = (dir) => {
69
- for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
70
- const fullPath = path.join(dir, entry.name);
71
- if (entry.isDirectory()) {
72
- walkLinks(fullPath);
73
- continue;
74
- }
75
- if (!entry.name.endsWith(".md")) continue;
76
- const content = fs.readFileSync(fullPath, "utf-8");
77
- if (content.includes("memories/")) {
78
- fs.writeFileSync(fullPath, content.replace(/memories\//g, "spores/"));
79
- }
80
- }
81
- };
82
- walkLinks(vaultDir);
83
- }
84
- },
85
- {
86
- version: 2,
87
- name: "consolidation-boolean-to-object",
88
- migrate: (doc) => {
89
- const digest = doc.digest;
90
- if (!digest) return;
91
- const consolidation = digest.consolidation;
92
- if (typeof consolidation === "boolean") {
93
- digest.consolidation = { enabled: consolidation, max_tokens: 2048 };
94
- }
95
- }
96
- }
97
- ];
98
- var CURRENT_MIGRATION_VERSION = MIGRATIONS[MIGRATIONS.length - 1]?.version ?? 0;
99
- function runMigrations(doc, vaultDir, log) {
100
- const currentVersion = doc.config_version ?? 0;
101
- let ran = false;
102
- for (const migration of MIGRATIONS) {
103
- if (migration.version <= currentVersion) continue;
104
- migration.migrate(doc, vaultDir);
105
- doc.config_version = migration.version;
106
- ran = true;
107
- }
108
- if (ran) {
109
- const from = currentVersion;
110
- const to = doc.config_version ?? 0;
111
- log?.(`Migrated config from v${from} to v${to}`);
112
- }
113
- return ran;
114
- }
115
-
116
- // src/config/loader.ts
117
- var CONFIG_FILENAME = "myco.yaml";
118
- function loadConfig(vaultDir) {
119
- const configPath = path2.join(vaultDir, CONFIG_FILENAME);
120
- if (!fs2.existsSync(configPath)) {
121
- throw new Error(`myco.yaml not found in ${vaultDir}`);
122
- }
123
- const raw = fs2.readFileSync(configPath, "utf-8");
124
- const parsed = import_yaml.default.parse(raw);
125
- if (parsed.version === 1 || parsed.intelligence?.backend) {
126
- throw new Error(
127
- "Myco config uses v1 format. Run /myco:setup-llm to reconfigure for v2."
128
- );
129
- }
130
- const intel = parsed.intelligence;
131
- const llm = intel?.llm;
132
- if (llm?.provider === "haiku") {
133
- llm.provider = "anthropic";
134
- }
135
- const migrationsRan = runMigrations(parsed, vaultDir, (msg) => {
136
- process.stderr.write(`[myco migration] ${msg}
137
- `);
138
- });
139
- const config = MycoConfigSchema.parse(parsed);
140
- const needsWrite = migrationsRan || (parsed.config_version ?? 0) < CURRENT_MIGRATION_VERSION || !("digest" in parsed);
141
- if (needsWrite) {
142
- const fullConfig = JSON.parse(JSON.stringify(config));
143
- fs2.writeFileSync(configPath, import_yaml.default.stringify(fullConfig), "utf-8");
144
- }
145
- return config;
146
- }
147
- function saveConfig(vaultDir, config) {
148
- const validated = MycoConfigSchema.parse(config);
149
- const configPath = path2.join(vaultDir, CONFIG_FILENAME);
150
- fs2.mkdirSync(vaultDir, { recursive: true });
151
- fs2.writeFileSync(configPath, import_yaml.default.stringify(validated), "utf-8");
152
- }
153
-
154
- export {
155
- CONFIG_FILENAME,
156
- loadConfig,
157
- saveConfig
158
- };
159
- //# sourceMappingURL=chunk-HYVT345Y.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/config/loader.ts","../src/config/migrations.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport YAML from 'yaml';\nimport { MycoConfigSchema, type MycoConfig } from './schema.js';\nimport { runMigrations, CURRENT_MIGRATION_VERSION } from './migrations.js';\n\nexport const CONFIG_FILENAME = 'myco.yaml';\n\nexport function loadConfig(vaultDir: string): MycoConfig {\n const configPath = path.join(vaultDir, CONFIG_FILENAME);\n\n if (!fs.existsSync(configPath)) {\n throw new Error(`myco.yaml not found in ${vaultDir}`);\n }\n\n const raw = fs.readFileSync(configPath, 'utf-8');\n const parsed = YAML.parse(raw) as Record<string, unknown>;\n\n // Detect v1 config and guide migration\n if (parsed.version === 1 || (parsed.intelligence as Record<string, unknown>)?.backend) {\n throw new Error(\n 'Myco config uses v1 format. Run /myco:setup-llm to reconfigure for v2.',\n );\n }\n\n // Auto-map legacy 'haiku' provider name to 'anthropic'\n const intel = parsed.intelligence as Record<string, unknown> | undefined;\n const llm = intel?.llm as Record<string, unknown> | undefined;\n if (llm?.provider === 'haiku') {\n llm.provider = 'anthropic';\n }\n\n // Run numbered migrations\n const migrationsRan = runMigrations(parsed, vaultDir, (msg) => {\n // Log to stderr since this runs during config loading (before logger is available)\n process.stderr.write(`[myco migration] ${msg}\\n`);\n });\n\n // Parse with Zod to fill in defaults for new config sections\n const config = MycoConfigSchema.parse(parsed);\n\n // Write back if migrations ran or new defaults were added\n const needsWrite = migrationsRan\n || (parsed.config_version as number ?? 0) < CURRENT_MIGRATION_VERSION\n || !('digest' in parsed);\n\n if (needsWrite) {\n const fullConfig = JSON.parse(JSON.stringify(config)) as Record<string, unknown>;\n fs.writeFileSync(configPath, YAML.stringify(fullConfig), 'utf-8');\n }\n\n return config;\n}\n\nexport function saveConfig(vaultDir: string, config: MycoConfig): void {\n // Validate before writing — OAK lesson: validate on write, not just read\n const validated = MycoConfigSchema.parse(config);\n\n const configPath = path.join(vaultDir, CONFIG_FILENAME);\n fs.mkdirSync(vaultDir, { recursive: true });\n fs.writeFileSync(configPath, YAML.stringify(validated), 'utf-8');\n}\n","/**\n * Config and vault migrations — run once per version, tracked by config_version.\n *\n * Each migration has a version number, a name, and a function that receives\n * the raw parsed YAML doc and the vault directory. Migrations run in order\n * and are skipped if config_version is already past them.\n *\n * To add a new migration:\n * 1. Add an entry to MIGRATIONS with the next version number\n * 2. Write the migrate function — it receives the mutable doc and vaultDir\n * 3. The framework handles version tracking and writing the config back\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport interface Migration {\n version: number;\n name: string;\n migrate: (doc: Record<string, unknown>, vaultDir: string) => void;\n}\n\n/** Regex matching both quoted and unquoted YAML: type: memory, type: \"memory\", type: 'memory' */\nconst MEMORY_TYPE_PATTERN = /type:\\s*[\"']?memory[\"']?/g;\n\nexport const MIGRATIONS: Migration[] = [\n {\n version: 1,\n name: 'rename-memories-to-spores',\n migrate: (doc, vaultDir) => {\n // Config: rename context.layers.memories → context.layers.spores\n const context = doc.context as Record<string, unknown> | undefined;\n const layers = context?.layers as Record<string, unknown> | undefined;\n if (layers && 'memories' in layers && !('spores' in layers)) {\n layers.spores = layers.memories;\n delete layers.memories;\n }\n\n // Vault: rename memories/ directory → spores/\n const memoriesDir = path.join(vaultDir, 'memories');\n const sporesDir = path.join(vaultDir, 'spores');\n\n if (!fs.existsSync(memoriesDir)) return;\n\n if (fs.existsSync(sporesDir)) {\n // Both exist (interrupted migration) — merge remaining files\n const moveRemaining = (srcDir: string, destDir: string): void => {\n for (const entry of fs.readdirSync(srcDir, { withFileTypes: true })) {\n const srcPath = path.join(srcDir, entry.name);\n const destPath = path.join(destDir, entry.name);\n if (entry.isDirectory()) {\n if (!fs.existsSync(destPath)) fs.mkdirSync(destPath, { recursive: true });\n moveRemaining(srcPath, destPath);\n } else if (!fs.existsSync(destPath)) {\n fs.renameSync(srcPath, destPath);\n }\n }\n };\n moveRemaining(memoriesDir, sporesDir);\n fs.rmSync(memoriesDir, { recursive: true, force: true });\n } else {\n fs.renameSync(memoriesDir, sporesDir);\n }\n\n // Update frontmatter type: memory → type: spore (handles quoted and unquoted)\n const walkUpdate = (dir: string): void => {\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) { walkUpdate(fullPath); continue; }\n if (!entry.name.endsWith('.md')) continue;\n const content = fs.readFileSync(fullPath, 'utf-8');\n MEMORY_TYPE_PATTERN.lastIndex = 0;\n if (MEMORY_TYPE_PATTERN.test(content)) {\n MEMORY_TYPE_PATTERN.lastIndex = 0;\n fs.writeFileSync(fullPath, content.replace(MEMORY_TYPE_PATTERN, 'type: spore'));\n }\n }\n };\n walkUpdate(sporesDir);\n\n // Update wikilinks in ALL vault files: [[memories/...]] → [[spores/...]]\n const walkLinks = (dir: string): void => {\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) { walkLinks(fullPath); continue; }\n if (!entry.name.endsWith('.md')) continue;\n const content = fs.readFileSync(fullPath, 'utf-8');\n if (content.includes('memories/')) {\n fs.writeFileSync(fullPath, content.replace(/memories\\//g, 'spores/'));\n }\n }\n };\n walkLinks(vaultDir);\n },\n },\n {\n version: 2,\n name: 'consolidation-boolean-to-object',\n migrate: (doc) => {\n const digest = doc.digest as Record<string, unknown> | undefined;\n if (!digest) return;\n\n const consolidation = digest.consolidation;\n if (typeof consolidation === 'boolean') {\n digest.consolidation = { enabled: consolidation, max_tokens: 2048 };\n }\n },\n },\n];\n\n/** Current migration version — the highest version in MIGRATIONS. */\nexport const CURRENT_MIGRATION_VERSION = MIGRATIONS[MIGRATIONS.length - 1]?.version ?? 0;\n\n/**\n * Run all pending migrations on the raw config doc.\n * Returns true if any migrations ran (caller should reindex).\n */\nexport function runMigrations(\n doc: Record<string, unknown>,\n vaultDir: string,\n log?: (message: string) => void,\n): boolean {\n const currentVersion = (doc.config_version as number) ?? 0;\n let ran = false;\n\n for (const migration of MIGRATIONS) {\n if (migration.version <= currentVersion) continue;\n\n migration.migrate(doc, vaultDir);\n doc.config_version = migration.version;\n ran = true;\n }\n\n if (ran) {\n const from = currentVersion;\n const to = (doc.config_version as number) ?? 0;\n log?.(`Migrated config from v${from} to v${to}`);\n }\n\n return ran;\n}\n"],"mappings":"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","names":["fs","path","path","fs","YAML"]}
@@ -1,143 +0,0 @@
1
- import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
-
3
- // src/constants.ts
4
- var CHARS_PER_TOKEN = 4;
5
- function estimateTokens(text) {
6
- return Math.ceil(text.length / CHARS_PER_TOKEN);
7
- }
8
- var EMBEDDING_INPUT_LIMIT = 8e3;
9
- var PROMPT_PREVIEW_CHARS = 300;
10
- var CONTENT_SNIPPET_CHARS = 120;
11
- var TOOL_OUTPUT_PREVIEW_CHARS = 200;
12
- var SESSION_SUMMARY_PREVIEW_CHARS = 300;
13
- var RECALL_SUMMARY_PREVIEW_CHARS = 200;
14
- var CONTEXT_PLAN_PREVIEW_CHARS = 100;
15
- var CONTEXT_SESSION_PREVIEW_CHARS = 80;
16
- var CONTEXT_SPORE_PREVIEW_CHARS = 80;
17
- var DAEMON_CLIENT_TIMEOUT_MS = 2e3;
18
- var DAEMON_HEALTH_CHECK_TIMEOUT_MS = 500;
19
- var LLM_REQUEST_TIMEOUT_MS = 18e4;
20
- var EMBEDDING_REQUEST_TIMEOUT_MS = 6e4;
21
- var DIGEST_LLM_REQUEST_TIMEOUT_MS = 6e5;
22
- var STDIN_TIMEOUT_MS = 100;
23
- var FILE_WATCH_STABILITY_MS = 1e3;
24
- var PROVIDER_DETECT_TIMEOUT_MS = 3e3;
25
- var MS_PER_DAY = 24 * 60 * 60 * 1e3;
26
- var STALE_BUFFER_MAX_AGE_MS = 1 * MS_PER_DAY;
27
- var DAEMON_HEALTH_RETRY_DELAYS = [100, 200, 400, 800, 1500];
28
- var DAEMON_STALE_GRACE_PERIOD_MS = 6e4;
29
- var DAEMON_EVICT_TIMEOUT_MS = 3e3;
30
- var DAEMON_EVICT_POLL_MS = 100;
31
- var MAX_SLUG_LENGTH = 100;
32
- var CANDIDATE_CONTENT_PREVIEW = 2e3;
33
- var TURN_MAX_FILES_DISPLAYED = 10;
34
- var LINEAGE_RECENT_SESSIONS_LIMIT = 5;
35
- var RELATED_SPORES_LIMIT = 50;
36
- var SESSION_CONTEXT_MAX_PLANS = 3;
37
- var PROMPT_CONTEXT_MAX_SPORES = 3;
38
- var PROMPT_CONTEXT_MIN_SIMILARITY = 0.3;
39
- var PROMPT_CONTEXT_MIN_LENGTH = 10;
40
- var MCP_SEARCH_DEFAULT_LIMIT = 10;
41
- var MCP_SESSIONS_DEFAULT_LIMIT = 20;
42
- var MCP_LOGS_DEFAULT_LIMIT = 50;
43
- var DIGEST_TIERS = [1500, 3e3, 5e3, 7500, 1e4];
44
- var DIGEST_TIER_MIN_CONTEXT = {
45
- 1500: 6500,
46
- 3e3: 11500,
47
- 5e3: 18500,
48
- 7500: 24500,
49
- 1e4: 30500
50
- };
51
- var DIGEST_SUBSTRATE_TYPE_WEIGHTS = {
52
- session: 3,
53
- spore: 3,
54
- plan: 2,
55
- artifact: 1,
56
- team: 1
57
- };
58
- var LLM_REASONING_MODE = "off";
59
- var SUPERSESSION_CANDIDATE_LIMIT = 5;
60
- var SUPERSESSION_VECTOR_FETCH_LIMIT = 20;
61
- var SUPERSESSION_MAX_TOKENS = 256;
62
- var CURATION_CLUSTER_SIMILARITY = 0.75;
63
- var PIPELINE_ITEMS_DEFAULT_LIMIT = 50;
64
- var PIPELINE_PARSE_MAX_RETRIES = 1;
65
- var PIPELINE_BACKOFF_MULTIPLIER = 4;
66
- var PIPELINE_STAGES = ["capture", "extraction", "embedding", "consolidation", "digest"];
67
- var PIPELINE_PROVIDER_ROLES = ["llm", "embedding", "digest-llm"];
68
- var STAGE_PROVIDER_MAP = {
69
- capture: null,
70
- extraction: "llm",
71
- embedding: "embedding",
72
- consolidation: "digest-llm",
73
- digest: "digest-llm"
74
- };
75
- var PIPELINE_TICK_STAGES = ["extraction", "embedding", "consolidation"];
76
- var ITEM_STAGE_MAP = {
77
- session: ["capture", "extraction", "embedding", "digest"],
78
- spore: ["capture", "embedding", "consolidation", "digest"],
79
- artifact: ["capture", "embedding", "digest"]
80
- };
81
- var CONSOLIDATION_MIN_CLUSTER_SIZE = 3;
82
- var CONSOLIDATION_VECTOR_FETCH_LIMIT = 20;
83
- var CONSOLIDATION_MAX_TOKENS = 2048;
84
-
85
- export {
86
- CHARS_PER_TOKEN,
87
- estimateTokens,
88
- EMBEDDING_INPUT_LIMIT,
89
- PROMPT_PREVIEW_CHARS,
90
- CONTENT_SNIPPET_CHARS,
91
- TOOL_OUTPUT_PREVIEW_CHARS,
92
- SESSION_SUMMARY_PREVIEW_CHARS,
93
- RECALL_SUMMARY_PREVIEW_CHARS,
94
- CONTEXT_PLAN_PREVIEW_CHARS,
95
- CONTEXT_SESSION_PREVIEW_CHARS,
96
- CONTEXT_SPORE_PREVIEW_CHARS,
97
- DAEMON_CLIENT_TIMEOUT_MS,
98
- DAEMON_HEALTH_CHECK_TIMEOUT_MS,
99
- LLM_REQUEST_TIMEOUT_MS,
100
- EMBEDDING_REQUEST_TIMEOUT_MS,
101
- DIGEST_LLM_REQUEST_TIMEOUT_MS,
102
- STDIN_TIMEOUT_MS,
103
- FILE_WATCH_STABILITY_MS,
104
- PROVIDER_DETECT_TIMEOUT_MS,
105
- MS_PER_DAY,
106
- STALE_BUFFER_MAX_AGE_MS,
107
- DAEMON_HEALTH_RETRY_DELAYS,
108
- DAEMON_STALE_GRACE_PERIOD_MS,
109
- DAEMON_EVICT_TIMEOUT_MS,
110
- DAEMON_EVICT_POLL_MS,
111
- MAX_SLUG_LENGTH,
112
- CANDIDATE_CONTENT_PREVIEW,
113
- TURN_MAX_FILES_DISPLAYED,
114
- LINEAGE_RECENT_SESSIONS_LIMIT,
115
- RELATED_SPORES_LIMIT,
116
- SESSION_CONTEXT_MAX_PLANS,
117
- PROMPT_CONTEXT_MAX_SPORES,
118
- PROMPT_CONTEXT_MIN_SIMILARITY,
119
- PROMPT_CONTEXT_MIN_LENGTH,
120
- MCP_SEARCH_DEFAULT_LIMIT,
121
- MCP_SESSIONS_DEFAULT_LIMIT,
122
- MCP_LOGS_DEFAULT_LIMIT,
123
- DIGEST_TIERS,
124
- DIGEST_TIER_MIN_CONTEXT,
125
- DIGEST_SUBSTRATE_TYPE_WEIGHTS,
126
- LLM_REASONING_MODE,
127
- SUPERSESSION_CANDIDATE_LIMIT,
128
- SUPERSESSION_VECTOR_FETCH_LIMIT,
129
- SUPERSESSION_MAX_TOKENS,
130
- CURATION_CLUSTER_SIMILARITY,
131
- PIPELINE_ITEMS_DEFAULT_LIMIT,
132
- PIPELINE_PARSE_MAX_RETRIES,
133
- PIPELINE_BACKOFF_MULTIPLIER,
134
- PIPELINE_STAGES,
135
- PIPELINE_PROVIDER_ROLES,
136
- STAGE_PROVIDER_MAP,
137
- PIPELINE_TICK_STAGES,
138
- ITEM_STAGE_MAP,
139
- CONSOLIDATION_MIN_CLUSTER_SIZE,
140
- CONSOLIDATION_VECTOR_FETCH_LIMIT,
141
- CONSOLIDATION_MAX_TOKENS
142
- };
143
- //# sourceMappingURL=chunk-J4D4CROB.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/constants.ts"],"sourcesContent":["/**\n * Shared constants for the Myco codebase.\n * Per CLAUDE.md: \"No Magic Literals — Numeric and string constants\n * MUST NOT appear inline in logic.\"\n */\n\n// --- Token estimation ---\n/** Approximate characters per token for the chars/4 heuristic. */\nexport const CHARS_PER_TOKEN = 4;\n\n/** Estimate token count from character length using the CHARS_PER_TOKEN heuristic. */\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / CHARS_PER_TOKEN);\n}\n\n// --- Embedding ---\n/** Max characters of text sent to the embedding model. */\nexport const EMBEDDING_INPUT_LIMIT = 8000;\n\n// --- Truncation limits (display/preview) ---\n/** Max chars for a user prompt preview in event summaries. */\nexport const PROMPT_PREVIEW_CHARS = 300;\n/** Max chars for an AI response preview in event summaries. */\nexport const AI_RESPONSE_PREVIEW_CHARS = 500;\n/** Max chars for a command string preview. */\nexport const COMMAND_PREVIEW_CHARS = 80;\n/** Max chars for a content snippet in search results. */\nexport const CONTENT_SNIPPET_CHARS = 120;\n/** Max chars for a tool output preview in hooks. */\nexport const TOOL_OUTPUT_PREVIEW_CHARS = 200;\n/** Max chars for a session summary preview in MCP tools. */\nexport const SESSION_SUMMARY_PREVIEW_CHARS = 300;\n/** Max chars for a recall summary preview. */\nexport const RECALL_SUMMARY_PREVIEW_CHARS = 200;\n\n// --- Context injection layer budgets (chars, not tokens — used with .slice()) ---\nexport const CONTEXT_PLAN_PREVIEW_CHARS = 100;\nexport const CONTEXT_SESSION_PREVIEW_CHARS = 80;\nexport const CONTEXT_SPORE_PREVIEW_CHARS = 80;\n\n// --- Processor maxTokens budgets ---\n/** Response token budget for observation extraction. */\nexport const EXTRACTION_MAX_TOKENS = 2048;\n/** Response token budget for session summary. */\nexport const SUMMARY_MAX_TOKENS = 512;\n/** Response token budget for session title generation. */\nexport const TITLE_MAX_TOKENS = 32;\n/** Response token budget for artifact classification. */\nexport const CLASSIFICATION_MAX_TOKENS = 1024;\n\n// --- Timeouts ---\n/** Daemon client HTTP request timeout (ms). */\nexport const DAEMON_CLIENT_TIMEOUT_MS = 2000;\n/** Health check timeout (ms) — fail fast if daemon isn't responding. */\nexport const DAEMON_HEALTH_CHECK_TIMEOUT_MS = 500;\n/** LLM request timeout (ms). All LLM calls are background daemon work — no need to be aggressive. */\nexport const LLM_REQUEST_TIMEOUT_MS = 180_000;\n/** Embedding request timeout (ms). Embeddings run in background batch processing — generous timeout. */\nexport const EMBEDDING_REQUEST_TIMEOUT_MS = 60_000;\n/** Digest LLM request timeout (ms). Digest cycles use large context windows and may need model loading time. */\nexport const DIGEST_LLM_REQUEST_TIMEOUT_MS = 600_000;\n/** Stdin read timeout for hooks (ms). */\nexport const STDIN_TIMEOUT_MS = 100;\n/** Chokidar write stability threshold (ms). */\nexport const FILE_WATCH_STABILITY_MS = 1000;\n/** Provider detection timeout for detect-providers CLI command (ms). */\nexport const PROVIDER_DETECT_TIMEOUT_MS = 3000;\n\n// --- Time ---\n/** Milliseconds in one day. */\nexport const MS_PER_DAY = 24 * 60 * 60 * 1000;\n\n// --- Buffer cleanup ---\n/** Max age for stale buffer files before cleanup (ms). */\nexport const STALE_BUFFER_MAX_AGE_MS = 1 * MS_PER_DAY;\n\n// --- Retry backoff ---\n/** Retry delays for daemon health check (ms). */\nexport const DAEMON_HEALTH_RETRY_DELAYS = [100, 200, 400, 800, 1500];\n\n/** Grace period after daemon.json is written before stale checks can trigger a restart (ms).\n * Prevents rapid restart loops from concurrent hooks or session reloads. */\nexport const DAEMON_STALE_GRACE_PERIOD_MS = 60_000;\n\n/** Grace period for SIGTERM before escalating to SIGKILL (ms).\n * Gives the old daemon a chance to shut down cleanly, but force-kills\n * to guarantee the configured port is reclaimed. */\nexport const DAEMON_EVICT_TIMEOUT_MS = 3000;\n/** Poll interval when waiting for an evicted daemon to die (ms). */\nexport const DAEMON_EVICT_POLL_MS = 100;\n\n// --- Slug limits ---\n/** Max length for slugified artifact IDs. */\nexport const MAX_SLUG_LENGTH = 100;\n\n// --- Content preview for classification prompt ---\n/** Max chars of file content per candidate in classification prompt. */\nexport const CANDIDATE_CONTENT_PREVIEW = 2000;\n\n// --- Turn rendering ---\n/** Max file paths displayed per turn in session notes. */\nexport const TURN_MAX_FILES_DISPLAYED = 10;\n\n// --- Transcript mining ---\n/** Minimum content length to consider a transcript entry meaningful. */\nexport const MIN_TRANSCRIPT_CONTENT_LENGTH = 10;\n\n// --- Query limits ---\n/** Max recent sessions to check for lineage heuristics. */\nexport const LINEAGE_RECENT_SESSIONS_LIMIT = 5;\n/** Max related spores to query for session notes. */\nexport const RELATED_SPORES_LIMIT = 50;\n\n// --- Context injection ---\n/** Max active plans to inject at session start. */\nexport const SESSION_CONTEXT_MAX_PLANS = 3;\n/** Max spores to inject per prompt. */\nexport const PROMPT_CONTEXT_MAX_SPORES = 3;\n/** Minimum similarity score for prompt context injection (0-1). */\nexport const PROMPT_CONTEXT_MIN_SIMILARITY = 0.3;\n/** Max token budget for session-start context injection. */\nexport const SESSION_CONTEXT_MAX_TOKENS = 500;\n/** Max token budget for per-prompt context injection. */\nexport const PROMPT_CONTEXT_MAX_TOKENS = 300;\n/** Minimum prompt length to trigger context search. */\nexport const PROMPT_CONTEXT_MIN_LENGTH = 10;\n\n// --- MCP tool defaults ---\n/** Default result limit for myco_search. */\nexport const MCP_SEARCH_DEFAULT_LIMIT = 10;\n/** Default result limit for myco_sessions. */\nexport const MCP_SESSIONS_DEFAULT_LIMIT = 20;\n/** Default result limit for myco_logs. */\nexport const MCP_LOGS_DEFAULT_LIMIT = 50;\n\n// --- Digest — Tiers ---\n/** Available token-budget tiers for digest synthesis. */\nexport const DIGEST_TIERS = [1500, 3000, 5000, 7500, 10000] as const;\nexport type DigestTier = (typeof DIGEST_TIERS)[number];\n\n// --- Digest — Context window minimums per tier ---\n/** Minimum context window (tokens) required to run a digest at a given tier. */\nexport const DIGEST_TIER_MIN_CONTEXT: Record<number, number> = {\n 1500: 6500,\n 3000: 11500,\n 5000: 18500,\n 7500: 24500,\n 10000: 30500,\n};\n\n// --- Digest — Substrate ---\n/** Default minimum substrate notes required before a digest cycle runs. */\nexport const DIGEST_MIN_NOTES_FOR_CYCLE = 10;\n\n/** Scoring weights by note type when selecting substrate for synthesis. */\nexport const DIGEST_SUBSTRATE_TYPE_WEIGHTS: Record<string, number> = {\n session: 3,\n spore: 3,\n plan: 2,\n artifact: 1,\n team: 1,\n};\n\n// --- LLM reasoning control ---\n/** Reasoning mode for all Myco LLM calls. Suppresses chain-of-thought tokens from reasoning models. */\nexport const LLM_REASONING_MODE = 'off' as const;\n\n// --- Digest — System prompt overhead estimate ---\n\n// --- Vault curation ---\n/** Max candidate spores after post-filtering for supersession check. */\nexport const SUPERSESSION_CANDIDATE_LIMIT = 5;\n\n/** Over-fetch from vector index before post-filtering by status/type. */\nexport const SUPERSESSION_VECTOR_FETCH_LIMIT = 20;\n\n/** Max output tokens for supersession LLM evaluation. */\nexport const SUPERSESSION_MAX_TOKENS = 256;\n\n/** Similarity threshold for clustering related spores in batch curation. */\nexport const CURATION_CLUSTER_SIMILARITY = 0.75;\n\n// --- Pipeline processing ---\n/** Default page size for pipeline items API listing. */\nexport const PIPELINE_ITEMS_DEFAULT_LIMIT = 50;\n\n// --- Pipeline retry ---\n/** Max retries for parse (structural) pipeline failures — fail fast. */\nexport const PIPELINE_PARSE_MAX_RETRIES = 1;\n/** Exponential backoff multiplier for successive pipeline retries. */\nexport const PIPELINE_BACKOFF_MULTIPLIER = 4;\n\n// --- Pipeline stages (ordered) ---\nexport const PIPELINE_STAGES = ['capture', 'extraction', 'embedding', 'consolidation', 'digest'] as const;\nexport type PipelineStage = typeof PIPELINE_STAGES[number];\n\n// --- Pipeline statuses ---\nexport const PIPELINE_STATUSES = ['pending', 'processing', 'succeeded', 'failed', 'blocked', 'skipped', 'poisoned'] as const;\nexport type PipelineStatus = typeof PIPELINE_STATUSES[number];\n\n// --- Provider roles for circuit breakers ---\nexport const PIPELINE_PROVIDER_ROLES = ['llm', 'embedding', 'digest-llm'] as const;\nexport type PipelineProviderRole = typeof PIPELINE_PROVIDER_ROLES[number];\n\n// --- Stage to provider role mapping ---\nexport const STAGE_PROVIDER_MAP: Record<PipelineStage, PipelineProviderRole | null> = {\n capture: null,\n extraction: 'llm',\n embedding: 'embedding',\n consolidation: 'digest-llm',\n digest: 'digest-llm',\n};\n\n/**\n * Stages processed by the pipeline tick timer.\n * Capture is handled at registration time, digest is gated by the metabolism timer.\n */\nexport const PIPELINE_TICK_STAGES: PipelineStage[] = ['extraction', 'embedding', 'consolidation'];\n\n// --- Item type to applicable stages ---\n// Sessions skip consolidation — consolidation applies to the spores\n// extracted FROM sessions, not the session work item itself.\n// Lineage detection stays outside the pipeline (fire-and-forget, non-critical).\nexport const ITEM_STAGE_MAP: Record<string, PipelineStage[]> = {\n session: ['capture', 'extraction', 'embedding', 'digest'],\n spore: ['capture', 'embedding', 'consolidation', 'digest'],\n artifact: ['capture', 'embedding', 'digest'],\n};\n\n// --- Automatic consolidation ---\n/** Minimum cluster size required before asking LLM to consolidate. */\nexport const CONSOLIDATION_MIN_CLUSTER_SIZE = 3;\n\n/** Over-fetch from vector index before post-filtering by status/type. */\nexport const CONSOLIDATION_VECTOR_FETCH_LIMIT = 20;\n\n/** Max output tokens for consolidation LLM synthesis.\n * Must be large enough for the full JSON response including content field. */\nexport const CONSOLIDATION_MAX_TOKENS = 2048;\n"],"mappings":";;;AAQO,IAAM,kBAAkB;AAGxB,SAAS,eAAe,MAAsB;AACnD,SAAO,KAAK,KAAK,KAAK,SAAS,eAAe;AAChD;AAIO,IAAM,wBAAwB;AAI9B,IAAM,uBAAuB;AAM7B,IAAM,wBAAwB;AAE9B,IAAM,4BAA4B;AAElC,IAAM,gCAAgC;AAEtC,IAAM,+BAA+B;AAGrC,IAAM,6BAA6B;AACnC,IAAM,gCAAgC;AACtC,IAAM,8BAA8B;AAcpC,IAAM,2BAA2B;AAEjC,IAAM,iCAAiC;AAEvC,IAAM,yBAAyB;AAE/B,IAAM,+BAA+B;AAErC,IAAM,gCAAgC;AAEtC,IAAM,mBAAmB;AAEzB,IAAM,0BAA0B;AAEhC,IAAM,6BAA6B;AAInC,IAAM,aAAa,KAAK,KAAK,KAAK;AAIlC,IAAM,0BAA0B,IAAI;AAIpC,IAAM,6BAA6B,CAAC,KAAK,KAAK,KAAK,KAAK,IAAI;AAI5D,IAAM,+BAA+B;AAKrC,IAAM,0BAA0B;AAEhC,IAAM,uBAAuB;AAI7B,IAAM,kBAAkB;AAIxB,IAAM,4BAA4B;AAIlC,IAAM,2BAA2B;AAQjC,IAAM,gCAAgC;AAEtC,IAAM,uBAAuB;AAI7B,IAAM,4BAA4B;AAElC,IAAM,4BAA4B;AAElC,IAAM,gCAAgC;AAMtC,IAAM,4BAA4B;AAIlC,IAAM,2BAA2B;AAEjC,IAAM,6BAA6B;AAEnC,IAAM,yBAAyB;AAI/B,IAAM,eAAe,CAAC,MAAM,KAAM,KAAM,MAAM,GAAK;AAKnD,IAAM,0BAAkD;AAAA,EAC7D,MAAM;AAAA,EACN,KAAM;AAAA,EACN,KAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAO;AACT;AAOO,IAAM,gCAAwD;AAAA,EACnE,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AAAA,EACN,UAAU;AAAA,EACV,MAAM;AACR;AAIO,IAAM,qBAAqB;AAM3B,IAAM,+BAA+B;AAGrC,IAAM,kCAAkC;AAGxC,IAAM,0BAA0B;AAGhC,IAAM,8BAA8B;AAIpC,IAAM,+BAA+B;AAIrC,IAAM,6BAA6B;AAEnC,IAAM,8BAA8B;AAGpC,IAAM,kBAAkB,CAAC,WAAW,cAAc,aAAa,iBAAiB,QAAQ;AAQxF,IAAM,0BAA0B,CAAC,OAAO,aAAa,YAAY;AAIjE,IAAM,qBAAyE;AAAA,EACpF,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,eAAe;AAAA,EACf,QAAQ;AACV;AAMO,IAAM,uBAAwC,CAAC,cAAc,aAAa,eAAe;AAMzF,IAAM,iBAAkD;AAAA,EAC7D,SAAS,CAAC,WAAW,cAAc,aAAa,QAAQ;AAAA,EACxD,OAAO,CAAC,WAAW,aAAa,iBAAiB,QAAQ;AAAA,EACzD,UAAU,CAAC,WAAW,aAAa,QAAQ;AAC7C;AAIO,IAAM,iCAAiC;AAGvC,IAAM,mCAAmC;AAIzC,IAAM,2BAA2B;","names":[]}
@@ -1,99 +0,0 @@
1
- import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
- import {
3
- parseStringFlag
4
- } from "./chunk-SAKJMNSR.js";
5
- import {
6
- MycoConfigSchema,
7
- require_dist
8
- } from "./chunk-ERG2IEWX.js";
9
- import {
10
- __toESM
11
- } from "./chunk-PZUWP5VK.js";
12
-
13
- // src/cli/setup-llm.ts
14
- var import_yaml = __toESM(require_dist(), 1);
15
- import fs from "fs";
16
- import path from "path";
17
- var CONFIG_FILENAME = "myco.yaml";
18
- var DAEMON_STATE_FILENAME = "daemon.json";
19
- var USAGE = `Usage: myco setup-llm [options]
20
-
21
- Configure LLM and embedding provider settings.
22
-
23
- Options:
24
- --llm-provider <name> LLM provider (ollama, lm-studio, anthropic)
25
- --llm-model <name> LLM model name
26
- --llm-url <url> LLM provider base URL
27
- --llm-context-window <number> LLM context window (tokens)
28
- --llm-max-tokens <number> LLM max output tokens
29
- --embedding-provider <name> Embedding provider (ollama, lm-studio)
30
- --embedding-model <name> Embedding model name
31
- --embedding-url <url> Embedding provider base URL
32
- --show Show current settings and exit
33
- `;
34
- async function run(args, vaultDir) {
35
- const configPath = path.join(vaultDir, CONFIG_FILENAME);
36
- const raw = fs.readFileSync(configPath, "utf-8");
37
- const doc = import_yaml.default.parse(raw);
38
- if (args.includes("--show")) {
39
- const config = MycoConfigSchema.parse(doc);
40
- console.log(JSON.stringify(config.intelligence, null, 2));
41
- return;
42
- }
43
- if (args.length === 0) {
44
- console.log(USAGE);
45
- return;
46
- }
47
- if (!doc.intelligence || typeof doc.intelligence !== "object") {
48
- doc.intelligence = {};
49
- }
50
- const intelligence = doc.intelligence;
51
- if (!intelligence.llm || typeof intelligence.llm !== "object") {
52
- intelligence.llm = {};
53
- }
54
- if (!intelligence.embedding || typeof intelligence.embedding !== "object") {
55
- intelligence.embedding = {};
56
- }
57
- const llm = intelligence.llm;
58
- const embedding = intelligence.embedding;
59
- const llmProvider = parseStringFlag(args, "--llm-provider");
60
- if (llmProvider !== void 0) llm.provider = llmProvider;
61
- const llmModel = parseStringFlag(args, "--llm-model");
62
- if (llmModel !== void 0) llm.model = llmModel;
63
- const llmUrl = parseStringFlag(args, "--llm-url");
64
- if (llmUrl !== void 0) llm.base_url = llmUrl;
65
- const llmContextWindow = parseStringFlag(args, "--llm-context-window");
66
- if (llmContextWindow !== void 0) llm.context_window = parseInt(llmContextWindow, 10);
67
- const llmMaxTokens = parseStringFlag(args, "--llm-max-tokens");
68
- if (llmMaxTokens !== void 0) llm.max_tokens = parseInt(llmMaxTokens, 10);
69
- const embeddingProvider = parseStringFlag(args, "--embedding-provider");
70
- if (embeddingProvider !== void 0) embedding.provider = embeddingProvider;
71
- const embeddingModel = parseStringFlag(args, "--embedding-model");
72
- if (embeddingModel !== void 0) embedding.model = embeddingModel;
73
- const embeddingUrl = parseStringFlag(args, "--embedding-url");
74
- if (embeddingUrl !== void 0) embedding.base_url = embeddingUrl;
75
- const result = MycoConfigSchema.safeParse(doc);
76
- if (!result.success) {
77
- console.error("Validation error:");
78
- for (const issue of result.error.issues) {
79
- console.error(` ${issue.path.join(".")}: ${issue.message}`);
80
- }
81
- process.exit(1);
82
- }
83
- fs.writeFileSync(configPath, import_yaml.default.stringify(doc), "utf-8");
84
- console.log("Intelligence configuration updated.");
85
- const updated = MycoConfigSchema.parse(doc);
86
- console.log(JSON.stringify(updated.intelligence, null, 2));
87
- if (embeddingModel !== void 0) {
88
- console.log("\nWarning: changing the embedding model requires a full vector index rebuild.");
89
- console.log("Run: node dist/src/cli.js rebuild");
90
- }
91
- if (fs.existsSync(path.join(vaultDir, DAEMON_STATE_FILENAME))) {
92
- console.log("\nNote: restart the daemon for changes to take effect (myco restart)");
93
- }
94
- }
95
-
96
- export {
97
- run
98
- };
99
- //# sourceMappingURL=chunk-MDLSAFPP.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/setup-llm.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport YAML from 'yaml';\nimport { MycoConfigSchema } from '../config/schema.js';\nimport { parseStringFlag } from './shared.js';\n\nconst CONFIG_FILENAME = 'myco.yaml';\nconst DAEMON_STATE_FILENAME = 'daemon.json';\n\nconst USAGE = `Usage: myco setup-llm [options]\n\nConfigure LLM and embedding provider settings.\n\nOptions:\n --llm-provider <name> LLM provider (ollama, lm-studio, anthropic)\n --llm-model <name> LLM model name\n --llm-url <url> LLM provider base URL\n --llm-context-window <number> LLM context window (tokens)\n --llm-max-tokens <number> LLM max output tokens\n --embedding-provider <name> Embedding provider (ollama, lm-studio)\n --embedding-model <name> Embedding model name\n --embedding-url <url> Embedding provider base URL\n --show Show current settings and exit\n`;\n\nexport async function run(args: string[], vaultDir: string): Promise<void> {\n const configPath = path.join(vaultDir, CONFIG_FILENAME);\n const raw = fs.readFileSync(configPath, 'utf-8');\n const doc = YAML.parse(raw) as Record<string, unknown>;\n\n // Show current settings\n if (args.includes('--show')) {\n const config = MycoConfigSchema.parse(doc);\n console.log(JSON.stringify(config.intelligence, null, 2));\n return;\n }\n\n // No flags = show usage\n if (args.length === 0) {\n console.log(USAGE);\n return;\n }\n\n // Ensure intelligence section exists\n if (!doc.intelligence || typeof doc.intelligence !== 'object') {\n doc.intelligence = {};\n }\n const intelligence = doc.intelligence as Record<string, unknown>;\n\n if (!intelligence.llm || typeof intelligence.llm !== 'object') {\n intelligence.llm = {};\n }\n if (!intelligence.embedding || typeof intelligence.embedding !== 'object') {\n intelligence.embedding = {};\n }\n\n const llm = intelligence.llm as Record<string, unknown>;\n const embedding = intelligence.embedding as Record<string, unknown>;\n\n // Parse and apply flags\n const llmProvider = parseStringFlag(args, '--llm-provider');\n if (llmProvider !== undefined) llm.provider = llmProvider;\n\n const llmModel = parseStringFlag(args, '--llm-model');\n if (llmModel !== undefined) llm.model = llmModel;\n\n const llmUrl = parseStringFlag(args, '--llm-url');\n if (llmUrl !== undefined) llm.base_url = llmUrl;\n\n const llmContextWindow = parseStringFlag(args, '--llm-context-window');\n if (llmContextWindow !== undefined) llm.context_window = parseInt(llmContextWindow, 10);\n\n const llmMaxTokens = parseStringFlag(args, '--llm-max-tokens');\n if (llmMaxTokens !== undefined) llm.max_tokens = parseInt(llmMaxTokens, 10);\n\n const embeddingProvider = parseStringFlag(args, '--embedding-provider');\n if (embeddingProvider !== undefined) embedding.provider = embeddingProvider;\n\n const embeddingModel = parseStringFlag(args, '--embedding-model');\n if (embeddingModel !== undefined) embedding.model = embeddingModel;\n\n const embeddingUrl = parseStringFlag(args, '--embedding-url');\n if (embeddingUrl !== undefined) embedding.base_url = embeddingUrl;\n\n // Validate the full config\n const result = MycoConfigSchema.safeParse(doc);\n if (!result.success) {\n console.error('Validation error:');\n for (const issue of result.error.issues) {\n console.error(` ${issue.path.join('.')}: ${issue.message}`);\n }\n process.exit(1);\n }\n\n // Write back\n fs.writeFileSync(configPath, YAML.stringify(doc), 'utf-8');\n console.log('Intelligence configuration updated.');\n\n // Show what was set\n const updated = MycoConfigSchema.parse(doc);\n console.log(JSON.stringify(updated.intelligence, null, 2));\n\n // Warn about embedding model changes\n if (embeddingModel !== undefined) {\n console.log('\\nWarning: changing the embedding model requires a full vector index rebuild.');\n console.log('Run: node dist/src/cli.js rebuild');\n }\n\n if (fs.existsSync(path.join(vaultDir, DAEMON_STATE_FILENAME))) {\n console.log('\\nNote: restart the daemon for changes to take effect (myco restart)');\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAEA,kBAAiB;AAFjB,OAAO,QAAQ;AACf,OAAO,UAAU;AAKjB,IAAM,kBAAkB;AACxB,IAAM,wBAAwB;AAE9B,IAAM,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBd,eAAsB,IAAI,MAAgB,UAAiC;AACzE,QAAM,aAAa,KAAK,KAAK,UAAU,eAAe;AACtD,QAAM,MAAM,GAAG,aAAa,YAAY,OAAO;AAC/C,QAAM,MAAM,YAAAA,QAAK,MAAM,GAAG;AAG1B,MAAI,KAAK,SAAS,QAAQ,GAAG;AAC3B,UAAM,SAAS,iBAAiB,MAAM,GAAG;AACzC,YAAQ,IAAI,KAAK,UAAU,OAAO,cAAc,MAAM,CAAC,CAAC;AACxD;AAAA,EACF;AAGA,MAAI,KAAK,WAAW,GAAG;AACrB,YAAQ,IAAI,KAAK;AACjB;AAAA,EACF;AAGA,MAAI,CAAC,IAAI,gBAAgB,OAAO,IAAI,iBAAiB,UAAU;AAC7D,QAAI,eAAe,CAAC;AAAA,EACtB;AACA,QAAM,eAAe,IAAI;AAEzB,MAAI,CAAC,aAAa,OAAO,OAAO,aAAa,QAAQ,UAAU;AAC7D,iBAAa,MAAM,CAAC;AAAA,EACtB;AACA,MAAI,CAAC,aAAa,aAAa,OAAO,aAAa,cAAc,UAAU;AACzE,iBAAa,YAAY,CAAC;AAAA,EAC5B;AAEA,QAAM,MAAM,aAAa;AACzB,QAAM,YAAY,aAAa;AAG/B,QAAM,cAAc,gBAAgB,MAAM,gBAAgB;AAC1D,MAAI,gBAAgB,OAAW,KAAI,WAAW;AAE9C,QAAM,WAAW,gBAAgB,MAAM,aAAa;AACpD,MAAI,aAAa,OAAW,KAAI,QAAQ;AAExC,QAAM,SAAS,gBAAgB,MAAM,WAAW;AAChD,MAAI,WAAW,OAAW,KAAI,WAAW;AAEzC,QAAM,mBAAmB,gBAAgB,MAAM,sBAAsB;AACrE,MAAI,qBAAqB,OAAW,KAAI,iBAAiB,SAAS,kBAAkB,EAAE;AAEtF,QAAM,eAAe,gBAAgB,MAAM,kBAAkB;AAC7D,MAAI,iBAAiB,OAAW,KAAI,aAAa,SAAS,cAAc,EAAE;AAE1E,QAAM,oBAAoB,gBAAgB,MAAM,sBAAsB;AACtE,MAAI,sBAAsB,OAAW,WAAU,WAAW;AAE1D,QAAM,iBAAiB,gBAAgB,MAAM,mBAAmB;AAChE,MAAI,mBAAmB,OAAW,WAAU,QAAQ;AAEpD,QAAM,eAAe,gBAAgB,MAAM,iBAAiB;AAC5D,MAAI,iBAAiB,OAAW,WAAU,WAAW;AAGrD,QAAM,SAAS,iBAAiB,UAAU,GAAG;AAC7C,MAAI,CAAC,OAAO,SAAS;AACnB,YAAQ,MAAM,mBAAmB;AACjC,eAAW,SAAS,OAAO,MAAM,QAAQ;AACvC,cAAQ,MAAM,KAAK,MAAM,KAAK,KAAK,GAAG,CAAC,KAAK,MAAM,OAAO,EAAE;AAAA,IAC7D;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAGA,KAAG,cAAc,YAAY,YAAAA,QAAK,UAAU,GAAG,GAAG,OAAO;AACzD,UAAQ,IAAI,qCAAqC;AAGjD,QAAM,UAAU,iBAAiB,MAAM,GAAG;AAC1C,UAAQ,IAAI,KAAK,UAAU,QAAQ,cAAc,MAAM,CAAC,CAAC;AAGzD,MAAI,mBAAmB,QAAW;AAChC,YAAQ,IAAI,+EAA+E;AAC3F,YAAQ,IAAI,mCAAmC;AAAA,EACjD;AAEA,MAAI,GAAG,WAAW,KAAK,KAAK,UAAU,qBAAqB,CAAC,GAAG;AAC7D,YAAQ,IAAI,sEAAsE;AAAA,EACpF;AACF;","names":["YAML"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/vault/resolve.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport { execFileSync } from 'node:child_process';\n\n/**\n * Resolve the vault directory.\n *\n * Priority:\n * 1. MYCO_VAULT_DIR env var (override for public repos or shared vaults)\n * 2. .myco/ in the repo root (default — vault lives with the project)\n *\n * The default is project-local: the vault is committed to git alongside\n * the code, so the team's institutional memory travels with the repo.\n * For public repos or cases where the vault should be separate, set\n * MYCO_VAULT_DIR to an external path.\n *\n * Uses git to find the repo root so this works correctly in\n * git worktrees — worktree agents resolve to the same vault\n * as the main working tree.\n */\nexport function resolveVaultDir(cwd = process.cwd()): string {\n // Override: external vault location\n if (process.env.MYCO_VAULT_DIR) {\n const dir = process.env.MYCO_VAULT_DIR;\n if (dir.startsWith('~/')) {\n return path.join(os.homedir(), dir.slice(2));\n }\n return dir;\n }\n\n // Default: .myco/ in the project root\n return path.join(resolveRepoRoot(cwd), '.myco');\n}\n\n/**\n * Find the main repo root, even from a git worktree.\n *\n * `git rev-parse --git-common-dir` returns the shared .git directory:\n * - In a normal repo: \".git\" (relative)\n * - In a worktree: \"/abs/path/to/main-repo/.git\" (absolute)\n *\n * The repo root is the parent of that path.\n * Falls back to cwd if not in a git repo.\n */\nfunction resolveRepoRoot(cwd: string): string {\n try {\n const gitCommon = execFileSync(\n 'git', ['rev-parse', '--git-common-dir'],\n { cwd, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] },\n ).trim();\n return path.resolve(cwd, gitCommon, '..');\n } catch {\n return cwd;\n }\n}\n"],"mappings":";;;AACA,OAAO,UAAU;AACjB,OAAO,QAAQ;AACf,SAAS,oBAAoB;AAkBtB,SAAS,gBAAgB,MAAM,QAAQ,IAAI,GAAW;AAE3D,MAAI,QAAQ,IAAI,gBAAgB;AAC9B,UAAM,MAAM,QAAQ,IAAI;AACxB,QAAI,IAAI,WAAW,IAAI,GAAG;AACxB,aAAO,KAAK,KAAK,GAAG,QAAQ,GAAG,IAAI,MAAM,CAAC,CAAC;AAAA,IAC7C;AACA,WAAO;AAAA,EACT;AAGA,SAAO,KAAK,KAAK,gBAAgB,GAAG,GAAG,OAAO;AAChD;AAYA,SAAS,gBAAgB,KAAqB;AAC5C,MAAI;AACF,UAAM,YAAY;AAAA,MAChB;AAAA,MAAO,CAAC,aAAa,kBAAkB;AAAA,MACvC,EAAE,KAAK,UAAU,SAAS,OAAO,CAAC,QAAQ,QAAQ,MAAM,EAAE;AAAA,IAC5D,EAAE,KAAK;AACP,WAAO,KAAK,QAAQ,KAAK,WAAW,IAAI;AAAA,EAC1C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;","names":[]}