@steipete/summarize 0.11.1 → 0.13.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 (427) hide show
  1. package/CHANGELOG.md +73 -1
  2. package/README.md +102 -32
  3. package/dist/cli.js +1 -1
  4. package/dist/esm/cache-keys.js +83 -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 +15 -92
  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 +55 -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 +472 -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/costs.js.map +1 -1
  27. package/dist/esm/daemon/agent-model.js +283 -0
  28. package/dist/esm/daemon/agent-model.js.map +1 -0
  29. package/dist/esm/daemon/agent-request.js +87 -0
  30. package/dist/esm/daemon/agent-request.js.map +1 -0
  31. package/dist/esm/daemon/agent.js +42 -243
  32. package/dist/esm/daemon/agent.js.map +1 -1
  33. package/dist/esm/daemon/chat.js +118 -9
  34. package/dist/esm/daemon/chat.js.map +1 -1
  35. package/dist/esm/daemon/cli.js +121 -9
  36. package/dist/esm/daemon/cli.js.map +1 -1
  37. package/dist/esm/daemon/config.js +65 -9
  38. package/dist/esm/daemon/config.js.map +1 -1
  39. package/dist/esm/daemon/env-snapshot.js +6 -0
  40. package/dist/esm/daemon/env-snapshot.js.map +1 -1
  41. package/dist/esm/daemon/flow-context.js +84 -74
  42. package/dist/esm/daemon/flow-context.js.map +1 -1
  43. package/dist/esm/daemon/models.js +26 -0
  44. package/dist/esm/daemon/models.js.map +1 -1
  45. package/dist/esm/daemon/process-registry.js.map +1 -1
  46. package/dist/esm/daemon/schtasks.js +101 -5
  47. package/dist/esm/daemon/schtasks.js.map +1 -1
  48. package/dist/esm/daemon/server-admin-routes.js +134 -0
  49. package/dist/esm/daemon/server-admin-routes.js.map +1 -0
  50. package/dist/esm/daemon/server-agent-route.js +104 -0
  51. package/dist/esm/daemon/server-agent-route.js.map +1 -0
  52. package/dist/esm/daemon/server-http.js +89 -0
  53. package/dist/esm/daemon/server-http.js.map +1 -0
  54. package/dist/esm/daemon/server-session-routes.js +209 -0
  55. package/dist/esm/daemon/server-session-routes.js.map +1 -0
  56. package/dist/esm/daemon/server-session.js +118 -0
  57. package/dist/esm/daemon/server-session.js.map +1 -0
  58. package/dist/esm/daemon/server-sse.js +28 -0
  59. package/dist/esm/daemon/server-sse.js.map +1 -0
  60. package/dist/esm/daemon/server-summarize-execution.js +357 -0
  61. package/dist/esm/daemon/server-summarize-execution.js.map +1 -0
  62. package/dist/esm/daemon/server-summarize-request.js +119 -0
  63. package/dist/esm/daemon/server-summarize-request.js.map +1 -0
  64. package/dist/esm/daemon/server.js +79 -1121
  65. package/dist/esm/daemon/server.js.map +1 -1
  66. package/dist/esm/daemon/summarize-progress.js +1 -1
  67. package/dist/esm/daemon/summarize-progress.js.map +1 -1
  68. package/dist/esm/daemon/summarize.js.map +1 -1
  69. package/dist/esm/daemon/windows-container.js +21 -0
  70. package/dist/esm/daemon/windows-container.js.map +1 -0
  71. package/dist/esm/llm/cli-exec.js +75 -0
  72. package/dist/esm/llm/cli-exec.js.map +1 -0
  73. package/dist/esm/llm/cli-provider-output.js +415 -0
  74. package/dist/esm/llm/cli-provider-output.js.map +1 -0
  75. package/dist/esm/llm/cli.js +97 -218
  76. package/dist/esm/llm/cli.js.map +1 -1
  77. package/dist/esm/llm/generate-text-document.js +109 -0
  78. package/dist/esm/llm/generate-text-document.js.map +1 -0
  79. package/dist/esm/llm/generate-text-shared.js +121 -0
  80. package/dist/esm/llm/generate-text-shared.js.map +1 -0
  81. package/dist/esm/llm/generate-text-stream.js +291 -0
  82. package/dist/esm/llm/generate-text-stream.js.map +1 -0
  83. package/dist/esm/llm/generate-text.js +172 -480
  84. package/dist/esm/llm/generate-text.js.map +1 -1
  85. package/dist/esm/llm/github-models.js +45 -0
  86. package/dist/esm/llm/github-models.js.map +1 -0
  87. package/dist/esm/llm/html-to-markdown.js.map +1 -1
  88. package/dist/esm/llm/model-id.js +37 -20
  89. package/dist/esm/llm/model-id.js.map +1 -1
  90. package/dist/esm/llm/provider-capabilities.js +2 -0
  91. package/dist/esm/llm/provider-capabilities.js.map +1 -0
  92. package/dist/esm/llm/provider-profile.js +184 -0
  93. package/dist/esm/llm/provider-profile.js.map +1 -0
  94. package/dist/esm/llm/providers/google.js +42 -5
  95. package/dist/esm/llm/providers/google.js.map +1 -1
  96. package/dist/esm/llm/providers/models.js +19 -1
  97. package/dist/esm/llm/providers/models.js.map +1 -1
  98. package/dist/esm/llm/providers/openai.js +243 -5
  99. package/dist/esm/llm/providers/openai.js.map +1 -1
  100. package/dist/esm/llm/transcript-to-markdown.js.map +1 -1
  101. package/dist/esm/media-cache.js +3 -0
  102. package/dist/esm/media-cache.js.map +1 -1
  103. package/dist/esm/model-auto-cli.js +91 -0
  104. package/dist/esm/model-auto-cli.js.map +1 -0
  105. package/dist/esm/model-auto-rules.js +86 -0
  106. package/dist/esm/model-auto-rules.js.map +1 -0
  107. package/dist/esm/model-auto.js +10 -245
  108. package/dist/esm/model-auto.js.map +1 -1
  109. package/dist/esm/model-spec.js +62 -19
  110. package/dist/esm/model-spec.js.map +1 -1
  111. package/dist/esm/refresh-free.js +1 -1
  112. package/dist/esm/refresh-free.js.map +1 -1
  113. package/dist/esm/run/attachments.js +1 -1
  114. package/dist/esm/run/attachments.js.map +1 -1
  115. package/dist/esm/run/bird/exec.js +23 -0
  116. package/dist/esm/run/bird/exec.js.map +1 -0
  117. package/dist/esm/run/bird/media.js +171 -0
  118. package/dist/esm/run/bird/media.js.map +1 -0
  119. package/dist/esm/run/bird/parse.js +82 -0
  120. package/dist/esm/run/bird/parse.js.map +1 -0
  121. package/dist/esm/run/bird/types.js +2 -0
  122. package/dist/esm/run/bird/types.js.map +1 -0
  123. package/dist/esm/run/bird.js +86 -144
  124. package/dist/esm/run/bird.js.map +1 -1
  125. package/dist/esm/run/cache-state.js.map +1 -1
  126. package/dist/esm/run/cli-fallback-state.js +6 -1
  127. package/dist/esm/run/cli-fallback-state.js.map +1 -1
  128. package/dist/esm/run/constants.js +2 -1
  129. package/dist/esm/run/constants.js.map +1 -1
  130. package/dist/esm/run/env.js +24 -3
  131. package/dist/esm/run/env.js.map +1 -1
  132. package/dist/esm/run/finish-line-labels.js +76 -0
  133. package/dist/esm/run/finish-line-labels.js.map +1 -0
  134. package/dist/esm/run/finish-line-lengths.js +96 -0
  135. package/dist/esm/run/finish-line-lengths.js.map +1 -0
  136. package/dist/esm/run/finish-line.js +3 -169
  137. package/dist/esm/run/finish-line.js.map +1 -1
  138. package/dist/esm/run/flows/asset/extract.js.map +1 -1
  139. package/dist/esm/run/flows/asset/input.js +1 -1
  140. package/dist/esm/run/flows/asset/input.js.map +1 -1
  141. package/dist/esm/run/flows/asset/media.js +19 -10
  142. package/dist/esm/run/flows/asset/media.js.map +1 -1
  143. package/dist/esm/run/flows/asset/output.js.map +1 -1
  144. package/dist/esm/run/flows/asset/preprocess.js.map +1 -1
  145. package/dist/esm/run/flows/asset/summary-attempts.js +117 -0
  146. package/dist/esm/run/flows/asset/summary-attempts.js.map +1 -0
  147. package/dist/esm/run/flows/asset/summary.js +30 -107
  148. package/dist/esm/run/flows/asset/summary.js.map +1 -1
  149. package/dist/esm/run/flows/url/extract.js +7 -4
  150. package/dist/esm/run/flows/url/extract.js.map +1 -1
  151. package/dist/esm/run/flows/url/extraction-session.js +174 -0
  152. package/dist/esm/run/flows/url/extraction-session.js.map +1 -0
  153. package/dist/esm/run/flows/url/fetch-options.js +32 -0
  154. package/dist/esm/run/flows/url/fetch-options.js.map +1 -0
  155. package/dist/esm/run/flows/url/flow-progress.js +123 -0
  156. package/dist/esm/run/flows/url/flow-progress.js.map +1 -0
  157. package/dist/esm/run/flows/url/flow.js +70 -462
  158. package/dist/esm/run/flows/url/flow.js.map +1 -1
  159. package/dist/esm/run/flows/url/markdown.js +38 -3
  160. package/dist/esm/run/flows/url/markdown.js.map +1 -1
  161. package/dist/esm/run/flows/url/progress-status-state.js +28 -0
  162. package/dist/esm/run/flows/url/progress-status-state.js.map +1 -0
  163. package/dist/esm/run/flows/url/progress-status.js +51 -0
  164. package/dist/esm/run/flows/url/progress-status.js.map +1 -0
  165. package/dist/esm/run/flows/url/slides-output-render.js +78 -0
  166. package/dist/esm/run/flows/url/slides-output-render.js.map +1 -0
  167. package/dist/esm/run/flows/url/slides-output-state.js +86 -0
  168. package/dist/esm/run/flows/url/slides-output-state.js.map +1 -0
  169. package/dist/esm/run/flows/url/slides-output-stream.js +271 -0
  170. package/dist/esm/run/flows/url/slides-output-stream.js.map +1 -0
  171. package/dist/esm/run/flows/url/slides-output.js +29 -422
  172. package/dist/esm/run/flows/url/slides-output.js.map +1 -1
  173. package/dist/esm/run/flows/url/slides-session.js +159 -0
  174. package/dist/esm/run/flows/url/slides-session.js.map +1 -0
  175. package/dist/esm/run/flows/url/slides-text-markdown.js +431 -0
  176. package/dist/esm/run/flows/url/slides-text-markdown.js.map +1 -0
  177. package/dist/esm/run/flows/url/slides-text-transcript.js +199 -0
  178. package/dist/esm/run/flows/url/slides-text-transcript.js.map +1 -0
  179. package/dist/esm/run/flows/url/slides-text-types.js +2 -0
  180. package/dist/esm/run/flows/url/slides-text-types.js.map +1 -0
  181. package/dist/esm/run/flows/url/slides-text.js +2 -627
  182. package/dist/esm/run/flows/url/slides-text.js.map +1 -1
  183. package/dist/esm/run/flows/url/summary-finish.js +40 -0
  184. package/dist/esm/run/flows/url/summary-finish.js.map +1 -0
  185. package/dist/esm/run/flows/url/summary-json.js +32 -0
  186. package/dist/esm/run/flows/url/summary-json.js.map +1 -0
  187. package/dist/esm/run/flows/url/summary-prompt.js +147 -0
  188. package/dist/esm/run/flows/url/summary-prompt.js.map +1 -0
  189. package/dist/esm/run/flows/url/summary-resolution.js +327 -0
  190. package/dist/esm/run/flows/url/summary-resolution.js.map +1 -0
  191. package/dist/esm/run/flows/url/summary-timestamps.js +136 -0
  192. package/dist/esm/run/flows/url/summary-timestamps.js.map +1 -0
  193. package/dist/esm/run/flows/url/summary.js +139 -667
  194. package/dist/esm/run/flows/url/summary.js.map +1 -1
  195. package/dist/esm/run/flows/url/types.js +31 -1
  196. package/dist/esm/run/flows/url/types.js.map +1 -1
  197. package/dist/esm/run/flows/url/video-only.js +68 -0
  198. package/dist/esm/run/flows/url/video-only.js.map +1 -0
  199. package/dist/esm/run/help.js +15 -5
  200. package/dist/esm/run/help.js.map +1 -1
  201. package/dist/esm/run/markdown-transforms.js +89 -0
  202. package/dist/esm/run/markdown-transforms.js.map +1 -0
  203. package/dist/esm/run/markdown.js +1 -96
  204. package/dist/esm/run/markdown.js.map +1 -1
  205. package/dist/esm/run/run-config.js +1 -1
  206. package/dist/esm/run/run-config.js.map +1 -1
  207. package/dist/esm/run/run-env.js +28 -7
  208. package/dist/esm/run/run-env.js.map +1 -1
  209. package/dist/esm/run/run-models.js +35 -5
  210. package/dist/esm/run/run-models.js.map +1 -1
  211. package/dist/esm/run/run-settings-parse.js +77 -0
  212. package/dist/esm/run/run-settings-parse.js.map +1 -0
  213. package/dist/esm/run/run-settings.js +7 -72
  214. package/dist/esm/run/run-settings.js.map +1 -1
  215. package/dist/esm/run/runner-contexts.js +122 -0
  216. package/dist/esm/run/runner-contexts.js.map +1 -0
  217. package/dist/esm/run/runner-execution.js +82 -0
  218. package/dist/esm/run/runner-execution.js.map +1 -0
  219. package/dist/esm/run/runner-flags.js +97 -0
  220. package/dist/esm/run/runner-flags.js.map +1 -0
  221. package/dist/esm/run/runner-plan.js +369 -0
  222. package/dist/esm/run/runner-plan.js.map +1 -0
  223. package/dist/esm/run/runner-setup.js +109 -0
  224. package/dist/esm/run/runner-setup.js.map +1 -0
  225. package/dist/esm/run/runner-slides.js +49 -0
  226. package/dist/esm/run/runner-slides.js.map +1 -0
  227. package/dist/esm/run/runner.js +53 -692
  228. package/dist/esm/run/runner.js.map +1 -1
  229. package/dist/esm/run/slides-cli.js +3 -2
  230. package/dist/esm/run/slides-cli.js.map +1 -1
  231. package/dist/esm/run/slides-render.js +5 -2
  232. package/dist/esm/run/slides-render.js.map +1 -1
  233. package/dist/esm/run/stdin-temp-file.js +1 -1
  234. package/dist/esm/run/stdin-temp-file.js.map +1 -1
  235. package/dist/esm/run/streaming.js +2 -0
  236. package/dist/esm/run/streaming.js.map +1 -1
  237. package/dist/esm/run/summary-engine.js +50 -10
  238. package/dist/esm/run/summary-engine.js.map +1 -1
  239. package/dist/esm/run/summary-llm.js +2 -1
  240. package/dist/esm/run/summary-llm.js.map +1 -1
  241. package/dist/esm/run/terminal.js +4 -1
  242. package/dist/esm/run/terminal.js.map +1 -1
  243. package/dist/esm/run/transcriber-cli.js +1 -1
  244. package/dist/esm/run/transcriber-cli.js.map +1 -1
  245. package/dist/esm/shared/slides-text.js +2 -0
  246. package/dist/esm/shared/slides-text.js.map +1 -0
  247. package/dist/esm/slides/download.js +242 -0
  248. package/dist/esm/slides/download.js.map +1 -0
  249. package/dist/esm/slides/extract-finalize.js +98 -0
  250. package/dist/esm/slides/extract-finalize.js.map +1 -0
  251. package/dist/esm/slides/extract.js +105 -1685
  252. package/dist/esm/slides/extract.js.map +1 -1
  253. package/dist/esm/slides/frame-extraction.js +372 -0
  254. package/dist/esm/slides/frame-extraction.js.map +1 -0
  255. package/dist/esm/slides/index.js +2 -1
  256. package/dist/esm/slides/index.js.map +1 -1
  257. package/dist/esm/slides/ingest.js +194 -0
  258. package/dist/esm/slides/ingest.js.map +1 -0
  259. package/dist/esm/slides/ocr.js +91 -0
  260. package/dist/esm/slides/ocr.js.map +1 -0
  261. package/dist/esm/slides/process.js +218 -0
  262. package/dist/esm/slides/process.js.map +1 -0
  263. package/dist/esm/slides/scene-detection.js +387 -0
  264. package/dist/esm/slides/scene-detection.js.map +1 -0
  265. package/dist/esm/slides/source-id.js +42 -0
  266. package/dist/esm/slides/source-id.js.map +1 -0
  267. package/dist/esm/slides/source.js +80 -0
  268. package/dist/esm/slides/source.js.map +1 -0
  269. package/dist/esm/tty/progress/fetch-html.js +6 -0
  270. package/dist/esm/tty/progress/fetch-html.js.map +1 -1
  271. package/dist/esm/tty/progress/transcript-state.js +202 -0
  272. package/dist/esm/tty/progress/transcript-state.js.map +1 -0
  273. package/dist/esm/tty/progress/transcript.js +43 -194
  274. package/dist/esm/tty/progress/transcript.js.map +1 -1
  275. package/dist/esm/tty/spinner.js +17 -3
  276. package/dist/esm/tty/spinner.js.map +1 -1
  277. package/dist/esm/tty/website-progress.js +16 -3
  278. package/dist/esm/tty/website-progress.js.map +1 -1
  279. package/dist/esm/version.js +1 -1
  280. package/dist/types/cache-keys.d.ts +44 -0
  281. package/dist/types/cache-slides-cleanup.d.ts +1 -0
  282. package/dist/types/cache.d.ts +2 -10
  283. package/dist/types/config/env.d.ts +6 -0
  284. package/dist/types/config/model.d.ts +3 -0
  285. package/dist/types/config/parse-helpers.d.ts +7 -0
  286. package/dist/types/config/read.d.ts +2 -0
  287. package/dist/types/config/sections.d.ts +34 -0
  288. package/dist/types/config/types.d.ts +238 -0
  289. package/dist/types/config.d.ts +3 -209
  290. package/dist/types/costs.d.ts +1 -1
  291. package/dist/types/daemon/agent-model.d.ts +40 -0
  292. package/dist/types/daemon/agent-request.d.ts +14 -0
  293. package/dist/types/daemon/chat.d.ts +3 -1
  294. package/dist/types/daemon/config.d.ts +13 -2
  295. package/dist/types/daemon/env-snapshot.d.ts +1 -1
  296. package/dist/types/daemon/flow-context.d.ts +2 -2
  297. package/dist/types/daemon/models.d.ts +3 -0
  298. package/dist/types/daemon/schtasks.d.ts +2 -1
  299. package/dist/types/daemon/server-admin-routes.d.ts +22 -0
  300. package/dist/types/daemon/server-agent-route.d.ts +9 -0
  301. package/dist/types/daemon/server-http.d.ts +10 -0
  302. package/dist/types/daemon/server-session-routes.d.ts +11 -0
  303. package/dist/types/daemon/server-session.d.ts +52 -0
  304. package/dist/types/daemon/server-sse.d.ts +12 -0
  305. package/dist/types/daemon/server-summarize-execution.d.ts +70 -0
  306. package/dist/types/daemon/server-summarize-request.d.ts +36 -0
  307. package/dist/types/daemon/server.d.ts +4 -4
  308. package/dist/types/daemon/summarize.d.ts +1 -1
  309. package/dist/types/daemon/windows-container.d.ts +1 -0
  310. package/dist/types/llm/cli-exec.d.ts +13 -0
  311. package/dist/types/llm/cli-provider-output.d.ts +25 -0
  312. package/dist/types/llm/generate-text-document.d.ts +35 -0
  313. package/dist/types/llm/generate-text-shared.d.ts +32 -0
  314. package/dist/types/llm/generate-text-stream.d.ts +27 -0
  315. package/dist/types/llm/generate-text.d.ts +7 -26
  316. package/dist/types/llm/github-models.d.ts +5 -0
  317. package/dist/types/llm/html-to-markdown.d.ts +2 -1
  318. package/dist/types/llm/model-id.d.ts +1 -1
  319. package/dist/types/llm/provider-capabilities.d.ts +2 -0
  320. package/dist/types/llm/provider-profile.d.ts +31 -0
  321. package/dist/types/llm/providers/google.d.ts +6 -0
  322. package/dist/types/llm/providers/models.d.ts +5 -0
  323. package/dist/types/llm/providers/openai.d.ts +9 -5
  324. package/dist/types/llm/providers/types.d.ts +1 -0
  325. package/dist/types/llm/transcript-to-markdown.d.ts +2 -1
  326. package/dist/types/model-auto-cli.d.ts +15 -0
  327. package/dist/types/model-auto-rules.d.ts +7 -0
  328. package/dist/types/model-auto.d.ts +5 -7
  329. package/dist/types/model-spec.d.ts +4 -3
  330. package/dist/types/run/attachments.d.ts +3 -2
  331. package/dist/types/run/bird/exec.d.ts +1 -0
  332. package/dist/types/run/bird/media.d.ts +3 -0
  333. package/dist/types/run/bird/parse.d.ts +3 -0
  334. package/dist/types/run/bird/types.d.ts +18 -0
  335. package/dist/types/run/bird.d.ts +12 -17
  336. package/dist/types/run/cache-state.d.ts +1 -1
  337. package/dist/types/run/constants.d.ts +2 -1
  338. package/dist/types/run/env.d.ts +6 -0
  339. package/dist/types/run/finish-line-labels.d.ts +29 -0
  340. package/dist/types/run/finish-line-lengths.d.ts +23 -0
  341. package/dist/types/run/finish-line.d.ts +2 -52
  342. package/dist/types/run/flows/asset/extract.d.ts +1 -1
  343. package/dist/types/run/flows/asset/input.d.ts +1 -1
  344. package/dist/types/run/flows/asset/preprocess.d.ts +1 -1
  345. package/dist/types/run/flows/asset/summary-attempts.d.ts +24 -0
  346. package/dist/types/run/flows/asset/summary.d.ts +16 -2
  347. package/dist/types/run/flows/url/extraction-session.d.ts +22 -0
  348. package/dist/types/run/flows/url/fetch-options.d.ts +29 -0
  349. package/dist/types/run/flows/url/flow-progress.d.ts +43 -0
  350. package/dist/types/run/flows/url/markdown.d.ts +2 -2
  351. package/dist/types/run/flows/url/progress-status-state.d.ts +17 -0
  352. package/dist/types/run/flows/url/progress-status.d.ts +17 -0
  353. package/dist/types/run/flows/url/slides-output-render.d.ts +43 -0
  354. package/dist/types/run/flows/url/slides-output-state.d.ts +21 -0
  355. package/dist/types/run/flows/url/slides-output-stream.d.ts +18 -0
  356. package/dist/types/run/flows/url/slides-output.d.ts +2 -17
  357. package/dist/types/run/flows/url/slides-session.d.ts +26 -0
  358. package/dist/types/run/flows/url/slides-text-markdown.d.ts +46 -0
  359. package/dist/types/run/flows/url/slides-text-transcript.d.ts +36 -0
  360. package/dist/types/run/flows/url/slides-text-types.d.ts +8 -0
  361. package/dist/types/run/flows/url/slides-text.d.ts +3 -87
  362. package/dist/types/run/flows/url/summary-finish.d.ts +16 -0
  363. package/dist/types/run/flows/url/summary-json.d.ts +51 -0
  364. package/dist/types/run/flows/url/summary-prompt.d.ts +22 -0
  365. package/dist/types/run/flows/url/summary-resolution.d.ts +31 -0
  366. package/dist/types/run/flows/url/summary-timestamps.d.ts +11 -0
  367. package/dist/types/run/flows/url/types.d.ts +20 -0
  368. package/dist/types/run/flows/url/video-only.d.ts +27 -0
  369. package/dist/types/run/markdown-transforms.d.ts +3 -0
  370. package/dist/types/run/run-context.d.ts +4 -0
  371. package/dist/types/run/run-env.d.ts +4 -0
  372. package/dist/types/run/run-settings-parse.d.ts +5 -0
  373. package/dist/types/run/run-settings.d.ts +2 -1
  374. package/dist/types/run/runner-contexts.d.ts +37 -0
  375. package/dist/types/run/runner-execution.d.ts +58 -0
  376. package/dist/types/run/runner-flags.d.ts +41 -0
  377. package/dist/types/run/runner-plan.d.ts +19 -0
  378. package/dist/types/run/runner-setup.d.ts +21 -0
  379. package/dist/types/run/runner-slides.d.ts +9 -0
  380. package/dist/types/run/streaming.d.ts +2 -1
  381. package/dist/types/run/summary-engine.d.ts +8 -4
  382. package/dist/types/run/summary-llm.d.ts +5 -3
  383. package/dist/types/run/terminal.d.ts +2 -0
  384. package/dist/types/run/types.d.ts +3 -2
  385. package/dist/types/shared/slides-text.d.ts +1 -0
  386. package/dist/types/slides/download.d.ts +29 -0
  387. package/dist/types/slides/extract-finalize.d.ts +57 -0
  388. package/dist/types/slides/extract.d.ts +2 -13
  389. package/dist/types/slides/frame-extraction.d.ts +38 -0
  390. package/dist/types/slides/index.d.ts +2 -1
  391. package/dist/types/slides/ingest.d.ts +47 -0
  392. package/dist/types/slides/ocr.d.ts +5 -0
  393. package/dist/types/slides/process.d.ts +22 -0
  394. package/dist/types/slides/scene-detection.d.ts +75 -0
  395. package/dist/types/slides/source-id.d.ts +2 -0
  396. package/dist/types/slides/source.d.ts +8 -0
  397. package/dist/types/tty/progress/fetch-html.d.ts +1 -0
  398. package/dist/types/tty/progress/transcript-state.d.ts +27 -0
  399. package/dist/types/tty/progress/transcript.d.ts +1 -0
  400. package/dist/types/tty/spinner.d.ts +1 -0
  401. package/dist/types/version.d.ts +1 -1
  402. package/docs/README.md +1 -1
  403. package/docs/_config.yml +1 -0
  404. package/docs/agent.md +3 -2
  405. package/docs/assets/site.css +145 -2
  406. package/docs/cache.md +2 -1
  407. package/docs/chrome-extension.md +19 -5
  408. package/docs/cli.md +26 -8
  409. package/docs/config.md +30 -9
  410. package/docs/extract-only.md +2 -2
  411. package/docs/firecrawl.md +2 -1
  412. package/docs/index.html +5 -0
  413. package/docs/llm.md +34 -5
  414. package/docs/manual-tests.md +3 -0
  415. package/docs/media.md +9 -1
  416. package/docs/model-auto.md +2 -2
  417. package/docs/model-provider-resolution.md +57 -0
  418. package/docs/releasing.md +9 -12
  419. package/docs/site/docs/chrome-extension.html +1 -1
  420. package/docs/site/index.html +5 -0
  421. package/docs/slides-rendering-flow.md +46 -0
  422. package/docs/slides.md +5 -5
  423. package/docs/smoketest.md +1 -1
  424. package/docs/transcript-provider-flow.md +73 -0
  425. package/docs/website.md +3 -1
  426. package/docs/youtube.md +4 -2
  427. package/package.json +17 -16
