@synthaer/resonance 0.1.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 (94) hide show
  1. package/README.md +19 -0
  2. package/dist/cli.d.ts +9 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +40 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/config.d.ts +24 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +44 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/contracts.d.ts +4 -0
  11. package/dist/contracts.d.ts.map +1 -0
  12. package/dist/contracts.js +2 -0
  13. package/dist/contracts.js.map +1 -0
  14. package/dist/db/local.d.ts +21 -0
  15. package/dist/db/local.d.ts.map +1 -0
  16. package/dist/db/local.js +158 -0
  17. package/dist/db/local.js.map +1 -0
  18. package/dist/db-types.d.ts +14 -0
  19. package/dist/db-types.d.ts.map +1 -0
  20. package/dist/db-types.js +2 -0
  21. package/dist/db-types.js.map +1 -0
  22. package/dist/dikw-pipeline.d.ts +31 -0
  23. package/dist/dikw-pipeline.d.ts.map +1 -0
  24. package/dist/dikw-pipeline.js +130 -0
  25. package/dist/dikw-pipeline.js.map +1 -0
  26. package/dist/embedding-provider.d.ts +25 -0
  27. package/dist/embedding-provider.d.ts.map +1 -0
  28. package/dist/embedding-provider.js +62 -0
  29. package/dist/embedding-provider.js.map +1 -0
  30. package/dist/embeddings/local.d.ts +31 -0
  31. package/dist/embeddings/local.d.ts.map +1 -0
  32. package/dist/embeddings/local.js +72 -0
  33. package/dist/embeddings/local.js.map +1 -0
  34. package/dist/encryption.d.ts +22 -0
  35. package/dist/encryption.d.ts.map +1 -0
  36. package/dist/encryption.js +39 -0
  37. package/dist/encryption.js.map +1 -0
  38. package/dist/index.d.ts +22 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +15 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/mcp-server.d.ts +362 -0
  43. package/dist/mcp-server.d.ts.map +1 -0
  44. package/dist/mcp-server.js +722 -0
  45. package/dist/mcp-server.js.map +1 -0
  46. package/dist/pki.d.ts +160 -0
  47. package/dist/pki.d.ts.map +1 -0
  48. package/dist/pki.js +502 -0
  49. package/dist/pki.js.map +1 -0
  50. package/dist/ratification.d.ts +125 -0
  51. package/dist/ratification.d.ts.map +1 -0
  52. package/dist/ratification.js +315 -0
  53. package/dist/ratification.js.map +1 -0
  54. package/dist/schema.d.ts +4 -0
  55. package/dist/schema.d.ts.map +1 -0
  56. package/dist/schema.js +119 -0
  57. package/dist/schema.js.map +1 -0
  58. package/dist/search.d.ts +33 -0
  59. package/dist/search.d.ts.map +1 -0
  60. package/dist/search.js +132 -0
  61. package/dist/search.js.map +1 -0
  62. package/dist/server.d.ts +11 -0
  63. package/dist/server.d.ts.map +1 -0
  64. package/dist/server.js +297 -0
  65. package/dist/server.js.map +1 -0
  66. package/dist/store.d.ts +77 -0
  67. package/dist/store.d.ts.map +1 -0
  68. package/dist/store.js +572 -0
  69. package/dist/store.js.map +1 -0
  70. package/dist/tools/cloud-gate.d.ts +72 -0
  71. package/dist/tools/cloud-gate.d.ts.map +1 -0
  72. package/dist/tools/cloud-gate.js +79 -0
  73. package/dist/tools/cloud-gate.js.map +1 -0
  74. package/dist/tools/experiences.d.ts +20 -0
  75. package/dist/tools/experiences.d.ts.map +1 -0
  76. package/dist/tools/experiences.js +135 -0
  77. package/dist/tools/experiences.js.map +1 -0
  78. package/dist/tools/knowledge.d.ts +37 -0
  79. package/dist/tools/knowledge.d.ts.map +1 -0
  80. package/dist/tools/knowledge.js +213 -0
  81. package/dist/tools/knowledge.js.map +1 -0
  82. package/dist/tools/sessions.d.ts +11 -0
  83. package/dist/tools/sessions.d.ts.map +1 -0
  84. package/dist/tools/sessions.js +66 -0
  85. package/dist/tools/sessions.js.map +1 -0
  86. package/dist/tools/trust.d.ts +18 -0
  87. package/dist/tools/trust.d.ts.map +1 -0
  88. package/dist/tools/trust.js +42 -0
  89. package/dist/tools/trust.js.map +1 -0
  90. package/dist/types.d.ts +75 -0
  91. package/dist/types.d.ts.map +1 -0
  92. package/dist/types.js +16 -0
  93. package/dist/types.js.map +1 -0
  94. package/package.json +50 -0
