@atomic-chat/core 0.17.0 → 0.18.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app-daemon.js +7 -0
- package/dist/app-daemon.js.map +1 -1
- package/dist/backend/advisor/advisor.d.ts +6 -1
- package/dist/backend/advisor/advisor.js +69 -7
- package/dist/backend/advisor/advisor.js.map +1 -1
- package/dist/backend/catalog/prism-manifest.d.ts +2 -0
- package/dist/backend/catalog/prism-manifest.js +3 -2
- package/dist/backend/catalog/prism-manifest.js.map +1 -1
- package/dist/cli/main.d.ts +1 -1
- package/dist/cli/main.js +5 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/client/control-client.d.ts +10 -1
- package/dist/client/control-client.js +15 -0
- package/dist/client/control-client.js.map +1 -1
- package/dist/cloud/registry.js +1 -0
- package/dist/cloud/registry.js.map +1 -1
- package/dist/config/paths.d.ts +4 -0
- package/dist/config/paths.js +11 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/contracts/backend-advisor.d.ts +12 -0
- package/dist/contracts/engine-builds.d.ts +1 -1
- package/dist/contracts/engine-builds.js +1 -1
- package/dist/contracts/engine-builds.js.map +1 -1
- package/dist/contracts/engines.d.ts +1 -1
- package/dist/contracts/engines.js +2 -0
- package/dist/contracts/engines.js.map +1 -1
- package/dist/contracts/errors.d.ts +13 -2
- package/dist/contracts/errors.js.map +1 -1
- package/dist/contracts/events.d.ts +7 -0
- package/dist/contracts/foundry-local.d.ts +77 -0
- package/dist/contracts/foundry-local.js +17 -0
- package/dist/contracts/foundry-local.js.map +1 -0
- package/dist/contracts/index.d.ts +1 -0
- package/dist/contracts/index.js +1 -0
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/model-yml.d.ts +28 -0
- package/dist/contracts/model-yml.js +11 -0
- package/dist/contracts/model-yml.js.map +1 -1
- package/dist/contracts/session.d.ts +5 -1
- package/dist/contracts/session.js.map +1 -1
- package/dist/contracts/settings.d.ts +5 -1
- package/dist/contracts/settings.js.map +1 -1
- package/dist/core/atomic-core.d.ts +1 -1
- package/dist/core/create.js +106 -5
- package/dist/core/create.js.map +1 -1
- package/dist/core/types.d.ts +9 -0
- package/dist/core/types.js.map +1 -1
- package/dist/diffusion/install.d.ts +0 -4
- package/dist/diffusion/install.js +5 -2
- package/dist/diffusion/install.js.map +1 -1
- package/dist/diffusion/server-process.d.ts +5 -2
- package/dist/diffusion/server-process.js +10 -2
- package/dist/diffusion/server-process.js.map +1 -1
- package/dist/downloads/archive.d.ts +1 -1
- package/dist/downloads/archive.js +2 -2
- package/dist/downloads/archive.js.map +1 -1
- package/dist/engine-builds/engines.d.ts +83 -0
- package/dist/engine-builds/engines.js +144 -0
- package/dist/engine-builds/engines.js.map +1 -0
- package/dist/engine-builds/foundry-local.d.ts +22 -0
- package/dist/engine-builds/foundry-local.js +100 -0
- package/dist/engine-builds/foundry-local.js.map +1 -0
- package/dist/engine-builds/manifest.d.ts +57 -6
- package/dist/engine-builds/manifest.js +109 -4
- package/dist/engine-builds/manifest.js.map +1 -1
- package/dist/engine-builds/order.d.ts +2 -1
- package/dist/engine-builds/order.js +11 -4
- package/dist/engine-builds/order.js.map +1 -1
- package/dist/engine-builds/select.d.ts +27 -0
- package/dist/engine-builds/select.js +45 -0
- package/dist/engine-builds/select.js.map +1 -1
- package/dist/engine-builds/service.d.ts +14 -15
- package/dist/engine-builds/service.js +68 -126
- package/dist/engine-builds/service.js.map +1 -1
- package/dist/engines/service.d.ts +6 -3
- package/dist/engines/service.js +6 -3
- package/dist/engines/service.js.map +1 -1
- package/dist/hardware/index.d.ts +1 -0
- package/dist/hardware/index.js +1 -0
- package/dist/hardware/index.js.map +1 -1
- package/dist/hardware/npu.d.ts +14 -0
- package/dist/hardware/npu.js +29 -0
- package/dist/hardware/npu.js.map +1 -0
- package/dist/host/recipes/executor-io-windows.d.ts +11 -0
- package/dist/host/recipes/executor-io-windows.js +23 -5
- package/dist/host/recipes/executor-io-windows.js.map +1 -1
- package/dist/integrations/detect.d.ts +2 -0
- package/dist/integrations/detect.js +4 -3
- package/dist/integrations/detect.js.map +1 -1
- package/dist/lock/instance-lock.js +5 -2
- package/dist/lock/instance-lock.js.map +1 -1
- package/dist/lock/process-identity.d.ts +9 -3
- package/dist/lock/process-identity.js +75 -9
- package/dist/lock/process-identity.js.map +1 -1
- package/dist/router/resolve.d.ts +2 -2
- package/dist/router/resolve.js +2 -1
- package/dist/router/resolve.js.map +1 -1
- package/dist/runtime/foundry-local/accelerators.d.ts +42 -0
- package/dist/runtime/foundry-local/accelerators.js +153 -0
- package/dist/runtime/foundry-local/accelerators.js.map +1 -0
- package/dist/runtime/foundry-local/check.d.ts +19 -0
- package/dist/runtime/foundry-local/check.js +69 -0
- package/dist/runtime/foundry-local/check.js.map +1 -0
- package/dist/runtime/foundry-local/foundry-host.d.ts +18 -0
- package/dist/runtime/foundry-local/foundry-host.js +23 -0
- package/dist/runtime/foundry-local/foundry-host.js.map +1 -0
- package/dist/runtime/foundry-local/host/args.d.ts +44 -0
- package/dist/runtime/foundry-local/host/args.js +109 -0
- package/dist/runtime/foundry-local/host/args.js.map +1 -0
- package/dist/runtime/foundry-local/host/execution-providers.d.ts +27 -0
- package/dist/runtime/foundry-local/host/execution-providers.js +43 -0
- package/dist/runtime/foundry-local/host/execution-providers.js.map +1 -0
- package/dist/runtime/foundry-local/host/ffi-bun.d.ts +17 -0
- package/dist/runtime/foundry-local/host/ffi-bun.js +256 -0
- package/dist/runtime/foundry-local/host/ffi-bun.js.map +1 -0
- package/dist/runtime/foundry-local/host/library.d.ts +61 -0
- package/dist/runtime/foundry-local/host/library.js +17 -0
- package/dist/runtime/foundry-local/host/library.js.map +1 -0
- package/dist/runtime/foundry-local/host/run.d.ts +54 -0
- package/dist/runtime/foundry-local/host/run.js +316 -0
- package/dist/runtime/foundry-local/host/run.js.map +1 -0
- package/dist/runtime/foundry-local/host-process.d.ts +81 -0
- package/dist/runtime/foundry-local/host-process.js +185 -0
- package/dist/runtime/foundry-local/host-process.js.map +1 -0
- package/dist/runtime/foundry-local/index.d.ts +10 -0
- package/dist/runtime/foundry-local/index.js +10 -0
- package/dist/runtime/foundry-local/index.js.map +1 -0
- package/dist/runtime/foundry-local/model-yml.d.ts +8 -0
- package/dist/runtime/foundry-local/model-yml.js +63 -0
- package/dist/runtime/foundry-local/model-yml.js.map +1 -0
- package/dist/runtime/foundry-local/runtime.d.ts +88 -0
- package/dist/runtime/foundry-local/runtime.js +321 -0
- package/dist/runtime/foundry-local/runtime.js.map +1 -0
- package/dist/runtime/llamacpp/args.d.ts +5 -0
- package/dist/runtime/llamacpp/args.js +7 -1
- package/dist/runtime/llamacpp/args.js.map +1 -1
- package/dist/runtime/llamacpp/errors.d.ts +1 -0
- package/dist/runtime/llamacpp/errors.js +10 -0
- package/dist/runtime/llamacpp/errors.js.map +1 -1
- package/dist/runtime/llamacpp/load-plan.d.ts +5 -0
- package/dist/runtime/llamacpp/load-plan.js +8 -0
- package/dist/runtime/llamacpp/load-plan.js.map +1 -1
- package/dist/runtime/llamacpp/runtime-device.d.ts +8 -0
- package/dist/runtime/llamacpp/runtime-device.js +9 -3
- package/dist/runtime/llamacpp/runtime-device.js.map +1 -1
- package/dist/runtime/llamacpp/runtime.d.ts +6 -1
- package/dist/runtime/llamacpp/runtime.js +19 -3
- package/dist/runtime/llamacpp/runtime.js.map +1 -1
- package/dist/runtime/managed-text/gateway.d.ts +2 -0
- package/dist/runtime/managed-text/gateway.js +1 -1
- package/dist/runtime/managed-text/gateway.js.map +1 -1
- package/dist/runtime/shared/external-sessions.js +1 -0
- package/dist/runtime/shared/external-sessions.js.map +1 -1
- package/dist/runtime/shared/process.d.ts +13 -1
- package/dist/runtime/shared/process.js +21 -12
- package/dist/runtime/shared/process.js.map +1 -1
- package/dist/server/control/router.js +2 -0
- package/dist/server/control/router.js.map +1 -1
- package/dist/server/control/routes/foundry-local.d.ts +10 -0
- package/dist/server/control/routes/foundry-local.js +42 -0
- package/dist/server/control/routes/foundry-local.js.map +1 -0
- package/dist/server/control/routes/models.js +6 -3
- package/dist/server/control/routes/models.js.map +1 -1
- package/dist/server/control/types.d.ts +17 -1
- package/dist/server/control/types.js.map +1 -1
- package/dist/server/http.js +45 -7
- package/dist/server/http.js.map +1 -1
- package/dist/server/public/errors.d.ts +1 -0
- package/dist/server/public/errors.js +18 -0
- package/dist/server/public/errors.js.map +1 -1
- package/dist/server/public/listing.js +1 -0
- package/dist/server/public/listing.js.map +1 -1
- package/dist/settings/public.d.ts +7 -0
- package/dist/settings/public.js +8 -0
- package/dist/settings/public.js.map +1 -0
- package/dist/settings/schema/foundry-local.json +14 -0
- package/dist/settings/schema.js +8 -0
- package/dist/settings/schema.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +11 -3
- package/src/settings/schema/atomic-prism.json +0 -433
- package/src/settings/schema/foundation-models.json +0 -1
- package/src/settings/schema/llamacpp-upstream.json +0 -498
- package/src/settings/schema/llamacpp.json +0 -475
- package/src/settings/schema/mlx.json +0 -136
- package/src/settings/schema/sglang.json +0 -251
- package/src/settings/schema/tensorrt-llm.json +0 -253
- package/src/settings/schema/vllm.json +0 -273
|
@@ -0,0 +1,185 @@
|
|
|
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
|
+
* That binary may be a program embedding the core as a library (`atc`): it must hand an `argv` of
|
|
105
|
+
* `foundry-host …` to `runFoundryHostMain` (`@atomic-chat/core/foundry-host`) before its own commands,
|
|
106
|
+
* as the core binaries do (change close-cli-core-gaps, design D1).
|
|
107
|
+
*/
|
|
108
|
+
export function foundryHostCommand(env, argv = process.argv, execPath = process.execPath) {
|
|
109
|
+
const stand = env[FOUNDRY_HOST_TEST_COMMAND_ENV]?.trim();
|
|
110
|
+
if (stand)
|
|
111
|
+
return { exe: stand, args: [] };
|
|
112
|
+
const script = argv[1];
|
|
113
|
+
const viaRuntime = script !== undefined && /\.(c|m)?[jt]s$/.test(script);
|
|
114
|
+
return { exe: execPath, args: [...(viaRuntime ? [script] : []), 'foundry-host'] };
|
|
115
|
+
}
|
|
116
|
+
function parseStep(raw) {
|
|
117
|
+
const { accelerator, stage, fraction, reason } = raw;
|
|
118
|
+
if (typeof accelerator !== 'string')
|
|
119
|
+
return null;
|
|
120
|
+
if (stage !== 'started' && stage !== 'downloading' && stage !== 'done' && stage !== 'failed')
|
|
121
|
+
return null;
|
|
122
|
+
if (fraction !== null && typeof fraction !== 'number')
|
|
123
|
+
return null;
|
|
124
|
+
return { accelerator, stage, fraction, ...(typeof reason === 'string' ? { reason } : {}) };
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* `foundry-host prepare --lib --app-data --logs [names…]`: each step to `onStep` as it happens, the
|
|
128
|
+
* summary as the result. No timeout: a CUDA plugin is 2 GB (rulings S2). A host that exits non-zero
|
|
129
|
+
* or prints no summary is `FOUNDRY_LOCAL_HOST_ERROR` with what it said.
|
|
130
|
+
*/
|
|
131
|
+
export function runFoundryHostPrepare(command, target, names, onStep, options = {}) {
|
|
132
|
+
const args = [
|
|
133
|
+
...command.args,
|
|
134
|
+
'prepare',
|
|
135
|
+
'--lib',
|
|
136
|
+
target.libDir,
|
|
137
|
+
'--app-data',
|
|
138
|
+
target.appDataDir,
|
|
139
|
+
'--logs',
|
|
140
|
+
target.logsDir,
|
|
141
|
+
...names,
|
|
142
|
+
];
|
|
143
|
+
return new Promise((resolve, reject) => {
|
|
144
|
+
const child = spawn(command.exe, args, {
|
|
145
|
+
env: options.env ?? process.env,
|
|
146
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
147
|
+
windowsHide: true,
|
|
148
|
+
});
|
|
149
|
+
let summary = null;
|
|
150
|
+
let stderr = '';
|
|
151
|
+
child.stderr.on('data', (chunk) => (stderr = (stderr + chunk.toString('utf8')).slice(-OUTPUT_LIMIT)));
|
|
152
|
+
let pending = '';
|
|
153
|
+
child.stdout.on('data', (chunk) => {
|
|
154
|
+
pending += chunk.toString('utf8');
|
|
155
|
+
const lines = pending.split(/\r?\n/);
|
|
156
|
+
pending = lines.pop() ?? '';
|
|
157
|
+
for (const line of lines) {
|
|
158
|
+
let raw;
|
|
159
|
+
try {
|
|
160
|
+
raw = JSON.parse(line);
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
if (raw === null || typeof raw !== 'object' || Array.isArray(raw))
|
|
166
|
+
continue;
|
|
167
|
+
const record = raw;
|
|
168
|
+
if (record['done'] === true && Array.isArray(record['accelerators'])) {
|
|
169
|
+
summary = { accelerators: record['accelerators'] };
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
const step = parseStep(record);
|
|
173
|
+
if (step)
|
|
174
|
+
onStep(step);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
child.on('error', (error) => reject(new AtomicCoreError('FOUNDRY_LOCAL_HOST_ERROR', 'The Foundry Local host could not be started.', String(error))));
|
|
178
|
+
child.on('close', (code) => {
|
|
179
|
+
if (code === 0 && summary)
|
|
180
|
+
return resolve(summary);
|
|
181
|
+
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()));
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
//# 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,10 @@
|
|
|
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 type { FoundryHostDeps } from './host/run.js';
|
|
8
|
+
export * from './runtime.js';
|
|
9
|
+
export * from './accelerators.js';
|
|
10
|
+
export * from './check.js';
|
|
@@ -0,0 +1,10 @@
|
|
|
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 * from './runtime.js';
|
|
8
|
+
export * from './accelerators.js';
|
|
9
|
+
export * from './check.js';
|
|
10
|
+
//# 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;AAE9B,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;
|
|
@@ -0,0 +1,63 @@
|
|
|
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 { AtomicCoreError, FOUNDRY_LOCAL_DEVICES, FOUNDRY_LOCAL_EXECUTION_PROVIDERS, } from '../../contracts/index.js';
|
|
8
|
+
const broken = (why) => new AtomicCoreError('MODEL_LOAD_FAILED', `model.yml: foundry_local ${why}.`);
|
|
9
|
+
const text = (block, key) => {
|
|
10
|
+
const value = block[key];
|
|
11
|
+
if (typeof value !== 'string' || value.trim() === '')
|
|
12
|
+
throw broken(`has no ${key}`);
|
|
13
|
+
return value;
|
|
14
|
+
};
|
|
15
|
+
const optionalText = (block, key) => {
|
|
16
|
+
const value = block[key];
|
|
17
|
+
if (value === undefined)
|
|
18
|
+
return undefined;
|
|
19
|
+
if (typeof value !== 'string' || value === '')
|
|
20
|
+
throw broken(`has a ${key} that is not text`);
|
|
21
|
+
return value;
|
|
22
|
+
};
|
|
23
|
+
const flag = (block, key) => {
|
|
24
|
+
const value = block[key];
|
|
25
|
+
if (value === undefined)
|
|
26
|
+
return false;
|
|
27
|
+
if (typeof value !== 'boolean')
|
|
28
|
+
throw broken(`has a ${key} that is not true or false`);
|
|
29
|
+
return value;
|
|
30
|
+
};
|
|
31
|
+
export function readFoundryLocalBlock(doc) {
|
|
32
|
+
const raw = doc['foundry_local'];
|
|
33
|
+
if (raw === null || typeof raw !== 'object' || Array.isArray(raw))
|
|
34
|
+
throw broken('is missing');
|
|
35
|
+
const block = raw;
|
|
36
|
+
const executionProvider = text(block, 'execution_provider');
|
|
37
|
+
if (!FOUNDRY_LOCAL_EXECUTION_PROVIDERS.some((known) => known === executionProvider))
|
|
38
|
+
throw new AtomicCoreError('FOUNDRY_LOCAL_VARIANT_UNSUPPORTED', `This core does not run Foundry Local variants on the "${executionProvider}" accelerator.`);
|
|
39
|
+
const device = text(block, 'device');
|
|
40
|
+
if (!FOUNDRY_LOCAL_DEVICES.some((known) => known === device))
|
|
41
|
+
throw new AtomicCoreError('FOUNDRY_LOCAL_VARIANT_UNSUPPORTED', `This core does not run Foundry Local variants on a "${device}" device.`);
|
|
42
|
+
const context = block['context_length'];
|
|
43
|
+
if (context !== undefined && (typeof context !== 'number' || !Number.isSafeInteger(context) || context < 1))
|
|
44
|
+
throw broken('has a context_length that is not a positive whole number');
|
|
45
|
+
const assetId = optionalText(block, 'asset_id');
|
|
46
|
+
const assetVersion = optionalText(block, 'asset_version');
|
|
47
|
+
const reasoningStart = optionalText(block, 'reasoning_start');
|
|
48
|
+
const reasoningEnd = optionalText(block, 'reasoning_end');
|
|
49
|
+
return {
|
|
50
|
+
model_id: text(block, 'model_id'),
|
|
51
|
+
variant_id: text(block, 'variant_id'),
|
|
52
|
+
execution_provider: executionProvider,
|
|
53
|
+
device: device,
|
|
54
|
+
...(assetId !== undefined ? { asset_id: assetId } : {}),
|
|
55
|
+
...(assetVersion !== undefined ? { asset_version: assetVersion } : {}),
|
|
56
|
+
...(context !== undefined ? { context_length: context } : {}),
|
|
57
|
+
tools: flag(block, 'tools'),
|
|
58
|
+
reasoning: flag(block, 'reasoning'),
|
|
59
|
+
...(reasoningStart !== undefined ? { reasoning_start: reasoningStart } : {}),
|
|
60
|
+
...(reasoningEnd !== undefined ? { reasoning_end: reasoningEnd } : {}),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=model-yml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-yml.js","sourceRoot":"","sources":["../../../src/runtime/foundry-local/model-yml.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `foundry-local` provider's sessions (openspec change `add-foundry-local`, task 6.3, design D5):
|
|
3
|
+
* one `foundry-host serve` process per model — this very binary in its hidden mode — on the sidecar
|
|
4
|
+
* table MLX and Foundation Models use, behind the session gateway the managed engines use.
|
|
5
|
+
*
|
|
6
|
+
* load = model.yml → the variant runs on this platform → its accelerator is prepared → the active
|
|
7
|
+
* build → [GPU claim, for CUDA and WebGPU] → host on a random loopback port → readiness
|
|
8
|
+
* line → gateway (key + Host) → session on the gateway's port
|
|
9
|
+
*
|
|
10
|
+
* Foundry Local's built-in server has no authentication and serves the local catalog under
|
|
11
|
+
* `/catalogs/local` with models named `<name>:<version>` (spike, rulings S1 finding 7): the gateway
|
|
12
|
+
* holds the key, adds the prefix and renames the model both ways, so a client sees the core's model id.
|
|
13
|
+
*/
|
|
14
|
+
import type { ModelYmlFoundryLocal, SessionInfo, UnloadResult } from '../../contracts/index.js';
|
|
15
|
+
import type { DataLayout } from '../../config/index.js';
|
|
16
|
+
import type { EngineHost } from '../../engine-builds/service.js';
|
|
17
|
+
import type { ProcessJournal } from '../../lock/index.js';
|
|
18
|
+
import type { ModelRegistry } from '../../models/index.js';
|
|
19
|
+
import type { ManagedRoute } from '../managed-text/index.js';
|
|
20
|
+
import type { CtxIncreaseResult, EmitFn, GpuClaimHook, GpuOccupancy, LocalLoadOptions, LocalRuntime, RecreateResult, SessionRoutePolicy } from '../shared/index.js';
|
|
21
|
+
import { spawnAndAwaitReady } from '../shared/index.js';
|
|
22
|
+
import type { BackendOutputSink } from '../shared/index.js';
|
|
23
|
+
import type { FoundryHostCommand } from './host-process.js';
|
|
24
|
+
/** The settings' `timeout` default, in seconds: registering, building the ORT session, compiling (OpenVINO). */
|
|
25
|
+
export declare const FOUNDRY_LOCAL_DEFAULT_TIMEOUT_SECS = 600;
|
|
26
|
+
/** What a Foundry Local session serves (design D5); anything else is refused before it reaches the host. */
|
|
27
|
+
export declare const FOUNDRY_LOCAL_ROUTES: readonly ManagedRoute[];
|
|
28
|
+
/**
|
|
29
|
+
* The accelerators each platform runs variants on (spec "Провайдер регистрируется только на
|
|
30
|
+
* поддерживаемых платформах"). Which of them this machine actually has is the probe's answer (6.4).
|
|
31
|
+
*/
|
|
32
|
+
export declare function variantRunsOn(platform: NodeJS.Platform, arch: string, ep: ModelYmlFoundryLocal['execution_provider']): boolean;
|
|
33
|
+
/** The registration id the host serves the model under: `<name>:<version>`, one segment. */
|
|
34
|
+
export declare function registrationId(modelId: string): string;
|
|
35
|
+
export interface FoundryLocalRuntimeOptions {
|
|
36
|
+
layout: DataLayout;
|
|
37
|
+
registry: ModelRegistry;
|
|
38
|
+
instanceId: string;
|
|
39
|
+
platform: NodeJS.Platform;
|
|
40
|
+
arch: string;
|
|
41
|
+
/** This binary in its `foundry-host` mode (`foundryHostCommand`). */
|
|
42
|
+
hostCommand: FoundryHostCommand;
|
|
43
|
+
/** The active build's directory (engine-builds), or nothing installed. */
|
|
44
|
+
resolveBuild: () => Promise<string | undefined>;
|
|
45
|
+
/** The accelerators core recorded as prepared (`accelerators.json`, task 6.4). */
|
|
46
|
+
preparedAccelerators: () => Promise<readonly string[]>;
|
|
47
|
+
/** The same live trusted-hosts list `:1337` and the managed gateways use. */
|
|
48
|
+
trustedHosts: string[];
|
|
49
|
+
/** The `foundry-local` provider settings, re-read per load. */
|
|
50
|
+
readSettings: () => Promise<Record<string, unknown>>;
|
|
51
|
+
journal?: ProcessJournal | undefined;
|
|
52
|
+
emit?: EmitFn;
|
|
53
|
+
baseEnv?: NodeJS.ProcessEnv;
|
|
54
|
+
backendOutput?: BackendOutputSink;
|
|
55
|
+
log?: (level: 'debug' | 'info' | 'warn' | 'error', message: string) => void;
|
|
56
|
+
/** GPU residency (spec `gpu-residency`): CUDA and WebGPU variants hold every card. */
|
|
57
|
+
claimGpu?: GpuClaimHook | undefined;
|
|
58
|
+
/** Test seam. */
|
|
59
|
+
spawn?: typeof spawnAndAwaitReady;
|
|
60
|
+
}
|
|
61
|
+
export declare class FoundryLocalRuntime implements LocalRuntime {
|
|
62
|
+
private readonly options;
|
|
63
|
+
private readonly table;
|
|
64
|
+
private readonly emit;
|
|
65
|
+
/** Loads past their GPU claim and not yet a session. */
|
|
66
|
+
private readonly claimed;
|
|
67
|
+
/** The `foundry-local` model registry this runtime reads (`<data>/foundry-local/models`). */
|
|
68
|
+
get registry(): ModelRegistry;
|
|
69
|
+
constructor(options: FoundryLocalRuntimeOptions);
|
|
70
|
+
list(): SessionInfo[];
|
|
71
|
+
findSession(modelId: string): SessionInfo | undefined;
|
|
72
|
+
getLoadedModels(): string[];
|
|
73
|
+
isLoading(modelId: string): boolean;
|
|
74
|
+
/** CUDA and WebGPU sessions hold every card (the library picks one we cannot name); NPU and CPU none. */
|
|
75
|
+
gpuOccupancy(): GpuOccupancy[];
|
|
76
|
+
/** What the engine-builds module needs: the load queue, and the builds sessions run from (design D2). */
|
|
77
|
+
engineHost(): EngineHost;
|
|
78
|
+
routePolicy(modelId: string): SessionRoutePolicy | undefined;
|
|
79
|
+
load(modelId: string, opts?: LocalLoadOptions): Promise<SessionInfo>;
|
|
80
|
+
private start;
|
|
81
|
+
private startHost;
|
|
82
|
+
/** Waits for the host to exit (spec "Выгрузка"); the gateway goes with it. */
|
|
83
|
+
unload(modelId: string): Promise<UnloadResult>;
|
|
84
|
+
/** The context is the variant's own: nothing to grow. */
|
|
85
|
+
autoIncreaseCtx(modelId: string): Promise<CtxIncreaseResult>;
|
|
86
|
+
recreateSession(modelId: string): Promise<RecreateResult>;
|
|
87
|
+
shutdown(): Promise<void>;
|
|
88
|
+
}
|