@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,147 +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-digest.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-digest [options]
20
-
21
- Configure digest (continuous reasoning) settings.
22
-
23
- Options:
24
- --enabled <true|false> Enable/disable digest (default: true)
25
- --tiers <1500,3000,...> Comma-separated tier list
26
- --inject-tier <number|null> Tier to auto-inject at session start
27
- --provider <name> LLM provider for digest (null = inherit)
28
- --model <name> Model for digest (null = inherit)
29
- --base-url <url> Provider base URL (null = inherit)
30
- --context-window <number> Context window for digest operations
31
- --keep-alive <duration> Keep model loaded (Ollama, e.g. "30m")
32
- --gpu-kv-cache <true|false> Offload KV cache to GPU (LM Studio)
33
- --active-interval <seconds> Metabolism active interval
34
- --dormancy-threshold <seconds> Time before dormancy
35
- --max-notes <number> Max substrate notes per cycle
36
- --extraction-tokens <number> Max tokens for spore extraction
37
- --summary-tokens <number> Max tokens for session summaries
38
- --title-tokens <number> Max tokens for session titles
39
- --classification-tokens <number> Max tokens for artifact classification
40
- --show Show current settings and exit
41
- `;
42
- async function run(args, vaultDir) {
43
- const configPath = path.join(vaultDir, CONFIG_FILENAME);
44
- const raw = fs.readFileSync(configPath, "utf-8");
45
- const doc = import_yaml.default.parse(raw);
46
- if (args.includes("--show")) {
47
- const config = MycoConfigSchema.parse(doc);
48
- console.log(JSON.stringify({
49
- digest: config.digest,
50
- capture: {
51
- extraction_max_tokens: config.capture.extraction_max_tokens,
52
- summary_max_tokens: config.capture.summary_max_tokens,
53
- title_max_tokens: config.capture.title_max_tokens,
54
- classification_max_tokens: config.capture.classification_max_tokens
55
- }
56
- }, null, 2));
57
- return;
58
- }
59
- if (args.length === 0) {
60
- console.log(USAGE);
61
- return;
62
- }
63
- if (!doc.digest || typeof doc.digest !== "object") {
64
- doc.digest = {};
65
- }
66
- const digest = doc.digest;
67
- if (!digest.intelligence || typeof digest.intelligence !== "object") {
68
- digest.intelligence = {};
69
- }
70
- if (!digest.metabolism || typeof digest.metabolism !== "object") {
71
- digest.metabolism = {};
72
- }
73
- if (!digest.substrate || typeof digest.substrate !== "object") {
74
- digest.substrate = {};
75
- }
76
- if (!doc.capture || typeof doc.capture !== "object") {
77
- doc.capture = {};
78
- }
79
- const intelligence = digest.intelligence;
80
- const metabolism = digest.metabolism;
81
- const substrate = digest.substrate;
82
- const capture = doc.capture;
83
- const enabled = parseStringFlag(args, "--enabled");
84
- if (enabled !== void 0) digest.enabled = enabled === "true";
85
- const tiers = parseStringFlag(args, "--tiers");
86
- if (tiers !== void 0) {
87
- digest.tiers = tiers.split(",").map((t) => parseInt(t.trim(), 10));
88
- }
89
- const injectTier = parseStringFlag(args, "--inject-tier");
90
- if (injectTier !== void 0) {
91
- digest.inject_tier = injectTier === "null" ? null : parseInt(injectTier, 10);
92
- }
93
- const provider = parseStringFlag(args, "--provider");
94
- if (provider !== void 0) intelligence.provider = provider === "null" ? null : provider;
95
- const model = parseStringFlag(args, "--model");
96
- if (model !== void 0) intelligence.model = model === "null" ? null : model;
97
- const baseUrl = parseStringFlag(args, "--base-url");
98
- if (baseUrl !== void 0) intelligence.base_url = baseUrl === "null" ? null : baseUrl;
99
- const contextWindow = parseStringFlag(args, "--context-window");
100
- if (contextWindow !== void 0) intelligence.context_window = parseInt(contextWindow, 10);
101
- const keepAlive = parseStringFlag(args, "--keep-alive");
102
- if (keepAlive !== void 0) intelligence.keep_alive = keepAlive === "null" ? null : keepAlive;
103
- const gpuKvCache = parseStringFlag(args, "--gpu-kv-cache");
104
- if (gpuKvCache !== void 0) intelligence.gpu_kv_cache = gpuKvCache === "true";
105
- const activeInterval = parseStringFlag(args, "--active-interval");
106
- if (activeInterval !== void 0) metabolism.active_interval = parseInt(activeInterval, 10);
107
- const dormancyThreshold = parseStringFlag(args, "--dormancy-threshold");
108
- if (dormancyThreshold !== void 0) metabolism.dormancy_threshold = parseInt(dormancyThreshold, 10);
109
- const maxNotes = parseStringFlag(args, "--max-notes");
110
- if (maxNotes !== void 0) substrate.max_notes_per_cycle = parseInt(maxNotes, 10);
111
- const extractionTokens = parseStringFlag(args, "--extraction-tokens");
112
- if (extractionTokens !== void 0) capture.extraction_max_tokens = parseInt(extractionTokens, 10);
113
- const summaryTokens = parseStringFlag(args, "--summary-tokens");
114
- if (summaryTokens !== void 0) capture.summary_max_tokens = parseInt(summaryTokens, 10);
115
- const titleTokens = parseStringFlag(args, "--title-tokens");
116
- if (titleTokens !== void 0) capture.title_max_tokens = parseInt(titleTokens, 10);
117
- const classificationTokens = parseStringFlag(args, "--classification-tokens");
118
- if (classificationTokens !== void 0) capture.classification_max_tokens = parseInt(classificationTokens, 10);
119
- const result = MycoConfigSchema.safeParse(doc);
120
- if (!result.success) {
121
- console.error("Validation error:");
122
- for (const issue of result.error.issues) {
123
- console.error(` ${issue.path.join(".")}: ${issue.message}`);
124
- }
125
- process.exit(1);
126
- }
127
- fs.writeFileSync(configPath, import_yaml.default.stringify(doc), "utf-8");
128
- console.log("Digest configuration updated.");
129
- const updated = MycoConfigSchema.parse(doc);
130
- console.log(JSON.stringify({
131
- digest: updated.digest,
132
- capture: {
133
- extraction_max_tokens: updated.capture.extraction_max_tokens,
134
- summary_max_tokens: updated.capture.summary_max_tokens,
135
- title_max_tokens: updated.capture.title_max_tokens,
136
- classification_max_tokens: updated.capture.classification_max_tokens
137
- }
138
- }, null, 2));
139
- if (fs.existsSync(path.join(vaultDir, DAEMON_STATE_FILENAME))) {
140
- console.log("\nNote: restart the daemon for changes to take effect (myco restart)");
141
- }
142
- }
143
-
144
- export {
145
- run
146
- };
147
- //# sourceMappingURL=chunk-P723N2LP.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/setup-digest.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-digest [options]\n\nConfigure digest (continuous reasoning) settings.\n\nOptions:\n --enabled <true|false> Enable/disable digest (default: true)\n --tiers <1500,3000,...> Comma-separated tier list\n --inject-tier <number|null> Tier to auto-inject at session start\n --provider <name> LLM provider for digest (null = inherit)\n --model <name> Model for digest (null = inherit)\n --base-url <url> Provider base URL (null = inherit)\n --context-window <number> Context window for digest operations\n --keep-alive <duration> Keep model loaded (Ollama, e.g. \"30m\")\n --gpu-kv-cache <true|false> Offload KV cache to GPU (LM Studio)\n --active-interval <seconds> Metabolism active interval\n --dormancy-threshold <seconds> Time before dormancy\n --max-notes <number> Max substrate notes per cycle\n --extraction-tokens <number> Max tokens for spore extraction\n --summary-tokens <number> Max tokens for session summaries\n --title-tokens <number> Max tokens for session titles\n --classification-tokens <number> Max tokens for artifact classification\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({\n digest: config.digest,\n capture: {\n extraction_max_tokens: config.capture.extraction_max_tokens,\n summary_max_tokens: config.capture.summary_max_tokens,\n title_max_tokens: config.capture.title_max_tokens,\n classification_max_tokens: config.capture.classification_max_tokens,\n },\n }, 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 digest section exists\n if (!doc.digest || typeof doc.digest !== 'object') {\n doc.digest = {};\n }\n const digest = doc.digest as Record<string, unknown>;\n\n // Ensure nested sections exist\n if (!digest.intelligence || typeof digest.intelligence !== 'object') {\n digest.intelligence = {};\n }\n if (!digest.metabolism || typeof digest.metabolism !== 'object') {\n digest.metabolism = {};\n }\n if (!digest.substrate || typeof digest.substrate !== 'object') {\n digest.substrate = {};\n }\n if (!doc.capture || typeof doc.capture !== 'object') {\n doc.capture = {};\n }\n\n const intelligence = digest.intelligence as Record<string, unknown>;\n const metabolism = digest.metabolism as Record<string, unknown>;\n const substrate = digest.substrate as Record<string, unknown>;\n const capture = doc.capture as Record<string, unknown>;\n\n // Parse and apply flags\n const enabled = parseStringFlag(args, '--enabled');\n if (enabled !== undefined) digest.enabled = enabled === 'true';\n\n const tiers = parseStringFlag(args, '--tiers');\n if (tiers !== undefined) {\n digest.tiers = tiers.split(',').map((t) => parseInt(t.trim(), 10));\n }\n\n const injectTier = parseStringFlag(args, '--inject-tier');\n if (injectTier !== undefined) {\n digest.inject_tier = injectTier === 'null' ? null : parseInt(injectTier, 10);\n }\n\n const provider = parseStringFlag(args, '--provider');\n if (provider !== undefined) intelligence.provider = provider === 'null' ? null : provider;\n\n const model = parseStringFlag(args, '--model');\n if (model !== undefined) intelligence.model = model === 'null' ? null : model;\n\n const baseUrl = parseStringFlag(args, '--base-url');\n if (baseUrl !== undefined) intelligence.base_url = baseUrl === 'null' ? null : baseUrl;\n\n const contextWindow = parseStringFlag(args, '--context-window');\n if (contextWindow !== undefined) intelligence.context_window = parseInt(contextWindow, 10);\n\n const keepAlive = parseStringFlag(args, '--keep-alive');\n if (keepAlive !== undefined) intelligence.keep_alive = keepAlive === 'null' ? null : keepAlive;\n\n const gpuKvCache = parseStringFlag(args, '--gpu-kv-cache');\n if (gpuKvCache !== undefined) intelligence.gpu_kv_cache = gpuKvCache === 'true';\n\n const activeInterval = parseStringFlag(args, '--active-interval');\n if (activeInterval !== undefined) metabolism.active_interval = parseInt(activeInterval, 10);\n\n const dormancyThreshold = parseStringFlag(args, '--dormancy-threshold');\n if (dormancyThreshold !== undefined) metabolism.dormancy_threshold = parseInt(dormancyThreshold, 10);\n\n const maxNotes = parseStringFlag(args, '--max-notes');\n if (maxNotes !== undefined) substrate.max_notes_per_cycle = parseInt(maxNotes, 10);\n\n const extractionTokens = parseStringFlag(args, '--extraction-tokens');\n if (extractionTokens !== undefined) capture.extraction_max_tokens = parseInt(extractionTokens, 10);\n\n const summaryTokens = parseStringFlag(args, '--summary-tokens');\n if (summaryTokens !== undefined) capture.summary_max_tokens = parseInt(summaryTokens, 10);\n\n const titleTokens = parseStringFlag(args, '--title-tokens');\n if (titleTokens !== undefined) capture.title_max_tokens = parseInt(titleTokens, 10);\n\n const classificationTokens = parseStringFlag(args, '--classification-tokens');\n if (classificationTokens !== undefined) capture.classification_max_tokens = parseInt(classificationTokens, 10);\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('Digest configuration updated.');\n\n // Show what was set\n const updated = MycoConfigSchema.parse(doc);\n console.log(JSON.stringify({\n digest: updated.digest,\n capture: {\n extraction_max_tokens: updated.capture.extraction_max_tokens,\n summary_max_tokens: updated.capture.summary_max_tokens,\n title_max_tokens: updated.capture.title_max_tokens,\n classification_max_tokens: updated.capture.classification_max_tokens,\n },\n }, null, 2));\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":"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","names":["YAML"]}
@@ -1,161 +0,0 @@
1
- import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
-
3
- // src/daemon/logger.ts
4
- import fs from "fs";
5
- import path from "path";
6
-
7
- // src/daemon/log-buffer.ts
8
- var LOG_RING_BUFFER_CAPACITY = 1e3;
9
- var LOG_QUERY_DEFAULT_LIMIT = 100;
10
- var LogRingBuffer = class {
11
- buffer;
12
- head = 0;
13
- count = 0;
14
- sequence = 0;
15
- startSequence = 0;
16
- capacity;
17
- constructor(capacity = LOG_RING_BUFFER_CAPACITY) {
18
- this.capacity = capacity;
19
- this.buffer = new Array(capacity);
20
- }
21
- push(entry) {
22
- this.buffer[this.head] = entry;
23
- this.head = (this.head + 1) % this.capacity;
24
- if (this.count < this.capacity) {
25
- this.count++;
26
- } else {
27
- this.startSequence++;
28
- }
29
- this.sequence++;
30
- }
31
- since(cursor, options) {
32
- const limit = options?.limit ?? LOG_QUERY_DEFAULT_LIMIT;
33
- const minLevel = options?.level ? LEVEL_ORDER[options.level] : 0;
34
- let startIdx = 0;
35
- let cursorReset = false;
36
- if (cursor !== null) {
37
- const seq = parseInt(cursor, 10);
38
- if (isNaN(seq) || seq < this.startSequence) {
39
- cursorReset = true;
40
- startIdx = 0;
41
- } else {
42
- startIdx = seq - this.startSequence;
43
- }
44
- } else {
45
- startIdx = Math.max(0, this.count - limit);
46
- }
47
- const entries = [];
48
- for (let i = startIdx; i < this.count && entries.length < limit; i++) {
49
- const bufIdx = (this.head - this.count + i + this.capacity) % this.capacity;
50
- const entry = this.buffer[bufIdx];
51
- if (entry && LEVEL_ORDER[entry.level] >= minLevel) {
52
- entries.push(entry);
53
- }
54
- }
55
- const result = {
56
- entries,
57
- cursor: String(this.sequence)
58
- };
59
- if (cursorReset) result.cursor_reset = true;
60
- return result;
61
- }
62
- };
63
-
64
- // src/daemon/logger.ts
65
- var LEVEL_ORDER = {
66
- debug: 0,
67
- info: 1,
68
- warn: 2,
69
- error: 3
70
- };
71
- var DaemonLogger = class {
72
- logPath;
73
- fd = null;
74
- currentSize = 0;
75
- level;
76
- maxSize;
77
- maxFiles;
78
- logDir;
79
- ringBuffer;
80
- constructor(logDir, options = {}) {
81
- this.logDir = logDir;
82
- this.logPath = path.join(logDir, "daemon.log");
83
- this.level = options.level ?? "info";
84
- this.maxSize = options.maxSize ?? 5242880;
85
- this.maxFiles = options.maxFiles ?? 3;
86
- this.ringBuffer = new LogRingBuffer();
87
- fs.mkdirSync(logDir, { recursive: true });
88
- this.fd = fs.openSync(this.logPath, "a");
89
- try {
90
- this.currentSize = fs.fstatSync(this.fd).size;
91
- } catch {
92
- this.currentSize = 0;
93
- }
94
- }
95
- debug(component, message, data) {
96
- this.write("debug", component, message, data);
97
- }
98
- info(component, message, data) {
99
- this.write("info", component, message, data);
100
- }
101
- warn(component, message, data) {
102
- this.write("warn", component, message, data);
103
- }
104
- error(component, message, data) {
105
- this.write("error", component, message, data);
106
- }
107
- close() {
108
- if (this.fd !== null) {
109
- fs.closeSync(this.fd);
110
- this.fd = null;
111
- }
112
- }
113
- getRingBuffer() {
114
- return this.ringBuffer;
115
- }
116
- write(level, component, message, data) {
117
- if (LEVEL_ORDER[level] < LEVEL_ORDER[this.level]) return;
118
- const entry = {
119
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
120
- level,
121
- component,
122
- message,
123
- ...data
124
- };
125
- this.ringBuffer.push(entry);
126
- const line = JSON.stringify(entry) + "\n";
127
- const bytes = Buffer.byteLength(line);
128
- if (this.currentSize + bytes > this.maxSize) {
129
- this.rotate();
130
- }
131
- if (this.fd !== null) {
132
- fs.writeSync(this.fd, line);
133
- this.currentSize += bytes;
134
- }
135
- }
136
- rotate() {
137
- this.close();
138
- for (let i = this.maxFiles - 1; i >= 1; i--) {
139
- const from = path.join(this.logDir, `daemon.${i}.log`);
140
- const to = path.join(this.logDir, `daemon.${i + 1}.log`);
141
- if (fs.existsSync(from)) {
142
- if (i + 1 > this.maxFiles) {
143
- fs.unlinkSync(from);
144
- } else {
145
- fs.renameSync(from, to);
146
- }
147
- }
148
- }
149
- if (fs.existsSync(this.logPath)) {
150
- fs.renameSync(this.logPath, path.join(this.logDir, "daemon.1.log"));
151
- }
152
- this.fd = fs.openSync(this.logPath, "a");
153
- this.currentSize = 0;
154
- }
155
- };
156
-
157
- export {
158
- LEVEL_ORDER,
159
- DaemonLogger
160
- };
161
- //# sourceMappingURL=chunk-QLUE3BUL.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/daemon/logger.ts","../src/daemon/log-buffer.ts"],"sourcesContent":["import fs from 'node:fs';\nimport path from 'node:path';\nimport { LogRingBuffer } from './log-buffer.js';\n\nexport interface LogEntry {\n timestamp: string;\n level: string;\n component: string;\n message: string;\n [key: string]: unknown;\n}\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nexport const LEVEL_ORDER: Record<LogLevel, number> = {\n debug: 0, info: 1, warn: 2, error: 3,\n};\n\ninterface LoggerOptions {\n level?: LogLevel;\n maxSize?: number;\n maxFiles?: number;\n}\n\nexport class DaemonLogger {\n private logPath: string;\n private fd: number | null = null;\n private currentSize = 0;\n private level: LogLevel;\n private maxSize: number;\n private maxFiles: number;\n private logDir: string;\n private ringBuffer: LogRingBuffer;\n\n constructor(logDir: string, options: LoggerOptions = {}) {\n this.logDir = logDir;\n this.logPath = path.join(logDir, 'daemon.log');\n this.level = options.level ?? 'info';\n this.maxSize = options.maxSize ?? 5_242_880;\n this.maxFiles = options.maxFiles ?? 3;\n this.ringBuffer = new LogRingBuffer();\n\n fs.mkdirSync(logDir, { recursive: true });\n this.fd = fs.openSync(this.logPath, 'a');\n try {\n this.currentSize = fs.fstatSync(this.fd).size;\n } catch {\n this.currentSize = 0;\n }\n }\n\n debug(component: string, message: string, data?: Record<string, unknown>): void {\n this.write('debug', component, message, data);\n }\n\n info(component: string, message: string, data?: Record<string, unknown>): void {\n this.write('info', component, message, data);\n }\n\n warn(component: string, message: string, data?: Record<string, unknown>): void {\n this.write('warn', component, message, data);\n }\n\n error(component: string, message: string, data?: Record<string, unknown>): void {\n this.write('error', component, message, data);\n }\n\n close(): void {\n if (this.fd !== null) {\n fs.closeSync(this.fd);\n this.fd = null;\n }\n }\n\n getRingBuffer(): LogRingBuffer {\n return this.ringBuffer;\n }\n\n private write(level: LogLevel, component: string, message: string, data?: Record<string, unknown>): void {\n if (LEVEL_ORDER[level] < LEVEL_ORDER[this.level]) return;\n\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level,\n component,\n message,\n ...data,\n };\n\n this.ringBuffer.push(entry);\n\n const line = JSON.stringify(entry) + '\\n';\n const bytes = Buffer.byteLength(line);\n\n if (this.currentSize + bytes > this.maxSize) {\n this.rotate();\n }\n\n if (this.fd !== null) {\n fs.writeSync(this.fd, line);\n this.currentSize += bytes;\n }\n }\n\n private rotate(): void {\n this.close();\n\n for (let i = this.maxFiles - 1; i >= 1; i--) {\n const from = path.join(this.logDir, `daemon.${i}.log`);\n const to = path.join(this.logDir, `daemon.${i + 1}.log`);\n if (fs.existsSync(from)) {\n if (i + 1 > this.maxFiles) {\n fs.unlinkSync(from);\n } else {\n fs.renameSync(from, to);\n }\n }\n }\n\n if (fs.existsSync(this.logPath)) {\n fs.renameSync(this.logPath, path.join(this.logDir, 'daemon.1.log'));\n }\n\n this.fd = fs.openSync(this.logPath, 'a');\n this.currentSize = 0;\n }\n}\n","import type { LogEntry, LogLevel } from './logger.js';\nimport { LEVEL_ORDER } from './logger.js';\n\nconst LOG_RING_BUFFER_CAPACITY = 1000;\nconst LOG_QUERY_DEFAULT_LIMIT = 100;\n\ninterface LogQueryResult {\n entries: LogEntry[];\n cursor: string;\n cursor_reset?: boolean;\n}\n\ninterface LogQueryOptions {\n level?: LogLevel;\n limit?: number;\n}\n\nexport class LogRingBuffer {\n private buffer: LogEntry[];\n private head = 0;\n private count = 0;\n private sequence = 0;\n private startSequence = 0;\n private readonly capacity: number;\n\n constructor(capacity = LOG_RING_BUFFER_CAPACITY) {\n this.capacity = capacity;\n this.buffer = new Array(capacity);\n }\n\n push(entry: LogEntry): void {\n this.buffer[this.head] = entry;\n this.head = (this.head + 1) % this.capacity;\n if (this.count < this.capacity) {\n this.count++;\n } else {\n this.startSequence++;\n }\n this.sequence++;\n }\n\n since(cursor: string | null, options?: LogQueryOptions): LogQueryResult {\n const limit = options?.limit ?? LOG_QUERY_DEFAULT_LIMIT;\n const minLevel = options?.level ? LEVEL_ORDER[options.level] : 0;\n\n let startIdx = 0;\n let cursorReset = false;\n\n if (cursor !== null) {\n const seq = parseInt(cursor, 10);\n if (isNaN(seq) || seq < this.startSequence) {\n cursorReset = true;\n startIdx = 0;\n } else {\n startIdx = seq - this.startSequence;\n }\n } else {\n // No cursor: return last `limit` entries\n startIdx = Math.max(0, this.count - limit);\n }\n\n const entries: LogEntry[] = [];\n for (let i = startIdx; i < this.count && entries.length < limit; i++) {\n const bufIdx = (this.head - this.count + i + this.capacity) % this.capacity;\n const entry = this.buffer[bufIdx];\n if (entry && LEVEL_ORDER[entry.level as LogLevel] >= minLevel) {\n entries.push(entry);\n }\n }\n\n const result: LogQueryResult = {\n entries,\n cursor: String(this.sequence),\n };\n if (cursorReset) result.cursor_reset = true;\n return result;\n }\n}\n"],"mappings":";;;AAAA,OAAO,QAAQ;AACf,OAAO,UAAU;;;ACEjB,IAAM,2BAA2B;AACjC,IAAM,0BAA0B;AAazB,IAAM,gBAAN,MAAoB;AAAA,EACjB;AAAA,EACA,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,gBAAgB;AAAA,EACP;AAAA,EAEjB,YAAY,WAAW,0BAA0B;AAC/C,SAAK,WAAW;AAChB,SAAK,SAAS,IAAI,MAAM,QAAQ;AAAA,EAClC;AAAA,EAEA,KAAK,OAAuB;AAC1B,SAAK,OAAO,KAAK,IAAI,IAAI;AACzB,SAAK,QAAQ,KAAK,OAAO,KAAK,KAAK;AACnC,QAAI,KAAK,QAAQ,KAAK,UAAU;AAC9B,WAAK;AAAA,IACP,OAAO;AACL,WAAK;AAAA,IACP;AACA,SAAK;AAAA,EACP;AAAA,EAEA,MAAM,QAAuB,SAA2C;AACtE,UAAM,QAAQ,SAAS,SAAS;AAChC,UAAM,WAAW,SAAS,QAAQ,YAAY,QAAQ,KAAK,IAAI;AAE/D,QAAI,WAAW;AACf,QAAI,cAAc;AAElB,QAAI,WAAW,MAAM;AACnB,YAAM,MAAM,SAAS,QAAQ,EAAE;AAC/B,UAAI,MAAM,GAAG,KAAK,MAAM,KAAK,eAAe;AAC1C,sBAAc;AACd,mBAAW;AAAA,MACb,OAAO;AACL,mBAAW,MAAM,KAAK;AAAA,MACxB;AAAA,IACF,OAAO;AAEL,iBAAW,KAAK,IAAI,GAAG,KAAK,QAAQ,KAAK;AAAA,IAC3C;AAEA,UAAM,UAAsB,CAAC;AAC7B,aAAS,IAAI,UAAU,IAAI,KAAK,SAAS,QAAQ,SAAS,OAAO,KAAK;AACpE,YAAM,UAAU,KAAK,OAAO,KAAK,QAAQ,IAAI,KAAK,YAAY,KAAK;AACnE,YAAM,QAAQ,KAAK,OAAO,MAAM;AAChC,UAAI,SAAS,YAAY,MAAM,KAAiB,KAAK,UAAU;AAC7D,gBAAQ,KAAK,KAAK;AAAA,MACpB;AAAA,IACF;AAEA,UAAM,SAAyB;AAAA,MAC7B;AAAA,MACA,QAAQ,OAAO,KAAK,QAAQ;AAAA,IAC9B;AACA,QAAI,YAAa,QAAO,eAAe;AACvC,WAAO;AAAA,EACT;AACF;;;AD/DO,IAAM,cAAwC;AAAA,EACnD,OAAO;AAAA,EAAG,MAAM;AAAA,EAAG,MAAM;AAAA,EAAG,OAAO;AACrC;AAQO,IAAM,eAAN,MAAmB;AAAA,EAChB;AAAA,EACA,KAAoB;AAAA,EACpB,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,QAAgB,UAAyB,CAAC,GAAG;AACvD,SAAK,SAAS;AACd,SAAK,UAAU,KAAK,KAAK,QAAQ,YAAY;AAC7C,SAAK,QAAQ,QAAQ,SAAS;AAC9B,SAAK,UAAU,QAAQ,WAAW;AAClC,SAAK,WAAW,QAAQ,YAAY;AACpC,SAAK,aAAa,IAAI,cAAc;AAEpC,OAAG,UAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AACxC,SAAK,KAAK,GAAG,SAAS,KAAK,SAAS,GAAG;AACvC,QAAI;AACF,WAAK,cAAc,GAAG,UAAU,KAAK,EAAE,EAAE;AAAA,IAC3C,QAAQ;AACN,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,MAAM,WAAmB,SAAiB,MAAsC;AAC9E,SAAK,MAAM,SAAS,WAAW,SAAS,IAAI;AAAA,EAC9C;AAAA,EAEA,KAAK,WAAmB,SAAiB,MAAsC;AAC7E,SAAK,MAAM,QAAQ,WAAW,SAAS,IAAI;AAAA,EAC7C;AAAA,EAEA,KAAK,WAAmB,SAAiB,MAAsC;AAC7E,SAAK,MAAM,QAAQ,WAAW,SAAS,IAAI;AAAA,EAC7C;AAAA,EAEA,MAAM,WAAmB,SAAiB,MAAsC;AAC9E,SAAK,MAAM,SAAS,WAAW,SAAS,IAAI;AAAA,EAC9C;AAAA,EAEA,QAAc;AACZ,QAAI,KAAK,OAAO,MAAM;AACpB,SAAG,UAAU,KAAK,EAAE;AACpB,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,gBAA+B;AAC7B,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,MAAM,OAAiB,WAAmB,SAAiB,MAAsC;AACvG,QAAI,YAAY,KAAK,IAAI,YAAY,KAAK,KAAK,EAAG;AAElD,UAAM,QAAkB;AAAA,MACtB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG;AAAA,IACL;AAEA,SAAK,WAAW,KAAK,KAAK;AAE1B,UAAM,OAAO,KAAK,UAAU,KAAK,IAAI;AACrC,UAAM,QAAQ,OAAO,WAAW,IAAI;AAEpC,QAAI,KAAK,cAAc,QAAQ,KAAK,SAAS;AAC3C,WAAK,OAAO;AAAA,IACd;AAEA,QAAI,KAAK,OAAO,MAAM;AACpB,SAAG,UAAU,KAAK,IAAI,IAAI;AAC1B,WAAK,eAAe;AAAA,IACtB;AAAA,EACF;AAAA,EAEQ,SAAe;AACrB,SAAK,MAAM;AAEX,aAAS,IAAI,KAAK,WAAW,GAAG,KAAK,GAAG,KAAK;AAC3C,YAAM,OAAO,KAAK,KAAK,KAAK,QAAQ,UAAU,CAAC,MAAM;AACrD,YAAM,KAAK,KAAK,KAAK,KAAK,QAAQ,UAAU,IAAI,CAAC,MAAM;AACvD,UAAI,GAAG,WAAW,IAAI,GAAG;AACvB,YAAI,IAAI,IAAI,KAAK,UAAU;AACzB,aAAG,WAAW,IAAI;AAAA,QACpB,OAAO;AACL,aAAG,WAAW,MAAM,EAAE;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,GAAG,WAAW,KAAK,OAAO,GAAG;AAC/B,SAAG,WAAW,KAAK,SAAS,KAAK,KAAK,KAAK,QAAQ,cAAc,CAAC;AAAA,IACpE;AAEA,SAAK,KAAK,GAAG,SAAS,KAAK,SAAS,GAAG;AACvC,SAAK,cAAc;AAAA,EACrB;AACF;","names":[]}
@@ -1,43 +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/version.ts
7
- import fs from "fs";
8
- import path from "path";
9
- import { fileURLToPath } from "url";
10
- var cached;
11
- function getPluginVersion() {
12
- if (cached) return cached;
13
- const pluginRoot = new AgentRegistry().resolvePluginRoot();
14
- if (pluginRoot) {
15
- cached = readVersionFrom(pluginRoot);
16
- if (cached) return cached;
17
- }
18
- let dir = path.dirname(fileURLToPath(import.meta.url));
19
- for (let i = 0; i < 5; i++) {
20
- const version = readVersionFrom(dir);
21
- if (version) {
22
- cached = version;
23
- return cached;
24
- }
25
- dir = path.dirname(dir);
26
- }
27
- cached = readVersionFrom(process.cwd()) ?? "0.0.0";
28
- return cached;
29
- }
30
- function readVersionFrom(dir) {
31
- const pkgPath = path.join(dir, "package.json");
32
- try {
33
- const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8"));
34
- return pkg.version;
35
- } catch {
36
- return void 0;
37
- }
38
- }
39
-
40
- export {
41
- getPluginVersion
42
- };
43
- //# sourceMappingURL=chunk-QN4W3JUA.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/version.ts"],"sourcesContent":["/**\n * Resolve the plugin's package version from package.json.\n * Uses the agent registry to find the plugin root, then reads package.json.\n */\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { AgentRegistry } from './agents/registry.js';\n\nlet cached: string | undefined;\n\nexport function getPluginVersion(): string {\n if (cached) return cached;\n\n // Primary: resolve via agent env var (CLAUDE_PLUGIN_ROOT, etc.)\n const pluginRoot = new AgentRegistry().resolvePluginRoot();\n if (pluginRoot) {\n cached = readVersionFrom(pluginRoot);\n if (cached) return cached;\n }\n\n // Secondary: walk up from this file to find package.json (works for daemon)\n let dir = path.dirname(fileURLToPath(import.meta.url));\n for (let i = 0; i < 5; i++) {\n const version = readVersionFrom(dir);\n if (version) {\n cached = version;\n return cached;\n }\n dir = path.dirname(dir);\n }\n\n // Fallback: walk up from cwd\n cached = readVersionFrom(process.cwd()) ?? '0.0.0';\n return cached;\n}\n\nfunction readVersionFrom(dir: string): string | undefined {\n const pkgPath = path.join(dir, 'package.json');\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));\n return pkg.version;\n } catch {\n return undefined;\n }\n}\n"],"mappings":";;;;;;AAIA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,qBAAqB;AAG9B,IAAI;AAEG,SAAS,mBAA2B;AACzC,MAAI,OAAQ,QAAO;AAGnB,QAAM,aAAa,IAAI,cAAc,EAAE,kBAAkB;AACzD,MAAI,YAAY;AACd,aAAS,gBAAgB,UAAU;AACnC,QAAI,OAAQ,QAAO;AAAA,EACrB;AAGA,MAAI,MAAM,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AACrD,WAAS,IAAI,GAAG,IAAI,GAAG,KAAK;AAC1B,UAAM,UAAU,gBAAgB,GAAG;AACnC,QAAI,SAAS;AACX,eAAS;AACT,aAAO;AAAA,IACT;AACA,UAAM,KAAK,QAAQ,GAAG;AAAA,EACxB;AAGA,WAAS,gBAAgB,QAAQ,IAAI,CAAC,KAAK;AAC3C,SAAO;AACT;AAEA,SAAS,gBAAgB,KAAiC;AACxD,QAAM,UAAU,KAAK,KAAK,KAAK,cAAc;AAC7C,MAAI;AACF,UAAM,MAAM,KAAK,MAAM,GAAG,aAAa,SAAS,OAAO,CAAC;AACxD,WAAO,IAAI;AAAA,EACb,QAAQ;AACN,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -1,21 +0,0 @@
1
- import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
-
3
- // src/intelligence/embeddings.ts
4
- async function generateEmbedding(backend, text) {
5
- const raw = await backend.embed(text);
6
- return {
7
- embedding: normalize(raw.embedding),
8
- model: raw.model,
9
- dimensions: raw.dimensions
10
- };
11
- }
12
- function normalize(vec) {
13
- const magnitude = Math.sqrt(vec.reduce((sum, v) => sum + v * v, 0));
14
- if (magnitude === 0) return vec;
15
- return vec.map((v) => v / magnitude);
16
- }
17
-
18
- export {
19
- generateEmbedding
20
- };
21
- //# sourceMappingURL=chunk-RGVBGTD6.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/intelligence/embeddings.ts"],"sourcesContent":["import type { EmbeddingProvider, EmbeddingResponse } from './llm.js';\n\nexport async function generateEmbedding(\n backend: EmbeddingProvider,\n text: string,\n): Promise<EmbeddingResponse> {\n const raw = await backend.embed(text);\n return {\n embedding: normalize(raw.embedding),\n model: raw.model,\n dimensions: raw.dimensions,\n };\n}\n\nfunction normalize(vec: number[]): number[] {\n const magnitude = Math.sqrt(vec.reduce((sum, v) => sum + v * v, 0));\n if (magnitude === 0) return vec;\n return vec.map((v) => v / magnitude);\n}\n"],"mappings":";;;AAEA,eAAsB,kBACpB,SACA,MAC4B;AAC5B,QAAM,MAAM,MAAM,QAAQ,MAAM,IAAI;AACpC,SAAO;AAAA,IACL,WAAW,UAAU,IAAI,SAAS;AAAA,IAClC,OAAO,IAAI;AAAA,IACX,YAAY,IAAI;AAAA,EAClB;AACF;AAEA,SAAS,UAAU,KAAyB;AAC1C,QAAM,YAAY,KAAK,KAAK,IAAI,OAAO,CAAC,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,CAAC;AAClE,MAAI,cAAc,EAAG,QAAO;AAC5B,SAAO,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS;AACrC;","names":[]}
@@ -1,132 +0,0 @@
1
- import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
-
3
- // src/index/sqlite.ts
4
- import Database from "better-sqlite3";
5
- var MycoIndex = class {
6
- db;
7
- constructor(dbPath) {
8
- this.db = new Database(dbPath);
9
- this.db.pragma("journal_mode = WAL");
10
- this.db.pragma("foreign_keys = ON");
11
- this.init();
12
- }
13
- init() {
14
- this.db.exec(`
15
- CREATE TABLE IF NOT EXISTS notes (
16
- path TEXT PRIMARY KEY,
17
- type TEXT NOT NULL,
18
- id TEXT NOT NULL,
19
- title TEXT NOT NULL DEFAULT '',
20
- content TEXT NOT NULL DEFAULT '',
21
- frontmatter TEXT NOT NULL DEFAULT '{}',
22
- created TEXT NOT NULL,
23
- updated_at TEXT NOT NULL DEFAULT (datetime('now'))
24
- );
25
-
26
- CREATE INDEX IF NOT EXISTS idx_notes_type ON notes(type);
27
- CREATE INDEX IF NOT EXISTS idx_notes_id ON notes(id);
28
- CREATE INDEX IF NOT EXISTS idx_notes_created ON notes(created);
29
- CREATE INDEX IF NOT EXISTS idx_notes_updated_at ON notes(updated_at);
30
- `);
31
- }
32
- getPragma(name) {
33
- return this.db.pragma(`${name}`, { simple: true });
34
- }
35
- getDb() {
36
- return this.db;
37
- }
38
- upsertNote(note) {
39
- const stmt = this.db.prepare(`
40
- INSERT INTO notes (path, type, id, title, content, frontmatter, created, updated_at)
41
- VALUES (?, ?, ?, ?, ?, ?, ?, datetime('now'))
42
- ON CONFLICT(path) DO UPDATE SET
43
- type = excluded.type,
44
- id = excluded.id,
45
- title = excluded.title,
46
- content = excluded.content,
47
- frontmatter = excluded.frontmatter,
48
- created = excluded.created,
49
- updated_at = datetime('now')
50
- `);
51
- stmt.run(
52
- note.path,
53
- note.type,
54
- note.id,
55
- note.title,
56
- note.content,
57
- JSON.stringify(note.frontmatter),
58
- note.created
59
- );
60
- }
61
- getNoteByPath(notePath) {
62
- const row = this.db.prepare("SELECT * FROM notes WHERE path = ?").get(notePath);
63
- if (!row) return null;
64
- return { ...row, frontmatter: JSON.parse(row.frontmatter) };
65
- }
66
- deleteNote(notePath) {
67
- this.db.prepare("DELETE FROM notes WHERE path = ?").run(notePath);
68
- }
69
- query(options) {
70
- const conditions = [];
71
- const params = [];
72
- if (options.type) {
73
- conditions.push("type = ?");
74
- params.push(options.type);
75
- }
76
- if (options.id) {
77
- conditions.push("id = ?");
78
- params.push(options.id);
79
- }
80
- if (options.since) {
81
- conditions.push("created >= ?");
82
- params.push(options.since);
83
- }
84
- if (options.updatedSince) {
85
- conditions.push("updated_at >= datetime(?)");
86
- params.push(options.updatedSince);
87
- }
88
- if (options.frontmatter) {
89
- for (const [key, value] of Object.entries(options.frontmatter)) {
90
- conditions.push(`json_extract(frontmatter, '$.' || ?) = ?`);
91
- params.push(key, value);
92
- }
93
- }
94
- const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
95
- const limitClause = options.limit ? "LIMIT ?" : "";
96
- if (options.limit) params.push(options.limit);
97
- const sql = `SELECT * FROM notes ${where} ORDER BY created DESC ${limitClause}`;
98
- const rows = this.db.prepare(sql).all(...params);
99
- return rows.map((row) => ({ ...row, frontmatter: JSON.parse(row.frontmatter) }));
100
- }
101
- queryByIds(ids) {
102
- if (ids.length === 0) return [];
103
- const placeholders = ids.map(() => "?").join(",");
104
- const sql = `SELECT * FROM notes WHERE id IN (${placeholders})`;
105
- const rows = this.db.prepare(sql).all(...ids);
106
- return rows.map((row) => ({ ...row, frontmatter: JSON.parse(row.frontmatter) }));
107
- }
108
- /** Count notes by type using SQL aggregation (much faster than materializing all rows). */
109
- countByType() {
110
- const rows = this.db.prepare("SELECT type, COUNT(*) as count FROM notes GROUP BY type").all();
111
- const result = {};
112
- for (const row of rows) result[row.type] = row.count;
113
- return result;
114
- }
115
- /** Count spores grouped by observation_type. */
116
- sporeCountsByObservationType() {
117
- const rows = this.db.prepare(
118
- "SELECT json_extract(frontmatter, '$.observation_type') as obs_type, COUNT(*) as count FROM notes WHERE type = 'spore' GROUP BY obs_type"
119
- ).all();
120
- const result = {};
121
- for (const row of rows) result[row.obs_type ?? "unknown"] = row.count;
122
- return result;
123
- }
124
- close() {
125
- this.db.close();
126
- }
127
- };
128
-
129
- export {
130
- MycoIndex
131
- };
132
- //# sourceMappingURL=chunk-TWSTAVLO.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index/sqlite.ts"],"sourcesContent":["import Database from 'better-sqlite3';\n\nexport interface IndexedNote {\n path: string;\n type: string;\n id: string;\n title: string;\n content: string;\n frontmatter: Record<string, unknown>;\n created: string;\n updated_at?: string;\n}\n\nexport interface QueryOptions {\n type?: string;\n id?: string;\n limit?: number;\n since?: string;\n /** Filter by updated_at — returns notes with updated_at >= this ISO string. */\n updatedSince?: string;\n /** Filter by frontmatter fields using json_extract. Applied before LIMIT. */\n frontmatter?: Record<string, string>;\n}\n\nexport class MycoIndex {\n private db: Database.Database;\n\n constructor(dbPath: string) {\n this.db = new Database(dbPath);\n this.db.pragma('journal_mode = WAL');\n this.db.pragma('foreign_keys = ON');\n this.init();\n }\n\n private init(): void {\n this.db.exec(`\n CREATE TABLE IF NOT EXISTS notes (\n path TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n id TEXT NOT NULL,\n title TEXT NOT NULL DEFAULT '',\n content TEXT NOT NULL DEFAULT '',\n frontmatter TEXT NOT NULL DEFAULT '{}',\n created TEXT NOT NULL,\n updated_at TEXT NOT NULL DEFAULT (datetime('now'))\n );\n\n CREATE INDEX IF NOT EXISTS idx_notes_type ON notes(type);\n CREATE INDEX IF NOT EXISTS idx_notes_id ON notes(id);\n CREATE INDEX IF NOT EXISTS idx_notes_created ON notes(created);\n CREATE INDEX IF NOT EXISTS idx_notes_updated_at ON notes(updated_at);\n `);\n }\n\n getPragma(name: string): unknown {\n return this.db.pragma(`${name}`, { simple: true });\n }\n\n getDb(): Database.Database {\n return this.db;\n }\n\n upsertNote(note: Omit<IndexedNote, 'updated_at'>): void {\n const stmt = this.db.prepare(`\n INSERT INTO notes (path, type, id, title, content, frontmatter, created, updated_at)\n VALUES (?, ?, ?, ?, ?, ?, ?, datetime('now'))\n ON CONFLICT(path) DO UPDATE SET\n type = excluded.type,\n id = excluded.id,\n title = excluded.title,\n content = excluded.content,\n frontmatter = excluded.frontmatter,\n created = excluded.created,\n updated_at = datetime('now')\n `);\n stmt.run(\n note.path,\n note.type,\n note.id,\n note.title,\n note.content,\n JSON.stringify(note.frontmatter),\n note.created,\n );\n }\n\n getNoteByPath(notePath: string): IndexedNote | null {\n const row = this.db.prepare('SELECT * FROM notes WHERE path = ?').get(notePath) as any;\n if (!row) return null;\n return { ...row, frontmatter: JSON.parse(row.frontmatter) };\n }\n\n deleteNote(notePath: string): void {\n this.db.prepare('DELETE FROM notes WHERE path = ?').run(notePath);\n }\n\n query(options: QueryOptions): IndexedNote[] {\n const conditions: string[] = [];\n const params: unknown[] = [];\n\n if (options.type) {\n conditions.push('type = ?');\n params.push(options.type);\n }\n if (options.id) {\n conditions.push('id = ?');\n params.push(options.id);\n }\n if (options.since) {\n conditions.push('created >= ?');\n params.push(options.since);\n }\n if (options.updatedSince) {\n // Use SQLite datetime() to handle ISO 8601 formats (Z-suffix, offsets, milliseconds)\n conditions.push('updated_at >= datetime(?)');\n params.push(options.updatedSince);\n }\n if (options.frontmatter) {\n for (const [key, value] of Object.entries(options.frontmatter)) {\n conditions.push(`json_extract(frontmatter, '$.' || ?) = ?`);\n params.push(key, value);\n }\n }\n\n const where = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';\n const limitClause = options.limit ? 'LIMIT ?' : '';\n if (options.limit) params.push(options.limit);\n const sql = `SELECT * FROM notes ${where} ORDER BY created DESC ${limitClause}`;\n\n const rows = this.db.prepare(sql).all(...params) as any[];\n return rows.map((row) => ({ ...row, frontmatter: JSON.parse(row.frontmatter) }));\n }\n\n queryByIds(ids: string[]): IndexedNote[] {\n if (ids.length === 0) return [];\n const placeholders = ids.map(() => '?').join(',');\n const sql = `SELECT * FROM notes WHERE id IN (${placeholders})`;\n const rows = this.db.prepare(sql).all(...ids) as any[];\n return rows.map((row) => ({ ...row, frontmatter: JSON.parse(row.frontmatter) }));\n }\n\n /** Count notes by type using SQL aggregation (much faster than materializing all rows). */\n countByType(): Record<string, number> {\n const rows = this.db.prepare('SELECT type, COUNT(*) as count FROM notes GROUP BY type').all() as Array<{ type: string; count: number }>;\n const result: Record<string, number> = {};\n for (const row of rows) result[row.type] = row.count;\n return result;\n }\n\n /** Count spores grouped by observation_type. */\n sporeCountsByObservationType(): Record<string, number> {\n const rows = this.db.prepare(\n \"SELECT json_extract(frontmatter, '$.observation_type') as obs_type, COUNT(*) as count FROM notes WHERE type = 'spore' GROUP BY obs_type\"\n ).all() as Array<{ obs_type: string | null; count: number }>;\n const result: Record<string, number> = {};\n for (const row of rows) result[row.obs_type ?? 'unknown'] = row.count;\n return result;\n }\n\n close(): void {\n this.db.close();\n }\n}\n"],"mappings":"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","names":[]}