@goondocks/myco 0.2.13 → 0.3.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 (93) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/commands/init.md +33 -22
  4. package/dist/{chunk-BXFS4PCJ.js → chunk-2QEJKG7R.js} +2 -2
  5. package/dist/{chunk-MAFUTKOZ.js → chunk-2TKJPRZL.js} +2 -2
  6. package/dist/chunk-5EZ7QF6J.js +96 -0
  7. package/dist/chunk-5EZ7QF6J.js.map +1 -0
  8. package/dist/chunk-6FQISQNA.js +61 -0
  9. package/dist/chunk-6FQISQNA.js.map +1 -0
  10. package/dist/{chunk-S4WBXXO6.js → chunk-BMJX2IDQ.js} +2 -2
  11. package/dist/chunk-EF4JVH24.js +7299 -0
  12. package/dist/chunk-EF4JVH24.js.map +1 -0
  13. package/dist/{chunk-YXZEP5U6.js → chunk-ISCT2SI6.js} +11 -7301
  14. package/dist/chunk-ISCT2SI6.js.map +1 -0
  15. package/dist/{chunk-6C26YFOA.js → chunk-N6IAW33G.js} +248 -4306
  16. package/dist/chunk-N6IAW33G.js.map +1 -0
  17. package/dist/{chunk-C2YPBQQM.js → chunk-NTYYYC32.js} +3 -3
  18. package/dist/{chunk-NKJIZSPD.js → chunk-P2Q77C5F.js} +3 -3
  19. package/dist/chunk-PAUPHPOC.js +111 -0
  20. package/dist/chunk-PAUPHPOC.js.map +1 -0
  21. package/dist/chunk-PZUWP5VK.js +44 -0
  22. package/dist/{chunk-O5VSPHDL.js → chunk-Q7BEFSOV.js} +3 -40
  23. package/dist/{chunk-O5VSPHDL.js.map → chunk-Q7BEFSOV.js.map} +1 -1
  24. package/dist/chunk-QQWUV3TC.js +3691 -0
  25. package/dist/chunk-QQWUV3TC.js.map +1 -0
  26. package/dist/chunk-RGVBGTD6.js +21 -0
  27. package/dist/chunk-RGVBGTD6.js.map +1 -0
  28. package/dist/chunk-SAKJMNSR.js +50 -0
  29. package/dist/chunk-SAKJMNSR.js.map +1 -0
  30. package/dist/chunk-TJJRIVZ7.js +56 -0
  31. package/dist/chunk-TJJRIVZ7.js.map +1 -0
  32. package/dist/chunk-XQXXF6MU.js +96 -0
  33. package/dist/chunk-XQXXF6MU.js.map +1 -0
  34. package/dist/chunk-XW3OL55U.js +160 -0
  35. package/dist/chunk-XW3OL55U.js.map +1 -0
  36. package/dist/cli-ZHUR53CS.js +76 -0
  37. package/dist/cli-ZHUR53CS.js.map +1 -0
  38. package/dist/client-HORA3CC4.js +11 -0
  39. package/dist/client-HORA3CC4.js.map +1 -0
  40. package/dist/config-MD4XMLUS.js +101 -0
  41. package/dist/config-MD4XMLUS.js.map +1 -0
  42. package/dist/detect-providers-6RQCQZOI.js +35 -0
  43. package/dist/detect-providers-6RQCQZOI.js.map +1 -0
  44. package/dist/init-LLLHUNSY.js +120 -0
  45. package/dist/init-LLLHUNSY.js.map +1 -0
  46. package/dist/logs-BSTBZHDR.js +84 -0
  47. package/dist/logs-BSTBZHDR.js.map +1 -0
  48. package/dist/{main-ORWCEWNJ.js → main-JY6O6ZVH.js} +60 -15
  49. package/dist/{main-ORWCEWNJ.js.map → main-JY6O6ZVH.js.map} +1 -1
  50. package/dist/rebuild-YAN3TPFB.js +78 -0
  51. package/dist/rebuild-YAN3TPFB.js.map +1 -0
  52. package/dist/restart-NH5MX45I.js +50 -0
  53. package/dist/restart-NH5MX45I.js.map +1 -0
  54. package/dist/search-W3ECVSTH.js +120 -0
  55. package/dist/search-W3ECVSTH.js.map +1 -0
  56. package/dist/{server-J3AQ3YFA.js → server-DLBATUNG.js} +29 -16
  57. package/dist/{server-J3AQ3YFA.js.map → server-DLBATUNG.js.map} +1 -1
  58. package/dist/session-5GI2YU6R.js +44 -0
  59. package/dist/session-5GI2YU6R.js.map +1 -0
  60. package/dist/{session-start-BEC4JMNZ.js → session-start-DECLNJDI.js} +8 -6
  61. package/dist/{session-start-BEC4JMNZ.js.map → session-start-DECLNJDI.js.map} +1 -1
  62. package/dist/src/cli.js +8 -1
  63. package/dist/src/cli.js.map +1 -1
  64. package/dist/src/daemon/main.js +8 -1
  65. package/dist/src/daemon/main.js.map +1 -1
  66. package/dist/src/hooks/post-tool-use.js +5 -4
  67. package/dist/src/hooks/post-tool-use.js.map +1 -1
  68. package/dist/src/hooks/session-end.js +5 -4
  69. package/dist/src/hooks/session-end.js.map +1 -1
  70. package/dist/src/hooks/session-start.js +8 -1
  71. package/dist/src/hooks/session-start.js.map +1 -1
  72. package/dist/src/hooks/stop.js +7 -5
  73. package/dist/src/hooks/stop.js.map +1 -1
  74. package/dist/src/hooks/user-prompt-submit.js +5 -4
  75. package/dist/src/hooks/user-prompt-submit.js.map +1 -1
  76. package/dist/src/mcp/server.js +8 -1
  77. package/dist/src/mcp/server.js.map +1 -1
  78. package/dist/stats-7VEZN2WF.js +77 -0
  79. package/dist/stats-7VEZN2WF.js.map +1 -0
  80. package/dist/verify-HN5DWV2H.js +50 -0
  81. package/dist/verify-HN5DWV2H.js.map +1 -0
  82. package/package.json +1 -1
  83. package/dist/chunk-6C26YFOA.js.map +0 -1
  84. package/dist/chunk-YXZEP5U6.js.map +0 -1
  85. package/dist/cli-KMWJFK5Y.js +0 -623
  86. package/dist/cli-KMWJFK5Y.js.map +0 -1
  87. package/dist/client-TEUHXGOY.js +0 -10
  88. /package/dist/{chunk-BXFS4PCJ.js.map → chunk-2QEJKG7R.js.map} +0 -0
  89. /package/dist/{chunk-MAFUTKOZ.js.map → chunk-2TKJPRZL.js.map} +0 -0
  90. /package/dist/{chunk-S4WBXXO6.js.map → chunk-BMJX2IDQ.js.map} +0 -0
  91. /package/dist/{chunk-C2YPBQQM.js.map → chunk-NTYYYC32.js.map} +0 -0
  92. /package/dist/{chunk-NKJIZSPD.js.map → chunk-P2Q77C5F.js.map} +0 -0
  93. /package/dist/{client-TEUHXGOY.js.map → chunk-PZUWP5VK.js.map} +0 -0
