@steipete/summarize 0.8.2 → 0.10.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 (284) hide show
  1. package/CHANGELOG.md +114 -1
  2. package/LICENSE +1 -1
  3. package/README.md +309 -182
  4. package/dist/cli.js +1 -1
  5. package/dist/esm/cache.js +72 -4
  6. package/dist/esm/cache.js.map +1 -1
  7. package/dist/esm/config.js +197 -1
  8. package/dist/esm/config.js.map +1 -1
  9. package/dist/esm/content/asset.js +75 -2
  10. package/dist/esm/content/asset.js.map +1 -1
  11. package/dist/esm/daemon/agent.js +547 -0
  12. package/dist/esm/daemon/agent.js.map +1 -0
  13. package/dist/esm/daemon/chat.js +97 -0
  14. package/dist/esm/daemon/chat.js.map +1 -0
  15. package/dist/esm/daemon/cli.js +105 -10
  16. package/dist/esm/daemon/cli.js.map +1 -1
  17. package/dist/esm/daemon/env-snapshot.js +3 -0
  18. package/dist/esm/daemon/env-snapshot.js.map +1 -1
  19. package/dist/esm/daemon/flow-context.js +53 -28
  20. package/dist/esm/daemon/flow-context.js.map +1 -1
  21. package/dist/esm/daemon/launchd.js +27 -0
  22. package/dist/esm/daemon/launchd.js.map +1 -1
  23. package/dist/esm/daemon/process-registry.js +206 -0
  24. package/dist/esm/daemon/process-registry.js.map +1 -0
  25. package/dist/esm/daemon/schtasks.js +64 -0
  26. package/dist/esm/daemon/schtasks.js.map +1 -1
  27. package/dist/esm/daemon/server.js +1034 -52
  28. package/dist/esm/daemon/server.js.map +1 -1
  29. package/dist/esm/daemon/summarize.js +66 -18
  30. package/dist/esm/daemon/summarize.js.map +1 -1
  31. package/dist/esm/daemon/systemd.js +61 -0
  32. package/dist/esm/daemon/systemd.js.map +1 -1
  33. package/dist/esm/flags.js +24 -0
  34. package/dist/esm/flags.js.map +1 -1
  35. package/dist/esm/llm/attachments.js +2 -0
  36. package/dist/esm/llm/attachments.js.map +1 -0
  37. package/dist/esm/llm/errors.js +6 -0
  38. package/dist/esm/llm/errors.js.map +1 -0
  39. package/dist/esm/llm/generate-text.js +206 -356
  40. package/dist/esm/llm/generate-text.js.map +1 -1
  41. package/dist/esm/llm/html-to-markdown.js +1 -2
  42. package/dist/esm/llm/html-to-markdown.js.map +1 -1
  43. package/dist/esm/llm/prompt.js.map +1 -1
  44. package/dist/esm/llm/providers/anthropic.js +126 -0
  45. package/dist/esm/llm/providers/anthropic.js.map +1 -0
  46. package/dist/esm/llm/providers/google.js +78 -0
  47. package/dist/esm/llm/providers/google.js.map +1 -0
  48. package/dist/esm/llm/providers/models.js +111 -0
  49. package/dist/esm/llm/providers/models.js.map +1 -0
  50. package/dist/esm/llm/providers/openai.js +150 -0
  51. package/dist/esm/llm/providers/openai.js.map +1 -0
  52. package/dist/esm/llm/providers/shared.js +48 -0
  53. package/dist/esm/llm/providers/shared.js.map +1 -0
  54. package/dist/esm/llm/providers/types.js +2 -0
  55. package/dist/esm/llm/providers/types.js.map +1 -0
  56. package/dist/esm/llm/transcript-to-markdown.js +1 -2
  57. package/dist/esm/llm/transcript-to-markdown.js.map +1 -1
  58. package/dist/esm/llm/types.js +2 -0
  59. package/dist/esm/llm/types.js.map +1 -0
  60. package/dist/esm/llm/usage.js +69 -0
  61. package/dist/esm/llm/usage.js.map +1 -0
  62. package/dist/esm/logging/daemon.js +124 -0
  63. package/dist/esm/logging/daemon.js.map +1 -0
  64. package/dist/esm/logging/ring-file.js +66 -0
  65. package/dist/esm/logging/ring-file.js.map +1 -0
  66. package/dist/esm/media-cache.js +251 -0
  67. package/dist/esm/media-cache.js.map +1 -0
  68. package/dist/esm/model-auto.js +103 -5
  69. package/dist/esm/model-auto.js.map +1 -1
  70. package/dist/esm/processes.js +2 -0
  71. package/dist/esm/processes.js.map +1 -0
  72. package/dist/esm/refresh-free.js +3 -3
  73. package/dist/esm/refresh-free.js.map +1 -1
  74. package/dist/esm/run/attachments.js +8 -4
  75. package/dist/esm/run/attachments.js.map +1 -1
  76. package/dist/esm/run/bird.js +118 -5
  77. package/dist/esm/run/bird.js.map +1 -1
  78. package/dist/esm/run/cache-state.js +3 -2
  79. package/dist/esm/run/cache-state.js.map +1 -1
  80. package/dist/esm/run/cli-preflight.js +19 -1
  81. package/dist/esm/run/cli-preflight.js.map +1 -1
  82. package/dist/esm/run/constants.js +0 -7
  83. package/dist/esm/run/constants.js.map +1 -1
  84. package/dist/esm/run/finish-line.js +58 -11
  85. package/dist/esm/run/finish-line.js.map +1 -1
  86. package/dist/esm/run/flows/asset/extract.js +70 -0
  87. package/dist/esm/run/flows/asset/extract.js.map +1 -0
  88. package/dist/esm/run/flows/asset/input.js +209 -25
  89. package/dist/esm/run/flows/asset/input.js.map +1 -1
  90. package/dist/esm/run/flows/asset/media-policy.js +3 -0
  91. package/dist/esm/run/flows/asset/media-policy.js.map +1 -0
  92. package/dist/esm/run/flows/asset/media.js +224 -0
  93. package/dist/esm/run/flows/asset/media.js.map +1 -0
  94. package/dist/esm/run/flows/asset/output.js +98 -0
  95. package/dist/esm/run/flows/asset/output.js.map +1 -0
  96. package/dist/esm/run/flows/asset/preprocess.js +92 -16
  97. package/dist/esm/run/flows/asset/preprocess.js.map +1 -1
  98. package/dist/esm/run/flows/asset/summary.js +165 -11
  99. package/dist/esm/run/flows/asset/summary.js.map +1 -1
  100. package/dist/esm/run/flows/url/extract.js +6 -6
  101. package/dist/esm/run/flows/url/extract.js.map +1 -1
  102. package/dist/esm/run/flows/url/flow.js +338 -36
  103. package/dist/esm/run/flows/url/flow.js.map +1 -1
  104. package/dist/esm/run/flows/url/markdown.js +6 -1
  105. package/dist/esm/run/flows/url/markdown.js.map +1 -1
  106. package/dist/esm/run/flows/url/slides-output.js +485 -0
  107. package/dist/esm/run/flows/url/slides-output.js.map +1 -0
  108. package/dist/esm/run/flows/url/slides-text.js +628 -0
  109. package/dist/esm/run/flows/url/slides-text.js.map +1 -0
  110. package/dist/esm/run/flows/url/summary.js +358 -83
  111. package/dist/esm/run/flows/url/summary.js.map +1 -1
  112. package/dist/esm/run/help.js +94 -5
  113. package/dist/esm/run/help.js.map +1 -1
  114. package/dist/esm/run/logging.js +12 -4
  115. package/dist/esm/run/logging.js.map +1 -1
  116. package/dist/esm/run/media-cache-state.js +33 -0
  117. package/dist/esm/run/media-cache-state.js.map +1 -0
  118. package/dist/esm/run/progress.js +19 -1
  119. package/dist/esm/run/progress.js.map +1 -1
  120. package/dist/esm/run/run-context.js +19 -0
  121. package/dist/esm/run/run-context.js.map +1 -0
  122. package/dist/esm/run/run-output.js +1 -1
  123. package/dist/esm/run/run-output.js.map +1 -1
  124. package/dist/esm/run/run-settings.js +182 -0
  125. package/dist/esm/run/run-settings.js.map +1 -0
  126. package/dist/esm/run/runner.js +225 -32
  127. package/dist/esm/run/runner.js.map +1 -1
  128. package/dist/esm/run/slides-cli.js +225 -0
  129. package/dist/esm/run/slides-cli.js.map +1 -0
  130. package/dist/esm/run/slides-render.js +163 -0
  131. package/dist/esm/run/slides-render.js.map +1 -0
  132. package/dist/esm/run/stream-output.js +63 -0
  133. package/dist/esm/run/stream-output.js.map +1 -0
  134. package/dist/esm/run/streaming.js +16 -43
  135. package/dist/esm/run/streaming.js.map +1 -1
  136. package/dist/esm/run/summary-engine.js +59 -41
  137. package/dist/esm/run/summary-engine.js.map +1 -1
  138. package/dist/esm/run/transcriber-cli.js +148 -0
  139. package/dist/esm/run/transcriber-cli.js.map +1 -0
  140. package/dist/esm/shared/sse-events.js +26 -0
  141. package/dist/esm/shared/sse-events.js.map +1 -0
  142. package/dist/esm/shared/streaming-merge.js +44 -0
  143. package/dist/esm/shared/streaming-merge.js.map +1 -0
  144. package/dist/esm/slides/extract.js +1942 -0
  145. package/dist/esm/slides/extract.js.map +1 -0
  146. package/dist/esm/slides/index.js +4 -0
  147. package/dist/esm/slides/index.js.map +1 -0
  148. package/dist/esm/slides/settings.js +73 -0
  149. package/dist/esm/slides/settings.js.map +1 -0
  150. package/dist/esm/slides/store.js +111 -0
  151. package/dist/esm/slides/store.js.map +1 -0
  152. package/dist/esm/slides/types.js +2 -0
  153. package/dist/esm/slides/types.js.map +1 -0
  154. package/dist/esm/tty/osc-progress.js +21 -1
  155. package/dist/esm/tty/osc-progress.js.map +1 -1
  156. package/dist/esm/tty/progress/fetch-html.js +8 -4
  157. package/dist/esm/tty/progress/fetch-html.js.map +1 -1
  158. package/dist/esm/tty/progress/transcript.js +82 -31
  159. package/dist/esm/tty/progress/transcript.js.map +1 -1
  160. package/dist/esm/tty/spinner.js +2 -2
  161. package/dist/esm/tty/spinner.js.map +1 -1
  162. package/dist/esm/tty/theme.js +189 -0
  163. package/dist/esm/tty/theme.js.map +1 -0
  164. package/dist/esm/tty/website-progress.js +17 -13
  165. package/dist/esm/tty/website-progress.js.map +1 -1
  166. package/dist/esm/version.js +1 -1
  167. package/dist/esm/version.js.map +1 -1
  168. package/dist/types/cache.d.ts +14 -2
  169. package/dist/types/config.d.ts +34 -0
  170. package/dist/types/daemon/agent.d.ts +25 -0
  171. package/dist/types/daemon/chat.d.ts +27 -0
  172. package/dist/types/daemon/env-snapshot.d.ts +1 -1
  173. package/dist/types/daemon/flow-context.d.ts +24 -3
  174. package/dist/types/daemon/launchd.d.ts +4 -0
  175. package/dist/types/daemon/process-registry.d.ts +73 -0
  176. package/dist/types/daemon/schtasks.d.ts +4 -0
  177. package/dist/types/daemon/server.d.ts +7 -1
  178. package/dist/types/daemon/summarize.d.ts +47 -5
  179. package/dist/types/daemon/systemd.d.ts +4 -0
  180. package/dist/types/flags.d.ts +1 -0
  181. package/dist/types/llm/attachments.d.ts +6 -0
  182. package/dist/types/llm/errors.d.ts +1 -0
  183. package/dist/types/llm/generate-text.d.ts +29 -13
  184. package/dist/types/llm/prompt.d.ts +7 -2
  185. package/dist/types/llm/providers/anthropic.d.ts +30 -0
  186. package/dist/types/llm/providers/google.d.ts +29 -0
  187. package/dist/types/llm/providers/models.d.ts +27 -0
  188. package/dist/types/llm/providers/openai.d.ts +38 -0
  189. package/dist/types/llm/providers/shared.d.ts +14 -0
  190. package/dist/types/llm/providers/types.d.ts +6 -0
  191. package/dist/types/llm/types.d.ts +5 -0
  192. package/dist/types/llm/usage.d.ts +5 -0
  193. package/dist/types/logging/daemon.d.ts +26 -0
  194. package/dist/types/logging/ring-file.d.ts +10 -0
  195. package/dist/types/media-cache.d.ts +22 -0
  196. package/dist/types/model-auto.d.ts +1 -0
  197. package/dist/types/processes.d.ts +1 -0
  198. package/dist/types/run/attachments.d.ts +9 -6
  199. package/dist/types/run/bird.d.ts +7 -0
  200. package/dist/types/run/constants.d.ts +0 -2
  201. package/dist/types/run/finish-line.d.ts +59 -1
  202. package/dist/types/run/flows/asset/extract.d.ts +18 -0
  203. package/dist/types/run/flows/asset/input.d.ts +12 -2
  204. package/dist/types/run/flows/asset/media-policy.d.ts +2 -0
  205. package/dist/types/run/flows/asset/media.d.ts +21 -0
  206. package/dist/types/run/flows/asset/output.d.ts +42 -0
  207. package/dist/types/run/flows/asset/preprocess.d.ts +22 -2
  208. package/dist/types/run/flows/asset/summary.d.ts +6 -0
  209. package/dist/types/run/flows/url/extract.d.ts +2 -1
  210. package/dist/types/run/flows/url/slides-output.d.ts +66 -0
  211. package/dist/types/run/flows/url/slides-text.d.ts +87 -0
  212. package/dist/types/run/flows/url/summary.d.ts +11 -3
  213. package/dist/types/run/flows/url/types.d.ts +29 -2
  214. package/dist/types/run/help.d.ts +3 -0
  215. package/dist/types/run/logging.d.ts +3 -2
  216. package/dist/types/run/media-cache-state.d.ts +7 -0
  217. package/dist/types/run/progress.d.ts +2 -1
  218. package/dist/types/run/run-context.d.ts +44 -0
  219. package/dist/types/run/run-settings.d.ts +62 -0
  220. package/dist/types/run/slides-cli.d.ts +9 -0
  221. package/dist/types/run/slides-render.d.ts +30 -0
  222. package/dist/types/run/stream-output.d.ts +12 -0
  223. package/dist/types/run/streaming.d.ts +10 -4
  224. package/dist/types/run/summary-engine.d.ts +15 -3
  225. package/dist/types/run/summary-llm.d.ts +2 -2
  226. package/dist/types/run/transcriber-cli.d.ts +8 -0
  227. package/dist/types/shared/sse-events.d.ts +64 -0
  228. package/dist/types/shared/streaming-merge.d.ts +4 -0
  229. package/dist/types/slides/extract.d.ts +42 -0
  230. package/dist/types/slides/index.d.ts +5 -0
  231. package/dist/types/slides/settings.d.ts +20 -0
  232. package/dist/types/slides/store.d.ts +15 -0
  233. package/dist/types/slides/types.d.ts +40 -0
  234. package/dist/types/tty/osc-progress.d.ts +2 -2
  235. package/dist/types/tty/progress/fetch-html.d.ts +3 -1
  236. package/dist/types/tty/progress/transcript.d.ts +3 -1
  237. package/dist/types/tty/spinner.d.ts +3 -1
  238. package/dist/types/tty/theme.d.ts +44 -0
  239. package/dist/types/tty/website-progress.d.ts +3 -1
  240. package/dist/types/version.d.ts +1 -1
  241. package/docs/README.md +13 -8
  242. package/docs/_config.yml +26 -0
  243. package/docs/_layouts/default.html +60 -0
  244. package/docs/agent.md +333 -0
  245. package/docs/assets/site.css +748 -0
  246. package/docs/assets/site.js +72 -0
  247. package/docs/assets/summarize-cli.png +0 -0
  248. package/docs/assets/summarize-extension.png +0 -0
  249. package/docs/assets/youtube-slides.png +0 -0
  250. package/docs/cache.md +29 -3
  251. package/docs/chrome-extension.md +85 -7
  252. package/docs/config.md +74 -2
  253. package/docs/extract-only.md +10 -2
  254. package/docs/index.html +205 -0
  255. package/docs/index.md +25 -0
  256. package/docs/language.md +1 -1
  257. package/docs/llm.md +17 -1
  258. package/docs/manual-tests.md +2 -0
  259. package/docs/media.md +37 -0
  260. package/docs/model-auto.md +2 -1
  261. package/docs/nvidia-onnx-transcription.md +55 -0
  262. package/docs/openai.md +5 -0
  263. package/docs/releasing.md +26 -0
  264. package/docs/site/assets/site.css +399 -228
  265. package/docs/site/assets/summarize-cli.png +0 -0
  266. package/docs/site/assets/summarize-extension.png +0 -0
  267. package/docs/site/docs/chrome-extension.html +89 -0
  268. package/docs/site/docs/config.html +1 -0
  269. package/docs/site/docs/extract-only.html +1 -0
  270. package/docs/site/docs/firecrawl.html +1 -0
  271. package/docs/site/docs/index.html +5 -0
  272. package/docs/site/docs/llm.html +1 -0
  273. package/docs/site/docs/openai.html +1 -0
  274. package/docs/site/docs/website.html +1 -0
  275. package/docs/site/docs/youtube.html +1 -0
  276. package/docs/site/index.html +148 -84
  277. package/docs/slides.md +74 -0
  278. package/docs/timestamps.md +103 -0
  279. package/docs/website.md +13 -0
  280. package/docs/youtube.md +16 -0
  281. package/package.json +22 -18
  282. package/dist/esm/daemon/request-settings.js +0 -91
  283. package/dist/esm/daemon/request-settings.js.map +0 -1
  284. package/dist/types/daemon/request-settings.d.ts +0 -27
