@adhd/sox-embedding-provider 0.5.1 → 0.5.3
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.
- package/README.md +44 -3
- package/dist/embedHostConfig.d.ts +161 -0
- package/dist/embedHostConfig.d.ts.map +1 -0
- package/dist/embedHostConfig.js +234 -0
- package/dist/embedHostConfig.js.map +1 -0
- package/dist/embedHostMain.d.ts +59 -0
- package/dist/embedHostMain.d.ts.map +1 -0
- package/dist/embedHostMain.js +223 -0
- package/dist/embedHostMain.js.map +1 -0
- package/dist/errors.d.ts +25 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +35 -0
- package/dist/errors.js.map +1 -0
- package/dist/fastembed.d.ts.map +1 -1
- package/dist/fastembed.js +3 -0
- package/dist/fastembed.js.map +1 -1
- package/dist/fastembedProcessHost.d.ts.map +1 -1
- package/dist/fastembedProcessHost.js +11 -10
- package/dist/fastembedProcessHost.js.map +1 -1
- package/dist/funnelClient.d.ts +97 -0
- package/dist/funnelClient.d.ts.map +1 -0
- package/dist/funnelClient.js +320 -0
- package/dist/funnelClient.js.map +1 -0
- package/dist/index.d.ts +35 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +54 -39
- package/dist/index.js.map +1 -1
- package/dist/onnxStderrFilter.d.ts +2 -1
- package/dist/onnxStderrFilter.d.ts.map +1 -1
- package/dist/onnxStderrFilter.js +2 -1
- package/dist/onnxStderrFilter.js.map +1 -1
- package/dist/package.json +8 -2
- package/dist/sharedFastembedProcess.d.ts +59 -32
- package/dist/sharedFastembedProcess.d.ts.map +1 -1
- package/dist/sharedFastembedProcess.js +100 -41
- package/dist/sharedFastembedProcess.js.map +1 -1
- package/package.json +8 -2
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* embedHostMain.ts — the peer-spawned, self-reaping embedding host process
|
|
3
|
+
* (SPEC-EMBEDDING-FUNNEL.md §C).
|
|
4
|
+
*
|
|
5
|
+
* This is the compute backend of the funnel: a plain, DETACHED Node process,
|
|
6
|
+
* spawned on demand by the first consumer through `ensureBackend()`'s O_EXCL
|
|
7
|
+
* singleton spawn-lock. It is **never supervised** (no launchd/KeepAlive) and it
|
|
8
|
+
* **reaps itself** — a debounced, ref-counted teardown retires it
|
|
9
|
+
* `idleGraceMs` after the last cross-process client disconnects and in-flight
|
|
10
|
+
* work drains.
|
|
11
|
+
*
|
|
12
|
+
* ── Compute-only (ADR-0012) ────────────────────────────────────────────────────
|
|
13
|
+
*
|
|
14
|
+
* The host holds NO store connection. It forwards `embedding.*` payloads 1:1 to
|
|
15
|
+
* its private ONNX pool and never opens a database. It therefore cannot
|
|
16
|
+
* serialize store access and must never be described as single-writer or as a
|
|
17
|
+
* store serialization point; concurrent store writers are unaffected.
|
|
18
|
+
*
|
|
19
|
+
* ── No recursion ───────────────────────────────────────────────────────────────
|
|
20
|
+
*
|
|
21
|
+
* The handler forwards to `getPrivateFastembedProcess()` — the PRIVATE pool — and
|
|
22
|
+
* NEVER to `getSharedFastembedProcess()`, which under `host: 'shared'` would
|
|
23
|
+
* return a `FunneledFastembedClient` and dial this very host (infinite
|
|
24
|
+
* recursion). The import graph is arranged so that mistake is a type error, not
|
|
25
|
+
* a runtime hang.
|
|
26
|
+
*
|
|
27
|
+
* ── Teardown inputs are CROSS-PROCESS ─────────────────────────────────────────
|
|
28
|
+
*
|
|
29
|
+
* - `activeClients` — live UDS client connections, from `serveBackend`'s
|
|
30
|
+
* `onClientCountChange` hook (the cross-process half);
|
|
31
|
+
* - `inFlight` — THIS host's own request depth, incremented synchronously at
|
|
32
|
+
* the top of every handler invocation and decremented in its `finally` (the
|
|
33
|
+
* in-process half). It is deliberately NOT the private pool's
|
|
34
|
+
* `pendingCount`: that counter is incremented only AFTER `ensureProcess()`
|
|
35
|
+
* (the fork) resolves, so it reads 0 during a cold-start fork and would arm
|
|
36
|
+
* a reap over live work. `inFlight` is the synchronous truth.
|
|
37
|
+
*
|
|
38
|
+
* `activeClients === 0 && inFlight === 0` arms the grace timer; a new client
|
|
39
|
+
* or request cancels it. On expiry the private pool is terminated, the listener
|
|
40
|
+
* closed (which unlinks the socket), and the process exits 0. The private pool's
|
|
41
|
+
* ONNX child is forked `detached: false`, so it dies with the host — no orphans.
|
|
42
|
+
*
|
|
43
|
+
* ── The accessor is resolved at EVERY use, never captured ──────────────────────
|
|
44
|
+
*
|
|
45
|
+
* `embedding.reset` terminates AND nulls the private singleton
|
|
46
|
+
* (`resetPrivateFastembedProcess()`); a host that captured the accessor once
|
|
47
|
+
* would keep forwarding through the terminated reference and answer every later
|
|
48
|
+
* request with `shared fastembed process terminated`. Every use
|
|
49
|
+
* (the request handler, `armIfIdle`, `teardown`, `health`) therefore calls
|
|
50
|
+
* `getPrivateFastembedProcess()` fresh.
|
|
51
|
+
*/
|
|
52
|
+
import { fileURLToPath } from 'node:url';
|
|
53
|
+
import { resolve } from 'node:path';
|
|
54
|
+
import { serveBackend } from '@adhd/sox-service-proxy';
|
|
55
|
+
import { resolveEmbedHostIdleGraceMs } from './embedHostConfig.js';
|
|
56
|
+
import { getPrivateFastembedProcess, resetPrivateFastembedProcess } from './sharedFastembedProcess.js';
|
|
57
|
+
/** The `embedding.*` methods the host serves. */
|
|
58
|
+
const HOST_METHODS = new Set([
|
|
59
|
+
'embedding.init',
|
|
60
|
+
'embedding.embed',
|
|
61
|
+
'embedding.embedBatch',
|
|
62
|
+
'embedding.reset',
|
|
63
|
+
'embedding.health',
|
|
64
|
+
]);
|
|
65
|
+
function ok(id, result) {
|
|
66
|
+
return { jsonrpc: '2.0', id: id ?? null, result };
|
|
67
|
+
}
|
|
68
|
+
function fail(id, code, message) {
|
|
69
|
+
return { jsonrpc: '2.0', id: id ?? null, error: { code, message } };
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Start the host: bind the UDS, serve `embedding.*`, and arm the debounced
|
|
73
|
+
* self-reap. Resolves once the listener is up (so a caller/test can await
|
|
74
|
+
* readiness); the process stays alive until the teardown fires or a signal
|
|
75
|
+
* arrives.
|
|
76
|
+
*/
|
|
77
|
+
export async function runEmbedHost() {
|
|
78
|
+
const socketPath = process.env['SOX_EMBED_HOST_SOCKET'];
|
|
79
|
+
if (!socketPath) {
|
|
80
|
+
process.stderr.write('[embed-host] SOX_EMBED_HOST_SOCKET is not set — the host is spawned by the funnel client, not run directly.\n');
|
|
81
|
+
process.exit(2);
|
|
82
|
+
}
|
|
83
|
+
const idleGraceMs = resolveEmbedHostIdleGraceMs();
|
|
84
|
+
let activeClients = 0;
|
|
85
|
+
/**
|
|
86
|
+
* This host's own in-flight request depth. Incremented synchronously before
|
|
87
|
+
* the handler's first `await` and decremented in its `finally`, so it covers a
|
|
88
|
+
* request's entire synchronous prefix — including the cold-start fork, where
|
|
89
|
+
* the private pool's `pendingCount` still reads 0.
|
|
90
|
+
*/
|
|
91
|
+
let inFlight = 0;
|
|
92
|
+
let idleTimer = null;
|
|
93
|
+
let shuttingDown = false;
|
|
94
|
+
let handle = null;
|
|
95
|
+
const cancelIdle = () => {
|
|
96
|
+
if (idleTimer) {
|
|
97
|
+
clearTimeout(idleTimer);
|
|
98
|
+
idleTimer = null;
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
const teardown = async () => {
|
|
102
|
+
if (shuttingDown)
|
|
103
|
+
return;
|
|
104
|
+
shuttingDown = true;
|
|
105
|
+
cancelIdle();
|
|
106
|
+
try {
|
|
107
|
+
// Resolve the accessor at teardown time: a preceding `embedding.reset`
|
|
108
|
+
// may have swapped the private singleton for a fresh one.
|
|
109
|
+
await getPrivateFastembedProcess().terminate();
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
/* best-effort — the ONNX child dies with us regardless (detached:false) */
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
await handle?.close();
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
/* best-effort — the socket unlink happens inside close() */
|
|
119
|
+
}
|
|
120
|
+
process.exit(0);
|
|
121
|
+
};
|
|
122
|
+
const armIfIdle = () => {
|
|
123
|
+
if (shuttingDown || idleTimer)
|
|
124
|
+
return;
|
|
125
|
+
if (activeClients !== 0 || inFlight !== 0)
|
|
126
|
+
return;
|
|
127
|
+
// Defensive second gate: the private pool's own counter, resolved per use so
|
|
128
|
+
// a post-reset pool is never the stale terminated reference.
|
|
129
|
+
if (getPrivateFastembedProcess().pendingCount !== 0)
|
|
130
|
+
return;
|
|
131
|
+
idleTimer = setTimeout(() => {
|
|
132
|
+
idleTimer = null;
|
|
133
|
+
void teardown();
|
|
134
|
+
}, idleGraceMs);
|
|
135
|
+
// The listener keeps the loop alive; the timer itself must not.
|
|
136
|
+
idleTimer.unref?.();
|
|
137
|
+
};
|
|
138
|
+
const handler = async (req) => {
|
|
139
|
+
// Any inbound request is demand — cancel a pending reap, and count this
|
|
140
|
+
// request as in-flight BEFORE the first await (the synchronous prefix).
|
|
141
|
+
cancelIdle();
|
|
142
|
+
inFlight++;
|
|
143
|
+
const id = req.id;
|
|
144
|
+
const method = req.method;
|
|
145
|
+
try {
|
|
146
|
+
if (!HOST_METHODS.has(method)) {
|
|
147
|
+
return fail(id, -32601, `method not found: ${method}`);
|
|
148
|
+
}
|
|
149
|
+
if (method === 'embedding.health') {
|
|
150
|
+
const pc = getPrivateFastembedProcess();
|
|
151
|
+
return ok(id, {
|
|
152
|
+
started: pc.started,
|
|
153
|
+
pendingCount: pc.pendingCount,
|
|
154
|
+
inFlight,
|
|
155
|
+
activeClients,
|
|
156
|
+
idleGraceMs,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
if (method === 'embedding.reset') {
|
|
160
|
+
await resetPrivateFastembedProcess();
|
|
161
|
+
return ok(id, { reset: true });
|
|
162
|
+
}
|
|
163
|
+
// embedding.init | embedding.embed | embedding.embedBatch — forward the
|
|
164
|
+
// payload 1:1 to the PRIVATE pool (never the funnel accessor), resolving
|
|
165
|
+
// it per use so a reset mid-life never leaves us on a terminated pool.
|
|
166
|
+
const params = (req.params ?? {});
|
|
167
|
+
const result = await getPrivateFastembedProcess().request(params);
|
|
168
|
+
return ok(id, result);
|
|
169
|
+
}
|
|
170
|
+
catch (e) {
|
|
171
|
+
return fail(id, -32603, e instanceof Error ? e.message : String(e));
|
|
172
|
+
}
|
|
173
|
+
finally {
|
|
174
|
+
inFlight--;
|
|
175
|
+
// A request may have drained the last in-flight work with no clients
|
|
176
|
+
// attached (e.g. a one-shot embed) — re-arm the reap.
|
|
177
|
+
if (activeClients === 0)
|
|
178
|
+
armIfIdle();
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
handle = await serveBackend({
|
|
182
|
+
socketPath,
|
|
183
|
+
handler,
|
|
184
|
+
onDiagnostic: (line) => process.stderr.write(line + '\n'),
|
|
185
|
+
onClientCountChange: (active) => {
|
|
186
|
+
activeClients = active;
|
|
187
|
+
if (active > 0)
|
|
188
|
+
cancelIdle();
|
|
189
|
+
else
|
|
190
|
+
armIfIdle();
|
|
191
|
+
},
|
|
192
|
+
});
|
|
193
|
+
// Arm immediately: if no client ever connects (e.g. the spawner died between
|
|
194
|
+
// spawn and dial), the host must still reap rather than linger forever.
|
|
195
|
+
armIfIdle();
|
|
196
|
+
// A detached host can still be signalled directly (kill, OS teardown).
|
|
197
|
+
process.on('SIGTERM', () => void teardown());
|
|
198
|
+
process.on('SIGINT', () => void teardown());
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* True when this module is the process entrypoint (`node dist/embedHostMain.js`).
|
|
202
|
+
* `ensureBackend` spawns exactly that. A test shim that imports this module and
|
|
203
|
+
* calls `runEmbedHost()` explicitly is NOT the entrypoint, so it does not
|
|
204
|
+
* double-start.
|
|
205
|
+
*/
|
|
206
|
+
function isEntrypoint() {
|
|
207
|
+
const argv1 = process.argv[1];
|
|
208
|
+
if (!argv1)
|
|
209
|
+
return false;
|
|
210
|
+
try {
|
|
211
|
+
return resolve(fileURLToPath(import.meta.url)) === resolve(argv1);
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
return false;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (isEntrypoint()) {
|
|
218
|
+
runEmbedHost().catch((err) => {
|
|
219
|
+
process.stderr.write(`[embed-host] fatal: ${err instanceof Error ? err.stack ?? err.message : String(err)}\n`);
|
|
220
|
+
process.exit(1);
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=embedHostMain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embedHostMain.js","sourceRoot":"","sources":["../src/embedHostMain.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* errors.ts — the embedding error taxonomy, extracted so internal modules
|
|
3
|
+
* (notably `funnelClient.ts`) can throw typed errors without importing the
|
|
4
|
+
* public `index.ts` barrel and creating an import cycle.
|
|
5
|
+
*
|
|
6
|
+
* The classes are re-exported verbatim from `index.ts`, so the public surface is
|
|
7
|
+
* unchanged: `import { TransientEmbeddingError } from '@adhd/sox-embedding-provider'`
|
|
8
|
+
* keeps working, and `instanceof` identity is preserved (one class, one home).
|
|
9
|
+
*
|
|
10
|
+
* Three tiers, no silent degradation:
|
|
11
|
+
* - TransientEmbeddingError — the caller may retry (has `retryAfterMs`).
|
|
12
|
+
* - PermanentEmbeddingError — the caller must not retry.
|
|
13
|
+
* - ResolutionError — factory-time only (bad config / unknown model), never mid-call.
|
|
14
|
+
*/
|
|
15
|
+
export declare class TransientEmbeddingError extends Error {
|
|
16
|
+
readonly retryAfterMs: number | undefined;
|
|
17
|
+
constructor(message: string, retryAfterMs?: number);
|
|
18
|
+
}
|
|
19
|
+
export declare class PermanentEmbeddingError extends Error {
|
|
20
|
+
constructor(message: string);
|
|
21
|
+
}
|
|
22
|
+
export declare class ResolutionError extends Error {
|
|
23
|
+
constructor(message: string);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;gBAC9B,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;CAKnD;AAED,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* errors.ts — the embedding error taxonomy, extracted so internal modules
|
|
3
|
+
* (notably `funnelClient.ts`) can throw typed errors without importing the
|
|
4
|
+
* public `index.ts` barrel and creating an import cycle.
|
|
5
|
+
*
|
|
6
|
+
* The classes are re-exported verbatim from `index.ts`, so the public surface is
|
|
7
|
+
* unchanged: `import { TransientEmbeddingError } from '@adhd/sox-embedding-provider'`
|
|
8
|
+
* keeps working, and `instanceof` identity is preserved (one class, one home).
|
|
9
|
+
*
|
|
10
|
+
* Three tiers, no silent degradation:
|
|
11
|
+
* - TransientEmbeddingError — the caller may retry (has `retryAfterMs`).
|
|
12
|
+
* - PermanentEmbeddingError — the caller must not retry.
|
|
13
|
+
* - ResolutionError — factory-time only (bad config / unknown model), never mid-call.
|
|
14
|
+
*/
|
|
15
|
+
export class TransientEmbeddingError extends Error {
|
|
16
|
+
retryAfterMs;
|
|
17
|
+
constructor(message, retryAfterMs) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = 'TransientEmbeddingError';
|
|
20
|
+
this.retryAfterMs = retryAfterMs;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export class PermanentEmbeddingError extends Error {
|
|
24
|
+
constructor(message) {
|
|
25
|
+
super(message);
|
|
26
|
+
this.name = 'PermanentEmbeddingError';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export class ResolutionError extends Error {
|
|
30
|
+
constructor(message) {
|
|
31
|
+
super(message);
|
|
32
|
+
this.name = 'ResolutionError';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IACvC,YAAY,CAAqB;IAC1C,YAAY,OAAe,EAAE,YAAqB;QAChD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;QACtC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAChD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF"}
|
package/dist/fastembed.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fastembed.d.ts","sourceRoot":"","sources":["../src/fastembed.ts"],"names":[],"mappings":"AACA,OAAO,EAA6B,KAAK,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"fastembed.d.ts","sourceRoot":"","sources":["../src/fastembed.ts"],"names":[],"mappings":"AACA,OAAO,EAA6B,KAAK,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpG,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAO3G,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAgBrD,0DAA0D;AAC1D,QAAA,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAEtC,CAAC;AAEF,gEAAgE;AAChE,QAAA,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAE5C,CAAC;AAEF,QAAA,MAAM,aAAa,qBAAqB,CAAC;AACzC,QAAA,MAAM,kBAAkB,MAAM,CAAC;AAE/B;;;;;;;;;GASG;AACH,qBAAa,iBAAkB,YAAW,iBAAiB;IACzD,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;IAC7C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAS;IASzB,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,YAAY,CAAO;IAC3B,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,kBAAkB,CAAiB;IAE3C;;;;;OAKG;gBAED,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,YAAY,GAAE,qBAAmD;IAkBnE,MAAM,IAAI,eAAe;IAqBnB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC;IAkBlE,UAAU,CACf,KAAK,EAAE,MAAM,EAAE,EACf,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,SAAS,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAC9C,aAAa,CAAC,YAAY,CAAC;IAuBxB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAO5C;;;OAGG;IACH,OAAO,CAAC,cAAc;IAItB;;;OAGG;IACH,OAAO,CAAC,SAAS;IAmBjB;;;OAGG;IACH,OAAO,CAAC,QAAQ;IA0BhB;;;OAGG;IACH,OAAO,CAAC,WAAW;YAQL,SAAS;YA2CT,SAAS;IAKvB,OAAO,CAAC,mBAAmB;CAc5B;AAED,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,gBAAgB,EAAE,aAAa,EAAE,kBAAkB,EAAE,CAAC"}
|
package/dist/fastembed.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { warmupTimeoutMs, isModelCached, WARMUP_CACHE_HIT_ATTEMPTS } from './index.js';
|
|
2
2
|
import { getSharedFastembedProcess } from './sharedFastembedProcess.js';
|
|
3
|
+
import { resolveEmbedHostConfig } from './embedHostConfig.js';
|
|
3
4
|
// BUG-005: MODEL_CONFIGS lives in the side-effect-free `fastembedModels.js`
|
|
4
5
|
// (shared with the child-process host) — see that module's doc comment for
|
|
5
6
|
// why it cannot be imported from this file by the child. Re-exported below
|
|
@@ -82,6 +83,8 @@ export class FastembedProvider {
|
|
|
82
83
|
dimensions: this.embedDim || this.metadata.dimensions,
|
|
83
84
|
last_error: this._lastError,
|
|
84
85
|
execution_provider: this._executionProvider,
|
|
86
|
+
// ADR-0013 D2: the active host-selection posture is visible from one call.
|
|
87
|
+
host: resolveEmbedHostConfig().host,
|
|
85
88
|
};
|
|
86
89
|
}
|
|
87
90
|
async embedSingle(text, _role) {
|
package/dist/fastembed.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fastembed.js","sourceRoot":"","sources":["../src/fastembed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACvF,OAAO,EAAE,yBAAyB,EAA8B,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"fastembed.js","sourceRoot":"","sources":["../src/fastembed.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fastembedProcessHost.d.ts","sourceRoot":"","sources":["../src/fastembedProcessHost.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;
|
|
1
|
+
{"version":3,"file":"fastembedProcessHost.d.ts","sourceRoot":"","sources":["../src/fastembedProcessHost.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AA4DH,6EAA6E;AAC7E,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQ/C;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,IAAI,IAAI,CA8EjD"}
|
|
@@ -97,15 +97,16 @@ import { MODEL_MAP, resolveModelDim } from './fastembedModels.js';
|
|
|
97
97
|
//
|
|
98
98
|
// This lock remains useful regardless: nothing in this process logs the
|
|
99
99
|
// existence of sibling fastembed hosts, and that blindness cost an afternoon
|
|
100
|
-
// of `ps`/`vm_stat` archaeology.
|
|
100
|
+
// of `ps`/`vm_stat` archaeology. It is an OBSERVABILITY aid, not a claim about
|
|
101
|
+
// the cause of any slowdown — the 25-50x class it names is associated with a
|
|
102
|
+
// second host by UNPROVEN hypothesis only.
|
|
101
103
|
//
|
|
102
104
|
// This lock is advisory-only — it never blocks or refuses to load the model
|
|
103
105
|
// (a legitimate second store/project running its own memory-server on the
|
|
104
106
|
// same machine is a real, supported scenario, not a bug). It exists purely
|
|
105
|
-
// so a FUTURE occurrence of
|
|
106
|
-
//
|
|
107
|
-
//
|
|
108
|
-
// diagnose.
|
|
107
|
+
// so a FUTURE occurrence of a second host is a loud, immediately greppable
|
|
108
|
+
// stderr line at model-load time, instead of a silent slowdown that takes an
|
|
109
|
+
// agent an afternoon of `ps`/`vm_stat` archaeology to diagnose.
|
|
109
110
|
// BL-471: `resolveFastembedLockPath()` and `FastembedLockInfo` now live in
|
|
110
111
|
// `./fastembedLock.ts` — the single shared definition imported by both this
|
|
111
112
|
// writer and `sharedFastembedProcess.ts`'s reader. See that module's doc
|
|
@@ -167,11 +168,11 @@ export function checkAndClaimFastembedLock() {
|
|
|
167
168
|
const msg = `another fastembed host process (pid ${prev.pid}, ` +
|
|
168
169
|
`service ${prevService}, ` +
|
|
169
170
|
`started ${prev.startedAt ?? 'unknown'}) is ALREADY RUNNING on this machine. ` +
|
|
170
|
-
`
|
|
171
|
-
`
|
|
172
|
-
`
|
|
173
|
-
`
|
|
174
|
-
|
|
171
|
+
`A second concurrent onnxruntime-node CoreML/ANE host is the leading, UNPROVEN ` +
|
|
172
|
+
`hypothesis for the 25-50x embed-latency class this lock exists to make visible — the ` +
|
|
173
|
+
`measured cause of the live BL-331 slowdown was scheduling QoS, NOT Neural Engine ` +
|
|
174
|
+
`contention (see this file's header). If pid ${prev.pid} is a leaked/orphaned process ` +
|
|
175
|
+
`(check with \`ps -p ${prev.pid}\`), terminate it. Lock file: ${lockPath}`;
|
|
175
176
|
console.error(`[fastembed] WARNING (BL-331): ${msg}`);
|
|
176
177
|
log.warn('embedding_provider.fastembed.competing_host_detected', {
|
|
177
178
|
competing_pid: prev.pid,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fastembedProcessHost.js","sourceRoot":"","sources":["../src/fastembedProcessHost.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC3F,OAAO,EAAE,wBAAwB,EAAE,4BAA4B,EAA0B,MAAM,oBAAoB,CAAC;AACpH,oEAAoE;AACpE,kEAAkE;AAClE,uEAAuE;AACvE,uEAAuE;AACvE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAElE,8EAA8E;AAC9E,EAAE;AACF,0EAA0E;AAC1E,6EAA6E;AAC7E,gFAAgF;AAChF,4EAA4E;AAC5E,8EAA8E;AAC9E,6DAA6D;AAC7D,gCAAgC;AAChC,EAAE;AACF,8EAA8E;AAC9E,2EAA2E;AAC3E,uEAAuE;AACvE,gFAAgF;AAChF,8EAA8E;AAC9E,0EAA0E;AAC1E,gCAAgC;AAChC,EAAE;AACF,4EAA4E;AAC5E,gFAAgF;AAChF,gFAAgF;AAChF,6EAA6E;AAC7E,6EAA6E;AAC7E,oEAAoE;AACpE,EAAE;AACF,0EAA0E;AAC1E,iEAAiE;AACjE,iFAAiF;AACjF,8EAA8E;AAC9E,wDAAwD;AACxD,EAAE;AACF,wEAAwE;AACxE,6EAA6E;AAC7E,
|
|
1
|
+
{"version":3,"file":"fastembedProcessHost.js","sourceRoot":"","sources":["../src/fastembedProcessHost.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* funnelClient.ts — the host-aware `SharedFastembedClient` (SPEC-EMBEDDING-FUNNEL.md §D).
|
|
3
|
+
*
|
|
4
|
+
* A drop-in `SharedFastembedClient` that transparently dials — and, when absent,
|
|
5
|
+
* peer-spawns — the ONE machine-wide embedding host for `(model, ep, cacheDir)`.
|
|
6
|
+
* It is the consumer half of the funnel: N processes each hold a
|
|
7
|
+
* `FunneledFastembedClient`, but `ensureBackend()`'s O_EXCL spawn-lock collapses
|
|
8
|
+
* their concurrent spawn attempts to a single detached host, and the host
|
|
9
|
+
* reaps itself once the last client leaves (see `embedHostMain.ts`).
|
|
10
|
+
*
|
|
11
|
+
* ── Honest failure, never a silent private re-fork ─────────────────────────────
|
|
12
|
+
*
|
|
13
|
+
* Under the default `host: 'shared'`, a failure to bring the host up throws a
|
|
14
|
+
* typed `TransientEmbeddingError` naming the socket — it does NOT fall back to
|
|
15
|
+
* forking a private host. A silent fallback would defeat the entire funnel
|
|
16
|
+
* (each of 535 short-lived CLIs/day would quietly become its own ONNX host) and
|
|
17
|
+
* is exactly the behaviour this design removes. `host: 'private'` is the
|
|
18
|
+
* explicit, typed CI/diagnostics selection (ADR-0013 closed union).
|
|
19
|
+
*
|
|
20
|
+
* ── Circuit breaker ────────────────────────────────────────────────────────────
|
|
21
|
+
*
|
|
22
|
+
* After `ENSURE_FAILURE_THRESHOLD` consecutive failed ensures, the client fails
|
|
23
|
+
* fast with a typed error for `ENSURE_CIRCUIT_COOLDOWN_MS` rather than paying
|
|
24
|
+
* the full `ensureBackend` ready-timeout on every call. The breaker is
|
|
25
|
+
* per-process (a short-lived CLI cannot share it) — it bounds a retrying
|
|
26
|
+
* consumer, not the fleet; that is stated here rather than implied.
|
|
27
|
+
*
|
|
28
|
+
* Leaf module — `@adhd/sox-service-proxy` + node builtins.
|
|
29
|
+
*/
|
|
30
|
+
import type { SharedFastembedClient } from './sharedFastembedProcess.js';
|
|
31
|
+
/** Consecutive failed ensures before the breaker opens. */
|
|
32
|
+
export declare const ENSURE_FAILURE_THRESHOLD = 3;
|
|
33
|
+
/** How long the breaker stays open (fail-fast window) once tripped. */
|
|
34
|
+
export declare const ENSURE_CIRCUIT_COOLDOWN_MS = 10000;
|
|
35
|
+
/** Bound on bringing the host up (`ensureBackend`'s readyTimeoutMs). */
|
|
36
|
+
export declare const HOST_READY_TIMEOUT_MS = 10000;
|
|
37
|
+
/** TEST-ONLY: clear the active-client reference. */
|
|
38
|
+
export declare function __resetActiveFunnelClientForTests(): void;
|
|
39
|
+
export declare class FunneledFastembedClient implements SharedFastembedClient {
|
|
40
|
+
private conn;
|
|
41
|
+
private socketPath;
|
|
42
|
+
private initContext;
|
|
43
|
+
private ensurePromise;
|
|
44
|
+
private _started;
|
|
45
|
+
private _pending;
|
|
46
|
+
private nextId;
|
|
47
|
+
private consecutiveEnsureFailures;
|
|
48
|
+
private circuitOpenUntil;
|
|
49
|
+
constructor();
|
|
50
|
+
/** True once the host has been resolved and the dial connection established. */
|
|
51
|
+
get started(): boolean;
|
|
52
|
+
/** In-flight request count on THIS consumer (not the host's). */
|
|
53
|
+
get pendingCount(): number;
|
|
54
|
+
/** The resolved host socket path, or `null` before the first successful ensure. */
|
|
55
|
+
get hostSocketPath(): string | null;
|
|
56
|
+
request<T = Record<string, unknown>>(payload: Record<string, unknown>, timeoutMs?: number, signal?: AbortSignal): Promise<T>;
|
|
57
|
+
/**
|
|
58
|
+
* NO-OP by design: under `host: 'shared'` the host is shared with every other
|
|
59
|
+
* consumer on the machine — a consumer must never kill it. Its lifetime is
|
|
60
|
+
* governed solely by its own debounced, ref-counted teardown
|
|
61
|
+
* (`embedHostMain.ts`). Kept to satisfy `SharedFastembedClient`.
|
|
62
|
+
*/
|
|
63
|
+
terminate(): Promise<void>;
|
|
64
|
+
private mapError;
|
|
65
|
+
private awaitResponse;
|
|
66
|
+
/** Idempotent: resolves once a host is live and dialed, or throws typed. */
|
|
67
|
+
private ensureHost;
|
|
68
|
+
private doEnsure;
|
|
69
|
+
private noteEnsureFailure;
|
|
70
|
+
/**
|
|
71
|
+
* Ask the live host to tear down and re-fork its PRIVATE pool, then drop this
|
|
72
|
+
* consumer's connection so the next request re-dials the (still-live) host.
|
|
73
|
+
* No-op when no host has been resolved. Public so the module-level
|
|
74
|
+
* `resetSharedFastembedHost()` can target the accessor client.
|
|
75
|
+
*/
|
|
76
|
+
resetHost(): Promise<void>;
|
|
77
|
+
/**
|
|
78
|
+
* Send a control method (`embedding.reset` / `embedding.health`) to the live
|
|
79
|
+
* host, bounded. Returns the result, or `null` when no host is resolved.
|
|
80
|
+
*/
|
|
81
|
+
private control;
|
|
82
|
+
/**
|
|
83
|
+
* Drop this consumer's dial connection. The host stays alive.
|
|
84
|
+
*/
|
|
85
|
+
private dropConnection;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Ask the peer-shared host to tear down and re-fork its PRIVATE pool, then drop
|
|
89
|
+
* this consumer's connection so the next request re-dials the (still-live) host.
|
|
90
|
+
*
|
|
91
|
+
* This is memory-core's heal entry point: under `host: 'shared'`,
|
|
92
|
+
* `terminate()` is a no-op (a consumer must never kill a shared host), so a
|
|
93
|
+
* wedged private child is recovered by asking the host to reset its own pool.
|
|
94
|
+
* A no-op when no host has been resolved yet — nothing to reset.
|
|
95
|
+
*/
|
|
96
|
+
export declare function resetSharedFastembedHost(): Promise<void>;
|
|
97
|
+
//# sourceMappingURL=funnelClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"funnelClient.d.ts","sourceRoot":"","sources":["../src/funnelClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAYH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEzE,2DAA2D;AAC3D,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAC1C,uEAAuE;AACvE,eAAO,MAAM,0BAA0B,QAAS,CAAC;AACjD,wEAAwE;AACxE,eAAO,MAAM,qBAAqB,QAAS,CAAC;AAoB5C,oDAAoD;AACpD,wBAAgB,iCAAiC,IAAI,IAAI,CAExD;AAOD,qBAAa,uBAAwB,YAAW,qBAAqB;IACnE,OAAO,CAAC,IAAI,CAAkC;IAC9C,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,WAAW,CAAoD;IACvE,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,yBAAyB,CAAK;IACtC,OAAO,CAAC,gBAAgB,CAAK;;IAM7B,gFAAgF;IAChF,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,iEAAiE;IACjE,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,mFAAmF;IACnF,IAAI,cAAc,IAAI,MAAM,GAAG,IAAI,CAElC;IAEK,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,CAAC,CAAC;IAqCb;;;;;OAKG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAMhC,OAAO,CAAC,QAAQ;IAchB,OAAO,CAAC,aAAa;IA8DrB,4EAA4E;IAC5E,OAAO,CAAC,UAAU;YASJ,QAAQ;IA0EtB,OAAO,CAAC,iBAAiB;IAOzB;;;;;OAKG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAYhC;;;OAGG;YACW,OAAO;IAcrB;;OAEG;IACH,OAAO,CAAC,cAAc;CAKvB;AAED;;;;;;;;GAQG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,IAAI,CAAC,CAE9D"}
|