@atomic-chat/core 0.18.5 → 0.19.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.
Files changed (172) hide show
  1. package/dist/app-daemon.js +5 -0
  2. package/dist/app-daemon.js.map +1 -1
  3. package/dist/cli/main.d.ts +1 -1
  4. package/dist/cli/main.js +5 -0
  5. package/dist/cli/main.js.map +1 -1
  6. package/dist/client/control-client.d.ts +18 -1
  7. package/dist/client/control-client.js +27 -0
  8. package/dist/client/control-client.js.map +1 -1
  9. package/dist/cloud/registry.js +1 -0
  10. package/dist/cloud/registry.js.map +1 -1
  11. package/dist/config/paths.d.ts +4 -0
  12. package/dist/config/paths.js +13 -0
  13. package/dist/config/paths.js.map +1 -1
  14. package/dist/contracts/control-api.d.ts +9 -0
  15. package/dist/contracts/diffusion.d.ts +17 -7
  16. package/dist/contracts/diffusion.js.map +1 -1
  17. package/dist/contracts/engine-builds.d.ts +1 -1
  18. package/dist/contracts/engine-builds.js +1 -1
  19. package/dist/contracts/engine-builds.js.map +1 -1
  20. package/dist/contracts/engines.d.ts +1 -1
  21. package/dist/contracts/engines.js +2 -0
  22. package/dist/contracts/engines.js.map +1 -1
  23. package/dist/contracts/errors.d.ts +9 -1
  24. package/dist/contracts/errors.js.map +1 -1
  25. package/dist/contracts/events.d.ts +3 -0
  26. package/dist/contracts/index.d.ts +1 -0
  27. package/dist/contracts/index.js +1 -0
  28. package/dist/contracts/index.js.map +1 -1
  29. package/dist/contracts/litert-lm.d.ts +97 -0
  30. package/dist/contracts/litert-lm.js +17 -0
  31. package/dist/contracts/litert-lm.js.map +1 -0
  32. package/dist/contracts/model-yml.d.ts +31 -0
  33. package/dist/contracts/model-yml.js +5 -0
  34. package/dist/contracts/model-yml.js.map +1 -1
  35. package/dist/contracts/session.d.ts +5 -1
  36. package/dist/contracts/session.js.map +1 -1
  37. package/dist/contracts/settings.d.ts +10 -1
  38. package/dist/contracts/settings.js.map +1 -1
  39. package/dist/core/atomic-core.d.ts +6 -1
  40. package/dist/core/atomic-core.js +6 -0
  41. package/dist/core/atomic-core.js.map +1 -1
  42. package/dist/core/create.js +141 -20
  43. package/dist/core/create.js.map +1 -1
  44. package/dist/diffusion/args.d.ts +8 -0
  45. package/dist/diffusion/args.js +10 -0
  46. package/dist/diffusion/args.js.map +1 -1
  47. package/dist/diffusion/compat.d.ts +3 -3
  48. package/dist/diffusion/compat.js +15 -10
  49. package/dist/diffusion/compat.js.map +1 -1
  50. package/dist/diffusion/recipe.d.ts +19 -2
  51. package/dist/diffusion/recipe.js +43 -20
  52. package/dist/diffusion/recipe.js.map +1 -1
  53. package/dist/diffusion/remote-job.js +6 -7
  54. package/dist/diffusion/remote-job.js.map +1 -1
  55. package/dist/diffusion/service.d.ts +1 -0
  56. package/dist/diffusion/service.js +4 -2
  57. package/dist/diffusion/service.js.map +1 -1
  58. package/dist/diffusion/video-history.js +3 -2
  59. package/dist/diffusion/video-history.js.map +1 -1
  60. package/dist/diffusion/video-recipe.d.ts +4 -1
  61. package/dist/diffusion/video-recipe.js +15 -11
  62. package/dist/diffusion/video-recipe.js.map +1 -1
  63. package/dist/diffusion/workflow.d.ts +2 -1
  64. package/dist/diffusion/workflow.js +3 -1
  65. package/dist/diffusion/workflow.js.map +1 -1
  66. package/dist/downloads/archive.d.ts +2 -1
  67. package/dist/downloads/archive.js +3 -2
  68. package/dist/downloads/archive.js.map +1 -1
  69. package/dist/engine-builds/engines.d.ts +22 -5
  70. package/dist/engine-builds/engines.js +44 -7
  71. package/dist/engine-builds/engines.js.map +1 -1
  72. package/dist/engine-builds/litert-lm.d.ts +29 -0
  73. package/dist/engine-builds/litert-lm.js +119 -0
  74. package/dist/engine-builds/litert-lm.js.map +1 -0
  75. package/dist/engine-builds/manifest.d.ts +55 -1
  76. package/dist/engine-builds/manifest.js +114 -1
  77. package/dist/engine-builds/manifest.js.map +1 -1
  78. package/dist/engine-builds/order.d.ts +2 -1
  79. package/dist/engine-builds/order.js +3 -1
  80. package/dist/engine-builds/order.js.map +1 -1
  81. package/dist/engine-builds/select.d.ts +19 -1
  82. package/dist/engine-builds/select.js +45 -0
  83. package/dist/engine-builds/select.js.map +1 -1
  84. package/dist/engine-builds/service.d.ts +8 -5
  85. package/dist/engine-builds/service.js +11 -4
  86. package/dist/engine-builds/service.js.map +1 -1
  87. package/dist/engines/service.d.ts +3 -1
  88. package/dist/engines/service.js +4 -1
  89. package/dist/engines/service.js.map +1 -1
  90. package/dist/router/resolve.d.ts +25 -4
  91. package/dist/router/resolve.js +34 -3
  92. package/dist/router/resolve.js.map +1 -1
  93. package/dist/runtime/litert-lm/accelerators.d.ts +54 -0
  94. package/dist/runtime/litert-lm/accelerators.js +176 -0
  95. package/dist/runtime/litert-lm/accelerators.js.map +1 -0
  96. package/dist/runtime/litert-lm/check.d.ts +44 -0
  97. package/dist/runtime/litert-lm/check.js +113 -0
  98. package/dist/runtime/litert-lm/check.js.map +1 -0
  99. package/dist/runtime/litert-lm/host/args.d.ts +47 -0
  100. package/dist/runtime/litert-lm/host/args.js +108 -0
  101. package/dist/runtime/litert-lm/host/args.js.map +1 -0
  102. package/dist/runtime/litert-lm/host/ffi-bun.d.ts +16 -0
  103. package/dist/runtime/litert-lm/host/ffi-bun.js +535 -0
  104. package/dist/runtime/litert-lm/host/ffi-bun.js.map +1 -0
  105. package/dist/runtime/litert-lm/host/library.d.ts +113 -0
  106. package/dist/runtime/litert-lm/host/library.js +38 -0
  107. package/dist/runtime/litert-lm/host/library.js.map +1 -0
  108. package/dist/runtime/litert-lm/host/openai.d.ts +97 -0
  109. package/dist/runtime/litert-lm/host/openai.js +355 -0
  110. package/dist/runtime/litert-lm/host/openai.js.map +1 -0
  111. package/dist/runtime/litert-lm/host/pool.d.ts +51 -0
  112. package/dist/runtime/litert-lm/host/pool.js +114 -0
  113. package/dist/runtime/litert-lm/host/pool.js.map +1 -0
  114. package/dist/runtime/litert-lm/host/run.d.ts +48 -0
  115. package/dist/runtime/litert-lm/host/run.js +169 -0
  116. package/dist/runtime/litert-lm/host/run.js.map +1 -0
  117. package/dist/runtime/litert-lm/host/server.d.ts +28 -0
  118. package/dist/runtime/litert-lm/host/server.js +242 -0
  119. package/dist/runtime/litert-lm/host/server.js.map +1 -0
  120. package/dist/runtime/litert-lm/host-process.d.ts +44 -0
  121. package/dist/runtime/litert-lm/host-process.js +99 -0
  122. package/dist/runtime/litert-lm/host-process.js.map +1 -0
  123. package/dist/runtime/litert-lm/index.d.ts +10 -0
  124. package/dist/runtime/litert-lm/index.js +11 -0
  125. package/dist/runtime/litert-lm/index.js.map +1 -0
  126. package/dist/runtime/litert-lm/litert-host.d.ts +17 -0
  127. package/dist/runtime/litert-lm/litert-host.js +22 -0
  128. package/dist/runtime/litert-lm/litert-host.js.map +1 -0
  129. package/dist/runtime/litert-lm/model-yml.d.ts +8 -0
  130. package/dist/runtime/litert-lm/model-yml.js +67 -0
  131. package/dist/runtime/litert-lm/model-yml.js.map +1 -0
  132. package/dist/runtime/litert-lm/npu.d.ts +11 -0
  133. package/dist/runtime/litert-lm/npu.js +24 -0
  134. package/dist/runtime/litert-lm/npu.js.map +1 -0
  135. package/dist/runtime/litert-lm/runtime.d.ts +99 -0
  136. package/dist/runtime/litert-lm/runtime.js +354 -0
  137. package/dist/runtime/litert-lm/runtime.js.map +1 -0
  138. package/dist/runtime/shared/external-sessions.js +1 -0
  139. package/dist/runtime/shared/external-sessions.js.map +1 -1
  140. package/dist/server/control/router.js +2 -0
  141. package/dist/server/control/router.js.map +1 -1
  142. package/dist/server/control/routes/litert-lm.d.ts +11 -0
  143. package/dist/server/control/routes/litert-lm.js +33 -0
  144. package/dist/server/control/routes/litert-lm.js.map +1 -0
  145. package/dist/server/control/routes/public-server.js +22 -0
  146. package/dist/server/control/routes/public-server.js.map +1 -1
  147. package/dist/server/control/types.d.ts +16 -1
  148. package/dist/server/control/types.js.map +1 -1
  149. package/dist/server/http.js +3 -0
  150. package/dist/server/http.js.map +1 -1
  151. package/dist/server/public/errors.d.ts +17 -0
  152. package/dist/server/public/errors.js +28 -0
  153. package/dist/server/public/errors.js.map +1 -1
  154. package/dist/server/public/forward.d.ts +20 -1
  155. package/dist/server/public/forward.js +64 -14
  156. package/dist/server/public/forward.js.map +1 -1
  157. package/dist/server/public/listing.d.ts +6 -0
  158. package/dist/server/public/listing.js +25 -3
  159. package/dist/server/public/listing.js.map +1 -1
  160. package/dist/server/public/responses.js +21 -10
  161. package/dist/server/public/responses.js.map +1 -1
  162. package/dist/server/public/subscription.js +2 -2
  163. package/dist/server/public/subscription.js.map +1 -1
  164. package/dist/server/public/types.d.ts +5 -0
  165. package/dist/server/public/videos-params.js +6 -1
  166. package/dist/server/public/videos-params.js.map +1 -1
  167. package/dist/settings/schema/litert-lm.json +37 -0
  168. package/dist/settings/schema.js +9 -0
  169. package/dist/settings/schema.js.map +1 -1
  170. package/dist/version.d.ts +1 -1
  171. package/dist/version.js +1 -1
  172. package/package.json +6 -1