@@ -0,0 +1,182 @@
1
+ import { parseDurationMs, parseFirecrawlMode, parseLengthArg, parseMarkdownMode, parseMaxOutputTokensArg, parsePreprocessMode, parseRetriesArg, parseVideoMode, parseYoutubeMode, } from '../flags.js';
2
+ import { resolveOutputLanguage } from '../language.js';
3
+ export function resolveSummaryLength(raw, fallback = 'xl') {
4
+ const value = typeof raw === 'string' ? raw.trim() : '';
5
+ const lengthArg = parseLengthArg(value || fallback);
6
+ const summaryLength = lengthArg.kind === 'preset' ? lengthArg.preset : { maxCharacters: lengthArg.maxCharacters };
7
+ return { lengthArg, summaryLength };
8
+ }
9
+ export function resolveOutputLanguageSetting({ raw, fallback, }) {
10
+ const value = typeof raw === 'string' ? raw.trim() : '';
11
+ if (!value)
12
+ return fallback;
13
+ return resolveOutputLanguage(value);
14
+ }
15
+ export function resolveCliRunSettings({ length, firecrawl, markdownMode, markdown, format, preprocess, youtube, timeout, retries, maxOutputTokens, }) {
16
+ const strictOverrides = resolveRunOverrides({
17
+ firecrawl,
18
+ markdownMode: format === 'markdown' ? (markdownMode ?? markdown ?? 'readability') : 'off',
19
+ preprocess,
20
+ youtube,
21
+ timeout,
22
+ retries,
23
+ maxOutputTokens,
24
+ }, { strict: true });
25
+ const requireOverride = (value, label) => {
26
+ if (value == null) {
27
+ throw new Error(`Missing ${label} override value.`);
28
+ }
29
+ return value;
30
+ };
31
+ return {
32
+ lengthArg: parseLengthArg(length),
33
+ firecrawlMode: requireOverride(strictOverrides.firecrawlMode, '--firecrawl'),
34
+ markdownMode: requireOverride(strictOverrides.markdownMode, '--markdown-mode'),
35
+ preprocessMode: requireOverride(strictOverrides.preprocessMode, '--preprocess'),
36
+ youtubeMode: requireOverride(strictOverrides.youtubeMode, '--youtube'),
37
+ timeoutMs: requireOverride(strictOverrides.timeoutMs, '--timeout'),
38
+ retries: requireOverride(strictOverrides.retries, '--retries'),
39
+ maxOutputTokensArg: strictOverrides.maxOutputTokensArg,
40
+ };
41
+ }
42
+ const parseOptionalSetting = (raw, parse, strict) => {
43
+ if (typeof raw !== 'string')
44
+ return null;
45
+ try {
46
+ return parse(raw);
47
+ }
48
+ catch (error) {
49
+ if (strict)
50
+ throw error;
51
+ return null;
52
+ }
53
+ };
54
+ const parseOptionalBoolean = (raw, strict) => {
55
+ if (typeof raw === 'boolean')
56
+ return raw;
57
+ if (typeof raw !== 'string')
58
+ return null;
59
+ const normalized = raw.trim().toLowerCase();
60
+ if (!normalized)
61
+ return null;
62
+ if (normalized === 'true' || normalized === '1' || normalized === 'yes' || normalized === 'on') {
63
+ return true;
64
+ }
65
+ if (normalized === 'false' || normalized === '0' || normalized === 'no' || normalized === 'off') {
66
+ return false;
67
+ }
68
+ if (strict) {
69
+ throw new Error(`Unsupported --timestamps: ${raw}`);
70
+ }
71
+ return null;
72
+ };
73
+ export function resolveRunOverrides({ firecrawl, markdownMode, preprocess, youtube, videoMode, timestamps, forceSummary, timeout, retries, maxOutputTokens, transcriber, }, options = {}) {
74
+ const strict = options.strict ?? false;
75
+ const timeoutMs = (() => {
76
+ if (typeof timeout === 'number') {
77
+ if (Number.isFinite(timeout) && timeout > 0) {
78
+ return Math.floor(timeout);
79
+ }
80
+ if (strict) {
81
+ throw new Error(`Unsupported --timeout: ${String(timeout)}`);
82
+ }
83
+ return null;
84
+ }
85
+ if (typeof timeout !== 'string')
86
+ return null;
87
+ try {
88
+ return parseDurationMs(timeout);
89
+ }
90
+ catch (error) {
91
+ if (strict)
92
+ throw error;
93
+ return null;
94
+ }
95
+ })();
96
+ const retriesResolved = (() => {
97
+ if (typeof retries === 'number') {
98
+ if (Number.isFinite(retries) && Number.isInteger(retries)) {
99
+ try {
100
+ return parseRetriesArg(String(retries));
101
+ }
102
+ catch (error) {
103
+ if (strict)
104
+ throw error;
105
+ return null;
106
+ }
107
+ }
108
+ if (strict) {
109
+ throw new Error(`Unsupported --retries: ${String(retries)}`);
110
+ }
111
+ return null;
112
+ }
113
+ if (typeof retries !== 'string')
114
+ return null;
115
+ try {
116
+ return parseRetriesArg(retries);
117
+ }
118
+ catch (error) {
119
+ if (strict)
120
+ throw error;
121
+ return null;
122
+ }
123
+ })();
124
+ const maxOutputTokensArg = (() => {
125
+ if (typeof maxOutputTokens === 'number') {
126
+ if (Number.isFinite(maxOutputTokens) && maxOutputTokens > 0) {
127
+ try {
128
+ return parseMaxOutputTokensArg(String(maxOutputTokens));
129
+ }
130
+ catch (error) {
131
+ if (strict)
132
+ throw error;
133
+ return null;
134
+ }
135
+ }
136
+ if (strict) {
137
+ throw new Error(`Unsupported --max-output-tokens: ${String(maxOutputTokens)}`);
138
+ }
139
+ return null;
140
+ }
141
+ if (typeof maxOutputTokens !== 'string')
142
+ return null;
143
+ try {
144
+ return parseMaxOutputTokensArg(maxOutputTokens);
145
+ }
146
+ catch (error) {
147
+ if (strict)
148
+ throw error;
149
+ return null;
150
+ }
151
+ })();
152
+ const transcriberOverride = (() => {
153
+ if (typeof transcriber !== 'string')
154
+ return null;
155
+ const normalized = transcriber.trim().toLowerCase();
156
+ if (normalized === 'auto' ||
157
+ normalized === 'whisper' ||
158
+ normalized === 'parakeet' ||
159
+ normalized === 'canary') {
160
+ return normalized;
161
+ }
162
+ if (strict) {
163
+ throw new Error(`Unsupported transcriber: ${transcriber}`);
164
+ }
165
+ return null;
166
+ })();
167
+ const forceSummaryResolved = parseOptionalBoolean(forceSummary, strict);
168
+ return {
169
+ firecrawlMode: parseOptionalSetting(firecrawl, parseFirecrawlMode, strict),
170
+ markdownMode: parseOptionalSetting(markdownMode, parseMarkdownMode, strict),
171
+ preprocessMode: parseOptionalSetting(preprocess, parsePreprocessMode, strict),
172
+ youtubeMode: parseOptionalSetting(youtube, parseYoutubeMode, strict),
173
+ videoMode: parseOptionalSetting(videoMode, parseVideoMode, strict),
174
+ transcriptTimestamps: parseOptionalBoolean(timestamps, strict),
175
+ forceSummary: forceSummaryResolved,
176
+ timeoutMs,
177
+ retries: retriesResolved,
178
+ maxOutputTokensArg,
179
+ transcriber: transcriberOverride,
180
+ };
181
+ }
182
+ //# sourceMappingURL=run-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-settings.js","sourceRoot":"","sources":["../../../src/run/run-settings.ts"],"names":[],"mappings":"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"}
@@ -3,25 +3,33 @@ import { readFile } from 'node:fs/promises';
3
3
  import { CommanderError } from 'commander';
