@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,66 @@
1
+ import { getJsonTimed, postJson, resolveFetch } from '../http.js';
2
+ const ANTHROPIC_VERSION = '2023-06-01';
3
+ export class AnthropicProvider {
4
+ name = 'anthropic';
5
+ base;
6
+ apiKey;
7
+ fetchImpl;
8
+ timeoutMs;
9
+ constructor(config) {
10
+ this.base = config.baseUrl.replace(/\/$/, '');
11
+ this.apiKey = config.apiKey;
12
+ this.fetchImpl = resolveFetch(config.fetchImpl);
13
+ this.timeoutMs = config.timeoutMs ?? 120000;
14
+ }
15
+ headers() {
16
+ return {
17
+ 'x-api-key': this.apiKey ?? '',
18
+ 'anthropic-version': ANTHROPIC_VERSION,
19
+ };
20
+ }
21
+ async chat(req) {
22
+ // Anthropic separates the system prompt from the messages array.
23
+ const system = req.messages
24
+ .filter((m) => m.role === 'system')
25
+ .map((m) => m.content)
26
+ .join('\n\n');
27
+ const messages = req.messages
28
+ .filter((m) => m.role !== 'system')
29
+ .map((m) => ({ role: m.role, content: m.content }));
30
+ const body = {
31
+ model: req.model,
32
+ max_tokens: req.maxTokens ?? 4096,
33
+ messages,
34
+ };
35
+ if (system.length > 0)
36
+ body.system = system;
37
+ if (req.temperature !== undefined)
38
+ body.temperature = req.temperature;
39
+ const json = (await postJson(this.fetchImpl, `${this.base}/v1/messages`, body, this.headers(), this.timeoutMs));
40
+ const text = (json.content ?? [])
41
+ .filter((b) => b.type === 'text')
42
+ .map((b) => b.text ?? '')
43
+ .join('');
44
+ return { text, model: req.model, provider: this.name, raw: json };
45
+ }
46
+ // Anthropic has no embeddings endpoint; route embeddings to Ollama/OpenAI instead.
47
+ async embed(_req) {
48
+ throw new Error('anthropic provider does not support embeddings; route the embeddings task to ollama or openai');
49
+ }
50
+ async health() {
51
+ try {
52
+ const { json, latency_ms } = await getJsonTimed(this.fetchImpl, `${this.base}/v1/models`, this.headers());
53
+ const data = json.data ?? [];
54
+ return { ok: true, latency_ms, model_list: data.map((m) => m.id) };
55
+ }
56
+ catch (err) {
57
+ return {
58
+ ok: false,
59
+ latency_ms: 0,
60
+ model_list: [],
61
+ error: err instanceof Error ? err.message : String(err),
62
+ };
63
+ }
64
+ }
65
+ }
66
+ //# sourceMappingURL=anthropic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"anthropic.js","sourceRoot":"","sources":["../../../src/llm/providers/anthropic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ProviderConfig } from '../types.js';
2
+ import { OpenAICompatibleProvider } from './openai_compatible.js';
3
+ /** LM Studio exposes an OpenAI-compatible server (default http://localhost:1234/v1). */
4
+ export declare class LMStudioProvider extends OpenAICompatibleProvider {
5
+ constructor(config: ProviderConfig);
6
+ }
7
+ //# sourceMappingURL=lmstudio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lmstudio.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/lmstudio.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAA;AAEjE,wFAAwF;AACxF,qBAAa,gBAAiB,SAAQ,wBAAwB;gBAChD,MAAM,EAAE,cAAc;CAGnC"}
@@ -0,0 +1,8 @@
1
+ import { OpenAICompatibleProvider } from './openai_compatible.js';
2
+ /** LM Studio exposes an OpenAI-compatible server (default http://localhost:1234/v1). */
3
+ export class LMStudioProvider extends OpenAICompatibleProvider {
4
+ constructor(config) {
5
+ super('lmstudio', config);
6
+ }
7
+ }
8
+ //# sourceMappingURL=lmstudio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lmstudio.js","sourceRoot":"","sources":["../../../src/llm/providers/lmstudio.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAA;AAEjE,wFAAwF;AACxF,MAAM,OAAO,gBAAiB,SAAQ,wBAAwB;IAC5D,YAAY,MAAsB;QAChC,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;IAC3B,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ import type { ChatRequest, ChatResponse, EmbedRequest, EmbedResponse, Provider, ProviderConfig, ProviderHealth } from '../types.js';
2
+ export declare class OllamaProvider implements Provider {
3
+ readonly name = "ollama";
4
+ private readonly base;
5
+ private readonly fetchImpl;
6
+ private readonly timeoutMs;
7
+ constructor(config: ProviderConfig);
8
+ chat(req: ChatRequest): Promise<ChatResponse>;
9
+ embed(req: EmbedRequest): Promise<EmbedResponse>;
10
+ health(): Promise<ProviderHealth>;
11
+ }
12
+ //# sourceMappingURL=ollama.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/ollama.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,EAEb,QAAQ,EACR,cAAc,EACd,cAAc,EACf,MAAM,aAAa,CAAA;AAwBpB,qBAAa,cAAe,YAAW,QAAQ;IAC7C,QAAQ,CAAC,IAAI,YAAW;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;gBAEtB,MAAM,EAAE,cAAc;IAM5B,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA4B7C,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAoBhD,MAAM,IAAI,OAAO,CAAC,cAAc,CAAC;CAcxC"}
@@ -0,0 +1,87 @@
1
+ import { CompostError } from '../../errors.js';
2
+ import { getJsonTimed, postJson, resolveFetch } from '../http.js';
3
+ /**
4
+ * Ollama returns 404 with body `{"error":"model 'X' not found"}` when the
5
+ * requested model hasn't been pulled. postJson surfaces that as a raw
6
+ * "POST … → 404 Not Found: …" Error — unactionable. Translate it to a
7
+ * CompostError that names the `ollama pull` to run (#191). Parallels the
8
+ * #160 fix that gave the missing-cloud-key case the same treatment.
9
+ *
10
+ * Returns the original error untouched when the pattern doesn't match, so
11
+ * non-404 failures (provider_down, timeouts, schema errors) keep flowing.
12
+ */
13
+ function translateOllamaError(err, model) {
14
+ if (!(err instanceof Error))
15
+ return new Error(String(err));
16
+ // postJson formats: `POST <url> → <status> <statusText>: <bodyPrefix>`
17
+ if (!/→ 404 /.test(err.message))
18
+ return err;
19
+ if (!/model .* not found/i.test(err.message))
20
+ return err;
21
+ return new CompostError('PROVIDER_ERROR', `Ollama model '${model}' not found — run \`ollama pull ${model}\` (or set the relevant defaults.* in compost.config.yaml to a pulled model).`, { cause: err });
22
+ }
23
+ export class OllamaProvider {
24
+ name = 'ollama';
25
+ base;
26
+ fetchImpl;
27
+ timeoutMs;
28
+ constructor(config) {
29
+ this.base = config.baseUrl.replace(/\/$/, '');
30
+ this.fetchImpl = resolveFetch(config.fetchImpl);
31
+ this.timeoutMs = config.timeoutMs ?? 120000;
32
+ }
33
+ async chat(req) {
34
+ const body = {
35
+ model: req.model,
36
+ messages: req.messages,
37
+ stream: false,
38
+ };
39
+ if (req.schema)
40
+ body.format = req.schema;
41
+ if (req.temperature !== undefined)
42
+ body.options = { temperature: req.temperature };
43
+ let json;
44
+ try {
45
+ json = (await postJson(this.fetchImpl, `${this.base}/api/chat`, body, {}, this.timeoutMs));
46
+ }
47
+ catch (err) {
48
+ throw translateOllamaError(err, req.model);
49
+ }
50
+ return {
51
+ text: json.message?.content ?? '',
52
+ model: req.model,
53
+ provider: this.name,
54
+ raw: json,
55
+ };
56
+ }
57
+ async embed(req) {
58
+ let json;
59
+ try {
60
+ json = (await postJson(this.fetchImpl, `${this.base}/api/embed`, { model: req.model, input: req.input }, {}, this.timeoutMs));
61
+ }
62
+ catch (err) {
63
+ throw translateOllamaError(err, req.model);
64
+ }
65
+ return {
66
+ vectors: json.embeddings ?? [],
67
+ model: req.model,
68
+ provider: this.name,
69
+ };
70
+ }
71
+ async health() {
72
+ try {
73
+ const { json, latency_ms } = await getJsonTimed(this.fetchImpl, `${this.base}/api/tags`);
74
+ const models = json.models ?? [];
75
+ return { ok: true, latency_ms, model_list: models.map((m) => m.name) };
76
+ }
77
+ catch (err) {
78
+ return {
79
+ ok: false,
80
+ latency_ms: 0,
81
+ model_list: [],
82
+ error: err instanceof Error ? err.message : String(err),
83
+ };
84
+ }
85
+ }
86
+ }
87
+ //# sourceMappingURL=ollama.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../../src/llm/providers/ollama.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ProviderConfig } from '../types.js';
2
+ import { OpenAICompatibleProvider } from './openai_compatible.js';
3
+ /** OpenAI cloud (default https://api.openai.com/v1). Requires an API key. */
4
+ export declare class OpenAIProvider extends OpenAICompatibleProvider {
5
+ constructor(config: ProviderConfig);
6
+ }
7
+ //# sourceMappingURL=openai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACjD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAA;AAEjE,6EAA6E;AAC7E,qBAAa,cAAe,SAAQ,wBAAwB;gBAC9C,MAAM,EAAE,cAAc;CAGnC"}
@@ -0,0 +1,8 @@
1
+ import { OpenAICompatibleProvider } from './openai_compatible.js';
2
+ /** OpenAI cloud (default https://api.openai.com/v1). Requires an API key. */
3
+ export class OpenAIProvider extends OpenAICompatibleProvider {
4
+ constructor(config) {
5
+ super('openai', config);
6
+ }
7
+ }
8
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/llm/providers/openai.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAA;AAEjE,6EAA6E;AAC7E,MAAM,OAAO,cAAe,SAAQ,wBAAwB;IAC1D,YAAY,MAAsB;QAChC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IACzB,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ import type { ChatRequest, ChatResponse, EmbedRequest, EmbedResponse, Provider, ProviderConfig, ProviderHealth } from '../types.js';
2
+ /**
3
+ * Shared driver for OpenAI-compatible HTTP APIs. LM Studio and OpenAI both
4
+ * speak this dialect; they differ only in name, default base URL, and auth.
5
+ */
6
+ export declare class OpenAICompatibleProvider implements Provider {
7
+ readonly name: string;
8
+ private readonly base;
9
+ private readonly apiKey;
10
+ private readonly fetchImpl;
11
+ private readonly timeoutMs;
12
+ constructor(name: string, config: ProviderConfig);
13
+ private authHeaders;
14
+ chat(req: ChatRequest): Promise<ChatResponse>;
15
+ embed(req: EmbedRequest): Promise<EmbedResponse>;
16
+ health(): Promise<ProviderHealth>;
17
+ }
18
+ //# sourceMappingURL=openai_compatible.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai_compatible.d.ts","sourceRoot":"","sources":["../../../src/llm/providers/openai_compatible.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,EAEb,QAAQ,EACR,cAAc,EACd,cAAc,EACf,MAAM,aAAa,CAAA;AAEpB;;;GAGG;AACH,qBAAa,wBAAyB,YAAW,QAAQ;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,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,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc;IAQhD,OAAO,CAAC,WAAW;IAIb,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA6B7C,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAehD,MAAM,IAAI,OAAO,CAAC,cAAc,CAAC;CAkBxC"}
@@ -0,0 +1,70 @@
1
+ import { getJsonTimed, postJson, resolveFetch } from '../http.js';
2
+ /**
3
+ * Shared driver for OpenAI-compatible HTTP APIs. LM Studio and OpenAI both
4
+ * speak this dialect; they differ only in name, default base URL, and auth.
5
+ */
6
+ export class OpenAICompatibleProvider {
7
+ name;
8
+ base;
9
+ apiKey;
10
+ fetchImpl;
11
+ timeoutMs;
12
+ constructor(name, config) {
13
+ this.name = name;
14
+ this.base = config.baseUrl.replace(/\/$/, '');
15
+ this.apiKey = config.apiKey;
16
+ this.fetchImpl = resolveFetch(config.fetchImpl);
17
+ this.timeoutMs = config.timeoutMs ?? 120000;
18
+ }
19
+ authHeaders() {
20
+ return this.apiKey ? { authorization: `Bearer ${this.apiKey}` } : {};
21
+ }
22
+ async chat(req) {
23
+ const body = {
24
+ model: req.model,
25
+ messages: req.messages,
26
+ stream: false,
27
+ };
28
+ if (req.temperature !== undefined)
29
+ body.temperature = req.temperature;
30
+ if (req.maxTokens !== undefined)
31
+ body.max_tokens = req.maxTokens;
32
+ if (req.schema) {
33
+ body.response_format = {
34
+ type: 'json_schema',
35
+ json_schema: { name: 'compost_schema', schema: req.schema, strict: true },
36
+ };
37
+ }
38
+ const json = (await postJson(this.fetchImpl, `${this.base}/chat/completions`, body, this.authHeaders(), this.timeoutMs));
39
+ return {
40
+ text: json.choices?.[0]?.message?.content ?? '',
41
+ model: req.model,
42
+ provider: this.name,
43
+ raw: json,
44
+ };
45
+ }
46
+ async embed(req) {
47
+ const json = (await postJson(this.fetchImpl, `${this.base}/embeddings`, { model: req.model, input: req.input }, this.authHeaders(), this.timeoutMs));
48
+ return {
49
+ vectors: (json.data ?? []).map((d) => d.embedding),
50
+ model: req.model,
51
+ provider: this.name,
52
+ };
53
+ }
54
+ async health() {
55
+ try {
56
+ const { json, latency_ms } = await getJsonTimed(this.fetchImpl, `${this.base}/models`, this.authHeaders());
57
+ const data = json.data ?? [];
58
+ return { ok: true, latency_ms, model_list: data.map((m) => m.id) };
59
+ }
60
+ catch (err) {
61
+ return {
62
+ ok: false,
63
+ latency_ms: 0,
64
+ model_list: [],
65
+ error: err instanceof Error ? err.message : String(err),
66
+ };
67
+ }
68
+ }
69
+ }
70
+ //# sourceMappingURL=openai_compatible.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai_compatible.js","sourceRoot":"","sources":["../../../src/llm/providers/openai_compatible.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ export type Task = 'embeddings' | 'quick_chat' | 'synthesis' | 'verification' | 'code-suggest' | 'theme-draft' | 'frame-annotation';
2
+ export interface ChatMessage {
3
+ role: 'system' | 'user' | 'assistant';
4
+ content: string;
5
+ }
6
+ export interface ChatRequest {
7
+ model: string;
8
+ messages: ChatMessage[];
9
+ /** JSON Schema for structured output. Providers that support JSON mode enforce it. */
10
+ schema?: Record<string, unknown>;
11
+ temperature?: number;
12
+ maxTokens?: number;
13
+ }
14
+ export interface ChatResponse {
15
+ text: string;
16
+ model: string;
17
+ provider: string;
18
+ raw?: unknown;
19
+ }
20
+ export interface EmbedRequest {
21
+ model: string;
22
+ input: string[];
23
+ }
24
+ export interface EmbedResponse {
25
+ vectors: number[][];
26
+ model: string;
27
+ provider: string;
28
+ }
29
+ export interface ProviderHealth {
30
+ ok: boolean;
31
+ latency_ms: number;
32
+ model_list: string[];
33
+ error?: string;
34
+ }
35
+ /** A FetchLike lets tests inject a stub instead of the global fetch. */
36
+ export type FetchLike = (input: string, init?: {
37
+ method?: string;
38
+ headers?: Record<string, string>;
39
+ body?: string;
40
+ signal?: AbortSignal;
41
+ }) => Promise<{
42
+ ok: boolean;
43
+ status: number;
44
+ statusText: string;
45
+ json: () => Promise<unknown>;
46
+ text: () => Promise<string>;
47
+ }>;
48
+ export interface ProviderConfig {
49
+ baseUrl: string;
50
+ apiKey?: string;
51
+ fetchImpl?: FetchLike;
52
+ timeoutMs?: number;
53
+ }
54
+ export interface Provider {
55
+ readonly name: string;
56
+ chat(req: ChatRequest): Promise<ChatResponse>;
57
+ embed(req: EmbedRequest): Promise<EmbedResponse>;
58
+ health(): Promise<ProviderHealth>;
59
+ }
60
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/llm/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,IAAI,GACZ,YAAY,GACZ,YAAY,GACZ,WAAW,GACX,cAAc,GACd,cAAc,GACd,aAAa,GACb,kBAAkB,CAAA;AAEtB,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAA;IACrC,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,sFAAsF;IACtF,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAChC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,EAAE,EAAE,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAA;IACX,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,wEAAwE;AACxE,MAAM,MAAM,SAAS,GAAG,CACtB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE;IACL,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB,KACE,OAAO,CAAC;IACX,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;IAC5B,IAAI,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;CAC5B,CAAC,CAAA;AAEF,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,IAAI,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;IAC7C,KAAK,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;IAChD,MAAM,IAAI,OAAO,CAAC,cAAc,CAAC,CAAA;CAClC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/llm/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
2
+ export interface LogFields {
3
+ [key: string]: unknown;
4
+ }
5
+ export interface LogEntry extends LogFields {
6
+ ts: string;
7
+ level: LogLevel;
8
+ msg: string;
9
+ }
10
+ export declare class Logger {
11
+ private readonly logFilePath;
12
+ constructor(logFilePath: string | null);
13
+ log(level: LogLevel, msg: string, fields?: LogFields): Promise<void>;
14
+ debug(msg: string, fields?: LogFields): Promise<void>;
15
+ info(msg: string, fields?: LogFields): Promise<void>;
16
+ warn(msg: string, fields?: LogFields): Promise<void>;
17
+ error(msg: string, fields?: LogFields): Promise<void>;
18
+ }
19
+ export declare function findCompostRoot(start?: string): Promise<string | null>;
20
+ export declare function getLogPath(compostRoot: string, now?: Date): string;
21
+ export declare function buildLogger(): Promise<Logger>;
22
+ //# sourceMappingURL=logging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AAE1D,MAAM,WAAW,SAAS;IACxB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,QAAS,SAAQ,SAAS;IACzC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,QAAQ,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,qBAAa,MAAM;IACL,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAAX,WAAW,EAAE,MAAM,GAAG,IAAI;IAEjD,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,SAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAW9E,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAGrD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAGpD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAGpD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;CAGtD;AAED,wBAAsB,eAAe,CAAC,KAAK,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAa3F;AAED,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,GAAE,IAAiB,GAAG,MAAM,CAG9E;AAED,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAGnD"}
@@ -0,0 +1,58 @@
1
+ import { appendFile, mkdir, stat } from 'node:fs/promises';
2
+ import { dirname, join } from 'node:path';
3
+ export class Logger {
4
+ logFilePath;
5
+ constructor(logFilePath) {
6
+ this.logFilePath = logFilePath;
7
+ }
8
+ async log(level, msg, fields = {}) {
9
+ if (this.logFilePath === null)
10
+ return;
11
+ const entry = { ts: new Date().toISOString(), level, msg, ...fields };
12
+ try {
13
+ await mkdir(dirname(this.logFilePath), { recursive: true });
14
+ await appendFile(this.logFilePath, `${JSON.stringify(entry)}\n`, 'utf8');
15
+ }
16
+ catch {
17
+ // Logging must never throw — the CLI keeps running even if logs are unwritable.
18
+ }
19
+ }
20
+ debug(msg, fields) {
21
+ return this.log('debug', msg, fields);
22
+ }
23
+ info(msg, fields) {
24
+ return this.log('info', msg, fields);
25
+ }
26
+ warn(msg, fields) {
27
+ return this.log('warn', msg, fields);
28
+ }
29
+ error(msg, fields) {
30
+ return this.log('error', msg, fields);
31
+ }
32
+ }
33
+ export async function findCompostRoot(start = process.cwd()) {
34
+ let dir = start;
35
+ while (true) {
36
+ try {
37
+ const s = await stat(join(dir, '.compost'));
38
+ if (s.isDirectory())
39
+ return dir;
40
+ }
41
+ catch {
42
+ // not found at this level
43
+ }
44
+ const parent = dirname(dir);
45
+ if (parent === dir)
46
+ return null;
47
+ dir = parent;
48
+ }
49
+ }
50
+ export function getLogPath(compostRoot, now = new Date()) {
51
+ const date = now.toISOString().slice(0, 10);
52
+ return join(compostRoot, '.compost', 'logs', `${date}.jsonl`);
53
+ }
54
+ export async function buildLogger() {
55
+ const root = await findCompostRoot();
56
+ return new Logger(root === null ? null : getLogPath(root));
57
+ }
58
+ //# sourceMappingURL=logging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.js","sourceRoot":"","sources":["../src/logging.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAczC,MAAM,OAAO,MAAM;IACY;IAA7B,YAA6B,WAA0B;QAA1B,gBAAW,GAAX,WAAW,CAAe;IAAG,CAAC;IAE3D,KAAK,CAAC,GAAG,CAAC,KAAe,EAAE,GAAW,EAAE,SAAoB,EAAE;QAC5D,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI;YAAE,OAAM;QACrC,MAAM,KAAK,GAAa,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,CAAA;QAC/E,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;YAC3D,MAAM,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAC1E,CAAC;QAAC,MAAM,CAAC;YACP,gFAAgF;QAClF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAW,EAAE,MAAkB;QACnC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA;IACvC,CAAC;IACD,IAAI,CAAC,GAAW,EAAE,MAAkB;QAClC,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA;IACtC,CAAC;IACD,IAAI,CAAC,GAAW,EAAE,MAAkB;QAClC,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA;IACtC,CAAC;IACD,KAAK,CAAC,GAAW,EAAE,MAAkB;QACnC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA;IACvC,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB,OAAO,CAAC,GAAG,EAAE;IACjE,IAAI,GAAG,GAAG,KAAK,CAAA;IACf,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAA;YAC3C,IAAI,CAAC,CAAC,WAAW,EAAE;gBAAE,OAAO,GAAG,CAAA;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;QAC3B,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAA;QAC/B,GAAG,GAAG,MAAM,CAAA;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,WAAmB,EAAE,MAAY,IAAI,IAAI,EAAE;IACpE,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IAC3C,OAAO,IAAI,CAAC,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,CAAA;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,IAAI,GAAG,MAAM,eAAe,EAAE,CAAA;IACpC,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;AAC5D,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { LanceDBWriter } from 'compost-retrieval';
2
+ /**
3
+ * Embed-worker: discovers chunkable artifacts under a seed, embeds new ones
4
+ * via the configured embeddings provider (Ollama by default), and writes them
5
+ * to LanceDB. Idempotent on `text_sha`: re-running over the same content
6
+ * inserts zero new rows.
7
+ *
8
+ * Triggers in v0.1: every `transcript.json` under `sessions/`. Highlights /
9
+ * codes / themes get bonus chunks via the chunker's transcript-aware mode,
10
+ * so a transcript ingest produces all needed indexable artifacts.
11
+ *
12
+ * Glossary terms and legacy chunks land here in follow-ups (v0.1-02 legacy
13
+ * route; glossary embedding is part of #137 itself but plumbing the
14
+ * highlight/code/theme chunks per individual artifact write needs the
15
+ * MCP tool layer from v0.1-05). For v0.1, this single transcript-pass is
16
+ * sufficient because it produces utterance + window chunks that ground the
17
+ * chat surface.
18
+ */
19
+ export interface EmbedWorkerDeps {
20
+ /** Override the LanceDB writer (injected in tests). */
21
+ writer?: LanceDBWriter;
22
+ /** Override the embeddings call (injected in tests). */
23
+ embed?: (texts: string[]) => Promise<number[][]>;
24
+ /** Override the embedding dimension (must match what the writer expects). */
25
+ vectorDim?: number;
26
+ }
27
+ export interface EmbedWorkerResult {
28
+ embedded: number;
29
+ inserted: number;
30
+ transcripts_scanned: number;
31
+ }
32
+ export declare function runEmbedWorkerOnce(seedPath: string, deps?: EmbedWorkerDeps): Promise<EmbedWorkerResult>;
33
+ /**
34
+ * Worker-level batch cap. Defense in depth against very large corpora that
35
+ * would otherwise produce a single multi-megabyte JSON request. The
36
+ * LLMAdapter splits within this cap to provider-appropriate sizes.
37
+ *
38
+ * Tuning notes: 500 chunks × ~1KB text each = ~500KB request body, well
39
+ * under Ollama's default HTTP body limits. A typical interview corpus
40
+ * (~600 utterances per session × 3 chunks/utt × 30 sessions = 54k chunks)
41
+ * batches to ~108 round-trips.
42
+ */
43
+ export declare const EMBED_BATCH_CAP = 500;
44
+ //# sourceMappingURL=embed_worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed_worker.d.ts","sourceRoot":"","sources":["../../src/loops/embed_worker.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAA+C,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAOnG;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,eAAe;IAC9B,uDAAuD;IACvD,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,wDAAwD;IACxD,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;IAChD,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,mBAAmB,EAAE,MAAM,CAAA;CAC5B;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,iBAAiB,CAAC,CA+F5B;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,MAAM,CAAA"}