@they-juanreina/compost-cli 0.1.0-rc.1

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 (362) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +5 -0
  3. package/bin/compost.js +7 -0
  4. package/dist/commands/_stub.d.ts +9 -0
  5. package/dist/commands/_stub.d.ts.map +1 -0
  6. package/dist/commands/_stub.js +27 -0
  7. package/dist/commands/_stub.js.map +1 -0
  8. package/dist/commands/blame.d.ts +3 -0
  9. package/dist/commands/blame.d.ts.map +1 -0
  10. package/dist/commands/blame.js +31 -0
  11. package/dist/commands/blame.js.map +1 -0
  12. package/dist/commands/chat.d.ts +8 -0
  13. package/dist/commands/chat.d.ts.map +1 -0
  14. package/dist/commands/chat.js +99 -0
  15. package/dist/commands/chat.js.map +1 -0
  16. package/dist/commands/code.d.ts +3 -0
  17. package/dist/commands/code.d.ts.map +1 -0
  18. package/dist/commands/code.js +70 -0
  19. package/dist/commands/code.js.map +1 -0
  20. package/dist/commands/config.d.ts +3 -0
  21. package/dist/commands/config.d.ts.map +1 -0
  22. package/dist/commands/config.js +76 -0
  23. package/dist/commands/config.js.map +1 -0
  24. package/dist/commands/create.d.ts +20 -0
  25. package/dist/commands/create.d.ts.map +1 -0
  26. package/dist/commands/create.js +148 -0
  27. package/dist/commands/create.js.map +1 -0
  28. package/dist/commands/endorse.d.ts +3 -0
  29. package/dist/commands/endorse.d.ts.map +1 -0
  30. package/dist/commands/endorse.js +31 -0
  31. package/dist/commands/endorse.js.map +1 -0
  32. package/dist/commands/evals.d.ts +3 -0
  33. package/dist/commands/evals.d.ts.map +1 -0
  34. package/dist/commands/evals.js +54 -0
  35. package/dist/commands/evals.js.map +1 -0
  36. package/dist/commands/export.d.ts +3 -0
  37. package/dist/commands/export.d.ts.map +1 -0
  38. package/dist/commands/export.js +54 -0
  39. package/dist/commands/export.js.map +1 -0
  40. package/dist/commands/ingest.d.ts +3 -0
  41. package/dist/commands/ingest.d.ts.map +1 -0
  42. package/dist/commands/ingest.js +26 -0
  43. package/dist/commands/ingest.js.map +1 -0
  44. package/dist/commands/init.d.ts +3 -0
  45. package/dist/commands/init.d.ts.map +1 -0
  46. package/dist/commands/init.js +51 -0
  47. package/dist/commands/init.js.map +1 -0
  48. package/dist/commands/migrate.d.ts +3 -0
  49. package/dist/commands/migrate.d.ts.map +1 -0
  50. package/dist/commands/migrate.js +28 -0
  51. package/dist/commands/migrate.js.map +1 -0
  52. package/dist/commands/models.d.ts +3 -0
  53. package/dist/commands/models.d.ts.map +1 -0
  54. package/dist/commands/models.js +32 -0
  55. package/dist/commands/models.js.map +1 -0
  56. package/dist/commands/query.d.ts +3 -0
  57. package/dist/commands/query.d.ts.map +1 -0
  58. package/dist/commands/query.js +13 -0
  59. package/dist/commands/query.js.map +1 -0
  60. package/dist/commands/reindex.d.ts +3 -0
  61. package/dist/commands/reindex.d.ts.map +1 -0
  62. package/dist/commands/reindex.js +53 -0
  63. package/dist/commands/reindex.js.map +1 -0
  64. package/dist/commands/rescan.d.ts +3 -0
  65. package/dist/commands/rescan.d.ts.map +1 -0
  66. package/dist/commands/rescan.js +60 -0
  67. package/dist/commands/rescan.js.map +1 -0
  68. package/dist/commands/saturate.d.ts +3 -0
  69. package/dist/commands/saturate.d.ts.map +1 -0
  70. package/dist/commands/saturate.js +35 -0
  71. package/dist/commands/saturate.js.map +1 -0
  72. package/dist/commands/search.d.ts +3 -0
  73. package/dist/commands/search.d.ts.map +1 -0
  74. package/dist/commands/search.js +52 -0
  75. package/dist/commands/search.js.map +1 -0
  76. package/dist/commands/serve.d.ts +3 -0
  77. package/dist/commands/serve.d.ts.map +1 -0
  78. package/dist/commands/serve.js +9 -0
  79. package/dist/commands/serve.js.map +1 -0
  80. package/dist/commands/session.d.ts +3 -0
  81. package/dist/commands/session.d.ts.map +1 -0
  82. package/dist/commands/session.js +25 -0
  83. package/dist/commands/session.js.map +1 -0
  84. package/dist/commands/setup.d.ts +3 -0
  85. package/dist/commands/setup.d.ts.map +1 -0
  86. package/dist/commands/setup.js +38 -0
  87. package/dist/commands/setup.js.map +1 -0
  88. package/dist/commands/snap.d.ts +3 -0
  89. package/dist/commands/snap.d.ts.map +1 -0
  90. package/dist/commands/snap.js +27 -0
  91. package/dist/commands/snap.js.map +1 -0
  92. package/dist/commands/status.d.ts +3 -0
  93. package/dist/commands/status.d.ts.map +1 -0
  94. package/dist/commands/status.js +26 -0
  95. package/dist/commands/status.js.map +1 -0
  96. package/dist/commands/synthesize.d.ts +3 -0
  97. package/dist/commands/synthesize.d.ts.map +1 -0
  98. package/dist/commands/synthesize.js +13 -0
  99. package/dist/commands/synthesize.js.map +1 -0
  100. package/dist/commands/tag.d.ts +3 -0
  101. package/dist/commands/tag.d.ts.map +1 -0
  102. package/dist/commands/tag.js +46 -0
  103. package/dist/commands/tag.js.map +1 -0
  104. package/dist/commands/transcribe.d.ts +3 -0
  105. package/dist/commands/transcribe.d.ts.map +1 -0
  106. package/dist/commands/transcribe.js +110 -0
  107. package/dist/commands/transcribe.js.map +1 -0
  108. package/dist/commands/validate.d.ts +3 -0
  109. package/dist/commands/validate.d.ts.map +1 -0
  110. package/dist/commands/validate.js +81 -0
  111. package/dist/commands/validate.js.map +1 -0
  112. package/dist/commands/watch.d.ts +3 -0
  113. package/dist/commands/watch.d.ts.map +1 -0
  114. package/dist/commands/watch.js +50 -0
  115. package/dist/commands/watch.js.map +1 -0
  116. package/dist/errors.d.ts +9 -0
  117. package/dist/errors.d.ts.map +1 -0
  118. package/dist/errors.js +12 -0
  119. package/dist/errors.js.map +1 -0
  120. package/dist/exporters/csv.d.ts +8 -0
  121. package/dist/exporters/csv.d.ts.map +1 -0
  122. package/dist/exporters/csv.js +44 -0
  123. package/dist/exporters/csv.js.map +1 -0
  124. package/dist/exporters/eaf.d.ts +3 -0
  125. package/dist/exporters/eaf.d.ts.map +1 -0
  126. package/dist/exporters/eaf.js +91 -0
  127. package/dist/exporters/eaf.js.map +1 -0
  128. package/dist/exporters/html.d.ts +8 -0
  129. package/dist/exporters/html.d.ts.map +1 -0
  130. package/dist/exporters/html.js +47 -0
  131. package/dist/exporters/html.js.map +1 -0
  132. package/dist/exporters/md.d.ts +3 -0
  133. package/dist/exporters/md.d.ts.map +1 -0
  134. package/dist/exporters/md.js +43 -0
  135. package/dist/exporters/md.js.map +1 -0
  136. package/dist/exporters/pdf.d.ts +9 -0
  137. package/dist/exporters/pdf.d.ts.map +1 -0
  138. package/dist/exporters/pdf.js +40 -0
  139. package/dist/exporters/pdf.js.map +1 -0
  140. package/dist/exporters/report.d.ts +43 -0
  141. package/dist/exporters/report.d.ts.map +1 -0
  142. package/dist/exporters/report.js +49 -0
  143. package/dist/exporters/report.js.map +1 -0
  144. package/dist/index.d.ts +2 -0
  145. package/dist/index.d.ts.map +1 -0
  146. package/dist/index.js +6 -0
  147. package/dist/index.js.map +1 -0
  148. package/dist/legacy_client.d.ts +38 -0
  149. package/dist/legacy_client.d.ts.map +1 -0
  150. package/dist/legacy_client.js +44 -0
  151. package/dist/legacy_client.js.map +1 -0
  152. package/dist/lib/answerSchema.d.ts +2 -0
  153. package/dist/lib/answerSchema.d.ts.map +1 -0
  154. package/dist/lib/answerSchema.js +27 -0
  155. package/dist/lib/answerSchema.js.map +1 -0
  156. package/dist/lib/artifacts.d.ts +64 -0
  157. package/dist/lib/artifacts.d.ts.map +1 -0
  158. package/dist/lib/artifacts.js +254 -0
  159. package/dist/lib/artifacts.js.map +1 -0
  160. package/dist/lib/blame.d.ts +30 -0
  161. package/dist/lib/blame.d.ts.map +1 -0
  162. package/dist/lib/blame.js +164 -0
  163. package/dist/lib/blame.js.map +1 -0
  164. package/dist/lib/canonicalSessions.d.ts +24 -0
  165. package/dist/lib/canonicalSessions.d.ts.map +1 -0
  166. package/dist/lib/canonicalSessions.js +48 -0
  167. package/dist/lib/canonicalSessions.js.map +1 -0
  168. package/dist/lib/chat.d.ts +24 -0
  169. package/dist/lib/chat.d.ts.map +1 -0
  170. package/dist/lib/chat.js +50 -0
  171. package/dist/lib/chat.js.map +1 -0
  172. package/dist/lib/config.d.ts +45 -0
  173. package/dist/lib/config.d.ts.map +1 -0
  174. package/dist/lib/config.js +143 -0
  175. package/dist/lib/config.js.map +1 -0
  176. package/dist/lib/dispatch.d.ts +10 -0
  177. package/dist/lib/dispatch.d.ts.map +1 -0
  178. package/dist/lib/dispatch.js +31 -0
  179. package/dist/lib/dispatch.js.map +1 -0
  180. package/dist/lib/doctor.d.ts +19 -0
  181. package/dist/lib/doctor.d.ts.map +1 -0
  182. package/dist/lib/doctor.js +43 -0
  183. package/dist/lib/doctor.js.map +1 -0
  184. package/dist/lib/events.d.ts +42 -0
  185. package/dist/lib/events.d.ts.map +1 -0
  186. package/dist/lib/events.js +57 -0
  187. package/dist/lib/events.js.map +1 -0
  188. package/dist/lib/export.d.ts +14 -0
  189. package/dist/lib/export.d.ts.map +1 -0
  190. package/dist/lib/export.js +36 -0
  191. package/dist/lib/export.js.map +1 -0
  192. package/dist/lib/ingest.d.ts +21 -0
  193. package/dist/lib/ingest.d.ts.map +1 -0
  194. package/dist/lib/ingest.js +68 -0
  195. package/dist/lib/ingest.js.map +1 -0
  196. package/dist/lib/journal.d.ts +23 -0
  197. package/dist/lib/journal.d.ts.map +1 -0
  198. package/dist/lib/journal.js +95 -0
  199. package/dist/lib/journal.js.map +1 -0
  200. package/dist/lib/migrate.d.ts +29 -0
  201. package/dist/lib/migrate.d.ts.map +1 -0
  202. package/dist/lib/migrate.js +117 -0
  203. package/dist/lib/migrate.js.map +1 -0
  204. package/dist/lib/nativeRuntime.d.ts +46 -0
  205. package/dist/lib/nativeRuntime.d.ts.map +1 -0
  206. package/dist/lib/nativeRuntime.js +61 -0
  207. package/dist/lib/nativeRuntime.js.map +1 -0
  208. package/dist/lib/provisionNative.d.ts +46 -0
  209. package/dist/lib/provisionNative.d.ts.map +1 -0
  210. package/dist/lib/provisionNative.js +105 -0
  211. package/dist/lib/provisionNative.js.map +1 -0
  212. package/dist/lib/queue.d.ts +36 -0
  213. package/dist/lib/queue.d.ts.map +1 -0
  214. package/dist/lib/queue.js +102 -0
  215. package/dist/lib/queue.js.map +1 -0
  216. package/dist/lib/retrieve.d.ts +51 -0
  217. package/dist/lib/retrieve.d.ts.map +1 -0
  218. package/dist/lib/retrieve.js +92 -0
  219. package/dist/lib/retrieve.js.map +1 -0
  220. package/dist/lib/saturate.d.ts +21 -0
  221. package/dist/lib/saturate.d.ts.map +1 -0
  222. package/dist/lib/saturate.js +132 -0
  223. package/dist/lib/saturate.js.map +1 -0
  224. package/dist/lib/schemas.generated.d.ts +15 -0
  225. package/dist/lib/schemas.generated.d.ts.map +1 -0
  226. package/dist/lib/schemas.generated.js +975 -0
  227. package/dist/lib/schemas.generated.js.map +1 -0
  228. package/dist/lib/seed.d.ts +16 -0
  229. package/dist/lib/seed.d.ts.map +1 -0
  230. package/dist/lib/seed.js +64 -0
  231. package/dist/lib/seed.js.map +1 -0
  232. package/dist/lib/seedResolve.d.ts +6 -0
  233. package/dist/lib/seedResolve.d.ts.map +1 -0
  234. package/dist/lib/seedResolve.js +27 -0
  235. package/dist/lib/seedResolve.js.map +1 -0
  236. package/dist/lib/session.d.ts +19 -0
  237. package/dist/lib/session.d.ts.map +1 -0
  238. package/dist/lib/session.js +61 -0
  239. package/dist/lib/session.js.map +1 -0
  240. package/dist/lib/setup.d.ts +44 -0
  241. package/dist/lib/setup.d.ts.map +1 -0
  242. package/dist/lib/setup.js +249 -0
  243. package/dist/lib/setup.js.map +1 -0
  244. package/dist/lib/snap.d.ts +15 -0
  245. package/dist/lib/snap.d.ts.map +1 -0
  246. package/dist/lib/snap.js +115 -0
  247. package/dist/lib/snap.js.map +1 -0
  248. package/dist/lib/status.d.ts +39 -0
  249. package/dist/lib/status.d.ts.map +1 -0
  250. package/dist/lib/status.js +174 -0
  251. package/dist/lib/status.js.map +1 -0
  252. package/dist/lib/tagcode.d.ts +26 -0
  253. package/dist/lib/tagcode.d.ts.map +1 -0
  254. package/dist/lib/tagcode.js +231 -0
  255. package/dist/lib/tagcode.js.map +1 -0
  256. package/dist/lib/templates.d.ts +3 -0
  257. package/dist/lib/templates.d.ts.map +1 -0
  258. package/dist/lib/templates.js +21 -0
  259. package/dist/lib/templates.js.map +1 -0
  260. package/dist/lib/transcribeNative.d.ts +44 -0
  261. package/dist/lib/transcribeNative.d.ts.map +1 -0
  262. package/dist/lib/transcribeNative.js +53 -0
  263. package/dist/lib/transcribeNative.js.map +1 -0
  264. package/dist/lib/transcript.d.ts +68 -0
  265. package/dist/lib/transcript.d.ts.map +1 -0
  266. package/dist/lib/transcript.js +10 -0
  267. package/dist/lib/transcript.js.map +1 -0
  268. package/dist/lib/validate.d.ts +16 -0
  269. package/dist/lib/validate.d.ts.map +1 -0
  270. package/dist/lib/validate.js +155 -0
  271. package/dist/lib/validate.js.map +1 -0
  272. package/dist/llm/adapter.d.ts +33 -0
  273. package/dist/llm/adapter.d.ts.map +1 -0
  274. package/dist/llm/adapter.js +106 -0
  275. package/dist/llm/adapter.js.map +1 -0
  276. package/dist/llm/http.d.ts +9 -0
  277. package/dist/llm/http.d.ts.map +1 -0
  278. package/dist/llm/http.js +56 -0
  279. package/dist/llm/http.js.map +1 -0
  280. package/dist/llm/providers/anthropic.d.ts +14 -0
  281. package/dist/llm/providers/anthropic.d.ts.map +1 -0
  282. package/dist/llm/providers/anthropic.js +66 -0
  283. package/dist/llm/providers/anthropic.js.map +1 -0
  284. package/dist/llm/providers/lmstudio.d.ts +7 -0
  285. package/dist/llm/providers/lmstudio.d.ts.map +1 -0
  286. package/dist/llm/providers/lmstudio.js +8 -0
  287. package/dist/llm/providers/lmstudio.js.map +1 -0
  288. package/dist/llm/providers/ollama.d.ts +12 -0
  289. package/dist/llm/providers/ollama.d.ts.map +1 -0
  290. package/dist/llm/providers/ollama.js +87 -0
  291. package/dist/llm/providers/ollama.js.map +1 -0
  292. package/dist/llm/providers/openai.d.ts +7 -0
  293. package/dist/llm/providers/openai.d.ts.map +1 -0
  294. package/dist/llm/providers/openai.js +8 -0
  295. package/dist/llm/providers/openai.js.map +1 -0
  296. package/dist/llm/providers/openai_compatible.d.ts +18 -0
  297. package/dist/llm/providers/openai_compatible.d.ts.map +1 -0
  298. package/dist/llm/providers/openai_compatible.js +70 -0
  299. package/dist/llm/providers/openai_compatible.js.map +1 -0
  300. package/dist/llm/types.d.ts +60 -0
  301. package/dist/llm/types.d.ts.map +1 -0
  302. package/dist/llm/types.js +2 -0
  303. package/dist/llm/types.js.map +1 -0
  304. package/dist/logging.d.ts +22 -0
  305. package/dist/logging.d.ts.map +1 -0
  306. package/dist/logging.js +58 -0
  307. package/dist/logging.js.map +1 -0
  308. package/dist/loops/embed_worker.d.ts +44 -0
  309. package/dist/loops/embed_worker.d.ts.map +1 -0
  310. package/dist/loops/embed_worker.js +144 -0
  311. package/dist/loops/embed_worker.js.map +1 -0
  312. package/dist/loops/eval_grader.d.ts +19 -0
  313. package/dist/loops/eval_grader.d.ts.map +1 -0
  314. package/dist/loops/eval_grader.js +22 -0
  315. package/dist/loops/eval_grader.js.map +1 -0
  316. package/dist/loops/ingest_watcher.d.ts +17 -0
  317. package/dist/loops/ingest_watcher.d.ts.map +1 -0
  318. package/dist/loops/ingest_watcher.js +66 -0
  319. package/dist/loops/ingest_watcher.js.map +1 -0
  320. package/dist/loops/legacy_worker.d.ts +26 -0
  321. package/dist/loops/legacy_worker.d.ts.map +1 -0
  322. package/dist/loops/legacy_worker.js +102 -0
  323. package/dist/loops/legacy_worker.js.map +1 -0
  324. package/dist/loops/supervisor.d.ts +71 -0
  325. package/dist/loops/supervisor.d.ts.map +1 -0
  326. package/dist/loops/supervisor.js +122 -0
  327. package/dist/loops/supervisor.js.map +1 -0
  328. package/dist/loops/synthesis.d.ts +31 -0
  329. package/dist/loops/synthesis.d.ts.map +1 -0
  330. package/dist/loops/synthesis.js +71 -0
  331. package/dist/loops/synthesis.js.map +1 -0
  332. package/dist/loops/transcribe_worker.d.ts +22 -0
  333. package/dist/loops/transcribe_worker.d.ts.map +1 -0
  334. package/dist/loops/transcribe_worker.js +77 -0
  335. package/dist/loops/transcribe_worker.js.map +1 -0
  336. package/dist/output.d.ts +8 -0
  337. package/dist/output.d.ts.map +1 -0
  338. package/dist/output.js +26 -0
  339. package/dist/output.js.map +1 -0
  340. package/dist/render/transcript_md.d.ts +5 -0
  341. package/dist/render/transcript_md.d.ts.map +1 -0
  342. package/dist/render/transcript_md.js +14 -0
  343. package/dist/render/transcript_md.js.map +1 -0
  344. package/dist/router.d.ts +3 -0
  345. package/dist/router.d.ts.map +1 -0
  346. package/dist/router.js +68 -0
  347. package/dist/router.js.map +1 -0
  348. package/dist/transcriber_client.d.ts +42 -0
  349. package/dist/transcriber_client.d.ts.map +1 -0
  350. package/dist/transcriber_client.js +72 -0
  351. package/dist/transcriber_client.js.map +1 -0
  352. package/package.json +45 -0
  353. package/templates/AGENTS.md +25 -0
  354. package/templates/config.toml +56 -0
  355. package/templates/sample-seed/codebook/desire-for-manual-override.md +8 -0
  356. package/templates/sample-seed/codebook/distrust-of-automation.md +8 -0
  357. package/templates/sample-seed/highlights/H-001.md +9 -0
  358. package/templates/sample-seed/highlights/H-002.md +9 -0
  359. package/templates/sample-seed/seed.md +17 -0
  360. package/templates/sample-seed/sessions/S001/transcript.json +74 -0
  361. package/templates/sample-seed/synthesis/themes/control-earns-trust.md +13 -0
  362. package/templates/seed.md +21 -0
