@plures/pluresdb 1.5.3 → 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 (103) hide show
  1. package/README.md +106 -414
  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 +27 -10
  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/node-index.d.ts +0 -148
  24. package/dist/node-index.d.ts.map +0 -1
  25. package/dist/node-index.js +0 -665
  26. package/dist/node-index.js.map +0 -1
  27. package/dist/node-wrapper.d.ts +0 -44
  28. package/dist/node-wrapper.d.ts.map +0 -1
  29. package/dist/node-wrapper.js +0 -296
  30. package/dist/node-wrapper.js.map +0 -1
  31. package/dist/types/index.d.ts +0 -28
  32. package/dist/types/index.d.ts.map +0 -1
  33. package/dist/types/index.js +0 -3
  34. package/dist/types/index.js.map +0 -1
  35. package/dist/types/node-types.d.ts +0 -71
  36. package/dist/types/node-types.d.ts.map +0 -1
  37. package/dist/types/node-types.js +0 -6
  38. package/dist/types/node-types.js.map +0 -1
  39. package/dist/vscode/extension.d.ts +0 -81
  40. package/dist/vscode/extension.d.ts.map +0 -1
  41. package/dist/vscode/extension.js +0 -309
  42. package/dist/vscode/extension.js.map +0 -1
  43. package/examples/basic-usage.d.ts +0 -2
  44. package/examples/basic-usage.d.ts.map +0 -1
  45. package/examples/basic-usage.js +0 -26
  46. package/examples/basic-usage.js.map +0 -1
  47. package/examples/basic-usage.ts +0 -29
  48. package/examples/vscode-extension-example/README.md +0 -95
  49. package/examples/vscode-extension-example/package.json +0 -49
  50. package/examples/vscode-extension-example/src/extension.ts +0 -172
  51. package/examples/vscode-extension-example/tsconfig.json +0 -12
  52. package/examples/vscode-extension-integration.d.ts +0 -31
  53. package/examples/vscode-extension-integration.d.ts.map +0 -1
  54. package/examples/vscode-extension-integration.js +0 -319
  55. package/examples/vscode-extension-integration.js.map +0 -1
  56. package/examples/vscode-extension-integration.ts +0 -41
  57. package/legacy/benchmarks/memory-benchmarks.ts +0 -350
  58. package/legacy/benchmarks/run-benchmarks.ts +0 -315
  59. package/legacy/better-sqlite3-shared.ts +0 -157
  60. package/legacy/better-sqlite3.ts +0 -4
  61. package/legacy/cli.ts +0 -241
  62. package/legacy/config.ts +0 -50
  63. package/legacy/core/crdt.ts +0 -107
  64. package/legacy/core/database.ts +0 -529
  65. package/legacy/healthcheck.ts +0 -162
  66. package/legacy/http/api-server.ts +0 -438
  67. package/legacy/index.ts +0 -28
  68. package/legacy/logic/rules.ts +0 -46
  69. package/legacy/main.rs +0 -3
  70. package/legacy/main.ts +0 -197
  71. package/legacy/network/websocket-server.ts +0 -115
  72. package/legacy/node-index.ts +0 -823
  73. package/legacy/node-wrapper.ts +0 -329
  74. package/legacy/sqlite-compat.ts +0 -633
  75. package/legacy/sqlite3-compat.ts +0 -55
  76. package/legacy/storage/kv-storage.ts +0 -73
  77. package/legacy/tests/core.test.ts +0 -305
  78. package/legacy/tests/fixtures/performance-data.json +0 -71
  79. package/legacy/tests/fixtures/test-data.json +0 -129
  80. package/legacy/tests/integration/api-server.test.ts +0 -334
  81. package/legacy/tests/integration/mesh-network.test.ts +0 -303
  82. package/legacy/tests/logic.test.ts +0 -34
  83. package/legacy/tests/performance/load.test.ts +0 -290
  84. package/legacy/tests/security/input-validation.test.ts +0 -286
  85. package/legacy/tests/unit/core.test.ts +0 -226
  86. package/legacy/tests/unit/subscriptions.test.ts +0 -135
  87. package/legacy/tests/unit/vector-search.test.ts +0 -173
  88. package/legacy/tests/vscode_extension_test.ts +0 -281
  89. package/legacy/types/index.ts +0 -32
  90. package/legacy/types/node-types.ts +0 -80
  91. package/legacy/util/debug.ts +0 -14
  92. package/legacy/vector/index.ts +0 -59
  93. package/legacy/vscode/extension.ts +0 -387
  94. package/scripts/compiled-crud-verify.ts +0 -30
  95. package/scripts/dogfood.ts +0 -297
  96. package/scripts/postinstall.js +0 -156
  97. package/scripts/publish-crates.sh +0 -95
  98. package/scripts/release-check.js +0 -224
  99. package/scripts/run-tests.ts +0 -178
  100. package/scripts/setup-libclang.ps1 +0 -209
  101. package/scripts/update-changelog.js +0 -214
  102. package/web/README.md +0 -27
  103. package/web/svelte/package.json +0 -31
@@ -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
- }
@@ -1,14 +0,0 @@
1
- export const DEBUG_ENABLED: boolean = (() => {
2
- try {
3
- const v = Deno.env.get("PLURESDB_DEBUG") ?? "";
4
- return v === "1" || v.toLowerCase() === "true";
5
- } catch {
6
- return false;
7
- }
8
- })();
9
-
10
- export function debugLog(...args: unknown[]): void {
11
- if (!DEBUG_ENABLED) return;
12
- // deno-lint-ignore no-console
13
- console.log("[pluresdb]", ...args);
14
- }
@@ -1,59 +0,0 @@
1
- export interface VectorIndexResult {
2
- id: string;
3
- score: number;
4
- }
5
-
6
- export interface VectorIndex {
7
- upsert(id: string, vector: number[]): void;
8
- remove(id: string): void;
9
- search(vector: number[], k: number): VectorIndexResult[];
10
- clear(): void;
11
- }
12
-
13
- export class BruteForceVectorIndex implements VectorIndex {
14
- private readonly idToVector = new Map<string, Float32Array>();
15
-
16
- upsert(id: string, vector: number[]): void {
17
- const normed = normalizeVector(vector);
18
- this.idToVector.set(id, normed);
19
- }
20
-
21
- remove(id: string): void {
22
- this.idToVector.delete(id);
23
- }
24
-
25
- clear(): void {
26
- this.idToVector.clear();
27
- }
28
-
29
- search(vector: number[], k: number): VectorIndexResult[] {
30
- const q = normalizeVector(vector);
31
- const results: VectorIndexResult[] = [];
32
- for (const [id, v] of this.idToVector) {
33
- const score = cosine(q, v);
34
- if (Number.isFinite(score)) results.push({ id, score });
35
- }
36
- results.sort((a, b) => b.score - a.score);
37
- return results.slice(0, k);
38
- }
39
- }
40
-
41
- function normalizeVector(vector: number[]): Float32Array {
42
- const arr = new Float32Array(vector.length);
43
- let n = 0;
44
- for (let i = 0; i < vector.length; i++) {
45
- const v = vector[i] ?? 0;
46
- arr[i] = v;
47
- n += v * v;
48
- }
49
- const norm = Math.sqrt(n) || 1;
50
- for (let i = 0; i < arr.length; i++) arr[i] /= norm;
51
- return arr;
52
- }
53
-
54
- function cosine(a: Float32Array, b: Float32Array): number {
55
- const len = Math.min(a.length, b.length);
56
- let dot = 0;
57
- for (let i = 0; i < len; i++) dot += a[i] * b[i];
58
- return dot;
59
- }