@they-juanreina/compost-cli 0.1.2 → 0.1.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/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/backup.d.ts +3 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +31 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/chat.d.ts.map +1 -1
- package/dist/commands/chat.js +3 -2
- package/dist/commands/chat.js.map +1 -1
- 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 +64 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/ingest.d.ts.map +1 -1
- package/dist/commands/ingest.js +1 -0
- package/dist/commands/ingest.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +2 -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 +19 -7
- 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 +12 -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 +145 -0
- package/dist/commands/secrets.js.map +1 -0
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +95 -2
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/setupItem.d.ts +26 -0
- package/dist/commands/setupItem.d.ts.map +1 -0
- package/dist/commands/setupItem.js +145 -0
- package/dist/commands/setupItem.js.map +1 -0
- 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 +32 -4
- 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/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +53 -6
- package/dist/commands/watch.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/errors.d.ts +5 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +6 -0
- package/dist/errors.js.map +1 -1
- package/dist/exporters/pdf.d.ts.map +1 -1
- package/dist/exporters/pdf.js +2 -1
- package/dist/exporters/pdf.js.map +1 -1
- 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/legacy_client.d.ts.map +1 -1
- package/dist/legacy_client.js +2 -1
- package/dist/legacy_client.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 +35 -2
- package/dist/lib/artifacts.d.ts.map +1 -1
- package/dist/lib/artifacts.js +158 -29
- package/dist/lib/artifacts.js.map +1 -1
- package/dist/lib/backup.d.ts +37 -0
- package/dist/lib/backup.d.ts.map +1 -0
- package/dist/lib/backup.js +57 -0
- package/dist/lib/backup.js.map +1 -0
- package/dist/lib/childEnv.d.ts +13 -0
- package/dist/lib/childEnv.d.ts.map +1 -0
- package/dist/lib/childEnv.js +45 -0
- package/dist/lib/childEnv.js.map +1 -0
- 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 +44 -1
- package/dist/lib/events.d.ts.map +1 -1
- package/dist/lib/events.js +55 -2
- 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 -4
- package/dist/lib/journal.d.ts.map +1 -1
- package/dist/lib/journal.js +53 -16
- package/dist/lib/journal.js.map +1 -1
- package/dist/lib/legacyNative.d.ts +17 -0
- package/dist/lib/legacyNative.d.ts.map +1 -0
- package/dist/lib/legacyNative.js +38 -0
- package/dist/lib/legacyNative.js.map +1 -0
- package/dist/lib/migrate.d.ts.map +1 -1
- package/dist/lib/migrate.js +9 -2
- package/dist/lib/migrate.js.map +1 -1
- package/dist/lib/nativeRuntime.d.ts +31 -0
- package/dist/lib/nativeRuntime.d.ts.map +1 -1
- package/dist/lib/nativeRuntime.js +38 -0
- package/dist/lib/nativeRuntime.js.map +1 -1
- package/dist/lib/pathSafe.d.ts +8 -0
- package/dist/lib/pathSafe.d.ts.map +1 -0
- package/dist/lib/pathSafe.js +12 -0
- package/dist/lib/pathSafe.js.map +1 -0
- package/dist/lib/provisionNative.d.ts.map +1 -1
- package/dist/lib/provisionNative.js +7 -3
- 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/redact.d.ts +7 -0
- package/dist/lib/redact.d.ts.map +1 -0
- package/dist/lib/redact.js +45 -0
- package/dist/lib/redact.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 +160 -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 +14 -3
- package/dist/lib/retrieve.js.map +1 -1
- package/dist/lib/saturate.js +3 -3
- package/dist/lib/saturate.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 +514 -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/seedResolve.d.ts +5 -0
- package/dist/lib/seedResolve.d.ts.map +1 -1
- package/dist/lib/seedResolve.js +12 -3
- package/dist/lib/seedResolve.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 +53 -4
- package/dist/lib/session.js.map +1 -1
- package/dist/lib/sessionId.d.ts +9 -0
- package/dist/lib/sessionId.d.ts.map +1 -0
- package/dist/lib/sessionId.js +37 -0
- package/dist/lib/sessionId.js.map +1 -0
- package/dist/lib/setup.d.ts +9 -0
- package/dist/lib/setup.d.ts.map +1 -1
- package/dist/lib/setup.js +97 -29
- package/dist/lib/setup.js.map +1 -1
- package/dist/lib/setupItem.d.ts +99 -0
- package/dist/lib/setupItem.d.ts.map +1 -0
- package/dist/lib/setupItem.js +262 -0
- package/dist/lib/setupItem.js.map +1 -0
- package/dist/lib/setupWizard.d.ts +53 -0
- package/dist/lib/setupWizard.d.ts.map +1 -0
- package/dist/lib/setupWizard.js +347 -0
- package/dist/lib/setupWizard.js.map +1 -0
- package/dist/lib/snap.d.ts.map +1 -1
- package/dist/lib/snap.js +5 -0
- package/dist/lib/snap.js.map +1 -1
- 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/stdin.d.ts +5 -0
- package/dist/lib/stdin.d.ts.map +1 -0
- package/dist/lib/stdin.js +12 -0
- package/dist/lib/stdin.js.map +1 -0
- package/dist/lib/transcribeNative.d.ts +4 -9
- package/dist/lib/transcribeNative.d.ts.map +1 -1
- package/dist/lib/transcribeNative.js +11 -26
- package/dist/lib/transcribeNative.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 +71 -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 +65 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/llm/adapter.d.ts +5 -0
- package/dist/llm/adapter.d.ts.map +1 -1
- package/dist/llm/adapter.js +27 -8
- package/dist/llm/adapter.js.map +1 -1
- package/dist/llm/http.d.ts +22 -1
- package/dist/llm/http.d.ts.map +1 -1
- package/dist/llm/http.js +52 -30
- package/dist/llm/http.js.map +1 -1
- package/dist/llm/providers/anthropic.d.ts.map +1 -1
- package/dist/llm/providers/anthropic.js +6 -9
- package/dist/llm/providers/anthropic.js.map +1 -1
- package/dist/llm/providers/ollama.d.ts.map +1 -1
- package/dist/llm/providers/ollama.js +8 -7
- package/dist/llm/providers/ollama.js.map +1 -1
- package/dist/llm/providers/openai_compatible.d.ts.map +1 -1
- package/dist/llm/providers/openai_compatible.js +2 -7
- package/dist/llm/providers/openai_compatible.js.map +1 -1
- package/dist/logging.d.ts.map +1 -1
- package/dist/logging.js +3 -1
- package/dist/logging.js.map +1 -1
- package/dist/loops/embed_worker.d.ts +3 -0
- package/dist/loops/embed_worker.d.ts.map +1 -1
- package/dist/loops/embed_worker.js +11 -4
- package/dist/loops/embed_worker.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 +91 -10
- package/dist/loops/legacy_worker.js.map +1 -1
- package/dist/loops/supervisor.d.ts +7 -0
- package/dist/loops/supervisor.d.ts.map +1 -1
- package/dist/loops/supervisor.js +17 -2
- 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 +3 -0
- package/dist/loops/transcribe_worker.d.ts.map +1 -1
- package/dist/loops/transcribe_worker.js +15 -7
- 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 +27 -6
- package/dist/output.js.map +1 -1
- package/dist/render/glyphs.d.ts +30 -0
- package/dist/render/glyphs.d.ts.map +1 -0
- package/dist/render/glyphs.js +38 -0
- package/dist/render/glyphs.js.map +1 -0
- package/dist/render/human.d.ts +22 -0
- package/dist/render/human.d.ts.map +1 -0
- package/dist/render/human.js +62 -0
- package/dist/render/human.js.map +1 -0
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +32 -4
- package/dist/router.js.map +1 -1
- package/dist/transcriber_client.d.ts.map +1 -1
- package/dist/transcriber_client.js +2 -1
- package/dist/transcriber_client.js.map +1 -1
- package/package.json +12 -5
- package/templates/AGENTS.md +1 -1
- 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/transcribe_cli.py +15 -1
- package/transcriber/app/vad.py +82 -11
package/dist/lib/migrate.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { existsSync, mkdirSync, readdirSync, renameSync, statSync, writeFileSync } from 'node:fs';
|
|
2
2
|
import { basename, join } from 'node:path';
|
|
3
3
|
import { CompostError } from '../errors.js';
|
|
4
|
+
import { seedNameOf } from './seedResolve.js';
|
|
4
5
|
import { loadTemplate, render } from './templates.js';
|
|
5
6
|
/** Folders that compost expects in a migrated seed, beyond the renamed legacy dirs. */
|
|
6
7
|
const SCAFFOLD_DIRS = [
|
|
@@ -61,7 +62,7 @@ export function planMigration(seedPath) {
|
|
|
61
62
|
scaffoldFiles.push('seed.md');
|
|
62
63
|
}
|
|
63
64
|
return {
|
|
64
|
-
seed_name:
|
|
65
|
+
seed_name: seedNameOf(seedPath),
|
|
65
66
|
path: seedPath,
|
|
66
67
|
already_migrated: alreadyMigrated,
|
|
67
68
|
renames,
|
|
@@ -111,7 +112,13 @@ export function migrate(seedPath, opts = {}) {
|
|
|
111
112
|
};
|
|
112
113
|
for (const file of plan.scaffold_files) {
|
|
113
114
|
const templateName = file === 'seed.md' ? 'seed.md' : basename(file);
|
|
114
|
-
|
|
115
|
+
// Write atomically (temp + rename) so a failure mid-write never leaves a
|
|
116
|
+
// truncated config.toml/seed.md that re-runs would keep (existsSync guards
|
|
117
|
+
// the scaffold, so a half-written file would otherwise never be repaired).
|
|
118
|
+
const finalPath = join(seedPath, file);
|
|
119
|
+
const tmpPath = `${finalPath}.tmp`;
|
|
120
|
+
writeFileSync(tmpPath, render(loadTemplate(templateName), vars), 'utf8');
|
|
121
|
+
renameSync(tmpPath, finalPath);
|
|
115
122
|
}
|
|
116
123
|
return { ...plan, applied: true };
|
|
117
124
|
}
|
package/dist/lib/migrate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/lib/migrate.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/lib/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACjG,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAErD,uFAAuF;AACvF,MAAM,aAAa,GAAG;IACpB,UAAU;IACV,YAAY;IACZ,UAAU;IACV,SAAS;IACT,QAAQ;IACR,iBAAiB;IACjB,UAAU;IACV,eAAe;IACf,eAAe;CACP,CAAA;AAEV,MAAM,kBAAkB,GAAG,iBAAiB,CAAA;AAyB5C;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACvC,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,IAAI,CAAA;IAC3B,yIAAyI;IACzI,OAAO,CAAC,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,CAAA;AAC5B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QAC/D,MAAM,IAAI,YAAY,CAAC,gBAAgB,EAAE,oBAAoB,QAAQ,EAAE,CAAC,CAAA;IAC1E,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACjD,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAA;QACnC,OAAO,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,MAAM,OAAO,GAAiB,EAAE,CAAA;IAChC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;QACnC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;QAC3C,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAA;IAEtF,MAAM,YAAY,GAAa,EAAE,CAAA;IACjC,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC9D,CAAC;IAED,MAAM,aAAa,GAAa,EAAE,CAAA;IAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC;QAC3D,aAAa,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAA;IAC5C,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;QACzD,aAAa,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;IAC1C,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;QAC3C,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC/B,CAAC;IAED,OAAO;QACL,SAAS,EAAE,UAAU,CAAC,QAAQ,CAAC;QAC/B,IAAI,EAAE,QAAQ;QACd,gBAAgB,EAAE,eAAe;QACjC,OAAO;QACP,aAAa,EAAE,YAAY;QAC3B,cAAc,EAAE,aAAa;KAC9B,CAAA;AACH,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,QAAgB,EAAE,OAAuB,EAAE;IACjE,MAAM,IAAI,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,IAAI,CAAA;IAEjC,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;IACpC,CAAC;IAED,mEAAmE;IACnE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7B,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,YAAY,CACpB,eAAe,EACf,kBAAkB,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,EAAE,6CAA6C,CAClF,CAAA;QACH,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,MAAM,SAAS,GAAiB,EAAE,CAAA;IAClC,IAAI,CAAC;QACH,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7B,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;YACxD,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACnB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;YACvC,IAAI,CAAC;gBACH,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;YAChE,CAAC;YAAC,MAAM,CAAC;gBACP,oDAAoD;YACtD,CAAC;QACH,CAAC;QACD,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,6CAA6C,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;IAC9F,CAAC;IAED,8CAA8C;IAC9C,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACrC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACrD,CAAC;IAED,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,CAAA;IAC9C,MAAM,IAAI,GAA2B;QACnC,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,UAAU,EAAE,GAAG,CAAC,WAAW,EAAE;KAC9B,CAAA;IACD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACvC,MAAM,YAAY,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;QACpE,yEAAyE;QACzE,2EAA2E;QAC3E,2EAA2E;QAC3E,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QACtC,MAAM,OAAO,GAAG,GAAG,SAAS,MAAM,CAAA;QAClC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAA;QACxE,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;IAChC,CAAC;IAED,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;AACnC,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type SpawnSyncReturns } from 'node:child_process';
|
|
1
2
|
/**
|
|
2
3
|
* Native (host) transcription runtime resolution (#176, native-first).
|
|
3
4
|
*
|
|
@@ -58,4 +59,34 @@ export declare function diagnoseNativeRuntime(opts?: ResolveNativeOpts): NativeR
|
|
|
58
59
|
* Silicon when resolvable, else Docker (the cross-platform fallback).
|
|
59
60
|
*/
|
|
60
61
|
export declare function pickRuntime(explicit: string | undefined, native: NativeRuntimePaths | null, appleSilicon?: boolean): 'native' | 'docker';
|
|
62
|
+
/** Injectable spawn surface (real `spawnSync` in prod; a fake in tests). */
|
|
63
|
+
export type SpawnImpl = (cmd: string, args: string[], opts: {
|
|
64
|
+
cwd: string;
|
|
65
|
+
env: NodeJS.ProcessEnv;
|
|
66
|
+
encoding: 'utf8';
|
|
67
|
+
maxBuffer: number;
|
|
68
|
+
}) => Pick<SpawnSyncReturns<string>, 'status' | 'stdout' | 'stderr' | 'error'>;
|
|
69
|
+
export interface RunNativeCliOptions {
|
|
70
|
+
cwd: string;
|
|
71
|
+
env: NodeJS.ProcessEnv;
|
|
72
|
+
/** Short noun used in the error messages, e.g. 'transcriber' / 'legacy-ingest'. */
|
|
73
|
+
label: string;
|
|
74
|
+
/** Recovery hint appended to the failed-to-start message. */
|
|
75
|
+
startHint: string;
|
|
76
|
+
spawnImpl?: SpawnImpl;
|
|
77
|
+
}
|
|
78
|
+
export interface NativeCliResult<T> {
|
|
79
|
+
parsed: T;
|
|
80
|
+
status: number | null;
|
|
81
|
+
stderr: string;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Spawn a native `python -m app.<cli>` entrypoint and parse its single JSON-line
|
|
85
|
+
* result. Owns the spawn dispatch, the 64 MiB buffer, the failed-to-start error,
|
|
86
|
+
* and the last-line/parse/object-guard. The caller keeps its own success check
|
|
87
|
+
* (`status !== 0 || parsed.status === 'failed'`) on the returned
|
|
88
|
+
* `{ parsed, status, stderr }`, since the two callers phrase that failure
|
|
89
|
+
* differently. (#176, #184)
|
|
90
|
+
*/
|
|
91
|
+
export declare function runNativeCli<T>(python: string, args: string[], opts: RunNativeCliOptions): NativeCliResult<T>;
|
|
61
92
|
//# sourceMappingURL=nativeRuntime.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nativeRuntime.d.ts","sourceRoot":"","sources":["../../src/lib/nativeRuntime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"nativeRuntime.d.ts","sourceRoot":"","sources":["../../src/lib/nativeRuntime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAAa,MAAM,oBAAoB,CAAA;AAQrE;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,cAAc,EAAE,MAAM,CAAA;CACvB;AAED,gFAAgF;AAChF,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED;iEACiE;AACjE,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAI3E;AAED,wDAAwD;AACxD,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAE9E;AAED;;;;;sEAKsE;AACtE,wBAAgB,sBAAsB,CACpC,QAAQ,GAAE,MAAgD,EAC1D,MAAM,GAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAoB,GAC1C,MAAM,GAAG,SAAS,CAUpB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAA;IAC/B,2CAA2C;IAC3C,kBAAkB,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAA;CAC9C;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,GAAE,iBAAsB,GAAG,kBAAkB,GAAG,IAAI,CAY5F;AAED;;;6DAG6D;AAC7D,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,UAAU,GAAG,KAAK,GAAG,cAAc,CAAA;IAClD,oBAAoB,CAAC,EAAE,UAAU,GAAG,KAAK,GAAG,WAAW,CAAA;CACxD;AAED,wBAAgB,qBAAqB,CAAC,IAAI,GAAE,iBAAsB,GAAG,sBAAsB,CA4C1F;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,MAAM,EAAE,kBAAkB,GAAG,IAAI,EACjC,YAAY,GAAE,OAA0B,GACvC,QAAQ,GAAG,QAAQ,CAGrB;AAED,4EAA4E;AAC5E,MAAM,MAAM,SAAS,GAAG,CACtB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,KAC/E,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAA;AAE7E,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAA;IACX,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;IACtB,mFAAmF;IACnF,KAAK,EAAE,MAAM,CAAA;IACb,6DAA6D;IAC7D,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB;AAED,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,MAAM,EAAE,CAAC,CAAA;IACT,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC5B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE,mBAAmB,GACxB,eAAe,CAAC,CAAC,CAAC,CA+BpB"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { spawnSync } from 'node:child_process';
|
|
1
2
|
import { existsSync } from 'node:fs';
|
|
2
3
|
import { homedir } from 'node:os';
|
|
3
4
|
import { dirname, join } from 'node:path';
|
|
4
5
|
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import { CompostError } from '../errors.js';
|
|
5
7
|
/** Native Metal/MLX ASR (parakeet-mlx) + pyannote-MPS require Apple Silicon. */
|
|
6
8
|
export function isAppleSilicon() {
|
|
7
9
|
return process.platform === 'darwin' && process.arch === 'arm64';
|
|
@@ -109,4 +111,40 @@ export function pickRuntime(explicit, native, appleSilicon = isAppleSilicon()) {
|
|
|
109
111
|
return explicit;
|
|
110
112
|
return appleSilicon && native !== null ? 'native' : 'docker';
|
|
111
113
|
}
|
|
114
|
+
/**
|
|
115
|
+
* Spawn a native `python -m app.<cli>` entrypoint and parse its single JSON-line
|
|
116
|
+
* result. Owns the spawn dispatch, the 64 MiB buffer, the failed-to-start error,
|
|
117
|
+
* and the last-line/parse/object-guard. The caller keeps its own success check
|
|
118
|
+
* (`status !== 0 || parsed.status === 'failed'`) on the returned
|
|
119
|
+
* `{ parsed, status, stderr }`, since the two callers phrase that failure
|
|
120
|
+
* differently. (#176, #184)
|
|
121
|
+
*/
|
|
122
|
+
export function runNativeCli(python, args, opts) {
|
|
123
|
+
const spawn = opts.spawnImpl ?? spawnSync;
|
|
124
|
+
const res = spawn(python, args, {
|
|
125
|
+
cwd: opts.cwd,
|
|
126
|
+
env: opts.env,
|
|
127
|
+
encoding: 'utf8',
|
|
128
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
129
|
+
});
|
|
130
|
+
if (res.error) {
|
|
131
|
+
throw new CompostError('PROVIDER_ERROR', `native ${opts.label} failed to start (${python}): ${res.error.message}. ${opts.startHint}`);
|
|
132
|
+
}
|
|
133
|
+
const stderr = res.stderr || '';
|
|
134
|
+
// The entrypoint prints exactly one JSON line; take the last non-empty line.
|
|
135
|
+
const lastLine = (res.stdout || '').trim().split('\n').filter(Boolean).pop() ?? '';
|
|
136
|
+
let parsed;
|
|
137
|
+
try {
|
|
138
|
+
// JSON.parse succeeds on primitives (null, 123, "s"); require an object so a
|
|
139
|
+
// stray non-object line surfaces as the CompostError below, not a TypeError.
|
|
140
|
+
const value = JSON.parse(lastLine);
|
|
141
|
+
if (typeof value !== 'object' || value === null)
|
|
142
|
+
throw new Error('not a JSON object');
|
|
143
|
+
parsed = value;
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
throw new CompostError('PROVIDER_ERROR', `native ${opts.label} produced no parseable result. stderr: ${stderr.slice(-400)}`);
|
|
147
|
+
}
|
|
148
|
+
return { parsed, status: res.status, stderr };
|
|
149
|
+
}
|
|
112
150
|
//# sourceMappingURL=nativeRuntime.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nativeRuntime.js","sourceRoot":"","sources":["../../src/lib/nativeRuntime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"nativeRuntime.js","sourceRoot":"","sources":["../../src/lib/nativeRuntime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* True when `target` resolves to a path strictly inside `root` — not `root`
|
|
3
|
+
* itself, and not escaping via `..`. Lexical only (does not resolve symlinks);
|
|
4
|
+
* the shared predicate behind the seed and session containment guards (#211).
|
|
5
|
+
* Callers that want to allow `target === root` test that case separately.
|
|
6
|
+
*/
|
|
7
|
+
export declare function isContainedUnder(root: string, target: string): boolean;
|
|
8
|
+
//# sourceMappingURL=pathSafe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pathSafe.d.ts","sourceRoot":"","sources":["../../src/lib/pathSafe.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAGtE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { isAbsolute, relative, sep } from 'node:path';
|
|
2
|
+
/**
|
|
3
|
+
* True when `target` resolves to a path strictly inside `root` — not `root`
|
|
4
|
+
* itself, and not escaping via `..`. Lexical only (does not resolve symlinks);
|
|
5
|
+
* the shared predicate behind the seed and session containment guards (#211).
|
|
6
|
+
* Callers that want to allow `target === root` test that case separately.
|
|
7
|
+
*/
|
|
8
|
+
export function isContainedUnder(root, target) {
|
|
9
|
+
const rel = relative(root, target);
|
|
10
|
+
return rel !== '' && !rel.startsWith('..') && !isAbsolute(rel) && !rel.includes(`..${sep}`);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=pathSafe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pathSafe.js","sourceRoot":"","sources":["../../src/lib/pathSafe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAErD;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,MAAc;IAC3D,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAClC,OAAO,GAAG,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC,CAAA;AAC7F,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provisionNative.d.ts","sourceRoot":"","sources":["../../src/lib/provisionNative.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"provisionNative.d.ts","sourceRoot":"","sources":["../../src/lib/provisionNative.ts"],"names":[],"mappings":"AAQA;;;;;;;;;;GAUG;AAEH,iFAAiF;AACjF,eAAO,MAAM,WAAW,UAMvB,CAAA;AAOD,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AACD;yCACyC;AACzC,MAAM,MAAM,aAAa,GAAG,CAC1B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,KACxB,mBAAmB,CAAA;AAExB,MAAM,WAAW,sBAAsB;IACrC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAA;IAC/B,IAAI,CAAC,EAAE,aAAa,CAAA;IACpB,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,4EAA4E;IAC5E,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,kEAAkE;IAClE,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,eAAe,GAAG,aAAa,CAAA;IACvC,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAmCD;iDACiD;AACjD,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,sBAA2B,GAAG,qBAAqB,CA+D5F"}
|
|
@@ -2,6 +2,7 @@ import { spawnSync } from 'node:child_process';
|
|
|
2
2
|
import { existsSync } from 'node:fs';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { CompostError } from '../errors.js';
|
|
5
|
+
import { scrubbedEnv } from './childEnv.js';
|
|
5
6
|
import { findRepoTranscriberDir, managedVenvDir } from './nativeRuntime.js';
|
|
6
7
|
/**
|
|
7
8
|
* Provision the managed native transcription venv (#183) so `compost transcribe`
|
|
@@ -29,6 +30,8 @@ const MAX_MINOR = 12; // transcriber requires-python = >=3.11,<3.13
|
|
|
29
30
|
const defaultExec = (cmd, args, opts) => {
|
|
30
31
|
const res = spawnSync(cmd, args, {
|
|
31
32
|
encoding: 'utf8',
|
|
33
|
+
// pip/venv provisioning needs no compost secrets — scrub them (#236).
|
|
34
|
+
env: scrubbedEnv(),
|
|
32
35
|
// stream → live stdout (download progress) but still capture stderr so a
|
|
33
36
|
// failure has a diagnostic (inheriting stderr would null it out).
|
|
34
37
|
stdio: opts?.stream ? ['ignore', 'inherit', 'pipe'] : 'pipe',
|
|
@@ -44,12 +47,13 @@ function pyVersion(exec, bin) {
|
|
|
44
47
|
return m ? [Number(m[1]), Number(m[2])] : null;
|
|
45
48
|
}
|
|
46
49
|
function resolvePython(exec, explicit) {
|
|
47
|
-
|
|
50
|
+
const candidates = explicit ? [explicit] : PY_CANDIDATES;
|
|
51
|
+
for (const c of candidates) {
|
|
48
52
|
const v = pyVersion(exec, c);
|
|
49
53
|
if (v && v[0] === 3 && v[1] >= MIN_MINOR && v[1] <= MAX_MINOR)
|
|
50
54
|
return c;
|
|
51
55
|
}
|
|
52
|
-
throw new CompostError('INVALID_INPUT', `no Python 3.${MIN_MINOR}–3.${MAX_MINOR} found (tried ${
|
|
56
|
+
throw new CompostError('INVALID_INPUT', `no Python 3.${MIN_MINOR}–3.${MAX_MINOR} found (tried ${candidates.join(', ')}). ` +
|
|
53
57
|
'Install one — e.g. `brew install python@3.11` — or pass --python-bin.');
|
|
54
58
|
}
|
|
55
59
|
/** Create + populate the managed native venv. Idempotent: a venv that already
|
|
@@ -61,7 +65,7 @@ export function provisionNativeVenv(opts = {}) {
|
|
|
61
65
|
const steps = [];
|
|
62
66
|
const transcriberDir = opts.transcriberDir ?? env.COMPOST_TRANSCRIBER_DIR ?? findRepoTranscriberDir(undefined, exists);
|
|
63
67
|
if (transcriberDir === undefined || !exists(join(transcriberDir, 'pyproject.toml'))) {
|
|
64
|
-
throw new CompostError('INVALID_INPUT', 'could not locate the transcriber/ package.
|
|
68
|
+
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
69
|
}
|
|
66
70
|
const venvDir = managedVenvDir(env);
|
|
67
71
|
const venvPython = join(venvDir, 'bin', 'python');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provisionNative.js","sourceRoot":"","sources":["../../src/lib/provisionNative.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAE3E;;;;;;;;;;GAUG;AAEH,iFAAiF;AACjF,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,cAAc;IACd,qBAAqB;IACrB,YAAY;IACZ,iBAAiB;IACjB,eAAe;CAChB,CAAA;AAED,MAAM,aAAa,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,SAAS,CAAC,CAAA;AAC7D,MAAM,cAAc,GAAG,6DAA6D,CAAA;AACpF,MAAM,SAAS,GAAG,EAAE,CAAA;AACpB,MAAM,SAAS,GAAG,EAAE,CAAA,CAAC,6CAA6C;AAoClE,MAAM,WAAW,GAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;IACrD,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE;QAC/B,QAAQ,EAAE,MAAM;QAChB,yEAAyE;QACzE,kEAAkE;QAClE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM;QAC5D,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;KAC5B,CAAC,CAAA;IACF,OAAO,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,CAAA;AACnG,CAAC,CAAA;AAED,SAAS,SAAS,CAAC,IAAmB,EAAE,GAAW;IACjD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;IAClC,IAAI,CAAC,CAAC,CAAC,EAAE;QAAE,OAAO,IAAI,CAAA;IACtB,MAAM,CAAC,GAAG,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAA;IAC/D,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AAChD,CAAC;AAED,SAAS,aAAa,CAAC,IAAmB,EAAE,QAAiB;IAC3D,
|
|
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":"AACA,OAAO,EAAsB,KAAK,QAAQ,EAAE,MAAM,oCAAoC,CAAA;AAKtF;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 { reduce } from '@they-juanreina/compost-provenance';
|
|
3
|
+
import Database from 'better-sqlite3';
|
|
4
|
+
import { eventsDbPath } from './events.js';
|
|
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 = eventsDbPath(seedPath);
|
|
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
|