@@ -0,0 +1,242 @@
1
+ /**
2
+ * The host's own OpenAI server (design D5, tasks 5.4–5.5): `GET /v1/models` and
3
+ * `POST /v1/chat/completions` on `127.0.0.1:<port>`, with no authentication — core's session gateway
4
+ * is the only door in, and it checks the key. Generations run one at a time in arrival order
5
+ * (`FifoLock`); conversations stay warm in a `ConversationPool`.
6
+ *
7
+ * A client that hangs up cancels its generation in the library; a stop string cancels it too. A
8
+ * cancelled conversation answers every later message with `CANCELLED` (spike S2), so it leaves the
9
+ * pool, as does one whose generation failed.
10
+ */
11
+ import { createServer } from 'node:http';
12
+ import { requestAborted } from '../../../server/public/exchange.js';
13
+ import { OpenAiRequestError, parseChatRequest, ReplyBuilder } from './openai.js';
14
+ import { ConversationPool, FifoLock } from './pool.js';
15
+ /** How long a stop waits for cancelled generations to end in the library. */
16
+ const CLOSE_WAIT_MS = 10_000;
17
+ /** Images arrive inline as base64. */
18
+ const BODY_LIMIT = 64 * 1024 * 1024;
19
+ class BodyTooLarge extends Error {
20
+ }
21
+ function readBody(req) {
22
+ return new Promise((resolve, reject) => {
23
+ const chunks = [];
24
+ let size = 0;
25
+ req.on('data', (chunk) => {
26
+ size += chunk.length;
27
+ if (size > BODY_LIMIT) {
28
+ reject(new BodyTooLarge());
29
+ req.destroy();
30
+ return;
31
+ }
32
+ chunks.push(chunk);
33
+ });
34
+ req.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));
35
+ req.on('error', reject);
36
+ });
37
+ }
38
+ function sendJson(res, status, body) {
39
+ const text = JSON.stringify(body);
40
+ res.writeHead(status, { 'content-type': 'application/json', 'content-length': Buffer.byteLength(text) });
41
+ res.end(text);
42
+ }
43
+ const sendError = (res, error) => sendJson(res, error.status, error.body);
44
+ export function createLiteRtServer(options) {
45
+ const now = options.now ?? Date.now;
46
+ const lock = new FifoLock();
47
+ const pool = new ConversationPool((config) => options.engine.conversation(config));
48
+ /** Generations under way, each resolved when the library's last chunk has been handled. */
49
+ const running = new Map();
50
+ let counter = 0;
51
+ const server = createServer((req, res) => {
52
+ void route(req, res).catch((error) => {
53
+ if (res.headersSent)
54
+ return res.destroy();
55
+ sendError(res, error instanceof OpenAiRequestError
56
+ ? error
57
+ : new OpenAiRequestError(500, error instanceof Error ? error.message : String(error)));
58
+ });
59
+ });
60
+ async function route(req, res) {
61
+ const path = (req.url ?? '/').split('?')[0];
62
+ if (req.method === 'GET' && path === '/v1/models')
63
+ return sendJson(res, 200, {
64
+ object: 'list',
65
+ data: [
66
+ { id: options.modelId, object: 'model', created: Math.floor(now() / 1000), owned_by: 'litert-lm' },
67
+ ],
68
+ });
69
+ if (req.method === 'POST' && path === '/v1/chat/completions') {
70
+ let raw;
71
+ try {
72
+ raw = JSON.parse(await readBody(req));
73
+ }
74
+ catch (error) {
75
+ throw error instanceof BodyTooLarge
76
+ ? new OpenAiRequestError(413, 'The request body is too large.')
77
+ : new OpenAiRequestError(400, 'The request body is not valid JSON.');
78
+ }
79
+ const chat = parseChatRequest(raw, options.caps);
80
+ let closed = false;
81
+ res.on('close', () => {
82
+ if (!res.writableFinished)
83
+ closed = true;
84
+ });
85
+ // Bun never says the response closed once the body is read; only its native handle knows (ADR
86
+ // 2026-09-22-detect-a-client-that-hangs-up-before-the-answer-under-bun), polled by `watchGone`.
87
+ const gone = () => closed || requestAborted(req, res);
88
+ return lock.run(async () => {
89
+ if (gone())
90
+ return;
91
+ await generate(chat, res, gone);
92
+ });
93
+ }
94
+ sendError(res, new OpenAiRequestError(404, `${req.method ?? 'GET'} ${path} is not served by LiteRT-LM.`, null, 'invalid_request_error', 'not_found'));
95
+ }
96
+ /** One generation, resolved when the library's last chunk has been handled. */
97
+ function generate(chat, res, gone) {
98
+ const { conversation, entry } = pool.take(chat.history, {
99
+ tools: chat.tools,
100
+ sampler: chat.sampler,
101
+ constrained: chat.responseFormat !== null,
102
+ });
103
+ const reply = new ReplyBuilder(chat.stop);
104
+ const id = `chatcmpl-${now().toString(36)}${(counter++).toString(36)}`;
105
+ const created = Math.floor(now() / 1000);
106
+ const frame = (body) => `data: ${JSON.stringify({ id, object: 'chat.completion.chunk', created, model: options.modelId, ...body })}\n\n`;
107
+ const deltaFrame = (delta, finish = null) => frame({ choices: [{ index: 0, delta, finish_reason: finish }] });
108
+ if (chat.stream) {
109
+ res.writeHead(200, {
110
+ 'content-type': 'text/event-stream',
111
+ 'cache-control': 'no-cache',
112
+ 'connection': 'keep-alive',
113
+ });
114
+ res.write(deltaFrame({ role: 'assistant', content: '' }));
115
+ }
116
+ const write = (deltas) => {
117
+ if (chat.stream && !gone())
118
+ for (const delta of deltas)
119
+ res.write(deltaFrame(delta));
120
+ };
121
+ return new Promise((resolve) => {
122
+ let cancelled = false;
123
+ const cancel = () => {
124
+ if (cancelled)
125
+ return;
126
+ cancelled = true;
127
+ conversation.cancel();
128
+ };
129
+ const watchGone = setInterval(() => {
130
+ if (gone())
131
+ cancel();
132
+ }, 50);
133
+ const done = (chunk) => {
134
+ clearInterval(watchGone);
135
+ running.delete(conversation);
136
+ settle();
137
+ write(reply.flush());
138
+ let finish = null;
139
+ let failure = null;
140
+ try {
141
+ finish = gone() ? null : reply.finish(chunk.error);
142
+ }
143
+ catch (error) {
144
+ failure = error instanceof OpenAiRequestError ? error : new OpenAiRequestError(500, String(error));
145
+ options.log?.(`generation failed: ${failure.message}`);
146
+ }
147
+ const total = conversation.tokenCount();
148
+ const usage = {
149
+ prompt_tokens: Math.max(0, total - reply.completionChunks),
150
+ completion_tokens: reply.completionChunks,
151
+ total_tokens: total,
152
+ };
153
+ if (cancelled || failure || chunk.error)
154
+ pool.drop(entry);
155
+ else
156
+ pool.advance(entry, [...chat.next, reply.history()]);
157
+ if (!gone())
158
+ respond(finish, failure, usage);
159
+ resolve();
160
+ };
161
+ const respond = (finish, failure, usage) => {
162
+ if (chat.stream) {
163
+ if (failure)
164
+ res.write(`data: ${JSON.stringify(failure.body)}\n\n`);
165
+ else {
166
+ res.write(deltaFrame({}, finish));
167
+ if (chat.includeUsage)
168
+ res.write(frame({ choices: [], usage }));
169
+ }
170
+ res.end('data: [DONE]\n\n');
171
+ return;
172
+ }
173
+ if (failure)
174
+ return sendError(res, failure);
175
+ sendJson(res, 200, {
176
+ id,
177
+ object: 'chat.completion',
178
+ created,
179
+ model: options.modelId,
180
+ choices: [{ index: 0, message: reply.message(), finish_reason: finish }],
181
+ usage,
182
+ });
183
+ };
184
+ let settle = () => { };
185
+ running.set(conversation, new Promise((done) => (settle = done)));
186
+ try {
187
+ conversation.send(chat.next, {
188
+ ...(chat.maxTokens !== undefined ? { maxOutputTokens: chat.maxTokens } : {}),
189
+ ...(chat.responseFormat ? { constraint: chat.responseFormat } : {}),
190
+ thinking: chat.thinking,
191
+ }, (chunk) => {
192
+ if (chunk.text !== null && !chunk.error) {
193
+ write(reply.add(chunk.text));
194
+ if (reply.stopped)
195
+ cancel();
196
+ }
197
+ if (chunk.final || chunk.error)
198
+ done(chunk);
199
+ });
200
+ }
201
+ catch (error) {
202
+ clearInterval(watchGone);
203
+ running.delete(conversation);
204
+ settle();
205
+ pool.drop(entry);
206
+ const failure = new OpenAiRequestError(500, error instanceof Error ? error.message : String(error));
207
+ options.log?.(`generation failed to start: ${failure.message}`);
208
+ if (chat.stream) {
209
+ res.write(`data: ${JSON.stringify(failure.body)}\n\n`);
210
+ res.end('data: [DONE]\n\n');
211
+ }
212
+ else
213
+ sendError(res, failure);
214
+ resolve();
215
+ }
216
+ });
217
+ }
218
+ return {
219
+ listen: (port) => new Promise((resolve, reject) => {
220
+ server.once('error', reject);
221
+ server.listen(port, '127.0.0.1', () => {
222
+ server.off('error', reject);
223
+ resolve(`http://127.0.0.1:${server.address().port}`);
224
+ });
225
+ }),
226
+ close: async () => {
227
+ // A conversation or engine deleted while the library still runs its generation is a
228
+ // use-after-free on the library's thread: cancel, then wait for each last chunk (bounded).
229
+ const pending = [...running.entries()];
230
+ for (const [conversation] of pending)
231
+ conversation.cancel();
232
+ await Promise.race([
233
+ Promise.all(pending.map(([, ended]) => ended)),
234
+ new Promise((resolve) => setTimeout(resolve, CLOSE_WAIT_MS).unref()),
235
+ ]);
236
+ server.closeAllConnections();
237
+ await new Promise((resolve) => server.close(() => resolve()));
238
+ pool.closeAll();
239
+ },
240
+ };
241
+ }
242
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../../src/runtime/litert-lm/host/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * The core's side of the `litert-host` protocol (openspec change `add-litert-lm-runtime`, design D1):
3
+ * the host is this very binary in a hidden mode, started with `process.execPath`, so a crash of
4
+ * Google's native library never takes the core down. `probe` opens the library of one build and
5
+ * prints one JSON line: its version, our ABI number and the backends it was built with.
6
+ */
7
+ import type { ErrorCode } from '../../contracts/index.js';
8
+ import type { LiteRtFileInfo } from './host/library.js';
9
+ /** How to start `litert-host`: `[execPath, script?]` + `litert-host`, or a test stand-in. */
10
+ export interface LiteRtHostCommand {
11
+ exe: string;
12
+ args: string[];
13
+ }
14
+ /** A program that speaks `litert-host` in place of this binary: the e2e tests' stand-in. */
15
+ export declare const LITERT_HOST_TEST_COMMAND_ENV = "ATOMIC_LITERT_HOST_TEST_COMMAND";
16
+ export declare function liteRtHostCommand(env: Record<string, string | undefined>, argv?: readonly string[], execPath?: string): LiteRtHostCommand;
17
+ export interface LiteRtHostProbeResult {
18
+ /** The library's version, `X.Y.Z`; `null` where the host cannot read it. */
19
+ version: string | null;
20
+ /** The ABI number of this host's binding. */
21
+ abi: number;
22
+ backends: string[];
23
+ }
24
+ /** The first run of a freshly unpacked library is scanned by Gatekeeper / Defender. */
25
+ export declare const LITERT_HOST_PROBE_TIMEOUT_MS = 60000;
26
+ export interface HostRunOptions {
27
+ env?: NodeJS.ProcessEnv;
28
+ timeoutMs?: number;
29
+ }
30
+ /**
31
+ * Run one short `litert-host` mode and read the last JSON line it prints that `parse` accepts.
32
+ * Throws `code` with what the host printed when it exits non-zero, prints no answer or does not
33
+ * answer in time.
34
+ */
35
+ export declare function runLiteRtHostJson<T>(command: LiteRtHostCommand, args: string[], parse: (raw: unknown) => T | null, failure: {
36
+ code: ErrorCode;
37
+ what: string;
38
+ }, options?: HostRunOptions): Promise<T>;
39
+ /** `litert-host probe --lib <buildDir>`: the build's library loads in this core's host. */
40
+ export declare function runLiteRtHostProbe(command: LiteRtHostCommand, buildDir: string, options?: HostRunOptions): Promise<LiteRtHostProbeResult>;
41
+ /** `litert-host inspect --lib <buildDir> <file>`: the file's metadata, read without an engine. */
42
+ export declare function runLiteRtHostInspect(command: LiteRtHostCommand, buildDir: string, file: string, options?: HostRunOptions): Promise<LiteRtFileInfo>;
43
+ /** The engine-builds probe of a LiteRT-LM build: `litert-host probe`, its answer dropped. */
44
+ export declare function liteRtHostProber(command: LiteRtHostCommand, env: NodeJS.ProcessEnv): (buildDir: string) => Promise<void>;
@@ -0,0 +1,99 @@
1
+ /**
2
+ * The core's side of the `litert-host` protocol (openspec change `add-litert-lm-runtime`, design D1):
3
+ * the host is this very binary in a hidden mode, started with `process.execPath`, so a crash of
4
+ * Google's native library never takes the core down. `probe` opens the library of one build and
5
+ * prints one JSON line: its version, our ABI number and the backends it was built with.
6
+ */
7
+ import { spawn } from 'node:child_process';
8
+ import { AtomicCoreError } from '../../contracts/index.js';
9
+ /** A program that speaks `litert-host` in place of this binary: the e2e tests' stand-in. */
10
+ export const LITERT_HOST_TEST_COMMAND_ENV = 'ATOMIC_LITERT_HOST_TEST_COMMAND';
11
+ export function liteRtHostCommand(env, argv = process.argv, execPath = process.execPath) {
12
+ const stand = env[LITERT_HOST_TEST_COMMAND_ENV]?.trim();
13
+ if (stand)
14
+ return { exe: stand, args: [] };
15
+ const script = argv[1];
16
+ const viaRuntime = script !== undefined && /\.(c|m)?[jt]s$/.test(script);
17
+ return { exe: execPath, args: [...(viaRuntime ? [script] : []), 'litert-host'] };
18
+ }
19
+ /** The first run of a freshly unpacked library is scanned by Gatekeeper / Defender. */
20
+ export const LITERT_HOST_PROBE_TIMEOUT_MS = 60_000;
21
+ const OUTPUT_LIMIT = 64 * 1024;
22
+ const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
23
+ function parseProbe(raw) {
24
+ if (!isRecord(raw))
25
+ return null;
26
+ const { version, abi, backends } = raw;
27
+ if (typeof abi !== 'number' || !Array.isArray(backends) || !backends.every((b) => typeof b === 'string'))
28
+ return null;
29
+ return { version: typeof version === 'string' ? version : null, abi, backends: backends };
30
+ }
31
+ /**
32
+ * Run one short `litert-host` mode and read the last JSON line it prints that `parse` accepts.
33
+ * Throws `code` with what the host printed when it exits non-zero, prints no answer or does not
34
+ * answer in time.
35
+ */
36
+ export function runLiteRtHostJson(command, args, parse, failure, options = {}) {
37
+ return new Promise((resolve, reject) => {
38
+ const child = spawn(command.exe, [...command.args, ...args], {
39
+ env: options.env ?? process.env,
40
+ stdio: ['ignore', 'pipe', 'pipe'],
41
+ windowsHide: true,
42
+ });
43
+ let stdout = '';
44
+ let stderr = '';
45
+ const keep = (buffer, chunk) => (buffer + chunk.toString('utf8')).slice(-OUTPUT_LIMIT);
46
+ child.stdout.on('data', (chunk) => (stdout = keep(stdout, chunk)));
47
+ child.stderr.on('data', (chunk) => (stderr = keep(stderr, chunk)));
48
+ const timeoutMs = options.timeoutMs ?? LITERT_HOST_PROBE_TIMEOUT_MS;
49
+ const timer = setTimeout(() => {
50
+ child.kill('SIGKILL');
51
+ reject(new AtomicCoreError(failure.code, `${failure.what}: the LiteRT-LM host did not answer.`, `${args.join(' ')} timed out after ${Math.round(timeoutMs / 1000)}s`));
52
+ }, timeoutMs);
53
+ child.on('error', (error) => {
54
+ clearTimeout(timer);
55
+ reject(new AtomicCoreError(failure.code, `${failure.what}: the LiteRT-LM host could not be started.`, String(error)));
56
+ });
57
+ child.on('close', (code, signal) => {
58
+ clearTimeout(timer);
59
+ const answer = stdout
60
+ .split(/\r?\n/)
61
+ .reverse()
62
+ .map((line) => line.trim())
63
+ .filter(Boolean)
64
+ .map((line) => {
65
+ try {
66
+ return parse(JSON.parse(line));
67
+ }
68
+ catch {
69
+ return null;
70
+ }
71
+ })
72
+ .find((parsed) => parsed !== null);
73
+ if (code === 0 && answer != null)
74
+ return resolve(answer);
75
+ const status = code !== null ? `exit code ${code}` : `signal ${String(signal)}`;
76
+ reject(new AtomicCoreError(failure.code, `${failure.what}: the LiteRT-LM host failed (${status}).`, (stderr.trim() || stdout.trim() || status).slice(-4096)));
77
+ });
78
+ });
79
+ }
80
+ /** `litert-host probe --lib <buildDir>`: the build's library loads in this core's host. */
81
+ export function runLiteRtHostProbe(command, buildDir, options = {}) {
82
+ return runLiteRtHostJson(command, ['probe', '--lib', buildDir], parseProbe, { code: 'ENGINE_INSTALL_FAILED', what: 'The LiteRT-LM build does not load' }, options);
83
+ }
84
+ function parseInspect(raw) {
85
+ if (!isRecord(raw) || typeof raw['model_type'] !== 'string' || !Array.isArray(raw['backends']))
86
+ return null;
87
+ return raw;
88
+ }
89
+ /** `litert-host inspect --lib <buildDir> <file>`: the file's metadata, read without an engine. */
90
+ export function runLiteRtHostInspect(command, buildDir, file, options = {}) {
91
+ return runLiteRtHostJson(command, ['inspect', '--lib', buildDir, file], parseInspect, { code: 'LITERT_LM_HOST_ERROR', what: 'The LiteRT-LM model file cannot be read' }, options);
92
+ }
93
+ /** The engine-builds probe of a LiteRT-LM build: `litert-host probe`, its answer dropped. */
94
+ export function liteRtHostProber(command, env) {
95
+ return async (buildDir) => {
96
+ await runLiteRtHostProbe(command, buildDir, { env });
97
+ };
98
+ }
99
+ //# sourceMappingURL=host-process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-process.js","sourceRoot":"","sources":["../../../src/runtime/litert-lm/host-process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * The `litert-lm` provider (openspec change `add-litert-lm-runtime`): the core's side of the
3
+ * `litert-host` protocol; the host mode, the runtime and the accelerator follow.
4
+ */
5
+ export * from './host-process.js';
6
+ export * from './model-yml.js';
7
+ export * from './runtime.js';
8
+ export * from './npu.js';
9
+ export * from './accelerators.js';
10
+ export * from './check.js';
@@ -0,0 +1,11 @@
1
+ /**
2
+ * The `litert-lm` provider (openspec change `add-litert-lm-runtime`): the core's side of the
3
+ * `litert-host` protocol; the host mode, the runtime and the accelerator follow.
4
+ */
5
+ export * from './host-process.js';
6
+ export * from './model-yml.js';
7
+ export * from './runtime.js';
8
+ export * from './npu.js';
9
+ export * from './accelerators.js';
10
+ export * from './check.js';
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime/litert-lm/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,mBAAmB,CAAA;AACjC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,mBAAmB,CAAA;AACjC,cAAc,YAAY,CAAA"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * `@atomic-chat/core/litert-host`: the one entry of the hidden `litert-host` mode (change
3
+ * `add-litert-lm-runtime`, design D1). The core binaries and any program that embeds the core as a
4
+ * library (`atc`) hand it the arguments after `litert-host` before they parse their own commands,
5
+ * because `liteRtHostCommand` starts the host as `<this program> litert-host …`.
6
+ *
7
+ * Importing this file loads no `bun:*`: the FFI bindings load dynamically, inside the mode alone.
8
+ */
9
+ /**
10
+ * Runs `litert-host <argv…>` and returns its exit code (`EXIT` in `host/run.ts`). Lines go to this
11
+ * process's stdout and stderr through writers that go quiet instead of crashing the host when the
12
+ * core closed its end of a pipe (EPIPE).
13
+ */
14
+ export declare function runLiteRtHostMain(argv: readonly string[], io?: {
15
+ stdout: (text: string) => void;
16
+ stderr: (text: string) => void;
17
+ }): Promise<number>;
@@ -0,0 +1,22 @@
1
+ /**
2
+ * `@atomic-chat/core/litert-host`: the one entry of the hidden `litert-host` mode (change
3
+ * `add-litert-lm-runtime`, design D1). The core binaries and any program that embeds the core as a
4
+ * library (`atc`) hand it the arguments after `litert-host` before they parse their own commands,
5
+ * because `liteRtHostCommand` starts the host as `<this program> litert-host …`.
6
+ *
7
+ * Importing this file loads no `bun:*`: the FFI bindings load dynamically, inside the mode alone.
8
+ */
9
+ import { detachableWriter } from '../../cli/io.js';
10
+ import { lineIo, loadLibraryWithBun, runLiteRtHost } from './host/run.js';
11
+ /**
12
+ * Runs `litert-host <argv…>` and returns its exit code (`EXIT` in `host/run.ts`). Lines go to this
13
+ * process's stdout and stderr through writers that go quiet instead of crashing the host when the
14
+ * core closed its end of a pipe (EPIPE).
15
+ */
16
+ export async function runLiteRtHostMain(argv, io = {
17
+ stdout: detachableWriter(process.stdout),
18
+ stderr: detachableWriter(process.stderr),
19
+ }) {
20
+ return runLiteRtHost(argv, { ...lineIo(io), loadLibrary: loadLibraryWithBun });
21
+ }
22
+ //# sourceMappingURL=litert-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"litert-host.js","sourceRoot":"","sources":["../../../src/runtime/litert-lm/litert-host.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAEzE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAuB,EACvB,KAAyE;IACvE,MAAM,EAAE,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC;IACxC,MAAM,EAAE,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC;CACzC;IAED,OAAO,aAAa,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC,CAAA;AAChF,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * The `litert_lm` block of a LiteRT-LM model's `model.yml` (openspec change `add-litert-lm-runtime`,
3
+ * task 6.2). The core never writes it — the app and `atc` do — and reads it strictly: a backend or
4
+ * NPU this core does not know is a variant it cannot run (`LITERT_LM_VARIANT_UNSUPPORTED`), anything
5
+ * else malformed is a broken file (`MODEL_LOAD_FAILED`).
6
+ */
7
+ import type { ModelYmlLiteRtLm } from '../../contracts/index.js';
8
+ export declare function readLiteRtLmBlock(doc: Record<string, unknown>): ModelYmlLiteRtLm;
@@ -0,0 +1,67 @@
1
+ /**
2
+ * The `litert_lm` block of a LiteRT-LM model's `model.yml` (openspec change `add-litert-lm-runtime`,
3
+ * task 6.2). The core never writes it — the app and `atc` do — and reads it strictly: a backend or
4
+ * NPU this core does not know is a variant it cannot run (`LITERT_LM_VARIANT_UNSUPPORTED`), anything
5
+ * else malformed is a broken file (`MODEL_LOAD_FAILED`).
6
+ */
7
+ import { AtomicCoreError, LITERT_LM_BACKENDS, LITERT_LM_NPUS } from '../../contracts/index.js';
8
+ const broken = (why) => new AtomicCoreError('MODEL_LOAD_FAILED', `model.yml: litert_lm ${why}.`);
9
+ const unsupported = (why) => new AtomicCoreError('LITERT_LM_VARIANT_UNSUPPORTED', `This core does not run LiteRT-LM variants ${why}.`);
10
+ const text = (block, key) => {
11
+ const value = block[key];
12
+ if (typeof value !== 'string' || value.trim() === '')
13
+ throw broken(`has no ${key}`);
14
+ return value;
15
+ };
16
+ const flag = (block, key) => {
17
+ const value = block[key];
18
+ if (value === undefined)
19
+ return false;
20
+ if (typeof value !== 'boolean')
21
+ throw broken(`has a ${key} that is not true or false`);
22
+ return value;
23
+ };
24
+ /** A bare file name, as the variant folder holds it. */
25
+ const FILE_NAME_RE = /^[^/\\]+$/;
26
+ export function readLiteRtLmBlock(doc) {
27
+ const raw = doc['litert_lm'];
28
+ if (raw === null || typeof raw !== 'object' || Array.isArray(raw))
29
+ throw broken('is missing');
30
+ const block = raw;
31
+ const backend = text(block, 'backend');
32
+ if (!LITERT_LM_BACKENDS.some((known) => known === backend))
33
+ throw unsupported(`on the "${backend}" backend`);
34
+ const npu = block['npu'];
35
+ if (backend === 'npu') {
36
+ if (typeof npu !== 'string' || npu === '')
37
+ throw broken('names no npu for an NPU variant');
38
+ if (!LITERT_LM_NPUS.some((known) => known === npu))
39
+ throw unsupported(`for the "${npu}" NPU`);
40
+ }
41
+ else if (npu !== undefined)
42
+ throw broken(`names an npu for a ${backend} variant`);
43
+ const file = text(block, 'file').split('/').at(-1) ?? '';
44
+ if (!FILE_NAME_RE.test(file) || file === '..' || text(block, 'file').split('/').includes('..'))
45
+ throw broken('has a file that is not a file of the repository');
46
+ const context = block['context_length'];
47
+ if (context !== undefined && (typeof context !== 'number' || !Number.isSafeInteger(context) || context < 1))
48
+ throw broken('has a context_length that is not a positive whole number');
49
+ const source = block['source'];
50
+ if (source !== 'curated' && source !== 'huggingface')
51
+ throw broken('has a source that is not curated or huggingface');
52
+ return {
53
+ model_id: text(block, 'model_id'),
54
+ variant_id: text(block, 'variant_id'),
55
+ backend: backend,
56
+ ...(backend === 'npu' ? { npu: npu } : {}),
57
+ repo: text(block, 'repo'),
58
+ revision: text(block, 'revision'),
59
+ file: text(block, 'file'),
60
+ ...(context !== undefined ? { context_length: context } : {}),
61
+ tools: flag(block, 'tools'),
62
+ reasoning: flag(block, 'reasoning'),
63
+ vision: flag(block, 'vision'),
64
+ source,
65
+ };
66
+ }
67
+ //# sourceMappingURL=model-yml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-yml.js","sourceRoot":"","sources":["../../../src/runtime/litert-lm/model-yml.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Which Intel NPU generation a machine has, by the CPU model string core's hardware facts carry
3
+ * (change `add-litert-lm-runtime`, design D3). LiteRT-LM NPU files are compiled ahead of time for one
4
+ * generation: `_intel_LNL` (Lunar Lake, Core Ultra 200V) and `_intel_PTL` (Panther Lake, Core Ultra
5
+ * series 3). Meteor Lake (1xx) and Arrow Lake (2xx without V) have an NPU no file targets.
6
+ *
7
+ * Unverified on real hardware (spike S4: no machine); a wrong row only turns a variant into
8
+ * `accelerator-unavailable`, and the table is fixed by a core release.
9
+ */
10
+ import type { LiteRtLmNpu } from '../../contracts/index.js';
11
+ export declare function liteRtNpuGeneration(cpuName: string): LiteRtLmNpu | null;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Which Intel NPU generation a machine has, by the CPU model string core's hardware facts carry
3
+ * (change `add-litert-lm-runtime`, design D3). LiteRT-LM NPU files are compiled ahead of time for one
4
+ * generation: `_intel_LNL` (Lunar Lake, Core Ultra 200V) and `_intel_PTL` (Panther Lake, Core Ultra
5
+ * series 3). Meteor Lake (1xx) and Arrow Lake (2xx without V) have an NPU no file targets.
6
+ *
7
+ * Unverified on real hardware (spike S4: no machine); a wrong row only turns a variant into
8
+ * `accelerator-unavailable`, and the table is fixed by a core release.
9
+ */
10
+ /** `Core(TM) Ultra [X]<tier> <series><nn><suffix>`, e.g. `Ultra 7 258V`, `Ultra X9 388H`. */
11
+ const CORE_ULTRA_RE = /Core(?:\(TM\))?\s+Ultra\s+X?\d+\s+(\d)\d{2}([A-Z]*)\b/i;
12
+ export function liteRtNpuGeneration(cpuName) {
13
+ const match = CORE_ULTRA_RE.exec(cpuName);
14
+ if (!match)
15
+ return null;
16
+ const series = match[1];
17
+ const suffix = (match[2] ?? '').toUpperCase();
18
+ if (series === '2' && suffix === 'V')
19
+ return 'intel-lnl';
20
+ if (series === '3')
21
+ return 'intel-ptl';
22
+ return null;
23
+ }
24
+ //# sourceMappingURL=npu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npu.js","sourceRoot":"","sources":["../../../src/runtime/litert-lm/npu.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,6FAA6F;AAC7F,MAAM,aAAa,GAAG,wDAAwD,CAAA;AAE9E,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACzC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAA;IACvB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAA;IACvB,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;IAC7C,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,WAAW,CAAA;IACxD,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,WAAW,CAAA;IACtC,OAAO,IAAI,CAAA;AACb,CAAC"}