@@ -0,0 +1,44 @@
1
+ import { type SpawnSyncReturns } from 'node:child_process';
2
+ /** Injectable spawn surface (real `spawnSync` in prod; a fake in tests). */
3
+ export type SpawnImpl = (cmd: string, args: string[], opts: {
4
+ cwd: string;
5
+ env: NodeJS.ProcessEnv;
6
+ encoding: 'utf8';
7
+ maxBuffer: number;
8
+ }) => Pick<SpawnSyncReturns<string>, 'status' | 'stdout' | 'stderr' | 'error'>;
9
+ /**
10
+ * Native (host) transcription path (#176): shell out to the transcriber
11
+ * package's `app.transcribe_cli` running in a host Python venv, so Apple-Silicon
12
+ * ASR (`parakeet-mlx` / Metal) and pyannote use the GPU/CPU directly instead of
13
+ * the CPU-only Docker container. The Python entrypoint shares the exact same
14
+ * `run_pipeline` orchestration as the Docker `/transcribe` route.
15
+ */
16
+ export interface NativeTranscribeOptions {
17
+ /** Path to a Python (3.11+) interpreter in a venv with the native deps. */
18
+ python: string;
19
+ /** Directory containing the `app` package (the transcriber/ root). */
20
+ transcriberDir: string;
21
+ /** ASR engine: 'parakeet' (default, native Metal) or 'whisper'. */
22
+ engine: string;
23
+ /** Optional ASR model id (engine default when omitted). */
24
+ model?: string;
25
+ /** Optional language hint (recorded; Parakeet v3 auto-detects). */
26
+ language?: string;
27
+ /** Extra env (e.g. HUGGINGFACE_TOKEN for pyannote). Merged over process.env. */
28
+ env?: NodeJS.ProcessEnv;
29
+ /** Injectable spawn (tests). Defaults to node:child_process spawnSync. */
30
+ spawnImpl?: SpawnImpl;
31
+ }
32
+ export interface NativeTranscribeResult {
33
+ session_id: string;
34
+ transcript_path: string;
35
+ status: string;
36
+ engine?: string;
37
+ model?: string;
38
+ error?: string;
39
+ }
40
+ /** Run the native transcriber entrypoint synchronously and return its parsed
41
+ * JSON result. Throws a CompostError on spawn failure, non-zero exit, or a
42
+ * `status: "failed"` payload. */
43
+ export declare function transcribeNative(seedPath: string, sessionId: string, sourcePath: string, opts: NativeTranscribeOptions): NativeTranscribeResult;
44
+ //# sourceMappingURL=transcribeNative.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcribeNative.d.ts","sourceRoot":"","sources":["../../src/lib/transcribeNative.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAAa,MAAM,oBAAoB,CAAA;AAIrE,4EAA4E;AAC5E,MAAM,MAAM,SAAS,GAAG,CACtB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,KAC/E,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAA;AAE7E;;;;;;GAMG;AAEH,MAAM,WAAW,uBAAuB;IACtC,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAA;IACd,sEAAsE;IACtE,cAAc,EAAE,MAAM,CAAA;IACtB,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAA;IACd,2DAA2D;IAC3D,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gFAAgF;IAChF,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;IACvB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe,EAAE,MAAM,CAAA;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;iCAEiC;AACjC,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,uBAAuB,GAC5B,sBAAsB,CAqDxB"}
@@ -0,0 +1,53 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { CompostError } from '../errors.js';
3
+ /** Run the native transcriber entrypoint synchronously and return its parsed
4
+ * JSON result. Throws a CompostError on spawn failure, non-zero exit, or a
5
+ * `status: "failed"` payload. */
6
+ export function transcribeNative(seedPath, sessionId, sourcePath, opts) {
7
+ const args = [
8
+ '-m',
9
+ 'app.transcribe_cli',
10
+ '--seed-path',
11
+ seedPath,
12
+ '--session-id',
13
+ sessionId,
14
+ '--source-path',
15
+ sourcePath,
16
+ '--engine',
17
+ opts.engine,
18
+ ];
19
+ if (opts.model)
20
+ args.push('--model', opts.model);
21
+ if (opts.language)
22
+ args.push('--language', opts.language);
23
+ const spawn = opts.spawnImpl ?? spawnSync;
24
+ const res = spawn(opts.python, args, {
25
+ cwd: opts.transcriberDir,
26
+ env: { ...process.env, ...opts.env },
27
+ encoding: 'utf8',
28
+ maxBuffer: 64 * 1024 * 1024,
29
+ });
30
+ if (res.error) {
31
+ throw new CompostError('PROVIDER_ERROR', `native transcriber failed to start (${opts.python}): ${res.error.message}. ` +
32
+ 'Run `compost setup` to provision the native transcription venv.');
33
+ }
34
+ // The entrypoint prints exactly one JSON line; take the last non-empty line.
35
+ const lastLine = (res.stdout || '').trim().split('\n').filter(Boolean).pop() ?? '';
36
+ let parsed;
37
+ try {
38
+ // JSON.parse succeeds on primitives (null, 123, "s"); require an object so a
39
+ // stray non-object line surfaces as the CompostError below, not a raw TypeError.
40
+ const value = JSON.parse(lastLine);
41
+ if (typeof value !== 'object' || value === null)
42
+ throw new Error('not a JSON object');
43
+ parsed = value;
44
+ }
45
+ catch {
46
+ throw new CompostError('PROVIDER_ERROR', `native transcriber produced no parseable result. stderr: ${(res.stderr || '').slice(-400)}`);
47
+ }
48
+ if (res.status !== 0 || parsed.status === 'failed') {
49
+ throw new CompostError('PROVIDER_ERROR', `native transcription failed: ${parsed.error ?? (res.stderr || '').slice(-400)}`);
50
+ }
51
+ return parsed;
52
+ }
53
+ //# sourceMappingURL=transcribeNative.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcribeNative.js","sourceRoot":"","sources":["../../src/lib/transcribeNative.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAErE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AA2C3C;;iCAEiC;AACjC,MAAM,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,SAAiB,EACjB,UAAkB,EAClB,IAA6B;IAE7B,MAAM,IAAI,GAAG;QACX,IAAI;QACJ,oBAAoB;QACpB,aAAa;QACb,QAAQ;QACR,cAAc;QACd,SAAS;QACT,eAAe;QACf,UAAU;QACV,UAAU;QACV,IAAI,CAAC,MAAM;KACZ,CAAA;IACD,IAAI,IAAI,CAAC,KAAK;QAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAA;IAChD,IAAI,IAAI,CAAC,QAAQ;QAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;IAEzD,MAAM,KAAK,GAAc,IAAI,CAAC,SAAS,IAAK,SAAkC,CAAA;IAC9E,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE;QACnC,GAAG,EAAE,IAAI,CAAC,cAAc;QACxB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;QACpC,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;KAC5B,CAAC,CAAA;IAEF,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QACd,MAAM,IAAI,YAAY,CACpB,gBAAgB,EAChB,uCAAuC,IAAI,CAAC,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI;YAC3E,iEAAiE,CACpE,CAAA;IACH,CAAC;IACD,6EAA6E;IAC7E,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAA;IAClF,IAAI,MAA8B,CAAA;IAClC,IAAI,CAAC;QACH,6EAA6E;QAC7E,iFAAiF;QACjF,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;QACrF,MAAM,GAAG,KAA+B,CAAA;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,YAAY,CACpB,gBAAgB,EAChB,4DAA4D,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAC7F,CAAA;IACH,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACnD,MAAM,IAAI,YAAY,CACpB,gBAAgB,EAChB,gCAAgC,MAAM,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CACjF,CAAA;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,68 @@
1
+ export interface TranscriptSpeaker {
2
+ id: string;
3
+ name?: string;
4
+ type: 'moderator' | 'participant' | 'other';
5
+ }
6
+ export interface TranscriptWord {
7
+ w: string;
8
+ s: number;
9
+ e: number;
10
+ conf?: number;
11
+ }
12
+ export interface TranscriptProsody {
13
+ volume?: 'low' | 'normal' | 'high';
14
+ pace?: 'slow' | 'normal' | 'fast';
15
+ hesitations?: number;
16
+ }
17
+ export interface TranscriptUtterance {
18
+ id: string;
19
+ speaker_id: string;
20
+ turn: number;
21
+ start_ms: number;
22
+ end_ms: number;
23
+ text: string;
24
+ words?: TranscriptWord[];
25
+ prosody?: TranscriptProsody;
26
+ annotation?: string;
27
+ }
28
+ export interface TranscriptSilence {
29
+ id: string;
30
+ start_ms: number;
31
+ end_ms: number;
32
+ duration_ms: number;
33
+ context: 'after_question' | 'mid_utterance' | 'thinking' | 'interruption';
34
+ annotation?: string;
35
+ }
36
+ export interface TranscriptCue {
37
+ id: string;
38
+ kind: string;
39
+ start_ms: number;
40
+ end_ms: number;
41
+ source: 'audio';
42
+ speaker_id?: string;
43
+ confidence?: number;
44
+ annotation?: string;
45
+ }
46
+ export interface TranscriptFrame {
47
+ id: string;
48
+ at_ms: number;
49
+ path: string;
50
+ trigger: string;
51
+ linked_utterance_id?: string;
52
+ annotation?: string;
53
+ }
54
+ export interface Transcript {
55
+ schema_version: string;
56
+ session_id: string;
57
+ source: string;
58
+ language: string;
59
+ duration_ms: number;
60
+ modality: string[];
61
+ speakers: TranscriptSpeaker[];
62
+ utterances: TranscriptUtterance[];
63
+ silences?: TranscriptSilence[];
64
+ cues?: TranscriptCue[];
65
+ frames?: TranscriptFrame[];
66
+ }
67
+ export declare function wordCount(text: string): number;
68
+ //# sourceMappingURL=transcript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript.d.ts","sourceRoot":"","sources":["../../src/lib/transcript.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,WAAW,GAAG,aAAa,GAAG,OAAO,CAAA;CAC5C;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;IACT,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAA;IAClC,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAA;IACjC,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,cAAc,EAAE,CAAA;IACxB,OAAO,CAAC,EAAE,iBAAiB,CAAA;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE,gBAAgB,GAAG,eAAe,GAAG,UAAU,GAAG,cAAc,CAAA;IACzE,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,QAAQ,EAAE,iBAAiB,EAAE,CAAA;IAC7B,UAAU,EAAE,mBAAmB,EAAE,CAAA;IACjC,QAAQ,CAAC,EAAE,iBAAiB,EAAE,CAAA;IAC9B,IAAI,CAAC,EAAE,aAAa,EAAE,CAAA;IACtB,MAAM,CAAC,EAAE,eAAe,EAAE,CAAA;CAC3B;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI9C"}
@@ -0,0 +1,10 @@
1
+ // Minimal structural types for the rich transcript (schema/transcript.schema.json).
2
+ // The CLI reads transcripts produced by the Python transcriber; these types cover
3
+ // the fields the Node side consumes. Full validation lives in `compost validate`.
4
+ export function wordCount(text) {
5
+ const trimmed = text.trim();
6
+ if (trimmed.length === 0)
7
+ return 0;
8
+ return trimmed.split(/\s+/).length;
9
+ }
10
+ //# sourceMappingURL=transcript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../src/lib/transcript.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,kFAAkF;AAClF,kFAAkF;AA4ElF,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;IAC3B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAA;IAClC,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAA;AACpC,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface ValidateResult {
2
+ ok: boolean;
3
+ path: string;
4
+ schema: string;
5
+ errors: unknown;
6
+ }
7
+ export declare function validateTranscript(path: string): ValidateResult;
8
+ export declare function validateEventsExport(path: string): ValidateResult;
9
+ /**
10
+ * Validate cue kinds in a transcript against the cues taxonomy.
11
+ * Path may be a transcript.json (we inspect cues[]) or the taxonomy file itself
12
+ * (sanity check of its own shape).
13
+ */
14
+ export declare function validateCues(path: string): ValidateResult;
15
+ export declare function validateFrames(path: string): ValidateResult;
16
+ //# sourceMappingURL=validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/lib/validate.ts"],"names":[],"mappings":"AAyDA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;CAChB;AAaD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAU/D;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAwBjE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAuCzD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,CAqC3D"}
@@ -0,0 +1,155 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { Ajv2020 } from 'ajv/dist/2020.js';
3
+ import addFormatsImport from 'ajv-formats';
4
+ import { CompostError } from '../errors.js';
5
+ import { CUES_TAXONOMY, EVENTS_SCHEMA, FRAMES_TAXONOMY, TRANSCRIPT_SCHEMA, } from './schemas.generated.js';
6
+ const addFormats = addFormatsImport.default ??
7
+ addFormatsImport;
8
+ const ajv = new Ajv2020({ strict: false, allErrors: true });
9
+ addFormats(ajv);
10
+ let transcriptValidator = null;
11
+ let eventsValidator = null;
12
+ function getTranscriptValidator() {
13
+ if (transcriptValidator === null) {
14
+ const fn = ajv.compile(TRANSCRIPT_SCHEMA);
15
+ transcriptValidator = { fn, errors: () => fn.errors };
16
+ }
17
+ return transcriptValidator;
18
+ }
19
+ function getEventsValidator() {
20
+ if (eventsValidator === null) {
21
+ const fn = ajv.compile(EVENTS_SCHEMA);
22
+ eventsValidator = { fn, errors: () => fn.errors };
23
+ }
24
+ return eventsValidator;
25
+ }
26
+ function getCuesTaxonomy() {
27
+ return CUES_TAXONOMY;
28
+ }
29
+ function getFramesTaxonomy() {
30
+ return FRAMES_TAXONOMY;
31
+ }
32
+ function readJson(path) {
33
+ if (!existsSync(path)) {
34
+ throw new CompostError('FILE_NOT_FOUND', `No such file: ${path}`);
35
+ }
36
+ try {
37
+ return JSON.parse(readFileSync(path, 'utf8'));
38
+ }
39
+ catch (err) {
40
+ throw new CompostError('INVALID_INPUT', `Failed to parse JSON at ${path}: ${String(err)}`);
41
+ }
42
+ }
43
+ export function validateTranscript(path) {
44
+ const data = readJson(path);
45
+ const v = getTranscriptValidator();
46
+ const ok = v.fn(data);
47
+ return {
48
+ ok,
49
+ path,
50
+ schema: 'transcript.schema.json',
51
+ errors: ok ? null : v.errors(),
52
+ };
53
+ }
54
+ export function validateEventsExport(path) {
55
+ // The schema describes a single event; an export is typically a JSON array.
56
+ // Accept either: an array → validate each; an object → validate as one event.
57
+ const data = readJson(path);
58
+ const v = getEventsValidator();
59
+ if (Array.isArray(data)) {
60
+ const errors = [];
61
+ for (const [i, evt] of data.entries()) {
62
+ if (!v.fn(evt))
63
+ errors.push({ index: i, errors: v.errors() });
64
+ }
65
+ return {
66
+ ok: errors.length === 0,
67
+ path,
68
+ schema: 'events.schema.json',
69
+ errors: errors.length === 0 ? null : errors,
70
+ };
71
+ }
72
+ const ok = v.fn(data);
73
+ return {
74
+ ok,
75
+ path,
76
+ schema: 'events.schema.json',
77
+ errors: ok ? null : v.errors(),
78
+ };
79
+ }
80
+ /**
81
+ * Validate cue kinds in a transcript against the cues taxonomy.
82
+ * Path may be a transcript.json (we inspect cues[]) or the taxonomy file itself
83
+ * (sanity check of its own shape).
84
+ */
85
+ export function validateCues(path) {
86
+ const data = readJson(path);
87
+ const taxonomy = getCuesTaxonomy();
88
+ const allowed = new Set(taxonomy.kinds.map((k) => k.kind));
89
+ if (Array.isArray(data.kinds)) {
90
+ // Treat as a taxonomy file — verify shape.
91
+ const errors = [];
92
+ for (const k of data.kinds) {
93
+ if (typeof k !== 'object' ||
94
+ k === null ||
95
+ typeof k.kind !== 'string') {
96
+ errors.push(`taxonomy entry missing string 'kind': ${JSON.stringify(k)}`);
97
+ }
98
+ }
99
+ return {
100
+ ok: errors.length === 0,
101
+ path,
102
+ schema: 'cues.taxonomy.json',
103
+ errors: errors.length === 0 ? null : errors,
104
+ };
105
+ }
106
+ // Treat as a transcript — check cues[].kind values against the taxonomy.
107
+ const cues = data.cues ?? [];
108
+ const errors = [];
109
+ for (const [i, cue] of cues.entries()) {
110
+ if (typeof cue.kind !== 'string' || !allowed.has(cue.kind)) {
111
+ errors.push({ index: i, kind: cue.kind, reason: `not in cues taxonomy` });
112
+ }
113
+ }
114
+ return {
115
+ ok: errors.length === 0,
116
+ path,
117
+ schema: 'cues.taxonomy.json',
118
+ errors: errors.length === 0 ? null : errors,
119
+ };
120
+ }
121
+ export function validateFrames(path) {
122
+ const data = readJson(path);
123
+ const taxonomy = getFramesTaxonomy();
124
+ const allowed = new Set(taxonomy.triggers.map((t) => t.trigger));
125
+ if (Array.isArray(data.triggers)) {
126
+ const errors = [];
127
+ for (const t of data.triggers) {
128
+ if (typeof t !== 'object' ||
129
+ t === null ||
130
+ typeof t.trigger !== 'string') {
131
+ errors.push(`taxonomy entry missing string 'trigger': ${JSON.stringify(t)}`);
132
+ }
133
+ }
134
+ return {
135
+ ok: errors.length === 0,
136
+ path,
137
+ schema: 'frames.taxonomy.json',
138
+ errors: errors.length === 0 ? null : errors,
139
+ };
140
+ }
141
+ const frames = data.frames ?? [];
142
+ const errors = [];
143
+ for (const [i, frame] of frames.entries()) {
144
+ if (typeof frame.trigger !== 'string' || !allowed.has(frame.trigger)) {
145
+ errors.push({ index: i, trigger: frame.trigger, reason: `not in frames taxonomy` });
146
+ }
147
+ }
148
+ return {
149
+ ok: errors.length === 0,
150
+ path,
151
+ schema: 'frames.taxonomy.json',
152
+ errors: errors.length === 0 ? null : errors,
153
+ };
154
+ }
155
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/lib/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { type CompostConfig } from '../lib/config.js';
2
+ import type { ChatMessage, ChatResponse, EmbedResponse, FetchLike, Provider, ProviderHealth } from './types.js';
3
+ export interface AdapterOptions {
4
+ /** Inject a fetch stub for tests. Applied to every constructed provider. */
5
+ fetchImpl?: FetchLike;
6
+ }
7
+ export declare class LLMAdapter {
8
+ private readonly config;
9
+ private readonly opts;
10
+ private readonly providers;
11
+ constructor(config: CompostConfig, opts?: AdapterOptions);
12
+ /** Construct (and cache) the driver for a provider name. */
13
+ getProvider(name: string): Provider;
14
+ /** Resolve a task to its routed provider+model via the [defaults] table. */
15
+ resolveTask(task: string): {
16
+ provider: string;
17
+ model: string;
18
+ };
19
+ chat(task: string, messages: ChatMessage[], extra?: {
20
+ schema?: Record<string, unknown>;
21
+ temperature?: number;
22
+ maxTokens?: number;
23
+ }): Promise<ChatResponse>;
24
+ embed(task: string, input: string[]): Promise<EmbedResponse>;
25
+ /** Fail fast with an actionable message when a task routes to a key-requiring
26
+ * provider whose key isn't set — instead of a raw 401 from the HTTP layer. A
27
+ * provider needs a key iff it declares `api_key_env` in [providers] (local
28
+ * providers like ollama/lmstudio don't). */
29
+ private assertProviderHasKey;
30
+ /** Probe every distinct provider referenced by [defaults] plus those configured. */
31
+ healthAll(): Promise<Record<string, ProviderHealth>>;
32
+ }
33
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../src/llm/adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAA+C,MAAM,kBAAkB,CAAA;AAKlG,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,aAAa,EACb,SAAS,EACT,QAAQ,EACR,cAAc,EACf,MAAM,YAAY,CAAA;AAEnB,MAAM,WAAW,cAAc;IAC7B,4EAA4E;IAC5E,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB;AAED,qBAAa,UAAU;IAInB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;gBAGrC,MAAM,EAAE,aAAa,EACrB,IAAI,GAAE,cAAmB;IAG5C,4DAA4D;IAC5D,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ;IAiCnC,4EAA4E;IAC5E,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IAQxD,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,WAAW,EAAE,EACvB,KAAK,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACzF,OAAO,CAAC,YAAY,CAAC;IAMlB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC;IAMlE;;;gDAG4C;IAC5C,OAAO,CAAC,oBAAoB;IAW5B,oFAAoF;IAC9E,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CA0B3D"}
@@ -0,0 +1,106 @@
1
+ import { CompostError } from '../errors.js';
2
+ import { parseRoute, providerApiKey, providerBaseUrl } from '../lib/config.js';
3
+ import { AnthropicProvider } from './providers/anthropic.js';
4
+ import { LMStudioProvider } from './providers/lmstudio.js';
5
+ import { OllamaProvider } from './providers/ollama.js';
6
+ import { OpenAIProvider } from './providers/openai.js';
7
+ export class LLMAdapter {
8
+ config;
9
+ opts;
10
+ providers = new Map();
11
+ constructor(config, opts = {}) {
12
+ this.config = config;
13
+ this.opts = opts;
14
+ }
15
+ /** Construct (and cache) the driver for a provider name. */
16
+ getProvider(name) {
17
+ const cached = this.providers.get(name);
18
+ if (cached)
19
+ return cached;
20
+ const baseUrl = providerBaseUrl(this.config, name);
21
+ const apiKey = providerApiKey(this.config, name);
22
+ const cfg = {
23
+ baseUrl,
24
+ ...(apiKey !== undefined ? { apiKey } : {}),
25
+ ...(this.opts.fetchImpl ? { fetchImpl: this.opts.fetchImpl } : {}),
26
+ };
27
+ let provider;
28
+ switch (name) {
29
+ case 'ollama':
30
+ provider = new OllamaProvider(cfg);
31
+ break;
32
+ case 'lmstudio':
33
+ provider = new LMStudioProvider(cfg);
34
+ break;
35
+ case 'openai':
36
+ provider = new OpenAIProvider(cfg);
37
+ break;
38
+ case 'anthropic':
39
+ provider = new AnthropicProvider(cfg);
40
+ break;
41
+ default:
42
+ throw new CompostError('CONFIG_ERROR', `Unknown provider "${name}"`);
43
+ }
44
+ this.providers.set(name, provider);
45
+ return provider;
46
+ }
47
+ /** Resolve a task to its routed provider+model via the [defaults] table. */
48
+ resolveTask(task) {
49
+ const route = this.config.defaults[task];
50
+ if (route === undefined) {
51
+ throw new CompostError('CONFIG_ERROR', `No route configured for task "${task}" in [defaults]`);
52
+ }
53
+ return parseRoute(route);
54
+ }
55
+ async chat(task, messages, extra = {}) {
56
+ const { provider, model } = this.resolveTask(task);
57
+ this.assertProviderHasKey(task, provider);
58
+ return this.getProvider(provider).chat({ model, messages, ...extra });
59
+ }
60
+ async embed(task, input) {
61
+ const { provider, model } = this.resolveTask(task);
62
+ this.assertProviderHasKey(task, provider);
63
+ return this.getProvider(provider).embed({ model, input });
64
+ }
65
+ /** Fail fast with an actionable message when a task routes to a key-requiring
66
+ * provider whose key isn't set — instead of a raw 401 from the HTTP layer. A
67
+ * provider needs a key iff it declares `api_key_env` in [providers] (local
68
+ * providers like ollama/lmstudio don't). */
69
+ assertProviderHasKey(task, provider) {
70
+ const envName = this.config.providers[provider]?.api_key_env;
71
+ if (envName === undefined)
72
+ return; // local provider — no key needed
73
+ if (providerApiKey(this.config, provider) !== undefined)
74
+ return; // key present
75
+ throw new CompostError('CONFIG_ERROR', `The "${task}" task routes to ${provider}, which needs an API key — set ${envName}, ` +
76
+ 'or route to a local model (e.g. `compost chat --task quick_chat`).');
77
+ }
78
+ /** Probe every distinct provider referenced by [defaults] plus those configured. */
79
+ async healthAll() {
80
+ const names = new Set(Object.keys(this.config.providers));
81
+ for (const route of Object.values(this.config.defaults)) {
82
+ try {
83
+ names.add(parseRoute(route).provider);
84
+ }
85
+ catch {
86
+ // skip malformed routes; doctor surfaces them separately
87
+ }
88
+ }
89
+ const out = {};
90
+ await Promise.all([...names].map(async (name) => {
91
+ try {
92
+ out[name] = await this.getProvider(name).health();
93
+ }
94
+ catch (err) {
95
+ out[name] = {
96
+ ok: false,
97
+ latency_ms: 0,
98
+ model_list: [],
99
+ error: err instanceof Error ? err.message : String(err),
100
+ };
101
+ }
102
+ }));
103
+ return out;
104
+ }
105
+ }
106
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/llm/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { FetchLike } from './types.js';
2
+ export declare function resolveFetch(injected?: FetchLike): FetchLike;
3
+ export interface TimedJson {
4
+ json: unknown;
5
+ latency_ms: number;
6
+ }
7
+ export declare function postJson(fetchImpl: FetchLike, url: string, body: unknown, headers?: Record<string, string>, timeoutMs?: number): Promise<unknown>;
8
+ export declare function getJsonTimed(fetchImpl: FetchLike, url: string, headers?: Record<string, string>, timeoutMs?: number): Promise<TimedJson>;
9
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/llm/http.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE3C,wBAAgB,YAAY,CAAC,QAAQ,CAAC,EAAE,SAAS,GAAG,SAAS,CAI5D;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,OAAO,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;CACnB;AAOD,wBAAsB,QAAQ,CAC5B,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,OAAO,EACb,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EACpC,SAAS,SAAS,GACjB,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAED,wBAAsB,YAAY,CAChC,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EACpC,SAAS,SAAQ,GAChB,OAAO,CAAC,SAAS,CAAC,CAepB"}
@@ -0,0 +1,56 @@
1
+ export function resolveFetch(injected) {
2
+ if (injected)
3
+ return injected;
4
+ // Node 18+ has global fetch. Cast through the structural FetchLike.
5
+ return globalThis.fetch;
6
+ }
7
+ /** A monotonic-ish clock that does not use Date.now directly in hot paths. */
8
+ function nowMs() {
9
+ return performance.now();
10
+ }
11
+ export async function postJson(fetchImpl, url, body, headers = {}, timeoutMs = 120000) {
12
+ const controller = new AbortController();
13
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
14
+ try {
15
+ const res = await fetchImpl(url, {
16
+ method: 'POST',
17
+ headers: { 'content-type': 'application/json', ...headers },
18
+ body: JSON.stringify(body),
19
+ signal: controller.signal,
20
+ });
21
+ if (!res.ok) {
22
+ const detail = await safeText(res);
23
+ throw new Error(`POST ${url} → ${res.status} ${res.statusText}: ${detail}`);
24
+ }
25
+ return await res.json();
26
+ }
27
+ finally {
28
+ clearTimeout(timer);
29
+ }
30
+ }
31
+ export async function getJsonTimed(fetchImpl, url, headers = {}, timeoutMs = 10000) {
32
+ const controller = new AbortController();
33
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
34
+ const start = nowMs();
35
+ try {
36
+ const res = await fetchImpl(url, { method: 'GET', headers, signal: controller.signal });
37
+ const latency_ms = Math.round(nowMs() - start);
38
+ if (!res.ok) {
39
+ const detail = await safeText(res);
40
+ throw new Error(`GET ${url} → ${res.status} ${res.statusText}: ${detail}`);
41
+ }
42
+ return { json: await res.json(), latency_ms };
43
+ }
44
+ finally {
45
+ clearTimeout(timer);
46
+ }
47
+ }
48
+ async function safeText(res) {
49
+ try {
50
+ return (await res.text()).slice(0, 200);
51
+ }
52
+ catch {
53
+ return '<no body>';
54
+ }
55
+ }
56
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/llm/http.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,QAAoB;IAC/C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAA;IAC7B,oEAAoE;IACpE,OAAO,UAAU,CAAC,KAA6B,CAAA;AACjD,CAAC;AAOD,8EAA8E;AAC9E,SAAS,KAAK;IACZ,OAAO,WAAW,CAAC,GAAG,EAAE,CAAA;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,SAAoB,EACpB,GAAW,EACX,IAAa,EACb,UAAkC,EAAE,EACpC,SAAS,GAAG,MAAM;IAElB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAA;IAC7D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;YAC/B,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,OAAO,EAAE;YAC3D,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAA;QACF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAA;YAClC,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,MAAM,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC,CAAA;QAC7E,CAAC;QACD,OAAO,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;IACzB,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,SAAoB,EACpB,GAAW,EACX,UAAkC,EAAE,EACpC,SAAS,GAAG,KAAK;IAEjB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAA;IAC7D,MAAM,KAAK,GAAG,KAAK,EAAE,CAAA;IACrB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;QACvF,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,CAAA;QAC9C,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,GAAG,CAAC,CAAA;YAClC,MAAM,IAAI,KAAK,CAAC,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,KAAK,MAAM,EAAE,CAAC,CAAA;QAC5E,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,CAAA;IAC/C,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,GAAoC;IAC1D,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACzC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,WAAW,CAAA;IACpB,CAAC;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { ChatRequest, ChatResponse, EmbedRequest, EmbedResponse, Provider, ProviderConfig, ProviderHealth } from '../types.js';
2
+ export declare class AnthropicProvider implements Provider {
3
+ readonly name = "anthropic";
4
+ private readonly base;
5
+ private readonly apiKey;
6
+ private readonly fetchImpl;
7
+ private readonly timeoutMs;
8
+ constructor(config: ProviderConfig);
9
+ private headers;
10
+ chat(req: ChatRequest): Promise<ChatResponse>;
11
+ embed(_req: EmbedRequest): Promise<EmbedResponse>;
12
+ health(): Promise<ProviderHealth>;
13
+ }
14
+ //# sourceMappingURL=anthropic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/anthropic.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,EAEb,QAAQ,EACR,cAAc,EACd,cAAc,EACf,MAAM,aAAa,CAAA;AAIpB,qBAAa,iBAAkB,YAAW,QAAQ;IAChD,QAAQ,CAAC,IAAI,eAAc;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;gBAEtB,MAAM,EAAE,cAAc;IAOlC,OAAO,CAAC,OAAO;IAOT,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAiC7C,KAAK,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAMjD,MAAM,IAAI,OAAO,CAAC,cAAc,CAAC;CAkBxC"}