@plures/pluresdb 1.6.10 → 2.9.6

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 (126) hide show
  1. package/README.md +97 -289
  2. package/crates/README.md +99 -0
  3. package/crates/pluresdb-node/README.md +181 -0
  4. package/crates/pluresdb-node/index.d.ts +0 -0
  5. package/crates/pluresdb-node/index.js +265 -0
  6. package/crates/pluresdb-node/package.json +35 -0
  7. package/dist/napi/index.js +60 -0
  8. package/embedded.d.ts +1 -0
  9. package/embedded.js +46 -0
  10. package/package.json +20 -9
  11. package/dist/.tsbuildinfo +0 -1
  12. package/dist/better-sqlite3-shared.d.ts +0 -12
  13. package/dist/better-sqlite3-shared.d.ts.map +0 -1
  14. package/dist/better-sqlite3-shared.js +0 -143
  15. package/dist/better-sqlite3-shared.js.map +0 -1
  16. package/dist/better-sqlite3.d.ts +0 -4
  17. package/dist/better-sqlite3.d.ts.map +0 -1
  18. package/dist/better-sqlite3.js +0 -8
  19. package/dist/better-sqlite3.js.map +0 -1
  20. package/dist/cli.d.ts +0 -7
  21. package/dist/cli.d.ts.map +0 -1
  22. package/dist/cli.js.map +0 -1
  23. package/dist/local-first/unified-api.d.ts +0 -110
  24. package/dist/local-first/unified-api.d.ts.map +0 -1
  25. package/dist/local-first/unified-api.js +0 -348
  26. package/dist/local-first/unified-api.js.map +0 -1
  27. package/dist/node-index.d.ts +0 -150
  28. package/dist/node-index.d.ts.map +0 -1
  29. package/dist/node-index.js +0 -668
  30. package/dist/node-index.js.map +0 -1
  31. package/dist/node-wrapper.d.ts +0 -44
  32. package/dist/node-wrapper.d.ts.map +0 -1
  33. package/dist/node-wrapper.js +0 -296
  34. package/dist/node-wrapper.js.map +0 -1
  35. package/dist/types/index.d.ts +0 -28
  36. package/dist/types/index.d.ts.map +0 -1
  37. package/dist/types/index.js +0 -3
  38. package/dist/types/index.js.map +0 -1
  39. package/dist/types/node-types.d.ts +0 -71
  40. package/dist/types/node-types.d.ts.map +0 -1
  41. package/dist/types/node-types.js +0 -6
  42. package/dist/types/node-types.js.map +0 -1
  43. package/dist/util/debug.d.ts +0 -3
  44. package/dist/util/debug.d.ts.map +0 -1
  45. package/dist/util/debug.js +0 -34
  46. package/dist/util/debug.js.map +0 -1
  47. package/dist/vscode/extension.d.ts +0 -81
  48. package/dist/vscode/extension.d.ts.map +0 -1
  49. package/dist/vscode/extension.js +0 -309
  50. package/dist/vscode/extension.js.map +0 -1
  51. package/examples/basic-usage.d.ts +0 -2
  52. package/examples/basic-usage.d.ts.map +0 -1
  53. package/examples/basic-usage.js +0 -26
  54. package/examples/basic-usage.js.map +0 -1
  55. package/examples/basic-usage.ts +0 -29
  56. package/examples/browser-demo/README.md +0 -204
  57. package/examples/browser-demo/index.html +0 -466
  58. package/examples/browser-wasm-integration.md +0 -411
  59. package/examples/ipc-demo/README.md +0 -127
  60. package/examples/local-first-usage.ts +0 -138
  61. package/examples/native-ipc-integration.md +0 -526
  62. package/examples/tauri-demo/README.md +0 -240
  63. package/examples/tauri-integration.md +0 -260
  64. package/examples/vscode-extension-example/README.md +0 -95
  65. package/examples/vscode-extension-example/package.json +0 -49
  66. package/examples/vscode-extension-example/src/extension.ts +0 -172
  67. package/examples/vscode-extension-example/tsconfig.json +0 -12
  68. package/examples/vscode-extension-integration.d.ts +0 -31
  69. package/examples/vscode-extension-integration.d.ts.map +0 -1
  70. package/examples/vscode-extension-integration.js +0 -319
  71. package/examples/vscode-extension-integration.js.map +0 -1
  72. package/examples/vscode-extension-integration.ts +0 -41
  73. package/legacy/benchmarks/memory-benchmarks.ts +0 -350
  74. package/legacy/benchmarks/run-benchmarks.ts +0 -315
  75. package/legacy/better-sqlite3-shared.ts +0 -157
  76. package/legacy/better-sqlite3.ts +0 -4
  77. package/legacy/cli.ts +0 -241
  78. package/legacy/config.ts +0 -50
  79. package/legacy/core/crdt.ts +0 -107
  80. package/legacy/core/database.ts +0 -529
  81. package/legacy/healthcheck.ts +0 -162
  82. package/legacy/http/api-server.ts +0 -569
  83. package/legacy/index.ts +0 -31
  84. package/legacy/local-first/unified-api.ts +0 -449
  85. package/legacy/logic/rules.ts +0 -46
  86. package/legacy/main.rs +0 -3
  87. package/legacy/main.ts +0 -197
  88. package/legacy/network/websocket-server.ts +0 -115
  89. package/legacy/node-index.ts +0 -827
  90. package/legacy/node-wrapper.ts +0 -329
  91. package/legacy/plugins/README.md +0 -181
  92. package/legacy/plugins/example-embedding-plugin.ts +0 -56
  93. package/legacy/plugins/plugin-system.ts +0 -315
  94. package/legacy/sqlite-compat.ts +0 -633
  95. package/legacy/sqlite3-compat.ts +0 -55
  96. package/legacy/storage/kv-storage.ts +0 -73
  97. package/legacy/tests/core.test.ts +0 -305
  98. package/legacy/tests/fixtures/performance-data.json +0 -71
  99. package/legacy/tests/fixtures/test-data.json +0 -129
  100. package/legacy/tests/integration/api-server.test.ts +0 -334
  101. package/legacy/tests/integration/mesh-network.test.ts +0 -303
  102. package/legacy/tests/logic.test.ts +0 -34
  103. package/legacy/tests/performance/load.test.ts +0 -290
  104. package/legacy/tests/security/input-validation.test.ts +0 -286
  105. package/legacy/tests/unit/core.test.ts +0 -226
  106. package/legacy/tests/unit/local-first-api.test.ts +0 -65
  107. package/legacy/tests/unit/plugin-system.test.ts +0 -388
  108. package/legacy/tests/unit/subscriptions.test.ts +0 -135
  109. package/legacy/tests/unit/vector-search.test.ts +0 -173
  110. package/legacy/tests/vscode_extension_test.ts +0 -281
  111. package/legacy/types/index.ts +0 -32
  112. package/legacy/types/node-types.ts +0 -80
  113. package/legacy/util/debug.ts +0 -27
  114. package/legacy/vector/index.ts +0 -59
  115. package/legacy/vscode/extension.ts +0 -387
  116. package/scripts/compiled-crud-verify.ts +0 -30
  117. package/scripts/dogfood.ts +0 -297
  118. package/scripts/postinstall.js +0 -156
  119. package/scripts/publish-crates.sh +0 -95
  120. package/scripts/release-check.js +0 -224
  121. package/scripts/run-tests.ts +0 -178
  122. package/scripts/setup-libclang.ps1 +0 -209
  123. package/scripts/update-changelog.js +0 -214
  124. package/scripts/validate-npm-publish.js +0 -228
  125. package/web/README.md +0 -27
  126. package/web/svelte/package.json +0 -31
