@goondocks/myco 0.2.6 → 0.2.8

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 (290) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/CONTRIBUTING.md +1 -1
  3. package/commands/init.md +10 -26
  4. package/dist/chunk-4JML636J.js +52 -0
  5. package/dist/chunk-4JML636J.js.map +1 -0
  6. package/dist/chunk-AOMX45LH.js +8974 -0
  7. package/dist/chunk-AOMX45LH.js.map +1 -0
  8. package/dist/chunk-I7PMGO6S.js +58 -0
  9. package/dist/chunk-I7PMGO6S.js.map +1 -0
  10. package/dist/chunk-N33KUCFP.js +33 -0
  11. package/dist/chunk-N33KUCFP.js.map +1 -0
  12. package/dist/chunk-NYNEJ5QY.js +71 -0
  13. package/dist/chunk-NYNEJ5QY.js.map +1 -0
  14. package/dist/chunk-PA3VMINE.js +111 -0
  15. package/dist/chunk-PA3VMINE.js.map +1 -0
  16. package/dist/chunk-PZUWP5VK.js +44 -0
  17. package/dist/chunk-PZUWP5VK.js.map +1 -0
  18. package/dist/chunk-SVUINMDD.js +104 -0
  19. package/dist/chunk-SVUINMDD.js.map +1 -0
  20. package/dist/chunk-TH6GIBXG.js +91 -0
  21. package/dist/chunk-TH6GIBXG.js.map +1 -0
  22. package/dist/chunk-TWDS6MSU.js +354 -0
  23. package/dist/chunk-TWDS6MSU.js.map +1 -0
  24. package/dist/chunk-UIIZRTJU.js +21172 -0
  25. package/dist/chunk-UIIZRTJU.js.map +1 -0
  26. package/dist/chunk-YMYJ7FNH.js +19 -0
  27. package/dist/chunk-YMYJ7FNH.js.map +1 -0
  28. package/dist/chunk-ZJQ5G637.js +21 -0
  29. package/dist/chunk-ZJQ5G637.js.map +1 -0
  30. package/dist/chunk-ZTZVX5E6.js +421 -0
  31. package/dist/chunk-ZTZVX5E6.js.map +1 -0
  32. package/dist/cli-K5FSKLQC.js +625 -0
  33. package/dist/cli-K5FSKLQC.js.map +1 -0
  34. package/dist/client-4JMOYNKK.js +11 -0
  35. package/dist/client-4JMOYNKK.js.map +1 -0
  36. package/dist/main-5W4ADOBG.js +3224 -0
  37. package/dist/main-5W4ADOBG.js.map +1 -0
  38. package/dist/server-PIEPVUUH.js +14725 -0
  39. package/dist/server-PIEPVUUH.js.map +1 -0
  40. package/dist/session-start-2NNQHT5S.js +189 -0
  41. package/dist/session-start-2NNQHT5S.js.map +1 -0
  42. package/dist/src/cli.js +9 -582
  43. package/dist/src/cli.js.map +1 -1
  44. package/dist/src/daemon/main.js +9 -737
  45. package/dist/src/daemon/main.js.map +1 -1
  46. package/dist/src/hooks/post-tool-use.js +47 -35
  47. package/dist/src/hooks/post-tool-use.js.map +1 -1
  48. package/dist/src/hooks/session-end.js +29 -18
  49. package/dist/src/hooks/session-end.js.map +1 -1
  50. package/dist/src/hooks/session-start.js +9 -48
  51. package/dist/src/hooks/session-start.js.map +1 -1
  52. package/dist/src/hooks/stop.js +39 -30
  53. package/dist/src/hooks/stop.js.map +1 -1
  54. package/dist/src/hooks/user-prompt-submit.js +48 -40
  55. package/dist/src/hooks/user-prompt-submit.js.map +1 -1
  56. package/dist/src/mcp/server.js +9 -304
  57. package/dist/src/mcp/server.js.map +1 -1
  58. package/package.json +3 -2
  59. package/dist/src/agents/adapter.d.ts +0 -76
  60. package/dist/src/agents/adapter.d.ts.map +0 -1
  61. package/dist/src/agents/adapter.js +0 -124
  62. package/dist/src/agents/adapter.js.map +0 -1
  63. package/dist/src/agents/claude-code.d.ts +0 -3
  64. package/dist/src/agents/claude-code.d.ts.map +0 -1
  65. package/dist/src/agents/claude-code.js +0 -22
  66. package/dist/src/agents/claude-code.js.map +0 -1
  67. package/dist/src/agents/cursor.d.ts +0 -3
  68. package/dist/src/agents/cursor.d.ts.map +0 -1
  69. package/dist/src/agents/cursor.js +0 -154
  70. package/dist/src/agents/cursor.js.map +0 -1
  71. package/dist/src/agents/index.d.ts +0 -6
  72. package/dist/src/agents/index.d.ts.map +0 -1
  73. package/dist/src/agents/index.js +0 -5
  74. package/dist/src/agents/index.js.map +0 -1
  75. package/dist/src/agents/registry.d.ts +0 -34
  76. package/dist/src/agents/registry.d.ts.map +0 -1
  77. package/dist/src/agents/registry.js +0 -95
  78. package/dist/src/agents/registry.js.map +0 -1
  79. package/dist/src/artifacts/candidates.d.ts +0 -20
  80. package/dist/src/artifacts/candidates.d.ts.map +0 -1
  81. package/dist/src/artifacts/candidates.js +0 -84
  82. package/dist/src/artifacts/candidates.js.map +0 -1
  83. package/dist/src/artifacts/slugify.d.ts +0 -2
  84. package/dist/src/artifacts/slugify.d.ts.map +0 -1
  85. package/dist/src/artifacts/slugify.js +0 -22
  86. package/dist/src/artifacts/slugify.js.map +0 -1
  87. package/dist/src/capture/buffer.d.ts +0 -20
  88. package/dist/src/capture/buffer.d.ts.map +0 -1
  89. package/dist/src/capture/buffer.js +0 -55
  90. package/dist/src/capture/buffer.js.map +0 -1
  91. package/dist/src/capture/transcript-miner.d.ts +0 -31
  92. package/dist/src/capture/transcript-miner.d.ts.map +0 -1
  93. package/dist/src/capture/transcript-miner.js +0 -61
  94. package/dist/src/capture/transcript-miner.js.map +0 -1
  95. package/dist/src/cli.d.ts +0 -3
  96. package/dist/src/cli.d.ts.map +0 -1
  97. package/dist/src/config/loader.d.ts +0 -4
  98. package/dist/src/config/loader.d.ts.map +0 -1
  99. package/dist/src/config/loader.js +0 -32
  100. package/dist/src/config/loader.js.map +0 -1
  101. package/dist/src/config/schema.d.ts +0 -83
  102. package/dist/src/config/schema.d.ts.map +0 -1
  103. package/dist/src/config/schema.js +0 -55
  104. package/dist/src/config/schema.js.map +0 -1
  105. package/dist/src/constants.d.ts +0 -73
  106. package/dist/src/constants.d.ts.map +0 -1
  107. package/dist/src/constants.js +0 -86
  108. package/dist/src/constants.js.map +0 -1
  109. package/dist/src/context/injector.d.ts +0 -18
  110. package/dist/src/context/injector.d.ts.map +0 -1
  111. package/dist/src/context/injector.js +0 -71
  112. package/dist/src/context/injector.js.map +0 -1
  113. package/dist/src/context/relevance.d.ts +0 -13
  114. package/dist/src/context/relevance.d.ts.map +0 -1
  115. package/dist/src/context/relevance.js +0 -44
  116. package/dist/src/context/relevance.js.map +0 -1
  117. package/dist/src/daemon/batch.d.ts +0 -22
  118. package/dist/src/daemon/batch.d.ts.map +0 -1
  119. package/dist/src/daemon/batch.js +0 -38
  120. package/dist/src/daemon/batch.js.map +0 -1
  121. package/dist/src/daemon/lifecycle.d.ts +0 -27
  122. package/dist/src/daemon/lifecycle.d.ts.map +0 -1
  123. package/dist/src/daemon/lifecycle.js +0 -50
  124. package/dist/src/daemon/lifecycle.js.map +0 -1
  125. package/dist/src/daemon/lineage.d.ts +0 -42
  126. package/dist/src/daemon/lineage.d.ts.map +0 -1
  127. package/dist/src/daemon/lineage.js +0 -116
  128. package/dist/src/daemon/lineage.js.map +0 -1
  129. package/dist/src/daemon/logger.d.ts +0 -33
  130. package/dist/src/daemon/logger.d.ts.map +0 -1
  131. package/dist/src/daemon/logger.js +0 -88
  132. package/dist/src/daemon/logger.js.map +0 -1
  133. package/dist/src/daemon/main.d.ts +0 -2
  134. package/dist/src/daemon/main.d.ts.map +0 -1
  135. package/dist/src/daemon/processor.d.ts +0 -44
  136. package/dist/src/daemon/processor.d.ts.map +0 -1
  137. package/dist/src/daemon/processor.js +0 -142
  138. package/dist/src/daemon/processor.js.map +0 -1
  139. package/dist/src/daemon/server.d.ts +0 -24
  140. package/dist/src/daemon/server.d.ts.map +0 -1
  141. package/dist/src/daemon/server.js +0 -117
  142. package/dist/src/daemon/server.js.map +0 -1
  143. package/dist/src/daemon/watcher.d.ts +0 -29
  144. package/dist/src/daemon/watcher.d.ts.map +0 -1
  145. package/dist/src/daemon/watcher.js +0 -67
  146. package/dist/src/daemon/watcher.js.map +0 -1
  147. package/dist/src/hooks/client.d.ts +0 -20
  148. package/dist/src/hooks/client.d.ts.map +0 -1
  149. package/dist/src/hooks/client.js +0 -111
  150. package/dist/src/hooks/client.js.map +0 -1
  151. package/dist/src/hooks/post-tool-use.d.ts +0 -2
  152. package/dist/src/hooks/post-tool-use.d.ts.map +0 -1
  153. package/dist/src/hooks/read-stdin.d.ts +0 -2
  154. package/dist/src/hooks/read-stdin.d.ts.map +0 -1
  155. package/dist/src/hooks/read-stdin.js +0 -10
  156. package/dist/src/hooks/read-stdin.js.map +0 -1
  157. package/dist/src/hooks/session-end.d.ts +0 -2
  158. package/dist/src/hooks/session-end.d.ts.map +0 -1
  159. package/dist/src/hooks/session-start.d.ts +0 -2
  160. package/dist/src/hooks/session-start.d.ts.map +0 -1
  161. package/dist/src/hooks/stop.d.ts +0 -2
  162. package/dist/src/hooks/stop.d.ts.map +0 -1
  163. package/dist/src/hooks/user-prompt-submit.d.ts +0 -2
  164. package/dist/src/hooks/user-prompt-submit.d.ts.map +0 -1
  165. package/dist/src/index/fts.d.ts +0 -16
  166. package/dist/src/index/fts.d.ts.map +0 -1
  167. package/dist/src/index/fts.js +0 -53
  168. package/dist/src/index/fts.js.map +0 -1
  169. package/dist/src/index/rebuild.d.ts +0 -4
  170. package/dist/src/index/rebuild.d.ts.map +0 -1
  171. package/dist/src/index/rebuild.js +0 -40
  172. package/dist/src/index/rebuild.js.map +0 -1
  173. package/dist/src/index/sqlite.d.ts +0 -33
  174. package/dist/src/index/sqlite.d.ts.map +0 -1
  175. package/dist/src/index/sqlite.js +0 -99
  176. package/dist/src/index/sqlite.js.map +0 -1
  177. package/dist/src/index/vectors.d.ts +0 -24
  178. package/dist/src/index/vectors.d.ts.map +0 -1
  179. package/dist/src/index/vectors.js +0 -97
  180. package/dist/src/index/vectors.js.map +0 -1
  181. package/dist/src/intelligence/anthropic.d.ts +0 -17
  182. package/dist/src/intelligence/anthropic.d.ts.map +0 -1
  183. package/dist/src/intelligence/anthropic.js +0 -36
  184. package/dist/src/intelligence/anthropic.js.map +0 -1
  185. package/dist/src/intelligence/embeddings.d.ts +0 -3
  186. package/dist/src/intelligence/embeddings.d.ts.map +0 -1
  187. package/dist/src/intelligence/embeddings.js +0 -15
  188. package/dist/src/intelligence/embeddings.js.map +0 -1
  189. package/dist/src/intelligence/llm.d.ts +0 -33
  190. package/dist/src/intelligence/llm.d.ts.map +0 -1
  191. package/dist/src/intelligence/llm.js +0 -26
  192. package/dist/src/intelligence/llm.js.map +0 -1
  193. package/dist/src/intelligence/lm-studio.d.ts +0 -20
  194. package/dist/src/intelligence/lm-studio.d.ts.map +0 -1
  195. package/dist/src/intelligence/lm-studio.js +0 -59
  196. package/dist/src/intelligence/lm-studio.js.map +0 -1
  197. package/dist/src/intelligence/ollama.d.ts +0 -22
  198. package/dist/src/intelligence/ollama.d.ts.map +0 -1
  199. package/dist/src/intelligence/ollama.js +0 -64
  200. package/dist/src/intelligence/ollama.js.map +0 -1
  201. package/dist/src/intelligence/response.d.ts +0 -29
  202. package/dist/src/intelligence/response.d.ts.map +0 -1
  203. package/dist/src/intelligence/response.js +0 -71
  204. package/dist/src/intelligence/response.js.map +0 -1
  205. package/dist/src/logs/format.d.ts +0 -6
  206. package/dist/src/logs/format.d.ts.map +0 -1
  207. package/dist/src/logs/format.js +0 -46
  208. package/dist/src/logs/format.js.map +0 -1
  209. package/dist/src/logs/reader.d.ts +0 -28
  210. package/dist/src/logs/reader.d.ts.map +0 -1
  211. package/dist/src/logs/reader.js +0 -106
  212. package/dist/src/logs/reader.js.map +0 -1
  213. package/dist/src/mcp/server.d.ts +0 -16
  214. package/dist/src/mcp/server.d.ts.map +0 -1
  215. package/dist/src/mcp/tools/consolidate.d.ts +0 -15
  216. package/dist/src/mcp/tools/consolidate.d.ts.map +0 -1
  217. package/dist/src/mcp/tools/consolidate.js +0 -49
  218. package/dist/src/mcp/tools/consolidate.js.map +0 -1
  219. package/dist/src/mcp/tools/graph.d.ts +0 -30
  220. package/dist/src/mcp/tools/graph.d.ts.map +0 -1
  221. package/dist/src/mcp/tools/graph.js +0 -106
  222. package/dist/src/mcp/tools/graph.js.map +0 -1
  223. package/dist/src/mcp/tools/logs.d.ts +0 -3
  224. package/dist/src/mcp/tools/logs.d.ts.map +0 -1
  225. package/dist/src/mcp/tools/logs.js +0 -7
  226. package/dist/src/mcp/tools/logs.js.map +0 -1
  227. package/dist/src/mcp/tools/plans.d.ts +0 -23
  228. package/dist/src/mcp/tools/plans.d.ts.map +0 -1
  229. package/dist/src/mcp/tools/plans.js +0 -63
  230. package/dist/src/mcp/tools/plans.js.map +0 -1
  231. package/dist/src/mcp/tools/recall.d.ts +0 -30
  232. package/dist/src/mcp/tools/recall.d.ts.map +0 -1
  233. package/dist/src/mcp/tools/recall.js +0 -34
  234. package/dist/src/mcp/tools/recall.js.map +0 -1
  235. package/dist/src/mcp/tools/remember.d.ts +0 -15
  236. package/dist/src/mcp/tools/remember.d.ts.map +0 -1
  237. package/dist/src/mcp/tools/remember.js +0 -18
  238. package/dist/src/mcp/tools/remember.js.map +0 -1
  239. package/dist/src/mcp/tools/search.d.ts +0 -19
  240. package/dist/src/mcp/tools/search.d.ts.map +0 -1
  241. package/dist/src/mcp/tools/search.js +0 -59
  242. package/dist/src/mcp/tools/search.js.map +0 -1
  243. package/dist/src/mcp/tools/sessions.d.ts +0 -21
  244. package/dist/src/mcp/tools/sessions.d.ts.map +0 -1
  245. package/dist/src/mcp/tools/sessions.js +0 -36
  246. package/dist/src/mcp/tools/sessions.js.map +0 -1
  247. package/dist/src/mcp/tools/supersede.d.ts +0 -14
  248. package/dist/src/mcp/tools/supersede.d.ts.map +0 -1
  249. package/dist/src/mcp/tools/supersede.js +0 -30
  250. package/dist/src/mcp/tools/supersede.js.map +0 -1
  251. package/dist/src/mcp/tools/team.d.ts +0 -16
  252. package/dist/src/mcp/tools/team.d.ts.map +0 -1
  253. package/dist/src/mcp/tools/team.js +0 -32
  254. package/dist/src/mcp/tools/team.js.map +0 -1
  255. package/dist/src/obsidian/formatter.d.ts +0 -80
  256. package/dist/src/obsidian/formatter.d.ts.map +0 -1
  257. package/dist/src/obsidian/formatter.js +0 -227
  258. package/dist/src/obsidian/formatter.js.map +0 -1
  259. package/dist/src/prompts/index.d.ts +0 -13
  260. package/dist/src/prompts/index.d.ts.map +0 -1
  261. package/dist/src/prompts/index.js +0 -75
  262. package/dist/src/prompts/index.js.map +0 -1
  263. package/dist/src/vault/frontmatter.d.ts +0 -6
  264. package/dist/src/vault/frontmatter.d.ts.map +0 -1
  265. package/dist/src/vault/frontmatter.js +0 -10
  266. package/dist/src/vault/frontmatter.js.map +0 -1
  267. package/dist/src/vault/observations.d.ts +0 -10
  268. package/dist/src/vault/observations.d.ts.map +0 -1
  269. package/dist/src/vault/observations.js +0 -33
  270. package/dist/src/vault/observations.js.map +0 -1
  271. package/dist/src/vault/reader.d.ts +0 -10
  272. package/dist/src/vault/reader.d.ts.map +0 -1
  273. package/dist/src/vault/reader.js +0 -48
  274. package/dist/src/vault/reader.js.map +0 -1
  275. package/dist/src/vault/resolve.d.ts +0 -18
  276. package/dist/src/vault/resolve.d.ts.map +0 -1
  277. package/dist/src/vault/resolve.js +0 -51
  278. package/dist/src/vault/resolve.js.map +0 -1
  279. package/dist/src/vault/session-id.d.ts +0 -16
  280. package/dist/src/vault/session-id.d.ts.map +0 -1
  281. package/dist/src/vault/session-id.js +0 -29
  282. package/dist/src/vault/session-id.js.map +0 -1
  283. package/dist/src/vault/types.d.ts +0 -88
  284. package/dist/src/vault/types.d.ts.map +0 -1
  285. package/dist/src/vault/types.js +0 -94
  286. package/dist/src/vault/types.js.map +0 -1
  287. package/dist/src/vault/writer.d.ts +0 -66
  288. package/dist/src/vault/writer.d.ts.map +0 -1
  289. package/dist/src/vault/writer.js +0 -217
  290. package/dist/src/vault/writer.js.map +0 -1