4
4
  import { clearCacheFiles, DEFAULT_CACHE_MAX_MB, resolveCachePath, } from '../cache.js';
5
5
  import { loadSummarizeConfig } from '../config.js';
6
- import { parseDurationMs, parseExtractFormat, parseFirecrawlMode, parseLengthArg, parseMarkdownMode, parseMaxOutputTokensArg, parseMetricsMode, parsePreprocessMode, parseRetriesArg, parseStreamMode, parseYoutubeMode, } from '../flags.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';
7
9
  import { formatVersionLine } from '../version.js';
8
10
  import { createCacheStateFromConfig } from './cache-state.js';
9
11
  import { handleDaemonCliRequest, handleHelpRequest, handleRefreshFreeRequest, } from './cli-preflight.js';
10
12
  import { parseCliProviderArg } from './env.js';
11
- import { handleFileInput, handleUrlAsset } from './flows/asset/input.js';
13
+ import { extractAssetContent } from './flows/asset/extract.js';
14
+ import { handleFileInput, withUrlAsset } from './flows/asset/input.js';
15
+ import { summarizeMediaFile as summarizeMediaFileImpl } from './flows/asset/media.js';
16
+ import { outputExtractedAsset } from './flows/asset/output.js';
12
17
  import { summarizeAsset as summarizeAssetFlow } from './flows/asset/summary.js';
