@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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/commands/init.md +33 -22
- package/dist/{chunk-BXFS4PCJ.js → chunk-2QEJKG7R.js} +2 -2
- package/dist/{chunk-MAFUTKOZ.js → chunk-2TKJPRZL.js} +2 -2
- package/dist/chunk-5EZ7QF6J.js +96 -0
- package/dist/chunk-5EZ7QF6J.js.map +1 -0
- package/dist/chunk-6FQISQNA.js +61 -0
- package/dist/chunk-6FQISQNA.js.map +1 -0
- package/dist/{chunk-S4WBXXO6.js → chunk-BMJX2IDQ.js} +2 -2
- package/dist/chunk-EF4JVH24.js +7299 -0
- package/dist/chunk-EF4JVH24.js.map +1 -0
- package/dist/{chunk-YXZEP5U6.js → chunk-ISCT2SI6.js} +11 -7301
- package/dist/chunk-ISCT2SI6.js.map +1 -0
- package/dist/{chunk-6C26YFOA.js → chunk-N6IAW33G.js} +248 -4306
- package/dist/chunk-N6IAW33G.js.map +1 -0
- package/dist/{chunk-C2YPBQQM.js → chunk-NTYYYC32.js} +3 -3
- package/dist/{chunk-NKJIZSPD.js → chunk-P2Q77C5F.js} +3 -3
- package/dist/chunk-PAUPHPOC.js +111 -0
- package/dist/chunk-PAUPHPOC.js.map +1 -0
- package/dist/chunk-PZUWP5VK.js +44 -0
- package/dist/{chunk-O5VSPHDL.js → chunk-Q7BEFSOV.js} +3 -40
- package/dist/{chunk-O5VSPHDL.js.map → chunk-Q7BEFSOV.js.map} +1 -1
- package/dist/chunk-QQWUV3TC.js +3691 -0
- package/dist/chunk-QQWUV3TC.js.map +1 -0
- package/dist/chunk-RGVBGTD6.js +21 -0
- package/dist/chunk-RGVBGTD6.js.map +1 -0
- package/dist/chunk-SAKJMNSR.js +50 -0
- package/dist/chunk-SAKJMNSR.js.map +1 -0
- package/dist/chunk-TJJRIVZ7.js +56 -0
- package/dist/chunk-TJJRIVZ7.js.map +1 -0
- package/dist/chunk-XQXXF6MU.js +96 -0
- package/dist/chunk-XQXXF6MU.js.map +1 -0
- package/dist/chunk-XW3OL55U.js +160 -0
- package/dist/chunk-XW3OL55U.js.map +1 -0
- package/dist/cli-ZHUR53CS.js +76 -0
- package/dist/cli-ZHUR53CS.js.map +1 -0
- package/dist/client-HORA3CC4.js +11 -0
- package/dist/client-HORA3CC4.js.map +1 -0
- package/dist/config-MD4XMLUS.js +101 -0
- package/dist/config-MD4XMLUS.js.map +1 -0
- package/dist/detect-providers-6RQCQZOI.js +35 -0
- package/dist/detect-providers-6RQCQZOI.js.map +1 -0
- package/dist/init-LLLHUNSY.js +120 -0
- package/dist/init-LLLHUNSY.js.map +1 -0
- package/dist/logs-BSTBZHDR.js +84 -0
- package/dist/logs-BSTBZHDR.js.map +1 -0
- package/dist/{main-ORWCEWNJ.js → main-JY6O6ZVH.js} +60 -15
- package/dist/{main-ORWCEWNJ.js.map → main-JY6O6ZVH.js.map} +1 -1
- package/dist/rebuild-YAN3TPFB.js +78 -0
- package/dist/rebuild-YAN3TPFB.js.map +1 -0
- package/dist/restart-NH5MX45I.js +50 -0
- package/dist/restart-NH5MX45I.js.map +1 -0
- package/dist/search-W3ECVSTH.js +120 -0
- package/dist/search-W3ECVSTH.js.map +1 -0
- package/dist/{server-J3AQ3YFA.js → server-DLBATUNG.js} +29 -16
- package/dist/{server-J3AQ3YFA.js.map → server-DLBATUNG.js.map} +1 -1
- package/dist/session-5GI2YU6R.js +44 -0
- package/dist/session-5GI2YU6R.js.map +1 -0
- package/dist/{session-start-BEC4JMNZ.js → session-start-DECLNJDI.js} +8 -6
- package/dist/{session-start-BEC4JMNZ.js.map → session-start-DECLNJDI.js.map} +1 -1
- package/dist/src/cli.js +8 -1
- package/dist/src/cli.js.map +1 -1
- package/dist/src/daemon/main.js +8 -1
- package/dist/src/daemon/main.js.map +1 -1
- package/dist/src/hooks/post-tool-use.js +5 -4
- package/dist/src/hooks/post-tool-use.js.map +1 -1
- package/dist/src/hooks/session-end.js +5 -4
- package/dist/src/hooks/session-end.js.map +1 -1
- package/dist/src/hooks/session-start.js +8 -1
- package/dist/src/hooks/session-start.js.map +1 -1
- package/dist/src/hooks/stop.js +7 -5
- package/dist/src/hooks/stop.js.map +1 -1
- package/dist/src/hooks/user-prompt-submit.js +5 -4
- package/dist/src/hooks/user-prompt-submit.js.map +1 -1
- package/dist/src/mcp/server.js +8 -1
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/stats-7VEZN2WF.js +77 -0
- package/dist/stats-7VEZN2WF.js.map +1 -0
- package/dist/verify-HN5DWV2H.js +50 -0
- package/dist/verify-HN5DWV2H.js.map +1 -0
- package/package.json +1 -1
- package/dist/chunk-6C26YFOA.js.map +0 -1
- package/dist/chunk-YXZEP5U6.js.map +0 -1
- package/dist/cli-KMWJFK5Y.js +0 -623
- package/dist/cli-KMWJFK5Y.js.map +0 -1
- package/dist/client-TEUHXGOY.js +0 -10
- /package/dist/{chunk-BXFS4PCJ.js.map → chunk-2QEJKG7R.js.map} +0 -0
- /package/dist/{chunk-MAFUTKOZ.js.map → chunk-2TKJPRZL.js.map} +0 -0
- /package/dist/{chunk-S4WBXXO6.js.map → chunk-BMJX2IDQ.js.map} +0 -0
- /package/dist/{chunk-C2YPBQQM.js.map → chunk-NTYYYC32.js.map} +0 -0
- /package/dist/{chunk-NKJIZSPD.js.map → chunk-P2Q77C5F.js.map} +0 -0
- /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-
|
|
4
|
+
} from "./chunk-BMJX2IDQ.js";
|
|
10
5
|
import {
|
|
11
6
|
VaultWriter
|
|
12
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-P2Q77C5F.js";
|
|
13
8
|
import {
|
|
14
9
|
PlanFrontmatterSchema,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
14728
|
+
//# sourceMappingURL=server-DLBATUNG.js.map
|