@tekmidian/pai 0.9.8 → 0.9.10
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/ARCHITECTURE.md +73 -1
- package/README.md +54 -2
- package/dist/{auto-route-CruBrTf-.mjs → auto-route-DL4ViDKC.mjs} +2 -2
- package/dist/{auto-route-CruBrTf-.mjs.map → auto-route-DL4ViDKC.mjs.map} +1 -1
- package/dist/cli/index.mjs +246 -16
- package/dist/cli/index.mjs.map +1 -1
- package/dist/daemon/index.mjs +7 -6
- package/dist/daemon/index.mjs.map +1 -1
- package/dist/{daemon-WQY1kwOF.mjs → daemon-dYymOnwd.mjs} +39 -19
- package/dist/daemon-dYymOnwd.mjs.map +1 -0
- package/dist/daemon-mcp/index.mjs +46 -0
- package/dist/daemon-mcp/index.mjs.map +1 -1
- package/dist/{db-DdUperSl.mjs → db-CYmBWcjh.mjs} +35 -13
- package/dist/db-CYmBWcjh.mjs.map +1 -0
- package/dist/{detector-CNU3zCwP.mjs → detector-AzVtGLtL.mjs} +2 -2
- package/dist/{detector-CNU3zCwP.mjs.map → detector-AzVtGLtL.mjs.map} +1 -1
- package/dist/{factory-DKDPRhAN.mjs → factory-BDBIfTDC.mjs} +3 -3
- package/dist/{factory-DKDPRhAN.mjs.map → factory-BDBIfTDC.mjs.map} +1 -1
- package/dist/hooks/whisper-rules.mjs +15 -12
- package/dist/hooks/whisper-rules.mjs.map +2 -2
- package/dist/index.d.mts +3 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/kg-entity-D5v7RCDi.mjs +176 -0
- package/dist/kg-entity-D5v7RCDi.mjs.map +1 -0
- package/dist/{kg-extraction-BlGM40q7.mjs → kg-extraction-Uvr9fTlz.mjs} +56 -21
- package/dist/kg-extraction-Uvr9fTlz.mjs.map +1 -0
- package/dist/{search-DC1qhkKn.mjs → search-i2nlQ-JM.mjs} +48 -19
- package/dist/search-i2nlQ-JM.mjs.map +1 -0
- package/dist/{sqlite-BJrME_vg.mjs → sqlite-xUe94oUZ.mjs} +9 -2
- package/dist/sqlite-xUe94oUZ.mjs.map +1 -0
- package/dist/{tools-gMHdjmHC.mjs → tools-BNBvJNph.mjs} +285 -7
- package/dist/tools-BNBvJNph.mjs.map +1 -0
- package/package.json +1 -1
- package/src/hooks/ts/user-prompt/whisper-rules.ts +15 -12
- package/dist/daemon-WQY1kwOF.mjs.map +0 -1
- package/dist/db-DdUperSl.mjs.map +0 -1
- package/dist/kg-B5ysyRLC.mjs +0 -94
- package/dist/kg-B5ysyRLC.mjs.map +0 -1
- package/dist/kg-extraction-BlGM40q7.mjs.map +0 -1
- package/dist/search-DC1qhkKn.mjs.map +0 -1
- package/dist/sqlite-BJrME_vg.mjs.map +0 -1
- package/dist/tools-gMHdjmHC.mjs.map +0 -1
package/dist/daemon/index.mjs
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import "../db-BtuN768f.mjs";
|
|
3
|
+
import "../db-CYmBWcjh.mjs";
|
|
3
4
|
import "../helpers-OCVFgprQ.mjs";
|
|
4
5
|
import "../sync-CdHSL9Kc.mjs";
|
|
5
6
|
import "../embeddings-DGRAPAYb.mjs";
|
|
6
|
-
import "../search-
|
|
7
|
-
import "../kg-extraction-
|
|
7
|
+
import "../search-i2nlQ-JM.mjs";
|
|
8
|
+
import "../kg-extraction-Uvr9fTlz.mjs";
|
|
8
9
|
import { t as PaiClient } from "../ipc-client-CoyUHPod.mjs";
|
|
9
10
|
import { i as ensureConfigDir, o as loadConfig } from "../config-BuhHWyOK.mjs";
|
|
10
|
-
import "../factory-
|
|
11
|
-
import { n as serve } from "../daemon-
|
|
11
|
+
import "../factory-BDBIfTDC.mjs";
|
|
12
|
+
import { n as serve } from "../daemon-dYymOnwd.mjs";
|
|
12
13
|
import "../state-BIlxNRUn.mjs";
|
|
13
|
-
import "../tools-
|
|
14
|
-
import "../detector-
|
|
14
|
+
import "../tools-BNBvJNph.mjs";
|
|
15
|
+
import "../detector-AzVtGLtL.mjs";
|
|
15
16
|
import { Command } from "commander";
|
|
16
17
|
|
|
17
18
|
//#region src/daemon/index.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/daemon/index.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * PAI Daemon — Entry point\n *\n * Commands:\n * serve — Start the PAI daemon (foreground, managed by launchd in production)\n * status — Query daemon status via IPC\n * index — Trigger an immediate index run via IPC\n */\n\nimport { Command } from \"commander\";\nimport { loadConfig, ensureConfigDir } from \"./config.js\";\nimport { serve } from \"./daemon.js\";\nimport { PaiClient } from \"./ipc-client.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"pai-daemon\")\n .description(\"PAI Daemon — background service for PAI Knowledge OS\")\n .version(\"0.1.0\");\n\n// ---------------------------------------------------------------------------\n// serve\n// ---------------------------------------------------------------------------\n\nprogram\n .command(\"serve\")\n .description(\"Start the PAI daemon in the foreground\")\n .action(async () => {\n ensureConfigDir();\n const config = loadConfig();\n await serve(config);\n });\n\n// ---------------------------------------------------------------------------\n// status\n// ---------------------------------------------------------------------------\n\nprogram\n .command(\"status\")\n .description(\"Query the running daemon status\")\n .action(async () => {\n const config = loadConfig();\n const client = new PaiClient(config.socketPath);\n\n try {\n const status = await client.status();\n console.log(JSON.stringify(status, null, 2));\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(`Error: ${msg}`);\n process.exit(1);\n }\n });\n\n// ---------------------------------------------------------------------------\n// index\n// ---------------------------------------------------------------------------\n\nprogram\n .command(\"index\")\n .description(\"Trigger an immediate index run in the running daemon\")\n .action(async () => {\n const config = loadConfig();\n const client = new PaiClient(config.socketPath);\n\n try {\n await client.triggerIndex();\n console.log(\"Index triggered. Check daemon logs for progress.\");\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(`Error: ${msg}`);\n process.exit(1);\n }\n });\n\n// ---------------------------------------------------------------------------\n// Parse\n// ---------------------------------------------------------------------------\n\nprogram.parse(process.argv);\n\nif (process.argv.length <= 2) {\n program.help();\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/daemon/index.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * PAI Daemon — Entry point\n *\n * Commands:\n * serve — Start the PAI daemon (foreground, managed by launchd in production)\n * status — Query daemon status via IPC\n * index — Trigger an immediate index run via IPC\n */\n\nimport { Command } from \"commander\";\nimport { loadConfig, ensureConfigDir } from \"./config.js\";\nimport { serve } from \"./daemon.js\";\nimport { PaiClient } from \"./ipc-client.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"pai-daemon\")\n .description(\"PAI Daemon — background service for PAI Knowledge OS\")\n .version(\"0.1.0\");\n\n// ---------------------------------------------------------------------------\n// serve\n// ---------------------------------------------------------------------------\n\nprogram\n .command(\"serve\")\n .description(\"Start the PAI daemon in the foreground\")\n .action(async () => {\n ensureConfigDir();\n const config = loadConfig();\n await serve(config);\n });\n\n// ---------------------------------------------------------------------------\n// status\n// ---------------------------------------------------------------------------\n\nprogram\n .command(\"status\")\n .description(\"Query the running daemon status\")\n .action(async () => {\n const config = loadConfig();\n const client = new PaiClient(config.socketPath);\n\n try {\n const status = await client.status();\n console.log(JSON.stringify(status, null, 2));\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(`Error: ${msg}`);\n process.exit(1);\n }\n });\n\n// ---------------------------------------------------------------------------\n// index\n// ---------------------------------------------------------------------------\n\nprogram\n .command(\"index\")\n .description(\"Trigger an immediate index run in the running daemon\")\n .action(async () => {\n const config = loadConfig();\n const client = new PaiClient(config.socketPath);\n\n try {\n await client.triggerIndex();\n console.log(\"Index triggered. Check daemon logs for progress.\");\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n console.error(`Error: ${msg}`);\n process.exit(1);\n }\n });\n\n// ---------------------------------------------------------------------------\n// Parse\n// ---------------------------------------------------------------------------\n\nprogram.parse(process.argv);\n\nif (process.argv.length <= 2) {\n program.help();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,MAAM,UAAU,IAAI,SAAS;AAE7B,QACG,KAAK,aAAa,CAClB,YAAY,uDAAuD,CACnE,QAAQ,QAAQ;AAMnB,QACG,QAAQ,QAAQ,CAChB,YAAY,yCAAyC,CACrD,OAAO,YAAY;AAClB,kBAAiB;AAEjB,OAAM,MADS,YAAY,CACR;EACnB;AAMJ,QACG,QAAQ,SAAS,CACjB,YAAY,kCAAkC,CAC9C,OAAO,YAAY;CAElB,MAAM,SAAS,IAAI,UADJ,YAAY,CACS,WAAW;AAE/C,KAAI;EACF,MAAM,SAAS,MAAM,OAAO,QAAQ;AACpC,UAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC;UACrC,GAAG;EACV,MAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;AACtD,UAAQ,MAAM,UAAU,MAAM;AAC9B,UAAQ,KAAK,EAAE;;EAEjB;AAMJ,QACG,QAAQ,QAAQ,CAChB,YAAY,uDAAuD,CACnE,OAAO,YAAY;CAElB,MAAM,SAAS,IAAI,UADJ,YAAY,CACS,WAAW;AAE/C,KAAI;AACF,QAAM,OAAO,cAAc;AAC3B,UAAQ,IAAI,mDAAmD;UACxD,GAAG;EACV,MAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;AACtD,UAAQ,MAAM,UAAU,MAAM;AAC9B,UAAQ,KAAK,EAAE;;EAEjB;AAMJ,QAAQ,MAAM,QAAQ,KAAK;AAE3B,IAAI,QAAQ,KAAK,UAAU,EACzB,SAAQ,MAAM"}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-95iHPtFO.mjs";
|
|
2
2
|
import { n as openRegistry } from "./db-BtuN768f.mjs";
|
|
3
|
+
import { n as openFederation } from "./db-CYmBWcjh.mjs";
|
|
3
4
|
import { d as sha256 } from "./helpers-OCVFgprQ.mjs";
|
|
4
5
|
import { n as indexAll } from "./sync-CdHSL9Kc.mjs";
|
|
5
6
|
import { t as configureEmbeddingModel } from "./embeddings-DGRAPAYb.mjs";
|
|
6
|
-
import { t as extractAndStoreTriples$1 } from "./kg-extraction-
|
|
7
|
+
import { t as extractAndStoreTriples$1 } from "./kg-extraction-Uvr9fTlz.mjs";
|
|
7
8
|
import { n as CONFIG_FILE, s as DEFAULT_NOTIFICATION_CONFIG, t as CONFIG_DIR } from "./config-BuhHWyOK.mjs";
|
|
8
|
-
import { t as createStorageBackend } from "./factory-
|
|
9
|
+
import { t as createStorageBackend } from "./factory-BDBIfTDC.mjs";
|
|
9
10
|
import { C as setStorageBackend, E as startTime, O as storageBackend, S as setStartTime, T as shutdownRequested, _ as setLastIndexTime, a as indexSchedulerTimer, b as setRegistryDb, c as lastVaultIndexTime, d as setDaemonConfig, f as setEmbedInProgress, g as setLastEmbedTime, h as setIndexSchedulerTimer, i as indexInProgress, k as vaultIndexInProgress, l as notificationConfig, m as setIndexInProgress, n as embedInProgress, o as lastEmbedTime, p as setEmbedSchedulerTimer, r as embedSchedulerTimer, s as lastIndexTime, t as daemonConfig, u as registryDb, v as setLastVaultIndexTime, w as setVaultIndexInProgress, x as setShutdownRequested, y as setNotificationConfig } from "./state-BIlxNRUn.mjs";
|
|
10
|
-
import { a as
|
|
11
|
-
import { t as detectTopicShift } from "./detector-
|
|
11
|
+
import { a as toolMemoryWakeup, c as toolSessionRoute, d as toolProjectInfo, f as toolProjectList, h as toolMemorySearch, i as toolMemoryTaxonomy, l as toolProjectDetect, m as toolMemoryGet, n as toolMemoryKgSearch, o as toolRegistrySearch, p as toolProjectTodo, r as toolMemoryFeedback, s as toolSessionList, u as toolProjectHealth } from "./tools-BNBvJNph.mjs";
|
|
12
|
+
import { t as detectTopicShift } from "./detector-AzVtGLtL.mjs";
|
|
12
13
|
import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, statSync, unlinkSync, writeFileSync } from "node:fs";
|
|
13
14
|
import { homedir, setPriority } from "node:os";
|
|
14
15
|
import { basename, dirname, join } from "node:path";
|
|
@@ -115,7 +116,7 @@ async function runIndex() {
|
|
|
115
116
|
try {
|
|
116
117
|
process.stderr.write("[pai-daemon] Starting scheduled index run...\n");
|
|
117
118
|
if (storageBackend.backendType === "sqlite") {
|
|
118
|
-
const { SQLiteBackend } = await import("./sqlite-
|
|
119
|
+
const { SQLiteBackend } = await import("./sqlite-xUe94oUZ.mjs");
|
|
119
120
|
if (storageBackend instanceof SQLiteBackend) {
|
|
120
121
|
const { projects, result } = await indexAll(storageBackend.getRawDb(), registryDb);
|
|
121
122
|
const elapsed = Date.now() - t0;
|
|
@@ -219,8 +220,8 @@ async function runEmbed() {
|
|
|
219
220
|
const count = await embedChunksWithBackend(storageBackend, () => shutdownRequested, projectNames);
|
|
220
221
|
let vaultEmbedCount = 0;
|
|
221
222
|
if (daemonConfig.vaultPath) try {
|
|
222
|
-
const { SQLiteBackend } = await import("./sqlite-
|
|
223
|
-
const { openFederation } = await import("./db-
|
|
223
|
+
const { SQLiteBackend } = await import("./sqlite-xUe94oUZ.mjs");
|
|
224
|
+
const { openFederation } = await import("./db-CYmBWcjh.mjs").then((n) => n.t);
|
|
224
225
|
const federationDb = openFederation();
|
|
225
226
|
const vaultSqliteBackend = new SQLiteBackend(federationDb);
|
|
226
227
|
const vaultProjectNames = new Map(projectNames);
|
|
@@ -703,7 +704,7 @@ async function dispatchTool(method, params) {
|
|
|
703
704
|
case "zettel_themes":
|
|
704
705
|
case "zettel_god_notes":
|
|
705
706
|
case "zettel_communities": {
|
|
706
|
-
const { toolZettelExplore, toolZettelHealth, toolZettelSurprise, toolZettelSuggest, toolZettelConverse, toolZettelThemes, toolZettelGodNotes, toolZettelCommunities } = await import("./tools-
|
|
707
|
+
const { toolZettelExplore, toolZettelHealth, toolZettelSurprise, toolZettelSuggest, toolZettelConverse, toolZettelThemes, toolZettelGodNotes, toolZettelCommunities } = await import("./tools-BNBvJNph.mjs").then((n) => n.t);
|
|
707
708
|
switch (method) {
|
|
708
709
|
case "zettel_explore": return toolZettelExplore(storageBackend, p);
|
|
709
710
|
case "zettel_health": return toolZettelHealth(storageBackend, p);
|
|
@@ -745,7 +746,7 @@ async function dispatchTool(method, params) {
|
|
|
745
746
|
case "kg_query":
|
|
746
747
|
case "kg_invalidate":
|
|
747
748
|
case "kg_contradictions": {
|
|
748
|
-
const { toolKgAdd, toolKgQuery, toolKgInvalidate, toolKgContradictions } = await import("./tools-
|
|
749
|
+
const { toolKgAdd, toolKgQuery, toolKgInvalidate, toolKgContradictions } = await import("./tools-BNBvJNph.mjs").then((n) => n.t);
|
|
749
750
|
const pgPool = storageBackend.getPool?.() ?? null;
|
|
750
751
|
if (!pgPool) throw new Error(`${method} requires a Postgres storage backend`);
|
|
751
752
|
switch (method) {
|
|
@@ -757,9 +758,21 @@ async function dispatchTool(method, params) {
|
|
|
757
758
|
break;
|
|
758
759
|
}
|
|
759
760
|
case "memory_tunnels": {
|
|
760
|
-
const { toolMemoryTunnels } = await import("./tools-
|
|
761
|
+
const { toolMemoryTunnels } = await import("./tools-BNBvJNph.mjs").then((n) => n.t);
|
|
761
762
|
return toolMemoryTunnels(registryDb, storageBackend, p);
|
|
762
763
|
}
|
|
764
|
+
case "memory_feedback": {
|
|
765
|
+
const federationDb = storageBackend.getSqliteDb?.();
|
|
766
|
+
if (!federationDb) throw new Error("memory_feedback requires a SQLite federation backend (getSqliteDb not available)");
|
|
767
|
+
return toolMemoryFeedback(federationDb, p);
|
|
768
|
+
}
|
|
769
|
+
case "memory_kg_search": {
|
|
770
|
+
const federationDb = storageBackend.getSqliteDb?.();
|
|
771
|
+
if (!federationDb) throw new Error("memory_kg_search requires a SQLite federation backend (getSqliteDb not available)");
|
|
772
|
+
const pgPool = storageBackend.getPool?.() ?? null;
|
|
773
|
+
if (!pgPool) throw new Error("memory_kg_search requires a Postgres storage backend for KG triple expansion");
|
|
774
|
+
return toolMemoryKgSearch(federationDb, pgPool, p);
|
|
775
|
+
}
|
|
763
776
|
default: throw new Error(`Unknown method: ${method}`);
|
|
764
777
|
}
|
|
765
778
|
}
|
|
@@ -2104,14 +2117,21 @@ async function extractAndStoreTriples(params) {
|
|
|
2104
2117
|
process.stderr.write("[session-summary] Triple extraction disabled via kg_extraction_enabled=false.\n");
|
|
2105
2118
|
return;
|
|
2106
2119
|
}
|
|
2107
|
-
const
|
|
2108
|
-
|
|
2109
|
-
|
|
2110
|
-
|
|
2111
|
-
|
|
2112
|
-
|
|
2113
|
-
|
|
2114
|
-
|
|
2120
|
+
const federationDb = openFederation();
|
|
2121
|
+
let result;
|
|
2122
|
+
try {
|
|
2123
|
+
result = await extractAndStoreTriples$1(pool, {
|
|
2124
|
+
summaryText: params.summaryText,
|
|
2125
|
+
projectSlug: params.projectSlug,
|
|
2126
|
+
projectId: params.projectId,
|
|
2127
|
+
sessionId: params.sessionId,
|
|
2128
|
+
gitLog: params.gitLog,
|
|
2129
|
+
model: "sonnet",
|
|
2130
|
+
federationDb
|
|
2131
|
+
});
|
|
2132
|
+
} finally {
|
|
2133
|
+
federationDb.close();
|
|
2134
|
+
}
|
|
2115
2135
|
process.stderr.write(`[session-summary] Triple extraction complete: ${result.extracted} extracted, ${result.added} added, ${result.superseded} superseded.\n`);
|
|
2116
2136
|
} catch (err) {
|
|
2117
2137
|
process.stderr.write(`[session-summary] Triple extraction failed: ${err}\n`);
|
|
@@ -3136,4 +3156,4 @@ var daemon_exports = /* @__PURE__ */ __exportAll({ serve: () => serve });
|
|
|
3136
3156
|
|
|
3137
3157
|
//#endregion
|
|
3138
3158
|
export { serve as n, daemon_exports as t };
|
|
3139
|
-
//# sourceMappingURL=daemon-
|
|
3159
|
+
//# sourceMappingURL=daemon-dYymOnwd.mjs.map
|