@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.
Files changed (43) hide show
  1. package/ARCHITECTURE.md +73 -1
  2. package/README.md +54 -2
  3. package/dist/{auto-route-CruBrTf-.mjs → auto-route-DL4ViDKC.mjs} +2 -2
  4. package/dist/{auto-route-CruBrTf-.mjs.map → auto-route-DL4ViDKC.mjs.map} +1 -1
  5. package/dist/cli/index.mjs +246 -16
  6. package/dist/cli/index.mjs.map +1 -1
  7. package/dist/daemon/index.mjs +7 -6
  8. package/dist/daemon/index.mjs.map +1 -1
  9. package/dist/{daemon-WQY1kwOF.mjs → daemon-dYymOnwd.mjs} +39 -19
  10. package/dist/daemon-dYymOnwd.mjs.map +1 -0
  11. package/dist/daemon-mcp/index.mjs +46 -0
  12. package/dist/daemon-mcp/index.mjs.map +1 -1
  13. package/dist/{db-DdUperSl.mjs → db-CYmBWcjh.mjs} +35 -13
  14. package/dist/db-CYmBWcjh.mjs.map +1 -0
  15. package/dist/{detector-CNU3zCwP.mjs → detector-AzVtGLtL.mjs} +2 -2
  16. package/dist/{detector-CNU3zCwP.mjs.map → detector-AzVtGLtL.mjs.map} +1 -1
  17. package/dist/{factory-DKDPRhAN.mjs → factory-BDBIfTDC.mjs} +3 -3
  18. package/dist/{factory-DKDPRhAN.mjs.map → factory-BDBIfTDC.mjs.map} +1 -1
  19. package/dist/hooks/whisper-rules.mjs +15 -12
  20. package/dist/hooks/whisper-rules.mjs.map +2 -2
  21. package/dist/index.d.mts +3 -1
  22. package/dist/index.d.mts.map +1 -1
  23. package/dist/index.mjs +2 -2
  24. package/dist/kg-entity-D5v7RCDi.mjs +176 -0
  25. package/dist/kg-entity-D5v7RCDi.mjs.map +1 -0
  26. package/dist/{kg-extraction-BlGM40q7.mjs → kg-extraction-Uvr9fTlz.mjs} +56 -21
  27. package/dist/kg-extraction-Uvr9fTlz.mjs.map +1 -0
  28. package/dist/{search-DC1qhkKn.mjs → search-i2nlQ-JM.mjs} +48 -19
  29. package/dist/search-i2nlQ-JM.mjs.map +1 -0
  30. package/dist/{sqlite-BJrME_vg.mjs → sqlite-xUe94oUZ.mjs} +9 -2
  31. package/dist/sqlite-xUe94oUZ.mjs.map +1 -0
  32. package/dist/{tools-gMHdjmHC.mjs → tools-BNBvJNph.mjs} +285 -7
  33. package/dist/tools-BNBvJNph.mjs.map +1 -0
  34. package/package.json +1 -1
  35. package/src/hooks/ts/user-prompt/whisper-rules.ts +15 -12
  36. package/dist/daemon-WQY1kwOF.mjs.map +0 -1
  37. package/dist/db-DdUperSl.mjs.map +0 -1
  38. package/dist/kg-B5ysyRLC.mjs +0 -94
  39. package/dist/kg-B5ysyRLC.mjs.map +0 -1
  40. package/dist/kg-extraction-BlGM40q7.mjs.map +0 -1
  41. package/dist/search-DC1qhkKn.mjs.map +0 -1
  42. package/dist/sqlite-BJrME_vg.mjs.map +0 -1
  43. package/dist/tools-gMHdjmHC.mjs.map +0 -1
@@ -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-DC1qhkKn.mjs";
7
- import "../kg-extraction-BlGM40q7.mjs";
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-DKDPRhAN.mjs";
11
- import { n as serve } from "../daemon-WQY1kwOF.mjs";
11
+ import "../factory-BDBIfTDC.mjs";
12
+ import { n as serve } from "../daemon-dYymOnwd.mjs";
12
13
  import "../state-BIlxNRUn.mjs";
13
- import "../tools-gMHdjmHC.mjs";
14
- import "../detector-CNU3zCwP.mjs";
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":";;;;;;;;;;;;;;;;;;;;;;;;;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
+ {"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-BlGM40q7.mjs";
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-DKDPRhAN.mjs";
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 toolSessionList, c as toolProjectHealth, d as toolProjectTodo, f as toolMemoryGet, i as toolRegistrySearch, l as toolProjectInfo, n as toolMemoryTaxonomy, o as toolSessionRoute, p as toolMemorySearch, r as toolMemoryWakeup, s as toolProjectDetect, u as toolProjectList } from "./tools-gMHdjmHC.mjs";
11
- import { t as detectTopicShift } from "./detector-CNU3zCwP.mjs";
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-BJrME_vg.mjs");
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-BJrME_vg.mjs");
223
- const { openFederation } = await import("./db-DdUperSl.mjs").then((n) => n.t);
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-gMHdjmHC.mjs").then((n) => n.t);
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-gMHdjmHC.mjs").then((n) => n.t);
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-gMHdjmHC.mjs").then((n) => n.t);
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 result = await extractAndStoreTriples$1(pool, {
2108
- summaryText: params.summaryText,
2109
- projectSlug: params.projectSlug,
2110
- projectId: params.projectId,
2111
- sessionId: params.sessionId,
2112
- gitLog: params.gitLog,
2113
- model: "sonnet"
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-WQY1kwOF.mjs.map
3159
+ //# sourceMappingURL=daemon-dYymOnwd.mjs.map