@plures/pluresdb 1.4.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 (96) hide show
  1. package/LICENSE +72 -0
  2. package/README.md +450 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/better-sqlite3-shared.d.ts +12 -0
  5. package/dist/better-sqlite3-shared.d.ts.map +1 -0
  6. package/dist/better-sqlite3-shared.js +143 -0
  7. package/dist/better-sqlite3-shared.js.map +1 -0
  8. package/dist/better-sqlite3.d.ts +4 -0
  9. package/dist/better-sqlite3.d.ts.map +1 -0
  10. package/dist/better-sqlite3.js +8 -0
  11. package/dist/better-sqlite3.js.map +1 -0
  12. package/dist/cli.d.ts +7 -0
  13. package/dist/cli.d.ts.map +1 -0
  14. package/dist/cli.js +258 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/node-index.d.ts +148 -0
  17. package/dist/node-index.d.ts.map +1 -0
  18. package/dist/node-index.js +665 -0
  19. package/dist/node-index.js.map +1 -0
  20. package/dist/node-wrapper.d.ts +44 -0
  21. package/dist/node-wrapper.d.ts.map +1 -0
  22. package/dist/node-wrapper.js +296 -0
  23. package/dist/node-wrapper.js.map +1 -0
  24. package/dist/types/index.d.ts +28 -0
  25. package/dist/types/index.d.ts.map +1 -0
  26. package/dist/types/index.js +3 -0
  27. package/dist/types/index.js.map +1 -0
  28. package/dist/types/node-types.d.ts +71 -0
  29. package/dist/types/node-types.d.ts.map +1 -0
  30. package/dist/types/node-types.js +6 -0
  31. package/dist/types/node-types.js.map +1 -0
  32. package/dist/vscode/extension.d.ts +81 -0
  33. package/dist/vscode/extension.d.ts.map +1 -0
  34. package/dist/vscode/extension.js +309 -0
  35. package/dist/vscode/extension.js.map +1 -0
  36. package/examples/basic-usage.d.ts +2 -0
  37. package/examples/basic-usage.d.ts.map +1 -0
  38. package/examples/basic-usage.js +26 -0
  39. package/examples/basic-usage.js.map +1 -0
  40. package/examples/basic-usage.ts +29 -0
  41. package/examples/vscode-extension-example/README.md +95 -0
  42. package/examples/vscode-extension-example/package.json +49 -0
  43. package/examples/vscode-extension-example/src/extension.ts +172 -0
  44. package/examples/vscode-extension-example/tsconfig.json +12 -0
  45. package/examples/vscode-extension-integration.d.ts +31 -0
  46. package/examples/vscode-extension-integration.d.ts.map +1 -0
  47. package/examples/vscode-extension-integration.js +319 -0
  48. package/examples/vscode-extension-integration.js.map +1 -0
  49. package/examples/vscode-extension-integration.ts +41 -0
  50. package/legacy/benchmarks/memory-benchmarks.ts +350 -0
  51. package/legacy/benchmarks/run-benchmarks.ts +315 -0
  52. package/legacy/better-sqlite3-shared.ts +157 -0
  53. package/legacy/better-sqlite3.ts +4 -0
  54. package/legacy/cli.ts +241 -0
  55. package/legacy/config.ts +50 -0
  56. package/legacy/core/crdt.ts +107 -0
  57. package/legacy/core/database.ts +529 -0
  58. package/legacy/healthcheck.ts +162 -0
  59. package/legacy/http/api-server.ts +438 -0
  60. package/legacy/index.ts +28 -0
  61. package/legacy/logic/rules.ts +46 -0
  62. package/legacy/main.rs +3 -0
  63. package/legacy/main.ts +197 -0
  64. package/legacy/network/websocket-server.ts +115 -0
  65. package/legacy/node-index.ts +823 -0
  66. package/legacy/node-wrapper.ts +329 -0
  67. package/legacy/sqlite-compat.ts +633 -0
  68. package/legacy/sqlite3-compat.ts +55 -0
  69. package/legacy/storage/kv-storage.ts +73 -0
  70. package/legacy/tests/core.test.ts +305 -0
  71. package/legacy/tests/fixtures/performance-data.json +71 -0
  72. package/legacy/tests/fixtures/test-data.json +129 -0
  73. package/legacy/tests/integration/api-server.test.ts +334 -0
  74. package/legacy/tests/integration/mesh-network.test.ts +303 -0
  75. package/legacy/tests/logic.test.ts +34 -0
  76. package/legacy/tests/performance/load.test.ts +290 -0
  77. package/legacy/tests/security/input-validation.test.ts +286 -0
  78. package/legacy/tests/unit/core.test.ts +226 -0
  79. package/legacy/tests/unit/subscriptions.test.ts +135 -0
  80. package/legacy/tests/unit/vector-search.test.ts +173 -0
  81. package/legacy/tests/vscode_extension_test.ts +281 -0
  82. package/legacy/types/index.ts +32 -0
  83. package/legacy/types/node-types.ts +80 -0
  84. package/legacy/util/debug.ts +14 -0
  85. package/legacy/vector/index.ts +59 -0
  86. package/legacy/vscode/extension.ts +387 -0
  87. package/package.json +127 -0
  88. package/scripts/compiled-crud-verify.ts +30 -0
  89. package/scripts/dogfood.ts +297 -0
  90. package/scripts/postinstall.js +156 -0
  91. package/scripts/release-check.js +190 -0
  92. package/scripts/run-tests.ts +178 -0
  93. package/scripts/setup-libclang.ps1 +209 -0
  94. package/scripts/update-changelog.js +214 -0
  95. package/web/README.md +27 -0
  96. package/web/svelte/package.json +31 -0
