@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
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from 'node:fs';
|
|
1
|
+
import { existsSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { basename, extname, join } from 'node:path';
|
|
3
|
+
import { CompostError, errMessage } from '../errors.js';
|
|
2
4
|
import { LegacyIngestClient, LegacyServiceError, } from '../legacy_client.js';
|
|
3
5
|
import { emitAgentCreate, openSeedEvents } from '../lib/events.js';
|
|
4
|
-
import {
|
|
6
|
+
import { legacyIngestNative } from '../lib/legacyNative.js';
|
|
7
|
+
import { resolveNativeRuntime } from '../lib/nativeRuntime.js';
|
|
8
|
+
import { JobQueue, MAX_ATTEMPTS, resolveJobSource, stateDbPath } from '../lib/queue.js';
|
|
9
|
+
import { writeTranscriptMd } from '../render/transcript_md.js';
|
|
5
10
|
const AGENT_NAME = 'legacy-ingest-worker';
|
|
6
11
|
const AGENT_VERSION = '0.1.0';
|
|
7
|
-
const MAX_ATTEMPTS = 3;
|
|
8
12
|
function readSidecar(sourcePath) {
|
|
9
13
|
const sidecarPath = `${sourcePath}.compost.json`;
|
|
10
14
|
if (!existsSync(sidecarPath))
|
|
@@ -29,6 +33,71 @@ function readSidecar(sourcePath) {
|
|
|
29
33
|
return null;
|
|
30
34
|
}
|
|
31
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Place a freshly-normalized document where the rest of the pipeline expects
|
|
38
|
+
* it (#246): rename the `legacy/` copy after the researcher's original
|
|
39
|
+
* filename (the inbox move renamed the source to `source.<ext>`, so the
|
|
40
|
+
* service output otherwise collides at `legacy/source.json` for every
|
|
41
|
+
* session), and link it into its session as `transcript.json` so search and
|
|
42
|
+
* embeddings pick it up without the manual `cp` step the wiki used to ask
|
|
43
|
+
* for. Non-inbox jobs (no `S\d+` session id) only get the rename.
|
|
44
|
+
*/
|
|
45
|
+
export function linkNormalizedDoc(seedPath, payload, normalizedPath) {
|
|
46
|
+
const warnings = [];
|
|
47
|
+
let finalNormalized = normalizedPath;
|
|
48
|
+
const sid = typeof payload.session_id === 'string' ? payload.session_id : undefined;
|
|
49
|
+
const original = typeof payload.original_name === 'string' ? payload.original_name : undefined;
|
|
50
|
+
if (original !== undefined && existsSync(normalizedPath)) {
|
|
51
|
+
const stem = basename(original, extname(original)).replace(/[^\w.-]+/g, '_');
|
|
52
|
+
const target = join(seedPath, 'legacy', sid !== undefined ? `${sid}-${stem}.json` : `${stem}.json`);
|
|
53
|
+
if (target !== normalizedPath) {
|
|
54
|
+
renameSync(normalizedPath, target);
|
|
55
|
+
finalNormalized = target;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
if (sid !== undefined && /^S\d+$/.test(sid) && existsSync(finalNormalized)) {
|
|
59
|
+
const sessionDir = join(seedPath, 'sessions', sid);
|
|
60
|
+
const transcriptPath = join(sessionDir, 'transcript.json');
|
|
61
|
+
if (!existsSync(sessionDir)) {
|
|
62
|
+
warnings.push(`session ${sid} has no directory — normalized doc left in legacy/ only`);
|
|
63
|
+
return { normalized_path: finalNormalized, warnings };
|
|
64
|
+
}
|
|
65
|
+
if (existsSync(transcriptPath)) {
|
|
66
|
+
warnings.push(`session ${sid} already has transcript.json — not overwritten`);
|
|
67
|
+
return { normalized_path: finalNormalized, warnings };
|
|
68
|
+
}
|
|
69
|
+
let doc;
|
|
70
|
+
try {
|
|
71
|
+
doc = JSON.parse(readFileSync(finalNormalized, 'utf8'));
|
|
72
|
+
}
|
|
73
|
+
catch (cause) {
|
|
74
|
+
// A truncated/corrupt normalized doc (e.g. disk full, killed mid-write)
|
|
75
|
+
// otherwise surfaces as a raw SyntaxError. Point at the recovery action.
|
|
76
|
+
throw new CompostError('IO_ERROR', `normalized doc at ${finalNormalized} is not valid JSON — requeue to re-ingest (\`compost jobs requeue\`).`, { cause });
|
|
77
|
+
}
|
|
78
|
+
// The service derives session_id from the file basename ("DOC-source");
|
|
79
|
+
// the session's real id is what search/status/exports key on.
|
|
80
|
+
doc.session_id = sid;
|
|
81
|
+
writeFileSync(transcriptPath, `${JSON.stringify(doc, null, 2)}\n`, 'utf8');
|
|
82
|
+
try {
|
|
83
|
+
writeTranscriptMd(transcriptPath);
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
warnings.push(`transcript.md render failed: ${errMessage(err)}`);
|
|
87
|
+
}
|
|
88
|
+
return { normalized_path: finalNormalized, transcript_path: transcriptPath, warnings };
|
|
89
|
+
}
|
|
90
|
+
return { normalized_path: finalNormalized, warnings };
|
|
91
|
+
}
|
|
92
|
+
/** Native-first runner: shell out to `app.legacy_cli` when a native runtime
|
|
93
|
+
* resolves; else POST to the Docker fallback via the client. */
|
|
94
|
+
function defaultLegacyRunner(client) {
|
|
95
|
+
const native = resolveNativeRuntime();
|
|
96
|
+
if (native !== null) {
|
|
97
|
+
return async (req) => legacyIngestNative(req, { python: native.python, transcriberDir: native.transcriberDir });
|
|
98
|
+
}
|
|
99
|
+
return (req) => client.ingest(req);
|
|
100
|
+
}
|
|
32
101
|
/**
|
|
33
102
|
* Drain all queued `legacy-ingest` jobs (PDF/DOCX/PPTX/CSV/MD/TXT/XLSX).
|
|
34
103
|
* Each job is POSTed to the transcriber's /legacy-ingest route, which writes
|
|
@@ -39,7 +108,12 @@ function readSidecar(sourcePath) {
|
|
|
39
108
|
* failed status after MAX_ATTEMPTS.
|
|
40
109
|
*/
|
|
41
110
|
export async function runLegacyWorkerOnce(seedPath, deps = {}) {
|
|
42
|
-
|
|
111
|
+
// An injected client (tests / explicit Docker) wins. Otherwise, in production,
|
|
112
|
+
// prefer the native path and fall back to the Docker route.
|
|
113
|
+
const runner = deps.runner ??
|
|
114
|
+
(deps.client !== undefined
|
|
115
|
+
? (req) => deps.client.ingest(req)
|
|
116
|
+
: defaultLegacyRunner(new LegacyIngestClient()));
|
|
43
117
|
const queue = new JobQueue(stateDbPath(seedPath));
|
|
44
118
|
const events = openSeedEvents(seedPath);
|
|
45
119
|
const out = { processed: 0, results: [] };
|
|
@@ -49,7 +123,8 @@ export async function runLegacyWorkerOnce(seedPath, deps = {}) {
|
|
|
49
123
|
if (job === null)
|
|
50
124
|
break;
|
|
51
125
|
out.processed += 1;
|
|
52
|
-
|
|
126
|
+
// The service needs a real filesystem path; rows are stored seed-relative (#240).
|
|
127
|
+
const sourcePath = resolveJobSource(seedPath, job.source_path);
|
|
53
128
|
try {
|
|
54
129
|
const sidecar = readSidecar(sourcePath);
|
|
55
130
|
const ingestReq = {
|
|
@@ -59,13 +134,15 @@ export async function runLegacyWorkerOnce(seedPath, deps = {}) {
|
|
|
59
134
|
...(sidecar?.speaker_col !== undefined ? { speaker_col: sidecar.speaker_col } : {}),
|
|
60
135
|
...(sidecar?.sheet !== undefined ? { sheet: sidecar.sheet } : {}),
|
|
61
136
|
};
|
|
62
|
-
const resp = await
|
|
137
|
+
const resp = await runner(ingestReq);
|
|
138
|
+
const linked = linkNormalizedDoc(seedPath, job.payload, resp.normalized_path);
|
|
63
139
|
queue.complete(job.id);
|
|
64
140
|
emitAgentCreate(events, {
|
|
65
141
|
artifactKind: 'legacy_chunk',
|
|
66
142
|
initialState: {
|
|
67
143
|
source_path: resp.source_path,
|
|
68
|
-
normalized_path:
|
|
144
|
+
normalized_path: linked.normalized_path,
|
|
145
|
+
transcript_path: linked.transcript_path ?? null,
|
|
69
146
|
utterance_count: resp.utterance_count,
|
|
70
147
|
status: resp.status,
|
|
71
148
|
text_col_resolved: resp.text_col_resolved ?? null,
|
|
@@ -74,17 +151,21 @@ export async function runLegacyWorkerOnce(seedPath, deps = {}) {
|
|
|
74
151
|
agentName: AGENT_NAME,
|
|
75
152
|
agentVersion: AGENT_VERSION,
|
|
76
153
|
});
|
|
154
|
+
const warnings = [...(resp.warnings ?? []), ...linked.warnings];
|
|
77
155
|
out.results.push({
|
|
78
156
|
job_id: job.id,
|
|
79
157
|
source_path: sourcePath,
|
|
80
158
|
status: resp.status,
|
|
81
|
-
normalized_path:
|
|
159
|
+
normalized_path: linked.normalized_path,
|
|
160
|
+
...(linked.transcript_path !== undefined
|
|
161
|
+
? { transcript_path: linked.transcript_path }
|
|
162
|
+
: {}),
|
|
82
163
|
utterance_count: resp.utterance_count,
|
|
83
|
-
...(
|
|
164
|
+
...(warnings.length > 0 ? { warnings } : {}),
|
|
84
165
|
});
|
|
85
166
|
}
|
|
86
167
|
catch (err) {
|
|
87
|
-
const msg =
|
|
168
|
+
const msg = errMessage(err);
|
|
88
169
|
queue.fail(job.id, msg, MAX_ATTEMPTS);
|
|
89
170
|
out.results.push({ job_id: job.id, source_path: sourcePath, status: 'error' });
|
|
90
171
|
// On service-down, stop the drain — nothing else will succeed now.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"legacy_worker.js","sourceRoot":"","sources":["../../src/loops/legacy_worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"legacy_worker.js","sourceRoot":"","sources":["../../src/loops/legacy_worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,9 @@ export interface SupervisorResult {
|
|
|
19
19
|
inserted: number;
|
|
20
20
|
transcripts_scanned: number;
|
|
21
21
|
};
|
|
22
|
+
/** Jobs that exhausted their attempt budget and sit permanently failed in the
|
|
23
|
+
* queue — nothing will pick them up until `compost jobs requeue` (#239). */
|
|
24
|
+
dead_jobs: number;
|
|
22
25
|
/** Human-readable failure summaries; empty when the pass was clean. The watch
|
|
23
26
|
* command turns a non-empty list into a non-ok status + non-zero exit (#164). */
|
|
24
27
|
failures: string[];
|
|
@@ -61,6 +64,10 @@ export interface RunLiveOptions extends WorkerDeps {
|
|
|
61
64
|
intervalMs?: number;
|
|
62
65
|
signal?: AbortSignal;
|
|
63
66
|
onError?: (loop: string, err: unknown) => void;
|
|
67
|
+
/** Called after each completed pass (not on a thrown/crashed pass — that goes
|
|
68
|
+
* to onError). Lets `watch` surface drained-but-failed jobs / dead jobs that
|
|
69
|
+
* complete without throwing, so a long-lived watch can signal silent failure. */
|
|
70
|
+
onPass?: (result: SupervisorResult) => void;
|
|
64
71
|
}
|
|
65
72
|
/**
|
|
66
73
|
* Live supervisor loop. Runs a pass every intervalMs until aborted. A pass that
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../src/loops/supervisor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../src/loops/supervisor.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,mBAAmB,CAAA;AAE5E,OAAO,EAAE,KAAK,gBAAgB,EAAuB,MAAM,oBAAoB,CAAA;AAC/E,OAAO,EAA2B,KAAK,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAEjF,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAA;IAC7C,UAAU,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IACjD,MAAM,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAC7C,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,mBAAmB,EAAE,MAAM,CAAA;KAAE,CAAA;IAC1E;gFAC4E;IAC5E,SAAS,EAAE,MAAM,CAAA;IACjB;qFACiF;IACjF,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,CAAC,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAE7D;AAED;;mBAEmB;AACnB,wBAAgB,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAE1F;AAED,MAAM,WAAW,cAAe,SAAQ,UAAU;IAChD,MAAM,CAAC,EAAE,gBAAgB,CAAA;IACzB,KAAK,CAAC,EAAE,eAAe,CAAA;IACvB,0FAA0F;IAC1F,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,iFAAiF;IACjF,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,gBAAgB,CAAC,CAgE3B;AAQD,mFAAmF;AACnF,wBAAgB,eAAe,CAAC,WAAW,SAAI,EAAE,MAAM,SAAM,GAAG,MAAM,EAAE,CAEvE;AAED,MAAM,WAAW,cAAe,SAAQ,UAAU;IAChD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,KAAK,IAAI,CAAA;IAC9C;;qFAEiF;IACjF,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAA;CAC5C;AAED;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBxF"}
|
package/dist/loops/supervisor.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { JobQueue, MAX_ATTEMPTS, stateDbPath } from '../lib/queue.js';
|
|
1
2
|
import { getLogPath, Logger } from '../logging.js';
|
|
2
3
|
import { runEmbedWorkerOnce } from './embed_worker.js';
|
|
3
4
|
import { processInbox } from './ingest_watcher.js';
|
|
@@ -57,7 +58,10 @@ export async function runSupervisorOnce(seedPath, deps = {}) {
|
|
|
57
58
|
let embed = { embedded: 0, inserted: 0, transcripts_scanned: 0 };
|
|
58
59
|
if (deps.skipEmbed !== true) {
|
|
59
60
|
try {
|
|
60
|
-
embed = await runEmbedWorkerOnce(seedPath,
|
|
61
|
+
embed = await runEmbedWorkerOnce(seedPath, {
|
|
62
|
+
...(deps.embed ?? {}),
|
|
63
|
+
...(deps.onProgress ? { onProgress: deps.onProgress } : {}),
|
|
64
|
+
});
|
|
61
65
|
await logger.info('embed drained', embed);
|
|
62
66
|
}
|
|
63
67
|
catch (err) {
|
|
@@ -67,11 +71,21 @@ export async function runSupervisorOnce(seedPath, deps = {}) {
|
|
|
67
71
|
await logger.error('embed failed', { error: String(err) });
|
|
68
72
|
}
|
|
69
73
|
}
|
|
74
|
+
// Given-up jobs (status 'failed' after MAX_ATTEMPTS) are skipped by claim(),
|
|
75
|
+
// so without this a pass over a dead queue reports ok forever (#239).
|
|
76
|
+
const queue = new JobQueue(stateDbPath(seedPath));
|
|
77
|
+
const deadJobs = queue.counts().failed;
|
|
78
|
+
queue.close();
|
|
79
|
+
if (deadJobs > 0) {
|
|
80
|
+
failures.push(`${deadJobs} job(s) permanently failed after ${MAX_ATTEMPTS} attempts — run \`compost jobs\` to inspect and \`compost jobs requeue\` to retry`);
|
|
81
|
+
await logger.warn('dead jobs in queue', { count: deadJobs });
|
|
82
|
+
}
|
|
70
83
|
return {
|
|
71
84
|
inbox: { moved: inbox.moved.length, unsupported: inbox.unsupported.length },
|
|
72
85
|
transcribe: { processed: worker.processed, failed: transcribeFailed },
|
|
73
86
|
legacy,
|
|
74
87
|
embed,
|
|
88
|
+
dead_jobs: deadJobs,
|
|
75
89
|
failures,
|
|
76
90
|
};
|
|
77
91
|
}
|
|
@@ -96,7 +110,8 @@ export async function runLive(seedPath, opts = {}) {
|
|
|
96
110
|
let attempt = 0;
|
|
97
111
|
while (true) {
|
|
98
112
|
try {
|
|
99
|
-
await runSupervisorOnce(seedPath, opts);
|
|
113
|
+
const result = await runSupervisorOnce(seedPath, opts);
|
|
114
|
+
opts.onPass?.(result);
|
|
100
115
|
break;
|
|
101
116
|
}
|
|
102
117
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../src/loops/supervisor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAwB,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAClD,OAAO,EAAyB,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAC/E,OAAO,EAAE,uBAAuB,EAAmB,MAAM,wBAAwB,CAAA;
|
|
1
|
+
{"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../src/loops/supervisor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"synthesis.d.ts","sourceRoot":"","sources":["../../src/loops/synthesis.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,eAAe,EAGrB,MAAM,mCAAmC,CAAA;AAS1C,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,YAAY,EAAE,EAC1B,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACvF,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"synthesis.d.ts","sourceRoot":"","sources":["../../src/loops/synthesis.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,eAAe,EAGrB,MAAM,mCAAmC,CAAA;AAS1C,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,YAAY,EAAE,EAC1B,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACvF,eAAe,EAAE,CA+CnB;AAED,MAAM,WAAW,WAAY,SAAQ,eAAe;IAClD,MAAM,EAAE,OAAO,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,GAChD,WAAW,CAmBb"}
|
package/dist/loops/synthesis.js
CHANGED
|
@@ -14,6 +14,8 @@ export function suggestThemesOnce(seedPath, highlights, opts = {}) {
|
|
|
14
14
|
...(opts.threshold !== undefined ? { threshold: opts.threshold } : {}),
|
|
15
15
|
...(opts.minSize !== undefined ? { minSize: opts.minSize } : {}),
|
|
16
16
|
}).slice(0, MAX_SUGGESTIONS);
|
|
17
|
+
const allIds = highlights.map((h) => h.id);
|
|
18
|
+
const threshold = opts.threshold ?? 0.75;
|
|
17
19
|
const events = openSeedEvents(seedPath);
|
|
18
20
|
const out = [];
|
|
19
21
|
try {
|
|
@@ -24,11 +26,24 @@ export function suggestThemesOnce(seedPath, highlights, opts = {}) {
|
|
|
24
26
|
cohesion: cluster.cohesion,
|
|
25
27
|
status: 'draft',
|
|
26
28
|
};
|
|
29
|
+
// Capture the deterministic inputs so this code draft is rerun-able: the
|
|
30
|
+
// clustering is a pure function of the highlight set + params, so recording
|
|
31
|
+
// them lets `compost rerun` re-derive and diff (exactly, if embeddings are
|
|
32
|
+
// unchanged). One bundle per cluster — context carries this cluster's members.
|
|
27
33
|
const event = emitAgentCreate(events, {
|
|
28
34
|
artifactKind: 'code',
|
|
29
35
|
initialState,
|
|
30
36
|
agentName: SCANNER,
|
|
31
37
|
agentVersion: VERSION,
|
|
38
|
+
inputs: {
|
|
39
|
+
model: opts.model ?? `${SCANNER}@${VERSION}`,
|
|
40
|
+
params: {
|
|
41
|
+
threshold,
|
|
42
|
+
...(opts.minSize !== undefined ? { minSize: opts.minSize } : {}),
|
|
43
|
+
},
|
|
44
|
+
prompt: `cosine-cluster ${allIds.length} highlights; emit cohesive code clusters`,
|
|
45
|
+
context: { highlight_ids: allIds, members: cluster.members },
|
|
46
|
+
},
|
|
32
47
|
});
|
|
33
48
|
out.push({
|
|
34
49
|
artifact_id: event.artifact_id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"synthesis.js","sourceRoot":"","sources":["../../src/loops/synthesis.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,eAAe,EACf,mBAAmB,GACpB,MAAM,mCAAmC,CAAA;AAE1C,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAE9E,MAAM,OAAO,GAAG,oBAAoB,CAAA;AACpC,MAAM,KAAK,GAAG,kBAAkB,CAAA;AAChC,MAAM,OAAO,GAAG,OAAO,CAAA;AACvB,MAAM,eAAe,GAAG,EAAE,CAAA;AAQ1B;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAAgB,EAChB,UAA0B,EAC1B,OAAsF,EAAE;IAExF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,UAAU,EAAE;QAC/C,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAA;IAE5B,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAA;IACvC,MAAM,GAAG,GAAsB,EAAE,CAAA;IACjC,IAAI,CAAC;QACH,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,YAAY,GAAG;gBACnB,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,MAAM,EAAE,OAAO;aAChB,CAAA;YACD,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE;gBACpC,YAAY,EAAE,MAAM;gBACpB,YAAY;gBACZ,SAAS,EAAE,OAAO;gBAClB,YAAY,EAAE,OAAO;
|
|
1
|
+
{"version":3,"file":"synthesis.js","sourceRoot":"","sources":["../../src/loops/synthesis.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,9 @@ export interface WorkerStepResult {
|
|
|
10
10
|
}
|
|
11
11
|
export interface WorkerDeps {
|
|
12
12
|
client?: TranscriberClient;
|
|
13
|
+
/** Optional per-item progress sink (the watch command wires this to a
|
|
14
|
+
* TTY-gated stderr line in human mode; stdout stays machine-clean). */
|
|
15
|
+
onProgress?: (msg: string) => void;
|
|
13
16
|
}
|
|
14
17
|
/**
|
|
15
18
|
* Drain all queued `transcribe` jobs (concurrency 1 — the Python service is the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcribe_worker.d.ts","sourceRoot":"","sources":["../../src/loops/transcribe_worker.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transcribe_worker.d.ts","sourceRoot":"","sources":["../../src/loops/transcribe_worker.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAA2B,MAAM,0BAA0B,CAAA;AAKrF,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACjG;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,iBAAiB,CAAA;IAC1B;2EACuE;IACvE,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC;AAED;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,UAAe,GACpB,OAAO,CAAC,gBAAgB,CAAC,CAwE3B"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
|
+
import { errMessage } from '../errors.js';
|
|
2
3
|
import { emitAgentCreate, openSeedEvents } from '../lib/events.js';
|
|
3
|
-
import { JobQueue, stateDbPath } from '../lib/queue.js';
|
|
4
|
+
import { JobQueue, MAX_ATTEMPTS, resolveJobSource, stateDbPath } from '../lib/queue.js';
|
|
4
5
|
import { writeTranscriptMd } from '../render/transcript_md.js';
|
|
5
|
-
import { TranscriberClient } from '../transcriber_client.js';
|
|
6
|
+
import { TranscriberClient, TranscriberServiceError } from '../transcriber_client.js';
|
|
6
7
|
const AGENT_NAME = 'transcribe-worker';
|
|
7
8
|
const AGENT_VERSION = '0.1.0';
|
|
8
|
-
const MAX_ATTEMPTS = 3;
|
|
9
9
|
/**
|
|
10
10
|
* Drain all queued `transcribe` jobs (concurrency 1 — the Python service is the
|
|
11
11
|
* bottleneck). For each: call the service, render transcript.md, and complete.
|
|
@@ -25,9 +25,10 @@ export async function runTranscribeWorkerOnce(seedPath, deps = {}) {
|
|
|
25
25
|
break;
|
|
26
26
|
out.processed += 1;
|
|
27
27
|
const sessionId = String(job.payload.session_id ?? 'S?');
|
|
28
|
+
deps.onProgress?.(`transcribing ${sessionId} (this can take minutes)…`);
|
|
28
29
|
try {
|
|
29
30
|
const language = typeof job.payload.language === 'string' ? job.payload.language : undefined;
|
|
30
|
-
const resp = await client.transcribe(job.source_path, sessionId, seedPath, language);
|
|
31
|
+
const resp = await client.transcribe(resolveJobSource(seedPath, job.source_path), sessionId, seedPath, language);
|
|
31
32
|
if (resp.status === 'failed_transcription') {
|
|
32
33
|
queue.fail(job.id, 'service reported failed_transcription', MAX_ATTEMPTS);
|
|
33
34
|
out.results.push({
|
|
@@ -60,10 +61,17 @@ export async function runTranscribeWorkerOnce(seedPath, deps = {}) {
|
|
|
60
61
|
// needs_speaker_labels: completed but flagged for human; surfaced in result.
|
|
61
62
|
}
|
|
62
63
|
catch (err) {
|
|
63
|
-
queue.fail(job.id,
|
|
64
|
+
queue.fail(job.id, errMessage(err), MAX_ATTEMPTS);
|
|
64
65
|
out.results.push({ job_id: job.id, session_id: sessionId, status: 'error' });
|
|
65
|
-
//
|
|
66
|
-
|
|
66
|
+
// Stop the drain ONLY on a service-level failure (down / model missing) —
|
|
67
|
+
// then nothing else will succeed this pass. A per-file failure (kind
|
|
68
|
+
// 'failed': corrupt media, bad codec) is specific to this job, so keep
|
|
69
|
+
// draining the rest of the queue instead of stalling them (mirrors
|
|
70
|
+
// legacy_worker.ts). The per-job attempt counter handles transient retries.
|
|
71
|
+
if (err instanceof TranscriberServiceError &&
|
|
72
|
+
(err.kind === 'down' || err.kind === 'model_missing')) {
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
67
75
|
}
|
|
68
76
|
}
|
|
69
77
|
return out;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcribe_worker.js","sourceRoot":"","sources":["../../src/loops/transcribe_worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAEpC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAClE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"transcribe_worker.js","sourceRoot":"","sources":["../../src/loops/transcribe_worker.ts"],"names":[],"mappings":"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"}
|
package/dist/output.d.ts
CHANGED
|
@@ -2,7 +2,19 @@ import type { Command } from 'commander';
|
|
|
2
2
|
export interface OutputOptions {
|
|
3
3
|
human: boolean;
|
|
4
4
|
}
|
|
5
|
+
/**
|
|
6
|
+
* Resolve the output mode (#173). Explicit flags win: `--json` → machine,
|
|
7
|
+
* `--human` → readable. With neither, auto-detect: a TTY (a researcher at a
|
|
8
|
+
* terminal) gets human output; a pipe/redirect/MCP spawn (no TTY) gets JSON, so
|
|
9
|
+
* the agent path is unaffected.
|
|
10
|
+
*/
|
|
5
11
|
export declare function getOutputOpts(cmd: Command): OutputOptions;
|
|
6
|
-
|
|
12
|
+
/**
|
|
13
|
+
* Emit a result. In human mode, if a `render` function is provided it prints a
|
|
14
|
+
* readable summary; otherwise (and for any command without a renderer) it
|
|
15
|
+
* pretty-prints the JSON. Machine mode always prints compact JSON — unchanged,
|
|
16
|
+
* so the MCP/agent path is byte-for-byte identical.
|
|
17
|
+
*/
|
|
18
|
+
export declare function emit(data: unknown, opts: OutputOptions, render?: (data: never) => string): void;
|
|
7
19
|
export declare function emitError(err: unknown, opts: OutputOptions): never;
|
|
8
20
|
//# sourceMappingURL=output.d.ts.map
|
package/dist/output.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAKxC,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAA;CACf;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CAOzD;AAED;;;;;GAKG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,MAAM,GAAG,IAAI,CAO/F;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,KAAK,CAalE"}
|
package/dist/output.js
CHANGED
|
@@ -1,19 +1,40 @@
|
|
|
1
|
-
import { isCompostError } from './errors.js';
|
|
1
|
+
import { errMessage, isCompostError } from './errors.js';
|
|
2
|
+
import { redactSecrets } from './lib/redact.js';
|
|
3
|
+
/**
|
|
4
|
+
* Resolve the output mode (#173). Explicit flags win: `--json` → machine,
|
|
5
|
+
* `--human` → readable. With neither, auto-detect: a TTY (a researcher at a
|
|
6
|
+
* terminal) gets human output; a pipe/redirect/MCP spawn (no TTY) gets JSON, so
|
|
7
|
+
* the agent path is unaffected.
|
|
8
|
+
*/
|
|
2
9
|
export function getOutputOpts(cmd) {
|
|
3
10
|
let root = cmd;
|
|
4
11
|
while (root.parent)
|
|
5
12
|
root = root.parent;
|
|
6
13
|
const opts = root.opts();
|
|
7
|
-
|
|
14
|
+
if (opts.json === true)
|
|
15
|
+
return { human: false };
|
|
16
|
+
if (opts.human === true)
|
|
17
|
+
return { human: true };
|
|
18
|
+
return { human: process.stdout.isTTY === true };
|
|
8
19
|
}
|
|
9
|
-
|
|
20
|
+
/**
|
|
21
|
+
* Emit a result. In human mode, if a `render` function is provided it prints a
|
|
22
|
+
* readable summary; otherwise (and for any command without a renderer) it
|
|
23
|
+
* pretty-prints the JSON. Machine mode always prints compact JSON — unchanged,
|
|
24
|
+
* so the MCP/agent path is byte-for-byte identical.
|
|
25
|
+
*/
|
|
26
|
+
export function emit(data, opts, render) {
|
|
27
|
+
if (opts.human && render !== undefined) {
|
|
28
|
+
process.stdout.write(`${render(data)}\n`);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
10
31
|
const text = opts.human ? JSON.stringify(data, null, 2) : JSON.stringify(data);
|
|
11
32
|
process.stdout.write(`${text}\n`);
|
|
12
33
|
}
|
|
13
34
|
export function emitError(err, opts) {
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
const message =
|
|
35
|
+
const code = isCompostError(err) ? err.code : 'INTERNAL';
|
|
36
|
+
// Mask any secret that reached the error message (defense-in-depth, #236).
|
|
37
|
+
const message = redactSecrets(errMessage(err));
|
|
17
38
|
if (opts.human) {
|
|
18
39
|
process.stderr.write(`error: ${message}\n`);
|
|
19
40
|
process.stderr.write(`code: ${code}\n`);
|
package/dist/output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAM/C;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,IAAI,IAAI,GAAY,GAAG,CAAA;IACvB,OAAO,IAAI,CAAC,MAAM;QAAE,IAAI,GAAG,IAAI,CAAC,MAAM,CAAA;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAyC,CAAA;IAC/D,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;IAC/C,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;IAC/C,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,EAAE,CAAA;AACjD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,IAAI,CAAC,IAAa,EAAE,IAAmB,EAAE,MAAgC;IACvF,IAAI,IAAI,CAAC,KAAK,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACvC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,IAAa,CAAC,IAAI,CAAC,CAAA;QAClD,OAAM;IACR,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IAC9E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAA;AACnC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAY,EAAE,IAAmB;IACzD,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAA;IACxD,2EAA2E;IAC3E,MAAM,OAAO,GAAG,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA;IAE9C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,IAAI,CAAC,CAAA;QAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,CAAA;IACzC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;IAC3E,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Status glyphs with an ASCII fallback (#236 readiness follow-up).
|
|
3
|
+
*
|
|
4
|
+
* The human renderers signal pass/fail/warn with `✓ ✗ ⚠ ↳ …` — shapes, not
|
|
5
|
+
* color, which is the accessible choice. But a terminal under a non-UTF-8 locale
|
|
6
|
+
* renders them as mojibake/replacement boxes on exactly the symbols that carry
|
|
7
|
+
* meaning. This centralizes the glyphs behind one helper that degrades to ASCII.
|
|
8
|
+
*
|
|
9
|
+
* Default is UTF-8 (most modern terminals). It degrades to ASCII when
|
|
10
|
+
* `COMPOST_ASCII` is set, or when a locale var (LC_ALL/LC_CTYPE/LANG) is
|
|
11
|
+
* explicitly set to a non-UTF-8 value. An unset/empty locale is treated as
|
|
12
|
+
* UTF-8-capable, so CI and tests keep the familiar glyphs.
|
|
13
|
+
*/
|
|
14
|
+
export interface Glyphs {
|
|
15
|
+
ok: string;
|
|
16
|
+
fail: string;
|
|
17
|
+
warn: string;
|
|
18
|
+
arrow: string;
|
|
19
|
+
ellipsis: string;
|
|
20
|
+
}
|
|
21
|
+
/** True when the terminal can render the UTF-8 status glyphs. */
|
|
22
|
+
export declare function supportsUnicode(env?: NodeJS.ProcessEnv): boolean;
|
|
23
|
+
/** The glyph set appropriate for the current environment. */
|
|
24
|
+
export declare function glyphs(env?: NodeJS.ProcessEnv): Glyphs;
|
|
25
|
+
/** Map a setup/check status onto its glyph, locale-aware. The shared form of
|
|
26
|
+
* the `ok → ✓ / warn → ⚠ / fail → ✗` mapping the setup report, the wizard, and
|
|
27
|
+
* the `setup item` command all need. (NB: the doctor renderer maps a different,
|
|
28
|
+
* warn-less enum and intentionally does not use this.) */
|
|
29
|
+
export declare function statusGlyph(status: 'ok' | 'warn' | 'fail', env?: NodeJS.ProcessEnv): string;
|
|
30
|
+
//# sourceMappingURL=glyphs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glyphs.d.ts","sourceRoot":"","sources":["../../src/render/glyphs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB;AAKD,iEAAiE;AACjE,wBAAgB,eAAe,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAM7E;AAED,6DAA6D;AAC7D,wBAAgB,MAAM,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAEnE;AAED;;;0DAG0D;AAC1D,wBAAgB,WAAW,CACzB,MAAM,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,EAC9B,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,CAGR"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Status glyphs with an ASCII fallback (#236 readiness follow-up).
|
|
3
|
+
*
|
|
4
|
+
* The human renderers signal pass/fail/warn with `✓ ✗ ⚠ ↳ …` — shapes, not
|
|
5
|
+
* color, which is the accessible choice. But a terminal under a non-UTF-8 locale
|
|
6
|
+
* renders them as mojibake/replacement boxes on exactly the symbols that carry
|
|
7
|
+
* meaning. This centralizes the glyphs behind one helper that degrades to ASCII.
|
|
8
|
+
*
|
|
9
|
+
* Default is UTF-8 (most modern terminals). It degrades to ASCII when
|
|
10
|
+
* `COMPOST_ASCII` is set, or when a locale var (LC_ALL/LC_CTYPE/LANG) is
|
|
11
|
+
* explicitly set to a non-UTF-8 value. An unset/empty locale is treated as
|
|
12
|
+
* UTF-8-capable, so CI and tests keep the familiar glyphs.
|
|
13
|
+
*/
|
|
14
|
+
const UNICODE = { ok: '✓', fail: '✗', warn: '⚠', arrow: '↳', ellipsis: '…' };
|
|
15
|
+
const ASCII = { ok: '[OK]', fail: '[X]', warn: '[!]', arrow: '->', ellipsis: '...' };
|
|
16
|
+
/** True when the terminal can render the UTF-8 status glyphs. */
|
|
17
|
+
export function supportsUnicode(env = process.env) {
|
|
18
|
+
const ascii = env.COMPOST_ASCII;
|
|
19
|
+
if (ascii !== undefined && ascii.trim() !== '' && ascii !== '0')
|
|
20
|
+
return false;
|
|
21
|
+
const locale = env.LC_ALL || env.LC_CTYPE || env.LANG;
|
|
22
|
+
if (locale === undefined || locale.trim() === '')
|
|
23
|
+
return true; // unknown → assume UTF-8
|
|
24
|
+
return /utf-?8/i.test(locale);
|
|
25
|
+
}
|
|
26
|
+
/** The glyph set appropriate for the current environment. */
|
|
27
|
+
export function glyphs(env = process.env) {
|
|
28
|
+
return supportsUnicode(env) ? UNICODE : ASCII;
|
|
29
|
+
}
|
|
30
|
+
/** Map a setup/check status onto its glyph, locale-aware. The shared form of
|
|
31
|
+
* the `ok → ✓ / warn → ⚠ / fail → ✗` mapping the setup report, the wizard, and
|
|
32
|
+
* the `setup item` command all need. (NB: the doctor renderer maps a different,
|
|
33
|
+
* warn-less enum and intentionally does not use this.) */
|
|
34
|
+
export function statusGlyph(status, env = process.env) {
|
|
35
|
+
const g = glyphs(env);
|
|
36
|
+
return status === 'ok' ? g.ok : status === 'warn' ? g.warn : g.fail;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=glyphs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glyphs.js","sourceRoot":"","sources":["../../src/render/glyphs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAUH,MAAM,OAAO,GAAW,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAA;AACpF,MAAM,KAAK,GAAW,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAA;AAE5F,iEAAiE;AACjE,MAAM,UAAU,eAAe,CAAC,MAAyB,OAAO,CAAC,GAAG;IAClE,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAA;IAC/B,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,KAAK,KAAK,GAAG;QAAE,OAAO,KAAK,CAAA;IAC7E,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAA;IACrD,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,IAAI,CAAA,CAAC,yBAAyB;IACvF,OAAO,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;AAC/B,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,MAAM,CAAC,MAAyB,OAAO,CAAC,GAAG;IACzD,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAA;AAC/C,CAAC;AAED;;;0DAG0D;AAC1D,MAAM,UAAU,WAAW,CACzB,MAA8B,EAC9B,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACrB,OAAO,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AACrE,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { DoctorReport } from '../lib/doctor.js';
|
|
2
|
+
import type { StatusSnapshot } from '../lib/status.js';
|
|
3
|
+
export declare function renderStatus(s: StatusSnapshot): string;
|
|
4
|
+
interface SearchView {
|
|
5
|
+
query: string;
|
|
6
|
+
returned: number;
|
|
7
|
+
retrieval: string;
|
|
8
|
+
indexed_chunks: number;
|
|
9
|
+
results: Array<{
|
|
10
|
+
session?: string;
|
|
11
|
+
start_ms?: number;
|
|
12
|
+
end_ms?: number;
|
|
13
|
+
score: number;
|
|
14
|
+
text: string;
|
|
15
|
+
}>;
|
|
16
|
+
/** Optional guidance when 0 results — points at the real upstream cause. */
|
|
17
|
+
hint?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare function renderSearch(v: SearchView): string;
|
|
20
|
+
export declare function renderDoctor(r: DoctorReport): string;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=human.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"human.d.ts","sourceRoot":"","sources":["../../src/render/human.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAatD,wBAAgB,YAAY,CAAC,CAAC,EAAE,cAAc,GAAG,MAAM,CAetD;AAED,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;IACtB,OAAO,EAAE,KAAK,CAAC;QACb,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,KAAK,EAAE,MAAM,CAAA;QACb,IAAI,EAAE,MAAM,CAAA;KACb,CAAC,CAAA;IACF,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAmBlD;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAoBpD"}
|