@steipete/summarize 0.11.0 → 0.12.0

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 (361) hide show
  1. package/CHANGELOG.md +44 -1
  2. package/README.md +63 -17
  3. package/dist/cli.js +1 -1
  4. package/dist/esm/cache-keys.js +75 -0
  5. package/dist/esm/cache-keys.js.map +1 -0
  6. package/dist/esm/cache-slides-cleanup.js +47 -0
  7. package/dist/esm/cache-slides-cleanup.js.map +1 -0
  8. package/dist/esm/cache.js +14 -91
  9. package/dist/esm/cache.js.map +1 -1
  10. package/dist/esm/config/env.js +49 -0
  11. package/dist/esm/config/env.js.map +1 -0
  12. package/dist/esm/config/model.js +193 -0
  13. package/dist/esm/config/model.js.map +1 -0
  14. package/dist/esm/config/parse-helpers.js +50 -0
  15. package/dist/esm/config/parse-helpers.js.map +1 -0
  16. package/dist/esm/config/read.js +83 -0
  17. package/dist/esm/config/read.js.map +1 -0
  18. package/dist/esm/config/sections.js +438 -0
  19. package/dist/esm/config/sections.js.map +1 -0
  20. package/dist/esm/config/types.js +2 -0
  21. package/dist/esm/config/types.js.map +1 -0
  22. package/dist/esm/config.js +24 -807
  23. package/dist/esm/config.js.map +1 -1
  24. package/dist/esm/content/asset.js +2 -2
  25. package/dist/esm/content/asset.js.map +1 -1
  26. package/dist/esm/daemon/agent-model.js +235 -0
  27. package/dist/esm/daemon/agent-model.js.map +1 -0
  28. package/dist/esm/daemon/agent-request.js +87 -0
  29. package/dist/esm/daemon/agent-request.js.map +1 -0
  30. package/dist/esm/daemon/agent.js +42 -243
  31. package/dist/esm/daemon/agent.js.map +1 -1
  32. package/dist/esm/daemon/chat.js +69 -8
  33. package/dist/esm/daemon/chat.js.map +1 -1
  34. package/dist/esm/daemon/cli.js +21 -4
  35. package/dist/esm/daemon/cli.js.map +1 -1
  36. package/dist/esm/daemon/config.js +65 -9
  37. package/dist/esm/daemon/config.js.map +1 -1
  38. package/dist/esm/daemon/env-snapshot.js +4 -0
  39. package/dist/esm/daemon/env-snapshot.js.map +1 -1
  40. package/dist/esm/daemon/flow-context.js +8 -1
  41. package/dist/esm/daemon/flow-context.js.map +1 -1
  42. package/dist/esm/daemon/models.js +16 -0
  43. package/dist/esm/daemon/models.js.map +1 -1
  44. package/dist/esm/daemon/process-registry.js.map +1 -1
  45. package/dist/esm/daemon/server-admin-routes.js +134 -0
  46. package/dist/esm/daemon/server-admin-routes.js.map +1 -0
  47. package/dist/esm/daemon/server-agent-route.js +104 -0
  48. package/dist/esm/daemon/server-agent-route.js.map +1 -0
  49. package/dist/esm/daemon/server-http.js +89 -0
  50. package/dist/esm/daemon/server-http.js.map +1 -0
  51. package/dist/esm/daemon/server-session-routes.js +209 -0
  52. package/dist/esm/daemon/server-session-routes.js.map +1 -0
  53. package/dist/esm/daemon/server-session.js +118 -0
  54. package/dist/esm/daemon/server-session.js.map +1 -0
  55. package/dist/esm/daemon/server-sse.js +28 -0
  56. package/dist/esm/daemon/server-sse.js.map +1 -0
  57. package/dist/esm/daemon/server-summarize-execution.js +357 -0
  58. package/dist/esm/daemon/server-summarize-execution.js.map +1 -0
  59. package/dist/esm/daemon/server-summarize-request.js +119 -0
  60. package/dist/esm/daemon/server-summarize-request.js.map +1 -0
  61. package/dist/esm/daemon/server.js +72 -1121
  62. package/dist/esm/daemon/server.js.map +1 -1
  63. package/dist/esm/daemon/summarize-progress.js +1 -1
  64. package/dist/esm/daemon/summarize-progress.js.map +1 -1
  65. package/dist/esm/daemon/summarize.js.map +1 -1
  66. package/dist/esm/llm/cli-exec.js +75 -0
  67. package/dist/esm/llm/cli-exec.js.map +1 -0
  68. package/dist/esm/llm/cli-provider-output.js +191 -0
  69. package/dist/esm/llm/cli-provider-output.js.map +1 -0
  70. package/dist/esm/llm/cli.js +3 -212
  71. package/dist/esm/llm/cli.js.map +1 -1
  72. package/dist/esm/llm/generate-text-document.js +109 -0
  73. package/dist/esm/llm/generate-text-document.js.map +1 -0
  74. package/dist/esm/llm/generate-text-shared.js +102 -0
  75. package/dist/esm/llm/generate-text-shared.js.map +1 -0
  76. package/dist/esm/llm/generate-text-stream.js +258 -0
  77. package/dist/esm/llm/generate-text-stream.js.map +1 -0
  78. package/dist/esm/llm/generate-text.js +145 -480
  79. package/dist/esm/llm/generate-text.js.map +1 -1
  80. package/dist/esm/llm/model-id.js +21 -20
  81. package/dist/esm/llm/model-id.js.map +1 -1
  82. package/dist/esm/llm/provider-capabilities.js +2 -0
  83. package/dist/esm/llm/provider-capabilities.js.map +1 -0
  84. package/dist/esm/llm/provider-profile.js +142 -0
  85. package/dist/esm/llm/provider-profile.js.map +1 -0
  86. package/dist/esm/llm/providers/google.js +42 -5
  87. package/dist/esm/llm/providers/google.js.map +1 -1
  88. package/dist/esm/llm/providers/models.js +13 -0
  89. package/dist/esm/llm/providers/models.js.map +1 -1
  90. package/dist/esm/llm/providers/openai.js.map +1 -1
  91. package/dist/esm/llm/transcript-to-markdown.js.map +1 -1
  92. package/dist/esm/model-auto-cli.js +89 -0
  93. package/dist/esm/model-auto-cli.js.map +1 -0
  94. package/dist/esm/model-auto-rules.js +86 -0
  95. package/dist/esm/model-auto-rules.js.map +1 -0
  96. package/dist/esm/model-auto.js +10 -245
  97. package/dist/esm/model-auto.js.map +1 -1
  98. package/dist/esm/model-spec.js +23 -17
  99. package/dist/esm/model-spec.js.map +1 -1
  100. package/dist/esm/refresh-free.js +1 -1
  101. package/dist/esm/refresh-free.js.map +1 -1
  102. package/dist/esm/run/attachments.js +1 -1
  103. package/dist/esm/run/attachments.js.map +1 -1
  104. package/dist/esm/run/bird/exec.js +23 -0
  105. package/dist/esm/run/bird/exec.js.map +1 -0
  106. package/dist/esm/run/bird/media.js +171 -0
  107. package/dist/esm/run/bird/media.js.map +1 -0
  108. package/dist/esm/run/bird/parse.js +82 -0
  109. package/dist/esm/run/bird/parse.js.map +1 -0
  110. package/dist/esm/run/bird/types.js +2 -0
  111. package/dist/esm/run/bird/types.js.map +1 -0
  112. package/dist/esm/run/bird.js +86 -144
  113. package/dist/esm/run/bird.js.map +1 -1
  114. package/dist/esm/run/cache-state.js.map +1 -1
  115. package/dist/esm/run/constants.js +2 -1
  116. package/dist/esm/run/constants.js.map +1 -1
  117. package/dist/esm/run/env.js +3 -0
  118. package/dist/esm/run/env.js.map +1 -1
  119. package/dist/esm/run/finish-line-labels.js +76 -0
  120. package/dist/esm/run/finish-line-labels.js.map +1 -0
  121. package/dist/esm/run/finish-line-lengths.js +96 -0
  122. package/dist/esm/run/finish-line-lengths.js.map +1 -0
  123. package/dist/esm/run/finish-line.js +3 -169
  124. package/dist/esm/run/finish-line.js.map +1 -1
  125. package/dist/esm/run/flows/asset/extract.js.map +1 -1
  126. package/dist/esm/run/flows/asset/input.js +1 -1
  127. package/dist/esm/run/flows/asset/input.js.map +1 -1
  128. package/dist/esm/run/flows/asset/media.js +19 -10
  129. package/dist/esm/run/flows/asset/media.js.map +1 -1
  130. package/dist/esm/run/flows/asset/output.js.map +1 -1
  131. package/dist/esm/run/flows/asset/preprocess.js.map +1 -1
  132. package/dist/esm/run/flows/asset/summary-attempts.js +109 -0
  133. package/dist/esm/run/flows/asset/summary-attempts.js.map +1 -0
  134. package/dist/esm/run/flows/asset/summary.js +19 -107
  135. package/dist/esm/run/flows/asset/summary.js.map +1 -1
  136. package/dist/esm/run/flows/url/extract.js +7 -4
  137. package/dist/esm/run/flows/url/extract.js.map +1 -1
  138. package/dist/esm/run/flows/url/flow-progress.js +119 -0
  139. package/dist/esm/run/flows/url/flow-progress.js.map +1 -0
  140. package/dist/esm/run/flows/url/flow.js +22 -93
  141. package/dist/esm/run/flows/url/flow.js.map +1 -1
  142. package/dist/esm/run/flows/url/markdown.js +21 -3
  143. package/dist/esm/run/flows/url/markdown.js.map +1 -1
  144. package/dist/esm/run/flows/url/progress-status.js +56 -0
  145. package/dist/esm/run/flows/url/progress-status.js.map +1 -0
  146. package/dist/esm/run/flows/url/slides-output-render.js +78 -0
  147. package/dist/esm/run/flows/url/slides-output-render.js.map +1 -0
  148. package/dist/esm/run/flows/url/slides-output-state.js +86 -0
  149. package/dist/esm/run/flows/url/slides-output-state.js.map +1 -0
  150. package/dist/esm/run/flows/url/slides-output-stream.js +271 -0
  151. package/dist/esm/run/flows/url/slides-output-stream.js.map +1 -0
  152. package/dist/esm/run/flows/url/slides-output.js +29 -422
  153. package/dist/esm/run/flows/url/slides-output.js.map +1 -1
  154. package/dist/esm/run/flows/url/slides-text-markdown.js +431 -0
  155. package/dist/esm/run/flows/url/slides-text-markdown.js.map +1 -0
  156. package/dist/esm/run/flows/url/slides-text-transcript.js +199 -0
  157. package/dist/esm/run/flows/url/slides-text-transcript.js.map +1 -0
  158. package/dist/esm/run/flows/url/slides-text-types.js +2 -0
  159. package/dist/esm/run/flows/url/slides-text-types.js.map +1 -0
  160. package/dist/esm/run/flows/url/slides-text.js +2 -627
  161. package/dist/esm/run/flows/url/slides-text.js.map +1 -1
  162. package/dist/esm/run/flows/url/summary-finish.js +34 -0
  163. package/dist/esm/run/flows/url/summary-finish.js.map +1 -0
  164. package/dist/esm/run/flows/url/summary-json.js +32 -0
  165. package/dist/esm/run/flows/url/summary-json.js.map +1 -0
  166. package/dist/esm/run/flows/url/summary-prompt.js +147 -0
  167. package/dist/esm/run/flows/url/summary-prompt.js.map +1 -0
  168. package/dist/esm/run/flows/url/summary-resolution.js +320 -0
  169. package/dist/esm/run/flows/url/summary-resolution.js.map +1 -0
  170. package/dist/esm/run/flows/url/summary-timestamps.js +136 -0
  171. package/dist/esm/run/flows/url/summary-timestamps.js.map +1 -0
  172. package/dist/esm/run/flows/url/summary.js +49 -543
  173. package/dist/esm/run/flows/url/summary.js.map +1 -1
  174. package/dist/esm/run/help.js +9 -3
  175. package/dist/esm/run/help.js.map +1 -1
  176. package/dist/esm/run/markdown-transforms.js +89 -0
  177. package/dist/esm/run/markdown-transforms.js.map +1 -0
  178. package/dist/esm/run/markdown.js +1 -96
  179. package/dist/esm/run/markdown.js.map +1 -1
  180. package/dist/esm/run/run-env.js +28 -7
  181. package/dist/esm/run/run-env.js.map +1 -1
  182. package/dist/esm/run/run-settings-parse.js +73 -0
  183. package/dist/esm/run/run-settings-parse.js.map +1 -0
  184. package/dist/esm/run/run-settings.js +1 -72
  185. package/dist/esm/run/run-settings.js.map +1 -1
  186. package/dist/esm/run/runner-contexts.js +116 -0
  187. package/dist/esm/run/runner-contexts.js.map +1 -0
  188. package/dist/esm/run/runner-execution.js +62 -0
  189. package/dist/esm/run/runner-execution.js.map +1 -0
  190. package/dist/esm/run/runner-flags.js +97 -0
  191. package/dist/esm/run/runner-flags.js.map +1 -0
  192. package/dist/esm/run/runner-setup.js +109 -0
  193. package/dist/esm/run/runner-setup.js.map +1 -0
  194. package/dist/esm/run/runner-slides.js +38 -0
  195. package/dist/esm/run/runner-slides.js.map +1 -0
  196. package/dist/esm/run/runner.js +99 -390
  197. package/dist/esm/run/runner.js.map +1 -1
  198. package/dist/esm/run/slides-render.js +5 -2
  199. package/dist/esm/run/slides-render.js.map +1 -1
  200. package/dist/esm/run/stdin-temp-file.js +1 -1
  201. package/dist/esm/run/stdin-temp-file.js.map +1 -1
  202. package/dist/esm/run/streaming.js +1 -0
  203. package/dist/esm/run/streaming.js.map +1 -1
  204. package/dist/esm/run/summary-engine.js +26 -10
  205. package/dist/esm/run/summary-engine.js.map +1 -1
  206. package/dist/esm/run/summary-llm.js +2 -1
  207. package/dist/esm/run/summary-llm.js.map +1 -1
  208. package/dist/esm/run/terminal.js +4 -1
  209. package/dist/esm/run/terminal.js.map +1 -1
  210. package/dist/esm/run/transcriber-cli.js +1 -1
  211. package/dist/esm/run/transcriber-cli.js.map +1 -1
  212. package/dist/esm/slides/download.js +242 -0
  213. package/dist/esm/slides/download.js.map +1 -0
  214. package/dist/esm/slides/extract-finalize.js +98 -0
  215. package/dist/esm/slides/extract-finalize.js.map +1 -0
  216. package/dist/esm/slides/extract.js +64 -1621
  217. package/dist/esm/slides/extract.js.map +1 -1
  218. package/dist/esm/slides/frame-extraction.js +372 -0
  219. package/dist/esm/slides/frame-extraction.js.map +1 -0
  220. package/dist/esm/slides/ingest.js +167 -0
  221. package/dist/esm/slides/ingest.js.map +1 -0
  222. package/dist/esm/slides/ocr.js +91 -0
  223. package/dist/esm/slides/ocr.js.map +1 -0
  224. package/dist/esm/slides/process.js +218 -0
  225. package/dist/esm/slides/process.js.map +1 -0
  226. package/dist/esm/slides/scene-detection.js +387 -0
  227. package/dist/esm/slides/scene-detection.js.map +1 -0
  228. package/dist/esm/slides/source-id.js +42 -0
  229. package/dist/esm/slides/source-id.js.map +1 -0
  230. package/dist/esm/tty/progress/fetch-html.js.map +1 -1
  231. package/dist/esm/tty/progress/transcript.js +21 -8
  232. package/dist/esm/tty/progress/transcript.js.map +1 -1
  233. package/dist/esm/tty/spinner.js +8 -2
  234. package/dist/esm/tty/spinner.js.map +1 -1
  235. package/dist/esm/tty/website-progress.js +5 -3
  236. package/dist/esm/tty/website-progress.js.map +1 -1
  237. package/dist/esm/version.js +1 -1
  238. package/dist/types/cache-keys.d.ts +44 -0
  239. package/dist/types/cache-slides-cleanup.d.ts +1 -0
  240. package/dist/types/cache.d.ts +1 -9
  241. package/dist/types/config/env.d.ts +6 -0
  242. package/dist/types/config/model.d.ts +3 -0
  243. package/dist/types/config/parse-helpers.d.ts +7 -0
  244. package/dist/types/config/read.d.ts +2 -0
  245. package/dist/types/config/sections.d.ts +33 -0
  246. package/dist/types/config/types.d.ts +230 -0
  247. package/dist/types/config.d.ts +3 -209
  248. package/dist/types/costs.d.ts +1 -1
  249. package/dist/types/daemon/agent-model.d.ts +40 -0
  250. package/dist/types/daemon/agent-request.d.ts +14 -0
  251. package/dist/types/daemon/chat.d.ts +3 -1
  252. package/dist/types/daemon/config.d.ts +13 -2
  253. package/dist/types/daemon/env-snapshot.d.ts +1 -1
  254. package/dist/types/daemon/flow-context.d.ts +1 -1
  255. package/dist/types/daemon/models.d.ts +1 -0
  256. package/dist/types/daemon/server-admin-routes.d.ts +22 -0
  257. package/dist/types/daemon/server-agent-route.d.ts +9 -0
  258. package/dist/types/daemon/server-http.d.ts +10 -0
  259. package/dist/types/daemon/server-session-routes.d.ts +11 -0
  260. package/dist/types/daemon/server-session.d.ts +52 -0
  261. package/dist/types/daemon/server-sse.d.ts +12 -0
  262. package/dist/types/daemon/server-summarize-execution.d.ts +70 -0
  263. package/dist/types/daemon/server-summarize-request.d.ts +36 -0
  264. package/dist/types/daemon/server.d.ts +3 -4
  265. package/dist/types/daemon/summarize.d.ts +1 -1
  266. package/dist/types/llm/cli-exec.d.ts +13 -0
  267. package/dist/types/llm/cli-provider-output.d.ts +16 -0
  268. package/dist/types/llm/generate-text-document.d.ts +34 -0
  269. package/dist/types/llm/generate-text-shared.d.ts +25 -0
  270. package/dist/types/llm/generate-text-stream.d.ts +26 -0
  271. package/dist/types/llm/generate-text.d.ts +6 -26
  272. package/dist/types/llm/html-to-markdown.d.ts +1 -1
  273. package/dist/types/llm/model-id.d.ts +1 -1
  274. package/dist/types/llm/provider-capabilities.d.ts +2 -0
  275. package/dist/types/llm/provider-profile.d.ts +31 -0
  276. package/dist/types/llm/providers/google.d.ts +6 -0
  277. package/dist/types/llm/providers/models.d.ts +5 -0
  278. package/dist/types/llm/transcript-to-markdown.d.ts +1 -1
  279. package/dist/types/model-auto-cli.d.ts +15 -0
  280. package/dist/types/model-auto-rules.d.ts +7 -0
  281. package/dist/types/model-auto.d.ts +5 -7
  282. package/dist/types/model-spec.d.ts +2 -2
  283. package/dist/types/run/attachments.d.ts +2 -2
  284. package/dist/types/run/bird/exec.d.ts +1 -0
  285. package/dist/types/run/bird/media.d.ts +3 -0
  286. package/dist/types/run/bird/parse.d.ts +3 -0
  287. package/dist/types/run/bird/types.d.ts +18 -0
  288. package/dist/types/run/bird.d.ts +12 -17
  289. package/dist/types/run/cache-state.d.ts +1 -1
  290. package/dist/types/run/constants.d.ts +2 -1
  291. package/dist/types/run/env.d.ts +1 -0
  292. package/dist/types/run/finish-line-labels.d.ts +29 -0
  293. package/dist/types/run/finish-line-lengths.d.ts +23 -0
  294. package/dist/types/run/finish-line.d.ts +2 -52
  295. package/dist/types/run/flows/asset/extract.d.ts +1 -1
  296. package/dist/types/run/flows/asset/input.d.ts +1 -1
  297. package/dist/types/run/flows/asset/preprocess.d.ts +1 -1
  298. package/dist/types/run/flows/asset/summary-attempts.d.ts +24 -0
  299. package/dist/types/run/flows/asset/summary.d.ts +6 -2
  300. package/dist/types/run/flows/url/flow-progress.d.ts +41 -0
  301. package/dist/types/run/flows/url/markdown.d.ts +2 -2
  302. package/dist/types/run/flows/url/progress-status.d.ts +16 -0
  303. package/dist/types/run/flows/url/slides-output-render.d.ts +43 -0
  304. package/dist/types/run/flows/url/slides-output-state.d.ts +21 -0
  305. package/dist/types/run/flows/url/slides-output-stream.d.ts +18 -0
  306. package/dist/types/run/flows/url/slides-output.d.ts +2 -17
  307. package/dist/types/run/flows/url/slides-text-markdown.d.ts +46 -0
  308. package/dist/types/run/flows/url/slides-text-transcript.d.ts +36 -0
  309. package/dist/types/run/flows/url/slides-text-types.d.ts +8 -0
  310. package/dist/types/run/flows/url/slides-text.d.ts +3 -87
  311. package/dist/types/run/flows/url/summary-finish.d.ts +16 -0
  312. package/dist/types/run/flows/url/summary-json.d.ts +51 -0
  313. package/dist/types/run/flows/url/summary-prompt.d.ts +22 -0
  314. package/dist/types/run/flows/url/summary-resolution.d.ts +31 -0
  315. package/dist/types/run/flows/url/summary-timestamps.d.ts +11 -0
  316. package/dist/types/run/flows/url/types.d.ts +4 -0
  317. package/dist/types/run/markdown-transforms.d.ts +3 -0
  318. package/dist/types/run/run-context.d.ts +4 -0
  319. package/dist/types/run/run-env.d.ts +4 -0
  320. package/dist/types/run/run-settings-parse.d.ts +5 -0
  321. package/dist/types/run/runner-contexts.d.ts +62 -0
  322. package/dist/types/run/runner-execution.d.ts +57 -0
  323. package/dist/types/run/runner-flags.d.ts +41 -0
  324. package/dist/types/run/runner-setup.d.ts +21 -0
  325. package/dist/types/run/runner-slides.d.ts +8 -0
  326. package/dist/types/run/streaming.d.ts +1 -1
  327. package/dist/types/run/summary-engine.d.ts +8 -4
  328. package/dist/types/run/summary-llm.d.ts +4 -3
  329. package/dist/types/run/terminal.d.ts +2 -0
  330. package/dist/types/run/types.d.ts +2 -2
  331. package/dist/types/slides/download.d.ts +29 -0
  332. package/dist/types/slides/extract-finalize.d.ts +57 -0
  333. package/dist/types/slides/extract.d.ts +1 -7
  334. package/dist/types/slides/frame-extraction.d.ts +38 -0
  335. package/dist/types/slides/ingest.d.ts +47 -0
  336. package/dist/types/slides/ocr.d.ts +5 -0
  337. package/dist/types/slides/process.d.ts +22 -0
  338. package/dist/types/slides/scene-detection.d.ts +75 -0
  339. package/dist/types/slides/source-id.d.ts +2 -0
  340. package/dist/types/version.d.ts +1 -1
  341. package/docs/_config.yml +1 -0
  342. package/docs/agent.md +3 -2
  343. package/docs/assets/site.css +134 -2
  344. package/docs/cache.md +2 -1
  345. package/docs/chrome-extension.md +12 -4
  346. package/docs/cli.md +2 -2
  347. package/docs/config.md +11 -4
  348. package/docs/index.html +5 -0
  349. package/docs/llm.md +5 -2
  350. package/docs/manual-tests.md +3 -0
  351. package/docs/media.md +3 -1
  352. package/docs/model-auto.md +2 -2
  353. package/docs/model-provider-resolution.md +57 -0
  354. package/docs/site/index.html +5 -0
  355. package/docs/slides-rendering-flow.md +46 -0
  356. package/docs/slides.md +5 -5
  357. package/docs/smoketest.md +1 -1
  358. package/docs/transcript-provider-flow.md +66 -0
  359. package/docs/website.md +1 -0
  360. package/docs/youtube.md +4 -2
  361. package/package.json +34 -41