package/README.md ADDED
@@ -0,0 +1,19 @@
1
+ # @synthaer/resonance-local
2
+
3
+ Extracted local Resonance runtime package.
4
+
5
+ This package is the new home for the core local Resonance runtime that was previously defined under `apps/partitura/src/resonance/`.
6
+
7
+ Current scope:
8
+
9
+ - local Resonance store
10
+ - DIKW pipeline
11
+ - local schema
12
+ - hybrid search
13
+ - embedding provider
14
+ - sync sink contract
15
+ - transport-agnostic local MCP runtime + Express router
16
+
17
+ Still pending:
18
+
19
+ - Partitura HTTP router rewiring to import the runtime from this package
package/dist/cli.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @synthaer/resonance CLI entry point.
4
+ *
5
+ * When run via `npx @synthaer/resonance`, starts the MCP server on stdio.
6
+ * Prints a brief banner to stderr showing mode and data directory.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
package/dist/cli.js ADDED
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @synthaer/resonance CLI entry point.
4
+ *
5
+ * When run via `npx @synthaer/resonance`, starts the MCP server on stdio.
6
+ * Prints a brief banner to stderr showing mode and data directory.
7
+ */
8
+ import { resolveMode, resolveDataDir, ensureDataDir } from './config.js';
9
+ import { initLocalDb } from './db/local.js';
10
+ import { LocalEmbeddingProvider } from './embeddings/local.js';
11
+ import { startServer } from './server.js';
12
+ import { join } from 'node:path';
13
+ const VERSION = '0.1.0';
14
+ async function main() {
15
+ const mode = resolveMode();
16
+ const dataDir = resolveDataDir();
17
+ // Banner goes to stderr so it doesn't interfere with stdio MCP transport
18
+ process.stderr.write(`\n`);
19
+ process.stderr.write(` Resonance v${VERSION}\n`);
20
+ process.stderr.write(` Mode: ${mode}\n`);
21
+ process.stderr.write(` Data: ${dataDir}\n`);
22
+ process.stderr.write(`\n`);
23
+ // Ensure data directories exist
24
+ await ensureDataDir(dataDir);
25
+ // Initialize the local PGlite database
26
+ process.stderr.write('[resonance] Initializing database...\n');
27
+ const db = await initLocalDb(dataDir);
28
+ process.stderr.write('[resonance] Database ready.\n');
29
+ // Create the embedding provider (lazy — model loads on first use)
30
+ const modelsDir = join(dataDir, 'models');
31
+ const embedder = new LocalEmbeddingProvider(modelsDir);
32
+ // Start the MCP server on stdio
33
+ process.stderr.write(`[resonance] Starting MCP server (${mode} mode, stdio transport)...\n`);
34
+ await startServer({ db, embedder, mode, dataDir });
35
+ }
36
+ main().catch((error) => {
37
+ process.stderr.write(`[resonance] Fatal error: ${error instanceof Error ? error.message : String(error)}\n`);
38
+ process.exit(1);
39
+ });
40
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,OAAO,GAAG,OAAO,CAAC;AAExB,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IAEjC,yEAAyE;IACzE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,OAAO,IAAI,CAAC,CAAC;IAClD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC;IAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,OAAO,IAAI,CAAC,CAAC;IAC7C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE3B,gCAAgC;IAChC,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;IAE7B,uCAAuC;IACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC/D,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;IACtC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAEtD,kEAAkE;IAClE,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,IAAI,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAEvD,gCAAgC;IAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oCAAoC,IAAI,8BAA8B,CAAC,CAAC;IAC7F,MAAM,WAAW,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ export type ResonanceMode = 'local' | 'cloud' | 'hybrid';
2
+ /**
3
+ * Resolve the operating mode.
4
+ *
5
+ * Priority:
6
+ * 1. RESONANCE_MODE env var (explicit override)
7
+ * 2. Presence of cloud credentials -> hybrid
8
+ * 3. Default -> local
9
+ */
10
+ export declare function resolveMode(): ResonanceMode;
11
+ /**
12
+ * Resolve the data directory for all Resonance state.
13
+ *
14
+ * Priority:
15
+ * 1. RESONANCE_DATA_DIR env var
16
+ * 2. XDG_DATA_HOME/resonance
17
+ * 3. ~/.local/share/resonance
18
+ */
19
+ export declare function resolveDataDir(): string;
20
+ /**
21
+ * Ensure the data directory and its subdirectories exist.
22
+ */
23
+ export declare function ensureDataDir(dataDir: string): Promise<void>;
24
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEzD;;;;;;;GAOG;AACH,wBAAgB,WAAW,IAAI,aAAa,CAO3C;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAQvC;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAGlE"}
package/dist/config.js ADDED
@@ -0,0 +1,44 @@
1
+ import { join } from 'node:path';
2
+ import { homedir } from 'node:os';
3
+ import { mkdir } from 'node:fs/promises';
4
+ /**
5
+ * Resolve the operating mode.
6
+ *
7
+ * Priority:
8
+ * 1. RESONANCE_MODE env var (explicit override)
9
+ * 2. Presence of cloud credentials -> hybrid
10
+ * 3. Default -> local
11
+ */
12
+ export function resolveMode() {
13
+ const explicit = process.env['RESONANCE_MODE'];
14
+ if (explicit === 'local' || explicit === 'cloud' || explicit === 'hybrid') {
15
+ return explicit;
16
+ }
17
+ const hasCredentials = !!(process.env['SYNTHAER_API_KEY'] || process.env['SYNTHAER_TOKEN']);
18
+ return hasCredentials ? 'hybrid' : 'local';
19
+ }
20
+ /**
21
+ * Resolve the data directory for all Resonance state.
22
+ *
23
+ * Priority:
24
+ * 1. RESONANCE_DATA_DIR env var
25
+ * 2. XDG_DATA_HOME/resonance
26
+ * 3. ~/.local/share/resonance
27
+ */
28
+ export function resolveDataDir() {
29
+ const envDir = process.env['RESONANCE_DATA_DIR'];
30
+ if (envDir)
31
+ return envDir;
32
+ const xdg = process.env['XDG_DATA_HOME'];
33
+ if (xdg)
34
+ return join(xdg, 'resonance');
35
+ return join(homedir(), '.local', 'share', 'resonance');
36
+ }
37
+ /**
38
+ * Ensure the data directory and its subdirectories exist.
39
+ */
40
+ export async function ensureDataDir(dataDir) {
41
+ await mkdir(join(dataDir, 'pglite'), { recursive: true });
42
+ await mkdir(join(dataDir, 'models'), { recursive: true });
43
+ }
44
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAIzC;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC/C,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1E,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC5F,OAAO,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;AAC7C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc;IAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACjD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACzC,IAAI,GAAG;QAAE,OAAO,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAEvC,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,4 @@
1
+ export interface ResonanceSyncSink {
2
+ enqueue(tableName: string, recordId: string, operation: 'create' | 'update' | 'delete', payload?: Record<string, unknown>): Promise<void>;
3
+ }
4
+ //# sourceMappingURL=contracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,OAAO,CACL,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,EACzC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=contracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contracts.js","sourceRoot":"","sources":["../src/contracts.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ import { PGlite } from '@electric-sql/pglite';
2
+ /**
3
+ * Initialize the local PGlite database with pgvector extension.
4
+ * Data is stored at `<dataDir>/pglite/`.
5
+ */
6
+ export declare function initLocalDb(dataDir: string): Promise<PGlite>;
7
+ /**
8
+ * Create HNSW vector indexes for semantic search.
9
+ * Deferred to after first data load for performance (building an HNSW index
10
+ * on an empty table is pointless; building it after initial data is faster).
11
+ */
12
+ export declare function createVectorIndexes(instance: PGlite): Promise<void>;
13
+ /**
14
+ * Get the current PGlite instance. Throws if not initialized.
15
+ */
16
+ export declare function getDb(): PGlite;
17
+ /**
18
+ * Close the database connection.
19
+ */
20
+ export declare function closeDb(): Promise<void>;
21
+ //# sourceMappingURL=local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/db/local.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAiG9C;;;GAGG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAalE;AAmBD;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUzE;AAED;;GAEG;AACH,wBAAgB,KAAK,IAAI,MAAM,CAK9B;AAED;;GAEG;AACH,wBAAsB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAK7C"}
@@ -0,0 +1,158 @@
1
+ import { PGlite } from '@electric-sql/pglite';
2
+ import { vector } from '@electric-sql/pglite/vector';
3
+ import { join } from 'node:path';
4
+ let db = null;
5
+ const SCHEMA_SQL = `
6
+ CREATE EXTENSION IF NOT EXISTS vector;
7
+
8
+ CREATE TABLE IF NOT EXISTS meta (
9
+ key TEXT PRIMARY KEY,
10
+ value TEXT NOT NULL
11
+ );
12
+
13
+ INSERT INTO meta (key, value) VALUES ('schema_version', '1')
14
+ ON CONFLICT (key) DO NOTHING;
15
+
16
+ CREATE TABLE IF NOT EXISTS knowledge (
17
+ id TEXT PRIMARY KEY,
18
+ content TEXT NOT NULL,
19
+ kind INTEGER NOT NULL DEFAULT 1,
20
+ dikw_stage TEXT NOT NULL DEFAULT 'nascent',
21
+ strength REAL NOT NULL DEFAULT 0.5,
22
+ tags JSONB NOT NULL DEFAULT '[]'::jsonb,
23
+ context JSONB,
24
+ project_id TEXT,
25
+ source_agent TEXT,
26
+ source_count INTEGER NOT NULL DEFAULT 1,
27
+ context_count INTEGER NOT NULL DEFAULT 1,
28
+ endorsements INTEGER NOT NULL DEFAULT 0,
29
+ challenges INTEGER NOT NULL DEFAULT 0,
30
+ trust_score REAL NOT NULL DEFAULT 0.5,
31
+ decay_rate REAL NOT NULL DEFAULT 0.01,
32
+ local_embedding vector(384),
33
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
34
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
35
+ last_accessed_at TIMESTAMPTZ
36
+ );
37
+
38
+ CREATE INDEX IF NOT EXISTS idx_knowledge_dikw_stage ON knowledge(dikw_stage);
39
+ CREATE INDEX IF NOT EXISTS idx_knowledge_project_id ON knowledge(project_id);
40
+ CREATE INDEX IF NOT EXISTS idx_knowledge_kind ON knowledge(kind);
41
+ CREATE INDEX IF NOT EXISTS idx_knowledge_strength ON knowledge(strength);
42
+ CREATE INDEX IF NOT EXISTS idx_knowledge_updated_at ON knowledge(updated_at);
43
+ CREATE INDEX IF NOT EXISTS idx_knowledge_trust_score ON knowledge(trust_score);
44
+
45
+ CREATE TABLE IF NOT EXISTS experiences (
46
+ id TEXT PRIMARY KEY,
47
+ agent_id TEXT,
48
+ session_id TEXT,
49
+ content TEXT NOT NULL,
50
+ kind INTEGER NOT NULL DEFAULT 3,
51
+ project_id TEXT,
52
+ related_knowledge_ids JSONB NOT NULL DEFAULT '[]'::jsonb,
53
+ tags JSONB NOT NULL DEFAULT '[]'::jsonb,
54
+ local_embedding vector(384),
55
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
56
+ );
57
+
58
+ CREATE INDEX IF NOT EXISTS idx_experiences_project_id ON experiences(project_id);
59
+ CREATE INDEX IF NOT EXISTS idx_experiences_kind ON experiences(kind);
60
+ CREATE INDEX IF NOT EXISTS idx_experiences_session_id ON experiences(session_id);
61
+ CREATE INDEX IF NOT EXISTS idx_experiences_created_at ON experiences(created_at);
62
+
63
+ CREATE TABLE IF NOT EXISTS sessions (
64
+ id TEXT PRIMARY KEY,
65
+ agent_id TEXT,
66
+ project_id TEXT,
67
+ checkpoint JSONB,
68
+ memory JSONB NOT NULL DEFAULT '[]'::jsonb,
69
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
70
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
71
+ );
72
+
73
+ CREATE INDEX IF NOT EXISTS idx_sessions_agent_project ON sessions(agent_id, project_id);
74
+
75
+ CREATE TABLE IF NOT EXISTS agents (
76
+ id TEXT PRIMARY KEY,
77
+ name TEXT,
78
+ model TEXT,
79
+ fingerprint TEXT,
80
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
81
+ );
82
+
83
+ CREATE TABLE IF NOT EXISTS maturation_log (
84
+ id SERIAL PRIMARY KEY,
85
+ knowledge_id TEXT NOT NULL REFERENCES knowledge(id) ON DELETE CASCADE,
86
+ from_stage TEXT NOT NULL,
87
+ to_stage TEXT NOT NULL,
88
+ reason TEXT,
89
+ triggered_by TEXT DEFAULT 'auto',
90
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
91
+ );
92
+
93
+ CREATE INDEX IF NOT EXISTS idx_maturation_log_knowledge_id ON maturation_log(knowledge_id);
94
+ `;
95
+ /**
96
+ * Initialize the local PGlite database with pgvector extension.
97
+ * Data is stored at `<dataDir>/pglite/`.
98
+ */
99
+ export async function initLocalDb(dataDir) {
100
+ if (db)
101
+ return db;
102
+ const dbPath = join(dataDir, 'pglite');
103
+ db = new PGlite(dbPath, {
104
+ extensions: { vector },
105
+ });
106
+ await db.waitReady;
107
+ await applySchema(db);
108
+ return db;
109
+ }
110
+ async function applySchema(instance) {
111
+ // Check if schema already applied
112
+ try {
113
+ const result = await instance.query(`SELECT value FROM meta WHERE key = 'schema_version'`);
114
+ if (result.rows.length > 0) {
115
+ // Schema already exists
116
+ return;
117
+ }
118
+ }
119
+ catch {
120
+ // Table doesn't exist yet, apply full schema
121
+ }
122
+ await instance.exec(SCHEMA_SQL);
123
+ }
124
+ /**
125
+ * Create HNSW vector indexes for semantic search.
126
+ * Deferred to after first data load for performance (building an HNSW index
127
+ * on an empty table is pointless; building it after initial data is faster).
128
+ */
129
+ export async function createVectorIndexes(instance) {
130
+ await instance.exec(`
131
+ CREATE INDEX IF NOT EXISTS idx_knowledge_local_embedding
132
+ ON knowledge USING hnsw (local_embedding vector_cosine_ops)
133
+ WITH (m = 16, ef_construction = 64);
134
+
135
+ CREATE INDEX IF NOT EXISTS idx_experiences_local_embedding
136
+ ON experiences USING hnsw (local_embedding vector_cosine_ops)
137
+ WITH (m = 16, ef_construction = 64);
138
+ `);
139
+ }
140
+ /**
141
+ * Get the current PGlite instance. Throws if not initialized.
142
+ */
143
+ export function getDb() {
144
+ if (!db) {
145
+ throw new Error('Database not initialized. Call initLocalDb() first.');
146
+ }
147
+ return db;
148
+ }
149
+ /**
150
+ * Close the database connection.
151
+ */
152
+ export async function closeDb() {
153
+ if (db) {
154
+ await db.close();
155
+ db = null;
156
+ }
157
+ }
158
+ //# sourceMappingURL=local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local.js","sourceRoot":"","sources":["../../src/db/local.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,IAAI,EAAE,GAAkB,IAAI,CAAC;AAE7B,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyFlB,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAe;IAC/C,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAElB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAEvC,EAAE,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE;QACtB,UAAU,EAAE,EAAE,MAAM,EAAE;KACvB,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC,SAAS,CAAC;IACnB,MAAM,WAAW,CAAC,EAAE,CAAC,CAAC;IAEtB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,QAAgB;IACzC,kCAAkC;IAClC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CACjC,qDAAqD,CACtD,CAAC;QACF,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,wBAAwB;YACxB,OAAO;QACT,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,6CAA6C;IAC/C,CAAC;IAED,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AAClC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,QAAgB;IACxD,MAAM,QAAQ,CAAC,IAAI,CAAC;;;;;;;;GAQnB,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,KAAK;IACnB,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO;IAC3B,IAAI,EAAE,EAAE,CAAC;QACP,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;QACjB,EAAE,GAAG,IAAI,CAAC;IACZ,CAAC;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface QueryResult<T = Record<string, unknown>> {
2
+ rows: T[];
3
+ rowCount: number;
4
+ }
5
+ export interface IAsyncDatabase {
6
+ query<T = Record<string, unknown>>(sql: string, params?: unknown[]): Promise<QueryResult<T>>;
7
+ exec(sql: string): Promise<void>;
8
+ transaction<T>(fn: (tx: IAsyncDatabase) => Promise<T>): Promise<T>;
9
+ close(): Promise<void>;
10
+ readonly dialect: 'pglite' | 'postgres';
11
+ setTenantContext?(firmId: string): Promise<void>;
12
+ resetTenantContext?(): Promise<void>;
13
+ }
14
+ //# sourceMappingURL=db-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-types.d.ts","sourceRoot":"","sources":["../src/db-types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACtD,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7F,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,cAAc,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACnE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,QAAQ,GAAG,UAAU,CAAC;IACxC,gBAAgB,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,kBAAkB,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=db-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-types.js","sourceRoot":"","sources":["../src/db-types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,31 @@
1
+ import type { KnowledgeItem, KnowledgeKind, DikwStage } from './types.js';
2
+ import type { ResonanceStore } from './store.js';
3
+ export declare class DikwPipeline {
4
+ private store;
5
+ constructor(store: ResonanceStore);
6
+ recordObservation(content: string, kind: KnowledgeKind, projectId?: string, tags?: string[]): Promise<string>;
7
+ evaluatePromotion(id: string): Promise<{
8
+ promoted: boolean;
9
+ from?: DikwStage;
10
+ to?: DikwStage;
11
+ }>;
12
+ runPromotionCycle(): Promise<{
13
+ promoted: number;
14
+ details: Array<{
15
+ id: string;
16
+ from: DikwStage;
17
+ to: DikwStage;
18
+ }>;
19
+ }>;
20
+ promoteToCanonical(id: string, reason: string): Promise<void>;
21
+ calculateStrength(item: KnowledgeItem): number;
22
+ applyDecay(): Promise<{
23
+ decayed: number;
24
+ archived: number;
25
+ }>;
26
+ recordReference(id: string, contextId?: string): Promise<void>;
27
+ private getNextStage;
28
+ private getPromotionReason;
29
+ private getDecayFactor;
30
+ }
31
+ //# sourceMappingURL=dikw-pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dikw-pipeline.d.ts","sourceRoot":"","sources":["../src/dikw-pipeline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,qBAAa,YAAY;IACX,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,cAAc;IAEnC,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAc7G,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,SAAS,CAAC;QAAC,EAAE,CAAC,EAAE,SAAS,CAAA;KAAE,CAAC;IAc/F,iBAAiB,IAAI,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,SAAS,CAAC;YAAC,EAAE,EAAE,SAAS,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAgBlH,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASnE,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM;IASxC,UAAU,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IA2B5D,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBpE,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,cAAc;CAOvB"}
@@ -0,0 +1,130 @@
1
+ export class DikwPipeline {
2
+ store;
3
+ constructor(store) {
4
+ this.store = store;
5
+ }
6
+ async recordObservation(content, kind, projectId, tags) {
7
+ return this.store.storeKnowledge({
8
+ content,
9
+ kind,
10
+ dikwStage: 'nascent',
11
+ strength: 0.5,
12
+ tags: tags ?? [],
13
+ sourceCount: 1,
14
+ contextCount: 1,
15
+ projectId,
16
+ decayRate: 0.01,
17
+ });
18
+ }
19
+ async evaluatePromotion(id) {
20
+ const item = await this.store.getKnowledge(id);
21
+ if (!item)
22
+ return { promoted: false };
23
+ const nextStage = this.getNextStage(item);
24
+ if (!nextStage)
25
+ return { promoted: false };
26
+ const from = item.dikwStage;
27
+ await this.store.updateKnowledge(id, { dikwStage: nextStage });
28
+ await this.store.logMaturation(id, from, nextStage, this.getPromotionReason(from, nextStage, item), 'auto');
29
+ return { promoted: true, from, to: nextStage };
30
+ }
31
+ async runPromotionCycle() {
32
+ const allKnowledge = await this.store.getAllKnowledge();
33
+ const details = [];
34
+ for (const item of allKnowledge) {
35
+ if (item.dikwStage === 'canonical')
36
+ continue;
37
+ const result = await this.evaluatePromotion(item.id);
38
+ if (result.promoted && result.from && result.to) {
39
+ details.push({ id: item.id, from: result.from, to: result.to });
40
+ }
41
+ }
42
+ return { promoted: details.length, details };
43
+ }
44
+ async promoteToCanonical(id, reason) {
45
+ const item = await this.store.getKnowledge(id);
46
+ if (!item)
47
+ return;
48
+ const from = item.dikwStage;
49
+ await this.store.updateKnowledge(id, { dikwStage: 'canonical' });
50
+ await this.store.logMaturation(id, from, 'canonical', reason, 'human');
51
+ }
52
+ calculateStrength(item) {
53
+ const base = 0.5;
54
+ const sourceFactor = 1 + Math.log(Math.max(1, item.sourceCount));
55
+ const contextFactor = 1 + Math.log(Math.max(1, item.contextCount));
56
+ const decayFactor = this.getDecayFactor(item);
57
+ return base * sourceFactor * contextFactor * decayFactor;
58
+ }
59
+ async applyDecay() {
60
+ const allKnowledge = await this.store.getAllKnowledge();
61
+ let decayed = 0;
62
+ let archived = 0;
63
+ const now = new Date();
64
+ for (const item of allKnowledge) {
65
+ const newStrength = this.calculateStrength(item);
66
+ if (newStrength !== item.strength) {
67
+ await this.store.updateKnowledge(item.id, { strength: newStrength });
68
+ decayed++;
69
+ }
70
+ if (newStrength < 0.05 && item.lastAccessedAt) {
71
+ const lastAccessed = new Date(item.lastAccessedAt);
72
+ const daysSinceAccess = (now.getTime() - lastAccessed.getTime()) / (1000 * 60 * 60 * 24);
73
+ if (daysSinceAccess > 90) {
74
+ await this.store.deleteKnowledge(item.id);
75
+ archived++;
76
+ }
77
+ }
78
+ }
79
+ return { decayed, archived };
80
+ }
81
+ async recordReference(id, contextId) {
82
+ const item = await this.store.getKnowledge(id);
83
+ if (!item)
84
+ return;
85
+ const updates = {
86
+ sourceCount: item.sourceCount + 1,
87
+ lastAccessedAt: new Date().toISOString(),
88
+ };
89
+ if (contextId && contextId !== item.projectId) {
90
+ updates.contextCount = item.contextCount + 1;
91
+ }
92
+ await this.store.updateKnowledge(id, updates);
93
+ }
94
+ getNextStage(item) {
95
+ switch (item.dikwStage) {
96
+ case 'nascent':
97
+ if (item.sourceCount >= 2)
98
+ return 'emerging';
99
+ break;
100
+ case 'emerging':
101
+ if (item.sourceCount >= 5 && item.contextCount >= 3)
102
+ return 'established';
103
+ break;
104
+ case 'established':
105
+ break;
106
+ case 'canonical':
107
+ break;
108
+ }
109
+ return null;
110
+ }
111
+ getPromotionReason(from, to, item) {
112
+ switch (`${from}->${to}`) {
113
+ case 'nascent->emerging':
114
+ return `Auto-promoted: sourceCount=${item.sourceCount} >= 2`;
115
+ case 'emerging->established':
116
+ return `Auto-promoted: sourceCount=${item.sourceCount} >= 5, contextCount=${item.contextCount} >= 3`;
117
+ default:
118
+ return `Promoted from ${from} to ${to}`;
119
+ }
120
+ }
121
+ getDecayFactor(item) {
122
+ if (!item.lastAccessedAt)
123
+ return 1.0;
124
+ const now = new Date();
125
+ const lastAccessed = new Date(item.lastAccessedAt);
126
+ const daysSinceAccess = (now.getTime() - lastAccessed.getTime()) / (1000 * 60 * 60 * 24);
127
+ return Math.exp(-item.decayRate * daysSinceAccess);
128
+ }
129
+ }
130
+ //# sourceMappingURL=dikw-pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dikw-pipeline.js","sourceRoot":"","sources":["../src/dikw-pipeline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export interface EmbeddingProvider {
2
+ embed(text: string): Promise<number[]>;
3
+ embedBatch(texts: string[]): Promise<number[][]>;
4
+ readonly dimensions: number;
5
+ readonly ready: boolean;
6
+ }
7
+ export interface LocalEmbeddingProviderOptions {
8
+ model?: string;
9
+ cacheDir?: string;
10
+ }
11
+ export declare class LocalEmbeddingProvider implements EmbeddingProvider {
12
+ private _model;
13
+ private _cacheDir;
14
+ private _pipeline;
15
+ private _initPromise;
16
+ private _ready;
17
+ readonly dimensions = 384;
18
+ constructor(options?: LocalEmbeddingProviderOptions);
19
+ get ready(): boolean;
20
+ private ensureInitialized;
21
+ private _initialize;
22
+ embed(text: string): Promise<number[]>;
23
+ embedBatch(texts: string[]): Promise<number[][]>;
24
+ }
25
+ //# sourceMappingURL=embedding-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-provider.d.ts","sourceRoot":"","sources":["../src/embedding-provider.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACjD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAMD,MAAM,WAAW,6BAA6B;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,sBAAuB,YAAW,iBAAiB;IAC9D,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,MAAM,CAAS;IAEvB,QAAQ,CAAC,UAAU,OAAoB;gBAE3B,OAAO,CAAC,EAAE,6BAA6B;IAKnD,IAAI,KAAK,IAAI,OAAO,CAEnB;YAEa,iBAAiB;YAQjB,WAAW;IAcnB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAWtC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;CAevD"}