@inbrowser/model 0.1.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.
package/dist/worker.js ADDED
@@ -0,0 +1,493 @@
1
+ /**
2
+ * Worker transport — host an `Engine` inside a Web Worker; expose
3
+ * the same `Engine` shape on the main thread via a postMessage RPC.
4
+ *
5
+ * The key invariant: `connectWorkerEngine` returns a value that
6
+ * satisfies the same `Engine` interface as `createEngine`. Anything
7
+ * downstream — adapters, agent runtime, UI — cannot tell whether it
8
+ * holds a direct engine or a remote stub.
9
+ *
10
+ * RPC framing is sequence-numbered; `generate` opens a per-call
11
+ * stream id and the worker side fans `EngineEvent`s back tagged
12
+ * with that id. Backpressure today is implicit (postMessage queue);
13
+ * a future revision may add explicit acks.
14
+ *
15
+ * Wire shape:
16
+ *
17
+ * main → worker (ClientFrame)
18
+ * init — once, on connect; carries CreateEngineOpts
19
+ * ensure-ready — request the engine to load (seq-tracked ack/reject)
20
+ * generate-start — open a stream; events flow back tagged with seq
21
+ * generate-abort — request a stream to terminate (best effort)
22
+ * dispose — tear down engine + transport
23
+ *
24
+ * worker → main (HostFrame)
25
+ * init-ack — handshake reply (model + capabilities echoed)
26
+ * state — engine state transitions
27
+ * load — LoadProgress events
28
+ * ack | reject — per-seq reply for ensure-ready / dispose
29
+ * event — a single EngineEvent for a generate stream
30
+ * event-end — terminal marker for a generate stream
31
+ */
32
+ import { createEngine as defaultCreateEngine } from './engine.js';
33
+ /**
34
+ * Install the worker-side RPC. Call from inside your worker entry:
35
+ *
36
+ * import { hostEngineInWorker } from '@inbrowser/model/worker';
37
+ * hostEngineInWorker(self);
38
+ */
39
+ export function hostEngineInWorker(workerScope, opts) {
40
+ const factory = opts?.factory ?? defaultCreateEngine;
41
+ const port = workerScope;
42
+ let engine = null;
43
+ let stateOff = null;
44
+ let loadOff = null;
45
+ const abortControllers = new Map();
46
+ let disposed = false;
47
+ function post(frame) {
48
+ if (disposed)
49
+ return;
50
+ port.postMessage(frame);
51
+ }
52
+ function attachSubscribers(eng) {
53
+ stateOff = eng.on('state', (value) => post({ kind: 'state', value }));
54
+ loadOff = eng.on('load', (value) => post({ kind: 'load', value }));
55
+ }
56
+ function onInit(frame) {
57
+ if (engine) {
58
+ // Double-init: just re-ack with current model. The client likely
59
+ // crossed wires; never destroy a live engine on a duplicate init.
60
+ post({ kind: 'init-ack', model: engine.model, capabilities: engine.capabilities });
61
+ return;
62
+ }
63
+ try {
64
+ engine = factory(frame.opts);
65
+ attachSubscribers(engine);
66
+ post({ kind: 'init-ack', model: engine.model, capabilities: engine.capabilities });
67
+ }
68
+ catch (e) {
69
+ // Surface as a state=error so the client side learns the engine
70
+ // is unusable. Subsequent ensure-ready calls will reject too.
71
+ post({ kind: 'state', value: 'error' });
72
+ // No seq to reject against; the client's ensure-ready will fail
73
+ // when it runs because engine is null.
74
+ post({
75
+ kind: 'load',
76
+ value: { phase: 'ready' }, // best-effort terminal; not load-bearing
77
+ });
78
+ const msg = e instanceof Error ? e.message : String(e);
79
+ post({ kind: 'reject', seq: -1, message: msg });
80
+ }
81
+ }
82
+ async function onEnsureReady(seq) {
83
+ if (!engine) {
84
+ post({ kind: 'reject', seq, message: 'engine not initialized' });
85
+ return;
86
+ }
87
+ try {
88
+ await engine.ensureReady();
89
+ post({ kind: 'ack', seq });
90
+ }
91
+ catch (e) {
92
+ post({ kind: 'reject', seq, message: e instanceof Error ? e.message : String(e) });
93
+ }
94
+ }
95
+ async function onGenerateStart(frame) {
96
+ const { seq, messages, opts: genOpts } = frame;
97
+ if (!engine) {
98
+ post({
99
+ kind: 'event',
100
+ seq,
101
+ event: { kind: 'error', message: 'engine not initialized', recoverable: false },
102
+ });
103
+ post({ kind: 'event-end', seq });
104
+ return;
105
+ }
106
+ const controller = new AbortController();
107
+ abortControllers.set(seq, controller);
108
+ // GenerateOpts may contain a caller-side AbortSignal, but signals
109
+ // don't cross postMessage boundaries. We synthesize one on the
110
+ // host from generate-abort frames.
111
+ const forwardedOpts = { ...(genOpts ?? {}), signal: controller.signal };
112
+ try {
113
+ for await (const event of engine.generate(messages, forwardedOpts)) {
114
+ if (disposed)
115
+ break;
116
+ post({ kind: 'event', seq, event });
117
+ if (controller.signal.aborted)
118
+ break;
119
+ }
120
+ }
121
+ catch (e) {
122
+ post({
123
+ kind: 'event',
124
+ seq,
125
+ event: {
126
+ kind: 'error',
127
+ message: e instanceof Error ? e.message : String(e),
128
+ recoverable: false,
129
+ },
130
+ });
131
+ }
132
+ finally {
133
+ abortControllers.delete(seq);
134
+ post({ kind: 'event-end', seq });
135
+ }
136
+ }
137
+ function onGenerateAbort(seq) {
138
+ const ctrl = abortControllers.get(seq);
139
+ if (ctrl)
140
+ ctrl.abort();
141
+ }
142
+ async function onDispose(seq) {
143
+ try {
144
+ // Abort every in-flight generate before tearing down the engine.
145
+ for (const ctrl of abortControllers.values())
146
+ ctrl.abort();
147
+ abortControllers.clear();
148
+ if (engine)
149
+ await engine.dispose();
150
+ post({ kind: 'ack', seq });
151
+ }
152
+ catch (e) {
153
+ post({ kind: 'reject', seq, message: e instanceof Error ? e.message : String(e) });
154
+ }
155
+ finally {
156
+ stateOff?.();
157
+ loadOff?.();
158
+ stateOff = null;
159
+ loadOff = null;
160
+ engine = null;
161
+ disposed = true;
162
+ port.removeEventListener('message', onMessage);
163
+ }
164
+ }
165
+ function onMessage(ev) {
166
+ const frame = ev.data;
167
+ if (!frame || typeof frame !== 'object')
168
+ return;
169
+ switch (frame.kind) {
170
+ case 'init':
171
+ onInit(frame);
172
+ return;
173
+ case 'ensure-ready':
174
+ void onEnsureReady(frame.seq);
175
+ return;
176
+ case 'generate-start':
177
+ void onGenerateStart(frame);
178
+ return;
179
+ case 'generate-abort':
180
+ onGenerateAbort(frame.seq);
181
+ return;
182
+ case 'dispose':
183
+ void onDispose(frame.seq);
184
+ return;
185
+ }
186
+ }
187
+ port.addEventListener('message', onMessage);
188
+ return {
189
+ async dispose() {
190
+ if (disposed)
191
+ return;
192
+ for (const ctrl of abortControllers.values())
193
+ ctrl.abort();
194
+ abortControllers.clear();
195
+ if (engine) {
196
+ try {
197
+ await engine.dispose();
198
+ }
199
+ catch {
200
+ // best effort during teardown
201
+ }
202
+ }
203
+ stateOff?.();
204
+ loadOff?.();
205
+ stateOff = null;
206
+ loadOff = null;
207
+ engine = null;
208
+ disposed = true;
209
+ port.removeEventListener('message', onMessage);
210
+ },
211
+ };
212
+ }
213
+ /**
214
+ * Connect to a worker that has called `hostEngineInWorker(self)`.
215
+ * Returns an `Engine` whose calls are RPC'd over postMessage.
216
+ */
217
+ export function connectWorkerEngine(opts) {
218
+ const model = opts.engine.model;
219
+ const capabilities = opts.engine.capabilities;
220
+ const handshakeTimeoutMs = opts.handshakeTimeoutMs ?? 10_000;
221
+ const port = opts.worker;
222
+ let state = 'idle';
223
+ const stateSubs = new Set();
224
+ const loadSubs = new Set();
225
+ // Caller-supplied onLoadProgress mirrors what createEngine does: keep
226
+ // the worker transport feature-compatible with the in-thread engine.
227
+ if (opts.engine.onLoadProgress)
228
+ loadSubs.add(opts.engine.onLoadProgress);
229
+ const pending = new Map();
230
+ const streams = new Map();
231
+ // Handshake state. The init frame is sent eagerly so the worker can
232
+ // start fetching weights as soon as ensureReady fires.
233
+ let handshakeResolve = null;
234
+ let handshakeReject = null;
235
+ const handshake = new Promise((resolve, reject) => {
236
+ handshakeResolve = resolve;
237
+ handshakeReject = reject;
238
+ });
239
+ // Avoid an unhandled-rejection warning if the consumer disposes
240
+ // before ever calling ensureReady/generate.
241
+ handshake.catch(() => { });
242
+ const handshakeTimer = setTimeout(() => {
243
+ handshakeReject?.(new Error('connectWorkerEngine: handshake timeout'));
244
+ }, handshakeTimeoutMs);
245
+ let seqCounter = 0;
246
+ function nextSeq() {
247
+ seqCounter = (seqCounter + 1) | 0;
248
+ if (seqCounter <= 0)
249
+ seqCounter = 1;
250
+ return seqCounter;
251
+ }
252
+ let disposed = false;
253
+ function send(frame) {
254
+ if (disposed)
255
+ return;
256
+ port.postMessage(frame);
257
+ }
258
+ function setState(next) {
259
+ if (state === next)
260
+ return;
261
+ state = next;
262
+ for (const sub of stateSubs)
263
+ sub(next);
264
+ }
265
+ function emitLoad(p) {
266
+ for (const sub of loadSubs)
267
+ sub(p);
268
+ }
269
+ function onMessage(ev) {
270
+ const frame = ev.data;
271
+ if (!frame || typeof frame !== 'object')
272
+ return;
273
+ switch (frame.kind) {
274
+ case 'init-ack': {
275
+ clearTimeout(handshakeTimer);
276
+ handshakeResolve?.();
277
+ handshakeResolve = null;
278
+ handshakeReject = null;
279
+ return;
280
+ }
281
+ case 'state': {
282
+ setState(frame.value);
283
+ return;
284
+ }
285
+ case 'load': {
286
+ emitLoad(frame.value);
287
+ return;
288
+ }
289
+ case 'ack': {
290
+ const p = pending.get(frame.seq);
291
+ if (p) {
292
+ pending.delete(frame.seq);
293
+ p.resolve();
294
+ }
295
+ return;
296
+ }
297
+ case 'reject': {
298
+ const p = pending.get(frame.seq);
299
+ if (p) {
300
+ pending.delete(frame.seq);
301
+ p.reject(new Error(frame.message));
302
+ }
303
+ // If the host emits an unsolicited reject (seq=-1 on init
304
+ // failure), fail the handshake so consumers find out.
305
+ if (frame.seq === -1 && handshakeReject) {
306
+ clearTimeout(handshakeTimer);
307
+ handshakeReject(new Error(frame.message));
308
+ handshakeResolve = null;
309
+ handshakeReject = null;
310
+ }
311
+ return;
312
+ }
313
+ case 'event': {
314
+ const slot = streams.get(frame.seq);
315
+ if (!slot || slot.done)
316
+ return;
317
+ slot.queue.push(frame.event);
318
+ const r = slot.resolver;
319
+ slot.resolver = null;
320
+ if (r)
321
+ r();
322
+ return;
323
+ }
324
+ case 'event-end': {
325
+ const slot = streams.get(frame.seq);
326
+ if (!slot)
327
+ return;
328
+ slot.done = true;
329
+ const r = slot.resolver;
330
+ slot.resolver = null;
331
+ if (r)
332
+ r();
333
+ return;
334
+ }
335
+ }
336
+ }
337
+ port.addEventListener('message', onMessage);
338
+ // Kick the handshake.
339
+ send({ kind: 'init', opts: opts.engine });
340
+ function on(event, handler) {
341
+ if (event === 'state') {
342
+ const h = handler;
343
+ stateSubs.add(h);
344
+ return () => stateSubs.delete(h);
345
+ }
346
+ const h = handler;
347
+ loadSubs.add(h);
348
+ return () => loadSubs.delete(h);
349
+ }
350
+ async function ensureReady() {
351
+ if (state === 'disposed')
352
+ throw new Error('engine disposed');
353
+ await handshake;
354
+ if (state === 'ready')
355
+ return;
356
+ const seq = nextSeq();
357
+ const p = new Promise((resolve, reject) => {
358
+ pending.set(seq, { resolve, reject });
359
+ });
360
+ send({ kind: 'ensure-ready', seq });
361
+ await p;
362
+ }
363
+ async function* generate(messages, genOpts) {
364
+ if (disposed || state === 'disposed') {
365
+ yield { kind: 'error', message: 'engine disposed', recoverable: false };
366
+ return;
367
+ }
368
+ try {
369
+ await handshake;
370
+ }
371
+ catch (e) {
372
+ yield {
373
+ kind: 'error',
374
+ message: e instanceof Error ? e.message : String(e),
375
+ recoverable: false,
376
+ };
377
+ return;
378
+ }
379
+ const seq = nextSeq();
380
+ const slot = { queue: [], done: false, resolver: null };
381
+ streams.set(seq, slot);
382
+ // GenerateOpts.signal can't cross the wire; observe locally and
383
+ // forward as a generate-abort frame.
384
+ const localSignal = genOpts?.signal;
385
+ const abortHandler = () => send({ kind: 'generate-abort', seq });
386
+ if (localSignal) {
387
+ if (localSignal.aborted) {
388
+ send({ kind: 'generate-abort', seq });
389
+ }
390
+ else {
391
+ localSignal.addEventListener('abort', abortHandler, { once: true });
392
+ }
393
+ }
394
+ // Strip non-serializable fields from the wire payload. AbortSignal
395
+ // (and any future host-only fields) shouldn't be cloned.
396
+ const wireOpts = genOpts ? stripNonSerializable(genOpts) : undefined;
397
+ send({
398
+ kind: 'generate-start',
399
+ seq,
400
+ messages: messages,
401
+ ...(wireOpts ? { opts: wireOpts } : {}),
402
+ });
403
+ try {
404
+ while (true) {
405
+ if (slot.queue.length === 0) {
406
+ if (slot.done)
407
+ break;
408
+ await new Promise((r) => {
409
+ slot.resolver = r;
410
+ });
411
+ continue;
412
+ }
413
+ const next = slot.queue.shift();
414
+ if (next)
415
+ yield next;
416
+ }
417
+ }
418
+ finally {
419
+ streams.delete(seq);
420
+ if (localSignal)
421
+ localSignal.removeEventListener('abort', abortHandler);
422
+ }
423
+ }
424
+ async function dispose() {
425
+ if (disposed) {
426
+ state = 'disposed';
427
+ return;
428
+ }
429
+ disposed = true;
430
+ // Fail any in-flight handshake so callers awaiting ensureReady
431
+ // through it unblock immediately.
432
+ clearTimeout(handshakeTimer);
433
+ handshakeReject?.(new Error('engine disposed'));
434
+ handshakeResolve = null;
435
+ handshakeReject = null;
436
+ const seq = nextSeq();
437
+ const p = new Promise((resolve, reject) => {
438
+ pending.set(seq, { resolve, reject });
439
+ });
440
+ port.postMessage({ kind: 'dispose', seq });
441
+ // Race the ack against a short grace period — a dead host (worker
442
+ // already terminated, channel closed) must not hang dispose forever.
443
+ const grace = new Promise((resolve) => setTimeout(resolve, 250));
444
+ try {
445
+ await Promise.race([p, grace]);
446
+ }
447
+ catch {
448
+ // Best-effort: even if the host rejects, the client is gone.
449
+ }
450
+ // Drain pending RPCs and streams so awaiters don't hang forever.
451
+ for (const [, pend] of pending)
452
+ pend.reject(new Error('engine disposed'));
453
+ pending.clear();
454
+ for (const [, slot] of streams) {
455
+ slot.done = true;
456
+ slot.queue.push({ kind: 'error', message: 'engine disposed', recoverable: false });
457
+ const r = slot.resolver;
458
+ slot.resolver = null;
459
+ if (r)
460
+ r();
461
+ }
462
+ setState('disposed');
463
+ stateSubs.clear();
464
+ loadSubs.clear();
465
+ port.removeEventListener('message', onMessage);
466
+ }
467
+ return {
468
+ get model() {
469
+ return model;
470
+ },
471
+ get state() {
472
+ return state;
473
+ },
474
+ get capabilities() {
475
+ return capabilities;
476
+ },
477
+ ensureReady,
478
+ on,
479
+ generate,
480
+ dispose,
481
+ };
482
+ }
483
+ // ── Helpers ──────────────────────────────────────────────────────────────────
484
+ /**
485
+ * Drop fields that can't survive structured clone (AbortSignal,
486
+ * functions). Today only `signal` qualifies; we forward everything
487
+ * else verbatim so future options pass through automatically.
488
+ */
489
+ function stripNonSerializable(o) {
490
+ const { signal: _signal, ...rest } = o;
491
+ return rest;
492
+ }
493
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "@inbrowser/model",
3
+ "version": "0.1.0",
4
+ "description": "On-device LLM engine. Wraps @huggingface/transformers + ONNX Runtime Web behind a narrow Engine surface. Presets ship Gemma 4 (E2B/E4B) configurations. Adapters in subpaths satisfy @inbrowser/relay's InferenceProvider and @inbrowser/agent's LlmClient so a local model is a drop-in replacement for a cloud provider. Worker subpath hosts the engine in a Worker with an identical interface on the main thread.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ },
13
+ "./presets": {
14
+ "types": "./dist/presets.d.ts",
15
+ "import": "./dist/presets.js"
16
+ },
17
+ "./relay": {
18
+ "types": "./dist/adapters/relay.d.ts",
19
+ "import": "./dist/adapters/relay.js"
20
+ },
21
+ "./agent": {
22
+ "types": "./dist/adapters/agent.d.ts",
23
+ "import": "./dist/adapters/agent.js"
24
+ },
25
+ "./worker": {
26
+ "types": "./dist/worker.d.ts",
27
+ "import": "./dist/worker.js"
28
+ }
29
+ },
30
+ "files": ["dist", "README.md", "AGENTS.md"],
31
+ "scripts": {
32
+ "build": "tsc",
33
+ "test": "bun test",
34
+ "typecheck": "tsc -p tsconfig.json --noEmit"
35
+ },
36
+ "peerDependencies": {
37
+ "@huggingface/transformers": "^3.0.0 || ^4.0.0",
38
+ "@inbrowser/agent": "workspace:*",
39
+ "@inbrowser/relay": "workspace:*"
40
+ },
41
+ "peerDependenciesMeta": {
42
+ "@huggingface/transformers": {
43
+ "optional": false
44
+ },
45
+ "@inbrowser/agent": {
46
+ "optional": true
47
+ },
48
+ "@inbrowser/relay": {
49
+ "optional": true
50
+ }
51
+ },
52
+ "devDependencies": {
53
+ "@huggingface/transformers": "^4.2.0",
54
+ "@inbrowser/agent": "workspace:*",
55
+ "@inbrowser/relay": "workspace:*",
56
+ "@types/bun": "latest",
57
+ "typescript": "^5.7.0"
58
+ },
59
+ "repository": {
60
+ "type": "git",
61
+ "url": "git+https://github.com/davideast/inbrowser-agent.git",
62
+ "directory": "packages/model"
63
+ },
64
+ "license": "MIT"
65
+ }