@@ -1,21 +1,11 @@
1
- import { CommanderError } from "commander";
2
1
  import { execFile } from "node:child_process";
3
- import fs from "node:fs/promises";
4
- import { clearCacheFiles, DEFAULT_CACHE_MAX_MB, resolveCachePath, } from "../cache.js";
5
- import { loadSummarizeConfig, mergeConfigEnv } from "../config.js";
6
- import { parseExtractFormat, parseMaxExtractCharactersArg, parseMetricsMode, parseStreamMode, } from "../flags.js";
7
- import { resolveSlideSettings } from "../slides/index.js";
2
+ import { CommanderError } from "commander";
8
3
  import { createThemeRenderer, resolveThemeNameFromSources, resolveTrueColor, } from "../tty/theme.js";
9
- import { formatVersionLine } from "../version.js";
10
4
  import { createCacheStateFromConfig } from "./cache-state.js";
11
5
  import { handleDaemonCliRequest, handleHelpRequest, handleRefreshFreeRequest, } from "./cli-preflight.js";
12
6
  import { parseCliProviderArg } from "./env.js";
13
- import { extractAssetContent } from "./flows/asset/extract.js";
14
- import { handleFileInput, isTranscribableExtension, withUrlAsset } from "./flows/asset/input.js";
7
+ import { isTranscribableExtension } from "./flows/asset/input.js";
15
8
  import { summarizeMediaFile as summarizeMediaFileImpl } from "./flows/asset/media.js";
