@delali/narsil 0.1.7 → 0.1.9

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 (87) hide show
  1. package/README.md +800 -111
  2. package/dist/adapters/filesystem.d.ts +1 -1
  3. package/dist/adapters/filesystem.mjs +46 -2
  4. package/dist/adapters/indexeddb.d.ts +1 -1
  5. package/dist/adapters/indexeddb.mjs +1 -1
  6. package/dist/adapters/memory.d.ts +1 -1
  7. package/dist/{adapters-BbRkoiu9.d.ts → adapters-Bo2JQg8b.d.ts} +2 -1
  8. package/dist/chunk-ALB35PRQ.mjs +98 -0
  9. package/dist/chunk-KMMJMDUA.mjs +44 -0
  10. package/dist/chunk-RQLXC2YS.mjs +269 -0
  11. package/dist/chunk-S7RJJMHI.mjs +1086 -0
  12. package/dist/chunk-SVDEEMO6.mjs +7023 -0
  13. package/dist/{chunk-I24SGLFS.mjs → chunk-TW6BXTOL.mjs} +5 -1
  14. package/dist/{chunk-KHL4RPC3.mjs → chunk-VWF7RKSF.mjs} +2566 -2282
  15. package/dist/chunk-WISGW24C.mjs +455 -0
  16. package/dist/config-DX--2Owg.d.ts +472 -0
  17. package/dist/direct-executor-KC5O5D2R.mjs +4 -0
  18. package/dist/distribution/coordinator/etcd.d.ts +16 -0
  19. package/dist/distribution/coordinator/etcd.mjs +2 -0
  20. package/dist/distribution/coordinator/in-memory.d.ts +7 -0
  21. package/dist/distribution/coordinator/in-memory.mjs +1 -0
  22. package/dist/distribution.d.ts +122 -0
  23. package/dist/distribution.mjs +7410 -0
  24. package/dist/embeddings/openai.d.ts +1 -1
  25. package/dist/embeddings/openai.mjs +6 -1
  26. package/dist/index.browser.mjs +11750 -7532
  27. package/dist/index.d.ts +6 -450
  28. package/dist/index.mjs +7 -3236
  29. package/dist/invalidation/broadcast-channel.d.ts +1 -1
  30. package/dist/invalidation/filesystem.d.ts +1 -1
  31. package/dist/invalidation/noop.d.ts +1 -1
  32. package/dist/{language-ClUGLuoC.d.ts → language-ONQ3iVDf.d.ts} +1 -0
  33. package/dist/languages/arabic.d.ts +1 -1
  34. package/dist/languages/armenian.d.ts +1 -1
  35. package/dist/languages/bulgarian.d.ts +1 -1
  36. package/dist/languages/chinese.d.ts +1 -1
  37. package/dist/languages/dagbani.d.ts +1 -1
  38. package/dist/languages/danish.d.ts +1 -1
  39. package/dist/languages/dutch.d.ts +1 -1
  40. package/dist/languages/english.d.ts +1 -1
  41. package/dist/languages/english.mjs +1 -1
  42. package/dist/languages/ewe.d.ts +1 -1
  43. package/dist/languages/finnish.d.ts +1 -1
  44. package/dist/languages/french.d.ts +1 -1
  45. package/dist/languages/ga.d.ts +1 -1
  46. package/dist/languages/german.d.ts +1 -1
  47. package/dist/languages/greek.d.ts +1 -1
  48. package/dist/languages/hausa.d.ts +1 -1
  49. package/dist/languages/hindi.d.ts +1 -1
  50. package/dist/languages/hungarian.d.ts +1 -1
  51. package/dist/languages/igbo.d.ts +1 -1
  52. package/dist/languages/indonesian.d.ts +1 -1
  53. package/dist/languages/irish.d.ts +1 -1
  54. package/dist/languages/italian.d.ts +1 -1
  55. package/dist/languages/japanese.d.ts +1 -1
  56. package/dist/languages/nepali.d.ts +1 -1
  57. package/dist/languages/norwegian.d.ts +1 -1
  58. package/dist/languages/portuguese.d.ts +1 -1
  59. package/dist/languages/romanian.d.ts +1 -1
  60. package/dist/languages/russian.d.ts +1 -1
  61. package/dist/languages/sanskrit.d.ts +1 -1
  62. package/dist/languages/serbian.d.ts +1 -1
  63. package/dist/languages/slovenian.d.ts +1 -1
  64. package/dist/languages/spanish.d.ts +1 -1
  65. package/dist/languages/swahili.d.ts +1 -1
  66. package/dist/languages/swedish.d.ts +1 -1
  67. package/dist/languages/tamil.d.ts +1 -1
  68. package/dist/languages/turkish.d.ts +1 -1
  69. package/dist/languages/twi.d.ts +1 -1
  70. package/dist/languages/ukrainian.d.ts +1 -1
  71. package/dist/languages/yoruba.d.ts +1 -1
  72. package/dist/languages/zulu.d.ts +1 -1
  73. package/dist/narsil-B3jKyXCr.d.ts +72 -0
  74. package/dist/persistence/durability/checkpoint-worker.d.ts +48 -0
  75. package/dist/persistence/durability/checkpoint-worker.mjs +59 -0
  76. package/dist/schema-C3VhNvfw.d.ts +60 -0
  77. package/dist/serialization/crc32-worker.d.ts +20 -0
  78. package/dist/serialization/crc32-worker.mjs +61 -0
  79. package/dist/server.d.ts +218 -0
  80. package/dist/server.mjs +1184 -0
  81. package/dist/types-CTVVm4GG.d.ts +73 -0
  82. package/dist/vector/hnsw-build-worker.mjs +1 -1
  83. package/dist/workers/entry.mjs +1 -1
  84. package/package.json +38 -2
  85. package/dist/chunk-R2C2EQGO.mjs +0 -53
  86. package/dist/chunk-VVORJOXR.mjs +0 -759
  87. package/dist/direct-executor-LBJLGMJ2.mjs +0 -4