@@ -1,50 +1,16 @@
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";
8
- import { createThemeRenderer, resolveThemeNameFromSources, resolveTrueColor, } from "../tty/theme.js";
9
- import { formatVersionLine } from "../version.js";
10
- import { createCacheStateFromConfig } from "./cache-state.js";
2
+ import { CommanderError } from "commander";
11
3
  import { handleDaemonCliRequest, handleHelpRequest, handleRefreshFreeRequest, } from "./cli-preflight.js";
12
- import { parseCliProviderArg } from "./env.js";
13
- import { extractAssetContent } from "./flows/asset/extract.js";
14
- import { handleFileInput, isTranscribableExtension, withUrlAsset } from "./flows/asset/input.js";
15
- 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
4
  import { attachRichHelp, buildProgram } from "./help.js";
20
- import { createMediaCacheFromConfig } from "./media-cache-state.js";
21
- import { createProgressGate } from "./progress.js";
22
- import { resolveRunContextState } from "./run-context.js";
23
- import { resolveRunInput } from "./run-input.js";
24
- import { createRunMetrics } from "./run-metrics.js";
25
- import { resolveModelSelection } from "./run-models.js";
26
- import { resolveDesiredOutputTokens } from "./run-output.js";
27
- import { resolveCliRunSettings } from "./run-settings.js";
28
- import { resolveStreamSettings } from "./run-stream.js";
5
+ import { createRunnerPlan } from "./runner-plan.js";
6
+ import { applyWidthOverride, handleCacheUtilityFlags, handleVersionFlag, prepareRunEnvironment, resolvePromptOverride, } from "./runner-setup.js";
29
7
  import { handleSlidesCliRequest } from "./slides-cli.js";
