@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-gate.d.ts","sourceRoot":"","sources":["../../src/tools/cloud-gate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,QAAA,MAAM,gBAAgB,wQAWZ,CAAC;AAEX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACpD,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,EAAE,IAAI,CAAC;CACf,CAiBA;AAED;;;GAGG;AACH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqC9B,CAAC"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Cloud-gated tools return a structured error when called in local mode.
3
+ * These tools require a Synthaer cloud account.
4
+ */
5
+ const CLOUD_ONLY_TOOLS = [
6
+ 'ratify_knowledge',
7
+ 'verify_ratification',
8
+ 'get_ratification_stats',
9
+ 'publish_cross_project_event',
10
+ 'subscribe_cross_project_events',
11
+ 'get_cross_project_impact',
12
+ 'publish_topology',
13
+ 'get_topology',
14
+ 'process_unembedded_knowledge',
15
+ 'get_embedding_stats',
16
+ ];
17
+ export function isCloudOnlyTool(name) {
18
+ return CLOUD_ONLY_TOOLS.includes(name);
19
+ }
20
+ export function cloudRequiredError(toolName) {
21
+ return {
22
+ content: [
23
+ {
24
+ type: 'text',
25
+ text: JSON.stringify({
26
+ error: 'requires_cloud',
27
+ tool: toolName,
28
+ message: `This tool requires a Synthaer cloud account. ` +
29
+ `Set SYNTHAER_API_KEY or visit synthaer.ai/pricing.`,
30
+ upgrade_url: 'https://synthaer.ai/pricing',
31
+ }),
32
+ },
33
+ ],
34
+ isError: true,
35
+ };
36
+ }
37
+ /**
38
+ * Tool definitions for cloud-only tools.
39
+ * These are registered so agents can discover them and get guidance on upgrade.
40
+ */
41
+ export const CLOUD_ONLY_TOOL_DEFINITIONS = [
42
+ {
43
+ name: 'ratify_knowledge',
44
+ description: 'Ratify local knowledge items to the Synthaer cloud. Requires cloud account.',
45
+ inputSchema: {
46
+ type: 'object',
47
+ properties: {
48
+ ids: { type: 'array', items: { type: 'string' } },
49
+ project: { type: 'string' },
50
+ },
51
+ required: ['ids'],
52
+ },
53
+ },
54
+ {
55
+ name: 'verify_ratification',
56
+ description: 'Verify the ratification status of knowledge items. Requires cloud account.',
57
+ inputSchema: {
58
+ type: 'object',
59
+ properties: {
60
+ ids: { type: 'array', items: { type: 'string' } },
61
+ },
62
+ required: ['ids'],
63
+ },
64
+ },
65
+ {
66
+ name: 'publish_cross_project_event',
67
+ description: 'Publish a cross-project event. Requires cloud account.',
68
+ inputSchema: {
69
+ type: 'object',
70
+ properties: {
71
+ event: { type: 'string' },
72
+ project: { type: 'string' },
73
+ data: { type: 'object' },
74
+ },
75
+ required: ['event', 'project'],
76
+ },
77
+ },
78
+ ];
79
+ //# sourceMappingURL=cloud-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloud-gate.js","sourceRoot":"","sources":["../../src/tools/cloud-gate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,gBAAgB,GAAG;IACvB,kBAAkB;IAClB,qBAAqB;IACrB,wBAAwB;IACxB,6BAA6B;IAC7B,gCAAgC;IAChC,0BAA0B;IAC1B,kBAAkB;IAClB,cAAc;IACd,8BAA8B;IAC9B,qBAAqB;CACb,CAAC;AAIX,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAQ,gBAAsC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IAIjD,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,gBAAgB;oBACvB,IAAI,EAAE,QAAQ;oBACd,OAAO,EACL,+CAA+C;wBAC/C,oDAAoD;oBACtD,WAAW,EAAE,6BAA6B;iBAC3C,CAAC;aACH;SACF;QACD,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,6EAA6E;QAC1F,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,GAAG,EAAE,EAAE,IAAI,EAAE,OAAgB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE,EAAE;gBACnE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE;aACrC;YACD,QAAQ,EAAE,CAAC,KAAK,CAAU;SAC3B;KACF;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EAAE,4EAA4E;QACzF,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,GAAG,EAAE,EAAE,IAAI,EAAE,OAAgB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE,EAAE;aACpE;YACD,QAAQ,EAAE,CAAC,KAAK,CAAU;SAC3B;KACF;IACD;QACE,IAAI,EAAE,6BAA6B;QACnC,WAAW,EAAE,wDAAwD;QACrE,WAAW,EAAE;YACX,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE;gBAClC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE;gBACpC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAiB,EAAE;aAClC;YACD,QAAQ,EAAE,CAAC,OAAO,EAAE,SAAS,CAAU;SACxC;KACF;CACO,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { PGlite } from '@electric-sql/pglite';
2
+ import type { EmbeddingProvider } from '../embeddings/local.js';
3
+ export interface StoreExperienceInput {
4
+ content: string;
5
+ kind?: number | string;
6
+ agentId?: string;
7
+ sessionId?: string;
8
+ project?: string;
9
+ tags?: string[];
10
+ relatedKnowledgeIds?: string[];
11
+ }
12
+ export interface RecallExperiencesInput {
13
+ query: string;
14
+ limit?: number;
15
+ project?: string;
16
+ agentId?: string;
17
+ }
18
+ export declare function handleStoreExperience(db: PGlite, embedder: EmbeddingProvider | null, input: StoreExperienceInput): Promise<Record<string, unknown>>;
19
+ export declare function handleRecallExperiences(db: PGlite, embedder: EmbeddingProvider | null, input: RecallExperiencesInput): Promise<Record<string, unknown>>;
20
+ //# sourceMappingURL=experiences.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"experiences.d.ts","sourceRoot":"","sources":["../../src/tools/experiences.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AA4BhE,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,iBAAiB,GAAG,IAAI,EAClC,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAwClC;AAED,wBAAsB,uBAAuB,CAC3C,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,iBAAiB,GAAG,IAAI,EAClC,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA4FlC"}
@@ -0,0 +1,135 @@
1
+ import crypto from 'node:crypto';
2
+ function parseJsonb(value) {
3
+ if (typeof value === 'string')
4
+ return JSON.parse(value);
5
+ return value;
6
+ }
7
+ function resolveExperienceKind(value) {
8
+ if (typeof value === 'number' && value >= 1 && value <= 4)
9
+ return value;
10
+ if (typeof value === 'string') {
11
+ const map = { success: 1, failure: 2, discovery: 3, blocker: 4 };
12
+ return map[value.toLowerCase()] ?? 3;
13
+ }
14
+ return 3; // default: discovery
15
+ }
16
+ export async function handleStoreExperience(db, embedder, input) {
17
+ const id = crypto.randomUUID();
18
+ const now = new Date().toISOString();
19
+ const kind = resolveExperienceKind(input.kind);
20
+ let embeddingStr = null;
21
+ if (embedder) {
22
+ try {
23
+ const vector = await embedder.embed(input.content);
24
+ embeddingStr = `[${vector.join(',')}]`;
25
+ }
26
+ catch {
27
+ // Non-fatal
28
+ }
29
+ }
30
+ await db.query(`INSERT INTO experiences
31
+ (id, agent_id, session_id, content, kind, project_id, related_knowledge_ids, tags, local_embedding, created_at)
32
+ VALUES ($1, $2, $3, $4, $5, $6, $7::jsonb, $8::jsonb, $9::vector, $10)`, [
33
+ id,
34
+ input.agentId ?? null,
35
+ input.sessionId ?? null,
36
+ input.content,
37
+ kind,
38
+ input.project ?? null,
39
+ JSON.stringify(input.relatedKnowledgeIds ?? []),
40
+ JSON.stringify(input.tags ?? []),
41
+ embeddingStr,
42
+ now,
43
+ ]);
44
+ return {
45
+ id,
46
+ kind,
47
+ project: input.project ?? null,
48
+ agentId: input.agentId ?? null,
49
+ createdAt: now,
50
+ };
51
+ }
52
+ export async function handleRecallExperiences(db, embedder, input) {
53
+ const limit = input.limit ?? 20;
54
+ // Try vector search first
55
+ if (embedder?.ready) {
56
+ try {
57
+ const queryVector = await embedder.embed(input.query);
58
+ const vectorStr = `[${queryVector.join(',')}]`;
59
+ let sql = `
60
+ SELECT *, 1 - (local_embedding <=> $1::vector) as similarity
61
+ FROM experiences
62
+ WHERE local_embedding IS NOT NULL
63
+ `;
64
+ const params = [vectorStr];
65
+ let paramIndex = 1;
66
+ if (input.project) {
67
+ paramIndex++;
68
+ sql += ` AND project_id = $${paramIndex}`;
69
+ params.push(input.project);
70
+ }
71
+ if (input.agentId) {
72
+ paramIndex++;
73
+ sql += ` AND agent_id = $${paramIndex}`;
74
+ params.push(input.agentId);
75
+ }
76
+ paramIndex++;
77
+ sql += ` ORDER BY local_embedding <=> $1::vector LIMIT $${paramIndex}`;
78
+ params.push(limit);
79
+ const result = await db.query(sql, params);
80
+ return {
81
+ experiences: result.rows.map((row) => ({
82
+ id: row.id,
83
+ content: row.content,
84
+ kind: row.kind,
85
+ agentId: row.agent_id,
86
+ sessionId: row.session_id,
87
+ project: row.project_id,
88
+ tags: parseJsonb(row.tags),
89
+ relatedKnowledgeIds: parseJsonb(row.related_knowledge_ids),
90
+ similarity: row.similarity,
91
+ createdAt: row.created_at,
92
+ })),
93
+ total: result.rows.length,
94
+ method: 'vector',
95
+ };
96
+ }
97
+ catch {
98
+ // Fall through to keyword search
99
+ }
100
+ }
101
+ // Fallback: ILIKE keyword search
102
+ let sql = `SELECT * FROM experiences WHERE content ILIKE $1`;
103
+ const params = [`%${input.query}%`];
104
+ let paramIndex = 1;
105
+ if (input.project) {
106
+ paramIndex++;
107
+ sql += ` AND project_id = $${paramIndex}`;
108
+ params.push(input.project);
109
+ }
110
+ if (input.agentId) {
111
+ paramIndex++;
112
+ sql += ` AND agent_id = $${paramIndex}`;
113
+ params.push(input.agentId);
114
+ }
115
+ paramIndex++;
116
+ sql += ` ORDER BY created_at DESC LIMIT $${paramIndex}`;
117
+ params.push(limit);
118
+ const result = await db.query(sql, params);
119
+ return {
120
+ experiences: result.rows.map((row) => ({
121
+ id: row.id,
122
+ content: row.content,
123
+ kind: row.kind,
124
+ agentId: row.agent_id,
125
+ sessionId: row.session_id,
126
+ project: row.project_id,
127
+ tags: parseJsonb(row.tags),
128
+ relatedKnowledgeIds: parseJsonb(row.related_knowledge_ids),
129
+ createdAt: row.created_at,
130
+ })),
131
+ total: result.rows.length,
132
+ method: 'keyword',
133
+ };
134
+ }
135
+ //# sourceMappingURL=experiences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"experiences.js","sourceRoot":"","sources":["../../src/tools/experiences.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { PGlite } from '@electric-sql/pglite';
2
+ import type { EmbeddingProvider } from '../embeddings/local.js';
3
+ export interface StoreKnowledgeInput {
4
+ content: string;
5
+ kind?: number | string;
6
+ tags?: string[];
7
+ context?: Record<string, unknown>;
8
+ project?: string;
9
+ sourceAgent?: string;
10
+ dikwStage?: string;
11
+ importance?: number;
12
+ }
13
+ export interface RecallKnowledgeInput {
14
+ id: string;
15
+ }
16
+ export interface SearchKnowledgeInput {
17
+ query: string;
18
+ limit?: number;
19
+ project?: string;
20
+ tags?: string[];
21
+ minStrength?: number;
22
+ }
23
+ export interface EndorseInput {
24
+ id: string;
25
+ agent?: string;
26
+ }
27
+ export interface ChallengeInput {
28
+ id: string;
29
+ reason?: string;
30
+ agent?: string;
31
+ }
32
+ export declare function handleStoreKnowledge(db: PGlite, embedder: EmbeddingProvider | null, input: StoreKnowledgeInput): Promise<Record<string, unknown>>;
33
+ export declare function handleRecallKnowledge(db: PGlite, input: RecallKnowledgeInput): Promise<Record<string, unknown>>;
34
+ export declare function handleSemanticSearch(db: PGlite, embedder: EmbeddingProvider | null, input: SearchKnowledgeInput): Promise<Record<string, unknown>>;
35
+ export declare function handleEndorseKnowledge(db: PGlite, input: EndorseInput): Promise<Record<string, unknown>>;
36
+ export declare function handleChallengeKnowledge(db: PGlite, input: ChallengeInput): Promise<Record<string, unknown>>;
37
+ //# sourceMappingURL=knowledge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../../src/tools/knowledge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AA4BhE,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAmBD,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,iBAAiB,GAAG,IAAI,EAClC,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAqClC;AAED,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAkClC;AAED,wBAAsB,oBAAoB,CACxC,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,iBAAiB,GAAG,IAAI,EAClC,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAoGlC;AAED,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAuBlC;AAED,wBAAsB,wBAAwB,CAC5C,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAyBlC"}
@@ -0,0 +1,213 @@
1
+ import crypto from 'node:crypto';
2
+ function parseJsonb(value) {
3
+ if (typeof value === 'string')
4
+ return JSON.parse(value);
5
+ return value;
6
+ }
7
+ function resolveKind(value) {
8
+ if (typeof value === 'number' && value >= 1 && value <= 5)
9
+ return value;
10
+ if (typeof value === 'string') {
11
+ const map = { fact: 1, pattern: 2, error: 3, decision: 4, principle: 5 };
12
+ return map[value.toLowerCase()] ?? 1;
13
+ }
14
+ return 1;
15
+ }
16
+ function resolveDikwStage(value) {
17
+ const valid = ['nascent', 'emerging', 'established', 'canonical'];
18
+ if (typeof value === 'string' && valid.includes(value.toLowerCase())) {
19
+ return value.toLowerCase();
20
+ }
21
+ return 'nascent';
22
+ }
23
+ export async function handleStoreKnowledge(db, embedder, input) {
24
+ const id = crypto.randomUUID();
25
+ const now = new Date().toISOString();
26
+ const kind = resolveKind(input.kind);
27
+ const dikwStage = resolveDikwStage(input.dikwStage);
28
+ const tags = JSON.stringify(input.tags ?? []);
29
+ const context = input.context ? JSON.stringify(input.context) : null;
30
+ const strength = input.importance ?? 0.5;
31
+ // Generate embedding asynchronously — do not block the store
32
+ let embeddingStr = null;
33
+ if (embedder) {
34
+ try {
35
+ const vector = await embedder.embed(input.content);
36
+ embeddingStr = `[${vector.join(',')}]`;
37
+ }
38
+ catch {
39
+ // Non-fatal: store without embedding, search falls back to ILIKE
40
+ }
41
+ }
42
+ await db.query(`INSERT INTO knowledge
43
+ (id, content, kind, dikw_stage, strength, tags, context, project_id, source_agent, local_embedding, created_at, updated_at)
44
+ VALUES ($1, $2, $3, $4, $5, $6::jsonb, $7::jsonb, $8, $9, $10::vector, $11, $12)`, [id, input.content, kind, dikwStage, strength, tags, context,
45
+ input.project ?? null, input.sourceAgent ?? null, embeddingStr, now, now]);
46
+ return {
47
+ id,
48
+ kind,
49
+ dikwStage,
50
+ strength,
51
+ tags: input.tags ?? [],
52
+ project: input.project ?? null,
53
+ createdAt: now,
54
+ };
55
+ }
56
+ export async function handleRecallKnowledge(db, input) {
57
+ const result = await db.query(`SELECT * FROM knowledge WHERE id = $1`, [input.id]);
58
+ const row = result.rows[0];
59
+ if (!row) {
60
+ return { error: 'not_found', id: input.id };
61
+ }
62
+ // Update last_accessed_at
63
+ await db.query(`UPDATE knowledge SET last_accessed_at = $1 WHERE id = $2`, [new Date().toISOString(), input.id]);
64
+ return {
65
+ id: row.id,
66
+ content: row.content,
67
+ kind: row.kind,
68
+ dikwStage: row.dikw_stage,
69
+ strength: row.strength,
70
+ tags: parseJsonb(row.tags),
71
+ context: row.context ? parseJsonb(row.context) : null,
72
+ project: row.project_id,
73
+ sourceAgent: row.source_agent,
74
+ endorsements: row.endorsements,
75
+ challenges: row.challenges,
76
+ trustScore: row.trust_score,
77
+ createdAt: row.created_at,
78
+ updatedAt: row.updated_at,
79
+ lastAccessedAt: row.last_accessed_at,
80
+ };
81
+ }
82
+ export async function handleSemanticSearch(db, embedder, input) {
83
+ const limit = input.limit ?? 20;
84
+ // Try vector search first if embedder is available
85
+ if (embedder?.ready) {
86
+ try {
87
+ const queryVector = await embedder.embed(input.query);
88
+ const vectorStr = `[${queryVector.join(',')}]`;
89
+ let sql = `
90
+ SELECT *, 1 - (local_embedding <=> $1::vector) as similarity
91
+ FROM knowledge
92
+ WHERE local_embedding IS NOT NULL
93
+ `;
94
+ const params = [vectorStr];
95
+ let paramIndex = 1;
96
+ if (input.project) {
97
+ paramIndex++;
98
+ sql += ` AND project_id = $${paramIndex}`;
99
+ params.push(input.project);
100
+ }
101
+ if (input.minStrength !== undefined) {
102
+ paramIndex++;
103
+ sql += ` AND strength >= $${paramIndex}`;
104
+ params.push(input.minStrength);
105
+ }
106
+ if (input.tags && input.tags.length > 0) {
107
+ paramIndex++;
108
+ sql += ` AND tags @> $${paramIndex}::jsonb`;
109
+ params.push(JSON.stringify(input.tags));
110
+ }
111
+ paramIndex++;
112
+ sql += ` ORDER BY local_embedding <=> $1::vector LIMIT $${paramIndex}`;
113
+ params.push(limit);
114
+ const result = await db.query(sql, params);
115
+ return {
116
+ results: result.rows.map((row) => ({
117
+ id: row.id,
118
+ content: row.content,
119
+ kind: row.kind,
120
+ dikwStage: row.dikw_stage,
121
+ strength: row.strength,
122
+ tags: parseJsonb(row.tags),
123
+ project: row.project_id,
124
+ similarity: row.similarity,
125
+ createdAt: row.created_at,
126
+ })),
127
+ total: result.rows.length,
128
+ method: 'vector',
129
+ };
130
+ }
131
+ catch {
132
+ // Fall through to ILIKE search
133
+ }
134
+ }
135
+ // Fallback: ILIKE keyword search
136
+ let sql = `SELECT * FROM knowledge WHERE content ILIKE $1`;
137
+ const params = [`%${input.query}%`];
138
+ let paramIndex = 1;
139
+ if (input.project) {
140
+ paramIndex++;
141
+ sql += ` AND project_id = $${paramIndex}`;
142
+ params.push(input.project);
143
+ }
144
+ if (input.minStrength !== undefined) {
145
+ paramIndex++;
146
+ sql += ` AND strength >= $${paramIndex}`;
147
+ params.push(input.minStrength);
148
+ }
149
+ if (input.tags && input.tags.length > 0) {
150
+ paramIndex++;
151
+ sql += ` AND tags @> $${paramIndex}::jsonb`;
152
+ params.push(JSON.stringify(input.tags));
153
+ }
154
+ paramIndex++;
155
+ sql += ` ORDER BY updated_at DESC LIMIT $${paramIndex}`;
156
+ params.push(limit);
157
+ const result = await db.query(sql, params);
158
+ return {
159
+ results: result.rows.map((row) => ({
160
+ id: row.id,
161
+ content: row.content,
162
+ kind: row.kind,
163
+ dikwStage: row.dikw_stage,
164
+ strength: row.strength,
165
+ tags: parseJsonb(row.tags),
166
+ project: row.project_id,
167
+ createdAt: row.created_at,
168
+ })),
169
+ total: result.rows.length,
170
+ method: 'keyword',
171
+ };
172
+ }
173
+ export async function handleEndorseKnowledge(db, input) {
174
+ const result = await db.query(`UPDATE knowledge
175
+ SET endorsements = endorsements + 1,
176
+ trust_score = LEAST(1.0, trust_score + 0.05),
177
+ strength = LEAST(1.0, strength + 0.02),
178
+ updated_at = $2
179
+ WHERE id = $1
180
+ RETURNING endorsements, challenges`, [input.id, new Date().toISOString()]);
181
+ if (result.rows.length === 0) {
182
+ return { error: 'not_found', id: input.id };
183
+ }
184
+ const row = result.rows[0];
185
+ return {
186
+ id: input.id,
187
+ endorsements: row.endorsements,
188
+ challenges: row.challenges,
189
+ action: 'endorsed',
190
+ };
191
+ }
192
+ export async function handleChallengeKnowledge(db, input) {
193
+ const result = await db.query(`UPDATE knowledge
194
+ SET challenges = challenges + 1,
195
+ trust_score = GREATEST(0.0, trust_score - 0.1),
196
+ strength = GREATEST(0.0, strength - 0.05),
197
+ updated_at = $2
198
+ WHERE id = $1
199
+ RETURNING endorsements, challenges, trust_score`, [input.id, new Date().toISOString()]);
200
+ if (result.rows.length === 0) {
201
+ return { error: 'not_found', id: input.id };
202
+ }
203
+ const row = result.rows[0];
204
+ return {
205
+ id: input.id,
206
+ endorsements: row.endorsements,
207
+ challenges: row.challenges,
208
+ trustScore: row.trust_score,
209
+ reason: input.reason ?? null,
210
+ action: 'challenged',
211
+ };
212
+ }
213
+ //# sourceMappingURL=knowledge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/tools/knowledge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { PGlite } from '@electric-sql/pglite';
2
+ export interface SessionResumeInput {
3
+ agentId: string;
4
+ projectId: string;
5
+ }
6
+ export interface MemoryCheckpointInput {
7
+ sessionId: string;
8
+ }
9
+ export declare function handleSessionResume(db: PGlite, input: SessionResumeInput): Promise<Record<string, unknown>>;
10
+ export declare function handleMemoryCheckpoint(db: PGlite, input: MemoryCheckpointInput): Promise<Record<string, unknown>>;
11
+ //# sourceMappingURL=sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/tools/sessions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAuBnD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAiDlC;AAED,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA6BlC"}
@@ -0,0 +1,66 @@
1
+ import crypto from 'node:crypto';
2
+ function parseJsonb(value) {
3
+ if (typeof value === 'string')
4
+ return JSON.parse(value);
5
+ return value;
6
+ }
7
+ export async function handleSessionResume(db, input) {
8
+ // Look for the most recent session for this agent/project pair
9
+ const result = await db.query(`SELECT * FROM sessions
10
+ WHERE agent_id = $1 AND project_id = $2
11
+ ORDER BY updated_at DESC LIMIT 1`, [input.agentId, input.projectId]);
12
+ const existing = result.rows[0];
13
+ if (existing) {
14
+ return {
15
+ session: {
16
+ id: existing.id,
17
+ agentId: existing.agent_id,
18
+ projectId: existing.project_id,
19
+ checkpoint: existing.checkpoint
20
+ ? parseJsonb(existing.checkpoint)
21
+ : null,
22
+ memory: parseJsonb(existing.memory),
23
+ createdAt: existing.created_at,
24
+ updatedAt: existing.updated_at,
25
+ },
26
+ resumed: true,
27
+ };
28
+ }
29
+ // Create a new session
30
+ const id = crypto.randomUUID();
31
+ const now = new Date().toISOString();
32
+ await db.query(`INSERT INTO sessions (id, agent_id, project_id, checkpoint, memory, created_at, updated_at)
33
+ VALUES ($1, $2, $3, $4, $5, $6, $7)`, [id, input.agentId, input.projectId, null, '[]', now, now]);
34
+ return {
35
+ session: {
36
+ id,
37
+ agentId: input.agentId,
38
+ projectId: input.projectId,
39
+ checkpoint: null,
40
+ memory: [],
41
+ createdAt: now,
42
+ updatedAt: now,
43
+ },
44
+ resumed: false,
45
+ };
46
+ }
47
+ export async function handleMemoryCheckpoint(db, input) {
48
+ const result = await db.query(`SELECT * FROM sessions WHERE id = $1`, [input.sessionId]);
49
+ const session = result.rows[0];
50
+ if (!session) {
51
+ return { error: 'not_found', sessionId: input.sessionId };
52
+ }
53
+ const memory = parseJsonb(session.memory);
54
+ const now = new Date().toISOString();
55
+ const checkpoint = {
56
+ memoryLength: memory.length,
57
+ capturedAt: now,
58
+ };
59
+ await db.query(`UPDATE sessions SET checkpoint = $1::jsonb, updated_at = $2 WHERE id = $3`, [JSON.stringify(checkpoint), now, input.sessionId]);
60
+ return {
61
+ sessionId: input.sessionId,
62
+ checkpoint,
63
+ action: 'checkpointed',
64
+ };
65
+ }
66
+ //# sourceMappingURL=sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/tools/sessions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { PGlite } from '@electric-sql/pglite';
2
+ export interface GetTrustInput {
3
+ id: string;
4
+ }
5
+ export interface UpdateTrustInput {
6
+ id: string;
7
+ adjustment: number;
8
+ reason?: string;
9
+ }
10
+ /**
11
+ * Get the trust score and endorsement/challenge counts for a knowledge item.
12
+ */
13
+ export declare function handleGetTrust(db: PGlite, input: GetTrustInput): Promise<Record<string, unknown>>;
14
+ /**
15
+ * Manually adjust the trust score for a knowledge item.
16
+ */
17
+ export declare function handleUpdateTrust(db: PGlite, input: UpdateTrustInput): Promise<Record<string, unknown>>;
18
+ //# sourceMappingURL=trust.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trust.d.ts","sourceRoot":"","sources":["../../src/tools/trust.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA6BlC;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAqBlC"}