crbro-memory 1.0.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 (59) hide show
  1. package/README.md +122 -0
  2. package/bin/crbro.js +99 -0
  3. package/dist/engine/brain.d.ts +43 -0
  4. package/dist/engine/brain.d.ts.map +1 -0
  5. package/dist/engine/brain.js +179 -0
  6. package/dist/engine/brain.js.map +1 -0
  7. package/dist/engine/cortex.d.ts +70 -0
  8. package/dist/engine/cortex.d.ts.map +1 -0
  9. package/dist/engine/cortex.js +219 -0
  10. package/dist/engine/cortex.js.map +1 -0
  11. package/dist/engine/heat.d.ts +28 -0
  12. package/dist/engine/heat.d.ts.map +1 -0
  13. package/dist/engine/heat.js +112 -0
  14. package/dist/engine/heat.js.map +1 -0
  15. package/dist/engine/hippocampus.d.ts +26 -0
  16. package/dist/engine/hippocampus.d.ts.map +1 -0
  17. package/dist/engine/hippocampus.js +73 -0
  18. package/dist/engine/hippocampus.js.map +1 -0
  19. package/dist/engine/license.d.ts +29 -0
  20. package/dist/engine/license.d.ts.map +1 -0
  21. package/dist/engine/license.js +109 -0
  22. package/dist/engine/license.js.map +1 -0
  23. package/dist/engine/maintenance.d.ts +41 -0
  24. package/dist/engine/maintenance.d.ts.map +1 -0
  25. package/dist/engine/maintenance.js +156 -0
  26. package/dist/engine/maintenance.js.map +1 -0
  27. package/dist/engine/prefrontal.d.ts +31 -0
  28. package/dist/engine/prefrontal.d.ts.map +1 -0
  29. package/dist/engine/prefrontal.js +149 -0
  30. package/dist/engine/prefrontal.js.map +1 -0
  31. package/dist/engine/synapses.d.ts +39 -0
  32. package/dist/engine/synapses.d.ts.map +1 -0
  33. package/dist/engine/synapses.js +154 -0
  34. package/dist/engine/synapses.js.map +1 -0
  35. package/dist/index.d.ts +2 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +16 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/search/index.d.ts +31 -0
  40. package/dist/search/index.d.ts.map +1 -0
  41. package/dist/search/index.js +139 -0
  42. package/dist/search/index.js.map +1 -0
  43. package/dist/server.d.ts +3 -0
  44. package/dist/server.d.ts.map +1 -0
  45. package/dist/server.js +543 -0
  46. package/dist/server.js.map +1 -0
  47. package/dist/types/index.d.ts +121 -0
  48. package/dist/types/index.d.ts.map +1 -0
  49. package/dist/types/index.js +5 -0
  50. package/dist/types/index.js.map +1 -0
  51. package/dist/utils/fs.d.ts +35 -0
  52. package/dist/utils/fs.d.ts.map +1 -0
  53. package/dist/utils/fs.js +110 -0
  54. package/dist/utils/fs.js.map +1 -0
  55. package/dist/utils/ids.d.ts +32 -0
  56. package/dist/utils/ids.d.ts.map +1 -0
  57. package/dist/utils/ids.js +92 -0
  58. package/dist/utils/ids.js.map +1 -0
  59. package/package.json +52 -0