@@ -0,0 +1,73 @@
1
+ import type { NodeRecord } from "../types/index.ts";
2
+
3
+ export class KvStorage {
4
+ private kv: Deno.Kv | null = null;
5
+
6
+ async open(path?: string): Promise<void> {
7
+ this.kv = await Deno.openKv(path);
8
+ }
9
+
10
+ async close(): Promise<void> {
11
+ if (this.kv) {
12
+ try {
13
+ this.kv.close();
14
+ } catch {
15
+ /* ignore */
16
+ }
17
+ this.kv = null;
18
+ }
19
+ // Allow microtasks to flush for callers awaiting close()
20
+ await Promise.resolve();
21
+ }
22
+
23
+ private ensureKv(): Deno.Kv {
24
+ if (!this.kv) {
25
+ throw new Error("KvStorage is not opened. Call open() first.");
26
+ }
27
+ return this.kv;
28
+ }
29
+
30
+ async getNode(id: string): Promise<NodeRecord | null> {
31
+ const kv = this.ensureKv();
32
+ const res = await kv.get<NodeRecord>(["node", id]);
33
+ return res.value ?? null;
34
+ }
35
+
36
+ async setNode(node: NodeRecord): Promise<void> {
37
+ const kv = this.ensureKv();
38
+ await kv.set(["node", node.id], node);
39
+
40
+ // Store version history
41
+ const historyKey = ["history", node.id, node.timestamp];
42
+ await kv.set(historyKey, node);
43
+ }
44
+
45
+ async deleteNode(id: string): Promise<void> {
46
+ const kv = this.ensureKv();
47
+ await kv.delete(["node", id]);
48
+ }
49
+
50
+ async *listNodes(): AsyncIterable<NodeRecord> {
51
+ const kv = this.ensureKv();
52
+ for await (const entry of kv.list<NodeRecord>({ prefix: ["node"] })) {
53
+ if (entry.value) yield entry.value;
54
+ }
55
+ }
56
+
57
+ async *listNodeHistory(id: string): AsyncIterable<NodeRecord> {
58
+ const kv = this.ensureKv();
59
+ for await (
60
+ const entry of kv.list<NodeRecord>({ prefix: ["history", id] })
61
+ ) {
62
+ if (entry.value) yield entry.value;
63
+ }
64
+ }
65
+
66
+ async getNodeHistory(id: string): Promise<NodeRecord[]> {
67
+ const history: NodeRecord[] = [];
68
+ for await (const version of this.listNodeHistory(id)) {
69
+ history.push(version);
70
+ }
71
+ return history.sort((a, b) => b.timestamp - a.timestamp); // Most recent first
72
+ }
73
+ }
@@ -0,0 +1,305 @@
1
+ // @ts-nocheck
2
+ import { assertEquals } from "jsr:@std/assert@1.0.14";
3
+ import { GunDB } from "../core/database.ts";
4
+ import { mergeNodes } from "../core/crdt.ts";
5
+ import type { NodeRecord } from "../types/index.ts";
6
+ import type { Rule } from "../logic/rules.ts";
7
+
8
+ Deno.test("put and get returns stored data", async () => {
9
+ const db = new GunDB();
10
+ try {
11
+ const kvPath = await Deno.makeTempFile({
12
+ prefix: "kv_",
13
+ suffix: ".sqlite",
14
+ });
15
+ await db.ready(kvPath);
16
+ const user = { name: "Alice", age: 30 } as const;
17
+ await db.put("user:alice", user as unknown as Record<string, unknown>);
18
+ const got = await db.get<typeof user>("user:alice");
19
+ assertEquals(got?.name, "Alice");
20
+ assertEquals(got?.age, 30);
21
+ } finally {
22
+ await db.close();
23
+ }
24
+ });
25
+
26
+ Deno.test(
27
+ {
28
+ name: "subscription receives updates",
29
+ sanitizeOps: false,
30
+ sanitizeResources: false,
31
+ },
32
+ async () => {
33
+ const db = new GunDB();
34
+ try {
35
+ const kvPath = await Deno.makeTempFile({
36
+ prefix: "kv_",
37
+ suffix: ".sqlite",
38
+ });
39
+ await db.ready(kvPath);
40
+ const updated = new Promise((resolve) =>
41
+ db.on(
42
+ "user:bob",
43
+ (n) =>
44
+ n && (n.data as Record<string, unknown>).age === 42 &&
45
+ resolve(true),
46
+ )
47
+ );
48
+ await db.put("user:bob", { name: "Bob", age: 41 });
49
+ await db.put("user:bob", { name: "Bob", age: 42 });
50
+ const timeout = new Promise((_, rej) =>
51
+ setTimeout(() => rej(new Error("timeout: subscription")), 2000)
52
+ );
53
+ await Promise.race([updated, timeout]);
54
+ } finally {
55
+ await db.close();
56
+ }
57
+ },
58
+ );
59
+
60
+ Deno.test("vector search returns relevant notes", async () => {
61
+ const db = new GunDB();
62
+ try {
63
+ const kvPath = await Deno.makeTempFile({
64
+ prefix: "kv_",
65
+ suffix: ".sqlite",
66
+ });
67
+ await db.ready(kvPath);
68
+ await db.put("note:london1", { text: "Museums and galleries in London" });
69
+ await db.put("note:newyork1", { text: "Pizza places in New York" });
70
+ const results = await db.vectorSearch("London", 1);
71
+ if (results.length === 0) throw new Error("No vector results");
72
+ if (results[0].id !== "note:london1") {
73
+ throw new Error(`Expected note:london1 got ${results[0].id}`);
74
+ }
75
+ } finally {
76
+ await db.close();
77
+ }
78
+ });
79
+
80
+ Deno.test(
81
+ {
82
+ name: "delete emits subscription with null",
83
+ sanitizeOps: false,
84
+ sanitizeResources: false,
85
+ },
86
+ async () => {
87
+ const db = new GunDB();
88
+ try {
89
+ const kvPath = await Deno.makeTempFile({
90
+ prefix: "kv_",
91
+ suffix: ".sqlite",
92
+ });
93
+ await db.ready(kvPath);
94
+ await db.put("user:carol", { name: "Carol" });
95
+ const deleted = new Promise((resolve) =>
96
+ db.on("user:carol", (n) => n === null && resolve(true))
97
+ );
98
+ await db.delete("user:carol");
99
+ const timeout = new Promise((_, rej) =>
100
+ setTimeout(() => rej(new Error("timeout: delete")), 2000)
101
+ );
102
+ await Promise.race([deleted, timeout]);
103
+ } finally {
104
+ await db.close();
105
+ }
106
+ },
107
+ );
108
+
109
+ Deno.test(
110
+ {
111
+ name: "mesh snapshot sync and propagation",
112
+ sanitizeOps: false,
113
+ sanitizeResources: false,
114
+ },
115
+ async () => {
116
+ function randomPort() {
117
+ return 18000 + Math.floor(Math.random() * 10000);
118
+ }
119
+ const port = randomPort();
120
+ const serverUrl = `ws://localhost:${port}`;
121
+
122
+ const dbA = new GunDB();
123
+ const dbB = new GunDB();
124
+ try {
125
+ const kvA = await Deno.makeTempFile({ prefix: "kv_", suffix: ".sqlite" });
126
+ const kvB = await Deno.makeTempFile({ prefix: "kv_", suffix: ".sqlite" });
127
+ await dbA.ready(kvA);
128
+ await dbB.ready(kvB);
129
+ await dbA.serve({ port });
130
+
131
+ await dbA.put("mesh:one", { text: "hello from A" });
132
+
133
+ const receivedSnapshot = new Promise((resolve) =>
134
+ dbB.on("mesh:one", (n) => n && resolve(true))
135
+ );
136
+ dbB.connect(serverUrl);
137
+ await receivedSnapshot;
138
+
139
+ const receivedOnA = new Promise((resolve) =>
140
+ dbA.on(
141
+ "mesh:fromB",
142
+ (n) =>
143
+ n && (n.data as Record<string, unknown>).who === "B" &&
144
+ resolve(true),
145
+ )
146
+ );
147
+ await dbB.put("mesh:fromB", { who: "B", text: "hi A" });
148
+ await receivedOnA;
149
+ } finally {
150
+ await dbB.close();
151
+ await dbA.close();
152
+ }
153
+ },
154
+ );
155
+
156
+ // --- Additional tests to cover remaining checklist items ---
157
+
158
+ Deno.test("persists across restarts", async () => {
159
+ const kvPath = await Deno.makeTempFile({ prefix: "kv_", suffix: ".sqlite" });
160
+ const id = "persist:one";
161
+
162
+ const db1 = new GunDB();
163
+ await db1.ready(kvPath);
164
+ await db1.put(id, { value: 123 });
165
+ await db1.close();
166
+
167
+ const db2 = new GunDB();
168
+ await db2.ready(kvPath);
169
+ const got = await db2.get<{ value: number }>(id);
170
+ await db2.close();
171
+
172
+ if (!got) throw new Error("Expected value after restart");
173
+ assertEquals(got.value, 123);
174
+ });
175
+
176
+ Deno.test("vector clock increments on local puts", async () => {
177
+ const kvPath = await Deno.makeTempFile({ prefix: "kv_", suffix: ".sqlite" });
178
+ const id = "vc:counter";
179
+ const db = new GunDB();
180
+ await db.ready(kvPath);
181
+ await db.put(id, { n: 1 });
182
+ await db.put(id, { n: 2 });
183
+ await db.put(id, { n: 3 });
184
+ await db.close();
185
+
186
+ // Inspect underlying record
187
+ const { KvStorage } = await import("../storage/kv-storage.ts");
188
+ const kv = new KvStorage();
189
+ await kv.open(kvPath);
190
+ const node = await kv.getNode(id);
191
+ await kv.close();
192
+ if (!node) throw new Error("Missing node for vector clock check");
193
+ const clockValues = Object.values(node.vectorClock);
194
+ assertEquals(clockValues.length, 1);
195
+ assertEquals(clockValues[0], 3);
196
+ });
197
+
198
+ Deno.test("CRDT merge: equal timestamps deterministic merge", () => {
199
+ const t = Date.now();
200
+ const local: NodeRecord = {
201
+ id: "n1",
202
+ data: { a: 1, shared: 1, nested: { x: 1, y: 1 }, toDelete: 1 },
203
+ vector: [0.1, 0.2],
204
+ type: "TypeA",
205
+ timestamp: t,
206
+ vectorClock: { peerA: 2 },
207
+ };
208
+ const incoming: NodeRecord = {
209
+ id: "n1",
210
+ data: { b: 2, shared: 2, nested: { y: 2, z: 3 }, toDelete: null },
211
+ // vector and type intentionally undefined to test fallback
212
+ timestamp: t,
213
+ vectorClock: { peerB: 3 },
214
+ } as unknown as NodeRecord;
215
+
216
+ const merged = mergeNodes(local, incoming);
217
+ assertEquals(merged.id, "n1");
218
+ assertEquals(merged.timestamp, t);
219
+ assertEquals(merged.data, {
220
+ a: 1,
221
+ shared: 2,
222
+ b: 2,
223
+ nested: { x: 1, y: 2, z: 3 },
224
+ });
225
+ assertEquals(merged.type, "TypeA");
226
+ assertEquals(merged.vector, [0.1, 0.2]);
227
+ assertEquals(merged.vectorClock.peerA, 2);
228
+ assertEquals(merged.vectorClock.peerB, 3);
229
+ });
230
+
231
+ Deno.test("CRDT merge: LWW on differing timestamps", () => {
232
+ const t1 = 1000;
233
+ const t2 = 2000;
234
+ const base: NodeRecord = {
235
+ id: "n2",
236
+ data: { a: 1 },
237
+ timestamp: t1,
238
+ vectorClock: { p1: 1 },
239
+ } as unknown as NodeRecord;
240
+ const newer: NodeRecord = {
241
+ id: "n2",
242
+ data: { a: 999, b: 2 },
243
+ timestamp: t2,
244
+ vectorClock: { p2: 1 },
245
+ } as unknown as NodeRecord;
246
+
247
+ const up = mergeNodes(base, newer);
248
+ assertEquals(up.data, { a: 999, b: 2 });
249
+ assertEquals(up.timestamp, t2);
250
+
251
+ const down = mergeNodes(newer, base);
252
+ assertEquals(down.data, { a: 999, b: 2 });
253
+ assertEquals(down.timestamp, t2);
254
+ });
255
+
256
+ Deno.test(
257
+ {
258
+ name: "off stops receiving events",
259
+ sanitizeOps: false,
260
+ sanitizeResources: false,
261
+ },
262
+ async () => {
263
+ const db = new GunDB();
264
+ try {
265
+ const kvPath = await Deno.makeTempFile({
266
+ prefix: "kv_",
267
+ suffix: ".sqlite",
268
+ });
269
+ await db.ready(kvPath);
270
+ let called = false;
271
+ const id = "user:dave";
272
+ const cb = () => {
273
+ called = true;
274
+ };
275
+ db.on(id, cb);
276
+ db.off(id, cb);
277
+ await db.put(id, { name: "Dave" });
278
+ await new Promise((r) => setTimeout(r, 200));
279
+ assertEquals(called, false);
280
+ } finally {
281
+ await db.close();
282
+ }
283
+ },
284
+ );
285
+
286
+ Deno.test("type system helpers: setType + instancesOf", async () => {
287
+ const db = new GunDB();
288
+ try {
289
+ const kvPath = await Deno.makeTempFile({
290
+ prefix: "kv_",
291
+ suffix: ".sqlite",
292
+ });
293
+ await db.ready(kvPath);
294
+ await db.put("t:1", { name: "Alice" });
295
+ await db.setType("t:1", "Person");
296
+ await db.put("t:2", { name: "Acme" });
297
+ await db.setType("t:2", "Company");
298
+ const people = await db.instancesOf("Person");
299
+ if (people.length !== 1 || people[0].id !== "t:1") {
300
+ throw new Error("Expected exactly one Person: t:1");
301
+ }
302
+ } finally {
303
+ await db.close();
304
+ }
305
+ });
@@ -0,0 +1,71 @@
1
+ {
2
+ "load_test_scenarios": [
3
+ {
4
+ "name": "small_records",
5
+ "description": "Small records (100 bytes each)",
6
+ "record_size": 100,
7
+ "record_count": 1000,
8
+ "expected_ops_per_sec": 1000
9
+ },
10
+ {
11
+ "name": "medium_records",
12
+ "description": "Medium records (1KB each)",
13
+ "record_size": 1024,
14
+ "record_count": 1000,
15
+ "expected_ops_per_sec": 500
16
+ },
17
+ {
18
+ "name": "large_records",
19
+ "description": "Large records (10KB each)",
20
+ "record_size": 10240,
21
+ "record_count": 100,
22
+ "expected_ops_per_sec": 100
23
+ },
24
+ {
25
+ "name": "vector_data",
26
+ "description": "Vector data (100 dimensions)",
27
+ "vector_dimensions": 100,
28
+ "record_count": 500,
29
+ "expected_ops_per_sec": 200
30
+ }
31
+ ],
32
+ "memory_limits": {
33
+ "max_record_size": 10485760,
34
+ "max_subscriptions": 10000,
35
+ "max_memory_usage_mb": 100,
36
+ "memory_per_record_bytes": 5000
37
+ },
38
+ "performance_thresholds": {
39
+ "crud_operations_per_sec": 1000,
40
+ "vector_search_per_sec": 100,
41
+ "subscription_updates_per_sec": 500,
42
+ "network_connections_per_sec": 50,
43
+ "max_response_time_ms": 100
44
+ },
45
+ "security_test_cases": [
46
+ {
47
+ "name": "sql_injection",
48
+ "payloads": [
49
+ "'; DROP TABLE users; --",
50
+ "' OR '1'='1",
51
+ "'; INSERT INTO users VALUES ('hacker', 'password'); --"
52
+ ]
53
+ },
54
+ {
55
+ "name": "xss_attacks",
56
+ "payloads": [
57
+ "<script>alert('xss')</script>",
58
+ "javascript:alert('xss')",
59
+ "<img src=x onerror=alert('xss')>"
60
+ ]
61
+ },
62
+ {
63
+ "name": "path_traversal",
64
+ "payloads": [
65
+ "../../../etc/passwd",
66
+ "..\\..\\..\\windows\\system32\\drivers\\etc\\hosts",
67
+ "/etc/passwd"
68
+ ]
69
+ }
70
+ ]
71
+ }
@@ -0,0 +1,129 @@
1
+ {
2
+ "users": [
3
+ {
4
+ "id": "user:1",
5
+ "name": "Alice Johnson",
6
+ "email": "alice@example.com",
7
+ "age": 30,
8
+ "type": "Person",
9
+ "profile": {
10
+ "bio": "Software engineer passionate about machine learning",
11
+ "location": "San Francisco, CA",
12
+ "interests": ["AI", "ML", "Rust", "TypeScript"]
13
+ }
14
+ },
15
+ {
16
+ "id": "user:2",
17
+ "name": "Bob Smith",
18
+ "email": "bob@example.com",
19
+ "age": 25,
20
+ "type": "Person",
21
+ "profile": {
22
+ "bio": "Data scientist working on NLP applications",
23
+ "location": "New York, NY",
24
+ "interests": ["NLP", "Python", "Statistics", "Research"]
25
+ }
26
+ },
27
+ {
28
+ "id": "user:3",
29
+ "name": "Carol Davis",
30
+ "email": "carol@example.com",
31
+ "age": 35,
32
+ "type": "Person",
33
+ "profile": {
34
+ "bio": "Product manager with a focus on developer tools",
35
+ "location": "Seattle, WA",
36
+ "interests": [
37
+ "Product",
38
+ "Strategy",
39
+ "Developer Experience",
40
+ "Leadership"
41
+ ]
42
+ }
43
+ }
44
+ ],
45
+ "companies": [
46
+ {
47
+ "id": "company:1",
48
+ "name": "TechCorp Inc",
49
+ "type": "Company",
50
+ "industry": "Technology",
51
+ "employees": 500,
52
+ "location": "San Francisco, CA",
53
+ "description": "Leading provider of AI-powered solutions"
54
+ },
55
+ {
56
+ "id": "company:2",
57
+ "name": "DataFlow Systems",
58
+ "type": "Company",
59
+ "industry": "Data Analytics",
60
+ "employees": 150,
61
+ "location": "New York, NY",
62
+ "description": "Specialized in real-time data processing and analytics"
63
+ }
64
+ ],
65
+ "documents": [
66
+ {
67
+ "id": "doc:1",
68
+ "title": "Introduction to Machine Learning",
69
+ "text": "Machine learning is a subset of artificial intelligence that focuses on algorithms that can learn from data without being explicitly programmed.",
70
+ "content": "This comprehensive guide covers the fundamentals of machine learning, including supervised learning, unsupervised learning, and reinforcement learning techniques.",
71
+ "type": "Document",
72
+ "tags": ["machine learning", "AI", "tutorial", "beginner"],
73
+ "author": "user:1",
74
+ "created": "2024-01-15T10:00:00Z"
75
+ },
76
+ {
77
+ "id": "doc:2",
78
+ "title": "Advanced Neural Networks",
79
+ "text": "Deep learning neural networks have revolutionized the field of artificial intelligence with their ability to process complex patterns in data.",
80
+ "content": "This advanced tutorial explores deep learning architectures including CNNs, RNNs, and Transformers, with practical implementation examples.",
81
+ "type": "Document",
82
+ "tags": ["deep learning", "neural networks", "advanced", "tutorial"],
83
+ "author": "user:2",
84
+ "created": "2024-01-20T14:30:00Z"
85
+ },
86
+ {
87
+ "id": "doc:3",
88
+ "title": "Product Strategy for Developer Tools",
89
+ "text": "Building successful developer tools requires understanding the unique needs and workflows of software developers.",
90
+ "content": "This guide covers product strategy, user research, and go-to-market approaches specifically tailored for developer-focused products.",
91
+ "type": "Document",
92
+ "tags": ["product strategy", "developer tools", "business", "strategy"],
93
+ "author": "user:3",
94
+ "created": "2024-01-25T09:15:00Z"
95
+ }
96
+ ],
97
+ "projects": [
98
+ {
99
+ "id": "project:1",
100
+ "name": "PluresDB Database",
101
+ "type": "Project",
102
+ "description": "P2P graph database with SQLite compatibility",
103
+ "status": "active",
104
+ "technologies": ["Rust", "TypeScript", "Deno", "WebAssembly"],
105
+ "team": ["user:1", "user:2"],
106
+ "created": "2024-01-01T00:00:00Z"
107
+ },
108
+ {
109
+ "id": "project:2",
110
+ "name": "AI Research Platform",
111
+ "type": "Project",
112
+ "description": "Platform for collaborative AI research and experimentation",
113
+ "status": "planning",
114
+ "technologies": ["Python", "TensorFlow", "PyTorch", "Docker"],
115
+ "team": ["user:2", "user:3"],
116
+ "created": "2024-02-01T00:00:00Z"
117
+ }
118
+ ],
119
+ "vector_queries": [
120
+ "machine learning algorithms",
121
+ "artificial intelligence research",
122
+ "neural network architectures",
123
+ "deep learning applications",
124
+ "data science techniques",
125
+ "product management strategy",
126
+ "developer experience design",
127
+ "software engineering best practices"
128
+ ]
129
+ }