@@ -0,0 +1,78 @@
1
+ import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
+ import {
3
+ rebuildIndex
4
+ } from "./chunk-QQWUV3TC.js";
5
+ import {
6
+ generateEmbedding
7
+ } from "./chunk-RGVBGTD6.js";
8
+ import {
9
+ initFts
10
+ } from "./chunk-6FQISQNA.js";
11
+ import {
12
+ createEmbeddingProvider
13
+ } from "./chunk-N6IAW33G.js";
14
+ import {
15
+ VectorIndex
16
+ } from "./chunk-XQXXF6MU.js";
17
+ import {
18
+ MycoIndex
19
+ } from "./chunk-PA3VMINE.js";
20
+ import "./chunk-XW3OL55U.js";
21
+ import {
22
+ loadConfig
23
+ } from "./chunk-ISCT2SI6.js";
24
+ import "./chunk-EF4JVH24.js";
25
+ import {
26
+ EMBEDDING_INPUT_LIMIT
27
+ } from "./chunk-Q7BEFSOV.js";
28
+ import "./chunk-PZUWP5VK.js";
29
+
30
+ // src/cli/rebuild.ts
31
+ import path from "path";
32
+ async function run(_args, vaultDir) {
33
+ console.log(`Rebuilding index for ${vaultDir}...`);
34
+ const index = new MycoIndex(path.join(vaultDir, "index.db"));
35
+ initFts(index);
36
+ const count = rebuildIndex(index, vaultDir);
37
+ console.log(`Indexed ${count} notes (FTS)`);
38
+ const vecDb = path.join(vaultDir, "vectors.db");
39
+ try {
40
+ const config = loadConfig(vaultDir);
41
+ const embeddingProvider = createEmbeddingProvider(config.intelligence.embedding);
42
+ const testEmbed = await embeddingProvider.embed("test");
43
+ const vec = new VectorIndex(vecDb, testEmbed.dimensions);
44
+ const allNotes = index.query({});
45
+ const activeNotes = allNotes.filter((n) => {
46
+ const status = n.frontmatter?.status;
47
+ return status !== "superseded" && status !== "archived";
48
+ });
49
+ let embedded = 0;
50
+ for (const note of activeNotes) {
51
+ const text = `${note.title}
52
+ ${note.content}`.slice(0, EMBEDDING_INPUT_LIMIT);
53
+ try {
54
+ const emb = await generateEmbedding(embeddingProvider, text);
55
+ vec.upsert(note.id, emb.embedding, {
56
+ type: note.type,
57
+ session_id: note.frontmatter?.session ?? ""
58
+ });
59
+ embedded++;
60
+ process.stdout.write(`\rEmbedded ${embedded}/${activeNotes.length}`);
61
+ } catch (e) {
62
+ console.error(`
63
+ Failed to embed ${note.id}: ${e.message}`);
64
+ }
65
+ }
66
+ console.log(`
67
+ Embedded ${embedded} notes (vectors)
68
+ Skipped ${allNotes.length - activeNotes.length} superseded/archived`);
69
+ vec.close();
70
+ } catch (e) {
71
+ console.log(`Vector rebuild skipped: ${e.message}`);
72
+ }
73
+ index.close();
74
+ }
75
+ export {
76
+ run
77
+ };
78
+ //# sourceMappingURL=rebuild-YAN3TPFB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/rebuild.ts"],"sourcesContent":["import { EMBEDDING_INPUT_LIMIT } from '../constants.js';\nimport { MycoIndex } from '../index/sqlite.js';\nimport { VectorIndex } from '../index/vectors.js';\nimport { rebuildIndex } from '../index/rebuild.js';\nimport { initFts } from '../index/fts.js';\nimport { loadConfig } from '../config/loader.js';\nimport { createEmbeddingProvider } from '../intelligence/llm.js';\nimport { generateEmbedding } from '../intelligence/embeddings.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport async function run(_args: string[], vaultDir: string): Promise<void> {\n console.log(`Rebuilding index for ${vaultDir}...`);\n const index = new MycoIndex(path.join(vaultDir, 'index.db'));\n initFts(index);\n const count = rebuildIndex(index, vaultDir);\n console.log(`Indexed ${count} notes (FTS)`);\n\n // Rebuild vector embeddings for all notes\n const vecDb = path.join(vaultDir, 'vectors.db');\n try {\n const config = loadConfig(vaultDir);\n const embeddingProvider = createEmbeddingProvider(config.intelligence.embedding);\n const testEmbed = await embeddingProvider.embed('test');\n const vec = new VectorIndex(vecDb, testEmbed.dimensions);\n\n const allNotes = index.query({});\n // Skip superseded/archived memories — they shouldn't appear in vector search\n const activeNotes = allNotes.filter((n) => {\n const status = (n.frontmatter as Record<string, unknown>)?.status as string | undefined;\n return status !== 'superseded' && status !== 'archived';\n });\n let embedded = 0;\n for (const note of activeNotes) {\n const text = `${note.title}\\n${note.content}`.slice(0, EMBEDDING_INPUT_LIMIT);\n try {\n const emb = await generateEmbedding(embeddingProvider, text);\n vec.upsert(note.id, emb.embedding, {\n type: note.type,\n session_id: (note.frontmatter as Record<string, unknown>)?.session as string ?? '',\n });\n embedded++;\n process.stdout.write(`\\rEmbedded ${embedded}/${activeNotes.length}`);\n } catch (e) {\n console.error(`\\nFailed to embed ${note.id}: ${(e as Error).message}`);\n }\n }\n console.log(`\\nEmbedded ${embedded} notes (vectors)\nSkipped ${allNotes.length - activeNotes.length} superseded/archived`);\n vec.close();\n } catch (e) {\n console.log(`Vector rebuild skipped: ${(e as Error).message}`);\n }\n\n index.close();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,OAAO,UAAU;AAEjB,eAAsB,IAAI,OAAiB,UAAiC;AAC1E,UAAQ,IAAI,wBAAwB,QAAQ,KAAK;AACjD,QAAM,QAAQ,IAAI,UAAU,KAAK,KAAK,UAAU,UAAU,CAAC;AAC3D,UAAQ,KAAK;AACb,QAAM,QAAQ,aAAa,OAAO,QAAQ;AAC1C,UAAQ,IAAI,WAAW,KAAK,cAAc;AAG1C,QAAM,QAAQ,KAAK,KAAK,UAAU,YAAY;AAC9C,MAAI;AACF,UAAM,SAAS,WAAW,QAAQ;AAClC,UAAM,oBAAoB,wBAAwB,OAAO,aAAa,SAAS;AAC/E,UAAM,YAAY,MAAM,kBAAkB,MAAM,MAAM;AACtD,UAAM,MAAM,IAAI,YAAY,OAAO,UAAU,UAAU;AAEvD,UAAM,WAAW,MAAM,MAAM,CAAC,CAAC;AAE/B,UAAM,cAAc,SAAS,OAAO,CAAC,MAAM;AACzC,YAAM,SAAU,EAAE,aAAyC;AAC3D,aAAO,WAAW,gBAAgB,WAAW;AAAA,IAC/C,CAAC;AACD,QAAI,WAAW;AACf,eAAW,QAAQ,aAAa;AAC9B,YAAM,OAAO,GAAG,KAAK,KAAK;AAAA,EAAK,KAAK,OAAO,GAAG,MAAM,GAAG,qBAAqB;AAC5E,UAAI;AACF,cAAM,MAAM,MAAM,kBAAkB,mBAAmB,IAAI;AAC3D,YAAI,OAAO,KAAK,IAAI,IAAI,WAAW;AAAA,UACjC,MAAM,KAAK;AAAA,UACX,YAAa,KAAK,aAAyC,WAAqB;AAAA,QAClF,CAAC;AACD;AACA,gBAAQ,OAAO,MAAM,cAAc,QAAQ,IAAI,YAAY,MAAM,EAAE;AAAA,MACrE,SAAS,GAAG;AACV,gBAAQ,MAAM;AAAA,kBAAqB,KAAK,EAAE,KAAM,EAAY,OAAO,EAAE;AAAA,MACvE;AAAA,IACF;AACA,YAAQ,IAAI;AAAA,WAAc,QAAQ;AAAA,UAC5B,SAAS,SAAS,YAAY,MAAM,sBAAsB;AAChE,QAAI,MAAM;AAAA,EACZ,SAAS,GAAG;AACV,YAAQ,IAAI,2BAA4B,EAAY,OAAO,EAAE;AAAA,EAC/D;AAEA,QAAM,MAAM;AACd;","names":[]}
@@ -0,0 +1,50 @@
1
+ import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
+ import {
3
+ isProcessAlive
4
+ } from "./chunk-PAUPHPOC.js";
5
+ import "./chunk-SAKJMNSR.js";
6
+ import "./chunk-XW3OL55U.js";
7
+ import "./chunk-2QEJKG7R.js";
8
+ import "./chunk-Q7BEFSOV.js";
9
+ import "./chunk-PZUWP5VK.js";
10
+
11
+ // src/cli/restart.ts
12
+ import fs from "fs";
13
+ import path from "path";
14
+ async function run(_args, vaultDir) {
15
+ const daemonPath = path.join(vaultDir, "daemon.json");
16
+ if (fs.existsSync(daemonPath)) {
17
+ try {
18
+ const daemon = JSON.parse(fs.readFileSync(daemonPath, "utf-8"));
19
+ if (isProcessAlive(daemon.pid)) {
20
+ process.kill(daemon.pid, "SIGTERM");
21
+ console.log(`Stopped daemon (pid ${daemon.pid})`);
22
+ } else {
23
+ console.log(`Daemon pid ${daemon.pid} was already dead`);
24
+ }
25
+ } catch {
26
+ }
27
+ try {
28
+ fs.unlinkSync(daemonPath);
29
+ } catch {
30
+ }
31
+ }
32
+ const { DaemonClient } = await import("./client-HORA3CC4.js");
33
+ const client = new DaemonClient(vaultDir);
34
+ console.log("Waiting for health check...");
35
+ const healthy = await client.ensureRunning();
36
+ if (healthy) {
37
+ try {
38
+ const info = JSON.parse(fs.readFileSync(daemonPath, "utf-8"));
39
+ console.log(`Daemon healthy on port ${info.port}`);
40
+ } catch {
41
+ console.log("Daemon healthy");
42
+ }
43
+ } else {
44
+ console.error("Daemon failed to become healthy");
45
+ }
46
+ }
47
+ export {
48
+ run
49
+ };
50
+ //# sourceMappingURL=restart-NH5MX45I.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/restart.ts"],"sourcesContent":["import { isProcessAlive } from './shared.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport async function run(_args: string[], vaultDir: string): Promise<void> {\n const daemonPath = path.join(vaultDir, 'daemon.json');\n\n // Kill existing daemon if running\n if (fs.existsSync(daemonPath)) {\n try {\n const daemon = JSON.parse(fs.readFileSync(daemonPath, 'utf-8'));\n if (isProcessAlive(daemon.pid)) {\n process.kill(daemon.pid, 'SIGTERM');\n console.log(`Stopped daemon (pid ${daemon.pid})`);\n } else {\n console.log(`Daemon pid ${daemon.pid} was already dead`);\n }\n } catch { /* ignore */ }\n try { fs.unlinkSync(daemonPath); } catch { /* already gone */ }\n }\n\n // Spawn and wait for health using the shared client\n // (handles CLAUDE_PLUGIN_ROOT + CURSOR_PLUGIN_ROOT resolution)\n const { DaemonClient } = await import('../hooks/client.js');\n const client = new DaemonClient(vaultDir);\n\n console.log('Waiting for health check...');\n const healthy = await client.ensureRunning();\n if (healthy) {\n try {\n const info = JSON.parse(fs.readFileSync(daemonPath, 'utf-8'));\n console.log(`Daemon healthy on port ${info.port}`);\n } catch {\n console.log('Daemon healthy');\n }\n } else {\n console.error('Daemon failed to become healthy');\n }\n}\n"],"mappings":";;;;;;;;;;;AACA,OAAO,QAAQ;AACf,OAAO,UAAU;AAEjB,eAAsB,IAAI,OAAiB,UAAiC;AAC1E,QAAM,aAAa,KAAK,KAAK,UAAU,aAAa;AAGpD,MAAI,GAAG,WAAW,UAAU,GAAG;AAC7B,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,GAAG,aAAa,YAAY,OAAO,CAAC;AAC9D,UAAI,eAAe,OAAO,GAAG,GAAG;AAC9B,gBAAQ,KAAK,OAAO,KAAK,SAAS;AAClC,gBAAQ,IAAI,uBAAuB,OAAO,GAAG,GAAG;AAAA,MAClD,OAAO;AACL,gBAAQ,IAAI,cAAc,OAAO,GAAG,mBAAmB;AAAA,MACzD;AAAA,IACF,QAAQ;AAAA,IAAe;AACvB,QAAI;AAAE,SAAG,WAAW,UAAU;AAAA,IAAG,QAAQ;AAAA,IAAqB;AAAA,EAChE;AAIA,QAAM,EAAE,aAAa,IAAI,MAAM,OAAO,sBAAoB;AAC1D,QAAM,SAAS,IAAI,aAAa,QAAQ;AAExC,UAAQ,IAAI,6BAA6B;AACzC,QAAM,UAAU,MAAM,OAAO,cAAc;AAC3C,MAAI,SAAS;AACX,QAAI;AACF,YAAM,OAAO,KAAK,MAAM,GAAG,aAAa,YAAY,OAAO,CAAC;AAC5D,cAAQ,IAAI,0BAA0B,KAAK,IAAI,EAAE;AAAA,IACnD,QAAQ;AACN,cAAQ,IAAI,gBAAgB;AAAA,IAC9B;AAAA,EACF,OAAO;AACL,YAAQ,MAAM,iCAAiC;AAAA,EACjD;AACF;","names":[]}
@@ -0,0 +1,120 @@
1
+ import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
+ import {
3
+ generateEmbedding
4
+ } from "./chunk-RGVBGTD6.js";
5
+ import {
6
+ searchFts
7
+ } from "./chunk-6FQISQNA.js";
8
+ import {
9
+ createEmbeddingProvider
10
+ } from "./chunk-N6IAW33G.js";
11
+ import {
12
+ VectorIndex
13
+ } from "./chunk-XQXXF6MU.js";
14
+ import {
15
+ MycoIndex
16
+ } from "./chunk-PA3VMINE.js";
17
+ import "./chunk-XW3OL55U.js";
18
+ import {
19
+ loadConfig
20
+ } from "./chunk-ISCT2SI6.js";
21
+ import "./chunk-EF4JVH24.js";
22
+ import "./chunk-Q7BEFSOV.js";
23
+ import "./chunk-PZUWP5VK.js";
24
+
25
+ // src/cli/search.ts
26
+ import fs from "fs";
27
+ import path from "path";
28
+ async function run(args, vaultDir) {
29
+ const query = args.join(" ");
30
+ if (!query) {
31
+ console.error("Usage: myco search <query>");
32
+ process.exit(1);
33
+ }
34
+ const index = new MycoIndex(path.join(vaultDir, "index.db"));
35
+ const vecDb = path.join(vaultDir, "vectors.db");
36
+ if (fs.existsSync(vecDb)) {
37
+ try {
38
+ const config = loadConfig(vaultDir);
39
+ const embeddingProvider = createEmbeddingProvider(config.intelligence.embedding);
40
+ const emb = await generateEmbedding(embeddingProvider, query);
41
+ const vec = new VectorIndex(vecDb, emb.dimensions);
42
+ console.log(`=== Semantic Search: "${query}" ===`);
43
+ const results = vec.search(emb.embedding, { limit: 10 });
44
+ if (results.length === 0) {
45
+ console.log(" (no results)");
46
+ } else {
47
+ const noteMap = new Map(
48
+ index.queryByIds(results.map((r) => r.id)).map((n) => [n.id, n])
49
+ );
50
+ for (const r of results) {
51
+ const title = noteMap.get(r.id)?.title || r.id;
52
+ console.log(` sim: ${r.similarity.toFixed(3)} | [${r.metadata.type}] ${title.slice(0, 60)}`);
53
+ }
54
+ }
55
+ vec.close();
56
+ } catch (e) {
57
+ console.log(`Semantic search unavailable: ${e.message}`);
58
+ }
59
+ }
60
+ console.log(`
61
+ === FTS Search: "${query}" ===`);
62
+ const ftsResults = searchFts(index, query, { limit: 10 });
63
+ if (ftsResults.length === 0) {
64
+ console.log(" (no results)");
65
+ } else {
66
+ for (const r of ftsResults) {
67
+ console.log(` [${r.type}] ${r.title?.slice(0, 70)}`);
68
+ if (r.snippet) console.log(` ${r.snippet.slice(0, 100)}`);
69
+ }
70
+ }
71
+ index.close();
72
+ }
73
+ async function runVectors(args, vaultDir) {
74
+ const query = args.join(" ");
75
+ if (!query) {
76
+ console.error("Usage: myco vectors <query>");
77
+ process.exit(1);
78
+ }
79
+ const config = loadConfig(vaultDir);
80
+ const embeddingProvider = createEmbeddingProvider(config.intelligence.embedding);
81
+ const emb = await generateEmbedding(embeddingProvider, query);
82
+ const vecDb = path.join(vaultDir, "vectors.db");
83
+ if (!fs.existsSync(vecDb)) {
84
+ console.error("No vector index found");
85
+ process.exit(1);
86
+ }
87
+ const vec = new VectorIndex(vecDb, emb.dimensions);
88
+ const index = new MycoIndex(path.join(vaultDir, "index.db"));
89
+ const results = vec.search(emb.embedding, { limit: 20, relativeThreshold: 0 });
90
+ console.log(`Query: "${query}"`);
91
+ console.log(`Dimensions: ${emb.dimensions}`);
92
+ console.log(`Total vectors: ${vec.count()}`);
93
+ console.log();
94
+ if (results.length === 0) {
95
+ console.log("(no results)");
96
+ } else {
97
+ const noteMap = new Map(
98
+ index.queryByIds(results.map((r) => r.id)).map((n) => [n.id, n])
99
+ );
100
+ const topScore = results[0].similarity;
101
+ console.log(`Top score: ${topScore.toFixed(4)}`);
102
+ console.log(`Default threshold (0.5x): ${(topScore * 0.5).toFixed(4)}`);
103
+ console.log();
104
+ console.log(" Sim Ratio Type ID / Title");
105
+ console.log(" ------ ----- --------- " + "-".repeat(50));
106
+ for (const r of results) {
107
+ const title = noteMap.get(r.id)?.title || r.id;
108
+ const ratio = (r.similarity / topScore).toFixed(2);
109
+ const pass = r.similarity >= topScore * 0.5 ? "\u2713" : " ";
110
+ console.log(`${pass} ${r.similarity.toFixed(4)} ${ratio} ${r.metadata.type.padEnd(9)} ${title.slice(0, 50)}`);
111
+ }
112
+ }
113
+ vec.close();
114
+ index.close();
115
+ }
116
+ export {
117
+ run,
118
+ runVectors
119
+ };
120
+ //# sourceMappingURL=search-W3ECVSTH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/search.ts"],"sourcesContent":["import { MycoIndex } from '../index/sqlite.js';\nimport { VectorIndex } from '../index/vectors.js';\nimport { searchFts } from '../index/fts.js';\nimport { loadConfig } from '../config/loader.js';\nimport { createEmbeddingProvider } from '../intelligence/llm.js';\nimport { generateEmbedding } from '../intelligence/embeddings.js';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport async function run(args: string[], vaultDir: string): Promise<void> {\n const query = args.join(' ');\n if (!query) { console.error('Usage: myco search <query>'); process.exit(1); }\n\n const index = new MycoIndex(path.join(vaultDir, 'index.db'));\n\n // Semantic search is primary\n const vecDb = path.join(vaultDir, 'vectors.db');\n if (fs.existsSync(vecDb)) {\n try {\n const config = loadConfig(vaultDir);\n const embeddingProvider = createEmbeddingProvider(config.intelligence.embedding);\n const emb = await generateEmbedding(embeddingProvider, query);\n const vec = new VectorIndex(vecDb, emb.dimensions);\n\n console.log(`=== Semantic Search: \"${query}\" ===`);\n const results = vec.search(emb.embedding, { limit: 10 });\n if (results.length === 0) {\n console.log(' (no results)');\n } else {\n const noteMap = new Map(\n index.queryByIds(results.map((r) => r.id)).map((n) => [n.id, n]),\n );\n for (const r of results) {\n const title = noteMap.get(r.id)?.title || r.id;\n console.log(` sim: ${r.similarity.toFixed(3)} | [${r.metadata.type}] ${title.slice(0, 60)}`);\n }\n }\n vec.close();\n } catch (e) {\n console.log(`Semantic search unavailable: ${(e as Error).message}`);\n }\n }\n\n // FTS as fallback / supplementary\n console.log(`\\n=== FTS Search: \"${query}\" ===`);\n const ftsResults = searchFts(index, query, { limit: 10 });\n if (ftsResults.length === 0) {\n console.log(' (no results)');\n } else {\n for (const r of ftsResults) {\n console.log(` [${r.type}] ${r.title?.slice(0, 70)}`);\n if (r.snippet) console.log(` ${r.snippet.slice(0, 100)}`);\n }\n }\n\n index.close();\n}\n\nexport async function runVectors(args: string[], vaultDir: string): Promise<void> {\n const query = args.join(' ');\n if (!query) { console.error('Usage: myco vectors <query>'); process.exit(1); }\n\n const config = loadConfig(vaultDir);\n const embeddingProvider = createEmbeddingProvider(config.intelligence.embedding);\n const emb = await generateEmbedding(embeddingProvider, query);\n\n const vecDb = path.join(vaultDir, 'vectors.db');\n if (!fs.existsSync(vecDb)) { console.error('No vector index found'); process.exit(1); }\n\n const vec = new VectorIndex(vecDb, emb.dimensions);\n const index = new MycoIndex(path.join(vaultDir, 'index.db'));\n\n // Show all results with no threshold filtering for tuning\n const results = vec.search(emb.embedding, { limit: 20, relativeThreshold: 0 });\n\n console.log(`Query: \"${query}\"`);\n console.log(`Dimensions: ${emb.dimensions}`);\n console.log(`Total vectors: ${vec.count()}`);\n console.log();\n\n if (results.length === 0) {\n console.log('(no results)');\n } else {\n const noteMap = new Map(\n index.queryByIds(results.map((r) => r.id)).map((n) => [n.id, n]),\n );\n const topScore = results[0].similarity;\n console.log(`Top score: ${topScore.toFixed(4)}`);\n console.log(`Default threshold (0.5x): ${(topScore * 0.5).toFixed(4)}`);\n console.log();\n console.log(' Sim Ratio Type ID / Title');\n console.log(' ------ ----- --------- ' + '-'.repeat(50));\n for (const r of results) {\n const title = noteMap.get(r.id)?.title || r.id;\n const ratio = (r.similarity / topScore).toFixed(2);\n const pass = r.similarity >= topScore * 0.5 ? '\\u2713' : ' ';\n console.log(`${pass} ${r.similarity.toFixed(4)} ${ratio} ${r.metadata.type.padEnd(9)} ${title.slice(0, 50)}`);\n }\n }\n\n vec.close();\n index.close();\n}\n"],"mappings":"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","names":[]}
@@ -1,27 +1,37 @@
1
1
  import { createRequire as __cr } from 'node:module'; const require = __cr(import.meta.url);