30
- import { createTempFileFromStdin } from "./stdin-temp-file.js";
31
- import { createSummaryEngine } from "./summary-engine.js";
32
- import { isRichTty, supportsColor } from "./terminal.js";
33
8
  import { handleTranscriberCliRequest } from "./transcriber-cli.js";
34
9
  export async function runCli(argv, { env: inputEnv, fetch, execFile: execFileOverride, stdin, stdout, stderr }) {
35
10
  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 });
11
+ const { normalizedArgv, envForRun } = prepareRunEnvironment(argv, inputEnv);
43
12
  const env = envForRun;
44
- if (handleHelpRequest({ normalizedArgv, envForRun, stdout, stderr })) {
45
- return;
46
- }
47
- if (await handleRefreshFreeRequest({
13
+ if (await handleImmediateCliRequests({
48
14
  normalizedArgv,
49
15
  envForRun,
50
16
  fetchImpl: fetch,
@@ -53,33 +19,65 @@ export async function runCli(argv, { env: inputEnv, fetch, execFile: execFileOve
53
19
  })) {
54
20
  return;
55
21
  }
56
- if (await handleDaemonCliRequest({
57
- normalizedArgv,
58
- envForRun,
59
- fetchImpl: fetch,
60
- stdout,
61
- stderr,
62
- })) {
22
+ const execFileImpl = execFileOverride ?? execFile;
23
+ const program = buildCliProgram({ normalizedArgv, envForRun, stdout, stderr });
24
+ if (!program)
25
+ return;
26
+ if (handleVersionFlag({ versionRequested: Boolean(program.opts().version), stdout })) {
63
27
  return;
64
28
  }
65
- if (await handleSlidesCliRequest({
29
+ applyWidthOverride({ width: program.opts().width, env });
30
+ let promptOverride = await resolvePromptOverride({
31
+ prompt: program.opts().prompt,
32
+ promptFile: program.opts().promptFile,
33
+ });
34
+ if (await handleCacheUtilityFlags({
66
35
  normalizedArgv,
67
36
  envForRun,
68
- fetchImpl: fetch,
69
37
  stdout,
70
- stderr,
71
38
  })) {
72
39
  return;
73
40
  }
74
- if (await handleTranscriberCliRequest({
41
+ const plan = await createRunnerPlan({
75
42
  normalizedArgv,
43
+ program,
44
+ env,
76
45
  envForRun,
46
+ fetchImpl: fetch,
47
+ execFileImpl,
48
+ stdin,
77
49
  stdout,
78
50
  stderr,
79
- })) {
80
- return;
51
+ promptOverride,
52
+ });
53
+ try {
54
+ await plan.execute();
81
55
  }
82
- const execFileImpl = execFileOverride ?? execFile;
56
+ finally {
57
+ plan.cacheState.store?.close();
58
+ }
59
+ }
60
+ async function handleImmediateCliRequests(options) {
61
+ const { normalizedArgv, envForRun, fetchImpl, stdout, stderr } = options;
62
+ if (handleHelpRequest({ normalizedArgv, envForRun, stdout, stderr })) {
63
+ return true;
64
+ }
65
+ if (await handleRefreshFreeRequest({ normalizedArgv, envForRun, fetchImpl, stdout, stderr })) {
66
+ return true;
67
+ }
68
+ if (await handleDaemonCliRequest({ normalizedArgv, envForRun, fetchImpl, stdout, stderr })) {
69
+ return true;
70
+ }
71
+ if (await handleSlidesCliRequest({ normalizedArgv, envForRun, fetchImpl, stdout, stderr })) {
72
+ return true;
73
+ }
74
+ if (await handleTranscriberCliRequest({ normalizedArgv, envForRun, stdout, stderr })) {
75
+ return true;
76
+ }
77
+ return false;
78
+ }
79
+ function buildCliProgram(options) {
80
+ const { normalizedArgv, envForRun, stdout, stderr } = options;
83
81
  const program = buildProgram();
84
82
  program.configureOutput({
85
83
  writeOut(str) {
@@ -93,650 +91,13 @@ export async function runCli(argv, { env: inputEnv, fetch, execFile: execFileOve
93
91
  attachRichHelp(program, envForRun, stdout);
94
92
  try {
95
93
  program.parse(normalizedArgv, { from: "user" });
94
+ return program;
96
95
  }
97
96
  catch (error) {
98
97
  if (error instanceof CommanderError && error.code === "commander.helpDisplayed") {
99
- return;
100
- }
101
- throw error;
102
- }
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");
151
- return;
152
- }
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`);
181
- return;
182
- }
183
- const cliFlagPresent = normalizedArgv.some((arg) => arg === "--cli" || arg.startsWith("--cli="));
184
- let cliProviderArgRaw = typeof program.opts().cli === "string" ? program.opts().cli : null;
185
- const inputResolution = resolveRunInput({
186
- program,
187
- cliFlagPresent,
188
- cliProviderArgRaw,
189
- stdout,
190
- });
191
- cliProviderArgRaw = inputResolution.cliProviderArgRaw;
192
- const inputTarget = inputResolution.inputTarget;
193
- const url = inputResolution.url;
194
- 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
98
  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,
257
- });
258
- const { youtubeMode, lengthArg, maxOutputTokensArg, timeoutMs, retries, preprocessMode, firecrawlMode: requestedFirecrawlMode, markdownMode, } = runSettings;
259
- if (extractMode && lengthExplicitlySet && !json && isRichTty(stderr)) {
260
- stderr.write("Warning: --length is ignored with --extract (no summary is generated).\n");
261
- }
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
- const modelArg = typeof program.opts().model === "string" ? program.opts().model : null;
273
- const cliProviderArg = typeof cliProviderArgRaw === "string" && cliProviderArgRaw.trim().length > 0
274
- ? parseCliProviderArg(cliProviderArgRaw)
275
- : null;
276
- if (cliFlagPresent && modelArg) {
277
- throw new Error("Use either --model or --cli (not both).");
278
- }
279
- const explicitModelArg = cliProviderArg
280
- ? `cli/${cliProviderArg}`
281
- : cliFlagPresent
282
- ? "auto"
283
- : 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({
285
- env,
286
- envForRun,
287
- programOpts: program.opts(),
288
- languageExplicitlySet,
289
- videoModeExplicitlySet,
290
- cliFlagPresent,
291
- cliProviderArg,
292
- });
293
- const themeName = resolveThemeNameFromSources({
294
- cli: program.opts().theme,
295
- env: envForRun.SUMMARIZE_THEME,
296
- config: config?.ui?.theme,
297
- });
298
- envForRun.SUMMARIZE_THEME = themeName;
299
- if (!promptOverride && typeof config?.prompt === "string" && config.prompt.trim().length > 0) {
300
- promptOverride = config.prompt.trim();
301
- }
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(),
330
- });
331
- if (slidesSettings && inputTarget.kind !== "url") {
332
- throw new Error("--slides is only supported for URL inputs");
333
- }
334
- const transcriptTimestamps = Boolean(program.opts().timestamps) || Boolean(slidesSettings);
335
- const lengthInstruction = promptOverride && lengthExplicitlySet && lengthArg.kind === "chars"
336
- ? `Output is ${lengthArg.maxCharacters.toLocaleString()} characters.`
337
- : null;
338
- const languageInstruction = promptOverride && languageExplicitlySet && outputLanguage.kind === "fixed"
339
- ? `Output should be ${outputLanguage.label}.`
340
- : null;
341
- const transcriptNamespace = `yt:${youtubeMode}`;
342
- const cacheState = await createCacheStateFromConfig({
343
- envForRun,
344
- config,
345
- noCacheFlag: false,
346
- transcriptNamespace,
347
- });
348
- const mediaCache = await createMediaCacheFromConfig({
349
- envForRun,
350
- config,
351
- noMediaCacheFlag,
352
- });
353
- try {
354
- if (markdownModeExplicitlySet && format !== "markdown") {
355
- throw new Error("--markdown-mode is only supported with --format md");
356
- }
357
- if (markdownModeExplicitlySet &&
358
- inputTarget.kind !== "url" &&
359
- inputTarget.kind !== "file" &&
360
- inputTarget.kind !== "stdin") {
361
- throw new Error("--markdown-mode is only supported for URL, file, or stdin inputs");
362
99
  }
363
- if (markdownModeExplicitlySet &&
364
- (inputTarget.kind === "file" || inputTarget.kind === "stdin") &&
365
- markdownMode !== "llm") {
366
- throw new Error("Only --markdown-mode llm is supported for file/stdin inputs; other modes require a URL");
367
- }
368
- const metrics = createRunMetrics({
369
- env,
370
- fetchImpl: fetch,
371
- maxOutputTokensArg,
372
- });
373
- const { llmCalls, trackedFetch, buildReport, estimateCostUsd, getLiteLlmCatalog, resolveMaxOutputTokensForCall, resolveMaxInputTokensForCall, setTranscriptionCost, } = metrics;
374
- const { requestedModel, requestedModelInput, requestedModelLabel, isNamedModelSelection, isImplicitAutoSelection, wantsFreeNamedModel, configForModelSelection, isFallbackModel, } = resolveModelSelection({
375
- config,
376
- configForCli,
377
- configPath,
378
- envForRun,
379
- explicitModelArg,
380
- });
381
- const verboseColor = supportsColor(stderr, envForRun);
382
- const themeForStderr = createThemeRenderer({
383
- themeName,
384
- enabled: verboseColor,
385
- trueColor: resolveTrueColor(envForRun),
386
- });
387
- const renderSpinnerStatus = (label, detail = "…") => `${themeForStderr.label(label)}${themeForStderr.dim(detail)}`;
388
- const renderSpinnerStatusWithModel = (label, modelId) => `${themeForStderr.label(label)}${themeForStderr.dim(" (model: ")}${themeForStderr.accent(modelId)}${themeForStderr.dim(")…")}`;
389
- const { streamingEnabled } = resolveStreamSettings({
390
- streamMode,
391
- stdout,
392
- json,
393
- extractMode,
394
- });
395
- if (extractMode &&
396
- inputTarget.kind === "file" &&
397
- !isTranscribableExtension(inputTarget.filePath)) {
398
- throw new Error("--extract for local files is only supported for media files (MP3, MP4, WAV, etc.)");
399
- }
400
- if (extractMode && inputTarget.kind === "stdin") {
401
- throw new Error("--extract is not supported for piped stdin input");
402
- }
403
- // Progress UI (spinner + OSC progress) is shown on stderr. Before writing to stdout (including
404
- // streaming output), we stop + clear progress via the progress gate to keep scrollback clean.
405
- const progressEnabled = isRichTty(stderr) && !verbose && !json;
406
- const progressGate = createProgressGate();
407
- const { clearProgressForStdout, restoreProgressAfterStdout, setClearProgressBeforeStdout, clearProgressIfCurrent, } = progressGate;
408
- const fixedModelSpec = requestedModel.kind === "fixed" ? requestedModel : null;
409
- const desiredOutputTokens = resolveDesiredOutputTokens({ lengthArg, maxOutputTokensArg });
410
- const summaryEngine = createSummaryEngine({
411
- env,
412
- envForRun,
413
- stdout,
414
- stderr,
415
- execFileImpl,
416
- timeoutMs,
417
- retries,
418
- streamingEnabled,
419
- plain,
420
- verbose,
421
- verboseColor,
422
- openaiUseChatCompletions,
423
- cliConfigForRun: cliConfigForRun ?? null,
424
- cliAvailability,
425
- trackedFetch,
426
- resolveMaxOutputTokensForCall,
427
- resolveMaxInputTokensForCall,
428
- llmCalls,
429
- clearProgressForStdout,
430
- restoreProgressAfterStdout,
431
- apiKeys: {
432
- xaiApiKey,
433
- openaiApiKey: apiKey,
434
- googleApiKey,
435
- anthropicApiKey,
436
- openrouterApiKey,
437
- },
438
- keyFlags: {
439
- googleConfigured,
440
- anthropicConfigured,
441
- openrouterConfigured,
442
- },
443
- zai: {
444
- apiKey: zaiApiKey,
445
- baseUrl: zaiBaseUrl,
446
- },
447
- providerBaseUrls,
448
- });
449
- const writeViaFooter = (parts) => {
450
- if (json)
451
- return;
452
- if (extractMode)
453
- return;
454
- const filtered = parts.map((p) => p.trim()).filter(Boolean);
455
- if (filtered.length === 0)
456
- return;
457
- clearProgressForStdout();
458
- stderr.write(`${themeForStderr.dim(`via ${filtered.join(", ")}`)}\n`);
459
- restoreProgressAfterStdout?.();
460
- };
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,
512
- 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
- io: {
629
- env,
630
- envForRun,
631
- stdout,
632
- stderr,
633
- execFileImpl,
634
- fetch: trackedFetch,
635
- },
636
- flags: {
637
- timeoutMs,
638
- maxExtractCharacters: extractMode ? maxExtractCharacters : null,
639
- retries,
640
- format,
641
- markdownMode,
642
- preprocessMode,
643
- youtubeMode,
644
- firecrawlMode: requestedFirecrawlMode,
645
- videoMode,
646
- transcriptTimestamps,
647
- outputLanguage,
648
- lengthArg,
649
- forceSummary,
650
- promptOverride,
651
- lengthInstruction,
652
- languageInstruction,
653
- summaryCacheBypass: noCacheFlag,
654
- maxOutputTokensArg,
655
- json,
656
- extractMode,
657
- metricsEnabled,
658
- metricsDetailed,
659
- shouldComputeReport,
660
- runStartedAtMs,
661
- verbose,
662
- verboseColor,
663
- progressEnabled,
664
- streamMode,
665
- streamingEnabled,
666
- plain,
667
- configPath,
668
- configModelLabel,
669
- slides: slidesSettings,
670
- slidesDebug,
671
- slidesOutput: true,
672
- },
673
- model: {
674
- requestedModel,
675
- requestedModelInput,
676
- requestedModelLabel,
677
- fixedModelSpec,
678
- isFallbackModel,
679
- isImplicitAutoSelection,
680
- allowAutoCliFallback: false,
681
- isNamedModelSelection,
682
- wantsFreeNamedModel,
683
- desiredOutputTokens,
684
- configForModelSelection,
685
- envForAuto,
686
- cliAvailability,
687
- openaiUseChatCompletions,
688
- openaiWhisperUsdPerMinute,
689
- apiStatus: {
690
- xaiApiKey,
691
- apiKey,
692
- openrouterApiKey,
693
- openrouterConfigured,
694
- googleApiKey,
695
- googleConfigured,
696
- anthropicApiKey,
697
- anthropicConfigured,
698
- providerBaseUrls,
699
- zaiApiKey,
700
- zaiBaseUrl,
701
- firecrawlConfigured,
702
- firecrawlApiKey,
703
- apifyToken,
704
- ytDlpPath,
705
- ytDlpCookiesFromBrowser,
706
- falApiKey,
707
- groqApiKey,
708
- openaiTranscriptionKey,
709
- },
710
- summaryEngine,
711
- getLiteLlmCatalog,
712
- llmCalls,
713
- },
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,
734
- },
735
- };
736
- await runUrlFlow({ ctx: urlFlowContext, url, isYoutubeUrl });
737
- }
738
- finally {
739
- cacheState.store?.close();
100
+ throw error;
740
101
  }
741
102
  }
742
103
  //# sourceMappingURL=runner.js.map