13
18
  import { runUrlFlow } from './flows/url/flow.js';
14
19
  import { attachRichHelp, buildProgram } from './help.js';
20
+ import { createMediaCacheFromConfig } from './media-cache-state.js';
15
21
  import { createProgressGate } from './progress.js';
16
- import { resolveConfigState } from './run-config.js';
17
- import { resolveEnvState } from './run-env.js';
22
+ import { resolveRunContextState } from './run-context.js';
18
23
  import { resolveRunInput } from './run-input.js';
19
24
  import { createRunMetrics } from './run-metrics.js';
20
25
  import { resolveModelSelection } from './run-models.js';
21
26
  import { resolveDesiredOutputTokens } from './run-output.js';
27
+ import { resolveCliRunSettings } from './run-settings.js';
22
28
  import { resolveStreamSettings } from './run-stream.js';
29
+ import { handleSlidesCliRequest } from './slides-cli.js';
23
30
  import { createSummaryEngine } from './summary-engine.js';
24
- import { ansi, isRichTty, supportsColor } from './terminal.js';
31
+ import { isRichTty, supportsColor } from './terminal.js';
32
+ import { handleTranscriberCliRequest } from './transcriber-cli.js';
25
33
  export async function runCli(argv, { env, fetch, execFile: execFileOverride, stdout, stderr }) {
26
34
  ;
27
35
  globalThis.AI_SDK_LOG_WARNINGS = false;
@@ -49,6 +57,23 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
49
57
  })) {
50
58
  return;
51
59
  }