16
- import { outputExtractedAsset } from "./flows/asset/output.js";
17
- import { summarizeAsset as summarizeAssetFlow } from "./flows/asset/summary.js";
18
- import { runUrlFlow } from "./flows/url/flow.js";
19
9
  import { attachRichHelp, buildProgram } from "./help.js";
20
10
  import { createMediaCacheFromConfig } from "./media-cache-state.js";
21
11
  import { createProgressGate } from "./progress.js";
@@ -24,22 +14,19 @@ import { resolveRunInput } from "./run-input.js";
24
14
  import { createRunMetrics } from "./run-metrics.js";
25
15
  import { resolveModelSelection } from "./run-models.js";
26
16
  import { resolveDesiredOutputTokens } from "./run-output.js";
27
- import { resolveCliRunSettings } from "./run-settings.js";
28
17
  import { resolveStreamSettings } from "./run-stream.js";
18
+ import { createRunnerFlowContexts } from "./runner-contexts.js";
19
+ import { executeRunnerInput } from "./runner-execution.js";
20
+ import { resolveRunnerFlags } from "./runner-flags.js";
21
+ import { applyWidthOverride, handleCacheUtilityFlags, handleVersionFlag, prepareRunEnvironment, resolvePromptOverride, } from "./runner-setup.js";
22
+ import { resolveRunnerSlidesSettings } from "./runner-slides.js";
29
23
  import { handleSlidesCliRequest } from "./slides-cli.js";