2
- import {
3
- memoryFm,
4
- planFm,
5
- sessionFm
6
- } from "./chunk-YMYJ7FNH.js";
7
2
  import {
8
3
  queryLogs
9
- } from "./chunk-S4WBXXO6.js";
4
+ } from "./chunk-BMJX2IDQ.js";
10
5
  import {
11
6
  VaultWriter
12
- } from "./chunk-NKJIZSPD.js";
7
+ } from "./chunk-P2Q77C5F.js";
13
8
  import {
14
9
  PlanFrontmatterSchema,
15
- VectorIndex,
16
- createEmbeddingProvider,
17
- generateEmbedding,
18
- indexNote,
10
+ indexNote
11
+ } from "./chunk-QQWUV3TC.js";
12
+ import {
13
+ generateEmbedding
14
+ } from "./chunk-RGVBGTD6.js";
15
+ import "./chunk-5EZ7QF6J.js";
16
+ import {
17
+ memoryFm,
18
+ planFm,
19
+ sessionFm
20
+ } from "./chunk-YMYJ7FNH.js";
21
+ import {
19
22
  initFts,
20
23
  searchFts
21
- } from "./chunk-6C26YFOA.js";
24
+ } from "./chunk-6FQISQNA.js";
25
+ import {
26
+ createEmbeddingProvider
27
+ } from "./chunk-N6IAW33G.js";
28
+ import {
29
+ VectorIndex
30
+ } from "./chunk-XQXXF6MU.js";
22
31
  import {
23
32
  MycoIndex
24
33
  } from "./chunk-PA3VMINE.js";
