@tuned-tensor/local 0.1.9 → 0.2.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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,17 @@
2
2
 
3
3
  All notable changes to TT Local will be documented in this file.
4
4
 
5
+ ## 0.2.0 - 2026-07-04
6
+
7
+ ### Added
8
+
9
+ - Added a hybrid local state store: `metadata.sqlite` now indexes specs, runs,
10
+ run events, and models for CLI/dashboard queries while preserving the
11
+ transparent JSON/JSONL artifact layout. `tt-local store rebuild-index`
12
+ rebuilds SQLite metadata from canonical per-object files. The SQLite index
13
+ uses `better-sqlite3` instead of Node's experimental built-in SQLite API,
14
+ avoiding runtime experimental warnings on Node 22.
15
+
5
16
  ## 0.1.9 - 2026-07-03
6
17
 
7
18
  ### Added
package/README.md CHANGED
@@ -1,419 +1,30 @@
1
1
  # TT Local
2
2
 
3
- Tuning tensors locally.
4
-
5
3
  [![CI](https://github.com/tunedtensor/tuned-tensor-local/actions/workflows/ci.yml/badge.svg)](https://github.com/tunedtensor/tuned-tensor-local/actions/workflows/ci.yml)
6
4
  [![npm](https://img.shields.io/npm/v/@tuned-tensor/local)](https://www.npmjs.com/package/@tuned-tensor/local)
7
5
 
8
- TT Local is a standalone CLI for running Tuned Tensor-style
9
- fine-tuning jobs on a machine you control. It stores specs, datasets, model
10
- artifacts, progress events, reports, and dashboard state on local disk.
11
-
12
- It does not require the hosted Tuned Tensor CLI, cloud orchestration, Docker,
13
- or a managed database.
14
-
15
- ## What Happens In A Run
6
+ TT Local runs Tuned Tensor-style fine-tuning jobs on your own machine. It keeps
7
+ specs, datasets, model artifacts, events, reports, and dashboard state on local
8
+ disk.
16
9
 
17
- `tt-local` runs this loop:
10
+ Usage docs:
18
11
 
19
- 1. Read a behavior spec from `tunedtensor.json`.
20
- 2. Compile examples into a local training dataset.
21
- 3. Evaluate the original Hugging Face base model.
22
- 4. Fine-tune locally with uv, Transformers, and PEFT.
23
- 5. Evaluate the fine-tuned Hugging Face/PEFT artifact.
24
- 6. Compare baseline vs tuned outputs and write a report.
25
-
26
- OpenRouter can optionally score generated outputs as an LLM judge. It does not
27
- generate the baseline or tuned responses.
12
+ https://tunedtensor.com/docs/local-training
28
13
 
29
14
  ## Install
30
15
 
31
- Install the published CLI:
32
-
33
16
  ```bash
34
17
  npm install -g @tuned-tensor/local
35
18
  tt-local info
36
19
  ```
37
20
 
38
- For local development or Spark:
39
-
40
- ```bash
41
- git clone https://github.com/tunedtensor/tuned-tensor-local.git
42
- cd tuned-tensor-local
43
- npm install
44
- npm run build
45
- npm link
46
- tt-local info
47
- ```
48
-
49
21
  Real training also needs `uv`:
50
22
 
51
23
  ```bash
52
24
  uv --version
53
25
  ```
54
26
 
55
- If uv is missing:
56
-
57
- ```bash
58
- curl -LsSf https://astral.sh/uv/install.sh | sh
59
- ```
60
-
61
- ## First Run: Safe Dry Run
62
-
63
- The included example config is a dry run. It validates the end-to-end local
64
- workflow and writes artifacts without downloading models or starting GPU
65
- training.
66
-
67
- Create a local behavior spec:
68
-
69
- ```bash
70
- tt-local init --name "Support Bot" --model Qwen/Qwen3.5-2B
71
- ```
72
-
73
- Edit `tunedtensor.json` and replace the placeholder example with your task:
74
-
75
- ```json
76
- {
77
- "input": "Classify sentiment: I love this product.",
78
- "output": "positive"
79
- }
80
- ```
81
-
82
- Validate the spec and config:
83
-
84
- ```bash
85
- tt-local validate --config examples/local-runner.json
86
- ```
87
-
88
- Run the dry workflow:
89
-
90
- ```bash
91
- tt-local run --config examples/local-runner.json
92
- ```
93
-
94
- Inspect the result:
95
-
96
- ```bash
97
- tt-local runs list --config examples/local-runner.json
98
- tt-local runs report <run-id> --config examples/local-runner.json
99
- ```
100
-
101
- Start the local dashboard:
102
-
103
- ```bash
104
- tt-local serve --config examples/local-runner.json
105
- ```
106
-
107
- Open the printed local URL in your browser.
108
-
109
- ## Run Real Training
110
-
111
- Create a config such as `local-runner.json` or `spark-runner.json`:
112
-
113
- ```json
114
- {
115
- "artifactRoot": "/home/eve/tt-local-artifacts",
116
- "storeRoot": "/home/eve/tt-local-store",
117
- "dryRun": false,
118
- "training": {
119
- "backend": "uv",
120
- "project": "training/sft-local",
121
- "script": "training/sft-local/src/train.py"
122
- },
123
- "evaluation": {
124
- "inference": {
125
- "provider": "transformers",
126
- "project": "training/sft-local",
127
- "script": "training/sft-local/src/evaluate.py",
128
- "maxNewTokens": 256,
129
- "temperature": 0,
130
- "topP": 1
131
- },
132
- "scoring": {
133
- "mode": "llm_judge",
134
- "fallback": "exact_match"
135
- },
136
- "maxExamples": 10
137
- },
138
- "paths": {
139
- "modelCache": "/home/eve/.cache/huggingface"
140
- }
141
- }
142
- ```
143
-
144
- If you use OpenRouter judging, set an API key:
145
-
146
- ```bash
147
- export OPENROUTER_API_KEY="your_openrouter_key"
148
- ```
149
-
150
- `tt-local` also loads a `.env` file from the working directory. Existing
151
- environment variables win.
152
-
153
- Run the job:
154
-
155
- ```bash
156
- tt-local doctor --config spark-runner.json
157
- tt-local validate --config spark-runner.json
158
- tt-local run --config spark-runner.json
159
- ```
160
-
161
- `tt-local run` prints live stage updates to stderr and writes the final JSON
162
- summary to stdout. Use `--verbose` to stream Python subprocess output, or
163
- `--quiet` for JSON-only automation.
164
-
165
- Watch progress:
166
-
167
- ```bash
168
- tt-local runs watch <run-id> --config spark-runner.json
169
- ```
170
-
171
- View the final report:
172
-
173
- ```bash
174
- tt-local runs report <run-id> --config spark-runner.json
175
- ```
176
-
177
- Compare two completed runs:
178
-
179
- ```bash
180
- tt-local runs compare <run-id-a> <run-id-b> --config spark-runner.json
181
- ```
182
-
183
- The comparison aligns shared eval prompts, separates newly added eval examples,
184
- and measures judge score noise for identical baseline outputs.
185
-
186
- ## Configuration Basics
187
-
188
- The main config fields are:
189
-
190
- - `artifactRoot`: datasets, logs, model outputs, eval JSON, and run reports.
191
- - `storeRoot`: run/spec/model metadata used by CLI listing and the dashboard.
192
- - `dryRun`: when `true`, skips model loading and training.
193
- - `training`: uv/Python training entrypoint and environment.
194
- - `evaluation.inference`: how baseline and candidate outputs are generated.
195
- - `evaluation.scoring`: how generated outputs are scored.
196
- - `paths.modelCache`: Hugging Face cache location.
197
-
198
- Supported inference providers:
199
-
200
- - `"transformers"`: run the included local evaluator with Hugging Face/PEFT.
201
- - `"command"`: call `baselineCommand` or `candidateCommand` for custom inference.
202
- - `"none"`: skip inference and record empty local responses.
203
-
204
- Supported scoring modes:
205
-
206
- - `"exact_match"`: normalized exact match.
207
- - `"llm_judge"`: OpenRouter judge, with exact-match fallback by default.
208
- - `"json_fields"`: field-level comparison for structured JSON outputs.
209
-
210
- When `evaluation.scoring.mode` is `"llm_judge"`, `fallback` controls judge
211
- failures. `"exact_match"` keeps the run going and records fallback reasoning.
212
- `"fail"` fails the run.
213
-
214
- ## Evaluation Behavior
215
-
216
- `evaluation.maxExamples` caps how many examples are scored. If it is unset,
217
- the request hyperparameter `max_eval_examples` is used. An explicit
218
- `maxExamples` in the config wins. When capped, the runner uses a deterministic
219
- seeded sample rather than a prefix, so sorted or grouped eval files do not
220
- bias results. The seed defaults to a hash of the run id and can be pinned with
221
- `evaluation.sampleSeed`.
222
-
223
- For spec-based runs without `dataset_prebuilt`, the runner holds out about 20%
224
- of the spec examples for evaluation, with at least one training example and one
225
- holdout when possible. With only one spec example, evaluation runs on that
226
- example and reports `eval_split: "spec_examples"`.
227
-
228
- For prebuilt datasets, `dataset_prebuilt.training` is always copied into the
229
- run artifact as the training set. Evaluation uses `dataset_prebuilt.test` when
230
- present, then `dataset_prebuilt.validation`. If neither is provided, a real
231
- run fails because evaluation would otherwise measure the training split. Set
232
- `evaluation.allowPrebuiltTrainingEval: true` to allow that explicitly.
233
-
234
- Baseline evaluations are cached under `<storeRoot>/cache/baseline-evals/`.
235
- Re-running an unchanged spec with the same model, eval examples, generation
236
- settings, and scoring config reuses the previous baseline report. Set
237
- `evaluation.baselineCache: false` to disable.
238
-
239
- Training progress from Python metric lines and tqdm progress bars is recorded
240
- as run events, so `tt-local runs watch` and per-run `progress.jsonl` show
241
- epoch, loss, step, percentage, and ETA when the trainer emits them.
242
-
243
- ## Structured JSON Scoring
244
-
245
- For structured tasks, use field-level scoring instead of whole-output exact
246
- matching:
247
-
248
- ```json
249
- {
250
- "evaluation": {
251
- "scoring": {
252
- "mode": "json_fields",
253
- "fields": ["triage", "priority", "should_process"]
254
- }
255
- }
256
- }
257
- ```
258
-
259
- If `fields` is omitted, the evaluator scores every key in the expected JSON
260
- object. A configured field missing from the expected JSON is always scored as
261
- incorrect, so a misconfigured field list cannot inflate scores.
262
-
263
- Reports still include `exact_match_rate`, but `avg_score`, `pass_rate`, and
264
- `json_field_metrics` are based on the selected JSON fields.
265
-
266
- ## Labeling Data With A Teacher Model
267
-
268
- `tt-local label` turns unlabeled inputs into training examples by asking a
269
- stronger teacher model on OpenRouter to answer each row under your spec's
270
- system message — the same instructions the fine-tuned model will see at
271
- inference:
272
-
273
- ```bash
274
- export OPENROUTER_API_KEY=... # or put it in .env
275
- tt-local label rows.jsonl --output labeled.jsonl
276
- tt-local label rows.csv --input-column text --model anthropic/claude-fable-5
277
- ```
278
-
279
- Sources are JSONL (`{"input": "..."}` per line; rows that already carry an
280
- `"output"` skip the teacher) or CSV with a header row and `--input-column`.
281
- The system message comes from `tunedtensor.json` (or `--spec <path>`);
282
- pass `--system-prompt "..."` to override it. Use `--dry-run` to parse,
283
- sanitize, and estimate without calling the teacher.
284
-
285
- Because rows are sent to OpenRouter, each row is sanitized first:
286
- secret-like content (API keys, private keys, connection strings) blocks the
287
- row, and PII (emails, phone numbers, SSNs, card numbers) is redacted before
288
- sending. The labeled `{"input", "output"}` JSONL, a full per-row
289
- `rows.jsonl` (including failures for review), and a job report are written
290
- under `<artifactRoot>/labeling/<job-id>/`.
291
-
292
- Teacher behavior is configured in the runner config; the model falls back to
293
- `llm.model`:
294
-
295
- ```json
296
- {
297
- "labeling": {
298
- "model": "anthropic/claude-fable-5",
299
- "maxTokens": 2048,
300
- "temperature": 0.2,
301
- "concurrency": 4,
302
- "maxAttempts": 3
303
- }
304
- }
305
- ```
306
-
307
- ## Thinking-Mode Models
308
-
309
- Some models, such as `Qwen/Qwen3.5-4B`, may open a hidden thinking block by
310
- default and consume the token budget before producing a visible answer. Forward
311
- template kwargs to both evaluation and training:
312
-
313
- ```json
314
- {
315
- "evaluation": {
316
- "inference": {
317
- "chatTemplateKwargs": { "enable_thinking": false }
318
- }
319
- }
320
- }
321
- ```
322
-
323
- In `tunedtensor.json`, also set:
324
-
325
- ```json
326
- {
327
- "hyperparameters": {
328
- "chat_template_kwargs": { "enable_thinking": false }
329
- }
330
- }
331
- ```
332
-
333
- ## Multimodal Examples
334
-
335
- Multimodal runs use chat JSONL with structured user content. For
336
- `image_text_to_text` models such as `Qwen/Qwen3-VL-2B-Instruct`, image parts
337
- are loaded by the local trainer and evaluator:
338
-
339
- ```json
340
- {
341
- "messages": [
342
- { "role": "system", "content": "Answer chart questions concisely." },
343
- {
344
- "role": "user",
345
- "content": [
346
- { "type": "image", "image": "charts/example.png" },
347
- { "type": "text", "text": "What is the blue value?" }
348
- ]
349
- },
350
- { "role": "assistant", "content": "42" }
351
- ]
352
- }
353
- ```
354
-
355
- Image values in prebuilt JSONL may be absolute paths, paths relative to the
356
- JSONL file, `file://` URIs, HTTP(S) URLs, or `data:` URIs. Behavior spec
357
- examples can also use `input_assets` with `image`, `path`, `uri`, or
358
- `data_uri`.
359
-
360
- ## Where Files Go
361
-
362
- If `storeRoot` is omitted, `tt-local` uses `TT_LOCAL_HOME` or
363
- `~/.tuned-tensor-local`.
364
-
365
- Per-run artifacts include:
366
-
367
- - `progress.jsonl`: stage changes and parsed training progress.
368
- - `baseline-eval.json` and `candidate-eval.json`: generated outputs and scores.
369
- - `baseline-eval.json.inference.log` and `candidate-eval.json.inference.log`:
370
- local inference subprocess output.
371
- - `training/training.log`: uv fine-tuning output.
372
- - `run-report.json`: baseline, candidate, comparison, and artifact references.
373
-
374
- ## Useful Commands
375
-
376
- ```bash
377
- tt-local init --name "Support Bot" --model Qwen/Qwen3.5-2B
378
- tt-local doctor --config spark-runner.json
379
- tt-local validate --config spark-runner.json
380
- tt-local run --config spark-runner.json
381
- tt-local run --config spark-runner.json --verbose
382
- tt-local label rows.jsonl --output labeled.jsonl
383
- tt-local runs list --config spark-runner.json
384
- tt-local runs get <run-id> --config spark-runner.json
385
- tt-local runs events <run-id> --config spark-runner.json
386
- tt-local runs watch <run-id> --config spark-runner.json
387
- tt-local runs report <run-id> --config spark-runner.json
388
- tt-local runs compare <run-id-a> <run-id-b> --config spark-runner.json
389
- tt-local models list --config spark-runner.json
390
- tt-local serve --config spark-runner.json
391
- ```
392
-
393
- ## DGX Spark Notes
394
-
395
- On the Spark host, confirm the GPU and uv are available:
396
-
397
- ```bash
398
- nvidia-smi
399
- uv --version
400
- uv run python --version
401
- ```
402
-
403
- Then clone, install, build, and link the CLI on the Spark:
404
-
405
- ```bash
406
- git clone https://github.com/tunedtensor/tuned-tensor-local.git
407
- cd tuned-tensor-local
408
- npm install
409
- npm run build
410
- npm link
411
- tt-local doctor --config examples/local-runner.json
412
- ```
413
-
414
- Spark-specific details live in [docs/spark.md](docs/spark.md).
415
-
416
- ## Development
27
+ ## Local Development
417
28
 
418
29
  ```bash
419
30
  npm install
@@ -422,18 +33,7 @@ npm test
422
33
  npm run build
423
34
  ```
424
35
 
425
- CI runs those checks on pull requests and pushes to `main`. Publishing to npm
426
- runs when a GitHub Release is published and requires an `NPM_TOKEN` repository
427
- secret.
428
-
429
- ## Notes
430
-
431
- - Real training uses `training/sft-local/src/train.py`.
432
- - Real evaluation uses `training/sft-local/src/evaluate.py`.
433
- - The default evaluation path uses Hugging Face/PEFT artifacts directly; it
434
- does not convert models to GGUF.
435
- - `validate` and `run` warn about unknown hyperparameter keys and ignore them.
436
- - Release notes are in [CHANGELOG.md](CHANGELOG.md).
36
+ Release notes are in [CHANGELOG.md](CHANGELOG.md).
437
37
 
438
38
  ## License
439
39
 
package/dist/store.d.ts CHANGED
@@ -28,9 +28,6 @@ export interface LocalRunEvent {
28
28
  details?: Record<string, unknown>;
29
29
  occurred_at: string;
30
30
  }
31
- export interface LocalRunIndexRecord extends LocalRunState {
32
- catalog_updated_at: string;
33
- }
34
31
  export interface LocalModelRecord {
35
32
  id: string;
36
33
  run_id: string;
@@ -74,7 +71,7 @@ export interface LocalStore {
74
71
  completeRun(report: RunReport, artifactDir: string, reportPath: string): Promise<LocalRunState>;
75
72
  failRun(runId: string, error: string): Promise<LocalRunState>;
76
73
  cancelRun(runId: string): Promise<void>;
77
- listRuns(): Promise<LocalRunIndexRecord[]>;
74
+ listRuns(): Promise<LocalRunState[]>;
78
75
  getRun(id: string): Promise<LocalRunState>;
79
76
  getRunEvents(id: string): Promise<LocalRunEvent[]>;
80
77
  getRunReport(id: string): Promise<RunReport>;
@@ -89,10 +86,6 @@ export declare function localStorePaths(root: string): {
89
86
  runsDir: string;
90
87
  modelsDir: string;
91
88
  datasetsDir: string;
92
- catalogDir: string;
93
- runsCatalog: string;
94
- specsCatalog: string;
95
- modelsCatalog: string;
96
- datasetsCatalog: string;
89
+ metadataDb: string;
97
90
  };
98
91
  export declare function createLocalStore(root?: string): LocalStore;
package/dist/store.js CHANGED
@@ -2,6 +2,9 @@ import { appendFile, copyFile, mkdir, readdir, readFile, rename, stat, writeFile
2
2
  import { homedir } from "node:os";
3
3
  import { dirname, join, resolve } from "node:path";
4
4
  import { randomUUID } from "node:crypto";
5
+ import { createRequire } from "node:module";
6
+ const require = createRequire(import.meta.url);
7
+ const BetterSqlite = require("better-sqlite3");
5
8
  export function defaultLocalHome() {
6
9
  return resolve(process.env.TT_LOCAL_HOME ?? join(homedir(), ".tuned-tensor-local"));
7
10
  }
@@ -12,11 +15,7 @@ export function localStorePaths(root) {
12
15
  runsDir: join(root, "runs"),
13
16
  modelsDir: join(root, "models"),
14
17
  datasetsDir: join(root, "datasets"),
15
- catalogDir: join(root, "catalog"),
16
- runsCatalog: join(root, "catalog", "runs.jsonl"),
17
- specsCatalog: join(root, "catalog", "specs.jsonl"),
18
- modelsCatalog: join(root, "catalog", "models.jsonl"),
19
- datasetsCatalog: join(root, "catalog", "datasets.jsonl"),
18
+ metadataDb: join(root, "metadata.sqlite"),
20
19
  };
21
20
  }
22
21
  async function exists(path) {
@@ -41,15 +40,6 @@ async function appendJsonl(path, value) {
41
40
  await mkdir(dirname(path), { recursive: true });
42
41
  await appendFile(path, `${JSON.stringify(value)}\n`, "utf8");
43
42
  }
44
- async function readJsonlLatestById(path) {
45
- if (!(await exists(path)))
46
- return [];
47
- const rows = (await readFile(path, "utf8"))
48
- .split(/\r?\n/)
49
- .filter(Boolean)
50
- .map((line) => JSON.parse(line));
51
- return [...new Map(rows.map((row) => [row.id, row])).values()];
52
- }
53
43
  async function readJsonl(path) {
54
44
  if (!(await exists(path)))
55
45
  return [];
@@ -64,6 +54,213 @@ async function copyIfExists(from, to) {
64
54
  await mkdir(dirname(to), { recursive: true });
65
55
  await copyFile(from, to);
66
56
  }
57
+ function initMetadataDb(db) {
58
+ db.exec(`
59
+ PRAGMA journal_mode = WAL;
60
+ PRAGMA foreign_keys = ON;
61
+ PRAGMA busy_timeout = 5000;
62
+
63
+ CREATE TABLE IF NOT EXISTS specs (
64
+ id TEXT PRIMARY KEY,
65
+ name TEXT NOT NULL,
66
+ base_model TEXT NOT NULL,
67
+ path TEXT NOT NULL,
68
+ created_at TEXT NOT NULL,
69
+ updated_at TEXT NOT NULL
70
+ );
71
+
72
+ CREATE TABLE IF NOT EXISTS runs (
73
+ id TEXT PRIMARY KEY,
74
+ behavior_spec_id TEXT NOT NULL,
75
+ user_id TEXT NOT NULL,
76
+ run_number INTEGER NOT NULL,
77
+ status TEXT NOT NULL,
78
+ current_stage TEXT NOT NULL,
79
+ status_message TEXT NOT NULL,
80
+ artifact_dir TEXT NOT NULL,
81
+ report_path TEXT,
82
+ model_id TEXT,
83
+ error TEXT,
84
+ base_model TEXT NOT NULL,
85
+ spec_name TEXT NOT NULL,
86
+ created_at TEXT NOT NULL,
87
+ updated_at TEXT NOT NULL,
88
+ started_at TEXT,
89
+ completed_at TEXT
90
+ );
91
+
92
+ CREATE TABLE IF NOT EXISTS run_events (
93
+ id TEXT PRIMARY KEY,
94
+ run_id TEXT NOT NULL,
95
+ stage TEXT NOT NULL,
96
+ status TEXT NOT NULL,
97
+ message TEXT NOT NULL,
98
+ details_json TEXT,
99
+ occurred_at TEXT NOT NULL
100
+ );
101
+
102
+ CREATE TABLE IF NOT EXISTS models (
103
+ id TEXT PRIMARY KEY,
104
+ run_id TEXT NOT NULL,
105
+ behavior_spec_id TEXT NOT NULL,
106
+ name TEXT NOT NULL,
107
+ provider TEXT NOT NULL,
108
+ base_model TEXT NOT NULL,
109
+ artifact_uri TEXT NOT NULL,
110
+ artifact_dir TEXT NOT NULL,
111
+ metrics_json TEXT,
112
+ created_at TEXT NOT NULL
113
+ );
114
+
115
+ CREATE INDEX IF NOT EXISTS idx_runs_updated_at ON runs(updated_at DESC);
116
+ CREATE INDEX IF NOT EXISTS idx_specs_updated_at ON specs(updated_at DESC);
117
+ CREATE INDEX IF NOT EXISTS idx_models_created_at ON models(created_at DESC);
118
+ CREATE INDEX IF NOT EXISTS idx_run_events_run_time ON run_events(run_id, occurred_at);
119
+ `);
120
+ }
121
+ function rowToRunState(row) {
122
+ return {
123
+ id: row.id,
124
+ behavior_spec_id: row.behavior_spec_id,
125
+ user_id: row.user_id,
126
+ run_number: row.run_number,
127
+ status: row.status,
128
+ current_stage: row.current_stage,
129
+ status_message: row.status_message,
130
+ artifact_dir: row.artifact_dir,
131
+ base_model: row.base_model,
132
+ spec_name: row.spec_name,
133
+ created_at: row.created_at,
134
+ updated_at: row.updated_at,
135
+ ...(row.report_path ? { report_path: row.report_path } : {}),
136
+ ...(row.model_id ? { model_id: row.model_id } : {}),
137
+ ...(row.error ? { error: row.error } : {}),
138
+ ...(row.started_at ? { started_at: row.started_at } : {}),
139
+ ...(row.completed_at ? { completed_at: row.completed_at } : {}),
140
+ };
141
+ }
142
+ function rowToSpec(row) {
143
+ return {
144
+ id: row.id,
145
+ name: row.name,
146
+ base_model: row.base_model,
147
+ path: row.path,
148
+ created_at: row.created_at,
149
+ updated_at: row.updated_at,
150
+ };
151
+ }
152
+ function rowToModel(row) {
153
+ return {
154
+ id: row.id,
155
+ run_id: row.run_id,
156
+ behavior_spec_id: row.behavior_spec_id,
157
+ name: row.name,
158
+ provider: row.provider,
159
+ base_model: row.base_model,
160
+ artifact_uri: row.artifact_uri,
161
+ artifact_dir: row.artifact_dir,
162
+ metrics: row.metrics_json ? JSON.parse(row.metrics_json) : null,
163
+ created_at: row.created_at,
164
+ };
165
+ }
166
+ function rowToEvent(row) {
167
+ return {
168
+ id: row.id,
169
+ run_id: row.run_id,
170
+ stage: row.stage,
171
+ status: row.status,
172
+ message: row.message,
173
+ occurred_at: row.occurred_at,
174
+ ...(row.details_json ? { details: JSON.parse(row.details_json) } : {}),
175
+ };
176
+ }
177
+ function withMetadataDb(paths, fn) {
178
+ const db = new BetterSqlite(paths.metadataDb);
179
+ try {
180
+ initMetadataDb(db);
181
+ return fn(db);
182
+ }
183
+ finally {
184
+ db.close();
185
+ }
186
+ }
187
+ function runTransaction(db, fn) {
188
+ db.exec("BEGIN IMMEDIATE");
189
+ try {
190
+ const result = fn();
191
+ db.exec("COMMIT");
192
+ return result;
193
+ }
194
+ catch (error) {
195
+ db.exec("ROLLBACK");
196
+ throw error;
197
+ }
198
+ }
199
+ function bindRunState(stmt, state) {
200
+ stmt.run(state.id, state.behavior_spec_id, state.user_id, state.run_number, state.status, state.current_stage, state.status_message, state.artifact_dir, state.report_path ?? null, state.model_id ?? null, state.error ?? null, state.base_model, state.spec_name, state.created_at, state.updated_at, state.started_at ?? null, state.completed_at ?? null);
201
+ }
202
+ function upsertRun(db, state) {
203
+ bindRunState(db.prepare(`
204
+ INSERT INTO runs (
205
+ id, behavior_spec_id, user_id, run_number, status, current_stage,
206
+ status_message, artifact_dir, report_path, model_id, error, base_model,
207
+ spec_name, created_at, updated_at, started_at, completed_at
208
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
209
+ ON CONFLICT(id) DO UPDATE SET
210
+ behavior_spec_id = excluded.behavior_spec_id,
211
+ user_id = excluded.user_id,
212
+ run_number = excluded.run_number,
213
+ status = excluded.status,
214
+ current_stage = excluded.current_stage,
215
+ status_message = excluded.status_message,
216
+ artifact_dir = excluded.artifact_dir,
217
+ report_path = excluded.report_path,
218
+ model_id = excluded.model_id,
219
+ error = excluded.error,
220
+ base_model = excluded.base_model,
221
+ spec_name = excluded.spec_name,
222
+ created_at = excluded.created_at,
223
+ updated_at = excluded.updated_at,
224
+ started_at = excluded.started_at,
225
+ completed_at = excluded.completed_at
226
+ `), state);
227
+ }
228
+ function upsertSpec(db, record) {
229
+ db.prepare(`
230
+ INSERT INTO specs (id, name, base_model, path, created_at, updated_at)
231
+ VALUES (?, ?, ?, ?, ?, ?)
232
+ ON CONFLICT(id) DO UPDATE SET
233
+ name = excluded.name,
234
+ base_model = excluded.base_model,
235
+ path = excluded.path,
236
+ created_at = excluded.created_at,
237
+ updated_at = excluded.updated_at
238
+ `).run(record.id, record.name, record.base_model, record.path, record.created_at, record.updated_at);
239
+ }
240
+ function upsertModel(db, model) {
241
+ db.prepare(`
242
+ INSERT INTO models (
243
+ id, run_id, behavior_spec_id, name, provider, base_model,
244
+ artifact_uri, artifact_dir, metrics_json, created_at
245
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
246
+ ON CONFLICT(id) DO UPDATE SET
247
+ run_id = excluded.run_id,
248
+ behavior_spec_id = excluded.behavior_spec_id,
249
+ name = excluded.name,
250
+ provider = excluded.provider,
251
+ base_model = excluded.base_model,
252
+ artifact_uri = excluded.artifact_uri,
253
+ artifact_dir = excluded.artifact_dir,
254
+ metrics_json = excluded.metrics_json,
255
+ created_at = excluded.created_at
256
+ `).run(model.id, model.run_id, model.behavior_spec_id, model.name, model.provider, model.base_model, model.artifact_uri, model.artifact_dir, model.metrics ? JSON.stringify(model.metrics) : null, model.created_at);
257
+ }
258
+ function insertEvent(db, event) {
259
+ db.prepare(`
260
+ INSERT OR IGNORE INTO run_events (id, run_id, stage, status, message, details_json, occurred_at)
261
+ VALUES (?, ?, ?, ?, ?, ?, ?)
262
+ `).run(event.id, event.run_id, event.stage, event.status, event.message, event.details ? JSON.stringify(event.details) : null, event.occurred_at);
263
+ }
67
264
  export function createLocalStore(root = defaultLocalHome()) {
68
265
  const resolvedRoot = resolve(root);
69
266
  const paths = localStorePaths(resolvedRoot);
@@ -81,12 +278,12 @@ export function createLocalStore(root = defaultLocalHome()) {
81
278
  mkdir(paths.runsDir, { recursive: true }),
82
279
  mkdir(paths.modelsDir, { recursive: true }),
83
280
  mkdir(paths.datasetsDir, { recursive: true }),
84
- mkdir(paths.catalogDir, { recursive: true }),
85
281
  ]);
282
+ withMetadataDb(paths, () => undefined);
86
283
  }
87
284
  async function writeRunState(state) {
88
285
  await writeJsonAtomic(runStatePath(state.id), state);
89
- await appendJsonl(paths.runsCatalog, { ...state, catalog_updated_at: new Date().toISOString() });
286
+ withMetadataDb(paths, (db) => upsertRun(db, state));
90
287
  return state;
91
288
  }
92
289
  async function appendRunEvent(state, event) {
@@ -104,11 +301,15 @@ export function createLocalStore(root = defaultLocalHome()) {
104
301
  message: row.message,
105
302
  ...(row.details ? { details: row.details } : {}),
106
303
  });
304
+ withMetadataDb(paths, (db) => insertEvent(db, row));
107
305
  }
108
306
  async function resolveRunId(id) {
307
+ await ensure();
109
308
  if (await exists(runStatePath(id)))
110
309
  return id;
111
- const records = await readJsonlLatestById(paths.runsCatalog);
310
+ const records = withMetadataDb(paths, (db) => db.prepare(`
311
+ SELECT * FROM runs WHERE id = ? OR id LIKE ? ORDER BY updated_at DESC
312
+ `).all(id, `${id}%`)).map(rowToRunState);
112
313
  const record = records.find((row) => row.id === id || row.id.startsWith(id));
113
314
  if (!record)
114
315
  throw new Error(`Run not found: ${id}`);
@@ -124,8 +325,7 @@ export function createLocalStore(root = defaultLocalHome()) {
124
325
  async importSpec(specId, spec) {
125
326
  await ensure();
126
327
  const now = new Date().toISOString();
127
- const existingRecord = (await readJsonlLatestById(paths.specsCatalog))
128
- .find((row) => row.id === specId);
328
+ const existingRecord = withMetadataDb(paths, (db) => db.prepare("SELECT * FROM specs WHERE id = ?").get(specId));
129
329
  const record = {
130
330
  id: specId,
131
331
  name: spec.name,
@@ -135,13 +335,12 @@ export function createLocalStore(root = defaultLocalHome()) {
135
335
  updated_at: now,
136
336
  };
137
337
  await writeJsonAtomic(specPath(specId), spec);
138
- await appendJsonl(paths.specsCatalog, record);
338
+ withMetadataDb(paths, (db) => upsertSpec(db, record));
139
339
  return record;
140
340
  },
141
341
  async listSpecs() {
142
342
  await ensure();
143
- return (await readJsonlLatestById(paths.specsCatalog))
144
- .sort((a, b) => b.updated_at.localeCompare(a.updated_at));
343
+ return withMetadataDb(paths, (db) => db.prepare("SELECT * FROM specs ORDER BY updated_at DESC").all().map(rowToSpec));
145
344
  },
146
345
  async getSpec(id) {
147
346
  const records = await this.listSpecs();
@@ -222,7 +421,7 @@ export function createLocalStore(root = defaultLocalHome()) {
222
421
  created_at: completedAt,
223
422
  };
224
423
  await writeJsonAtomic(modelPath(model.id), model);
225
- await appendJsonl(paths.modelsCatalog, model);
424
+ withMetadataDb(paths, (db) => upsertModel(db, model));
226
425
  return state;
227
426
  },
228
427
  async failRun(runId, error) {
@@ -256,12 +455,16 @@ export function createLocalStore(root = defaultLocalHome()) {
256
455
  },
257
456
  async listRuns() {
258
457
  await ensure();
259
- return (await readJsonlLatestById(paths.runsCatalog))
260
- .sort((a, b) => b.updated_at.localeCompare(a.updated_at));
458
+ return withMetadataDb(paths, (db) => db.prepare("SELECT * FROM runs ORDER BY updated_at DESC").all().map(rowToRunState));
261
459
  },
262
460
  getRun,
263
461
  async getRunEvents(id) {
264
462
  const state = await getRun(id);
463
+ const events = withMetadataDb(paths, (db) => db.prepare(`
464
+ SELECT * FROM run_events WHERE run_id = ? ORDER BY occurred_at ASC
465
+ `).all(state.id)).map(rowToEvent);
466
+ if (events.length > 0)
467
+ return events;
265
468
  return readJsonl(runEventsPath(state.id));
266
469
  },
267
470
  async getRunReport(id) {
@@ -276,8 +479,7 @@ export function createLocalStore(root = defaultLocalHome()) {
276
479
  },
277
480
  async listModels() {
278
481
  await ensure();
279
- return (await readJsonlLatestById(paths.modelsCatalog))
280
- .sort((a, b) => b.created_at.localeCompare(a.created_at));
482
+ return withMetadataDb(paths, (db) => db.prepare("SELECT * FROM models ORDER BY created_at DESC").all().map(rowToModel));
281
483
  },
282
484
  async getModel(id) {
283
485
  const models = await this.listModels();
@@ -289,14 +491,16 @@ export function createLocalStore(root = defaultLocalHome()) {
289
491
  async rebuildIndexes() {
290
492
  await ensure();
291
493
  const runRecords = [];
494
+ const eventRecords = [];
292
495
  for (const entry of await readdir(paths.runsDir, { withFileTypes: true }).catch(() => [])) {
293
496
  if (!entry.isDirectory())
294
497
  continue;
295
498
  const statePath = runStatePath(entry.name);
296
499
  if (await exists(statePath)) {
297
500
  const state = await readJson(statePath);
298
- runRecords.push({ ...state, catalog_updated_at: new Date().toISOString() });
501
+ runRecords.push(state);
299
502
  }
503
+ eventRecords.push(...await readJsonl(runEventsPath(entry.name)));
300
504
  }
301
505
  const specRecords = [];
302
506
  for (const entry of await readdir(paths.specsDir, { withFileTypes: true }).catch(() => [])) {
@@ -317,10 +521,17 @@ export function createLocalStore(root = defaultLocalHome()) {
317
521
  if (await exists(path))
318
522
  modelRecords.push(await readJson(path));
319
523
  }
320
- await writeFile(paths.runsCatalog, runRecords.map((row) => JSON.stringify(row)).join("\n") + (runRecords.length ? "\n" : ""), "utf8");
321
- await writeFile(paths.specsCatalog, specRecords.map((row) => JSON.stringify(row)).join("\n") + (specRecords.length ? "\n" : ""), "utf8");
322
- await writeFile(paths.modelsCatalog, modelRecords.map((row) => JSON.stringify(row)).join("\n") + (modelRecords.length ? "\n" : ""), "utf8");
323
- await writeFile(paths.datasetsCatalog, "", "utf8");
524
+ withMetadataDb(paths, (db) => runTransaction(db, () => {
525
+ db.exec("DELETE FROM run_events; DELETE FROM runs; DELETE FROM specs; DELETE FROM models;");
526
+ for (const run of runRecords)
527
+ upsertRun(db, run);
528
+ for (const spec of specRecords)
529
+ upsertSpec(db, spec);
530
+ for (const model of modelRecords)
531
+ upsertModel(db, model);
532
+ for (const event of eventRecords)
533
+ insertEvent(db, event);
534
+ }));
324
535
  },
325
536
  };
326
537
  }
package/dist/store.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
@@ -13,8 +13,9 @@ packaged as a standalone CLI.
13
13
  compatible hosted exports.
14
14
  - Artifact store: writes datasets, logs, model outputs, and reports beneath a
15
15
  configured local artifact root.
16
- - Local state store: persists specs, runs, progress events, reports, and model
17
- records as JSON/JSONL under a configured `storeRoot` for the dashboard and CLI.
16
+ - Local state store: keeps a SQLite metadata index for specs, runs, progress
17
+ events, and model records while preserving JSON/JSONL files under a
18
+ configured `storeRoot` for portable artifacts, recovery, and inspection.
18
19
  - Training adapter: launches a uv-managed Python process with local input,
19
20
  model cache, and output directories passed through environment variables.
20
21
  - Evaluation adapter: runs local Hugging Face/PEFT inference for baseline and
@@ -43,7 +44,7 @@ The first runnable milestone should support:
43
44
  - one local run at a time;
44
45
  - one GPU device;
45
46
  - local filesystem artifacts;
46
- - local file-backed run/model/spec tracking;
47
+ - SQLite-backed run/model/spec tracking with recoverable JSON files;
47
48
  - standalone `tt-local init`, `validate`, `run`, `serve`, and inspection
48
49
  commands;
49
50
  - uv-based training;
@@ -76,21 +77,23 @@ comparison less direct.
76
77
 
77
78
  The local store is intentionally transparent and easy to back up:
78
79
 
80
+ - `metadata.sqlite`
79
81
  - `specs/<spec-id>/spec.json`
80
82
  - `runs/<run-id>/request.json`
81
83
  - `runs/<run-id>/state.json`
82
84
  - `runs/<run-id>/progress.jsonl`
83
85
  - `runs/<run-id>/run-report.json`
84
86
  - `models/<model-id>/model.json`
85
- - `catalog/*.jsonl`
86
87
 
87
- Catalog files are append-only indexes for fast listing. `tt-local store
88
- rebuild-index` can reconstruct them from the canonical per-object files.
88
+ SQLite is the primary metadata index for CLI and dashboard listings. The
89
+ per-object JSON files remain the recoverable source for artifacts and
90
+ human-readable inspection. `tt-local store rebuild-index` can reconstruct the
91
+ SQLite index from the canonical per-object files.
89
92
 
90
93
  ## Dashboard API
91
94
 
92
- The local server is a lightweight Node HTTP server, not a separate database.
93
- Current endpoints include:
95
+ The local server is a lightweight Node HTTP server backed by the local state
96
+ store. Current endpoints include:
94
97
 
95
98
  - `GET /api/health`
96
99
  - `GET /api/runs`, `GET /api/runs/:id`, `GET /api/runs/:id/events`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tuned-tensor/local",
3
- "version": "0.1.9",
3
+ "version": "0.2.0",
4
4
  "description": "TT Local: tuning tensors locally on hardware you control.",
5
5
  "license": "Apache-2.0",
6
6
  "private": false,
@@ -34,11 +34,13 @@
34
34
  "node": ">=22"
35
35
  },
36
36
  "devDependencies": {
37
+ "@types/better-sqlite3": "^7.6.13",
37
38
  "@types/node": "^25.0.0",
38
39
  "tsx": "^4.22.4",
39
40
  "typescript": "^6.0.0"
40
41
  },
41
42
  "dependencies": {
43
+ "better-sqlite3": "^12.11.1",
42
44
  "zod": "^4.4.3"
43
45
  }
44
46
  }