mirror of
https://github.com/Ark0N/Codeman.git
synced 2026-11-15 10:59:32 +01:00
feat(local-model): contract for the install stage (types, stubs, fake runtime)
The types, the module skeletons and the test fake that let the runtime, the install job and the window be built at the same time. Types: - src/types/local-model-install.ts (new): the runtime pin, the install states, steps and error codes with one sentence and one next step each, the progress, the `install` object of GET /api/local-model, the bodies and 409 answers of the install verbs, the state file. `LocalModelStatus` moves here; `install` is optional until the route emits it. - src/types/local-model.ts: the catalogue row's Mac memory figures, the measured speed of a tested entry, the `measured` budget source, `RecommendOptions`, and the row tag, the coding agents and the install total of a candidate. All optional until the catalogue and `recommend()` carry them, so the read-only stage keeps compiling and its tests stay green. Modules with final signatures and bodies that throw: runtime.ts (the compiled pin is final), ollama-client.ts, developer-tools.ts, state-store.ts, install-job.ts (the state, step and transition tables are final), connect.ts, custom-model-hosts-writer.ts, cli-install-runner.ts. Nothing imports them yet, so the server is unchanged. Implemented: paths.ts (every folder of the feature, from dataPath()), and `modelFitsBudget()` in recommend.ts, the judgement the job makes with the measured budget before it downloads a model. `recommend()` takes the options parameter and does not read it yet. Test fake: test/fixtures/fake-ollama.ts, a runtime on a port the system picks, in the shapes measured on a Mac: version, tags, ps, the pull stream (MLX and GGUF lines, an error line, a cut stream, a resumed pull), chat with and without a tool call, the model list, a runtime archive with Range support, and a fake child process that logs the device total. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
1 parent
66ca92f7cf
commit
771072c36b
17 files changed
+3770
-23
No files matched your search
@@ -0,0 +1,42 @@
|
||||
/**
|
||||
* @fileoverview Whether this Mac has the developer tools a coding agent calls (git, Python).
|
||||
*
|
||||
* CONTRACT STAGE: the function below has its final signature and a body that throws; the body
|
||||
* is written next.
|
||||
*
|
||||
* Why it exists: on a Mac without Xcode or the Command Line Tools, `git` and `python3` are
|
||||
* stubs that open macOS's "install the command line developer tools" window. A coding agent
|
||||
* runs both, so the install window says one honest sentence when the tools are missing
|
||||
* (`LOCAL_MODEL_INSTALL_LABELS.developerToolsMissing`).
|
||||
*
|
||||
* Rules:
|
||||
* - The ONLY command ever run is `/usr/bin/xcode-select -p`, bounded by a timeout. Never
|
||||
* `git`, `python3`, `xcrun` or anything else that would open that window itself.
|
||||
* - macOS only. Anywhere else, and when the command does not answer in time, the answer is
|
||||
* `unknown`, and nothing is said.
|
||||
* - Never throws. The answer is cached for a short while, so a window that polls once a
|
||||
* second does not spawn once a second.
|
||||
*/
|
||||
|
||||
import type { LocalModelDeveloperTools } from '../types.js';
|
||||
|
||||
/** Marks a body the contract stage left unwritten. */
|
||||
function notImplemented(what: string, ..._args: unknown[]): never {
|
||||
throw new Error(`${what} is not implemented yet`);
|
||||
}
|
||||
|
||||
/** How long `/usr/bin/xcode-select -p` may take. */
|
||||
export const DEVELOPER_TOOLS_TIMEOUT_MS = 2_000;
|
||||
|
||||
/** What the check calls. Each member defaults to the real thing; a test injects its own. */
|
||||
export interface DeveloperToolsDeps {
|
||||
/** Default `process.platform`. */
|
||||
platform: string;
|
||||
/** Runs `file` with `args` and resolves with its exit code (`null` when it timed out or could not be started). */
|
||||
run: (file: string, args: readonly string[], timeoutMs: number) => Promise<number | null>;
|
||||
}
|
||||
|
||||
/** `present` when `/usr/bin/xcode-select -p` exits 0, `missing` when it exits with anything else, `unknown` otherwise. */
|
||||
export async function checkDeveloperTools(deps: Partial<DeveloperToolsDeps> = {}): Promise<LocalModelDeveloperTools> {
|
||||
return notImplemented('checkDeveloperTools', deps);
|
||||
}
|
||||
Reference in new issue
Block a user