@they-juanreina/compost-cli 0.1.2 → 0.1.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.
- package/dist/commands/agreement.d.ts +3 -0
- package/dist/commands/agreement.d.ts.map +1 -0
- package/dist/commands/agreement.js +35 -0
- package/dist/commands/agreement.js.map +1 -0
- package/dist/commands/create.d.ts +1 -0
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +39 -1
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +47 -4
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/import.d.ts +3 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +59 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +1 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/jobs.d.ts +3 -0
- package/dist/commands/jobs.d.ts.map +1 -0
- package/dist/commands/jobs.js +105 -0
- package/dist/commands/jobs.js.map +1 -0
- package/dist/commands/label.d.ts +3 -0
- package/dist/commands/label.d.ts.map +1 -0
- package/dist/commands/label.js +67 -0
- package/dist/commands/label.js.map +1 -0
- package/dist/commands/models.d.ts.map +1 -1
- package/dist/commands/models.js +2 -1
- package/dist/commands/models.js.map +1 -1
- package/dist/commands/recode.d.ts +3 -0
- package/dist/commands/recode.d.ts.map +1 -0
- package/dist/commands/recode.js +60 -0
- package/dist/commands/recode.js.map +1 -0
- package/dist/commands/reindex.d.ts.map +1 -1
- package/dist/commands/reindex.js +6 -4
- package/dist/commands/reindex.js.map +1 -1
- package/dist/commands/rerun.d.ts +3 -0
- package/dist/commands/rerun.d.ts.map +1 -0
- package/dist/commands/rerun.js +91 -0
- package/dist/commands/rerun.js.map +1 -0
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +2 -1
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/secrets.d.ts +3 -0
- package/dist/commands/secrets.d.ts.map +1 -0
- package/dist/commands/secrets.js +143 -0
- package/dist/commands/secrets.js.map +1 -0
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +90 -1
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +2 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/transcribe.d.ts.map +1 -1
- package/dist/commands/transcribe.js +13 -2
- package/dist/commands/transcribe.js.map +1 -1
- package/dist/commands/validate.d.ts.map +1 -1
- package/dist/commands/validate.js +29 -1
- package/dist/commands/validate.js.map +1 -1
- package/dist/engine.d.ts +23 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +32 -0
- package/dist/engine.js.map +1 -0
- package/dist/exporters/prov.d.ts +11 -0
- package/dist/exporters/prov.d.ts.map +1 -0
- package/dist/exporters/prov.js +151 -0
- package/dist/exporters/prov.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/agreement.d.ts +77 -0
- package/dist/lib/agreement.d.ts.map +1 -0
- package/dist/lib/agreement.js +261 -0
- package/dist/lib/agreement.js.map +1 -0
- package/dist/lib/artifacts.d.ts +32 -1
- package/dist/lib/artifacts.d.ts.map +1 -1
- package/dist/lib/artifacts.js +156 -22
- package/dist/lib/artifacts.js.map +1 -1
- package/dist/lib/config.d.ts +3 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/doctor.d.ts +3 -0
- package/dist/lib/doctor.d.ts.map +1 -1
- package/dist/lib/doctor.js +24 -1
- package/dist/lib/doctor.js.map +1 -1
- package/dist/lib/events.d.ts +34 -1
- package/dist/lib/events.d.ts.map +1 -1
- package/dist/lib/events.js +35 -1
- package/dist/lib/events.js.map +1 -1
- package/dist/lib/importTranscript.d.ts +16 -0
- package/dist/lib/importTranscript.d.ts.map +1 -0
- package/dist/lib/importTranscript.js +94 -0
- package/dist/lib/importTranscript.js.map +1 -0
- package/dist/lib/ingest.d.ts.map +1 -1
- package/dist/lib/ingest.js +12 -6
- package/dist/lib/ingest.js.map +1 -1
- package/dist/lib/journal.d.ts +13 -0
- package/dist/lib/journal.d.ts.map +1 -1
- package/dist/lib/journal.js +49 -2
- package/dist/lib/journal.js.map +1 -1
- package/dist/lib/legacyNative.d.ts +24 -0
- package/dist/lib/legacyNative.d.ts.map +1 -0
- package/dist/lib/legacyNative.js +51 -0
- package/dist/lib/legacyNative.js.map +1 -0
- package/dist/lib/provisionNative.js +1 -1
- package/dist/lib/provisionNative.js.map +1 -1
- package/dist/lib/queue.d.ts +25 -0
- package/dist/lib/queue.d.ts.map +1 -1
- package/dist/lib/queue.js +70 -3
- package/dist/lib/queue.js.map +1 -1
- package/dist/lib/reads.d.ts +24 -0
- package/dist/lib/reads.d.ts.map +1 -0
- package/dist/lib/reads.js +115 -0
- package/dist/lib/reads.js.map +1 -0
- package/dist/lib/recode.d.ts +19 -0
- package/dist/lib/recode.d.ts.map +1 -0
- package/dist/lib/recode.js +43 -0
- package/dist/lib/recode.js.map +1 -0
- package/dist/lib/rerun.d.ts +51 -0
- package/dist/lib/rerun.d.ts.map +1 -0
- package/dist/lib/rerun.js +166 -0
- package/dist/lib/rerun.js.map +1 -0
- package/dist/lib/retrieve.d.ts +8 -4
- package/dist/lib/retrieve.d.ts.map +1 -1
- package/dist/lib/retrieve.js +12 -2
- package/dist/lib/retrieve.js.map +1 -1
- package/dist/lib/schemas.generated.d.ts.map +1 -1
- package/dist/lib/schemas.generated.js +28 -0
- package/dist/lib/schemas.generated.js.map +1 -1
- package/dist/lib/secrets.d.ts +158 -0
- package/dist/lib/secrets.d.ts.map +1 -0
- package/dist/lib/secrets.js +507 -0
- package/dist/lib/secrets.js.map +1 -0
- package/dist/lib/seed.d.ts +5 -0
- package/dist/lib/seed.d.ts.map +1 -1
- package/dist/lib/seed.js +15 -2
- package/dist/lib/seed.js.map +1 -1
- package/dist/lib/session.d.ts +14 -0
- package/dist/lib/session.d.ts.map +1 -1
- package/dist/lib/session.js +47 -0
- package/dist/lib/session.js.map +1 -1
- package/dist/lib/setup.d.ts +5 -0
- package/dist/lib/setup.d.ts.map +1 -1
- package/dist/lib/setup.js +69 -6
- package/dist/lib/setup.js.map +1 -1
- package/dist/lib/setupWizard.d.ts +51 -0
- package/dist/lib/setupWizard.d.ts.map +1 -0
- package/dist/lib/setupWizard.js +223 -0
- package/dist/lib/setupWizard.js.map +1 -0
- package/dist/lib/speakers.d.ts +41 -0
- package/dist/lib/speakers.d.ts.map +1 -0
- package/dist/lib/speakers.js +78 -0
- package/dist/lib/speakers.js.map +1 -0
- package/dist/lib/status.d.ts.map +1 -1
- package/dist/lib/status.js +21 -0
- package/dist/lib/status.js.map +1 -1
- package/dist/lib/userConfig.d.ts +22 -0
- package/dist/lib/userConfig.d.ts.map +1 -0
- package/dist/lib/userConfig.js +67 -0
- package/dist/lib/userConfig.js.map +1 -0
- package/dist/lib/validate.d.ts +18 -0
- package/dist/lib/validate.d.ts.map +1 -1
- package/dist/lib/validate.js +70 -1
- package/dist/lib/validate.js.map +1 -1
- package/dist/lib/version.d.ts +30 -0
- package/dist/lib/version.d.ts.map +1 -0
- package/dist/lib/version.js +73 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/llm/adapter.d.ts.map +1 -1
- package/dist/llm/adapter.js +2 -0
- package/dist/llm/adapter.js.map +1 -1
- package/dist/llm/providers/ollama.d.ts.map +1 -1
- package/dist/llm/providers/ollama.js +6 -0
- package/dist/llm/providers/ollama.js.map +1 -1
- package/dist/loops/ingest_watcher.d.ts.map +1 -1
- package/dist/loops/ingest_watcher.js +6 -3
- package/dist/loops/ingest_watcher.js.map +1 -1
- package/dist/loops/legacy_worker.d.ts +28 -1
- package/dist/loops/legacy_worker.d.ts.map +1 -1
- package/dist/loops/legacy_worker.js +81 -9
- package/dist/loops/legacy_worker.js.map +1 -1
- package/dist/loops/supervisor.d.ts +3 -0
- package/dist/loops/supervisor.d.ts.map +1 -1
- package/dist/loops/supervisor.js +11 -0
- package/dist/loops/supervisor.js.map +1 -1
- package/dist/loops/synthesis.d.ts.map +1 -1
- package/dist/loops/synthesis.js +15 -0
- package/dist/loops/synthesis.js.map +1 -1
- package/dist/loops/transcribe_worker.d.ts.map +1 -1
- package/dist/loops/transcribe_worker.js +2 -3
- package/dist/loops/transcribe_worker.js.map +1 -1
- package/dist/output.d.ts +13 -1
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +22 -2
- package/dist/output.js.map +1 -1
- package/dist/render/human.d.ts +20 -0
- package/dist/render/human.d.ts.map +1 -0
- package/dist/render/human.js +54 -0
- package/dist/render/human.js.map +1 -0
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +17 -2
- package/dist/router.js.map +1 -1
- package/package.json +12 -5
- package/templates/config.toml +6 -1
- package/transcriber/app/diarization.py +36 -6
- package/transcriber/app/legacy_cli.py +90 -0
- package/transcriber/app/pipeline.py +13 -7
- package/transcriber/app/prosody.py +5 -0
- package/transcriber/app/vad.py +82 -11
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
2
|
+
import { CompostError } from '../errors.js';
|
|
3
|
+
/**
|
|
4
|
+
* Native (host) legacy-ingest path (#184): shell out to `app.legacy_cli` so
|
|
5
|
+
* PDF/DOCX/PPTX/CSV/XLSX/TXT ingest works without the Docker transcriber. Returns
|
|
6
|
+
* the same shape as the `/legacy-ingest` route, so the legacy-worker is agnostic
|
|
7
|
+
* to which path ran. Throws CompostError on spawn failure / non-zero exit.
|
|
8
|
+
*/
|
|
9
|
+
export function legacyIngestNative(req, opts) {
|
|
10
|
+
const args = [
|
|
11
|
+
'-m',
|
|
12
|
+
'app.legacy_cli',
|
|
13
|
+
'--seed-path',
|
|
14
|
+
req.seed_path,
|
|
15
|
+
'--source-path',
|
|
16
|
+
req.source_path,
|
|
17
|
+
];
|
|
18
|
+
if (req.text_col !== undefined)
|
|
19
|
+
args.push('--text-col', req.text_col);
|
|
20
|
+
if (req.speaker_col !== undefined)
|
|
21
|
+
args.push('--speaker-col', req.speaker_col);
|
|
22
|
+
if (req.sheet !== undefined)
|
|
23
|
+
args.push('--sheet', req.sheet);
|
|
24
|
+
const spawn = opts.spawnImpl ?? spawnSync;
|
|
25
|
+
const res = spawn(opts.python, args, {
|
|
26
|
+
cwd: opts.transcriberDir,
|
|
27
|
+
env: { ...process.env },
|
|
28
|
+
encoding: 'utf8',
|
|
29
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
30
|
+
});
|
|
31
|
+
if (res.error) {
|
|
32
|
+
throw new CompostError('PROVIDER_ERROR', `native legacy-ingest failed to start (${opts.python}): ${res.error.message}. ` +
|
|
33
|
+
'Run `compost setup` to provision the native venv, or start the Docker fallback.');
|
|
34
|
+
}
|
|
35
|
+
const lastLine = (res.stdout || '').trim().split('\n').filter(Boolean).pop() ?? '';
|
|
36
|
+
let parsed;
|
|
37
|
+
try {
|
|
38
|
+
const value = JSON.parse(lastLine);
|
|
39
|
+
if (typeof value !== 'object' || value === null)
|
|
40
|
+
throw new Error('not a JSON object');
|
|
41
|
+
parsed = value;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
throw new CompostError('PROVIDER_ERROR', `native legacy-ingest produced no parseable result. stderr: ${(res.stderr || '').slice(-400)}`);
|
|
45
|
+
}
|
|
46
|
+
if (res.status !== 0 || parsed.status === 'failed') {
|
|
47
|
+
throw new CompostError('PROVIDER_ERROR', `native legacy-ingest failed (${parsed.kind ?? 'error'}): ${parsed.error ?? (res.stderr || '').slice(-400)}`);
|
|
48
|
+
}
|
|
49
|
+
return parsed;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=legacyNative.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacyNative.js","sourceRoot":"","sources":["../../src/lib/legacyNative.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,SAAS,EAAE,MAAM,oBAAoB,CAAA;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAkB3C;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,GAAwB,EACxB,IAAyB;IAEzB,MAAM,IAAI,GAAG;QACX,IAAI;QACJ,gBAAgB;QAChB,aAAa;QACb,GAAG,CAAC,SAAS;QACb,eAAe;QACf,GAAG,CAAC,WAAW;KAChB,CAAA;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAA;IACrE,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC,WAAW,CAAC,CAAA;IAC9E,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,CAAA;IAE5D,MAAM,KAAK,GAAc,IAAI,CAAC,SAAS,IAAK,SAAkC,CAAA;IAC9E,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE;QACnC,GAAG,EAAE,IAAI,CAAC,cAAc;QACxB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;QACvB,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;KAC5B,CAAC,CAAA;IAEF,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QACd,MAAM,IAAI,YAAY,CACpB,gBAAgB,EAChB,yCAAyC,IAAI,CAAC,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI;YAC7E,iFAAiF,CACpF,CAAA;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAA;IAClF,IAAI,MAAgE,CAAA;IACpE,IAAI,CAAC;QACH,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;QACrF,MAAM,GAAG,KAAiE,CAAA;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,YAAY,CACpB,gBAAgB,EAChB,8DAA8D,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAC/F,CAAA;IACH,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACnD,MAAM,IAAI,YAAY,CACpB,gBAAgB,EAChB,gCAAgC,MAAM,CAAC,IAAI,IAAI,OAAO,MAAM,MAAM,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAC7G,CAAA;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
|
|
@@ -61,7 +61,7 @@ export function provisionNativeVenv(opts = {}) {
|
|
|
61
61
|
const steps = [];
|
|
62
62
|
const transcriberDir = opts.transcriberDir ?? env.COMPOST_TRANSCRIBER_DIR ?? findRepoTranscriberDir(undefined, exists);
|
|
63
63
|
if (transcriberDir === undefined || !exists(join(transcriberDir, 'pyproject.toml'))) {
|
|
64
|
-
throw new CompostError('INVALID_INPUT', 'could not locate the transcriber/ package.
|
|
64
|
+
throw new CompostError('INVALID_INPUT', 'could not locate the transcriber/ package — it ships inside the npm package since v0.1.2, so an outdated install is the usual cause. Upgrade with `npm install -g @they-juanreina/compost-cli@latest`, or pass --transcriber-dir / set COMPOST_TRANSCRIBER_DIR.');
|
|
65
65
|
}
|
|
66
66
|
const venvDir = managedVenvDir(env);
|
|
67
67
|
const venvPython = join(venvDir, 'bin', 'python');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provisionNative.js","sourceRoot":"","sources":["../../src/lib/provisionNative.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"provisionNative.js","sourceRoot":"","sources":["../../src/lib/provisionNative.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/queue.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
export type JobKind = 'transcribe' | 'legacy-ingest';
|
|
2
2
|
export type JobStatus = 'queued' | 'running' | 'done' | 'failed';
|
|
3
|
+
/** Attempts before a job moves to permanent `failed` status. Shared by the
|
|
4
|
+
* workers and surfaced in user-facing messages (`compost jobs requeue`). */
|
|
5
|
+
export declare const MAX_ATTEMPTS = 3;
|
|
3
6
|
export interface Job {
|
|
4
7
|
id: number;
|
|
5
8
|
kind: JobKind;
|
|
@@ -30,7 +33,29 @@ export declare class JobQueue {
|
|
|
30
33
|
complete(id: number): void;
|
|
31
34
|
fail(id: number, error: string, maxAttempts?: number): void;
|
|
32
35
|
list(status?: JobStatus): Job[];
|
|
36
|
+
counts(): Record<JobStatus, number>;
|
|
37
|
+
/** Reset permanently-failed jobs to `queued` with a fresh attempt budget.
|
|
38
|
+
* The last error is kept on the row until the retry overwrites it, so
|
|
39
|
+
* `compost jobs` still shows why the job died. Pass an id to requeue one
|
|
40
|
+
* job; omit it to requeue every failed job. Returns the requeued jobs. */
|
|
41
|
+
requeue(id?: number): Job[];
|
|
33
42
|
close(): void;
|
|
34
43
|
}
|
|
35
44
|
export declare function stateDbPath(seedPath: string): string;
|
|
45
|
+
/**
|
|
46
|
+
* Paths stored in the queue (and event log) are seed-relative whenever the
|
|
47
|
+
* file lives inside the seed, so a study folder moved or renamed in Finder
|
|
48
|
+
* keeps a working queue (#240). Paths outside the seed (`compost ingest
|
|
49
|
+
* ~/elsewhere/file.mp3`) stay absolute — they're machine-pinned either way.
|
|
50
|
+
*/
|
|
51
|
+
export declare function toSeedRelative(seedPath: string, p: string): string;
|
|
52
|
+
/**
|
|
53
|
+
* Resolve a stored source path against the seed root. Relative rows (the
|
|
54
|
+
* current format) just join. Absolute rows are legacy (pre-#240) — when the
|
|
55
|
+
* recorded location no longer exists (the seed was moved), recover by
|
|
56
|
+
* re-rooting the `sessions/…` tail under the current seed; if nothing
|
|
57
|
+
* resolves, return the original so the worker fails with the real path in
|
|
58
|
+
* the error.
|
|
59
|
+
*/
|
|
60
|
+
export declare function resolveJobSource(seedPath: string, p: string): string;
|
|
36
61
|
//# sourceMappingURL=queue.d.ts.map
|
package/dist/lib/queue.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/lib/queue.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,OAAO,GAAG,YAAY,GAAG,eAAe,CAAA;AACpD,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAA;AAEhE,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,OAAO,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,MAAM,EAAE,SAAS,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB;AA4CD,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;CACjB;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAmB;IACtC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAY;gBAEpB,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,YAAiB;IAQnD;+EAC2E;IAC3E,OAAO,CACL,IAAI,EAAE,OAAO,EACb,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACpC;QACD,EAAE,EAAE,MAAM,CAAA;QACV,QAAQ,EAAE,OAAO,CAAA;KAClB;IAeD;4EACwE;IACxE,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,GAAG,GAAG,IAAI;IAuBjC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAM1B,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/lib/queue.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,OAAO,GAAG,YAAY,GAAG,eAAe,CAAA;AACpD,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAA;AAEhE;4EAC4E;AAC5E,eAAO,MAAM,YAAY,IAAI,CAAA;AAE7B,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,OAAO,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,MAAM,EAAE,SAAS,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;CACrB;AA4CD,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;CACjB;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAmB;IACtC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAY;gBAEpB,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,YAAiB;IAQnD;+EAC2E;IAC3E,OAAO,CACL,IAAI,EAAE,OAAO,EACb,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACpC;QACD,EAAE,EAAE,MAAM,CAAA;QACV,QAAQ,EAAE,OAAO,CAAA;KAClB;IAeD;4EACwE;IACxE,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,GAAG,GAAG,IAAI;IAuBjC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAM1B,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,SAAe,GAAG,IAAI;IAUjE,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,GAAG,EAAE;IAS/B,MAAM,IAAI,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC;IASnC;;;8EAG0E;IAC1E,OAAO,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,GAAG,EAAE;IAkB3B,KAAK,IAAI,IAAI;CAGd;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAKlE;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAUpE"}
|
package/dist/lib/queue.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import { mkdirSync } from 'node:fs';
|
|
2
|
-
import { dirname, join } from 'node:path';
|
|
1
|
+
import { existsSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { dirname, isAbsolute, join, relative, sep } from 'node:path';
|
|
3
3
|
import Database from 'better-sqlite3';
|
|
4
|
+
/** Attempts before a job moves to permanent `failed` status. Shared by the
|
|
5
|
+
* workers and surfaced in user-facing messages (`compost jobs requeue`). */
|
|
6
|
+
export const MAX_ATTEMPTS = 3;
|
|
4
7
|
const SCHEMA = `
|
|
5
8
|
CREATE TABLE IF NOT EXISTS jobs (
|
|
6
9
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
@@ -79,7 +82,7 @@ export class JobQueue {
|
|
|
79
82
|
.prepare("UPDATE jobs SET status = 'done', updated_at = ?, error = NULL WHERE id = ?")
|
|
80
83
|
.run(this.now().toISOString(), id);
|
|
81
84
|
}
|
|
82
|
-
fail(id, error, maxAttempts =
|
|
85
|
+
fail(id, error, maxAttempts = MAX_ATTEMPTS) {
|
|
83
86
|
const row = this.db.prepare('SELECT attempts FROM jobs WHERE id = ?').get(id);
|
|
84
87
|
const status = row !== undefined && row.attempts >= maxAttempts ? 'failed' : 'queued';
|
|
85
88
|
this.db
|
|
@@ -92,6 +95,34 @@ export class JobQueue {
|
|
|
92
95
|
: this.db.prepare('SELECT * FROM jobs WHERE status = ? ORDER BY id').all(status));
|
|
93
96
|
return rows.map(rowToJob);
|
|
94
97
|
}
|
|
98
|
+
counts() {
|
|
99
|
+
const rows = this.db
|
|
100
|
+
.prepare('SELECT status, COUNT(*) AS n FROM jobs GROUP BY status')
|
|
101
|
+
.all();
|
|
102
|
+
const out = { queued: 0, running: 0, done: 0, failed: 0 };
|
|
103
|
+
for (const r of rows)
|
|
104
|
+
out[r.status] = r.n;
|
|
105
|
+
return out;
|
|
106
|
+
}
|
|
107
|
+
/** Reset permanently-failed jobs to `queued` with a fresh attempt budget.
|
|
108
|
+
* The last error is kept on the row until the retry overwrites it, so
|
|
109
|
+
* `compost jobs` still shows why the job died. Pass an id to requeue one
|
|
110
|
+
* job; omit it to requeue every failed job. Returns the requeued jobs. */
|
|
111
|
+
requeue(id) {
|
|
112
|
+
const tx = this.db.transaction(() => {
|
|
113
|
+
const rows = (id === undefined
|
|
114
|
+
? this.db.prepare("SELECT * FROM jobs WHERE status = 'failed' ORDER BY id").all()
|
|
115
|
+
: this.db.prepare("SELECT * FROM jobs WHERE status = 'failed' AND id = ?").all(id));
|
|
116
|
+
const ts = this.now().toISOString();
|
|
117
|
+
for (const row of rows) {
|
|
118
|
+
this.db
|
|
119
|
+
.prepare("UPDATE jobs SET status = 'queued', attempts = 0, updated_at = ? WHERE id = ?")
|
|
120
|
+
.run(ts, row.id);
|
|
121
|
+
}
|
|
122
|
+
return rows.map((row) => rowToJob({ ...row, status: 'queued', attempts: 0, updated_at: ts }));
|
|
123
|
+
});
|
|
124
|
+
return tx();
|
|
125
|
+
}
|
|
95
126
|
close() {
|
|
96
127
|
this.db.close();
|
|
97
128
|
}
|
|
@@ -99,4 +130,40 @@ export class JobQueue {
|
|
|
99
130
|
export function stateDbPath(seedPath) {
|
|
100
131
|
return join(seedPath, '.compost', 'state.sqlite');
|
|
101
132
|
}
|
|
133
|
+
/**
|
|
134
|
+
* Paths stored in the queue (and event log) are seed-relative whenever the
|
|
135
|
+
* file lives inside the seed, so a study folder moved or renamed in Finder
|
|
136
|
+
* keeps a working queue (#240). Paths outside the seed (`compost ingest
|
|
137
|
+
* ~/elsewhere/file.mp3`) stay absolute — they're machine-pinned either way.
|
|
138
|
+
*/
|
|
139
|
+
export function toSeedRelative(seedPath, p) {
|
|
140
|
+
if (!isAbsolute(p))
|
|
141
|
+
return p;
|
|
142
|
+
const rel = relative(seedPath, p);
|
|
143
|
+
if (rel.startsWith(`..${sep}`) || rel === '..' || isAbsolute(rel))
|
|
144
|
+
return p;
|
|
145
|
+
return rel;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Resolve a stored source path against the seed root. Relative rows (the
|
|
149
|
+
* current format) just join. Absolute rows are legacy (pre-#240) — when the
|
|
150
|
+
* recorded location no longer exists (the seed was moved), recover by
|
|
151
|
+
* re-rooting the `sessions/…` tail under the current seed; if nothing
|
|
152
|
+
* resolves, return the original so the worker fails with the real path in
|
|
153
|
+
* the error.
|
|
154
|
+
*/
|
|
155
|
+
export function resolveJobSource(seedPath, p) {
|
|
156
|
+
if (!isAbsolute(p))
|
|
157
|
+
return join(seedPath, p);
|
|
158
|
+
if (existsSync(p))
|
|
159
|
+
return p;
|
|
160
|
+
const marker = `${sep}sessions${sep}`;
|
|
161
|
+
const at = p.indexOf(marker);
|
|
162
|
+
if (at !== -1) {
|
|
163
|
+
const rerooted = join(seedPath, p.slice(at + 1));
|
|
164
|
+
if (existsSync(rerooted))
|
|
165
|
+
return rerooted;
|
|
166
|
+
}
|
|
167
|
+
return p;
|
|
168
|
+
}
|
|
102
169
|
//# sourceMappingURL=queue.js.map
|
package/dist/lib/queue.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/lib/queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/lib/queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type Snapshot } from '@they-juanreina/compost-provenance';
|
|
2
|
+
/** A current snapshot plus the timestamp of its latest event, so callers can
|
|
3
|
+
* sort by recency ("recent activity on top") without a second query. */
|
|
4
|
+
export interface SnapshotView extends Snapshot {
|
|
5
|
+
last_event_ts: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* List the current snapshots of every artifact of `kind`, newest activity first.
|
|
9
|
+
* Reads the append-only event log and folds each artifact's events with the
|
|
10
|
+
* provenance reducer (no snapshot-table writes, so it's safe on a read-only DB).
|
|
11
|
+
* Returns [] when the seed has no event log yet. Archived (rejected) artifacts
|
|
12
|
+
* are excluded unless `includeArchived` is set.
|
|
13
|
+
*/
|
|
14
|
+
export declare function listArtifacts(seedPath: string, kind: string, opts?: {
|
|
15
|
+
includeArchived?: boolean;
|
|
16
|
+
}): SnapshotView[];
|
|
17
|
+
/**
|
|
18
|
+
* Resolve a single artifact's current snapshot by ref — its human id
|
|
19
|
+
* (`H-001`, `C-slug`, `T-slug`, stored in the create payload's `id`) or a
|
|
20
|
+
* SHA256 artifact_id prefix. Returns null when the seed has no event log or no
|
|
21
|
+
* matching artifact.
|
|
22
|
+
*/
|
|
23
|
+
export declare function getArtifact(seedPath: string, kind: string, ref: string): SnapshotView | null;
|
|
24
|
+
//# sourceMappingURL=reads.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reads.d.ts","sourceRoot":"","sources":["../../src/lib/reads.ts"],"names":[],"mappings":"AAEA,OAAO,EAAsB,KAAK,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAGtF;wEACwE;AACxE,MAAM,WAAW,YAAa,SAAQ,QAAQ;IAC5C,aAAa,EAAE,MAAM,CAAA;CACtB;AAiDD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE;IAAE,eAAe,CAAC,EAAE,OAAO,CAAA;CAAO,GACvC,YAAY,EAAE,CAkChB;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAiC5F"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { reduce } from '@they-juanreina/compost-provenance';
|
|
4
|
+
import Database from 'better-sqlite3';
|
|
5
|
+
function rowToEvent(r) {
|
|
6
|
+
return {
|
|
7
|
+
id: r.id,
|
|
8
|
+
ts: r.ts,
|
|
9
|
+
artifact_kind: r.artifact_kind,
|
|
10
|
+
artifact_id: r.artifact_id,
|
|
11
|
+
action: r.action,
|
|
12
|
+
actor_type: r.actor_type,
|
|
13
|
+
actor_id: r.actor_id,
|
|
14
|
+
payload: JSON.parse(r.payload),
|
|
15
|
+
parent_event: r.parent_event,
|
|
16
|
+
batch_id: r.batch_id,
|
|
17
|
+
...(r.agent_name !== null ? { agent_name: r.agent_name } : {}),
|
|
18
|
+
...(r.agent_version !== null ? { agent_version: r.agent_version } : {}),
|
|
19
|
+
...(r.prompt_hash !== null ? { prompt_hash: r.prompt_hash } : {}),
|
|
20
|
+
...(r.model !== null ? { model: r.model } : {}),
|
|
21
|
+
...(r.input_id !== null ? { input_id: r.input_id } : {}),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function openReadonly(seedPath) {
|
|
25
|
+
const dbPath = join(seedPath, '.compost', 'events.sqlite');
|
|
26
|
+
if (!existsSync(dbPath))
|
|
27
|
+
return null;
|
|
28
|
+
return new Database(dbPath, { readonly: true, fileMustExist: true });
|
|
29
|
+
}
|
|
30
|
+
const EVENT_COLUMNS = 'id, ts, artifact_kind, artifact_id, action, actor_type, actor_id, agent_name, agent_version, prompt_hash, model, input_id, payload, parent_event, batch_id';
|
|
31
|
+
/**
|
|
32
|
+
* List the current snapshots of every artifact of `kind`, newest activity first.
|
|
33
|
+
* Reads the append-only event log and folds each artifact's events with the
|
|
34
|
+
* provenance reducer (no snapshot-table writes, so it's safe on a read-only DB).
|
|
35
|
+
* Returns [] when the seed has no event log yet. Archived (rejected) artifacts
|
|
36
|
+
* are excluded unless `includeArchived` is set.
|
|
37
|
+
*/
|
|
38
|
+
export function listArtifacts(seedPath, kind, opts = {}) {
|
|
39
|
+
const db = openReadonly(seedPath);
|
|
40
|
+
if (db === null)
|
|
41
|
+
return [];
|
|
42
|
+
try {
|
|
43
|
+
const rows = db
|
|
44
|
+
.prepare(`SELECT ${EVENT_COLUMNS} FROM events WHERE artifact_kind = ? ORDER BY ts, rowid`)
|
|
45
|
+
.all(kind);
|
|
46
|
+
const byArtifact = new Map();
|
|
47
|
+
for (const row of rows) {
|
|
48
|
+
const bucket = byArtifact.get(row.artifact_id);
|
|
49
|
+
if (bucket === undefined) {
|
|
50
|
+
byArtifact.set(row.artifact_id, { events: [rowToEvent(row)], lastTs: row.ts });
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
bucket.events.push(rowToEvent(row));
|
|
54
|
+
bucket.lastTs = row.ts; // rows are ts-ordered, so the last seen is newest
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const views = [];
|
|
58
|
+
for (const { events, lastTs } of byArtifact.values()) {
|
|
59
|
+
const snapshot = reduce(events);
|
|
60
|
+
if (snapshot === null)
|
|
61
|
+
continue;
|
|
62
|
+
if (snapshot.archived && opts.includeArchived !== true)
|
|
63
|
+
continue;
|
|
64
|
+
views.push({ ...snapshot, last_event_ts: lastTs });
|
|
65
|
+
}
|
|
66
|
+
// Newest activity first.
|
|
67
|
+
views.sort((a, b) => a.last_event_ts < b.last_event_ts ? 1 : a.last_event_ts > b.last_event_ts ? -1 : 0);
|
|
68
|
+
return views;
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
db.close();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Resolve a single artifact's current snapshot by ref — its human id
|
|
76
|
+
* (`H-001`, `C-slug`, `T-slug`, stored in the create payload's `id`) or a
|
|
77
|
+
* SHA256 artifact_id prefix. Returns null when the seed has no event log or no
|
|
78
|
+
* matching artifact.
|
|
79
|
+
*/
|
|
80
|
+
export function getArtifact(seedPath, kind, ref) {
|
|
81
|
+
const db = openReadonly(seedPath);
|
|
82
|
+
if (db === null)
|
|
83
|
+
return null;
|
|
84
|
+
try {
|
|
85
|
+
let artifactId;
|
|
86
|
+
// Human id stored in the create event payload.
|
|
87
|
+
const byHuman = db
|
|
88
|
+
.prepare("SELECT artifact_id FROM events WHERE artifact_kind = ? AND action = 'create' AND json_extract(payload, '$.id') = ? ORDER BY ts, rowid LIMIT 1")
|
|
89
|
+
.get(kind, ref);
|
|
90
|
+
if (byHuman !== undefined) {
|
|
91
|
+
artifactId = byHuman.artifact_id;
|
|
92
|
+
}
|
|
93
|
+
else if (/^[a-f0-9]{8,64}$/i.test(ref)) {
|
|
94
|
+
const bySha = db
|
|
95
|
+
.prepare("SELECT artifact_id FROM events WHERE artifact_kind = ? AND action = 'create' AND artifact_id LIKE ? ORDER BY ts, rowid LIMIT 1")
|
|
96
|
+
.get(kind, `${ref.toLowerCase()}%`);
|
|
97
|
+
artifactId = bySha?.artifact_id;
|
|
98
|
+
}
|
|
99
|
+
if (artifactId === undefined)
|
|
100
|
+
return null;
|
|
101
|
+
const rows = db
|
|
102
|
+
.prepare(`SELECT ${EVENT_COLUMNS} FROM events WHERE artifact_id = ? ORDER BY ts, rowid`)
|
|
103
|
+
.all(artifactId);
|
|
104
|
+
if (rows.length === 0)
|
|
105
|
+
return null;
|
|
106
|
+
const snapshot = reduce(rows.map(rowToEvent));
|
|
107
|
+
if (snapshot === null)
|
|
108
|
+
return null;
|
|
109
|
+
return { ...snapshot, last_event_ts: rows[rows.length - 1]?.ts ?? '' };
|
|
110
|
+
}
|
|
111
|
+
finally {
|
|
112
|
+
db.close();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=reads.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reads.js","sourceRoot":"","sources":["../../src/lib/reads.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export interface BlindRecodeResult {
|
|
2
|
+
codings: number;
|
|
3
|
+
highlights: number;
|
|
4
|
+
batch_id: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Record a researcher's INDEPENDENT (blind) codings for intercoder agreement.
|
|
8
|
+
*
|
|
9
|
+
* Each (highlight, code) becomes a researcher `link` event on a `coding` artifact,
|
|
10
|
+
* flagged `blind: true`, so `compost agreement` can tell genuine double-coding from
|
|
11
|
+
* reactive endorsement. The "blind" guarantee is procedural — the researcher codes
|
|
12
|
+
* without seeing the machine's codes; this just records the result. Idempotent at
|
|
13
|
+
* the metric level (duplicate (highlight, code) pairs collapse).
|
|
14
|
+
*/
|
|
15
|
+
export declare function blindRecode(seedPath: string, input: {
|
|
16
|
+
assignments: Record<string, string[]>;
|
|
17
|
+
researcherId: string;
|
|
18
|
+
}): BlindRecodeResult;
|
|
19
|
+
//# sourceMappingURL=recode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recode.d.ts","sourceRoot":"","sources":["../../src/lib/recode.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GACrE,iBAAiB,CA6BnB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { CompostError } from '../errors.js';
|
|
2
|
+
import { artifactId, openSeedEvents } from './events.js';
|
|
3
|
+
/**
|
|
4
|
+
* Record a researcher's INDEPENDENT (blind) codings for intercoder agreement.
|
|
5
|
+
*
|
|
6
|
+
* Each (highlight, code) becomes a researcher `link` event on a `coding` artifact,
|
|
7
|
+
* flagged `blind: true`, so `compost agreement` can tell genuine double-coding from
|
|
8
|
+
* reactive endorsement. The "blind" guarantee is procedural — the researcher codes
|
|
9
|
+
* without seeing the machine's codes; this just records the result. Idempotent at
|
|
10
|
+
* the metric level (duplicate (highlight, code) pairs collapse).
|
|
11
|
+
*/
|
|
12
|
+
export function blindRecode(seedPath, input) {
|
|
13
|
+
const events = openSeedEvents(seedPath);
|
|
14
|
+
const batchId = `blind-recode:${new Date().toISOString()}`;
|
|
15
|
+
try {
|
|
16
|
+
const rows = [];
|
|
17
|
+
for (const [highlight, codes] of Object.entries(input.assignments)) {
|
|
18
|
+
for (const code of new Set(codes)) {
|
|
19
|
+
rows.push({
|
|
20
|
+
artifact_kind: 'coding',
|
|
21
|
+
artifact_id: artifactId({ coder: 'researcher-blind', highlight, code }),
|
|
22
|
+
action: 'link',
|
|
23
|
+
actor_type: 'researcher',
|
|
24
|
+
actor_id: input.researcherId,
|
|
25
|
+
payload: { code, highlight, blind: true },
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
if (rows.length === 0) {
|
|
30
|
+
throw new CompostError('INVALID_INPUT', 'No codings to record (assignments were empty).');
|
|
31
|
+
}
|
|
32
|
+
events.appendBatch(rows, batchId);
|
|
33
|
+
return {
|
|
34
|
+
codings: rows.length,
|
|
35
|
+
highlights: Object.keys(input.assignments).length,
|
|
36
|
+
batch_id: batchId,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
events.close();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=recode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recode.js","sourceRoot":"","sources":["../../src/lib/recode.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAQxD;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CACzB,QAAgB,EAChB,KAAsE;IAEtE,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAA;IACvC,MAAM,OAAO,GAAG,gBAAgB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAA;IAC1D,IAAI,CAAC;QACH,MAAM,IAAI,GAAiB,EAAE,CAAA;QAC7B,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;YACnE,KAAK,MAAM,IAAI,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAClC,IAAI,CAAC,IAAI,CAAC;oBACR,aAAa,EAAE,QAAQ;oBACvB,WAAW,EAAE,UAAU,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;oBACvE,MAAM,EAAE,MAAM;oBACd,UAAU,EAAE,YAAY;oBACxB,QAAQ,EAAE,KAAK,CAAC,YAAY;oBAC5B,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE;iBAC1C,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,YAAY,CAAC,eAAe,EAAE,gDAAgD,CAAC,CAAA;QAC3F,CAAC;QACD,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACjC,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,MAAM;YACpB,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,MAAM;YACjD,QAAQ,EAAE,OAAO;SAClB,CAAA;IACH,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,KAAK,EAAE,CAAA;IAChB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type AiInputRow } from '@they-juanreina/compost-provenance';
|
|
2
|
+
export interface RerunReport {
|
|
3
|
+
status: 'verified' | 'regenerated';
|
|
4
|
+
artifact_id: string;
|
|
5
|
+
artifact_kind: string;
|
|
6
|
+
create_event_id: string;
|
|
7
|
+
actor_type: string;
|
|
8
|
+
model: string | null;
|
|
9
|
+
/** Did the stored bundle hash back to the event's input_id? */
|
|
10
|
+
integrity_ok: boolean;
|
|
11
|
+
/** Regeneration (only with apply). */
|
|
12
|
+
regenerated_event_id?: string;
|
|
13
|
+
applied_model?: string;
|
|
14
|
+
diff?: PayloadDiff;
|
|
15
|
+
note?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface PayloadDiff {
|
|
18
|
+
changed: boolean;
|
|
19
|
+
fields: Array<{
|
|
20
|
+
field: string;
|
|
21
|
+
before: unknown;
|
|
22
|
+
after: unknown;
|
|
23
|
+
}>;
|
|
24
|
+
}
|
|
25
|
+
/** Shallow field-level diff between two payload objects. */
|
|
26
|
+
export declare function diffPayload(before: unknown, after: unknown): PayloadDiff;
|
|
27
|
+
/** Regenerate an output from its captured inputs (model may be overridden).
|
|
28
|
+
* Returns the new artifact payload. Injected so the LLM/provider dependency is
|
|
29
|
+
* mockable; the CLI wires a default that calls the LLM adapter for `ai` bundles. */
|
|
30
|
+
export type Regenerator = (inputs: AiInputRow, ctx: {
|
|
31
|
+
actorType: string;
|
|
32
|
+
modelOverride?: string;
|
|
33
|
+
}) => Promise<Record<string, unknown>>;
|
|
34
|
+
export interface RerunOptions {
|
|
35
|
+
ref: string;
|
|
36
|
+
apply?: boolean;
|
|
37
|
+
modelOverride?: string;
|
|
38
|
+
regenerate?: Regenerator;
|
|
39
|
+
researcherId?: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Rerun an AI/agent generation from its captured inputs.
|
|
43
|
+
*
|
|
44
|
+
* Default (no apply): VERIFY — confirm the stored bundle hashes back to the
|
|
45
|
+
* event's input_id (the inputs are intact and reconstructable). With `apply`:
|
|
46
|
+
* REGENERATE via the injected generator, emit a new event chained to the original
|
|
47
|
+
* (parent_event), and diff the payloads. LLM regeneration is non-deterministic, so
|
|
48
|
+
* an `ai` diff is fuzzy; a deterministic `agent` reproduces exactly.
|
|
49
|
+
*/
|
|
50
|
+
export declare function rerunEvent(seedPath: string, opts: RerunOptions): Promise<RerunReport>;
|
|
51
|
+
//# sourceMappingURL=rerun.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rerun.d.ts","sourceRoot":"","sources":["../../src/lib/rerun.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,UAAU,EAAwB,MAAM,oCAAoC,CAAA;AA8D1F,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,UAAU,GAAG,aAAa,CAAA;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,MAAM,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;IACvB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,+DAA+D;IAC/D,YAAY,EAAE,OAAO,CAAA;IACrB,sCAAsC;IACtC,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,IAAI,CAAC,EAAE,WAAW,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;CAClE;AAED,4DAA4D;AAC5D,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,WAAW,CAWxE;AAED;;oFAEoF;AACpF,MAAM,MAAM,WAAW,GAAG,CACxB,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,KAC/C,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;AAErC,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,WAAW,CAAA;IACxB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CA0G3F"}
|