@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
@@ -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 { JobQueue, stateDbPath } from '../lib/queue.js';
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
- const client = deps.client ?? new LegacyIngestClient();
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
- const sourcePath = job.source_path;
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 client.ingest(ingestReq);
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: resp.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: resp.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
- ...(resp.warnings && resp.warnings.length > 0 ? { warnings: resp.warnings } : {}),
164
+ ...(warnings.length > 0 ? { warnings } : {}),
84
165
  });
85
166
  }
86
167
  catch (err) {
87
- const msg = err instanceof Error ? err.message : String(err);
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":"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"}
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":"AACA,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;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,CAgD3B;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;CAC/C;AAED;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBxF"}
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"}
@@ -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, deps.embed ?? {});
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":"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"}
1
+ {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../src/loops/supervisor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AACrE,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;AAejF,oFAAoF;AACpF,MAAM,UAAU,cAAc,CAAC,CAAqB;IAClD,OAAO,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,sBAAsB,CAAA;AACpE,CAAC;AAED;;mBAEmB;AACnB,MAAM,UAAU,eAAe,CAAC,OAAkD;IAChF,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAA;AAC1E,CAAC;AAWD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,OAAuB,EAAE;IAEzB,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAA;IACjD,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAA;IACpC,MAAM,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE;QACjC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM;QACzB,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,MAAM;KACtC,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,MAAM,uBAAuB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAC5D,MAAM,gBAAgB,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACxD,IAAI,gBAAgB,GAAG,CAAC;QAAE,QAAQ,CAAC,IAAI,CAAC,eAAe,gBAAgB,gBAAgB,CAAC,CAAA;IACxF,MAAM,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAA;IAElG,IAAI,MAAM,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAA;IACxC,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAA;YACrE,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YAC9C,MAAM,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,CAAA;YAChD,IAAI,MAAM,GAAG,CAAC;gBAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,MAAM,gBAAgB,CAAC,CAAA;YAChE,MAAM,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAA;QAC7C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,6EAA6E;YAC7E,QAAQ,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACvC,MAAM,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC7D,CAAC;IACH,CAAC;IAED,IAAI,KAAK,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,mBAAmB,EAAE,CAAC,EAAE,CAAA;IAChE,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,kBAAkB,CAAC,QAAQ,EAAE;gBACzC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;gBACrB,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC5D,CAAC,CAAA;YACF,MAAM,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,CAAA;QAC3C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,wFAAwF;YACxF,mFAAmF;YACnF,QAAQ,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YACtC,MAAM,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAC5D,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,sEAAsE;IACtE,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAA;IACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM,CAAA;IACtC,KAAK,CAAC,KAAK,EAAE,CAAA;IACb,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;QACjB,QAAQ,CAAC,IAAI,CACX,GAAG,QAAQ,oCAAoC,YAAY,mFAAmF,CAC/I,CAAA;QACD,MAAM,MAAM,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;IAC9D,CAAC;IAED,OAAO;QACL,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE;QAC3E,UAAU,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE;QACrE,MAAM;QACN,KAAK;QACL,SAAS,EAAE,QAAQ;QACnB,QAAQ;KACT,CAAA;AACH,CAAC;AAED,SAAS,UAAU,CAAC,QAAgB,EAAE,IAAY;IAChD,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAA,CAAC,oCAAoC;IACtE,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,IAAI,QAAQ,CAAC,CAAA;IACvD,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,CAAA;AAC5B,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,eAAe,CAAC,WAAW,GAAG,CAAC,EAAE,MAAM,GAAG,GAAG;IAC3D,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;AACvE,CAAC;AAYD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,QAAgB,EAAE,OAAuB,EAAE;IACvE,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAA;IACxC,MAAM,OAAO,GAAG,eAAe,EAAE,CAAA;IACjC,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;QACrC,IAAI,OAAO,GAAG,CAAC,CAAA;QACf,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;gBACtD,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAA;gBACrB,MAAK;YACP,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,OAAO,EAAE,CAAC,YAAY,EAAE,GAAG,CAAC,CAAA;gBACjC,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM;oBAAE,MAAK;gBACpC,sGAAsG;gBACtG,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;gBAC3C,OAAO,IAAI,CAAC,CAAA;YACd,CAAC;QACH,CAAC;QACD,MAAM,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;IACpC,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,EAAU,EAAE,MAAoB;IAC7C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;QACjC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACrC,YAAY,CAAC,CAAC,CAAC,CAAA;YACf,OAAO,EAAE,CAAA;QACX,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -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,CAgCnB;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"}
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"}
@@ -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;aACtB,CAAC,CAAA;YACF,GAAG,CAAC,IAAI,CAAC;gBACP,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,KAAK,EAAE,CAAA;IAChB,CAAC;AACH,CAAC;AAOD;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,QAAgB,EAChB,QAAiD;IAEjD,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAA;IACvC,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAA;IACvC,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,EAAE,IAAI,EAAE,kBAAkB,EAAE,GAAG,KAAK,EAAE,CAAA;QAC3D,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE;YACpC,YAAY,EAAE,SAAS;YACvB,YAAY;YACZ,SAAS,EAAE,KAAK;YAChB,YAAY,EAAE,OAAO;SACtB,CAAC,CAAA;QACF,OAAO;YACL,GAAG,KAAK;YACR,MAAM,EAAE,KAAK,CAAC,cAAc,KAAK,UAAU;YAC3C,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,UAAU,CAAC,YAAY,CAAC;SAC3D,CAAA;IACH,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,KAAK,EAAE,CAAA;IAChB,CAAC;AACH,CAAC"}
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":"AAKA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAM5D,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;CAC3B;AAED;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,UAAe,GACpB,OAAO,CAAC,gBAAgB,CAAC,CAyD3B"}
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, err instanceof Error ? err.message : String(err), MAX_ATTEMPTS);
64
+ queue.fail(job.id, errMessage(err), MAX_ATTEMPTS);
64
65
  out.results.push({ job_id: job.id, session_id: sessionId, status: 'error' });
65
- // stop the drain on a service-down error; nothing else will succeed now.
66
- break;
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":"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"}
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
- export declare function emit(data: unknown, opts: OutputOptions): void;
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
@@ -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;AAIxC,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,OAAO,CAAA;CACf;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,CAKzD;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI,CAG7D;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,GAAG,KAAK,CAalE"}
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
- return { human: opts.human === true };
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
- export function emit(data, opts) {
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 compost = isCompostError(err);
15
- const code = compost ? err.code : 'INTERNAL';
16
- const message = err instanceof Error ? err.message : String(err);
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`);
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAM5C,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,EAAyB,CAAA;IAC/C,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAA;AACvC,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAa,EAAE,IAAmB;IACrD,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,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAA;IACnC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAA;IAC5C,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAEhE,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"}
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"}