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