@atomic-chat/core 0.17.0 → 0.18.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.
Files changed (166) hide show
  1. package/dist/app-daemon.js +9 -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 +10 -1
  7. package/dist/client/control-client.js +15 -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 +11 -0
  13. package/dist/config/paths.js.map +1 -1
  14. package/dist/contracts/engine-builds.d.ts +1 -1
  15. package/dist/contracts/engine-builds.js +1 -1
  16. package/dist/contracts/engine-builds.js.map +1 -1
  17. package/dist/contracts/engines.d.ts +1 -1
  18. package/dist/contracts/engines.js +2 -0
  19. package/dist/contracts/engines.js.map +1 -1
  20. package/dist/contracts/errors.d.ts +7 -1
  21. package/dist/contracts/errors.js.map +1 -1
  22. package/dist/contracts/events.d.ts +7 -0
  23. package/dist/contracts/foundry-local.d.ts +77 -0
  24. package/dist/contracts/foundry-local.js +17 -0
  25. package/dist/contracts/foundry-local.js.map +1 -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/model-yml.d.ts +28 -0
  30. package/dist/contracts/model-yml.js +11 -0
  31. package/dist/contracts/model-yml.js.map +1 -1
  32. package/dist/contracts/session.d.ts +5 -1
  33. package/dist/contracts/session.js.map +1 -1
  34. package/dist/contracts/settings.d.ts +5 -1
  35. package/dist/contracts/settings.js.map +1 -1
  36. package/dist/core/atomic-core.d.ts +1 -1
  37. package/dist/core/create.js +106 -5
  38. package/dist/core/create.js.map +1 -1
  39. package/dist/core/types.d.ts +9 -0
  40. package/dist/core/types.js.map +1 -1
  41. package/dist/diffusion/install.d.ts +0 -4
  42. package/dist/diffusion/install.js +5 -2
  43. package/dist/diffusion/install.js.map +1 -1
  44. package/dist/diffusion/server-process.d.ts +5 -2
  45. package/dist/diffusion/server-process.js +10 -2
  46. package/dist/diffusion/server-process.js.map +1 -1
  47. package/dist/downloads/archive.d.ts +1 -1
  48. package/dist/downloads/archive.js +2 -2
  49. package/dist/downloads/archive.js.map +1 -1
  50. package/dist/engine-builds/engines.d.ts +83 -0
  51. package/dist/engine-builds/engines.js +144 -0
  52. package/dist/engine-builds/engines.js.map +1 -0
  53. package/dist/engine-builds/foundry-local.d.ts +22 -0
  54. package/dist/engine-builds/foundry-local.js +100 -0
  55. package/dist/engine-builds/foundry-local.js.map +1 -0
  56. package/dist/engine-builds/manifest.d.ts +57 -6
  57. package/dist/engine-builds/manifest.js +109 -4
  58. package/dist/engine-builds/manifest.js.map +1 -1
  59. package/dist/engine-builds/order.d.ts +2 -1
  60. package/dist/engine-builds/order.js +11 -4
  61. package/dist/engine-builds/order.js.map +1 -1
  62. package/dist/engine-builds/select.d.ts +27 -0
  63. package/dist/engine-builds/select.js +45 -0
  64. package/dist/engine-builds/select.js.map +1 -1
  65. package/dist/engine-builds/service.d.ts +14 -15
  66. package/dist/engine-builds/service.js +68 -126
  67. package/dist/engine-builds/service.js.map +1 -1
  68. package/dist/engines/service.d.ts +6 -3
  69. package/dist/engines/service.js +6 -3
  70. package/dist/engines/service.js.map +1 -1
  71. package/dist/hardware/index.d.ts +1 -0
  72. package/dist/hardware/index.js +1 -0
  73. package/dist/hardware/index.js.map +1 -1
  74. package/dist/hardware/npu.d.ts +14 -0
  75. package/dist/hardware/npu.js +29 -0
  76. package/dist/hardware/npu.js.map +1 -0
  77. package/dist/integrations/detect.d.ts +2 -0
  78. package/dist/integrations/detect.js +4 -3
  79. package/dist/integrations/detect.js.map +1 -1
  80. package/dist/lock/instance-lock.js +5 -2
  81. package/dist/lock/instance-lock.js.map +1 -1
  82. package/dist/lock/process-identity.d.ts +9 -3
  83. package/dist/lock/process-identity.js +75 -9
  84. package/dist/lock/process-identity.js.map +1 -1
  85. package/dist/router/resolve.d.ts +2 -2
  86. package/dist/router/resolve.js +2 -1
  87. package/dist/router/resolve.js.map +1 -1
  88. package/dist/runtime/foundry-local/accelerators.d.ts +42 -0
  89. package/dist/runtime/foundry-local/accelerators.js +153 -0
  90. package/dist/runtime/foundry-local/accelerators.js.map +1 -0
  91. package/dist/runtime/foundry-local/check.d.ts +19 -0
  92. package/dist/runtime/foundry-local/check.js +69 -0
  93. package/dist/runtime/foundry-local/check.js.map +1 -0
  94. package/dist/runtime/foundry-local/host/args.d.ts +44 -0
  95. package/dist/runtime/foundry-local/host/args.js +109 -0
  96. package/dist/runtime/foundry-local/host/args.js.map +1 -0
  97. package/dist/runtime/foundry-local/host/execution-providers.d.ts +27 -0
  98. package/dist/runtime/foundry-local/host/execution-providers.js +43 -0
  99. package/dist/runtime/foundry-local/host/execution-providers.js.map +1 -0
  100. package/dist/runtime/foundry-local/host/ffi-bun.d.ts +17 -0
  101. package/dist/runtime/foundry-local/host/ffi-bun.js +256 -0
  102. package/dist/runtime/foundry-local/host/ffi-bun.js.map +1 -0
  103. package/dist/runtime/foundry-local/host/library.d.ts +61 -0
  104. package/dist/runtime/foundry-local/host/library.js +17 -0
  105. package/dist/runtime/foundry-local/host/library.js.map +1 -0
  106. package/dist/runtime/foundry-local/host/run.d.ts +54 -0
  107. package/dist/runtime/foundry-local/host/run.js +316 -0
  108. package/dist/runtime/foundry-local/host/run.js.map +1 -0
  109. package/dist/runtime/foundry-local/host-process.d.ts +78 -0
  110. package/dist/runtime/foundry-local/host-process.js +182 -0
  111. package/dist/runtime/foundry-local/host-process.js.map +1 -0
  112. package/dist/runtime/foundry-local/index.d.ts +11 -0
  113. package/dist/runtime/foundry-local/index.js +11 -0
  114. package/dist/runtime/foundry-local/index.js.map +1 -0
  115. package/dist/runtime/foundry-local/model-yml.d.ts +8 -0
  116. package/dist/runtime/foundry-local/model-yml.js +63 -0
  117. package/dist/runtime/foundry-local/model-yml.js.map +1 -0
  118. package/dist/runtime/foundry-local/runtime.d.ts +88 -0
  119. package/dist/runtime/foundry-local/runtime.js +321 -0
  120. package/dist/runtime/foundry-local/runtime.js.map +1 -0
  121. package/dist/runtime/llamacpp/args.d.ts +5 -0
  122. package/dist/runtime/llamacpp/args.js +7 -1
  123. package/dist/runtime/llamacpp/args.js.map +1 -1
  124. package/dist/runtime/llamacpp/errors.d.ts +1 -0
  125. package/dist/runtime/llamacpp/errors.js +10 -0
  126. package/dist/runtime/llamacpp/errors.js.map +1 -1
  127. package/dist/runtime/llamacpp/load-plan.d.ts +5 -0
  128. package/dist/runtime/llamacpp/load-plan.js +8 -0
  129. package/dist/runtime/llamacpp/load-plan.js.map +1 -1
  130. package/dist/runtime/llamacpp/runtime-device.d.ts +8 -0
  131. package/dist/runtime/llamacpp/runtime-device.js +9 -3
  132. package/dist/runtime/llamacpp/runtime-device.js.map +1 -1
  133. package/dist/runtime/llamacpp/runtime.d.ts +6 -1
  134. package/dist/runtime/llamacpp/runtime.js +19 -3
  135. package/dist/runtime/llamacpp/runtime.js.map +1 -1
  136. package/dist/runtime/managed-text/gateway.d.ts +2 -0
  137. package/dist/runtime/managed-text/gateway.js +1 -1
  138. package/dist/runtime/managed-text/gateway.js.map +1 -1
  139. package/dist/runtime/shared/external-sessions.js +1 -0
  140. package/dist/runtime/shared/external-sessions.js.map +1 -1
  141. package/dist/runtime/shared/process.d.ts +13 -1
  142. package/dist/runtime/shared/process.js +21 -12
  143. package/dist/runtime/shared/process.js.map +1 -1
  144. package/dist/server/control/router.js +2 -0
  145. package/dist/server/control/router.js.map +1 -1
  146. package/dist/server/control/routes/foundry-local.d.ts +10 -0
  147. package/dist/server/control/routes/foundry-local.js +42 -0
  148. package/dist/server/control/routes/foundry-local.js.map +1 -0
  149. package/dist/server/control/routes/models.js +3 -1
  150. package/dist/server/control/routes/models.js.map +1 -1
  151. package/dist/server/control/types.d.ts +17 -1
  152. package/dist/server/control/types.js.map +1 -1
  153. package/dist/server/http.js +2 -0
  154. package/dist/server/http.js.map +1 -1
  155. package/dist/server/public/errors.d.ts +1 -0
  156. package/dist/server/public/errors.js +18 -0
  157. package/dist/server/public/errors.js.map +1 -1
  158. package/dist/server/public/listing.js +1 -0
  159. package/dist/server/public/listing.js.map +1 -1
  160. package/dist/settings/schema/foundry-local.json +14 -0
  161. package/dist/settings/schema.js +8 -0
  162. package/dist/settings/schema.js.map +1 -1
  163. package/dist/version.d.ts +1 -1
  164. package/dist/version.js +1 -1
  165. package/package.json +2 -1
  166. package/src/settings/schema/foundry-local.json +14 -0