@@ -0,0 +1,625 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
3
+ import {
4
+ DEFAULT_LOG_TAIL,
5
+ matchesFilter,
6
+ queryLogs
7
+ } from "./chunk-TH6GIBXG.js";
8
+ import {
9
+ LEVEL_ORDER,
10
+ VectorIndex,
11
+ createEmbeddingProvider,
12
+ generateEmbedding,
13
+ initFts,
14
+ rebuildIndex,
15
+ searchFts
16
+ } from "./chunk-AOMX45LH.js";
17
+ import {
18
+ MycoIndex
19
+ } from "./chunk-PA3VMINE.js";
20
+ import {
21
+ loadConfig,
22
+ require_dist
23
+ } from "./chunk-UIIZRTJU.js";
24
+ import {
25
+ resolveVaultDir
26
+ } from "./chunk-N33KUCFP.js";
27
+ import {
28
+ AgentRegistry
29
+ } from "./chunk-TWDS6MSU.js";
30
+ import {
31
+ EMBEDDING_INPUT_LIMIT
32
+ } from "./chunk-NYNEJ5QY.js";
33
+ import {
34
+ __toESM
35
+ } from "./chunk-PZUWP5VK.js";
36
+
37
+ // src/cli.ts
38
+ import fs from "fs";
39
+ import path from "path";
40
+ import os from "os";
41
+
42
+ // src/logs/format.ts
43
+ var LOG_VALUE_MAX_DISPLAY = 80;
44
+ var CORE_FIELDS = ["timestamp", "level", "component", "message"];
45
+ function formatLogLine(entry) {
46
+ const time = formatLocalTime(entry.timestamp);
47
+ const lvl = entry.level.toUpperCase().padEnd(5);
48
+ const comp = `[${entry.component}]`.padEnd(14);
49
+ const extras = [];
50
+ for (const [key, value] of Object.entries(entry)) {
51
+ if (CORE_FIELDS.includes(key)) continue;
52
+ const str = String(value);
53
+ const display = str.length > LOG_VALUE_MAX_DISPLAY ? str.slice(0, LOG_VALUE_MAX_DISPLAY) + "..." : str;
54
+ extras.push(`${key}=${display}`);
55
+ }
56
+ const extraStr = extras.length > 0 ? " " + extras.join(" ") : "";
57
+ return `${time} ${lvl} ${comp} ${entry.message}${extraStr}`;
58
+ }
59
+ function formatLocalTime(iso) {
60
+ const d = new Date(iso);
61
+ const hh = String(d.getHours()).padStart(2, "0");
62
+ const mm = String(d.getMinutes()).padStart(2, "0");
63
+ const ss = String(d.getSeconds()).padStart(2, "0");
64
+ return `${hh}:${mm}:${ss}`;
65
+ }
66
+ function parseIntFlag(args, long, short) {
67
+ for (let i = 0; i < args.length; i++) {
68
+ if (args[i] === long || short && args[i] === short) {
69
+ const val = parseInt(args[i + 1], 10);
70
+ return isNaN(val) ? void 0 : val;
71
+ }
72
+ }
73
+ return void 0;
74
+ }
75
+ function parseStringFlag(args, long, short) {
76
+ for (let i = 0; i < args.length; i++) {
77
+ if (args[i] === long || short && args[i] === short) {
78
+ return args[i + 1];
79
+ }
80
+ }
81
+ return void 0;
82
+ }
83
+
84
+ // src/cli.ts
85
+ var import_yaml = __toESM(require_dist(), 1);
86
+ function loadEnv() {
87
+ const envPath = path.resolve(process.cwd(), ".env");
88
+ if (!fs.existsSync(envPath)) return;
89
+ for (const line of fs.readFileSync(envPath, "utf-8").split("\n")) {
90
+ const match = line.match(/^\s*([^#=]+?)\s*=\s*(.*?)\s*$/);
91
+ if (match && !process.env[match[1]]) {
92
+ process.env[match[1]] = match[2];
93
+ }
94
+ }
95
+ }
96
+ loadEnv();
97
+ var USAGE = `Usage: myco <command> [args]
98
+
99
+ Commands:
100
+ init [options] Initialize a new vault
101
+ stats Vault health, index counts, vector count
102
+ search <query> Combined FTS + vector search with scores
103
+ vectors <query> Raw vector search with similarity scores
104
+ session [id|latest] Show a session note
105
+ logs [options] View daemon logs (--tail N, --follow, --level, --component)
106
+ restart Restart the daemon with current code
107
+ rebuild Reindex the entire vault
108
+
109
+ Init options:
110
+ --vault <path> Vault directory (default: .myco/ in project root)
111
+ --llm-provider <name> LLM provider: ollama, lm-studio, anthropic
112
+ --llm-model <name> LLM model name (e.g., gpt-oss)
113
+ --llm-url <url> LLM base URL (default per provider)
114
+ --embedding-provider <name> Embedding provider: ollama, lm-studio
115
+ --embedding-model <name> Embedding model name (e.g., bge-m3)
116
+ --embedding-url <url> Embedding base URL (default per provider)
117
+ --user <name> Team username
118
+ --team Enable team mode
119
+ `;
120
+ async function main() {
121
+ const [cmd, ...args] = process.argv.slice(2);
122
+ if (!cmd || cmd === "--help" || cmd === "-h") {
123
+ process.stdout.write(USAGE);
124
+ return;
125
+ }
126
+ if (cmd === "init") return initVault(args);
127
+ const vaultDir = resolveVaultDir();
128
+ if (!fs.existsSync(path.join(vaultDir, "myco.yaml"))) {
129
+ console.error(`No myco.yaml found in ${vaultDir}. Run 'myco init' first.`);
130
+ process.exit(1);
131
+ }
132
+ switch (cmd) {
133
+ case "stats":
134
+ return stats(vaultDir);
135
+ case "search":
136
+ return search(vaultDir, args.join(" "));
137
+ case "vectors":
138
+ return vectors(vaultDir, args.join(" "));
139
+ case "session":
140
+ return session(vaultDir, args[0]);
141
+ case "restart":
142
+ return restart(vaultDir);
143
+ case "rebuild":
144
+ return rebuild(vaultDir);
145
+ case "logs":
146
+ return logs(vaultDir, args);
147
+ default:
148
+ console.error(`Unknown command: ${cmd}`);
149
+ process.stdout.write(USAGE);
150
+ process.exit(1);
151
+ }
152
+ }
153
+ function stats(vaultDir) {
154
+ const index = new MycoIndex(path.join(vaultDir, "index.db"));
155
+ const sessions = index.query({ type: "session" });
156
+ const memories = index.query({ type: "memory" });
157
+ const plans = index.query({ type: "plan" });
158
+ console.log("=== Myco Vault ===");
159
+ console.log(`Path: ${vaultDir}`);
160
+ console.log();
161
+ console.log("--- Index ---");
162
+ console.log(`Sessions: ${sessions.length}`);
163
+ console.log(`Memories: ${memories.length}`);
164
+ console.log(`Plans: ${plans.length}`);
165
+ const types = {};
166
+ for (const m of memories) {
167
+ const t = m.frontmatter?.observation_type || "unknown";
168
+ types[t] = (types[t] || 0) + 1;
169
+ }
170
+ if (Object.keys(types).length > 0) {
171
+ console.log("\n--- Memories by Type ---");
172
+ for (const [t, c] of Object.entries(types).sort((a, b) => b[1] - a[1])) {
173
+ console.log(` ${t}: ${c}`);
174
+ }
175
+ }
176
+ const vecDb = path.join(vaultDir, "vectors.db");
177
+ if (fs.existsSync(vecDb)) {
178
+ try {
179
+ const vec = new VectorIndex(vecDb, 1024);
180
+ console.log(`
181
+ --- Vectors ---`);
182
+ console.log(`Embeddings: ${vec.count()}`);
183
+ vec.close();
184
+ } catch (e) {
185
+ console.log(`
186
+ Vectors: error \u2014 ${e.message}`);
187
+ }
188
+ } else {
189
+ console.log("\nVectors: not initialized");
190
+ }
191
+ const daemonPath = path.join(vaultDir, "daemon.json");
192
+ if (fs.existsSync(daemonPath)) {
193
+ try {
194
+ const daemon = JSON.parse(fs.readFileSync(daemonPath, "utf-8"));
195
+ const alive = isProcessAlive(daemon.pid);
196
+ console.log(`
197
+ --- Daemon ---`);
198
+ console.log(`PID: ${daemon.pid} (${alive ? "running" : "dead"})`);
199
+ console.log(`Port: ${daemon.port}`);
200
+ console.log(`Started: ${daemon.started}`);
201
+ console.log(`Sessions: ${(daemon.sessions || []).length}`);
202
+ } catch {
203
+ }
204
+ }
205
+ index.close();
206
+ }
207
+ async function search(vaultDir, query) {
208
+ if (!query) {
209
+ console.error("Usage: myco search <query>");
210
+ process.exit(1);
211
+ }
212
+ const index = new MycoIndex(path.join(vaultDir, "index.db"));
213
+ const vecDb = path.join(vaultDir, "vectors.db");
214
+ if (fs.existsSync(vecDb)) {
215
+ try {
216
+ const config = loadConfig(vaultDir);
217
+ const embeddingProvider = createEmbeddingProvider(config.intelligence.embedding);
218
+ const emb = await generateEmbedding(embeddingProvider, query);
219
+ const vec = new VectorIndex(vecDb, emb.dimensions);
220
+ console.log(`=== Semantic Search: "${query}" ===`);
221
+ const results = vec.search(emb.embedding, { limit: 10 });
222
+ if (results.length === 0) {
223
+ console.log(" (no results)");
224
+ } else {
225
+ const noteMap = new Map(
226
+ index.queryByIds(results.map((r) => r.id)).map((n) => [n.id, n])
227
+ );
228
+ for (const r of results) {
229
+ const title = noteMap.get(r.id)?.title || r.id;
230
+ console.log(` sim: ${r.similarity.toFixed(3)} | [${r.metadata.type}] ${title.slice(0, 60)}`);
231
+ }
232
+ }
233
+ vec.close();
234
+ } catch (e) {
235
+ console.log(`Semantic search unavailable: ${e.message}`);
236
+ }
237
+ }
238
+ console.log(`
239
+ === FTS Search: "${query}" ===`);
240
+ const ftsResults = searchFts(index, query, { limit: 10 });
241
+ if (ftsResults.length === 0) {
242
+ console.log(" (no results)");
243
+ } else {
244
+ for (const r of ftsResults) {
245
+ console.log(` [${r.type}] ${r.title?.slice(0, 70)}`);
246
+ if (r.snippet) console.log(` ${r.snippet.slice(0, 100)}`);
247
+ }
248
+ }
249
+ index.close();
250
+ }
251
+ async function vectors(vaultDir, query) {
252
+ if (!query) {
253
+ console.error("Usage: myco vectors <query>");
254
+ process.exit(1);
255
+ }
256
+ const config = loadConfig(vaultDir);
257
+ const embeddingProvider = createEmbeddingProvider(config.intelligence.embedding);
258
+ const emb = await generateEmbedding(embeddingProvider, query);
259
+ const vecDb = path.join(vaultDir, "vectors.db");
260
+ if (!fs.existsSync(vecDb)) {
261
+ console.error("No vector index found");
262
+ process.exit(1);
263
+ }
264
+ const vec = new VectorIndex(vecDb, emb.dimensions);
265
+ const index = new MycoIndex(path.join(vaultDir, "index.db"));
266
+ const results = vec.search(emb.embedding, { limit: 20, relativeThreshold: 0 });
267
+ console.log(`Query: "${query}"`);
268
+ console.log(`Dimensions: ${emb.dimensions}`);
269
+ console.log(`Total vectors: ${vec.count()}`);
270
+ console.log();
271
+ if (results.length === 0) {
272
+ console.log("(no results)");
273
+ } else {
274
+ const noteMap = new Map(
275
+ index.queryByIds(results.map((r) => r.id)).map((n) => [n.id, n])
276
+ );
277
+ const topScore = results[0].similarity;
278
+ console.log(`Top score: ${topScore.toFixed(4)}`);
279
+ console.log(`Default threshold (0.5x): ${(topScore * 0.5).toFixed(4)}`);
280
+ console.log();
281
+ console.log(" Sim Ratio Type ID / Title");
282
+ console.log(" ------ ----- --------- " + "-".repeat(50));
283
+ for (const r of results) {
284
+ const title = noteMap.get(r.id)?.title || r.id;
285
+ const ratio = (r.similarity / topScore).toFixed(2);
286
+ const pass = r.similarity >= topScore * 0.5 ? "\u2713" : " ";
287
+ console.log(`${pass} ${r.similarity.toFixed(4)} ${ratio} ${r.metadata.type.padEnd(9)} ${title.slice(0, 50)}`);
288
+ }
289
+ }
290
+ vec.close();
291
+ index.close();
292
+ }
293
+ function session(vaultDir, idOrLatest) {
294
+ const index = new MycoIndex(path.join(vaultDir, "index.db"));
295
+ const sessions = index.query({ type: "session" });
296
+ if (sessions.length === 0) {
297
+ console.log("No sessions found");
298
+ index.close();
299
+ return;
300
+ }
301
+ let target;
302
+ if (!idOrLatest || idOrLatest === "latest") {
303
+ target = sessions[sessions.length - 1];
304
+ } else {
305
+ target = sessions.find((s) => s.id.includes(idOrLatest));
306
+ }
307
+ if (!target) {
308
+ console.error(`Session not found: ${idOrLatest}`);
309
+ console.log("Available:", sessions.map((s) => s.id).join(", "));
310
+ index.close();
311
+ return;
312
+ }
313
+ const fullPath = path.join(vaultDir, target.path);
314
+ if (fs.existsSync(fullPath)) {
315
+ console.log(fs.readFileSync(fullPath, "utf-8"));
316
+ } else {
317
+ console.log(`Title: ${target.title}`);
318
+ console.log(`Content:
319
+ ${target.content?.slice(0, 2e3)}`);
320
+ }
321
+ index.close();
322
+ }
323
+ async function restart(vaultDir) {
324
+ const daemonPath = path.join(vaultDir, "daemon.json");
325
+ if (fs.existsSync(daemonPath)) {
326
+ try {
327
+ const daemon = JSON.parse(fs.readFileSync(daemonPath, "utf-8"));
328
+ if (isProcessAlive(daemon.pid)) {
329
+ process.kill(daemon.pid, "SIGTERM");
330
+ console.log(`Stopped daemon (pid ${daemon.pid})`);
331
+ } else {
332
+ console.log(`Daemon pid ${daemon.pid} was already dead`);
333
+ }
334
+ } catch {
335
+ }
336
+ try {
337
+ fs.unlinkSync(daemonPath);
338
+ } catch {
339
+ }
340
+ }
341
+ const { DaemonClient } = await import("./client-4JMOYNKK.js");
342
+ const client = new DaemonClient(vaultDir);
343
+ console.log("Waiting for health check...");
344
+ const healthy = await client.ensureRunning();
345
+ if (healthy) {
346
+ try {
347
+ const info = JSON.parse(fs.readFileSync(daemonPath, "utf-8"));
348
+ console.log(`Daemon healthy on port ${info.port}`);
349
+ } catch {
350
+ console.log("Daemon healthy");
351
+ }
352
+ } else {
353
+ console.error("Daemon failed to become healthy");
354
+ }
355
+ }
356
+ async function rebuild(vaultDir) {
357
+ console.log(`Rebuilding index for ${vaultDir}...`);
358
+ const index = new MycoIndex(path.join(vaultDir, "index.db"));
359
+ initFts(index);
360
+ const count = rebuildIndex(index, vaultDir);
361
+ console.log(`Indexed ${count} notes (FTS)`);
362
+ const vecDb = path.join(vaultDir, "vectors.db");
363
+ try {
364
+ const config = loadConfig(vaultDir);
365
+ const embeddingProvider = createEmbeddingProvider(config.intelligence.embedding);
366
+ const testEmbed = await embeddingProvider.embed("test");
367
+ const vec = new VectorIndex(vecDb, testEmbed.dimensions);
368
+ const allNotes = index.query({});
369
+ const activeNotes = allNotes.filter((n) => {
370
+ const status = n.frontmatter?.status;
371
+ return status !== "superseded" && status !== "archived";
372
+ });
373
+ let embedded = 0;
374
+ for (const note of activeNotes) {
375
+ const text = `${note.title}
376
+ ${note.content}`.slice(0, EMBEDDING_INPUT_LIMIT);
377
+ try {
378
+ const emb = await generateEmbedding(embeddingProvider, text);
379
+ vec.upsert(note.id, emb.embedding, {
380
+ type: note.type,
381
+ session_id: note.frontmatter?.session ?? ""
382
+ });
383
+ embedded++;
384
+ process.stdout.write(`\rEmbedded ${embedded}/${activeNotes.length}`);
385
+ } catch (e) {
386
+ console.error(`
387
+ Failed to embed ${note.id}: ${e.message}`);
388
+ }
389
+ }
390
+ console.log(`
391
+ Embedded ${embedded} notes (vectors)
392
+ Skipped ${allNotes.length - activeNotes.length} superseded/archived`);
393
+ vec.close();
394
+ } catch (e) {
395
+ console.log(`Vector rebuild skipped: ${e.message}`);
396
+ }
397
+ index.close();
398
+ }
399
+ var FOLLOW_POLL_INTERVAL_MS = 500;
400
+ function logs(vaultDir, args) {
401
+ const logDir = path.join(vaultDir, "logs");
402
+ const follow = args.includes("--follow") || args.includes("-f");
403
+ const limit = parseIntFlag(args, "--tail", "-n") ?? DEFAULT_LOG_TAIL;
404
+ const rawLevel = parseStringFlag(args, "--level", "-l");
405
+ if (rawLevel && !(rawLevel in LEVEL_ORDER)) {
406
+ console.error(`Invalid level: ${rawLevel}. Valid levels: ${Object.keys(LEVEL_ORDER).join(", ")}`);
407
+ process.exit(1);
408
+ }
409
+ const level = rawLevel;
410
+ const component = parseStringFlag(args, "--component", "-c");
411
+ const since = parseStringFlag(args, "--since");
412
+ const until = parseStringFlag(args, "--until");
413
+ const result = queryLogs(logDir, { limit, level, component, since, until });
414
+ for (const e of result.entries) {
415
+ process.stdout.write(formatLogLine(e) + "\n");
416
+ }
417
+ if (result.truncated) {
418
+ process.stdout.write(` ... ${result.total - result.entries.length} earlier entries omitted
419
+ `);
420
+ }
421
+ if (!follow) return;
422
+ const followFilter = { level, component, until };
423
+ const logPath = path.join(logDir, "daemon.log");
424
+ let offset = 0;
425
+ try {
426
+ offset = fs.statSync(logPath).size;
427
+ } catch {
428
+ }
429
+ fs.watchFile(logPath, { interval: FOLLOW_POLL_INTERVAL_MS }, (curr, prev) => {
430
+ if (curr.size < prev.size || curr.ino !== prev.ino) {
431
+ offset = 0;
432
+ }
433
+ if (curr.size <= offset) return;
434
+ try {
435
+ const fd = fs.openSync(logPath, "r");
436
+ const buf = Buffer.alloc(curr.size - offset);
437
+ fs.readSync(fd, buf, 0, buf.length, offset);
438
+ fs.closeSync(fd);
439
+ const text = buf.toString("utf-8");
440
+ const lastNewline = text.lastIndexOf("\n");
441
+ if (lastNewline < 0) return;
442
+ offset += Buffer.byteLength(text.slice(0, lastNewline + 1));
443
+ for (const line of text.slice(0, lastNewline).split("\n")) {
444
+ if (!line.trim()) continue;
445
+ try {
446
+ const e = JSON.parse(line);
447
+ if (!matchesFilter(e, followFilter)) continue;
448
+ process.stdout.write(formatLogLine(e) + "\n");
449
+ } catch {
450
+ }
451
+ }
452
+ } catch {
453
+ }
454
+ });
455
+ process.on("SIGINT", () => {
456
+ fs.unwatchFile(logPath);
457
+ process.exit(0);
458
+ });
459
+ }
460
+ function isProcessAlive(pid) {
461
+ try {
462
+ process.kill(pid, 0);
463
+ return true;
464
+ } catch {
465
+ return false;
466
+ }
467
+ }
468
+ var PROVIDER_DEFAULTS = {
469
+ ollama: { base_url: "http://localhost:11434" },
470
+ "lm-studio": { base_url: "http://localhost:1234" }
471
+ };
472
+ var DASHBOARD_CONTENT = `# Myco Vault
473
+
474
+ ## Active Plans
475
+ \`\`\`dataview
476
+ TABLE status, tags FROM #type/plan
477
+ WHERE status = "active" OR status = "in_progress"
478
+ SORT created DESC
479
+ \`\`\`
480
+
481
+ ## Recent Sessions
482
+ \`\`\`dataview
483
+ TABLE user, started, tools_used FROM #type/session
484
+ SORT started DESC LIMIT 10
485
+ \`\`\`
486
+
487
+ ## Recent Memories
488
+ \`\`\`dataview
489
+ TABLE observation_type AS "Type", created FROM #type/memory
490
+ SORT created DESC LIMIT 15
491
+ \`\`\`
492
+
493
+ ## Memories by Type
494
+ \`\`\`dataview
495
+ TABLE WITHOUT ID observation_type AS "Type", length(rows) AS "Count"
496
+ FROM #type/memory GROUP BY observation_type
497
+ SORT length(rows) DESC
498
+ \`\`\`
499
+
500
+ ## Gotchas
501
+ \`\`\`dataview
502
+ LIST FROM #memory/gotcha SORT created DESC LIMIT 10
503
+ \`\`\`
504
+ `;
505
+ var VAULT_GITIGNORE = `# Runtime \u2014 rebuilt on daemon startup
506
+ index.db
507
+ index.db-wal
508
+ index.db-shm
509
+ vectors.db
510
+
511
+ # Daemon state \u2014 per-machine, ephemeral
512
+ daemon.json
513
+ buffer/
514
+ logs/
515
+
516
+ # Obsidian \u2014 per-user workspace config
517
+ .obsidian/
518
+ `;
519
+ function configureVaultEnv(projectRoot, vaultDir) {
520
+ const registry = new AgentRegistry();
521
+ const active = registry.detectActiveAgent();
522
+ if (active) {
523
+ if (active.configureVaultEnv(projectRoot, vaultDir)) {
524
+ console.log(`Set MYCO_VAULT_DIR for ${active.displayName}`);
525
+ }
526
+ } else {
527
+ for (const name of registry.adapterNames) {
528
+ const adapter = registry.getAdapter(name);
529
+ if (adapter?.configureVaultEnv(projectRoot, vaultDir)) {
530
+ console.log(`Set MYCO_VAULT_DIR for ${adapter.displayName}`);
531
+ }
532
+ }
533
+ }
534
+ console.log(`
535
+ For other agents, add to your shell profile:`);
536
+ console.log(` export MYCO_VAULT_DIR="${vaultDir}"
537
+ `);
538
+ }
539
+ async function initVault(args) {
540
+ const vaultPath = parseStringFlag(args, "--vault");
541
+ const llmProvider = parseStringFlag(args, "--llm-provider") ?? "ollama";
542
+ const llmModel = parseStringFlag(args, "--llm-model") ?? "gpt-oss";
543
+ const llmUrl = parseStringFlag(args, "--llm-url") ?? PROVIDER_DEFAULTS[llmProvider]?.base_url;
544
+ const embeddingProvider = parseStringFlag(args, "--embedding-provider") ?? "ollama";
545
+ const embeddingModel = parseStringFlag(args, "--embedding-model") ?? "bge-m3";
546
+ const embeddingUrl = parseStringFlag(args, "--embedding-url") ?? PROVIDER_DEFAULTS[embeddingProvider]?.base_url;
547
+ const user = parseStringFlag(args, "--user") ?? "";
548
+ const teamEnabled = args.includes("--team");
549
+ const vaultDir = vaultPath ? vaultPath.startsWith("~/") ? path.join(os.homedir(), vaultPath.slice(2)) : path.resolve(vaultPath) : path.join(resolveVaultDir());
550
+ if (fs.existsSync(path.join(vaultDir, "myco.yaml"))) {
551
+ console.log(`Vault already initialized at ${vaultDir}`);
552
+ return;
553
+ }
554
+ console.log(`Initializing Myco vault at ${vaultDir}`);
555
+ const dirs = ["sessions", "plans", "memories", "artifacts", "team", "buffer", "logs"];
556
+ for (const dir of dirs) {
557
+ fs.mkdirSync(path.join(vaultDir, dir), { recursive: true });
558
+ }
559
+ const config = {
560
+ version: 2,
561
+ intelligence: {
562
+ llm: {
563
+ provider: llmProvider,
564
+ model: llmModel,
565
+ ...llmUrl ? { base_url: llmUrl } : {},
566
+ context_window: 8192,
567
+ max_tokens: 1024
568
+ },
569
+ embedding: {
570
+ provider: embeddingProvider,
571
+ model: embeddingModel,
572
+ ...embeddingUrl ? { base_url: embeddingUrl } : {}
573
+ }
574
+ },
575
+ daemon: {
576
+ log_level: "info",
577
+ grace_period: 30,
578
+ max_log_size: 5242880
579
+ },
580
+ capture: {
581
+ transcript_paths: [],
582
+ artifact_watch: [".claude/plans/", ".cursor/plans/"],
583
+ artifact_extensions: [".md"],
584
+ buffer_max_events: 500
585
+ },
586
+ context: {
587
+ max_tokens: 1200,
588
+ layers: { plans: 200, sessions: 500, memories: 300, team: 200 }
589
+ },
590
+ team: {
591
+ enabled: teamEnabled,
592
+ user,
593
+ sync: "git"
594
+ }
595
+ };
596
+ fs.writeFileSync(
597
+ path.join(vaultDir, "myco.yaml"),
598
+ import_yaml.default.stringify(config),
599
+ "utf-8"
600
+ );
601
+ fs.writeFileSync(path.join(vaultDir, ".gitignore"), VAULT_GITIGNORE, "utf-8");
602
+ fs.writeFileSync(path.join(vaultDir, "_dashboard.md"), DASHBOARD_CONTENT, "utf-8");
603
+ const index = new MycoIndex(path.join(vaultDir, "index.db"));
604
+ initFts(index);
605
+ index.close();
606
+ console.log("");
607
+ console.log("=== Myco Vault Initialized ===");
608
+ console.log(`Path: ${vaultDir}`);
609
+ console.log(`LLM provider: ${llmProvider} / ${llmModel}`);
610
+ console.log(`Embedding provider: ${embeddingProvider} / ${embeddingModel}`);
611
+ console.log(`Team mode: ${teamEnabled ? "enabled" : "disabled"}`);
612
+ if (user) console.log(`User: ${user}`);
613
+ console.log("");
614
+ const projectRoot = path.resolve(".");
615
+ const isProjectLocal = vaultDir.startsWith(projectRoot);
616
+ if (!isProjectLocal) {
617
+ configureVaultEnv(projectRoot, vaultDir);
618
+ }
619
+ console.log("Next: start a coding session \u2014 Myco will begin capturing automatically.");
620
+ }
621
+ main().catch((err) => {
622
+ console.error(`myco: ${err.message}`);
623
+ process.exit(1);
624
+ });
625
+ //# sourceMappingURL=cli-K5FSKLQC.js.map