@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
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { glyphs } from './glyphs.js';
|
|
2
|
+
/** Human-readable summaries for the tutorial-facing verbs (#173). Commands pass
|
|
3
|
+
* these to `emit(..., render)`; machine/JSON output is unaffected. Verbs without
|
|
4
|
+
* a renderer fall back to pretty-printed JSON. */
|
|
5
|
+
function fmtMs(ms) {
|
|
6
|
+
if (ms === undefined || ms === null)
|
|
7
|
+
return '?';
|
|
8
|
+
const s = Math.floor(ms / 1000);
|
|
9
|
+
return `${Math.floor(s / 60)}:${String(s % 60).padStart(2, '0')}`;
|
|
10
|
+
}
|
|
11
|
+
export function renderStatus(s) {
|
|
12
|
+
const g = glyphs();
|
|
13
|
+
const lines = [`compost — ${s.seeds.length} seed(s) under ${s.root}`];
|
|
14
|
+
for (const seed of s.seeds) {
|
|
15
|
+
const c = seed.counts;
|
|
16
|
+
lines.push('');
|
|
17
|
+
lines.push(` ${seed.name}${seed.status ? ` [${seed.status}]` : ''}`);
|
|
18
|
+
lines.push(` sessions: ${c.sessions.total} (${c.sessions.transcribed} transcribed, ${c.sessions.queued} queued, ${c.sessions.inbox} in _inbox)`);
|
|
19
|
+
lines.push(` highlights: ${c.highlights} codes: ${c.codes} themes: ${c.themes}`);
|
|
20
|
+
lines.push(` frames: ${c.frames} insights: ${c.insights} legacy: ${c.legacy_assets}`);
|
|
21
|
+
for (const w of seed.warnings)
|
|
22
|
+
lines.push(` ${g.warn} ${w}`);
|
|
23
|
+
}
|
|
24
|
+
return lines.join('\n');
|
|
25
|
+
}
|
|
26
|
+
export function renderSearch(v) {
|
|
27
|
+
const g = glyphs();
|
|
28
|
+
const lines = [
|
|
29
|
+
`"${v.query}" — ${v.returned} result(s) [${v.retrieval}] of ${v.indexed_chunks} chunks`,
|
|
30
|
+
];
|
|
31
|
+
for (const [i, r] of v.results.entries()) {
|
|
32
|
+
const t = r.text.replace(/\s+/g, ' ').trim();
|
|
33
|
+
const clipped = t.length > 160 ? `${t.slice(0, 157)}${g.ellipsis}` : t;
|
|
34
|
+
lines.push('');
|
|
35
|
+
lines.push(` ${i + 1}. [${r.session ?? '?'} ${fmtMs(r.start_ms)}–${fmtMs(r.end_ms)}] score ${r.score}`);
|
|
36
|
+
lines.push(` ${clipped}`);
|
|
37
|
+
}
|
|
38
|
+
if (v.hint !== undefined) {
|
|
39
|
+
lines.push('');
|
|
40
|
+
lines.push(` ${g.arrow} ${v.hint}`);
|
|
41
|
+
}
|
|
42
|
+
return lines.join('\n');
|
|
43
|
+
}
|
|
44
|
+
export function renderDoctor(r) {
|
|
45
|
+
const g = glyphs();
|
|
46
|
+
const lines = [`models doctor — ${r.ok ? 'OK' : 'ISSUES'}`, ' providers:'];
|
|
47
|
+
for (const [name, h] of Object.entries(r.providers)) {
|
|
48
|
+
lines.push(` ${h.ok ? g.ok : g.fail} ${name}${h.ok ? ` (${h.model_list.length} models, ${h.latency_ms}ms)` : ` — ${h.error ?? 'down'}`}`);
|
|
49
|
+
}
|
|
50
|
+
lines.push(' tasks:');
|
|
51
|
+
for (const t of r.tasks) {
|
|
52
|
+
lines.push(` ${t.status === 'ok' ? g.ok : g.fail} ${t.task} → ${t.route}${t.status === 'ok' ? '' : ` [${t.status}]`}${t.suggestion ? ` ${g.arrow} ${t.suggestion}` : ''}`);
|
|
53
|
+
}
|
|
54
|
+
const unused = Object.entries(r.unused_models);
|
|
55
|
+
if (unused.length > 0) {
|
|
56
|
+
lines.push(' pulled but unconfigured:');
|
|
57
|
+
for (const [p, ms] of unused)
|
|
58
|
+
lines.push(` ${p}: ${ms.join(', ')}`);
|
|
59
|
+
}
|
|
60
|
+
return lines.join('\n');
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=human.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"human.js","sourceRoot":"","sources":["../../src/render/human.ts"],"names":[],"mappings":"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"}
|
package/dist/router.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAuCnC,wBAAgB,YAAY,IAAI,OAAO,CAkEtC"}
|
package/dist/router.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
|
+
import { registerAgreement } from './commands/agreement.js';
|
|
3
|
+
import { registerBackup } from './commands/backup.js';
|
|
2
4
|
import { registerBlame } from './commands/blame.js';
|
|
3
5
|
import { registerChat } from './commands/chat.js';
|
|
4
6
|
import { registerCode } from './commands/code.js';
|
|
@@ -7,15 +9,21 @@ import { registerCreate } from './commands/create.js';
|
|
|
7
9
|
import { registerEndorse } from './commands/endorse.js';
|
|
8
10
|
import { registerEvals } from './commands/evals.js';
|
|
9
11
|
import { registerExport } from './commands/export.js';
|
|
12
|
+
import { registerImport } from './commands/import.js';
|
|
10
13
|
import { registerIngest } from './commands/ingest.js';
|
|
11
14
|
import { registerInit } from './commands/init.js';
|
|
15
|
+
import { registerJobs } from './commands/jobs.js';
|
|
16
|
+
import { registerLabel } from './commands/label.js';
|
|
12
17
|
import { registerMigrate } from './commands/migrate.js';
|
|
13
18
|
import { registerModels } from './commands/models.js';
|
|
14
19
|
import { registerQuery } from './commands/query.js';
|
|
20
|
+
import { registerRecode } from './commands/recode.js';
|
|
15
21
|
import { registerReindex } from './commands/reindex.js';
|
|
22
|
+
import { registerRerun } from './commands/rerun.js';
|
|
16
23
|
import { registerRescan } from './commands/rescan.js';
|
|
17
24
|
import { registerSaturate } from './commands/saturate.js';
|
|
18
25
|
import { registerSearch } from './commands/search.js';
|
|
26
|
+
import { registerSecrets } from './commands/secrets.js';
|
|
19
27
|
import { registerServe } from './commands/serve.js';
|
|
20
28
|
import { registerSession } from './commands/session.js';
|
|
21
29
|
import { registerSetup } from './commands/setup.js';
|
|
@@ -26,33 +34,53 @@ import { registerTag } from './commands/tag.js';
|
|
|
26
34
|
import { registerTranscribe } from './commands/transcribe.js';
|
|
27
35
|
import { registerValidate } from './commands/validate.js';
|
|
28
36
|
import { registerWatch } from './commands/watch.js';
|
|
29
|
-
|
|
37
|
+
import { currentCliVersion } from './lib/version.js';
|
|
30
38
|
export function buildProgram() {
|
|
31
39
|
const program = new Command();
|
|
32
40
|
program
|
|
33
41
|
.name('compost')
|
|
34
42
|
.description('Local-first, AI-first research analysis harness for coding agents and humans.')
|
|
35
|
-
.
|
|
36
|
-
|
|
43
|
+
// Single source of truth: read from package.json (drops a file from the
|
|
44
|
+
// version-bump checklist; no more hardcoded literal to drift).
|
|
45
|
+
.version(currentCliVersion(), '-V, --version')
|
|
46
|
+
.option('--human', 'Force human-readable output (auto-on at a TTY; JSON when piped or called by an agent).')
|
|
47
|
+
.option('--json', 'Force machine-readable JSON output (overrides TTY auto-detection).')
|
|
37
48
|
.showHelpAfterError()
|
|
38
|
-
.configureHelp({ sortSubcommands: true })
|
|
49
|
+
.configureHelp({ sortSubcommands: true })
|
|
50
|
+
.addHelpText('after', `
|
|
51
|
+
Quick start:
|
|
52
|
+
$ compost init my-study scaffold Seeds/my-study/
|
|
53
|
+
$ printf %s "$HF_TOKEN" | compost secrets set HUGGINGFACE_TOKEN store a token (not in shell history)
|
|
54
|
+
$ compost ingest ./recording.m4a --seed my-study queue audio for transcription
|
|
55
|
+
$ compost watch --once --seed my-study drain the ingest/transcribe/embed queue
|
|
56
|
+
$ compost search "trust" --seed my-study retrieve grounded passages
|
|
57
|
+
|
|
58
|
+
Output is human-readable at a TTY and JSON when piped or called by an agent (force with --json / --human).`);
|
|
39
59
|
registerInit(program);
|
|
40
60
|
registerIngest(program);
|
|
61
|
+
registerImport(program);
|
|
41
62
|
registerTranscribe(program);
|
|
63
|
+
registerLabel(program);
|
|
42
64
|
registerWatch(program);
|
|
65
|
+
registerJobs(program);
|
|
43
66
|
registerSnap(program);
|
|
44
67
|
registerStatus(program);
|
|
45
68
|
registerBlame(program);
|
|
46
69
|
registerMigrate(program);
|
|
47
70
|
registerExport(program);
|
|
71
|
+
registerBackup(program);
|
|
48
72
|
registerReindex(program);
|
|
49
73
|
registerRescan(program);
|
|
50
74
|
registerSaturate(program);
|
|
51
75
|
registerValidate(program);
|
|
52
76
|
registerTag(program);
|
|
53
77
|
registerCode(program);
|
|
78
|
+
registerRecode(program);
|
|
79
|
+
registerAgreement(program);
|
|
80
|
+
registerRerun(program);
|
|
54
81
|
registerSynthesize(program);
|
|
55
82
|
registerSearch(program);
|
|
83
|
+
registerSecrets(program);
|
|
56
84
|
registerSession(program);
|
|
57
85
|
registerCreate(program);
|
|
58
86
|
registerEndorse(program);
|
package/dist/router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD,MAAM,UAAU,YAAY;IAC1B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;IAE7B,OAAO;SACJ,IAAI,CAAC,SAAS,CAAC;SACf,WAAW,CAAC,+EAA+E,CAAC;QAC7F,wEAAwE;QACxE,+DAA+D;SAC9D,OAAO,CAAC,iBAAiB,EAAE,EAAE,eAAe,CAAC;SAC7C,MAAM,CACL,SAAS,EACT,wFAAwF,CACzF;SACA,MAAM,CAAC,QAAQ,EAAE,oEAAoE,CAAC;SACtF,kBAAkB,EAAE;SACpB,aAAa,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;SACxC,WAAW,CACV,OAAO,EACP;;;;;;;;2GAQqG,CACtG,CAAA;IAEH,YAAY,CAAC,OAAO,CAAC,CAAA;IACrB,cAAc,CAAC,OAAO,CAAC,CAAA;IACvB,cAAc,CAAC,OAAO,CAAC,CAAA;IACvB,kBAAkB,CAAC,OAAO,CAAC,CAAA;IAC3B,aAAa,CAAC,OAAO,CAAC,CAAA;IACtB,aAAa,CAAC,OAAO,CAAC,CAAA;IACtB,YAAY,CAAC,OAAO,CAAC,CAAA;IACrB,YAAY,CAAC,OAAO,CAAC,CAAA;IACrB,cAAc,CAAC,OAAO,CAAC,CAAA;IACvB,aAAa,CAAC,OAAO,CAAC,CAAA;IACtB,eAAe,CAAC,OAAO,CAAC,CAAA;IACxB,cAAc,CAAC,OAAO,CAAC,CAAA;IACvB,cAAc,CAAC,OAAO,CAAC,CAAA;IACvB,eAAe,CAAC,OAAO,CAAC,CAAA;IACxB,cAAc,CAAC,OAAO,CAAC,CAAA;IACvB,gBAAgB,CAAC,OAAO,CAAC,CAAA;IACzB,gBAAgB,CAAC,OAAO,CAAC,CAAA;IACzB,WAAW,CAAC,OAAO,CAAC,CAAA;IACpB,YAAY,CAAC,OAAO,CAAC,CAAA;IACrB,cAAc,CAAC,OAAO,CAAC,CAAA;IACvB,iBAAiB,CAAC,OAAO,CAAC,CAAA;IAC1B,aAAa,CAAC,OAAO,CAAC,CAAA;IACtB,kBAAkB,CAAC,OAAO,CAAC,CAAA;IAC3B,cAAc,CAAC,OAAO,CAAC,CAAA;IACvB,eAAe,CAAC,OAAO,CAAC,CAAA;IACxB,eAAe,CAAC,OAAO,CAAC,CAAA;IACxB,cAAc,CAAC,OAAO,CAAC,CAAA;IACvB,eAAe,CAAC,OAAO,CAAC,CAAA;IACxB,aAAa,CAAC,OAAO,CAAC,CAAA;IACtB,aAAa,CAAC,OAAO,CAAC,CAAA;IACtB,YAAY,CAAC,OAAO,CAAC,CAAA;IACrB,aAAa,CAAC,OAAO,CAAC,CAAA;IACtB,cAAc,CAAC,OAAO,CAAC,CAAA;IACvB,aAAa,CAAC,OAAO,CAAC,CAAA;IACtB,cAAc,CAAC,OAAO,CAAC,CAAA;IAEvB,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcriber_client.d.ts","sourceRoot":"","sources":["../src/transcriber_client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transcriber_client.d.ts","sourceRoot":"","sources":["../src/transcriber_client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE/C,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,IAAI,GAAG,sBAAsB,GAAG,sBAAsB,CAAA;CAC/D;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAA;IACX,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAA;CACxC;AAED,qBAAa,uBAAwB,SAAQ,KAAK;aAG9B,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,QAAQ;gBADzD,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,QAAQ;CAK5D;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,gFAAgF;AAChF,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;gBAEtB,IAAI,GAAE,wBAA6B;IAMzC,MAAM,IAAI,OAAO,CAAC,iBAAiB,CAAC;IAc1C;;;;;;;;;;;;OAYG;IACG,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,CAAC;CA+B/B"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { errMessage } from './errors.js';
|
|
1
2
|
import { resolveFetch } from './llm/http.js';
|
|
2
3
|
export class TranscriberServiceError extends Error {
|
|
3
4
|
kind;
|
|
@@ -59,7 +60,7 @@ export class TranscriberClient {
|
|
|
59
60
|
});
|
|
60
61
|
}
|
|
61
62
|
catch (err) {
|
|
62
|
-
throw new TranscriberServiceError(`transcriber service unreachable at ${this.base}: ${
|
|
63
|
+
throw new TranscriberServiceError(`transcriber service unreachable at ${this.base}: ${errMessage(err)}`, 'down');
|
|
63
64
|
}
|
|
64
65
|
if (res.status === 503)
|
|
65
66
|
throw new TranscriberServiceError('model missing/unavailable', 'model_missing');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcriber_client.js","sourceRoot":"","sources":["../src/transcriber_client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAc5C,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAG9B;IAFlB,YACE,OAAe,EACC,IAAyC;QAEzD,KAAK,CAAC,OAAO,CAAC,CAAA;QAFE,SAAI,GAAJ,IAAI,CAAqC;QAGzD,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAA;IACvC,CAAC;CACF;AAQD,gFAAgF;AAChF,MAAM,OAAO,iBAAiB;IACX,IAAI,CAAQ;IACZ,SAAS,CAAW;IACpB,SAAS,CAAQ;IAElC,YAAY,OAAiC,EAAE;QAC7C,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,uBAAuB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QACxE,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC7C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,SAAS,CAAA,CAAC,gCAAgC;IAC/E,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,IAAI,SAAS,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;YAC1E,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;YAC/C,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAG7B,CAAA;YACD,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAA;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAA;QACpC,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,UAAU,CACd,SAAiB,EACjB,SAAiB,EACjB,QAAgB,EAChB,QAAiB;QAEjB,MAAM,IAAI,GAA4B;YACpC,SAAS,EAAE,QAAQ;YACnB,UAAU,EAAE,SAAS;YACrB,WAAW,EAAE,SAAS;SACvB,CAAA;QACD,IAAI,QAAQ,KAAK,SAAS;YAAE,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QAEpD,IAAI,GAAmC,CAAA;QACvC,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,IAAI,aAAa,EAAE;gBACpD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;aAC3B,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,uBAAuB,CAC/B,sCAAsC,IAAI,CAAC,IAAI,KAAK,
|
|
1
|
+
{"version":3,"file":"transcriber_client.js","sourceRoot":"","sources":["../src/transcriber_client.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@they-juanreina/compost-cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Compost CLI engine. Subcommand router, JSON-out, harness loop runner.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"repository": {
|
|
@@ -16,7 +16,14 @@
|
|
|
16
16
|
"compost": "./bin/compost.js"
|
|
17
17
|
},
|
|
18
18
|
"exports": {
|
|
19
|
-
".":
|
|
19
|
+
".": {
|
|
20
|
+
"types": "./dist/index.d.ts",
|
|
21
|
+
"default": "./dist/index.js"
|
|
22
|
+
},
|
|
23
|
+
"./engine": {
|
|
24
|
+
"types": "./dist/engine.d.ts",
|
|
25
|
+
"default": "./dist/engine.js"
|
|
26
|
+
}
|
|
20
27
|
},
|
|
21
28
|
"files": [
|
|
22
29
|
"bin",
|
|
@@ -32,9 +39,9 @@
|
|
|
32
39
|
"chokidar": "^4.0.0",
|
|
33
40
|
"commander": "^12.1.0",
|
|
34
41
|
"smol-toml": "^1.3.0",
|
|
35
|
-
"@they-juanreina/compost-
|
|
36
|
-
"@they-juanreina/compost-provenance": "0.1.
|
|
37
|
-
"@they-juanreina/compost-
|
|
42
|
+
"@they-juanreina/compost-retrieval": "0.1.4",
|
|
43
|
+
"@they-juanreina/compost-provenance": "0.1.4",
|
|
44
|
+
"@they-juanreina/compost-evals": "0.1.4"
|
|
38
45
|
},
|
|
39
46
|
"devDependencies": {
|
|
40
47
|
"@types/better-sqlite3": "^7.6.11",
|
package/templates/AGENTS.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
This is the versioned prompt journal for this seed. Compost reads this file when invoking LLM tasks (synthesis, coding, query, chat) and prepends its contents to system prompts. Treat it like a `CLAUDE.md` for your research.
|
|
4
4
|
|
|
5
|
-
Edit freely
|
|
5
|
+
Edit freely — this is the human-authored file in the otherwise machine-owned `.compost/`. Compost versions it automatically (a timestamped section is appended on each save). `.compost/` is hidden and gitignored by default, so to preserve or move this seed, copy the whole folder (including `.compost/`) — or run `compost backup` to export its provenance.
|
|
6
6
|
|
|
7
7
|
## Voice & style
|
|
8
8
|
|
package/templates/config.toml
CHANGED
|
@@ -38,9 +38,14 @@ include_drafts = "marked"
|
|
|
38
38
|
[evals]
|
|
39
39
|
storage = "sqlite"
|
|
40
40
|
|
|
41
|
-
# LLM providers.
|
|
41
|
+
# LLM providers. `api_key_env` is the NAME of an environment variable, never the
|
|
42
|
+
# key itself — compost reads the value from the environment (or, transparently,
|
|
43
|
+
# from the OS keychain / ~/.compost/secrets.env via `compost secrets set`).
|
|
44
|
+
# NEVER paste a raw key here: this file lives in the (shared) seed. See
|
|
45
|
+
# SECURITY.md → "Storing your tokens".
|
|
42
46
|
[providers.ollama]
|
|
43
47
|
base_url = "http://localhost:11434"
|
|
48
|
+
# timeout_ms = 300000 # uncomment for very large local models (slow first load)
|
|
44
49
|
|
|
45
50
|
[providers.lmstudio]
|
|
46
51
|
base_url = "http://localhost:1234/v1"
|
|
@@ -8,6 +8,7 @@ and gating low-confidence sessions — is pure and fully unit-tested.
|
|
|
8
8
|
|
|
9
9
|
from __future__ import annotations
|
|
10
10
|
|
|
11
|
+
import re
|
|
11
12
|
from dataclasses import dataclass
|
|
12
13
|
from functools import lru_cache
|
|
13
14
|
from typing import Any, Protocol
|
|
@@ -129,6 +130,23 @@ def _load_pyannote(token_present: bool) -> DiarizationBackend: # pragma: no cov
|
|
|
129
130
|
return PyannoteBackend()
|
|
130
131
|
|
|
131
132
|
|
|
133
|
+
_PYANNOTE_LABEL_RE = re.compile(r"^SPEAKER_(\d+)$")
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def normalize_speaker_label(label: str) -> str:
|
|
137
|
+
"""Canonicalize a diarization speaker label to the schema's ``^S[0-9]+$`` form.
|
|
138
|
+
|
|
139
|
+
pyannote emits cluster labels like ``SPEAKER_00`` / ``SPEAKER_01``; the
|
|
140
|
+
transcript schema (schema/transcript.schema.json $defs.speaker.id and
|
|
141
|
+
$defs.utterance.speaker_id) requires ``S{n}`` — e.g. ``S0``, ``S1``. Leading
|
|
142
|
+
zeros are dropped (``SPEAKER_00`` → ``S0``). Already-canonical labels
|
|
143
|
+
(``S1``) and the ``S?`` orphan sentinel pass through unchanged, so this is
|
|
144
|
+
idempotent and safe to apply at the single write point in ``align()``.
|
|
145
|
+
"""
|
|
146
|
+
m = _PYANNOTE_LABEL_RE.match(label)
|
|
147
|
+
return f"S{int(m.group(1))}" if m else label
|
|
148
|
+
|
|
149
|
+
|
|
132
150
|
def _overlap_ms(a_start: int, a_end: int, b_start: int, b_end: int) -> int:
|
|
133
151
|
return max(0, min(a_end, b_end) - max(a_start, b_start))
|
|
134
152
|
|
|
@@ -220,11 +238,20 @@ def assign_speaker(utterance: dict[str, Any], turns: list[Turn]) -> tuple[str, f
|
|
|
220
238
|
return winner[0], min(winner[1] / u_dur, 1.0)
|
|
221
239
|
|
|
222
240
|
|
|
223
|
-
def detect_overlaps(
|
|
224
|
-
|
|
241
|
+
def detect_overlaps(
|
|
242
|
+
turns: list[Turn], min_overlap_ms: int = 200, start_index: int = 1
|
|
243
|
+
) -> list[dict[str, Any]]:
|
|
244
|
+
"""Find regions where two turns overlap; emit `overlap` cues.
|
|
245
|
+
|
|
246
|
+
Cue ids use the schema's uniform ``CUE-[0-9]{3,}`` space (the cue ``kind``
|
|
247
|
+
already distinguishes overlap cues from ASR-tag cues, so a typed ``CUE-OV-``
|
|
248
|
+
prefix would both duplicate that and violate the id pattern). ``start_index``
|
|
249
|
+
lets the caller continue numbering past any cues already in cues[] so the
|
|
250
|
+
overlap and tag-derived cues share one collision-free id sequence.
|
|
251
|
+
"""
|
|
225
252
|
cues: list[dict[str, Any]] = []
|
|
226
253
|
ordered = sorted(turns, key=lambda t: t.start_ms)
|
|
227
|
-
idx =
|
|
254
|
+
idx = start_index
|
|
228
255
|
for i in range(len(ordered)):
|
|
229
256
|
for j in range(i + 1, len(ordered)):
|
|
230
257
|
a, b = ordered[i], ordered[j]
|
|
@@ -237,7 +264,7 @@ def detect_overlaps(turns: list[Turn], min_overlap_ms: int = 200) -> list[dict[s
|
|
|
237
264
|
if ov_end - ov_start >= min_overlap_ms:
|
|
238
265
|
cues.append(
|
|
239
266
|
{
|
|
240
|
-
"id": f"CUE-
|
|
267
|
+
"id": f"CUE-{idx:03d}",
|
|
241
268
|
"kind": "overlap",
|
|
242
269
|
"start_ms": ov_start,
|
|
243
270
|
"end_ms": ov_end,
|
|
@@ -267,12 +294,15 @@ def align(transcript: dict[str, Any], turns: list[Turn]) -> dict[str, Any]:
|
|
|
267
294
|
rescued = _nearest_turn_speaker(utt["start_ms"], utt["end_ms"], turns)
|
|
268
295
|
if rescued is not None:
|
|
269
296
|
speaker = rescued # confidence stays 0.0 (fallback marker)
|
|
270
|
-
|
|
297
|
+
# Canonicalize pyannote's SPEAKER_NN labels to the schema's S{n} form at
|
|
298
|
+
# the single write point so speakers[].id (derived from these) and every
|
|
299
|
+
# utterances[].speaker_id agree with ^S[0-9]+$.
|
|
300
|
+
utt["speaker_id"] = normalize_speaker_label(speaker)
|
|
271
301
|
utt.setdefault("diarization", {})["confidence"] = round(conf, 3)
|
|
272
302
|
confidences.append(conf)
|
|
273
303
|
|
|
274
304
|
cues = transcript.setdefault("cues", [])
|
|
275
|
-
cues.extend(detect_overlaps(turns))
|
|
305
|
+
cues.extend(detect_overlaps(turns, start_index=len(cues) + 1))
|
|
276
306
|
|
|
277
307
|
mean_conf = sum(confidences) / len(confidences) if confidences else 0.0
|
|
278
308
|
if mean_conf < DIARIZATION_CONFIDENCE_FLOOR:
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"""Native (host) legacy-ingest entrypoint (#184).
|
|
2
|
+
|
|
3
|
+
Mirrors `app.transcribe_cli` for documents: runs the pure ingestors in
|
|
4
|
+
`app.legacy.ingest` in a host Python venv so PDF/DOCX/PPTX/CSV/XLSX/TXT ingest
|
|
5
|
+
works WITHOUT the Docker transcriber (demoted to a fallback). Shares the exact
|
|
6
|
+
write + response shape as the `/legacy-ingest` route so the Node legacy-worker
|
|
7
|
+
treats native and Docker results identically.
|
|
8
|
+
|
|
9
|
+
Usage:
|
|
10
|
+
python -m app.legacy_cli --seed-path <seed> --source-path <file> \
|
|
11
|
+
[--text-col COL] [--speaker-col COL] [--sheet NAME]
|
|
12
|
+
Prints exactly one JSON line; exit 0 on ok/empty, 1 on failure.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import argparse
|
|
18
|
+
import json
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
|
|
21
|
+
from .legacy import ingest as ingest_legacy
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def main(argv: list[str] | None = None) -> int:
|
|
25
|
+
p = argparse.ArgumentParser(prog="compost-legacy-native")
|
|
26
|
+
p.add_argument("--seed-path", required=True)
|
|
27
|
+
p.add_argument("--source-path", required=True)
|
|
28
|
+
p.add_argument("--text-col", default=None)
|
|
29
|
+
p.add_argument("--speaker-col", default=None)
|
|
30
|
+
p.add_argument("--sheet", default=None)
|
|
31
|
+
args = p.parse_args(argv)
|
|
32
|
+
|
|
33
|
+
src = Path(args.source_path)
|
|
34
|
+
seed = Path(args.seed_path)
|
|
35
|
+
if not src.exists():
|
|
36
|
+
print(json.dumps({"status": "failed", "kind": "invalid_input", "error": f"source not found: {src}"}))
|
|
37
|
+
return 1
|
|
38
|
+
if not seed.exists():
|
|
39
|
+
print(json.dumps({"status": "failed", "kind": "invalid_input", "error": f"seed not found: {seed}"}))
|
|
40
|
+
return 1
|
|
41
|
+
|
|
42
|
+
kwargs: dict[str, str] = {}
|
|
43
|
+
if args.text_col is not None:
|
|
44
|
+
kwargs["text_col"] = args.text_col
|
|
45
|
+
if args.speaker_col is not None:
|
|
46
|
+
kwargs["speaker_col"] = args.speaker_col
|
|
47
|
+
if args.sheet is not None:
|
|
48
|
+
kwargs["sheet"] = args.sheet
|
|
49
|
+
|
|
50
|
+
try:
|
|
51
|
+
doc = ingest_legacy(src, **kwargs)
|
|
52
|
+
except ValueError as e: # unsupported ext / missing column
|
|
53
|
+
print(json.dumps({"status": "failed", "kind": "invalid_input", "error": str(e)}))
|
|
54
|
+
return 1
|
|
55
|
+
except RuntimeError as e: # missing optional dep (python-docx, openpyxl, …)
|
|
56
|
+
print(json.dumps({"status": "failed", "kind": "dep_missing", "error": str(e)}))
|
|
57
|
+
return 1
|
|
58
|
+
|
|
59
|
+
legacy_dir = seed / "legacy"
|
|
60
|
+
legacy_dir.mkdir(parents=True, exist_ok=True)
|
|
61
|
+
out_path = legacy_dir / f"{src.stem}.json"
|
|
62
|
+
out_path.write_text(json.dumps(doc, indent=2, ensure_ascii=False) + "\n", encoding="utf-8")
|
|
63
|
+
|
|
64
|
+
utt_count = len(doc.get("utterances", []))
|
|
65
|
+
prov = doc.get("provenance", {})
|
|
66
|
+
warnings: list[str] = []
|
|
67
|
+
skipped = prov.get("xlsx_rows_skipped_empty_text", 0)
|
|
68
|
+
if skipped > 0:
|
|
69
|
+
warnings.append(
|
|
70
|
+
f"{skipped} XLSX row(s) had data in other columns but an empty text cell — "
|
|
71
|
+
"likely an un-evaluated formula. Open the file in Excel once, or export to CSV."
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
print(
|
|
75
|
+
json.dumps(
|
|
76
|
+
{
|
|
77
|
+
"status": "ok" if utt_count > 0 else "empty",
|
|
78
|
+
"source_path": str(src),
|
|
79
|
+
"normalized_path": str(out_path),
|
|
80
|
+
"utterance_count": utt_count,
|
|
81
|
+
"text_col_resolved": prov.get("text_col_resolved"),
|
|
82
|
+
"warnings": warnings,
|
|
83
|
+
}
|
|
84
|
+
)
|
|
85
|
+
)
|
|
86
|
+
return 0
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
if __name__ == "__main__":
|
|
90
|
+
raise SystemExit(main())
|
|
@@ -23,7 +23,7 @@ from .cue_parser import parse_transcript_cues
|
|
|
23
23
|
from .diarization import DiarizationBackend, Diarizer, align
|
|
24
24
|
from .prosody import annotate_prosody
|
|
25
25
|
from .silence_typer import type_all_silences
|
|
26
|
-
from .vad import VAD, VADBackend, silences_to_schema
|
|
26
|
+
from .vad import VAD, VADBackend, silences_to_schema, utterance_energies
|
|
27
27
|
|
|
28
28
|
SCHEMA_VERSION = "1.0"
|
|
29
29
|
DEFAULT_TRANSCRIBER_VERSION = "compost-transcriber@0.1.0"
|
|
@@ -122,9 +122,9 @@ def run_pipeline(
|
|
|
122
122
|
|
|
123
123
|
duration_ms = probe_duration_ms(source_path)
|
|
124
124
|
|
|
125
|
-
# 1. VAD — speech segments + first-class silences
|
|
125
|
+
# 1. VAD — speech segments (carry per-segment RMS energy) + first-class silences
|
|
126
126
|
vad = VAD(backend=backends.vad)
|
|
127
|
-
|
|
127
|
+
speech, silences = vad.segment(source_path, duration_ms)
|
|
128
128
|
|
|
129
129
|
# 2. ASR — utterances with word timings, may contain event tags inline
|
|
130
130
|
asr = Transcriber(config=config.asr, backend=backends.asr)
|
|
@@ -145,13 +145,16 @@ def run_pipeline(
|
|
|
145
145
|
"cues": [],
|
|
146
146
|
"frames": [],
|
|
147
147
|
"glossary_refs": [],
|
|
148
|
+
# frame_capture / frame_annotation are omitted (not null): the schema
|
|
149
|
+
# types provenance fields as strings and the convention is "absent when
|
|
150
|
+
# not applicable". run_pipeline does no frame capture/annotation; those
|
|
151
|
+
# stages (frames.py / frame_annotation.py) add their own provenance when
|
|
152
|
+
# they run.
|
|
148
153
|
"provenance": {
|
|
149
154
|
"transcriber": config.transcriber_version,
|
|
150
155
|
"asr_model": config.asr_model_tag,
|
|
151
156
|
"diarizer": config.diarizer_tag,
|
|
152
157
|
"audio_cues": f"{config.vad_tag} + whisper-events",
|
|
153
|
-
"frame_capture": None,
|
|
154
|
-
"frame_annotation": None,
|
|
155
158
|
},
|
|
156
159
|
}
|
|
157
160
|
|
|
@@ -169,8 +172,11 @@ def run_pipeline(
|
|
|
169
172
|
# 7. Silence semantic typing (after_question / thinking / interruption / …)
|
|
170
173
|
type_all_silences(transcript)
|
|
171
174
|
|
|
172
|
-
# 8. Prosody hints per utterance (deterministic, cheap)
|
|
173
|
-
|
|
175
|
+
# 8. Prosody hints per utterance (deterministic, cheap). Volume bucketing
|
|
176
|
+
# needs the per-utterance VAD RMS energy signal mapped from the speech
|
|
177
|
+
# segments; without it volume would default to "normal" for every utterance.
|
|
178
|
+
energies = utterance_energies(speech, transcript["utterances"])
|
|
179
|
+
annotate_prosody(transcript, energies)
|
|
174
180
|
|
|
175
181
|
return transcript
|
|
176
182
|
|
|
@@ -31,6 +31,11 @@ from typing import Any
|
|
|
31
31
|
|
|
32
32
|
PACE_SLOW_WPS = 2.0
|
|
33
33
|
PACE_FAST_WPS = 3.3
|
|
34
|
+
# Volume thresholds applied to the normalized 0..1 energy. These are GLOBAL
|
|
35
|
+
# constants, not per-speaker. The energy signal is session-normalized in
|
|
36
|
+
# vad.utterance_energies(); a soft speaker's loudest moment can still read below
|
|
37
|
+
# a loud speaker's baseline. TODO(#13): per-speaker normalization would make
|
|
38
|
+
# these buckets speaker-relative — see vad.utterance_energies for the plan.
|
|
34
39
|
VOLUME_LOW = 0.33
|
|
35
40
|
VOLUME_HIGH = 0.66
|
|
36
41
|
HESITATION_GAP_MS = 400
|
|
@@ -20,6 +20,7 @@ from __future__ import annotations
|
|
|
20
20
|
|
|
21
21
|
import argparse
|
|
22
22
|
import json
|
|
23
|
+
import re
|
|
23
24
|
|
|
24
25
|
from .asr import ASRConfig
|
|
25
26
|
from .pipeline import PipelineBackends, PipelineConfig, run_pipeline, write_transcript
|
|
@@ -29,11 +30,24 @@ _DEFAULT_MODEL = {
|
|
|
29
30
|
"whisper": "large-v3-turbo",
|
|
30
31
|
}
|
|
31
32
|
|
|
33
|
+
_SESSION_ID_RE = re.compile(r"^[A-Za-z0-9_-]+$")
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _session_id(value: str) -> str:
|
|
37
|
+
"""Validate --session-id is a bare label (mirrors the CLI assertSessionId and
|
|
38
|
+
the HTTP route's Field pattern). The id is joined into <seed>/sessions/<id>/,
|
|
39
|
+
so a path separator or `..` would escape the seed when invoked directly."""
|
|
40
|
+
if not _SESSION_ID_RE.match(value):
|
|
41
|
+
raise argparse.ArgumentTypeError(
|
|
42
|
+
f"invalid session id {value!r}: use letters, digits, '-' or '_' only"
|
|
43
|
+
)
|
|
44
|
+
return value
|
|
45
|
+
|
|
32
46
|
|
|
33
47
|
def main(argv: list[str] | None = None) -> int:
|
|
34
48
|
p = argparse.ArgumentParser(prog="compost-transcribe-native")
|
|
35
49
|
p.add_argument("--seed-path", required=True)
|
|
36
|
-
p.add_argument("--session-id", required=True)
|
|
50
|
+
p.add_argument("--session-id", required=True, type=_session_id)
|
|
37
51
|
p.add_argument("--source-path", required=True)
|
|
38
52
|
p.add_argument("--engine", default="parakeet", choices=["parakeet", "whisper"])
|
|
39
53
|
p.add_argument("--model", default=None, help="ASR model id (engine default if omitted)")
|