@@ -0,0 +1,316 @@
1
+ /**
2
+ * The hidden `foundry-host` mode of the core binaries (openspec change `add-foundry-local`, design D1):
3
+ * one process per model or command, so a crash of Microsoft's native library never takes the core
4
+ * down. Core starts it with `process.execPath`; nothing else should.
5
+ *
6
+ * Exit codes: 0 done; 2 usage (a bug on core's side); 3 the library does not load or speaks another
7
+ * C API; 4 a library call failed. Errors go to stderr as one line each; stdout carries JSON lines only.
8
+ */
9
+ import { existsSync } from 'node:fs';
10
+ import { open, readdir, rm, stat } from 'node:fs/promises';
11
+ import { join } from 'node:path';
12
+ import { FoundryHostUsageError, parseFoundryHostArgs } from './args.js';
13
+ import { describeDiscoverable, executionProvider } from './execution-providers.js';
14
+ import { FoundryLibraryError } from './library.js';
15
+ /** SIGTERM, SIGINT or the end of stdin, whichever comes first. */
16
+ export function watchStopSignals() {
17
+ let resolve = () => { };
18
+ const stopped = new Promise((done) => (resolve = done));
19
+ const stop = () => resolve();
20
+ process.on('SIGTERM', stop);
21
+ process.on('SIGINT', stop);
22
+ process.stdin.on('end', stop);
23
+ process.stdin.on('close', stop);
24
+ process.stdin.resume();
25
+ return {
26
+ stopped,
27
+ dispose() {
28
+ process.off('SIGTERM', stop);
29
+ process.off('SIGINT', stop);
30
+ process.stdin.off('end', stop);
31
+ process.stdin.off('close', stop);
32
+ process.stdin.pause();
33
+ process.stdin.destroy();
34
+ },
35
+ };
36
+ }
37
+ /** Where the built-in server serves models registered in the local catalog (spike finding 7). */
38
+ export const LOCAL_CATALOG_BASE_PATH = '/catalogs/local';
39
+ /** Reads what `foundry_local_<date>.log` files under `logsDir` gained since the reader was made. */
40
+ export function logTailReader() {
41
+ const offsets = new Map();
42
+ let primed = false;
43
+ const files = async (dir) => (await readdir(dir).catch(() => [])).filter((name) => /^foundry_local.*\.log$/.test(name));
44
+ return async (logsDir) => {
45
+ if (!primed) {
46
+ primed = true;
47
+ for (const name of await files(logsDir))
48
+ offsets.set(name, (await stat(join(logsDir, name)).catch(() => ({ size: 0 }))).size);
49
+ }
50
+ let text = '';
51
+ for (const name of await files(logsDir)) {
52
+ const path = join(logsDir, name);
53
+ const size = (await stat(path).catch(() => ({ size: 0 }))).size;
54
+ const from = Math.min(offsets.get(name) ?? 0, size);
55
+ if (size > from) {
56
+ const handle = await open(path, 'r');
57
+ try {
58
+ const buffer = Buffer.alloc(Math.min(size - from, 256 * 1024));
59
+ await handle.read(buffer, 0, buffer.length, size - buffer.length);
60
+ text += buffer.toString('utf8');
61
+ }
62
+ finally {
63
+ await handle.close();
64
+ }
65
+ }
66
+ offsets.set(name, size);
67
+ }
68
+ return text;
69
+ };
70
+ }
71
+ /**
72
+ * The library's own words for why `name` was not registered: the last warning or error that names the
73
+ * accelerator or its family (`cuda` for `CUDAExecutionProvider`), not the generic summary line.
74
+ */
75
+ export function failureReason(log, name) {
76
+ const family = name.replace(/ExecutionProvider$/, '').toLowerCase();
77
+ const lines = log
78
+ .split(/\r?\n/)
79
+ .filter((line) => /\[(warning|error)\]/i.test(line))
80
+ .filter((line) => !/Failed to download or register EP/i.test(line))
81
+ .filter((line) => line.includes(name) || line.toLowerCase().includes(family));
82
+ const last = lines.at(-1);
83
+ if (!last)
84
+ return null;
85
+ const blocked = /failed to load '([^']+)' \(4551\)/.exec(last);
86
+ if (blocked)
87
+ return appControlBlocked(blocked[1] ?? '', family);
88
+ return last.replace(/^\[[^\]]*\]\s*\[[^\]]*\]\s*/, '').trim();
89
+ }
90
+ /**
91
+ * Windows' 4551 (`ERROR_SYSTEM_INTEGRITY_POLICY_VIOLATION`): Smart App Control or an organization's
92
+ * app control policy refused a library without a signature. Microsoft's CUDA bundle ships
93
+ * `onnxruntime-genai-cuda.dll` unsigned, so on a laptop with Smart App Control on the whole bundle
94
+ * downloads and then cannot load. The person can act on this, not on the path and the code.
95
+ */
96
+ const ACCELERATOR_LABELS = {
97
+ cuda: 'CUDA',
98
+ webgpu: 'WebGPU',
99
+ openvino: 'OpenVINO',
100
+ nvtensorrtrtx: 'TensorRT-RTX',
101
+ qnn: 'QNN',
102
+ };
103
+ function appControlBlocked(path, family) {
104
+ const file = path.split(/[\\/]/).at(-1) || 'a library';
105
+ const accelerator = ACCELERATOR_LABELS[family] ?? family;
106
+ return (`Windows blocked ${file}, a library of Microsoft's ${accelerator} accelerator that has no digital signature: ` +
107
+ "Smart App Control or your organization's app control policy does not let unsigned libraries load. " +
108
+ `To use ${accelerator}, turn Smart App Control off in Windows Security → App & browser control → ` +
109
+ 'Smart App Control settings (Windows cannot turn it back on without a reset), or on a managed PC ask your ' +
110
+ 'administrator to allow it; then press Retry. Models on WebGPU and CPU run without it.');
111
+ }
112
+ /** Line-oriented output over a stream-oriented CLI io: one JSON or error line per call. */
113
+ export function lineIo(io) {
114
+ return { stdout: (line) => io.stdout(`${line}\n`), stderr: (line) => io.stderr(`${line}\n`) };
115
+ }
116
+ /** The name the library reports itself under (telemetry, logs). */
117
+ export const FOUNDRY_HOST_APP_NAME = 'atomic-chat';
118
+ const json = (value) => JSON.stringify(value);
119
+ /** `<build>/lib` when the build has one (release archives do), else the folder itself. */
120
+ export function libraryDir(build, exists = existsSync) {
121
+ return exists(join(build, 'lib')) ? join(build, 'lib') : build;
122
+ }
123
+ /** Opens the library through `bun:ffi`; under Node this mode cannot run, and says so. */
124
+ export const loadLibraryWithBun = async (libDir) => {
125
+ let module;
126
+ try {
127
+ module = await import('./ffi-bun.js');
128
+ }
129
+ catch (error) {
130
+ throw new FoundryLibraryError('load', 0, `foundry-host runs inside the compiled atomic-chat-core binaries only (${error instanceof Error ? error.message : String(error)})`);
131
+ }
132
+ return module.loadBunFoundryLibrary(libDir);
133
+ };
134
+ function openManager(library, args, extra) {
135
+ return library.createManager({
136
+ appName: FOUNDRY_HOST_APP_NAME,
137
+ appDataDir: args.appData,
138
+ logsDir: args.logs,
139
+ modelCacheDir: extra.cache,
140
+ webServiceEndpoints: extra.endpoints,
141
+ // Design D8: the optional telemetry off; `ProcessInfo` still goes, and is disclosed.
142
+ additionalOptions: { DisableNonessentialTelemetry: 'true' },
143
+ });
144
+ }
145
+ function close(manager) {
146
+ try {
147
+ manager.shutdown();
148
+ }
149
+ finally {
150
+ manager.release();
151
+ }
152
+ }
153
+ async function probe(library, args, deps) {
154
+ const manager = openManager(library, args, { cache: join(args.appData, 'cache'), endpoints: [] });
155
+ try {
156
+ const accelerators = manager.discoverableEps().map((ep) => ({
157
+ name: ep.name,
158
+ ...describeDiscoverable(ep.name),
159
+ prepared: args.prepared.includes(ep.name),
160
+ }));
161
+ deps.stdout(json({ c_api_version: library.cApiVersion, version: library.version, accelerators }));
162
+ }
163
+ finally {
164
+ close(manager);
165
+ }
166
+ }
167
+ /**
168
+ * The accelerators the library downloads from Microsoft's CDN and reports on the calling thread,
169
+ * synchronously (spike findings 2, 15). Every other one comes through Windows ML, which reported
170
+ * nothing on a machine that already had it (finding 16) and, on a first install on a Core Ultra
171
+ * laptop, called back from a thread of its own; it gets no callback and reports a start and an end.
172
+ */
173
+ const CDN_ACCELERATORS = new Set([
174
+ 'CUDAExecutionProvider',
175
+ 'WebGpuExecutionProvider',
176
+ 'WebGPUExecutionProvider',
177
+ ]);
178
+ /**
179
+ * Task 5.2: each accelerator on its own `Manager_DownloadAndRegisterEps` call, so one failure never
180
+ * cancels the others and each gets its own reason. Lines: `{accelerator, stage, fraction}` with
181
+ * `stage` started → downloading* → done | failed; Windows ML accelerators report no downloading lines
182
+ * at all (spike finding 16), and a failed one has `fraction: null` (rulings R6). Last line: the summary.
183
+ */
184
+ async function prepare(library, args, deps) {
185
+ const readLog = deps.readLogTail ?? logTailReader();
186
+ await readLog(args.logs);
187
+ const manager = openManager(library, args, { cache: join(args.appData, 'cache'), endpoints: [] });
188
+ const summary = [];
189
+ try {
190
+ const offered = manager.discoverableEps().map((ep) => ep.name);
191
+ const wanted = args.accelerators.length > 0 ? args.accelerators : offered;
192
+ for (const name of wanted) {
193
+ if (!offered.includes(name)) {
194
+ summary.push({ name, prepared: false, reason: `This computer does not offer ${name}.` });
195
+ continue;
196
+ }
197
+ deps.stdout(json({ accelerator: name, stage: 'started', fraction: 0 }));
198
+ let thrown = null;
199
+ try {
200
+ // The callback goes only where the library calls it on this thread: Windows ML reported a first
201
+ // install from a thread of its own, and Bun's plain callback called there failed the prepare.
202
+ manager.downloadAndRegisterEps([name], CDN_ACCELERATORS.has(name)
203
+ ? (_label, percent) => deps.stdout(json({ accelerator: name, stage: 'downloading', fraction: Math.min(1, percent / 100) }))
204
+ : undefined);
205
+ }
206
+ catch (error) {
207
+ thrown = error instanceof Error ? error.message : String(error);
208
+ }
209
+ const registered = manager.discoverableEps().some((ep) => ep.name === name && ep.registered);
210
+ if (registered) {
211
+ deps.stdout(json({ accelerator: name, stage: 'done', fraction: 1 }));
212
+ summary.push({ name, prepared: true });
213
+ }
214
+ else {
215
+ const reason = thrown ?? failureReason(await readLog(args.logs), name) ?? `Foundry Local did not register ${name}.`;
216
+ deps.stdout(json({ accelerator: name, stage: 'failed', fraction: null, reason }));
217
+ summary.push({ name, prepared: false, reason });
218
+ }
219
+ }
220
+ deps.stdout(json({ done: true, accelerators: summary }));
221
+ }
222
+ finally {
223
+ close(manager);
224
+ }
225
+ }
226
+ /**
227
+ * Task 5.3: register the variant's accelerator (prepared only — nothing is downloaded here), register
228
+ * the folder in this host's own catalog with the accelerator named explicitly, load, start the
229
+ * built-in server on the loopback port core chose, print the readiness line, and on stop shut the
230
+ * library down and delete the catalog cache. Exit 5: the accelerator is not prepared.
231
+ */
232
+ async function serve(library, args, deps) {
233
+ const ep = executionProvider(args.ep);
234
+ const removeDir = deps.removeDir ?? ((path) => rm(path, { recursive: true, force: true }));
235
+ const watch = (deps.watchStop ?? watchStopSignals)();
236
+ const manager = openManager(library, args, {
237
+ cache: args.cache,
238
+ endpoints: [`http://127.0.0.1:${args.port}`],
239
+ });
240
+ try {
241
+ if (ep.register) {
242
+ manager.downloadAndRegisterEps([ep.register]);
243
+ if (!manager.discoverableEps().some((found) => found.name === ep.register && found.registered)) {
244
+ deps.stderr(`${ep.register} is not prepared on this computer; prepare it before loading this model.`);
245
+ return 5;
246
+ }
247
+ }
248
+ const reasoning = args.reasoningStart !== undefined && args.reasoningEnd !== undefined;
249
+ const model = manager.registerLocalModel(args.model, args.id, {
250
+ strings: {
251
+ task: 'chat-completion',
252
+ execution_provider: ep.metadata,
253
+ ...(reasoning
254
+ ? { reasoning_start: args.reasoningStart, reasoning_end: args.reasoningEnd }
255
+ : {}),
256
+ },
257
+ ints: {
258
+ supports_tool_calling: args.tools ? 1 : 0,
259
+ supports_reasoning: reasoning ? 1 : 0,
260
+ ...(args.contextLength !== undefined ? { context_length: args.contextLength } : {}),
261
+ },
262
+ });
263
+ model.load();
264
+ const [url] = manager.webServiceStart();
265
+ deps.stdout(json({
266
+ ready: true,
267
+ url: url ?? `http://127.0.0.1:${args.port}`,
268
+ base_path: LOCAL_CATALOG_BASE_PATH,
269
+ model_id: args.id,
270
+ execution_provider: model.executionProvider(),
271
+ }));
272
+ await watch.stopped;
273
+ return 0;
274
+ }
275
+ finally {
276
+ try {
277
+ close(manager);
278
+ }
279
+ finally {
280
+ watch.dispose();
281
+ await removeDir(args.cache).catch(() => { });
282
+ }
283
+ }
284
+ }
285
+ export async function runFoundryHost(argv, deps) {
286
+ let args;
287
+ try {
288
+ args = parseFoundryHostArgs(argv);
289
+ }
290
+ catch (error) {
291
+ deps.stderr(error instanceof FoundryHostUsageError ? error.message : String(error));
292
+ return 2;
293
+ }
294
+ let library;
295
+ try {
296
+ library = await deps.loadLibrary(libraryDir(args.lib));
297
+ }
298
+ catch (error) {
299
+ deps.stderr(`foundry_local does not load from ${args.lib}: ${error instanceof Error ? error.message : String(error)}`);
300
+ return 3;
301
+ }
302
+ try {
303
+ if (args.mode === 'probe')
304
+ await probe(library, args, deps);
305
+ else if (args.mode === 'prepare')
306
+ await prepare(library, args, deps);
307
+ else
308
+ return await serve(library, args, deps);
309
+ return 0;
310
+ }
311
+ catch (error) {
312
+ deps.stderr(error instanceof Error ? error.message : String(error));
313
+ return 4;
314
+ }
315
+ }
316
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../../src/runtime/foundry-local/host/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * The core's side of the `foundry-host` protocol (openspec change `add-foundry-local`, design D1):
3
+ * the host is this very binary in a hidden mode, started with `process.execPath`, so a crash of
4
+ * Microsoft's native library never takes the core down. `probe` loads the library of one build and
5
+ * prints one JSON line: the C API version and the accelerators it finds, prepared or not.
6
+ */
7
+ /** How to start `foundry-host`: `[execPath, script?]` + `foundry-host`, or a test stand-in. */
8
+ export interface FoundryHostCommand {
9
+ exe: string;
10
+ args: string[];
11
+ }
12
+ export interface FoundryHostAccelerator {
13
+ name: string;
14
+ /** The conf spelling (`cuda`, `openvino`…); `null` for one this core runs no variant on. */
15
+ execution_provider?: string | null;
16
+ device: string;
17
+ prepared: boolean;
18
+ }
19
+ export interface FoundryHostProbeResult {
20
+ c_api_version: number;
21
+ /** The library's own version string. */
22
+ version?: string;
23
+ accelerators: FoundryHostAccelerator[];
24
+ }
25
+ /** What `probe` and `prepare` run against. */
26
+ export interface FoundryHostTarget {
27
+ /** The build directory. */
28
+ libDir: string;
29
+ /** The library's data, shared by every build (`<data>/foundry-local/runtime`). */
30
+ appDataDir: string;
31
+ /** The library's logs (`<data>/foundry-local/logs`); the host refuses to run without them. */
32
+ logsDir: string;
33
+ /** The accelerators core recorded as prepared (the library cannot tell, rulings R6). */
34
+ prepared?: readonly string[];
35
+ }
36
+ /** The first run of a freshly unpacked library is scanned by Gatekeeper / Defender. */
37
+ export declare const FOUNDRY_HOST_PROBE_TIMEOUT_MS = 60000;
38
+ /**
39
+ * `foundry-host probe --lib <libDir> --app-data <appDataDir>`. Throws `ENGINE_INSTALL_FAILED` with
40
+ * what the host printed when it exits non-zero, prints no answer or does not answer in time.
41
+ */
42
+ export declare function runFoundryHostProbe(command: FoundryHostCommand, target: FoundryHostTarget, options?: {
43
+ env?: NodeJS.ProcessEnv;
44
+ timeoutMs?: number;
45
+ }): Promise<FoundryHostProbeResult>;
46
+ /**
47
+ * Test hook only, the same kind as `ATOMIC_MANAGED_TEST_HOST`: an executable that stands in for
48
+ * `atomic-chat-core foundry-host` in the e2e suite, where no real Foundry Local library exists.
49
+ * Production never sets it.
50
+ */
51
+ export declare const FOUNDRY_HOST_TEST_COMMAND_ENV = "ATOMIC_FOUNDRY_HOST_TEST_COMMAND";
52
+ /**
53
+ * This binary in its `foundry-host` mode: `process.execPath` (inside a compiled Bun binary that is
54
+ * the binary; under a runtime, the runtime plus the entry script, as `selfCommand` in the CLI does).
55
+ */
56
+ export declare function foundryHostCommand(env: Record<string, string | undefined>, argv?: readonly string[], execPath?: string): FoundryHostCommand;
57
+ /** One accelerator's step, as `foundry-host prepare` prints it (task 5.2). */
58
+ export interface FoundryHostPrepareStep {
59
+ accelerator: string;
60
+ stage: 'started' | 'downloading' | 'done' | 'failed';
61
+ fraction: number | null;
62
+ reason?: string;
63
+ }
64
+ export interface FoundryHostPrepareSummary {
65
+ accelerators: Array<{
66
+ name: string;
67
+ prepared: boolean;
68
+ reason?: string;
69
+ }>;
70
+ }
71
+ /**
72
+ * `foundry-host prepare --lib --app-data --logs [names…]`: each step to `onStep` as it happens, the
73
+ * summary as the result. No timeout: a CUDA plugin is 2 GB (rulings S2). A host that exits non-zero
74
+ * or prints no summary is `FOUNDRY_LOCAL_HOST_ERROR` with what it said.
75
+ */
76
+ export declare function runFoundryHostPrepare(command: FoundryHostCommand, target: Omit<FoundryHostTarget, 'prepared'>, names: readonly string[], onStep: (step: FoundryHostPrepareStep) => void, options?: {
77
+ env?: NodeJS.ProcessEnv;
78
+ }): Promise<FoundryHostPrepareSummary>;
@@ -0,0 +1,182 @@
1
+ /**
2
+ * The core's side of the `foundry-host` protocol (openspec change `add-foundry-local`, design D1):
3
+ * the host is this very binary in a hidden mode, started with `process.execPath`, so a crash of
4
+ * Microsoft's native library never takes the core down. `probe` loads the library of one build and
5
+ * prints one JSON line: the C API version and the accelerators it finds, prepared or not.
6
+ */
7
+ import { spawn } from 'node:child_process';
8
+ import { AtomicCoreError } from '../../contracts/index.js';
9
+ /** The first run of a freshly unpacked library is scanned by Gatekeeper / Defender. */
10
+ export const FOUNDRY_HOST_PROBE_TIMEOUT_MS = 60_000;
11
+ const OUTPUT_LIMIT = 64 * 1024;
12
+ function parseProbeLine(line) {
13
+ let raw;
14
+ try {
15
+ raw = JSON.parse(line);
16
+ }
17
+ catch {
18
+ return null;
19
+ }
20
+ if (raw === null || typeof raw !== 'object' || Array.isArray(raw))
21
+ return null;
22
+ const { c_api_version, version, accelerators } = raw;
23
+ if (typeof c_api_version !== 'number' || !Array.isArray(accelerators))
24
+ return null;
25
+ const out = [];
26
+ for (const item of accelerators) {
27
+ if (item === null || typeof item !== 'object')
28
+ return null;
29
+ const { name, device, prepared, execution_provider } = item;
30
+ if (typeof name !== 'string' || typeof device !== 'string' || typeof prepared !== 'boolean')
31
+ return null;
32
+ out.push({
33
+ name,
34
+ ...(typeof execution_provider === 'string' || execution_provider === null
35
+ ? { execution_provider }
36
+ : {}),
37
+ device,
38
+ prepared,
39
+ });
40
+ }
41
+ return { c_api_version, ...(typeof version === 'string' ? { version } : {}), accelerators: out };
42
+ }
43
+ /**
44
+ * `foundry-host probe --lib <libDir> --app-data <appDataDir>`. Throws `ENGINE_INSTALL_FAILED` with
45
+ * what the host printed when it exits non-zero, prints no answer or does not answer in time.
46
+ */
47
+ export function runFoundryHostProbe(command, target, options = {}) {
48
+ const args = [
49
+ ...command.args,
50
+ 'probe',
51
+ '--lib',
52
+ target.libDir,
53
+ '--app-data',
54
+ target.appDataDir,
55
+ '--logs',
56
+ target.logsDir,
57
+ ...(target.prepared ?? []).flatMap((name) => ['--prepared', name]),
58
+ ];
59
+ return new Promise((resolve, reject) => {
60
+ const child = spawn(command.exe, args, {
61
+ env: options.env ?? process.env,
62
+ stdio: ['ignore', 'pipe', 'pipe'],
63
+ windowsHide: true,
64
+ });
65
+ let stdout = '';
66
+ let stderr = '';
67
+ const keep = (buffer, chunk) => (buffer + chunk.toString('utf8')).slice(-OUTPUT_LIMIT);
68
+ child.stdout.on('data', (chunk) => (stdout = keep(stdout, chunk)));
69
+ child.stderr.on('data', (chunk) => (stderr = keep(stderr, chunk)));
70
+ const timeoutMs = options.timeoutMs ?? FOUNDRY_HOST_PROBE_TIMEOUT_MS;
71
+ const timer = setTimeout(() => {
72
+ child.kill('SIGKILL');
73
+ reject(new AtomicCoreError('ENGINE_INSTALL_FAILED', 'The Foundry Local host did not answer.', `probe of ${target.libDir} timed out after ${Math.round(timeoutMs / 1000)}s`));
74
+ }, timeoutMs);
75
+ child.on('error', (error) => {
76
+ clearTimeout(timer);
77
+ reject(new AtomicCoreError('ENGINE_INSTALL_FAILED', 'The Foundry Local host could not be started.', String(error)));
78
+ });
79
+ child.on('close', (code, signal) => {
80
+ clearTimeout(timer);
81
+ const answer = stdout
82
+ .split(/\r?\n/)
83
+ .reverse()
84
+ .map((line) => line.trim())
85
+ .filter(Boolean)
86
+ .map(parseProbeLine)
87
+ .find((parsed) => parsed !== null);
88
+ if (code === 0 && answer)
89
+ return resolve(answer);
90
+ const status = code !== null ? `exit code ${code}` : `signal ${String(signal)}`;
91
+ reject(new AtomicCoreError('ENGINE_INSTALL_FAILED', 'The Foundry Local library does not load on this computer.', `${status}\n${[...(stderr || stdout)].slice(-800).join('')}`.trim()));
92
+ });
93
+ });
94
+ }
95
+ /**
96
+ * Test hook only, the same kind as `ATOMIC_MANAGED_TEST_HOST`: an executable that stands in for
97
+ * `atomic-chat-core foundry-host` in the e2e suite, where no real Foundry Local library exists.
98
+ * Production never sets it.
99
+ */
100
+ export const FOUNDRY_HOST_TEST_COMMAND_ENV = 'ATOMIC_FOUNDRY_HOST_TEST_COMMAND';
101
+ /**
102
+ * This binary in its `foundry-host` mode: `process.execPath` (inside a compiled Bun binary that is
103
+ * the binary; under a runtime, the runtime plus the entry script, as `selfCommand` in the CLI does).
104
+ */
105
+ export function foundryHostCommand(env, argv = process.argv, execPath = process.execPath) {
106
+ const stand = env[FOUNDRY_HOST_TEST_COMMAND_ENV]?.trim();
107
+ if (stand)
108
+ return { exe: stand, args: [] };
109
+ const script = argv[1];
110
+ const viaRuntime = script !== undefined && /\.(c|m)?[jt]s$/.test(script);
111
+ return { exe: execPath, args: [...(viaRuntime ? [script] : []), 'foundry-host'] };
112
+ }
113
+ function parseStep(raw) {
114
+ const { accelerator, stage, fraction, reason } = raw;
115
+ if (typeof accelerator !== 'string')
116
+ return null;
117
+ if (stage !== 'started' && stage !== 'downloading' && stage !== 'done' && stage !== 'failed')
118
+ return null;
119
+ if (fraction !== null && typeof fraction !== 'number')
120
+ return null;
121
+ return { accelerator, stage, fraction, ...(typeof reason === 'string' ? { reason } : {}) };
122
+ }
123
+ /**
124
+ * `foundry-host prepare --lib --app-data --logs [names…]`: each step to `onStep` as it happens, the
125
+ * summary as the result. No timeout: a CUDA plugin is 2 GB (rulings S2). A host that exits non-zero
126
+ * or prints no summary is `FOUNDRY_LOCAL_HOST_ERROR` with what it said.
127
+ */
128
+ export function runFoundryHostPrepare(command, target, names, onStep, options = {}) {
129
+ const args = [
130
+ ...command.args,
131
+ 'prepare',
132
+ '--lib',
133
+ target.libDir,
134
+ '--app-data',
135
+ target.appDataDir,
136
+ '--logs',
137
+ target.logsDir,
138
+ ...names,
139
+ ];
140
+ return new Promise((resolve, reject) => {
141
+ const child = spawn(command.exe, args, {
142
+ env: options.env ?? process.env,
143
+ stdio: ['ignore', 'pipe', 'pipe'],
144
+ windowsHide: true,
145
+ });
146
+ let summary = null;
147
+ let stderr = '';
148
+ child.stderr.on('data', (chunk) => (stderr = (stderr + chunk.toString('utf8')).slice(-OUTPUT_LIMIT)));
149
+ let pending = '';
150
+ child.stdout.on('data', (chunk) => {
151
+ pending += chunk.toString('utf8');
152
+ const lines = pending.split(/\r?\n/);
153
+ pending = lines.pop() ?? '';
154
+ for (const line of lines) {
155
+ let raw;
156
+ try {
157
+ raw = JSON.parse(line);
158
+ }
159
+ catch {
160
+ continue;
161
+ }
162
+ if (raw === null || typeof raw !== 'object' || Array.isArray(raw))
163
+ continue;
164
+ const record = raw;
165
+ if (record['done'] === true && Array.isArray(record['accelerators'])) {
166
+ summary = { accelerators: record['accelerators'] };
167
+ continue;
168
+ }
169
+ const step = parseStep(record);
170
+ if (step)
171
+ onStep(step);
172
+ }
173
+ });
174
+ child.on('error', (error) => reject(new AtomicCoreError('FOUNDRY_LOCAL_HOST_ERROR', 'The Foundry Local host could not be started.', String(error))));
175
+ child.on('close', (code) => {
176
+ if (code === 0 && summary)
177
+ return resolve(summary);
178
+ reject(new AtomicCoreError('FOUNDRY_LOCAL_HOST_ERROR', 'The Foundry Local host could not prepare the accelerators.', `exit code ${String(code)}\n${[...stderr].slice(-800).join('')}`.trim()));
179
+ });
180
+ });
181
+ }
182
+ //# sourceMappingURL=host-process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-process.js","sourceRoot":"","sources":["../../../src/runtime/foundry-local/host-process.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * The `foundry-local` provider (openspec change `add-foundry-local`): the core's side of the
3
+ * `foundry-host` protocol for now; the runtime, the host mode and the accelerators follow.
4
+ */
5
+ export * from './host-process.js';
6
+ export * from './model-yml.js';
7
+ export { lineIo, loadLibraryWithBun, runFoundryHost } from './host/run.js';
8
+ export type { FoundryHostDeps } from './host/run.js';
9
+ export * from './runtime.js';
10
+ export * from './accelerators.js';
11
+ export * from './check.js';
@@ -0,0 +1,11 @@
1
+ /**
2
+ * The `foundry-local` provider (openspec change `add-foundry-local`): the core's side of the
3
+ * `foundry-host` protocol for now; the runtime, the host mode and the accelerators follow.
4
+ */
5
+ export * from './host-process.js';
6
+ export * from './model-yml.js';
7
+ export { lineIo, loadLibraryWithBun, runFoundryHost } from './host/run.js';
8
+ export * from './runtime.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/foundry-local/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,cAAc,mBAAmB,CAAA;AACjC,cAAc,gBAAgB,CAAA;AAC9B,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAE1E,cAAc,cAAc,CAAA;AAC5B,cAAc,mBAAmB,CAAA;AACjC,cAAc,YAAY,CAAA"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * The `foundry_local` block of a Foundry Local model's `model.yml` (openspec change
3
+ * `add-foundry-local`, task 6.2). The core never writes it — the app's installer does — and reads it
4
+ * strictly: an accelerator or device this core does not know is a variant it cannot run
5
+ * (`FOUNDRY_LOCAL_VARIANT_UNSUPPORTED`), anything else malformed is a broken file (`MODEL_LOAD_FAILED`).
6
+ */
7
+ import type { ModelYmlFoundryLocal } from '../../contracts/index.js';
8
+ export declare function readFoundryLocalBlock(doc: Record<string, unknown>): ModelYmlFoundryLocal;