@hasna/mementos 0.14.30 → 0.14.32

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 (240) hide show
  1. package/LICENSE +190 -3
  2. package/README.md +34 -34
  3. package/dist/cli/brains.d.ts +3 -0
  4. package/dist/cli/brains.d.ts.map +1 -0
  5. package/dist/cli/index.d.ts +3 -0
  6. package/dist/cli/index.d.ts.map +1 -0
  7. package/dist/cli/index.js +25767 -0
  8. package/dist/db/acl.d.ts +34 -0
  9. package/dist/db/acl.d.ts.map +1 -0
  10. package/dist/db/agents.d.ts +15 -0
  11. package/dist/db/agents.d.ts.map +1 -0
  12. package/dist/db/audit.d.ts +39 -0
  13. package/dist/db/audit.d.ts.map +1 -0
  14. package/dist/db/database.d.ts +10 -0
  15. package/dist/db/database.d.ts.map +1 -0
  16. package/dist/db/entities.d.ts +62 -0
  17. package/dist/db/entities.d.ts.map +1 -0
  18. package/dist/db/entity-memories.d.ts +34 -0
  19. package/dist/db/entity-memories.d.ts.map +1 -0
  20. package/dist/db/locks.d.ts +63 -0
  21. package/dist/db/locks.d.ts.map +1 -0
  22. package/dist/db/machines.d.ts +16 -0
  23. package/dist/db/machines.d.ts.map +1 -0
  24. package/dist/db/memories.d.ts +40 -0
  25. package/dist/db/memories.d.ts.map +1 -0
  26. package/dist/db/pg-migrate.d.ts +14 -0
  27. package/dist/db/pg-migrate.d.ts.map +1 -0
  28. package/dist/db/pg-migrations.d.ts +8 -0
  29. package/dist/db/pg-migrations.d.ts.map +1 -0
  30. package/dist/db/projects.d.ts +6 -0
  31. package/dist/db/projects.d.ts.map +1 -0
  32. package/dist/db/ratings.d.ts +23 -0
  33. package/dist/db/ratings.d.ts.map +1 -0
  34. package/dist/db/relations.d.ts +29 -0
  35. package/dist/db/relations.d.ts.map +1 -0
  36. package/dist/db/session-jobs.d.ts +49 -0
  37. package/dist/db/session-jobs.d.ts.map +1 -0
  38. package/dist/db/synthesis.d.ts +101 -0
  39. package/dist/db/synthesis.d.ts.map +1 -0
  40. package/dist/db/tool-events.d.ts +27 -0
  41. package/dist/db/tool-events.d.ts.map +1 -0
  42. package/dist/db/webhook_hooks.d.ts +25 -0
  43. package/dist/db/webhook_hooks.d.ts.map +1 -0
  44. package/dist/index.d.ts +27 -4
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +14642 -1006
  47. package/dist/lib/activation-matcher.d.ts +16 -0
  48. package/dist/lib/activation-matcher.d.ts.map +1 -0
  49. package/dist/lib/asmr/categorizer.d.ts +31 -0
  50. package/dist/lib/asmr/categorizer.d.ts.map +1 -0
  51. package/dist/lib/asmr/context-agent.d.ts +4 -0
  52. package/dist/lib/asmr/context-agent.d.ts.map +1 -0
  53. package/dist/lib/asmr/ensemble.d.ts +23 -0
  54. package/dist/lib/asmr/ensemble.d.ts.map +1 -0
  55. package/dist/lib/asmr/fact-agent.d.ts +4 -0
  56. package/dist/lib/asmr/fact-agent.d.ts.map +1 -0
  57. package/dist/lib/asmr/index.d.ts +7 -0
  58. package/dist/lib/asmr/index.d.ts.map +1 -0
  59. package/dist/lib/asmr/orchestrator.d.ts +4 -0
  60. package/dist/lib/asmr/orchestrator.d.ts.map +1 -0
  61. package/dist/lib/asmr/temporal-agent.d.ts +4 -0
  62. package/dist/lib/asmr/temporal-agent.d.ts.map +1 -0
  63. package/dist/lib/asmr/types.d.ts +27 -0
  64. package/dist/lib/asmr/types.d.ts.map +1 -0
  65. package/dist/lib/auto-inject-orchestrator.d.ts +57 -0
  66. package/dist/lib/auto-inject-orchestrator.d.ts.map +1 -0
  67. package/dist/lib/auto-memory-queue.d.ts +46 -0
  68. package/dist/lib/auto-memory-queue.d.ts.map +1 -0
  69. package/dist/lib/auto-memory.d.ts +18 -0
  70. package/dist/lib/auto-memory.d.ts.map +1 -0
  71. package/dist/lib/bench.d.ts +20 -0
  72. package/dist/lib/bench.d.ts.map +1 -0
  73. package/dist/lib/built-in-hooks.d.ts +12 -0
  74. package/dist/lib/built-in-hooks.d.ts.map +1 -0
  75. package/dist/lib/channel-pusher.d.ts +39 -0
  76. package/dist/lib/channel-pusher.d.ts.map +1 -0
  77. package/dist/lib/config.d.ts +9 -0
  78. package/dist/lib/config.d.ts.map +1 -0
  79. package/dist/lib/connectors/files.d.ts +8 -0
  80. package/dist/lib/connectors/files.d.ts.map +1 -0
  81. package/dist/lib/connectors/github.d.ts +7 -0
  82. package/dist/lib/connectors/github.d.ts.map +1 -0
  83. package/dist/lib/connectors/index.d.ts +12 -0
  84. package/dist/lib/connectors/index.d.ts.map +1 -0
  85. package/dist/lib/connectors/notion.d.ts +7 -0
  86. package/dist/lib/connectors/notion.d.ts.map +1 -0
  87. package/dist/lib/connectors/types.d.ts +27 -0
  88. package/dist/lib/connectors/types.d.ts.map +1 -0
  89. package/dist/lib/context-extractor.d.ts +14 -0
  90. package/dist/lib/context-extractor.d.ts.map +1 -0
  91. package/dist/lib/context.d.ts +35 -0
  92. package/dist/lib/context.d.ts.map +1 -0
  93. package/dist/lib/contradiction.d.ts +50 -0
  94. package/dist/lib/contradiction.d.ts.map +1 -0
  95. package/dist/lib/decay.d.ts +35 -0
  96. package/dist/lib/decay.d.ts.map +1 -0
  97. package/dist/lib/dedup.d.ts +33 -0
  98. package/dist/lib/dedup.d.ts.map +1 -0
  99. package/dist/lib/duration.d.ts +28 -0
  100. package/dist/lib/duration.d.ts.map +1 -0
  101. package/dist/lib/embeddings.d.ts +20 -0
  102. package/dist/lib/embeddings.d.ts.map +1 -0
  103. package/dist/lib/export-v1.d.ts +30 -0
  104. package/dist/lib/export-v1.d.ts.map +1 -0
  105. package/dist/lib/extractor.d.ts +9 -0
  106. package/dist/lib/extractor.d.ts.map +1 -0
  107. package/dist/lib/extractors/audio.d.ts +8 -0
  108. package/dist/lib/extractors/audio.d.ts.map +1 -0
  109. package/dist/lib/extractors/index.d.ts +12 -0
  110. package/dist/lib/extractors/index.d.ts.map +1 -0
  111. package/dist/lib/extractors/ocr.d.ts +7 -0
  112. package/dist/lib/extractors/ocr.d.ts.map +1 -0
  113. package/dist/lib/extractors/pdf.d.ts +7 -0
  114. package/dist/lib/extractors/pdf.d.ts.map +1 -0
  115. package/dist/lib/extractors/types.d.ts +12 -0
  116. package/dist/lib/extractors/types.d.ts.map +1 -0
  117. package/dist/lib/file-deps.d.ts +27 -0
  118. package/dist/lib/file-deps.d.ts.map +1 -0
  119. package/dist/lib/focus.d.ts +58 -0
  120. package/dist/lib/focus.d.ts.map +1 -0
  121. package/dist/lib/gatherer.d.ts +16 -0
  122. package/dist/lib/gatherer.d.ts.map +1 -0
  123. package/dist/lib/gdpr.d.ts +24 -0
  124. package/dist/lib/gdpr.d.ts.map +1 -0
  125. package/dist/lib/hooks.d.ts +50 -0
  126. package/dist/lib/hooks.d.ts.map +1 -0
  127. package/dist/lib/importers/index.d.ts +38 -0
  128. package/dist/lib/importers/index.d.ts.map +1 -0
  129. package/dist/lib/injector.d.ts +86 -0
  130. package/dist/lib/injector.d.ts.map +1 -0
  131. package/dist/lib/matryoshka.d.ts +50 -0
  132. package/dist/lib/matryoshka.d.ts.map +1 -0
  133. package/dist/lib/memory-lock.d.ts +58 -0
  134. package/dist/lib/memory-lock.d.ts.map +1 -0
  135. package/dist/lib/model-config.d.ts +14 -0
  136. package/dist/lib/model-config.d.ts.map +1 -0
  137. package/dist/lib/open-sessions-connector.d.ts +60 -0
  138. package/dist/lib/open-sessions-connector.d.ts.map +1 -0
  139. package/dist/lib/poisoning.d.ts +19 -0
  140. package/dist/lib/poisoning.d.ts.map +1 -0
  141. package/dist/lib/poll.d.ts +17 -0
  142. package/dist/lib/poll.d.ts.map +1 -0
  143. package/dist/lib/procedural-extractor.d.ts +21 -0
  144. package/dist/lib/procedural-extractor.d.ts.map +1 -0
  145. package/dist/lib/profile-sync.d.ts +20 -0
  146. package/dist/lib/profile-sync.d.ts.map +1 -0
  147. package/dist/lib/profile-synthesizer.d.ts +20 -0
  148. package/dist/lib/profile-synthesizer.d.ts.map +1 -0
  149. package/dist/lib/project-detect.d.ts +18 -0
  150. package/dist/lib/project-detect.d.ts.map +1 -0
  151. package/dist/lib/providers/anthropic.d.ts +21 -0
  152. package/dist/lib/providers/anthropic.d.ts.map +1 -0
  153. package/dist/lib/providers/base.d.ts +96 -0
  154. package/dist/lib/providers/base.d.ts.map +1 -0
  155. package/dist/lib/providers/cerebras.d.ts +20 -0
  156. package/dist/lib/providers/cerebras.d.ts.map +1 -0
  157. package/dist/lib/providers/grok.d.ts +19 -0
  158. package/dist/lib/providers/grok.d.ts.map +1 -0
  159. package/dist/lib/providers/index.d.ts +7 -0
  160. package/dist/lib/providers/index.d.ts.map +1 -0
  161. package/dist/lib/providers/openai-compat.d.ts +18 -0
  162. package/dist/lib/providers/openai-compat.d.ts.map +1 -0
  163. package/dist/lib/providers/openai.d.ts +20 -0
  164. package/dist/lib/providers/openai.d.ts.map +1 -0
  165. package/dist/lib/providers/registry.d.ts +38 -0
  166. package/dist/lib/providers/registry.d.ts.map +1 -0
  167. package/dist/lib/quality.d.ts +16 -0
  168. package/dist/lib/quality.d.ts.map +1 -0
  169. package/dist/lib/redact.d.ts +10 -0
  170. package/dist/lib/redact.d.ts.map +1 -0
  171. package/dist/lib/remote-sync.d.ts +49 -0
  172. package/dist/lib/remote-sync.d.ts.map +1 -0
  173. package/dist/lib/retention.d.ts +17 -0
  174. package/dist/lib/retention.d.ts.map +1 -0
  175. package/dist/lib/search.d.ts +52 -0
  176. package/dist/lib/search.d.ts.map +1 -0
  177. package/dist/lib/session-auto-resolve.d.ts +28 -0
  178. package/dist/lib/session-auto-resolve.d.ts.map +1 -0
  179. package/dist/lib/session-processor.d.ts +38 -0
  180. package/dist/lib/session-processor.d.ts.map +1 -0
  181. package/dist/lib/session-queue.d.ts +28 -0
  182. package/dist/lib/session-queue.d.ts.map +1 -0
  183. package/dist/lib/session-registry.d.ts +47 -0
  184. package/dist/lib/session-registry.d.ts.map +1 -0
  185. package/dist/lib/session-start-briefing.d.ts +10 -0
  186. package/dist/lib/session-start-briefing.d.ts.map +1 -0
  187. package/dist/lib/session-watcher.d.ts +30 -0
  188. package/dist/lib/session-watcher.d.ts.map +1 -0
  189. package/dist/lib/sync.d.ts +10 -0
  190. package/dist/lib/sync.d.ts.map +1 -0
  191. package/dist/lib/synthesis/corpus-builder.d.ts +30 -0
  192. package/dist/lib/synthesis/corpus-builder.d.ts.map +1 -0
  193. package/dist/lib/synthesis/executor.d.ts +14 -0
  194. package/dist/lib/synthesis/executor.d.ts.map +1 -0
  195. package/dist/lib/synthesis/index.d.ts +37 -0
  196. package/dist/lib/synthesis/index.d.ts.map +1 -0
  197. package/dist/lib/synthesis/llm-analyzer.d.ts +18 -0
  198. package/dist/lib/synthesis/llm-analyzer.d.ts.map +1 -0
  199. package/dist/lib/synthesis/metrics.d.ts +13 -0
  200. package/dist/lib/synthesis/metrics.d.ts.map +1 -0
  201. package/dist/lib/synthesis/scheduler.d.ts +18 -0
  202. package/dist/lib/synthesis/scheduler.d.ts.map +1 -0
  203. package/dist/lib/synthesis/validator.d.ts +19 -0
  204. package/dist/lib/synthesis/validator.d.ts.map +1 -0
  205. package/dist/lib/tool-lesson-extractor.d.ts +24 -0
  206. package/dist/lib/tool-lesson-extractor.d.ts.map +1 -0
  207. package/dist/lib/tool-memory-synthesizer.d.ts +28 -0
  208. package/dist/lib/tool-memory-synthesizer.d.ts.map +1 -0
  209. package/dist/lib/topic-clusterer.d.ts +21 -0
  210. package/dist/lib/topic-clusterer.d.ts.map +1 -0
  211. package/dist/lib/when-to-use-generator.d.ts +22 -0
  212. package/dist/lib/when-to-use-generator.d.ts.map +1 -0
  213. package/dist/mcp/index.d.ts +5 -0
  214. package/dist/mcp/index.d.ts.map +1 -0
  215. package/dist/mcp/index.js +30258 -0
  216. package/dist/mcp/memory-broadcast.d.ts +12 -0
  217. package/dist/mcp/memory-broadcast.d.ts.map +1 -0
  218. package/dist/sdk/index.js +397 -0
  219. package/dist/server/index.d.ts +7 -0
  220. package/dist/server/index.d.ts.map +1 -0
  221. package/dist/server/index.js +18250 -0
  222. package/dist/types/hooks.d.ts +136 -0
  223. package/dist/types/hooks.d.ts.map +1 -0
  224. package/dist/types/index.d.ts +345 -0
  225. package/dist/types/index.d.ts.map +1 -0
  226. package/package.json +53 -13
  227. package/dist/agent-setup.d.ts +0 -51
  228. package/dist/agent-setup.d.ts.map +0 -1
  229. package/dist/bridge.d.ts +0 -50
  230. package/dist/bridge.d.ts.map +0 -1
  231. package/dist/cli.d.ts +0 -3
  232. package/dist/cli.d.ts.map +0 -1
  233. package/dist/cli.js +0 -1362
  234. package/dist/mcp-runtime.d.ts +0 -24
  235. package/dist/mcp-runtime.d.ts.map +0 -1
  236. package/dist/mcp.d.ts +0 -3
  237. package/dist/mcp.d.ts.map +0 -1
  238. package/dist/mcp.js +0 -354
  239. package/dist/remote-client.d.ts +0 -49
  240. package/dist/remote-client.d.ts.map +0 -1
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Matryoshka Embedding Slicing — 2-stage retrieval using variable-dimension embedding slices.
3
+ *
4
+ * Key insight: OpenAI text-embedding-3-small supports native dimension reduction.
5
+ * Halving the dimension keeps quality nearly intact, so a 384-dim slice is 4x faster
6
+ * to compare but nearly as accurate for shortlisting. We use this for a 2-stage search:
7
+ * Stage 1: 384-dim slice → fast approximate shortlist (3x limit)
8
+ * Stage 2: Full 1536-dim → precise rerank → top limit results
9
+ */
10
+ import { Database } from "bun:sqlite";
11
+ import type { Memory } from "../types/index.js";
12
+ export interface MatryoshkaConfig {
13
+ /** Full embedding dimensions (1536 for text-embedding-3-small) */
14
+ full_dims: number;
15
+ /** Shortlist slice dimensions (1/4 of full for fast approximate search) */
16
+ shortlist_dims: number;
17
+ /** How many extra candidates to fetch in Stage 1 (multiplier of final limit) */
18
+ shortlist_multiplier: number;
19
+ }
20
+ export interface MatryoshkaSearchResult {
21
+ memory: Memory;
22
+ score: number;
23
+ shortlist_score: number;
24
+ }
25
+ /**
26
+ * Slice an embedding to the first `dims` dimensions.
27
+ * Exploits the Matryoshka property of text-embedding-3-small where
28
+ * leading dimensions carry the most information.
29
+ */
30
+ export declare function sliceEmbedding(embedding: number[], dims: number): number[];
31
+ /**
32
+ * L2 (Euclidean) normalize a vector to unit length.
33
+ * Required after slicing to ensure cosine similarity remains valid.
34
+ */
35
+ export declare function l2Normalize(embedding: number[]): number[];
36
+ /**
37
+ * 2-stage Matryoshka search:
38
+ * 1. Generate query embedding, slice to 384-dim, shortlist top N*3 candidates
39
+ * 2. Rerank shortlisted candidates using full 1536-dim embeddings
40
+ *
41
+ * Returns the top `limit` results ordered by full-dimension similarity.
42
+ */
43
+ export declare function matryoshkaSearch(db: Database, query: string, opts?: {
44
+ limit?: number;
45
+ project_id?: string;
46
+ agent_id?: string;
47
+ config?: MatryoshkaConfig;
48
+ threshold?: number;
49
+ }): Promise<MatryoshkaSearchResult[]>;
50
+ //# sourceMappingURL=matryoshka.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matryoshka.d.ts","sourceRoot":"","sources":["../../src/lib/matryoshka.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAIhD,MAAM,WAAW,gBAAgB;IAC/B,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,cAAc,EAAE,MAAM,CAAC;IACvB,gFAAgF;IAChF,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;CACzB;AAYD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAG1E;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAYzD;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE;IACL,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACA,OAAO,CAAC,sBAAsB,EAAE,CAAC,CA+EnC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * OPE4-00111: Concurrent memory access coordination
3
+ *
4
+ * Uses the resource_locks table (Migration 8) to provide:
5
+ * - Advisory locks for read-heavy coordination
6
+ * - Exclusive locks to prevent simultaneous writes to the same key
7
+ *
8
+ * Design:
9
+ * - Reads: always parallel, no locking needed
10
+ * - Writes: agents SHOULD acquire an exclusive lock on the memory key before writing
11
+ * The lock resource_id uses format: "{scope}:{key}:{agent_id}:{project_id}"
12
+ * This prevents two agents overwriting the same shared memory simultaneously
13
+ * - Optimistic fallback: if lock can't be acquired, VersionConflictError from
14
+ * updateMemory() provides a second layer of protection
15
+ */
16
+ import { Database } from "bun:sqlite";
17
+ import { type ResourceLock } from "../db/locks.js";
18
+ /**
19
+ * Compute the lock resource_id for a memory key.
20
+ * Scoped by scope + key + project so different projects don't block each other.
21
+ */
22
+ export declare function memoryLockId(key: string, scope: string, projectId?: string | null): string;
23
+ /**
24
+ * Acquire an exclusive write lock on a memory key.
25
+ * Returns the lock if acquired, null if another agent is writing.
26
+ */
27
+ export declare function acquireMemoryWriteLock(agentId: string, key: string, scope: string, projectId?: string | null, ttlSeconds?: number, db?: Database): ResourceLock | null;
28
+ /**
29
+ * Release a memory write lock.
30
+ */
31
+ export declare function releaseMemoryWriteLock(lockId: string, agentId: string, db?: Database): boolean;
32
+ /**
33
+ * Check if a memory key is currently write-locked.
34
+ * Returns the active lock or null.
35
+ */
36
+ export declare function checkMemoryWriteLock(key: string, scope: string, projectId?: string | null, db?: Database): ResourceLock | null;
37
+ /**
38
+ * Execute a callback with an exclusive memory write lock.
39
+ * Throws if the lock cannot be acquired (another agent is writing).
40
+ * Automatically releases the lock after the callback completes.
41
+ *
42
+ * Usage:
43
+ * withMemoryLock(agentId, "my-key", "shared", projectId, () => {
44
+ * createMemory({ key: "my-key", ... });
45
+ * });
46
+ */
47
+ export declare function withMemoryLock<T>(agentId: string, key: string, scope: string, projectId: string | null | undefined, fn: () => T, ttlSeconds?: number, db?: Database): T;
48
+ /**
49
+ * Error thrown when a memory write lock cannot be acquired.
50
+ */
51
+ export declare class MemoryLockConflictError extends Error {
52
+ readonly conflict: true;
53
+ readonly key: string;
54
+ readonly scope: string;
55
+ readonly blocking_agent_id: string;
56
+ constructor(key: string, scope: string, blockingAgentId: string);
57
+ }
58
+ //# sourceMappingURL=memory-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-lock.d.ts","sourceRoot":"","sources":["../../src/lib/memory-lock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAuC,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAKxF;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GACxB,MAAM,CAER;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,EACzB,UAAU,SAAmB,EAC7B,EAAE,CAAC,EAAE,QAAQ,GACZ,YAAY,GAAG,IAAI,CAGrB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,EAAE,CAAC,EAAE,QAAQ,GACZ,OAAO,CAGT;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,EACzB,EAAE,CAAC,EAAE,QAAQ,GACZ,YAAY,GAAG,IAAI,CAIrB;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAC9B,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACpC,EAAE,EAAE,MAAM,CAAC,EACX,UAAU,SAAmB,EAC7B,EAAE,CAAC,EAAE,QAAQ,GACZ,CAAC,CAcH;AAED;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,SAAgB,QAAQ,EAAG,IAAI,CAAU;IACzC,SAAgB,GAAG,EAAE,MAAM,CAAC;IAC5B,SAAgB,KAAK,EAAE,MAAM,CAAC;IAC9B,SAAgB,iBAAiB,EAAE,MAAM,CAAC;gBAE9B,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM;CAUhE"}
@@ -0,0 +1,14 @@
1
+ export declare const DEFAULT_MODEL = "gpt-4o-mini";
2
+ /**
3
+ * Returns the currently active fine-tuned model ID, or the default model.
4
+ */
5
+ export declare function getActiveModel(): string;
6
+ /**
7
+ * Sets the active fine-tuned model ID in ~/.hasna/mementos/config.json.
8
+ */
9
+ export declare function setActiveModel(modelId: string): void;
10
+ /**
11
+ * Clears the active fine-tuned model, reverting to the default.
12
+ */
13
+ export declare function clearActiveModel(): void;
14
+ //# sourceMappingURL=model-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-config.d.ts","sourceRoot":"","sources":["../../src/lib/model-config.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,aAAa,gBAAgB,CAAC;AA2B3C;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAGvC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAIpD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAIvC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Open-sessions connector — bridge between open-sessions REST API and mementos.
3
+ *
4
+ * When open-sessions ingests a new session, this connector fetches the session
5
+ * transcript and submits it to mementos for memory extraction.
6
+ *
7
+ * Usage:
8
+ * const connector = new OpenSessionsConnector({ openSessionsUrl, mementosUrl });
9
+ * await connector.ingestSession(sessionId, { agentId, projectId });
10
+ * await connector.syncRecentSessions({ since: "2026-03-17", limit: 10 });
11
+ */
12
+ export interface OpenSessionsConnectorConfig {
13
+ /** open-sessions REST API base URL */
14
+ openSessionsUrl: string;
15
+ /** mementos REST API base URL */
16
+ mementosUrl: string;
17
+ /** Optional auth token for open-sessions */
18
+ openSessionsToken?: string;
19
+ /** Default agent ID for extracted memories */
20
+ defaultAgentId?: string;
21
+ /** Default project ID for extracted memories */
22
+ defaultProjectId?: string;
23
+ }
24
+ export interface IngestResult {
25
+ sessionId: string;
26
+ jobId: string;
27
+ status: "queued" | "skipped" | "error";
28
+ message: string;
29
+ }
30
+ export declare class OpenSessionsConnector {
31
+ private config;
32
+ constructor(config: OpenSessionsConnectorConfig);
33
+ /**
34
+ * Fetch a session transcript from open-sessions and ingest into mementos.
35
+ */
36
+ ingestSession(sessionId: string, options?: {
37
+ agentId?: string;
38
+ projectId?: string;
39
+ }): Promise<IngestResult>;
40
+ /**
41
+ * Fetch and ingest multiple recent sessions.
42
+ */
43
+ syncRecentSessions(options?: {
44
+ since?: string;
45
+ limit?: number;
46
+ agentId?: string;
47
+ projectId?: string;
48
+ }): Promise<IngestResult[]>;
49
+ private fetchSessionTranscript;
50
+ private listRecentSessionIds;
51
+ }
52
+ /**
53
+ * Create a connector from environment variables.
54
+ *
55
+ * OPEN_SESSIONS_URL — open-sessions server URL
56
+ * OPEN_SESSIONS_TOKEN — optional auth token
57
+ * MEMENTOS_URL — mementos server URL (default: http://localhost:19428)
58
+ */
59
+ export declare function connectorFromEnv(): OpenSessionsConnector;
60
+ //# sourceMappingURL=open-sessions-connector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-sessions-connector.d.ts","sourceRoot":"","sources":["../../src/lib/open-sessions-connector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,2BAA2B;IAC1C,sCAAsC;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,iCAAiC;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gDAAgD;IAChD,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;IACvC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,MAAM,CAA8B;gBAEhC,MAAM,EAAE,2BAA2B;IAI/C;;OAEG;IACG,aAAa,CACjB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACrD,OAAO,CAAC,YAAY,CAAC;IAwCxB;;OAEG;IACG,kBAAkB,CAAC,OAAO,GAAE;QAChC,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;YAelB,sBAAsB;YAiBtB,oBAAoB;CAqBnC;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,qBAAqB,CAWxD"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Memory poisoning detection.
3
+ *
4
+ * Computes a trust score (0.0 - 1.0) for incoming memories based on heuristic
5
+ * checks. Low-trust memories are flagged for review.
6
+ */
7
+ import type { Memory } from "../types/index.js";
8
+ /**
9
+ * Compute a trust score for a memory value.
10
+ *
11
+ * Returns a float between 0.0 and 1.0 where 1.0 = fully trusted.
12
+ * Heuristic penalties:
13
+ * - Instruction-like patterns (-0.2)
14
+ * - Promotional patterns (-0.3)
15
+ * - Contradicts existing high-importance memories (-0.3)
16
+ * - Very short value (<10 chars) with high importance claim (-0.1)
17
+ */
18
+ export declare function computeTrustScore(value: string, key: string, existingMemories?: Memory[], claimedImportance?: number): number;
19
+ //# sourceMappingURL=poisoning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poisoning.d.ts","sourceRoot":"","sources":["../../src/lib/poisoning.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AA+BhD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,gBAAgB,CAAC,EAAE,MAAM,EAAE,EAC3B,iBAAiB,CAAC,EAAE,MAAM,GACzB,MAAM,CAyDR"}
@@ -0,0 +1,17 @@
1
+ import type { Database } from "bun:sqlite";
2
+ import type { Memory, MemoryScope, MemoryCategory } from "../types/index.js";
3
+ export interface PollOptions {
4
+ interval_ms?: number;
5
+ scope?: MemoryScope;
6
+ category?: MemoryCategory;
7
+ agent_id?: string;
8
+ project_id?: string;
9
+ on_memories: (memories: Memory[]) => void;
10
+ on_error?: (error: Error) => void;
11
+ db?: Database;
12
+ }
13
+ export interface PollHandle {
14
+ stop: () => void;
15
+ }
16
+ export declare function startPolling(opts: PollOptions): PollHandle;
17
+ //# sourceMappingURL=poll.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poll.d.ts","sourceRoot":"","sources":["../../src/lib/poll.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAQ7E,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC1C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAClC,EAAE,CAAC,EAAE,QAAQ,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,IAAI,CAAC;CAClB;AAMD,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CA0F1D"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * LLM-based procedural memory extractor from session transcripts.
3
+ * Extracts workflow patterns, step sequences, failure lessons, problem-solution pairs.
4
+ * Saves as chained procedural memories with when_to_use and sequence_group.
5
+ */
6
+ interface ExtractedProcedure {
7
+ title: string;
8
+ steps: {
9
+ action: string;
10
+ when_to_use: string;
11
+ }[];
12
+ failure_patterns: string[];
13
+ when_to_use: string;
14
+ }
15
+ export declare function extractProcedures(transcript: string, options?: {
16
+ agent_id?: string;
17
+ project_id?: string;
18
+ session_id?: string;
19
+ }): Promise<ExtractedProcedure[]>;
20
+ export {};
21
+ //# sourceMappingURL=procedural-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"procedural-extractor.d.ts","sourceRoot":"","sources":["../../src/lib/procedural-extractor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA2BH,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjD,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IACR,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACA,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAyF/B"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Cross-profile memory sync.
3
+ * Selectively copy memories between different mementos profiles/databases.
4
+ */
5
+ import type { MemoryFilter } from "../types/index.js";
6
+ export interface ProfileSyncOptions {
7
+ filter?: MemoryFilter;
8
+ strategy?: "skip" | "merge" | "overwrite";
9
+ }
10
+ export interface ProfileSyncResult {
11
+ copied: number;
12
+ skipped: number;
13
+ source_profile: string;
14
+ target_profile: string;
15
+ }
16
+ /**
17
+ * Sync memories from one profile to another.
18
+ */
19
+ export declare function syncProfiles(sourceProfile: string, targetProfile: string, options?: ProfileSyncOptions): ProfileSyncResult;
20
+ //# sourceMappingURL=profile-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-sync.d.ts","sourceRoot":"","sources":["../../src/lib/profile-sync.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,WAAW,CAAC;CAC3C;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAUD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,kBAAuB,GAC/B,iBAAiB,CAmDnB"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Profile Synthesizer — aggregates preference and fact memories into a coherent profile.
3
+ * Cached as a special pinned memory, auto-refreshed when preferences change.
4
+ */
5
+ export declare function getProfileKey(scope: string, id: string): string;
6
+ export declare function synthesizeProfile(options: {
7
+ project_id?: string;
8
+ agent_id?: string;
9
+ scope?: "agent" | "project" | "global";
10
+ force_refresh?: boolean;
11
+ }): Promise<{
12
+ profile: string;
13
+ memory_count: number;
14
+ from_cache: boolean;
15
+ } | null>;
16
+ /**
17
+ * Mark profile as stale. Called from PostMemorySave hook when a preference/fact is saved.
18
+ */
19
+ export declare function markProfileStale(projectId?: string, _agentId?: string): void;
20
+ //# sourceMappingURL=profile-synthesizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-synthesizer.d.ts","sourceRoot":"","sources":["../../src/lib/profile-synthesizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAC;IACvC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAA;CAAE,GAAG,IAAI,CAAC,CA2EjF;AA2BD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAa5E"}
@@ -0,0 +1,18 @@
1
+ import { Database } from "bun:sqlite";
2
+ import type { Project } from "../types/index.js";
3
+ /**
4
+ * Auto-detect the current project from cwd's git root.
5
+ * - Finds the git root directory
6
+ * - Extracts the repo name from the directory basename
7
+ * - Checks if a project is already registered by path
8
+ * - If not, registers it automatically
9
+ * - Returns the Project object, or null if not in a git repo
10
+ *
11
+ * Results are cached for the lifetime of the process.
12
+ */
13
+ export declare function detectProject(db?: Database): Project | null;
14
+ /**
15
+ * Reset the cached project (useful for tests).
16
+ */
17
+ export declare function resetProjectCache(): void;
18
+ //# sourceMappingURL=project-detect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-detect.d.ts","sourceRoot":"","sources":["../../src/lib/project-detect.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAGtC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAkBjD;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,IAAI,CA0B3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Anthropic provider (DEFAULT).
3
+ * Default model: claude-haiku-4-5 — cheap, fast, good quality.
4
+ * Premium option: claude-sonnet-4-5.
5
+ * Never throws — returns [] / empty results on failure.
6
+ */
7
+ import { BaseProvider, type ProviderConfig, type ProviderName, type MemoryExtractionContext, type ExtractedMemory, type EntityExtractionResult } from "./base.js";
8
+ export declare const ANTHROPIC_MODELS: {
9
+ readonly default: "claude-haiku-4-5";
10
+ readonly premium: "claude-sonnet-4-5";
11
+ };
12
+ export declare class AnthropicProvider extends BaseProvider {
13
+ readonly name: ProviderName;
14
+ private readonly baseUrl;
15
+ constructor(config?: Partial<ProviderConfig>);
16
+ extractMemories(text: string, context: MemoryExtractionContext): Promise<ExtractedMemory[]>;
17
+ extractEntities(text: string): Promise<EntityExtractionResult>;
18
+ scoreImportance(content: string, _context: MemoryExtractionContext): Promise<number>;
19
+ private callAPI;
20
+ }
21
+ //# sourceMappingURL=anthropic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/lib/providers/anthropic.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,YAAY,EACZ,KAAK,cAAc,EACnB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAK5B,MAAM,WAAW,CAAC;AAEnB,eAAO,MAAM,gBAAgB;;;CAGnB,CAAC;AAEX,qBAAa,iBAAkB,SAAQ,YAAY;IACjD,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAe;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;gBAE9C,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;IAWtC,eAAe,CACnB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,eAAe,EAAE,CAAC;IAkBvB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAoB9D,eAAe,CACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,uBAAuB,GAChC,OAAO,CAAC,MAAM,CAAC;YAaJ,OAAO;CAsCtB"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * LLM Provider abstraction for auto-memory formation.
3
+ * Any LLM (Anthropic, OpenAI, Cerebras, Grok) implements LLMProvider.
4
+ * All methods return structured data — providers must output valid JSON.
5
+ */
6
+ import type { MemoryCategory, MemoryScope } from "../../types/index.js";
7
+ export interface ProviderConfig {
8
+ apiKey: string;
9
+ model: string;
10
+ maxTokens?: number;
11
+ temperature?: number;
12
+ timeoutMs?: number;
13
+ }
14
+ export type ProviderName = "anthropic" | "openai" | "cerebras" | "grok";
15
+ export interface AutoMemoryConfig {
16
+ provider: ProviderName;
17
+ model?: string;
18
+ enabled: boolean;
19
+ minImportance: number;
20
+ autoEntityLink: boolean;
21
+ fallback?: ProviderName[];
22
+ }
23
+ export declare const DEFAULT_AUTO_MEMORY_CONFIG: AutoMemoryConfig;
24
+ export interface MemoryExtractionContext {
25
+ agentId?: string;
26
+ projectId?: string;
27
+ sessionId?: string;
28
+ /** Compact summary of existing memories to avoid duplicates */
29
+ existingMemoriesSummary?: string;
30
+ /** Working directory or project name for scope hints */
31
+ projectName?: string;
32
+ }
33
+ export interface ExtractedMemory {
34
+ content: string;
35
+ category: MemoryCategory;
36
+ importance: number;
37
+ tags: string[];
38
+ suggestedScope: MemoryScope;
39
+ /** Why this is worth remembering — used for dedup decisions */
40
+ reasoning?: string;
41
+ }
42
+ export interface ExtractedEntity {
43
+ name: string;
44
+ /** Maps to EntityType in knowledge graph */
45
+ type: "person" | "project" | "tool" | "concept" | "file" | "api" | "pattern" | "organization";
46
+ /** 0-1 confidence score */
47
+ confidence: number;
48
+ }
49
+ export interface ExtractedRelation {
50
+ from: string;
51
+ to: string;
52
+ type: "uses" | "knows" | "depends_on" | "created_by" | "related_to" | "contradicts" | "part_of" | "implements" | "happened_before" | "happened_after" | "caused_by" | "resulted_in" | "supersedes" | "version_of";
53
+ }
54
+ export interface EntityExtractionResult {
55
+ entities: ExtractedEntity[];
56
+ relations: ExtractedRelation[];
57
+ }
58
+ export interface LLMProvider {
59
+ readonly name: ProviderName;
60
+ readonly config: ProviderConfig;
61
+ /**
62
+ * Extract memories worth saving from a conversation turn or session chunk.
63
+ * Must return [] on failure — never throw.
64
+ */
65
+ extractMemories(text: string, context: MemoryExtractionContext): Promise<ExtractedMemory[]>;
66
+ /**
67
+ * Extract entities and relations from text for knowledge graph linking.
68
+ * Must return empty arrays on failure — never throw.
69
+ */
70
+ extractEntities(text: string): Promise<EntityExtractionResult>;
71
+ /**
72
+ * Score how important a memory is (0-10).
73
+ * Used when we already have the content but need a quality signal.
74
+ * Must return a number on failure — never throw.
75
+ */
76
+ scoreImportance(content: string, context: MemoryExtractionContext): Promise<number>;
77
+ }
78
+ export declare abstract class BaseProvider implements LLMProvider {
79
+ abstract readonly name: ProviderName;
80
+ readonly config: ProviderConfig;
81
+ constructor(config: ProviderConfig);
82
+ abstract extractMemories(text: string, context: MemoryExtractionContext): Promise<ExtractedMemory[]>;
83
+ abstract extractEntities(text: string): Promise<EntityExtractionResult>;
84
+ abstract scoreImportance(content: string, context: MemoryExtractionContext): Promise<number>;
85
+ /** Parse JSON from LLM response, stripping markdown code fences if present */
86
+ protected parseJSON<T>(raw: string): T | null;
87
+ /** Clamp a number to 0-10 importance range */
88
+ protected clampImportance(value: unknown): number;
89
+ /** Validate and normalise a single extracted memory */
90
+ protected normaliseMemory(raw: unknown): ExtractedMemory | null;
91
+ }
92
+ export declare const MEMORY_EXTRACTION_SYSTEM_PROMPT = "You are a precise memory extraction engine for an AI agent.\nGiven text, extract facts worth remembering as structured JSON.\nFocus on: decisions made, preferences revealed, corrections, architectural choices, established facts, user preferences.\nIgnore: greetings, filler, questions without answers, temporary states.\nOutput ONLY a JSON array \u2014 no markdown, no explanation.";
93
+ export declare const MEMORY_EXTRACTION_USER_TEMPLATE: (text: string, context: MemoryExtractionContext) => string;
94
+ export declare const ENTITY_EXTRACTION_SYSTEM_PROMPT = "You are a knowledge graph entity extractor.\nGiven text, identify named entities and their relationships.\nOutput ONLY valid JSON \u2014 no markdown, no explanation.";
95
+ export declare const ENTITY_EXTRACTION_USER_TEMPLATE: (text: string) => string;
96
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/lib/providers/base.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Cerebras provider — ultra-fast inference (~2000 tok/sec).
3
+ * OpenAI-compatible API.
4
+ * Default model: llama-3.3-70b.
5
+ * Ideal for real-time non-blocking extraction.
6
+ * Env var: CEREBRAS_API_KEY.
7
+ */
8
+ import { OpenAICompatProvider } from "./openai-compat.js";
9
+ import type { ProviderConfig, ProviderName } from "./base.js";
10
+ export declare const CEREBRAS_MODELS: {
11
+ readonly default: "llama-3.3-70b";
12
+ readonly fast: "llama3.1-8b";
13
+ };
14
+ export declare class CerebrasProvider extends OpenAICompatProvider {
15
+ readonly name: ProviderName;
16
+ protected readonly baseUrl = "https://api.cerebras.ai/v1";
17
+ protected readonly authHeader = "Authorization";
18
+ constructor(config?: Partial<ProviderConfig>);
19
+ }
20
+ //# sourceMappingURL=cerebras.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cerebras.d.ts","sourceRoot":"","sources":["../../../src/lib/providers/cerebras.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9D,eAAO,MAAM,eAAe;;;CAGlB,CAAC;AAEX,qBAAa,gBAAiB,SAAQ,oBAAoB;IACxD,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAc;IACzC,SAAS,CAAC,QAAQ,CAAC,OAAO,gCAAgC;IAC1D,SAAS,CAAC,QAAQ,CAAC,UAAU,mBAAmB;gBAEpC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;CAS7C"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Grok/xAI provider.
3
+ * OpenAI-compatible API.
4
+ * Default model: grok-3-mini (cheap). Premium: grok-3.
5
+ * Env var: XAI_API_KEY.
6
+ */
7
+ import { OpenAICompatProvider } from "./openai-compat.js";
8
+ import type { ProviderConfig, ProviderName } from "./base.js";
9
+ export declare const GROK_MODELS: {
10
+ readonly default: "grok-3-mini";
11
+ readonly premium: "grok-3";
12
+ };
13
+ export declare class GrokProvider extends OpenAICompatProvider {
14
+ readonly name: ProviderName;
15
+ protected readonly baseUrl = "https://api.x.ai/v1";
16
+ protected readonly authHeader = "Authorization";
17
+ constructor(config?: Partial<ProviderConfig>);
18
+ }
19
+ //# sourceMappingURL=grok.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grok.d.ts","sourceRoot":"","sources":["../../../src/lib/providers/grok.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9D,eAAO,MAAM,WAAW;;;CAGd,CAAC;AAEX,qBAAa,YAAa,SAAQ,oBAAoB;IACpD,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAU;IACrC,SAAS,CAAC,QAAQ,CAAC,OAAO,yBAAyB;IACnD,SAAS,CAAC,QAAQ,CAAC,UAAU,mBAAmB;gBAEpC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;CAS7C"}
@@ -0,0 +1,7 @@
1
+ export * from "./base.js";
2
+ export * from "./anthropic.js";
3
+ export * from "./openai.js";
4
+ export * from "./cerebras.js";
5
+ export * from "./grok.js";
6
+ export * from "./registry.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/providers/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Shared base for all OpenAI-compatible providers.
3
+ * Used by: OpenAI, Cerebras, Grok/xAI.
4
+ * Handles: API calls, exponential backoff on 429, shared JSON parsing.
5
+ */
6
+ import { BaseProvider, type ProviderConfig, type MemoryExtractionContext, type ExtractedMemory, type EntityExtractionResult } from "./base.js";
7
+ export declare abstract class OpenAICompatProvider extends BaseProvider {
8
+ protected abstract readonly baseUrl: string;
9
+ protected abstract readonly authHeader: string;
10
+ constructor(config: ProviderConfig);
11
+ extractMemories(text: string, context: MemoryExtractionContext): Promise<ExtractedMemory[]>;
12
+ extractEntities(text: string): Promise<EntityExtractionResult>;
13
+ scoreImportance(content: string, _context: MemoryExtractionContext): Promise<number>;
14
+ /** Call with exponential backoff on 429 (rate limit), max 3 retries */
15
+ private callWithRetry;
16
+ private callAPI;
17
+ }
18
+ //# sourceMappingURL=openai-compat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-compat.d.ts","sourceRoot":"","sources":["../../../src/lib/providers/openai-compat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,YAAY,EACZ,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC5B,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAK5B,MAAM,WAAW,CAAC;AAEnB,8BAAsB,oBAAqB,SAAQ,YAAY;IAC7D,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAC5C,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;gBAEnC,MAAM,EAAE,cAAc;IAI5B,eAAe,CACnB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,eAAe,EAAE,CAAC;IAkBvB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAoB9D,eAAe,CACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,uBAAuB,GAChC,OAAO,CAAC,MAAM,CAAC;IAalB,uEAAuE;YACzD,aAAa;YAsBb,OAAO;CA0CtB"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * OpenAI provider.
3
+ * Default model: gpt-4.1-nano (ultra cheap, fast).
4
+ * Premium: gpt-4.1-mini, gpt-4.1.
5
+ * Env var: OPENAI_API_KEY.
6
+ */
7
+ import { OpenAICompatProvider } from "./openai-compat.js";
8
+ import type { ProviderConfig, ProviderName } from "./base.js";
9
+ export declare const OPENAI_MODELS: {
10
+ readonly default: "gpt-4.1-nano";
11
+ readonly mini: "gpt-4.1-mini";
12
+ readonly full: "gpt-4.1";
13
+ };
14
+ export declare class OpenAIProvider extends OpenAICompatProvider {
15
+ readonly name: ProviderName;
16
+ protected readonly baseUrl = "https://api.openai.com/v1";
17
+ protected readonly authHeader = "Authorization";
18
+ constructor(config?: Partial<ProviderConfig>);
19
+ }
20
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/lib/providers/openai.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9D,eAAO,MAAM,aAAa;;;;CAIhB,CAAC;AAEX,qBAAa,cAAe,SAAQ,oBAAoB;IACtD,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAY;IACvC,SAAS,CAAC,QAAQ,CAAC,OAAO,+BAA+B;IACzD,SAAS,CAAC,QAAQ,CAAC,UAAU,mBAAmB;gBAEpC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC;CAS7C"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Provider registry — resolves API keys, manages fallback chain,
3
+ * health checks. Works with zero config (just needs one env var set).
4
+ * Default: Anthropic Haiku → Cerebras → OpenAI.
5
+ */
6
+ import { type AutoMemoryConfig, type LLMProvider, type ProviderName } from "./base.js";
7
+ declare class ProviderRegistry {
8
+ private config;
9
+ private _instances;
10
+ /** Update runtime config without restart */
11
+ configure(partial: Partial<AutoMemoryConfig>): void;
12
+ getConfig(): Readonly<AutoMemoryConfig>;
13
+ /** Get primary provider, or null if no API key available */
14
+ getPrimary(): LLMProvider | null;
15
+ /** Get fallback chain — all available providers excluding primary */
16
+ getFallbacks(): LLMProvider[];
17
+ /**
18
+ * Get the best available provider.
19
+ * Returns primary if available, otherwise first available fallback.
20
+ * Returns null only if no providers have API keys configured.
21
+ */
22
+ getAvailable(): LLMProvider | null;
23
+ /**
24
+ * Get a specific provider by name.
25
+ * Returns null if no API key is configured for that provider.
26
+ */
27
+ getProvider(name: ProviderName): LLMProvider | null;
28
+ /** Check which providers have API keys configured */
29
+ health(): Record<ProviderName, {
30
+ available: boolean;
31
+ model: string;
32
+ }>;
33
+ private createProvider;
34
+ }
35
+ /** Singleton registry — shared across the whole process */
36
+ export declare const providerRegistry: ProviderRegistry;
37
+ export {};
38
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/lib/providers/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,WAAW,CAAC;AAInB,cAAM,gBAAgB;IACpB,OAAO,CAAC,MAAM,CAAuD;IACrE,OAAO,CAAC,UAAU,CAAwC;IAE1D,4CAA4C;IAC5C,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI;IAMnD,SAAS,IAAI,QAAQ,CAAC,gBAAgB,CAAC;IAIvC,4DAA4D;IAC5D,UAAU,IAAI,WAAW,GAAG,IAAI;IAIhC,qEAAqE;IACrE,YAAY,IAAI,WAAW,EAAE;IAQ7B;;;;OAIG;IACH,YAAY,IAAI,WAAW,GAAG,IAAI;IAOlC;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,WAAW,GAAG,IAAI;IAcnD,qDAAqD;IACrD,MAAM,IAAI,MAAM,CAAC,YAAY,EAAE;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAarE,OAAO,CAAC,cAAc;CAiBvB;AAED,2DAA2D;AAC3D,eAAO,MAAM,gBAAgB,kBAAyB,CAAC"}