@@ -0,0 +1,73 @@
1
+ import { S as SchemaDefinition } from './schema-C3VhNvfw.js';
2
+
3
+ type NodeRole = 'data' | 'coordinator' | 'controller';
4
+ type PartitionState = 'UNASSIGNED' | 'INITIALISING' | 'ACTIVE' | 'MIGRATING' | 'DECOMMISSIONING';
5
+ interface NodeCapacity {
6
+ memoryBytes: number;
7
+ cpuCores: number;
8
+ diskBytes: number | null;
9
+ }
10
+ interface NodeRegistration {
11
+ nodeId: string;
12
+ address: string;
13
+ roles: NodeRole[];
14
+ capacity: NodeCapacity;
15
+ startedAt: string;
16
+ version: string;
17
+ metadata?: Record<string, string>;
18
+ }
19
+ interface PartitionAssignment {
20
+ primary: string | null;
21
+ replicas: string[];
22
+ inSyncSet: string[];
23
+ state: PartitionState;
24
+ primaryTerm: number;
25
+ }
26
+ interface AllocationTable {
27
+ indexName: string;
28
+ version: number;
29
+ replicationFactor: number;
30
+ assignments: Map<number, PartitionAssignment>;
31
+ }
32
+ interface NodeEvent {
33
+ type: 'node_joined' | 'node_left';
34
+ nodeId: string;
35
+ registration: NodeRegistration | null;
36
+ }
37
+ interface AllocationEvent {
38
+ indexName: string;
39
+ table: AllocationTable;
40
+ }
41
+ interface SchemaEvent {
42
+ type: 'schema_created' | 'schema_dropped';
43
+ indexName: string;
44
+ schema: SchemaDefinition | null;
45
+ }
46
+ interface AllocationConstraints {
47
+ zoneAwareness: boolean;
48
+ zoneAttribute: string;
49
+ maxShardsPerNode: number | null;
50
+ }
51
+ interface ClusterCoordinator {
52
+ registerNode(registration: NodeRegistration): Promise<void>;
53
+ deregisterNode(nodeId: string): Promise<void>;
54
+ listNodes(): Promise<NodeRegistration[]>;
55
+ watchNodes(handler: (event: NodeEvent) => void): Promise<() => void>;
56
+ getAllocation(indexName: string): Promise<AllocationTable | null>;
57
+ putAllocation(indexName: string, table: AllocationTable, expectedVersion?: number | null): Promise<boolean>;
58
+ watchAllocation(handler: (event: AllocationEvent) => void): Promise<() => void>;
59
+ getPartitionState(indexName: string, partitionId: number): Promise<PartitionState>;
60
+ putPartitionState(indexName: string, partitionId: number, state: PartitionState): Promise<void>;
61
+ acquireLease(key: string, nodeId: string, ttlMs: number): Promise<boolean>;
62
+ renewLease(key: string, nodeId: string, ttlMs: number): Promise<boolean>;
63
+ releaseLease(key: string): Promise<void>;
64
+ get(key: string): Promise<Uint8Array | null>;
65
+ compareAndSet(key: string, expected: Uint8Array | null, value: Uint8Array): Promise<boolean>;
66
+ getSchema(indexName: string): Promise<SchemaDefinition | null>;
67
+ putSchema(indexName: string, schema: SchemaDefinition): Promise<void>;
68
+ watchSchemas(handler: (event: SchemaEvent) => void): Promise<() => void>;
69
+ getLeaseHolder(key: string): Promise<string | null>;
70
+ shutdown(): Promise<void>;
71
+ }
72
+
73
+ export type { AllocationTable as A, ClusterCoordinator as C, NodeRegistration as N, PartitionAssignment as P, SchemaEvent as S, NodeRole as a, NodeCapacity as b, AllocationConstraints as c, AllocationEvent as d, NodeEvent as e, PartitionState as f };
@@ -1,4 +1,4 @@
1
- import { createVectorStore, createHNSWIndex } from '../chunk-VVORJOXR.mjs';
1
+ import { createVectorStore, createHNSWIndex } from '../chunk-S7RJJMHI.mjs';
2
2
 
