@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,54 @@
1
+ /**
2
+ * LiteRT-LM's one accelerator, `openvino` (openspec change `add-litert-lm-runtime`, task 6.4, design
3
+ * D3): the Intel libraries an NPU variant needs on Windows, from the `openvino` wheel the active
4
+ * release pins in conf's manifest. Offered only on a machine whose Intel NPU generation LiteRT-LM has
5
+ * files for; prepared only when a client orders it — one prepare at a time, each step published as
6
+ * `litert-lm:accelerators`.
7
+ *
8
+ * A prepare downloads the wheel with its sha256 and size checked, keeps only `openvino/libs/**` and
9
+ * puts it at `<data>/litert-lm/accelerators/openvino/<version>/`, marked last: a folder without the
10
+ * marker is not prepared. A second prepare of the same version downloads nothing.
11
+ */
12
+ import type { CoreEvents, LiteRtLmAccelerators, LiteRtLmNpu, LiteRtLmPrepareRequest, LiteRtLmPrepareResult, ProxyConfig } from '../../contracts/index.js';
13
+ import type { LiteRtLmRelease } from '../../engine-builds/manifest.js';
14
+ export declare const OPENVINO = "openvino";
15
+ export interface LiteRtLmAcceleratorDeps {
16
+ /** `<data>/litert-lm/accelerators`. */
17
+ acceleratorsDir: string;
18
+ /** `<data>/litert-lm/tmp`: the download and the unpacked wheel, gone after. */
19
+ tmpDir: string;
20
+ resolveBuild: () => Promise<{
21
+ dir: string;
22
+ version: string;
23
+ } | undefined>;
24
+ /** The manifest's release of a LiteRT-LM version (a cached manifest is fine); `null` when unknown. */
25
+ release: (version: string) => Promise<LiteRtLmRelease | null>;
26
+ /** This machine's Intel NPU generation LiteRT-LM files target, or `null`. */
27
+ npuGeneration: () => Promise<LiteRtLmNpu | null>;
28
+ /** Download one file with its sha256 and size checked; `onFraction` 0…1 as it goes. */
29
+ download: (taskId: string, item: {
30
+ url: string;
31
+ save_path: string;
32
+ sha256: string;
33
+ size: number;
34
+ proxy?: ProxyConfig | null;
35
+ }, onFraction: (fraction: number) => void) => Promise<void>;
36
+ emit: (name: 'litert-lm:accelerators', payload: CoreEvents['litert-lm:accelerators']) => void;
37
+ now?: () => number;
38
+ }
39
+ export declare class LiteRtLmAcceleratorService {
40
+ private readonly deps;
41
+ private preparing;
42
+ /** The reason the last failed prepare of each version gave. */
43
+ private readonly failures;
44
+ private readonly now;
45
+ constructor(deps: LiteRtLmAcceleratorDeps);
46
+ private dirOf;
47
+ /** What this machine is offered: OpenVINO of the active release, on an Intel NPU it targets. */
48
+ private offered;
49
+ list(): Promise<LiteRtLmAccelerators>;
50
+ /** The prepared OpenVINO libraries of the active release: what an NPU load passes the host. */
51
+ libsDir(): Promise<string | undefined>;
52
+ prepare(request: LiteRtLmPrepareRequest): Promise<LiteRtLmPrepareResult>;
53
+ private prepareOpenVino;
54
+ }
@@ -0,0 +1,176 @@
1
+ /**
2
+ * LiteRT-LM's one accelerator, `openvino` (openspec change `add-litert-lm-runtime`, task 6.4, design
3
+ * D3): the Intel libraries an NPU variant needs on Windows, from the `openvino` wheel the active
4
+ * release pins in conf's manifest. Offered only on a machine whose Intel NPU generation LiteRT-LM has
5
+ * files for; prepared only when a client orders it — one prepare at a time, each step published as
6
+ * `litert-lm:accelerators`.
7
+ *
8
+ * A prepare downloads the wheel with its sha256 and size checked, keeps only `openvino/libs/**` and
9
+ * puts it at `<data>/litert-lm/accelerators/openvino/<version>/`, marked last: a folder without the
10
+ * marker is not prepared. A second prepare of the same version downloads nothing.
11
+ */
12
+ import { mkdir, rename, rm, stat, writeFile } from 'node:fs/promises';
13
+ import { join } from 'node:path';
14
+ import { AtomicCoreError } from '../../contracts/index.js';
15
+ import { OWNER_MARKER } from '../../diffusion/install.js';
16
+ import { extractArchive } from '../../downloads/index.js';
17
+ export const OPENVINO = 'openvino';
18
+ const exists = (path) => stat(path).then(() => true, () => false);
19
+ export class LiteRtLmAcceleratorService {
20
+ deps;
21
+ preparing = false;
22
+ /** The reason the last failed prepare of each version gave. */
23
+ failures = new Map();
24
+ now;
25
+ constructor(deps) {
26
+ this.deps = deps;
27
+ this.now = deps.now ?? Date.now;
28
+ }
29
+ dirOf(version) {
30
+ return join(this.deps.acceleratorsDir, OPENVINO, version);
31
+ }
32
+ /** What this machine is offered: OpenVINO of the active release, on an Intel NPU it targets. */
33
+ async offered() {
34
+ const build = await this.deps.resolveBuild();
35
+ if (!build)
36
+ return {
37
+ answer: { installed: false, build: null, npu: null, accelerators: [], error: null },
38
+ accelerator: null,
39
+ };
40
+ const name = `${build.version}/${build.dir.split(/[\\/]/).at(-1) ?? ''}`;
41
+ const npu = await this.deps.npuGeneration();
42
+ if (!npu)
43
+ return {
44
+ answer: { installed: true, build: name, npu: null, accelerators: [], error: null },
45
+ accelerator: null,
46
+ };
47
+ const release = await this.deps.release(build.version);
48
+ const accelerator = release?.accelerators.find((candidate) => candidate.id === OPENVINO) ?? null;
49
+ if (!accelerator)
50
+ return {
51
+ answer: {
52
+ installed: true,
53
+ build: name,
54
+ npu,
55
+ accelerators: [],
56
+ error: release
57
+ ? `LiteRT-LM ${build.version} pins no OpenVINO.`
58
+ : `The LiteRT-LM manifest has no release ${build.version}; it lists the accelerator.`,
59
+ },
60
+ accelerator: null,
61
+ };
62
+ const failure = this.failures.get(accelerator.version);
63
+ return {
64
+ answer: {
65
+ installed: true,
66
+ build: name,
67
+ npu,
68
+ accelerators: [
69
+ {
70
+ name: OPENVINO,
71
+ device: 'npu',
72
+ version: accelerator.version,
73
+ size_bytes: accelerator.size,
74
+ prepared: await exists(join(this.dirOf(accelerator.version), OWNER_MARKER)),
75
+ ...(failure ? { reason: failure } : {}),
76
+ },
77
+ ],
78
+ error: null,
79
+ },
80
+ accelerator,
81
+ };
82
+ }
83
+ async list() {
84
+ return (await this.offered()).answer;
85
+ }
86
+ /** The prepared OpenVINO libraries of the active release: what an NPU load passes the host. */
87
+ async libsDir() {
88
+ const { accelerator } = await this.offered();
89
+ if (!accelerator)
90
+ return undefined;
91
+ const dir = this.dirOf(accelerator.version);
92
+ return (await exists(join(dir, OWNER_MARKER))) ? dir : undefined;
93
+ }
94
+ async prepare(request) {
95
+ if (this.preparing)
96
+ throw new AtomicCoreError('ENGINE_INSTALL_IN_PROGRESS', 'The LiteRT-LM accelerator is already being prepared; wait for that to finish.');
97
+ this.preparing = true;
98
+ try {
99
+ const { answer, accelerator } = await this.offered();
100
+ const wanted = request.accelerators && request.accelerators.length > 0 ? request.accelerators : [OPENVINO];
101
+ const summary = [];
102
+ for (const name of wanted) {
103
+ if (name !== OPENVINO) {
104
+ summary.push({ name, prepared: false, reason: `LiteRT-LM has no ${name} accelerator.` });
105
+ continue;
106
+ }
107
+ if (!accelerator) {
108
+ summary.push({
109
+ name,
110
+ prepared: false,
111
+ reason: answer.error ?? 'This computer has no Intel NPU LiteRT-LM has models for.',
112
+ });
113
+ continue;
114
+ }
115
+ summary.push(await this.prepareOpenVino(accelerator, request.proxy ?? null));
116
+ }
117
+ return { accelerators: summary };
118
+ }
119
+ finally {
120
+ this.preparing = false;
121
+ }
122
+ }
123
+ async prepareOpenVino(accelerator, proxy) {
124
+ const emit = (stage, fraction, reason) => this.deps.emit('litert-lm:accelerators', {
125
+ accelerator: OPENVINO,
126
+ stage,
127
+ fraction,
128
+ ...(reason !== undefined ? { reason } : {}),
129
+ });
130
+ const target = this.dirOf(accelerator.version);
131
+ if (await exists(join(target, OWNER_MARKER))) {
132
+ emit('done', 1);
133
+ return { name: OPENVINO, prepared: true };
134
+ }
135
+ const stamp = this.now();
136
+ const work = join(this.deps.tmpDir, `openvino-${accelerator.version}-${stamp}`);
137
+ const staging = `${target}.incoming-${stamp}`;
138
+ try {
139
+ emit('started', 0);
140
+ await mkdir(work, { recursive: true });
141
+ const wheel = join(work, accelerator.name);
142
+ await this.deps.download(`litert-lm-${OPENVINO}-${accelerator.version}`, {
143
+ url: accelerator.url,
144
+ save_path: wheel,
145
+ sha256: accelerator.sha256,
146
+ size: accelerator.size,
147
+ ...(proxy ? { proxy } : {}),
148
+ }, (fraction) => emit('downloading', fraction));
149
+ const unpacked = join(work, 'unpacked');
150
+ await extractArchive(wheel, unpacked);
151
+ const libs = join(unpacked, 'openvino', 'libs');
152
+ if (!(await exists(libs)))
153
+ throw new Error('the OpenVINO wheel has no openvino/libs');
154
+ await rm(staging, { recursive: true, force: true });
155
+ await mkdir(join(staging, '..'), { recursive: true });
156
+ await rename(libs, staging);
157
+ await writeFile(join(staging, OWNER_MARKER), 'atomic-chat\n');
158
+ await rm(target, { recursive: true, force: true });
159
+ await rename(staging, target);
160
+ this.failures.delete(accelerator.version);
161
+ emit('done', 1);
162
+ return { name: OPENVINO, prepared: true };
163
+ }
164
+ catch (error) {
165
+ const reason = error instanceof Error ? error.message : String(error);
166
+ this.failures.set(accelerator.version, reason);
167
+ await rm(staging, { recursive: true, force: true }).catch(() => { });
168
+ emit('failed', null, reason);
169
+ return { name: OPENVINO, prepared: false, reason };
170
+ }
171
+ finally {
172
+ await rm(work, { recursive: true, force: true }).catch(() => { });
173
+ }
174
+ }
175
+ }
176
+ //# sourceMappingURL=accelerators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accelerators.js","sourceRoot":"","sources":["../../../src/runtime/litert-lm/accelerators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * `POST /models/litert-lm/check` (openspec change `add-litert-lm-runtime`, task 6.5): whether a
3
+ * variant would run here. Before a download, from what core already knows — the platform, this
4
+ * machine's Intel NPU generation, the active build, whether OpenVINO is prepared — never the network.
5
+ * For a file on disk, also from the file itself (`litert-host inspect`), whose facts come back in the
6
+ * answer for the client to write into `model.yml`.
7
+ */
8
+ import type { LiteRtLmCheckRequest, LiteRtLmCheckResult, LiteRtLmFileMetadata, LiteRtLmNpu } from '../../contracts/index.js';
9
+ import type { LiteRtLmPlatform } from '../../engine-builds/manifest.js';
10
+ import type { ModelRegistry } from '../../models/index.js';
11
+ export interface LiteRtLmCheckFacts {
12
+ platform: LiteRtLmPlatform;
13
+ build: {
14
+ dir: string;
15
+ version: string;
16
+ } | null;
17
+ npu: LiteRtLmNpu | null;
18
+ openVinoPrepared: boolean;
19
+ }
20
+ /** The verdict for a variant (`backend`, `npu`, `min_runtime_version`), and for a file its facts. */
21
+ export declare function liteRtLmVerdict(facts: LiteRtLmCheckFacts, request: Pick<LiteRtLmCheckRequest, 'backend' | 'npu' | 'min_runtime_version'>, file: LiteRtLmFileMetadata | null): LiteRtLmCheckResult;
22
+ /** The request body, strictly: a variant, a path with its backend, or a model id. */
23
+ export declare function parseLiteRtLmCheckRequest(body: unknown): LiteRtLmCheckRequest;
24
+ export interface LiteRtLmCheckDeps {
25
+ platform: LiteRtLmPlatform;
26
+ /** `<data>/litert-lm/models`: the only place a checked path may be. */
27
+ modelsDir: string;
28
+ registry: ModelRegistry;
29
+ resolveBuild: () => Promise<{
30
+ dir: string;
31
+ version: string;
32
+ } | undefined>;
33
+ npuGeneration: () => Promise<LiteRtLmNpu | null>;
34
+ openVinoLibs: () => Promise<string | undefined>;
35
+ /** The runtime's cached `inspect` (by path, mtime and build). */
36
+ inspect: (buildDir: string, file: string) => Promise<LiteRtLmFileMetadata>;
37
+ }
38
+ export declare class LiteRtLmCheckService {
39
+ private readonly deps;
40
+ constructor(deps: LiteRtLmCheckDeps);
41
+ /** A path inside the models root, links resolved, or `INVALID_ARGUMENT`. */
42
+ private inRoot;
43
+ check(request: LiteRtLmCheckRequest): Promise<LiteRtLmCheckResult>;
44
+ }
@@ -0,0 +1,113 @@
1
+ /**
2
+ * `POST /models/litert-lm/check` (openspec change `add-litert-lm-runtime`, task 6.5): whether a
3
+ * variant would run here. Before a download, from what core already knows — the platform, this
4
+ * machine's Intel NPU generation, the active build, whether OpenVINO is prepared — never the network.
5
+ * For a file on disk, also from the file itself (`litert-host inspect`), whose facts come back in the
6
+ * answer for the client to write into `model.yml`.
7
+ */
8
+ import { realpath } from 'node:fs/promises';
9
+ import { isAbsolute, relative, resolve } from 'node:path';
10
+ import { AtomicCoreError, LITERT_LM_BACKENDS, LITERT_LM_NPUS } from '../../contracts/index.js';
11
+ import { compareVersions } from '../../backend/index.js';
12
+ import { readLiteRtLmBlock } from './model-yml.js';
13
+ import { backendRunsOn } from './runtime.js';
14
+ const verdict = (v, reason, metadata) => ({ verdict: v, reason, ...(metadata ? { metadata } : {}) });
15
+ /** The verdict for a variant (`backend`, `npu`, `min_runtime_version`), and for a file its facts. */
16
+ export function liteRtLmVerdict(facts, request, file) {
17
+ const backend = request.backend ?? '';
18
+ if (!LITERT_LM_BACKENDS.some((known) => known === backend))
19
+ return verdict('platform-unsupported', `This core runs no LiteRT-LM variant on the "${backend}" backend.`, file);
20
+ if (!backendRunsOn(facts.platform, backend))
21
+ return verdict('platform-unsupported', `LiteRT-LM runs ${backend.toUpperCase()} variants on Windows x64 only.`, file);
22
+ if (backend === 'npu') {
23
+ if (!LITERT_LM_NPUS.some((known) => known === request.npu))
24
+ return verdict('platform-unsupported', `This core runs no LiteRT-LM variant for the "${request.npu ?? ''}" NPU.`, file);
25
+ if (facts.npu === null)
26
+ return verdict('accelerator-unavailable', 'This computer has no Intel NPU LiteRT-LM has models for.', file);
27
+ if (facts.npu !== request.npu)
28
+ return verdict('accelerator-unavailable', `This variant is built for the ${request.npu} NPU; this computer has ${facts.npu}.`, file);
29
+ }
30
+ if (!facts.build)
31
+ return verdict('engine-not-installed', 'LiteRT-LM is not installed on this computer.', file);
32
+ if (file && !file.backends.includes(backend))
33
+ return verdict('platform-unsupported', `This file runs on ${file.backends.join(', ') || 'no backend'}, not ${backend}.`, file);
34
+ const needs = file?.min_runtime_version ?? request.min_runtime_version ?? null;
35
+ if (needs && compareVersions(needs, facts.build.version) > 0)
36
+ return verdict('requires-newer-engine', `This model needs LiteRT-LM ${needs}; the installed one is ${facts.build.version}.`, file);
37
+ if (backend === 'npu' && !facts.openVinoPrepared)
38
+ return verdict('accelerator-not-prepared', 'OpenVINO is not prepared yet; prepare it on the LiteRT-LM page.', file);
39
+ return verdict('ok', null, file);
40
+ }
41
+ const VERSION_RE = /^\d+\.\d+(\.\d+)?$/;
42
+ const FIELDS = ['backend', 'npu', 'min_runtime_version', 'path', 'model_id'];
43
+ /** The request body, strictly: a variant, a path with its backend, or a model id. */
44
+ export function parseLiteRtLmCheckRequest(body) {
45
+ const invalid = (why) => {
46
+ throw new AtomicCoreError('INVALID_ARGUMENT', why);
47
+ };
48
+ if (typeof body !== 'object' || body === null || Array.isArray(body))
49
+ return invalid('The request body must be a JSON object.');
50
+ const record = body;
51
+ const extra = Object.keys(record).filter((key) => !FIELDS.some((field) => field === key));
52
+ if (extra.length > 0)
53
+ invalid(`The request has fields this core does not know: ${extra.sort().join(', ')}.`);
54
+ const out = {};
55
+ for (const key of FIELDS) {
56
+ const value = record[key];
57
+ if (value === undefined)
58
+ continue;
59
+ if (typeof value !== 'string' || value === '')
60
+ invalid(`${key} must be text.`);
61
+ out[key] = value;
62
+ }
63
+ if (out.min_runtime_version !== undefined && !VERSION_RE.test(out.min_runtime_version))
64
+ invalid('min_runtime_version must be X.Y or X.Y.Z.');
65
+ if (out.model_id !== undefined) {
66
+ if (Object.keys(out).length > 1)
67
+ invalid('model_id is checked alone: its variant comes from model.yml.');
68
+ return out;
69
+ }
70
+ if (out.backend === undefined)
71
+ invalid('backend is required for a variant or a file.');
72
+ return out;
73
+ }
74
+ export class LiteRtLmCheckService {
75
+ deps;
76
+ constructor(deps) {
77
+ this.deps = deps;
78
+ }
79
+ /** A path inside the models root, links resolved, or `INVALID_ARGUMENT`. */
80
+ async inRoot(path) {
81
+ const refuse = () => new AtomicCoreError('INVALID_ARGUMENT', 'path must be a file inside the LiteRT-LM models folder.');
82
+ if (!isAbsolute(path))
83
+ throw new AtomicCoreError('INVALID_ARGUMENT', 'path must be absolute.');
84
+ const root = await realpath(this.deps.modelsDir).catch(() => resolve(this.deps.modelsDir));
85
+ // A file that is not there yet is judged by its spelling; one that is, by where its links lead.
86
+ const full = await realpath(path).catch(() => resolve(path));
87
+ const rel = relative(root, full);
88
+ if (rel === '' || rel.startsWith('..') || isAbsolute(rel))
89
+ throw refuse();
90
+ return resolve(path);
91
+ }
92
+ async check(request) {
93
+ let variant = request;
94
+ let file = request.path !== undefined ? await this.inRoot(request.path) : null;
95
+ if (request.model_id !== undefined) {
96
+ const yml = await this.deps.registry.read(request.model_id);
97
+ const block = readLiteRtLmBlock(yml);
98
+ variant = { backend: block.backend, ...(block.npu ? { npu: block.npu } : {}) };
99
+ // The registry's own path: an installed model may be a link, which the runtime loads as it is.
100
+ file = this.deps.registry.resolvePaths(yml).modelPath;
101
+ }
102
+ const build = (await this.deps.resolveBuild()) ?? null;
103
+ const facts = {
104
+ platform: this.deps.platform,
105
+ build,
106
+ npu: await this.deps.npuGeneration(),
107
+ openVinoPrepared: (await this.deps.openVinoLibs()) !== undefined,
108
+ };
109
+ const metadata = file && build ? await this.deps.inspect(build.dir, file) : null;
110
+ return liteRtLmVerdict(facts, variant, metadata);
111
+ }
112
+ }
113
+ //# sourceMappingURL=check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check.js","sourceRoot":"","sources":["../../../src/runtime/litert-lm/check.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * The arguments of the hidden `litert-host` mode (openspec change `add-litert-lm-runtime`, task 5.1).
3
+ * Core is the only caller, so the parse is strict: anything unknown is a bug on core's side.
4
+ *
5
+ * litert-host probe --lib <build>
6
+ * litert-host inspect --lib <build> <file>
7
+ * litert-host serve --lib <build> --engine-version <v> --model <file> --backend cpu|gpu|npu
8
+ * --max-tokens <n> --port <p, 0 for any> --cache <dir> --id <model id>
9
+ * [--dispatch <dir> --ov-libs <dir>] [--speculative] [--reasoning]
10
+ */
11
+ export declare const LITERT_LM_BACKENDS: readonly ["cpu", "gpu", "npu"];
12
+ export type LiteRtLmBackend = (typeof LITERT_LM_BACKENDS)[number];
13
+ export type LiteRtHostArgs = {
14
+ mode: 'probe';
15
+ lib: string;
16
+ } | {
17
+ mode: 'inspect';
18
+ lib: string;
19
+ file: string;
20
+ } | {
21
+ mode: 'serve';
22
+ /** The build directory, holding `lib/`. */
23
+ lib: string;
24
+ /** The build's LiteRT-LM version, checked against the file's `min_runtime_version`. */
25
+ engineVersion: string;
26
+ model: string;
27
+ backend: LiteRtLmBackend;
28
+ /** The engine's `max_num_tokens`, already cut to what the file allows. */
29
+ maxTokens: number;
30
+ port: number;
31
+ /** The library's `cache_dir`; created when missing. */
32
+ cache: string;
33
+ /** The id `/v1/models` lists: core's session id. */
34
+ id: string;
35
+ /** NPU only: the build's `vendors/intel_openvino/dispatch`. */
36
+ dispatch?: string;
37
+ /** NPU only: the prepared OpenVINO libraries. */
38
+ ovLibs?: string;
39
+ /** Use the file's draft model when it has one. */
40
+ speculative: boolean;
41
+ /** Think by default (`model.yml` `reasoning`); a request may still turn it off. */
42
+ reasoning: boolean;
43
+ };
44
+ export declare class LiteRtHostUsageError extends Error {
45
+ constructor(message: string);
46
+ }
47
+ export declare function parseLiteRtHostArgs(argv: readonly string[]): LiteRtHostArgs;
@@ -0,0 +1,108 @@
1
+ /**
2
+ * The arguments of the hidden `litert-host` mode (openspec change `add-litert-lm-runtime`, task 5.1).
3
+ * Core is the only caller, so the parse is strict: anything unknown is a bug on core's side.
4
+ *
5
+ * litert-host probe --lib <build>
6
+ * litert-host inspect --lib <build> <file>
7
+ * litert-host serve --lib <build> --engine-version <v> --model <file> --backend cpu|gpu|npu
8
+ * --max-tokens <n> --port <p, 0 for any> --cache <dir> --id <model id>
9
+ * [--dispatch <dir> --ov-libs <dir>] [--speculative] [--reasoning]
10
+ */
11
+ import { parseArgs } from 'node:util';
12
+ export const LITERT_LM_BACKENDS = ['cpu', 'gpu', 'npu'];
13
+ export class LiteRtHostUsageError extends Error {
14
+ constructor(message) {
15
+ super(message);
16
+ this.name = 'LiteRtHostUsageError';
17
+ }
18
+ }
19
+ const required = (values, key) => {
20
+ const value = values[key];
21
+ if (typeof value !== 'string' || value === '')
22
+ throw new LiteRtHostUsageError(`--${key} is required`);
23
+ return value;
24
+ };
25
+ const VERSION_RE = /^\d+\.\d+\.\d+$/;
26
+ function wholeNumber(values, key, min, max) {
27
+ const raw = required(values, key);
28
+ const value = Number(raw);
29
+ if (!Number.isSafeInteger(value) || value < min || value > max)
30
+ throw new LiteRtHostUsageError(`--${key} ${raw} is not a whole number from ${min} to ${max}`);
31
+ return value;
32
+ }
33
+ export function parseLiteRtHostArgs(argv) {
34
+ const [mode, ...rest] = argv;
35
+ try {
36
+ if (mode === 'probe') {
37
+ const { values } = parseArgs({ args: rest, options: { lib: { type: 'string' } }, strict: true });
38
+ return { mode, lib: required(values, 'lib') };
39
+ }
40
+ if (mode === 'inspect') {
41
+ const { values, positionals } = parseArgs({
42
+ args: rest,
43
+ options: { lib: { type: 'string' } },
44
+ strict: true,
45
+ allowPositionals: true,
46
+ });
47
+ const lib = required(values, 'lib');
48
+ if (positionals.length !== 1 || !positionals[0])
49
+ throw new LiteRtHostUsageError('inspect takes one model file');
50
+ return { mode, lib, file: positionals[0] };
51
+ }
52
+ if (mode === 'serve') {
53
+ const { values } = parseArgs({
54
+ args: rest,
55
+ options: {
56
+ 'lib': { type: 'string' },
57
+ 'engine-version': { type: 'string' },
58
+ 'model': { type: 'string' },
59
+ 'backend': { type: 'string' },
60
+ 'max-tokens': { type: 'string' },
61
+ 'port': { type: 'string' },
62
+ 'cache': { type: 'string' },
63
+ 'id': { type: 'string' },
64
+ 'dispatch': { type: 'string' },
65
+ 'ov-libs': { type: 'string' },
66
+ 'speculative': { type: 'boolean' },
67
+ 'reasoning': { type: 'boolean' },
68
+ },
69
+ strict: true,
70
+ });
71
+ const lib = required(values, 'lib');
72
+ const engineVersion = required(values, 'engine-version');
73
+ if (!VERSION_RE.test(engineVersion))
74
+ throw new LiteRtHostUsageError(`--engine-version ${engineVersion} is not X.Y.Z`);
75
+ const backend = required(values, 'backend');
76
+ if (!LITERT_LM_BACKENDS.some((known) => known === backend))
77
+ throw new LiteRtHostUsageError(`--backend ${backend} is not cpu, gpu or npu`);
78
+ const dispatch = values['dispatch'];
79
+ const ovLibs = values['ov-libs'];
80
+ if (backend === 'npu' && (!dispatch || !ovLibs))
81
+ throw new LiteRtHostUsageError('--backend npu needs --dispatch and --ov-libs');
82
+ if (backend !== 'npu' && (dispatch !== undefined || ovLibs !== undefined))
83
+ throw new LiteRtHostUsageError('--dispatch and --ov-libs are only for --backend npu');
84
+ return {
85
+ mode,
86
+ lib,
87
+ engineVersion,
88
+ model: required(values, 'model'),
89
+ backend: backend,
90
+ maxTokens: wholeNumber(values, 'max-tokens', 1, 16_777_216),
91
+ port: wholeNumber(values, 'port', 0, 65535),
92
+ cache: required(values, 'cache'),
93
+ id: required(values, 'id'),
94
+ ...(dispatch ? { dispatch } : {}),
95
+ ...(ovLibs ? { ovLibs } : {}),
96
+ speculative: values['speculative'] === true,
97
+ reasoning: values['reasoning'] === true,
98
+ };
99
+ }
100
+ }
101
+ catch (error) {
102
+ if (error instanceof LiteRtHostUsageError)
103
+ throw error;
104
+ throw new LiteRtHostUsageError(error instanceof Error ? error.message : String(error));
105
+ }
106
+ throw new LiteRtHostUsageError(`litert-host: unknown mode ${JSON.stringify(mode ?? '')} (probe, inspect, serve)`);
107
+ }
108
+ //# sourceMappingURL=args.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"args.js","sourceRoot":"","sources":["../../../../src/runtime/litert-lm/host/args.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * `LiteRtLibrary` over `bun:ffi` — the second and last file in `src/` that may import `bun:*` (change
3
+ * `add-litert-lm-runtime`, design D1 and decision 3.6; allow-listed in both runtime-agnostic gates). It
4
+ * is imported dynamically by the `litert-host` mode alone, so the npm package still loads under Node.
5
+ *
6
+ * Streaming is the hard part (spike S2). The library calls a stream callback on a C++ thread of its
7
+ * own and frees the chunk as soon as the callback returns. A plain `JSCallback` cannot run there; a
8
+ * `threadsafe` one only queues the call, so the JS thread would read freed memory, and even with the
9
+ * chunk copied first Bun's threadsafe callbacks crashed about one run in five under a fast stream.
10
+ * So the callback is C: a shim compiled at start by the TinyCC built into Bun (`cc`) copies each chunk
11
+ * on the library's thread into a FIFO under a mutex, and JS drains the FIFO on a 2 ms timer that runs
12
+ * only while a generation is under way. The shim links nothing (`-nostdlib`: TinyCC finds no libc
13
+ * without development packages on Linux); `malloc` and the mutex come in as pointers from `dlsym`.
14
+ */
15
+ import type { LoadLiteRtLibrary } from './library.js';
16
+ export declare const loadBunLiteRtLibrary: LoadLiteRtLibrary;