@they-juanreina/compost-cli 0.1.3 → 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.map +1 -1
- package/dist/commands/agreement.js +2 -2
- package/dist/commands/agreement.js.map +1 -1
- 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/export.d.ts.map +1 -1
- package/dist/commands/export.js +2 -2
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/import.d.ts.map +1 -1
- package/dist/commands/import.js +5 -0
- package/dist/commands/import.js.map +1 -1
- 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 +1 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/reindex.d.ts.map +1 -1
- package/dist/commands/reindex.js +18 -8
- package/dist/commands/reindex.js.map +1 -1
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +10 -0
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/secrets.d.ts.map +1 -1
- package/dist/commands/secrets.js +13 -11
- package/dist/commands/secrets.js.map +1 -1
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +5 -1
- 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/transcribe.d.ts.map +1 -1
- package/dist/commands/transcribe.js +25 -8
- package/dist/commands/transcribe.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/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/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/artifacts.d.ts +3 -1
- package/dist/lib/artifacts.d.ts.map +1 -1
- package/dist/lib/artifacts.js +15 -20
- 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/events.d.ts +10 -0
- package/dist/lib/events.d.ts.map +1 -1
- package/dist/lib/events.js +20 -1
- package/dist/lib/events.js.map +1 -1
- package/dist/lib/journal.d.ts +0 -4
- package/dist/lib/journal.d.ts.map +1 -1
- package/dist/lib/journal.js +8 -18
- package/dist/lib/journal.js.map +1 -1
- package/dist/lib/legacyNative.d.ts +1 -8
- package/dist/lib/legacyNative.d.ts.map +1 -1
- package/dist/lib/legacyNative.js +10 -23
- package/dist/lib/legacyNative.js.map +1 -1
- 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 +6 -2
- package/dist/lib/provisionNative.js.map +1 -1
- package/dist/lib/reads.d.ts.map +1 -1
- package/dist/lib/reads.js +2 -2
- package/dist/lib/reads.js.map +1 -1
- 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.map +1 -1
- package/dist/lib/rerun.js +3 -9
- package/dist/lib/rerun.js.map +1 -1
- package/dist/lib/retrieve.d.ts.map +1 -1
- package/dist/lib/retrieve.js +2 -1
- 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/secrets.d.ts.map +1 -1
- package/dist/lib/secrets.js +84 -77
- package/dist/lib/secrets.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.map +1 -1
- package/dist/lib/session.js +6 -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 +4 -0
- package/dist/lib/setup.d.ts.map +1 -1
- package/dist/lib/setup.js +28 -23
- 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 +2 -0
- package/dist/lib/setupWizard.d.ts.map +1 -1
- package/dist/lib/setupWizard.js +144 -20
- package/dist/lib/setupWizard.js.map +1 -1
- 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/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/validate.d.ts.map +1 -1
- package/dist/lib/validate.js +2 -1
- package/dist/lib/validate.js.map +1 -1
- package/dist/lib/version.d.ts.map +1 -1
- package/dist/lib/version.js +2 -10
- package/dist/lib/version.js.map +1 -1
- package/dist/llm/adapter.d.ts +5 -0
- package/dist/llm/adapter.d.ts.map +1 -1
- package/dist/llm/adapter.js +25 -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 +2 -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/legacy_worker.d.ts.map +1 -1
- package/dist/loops/legacy_worker.js +12 -3
- package/dist/loops/legacy_worker.js.map +1 -1
- package/dist/loops/supervisor.d.ts +4 -0
- package/dist/loops/supervisor.d.ts.map +1 -1
- package/dist/loops/supervisor.js +6 -2
- package/dist/loops/supervisor.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 +13 -4
- package/dist/loops/transcribe_worker.js.map +1 -1
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +5 -4
- 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 +2 -0
- package/dist/render/human.d.ts.map +1 -1
- package/dist/render/human.js +12 -4
- package/dist/render/human.js.map +1 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +16 -3
- 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 +4 -4
- package/templates/AGENTS.md +1 -1
- package/transcriber/app/transcribe_cli.py +15 -1
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { CompostError, isCompostError } from '../errors.js';
|
|
2
|
+
import { HF_ALIASES, resolveSecret } from '../lib/secrets.js';
|
|
3
|
+
import { runSetup } from '../lib/setup.js';
|
|
4
|
+
import { actionsFor, runItem, validateHfToken, } from '../lib/setupItem.js';
|
|
5
|
+
import { readStdin } from '../lib/stdin.js';
|
|
6
|
+
import { emit, emitError, getOutputOpts } from '../output.js';
|
|
7
|
+
import { statusGlyph } from '../render/glyphs.js';
|
|
8
|
+
/** Everything except `validate` changes state; only renew needs a value. */
|
|
9
|
+
const READONLY = new Set(['validate']);
|
|
10
|
+
const NEEDS_VALUE = new Set(['renew']);
|
|
11
|
+
/**
|
|
12
|
+
* Gate a `setup item run` invocation before it mutates anything. Extracted so
|
|
13
|
+
* the (security-relevant) refusal logic is unit-testable without driving
|
|
14
|
+
* commander: renew/set need a value (piped, so it stays out of shell history),
|
|
15
|
+
* and any mutating action run non-interactively requires an explicit --yes.
|
|
16
|
+
* `interactive` is the REAL terminal signal (`process.stdout.isTTY`), not the
|
|
17
|
+
* `--human` output flag: `--human` is user/agent-forceable even when piped, so
|
|
18
|
+
* gating on it would let an automated caller add `--human` to skip the --yes
|
|
19
|
+
* confirmation. Throws INVALID_INPUT otherwise; returns void when the call may
|
|
20
|
+
* proceed.
|
|
21
|
+
*/
|
|
22
|
+
export function assertRunAllowed(id, action, ctx) {
|
|
23
|
+
if (NEEDS_VALUE.has(action) && ctx.value === '') {
|
|
24
|
+
throw new CompostError('INVALID_INPUT', `Pipe the new value: \`printf %s "$TOKEN" | compost setup item run ${id} ${action}\` (keeps it out of shell history).`);
|
|
25
|
+
}
|
|
26
|
+
if (!READONLY.has(action) && !ctx.interactive && ctx.yes !== true) {
|
|
27
|
+
throw new CompostError('INVALID_INPUT', `Refusing a mutating action non-interactively without --yes.`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Register the `compost setup item …` group on the existing `setup` command.
|
|
32
|
+
* This is the per-item maintenance surface: it has its OWN `command:'setup
|
|
33
|
+
* item …'` JSON envelope, so the read-only `compost setup` report is untouched
|
|
34
|
+
* byte-for-byte. The TTY wizard and the plugin skill are meant to wrap these
|
|
35
|
+
* verbs rather than reimplement the behavior.
|
|
36
|
+
*/
|
|
37
|
+
export function registerSetupItem(setup) {
|
|
38
|
+
const item = setup
|
|
39
|
+
.command('item')
|
|
40
|
+
.description('Inspect and fix ONE setup prerequisite at a time — change/renew/revoke a token, re-validate a live credential, repair a single check.');
|
|
41
|
+
// setup item list — the directory of what's addressable + its actions.
|
|
42
|
+
item
|
|
43
|
+
.command('list')
|
|
44
|
+
.description('List every setup item with its status and the lifecycle actions available on it.')
|
|
45
|
+
.action(async (_flags, cmd) => {
|
|
46
|
+
const out = getOutputOpts(cmd);
|
|
47
|
+
try {
|
|
48
|
+
// Reuse the canonical runSetup probes (single source of truth) and
|
|
49
|
+
// filter, rather than maintaining a separate per-id probe. It runs the
|
|
50
|
+
// full check set — acceptable for an on-demand command; a dedicated
|
|
51
|
+
// single-check probe is a future optimization, not a correctness need.
|
|
52
|
+
const report = await runSetup({ cwd: process.cwd() });
|
|
53
|
+
const items = report.checks.map((c) => ({
|
|
54
|
+
id: c.id,
|
|
55
|
+
label: c.label,
|
|
56
|
+
status: c.status,
|
|
57
|
+
actions: actionsFor(c.id),
|
|
58
|
+
}));
|
|
59
|
+
emit({ command: 'setup item list', schema_version: '1.0', items }, out, (d) => d.items
|
|
60
|
+
.map((it) => {
|
|
61
|
+
const acts = it.actions.length
|
|
62
|
+
? ` actions: ${it.actions.map((a) => a.id).join(', ')}`
|
|
63
|
+
: '';
|
|
64
|
+
return ` ${statusGlyph(it.status)} ${it.id.padEnd(28)} ${it.label}${acts}`;
|
|
65
|
+
})
|
|
66
|
+
.join('\n'));
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
if (isCompostError(err))
|
|
70
|
+
emitError(err, out);
|
|
71
|
+
throw err;
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
// setup item show <id> [--validate] — re-probe ONE item; --validate adds the
|
|
75
|
+
// live credential signal as a SEPARATE field (presence vs validity).
|
|
76
|
+
item
|
|
77
|
+
.command('show')
|
|
78
|
+
.description('Show one setup item: its presence status, fix, and actions. --validate adds a live credential probe.')
|
|
79
|
+
.argument('<id>', 'Stable check id, e.g. hf-token (see `setup item list`)')
|
|
80
|
+
.option('--validate', 'Also probe whether a stored credential is LIVE (network; credential items only)')
|
|
81
|
+
.action(async (id, flags, cmd) => {
|
|
82
|
+
const out = getOutputOpts(cmd);
|
|
83
|
+
try {
|
|
84
|
+
const report = await runSetup({ cwd: process.cwd() });
|
|
85
|
+
const check = report.checks.find((c) => c.id === id);
|
|
86
|
+
if (!check) {
|
|
87
|
+
throw new CompostError('INVALID_INPUT', `Unknown item "${id}". Run \`compost setup item list\` for valid ids.`);
|
|
88
|
+
}
|
|
89
|
+
const actions = actionsFor(id);
|
|
90
|
+
let live;
|
|
91
|
+
if (flags.validate === true && id === 'hf-token') {
|
|
92
|
+
const found = resolveSecret('HUGGINGFACE_TOKEN', { aliases: HF_ALIASES });
|
|
93
|
+
live = found
|
|
94
|
+
? await validateHfToken(found.value)
|
|
95
|
+
: { status: 'fail', detail: 'no token set to validate' };
|
|
96
|
+
}
|
|
97
|
+
emit({ command: 'setup item show', id, check, actions, ...(live ? { live } : {}) }, out, (d) => {
|
|
98
|
+
const lines = [`${d.check.label} [${d.check.status}] — ${d.check.detail}`];
|
|
99
|
+
if (d.check.fix)
|
|
100
|
+
lines.push(` fix: ${d.check.fix}`);
|
|
101
|
+
if (d.live)
|
|
102
|
+
lines.push(` live: ${d.live.status} — ${d.live.detail}`);
|
|
103
|
+
if (d.actions.length)
|
|
104
|
+
lines.push(` actions: ${d.actions.map((a) => `${a.id} (${a.side})`).join(', ')}`);
|
|
105
|
+
return lines.join('\n');
|
|
106
|
+
});
|
|
107
|
+
if (check.status === 'fail' || live?.status === 'fail')
|
|
108
|
+
process.exitCode = 1;
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
if (isCompostError(err))
|
|
112
|
+
emitError(err, out);
|
|
113
|
+
throw err;
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
// setup item run <id> <action> [--yes] — the generic mutation primitive.
|
|
117
|
+
item
|
|
118
|
+
.command('run')
|
|
119
|
+
.description('Run one lifecycle action on one item, e.g. `setup item run hf-token renew`.')
|
|
120
|
+
.argument('<id>', 'Stable check id, e.g. hf-token, model:bge-m3, secret-perms:<path>')
|
|
121
|
+
.argument('<action>', 'validate | renew | forget | pull | fix')
|
|
122
|
+
.option('-y, --yes', 'Confirm a mutating action when not at a TTY (required for --json / piped use)')
|
|
123
|
+
.action(async (id, action, flags, cmd) => {
|
|
124
|
+
const out = getOutputOpts(cmd);
|
|
125
|
+
try {
|
|
126
|
+
const value = NEEDS_VALUE.has(action) ? (await readStdin()).trim() : '';
|
|
127
|
+
assertRunAllowed(id, action, {
|
|
128
|
+
// Real terminal, not the forceable --human flag (see assertRunAllowed).
|
|
129
|
+
interactive: process.stdout.isTTY === true,
|
|
130
|
+
yes: flags.yes === true,
|
|
131
|
+
value,
|
|
132
|
+
});
|
|
133
|
+
const result = await runItem(id, action, value ? { value } : {});
|
|
134
|
+
emit({ command: 'setup item run', ...result }, out, (d) => `${d.id} ${d.action}: ${d.recheck.status} — ${d.recheck.detail}`);
|
|
135
|
+
if (result.recheck.status === 'fail')
|
|
136
|
+
process.exitCode = 1;
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
if (isCompostError(err))
|
|
140
|
+
emitError(err, out);
|
|
141
|
+
throw err;
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=setupItem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setupItem.js","sourceRoot":"","sources":["../../src/commands/setupItem.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcribe.d.ts","sourceRoot":"","sources":["../../src/commands/transcribe.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"transcribe.d.ts","sourceRoot":"","sources":["../../src/commands/transcribe.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAwCxC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4IzD"}
|
|
@@ -4,6 +4,7 @@ import { CompostError, isCompostError } from '../errors.js';
|
|
|
4
4
|
import { isAppleSilicon, pickRuntime, resolveNativeRuntime } from '../lib/nativeRuntime.js';
|
|
5
5
|
import { HF_ALIASES, resolveSecret } from '../lib/secrets.js';
|
|
6
6
|
import { resolveSeedPath } from '../lib/seedResolve.js';
|
|
7
|
+
import { assertSessionContained } from '../lib/sessionId.js';
|
|
7
8
|
import { applySidecar } from '../lib/speakers.js';
|
|
8
9
|
import { transcribeNative } from '../lib/transcribeNative.js';
|
|
9
10
|
import { emit, emitError, getOutputOpts } from '../output.js';
|
|
@@ -18,6 +19,14 @@ function resolveSource(seedPath, sessionId) {
|
|
|
18
19
|
throw new CompostError('FILE_NOT_FOUND', `No source media in ${dir}`);
|
|
19
20
|
return join(dir, src);
|
|
20
21
|
}
|
|
22
|
+
/** After a transcript lands, re-apply persisted speaker names (#177) and render
|
|
23
|
+
* the human-readable transcript.md. No-op if the file isn't there. */
|
|
24
|
+
function finalizeTranscript(path) {
|
|
25
|
+
if (!existsSync(path))
|
|
26
|
+
return;
|
|
27
|
+
applySidecar(path);
|
|
28
|
+
writeTranscriptMd(path);
|
|
29
|
+
}
|
|
21
30
|
export function registerTranscribe(program) {
|
|
22
31
|
program
|
|
23
32
|
.command('transcribe')
|
|
@@ -31,10 +40,16 @@ export function registerTranscribe(program) {
|
|
|
31
40
|
.option('--model <id>', 'ASR model id (engine default when omitted)')
|
|
32
41
|
.option('--python <path>', 'Native-runtime venv python (or env COMPOST_TRANSCRIBER_PYTHON)')
|
|
33
42
|
.option('--transcriber-dir <path>', 'transcriber/ package dir for the native runtime (or env COMPOST_TRANSCRIBER_DIR)')
|
|
43
|
+
.addHelpText('after', '\nExamples:\n $ compost transcribe S001\n $ compost transcribe S001 --language es-CO --runtime native')
|
|
34
44
|
.action(async (sessionId, flags, cmd) => {
|
|
35
45
|
const out = getOutputOpts(cmd);
|
|
36
46
|
try {
|
|
37
47
|
const seedPath = resolveSeedPath(process.cwd(), flags.seed);
|
|
48
|
+
// Guard both branches: sessionId is passed verbatim to the native Python
|
|
49
|
+
// entrypoint (--session-id, no regex there) and the Docker route. Validate
|
|
50
|
+
// it (regex + containment under <seed>/sessions/) before any path join or
|
|
51
|
+
// subprocess (#211 followup).
|
|
52
|
+
assertSessionContained(seedPath, sessionId);
|
|
38
53
|
const source = resolveSource(seedPath, sessionId);
|
|
39
54
|
if (flags.runtime !== undefined &&
|
|
40
55
|
flags.runtime !== 'native' &&
|
|
@@ -62,6 +77,11 @@ export function registerTranscribe(program) {
|
|
|
62
77
|
// secrets.env) and pass it explicitly to the python subprocess, so a
|
|
63
78
|
// keychain-stored token works even though it isn't in process.env.
|
|
64
79
|
const hf = resolveSecret('HUGGINGFACE_TOKEN', { aliases: HF_ALIASES });
|
|
80
|
+
// Native ASR captures the subprocess's stdio, so the terminal is blank
|
|
81
|
+
// for minutes otherwise. Heartbeat to stderr in human mode at a TTY.
|
|
82
|
+
if (out.human && process.stderr.isTTY === true) {
|
|
83
|
+
process.stderr.write(`transcribing ${sessionId} (native; this can take minutes)…\n`);
|
|
84
|
+
}
|
|
65
85
|
const resp = transcribeNative(seedPath, sessionId, source, {
|
|
66
86
|
python: native.python,
|
|
67
87
|
transcriberDir: native.transcriberDir,
|
|
@@ -70,10 +90,7 @@ export function registerTranscribe(program) {
|
|
|
70
90
|
...(flags.language !== undefined ? { language: flags.language } : {}),
|
|
71
91
|
...(hf ? { env: { HUGGINGFACE_TOKEN: hf.value } } : {}),
|
|
72
92
|
});
|
|
73
|
-
|
|
74
|
-
applySidecar(resp.transcript_path); // re-apply persisted speaker names (#177)
|
|
75
|
-
writeTranscriptMd(resp.transcript_path);
|
|
76
|
-
}
|
|
93
|
+
finalizeTranscript(resp.transcript_path);
|
|
77
94
|
emit({
|
|
78
95
|
status: resp.status,
|
|
79
96
|
command: 'transcribe',
|
|
@@ -91,11 +108,11 @@ export function registerTranscribe(program) {
|
|
|
91
108
|
'`compost setup` to enable native Apple-Silicon transcription (~20× faster).\n');
|
|
92
109
|
}
|
|
93
110
|
const client = new TranscriberClient(flags.baseUrl !== undefined ? { baseUrl: flags.baseUrl } : {});
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
applySidecar(resp.transcript_path); // re-apply persisted speaker names (#177)
|
|
97
|
-
writeTranscriptMd(resp.transcript_path);
|
|
111
|
+
if (out.human && process.stderr.isTTY === true) {
|
|
112
|
+
process.stderr.write(`transcribing ${sessionId} (docker; this can take minutes)…\n`);
|
|
98
113
|
}
|
|
114
|
+
const resp = await client.transcribe(source, sessionId, seedPath, flags.language);
|
|
115
|
+
finalizeTranscript(resp.transcript_path);
|
|
99
116
|
emit({
|
|
100
117
|
status: resp.status,
|
|
101
118
|
command: 'transcribe',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcribe.js","sourceRoot":"","sources":["../../src/commands/transcribe.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"transcribe.js","sourceRoot":"","sources":["../../src/commands/transcribe.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAaxC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAaxC,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoGpD"}
|
package/dist/commands/watch.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isCompostError } from '../errors.js';
|
|
1
|
+
import { errMessage, isCompostError } from '../errors.js';
|
|
2
2
|
import { resolveSeedPath } from '../lib/seedResolve.js';
|
|
3
3
|
import { runLive, runSupervisorOnce } from '../loops/supervisor.js';
|
|
4
4
|
import { emit, emitError, getOutputOpts } from '../output.js';
|
|
@@ -9,12 +9,19 @@ export function registerWatch(program) {
|
|
|
9
9
|
.option('--once', 'Drain the queues once and exit instead of looping')
|
|
10
10
|
.option('--seed <name>', 'Seed (default: the only seed under ./Seeds)')
|
|
11
11
|
.option('--interval-ms <ms>', 'Poll interval for live mode', '2000')
|
|
12
|
+
.addHelpText('after', '\nExamples:\n $ compost watch --once # process the queue once, then exit (CI-friendly)\n $ compost watch # live: keep draining every 2s until Ctrl-C')
|
|
12
13
|
.action(async (flags, cmd) => {
|
|
13
14
|
const out = getOutputOpts(cmd);
|
|
14
15
|
try {
|
|
15
16
|
const seedPath = resolveSeedPath(process.cwd(), flags.seed);
|
|
17
|
+
// Per-item progress to stderr in human mode at a TTY only; stdout (the
|
|
18
|
+
// machine result) stays clean and the agent/JSON path is unaffected.
|
|
19
|
+
const showProgress = out.human && process.stderr.isTTY === true;
|
|
20
|
+
const onProgress = showProgress
|
|
21
|
+
? (msg) => process.stderr.write(`${msg}\n`)
|
|
22
|
+
: undefined;
|
|
16
23
|
if (flags.once === true) {
|
|
17
|
-
const result = await runSupervisorOnce(seedPath);
|
|
24
|
+
const result = await runSupervisorOnce(seedPath, onProgress ? { onProgress } : {});
|
|
18
25
|
// A drained-but-failed job is not success (#164): non-ok status + exit 1
|
|
19
26
|
// so scripts/CI can gate, with the failures surfaced inline.
|
|
20
27
|
const ok = result.failures.length === 0;
|
|
@@ -32,13 +39,53 @@ export function registerWatch(program) {
|
|
|
32
39
|
const controller = new AbortController();
|
|
33
40
|
process.on('SIGINT', () => controller.abort());
|
|
34
41
|
process.on('SIGTERM', () => controller.abort());
|
|
35
|
-
|
|
42
|
+
const intervalMs = Number(flags.intervalMs ?? 2000);
|
|
43
|
+
// Track silent failures across passes so a long-lived watch can report a
|
|
44
|
+
// non-zero exit instead of always exiting 0 on Ctrl-C (#164 follow-up).
|
|
45
|
+
let crashedPasses = 0;
|
|
46
|
+
let failedJobPasses = 0;
|
|
47
|
+
let lastDeadJobs = 0;
|
|
48
|
+
if (out.human) {
|
|
49
|
+
process.stderr.write(`watching ${seedPath} every ${intervalMs}ms — Ctrl-C to stop\n`);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
process.stderr.write(`${JSON.stringify({ status: 'watching', seed: seedPath, interval_ms: intervalMs })}\n`);
|
|
53
|
+
}
|
|
36
54
|
await runLive(seedPath, {
|
|
37
|
-
intervalMs
|
|
55
|
+
intervalMs,
|
|
38
56
|
signal: controller.signal,
|
|
39
|
-
|
|
57
|
+
...(onProgress ? { onProgress } : {}),
|
|
58
|
+
onError: (loop, err) => {
|
|
59
|
+
crashedPasses += 1;
|
|
60
|
+
const message = errMessage(err);
|
|
61
|
+
if (out.human)
|
|
62
|
+
process.stderr.write(`loop ${loop} error: ${message}\n`);
|
|
63
|
+
else
|
|
64
|
+
process.stderr.write(`${JSON.stringify({ loop, error: message })}\n`);
|
|
65
|
+
},
|
|
66
|
+
onPass: (result) => {
|
|
67
|
+
if (result.failures.length > 0)
|
|
68
|
+
failedJobPasses += 1;
|
|
69
|
+
lastDeadJobs = result.dead_jobs;
|
|
70
|
+
// Surface drained-but-failed / dead jobs that don't throw, so they
|
|
71
|
+
// aren't only visible via `compost status`/`jobs`.
|
|
72
|
+
if (out.human && (result.failures.length > 0 || result.dead_jobs > 0)) {
|
|
73
|
+
process.stderr.write(`pass: ${result.failures.length} failure(s), ${result.dead_jobs} dead job(s) — see \`compost jobs\`\n`);
|
|
74
|
+
}
|
|
75
|
+
},
|
|
40
76
|
});
|
|
41
|
-
|
|
77
|
+
const clean = crashedPasses === 0 && failedJobPasses === 0 && lastDeadJobs === 0;
|
|
78
|
+
emit({
|
|
79
|
+
status: clean ? 'stopped' : 'stopped_with_failures',
|
|
80
|
+
command: 'watch',
|
|
81
|
+
crashed_passes: crashedPasses,
|
|
82
|
+
failed_job_passes: failedJobPasses,
|
|
83
|
+
dead_jobs: lastDeadJobs,
|
|
84
|
+
}, out, (d) => clean
|
|
85
|
+
? 'watch stopped — no failures'
|
|
86
|
+
: `watch stopped with failures: ${d.crashed_passes} crashed pass(es), ${d.failed_job_passes} pass(es) with failed jobs, ${d.dead_jobs} dead job(s)`);
|
|
87
|
+
if (!clean)
|
|
88
|
+
process.exitCode = 1;
|
|
42
89
|
}
|
|
43
90
|
catch (err) {
|
|
44
91
|
if (isCompostError(err))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/commands/watch.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type CompostErrorCode = 'NOT_IMPLEMENTED' | 'NOT_IN_SEED' | 'INVALID_INPUT' | 'FILE_NOT_FOUND' | 'IO_ERROR' | 'CONFIG_ERROR' | 'PROVIDER_ERROR' | 'SCHEMA_VIOLATION' | 'INTERNAL';
|
|
1
|
+
export type CompostErrorCode = 'NOT_IMPLEMENTED' | 'NOT_IN_SEED' | 'INVALID_INPUT' | 'FILE_NOT_FOUND' | 'IO_ERROR' | 'CONFIG_ERROR' | 'PROVIDER_ERROR' | 'PROVIDER_AUTH' | 'SCHEMA_VIOLATION' | 'INTERNAL';
|
|
2
2
|
export declare class CompostError extends Error {
|
|
3
3
|
readonly code: CompostErrorCode;
|
|
4
4
|
constructor(code: CompostErrorCode, message: string, options?: {
|
|
@@ -6,4 +6,8 @@ export declare class CompostError extends Error {
|
|
|
6
6
|
});
|
|
7
7
|
}
|
|
8
8
|
export declare function isCompostError(value: unknown): value is CompostError;
|
|
9
|
+
/** Best-effort human string for any thrown value: an Error's message, else its
|
|
10
|
+
* String() form. The single source of truth for the `err instanceof Error ?
|
|
11
|
+
* err.message : String(err)` idiom used across the catch sites. */
|
|
12
|
+
export declare function errMessage(err: unknown): string;
|
|
9
13
|
//# sourceMappingURL=errors.d.ts.map
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GACxB,iBAAiB,GACjB,aAAa,GACb,eAAe,GACf,gBAAgB,GAChB,UAAU,GACV,cAAc,GACd,gBAAgB,GAChB,kBAAkB,GAClB,UAAU,CAAA;AAEd,qBAAa,YAAa,SAAQ,KAAK;IACrC,SAAgB,IAAI,EAAE,gBAAgB,CAAA;gBAE1B,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO;CAKvF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAEpE"}
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GACxB,iBAAiB,GACjB,aAAa,GACb,eAAe,GACf,gBAAgB,GAChB,UAAU,GACV,cAAc,GACd,gBAAgB,GAChB,eAAe,GACf,kBAAkB,GAClB,UAAU,CAAA;AAEd,qBAAa,YAAa,SAAQ,KAAK;IACrC,SAAgB,IAAI,EAAE,gBAAgB,CAAA;gBAE1B,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO;CAKvF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAEpE;AAED;;mEAEmE;AACnE,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAE/C"}
|
package/dist/errors.js
CHANGED
|
@@ -9,4 +9,10 @@ export class CompostError extends Error {
|
|
|
9
9
|
export function isCompostError(value) {
|
|
10
10
|
return value instanceof CompostError;
|
|
11
11
|
}
|
|
12
|
+
/** Best-effort human string for any thrown value: an Error's message, else its
|
|
13
|
+
* String() form. The single source of truth for the `err instanceof Error ?
|
|
14
|
+
* err.message : String(err)` idiom used across the catch sites. */
|
|
15
|
+
export function errMessage(err) {
|
|
16
|
+
return err instanceof Error ? err.message : String(err);
|
|
17
|
+
}
|
|
12
18
|
//# sourceMappingURL=errors.js.map
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrB,IAAI,CAAkB;IAEtC,YAAY,IAAsB,EAAE,OAAe,EAAE,UAA+B,EAAE;QACpF,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QAClF,IAAI,CAAC,IAAI,GAAG,cAAc,CAAA;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,KAAK,YAAY,YAAY,CAAA;AACtC,CAAC;AAED;;mEAEmE;AACnE,MAAM,UAAU,UAAU,CAAC,GAAY;IACrC,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;AACzD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdf.d.ts","sourceRoot":"","sources":["../../src/exporters/pdf.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pdf.d.ts","sourceRoot":"","sources":["../../src/exporters/pdf.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,WAAW,EAAgB,MAAM,WAAW,CAAA;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAI9C;sFACsF;AACtF,eAAO,MAAM,gBAAgB,EAAE,WAyB9B,CAAA;AAED;4EAC4E;AAC5E,wBAAsB,eAAe,CACnC,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,WAA8B,GACvC,OAAO,CAAC,MAAM,CAAC,CAIjB"}
|
package/dist/exporters/pdf.js
CHANGED
|
@@ -3,6 +3,7 @@ import { mkdtempSync, writeFileSync } from 'node:fs';
|
|
|
3
3
|
import { tmpdir } from 'node:os';
|
|
4
4
|
import { join } from 'node:path';
|
|
5
5
|
import { promisify } from 'node:util';
|
|
6
|
+
import { scrubbedEnv } from '../lib/childEnv.js';
|
|
6
7
|
import { reportToHtml } from './html.js';
|
|
7
8
|
const execFileAsync = promisify(execFile);
|
|
8
9
|
/** Default renderer: headless Chromium (Chrome/Chromium must be on PATH).
|
|
@@ -21,7 +22,7 @@ export const chromiumRenderer = async (html, outPath) => {
|
|
|
21
22
|
`--print-to-pdf=${outPath}`,
|
|
22
23
|
'--no-pdf-header-footer',
|
|
23
24
|
`file://${htmlPath}`,
|
|
24
|
-
]);
|
|
25
|
+
], { env: scrubbedEnv() });
|
|
25
26
|
return;
|
|
26
27
|
}
|
|
27
28
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../src/exporters/pdf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAErC,OAAO,EAAoB,YAAY,EAAE,MAAM,WAAW,CAAA;AAG1D,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;AAEzC;sFACsF;AACtF,MAAM,CAAC,MAAM,gBAAgB,GAAgB,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IACnE,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,CAAA;IACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IACzC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IACrC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,kBAAkB,EAAE,eAAe,EAAE,sBAAsB,CAAC,CAAA;IACtF,IAAI,OAAgB,CAAA;IACpB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../src/exporters/pdf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAErC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAoB,YAAY,EAAE,MAAM,WAAW,CAAA;AAG1D,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAA;AAEzC;sFACsF;AACtF,MAAM,CAAC,MAAM,gBAAgB,GAAgB,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IACnE,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,CAAA;IACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IACzC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IACrC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,kBAAkB,EAAE,eAAe,EAAE,sBAAsB,CAAC,CAAA;IACtF,IAAI,OAAgB,CAAA;IACpB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,MAAM,aAAa,CACjB,GAAG,EACH;gBACE,YAAY;gBACZ,cAAc;gBACd,kBAAkB,OAAO,EAAE;gBAC3B,wBAAwB;gBACxB,UAAU,QAAQ,EAAE;aACrB,EACD,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,CACvB,CAAA;YACD,OAAM;QACR,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,GAAG,GAAG,CAAA;QACf,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;AAC9F,CAAC,CAAA;AAED;4EAC4E;AAC5E,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAmB,EACnB,OAAe,EACf,WAAwB,gBAAgB;IAExC,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;IACjC,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC7B,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"legacy_client.d.ts","sourceRoot":"","sources":["../src/legacy_client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"legacy_client.d.ts","sourceRoot":"","sources":["../src/legacy_client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAE/C,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe,EAAE,MAAM,CAAA;IACvB,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,IAAI,GAAG,OAAO,GAAG,QAAQ,CAAA;IACjC;oEACgE;IAChE,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC;0CACsC;IACtC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,qBAAa,kBAAmB,SAAQ,KAAK;aAGzB,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,eAAe,GAAG,QAAQ;gBADzE,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,eAAe,GAAG,QAAQ;CAK5E;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,sEAAsE;AACtE,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;gBAEtB,IAAI,GAAE,mBAAwB;IAMpC,MAAM,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC;CA+BtE"}
|
package/dist/legacy_client.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { errMessage } from './errors.js';
|
|
1
2
|
import { resolveFetch } from './llm/http.js';
|
|
2
3
|
export class LegacyServiceError extends Error {
|
|
3
4
|
kind;
|
|
@@ -27,7 +28,7 @@ export class LegacyIngestClient {
|
|
|
27
28
|
});
|
|
28
29
|
}
|
|
29
30
|
catch (err) {
|
|
30
|
-
throw new LegacyServiceError(`legacy-ingest service unreachable at ${this.base}: ${
|
|
31
|
+
throw new LegacyServiceError(`legacy-ingest service unreachable at ${this.base}: ${errMessage(err)}`, 'down');
|
|
31
32
|
}
|
|
32
33
|
if (res.status === 503)
|
|
33
34
|
throw new LegacyServiceError('legacy-ingest dep missing (install transcriber [legacy] extras)', 'dep_missing');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"legacy_client.js","sourceRoot":"","sources":["../src/legacy_client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAwB5C,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAGzB;IAFlB,YACE,OAAe,EACC,IAAyD;QAEzE,KAAK,CAAC,OAAO,CAAC,CAAA;QAFE,SAAI,GAAJ,IAAI,CAAqD;QAGzE,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;IAClC,CAAC;CACF;AAQD,sEAAsE;AACtE,MAAM,OAAO,kBAAkB;IACZ,IAAI,CAAQ;IACZ,SAAS,CAAW;IACpB,SAAS,CAAQ;IAElC,YAAY,OAA4B,EAAE;QACxC,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,OAAO,CAAA,CAAC,oCAAoC;IACjF,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAwB;QACnC,IAAI,GAAmC,CAAA;QACvC,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,IAAI,gBAAgB,EAAE;gBACvD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;aAC1B,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,kBAAkB,CAC1B,wCAAwC,IAAI,CAAC,IAAI,KAAK,
|
|
1
|
+
{"version":3,"file":"legacy_client.js","sourceRoot":"","sources":["../src/legacy_client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAwB5C,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAGzB;IAFlB,YACE,OAAe,EACC,IAAyD;QAEzE,KAAK,CAAC,OAAO,CAAC,CAAA;QAFE,SAAI,GAAJ,IAAI,CAAqD;QAGzE,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAA;IAClC,CAAC;CACF;AAQD,sEAAsE;AACtE,MAAM,OAAO,kBAAkB;IACZ,IAAI,CAAQ;IACZ,SAAS,CAAW;IACpB,SAAS,CAAQ;IAElC,YAAY,OAA4B,EAAE;QACxC,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,OAAO,CAAA,CAAC,oCAAoC;IACjF,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAwB;QACnC,IAAI,GAAmC,CAAA;QACvC,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,IAAI,gBAAgB,EAAE;gBACvD,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;aAC1B,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,kBAAkB,CAC1B,wCAAwC,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,GAAG,CAAC,EAAE,EACvE,MAAM,CACP,CAAA;QACH,CAAC;QACD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YACpB,MAAM,IAAI,kBAAkB,CAC1B,iEAAiE,EACjE,aAAa,CACd,CAAA;QACH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAwB,CAAA;YACtD,MAAM,IAAI,kBAAkB,CAAC,kBAAkB,IAAI,CAAC,MAAM,IAAI,SAAS,EAAE,EAAE,eAAe,CAAC,CAAA;QAC7F,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,kBAAkB,CAC1B,yBAAyB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,EACvD,QAAQ,CACT,CAAA;QACH,CAAC;QACD,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAyB,CAAA;IACnD,CAAC;CACF"}
|
package/dist/lib/artifacts.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import Database from 'better-sqlite3';
|
|
1
|
+
import type Database from 'better-sqlite3';
|
|
2
2
|
import { type AiInputBundle, type Author } from './events.js';
|
|
3
3
|
export interface CreatedArtifact {
|
|
4
4
|
id: string;
|
|
@@ -34,6 +34,8 @@ export declare function createTheme(seedPath: string, input: CreateThemeInput):
|
|
|
34
34
|
interface CreateEventRow {
|
|
35
35
|
id: string;
|
|
36
36
|
artifact_kind: string;
|
|
37
|
+
/** actor_id of the create event — used to refuse a self-endorse (#236). */
|
|
38
|
+
actor_id: string;
|
|
37
39
|
}
|
|
38
40
|
/**
|
|
39
41
|
* Human-id form for an artifact ref: `H-NNN`, `C-slug`, `T-slug` — the id
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../src/lib/artifacts.ts"],"names":[],"mappings":"AAGA,OAAO,QAAQ,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../src/lib/artifacts.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/artifacts.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { existsSync, mkdirSync, readdirSync, rmSync, writeFileSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
-
import Database from 'better-sqlite3';
|
|
4
3
|
import { CompostError } from '../errors.js';
|
|
5
|
-
import { artifactId, emitCreate, emitEndorse, emitReject, emitUpdate, openSeedEvents, } from './events.js';
|
|
4
|
+
import { artifactId, emitCreate, emitEndorse, emitReject, emitUpdate, openReadonlyEvents, openSeedEvents, } from './events.js';
|
|
6
5
|
// ---------------------------------------------------------------- helpers
|
|
7
6
|
/** Next sequential H-NNN in highlights/, scanning existing files. */
|
|
8
7
|
function nextHighlightId(dir) {
|
|
@@ -171,7 +170,7 @@ export function tryResolveHumanRef(db, ref) {
|
|
|
171
170
|
if (!HUMAN_REF_RE.test(ref))
|
|
172
171
|
return undefined;
|
|
173
172
|
return db
|
|
174
|
-
.prepare("SELECT id, artifact_kind, artifact_id FROM events WHERE action = 'create' AND json_extract(payload, '$.id') = ? ORDER BY ts, rowid LIMIT 1")
|
|
173
|
+
.prepare("SELECT id, artifact_kind, artifact_id, actor_id FROM events WHERE action = 'create' AND json_extract(payload, '$.id') = ? ORDER BY ts, rowid LIMIT 1")
|
|
175
174
|
.get(ref);
|
|
176
175
|
}
|
|
177
176
|
/**
|
|
@@ -190,12 +189,12 @@ function findCreateEvent(db, artifactRef) {
|
|
|
190
189
|
if (latest) {
|
|
191
190
|
const kind = latest[1];
|
|
192
191
|
return db
|
|
193
|
-
.prepare("SELECT id, artifact_kind, artifact_id FROM events WHERE artifact_kind = ? AND action = 'create' ORDER BY ts DESC, rowid DESC LIMIT 1")
|
|
192
|
+
.prepare("SELECT id, artifact_kind, artifact_id, actor_id FROM events WHERE artifact_kind = ? AND action = 'create' ORDER BY ts DESC, rowid DESC LIMIT 1")
|
|
194
193
|
.get(kind);
|
|
195
194
|
}
|
|
196
195
|
if (/^[a-f0-9]{8,64}$/i.test(artifactRef)) {
|
|
197
196
|
return db
|
|
198
|
-
.prepare("SELECT id, artifact_kind, artifact_id FROM events WHERE artifact_id LIKE ? AND action = 'create' ORDER BY ts, rowid LIMIT 1")
|
|
197
|
+
.prepare("SELECT id, artifact_kind, artifact_id, actor_id FROM events WHERE artifact_id LIKE ? AND action = 'create' ORDER BY ts, rowid LIMIT 1")
|
|
199
198
|
.get(`${artifactRef.toLowerCase()}%`);
|
|
200
199
|
}
|
|
201
200
|
if (!HUMAN_REF_RE.test(artifactRef)) {
|
|
@@ -220,11 +219,7 @@ function latestEventId(db, artifactId) {
|
|
|
220
219
|
* blame's ref resolution so `compost endorse <id-from-create>` works (#168).
|
|
221
220
|
*/
|
|
222
221
|
export function endorseArtifact(seedPath, artifactRef, researcherId) {
|
|
223
|
-
const
|
|
224
|
-
if (!existsSync(eventsDb)) {
|
|
225
|
-
throw new CompostError('FILE_NOT_FOUND', `No events.sqlite in seed; nothing to endorse.`);
|
|
226
|
-
}
|
|
227
|
-
const db = new Database(eventsDb, { readonly: true, fileMustExist: true });
|
|
222
|
+
const db = openReadonlyEvents(seedPath, 'No events.sqlite in seed; nothing to endorse.');
|
|
228
223
|
let createRow;
|
|
229
224
|
// Same (artifact_id, researcher) endorse already on the timeline → idempotent
|
|
230
225
|
// no-op (#169). Looked up alongside the create row so we hold the read-only
|
|
@@ -244,6 +239,14 @@ export function endorseArtifact(seedPath, artifactRef, researcherId) {
|
|
|
244
239
|
if (createRow === undefined) {
|
|
245
240
|
throw new CompostError('FILE_NOT_FOUND', `No create event found for ref "${artifactRef}".`);
|
|
246
241
|
}
|
|
242
|
+
// Refuse a self-endorse: the actor who created an artifact can't also be the
|
|
243
|
+
// one who endorses it (#236, defense-in-depth). The [draft]→endorsed gate is a
|
|
244
|
+
// human approving an AI/agent suggestion; an agent endorsing under the same
|
|
245
|
+
// actor_id it created with would collapse the gate. The endorsing identity is
|
|
246
|
+
// bound to $COMPOST_USER server-side (commands/endorse.ts), not a tool arg.
|
|
247
|
+
if (researcherId === createRow.actor_id) {
|
|
248
|
+
throw new CompostError('INVALID_INPUT', `Refusing to self-endorse: "${researcherId}" is the actor that created this artifact. Endorsement is a second actor approving it — set COMPOST_USER (or pass --researcher) to a human reviewer distinct from the author.`);
|
|
249
|
+
}
|
|
247
250
|
if (existingEndorse !== undefined) {
|
|
248
251
|
return {
|
|
249
252
|
artifact_id: createRow.artifact_id,
|
|
@@ -278,11 +281,7 @@ export function endorseArtifact(seedPath, artifactRef, researcherId) {
|
|
|
278
281
|
* no-op returning the existing reject.
|
|
279
282
|
*/
|
|
280
283
|
export function rejectArtifact(seedPath, artifactRef, researcherId, note) {
|
|
281
|
-
const
|
|
282
|
-
if (!existsSync(eventsDb)) {
|
|
283
|
-
throw new CompostError('FILE_NOT_FOUND', `No events.sqlite in seed; nothing to reject.`);
|
|
284
|
-
}
|
|
285
|
-
const db = new Database(eventsDb, { readonly: true, fileMustExist: true });
|
|
284
|
+
const db = openReadonlyEvents(seedPath, 'No events.sqlite in seed; nothing to reject.');
|
|
286
285
|
let resolved;
|
|
287
286
|
let existingReject;
|
|
288
287
|
try {
|
|
@@ -338,11 +337,7 @@ export function rejectArtifact(seedPath, artifactRef, researcherId, note) {
|
|
|
338
337
|
* applies only `after`.
|
|
339
338
|
*/
|
|
340
339
|
export function updateArtifact(seedPath, artifactRef, patch, author) {
|
|
341
|
-
const
|
|
342
|
-
if (!existsSync(eventsDb)) {
|
|
343
|
-
throw new CompostError('FILE_NOT_FOUND', `No events.sqlite in seed; nothing to update.`);
|
|
344
|
-
}
|
|
345
|
-
const db = new Database(eventsDb, { readonly: true, fileMustExist: true });
|
|
340
|
+
const db = openReadonlyEvents(seedPath, 'No events.sqlite in seed; nothing to update.');
|
|
346
341
|
let resolved;
|
|
347
342
|
try {
|
|
348
343
|
const createRow = findCreateEvent(db, artifactRef);
|