memnant 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 (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +101 -0
  3. package/dist/cli/ask.d.ts +9 -0
  4. package/dist/cli/ask.d.ts.map +1 -0
  5. package/dist/cli/ask.js +103 -0
  6. package/dist/cli/ask.js.map +1 -0
  7. package/dist/cli/check-copy.d.ts +8 -0
  8. package/dist/cli/check-copy.d.ts.map +1 -0
  9. package/dist/cli/check-copy.js +68 -0
  10. package/dist/cli/check-copy.js.map +1 -0
  11. package/dist/cli/check-design.d.ts +8 -0
  12. package/dist/cli/check-design.d.ts.map +1 -0
  13. package/dist/cli/check-design.js +100 -0
  14. package/dist/cli/check-design.js.map +1 -0
  15. package/dist/cli/default-action.d.ts +10 -0
  16. package/dist/cli/default-action.d.ts.map +1 -0
  17. package/dist/cli/default-action.js +94 -0
  18. package/dist/cli/default-action.js.map +1 -0
  19. package/dist/cli/export.d.ts +10 -0
  20. package/dist/cli/export.d.ts.map +1 -0
  21. package/dist/cli/export.js +109 -0
  22. package/dist/cli/export.js.map +1 -0
  23. package/dist/cli/index.d.ts +12 -0
  24. package/dist/cli/index.d.ts.map +1 -0
  25. package/dist/cli/index.js +77 -0
  26. package/dist/cli/index.js.map +1 -0
  27. package/dist/cli/init.d.ts +10 -0
  28. package/dist/cli/init.d.ts.map +1 -0
  29. package/dist/cli/init.js +157 -0
  30. package/dist/cli/init.js.map +1 -0
  31. package/dist/cli/instructions.d.ts +12 -0
  32. package/dist/cli/instructions.d.ts.map +1 -0
  33. package/dist/cli/instructions.js +117 -0
  34. package/dist/cli/instructions.js.map +1 -0
  35. package/dist/cli/lint.d.ts +9 -0
  36. package/dist/cli/lint.d.ts.map +1 -0
  37. package/dist/cli/lint.js +131 -0
  38. package/dist/cli/lint.js.map +1 -0
  39. package/dist/cli/log.d.ts +10 -0
  40. package/dist/cli/log.d.ts.map +1 -0
  41. package/dist/cli/log.js +83 -0
  42. package/dist/cli/log.js.map +1 -0
  43. package/dist/cli/promote.d.ts +9 -0
  44. package/dist/cli/promote.d.ts.map +1 -0
  45. package/dist/cli/promote.js +70 -0
  46. package/dist/cli/promote.js.map +1 -0
  47. package/dist/cli/recall.d.ts +10 -0
  48. package/dist/cli/recall.d.ts.map +1 -0
  49. package/dist/cli/recall.js +98 -0
  50. package/dist/cli/recall.js.map +1 -0
  51. package/dist/cli/serve.d.ts +10 -0
  52. package/dist/cli/serve.d.ts.map +1 -0
  53. package/dist/cli/serve.js +17 -0
  54. package/dist/cli/serve.js.map +1 -0
  55. package/dist/cli/session.d.ts +10 -0
  56. package/dist/cli/session.d.ts.map +1 -0
  57. package/dist/cli/session.js +226 -0
  58. package/dist/cli/session.js.map +1 -0
  59. package/dist/cli/setup.d.ts +11 -0
  60. package/dist/cli/setup.d.ts.map +1 -0
  61. package/dist/cli/setup.js +103 -0
  62. package/dist/cli/setup.js.map +1 -0
  63. package/dist/cli/snapshot.d.ts +9 -0
  64. package/dist/cli/snapshot.d.ts.map +1 -0
  65. package/dist/cli/snapshot.js +126 -0
  66. package/dist/cli/snapshot.js.map +1 -0
  67. package/dist/cli/specs.d.ts +8 -0
  68. package/dist/cli/specs.d.ts.map +1 -0
  69. package/dist/cli/specs.js +96 -0
  70. package/dist/cli/specs.js.map +1 -0
  71. package/dist/cli/status.d.ts +8 -0
  72. package/dist/cli/status.d.ts.map +1 -0
  73. package/dist/cli/status.js +40 -0
  74. package/dist/cli/status.js.map +1 -0
  75. package/dist/cli/telegram.d.ts +8 -0
  76. package/dist/cli/telegram.d.ts.map +1 -0
  77. package/dist/cli/telegram.js +40 -0
  78. package/dist/cli/telegram.js.map +1 -0
  79. package/dist/cli/test-persona.d.ts +9 -0
  80. package/dist/cli/test-persona.d.ts.map +1 -0
  81. package/dist/cli/test-persona.js +176 -0
  82. package/dist/cli/test-persona.js.map +1 -0
  83. package/dist/config/defaults.d.ts +9 -0
  84. package/dist/config/defaults.d.ts.map +1 -0
  85. package/dist/config/defaults.js +56 -0
  86. package/dist/config/defaults.js.map +1 -0
  87. package/dist/context/compile.d.ts +29 -0
  88. package/dist/context/compile.d.ts.map +1 -0
  89. package/dist/context/compile.js +415 -0
  90. package/dist/context/compile.js.map +1 -0
  91. package/dist/governor/copy-check.d.ts +24 -0
  92. package/dist/governor/copy-check.d.ts.map +1 -0
  93. package/dist/governor/copy-check.js +75 -0
  94. package/dist/governor/copy-check.js.map +1 -0
  95. package/dist/governor/design-check.d.ts +20 -0
  96. package/dist/governor/design-check.d.ts.map +1 -0
  97. package/dist/governor/design-check.js +40 -0
  98. package/dist/governor/design-check.js.map +1 -0
  99. package/dist/governor/specs.d.ts +58 -0
  100. package/dist/governor/specs.d.ts.map +1 -0
  101. package/dist/governor/specs.js +183 -0
  102. package/dist/governor/specs.js.map +1 -0
  103. package/dist/ledger/database.d.ts +12 -0
  104. package/dist/ledger/database.d.ts.map +1 -0
  105. package/dist/ledger/database.js +56 -0
  106. package/dist/ledger/database.js.map +1 -0
  107. package/dist/ledger/records.d.ts +19 -0
  108. package/dist/ledger/records.d.ts.map +1 -0
  109. package/dist/ledger/records.js +40 -0
  110. package/dist/ledger/records.js.map +1 -0
  111. package/dist/ledger/sessions.d.ts +15 -0
  112. package/dist/ledger/sessions.d.ts.map +1 -0
  113. package/dist/ledger/sessions.js +54 -0
  114. package/dist/ledger/sessions.js.map +1 -0
  115. package/dist/mcp/server.d.ts +9 -0
  116. package/dist/mcp/server.d.ts.map +1 -0
  117. package/dist/mcp/server.js +295 -0
  118. package/dist/mcp/server.js.map +1 -0
  119. package/dist/orchestrator/context.d.ts +22 -0
  120. package/dist/orchestrator/context.d.ts.map +1 -0
  121. package/dist/orchestrator/context.js +142 -0
  122. package/dist/orchestrator/context.js.map +1 -0
  123. package/dist/orchestrator/providers.d.ts +17 -0
  124. package/dist/orchestrator/providers.d.ts.map +1 -0
  125. package/dist/orchestrator/providers.js +57 -0
  126. package/dist/orchestrator/providers.js.map +1 -0
  127. package/dist/orchestrator/router.d.ts +30 -0
  128. package/dist/orchestrator/router.d.ts.map +1 -0
  129. package/dist/orchestrator/router.js +83 -0
  130. package/dist/orchestrator/router.js.map +1 -0
  131. package/dist/snapshot/scanner.d.ts +63 -0
  132. package/dist/snapshot/scanner.d.ts.map +1 -0
  133. package/dist/snapshot/scanner.js +293 -0
  134. package/dist/snapshot/scanner.js.map +1 -0
  135. package/dist/telegram/bot.d.ts +14 -0
  136. package/dist/telegram/bot.d.ts.map +1 -0
  137. package/dist/telegram/bot.js +139 -0
  138. package/dist/telegram/bot.js.map +1 -0
  139. package/dist/types.d.ts +99 -0
  140. package/dist/types.d.ts.map +1 -0
  141. package/dist/types.js +16 -0
  142. package/dist/types.js.map +1 -0
  143. package/dist/vector/embeddings.d.ts +11 -0
  144. package/dist/vector/embeddings.d.ts.map +1 -0
  145. package/dist/vector/embeddings.js +30 -0
  146. package/dist/vector/embeddings.js.map +1 -0
  147. package/dist/vector/search.d.ts +26 -0
  148. package/dist/vector/search.d.ts.map +1 -0
  149. package/dist/vector/search.js +51 -0
  150. package/dist/vector/search.js.map +1 -0
  151. package/package.json +57 -0
@@ -0,0 +1,99 @@
1
+ /**
2
+ * memnant — Shared type definitions.
3
+ *
4
+ * These types mirror the data model defined in docs/SPEC.md.
5
+ * If the spec changes, these types change. If these types change
6
+ * without the spec changing, something is wrong.
7
+ */
8
+ export declare const RECORD_TYPES: readonly ["session_log", "decision", "framework_fix", "spec_snapshot", "codebase_snapshot", "orchestrator_task"];
9
+ export type RecordType = (typeof RECORD_TYPES)[number];
10
+ export interface Project {
11
+ id: string;
12
+ name: string;
13
+ root_path: string;
14
+ created_at: string;
15
+ }
16
+ export interface Record {
17
+ id: string;
18
+ project_id: string;
19
+ type: RecordType;
20
+ content: object;
21
+ content_text: string;
22
+ embedding?: Float32Array;
23
+ tags: string[];
24
+ related_records: string[];
25
+ created_at: string;
26
+ source_session: string | null;
27
+ staleness_marker: object | null;
28
+ }
29
+ export interface Session {
30
+ id: string;
31
+ project_id: string;
32
+ started_at: string;
33
+ closed_at: string | null;
34
+ epic: string | null;
35
+ stories_completed: string[];
36
+ log_record_id: string | null;
37
+ log_skipped: string | null;
38
+ }
39
+ export interface ProjectConfig {
40
+ project: {
41
+ name: string;
42
+ id: string;
43
+ };
44
+ memory: {
45
+ db_path: string;
46
+ export_path: string;
47
+ snapshot_interval: 'monthly' | 'milestone';
48
+ max_spec_snapshots: number;
49
+ max_codebase_snapshots: number;
50
+ };
51
+ orchestrator: {
52
+ tiers: {
53
+ triage: TierConfig;
54
+ analysis: TierConfig;
55
+ build: TierConfig;
56
+ };
57
+ interfaces: {
58
+ telegram: {
59
+ enabled: boolean;
60
+ };
61
+ cli: {
62
+ enabled: boolean;
63
+ };
64
+ mcp: {
65
+ enabled: boolean;
66
+ port: number;
67
+ };
68
+ };
69
+ };
70
+ governor: {
71
+ docs_path: string;
72
+ lint_on_pr: boolean;
73
+ strict_mode: boolean;
74
+ };
75
+ security: {
76
+ staging_only: boolean;
77
+ allow_deploy: boolean;
78
+ allowed_mcp_tools: string[];
79
+ };
80
+ }
81
+ export interface TierConfig {
82
+ provider: string;
83
+ model: string;
84
+ max_context_tokens?: number;
85
+ }
86
+ export interface CompiledContext {
87
+ token_estimate: number;
88
+ warnings: string[];
89
+ sections: {
90
+ last_session: string | null;
91
+ open_todos: string[];
92
+ epic_context: string | null;
93
+ framework_fixes: string[];
94
+ spec_constraints: string[];
95
+ persona_tests: string[];
96
+ stale_decisions: string[];
97
+ };
98
+ }
99
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,YAAY,kHAOf,CAAC;AAEX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,UAAU,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;IACF,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,EAAE,SAAS,GAAG,WAAW,CAAC;QAC3C,kBAAkB,EAAE,MAAM,CAAC;QAC3B,sBAAsB,EAAE,MAAM,CAAC;KAChC,CAAC;IACF,YAAY,EAAE;QACZ,KAAK,EAAE;YACL,MAAM,EAAE,UAAU,CAAC;YACnB,QAAQ,EAAE,UAAU,CAAC;YACrB,KAAK,EAAE,UAAU,CAAC;SACnB,CAAC;QACF,UAAU,EAAE;YACV,QAAQ,EAAE;gBAAE,OAAO,EAAE,OAAO,CAAA;aAAE,CAAC;YAC/B,GAAG,EAAE;gBAAE,OAAO,EAAE,OAAO,CAAA;aAAE,CAAC;YAC1B,GAAG,EAAE;gBAAE,OAAO,EAAE,OAAO,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAA;aAAE,CAAC;SACzC,CAAC;KACH,CAAC;IACF,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,OAAO,CAAC;QACpB,WAAW,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,QAAQ,EAAE;QACR,YAAY,EAAE,OAAO,CAAC;QACtB,YAAY,EAAE,OAAO,CAAC;QACtB,iBAAiB,EAAE,MAAM,EAAE,CAAC;KAC7B,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE;QACR,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,eAAe,EAAE,MAAM,EAAE,CAAC;QAC1B,gBAAgB,EAAE,MAAM,EAAE,CAAC;QAC3B,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,eAAe,EAAE,MAAM,EAAE,CAAC;KAC3B,CAAC;CACH"}
package/dist/types.js ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * memnant — Shared type definitions.
3
+ *
4
+ * These types mirror the data model defined in docs/SPEC.md.
5
+ * If the spec changes, these types change. If these types change
6
+ * without the spec changing, something is wrong.
7
+ */
8
+ export const RECORD_TYPES = [
9
+ 'session_log',
10
+ 'decision',
11
+ 'framework_fix',
12
+ 'spec_snapshot',
13
+ 'codebase_snapshot',
14
+ 'orchestrator_task',
15
+ ];
16
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,aAAa;IACb,UAAU;IACV,eAAe;IACf,eAAe;IACf,mBAAmB;IACnB,mBAAmB;CACX,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * memnant — Embedding pipeline.
3
+ *
4
+ * Story 1.2: Generates embeddings for record content using a local model.
5
+ * Uses @xenova/transformers with all-MiniLM-L6-v2 (384-dimensional, normalized).
6
+ * The pipeline is lazily initialised on first call and cached in a module-level variable.
7
+ */
8
+ export declare function generateEmbedding(text: string): Promise<Float32Array>;
9
+ export declare function serializeEmbedding(embedding: Float32Array): Buffer;
10
+ export declare function deserializeEmbedding(buffer: Uint8Array): Float32Array;
11
+ //# sourceMappingURL=embeddings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/vector/embeddings.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAeH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAI3E;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,YAAY,GAAG,MAAM,CAElE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG,YAAY,CAMrE"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * memnant — Embedding pipeline.
3
+ *
4
+ * Story 1.2: Generates embeddings for record content using a local model.
5
+ * Uses @xenova/transformers with all-MiniLM-L6-v2 (384-dimensional, normalized).
6
+ * The pipeline is lazily initialised on first call and cached in a module-level variable.
7
+ */
8
+ import { pipeline } from '@xenova/transformers';
9
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
10
+ let pipelineInstance = null;
11
+ async function getPipeline() {
12
+ if (!pipelineInstance) {
13
+ process.stderr.write('Loading embedding model...\n');
14
+ pipelineInstance = await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2');
15
+ }
16
+ return pipelineInstance;
17
+ }
18
+ export async function generateEmbedding(text) {
19
+ const extractor = await getPipeline();
20
+ const output = await extractor(text, { pooling: 'mean', normalize: true });
21
+ return new Float32Array(output.data);
22
+ }
23
+ export function serializeEmbedding(embedding) {
24
+ return Buffer.from(embedding.buffer, embedding.byteOffset, embedding.byteLength);
25
+ }
26
+ export function deserializeEmbedding(buffer) {
27
+ const arrayBuffer = buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);
28
+ return new Float32Array(arrayBuffer);
29
+ }
30
+ //# sourceMappingURL=embeddings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/vector/embeddings.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,8DAA8D;AAC9D,IAAI,gBAAgB,GAAQ,IAAI,CAAC;AAEjC,KAAK,UAAU,WAAW;IACxB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACrD,gBAAgB,GAAG,MAAM,QAAQ,CAAC,oBAAoB,EAAE,yBAAyB,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAY;IAClD,MAAM,SAAS,GAAG,MAAM,WAAW,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,SAAuB;IACxD,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAkB;IACrD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CACrC,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CACtC,CAAC;IACF,OAAO,IAAI,YAAY,CAAC,WAAW,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * memnant — Vector search over the ledger.
3
+ *
4
+ * Story 1.3: Brute-force cosine similarity search using dot product on
5
+ * normalized embeddings. SQL pre-filters by type and date before computing
6
+ * similarity in-memory. Correct for the 500-record target (~750 KB of embeddings).
7
+ */
8
+ import type { Database } from '../ledger/database.js';
9
+ import type { RecordType } from '../types.js';
10
+ export interface RecallFilters {
11
+ type?: RecordType;
12
+ since?: string;
13
+ limit: number;
14
+ }
15
+ export interface RecallResult {
16
+ id: string;
17
+ type: string;
18
+ content_text: string;
19
+ created_at: string;
20
+ tags: string[];
21
+ related_records: string[];
22
+ similarity: number;
23
+ }
24
+ export declare function dotProduct(a: Float32Array, b: Float32Array): number;
25
+ export declare function searchRecords(db: Database, queryEmbedding: Float32Array, filters: RecallFilters): RecallResult[];
26
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/vector/search.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAK9C,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB;AAYD,wBAAgB,UAAU,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAMnE;AAED,wBAAgB,aAAa,CAC3B,EAAE,EAAE,QAAQ,EACZ,cAAc,EAAE,YAAY,EAC5B,OAAO,EAAE,aAAa,GACrB,YAAY,EAAE,CAwChB"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * memnant — Vector search over the ledger.
3
+ *
4
+ * Story 1.3: Brute-force cosine similarity search using dot product on
5
+ * normalized embeddings. SQL pre-filters by type and date before computing
6
+ * similarity in-memory. Correct for the 500-record target (~750 KB of embeddings).
7
+ */
8
+ import { deserializeEmbedding } from './embeddings.js';
9
+ const MIN_SIMILARITY_THRESHOLD = 0.3;
10
+ export function dotProduct(a, b) {
11
+ let sum = 0;
12
+ for (let i = 0; i < a.length; i++) {
13
+ sum += a[i] * b[i];
14
+ }
15
+ return sum;
16
+ }
17
+ export function searchRecords(db, queryEmbedding, filters) {
18
+ const conditions = ['embedding IS NOT NULL'];
19
+ const params = [];
20
+ if (filters.type) {
21
+ conditions.push('type = ?');
22
+ params.push(filters.type);
23
+ }
24
+ if (filters.since) {
25
+ conditions.push('created_at >= ?');
26
+ params.push(filters.since);
27
+ }
28
+ const sql = `SELECT id, type, content_text, created_at, tags, related_records, embedding
29
+ FROM record
30
+ WHERE ${conditions.join(' AND ')}`;
31
+ const rows = db.all(sql, params);
32
+ const scored = [];
33
+ for (const row of rows) {
34
+ const rowEmbedding = deserializeEmbedding(row.embedding);
35
+ const similarity = dotProduct(queryEmbedding, rowEmbedding);
36
+ if (similarity >= MIN_SIMILARITY_THRESHOLD) {
37
+ scored.push({
38
+ id: row.id,
39
+ type: row.type,
40
+ content_text: row.content_text,
41
+ created_at: row.created_at,
42
+ tags: JSON.parse(row.tags),
43
+ related_records: JSON.parse(row.related_records),
44
+ similarity,
45
+ });
46
+ }
47
+ }
48
+ scored.sort((a, b) => b.similarity - a.similarity);
49
+ return scored.slice(0, filters.limit);
50
+ }
51
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/vector/search.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEvD,MAAM,wBAAwB,GAAG,GAAG,CAAC;AA4BrC,MAAM,UAAU,UAAU,CAAC,CAAe,EAAE,CAAe;IACzD,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,EAAY,EACZ,cAA4B,EAC5B,OAAsB;IAEtB,MAAM,UAAU,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAwB,EAAE,CAAC;IAEvC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,GAAG,GAAG;;YAEF,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;IAErC,MAAM,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAA8B,CAAC;IAE9D,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,YAAY,GAAG,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACzD,MAAM,UAAU,GAAG,UAAU,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;QAE5D,IAAI,UAAU,IAAI,wBAAwB,EAAE,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,UAAU,EAAE,GAAG,CAAC,UAAU;gBAC1B,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;gBAC1B,eAAe,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC;gBAChD,UAAU;aACX,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC;IACnD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "memnant",
3
+ "version": "0.1.0",
4
+ "description": "The context layer for agent-operated products",
5
+ "type": "module",
6
+ "bin": {
7
+ "memnant": "./dist/cli/index.js"
8
+ },
9
+ "main": "./dist/index.js",
10
+ "files": [
11
+ "dist/"
12
+ ],
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "https://github.com/peureka/memnant.git"
16
+ },
17
+ "scripts": {
18
+ "build": "tsc",
19
+ "dev": "tsc --watch",
20
+ "test": "vitest run",
21
+ "test:watch": "vitest",
22
+ "lint": "tsc --noEmit",
23
+ "start:mcp": "node dist/mcp/server.js",
24
+ "prepublishOnly": "npm run build && npm test"
25
+ },
26
+ "dependencies": {
27
+ "@anthropic-ai/sdk": "^0.78.0",
28
+ "@modelcontextprotocol/sdk": "^1.12.0",
29
+ "@xenova/transformers": "^2.17.0",
30
+ "node-sqlite3-wasm": "^0.8.30",
31
+ "commander": "^13.1.0",
32
+ "js-yaml": "^4.1.0",
33
+ "openai": "^6.25.0",
34
+ "smol-toml": "^1.6.0",
35
+ "telegraf": "^4.16.3",
36
+ "uuid": "^11.1.0"
37
+ },
38
+ "devDependencies": {
39
+ "@types/js-yaml": "^4.0.9",
40
+ "@types/node": "^22.12.0",
41
+ "@types/uuid": "^10.0.0",
42
+ "typescript": "^5.7.0",
43
+ "vitest": "^3.0.0"
44
+ },
45
+ "engines": {
46
+ "node": ">=20.0.0"
47
+ },
48
+ "keywords": [
49
+ "ai",
50
+ "agents",
51
+ "context",
52
+ "memory",
53
+ "mcp",
54
+ "cli"
55
+ ],
56
+ "license": "MIT"
57
+ }