30
- import { createTempFileFromStdin } from "./stdin-temp-file.js";
31
24
  import { createSummaryEngine } from "./summary-engine.js";
32
25
  import { isRichTty, supportsColor } from "./terminal.js";
33
26
  import { handleTranscriberCliRequest } from "./transcriber-cli.js";
34
27
  export async function runCli(argv, { env: inputEnv, fetch, execFile: execFileOverride, stdin, stdout, stderr }) {
35
28
  globalThis.AI_SDK_LOG_WARNINGS = false;
36
- const normalizedArgv = argv.filter((arg) => arg !== "--");
37
- const noColorFlag = normalizedArgv.includes("--no-color");
38
- let envForRun = noColorFlag
39
- ? { ...inputEnv, NO_COLOR: "1", FORCE_COLOR: "0" }
40
- : { ...inputEnv };
41
- const { config: bootstrapConfig } = loadSummarizeConfig({ env: envForRun });
42
- envForRun = mergeConfigEnv({ env: envForRun, config: bootstrapConfig });
29
+ const { normalizedArgv, envForRun } = prepareRunEnvironment(argv, inputEnv);
43
30
  const env = envForRun;
44
31
  if (handleHelpRequest({ normalizedArgv, envForRun, stdout, stderr })) {
45
32
  return;
@@ -100,84 +87,19 @@ export async function runCli(argv, { env: inputEnv, fetch, execFile: execFileOve
100
87
  }
101
88
  throw error;
102
89
  }
103
- if (program.opts().version) {
104
- stdout.write(`${formatVersionLine()}\n`);
105
- return;
106
- }
107
- const promptArg = typeof program.opts().prompt === "string" ? program.opts().prompt : null;
108
- const promptFileArg = typeof program.opts().promptFile === "string" ? program.opts().promptFile : null;
109
- if (promptArg && promptFileArg) {
110
- throw new Error("Use either --prompt or --prompt-file (not both).");
111
- }
112
- let promptOverride = null;
113
- if (promptFileArg) {
114
- let text;
115
- try {
116
- text = await fs.readFile(promptFileArg, "utf8");
117
- }
118
- catch (error) {
119
- const message = error instanceof Error ? error.message : String(error);
120
- throw new Error(`Failed to read --prompt-file ${promptFileArg}: ${message}`);
121
- }
122
- const trimmed = text.trim();
123
- if (!trimmed) {
124
- throw new Error(`Prompt file ${promptFileArg} is empty.`);
125
- }
126
- promptOverride = trimmed;
127
- }
128
- else if (promptArg) {
129
- const trimmed = promptArg.trim();
130
- if (!trimmed) {
131
- throw new Error("Prompt must not be empty.");
132
- }
133
- promptOverride = trimmed;
134
- }
135
- const clearCacheFlag = normalizedArgv.includes("--clear-cache");
136
- if (clearCacheFlag) {
137
- const extraArgs = normalizedArgv.filter((arg) => arg !== "--clear-cache");
138
- if (extraArgs.length > 0) {
139
- throw new Error("--clear-cache must be used alone.");
140
- }
141
- const { config } = loadSummarizeConfig({ env: envForRun });
142
- const cachePath = resolveCachePath({
143
- env: envForRun,
144
- cachePath: config?.cache?.path ?? null,
145
- });
146
- if (!cachePath) {
147
- throw new Error("Unable to resolve cache path (missing HOME).");
148
- }
149
- clearCacheFiles(cachePath);
150
- stdout.write("Cache cleared.\n");
90
+ if (handleVersionFlag({ versionRequested: Boolean(program.opts().version), stdout })) {
151
91
  return;
152
92
  }
153
- const cacheStatsFlag = normalizedArgv.includes("--cache-stats");
154
- if (cacheStatsFlag) {
155
- const extraArgs = normalizedArgv.filter((arg) => arg !== "--cache-stats");
156
- if (extraArgs.length > 0) {
157
- throw new Error("--cache-stats must be used alone.");
158
- }
159
- const { config } = loadSummarizeConfig({ env: envForRun });
160
- const cachePath = resolveCachePath({
161
- env: envForRun,
162
- cachePath: config?.cache?.path ?? null,
163
- });
164
- if (!cachePath) {
165
- throw new Error("Unable to resolve cache path (missing HOME).");
166
- }
167
- const cacheMaxMb = typeof config?.cache?.maxMb === "number" ? config.cache.maxMb : DEFAULT_CACHE_MAX_MB;
168
- const cacheMaxBytes = Math.max(0, cacheMaxMb) * 1024 * 1024;
169
- const { readCacheStats } = await import("../cache.js");
170
- const { formatBytes } = await import("../tty/format.js");
171
- const stats = await readCacheStats(cachePath);
172
- stdout.write(`Cache path: ${cachePath}\n`);
173
- if (!stats) {
174
- stdout.write("Cache is empty.\n");
175
- return;
176
- }
177
- const sizeLabel = formatBytes(stats.sizeBytes);
178
- const maxLabel = cacheMaxBytes > 0 ? formatBytes(cacheMaxBytes) : "disabled";
179
- stdout.write(`Size: ${sizeLabel} (max ${maxLabel})\n`);
180
- stdout.write(`Entries: total=${stats.totalEntries} extract=${stats.counts.extract} summary=${stats.counts.summary} transcript=${stats.counts.transcript}\n`);
93
+ applyWidthOverride({ width: program.opts().width, env });
94
+ let promptOverride = await resolvePromptOverride({
95
+ prompt: program.opts().prompt,
96
+ promptFile: program.opts().promptFile,
97
+ });
98
+ if (await handleCacheUtilityFlags({
99
+ normalizedArgv,
100
+ envForRun,
101
+ stdout,
102
+ })) {
181
103
  return;
182
104
  }
183
105
  const cliFlagPresent = normalizedArgv.some((arg) => arg === "--cli" || arg.startsWith("--cli="));
@@ -192,83 +114,15 @@ export async function runCli(argv, { env: inputEnv, fetch, execFile: execFileOve
192
114
  const inputTarget = inputResolution.inputTarget;
193
115
  const url = inputResolution.url;
194
116
  const runStartedAtMs = Date.now();
195
- const videoModeExplicitlySet = normalizedArgv.some((arg) => arg === "--video-mode" || arg.startsWith("--video-mode="));
196
- const lengthExplicitlySet = normalizedArgv.some((arg) => arg === "--length" || arg.startsWith("--length="));
197
- const languageExplicitlySet = normalizedArgv.some((arg) => arg === "--language" ||
198
- arg.startsWith("--language=") ||
199
- arg === "--lang" ||
200
- arg.startsWith("--lang="));
201
- const noCacheFlag = program.opts().cache === false;
202
- const noMediaCacheFlag = program.opts().mediaCache === false;
203
- const extractMode = Boolean(program.opts().extract) || Boolean(program.opts().extractOnly);
204
- const json = Boolean(program.opts().json);
205
- const forceSummary = Boolean(program.opts().forceSummary);
206
- const slidesDebug = Boolean(program.opts().slidesDebug);
207
- const streamMode = parseStreamMode(program.opts().stream);
208
- const plain = Boolean(program.opts().plain);
209
- const debug = Boolean(program.opts().debug);
210
- const verbose = Boolean(program.opts().verbose) || debug;
211
- const normalizeTranscriber = (value) => {
212
- if (typeof value !== "string")
213
- return null;
214
- const normalized = value.trim().toLowerCase();
215
- if (normalized === "auto" ||
216
- normalized === "whisper" ||
217
- normalized === "parakeet" ||
218
- normalized === "canary")
219
- return normalized;
220
- return null;
221
- };
222
- const transcriberExplicitlySet = normalizedArgv.some((arg) => arg === "--transcriber" || arg.startsWith("--transcriber="));
223
- const envTranscriber = envForRun?.SUMMARIZE_TRANSCRIBER ??
224
- process.env.SUMMARIZE_TRANSCRIBER ??
225
- null;
226
- const transcriber = normalizeTranscriber(transcriberExplicitlySet ? program.opts().transcriber : envTranscriber) ??
227
- "auto";
228
- envForRun.SUMMARIZE_TRANSCRIBER = transcriber;
229
- const maxExtractCharacters = parseMaxExtractCharactersArg(typeof program.opts().maxExtractCharacters === "string"
230
- ? program.opts().maxExtractCharacters
231
- : program.opts().maxExtractCharacters != null
232
- ? String(program.opts().maxExtractCharacters)
233
- : undefined);
234
- const isYoutubeUrl = typeof url === "string" ? /youtube\.com|youtu\.be/i.test(url) : false;
235
- const formatExplicitlySet = normalizedArgv.some((arg) => arg === "--format" || arg.startsWith("--format="));
236
- const rawFormatOpt = typeof program.opts().format === "string" ? program.opts().format : null;
237
- const format = parseExtractFormat(formatExplicitlySet
238
- ? (rawFormatOpt ?? "text")
239
- : extractMode && inputTarget.kind === "url" && !isYoutubeUrl
240
- ? "md"
241
- : "text");
242
- const runSettings = resolveCliRunSettings({
243
- length: String(program.opts().length),
244
- firecrawl: String(program.opts().firecrawl),
245
- markdownMode: typeof program.opts().markdownMode === "string" ? program.opts().markdownMode : undefined,
246
- markdown: typeof program.opts().markdown === "string" ? program.opts().markdown : undefined,
247
- format,
248
- preprocess: String(program.opts().preprocess),
249
- youtube: String(program.opts().youtube),
250
- timeout: String(program.opts().timeout),
251
- retries: String(program.opts().retries),
252
- maxOutputTokens: typeof program.opts().maxOutputTokens === "string"
253
- ? program.opts().maxOutputTokens
254
- : program.opts().maxOutputTokens != null
255
- ? String(program.opts().maxOutputTokens)
256
- : undefined,
117
+ const { videoModeExplicitlySet, lengthExplicitlySet, languageExplicitlySet, noCacheFlag, noMediaCacheFlag, extractMode, json, forceSummary, slidesDebug, streamMode, plain, debug, verbose, transcriber, maxExtractCharacters, isYoutubeUrl, format, youtubeMode, lengthArg, maxOutputTokensArg, timeoutMs, retries, preprocessMode, requestedFirecrawlMode, markdownMode, metricsEnabled, metricsDetailed, shouldComputeReport, markdownModeExplicitlySet, } = resolveRunnerFlags({
118
+ normalizedArgv,
119
+ programOpts: program.opts(),
120
+ envForRun,
121
+ url: inputTarget.kind === "url" ? inputTarget.url : url,
257
122
  });
258
- const { youtubeMode, lengthArg, maxOutputTokensArg, timeoutMs, retries, preprocessMode, firecrawlMode: requestedFirecrawlMode, markdownMode, } = runSettings;
259
123
  if (extractMode && lengthExplicitlySet && !json && isRichTty(stderr)) {
260
124
  stderr.write("Warning: --length is ignored with --extract (no summary is generated).\n");
261
125
  }
262
- const metricsExplicitlySet = normalizedArgv.some((arg) => arg === "--metrics" || arg.startsWith("--metrics="));
263
- const metricsMode = parseMetricsMode(debug && !metricsExplicitlySet ? "detailed" : program.opts().metrics);
264
- const metricsEnabled = metricsMode !== "off";
265
- const metricsDetailed = metricsMode === "detailed";
266
- const shouldComputeReport = metricsEnabled;
267
- const _firecrawlExplicitlySet = normalizedArgv.some((arg) => arg === "--firecrawl" || arg.startsWith("--firecrawl="));
268
- const markdownModeExplicitlySet = normalizedArgv.some((arg) => arg === "--markdown-mode" ||
269
- arg.startsWith("--markdown-mode=") ||
270
- arg === "--markdown" ||
271
- arg.startsWith("--markdown="));
272
126
  const modelArg = typeof program.opts().model === "string" ? program.opts().model : null;
273
127
  const cliProviderArg = typeof cliProviderArgRaw === "string" && cliProviderArgRaw.trim().length > 0
274
128
  ? parseCliProviderArg(cliProviderArgRaw)
@@ -281,7 +135,7 @@ export async function runCli(argv, { env: inputEnv, fetch, execFile: execFileOve
281
135
  : cliFlagPresent
282
136
  ? "auto"
283
137
  : modelArg;
284
- const { config, configPath, outputLanguage, openaiWhisperUsdPerMinute, videoMode, cliConfigForRun, configForCli, openaiUseChatCompletions, configModelLabel, apiKey, openrouterApiKey, openrouterConfigured, groqApiKey, openaiTranscriptionKey, xaiApiKey, googleApiKey, anthropicApiKey, zaiApiKey, zaiBaseUrl, providerBaseUrls, firecrawlApiKey, firecrawlConfigured, googleConfigured, anthropicConfigured, apifyToken, ytDlpPath, ytDlpCookiesFromBrowser, falApiKey, cliAvailability, envForAuto, } = resolveRunContextState({
138
+ const { config, configPath, outputLanguage, openaiWhisperUsdPerMinute, videoMode, cliConfigForRun, configForCli, openaiUseChatCompletions, configModelLabel, apiKey, openrouterApiKey, openrouterConfigured, groqApiKey, assemblyaiApiKey, openaiTranscriptionKey, xaiApiKey, googleApiKey, anthropicApiKey, zaiApiKey, zaiBaseUrl, nvidiaApiKey, nvidiaBaseUrl, providerBaseUrls, firecrawlApiKey, firecrawlConfigured, googleConfigured, anthropicConfigured, apifyToken, ytDlpPath, ytDlpCookiesFromBrowser, falApiKey, cliAvailability, envForAuto, } = resolveRunContextState({
285
139
  env,
286
140
  envForRun,
287
141
  programOpts: program.opts(),
@@ -299,38 +153,12 @@ export async function runCli(argv, { env: inputEnv, fetch, execFile: execFileOve
299
153
  if (!promptOverride && typeof config?.prompt === "string" && config.prompt.trim().length > 0) {
300
154
  promptOverride = config.prompt.trim();
301
155
  }
302
- const slidesExplicitlySet = normalizedArgv.some((arg) => arg === "--slides" || arg === "--no-slides" || arg.startsWith("--slides="));
303
- const slidesOcrExplicitlySet = normalizedArgv.some((arg) => arg === "--slides-ocr" || arg === "--no-slides-ocr" || arg.startsWith("--slides-ocr="));
304
- const slidesDirExplicitlySet = normalizedArgv.some((arg) => arg === "--slides-dir" || arg.startsWith("--slides-dir="));
305
- const slidesSceneThresholdExplicitlySet = normalizedArgv.some((arg) => arg === "--slides-scene-threshold" || arg.startsWith("--slides-scene-threshold="));
306
- const slidesMaxExplicitlySet = normalizedArgv.some((arg) => arg === "--slides-max" || arg.startsWith("--slides-max="));
307
- const slidesMinDurationExplicitlySet = normalizedArgv.some((arg) => arg === "--slides-min-duration" || arg.startsWith("--slides-min-duration="));
308
- const slidesConfig = config?.slides;
309
- const slidesSettings = resolveSlideSettings({
310
- slides: slidesExplicitlySet
311
- ? program.opts().slides
312
- : (slidesConfig?.enabled ?? program.opts().slides),
313
- slidesOcr: slidesOcrExplicitlySet
314
- ? program.opts().slidesOcr
315
- : (slidesConfig?.ocr ?? program.opts().slidesOcr),
316
- slidesDir: slidesDirExplicitlySet
317
- ? program.opts().slidesDir
318
- : (slidesConfig?.dir ?? program.opts().slidesDir),
319
- slidesSceneThreshold: slidesSceneThresholdExplicitlySet
320
- ? program.opts().slidesSceneThreshold
321
- : (slidesConfig?.sceneThreshold ?? program.opts().slidesSceneThreshold),
322
- slidesSceneThresholdExplicit: slidesSceneThresholdExplicitlySet || typeof slidesConfig?.sceneThreshold === "number",
323
- slidesMax: slidesMaxExplicitlySet
324
- ? program.opts().slidesMax
325
- : (slidesConfig?.max ?? program.opts().slidesMax),
326
- slidesMinDuration: slidesMinDurationExplicitlySet
327
- ? program.opts().slidesMinDuration
328
- : (slidesConfig?.minDuration ?? program.opts().slidesMinDuration),
329
- cwd: process.cwd(),
156
+ const slidesSettings = resolveRunnerSlidesSettings({
157
+ normalizedArgv,
158
+ programOpts: program.opts(),
159
+ config,
160
+ inputKind: inputTarget.kind,
330
161
  });
331
- if (slidesSettings && inputTarget.kind !== "url") {
332
- throw new Error("--slides is only supported for URL inputs");
333
- }
334
162
  const transcriptTimestamps = Boolean(program.opts().timestamps) || Boolean(slidesSettings);
335
163
  const lengthInstruction = promptOverride && lengthExplicitlySet && lengthArg.kind === "chars"
336
164
  ? `Output is ${lengthArg.maxCharacters.toLocaleString()} characters.`
@@ -444,6 +272,10 @@ export async function runCli(argv, { env: inputEnv, fetch, execFile: execFileOve
444
272
  apiKey: zaiApiKey,
445
273
  baseUrl: zaiBaseUrl,
446
274
  },
275
+ nvidia: {
276
+ apiKey: nvidiaApiKey,
277
+ baseUrl: nvidiaBaseUrl,
278
+ },
447
279
  providerBaseUrls,
448
280
  });
449
281
  const writeViaFooter = (parts) => {
@@ -458,173 +290,10 @@ export async function runCli(argv, { env: inputEnv, fetch, execFile: execFileOve
458
290
  stderr.write(`${themeForStderr.dim(`via ${filtered.join(", ")}`)}\n`);
459
291
  restoreProgressAfterStdout?.();
460
292
  };
461
- const assetSummaryContext = {
462
- env,
463
- envForRun,
464
- stdout,
465
- stderr,
466
- execFileImpl,
467
- timeoutMs,
468
- preprocessMode,
469
- format,
470
- extractMode,
471
- lengthArg,
472
- forceSummary,
473
- outputLanguage,
474
- videoMode,
475
- fixedModelSpec,
476
- promptOverride,
477
- lengthInstruction,
478
- languageInstruction,
479
- isFallbackModel,
480
- isImplicitAutoSelection,
481
- allowAutoCliFallback: false,
482
- desiredOutputTokens,
483
- envForAuto,
484
- configForModelSelection,
485
- cliAvailability,
486
- requestedModel,
487
- requestedModelInput,
488
- requestedModelLabel,
489
- wantsFreeNamedModel,
490
- isNamedModelSelection,
491
- maxOutputTokensArg,
492
- json,
493
- metricsEnabled,
494
- metricsDetailed,
495
- shouldComputeReport,
496
- runStartedAtMs,
497
- verbose,
498
- verboseColor,
499
- streamingEnabled,
500
- plain,
501
- summaryEngine,
502
- trackedFetch,
503
- writeViaFooter,
504
- clearProgressForStdout,
505
- restoreProgressAfterStdout,
506
- getLiteLlmCatalog,
507
- buildReport,
508
- estimateCostUsd,
509
- llmCalls,
510
- cache: cacheState,
511
- summaryCacheBypass: noCacheFlag,
293
+ const { summarizeAsset, assetInputContext, urlFlowContext } = createRunnerFlowContexts({
294
+ summarizeMediaFileImpl,
295
+ cacheState,
512
296
  mediaCache,
513
- apiStatus: {
514
- xaiApiKey,
515
- apiKey,
516
- openrouterApiKey,
517
- apifyToken,
518
- firecrawlConfigured,
519
- googleConfigured,
520
- anthropicConfigured,
521
- providerBaseUrls,
522
- zaiApiKey,
523
- zaiBaseUrl,
524
- },
525
- };
526
- const summarizeAsset = (args) => summarizeAssetFlow(assetSummaryContext, args);
527
- const summarizeMediaFile = (args) => summarizeMediaFileImpl(assetSummaryContext, args);
528
- const assetInputContext = {
529
- env,
530
- envForRun,
531
- stderr,
532
- progressEnabled,
533
- timeoutMs,
534
- trackedFetch,
535
- summarizeAsset,
536
- summarizeMediaFile,
537
- setClearProgressBeforeStdout,
538
- clearProgressIfCurrent,
539
- };
540
- if (inputTarget.kind === "stdin") {
541
- const stdinTempFile = await createTempFileFromStdin({
542
- stream: stdin ?? process.stdin,
543
- });
544
- try {
545
- const stdinInputTarget = { kind: "file", filePath: stdinTempFile.filePath };
546
- if (await handleFileInput(assetInputContext, stdinInputTarget)) {
547
- return;
548
- }
549
- throw new Error("Failed to process stdin input");
550
- }
551
- finally {
552
- await stdinTempFile.cleanup();
553
- }
554
- }
555
- if (await handleFileInput(assetInputContext, inputTarget)) {
556
- return;
557
- }
558
- if (url &&
559
- (await withUrlAsset(assetInputContext, url, isYoutubeUrl, async ({ loaded, spinner }) => {
560
- if (extractMode) {
561
- if (progressEnabled)
562
- spinner.setText(renderSpinnerStatus("Extracting text"));
563
- const extracted = await extractAssetContent({
564
- ctx: {
565
- env,
566
- envForRun,
567
- execFileImpl,
568
- timeoutMs,
569
- preprocessMode,
570
- },
571
- attachment: loaded.attachment,
572
- });
573
- await outputExtractedAsset({
574
- io: { env, envForRun, stdout, stderr },
575
- flags: {
576
- timeoutMs,
577
- preprocessMode,
578
- format,
579
- plain,
580
- json,
581
- metricsEnabled,
582
- metricsDetailed,
583
- shouldComputeReport,
584
- runStartedAtMs,
585
- verboseColor,
586
- },
587
- hooks: {
588
- clearProgressForStdout,
589
- restoreProgressAfterStdout,
590
- buildReport,
591
- estimateCostUsd,
592
- },
593
- url,
594
- sourceLabel: loaded.sourceLabel,
595
- attachment: loaded.attachment,
596
- extracted,
597
- apiStatus: {
598
- xaiApiKey,
599
- apiKey,
600
- openrouterApiKey,
601
- apifyToken,
602
- firecrawlConfigured,
603
- googleConfigured,
604
- anthropicConfigured,
605
- },
606
- });
607
- return;
608
- }
609
- if (progressEnabled)
610
- spinner.setText(renderSpinnerStatus("Summarizing"));
611
- await summarizeAsset({
612
- sourceKind: "asset-url",
613
- sourceLabel: loaded.sourceLabel,
614
- attachment: loaded.attachment,
615
- onModelChosen: (modelId) => {
616
- if (!progressEnabled)
617
- return;
618
- spinner.setText(renderSpinnerStatusWithModel("Summarizing", modelId));
619
- },
620
- });
621
- }))) {
622
- return;
623
- }
624
- if (!url) {
625
- throw new Error("Only HTTP and HTTPS URLs can be summarized");
626
- }
627
- const urlFlowContext = {
628
297
  io: {
629
298
  env,
630
299
  envForRun,
@@ -689,6 +358,7 @@ export async function runCli(argv, { env: inputEnv, fetch, execFile: execFileOve
689
358
  apiStatus: {
690
359
  xaiApiKey,
691
360
  apiKey,
361
+ nvidiaApiKey,
692
362
  openrouterApiKey,
693
363
  openrouterConfigured,
694
364
  googleApiKey,
@@ -698,6 +368,7 @@ export async function runCli(argv, { env: inputEnv, fetch, execFile: execFileOve
698
368
  providerBaseUrls,
699
369
  zaiApiKey,
700
370
  zaiBaseUrl,
371
+ nvidiaBaseUrl,
701
372
  firecrawlConfigured,
702
373
  firecrawlApiKey,
703
374
  apifyToken,
@@ -705,35 +376,73 @@ export async function runCli(argv, { env: inputEnv, fetch, execFile: execFileOve
705
376
  ytDlpCookiesFromBrowser,
706
377
  falApiKey,
707
378
  groqApiKey,
379
+ assemblyaiApiKey,
708
380
  openaiTranscriptionKey,
709
381
  },
710
382
  summaryEngine,
711
383
  getLiteLlmCatalog,
712
384
  llmCalls,
713
385
  },
714
- cache: cacheState,
715
- mediaCache,
716
- hooks: {
717
- onModelChosen: null,
718
- onExtracted: null,
719
- onSlidesExtracted: null,
720
- onSlidesProgress: null,
721
- onLinkPreviewProgress: null,
722
- onSummaryCached: null,
723
- setTranscriptionCost,
724
- summarizeAsset,
725
- writeViaFooter,
726
- clearProgressForStdout,
727
- restoreProgressAfterStdout,
728
- setClearProgressBeforeStdout,
729
- clearProgressIfCurrent,
730
- buildReport,
731
- estimateCostUsd,
732
- onSlideChunk: undefined,
733
- onSlidesDone: null,
386
+ setTranscriptionCost,
387
+ writeViaFooter,
388
+ clearProgressForStdout,
389
+ restoreProgressAfterStdout,
390
+ setClearProgressBeforeStdout,
391
+ clearProgressIfCurrent,
392
+ buildReport,
393
+ estimateCostUsd,
394
+ });
395
+ await executeRunnerInput({
396
+ inputTarget,
397
+ stdin: stdin ?? process.stdin,
398
+ handleFileInputContext: assetInputContext,
399
+ url,
400
+ isYoutubeUrl,
401
+ withUrlAssetContext: assetInputContext,
402
+ extractMode,
403
+ progressEnabled,
404
+ renderSpinnerStatus,
405
+ renderSpinnerStatusWithModel,
406
+ extractAssetContext: {
407
+ env,
408
+ envForRun,
409
+ execFileImpl,
410
+ timeoutMs,
411
+ preprocessMode,
734
412
  },
735
- };
736
- await runUrlFlow({ ctx: urlFlowContext, url, isYoutubeUrl });
413
+ outputExtractedAssetContext: {
414
+ io: { env, envForRun, stdout, stderr },
415
+ flags: {
416
+ timeoutMs,
417
+ preprocessMode,
418
+ format,
419
+ plain,
420
+ json,
421
+ metricsEnabled,
422
+ metricsDetailed,
423
+ shouldComputeReport,
424
+ runStartedAtMs,
425
+ verboseColor,
426
+ },
427
+ hooks: {
428
+ clearProgressForStdout,
429
+ restoreProgressAfterStdout,
430
+ buildReport,
431
+ estimateCostUsd,
432
+ },
433
+ apiStatus: {
434
+ xaiApiKey,
435
+ apiKey,
436
+ openrouterApiKey,
437
+ apifyToken,
438
+ firecrawlConfigured,
439
+ googleConfigured,
440
+ anthropicConfigured,
441
+ },
442
+ },
443
+ summarizeAsset,
444
+ runUrlFlowContext: urlFlowContext,
445
+ });
737
446
  }
738
447
  finally {
739
448
  cacheState.store?.close();