@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
@@ -1,15 +1,18 @@
1
1
  import type { ExtractedLinkContent } from '../../../content/index.js';
2
2
  import type { UrlExtractionUi } from './extract.js';
3
+ import type { SlidesTerminalOutput } from './slides-output.js';
3
4
  import type { UrlFlowContext } from './types.js';
4
- export declare function buildUrlPrompt({ extracted, outputLanguage, lengthArg, promptOverride, lengthInstruction, languageInstruction, }: {
5
+ type SlidesResult = Awaited<ReturnType<typeof import('../../../slides/index.js').extractSlidesForSource>>;
6
+ export declare function buildUrlPrompt({ extracted, outputLanguage, lengthArg, promptOverride, lengthInstruction, languageInstruction, slides, }: {
5
7
  extracted: ExtractedLinkContent;
6
8
  outputLanguage: UrlFlowContext['flags']['outputLanguage'];
7
9
  lengthArg: UrlFlowContext['flags']['lengthArg'];
8
10
  promptOverride?: string | null;
9
11
  lengthInstruction?: string | null;
10
12
  languageInstruction?: string | null;
13
+ slides?: SlidesResult | null;
11
14
  }): string;
12
- export declare function outputExtractedUrl({ ctx, url, extracted, extractionUi, prompt, effectiveMarkdownMode, transcriptionCostLabel, }: {
15
+ export declare function outputExtractedUrl({ ctx, url, extracted, extractionUi, prompt, effectiveMarkdownMode, transcriptionCostLabel, slides, slidesOutput, }: {
13
16
  ctx: UrlFlowContext;
14
17
  url: string;
15
18
  extracted: ExtractedLinkContent;
@@ -17,8 +20,10 @@ export declare function outputExtractedUrl({ ctx, url, extracted, extractionUi,
17
20
  prompt: string;
18
21
  effectiveMarkdownMode: 'off' | 'auto' | 'llm' | 'readability';
19
22
  transcriptionCostLabel: string | null;
23
+ slides?: Awaited<ReturnType<typeof import('../../../slides/index.js').extractSlidesForSource>> | null;
24
+ slidesOutput?: SlidesTerminalOutput | null;
20
25
  }): Promise<void>;
21
- export declare function summarizeExtractedUrl({ ctx, url, extracted, extractionUi, prompt, effectiveMarkdownMode, transcriptionCostLabel, onModelChosen, }: {
26
+ export declare function summarizeExtractedUrl({ ctx, url, extracted, extractionUi, prompt, effectiveMarkdownMode, transcriptionCostLabel, onModelChosen, slides, slidesOutput, }: {
22
27
  ctx: UrlFlowContext;
23
28
  url: string;
24
29
  extracted: ExtractedLinkContent;
@@ -27,4 +32,7 @@ export declare function summarizeExtractedUrl({ ctx, url, extracted, extractionU
27
32
  effectiveMarkdownMode: 'off' | 'auto' | 'llm' | 'readability';
28
33
  transcriptionCostLabel: string | null;
29
34
  onModelChosen?: ((modelId: string) => void) | null;
35
+ slides?: Awaited<ReturnType<typeof import('../../../slides/index.js').extractSlidesForSource>> | null;
36
+ slidesOutput?: SlidesTerminalOutput | null;
30
37
  }): Promise<void>;
38
+ export {};
@@ -1,11 +1,13 @@
1
1
  import type { CacheState } from '../../../cache.js';
2
2
  import type { SummarizeConfig } from '../../../config.js';
3
- import type { ExtractedLinkContent, LinkPreviewProgressEvent } from '../../../content/index.js';
3
+ import type { ExtractedLinkContent, LinkPreviewProgressEvent, MediaCache } from '../../../content/index.js';
4
4
  import type { LlmCall, RunMetricsReport } from '../../../costs.js';
5
+ import type { StreamMode } from '../../../flags.js';
5
6
  import type { OutputLanguage } from '../../../language.js';
6
7
  import type { ExecFileFn } from '../../../markitdown.js';
7
8
  import type { FixedModelSpec, RequestedModel } from '../../../model-spec.js';
8
9
  import type { SummaryLength } from '../../../shared/contracts.js';
10
+ import type { SlideExtractionResult, SlideImage, SlideSettings, SlideSourceKind } from '../../../slides/index.js';
9
11
  import type { createSummaryEngine } from '../../summary-engine.js';
10
12
  import type { SummarizeAssetArgs } from '../asset/summary.js';
11
13
  export type UrlFlowIo = {
@@ -26,6 +28,7 @@ export type UrlFlowFlags = {
26
28
  youtubeMode: 'auto' | 'web' | 'yt-dlp' | 'apify' | 'no-auto';
27
29
  firecrawlMode: 'off' | 'auto' | 'always';
28
30
  videoMode: 'auto' | 'transcript' | 'understand';
31
+ transcriptTimestamps: boolean;
29
32
  outputLanguage: OutputLanguage;
30
33
  lengthArg: {
31
34
  kind: 'preset';
@@ -34,9 +37,11 @@ export type UrlFlowFlags = {
34
37
  kind: 'chars';
35
38
  maxCharacters: number;
36
39
  };
40
+ forceSummary: boolean;
37
41
  promptOverride?: string | null;
38
42
  lengthInstruction?: string | null;
39
43
  languageInstruction?: string | null;
44
+ summaryCacheBypass: boolean;
40
45
  maxOutputTokensArg: number | null;
41
46
  json: boolean;
42
47
  extractMode: boolean;
@@ -47,10 +52,14 @@ export type UrlFlowFlags = {
47
52
  verbose: boolean;
48
53
  verboseColor: boolean;
49
54
  progressEnabled: boolean;
55
+ streamMode: StreamMode;
50
56
  streamingEnabled: boolean;
51
57
  plain: boolean;
52
58
  configPath: string | null;
53
59
  configModelLabel: string | null;
60
+ slides: SlideSettings | null;
61
+ slidesDebug: boolean;
62
+ slidesOutput?: boolean;
54
63
  };
55
64
  export type UrlFlowModel = {
56
65
  requestedModel: RequestedModel;
@@ -97,13 +106,30 @@ export type UrlFlowModel = {
97
106
  export type UrlFlowHooks = {
98
107
  onModelChosen?: ((modelId: string) => void) | null;
99
108
  onExtracted?: ((extracted: ExtractedLinkContent) => void) | null;
109
+ onSlidesExtracted?: ((slides: SlideExtractionResult) => void) | null;
110
+ onSlidesProgress?: ((text: string) => void) | null;
111
+ onSlidesDone?: ((result: {
112
+ ok: boolean;
113
+ error?: string | null;
114
+ }) => void) | null;
115
+ onSlideChunk?: (chunk: {
116
+ slide: SlideImage;
117
+ meta: {
118
+ slidesDir: string;
119
+ sourceUrl: string;
120
+ sourceId: string;
121
+ sourceKind: SlideSourceKind;
122
+ ocrAvailable: boolean;
123
+ };
124
+ }) => void;
100
125
  onLinkPreviewProgress?: ((event: LinkPreviewProgressEvent) => void) | null;
101
126
  onSummaryCached?: ((cached: boolean) => void) | null;
102
127
  setTranscriptionCost: (costUsd: number | null, label: string | null) => void;
103
128
  summarizeAsset: (args: SummarizeAssetArgs) => Promise<void>;
104
129
  writeViaFooter: (parts: string[]) => void;
105
130
  clearProgressForStdout: () => void;
106
- setClearProgressBeforeStdout: (fn: (() => void) | null) => void;
131
+ restoreProgressAfterStdout?: (() => void) | null;
132
+ setClearProgressBeforeStdout: (fn: (() => undefined | (() => void)) | null) => void;
107
133
  clearProgressIfCurrent: (fn: () => void) => void;
108
134
  buildReport: () => Promise<RunMetricsReport>;
109
135
  estimateCostUsd: () => Promise<number | null>;
@@ -118,5 +144,6 @@ export type UrlFlowContext = {
118
144
  flags: UrlFlowFlags;
119
145
  model: UrlFlowModel;
120
146
  cache: CacheState;
147
+ mediaCache: MediaCache | null;
121
148
  hooks: UrlFlowHooks;
122
149
  };
@@ -1,6 +1,9 @@
1
1
  import { Command } from 'commander';
2
2
  export declare function buildProgram(): Command;
3
+ export declare function applyHelpStyle(program: Command, env: Record<string, string | undefined>, stdout: NodeJS.WritableStream): void;
4
+ export declare function buildSlidesProgram(): Command;
3
5
  export declare function attachRichHelp(program: Command, env: Record<string, string | undefined>, stdout: NodeJS.WritableStream): void;
4
6
  export declare function buildConciseHelp(): string;
5
7
  export declare function buildRefreshFreeHelp(): string;
6
8
  export declare function buildDaemonHelp(): string;
9
+ export declare function buildTranscriberHelp(): string;
@@ -1,9 +1,10 @@
1
- export declare function writeVerbose(stderr: NodeJS.WritableStream, verbose: boolean, message: string, color: boolean): void;
2
- export declare function createRetryLogger({ stderr, verbose, color, modelId, }: {
1
+ export declare function writeVerbose(stderr: NodeJS.WritableStream, verbose: boolean, message: string, color: boolean, env?: Record<string, string | undefined>): void;
2
+ export declare function createRetryLogger({ stderr, verbose, color, modelId, env, }: {
3
3
  stderr: NodeJS.WritableStream;
4
4
  verbose: boolean;
5
5
  color: boolean;
6
6
  modelId: string;
7
+ env?: Record<string, string | undefined>;
7
8
  }): (notice: {
8
9
  attempt: number;
9
10
  maxRetries: number;
@@ -0,0 +1,7 @@
1
+ import type { SummarizeConfig } from '../config.js';
2
+ import type { MediaCache } from '../content/index.js';
3
+ export declare function createMediaCacheFromConfig({ envForRun, config, noMediaCacheFlag, }: {
4
+ envForRun: Record<string, string | undefined>;
5
+ config: SummarizeConfig | null;
6
+ noMediaCacheFlag?: boolean;
7
+ }): Promise<MediaCache | null>;
@@ -1,6 +1,7 @@
1
1
  export type ProgressGate = {
2
- setClearProgressBeforeStdout: (fn: (() => void) | null) => void;
2
+ setClearProgressBeforeStdout: (fn: (() => undefined | (() => void)) | null) => void;
3
3
  clearProgressForStdout: () => void;
4
+ restoreProgressAfterStdout: () => void;
4
5
  clearProgressIfCurrent: (fn: () => void) => void;
5
6
  };
6
7
  export declare function createProgressGate(): ProgressGate;
@@ -0,0 +1,44 @@
1
+ import type { CliProvider } from '../config.js';
2
+ export declare function resolveRunContextState({ env, envForRun, programOpts, languageExplicitlySet, videoModeExplicitlySet, cliFlagPresent, cliProviderArg, }: {
3
+ env: Record<string, string | undefined>;
4
+ envForRun: Record<string, string | undefined>;
5
+ programOpts: Record<string, unknown>;
6
+ languageExplicitlySet: boolean;
7
+ videoModeExplicitlySet: boolean;
8
+ cliFlagPresent: boolean;
9
+ cliProviderArg: CliProvider | null;
10
+ }): {
11
+ apiKey: string | null;
12
+ openrouterApiKey: string | null;
13
+ openrouterConfigured: boolean;
14
+ openaiTranscriptionKey: string | null;
15
+ xaiApiKey: string | null;
16
+ googleApiKey: string | null;
17
+ anthropicApiKey: string | null;
18
+ zaiApiKey: string | null;
19
+ zaiBaseUrl: string;
20
+ firecrawlApiKey: string | null;
21
+ firecrawlConfigured: boolean;
22
+ googleConfigured: boolean;
23
+ anthropicConfigured: boolean;
24
+ apifyToken: string | null;
25
+ ytDlpPath: string | null;
26
+ falApiKey: string | null;
27
+ cliAvailability: Partial<Record<CliProvider, boolean>>;
28
+ envForAuto: Record<string, string | undefined>;
29
+ providerBaseUrls: {
30
+ openai: string | null;
31
+ anthropic: string | null;
32
+ google: string | null;
33
+ xai: string | null;
34
+ };
35
+ config: import("../config.js").SummarizeConfig | null;
36
+ configPath: string | null;
37
+ outputLanguage: import("@steipete/summarize-core/language").OutputLanguage;
38
+ openaiWhisperUsdPerMinute: number;
39
+ videoMode: ReturnType<typeof import("../flags.js").parseVideoMode>;
40
+ cliConfigForRun: import("../config.js").SummarizeConfig["cli"] | undefined;
41
+ configForCli: import("../config.js").SummarizeConfig | null;
42
+ openaiUseChatCompletions: boolean;
43
+ configModelLabel: string | null;
44
+ };
@@ -0,0 +1,62 @@
1
+ import type { FirecrawlMode, LengthArg, MarkdownMode, PreprocessMode, VideoMode, YoutubeMode } from '../flags.js';
2
+ import type { OutputLanguage } from '../language.js';
3
+ import type { SummaryLengthTarget } from '../prompts/index.js';
4
+ export type ResolvedRunSettings = {
5
+ lengthArg: LengthArg;
6
+ firecrawlMode: FirecrawlMode;
7
+ markdownMode: MarkdownMode;
8
+ preprocessMode: PreprocessMode;
9
+ youtubeMode: YoutubeMode;
10
+ timeoutMs: number;
11
+ retries: number;
12
+ maxOutputTokensArg: number | null;
13
+ };
14
+ export type RunOverrides = {
15
+ firecrawlMode: FirecrawlMode | null;
16
+ markdownMode: MarkdownMode | null;
17
+ preprocessMode: PreprocessMode | null;
18
+ youtubeMode: YoutubeMode | null;
19
+ videoMode: VideoMode | null;
20
+ transcriptTimestamps: boolean | null;
21
+ forceSummary: boolean | null;
22
+ timeoutMs: number | null;
23
+ retries: number | null;
24
+ maxOutputTokensArg: number | null;
25
+ transcriber: 'auto' | 'whisper' | 'parakeet' | 'canary' | null;
26
+ };
27
+ export type RunOverridesInput = {
28
+ firecrawl?: unknown;
29
+ markdownMode?: unknown;
30
+ preprocess?: unknown;
31
+ youtube?: unknown;
32
+ videoMode?: unknown;
33
+ timestamps?: unknown;
34
+ forceSummary?: unknown;
35
+ timeout?: unknown;
36
+ retries?: unknown;
37
+ maxOutputTokens?: unknown;
38
+ transcriber?: unknown;
39
+ };
40
+ export declare function resolveSummaryLength(raw: unknown, fallback?: string): {
41
+ lengthArg: LengthArg;
42
+ summaryLength: SummaryLengthTarget;
43
+ };
44
+ export declare function resolveOutputLanguageSetting({ raw, fallback, }: {
45
+ raw: unknown;
46
+ fallback: OutputLanguage;
47
+ }): OutputLanguage;
48
+ export declare function resolveCliRunSettings({ length, firecrawl, markdownMode, markdown, format, preprocess, youtube, timeout, retries, maxOutputTokens, }: {
49
+ length: string;
50
+ firecrawl: string;
51
+ markdownMode?: string | undefined;
52
+ markdown?: string | undefined;
53
+ format: 'text' | 'markdown';
54
+ preprocess: string;
55
+ youtube: string;
56
+ timeout: string;
57
+ retries: string;
58
+ maxOutputTokens?: string | undefined;
59
+ }): ResolvedRunSettings;
60
+ export declare function resolveRunOverrides({ firecrawl, markdownMode, preprocess, youtube, videoMode, timestamps, forceSummary, timeout, retries, maxOutputTokens, transcriber, }: RunOverridesInput, options?: {
61
+ strict?: boolean;
62
+ }): RunOverrides;
@@ -0,0 +1,9 @@
1
+ type SlidesCliContext = {
2
+ normalizedArgv: string[];
3
+ envForRun: Record<string, string | undefined>;
4
+ fetchImpl: typeof fetch;
5
+ stdout: NodeJS.WritableStream;
6
+ stderr: NodeJS.WritableStream;
7
+ };
8
+ export declare function handleSlidesCliRequest({ normalizedArgv, envForRun, stdout, stderr, }: SlidesCliContext): Promise<boolean>;
9
+ export {};
@@ -0,0 +1,30 @@
1
+ import type { SlideImage } from '../slides/types.js';
2
+ export type SlidesRenderMode = 'none' | 'auto' | 'kitty' | 'iterm';
3
+ export type InlineProtocol = 'none' | 'kitty' | 'iterm';
4
+ type RenderSlide = Pick<SlideImage, 'imagePath' | 'index' | 'timestamp'>;
5
+ export declare function renderSlidesInline({ slides, mode, env, stdout, labelForSlide, }: {
6
+ slides: RenderSlide[];
7
+ mode: SlidesRenderMode;
8
+ env: Record<string, string | undefined>;
9
+ stdout: NodeJS.WritableStream;
10
+ labelForSlide?: ((slide: RenderSlide) => string) | null;
11
+ }): Promise<{
12
+ rendered: number;
13
+ protocol: InlineProtocol;
14
+ }>;
15
+ export declare function createSlidesInlineRenderer({ mode, env, stdout, }: {
16
+ mode: SlidesRenderMode;
17
+ env: Record<string, string | undefined>;
18
+ stdout: NodeJS.WritableStream;
19
+ }): {
20
+ protocol: InlineProtocol;
21
+ renderSlide: (slide: RenderSlide, label?: string | null) => Promise<boolean>;
22
+ renderSlides: (args: {
23
+ slides: RenderSlide[];
24
+ labelForSlide?: ((slide: RenderSlide) => string) | null;
25
+ }) => Promise<{
26
+ rendered: number;
27
+ protocol: InlineProtocol;
28
+ }>;
29
+ };
30
+ export {};
@@ -0,0 +1,12 @@
1
+ export type StreamOutputMode = 'line' | 'delta';
2
+ export declare function createStreamOutputGate({ stdout, clearProgressForStdout, restoreProgressAfterStdout, outputMode, richTty, }: {
3
+ stdout: NodeJS.WritableStream;
4
+ clearProgressForStdout: () => void;
5
+ restoreProgressAfterStdout?: (() => void) | null;
6
+ outputMode: StreamOutputMode;
7
+ richTty: boolean;
8
+ }): {
9
+ handleChunk: (streamed: string, prevStreamed: string) => void;
10
+ finalize: (finalText: string) => void;
11
+ getFlushedLen: () => number;
12
+ };
@@ -1,6 +1,12 @@
1
- export declare function mergeStreamingChunk(previous: string, chunk: string): {
2
- next: string;
3
- appended: string;
4
- };
1
+ export { mergeStreamingChunk } from '../shared/streaming-merge.js';
5
2
  export declare function isGoogleStreamingUnsupportedError(error: unknown): boolean;
6
3
  export declare function isStreamingTimeoutError(error: unknown): boolean;
4
+ export declare function canStream({ provider, prompt, transport, }: {
5
+ provider: 'xai' | 'openai' | 'google' | 'anthropic' | 'zai';
6
+ prompt: {
7
+ attachments?: Array<{
8
+ kind: 'text' | 'image' | 'document';
9
+ }>;
10
+ };
11
+ transport: 'cli' | 'native' | 'openrouter';
12
+ }): boolean;
@@ -1,6 +1,7 @@
1
1
  import type { CliProvider } from '../config.js';
2
2
  import { runCliModel } from '../llm/cli.js';
3
- import type { PromptPayload } from '../llm/prompt.js';
3
+ import type { Prompt } from '../llm/prompt.js';
4
+ import { type StreamOutputMode } from './stream-output.js';
4
5
  import { summarizeWithModelId } from './summary-llm.js';
5
6
  import type { ModelAttempt, ModelMeta } from './types.js';
6
7
  export type SummaryEngineDeps = {
@@ -12,6 +13,7 @@ export type SummaryEngineDeps = {
12
13
  timeoutMs: number;
13
14
  retries: number;
14
15
  streamingEnabled: boolean;
16
+ streamingOutputMode?: StreamOutputMode;
15
17
  plain: boolean;
16
18
  verbose: boolean;
17
19
  verboseColor: boolean;
@@ -29,6 +31,7 @@ export type SummaryEngineDeps = {
29
31
  purpose: 'summary' | 'markdown';
30
32
  }>;
31
33
  clearProgressForStdout: () => void;
34
+ restoreProgressAfterStdout?: (() => void) | null;
32
35
  apiKeys: {
33
36
  xaiApiKey: string | null;
34
37
  openaiApiKey: string | null;
@@ -52,13 +55,21 @@ export type SummaryEngineDeps = {
52
55
  xai: string | null;
53
56
  };
54
57
  };
58
+ export type SummaryStreamHandler = {
59
+ onChunk: (args: {
60
+ streamed: string;
61
+ prevStreamed: string;
62
+ appended: string;
63
+ }) => void | Promise<void>;
64
+ onDone?: ((finalText: string) => void | Promise<void>) | null;
65
+ };
55
66
  export declare function createSummaryEngine(deps: SummaryEngineDeps): {
56
67
  applyZaiOverrides: (attempt: ModelAttempt) => ModelAttempt;
57
68
  envHasKeyFor: (requiredEnv: ModelAttempt["requiredEnv"]) => boolean;
58
69
  formatMissingModelError: (attempt: ModelAttempt) => string;
59
- runSummaryAttempt: ({ attempt, prompt, allowStreaming, onModelChosen, cli, }: {
70
+ runSummaryAttempt: ({ attempt, prompt, allowStreaming, onModelChosen, cli, streamHandler, }: {
60
71
  attempt: ModelAttempt;
61
- prompt: PromptPayload;
72
+ prompt: Prompt;
62
73
  allowStreaming: boolean;
63
74
  onModelChosen?: ((modelId: string) => void) | null;
64
75
  cli?: {
@@ -67,6 +78,7 @@ export declare function createSummaryEngine(deps: SummaryEngineDeps): {
67
78
  cwd?: string;
68
79
  extraArgsByProvider?: Partial<Record<CliProvider, string[]>>;
69
80
  } | null;
81
+ streamHandler?: SummaryStreamHandler | null;
70
82
  }) => Promise<{
71
83
  summary: string;
72
84
  summaryAlreadyPrinted: boolean;
@@ -1,6 +1,6 @@
1
1
  import { generateTextWithModelId } from '../llm/generate-text.js';
2
2
  import type { parseGatewayStyleModelId } from '../llm/model-id.js';
3
- import type { PromptPayload } from '../llm/prompt.js';
3
+ import type { Prompt } from '../llm/prompt.js';
4
4
  export declare function resolveModelIdForLlmCall({ parsedModel, apiKeys, fetchImpl, timeoutMs, }: {
5
5
  parsedModel: ReturnType<typeof parseGatewayStyleModelId>;
6
6
  apiKeys: {
@@ -15,7 +15,7 @@ export declare function resolveModelIdForLlmCall({ parsedModel, apiKeys, fetchIm
15
15
  }>;
16
16
  export declare function summarizeWithModelId({ modelId, prompt, maxOutputTokens, timeoutMs, fetchImpl, apiKeys, forceOpenRouter, openaiBaseUrlOverride, anthropicBaseUrlOverride, googleBaseUrlOverride, xaiBaseUrlOverride, forceChatCompletions, retries, onRetry, }: {
17
17
  modelId: string;
18
- prompt: PromptPayload;
18
+ prompt: Prompt;
19
19
  maxOutputTokens?: number;
20
20
  timeoutMs: number;
21
21
  fetchImpl: typeof fetch;
@@ -0,0 +1,8 @@
1
+ type TranscriberCliContext = {
2
+ normalizedArgv: string[];
3
+ envForRun: Record<string, string | undefined>;
4
+ stdout: NodeJS.WritableStream;
5
+ stderr: NodeJS.WritableStream;
6
+ };
7
+ export declare function handleTranscriberCliRequest({ normalizedArgv, envForRun, stdout, }: TranscriberCliContext): Promise<boolean>;
8
+ export {};
@@ -0,0 +1,64 @@
1
+ import type { AssistantMessage } from '@mariozechner/pi-ai';
2
+ export type SseMetaData = {
3
+ model: string | null;
4
+ modelLabel: string | null;
5
+ inputSummary: string | null;
6
+ summaryFromCache?: boolean | null;
7
+ };
8
+ export type SseSlidesData = {
9
+ sourceUrl: string;
10
+ sourceId: string;
11
+ sourceKind: string;
12
+ ocrAvailable: boolean;
13
+ slides: Array<{
14
+ index: number;
15
+ timestamp: number;
16
+ imageUrl: string;
17
+ ocrText?: string | null;
18
+ ocrConfidence?: number | null;
19
+ }>;
20
+ };
21
+ export type SseMetricsData = {
22
+ elapsedMs: number;
23
+ summary: string;
24
+ details: string | null;
25
+ summaryDetailed: string;
26
+ detailsDetailed: string | null;
27
+ };
28
+ export type SseEvent = {
29
+ event: 'meta';
30
+ data: SseMetaData;
31
+ } | {
32
+ event: 'slides';
33
+ data: SseSlidesData;
34
+ } | {
35
+ event: 'status';
36
+ data: {
37
+ text: string;
38
+ };
39
+ } | {
40
+ event: 'chunk';
41
+ data: {
42
+ text: string;
43
+ };
44
+ } | {
45
+ event: 'assistant';
46
+ data: AssistantMessage;
47
+ } | {
48
+ event: 'metrics';
49
+ data: SseMetricsData;
50
+ } | {
51
+ event: 'done';
52
+ data: Record<string, never>;
53
+ } | {
54
+ event: 'error';
55
+ data: {
56
+ message: string;
57
+ };
58
+ };
59
+ export type RawSseMessage = {
60
+ event: string;
61
+ data: string;
62
+ };
63
+ export declare function encodeSseEvent(event: SseEvent): string;
64
+ export declare function parseSseEvent(message: RawSseMessage): SseEvent | null;
@@ -0,0 +1,4 @@
1
+ export declare function mergeStreamingChunk(previous: string, chunk: string): {
2
+ next: string;
3
+ appended: string;
4
+ };
@@ -0,0 +1,42 @@
1
+ import type { ExtractedLinkContent, MediaCache } from '../content/index.js';
2
+ import type { SlideSettings } from './settings.js';
3
+ import type { SlideExtractionResult, SlideImage, SlideSource, SlideSourceKind } from './types.js';
4
+ type ExtractSlidesArgs = {
5
+ source: SlideSource;
6
+ settings: SlideSettings;
7
+ noCache?: boolean;
8
+ mediaCache?: MediaCache | null;
9
+ env: Record<string, string | undefined>;
10
+ timeoutMs: number;
11
+ ytDlpPath: string | null;
12
+ ffmpegPath: string | null;
13
+ tesseractPath: string | null;
14
+ hooks?: {
15
+ onSlideChunk?: (chunk: {
16
+ slide: SlideImage;
17
+ meta: {
18
+ slidesDir: string;
19
+ sourceUrl: string;
20
+ sourceId: string;
21
+ sourceKind: SlideSourceKind;
22
+ ocrAvailable: boolean;
23
+ };
24
+ }) => void;
25
+ onSlidesTimeline?: ((slides: SlideExtractionResult) => void) | null;
26
+ onSlidesProgress?: ((text: string) => void) | null;
27
+ onSlidesLog?: ((message: string) => void) | null;
28
+ } | null;
29
+ };
30
+ export declare function resolveSlideSource({ url, extracted, }: {
31
+ url: string;
32
+ extracted: ExtractedLinkContent;
33
+ }): SlideSource | null;
34
+ export declare function resolveSlideSourceFromUrl(url: string): SlideSource | null;
35
+ export declare function extractSlidesForSource({ source, settings, noCache, mediaCache, env, timeoutMs, ytDlpPath, ffmpegPath, tesseractPath, hooks, }: ExtractSlidesArgs): Promise<SlideExtractionResult>;
36
+ export declare function parseShowinfoTimestamp(line: string): number | null;
37
+ export declare function resolveExtractedTimestamp({ requested, actual, seekBase, }: {
38
+ requested: number;
39
+ actual: number | null;
40
+ seekBase?: number | null;
41
+ }): number;
42
+ export {};
@@ -0,0 +1,5 @@
1
+ export { extractSlidesForSource, parseShowinfoTimestamp, resolveExtractedTimestamp, resolveSlideSource, resolveSlideSourceFromUrl, } from './extract.js';
2
+ export type { SlideSettings, SlideSettingsInput } from './settings.js';
3
+ export { resolveSlideSettings } from './settings.js';
4
+ export { buildSlidesDirId, readSlidesCacheIfValid, resolveSlideImagePath, resolveSlidesDir, serializeSlideImagePath, validateSlidesCache, } from './store.js';
5
+ export type { SlideAutoTune, SlideExtractionResult, SlideImage, SlideSource, SlideSourceKind, } from './types.js';
@@ -0,0 +1,20 @@
1
+ export type SlideSettings = {
2
+ enabled: boolean;
3
+ ocr: boolean;
4
+ outputDir: string;
5
+ sceneThreshold: number;
6
+ autoTuneThreshold: boolean;
7
+ maxSlides: number;
8
+ minDurationSeconds: number;
9
+ };
10
+ export type SlideSettingsInput = {
11
+ slides?: unknown;
12
+ slidesOcr?: unknown;
13
+ slidesDir?: unknown;
14
+ slidesSceneThreshold?: unknown;
15
+ slidesSceneThresholdExplicit?: boolean;
16
+ slidesMax?: unknown;
17
+ slidesMinDuration?: unknown;
18
+ cwd: string;
19
+ };
20
+ export declare function resolveSlideSettings(input: SlideSettingsInput): SlideSettings | null;
@@ -0,0 +1,15 @@
1
+ import type { SlideSettings } from './settings.js';
2
+ import type { SlideExtractionResult, SlideSource } from './types.js';
3
+ export declare function resolveSlidesDir(outputDir: string, sourceId: string): string;
4
+ export declare function buildSlidesDirId(slidesDir: string): string;
5
+ export declare function resolveSlideImagePath(slidesDir: string, imagePath: string): string | null;
6
+ export declare function serializeSlideImagePath(slidesDir: string, imagePath: string): string;
7
+ export declare function validateSlidesCache({ cached, source, settings, }: {
8
+ cached: SlideExtractionResult;
9
+ source: SlideSource;
10
+ settings: SlideSettings;
11
+ }): Promise<SlideExtractionResult | null>;
12
+ export declare function readSlidesCacheIfValid({ source, settings, }: {
13
+ source: SlideSource;
14
+ settings: SlideSettings;
15
+ }): Promise<SlideExtractionResult | null>;
@@ -0,0 +1,40 @@
1
+ export type SlideSourceKind = 'youtube' | 'direct';
2
+ export type SlideSource = {
3
+ url: string;
4
+ kind: SlideSourceKind;
5
+ sourceId: string;
6
+ };
7
+ export type SlideImage = {
8
+ index: number;
9
+ timestamp: number;
10
+ imagePath: string;
11
+ /**
12
+ * Bump when the underlying image file changes (e.g. thumbnail improvement),
13
+ * so clients can cache-bust URLs.
14
+ */
15
+ imageVersion?: number;
16
+ ocrText?: string | null;
17
+ ocrConfidence?: number | null;
18
+ };
19
+ export type SlideAutoTune = {
20
+ enabled: boolean;
21
+ chosenThreshold: number;
22
+ confidence: number;
23
+ strategy: 'hash' | 'none';
24
+ };
25
+ export type SlideExtractionResult = {
26
+ sourceUrl: string;
27
+ sourceKind: SlideSourceKind;
28
+ sourceId: string;
29
+ slidesDir: string;
30
+ slidesDirId?: string | null;
31
+ sceneThreshold: number;
32
+ autoTuneThreshold: boolean;
33
+ autoTune: SlideAutoTune;
34
+ maxSlides: number;
35
+ minSlideDuration: number;
36
+ ocrRequested: boolean;
37
+ ocrAvailable: boolean;
38
+ slides: SlideImage[];
39
+ warnings: string[];
40
+ };
@@ -1,5 +1,5 @@
1
- import { createOscProgressController as createOscProgressControllerImpl } from 'osc-progress';
1
+ import type { OscProgressController } from 'osc-progress';
2
2
  export type { OscProgressController, OscProgressOptions, OscProgressSupportOptions, OscProgressTerminator, } from 'osc-progress';
3
- export declare const createOscProgressController: typeof createOscProgressControllerImpl;
3
+ export declare function createOscProgressController(options: import('osc-progress').OscProgressOptions): OscProgressController;
4
4
  export declare function startOscProgress(options: import('osc-progress').OscProgressOptions): () => void;
5
5
  export declare function supportsOscProgress(env: Record<string, string | undefined>, isTty: boolean, options?: import('osc-progress').OscProgressSupportOptions): boolean;
@@ -1,10 +1,12 @@
1
1
  import type { LinkPreviewProgressEvent } from '@steipete/summarize-core/content';
2
2
  import type { OscProgressController } from '../osc-progress.js';
3
- export declare function createFetchHtmlProgressRenderer({ spinner, oscProgress, }: {
3
+ import type { ThemeRenderer } from '../theme.js';
4
+ export declare function createFetchHtmlProgressRenderer({ spinner, oscProgress, theme, }: {
4
5
  spinner: {
5
6
  setText: (text: string) => void;
6
7
  };
7
8
  oscProgress?: OscProgressController | null;
9
+ theme?: ThemeRenderer | null;
8
10
  }): {
9
11
  stop: () => void;
10
12
  onProgress: (event: LinkPreviewProgressEvent) => void;