60
+ if (await handleSlidesCliRequest({
61
+ normalizedArgv,
62
+ envForRun,
63
+ fetchImpl: fetch,
64
+ stdout,
65
+ stderr,
66
+ })) {
67
+ return;
68
+ }
69
+ if (await handleTranscriberCliRequest({
70
+ normalizedArgv,
71
+ envForRun,
72
+ stdout,
73
+ stderr,
74
+ })) {
75
+ return;
76
+ }
52
77
  const execFileImpl = execFileOverride ?? execFile;
53
78
  const program = buildProgram();
54
79
  program.configureOutput({
@@ -162,33 +187,45 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
162
187
  const inputTarget = inputResolution.inputTarget;
163
188
  const url = inputResolution.url;
164
189
  const runStartedAtMs = Date.now();
165
- const youtubeMode = parseYoutubeMode(program.opts().youtube);
166
190
  const videoModeExplicitlySet = normalizedArgv.some((arg) => arg === '--video-mode' || arg.startsWith('--video-mode='));
167
191
  const lengthExplicitlySet = normalizedArgv.some((arg) => arg === '--length' || arg.startsWith('--length='));
168
- const lengthArg = parseLengthArg(program.opts().length);
169
- const maxOutputTokensArg = parseMaxOutputTokensArg(program.opts().maxOutputTokens);
170
- const timeoutMs = parseDurationMs(program.opts().timeout);
171
192
  const languageExplicitlySet = normalizedArgv.some((arg) => arg === '--language' ||
172
193
  arg.startsWith('--language=') ||
173
194
  arg === '--lang' ||
174
195
  arg.startsWith('--lang='));
175
- const retries = parseRetriesArg(program.opts().retries);
176
196
  const noCacheFlag = program.opts().cache === false;
197
+ const noMediaCacheFlag = program.opts().mediaCache === false;
177
198
  const extractMode = Boolean(program.opts().extract) || Boolean(program.opts().extractOnly);
178
199
  const json = Boolean(program.opts().json);
200
+ const forceSummary = Boolean(program.opts().forceSummary);
201
+ const slidesDebug = Boolean(program.opts().slidesDebug);
179
202
  const streamMode = parseStreamMode(program.opts().stream);
180
203
  const plain = Boolean(program.opts().plain);
181
204
  const debug = Boolean(program.opts().debug);
182
205
  const verbose = Boolean(program.opts().verbose) || debug;
183
- if (extractMode && lengthExplicitlySet && !json && isRichTty(stderr)) {
184
- stderr.write('Warning: --length is ignored with --extract (no summary is generated).\n');
185
- }
186
- const metricsExplicitlySet = normalizedArgv.some((arg) => arg === '--metrics' || arg.startsWith('--metrics='));
187
- const metricsMode = parseMetricsMode(debug && !metricsExplicitlySet ? 'detailed' : program.opts().metrics);
188
- const metricsEnabled = metricsMode !== 'off';
189
- const metricsDetailed = metricsMode === 'detailed';
190
- const preprocessMode = parsePreprocessMode(program.opts().preprocess);
191
- const shouldComputeReport = metricsEnabled;
206
+ const normalizeTranscriber = (value) => {
207
+ if (typeof value !== 'string')
208
+ return null;
209
+ const normalized = value.trim().toLowerCase();
210
+ if (normalized === 'auto' ||
211
+ normalized === 'whisper' ||
212
+ normalized === 'parakeet' ||
213
+ normalized === 'canary')
214
+ return normalized;
215
+ return null;
216
+ };
217
+ const transcriberExplicitlySet = normalizedArgv.some((arg) => arg === '--transcriber' || arg.startsWith('--transcriber='));
218
+ const envTranscriber = envForRun?.SUMMARIZE_TRANSCRIBER ??
219
+ process.env.SUMMARIZE_TRANSCRIBER ??
220
+ null;
221
+ const transcriber = normalizeTranscriber(transcriberExplicitlySet ? program.opts().transcriber : envTranscriber) ??
222
+ 'auto';
223
+ envForRun.SUMMARIZE_TRANSCRIBER = transcriber;
224
+ const maxExtractCharacters = parseMaxExtractCharactersArg(typeof program.opts().maxExtractCharacters === 'string'
225
+ ? program.opts().maxExtractCharacters
226
+ : program.opts().maxExtractCharacters != null
227
+ ? String(program.opts().maxExtractCharacters)
228
+ : undefined);
192
229
  const isYoutubeUrl = typeof url === 'string' ? /youtube\.com|youtu\.be/i.test(url) : false;
193
230
  const formatExplicitlySet = normalizedArgv.some((arg) => arg === '--format' || arg.startsWith('--format='));
194
231
  const rawFormatOpt = typeof program.opts().format === 'string' ? program.opts().format : null;
@@ -197,17 +234,36 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
197
234
  : extractMode && inputTarget.kind === 'url' && !isYoutubeUrl
198
235
  ? 'md'
199
236
  : 'text');
237
+ const runSettings = resolveCliRunSettings({
238
+ length: String(program.opts().length),
239
+ firecrawl: String(program.opts().firecrawl),
240
+ markdownMode: typeof program.opts().markdownMode === 'string' ? program.opts().markdownMode : undefined,
241
+ markdown: typeof program.opts().markdown === 'string' ? program.opts().markdown : undefined,
242
+ format,
243
+ preprocess: String(program.opts().preprocess),
244
+ youtube: String(program.opts().youtube),
245
+ timeout: String(program.opts().timeout),
246
+ retries: String(program.opts().retries),
247
+ maxOutputTokens: typeof program.opts().maxOutputTokens === 'string'
248
+ ? program.opts().maxOutputTokens
249
+ : program.opts().maxOutputTokens != null
250
+ ? String(program.opts().maxOutputTokens)
251
+ : undefined,
252
+ });
253
+ const { youtubeMode, lengthArg, maxOutputTokensArg, timeoutMs, retries, preprocessMode, firecrawlMode: requestedFirecrawlMode, markdownMode, } = runSettings;
254
+ if (extractMode && lengthExplicitlySet && !json && isRichTty(stderr)) {
255
+ stderr.write('Warning: --length is ignored with --extract (no summary is generated).\n');
256
+ }
257
+ const metricsExplicitlySet = normalizedArgv.some((arg) => arg === '--metrics' || arg.startsWith('--metrics='));
258
+ const metricsMode = parseMetricsMode(debug && !metricsExplicitlySet ? 'detailed' : program.opts().metrics);
259
+ const metricsEnabled = metricsMode !== 'off';
260
+ const metricsDetailed = metricsMode === 'detailed';
261
+ const shouldComputeReport = metricsEnabled;
200
262
  const _firecrawlExplicitlySet = normalizedArgv.some((arg) => arg === '--firecrawl' || arg.startsWith('--firecrawl='));
201
263
  const markdownModeExplicitlySet = normalizedArgv.some((arg) => arg === '--markdown-mode' ||
202
264
  arg.startsWith('--markdown-mode=') ||
203
265
  arg === '--markdown' ||
204
266
  arg.startsWith('--markdown='));
205
- const markdownMode = format === 'markdown'
206
- ? parseMarkdownMode(program.opts().markdownMode ??
207
- program.opts().markdown ??
208
- 'readability')
209
- : 'off';
210
- const requestedFirecrawlMode = parseFirecrawlMode(program.opts().firecrawl);
211
267
  const modelArg = typeof program.opts().model === 'string' ? program.opts().model : null;
212
268
  const cliProviderArg = typeof cliProviderArgRaw === 'string' && cliProviderArgRaw.trim().length > 0
213
269
  ? parseCliProviderArg(cliProviderArgRaw)
@@ -220,7 +276,8 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
220
276
  : cliFlagPresent
221
277
  ? 'auto'
222
278
  : modelArg;
223
- const { config, configPath, outputLanguage, openaiWhisperUsdPerMinute, videoMode, cliConfigForRun, configForCli, openaiUseChatCompletions, configModelLabel, } = resolveConfigState({
279
+ const { config, configPath, outputLanguage, openaiWhisperUsdPerMinute, videoMode, cliConfigForRun, configForCli, openaiUseChatCompletions, configModelLabel, apiKey, openrouterApiKey, openrouterConfigured, openaiTranscriptionKey, xaiApiKey, googleApiKey, anthropicApiKey, zaiApiKey, zaiBaseUrl, providerBaseUrls, firecrawlApiKey, firecrawlConfigured, googleConfigured, anthropicConfigured, apifyToken, ytDlpPath, falApiKey, cliAvailability, envForAuto, } = resolveRunContextState({
280
+ env,
224
281
  envForRun,
225
282
  programOpts: program.opts(),
226
283
  languageExplicitlySet,
@@ -228,9 +285,48 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
228
285
  cliFlagPresent,
229
286
  cliProviderArg,
230
287
  });
288
+ const themeName = resolveThemeNameFromSources({
289
+ cli: program.opts().theme,
290
+ env: envForRun.SUMMARIZE_THEME,
291
+ config: config?.ui?.theme,
292
+ });
293
+ envForRun.SUMMARIZE_THEME = themeName;
231
294
  if (!promptOverride && typeof config?.prompt === 'string' && config.prompt.trim().length > 0) {
232
295
  promptOverride = config.prompt.trim();
233
296
  }
297
+ const slidesExplicitlySet = normalizedArgv.some((arg) => arg === '--slides' || arg === '--no-slides' || arg.startsWith('--slides='));
298
+ const slidesOcrExplicitlySet = normalizedArgv.some((arg) => arg === '--slides-ocr' || arg === '--no-slides-ocr' || arg.startsWith('--slides-ocr='));
299
+ const slidesDirExplicitlySet = normalizedArgv.some((arg) => arg === '--slides-dir' || arg.startsWith('--slides-dir='));
300
+ const slidesSceneThresholdExplicitlySet = normalizedArgv.some((arg) => arg === '--slides-scene-threshold' || arg.startsWith('--slides-scene-threshold='));
301
+ const slidesMaxExplicitlySet = normalizedArgv.some((arg) => arg === '--slides-max' || arg.startsWith('--slides-max='));
302
+ const slidesMinDurationExplicitlySet = normalizedArgv.some((arg) => arg === '--slides-min-duration' || arg.startsWith('--slides-min-duration='));
303
+ const slidesConfig = config?.slides;
304
+ const slidesSettings = resolveSlideSettings({
305
+ slides: slidesExplicitlySet
306
+ ? program.opts().slides
307
+ : (slidesConfig?.enabled ?? program.opts().slides),
308
+ slidesOcr: slidesOcrExplicitlySet
309
+ ? program.opts().slidesOcr
310
+ : (slidesConfig?.ocr ?? program.opts().slidesOcr),
311
+ slidesDir: slidesDirExplicitlySet
312
+ ? program.opts().slidesDir
313
+ : (slidesConfig?.dir ?? program.opts().slidesDir),
314
+ slidesSceneThreshold: slidesSceneThresholdExplicitlySet
315
+ ? program.opts().slidesSceneThreshold
316
+ : (slidesConfig?.sceneThreshold ?? program.opts().slidesSceneThreshold),
317
+ slidesSceneThresholdExplicit: slidesSceneThresholdExplicitlySet || typeof slidesConfig?.sceneThreshold === 'number',
318
+ slidesMax: slidesMaxExplicitlySet
319
+ ? program.opts().slidesMax
320
+ : (slidesConfig?.max ?? program.opts().slidesMax),
321
+ slidesMinDuration: slidesMinDurationExplicitlySet
322
+ ? program.opts().slidesMinDuration
323
+ : (slidesConfig?.minDuration ?? program.opts().slidesMinDuration),
324
+ cwd: process.cwd(),
325
+ });
326
+ if (slidesSettings && inputTarget.kind !== 'url') {
327
+ throw new Error('--slides is only supported for URL inputs');
328
+ }
329
+ const transcriptTimestamps = Boolean(program.opts().timestamps) || Boolean(slidesSettings);
234
330
  const lengthInstruction = promptOverride && lengthExplicitlySet && lengthArg.kind === 'chars'
235
331
  ? `Output is ${lengthArg.maxCharacters.toLocaleString()} characters.`
236
332
  : null;
@@ -241,11 +337,15 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
241
337
  const cacheState = await createCacheStateFromConfig({
242
338
  envForRun,
243
339
  config,
244
- noCacheFlag,
340
+ noCacheFlag: false,
245
341
  transcriptNamespace,
246
342
  });
343
+ const mediaCache = await createMediaCacheFromConfig({
344
+ envForRun,
345
+ config,
346
+ noMediaCacheFlag,
347
+ });
247
348
  try {
248
- const { apiKey, openrouterApiKey, openrouterConfigured, openaiTranscriptionKey, xaiApiKey, googleApiKey, anthropicApiKey, zaiApiKey, zaiBaseUrl, providerBaseUrls, firecrawlApiKey, firecrawlConfigured, googleConfigured, anthropicConfigured, apifyToken, ytDlpPath, falApiKey, cliAvailability, envForAuto, } = resolveEnvState({ env, envForRun, configForCli });
249
349
  if (markdownModeExplicitlySet && format !== 'markdown') {
250
350
  throw new Error('--markdown-mode is only supported with --format md');
251
351
  }
@@ -266,6 +366,13 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
266
366
  explicitModelArg,
267
367
  });
268
368
  const verboseColor = supportsColor(stderr, envForRun);
369
+ const themeForStderr = createThemeRenderer({
370
+ themeName,
371
+ enabled: verboseColor,
372
+ trueColor: resolveTrueColor(envForRun),
373
+ });
374
+ const renderSpinnerStatus = (label, detail = '…') => `${themeForStderr.label(label)}${themeForStderr.dim(detail)}`;
375
+ const renderSpinnerStatusWithModel = (label, modelId) => `${themeForStderr.label(label)}${themeForStderr.dim(' (model: ')}${themeForStderr.accent(modelId)}${themeForStderr.dim(')…')}`;
269
376
  const { streamingEnabled } = resolveStreamSettings({
270
377
  streamMode,
271
378
  stdout,
@@ -279,7 +386,7 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
279
386
  // streaming output), we stop + clear progress via the progress gate to keep scrollback clean.
280
387
  const progressEnabled = isRichTty(stderr) && !verbose && !json;
281
388
  const progressGate = createProgressGate();
282
- const { clearProgressForStdout, setClearProgressBeforeStdout, clearProgressIfCurrent } = progressGate;
389
+ const { clearProgressForStdout, restoreProgressAfterStdout, setClearProgressBeforeStdout, clearProgressIfCurrent, } = progressGate;
283
390
  const fixedModelSpec = requestedModel.kind === 'fixed' ? requestedModel : null;
284
391
  const desiredOutputTokens = resolveDesiredOutputTokens({ lengthArg, maxOutputTokensArg });
285
392
  const summaryEngine = createSummaryEngine({
@@ -302,6 +409,7 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
302
409
  resolveMaxInputTokensForCall,
303
410
  llmCalls,
304
411
  clearProgressForStdout,
412
+ restoreProgressAfterStdout,
305
413
  apiKeys: {
306
414
  xaiApiKey,
307
415
  openaiApiKey: apiKey,
@@ -329,7 +437,8 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
329
437
  if (filtered.length === 0)
330
438
  return;
331
439
  clearProgressForStdout();
332
- stderr.write(`${ansi('2', `via ${filtered.join(', ')}`, verboseColor)}\n`);
440
+ stderr.write(`${themeForStderr.dim(`via ${filtered.join(', ')}`)}\n`);
441
+ restoreProgressAfterStdout?.();
333
442
  };
334
443
  const assetSummaryContext = {
335
444
  env,
@@ -340,7 +449,9 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
340
449
  timeoutMs,
341
450
  preprocessMode,
342
451
  format,
452
+ extractMode,
343
453
  lengthArg,
454
+ forceSummary,
344
455
  outputLanguage,
345
456
  videoMode,
346
457
  fixedModelSpec,
@@ -371,11 +482,14 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
371
482
  trackedFetch,
372
483
  writeViaFooter,
373
484
  clearProgressForStdout,
485
+ restoreProgressAfterStdout,
374
486
  getLiteLlmCatalog,
375
487
  buildReport,
376
488
  estimateCostUsd,
377
489
  llmCalls,
378
490
  cache: cacheState,
491
+ summaryCacheBypass: noCacheFlag,
492
+ mediaCache,
379
493
  apiStatus: {
380
494
  xaiApiKey,
381
495
  apiKey,
@@ -390,20 +504,86 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
390
504
  },
391
505
  };
392
506
  const summarizeAsset = (args) => summarizeAssetFlow(assetSummaryContext, args);
507
+ const summarizeMediaFile = (args) => summarizeMediaFileImpl(assetSummaryContext, args);
393
508
  const assetInputContext = {
394
509
  env,
510
+ envForRun,
395
511
  stderr,
396
512
  progressEnabled,
397
513
  timeoutMs,
398
514
  trackedFetch,
399
515
  summarizeAsset,
516
+ summarizeMediaFile,
400
517
  setClearProgressBeforeStdout,
401
518
  clearProgressIfCurrent,
402
519
  };
403
520
  if (await handleFileInput(assetInputContext, inputTarget)) {
404
521
  return;
405
522
  }
406
- if (url && (await handleUrlAsset(assetInputContext, url, isYoutubeUrl))) {
523
+ if (url &&
524
+ (await withUrlAsset(assetInputContext, url, isYoutubeUrl, async ({ loaded, spinner }) => {
525
+ if (extractMode) {
526
+ if (progressEnabled)
527
+ spinner.setText(renderSpinnerStatus('Extracting text'));
528
+ const extracted = await extractAssetContent({
529
+ ctx: {
530
+ env,
531
+ envForRun,
532
+ execFileImpl,
533
+ timeoutMs,
534
+ preprocessMode,
535
+ },
536
+ attachment: loaded.attachment,
537
+ });
538
+ await outputExtractedAsset({
539
+ io: { env, envForRun, stdout, stderr },
540
+ flags: {
541
+ timeoutMs,
542
+ preprocessMode,
543
+ format,
544
+ plain,
545
+ json,
546
+ metricsEnabled,
547
+ metricsDetailed,
548
+ shouldComputeReport,
549
+ runStartedAtMs,
550
+ verboseColor,
551
+ },
552
+ hooks: {
553
+ clearProgressForStdout,
554
+ restoreProgressAfterStdout,
555
+ buildReport,
556
+ estimateCostUsd,
557
+ },
558
+ url,
559
+ sourceLabel: loaded.sourceLabel,
560
+ attachment: loaded.attachment,
561
+ extracted,
562
+ apiStatus: {
563
+ xaiApiKey,
564
+ apiKey,
565
+ openrouterApiKey,
566
+ apifyToken,
567
+ firecrawlConfigured,
568
+ googleConfigured,
569
+ anthropicConfigured,
570
+ },
571
+ });
572
+ return;
573
+ }
574
+ if (progressEnabled)
575
+ spinner.setText(renderSpinnerStatus('Summarizing'));
576
+ await summarizeAsset({
577
+ sourceKind: 'asset-url',
578
+ sourceLabel: loaded.sourceLabel,
579
+ attachment: loaded.attachment,
580
+ onModelChosen: (modelId) => {
581
+ if (!progressEnabled)
582
+ return;
583
+ spinner.setText(renderSpinnerStatusWithModel('Summarizing', modelId));
584
+ },
585
+ });
586
+ }))) {
407
587
  return;
408
588
  }
409
589
  if (!url) {
@@ -420,7 +600,7 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
420
600
  },
421
601
  flags: {
422
602
  timeoutMs,
423
- maxExtractCharacters: null,
603
+ maxExtractCharacters: extractMode ? maxExtractCharacters : null,
424
604
  retries,
425
605
  format,
426
606
  markdownMode,
@@ -428,11 +608,14 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
428
608
  youtubeMode,
429
609
  firecrawlMode: requestedFirecrawlMode,
430
610
  videoMode,
611
+ transcriptTimestamps,
431
612
  outputLanguage,
432
613
  lengthArg,
614
+ forceSummary,
433
615
  promptOverride,
434
616
  lengthInstruction,
435
617
  languageInstruction,
618
+ summaryCacheBypass: noCacheFlag,
436
619
  maxOutputTokensArg,
437
620
  json,
438
621
  extractMode,
@@ -443,10 +626,14 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
443
626
  verbose,
444
627
  verboseColor,
445
628
  progressEnabled,
629
+ streamMode,
446
630
  streamingEnabled,
447
631
  plain,
448
632
  configPath,
449
633
  configModelLabel,
634
+ slides: slidesSettings,
635
+ slidesDebug,
636
+ slidesOutput: true,
450
637
  },
451
638
  model: {
452
639
  requestedModel,
@@ -486,19 +673,25 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
486
673
  llmCalls,
487
674
  },
488
675
  cache: cacheState,
676
+ mediaCache,
489
677
  hooks: {
490
678
  onModelChosen: null,
491
679
  onExtracted: null,
680
+ onSlidesExtracted: null,
681
+ onSlidesProgress: null,
492
682
  onLinkPreviewProgress: null,
493
683
  onSummaryCached: null,
494
684
  setTranscriptionCost,
495
685
  summarizeAsset,
496
686
  writeViaFooter,
497
687
  clearProgressForStdout,
688
+ restoreProgressAfterStdout,
498
689
  setClearProgressBeforeStdout,
499
690
  clearProgressIfCurrent,
500
691
  buildReport,
501
692
  estimateCostUsd,
693
+ onSlideChunk: undefined,
694
+ onSlidesDone: null,
502
695
  },
503
696
  };
504
697
  await runUrlFlow({ ctx: urlFlowContext, url, isYoutubeUrl });