3
3
  // src/vector/hnsw-build-worker.ts
4
4
  var MAX_WORKER_DIMENSION = 8192;
@@ -15,7 +15,7 @@ async function setup() {
15
15
  } catch {
16
16
  parentPort = null;
17
17
  }
18
- const { createDirectExecutor } = await import('../direct-executor-LBJLGMJ2.mjs');
18
+ const { createDirectExecutor } = await import('../direct-executor-KC5O5D2R.mjs');
19
19
  const executor = createDirectExecutor();
20
20
  function buildErrorResponse(requestId, code, message) {
21
21
  return { type: "error", requestId, code, message };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@delali/narsil",
3
- "version": "0.1.7",
3
+ "version": "0.1.9",
4
4
  "type": "module",
5
5
  "description": "A distributed full-text search engine with cross-language portable binary format.",
6
6
  "author": "Delali (https://sondelali.com)",
@@ -81,6 +81,22 @@
81
81
  "./languages/*": {
82
82
  "import": "./dist/languages/*.mjs",
83
83
  "types": "./dist/languages/*.d.ts"
84
+ },
85
+ "./distribution": {
86
+ "import": "./dist/distribution.mjs",
87
+ "types": "./dist/distribution.d.ts"
88
+ },
89
+ "./distribution/coordinator/in-memory": {
90
+ "import": "./dist/distribution/coordinator/in-memory.mjs",
91
+ "types": "./dist/distribution/coordinator/in-memory.d.ts"
92
+ },
93
+ "./distribution/coordinator/etcd": {
94
+ "import": "./dist/distribution/coordinator/etcd.mjs",
95
+ "types": "./dist/distribution/coordinator/etcd.d.ts"
96
+ },
97
+ "./server": {
98
+ "import": "./dist/server.mjs",
99
+ "types": "./dist/server.d.ts"
84
100
  }
85
101
  },
86
102
  "files": [
@@ -94,21 +110,41 @@
94
110
  "@biomejs/biome": "2.4.4",
95
111
  "@types/node": "22.15.32",
96
112
  "@vitest/coverage-v8": "4.0.18",
113
+ "etcd3": "1.1.2",
114
+ "fflate": "0.8.3",
115
+ "selfsigned": "5.5.0",
97
116
  "tsup": "8.5.1",
98
117
  "typescript": "5.9.3",
118
+ "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.58.0",
99
119
  "vitest": "4.0.18",
100
120
  "wabt": "1.0.39",
101
121
  "@delali/narsil-embeddings-transformers": "0.1.6"
102
122
  },
123
+ "peerDependencies": {
124
+ "etcd3": "1.1.2",
125
+ "uWebSockets.js": ">=20.0.0"
126
+ },
127
+ "peerDependenciesMeta": {
128
+ "etcd3": {
129
+ "optional": true
130
+ },
131
+ "uWebSockets.js": {
132
+ "optional": true
133
+ }
134
+ },
103
135
  "scripts": {
104
136
  "build": "tsup",
105
137
  "test": "vitest run --exclude='**/vector/recall.test.ts'",
138
+ "test:etcd": "vitest run src/__tests__/distribution/coordinator/etcd-integration/*.test.ts",
106
139
  "test:watch": "vitest",
107
140
  "test:coverage": "vitest run --coverage",
108
141
  "test:recall": "vitest run src/__tests__/vector/recall.test.ts",
109
142
  "test:embeddings": "NARSIL_TEST_EMBEDDINGS=1 vitest run embedding-e2e",
110
143
  "bench": "vitest bench",
111
144
  "lint": "biome check src/",
112
- "typecheck": "tsc --noEmit"
145
+ "typecheck:src": "tsc --noEmit",
146
+ "typecheck:tests": "tsc --noEmit -p tsconfig.test.json",
147
+ "typecheck:tooling": "tsc --noEmit -p scripts/tsconfig.json && tsc --noEmit -p benchmarks/tsconfig.json && tsc --noEmit -p wasm/tsconfig.json",
148
+ "typecheck": "pnpm run typecheck:src && pnpm run typecheck:tests && pnpm run typecheck:tooling"
113
149
  }