@@ -0,0 +1,121 @@
1
+ export interface Fact {
2
+ text: string;
3
+ confidence: number;
4
+ added: string;
5
+ source: string;
6
+ }
7
+ export interface Decision {
8
+ text: string;
9
+ date: string;
10
+ rationale: string;
11
+ }
12
+ export type NeuronType = 'project' | 'tech' | 'lang' | 'person' | 'domain' | 'process';
13
+ export interface Neuron {
14
+ id: string;
15
+ name: string;
16
+ domain: string;
17
+ type: NeuronType;
18
+ created: string;
19
+ last_accessed: string;
20
+ access_count: number;
21
+ heat: number;
22
+ summary: string;
23
+ facts: Fact[];
24
+ decisions: Decision[];
25
+ patterns: string[];
26
+ preferences: string[];
27
+ connections: string[];
28
+ tags: string[];
29
+ }
30
+ export type SynapseType = 'dependency' | 'causal' | 'temporal' | 'conceptual' | 'hierarchy' | 'alternative';
31
+ export interface Synapse {
32
+ id: string;
33
+ nodes: [string, string];
34
+ strength: number;
35
+ type: SynapseType;
36
+ context: string;
37
+ co_access_count: number;
38
+ last_co_access: string;
39
+ }
40
+ export interface SessionLog {
41
+ session_id: string;
42
+ date: string;
43
+ duration_estimate: string;
44
+ topics_touched: string[];
45
+ summary: string;
46
+ key_facts_added: number;
47
+ decisions_made: number;
48
+ new_neurons_created: number;
49
+ synapses_updated: number;
50
+ }
51
+ export interface ActiveContext {
52
+ last_session: string;
53
+ active_topics: string[];
54
+ pending_tasks: string[];
55
+ last_updated: string;
56
+ }
57
+ export interface HotTopic {
58
+ id: string;
59
+ name: string;
60
+ heat: number;
61
+ last_access: string;
62
+ domain: string;
63
+ }
64
+ export interface HotTopics {
65
+ topics: HotTopic[];
66
+ last_recalculated: string;
67
+ }
68
+ export interface Cluster {
69
+ name: string;
70
+ nodes: string[];
71
+ summary: string;
72
+ heat: number;
73
+ }
74
+ export interface Bridge {
75
+ from: string;
76
+ to: string;
77
+ via: string[];
78
+ context: string;
79
+ }
80
+ export interface GlobalMap {
81
+ last_rebuilt: string;
82
+ clusters: Cluster[];
83
+ bridges: Bridge[];
84
+ }
85
+ export interface Manifest {
86
+ version: string;
87
+ created: string;
88
+ owner: string;
89
+ brain_path: string;
90
+ total_neurons: number;
91
+ total_synapses: number;
92
+ total_sessions: number;
93
+ last_boot: string | null;
94
+ last_consolidation: string | null;
95
+ license_key: string | null;
96
+ }
97
+ export interface BootResult {
98
+ status: 'ok' | 'initialized' | 'error';
99
+ total_neurons: number;
100
+ total_synapses: number;
101
+ total_sessions: number;
102
+ hot_topics: HotTopic[];
103
+ last_session: string | null;
104
+ active_context: ActiveContext | null;
105
+ message: string;
106
+ }
107
+ export interface SearchResult {
108
+ neuron_id: string;
109
+ name: string;
110
+ domain: string;
111
+ relevance_score: number;
112
+ matching_content: string;
113
+ heat: number;
114
+ }
115
+ export type PremiumFeature = 'global_map' | 'maintenance' | 'export' | 'import' | 'advanced_search';
116
+ export interface LicenseInfo {
117
+ valid: boolean;
118
+ tier: 'free' | 'premium';
119
+ features: PremiumFeature[];
120
+ }
121
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ // ─── CRBRO Types ─────────────────────────────────────────────────
3
+ // Biological neural memory architecture types
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";AAAA,oEAAoE;AACpE,8CAA8C"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Safely read and parse a JSON file. Returns null if file doesn't exist.
3
+ * Never throws on missing file — only on corrupted JSON.
4
+ */
5
+ export declare function readJSON<T>(filePath: string): Promise<T | null>;
6
+ /**
7
+ * Write JSON to file atomically (write to temp, then rename).
8
+ * Creates parent directories if they don't exist.
9
+ */
10
+ export declare function writeJSON<T>(filePath: string, data: T): Promise<void>;
11
+ /**
12
+ * Check if a file exists.
13
+ */
14
+ export declare function fileExists(filePath: string): Promise<boolean>;
15
+ /**
16
+ * List all JSON files in a directory. Returns filenames without extension.
17
+ */
18
+ export declare function listJSONFiles(dirPath: string): Promise<string[]>;
19
+ /**
20
+ * Delete a JSON file. Returns true if deleted, false if didn't exist.
21
+ */
22
+ export declare function deleteJSON(filePath: string): Promise<boolean>;
23
+ /**
24
+ * Move a file from one location to another.
25
+ */
26
+ export declare function moveFile(from: string, to: string): Promise<void>;
27
+ /**
28
+ * Get the current date as ISO string (date only).
29
+ */
30
+ export declare function today(): string;
31
+ /**
32
+ * Get the current datetime as ISO string.
33
+ */
34
+ export declare function now(): string;
35
+ //# sourceMappingURL=fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAMA;;;GAGG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAUrE;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAS3E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOnE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAYtE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUnE;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAItE;AAED;;GAEG;AACH,wBAAgB,KAAK,IAAI,MAAM,CAE9B;AAED;;GAEG;AACH,wBAAgB,GAAG,IAAI,MAAM,CAE5B"}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ // ─── CRBRO File System Utilities ─────────────────────────────────
3
+ // Safe JSON read/write with error handling and atomic writes
4
+ var __importDefault = (this && this.__importDefault) || function (mod) {
5
+ return (mod && mod.__esModule) ? mod : { "default": mod };
6
+ };
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.readJSON = readJSON;
9
+ exports.writeJSON = writeJSON;
10
+ exports.fileExists = fileExists;
11
+ exports.listJSONFiles = listJSONFiles;
12
+ exports.deleteJSON = deleteJSON;
13
+ exports.moveFile = moveFile;
14
+ exports.today = today;
15
+ exports.now = now;
16
+ const node_fs_1 = require("node:fs");
17
+ const node_path_1 = __importDefault(require("node:path"));
18
+ /**
19
+ * Safely read and parse a JSON file. Returns null if file doesn't exist.
20
+ * Never throws on missing file — only on corrupted JSON.
21
+ */
22
+ async function readJSON(filePath) {
23
+ try {
24
+ const content = await node_fs_1.promises.readFile(filePath, 'utf-8');
25
+ return JSON.parse(content);
26
+ }
27
+ catch (err) {
28
+ if (err instanceof Error && 'code' in err && err.code === 'ENOENT') {
29
+ return null;
30
+ }
31
+ throw new Error(`CRBRO: Corrupted JSON at ${filePath}: ${err instanceof Error ? err.message : String(err)}`);
32
+ }
33
+ }
34
+ /**
35
+ * Write JSON to file atomically (write to temp, then rename).
36
+ * Creates parent directories if they don't exist.
37
+ */
38
+ async function writeJSON(filePath, data) {
39
+ const dir = node_path_1.default.dirname(filePath);
40
+ await node_fs_1.promises.mkdir(dir, { recursive: true });
41
+ const tempPath = `${filePath}.tmp`;
42
+ const content = JSON.stringify(data, null, 2);
43
+ await node_fs_1.promises.writeFile(tempPath, content, 'utf-8');
44
+ await node_fs_1.promises.rename(tempPath, filePath);
45
+ }
46
+ /**
47
+ * Check if a file exists.
48
+ */
49
+ async function fileExists(filePath) {
50
+ try {
51
+ await node_fs_1.promises.access(filePath);
52
+ return true;
53
+ }
54
+ catch {
55
+ return false;
56
+ }
57
+ }
58
+ /**
59
+ * List all JSON files in a directory. Returns filenames without extension.
60
+ */
61
+ async function listJSONFiles(dirPath) {
62
+ try {
63
+ const files = await node_fs_1.promises.readdir(dirPath);
64
+ return files
65
+ .filter(f => f.endsWith('.json'))
66
+ .map(f => f.replace('.json', ''));
67
+ }
68
+ catch (err) {
69
+ if (err instanceof Error && 'code' in err && err.code === 'ENOENT') {
70
+ return [];
71
+ }
72
+ throw err;
73
+ }
74
+ }
75
+ /**
76
+ * Delete a JSON file. Returns true if deleted, false if didn't exist.
77
+ */
78
+ async function deleteJSON(filePath) {
79
+ try {
80
+ await node_fs_1.promises.unlink(filePath);
81
+ return true;
82
+ }
83
+ catch (err) {
84
+ if (err instanceof Error && 'code' in err && err.code === 'ENOENT') {
85
+ return false;
86
+ }
87
+ throw err;
88
+ }
89
+ }
90
+ /**
91
+ * Move a file from one location to another.
92
+ */
93
+ async function moveFile(from, to) {
94
+ const dir = node_path_1.default.dirname(to);
95
+ await node_fs_1.promises.mkdir(dir, { recursive: true });
96
+ await node_fs_1.promises.rename(from, to);
97
+ }
98
+ /**
99
+ * Get the current date as ISO string (date only).
100
+ */
101
+ function today() {
102
+ return new Date().toISOString().split('T')[0];
103
+ }
104
+ /**
105
+ * Get the current datetime as ISO string.
106
+ */
107
+ function now() {
108
+ return new Date().toISOString();
109
+ }
110
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { NeuronType } from '../types/index.js';
2
+ /**
3
+ * Convert a string to a valid snake_case ID.
4
+ * "OctoChat Plugin" → "octochat_plugin"
5
+ */
6
+ export declare function toSnakeCase(str: string): string;
7
+ /**
8
+ * Generate a neuron ID from name and type.
9
+ * ("OctoChat", "project") → "project_octochat"
10
+ */
11
+ export declare function neuronId(name: string, type: NeuronType): string;
12
+ /**
13
+ * Generate a synapse ID from two neuron IDs.
14
+ * ("project_octochat", "tech_firebase") → "syn_octochat__firebase"
15
+ * Always sorted alphabetically for consistency.
16
+ */
17
+ export declare function synapseId(nodeA: string, nodeB: string): string;
18
+ /**
19
+ * Generate a session ID for today.
20
+ * → "session_2026-05-06"
21
+ */
22
+ export declare function sessionId(date?: string): string;
23
+ /**
24
+ * Validate that a string is a valid neuron ID.
25
+ */
26
+ export declare function isValidNeuronId(id: string): boolean;
27
+ /**
28
+ * Infer neuron type from topic name using simple heuristics.
29
+ * Falls back to 'project' if unsure.
30
+ */
31
+ export declare function inferNeuronType(topic: string): NeuronType;
32
+ //# sourceMappingURL=ids.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids.d.ts","sourceRoot":"","sources":["../../src/utils/ids.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAWpD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQ/C;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,MAAM,CAI/D;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAI9D;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAG/C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAuBzD"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ // ─── CRBRO ID Utilities ──────────────────────────────────────────
3
+ // Generate and validate neuron/synapse IDs
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.toSnakeCase = toSnakeCase;
6
+ exports.neuronId = neuronId;
7
+ exports.synapseId = synapseId;
8
+ exports.sessionId = sessionId;
9
+ exports.isValidNeuronId = isValidNeuronId;
10
+ exports.inferNeuronType = inferNeuronType;
11
+ const TYPE_PREFIXES = {
12
+ project: 'project_',
13
+ tech: 'tech_',
14
+ lang: 'lang_',
15
+ person: 'person_',
16
+ domain: 'domain_',
17
+ process: 'process_',
18
+ };
19
+ /**
20
+ * Convert a string to a valid snake_case ID.
21
+ * "OctoChat Plugin" → "octochat_plugin"
22
+ */
23
+ function toSnakeCase(str) {
24
+ return str
25
+ .toLowerCase()
26
+ .trim()
27
+ .replace(/[^a-z0-9\s_-]/g, '') // Remove special chars
28
+ .replace(/[\s-]+/g, '_') // Spaces/hyphens to underscores
29
+ .replace(/_+/g, '_') // Collapse multiple underscores
30
+ .replace(/^_|_$/g, ''); // Trim leading/trailing underscores
31
+ }
32
+ /**
33
+ * Generate a neuron ID from name and type.
34
+ * ("OctoChat", "project") → "project_octochat"
35
+ */
36
+ function neuronId(name, type) {
37
+ const prefix = TYPE_PREFIXES[type];
38
+ const slug = toSnakeCase(name);
39
+ return `${prefix}${slug}`;
40
+ }
41
+ /**
42
+ * Generate a synapse ID from two neuron IDs.
43
+ * ("project_octochat", "tech_firebase") → "syn_octochat__firebase"
44
+ * Always sorted alphabetically for consistency.
45
+ */
46
+ function synapseId(nodeA, nodeB) {
47
+ const stripPrefix = (id) => id.replace(/^(project_|tech_|lang_|person_|domain_|process_)/, '');
48
+ const parts = [stripPrefix(nodeA), stripPrefix(nodeB)].sort();
49
+ return `syn_${parts[0]}__${parts[1]}`;
50
+ }
51
+ /**
52
+ * Generate a session ID for today.
53
+ * → "session_2026-05-06"
54
+ */
55
+ function sessionId(date) {
56
+ const d = date || new Date().toISOString().split('T')[0];
57
+ return `session_${d}`;
58
+ }
59
+ /**
60
+ * Validate that a string is a valid neuron ID.
61
+ */
62
+ function isValidNeuronId(id) {
63
+ return /^(project|tech|lang|person|domain|process)_[a-z0-9_]+$/.test(id);
64
+ }
65
+ /**
66
+ * Infer neuron type from topic name using simple heuristics.
67
+ * Falls back to 'project' if unsure.
68
+ */
69
+ function inferNeuronType(topic) {
70
+ const lower = topic.toLowerCase();
71
+ // Tech keywords
72
+ const techKeywords = ['firebase', 'react', 'node', 'docker', 'kubernetes', 'aws', 'gcp', 'cloud', 'api', 'rest',
73
+ 'graphql', 'mongodb', 'postgres', 'redis', 'nginx', 'webpack', 'vite', 'git', 'npm', 'supabase', 'stripe',
74
+ 'vercel', 'netlify', 'cloudflare', 'orama', 'chromadb', 'openai', 'gemini', 'claude'];
75
+ if (techKeywords.some(kw => lower.includes(kw)))
76
+ return 'tech';
77
+ // Language keywords
78
+ const langKeywords = ['python', 'javascript', 'typescript', 'php', 'rust', 'go', 'java', 'swift', 'kotlin', 'css', 'html', 'sql'];
79
+ if (langKeywords.some(kw => lower === kw || lower.includes(` ${kw}`) || lower.includes(`${kw} `)))
80
+ return 'lang';
81
+ // Process keywords
82
+ const processKeywords = ['deploy', 'migration', 'workflow', 'pipeline', 'ci/cd', 'backup', 'setup', 'install'];
83
+ if (processKeywords.some(kw => lower.includes(kw)))
84
+ return 'process';
85
+ // Domain keywords
86
+ const domainKeywords = ['seo', 'marketing', 'trading', 'crypto', 'design', 'security', 'devops', 'data', 'analytics'];
87
+ if (domainKeywords.some(kw => lower === kw))
88
+ return 'domain';
89
+ // Default to project
90
+ return 'project';
91
+ }
92
+ //# sourceMappingURL=ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids.js","sourceRoot":"","sources":["../../src/utils/ids.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "crbro-memory",
3
+ "version": "1.0.0",
4
+ "description": "CRBRO — Persistent neural memory for AI. A biological file-based MCP server that gives your AI long-term memory across sessions.",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "crbro-memory": "./bin/crbro.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsc --watch",
13
+ "start": "node dist/index.js",
14
+ "test": "vitest run",
15
+ "test:watch": "vitest",
16
+ "prepublishOnly": "npm run build"
17
+ },
18
+ "keywords": [
19
+ "mcp",
20
+ "memory",
21
+ "ai",
22
+ "persistent-memory",
23
+ "model-context-protocol",
24
+ "llm",
25
+ "synthetica"
26
+ ],
27
+ "author": "Synthetica Decks",
28
+ "license": "MIT",
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "https://github.com/Octonove/crbro-memory"
32
+ },
33
+ "engines": {
34
+ "node": ">=18.0.0"
35
+ },
36
+ "files": [
37
+ "dist/",
38
+ "bin/",
39
+ "README.md",
40
+ "LICENSE"
41
+ ],
42
+ "dependencies": {
43
+ "@modelcontextprotocol/sdk": "^1.29.0",
44
+ "@orama/orama": "^3.1.18",
45
+ "zod": "^4.4.3"
46
+ },
47
+ "devDependencies": {
48
+ "@types/node": "^25.6.0",
49
+ "typescript": "^6.0.3",
50
+ "vitest": "^4.1.5"
51
+ }
52
+ }