@@ -1,135 +0,0 @@
1
- // @ts-nocheck
2
- import { assertEquals, assertThrows } from "jsr:@std/assert@1.0.14";
3
- import { GunDB } from "../../core/database.ts";
4
-
5
- Deno.test("Subscriptions - Basic Update Events", async () => {
6
- const db = new GunDB();
7
- try {
8
- const kvPath = await Deno.makeTempFile({
9
- prefix: "kv_",
10
- suffix: ".sqlite",
11
- });
12
- await db.ready(kvPath);
13
-
14
- const id = "user:test";
15
- let updateCount = 0;
16
- let lastData: any = null;
17
-
18
- const unsubscribe = db.on(id, (node) => {
19
- updateCount++;
20
- lastData = node?.data;
21
- });
22
-
23
- // Test initial put
24
- await db.put(id, { name: "Alice", age: 30 });
25
- await new Promise((resolve) => setTimeout(resolve, 100));
26
- assertEquals(updateCount, 1);
27
- assertEquals(lastData?.name, "Alice");
28
-
29
- // Test update
30
- await db.put(id, { name: "Alice", age: 31 });
31
- await new Promise((resolve) => setTimeout(resolve, 100));
32
- assertEquals(updateCount, 2);
33
- assertEquals(lastData?.age, 31);
34
-
35
- // Test unsubscribe
36
- unsubscribe();
37
- await db.put(id, { name: "Alice", age: 32 });
38
- await new Promise((resolve) => setTimeout(resolve, 100));
39
- assertEquals(updateCount, 2); // Should not increment
40
- } finally {
41
- await db.close();
42
- }
43
- });
44
-
45
- Deno.test("Subscriptions - Delete Events", async () => {
46
- const db = new GunDB();
47
- try {
48
- const kvPath = await Deno.makeTempFile({
49
- prefix: "kv_",
50
- suffix: ".sqlite",
51
- });
52
- await db.ready(kvPath);
53
-
54
- const id = "user:delete";
55
- let deleteReceived = false;
56
-
57
- const unsubscribe = db.on(id, (node) => {
58
- if (node === null) {
59
- deleteReceived = true;
60
- }
61
- });
62
-
63
- await db.put(id, { name: "Bob" });
64
- await db.delete(id);
65
- await new Promise((resolve) => setTimeout(resolve, 100));
66
-
67
- assertEquals(deleteReceived, true);
68
- unsubscribe();
69
- } finally {
70
- await db.close();
71
- }
72
- });
73
-
74
- Deno.test("Subscriptions - Multiple Subscribers", async () => {
75
- const db = new GunDB();
76
- try {
77
- const kvPath = await Deno.makeTempFile({
78
- prefix: "kv_",
79
- suffix: ".sqlite",
80
- });
81
- await db.ready(kvPath);
82
-
83
- const id = "user:multi";
84
- let subscriber1Count = 0;
85
- let subscriber2Count = 0;
86
-
87
- const unsubscribe1 = db.on(id, () => subscriber1Count++);
88
- const unsubscribe2 = db.on(id, () => subscriber2Count++);
89
-
90
- await db.put(id, { name: "Charlie" });
91
- await new Promise((resolve) => setTimeout(resolve, 100));
92
-
93
- assertEquals(subscriber1Count, 1);
94
- assertEquals(subscriber2Count, 1);
95
-
96
- unsubscribe1();
97
- unsubscribe2();
98
- } finally {
99
- await db.close();
100
- }
101
- });
102
-
103
- Deno.test("Subscriptions - Error Handling", () => {
104
- const db = new GunDB();
105
-
106
- // Test subscription before ready
107
- assertThrows(() => db.on("test", () => {}), Error, "Database not ready");
108
- });
109
-
110
- Deno.test("Subscriptions - Off Method", async () => {
111
- const db = new GunDB();
112
- try {
113
- const kvPath = await Deno.makeTempFile({
114
- prefix: "kv_",
115
- suffix: ".sqlite",
116
- });
117
- await db.ready(kvPath);
118
-
119
- const id = "user:off";
120
- let called = false;
121
-
122
- const callback = () => {
123
- called = true;
124
- };
125
- db.on(id, callback);
126
- db.off(id, callback);
127
-
128
- await db.put(id, { name: "Dave" });
129
- await new Promise((resolve) => setTimeout(resolve, 100));
130
-
131
- assertEquals(called, false);
132
- } finally {
133
- await db.close();
134
- }
135
- });
@@ -1,173 +0,0 @@
1
- // @ts-nocheck
2
- import { assertEquals, assertExists } from "jsr:@std/assert@1.0.14";
3
- import { GunDB } from "../../core/database.ts";
4
-
5
- Deno.test("Vector Search - Basic Functionality", async () => {
6
- const db = new GunDB();
7
- try {
8
- const kvPath = await Deno.makeTempFile({
9
- prefix: "kv_",
10
- suffix: ".sqlite",
11
- });
12
- await db.ready(kvPath);
13
-
14
- // Add documents with different content
15
- await db.put("doc:1", {
16
- text: "Machine learning and artificial intelligence algorithms",
17
- content: "Deep learning neural networks for pattern recognition",
18
- });
19
- await db.put("doc:2", {
20
- text: "Cooking recipes and food preparation techniques",
21
- content: "Italian pasta recipes and cooking methods",
22
- });
23
- await db.put("doc:3", {
24
- text: "Web development and JavaScript programming",
25
- content: "React and TypeScript for modern web applications",
26
- });
27
-
28
- // Test search with text field
29
- const results1 = await db.vectorSearch("machine learning", 2);
30
- assertExists(results1);
31
- assertEquals(results1.length, 2);
32
-
33
- // Test search with content field
34
- const results2 = await db.vectorSearch("neural networks", 1);
35
- assertExists(results2);
36
- assertEquals(results2.length, 1);
37
- assertEquals(results2[0].id, "doc:1");
38
-
39
- // Test search with different query
40
- const results3 = await db.vectorSearch("cooking food", 1);
41
- assertExists(results3);
42
- assertEquals(results3.length, 1);
43
- assertEquals(results3[0].id, "doc:2");
44
- } finally {
45
- await db.close();
46
- }
47
- });
48
-
49
- Deno.test("Vector Search - Similarity Scoring", async () => {
50
- const db = new GunDB();
51
- try {
52
- const kvPath = await Deno.makeTempFile({
53
- prefix: "kv_",
54
- suffix: ".sqlite",
55
- });
56
- await db.ready(kvPath);
57
-
58
- await db.put("doc:1", { text: "Machine learning algorithms" });
59
- await db.put("doc:2", { text: "Machine learning and AI" });
60
- await db.put("doc:3", { text: "Cooking recipes" });
61
-
62
- const results = await db.vectorSearch("machine learning", 3);
63
- assertExists(results);
64
- assertEquals(results.length, 3);
65
-
66
- // Results should be ordered by similarity (highest first)
67
- assertExists(results[0].similarity);
68
- assertExists(results[1].similarity);
69
- assertExists(results[2].similarity);
70
-
71
- // First result should have highest similarity
72
- assertEquals(results[0].similarity >= results[1].similarity, true);
73
- assertEquals(results[1].similarity >= results[2].similarity, true);
74
- } finally {
75
- await db.close();
76
- }
77
- });
78
-
79
- Deno.test("Vector Search - Limit Parameter", async () => {
80
- const db = new GunDB();
81
- try {
82
- const kvPath = await Deno.makeTempFile({
83
- prefix: "kv_",
84
- suffix: ".sqlite",
85
- });
86
- await db.ready(kvPath);
87
-
88
- // Add multiple documents
89
- for (let i = 1; i <= 10; i++) {
90
- await db.put(`doc:${i}`, {
91
- text: `Document ${i} about machine learning and AI`,
92
- });
93
- }
94
-
95
- // Test different limits
96
- const results1 = await db.vectorSearch("machine learning", 3);
97
- assertEquals(results1.length, 3);
98
-
99
- const results2 = await db.vectorSearch("machine learning", 5);
100
- assertEquals(results2.length, 5);
101
-
102
- const results3 = await db.vectorSearch("machine learning", 1);
103
- assertEquals(results3.length, 1);
104
- } finally {
105
- await db.close();
106
- }
107
- });
108
-
109
- Deno.test("Vector Search - Empty Results", async () => {
110
- const db = new GunDB();
111
- try {
112
- const kvPath = await Deno.makeTempFile({
113
- prefix: "kv_",
114
- suffix: ".sqlite",
115
- });
116
- await db.ready(kvPath);
117
-
118
- // Search in empty database
119
- const results = await db.vectorSearch("anything", 5);
120
- assertEquals(results.length, 0);
121
- } finally {
122
- await db.close();
123
- }
124
- });
125
-
126
- Deno.test("Vector Search - Custom Vector Input", async () => {
127
- const db = new GunDB();
128
- try {
129
- const kvPath = await Deno.makeTempFile({
130
- prefix: "kv_",
131
- suffix: ".sqlite",
132
- });
133
- await db.ready(kvPath);
134
-
135
- // Add document with custom vector
136
- const customVector = [0.1, 0.2, 0.3, 0.4, 0.5];
137
- await db.put("doc:custom", {
138
- text: "Custom vector document",
139
- vector: customVector,
140
- });
141
-
142
- // Search with custom vector
143
- const results = await db.vectorSearch(customVector, 1);
144
- assertExists(results);
145
- assertEquals(results.length, 1);
146
- assertEquals(results[0].id, "doc:custom");
147
- } finally {
148
- await db.close();
149
- }
150
- });
151
-
152
- Deno.test("Vector Search - No Text Content", async () => {
153
- const db = new GunDB();
154
- try {
155
- const kvPath = await Deno.makeTempFile({
156
- prefix: "kv_",
157
- suffix: ".sqlite",
158
- });
159
- await db.ready(kvPath);
160
-
161
- // Add document without text or content
162
- await db.put("doc:no-text", {
163
- name: "Document without text",
164
- value: 123,
165
- });
166
-
167
- // Search should return empty results
168
- const results = await db.vectorSearch("anything", 5);
169
- assertEquals(results.length, 0);
170
- } finally {
171
- await db.close();
172
- }
173
- });
@@ -1,281 +0,0 @@
1
- // @ts-nocheck
2
- import { assert, assertEquals, assertMatch } from "jsr:@std/assert@1.0.14";
3
- import {
4
- createPluresExtension,
5
- ExtensionContextLike,
6
- PluresVSCodeExtension,
7
- VSCodeAPI,
8
- } from "../vscode/extension.ts";
9
-
10
- interface RecordedDocument {
11
- content: string;
12
- language: string;
13
- }
14
-
15
- interface RecordedMessage {
16
- type: "info" | "error";
17
- text: string;
18
- }
19
-
20
- type CommandHandler = (...args: unknown[]) => unknown;
21
-
22
- type TestHarness = {
23
- vscode: VSCodeAPI;
24
- context: ExtensionContextLike;
25
- commands: Map<string, CommandHandler>;
26
- docs: RecordedDocument[];
27
- messages: RecordedMessage[];
28
- shownTargets: string[];
29
- queueInputs: (...values: (string | undefined)[]) => void;
30
- };
31
-
32
- function createHarness(storageDir: string): TestHarness {
33
- const commands = new Map<string, CommandHandler>();
34
- const docs: RecordedDocument[] = [];
35
- const messages: RecordedMessage[] = [];
36
- const shownTargets: string[] = [];
37
- const inputQueue: Array<string | undefined> = [];
38
-
39
- const vscode: VSCodeAPI = {
40
- commands: {
41
- registerCommand(command, handler) {
42
- commands.set(command, handler);
43
- return {
44
- dispose() {
45
- commands.delete(command);
46
- },
47
- };
48
- },
49
- },
50
- window: {
51
- async showInformationMessage(message: string) {
52
- messages.push({ type: "info", text: message });
53
- },
54
- async showErrorMessage(message: string) {
55
- messages.push({ type: "error", text: message });
56
- },
57
- async showInputBox() {
58
- return inputQueue.shift();
59
- },
60
- async showTextDocument(doc: unknown) {
61
- if (
62
- typeof doc === "object" && doc && "content" in doc &&
63
- "language" in doc
64
- ) {
65
- const record = doc as RecordedDocument;
66
- docs.push({ content: record.content, language: record.language });
67
- }
68
- },
69
- },
70
- workspace: {
71
- async openTextDocument(init) {
72
- docs.push(init as RecordedDocument);
73
- return init;
74
- },
75
- },
76
- env: {
77
- async openExternal(target) {
78
- shownTargets.push(
79
- typeof target === "string" ? target : target.toString(),
80
- );
81
- },
82
- },
83
- Uri: {
84
- parse(target: string) {
85
- return target;
86
- },
87
- },
88
- };
89
-
90
- const context: ExtensionContextLike = {
91
- subscriptions: [],
92
- globalStorageUri: { fsPath: storageDir },
93
- };
94
-
95
- return {
96
- vscode,
97
- context,
98
- commands,
99
- docs,
100
- messages,
101
- shownTargets,
102
- queueInputs: (...values: (string | undefined)[]) => {
103
- inputQueue.push(...values);
104
- },
105
- };
106
- }
107
-
108
- async function getFreePort(): Promise<number> {
109
- const listener = Deno.listen({ hostname: "127.0.0.1", port: 0 });
110
- const { port } = listener.addr as Deno.NetAddr;
111
- listener.close();
112
- return port;
113
- }
114
-
115
- async function waitFor(
116
- predicate: () => Promise<boolean>,
117
- timeout = 10_000,
118
- interval = 200,
119
- ) {
120
- const deadline = Date.now() + timeout;
121
- while (Date.now() < deadline) {
122
- if (await predicate()) return;
123
- await new Promise((resolve) => setTimeout(resolve, interval));
124
- }
125
- throw new Error("Timed out waiting for condition");
126
- }
127
-
128
- async function removeDirWithRetry(target: string) {
129
- const delays = [0, 200, 400, 800, 1600, 3200];
130
- for (let i = 0; i < delays.length; i++) {
131
- if (delays[i] > 0) {
132
- await new Promise((resolve) => setTimeout(resolve, delays[i]));
133
- }
134
- try {
135
- await Deno.remove(target, { recursive: true });
136
- return;
137
- } catch (error) {
138
- const retryable = error instanceof Error &&
139
- /used by another process/i.test(error.message);
140
- if (!retryable || i === delays.length - 1) {
141
- throw error;
142
- }
143
- }
144
- }
145
- }
146
-
147
- Deno.test("VSCode integration dogfood workflow", async () => {
148
- const storageDir = await Deno.makeTempDir({ prefix: "plures-vscode-" });
149
- const apiPort = await getFreePort();
150
- const webPort = await getFreePort();
151
- const apiUrl = `http://127.0.0.1:${apiPort}`;
152
-
153
- const harness = createHarness(storageDir);
154
- const extension = createPluresExtension(harness.vscode, harness.context, {
155
- config: {
156
- host: "127.0.0.1",
157
- port: apiPort,
158
- webPort,
159
- },
160
- });
161
-
162
- try {
163
- try {
164
- await extension.activate();
165
- } catch (error) {
166
- console.error("Activation failed", harness.messages);
167
- throw error;
168
- }
169
-
170
- await waitFor(async () => {
171
- try {
172
- const res = await fetch(`${apiUrl}/api/list`);
173
- return res.ok;
174
- } catch {
175
- return false;
176
- }
177
- });
178
-
179
- const seed = await fetch(`${apiUrl}/api/put`, {
180
- method: "POST",
181
- headers: { "content-type": "application/json" },
182
- body: JSON.stringify({
183
- id: "extension:vector-doc",
184
- data: {
185
- type: "VSCodeDocument",
186
- title: "Integration Test",
187
- tags: ["extension", "sqlite"],
188
- vector: [0.12, 0.24, 0.48, 0.96],
189
- },
190
- }),
191
- });
192
- assert(seed.ok, "Failed to seed vector test data");
193
-
194
- const openWebUICmd = harness.commands.get("pluresdb.openWebUI");
195
- if (!openWebUICmd) {
196
- throw new Error("openWebUI command should be registered");
197
- }
198
- await openWebUICmd();
199
- assertEquals(harness.shownTargets.at(-1), `http://127.0.0.1:${webPort}`);
200
-
201
- harness.queueInputs("SELECT name FROM pragma_table_info('settings')");
202
- const execQuery = harness.commands.get("pluresdb.executeQuery");
203
- if (!execQuery) {
204
- throw new Error("executeQuery command should be registered");
205
- }
206
- await execQuery();
207
- const schemaDoc = harness.docs.at(-1);
208
- if (!schemaDoc) {
209
- throw new Error("Expected schema document to open");
210
- }
211
- const schemaRows = JSON.parse(schemaDoc.content) as Array<
212
- Record<string, unknown>
213
- >;
214
- const columnNames = schemaRows.map((row) => String(row.name));
215
- assert(
216
- columnNames.includes("key"),
217
- "Settings table should expose key column",
218
- );
219
-
220
- harness.queueInputs(
221
- "user:alpha",
222
- '{"name":"Ada","vector":[0.2,0.1,0.3,0.4],"role":"builder"}',
223
- );
224
- const storeCommand = harness.commands.get("pluresdb.storeData");
225
- if (!storeCommand) {
226
- throw new Error("storeData command should be registered");
227
- }
228
- await storeCommand();
229
- assertMatch(
230
- harness.messages.at(-1)?.text ?? "",
231
- /Stored data for key: user:alpha/,
232
- );
233
-
234
- harness.queueInputs("user:alpha");
235
- const retrieveCommand = harness.commands.get("pluresdb.retrieveData");
236
- if (!retrieveCommand) {
237
- throw new Error("retrieveData command should be registered");
238
- }
239
- await retrieveCommand();
240
- const retrievedDoc = harness.docs.at(-1);
241
- if (!retrievedDoc) {
242
- throw new Error("Expected retrieved document to open");
243
- }
244
- const retrieved = JSON.parse(retrievedDoc.content);
245
- assertEquals(retrieved.name, "Ada");
246
-
247
- harness.queueInputs("sqlite builder search");
248
- const vectorCommand = harness.commands.get("pluresdb.vectorSearch");
249
- if (!vectorCommand) {
250
- throw new Error("vectorSearch command should be registered");
251
- }
252
- await vectorCommand();
253
- const vectorDoc = harness.docs.at(-1);
254
- if (!vectorDoc) {
255
- throw new Error("Expected vector search document to open");
256
- }
257
- const vectorResults = JSON.parse(vectorDoc.content) as Array<
258
- Record<string, unknown>
259
- >;
260
- assert(
261
- vectorResults.length > 0,
262
- "Vector search should return at least one result",
263
- );
264
-
265
- const settingsRows = await extension.executeSQL(
266
- "SELECT name FROM pragma_table_info('documents')",
267
- );
268
- assert(Array.isArray(settingsRows));
269
- } finally {
270
- await extension.deactivate();
271
- try {
272
- await removeDirWithRetry(storageDir);
273
- } catch (error) {
274
- console.warn(
275
- `⚠️ Failed to remove temp dir: ${
276
- error instanceof Error ? error.message : String(error)
277
- }`,
278
- );
279
- }
280
- }
281
- });
@@ -1,32 +0,0 @@
1
- export interface VectorClock {
2
- [peerId: string]: number;
3
- }
4
-
5
- export interface NodeRecord {
6
- id: string;
7
- data: Record<string, unknown>;
8
- vector?: number[];
9
- type?: string;
10
- timestamp: number;
11
- state?: Record<string, number>;
12
- vectorClock: VectorClock;
13
- }
14
-
15
- export interface PutMessage {
16
- type: "put";
17
- originId?: string;
18
- node: NodeRecord;
19
- }
20
-
21
- export interface DeleteMessage {
22
- type: "delete";
23
- originId?: string;
24
- id: string;
25
- }
26
-
27
- export interface SyncRequestMessage {
28
- type: "sync_request";
29
- originId?: string;
30
- }
31
-
32
- export type MeshMessage = PutMessage | DeleteMessage | SyncRequestMessage;
@@ -1,80 +0,0 @@
1
- /**
2
- * Node.js-specific types for PluresDB
3
- */
4
-
5
- export interface PluresDBConfig {
6
- port?: number;
7
- host?: string;
8
- dataDir?: string;
9
- webPort?: number;
10
- logLevel?: "debug" | "info" | "warn" | "error";
11
- }
12
-
13
- export interface PluresDBOptions {
14
- config?: PluresDBConfig;
15
- autoStart?: boolean;
16
- denoPath?: string;
17
- }
18
-
19
- export interface QueryResult {
20
- rows: any[];
21
- columns: string[];
22
- changes: number;
23
- lastInsertRowId: number;
24
- }
25
-
26
- export interface BetterSQLite3Options extends PluresDBOptions {
27
- filename?: string;
28
- memory?: boolean;
29
- readonly?: boolean;
30
- fileMustExist?: boolean;
31
- verbose?: (...args: unknown[]) => void;
32
- }
33
-
34
- export interface BetterSQLite3RunResult {
35
- changes: number;
36
- lastInsertRowid: number | null;
37
- columns?: string[];
38
- }
39
-
40
- export interface VectorSearchResult {
41
- id: string;
42
- content: string;
43
- score: number;
44
- metadata?: any;
45
- }
46
-
47
- export interface Peer {
48
- id: string;
49
- name: string;
50
- email: string;
51
- publicKey: string;
52
- lastSeen: Date;
53
- status: "online" | "offline" | "connecting";
54
- }
55
-
56
- export interface SharedNode {
57
- id: string;
58
- nodeId: string;
59
- peerId: string;
60
- accessLevel: "read-only" | "read-write" | "admin";
61
- encrypted: boolean;
62
- createdAt: Date;
63
- expiresAt?: Date;
64
- }
65
-
66
- export interface Device {
67
- id: string;
68
- name: string;
69
- type: "laptop" | "phone" | "server" | "desktop";
70
- lastSync: Date;
71
- status: "online" | "offline" | "syncing";
72
- }
73
-
74
- export interface SyncStatus {
75
- isOnline: boolean;
76
- lastSync: Date | null;
77
- pendingChanges: number;
78
- connectedPeers: number;
79
- syncProgress: number;
80
- }