114
150
  }
@@ -1,53 +0,0 @@
1
- // src/errors.ts
2
- var ErrorCodes = {
3
- SCHEMA_INVALID_TYPE: "SCHEMA_INVALID_TYPE",
4
- SCHEMA_MISSING_FIELD: "SCHEMA_MISSING_FIELD",
5
- SCHEMA_DEPTH_EXCEEDED: "SCHEMA_DEPTH_EXCEEDED",
6
- SCHEMA_INVALID_VECTOR_DIMENSION: "SCHEMA_INVALID_VECTOR_DIMENSION",
7
- SCHEMA_INVALID_GEOPOINT: "SCHEMA_INVALID_GEOPOINT",
8
- DOC_NOT_FOUND: "DOC_NOT_FOUND",
9
- DOC_ALREADY_EXISTS: "DOC_ALREADY_EXISTS",
10
- DOC_VALIDATION_FAILED: "DOC_VALIDATION_FAILED",
11
- INDEX_NOT_FOUND: "INDEX_NOT_FOUND",
12
- INDEX_ALREADY_EXISTS: "INDEX_ALREADY_EXISTS",
13
- PARTITION_CORRUPTED: "PARTITION_CORRUPTED",
14
- PARTITION_REBALANCING_BACKPRESSURE: "PARTITION_REBALANCING_BACKPRESSURE",
15
- WORKER_CRASHED: "WORKER_CRASHED",
16
- WORKER_BUSY: "WORKER_BUSY",
17
- WORKER_TIMEOUT: "WORKER_TIMEOUT",
18
- PERSISTENCE_SAVE_FAILED: "PERSISTENCE_SAVE_FAILED",
19
- PERSISTENCE_LOAD_FAILED: "PERSISTENCE_LOAD_FAILED",
20
- PERSISTENCE_DELETE_FAILED: "PERSISTENCE_DELETE_FAILED",
21
- PERSISTENCE_CRC_MISMATCH: "PERSISTENCE_CRC_MISMATCH",
22
- SEARCH_INVALID_FIELD: "SEARCH_INVALID_FIELD",
23
- SEARCH_INVALID_VECTOR_SIZE: "SEARCH_INVALID_VECTOR_SIZE",
24
- VECTOR_DIMENSION_MISMATCH: "VECTOR_DIMENSION_MISMATCH",
25
- SEARCH_INVALID_FILTER: "SEARCH_INVALID_FILTER",
26
- SEARCH_INVALID_MODE: "SEARCH_INVALID_MODE",
27
- SEARCH_INVALID_CURSOR: "SEARCH_INVALID_CURSOR",
28
- LANGUAGE_NOT_SUPPORTED: "LANGUAGE_NOT_SUPPORTED",
29
- ENVELOPE_VERSION_MISMATCH: "ENVELOPE_VERSION_MISMATCH",
30
- ENVELOPE_INVALID_MAGIC: "ENVELOPE_INVALID_MAGIC",
31
- PARTITION_CAPACITY_EXCEEDED: "PARTITION_CAPACITY_EXCEEDED",
32
- EMBEDDING_FAILED: "EMBEDDING_FAILED",
33
- EMBEDDING_DIMENSION_MISMATCH: "EMBEDDING_DIMENSION_MISMATCH",
34
- EMBEDDING_NO_SOURCE: "EMBEDDING_NO_SOURCE",
35
- EMBEDDING_CONFIG_INVALID: "EMBEDDING_CONFIG_INVALID",
36
- DOC_MISSING_REQUIRED_FIELD: "DOC_MISSING_REQUIRED_FIELD",
37
- CONFIG_INVALID: "CONFIG_INVALID"
38
- };
39
- var NarsilError = class extends Error {
40
- code;
41
- details;
42
- constructor(code, message, details) {
43
- super(message);
44
- this.name = "NarsilError";
45
- this.code = code;
46
- this.details = details ?? {};
47
- }
48
- };
49
- function createNarsilError(code, message, details) {
50
- return new NarsilError(code, message, details);
51
- }
52
-
53
- export { ErrorCodes, NarsilError, createNarsilError };