34
+ import "./chunk-XW3OL55U.js";
25
35
  import {
26
36
  _enum,
27
37
  _null,
@@ -43,7 +53,8 @@ import {
43
53
  string,
44
54
  union,
45
55
  unknown
46
- } from "./chunk-YXZEP5U6.js";
56
+ } from "./chunk-ISCT2SI6.js";
57
+ import "./chunk-EF4JVH24.js";
47
58
  import {
48
59
  resolveVaultDir
49
60
  } from "./chunk-N33KUCFP.js";
@@ -51,10 +62,12 @@ import {
51
62
  CONTENT_SNIPPET_CHARS,
52
63
  EMBEDDING_INPUT_LIMIT,
53
64
  RECALL_SUMMARY_PREVIEW_CHARS,
54
- SESSION_SUMMARY_PREVIEW_CHARS,
65
+ SESSION_SUMMARY_PREVIEW_CHARS
66
+ } from "./chunk-Q7BEFSOV.js";
67
+ import {
55
68
  __commonJS,
56
69
  __toESM
57
- } from "./chunk-O5VSPHDL.js";
70
+ } from "./chunk-PZUWP5VK.js";
58
71
 
59
72
  // node_modules/ajv/dist/compile/codegen/code.js
60
73
  var require_code = __commonJS({
@@ -14712,4 +14725,4 @@ export {
14712
14725
  createMycoServer,
14713
14726
  main
14714
14727
  };
14715
- //# sourceMappingURL=server-J3AQ3YFA.js.map
14728
+ //# sourceMappingURL=server-DLBATUNG.js.map