@steipete/summarize 0.9.0 → 0.11.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 (398) hide show
  1. package/CHANGELOG.md +121 -0
  2. package/LICENSE +1 -1
  3. package/README.md +391 -183
  4. package/dist/cli.js +1 -1
  5. package/dist/esm/cache.js +134 -64
  6. package/dist/esm/cache.js.map +1 -1
  7. package/dist/esm/cli-main.js +27 -27
  8. package/dist/esm/cli-main.js.map +1 -1
  9. package/dist/esm/cli.js +2 -2
  10. package/dist/esm/cli.js.map +1 -1
  11. package/dist/esm/config.js +396 -126
  12. package/dist/esm/config.js.map +1 -1
  13. package/dist/esm/content/asset.js +53 -50
  14. package/dist/esm/content/asset.js.map +1 -1
  15. package/dist/esm/content/index.js +1 -1
  16. package/dist/esm/content/index.js.map +1 -1
  17. package/dist/esm/costs.js +1 -1
  18. package/dist/esm/costs.js.map +1 -1
  19. package/dist/esm/daemon/agent.js +548 -0
  20. package/dist/esm/daemon/agent.js.map +1 -0
  21. package/dist/esm/daemon/auto-mode.js +3 -3
  22. package/dist/esm/daemon/auto-mode.js.map +1 -1
  23. package/dist/esm/daemon/chat.js +88 -178
  24. package/dist/esm/daemon/chat.js.map +1 -1
  25. package/dist/esm/daemon/cli-entrypoint.js +72 -0
  26. package/dist/esm/daemon/cli-entrypoint.js.map +1 -0
  27. package/dist/esm/daemon/cli.js +91 -83
  28. package/dist/esm/daemon/cli.js.map +1 -1
  29. package/dist/esm/daemon/config.js +15 -15
  30. package/dist/esm/daemon/config.js.map +1 -1
  31. package/dist/esm/daemon/constants.js +6 -6
  32. package/dist/esm/daemon/constants.js.map +1 -1
  33. package/dist/esm/daemon/env-merge.js.map +1 -1
  34. package/dist/esm/daemon/env-snapshot.js +36 -28
  35. package/dist/esm/daemon/env-snapshot.js.map +1 -1
  36. package/dist/esm/daemon/flow-context.js +86 -32
  37. package/dist/esm/daemon/flow-context.js.map +1 -1
  38. package/dist/esm/daemon/launchd.js +119 -47
  39. package/dist/esm/daemon/launchd.js.map +1 -1
  40. package/dist/esm/daemon/meta.js +5 -5
  41. package/dist/esm/daemon/meta.js.map +1 -1
  42. package/dist/esm/daemon/models.js +54 -31
  43. package/dist/esm/daemon/models.js.map +1 -1
  44. package/dist/esm/daemon/process-registry.js +206 -0
  45. package/dist/esm/daemon/process-registry.js.map +1 -0
  46. package/dist/esm/daemon/schtasks.js +96 -32
  47. package/dist/esm/daemon/schtasks.js.map +1 -1
  48. package/dist/esm/daemon/server.js +832 -158
  49. package/dist/esm/daemon/server.js.map +1 -1
  50. package/dist/esm/daemon/summarize-progress.js +11 -11
  51. package/dist/esm/daemon/summarize-progress.js.map +1 -1
  52. package/dist/esm/daemon/summarize.js +61 -32
  53. package/dist/esm/daemon/summarize.js.map +1 -1
  54. package/dist/esm/daemon/systemd.js +96 -35
  55. package/dist/esm/daemon/systemd.js.map +1 -1
  56. package/dist/esm/firecrawl.js +12 -12
  57. package/dist/esm/firecrawl.js.map +1 -1
  58. package/dist/esm/flags.js +55 -31
  59. package/dist/esm/flags.js.map +1 -1
  60. package/dist/esm/index.js +3 -3
  61. package/dist/esm/index.js.map +1 -1
  62. package/dist/esm/language.js +1 -1
  63. package/dist/esm/language.js.map +1 -1
  64. package/dist/esm/llm/cli.js +128 -64
  65. package/dist/esm/llm/cli.js.map +1 -1
  66. package/dist/esm/llm/errors.js +1 -1
  67. package/dist/esm/llm/errors.js.map +1 -1
  68. package/dist/esm/llm/generate-text.js +107 -98
  69. package/dist/esm/llm/generate-text.js.map +1 -1
  70. package/dist/esm/llm/google-models.js +17 -17
  71. package/dist/esm/llm/google-models.js.map +1 -1
  72. package/dist/esm/llm/html-to-markdown.js +3 -3
  73. package/dist/esm/llm/html-to-markdown.js.map +1 -1
  74. package/dist/esm/llm/model-id.js +38 -16
  75. package/dist/esm/llm/model-id.js.map +1 -1
  76. package/dist/esm/llm/prompt.js +5 -5
  77. package/dist/esm/llm/prompt.js.map +1 -1
  78. package/dist/esm/llm/providers/anthropic.js +33 -33
  79. package/dist/esm/llm/providers/anthropic.js.map +1 -1
  80. package/dist/esm/llm/providers/google.js +19 -19
  81. package/dist/esm/llm/providers/google.js.map +1 -1
  82. package/dist/esm/llm/providers/models.js +30 -30
  83. package/dist/esm/llm/providers/models.js.map +1 -1
  84. package/dist/esm/llm/providers/openai.js +36 -35
  85. package/dist/esm/llm/providers/openai.js.map +1 -1
  86. package/dist/esm/llm/providers/shared.js +8 -8
  87. package/dist/esm/llm/providers/shared.js.map +1 -1
  88. package/dist/esm/llm/transcript-to-markdown.js +9 -5
  89. package/dist/esm/llm/transcript-to-markdown.js.map +1 -1
  90. package/dist/esm/llm/usage.js +18 -18
  91. package/dist/esm/llm/usage.js.map +1 -1
  92. package/dist/esm/logging/daemon.js +21 -21
  93. package/dist/esm/logging/daemon.js.map +1 -1
  94. package/dist/esm/logging/ring-file.js +5 -5
  95. package/dist/esm/logging/ring-file.js.map +1 -1
  96. package/dist/esm/markitdown.js +21 -19
  97. package/dist/esm/markitdown.js.map +1 -1
  98. package/dist/esm/media-cache.js +251 -0
  99. package/dist/esm/media-cache.js.map +1 -0
  100. package/dist/esm/model-auto.js +175 -106
  101. package/dist/esm/model-auto.js.map +1 -1
  102. package/dist/esm/model-spec.js +52 -42
  103. package/dist/esm/model-spec.js.map +1 -1
  104. package/dist/esm/pricing/litellm.js +4 -4
  105. package/dist/esm/pricing/litellm.js.map +1 -1
  106. package/dist/esm/processes.js +2 -0
  107. package/dist/esm/processes.js.map +1 -0
  108. package/dist/esm/prompts/index.js +1 -1
  109. package/dist/esm/prompts/index.js.map +1 -1
  110. package/dist/esm/refresh-free.js +81 -81
  111. package/dist/esm/refresh-free.js.map +1 -1
  112. package/dist/esm/run/attachments.js +47 -44
  113. package/dist/esm/run/attachments.js.map +1 -1
  114. package/dist/esm/run/bird.js +125 -12
  115. package/dist/esm/run/bird.js.map +1 -1
  116. package/dist/esm/run/cache-state.js +7 -7
  117. package/dist/esm/run/cache-state.js.map +1 -1
  118. package/dist/esm/run/cli-fallback-state.js +45 -0
  119. package/dist/esm/run/cli-fallback-state.js.map +1 -0
  120. package/dist/esm/run/cli-preflight.js +40 -22
  121. package/dist/esm/run/cli-preflight.js.map +1 -1
  122. package/dist/esm/run/constants.js +12 -12
  123. package/dist/esm/run/constants.js.map +1 -1
  124. package/dist/esm/run/cookies/twitter.js +47 -47
  125. package/dist/esm/run/cookies/twitter.js.map +1 -1
  126. package/dist/esm/run/env.js +21 -15
  127. package/dist/esm/run/env.js.map +1 -1
  128. package/dist/esm/run/fetch-with-timeout.js +4 -4
  129. package/dist/esm/run/fetch-with-timeout.js.map +1 -1
  130. package/dist/esm/run/finish-line.js +78 -71
  131. package/dist/esm/run/finish-line.js.map +1 -1
  132. package/dist/esm/run/flows/asset/extract.js +70 -0
  133. package/dist/esm/run/flows/asset/extract.js.map +1 -0
  134. package/dist/esm/run/flows/asset/input.js +202 -37
  135. package/dist/esm/run/flows/asset/input.js.map +1 -1
  136. package/dist/esm/run/flows/asset/media-policy.js +3 -0
  137. package/dist/esm/run/flows/asset/media-policy.js.map +1 -0
  138. package/dist/esm/run/flows/asset/media.js +233 -0
  139. package/dist/esm/run/flows/asset/media.js.map +1 -0
  140. package/dist/esm/run/flows/asset/output.js +98 -0
  141. package/dist/esm/run/flows/asset/output.js.map +1 -0
  142. package/dist/esm/run/flows/asset/preprocess.js +79 -44
  143. package/dist/esm/run/flows/asset/preprocess.js.map +1 -1
  144. package/dist/esm/run/flows/asset/summary.js +306 -89
  145. package/dist/esm/run/flows/asset/summary.js.map +1 -1
  146. package/dist/esm/run/flows/url/extract.js +31 -31
  147. package/dist/esm/run/flows/url/extract.js.map +1 -1
  148. package/dist/esm/run/flows/url/flow.js +388 -82
  149. package/dist/esm/run/flows/url/flow.js.map +1 -1
  150. package/dist/esm/run/flows/url/markdown.js +61 -56
  151. package/dist/esm/run/flows/url/markdown.js.map +1 -1
  152. package/dist/esm/run/flows/url/slides-output.js +487 -0
  153. package/dist/esm/run/flows/url/slides-output.js.map +1 -0
  154. package/dist/esm/run/flows/url/slides-text.js +628 -0
  155. package/dist/esm/run/flows/url/slides-text.js.map +1 -0
  156. package/dist/esm/run/flows/url/summary.js +493 -152
  157. package/dist/esm/run/flows/url/summary.js.map +1 -1
  158. package/dist/esm/run/format.js +10 -10
  159. package/dist/esm/run/format.js.map +1 -1
  160. package/dist/esm/run/help.js +179 -84
  161. package/dist/esm/run/help.js.map +1 -1
  162. package/dist/esm/run/logging.js +20 -12
  163. package/dist/esm/run/logging.js.map +1 -1
  164. package/dist/esm/run/markdown.js +12 -12
  165. package/dist/esm/run/markdown.js.map +1 -1
  166. package/dist/esm/run/media-cache-state.js +33 -0
  167. package/dist/esm/run/media-cache-state.js.map +1 -0
  168. package/dist/esm/run/model-attempts.js.map +1 -1
  169. package/dist/esm/run/openrouter.js +11 -11
  170. package/dist/esm/run/openrouter.js.map +1 -1
  171. package/dist/esm/run/progress.js +19 -1
  172. package/dist/esm/run/progress.js.map +1 -1
  173. package/dist/esm/run/run-config.js +16 -16
  174. package/dist/esm/run/run-config.js.map +1 -1
  175. package/dist/esm/run/run-context.js +2 -2
  176. package/dist/esm/run/run-context.js.map +1 -1
  177. package/dist/esm/run/run-env.js +55 -54
  178. package/dist/esm/run/run-env.js.map +1 -1
  179. package/dist/esm/run/run-input.js +3 -3
  180. package/dist/esm/run/run-input.js.map +1 -1
  181. package/dist/esm/run/run-metrics.js +16 -16
  182. package/dist/esm/run/run-metrics.js.map +1 -1
  183. package/dist/esm/run/run-models.js +28 -23
  184. package/dist/esm/run/run-models.js.map +1 -1
  185. package/dist/esm/run/run-output.js +3 -3
  186. package/dist/esm/run/run-output.js.map +1 -1
  187. package/dist/esm/run/run-settings.js +108 -21
  188. package/dist/esm/run/run-settings.js.map +1 -1
  189. package/dist/esm/run/run-stream.js +4 -4
  190. package/dist/esm/run/run-stream.js.map +1 -1
  191. package/dist/esm/run/runner.js +327 -100
  192. package/dist/esm/run/runner.js.map +1 -1
  193. package/dist/esm/run/slides-cli.js +226 -0
  194. package/dist/esm/run/slides-cli.js.map +1 -0
  195. package/dist/esm/run/slides-render.js +163 -0
  196. package/dist/esm/run/slides-render.js.map +1 -0
  197. package/dist/esm/run/stdin-temp-file.js +77 -0
  198. package/dist/esm/run/stdin-temp-file.js.map +1 -0
  199. package/dist/esm/run/stream-output.js +17 -10
  200. package/dist/esm/run/stream-output.js.map +1 -1
  201. package/dist/esm/run/streaming.js +16 -16
  202. package/dist/esm/run/streaming.js.map +1 -1
  203. package/dist/esm/run/summary-engine.js +89 -57
  204. package/dist/esm/run/summary-engine.js.map +1 -1
  205. package/dist/esm/run/summary-llm.js +3 -3
  206. package/dist/esm/run/summary-llm.js.map +1 -1
  207. package/dist/esm/run/terminal.js +4 -4
  208. package/dist/esm/run/terminal.js.map +1 -1
  209. package/dist/esm/run/tips.js +2 -2
  210. package/dist/esm/run/tips.js.map +1 -1
  211. package/dist/esm/run/transcriber-cli.js +148 -0
  212. package/dist/esm/run/transcriber-cli.js.map +1 -0
  213. package/dist/esm/run.js +1 -1
  214. package/dist/esm/run.js.map +1 -1
  215. package/dist/esm/shared/contracts.js +1 -1
  216. package/dist/esm/shared/contracts.js.map +1 -1
  217. package/dist/esm/shared/sse-events.js +16 -12
  218. package/dist/esm/shared/sse-events.js.map +1 -1
  219. package/dist/esm/shared/streaming-merge.js +3 -3
  220. package/dist/esm/shared/streaming-merge.js.map +1 -1
  221. package/dist/esm/slides/extract.js +1951 -0
  222. package/dist/esm/slides/extract.js.map +1 -0
  223. package/dist/esm/slides/index.js +4 -0
  224. package/dist/esm/slides/index.js.map +1 -0
  225. package/dist/esm/slides/settings.js +73 -0
  226. package/dist/esm/slides/settings.js.map +1 -0
  227. package/dist/esm/slides/store.js +111 -0
  228. package/dist/esm/slides/store.js.map +1 -0
  229. package/dist/esm/slides/types.js +2 -0
  230. package/dist/esm/slides/types.js.map +1 -0
  231. package/dist/esm/tty/format.js +13 -13
  232. package/dist/esm/tty/format.js.map +1 -1
  233. package/dist/esm/tty/osc-progress.js +22 -2
  234. package/dist/esm/tty/osc-progress.js.map +1 -1
  235. package/dist/esm/tty/progress/fetch-html.js +20 -16
  236. package/dist/esm/tty/progress/fetch-html.js.map +1 -1
  237. package/dist/esm/tty/progress/transcript.js +127 -68
  238. package/dist/esm/tty/progress/transcript.js.map +1 -1
  239. package/dist/esm/tty/spinner.js +21 -10
  240. package/dist/esm/tty/spinner.js.map +1 -1
  241. package/dist/esm/tty/theme.js +189 -0
  242. package/dist/esm/tty/theme.js.map +1 -0
  243. package/dist/esm/tty/website-progress.js +38 -34
  244. package/dist/esm/tty/website-progress.js.map +1 -1
  245. package/dist/esm/version.js +29 -29
  246. package/dist/esm/version.js.map +1 -1
  247. package/dist/types/cache.d.ts +19 -7
  248. package/dist/types/config.d.ts +71 -6
  249. package/dist/types/content/asset.d.ts +8 -6
  250. package/dist/types/content/index.d.ts +1 -1
  251. package/dist/types/costs.d.ts +3 -3
  252. package/dist/types/daemon/agent.d.ts +25 -0
  253. package/dist/types/daemon/auto-mode.d.ts +3 -3
  254. package/dist/types/daemon/chat.d.ts +10 -18
  255. package/dist/types/daemon/cli-entrypoint.d.ts +2 -0
  256. package/dist/types/daemon/config.d.ts +2 -2
  257. package/dist/types/daemon/env-merge.d.ts +1 -1
  258. package/dist/types/daemon/env-snapshot.d.ts +1 -1
  259. package/dist/types/daemon/flow-context.d.ts +24 -4
  260. package/dist/types/daemon/launchd.d.ts +12 -0
  261. package/dist/types/daemon/models.d.ts +6 -2
  262. package/dist/types/daemon/process-registry.d.ts +73 -0
  263. package/dist/types/daemon/schtasks.d.ts +4 -0
  264. package/dist/types/daemon/server.d.ts +2 -2
  265. package/dist/types/daemon/summarize-progress.d.ts +1 -1
  266. package/dist/types/daemon/summarize.d.ts +38 -7
  267. package/dist/types/daemon/systemd.d.ts +4 -0
  268. package/dist/types/firecrawl.d.ts +1 -1
  269. package/dist/types/flags.d.ts +12 -11
  270. package/dist/types/index.d.ts +4 -4
  271. package/dist/types/language.d.ts +1 -1
  272. package/dist/types/llm/attachments.d.ts +1 -1
  273. package/dist/types/llm/cli.d.ts +3 -3
  274. package/dist/types/llm/generate-text.d.ts +7 -7
  275. package/dist/types/llm/html-to-markdown.d.ts +3 -3
  276. package/dist/types/llm/model-id.d.ts +1 -1
  277. package/dist/types/llm/prompt.d.ts +2 -2
  278. package/dist/types/llm/providers/anthropic.d.ts +3 -3
  279. package/dist/types/llm/providers/google.d.ts +3 -3
  280. package/dist/types/llm/providers/models.d.ts +2 -2
  281. package/dist/types/llm/providers/openai.d.ts +4 -4
  282. package/dist/types/llm/providers/shared.d.ts +2 -2
  283. package/dist/types/llm/transcript-to-markdown.d.ts +4 -2
  284. package/dist/types/llm/usage.d.ts +1 -1
  285. package/dist/types/logging/daemon.d.ts +4 -4
  286. package/dist/types/markitdown.d.ts +1 -1
  287. package/dist/types/media-cache.d.ts +22 -0
  288. package/dist/types/model-auto.d.ts +14 -4
  289. package/dist/types/model-spec.d.ts +10 -10
  290. package/dist/types/pricing/litellm.d.ts +1 -1
  291. package/dist/types/processes.d.ts +1 -0
  292. package/dist/types/prompts/index.d.ts +1 -1
  293. package/dist/types/run/attachments.d.ts +7 -7
  294. package/dist/types/run/bird.d.ts +7 -0
  295. package/dist/types/run/cache-state.d.ts +2 -2
  296. package/dist/types/run/cli-fallback-state.d.ts +6 -0
  297. package/dist/types/run/constants.d.ts +1 -1
  298. package/dist/types/run/cookies/twitter.d.ts +1 -1
  299. package/dist/types/run/env.d.ts +1 -1
  300. package/dist/types/run/finish-line.d.ts +7 -6
  301. package/dist/types/run/flows/asset/extract.d.ts +18 -0
  302. package/dist/types/run/flows/asset/input.d.ts +19 -3
  303. package/dist/types/run/flows/asset/media-policy.d.ts +2 -0
  304. package/dist/types/run/flows/asset/media.d.ts +21 -0
  305. package/dist/types/run/flows/asset/output.d.ts +42 -0
  306. package/dist/types/run/flows/asset/preprocess.d.ts +23 -17
  307. package/dist/types/run/flows/asset/summary.d.ts +24 -16
  308. package/dist/types/run/flows/url/extract.d.ts +3 -2
  309. package/dist/types/run/flows/url/flow.d.ts +1 -1
  310. package/dist/types/run/flows/url/markdown.d.ts +6 -6
  311. package/dist/types/run/flows/url/slides-output.d.ts +66 -0
  312. package/dist/types/run/flows/url/slides-text.d.ts +87 -0
  313. package/dist/types/run/flows/url/summary.d.ts +18 -10
  314. package/dist/types/run/flows/url/types.d.ts +52 -21
  315. package/dist/types/run/format.d.ts +3 -3
  316. package/dist/types/run/help.d.ts +4 -1
  317. package/dist/types/run/logging.d.ts +3 -2
  318. package/dist/types/run/media-cache-state.d.ts +7 -0
  319. package/dist/types/run/model-attempts.d.ts +1 -1
  320. package/dist/types/run/progress.d.ts +2 -1
  321. package/dist/types/run/run-config.d.ts +4 -4
  322. package/dist/types/run/run-context.d.ts +3 -1
  323. package/dist/types/run/run-env.d.ts +3 -1
  324. package/dist/types/run/run-input.d.ts +2 -2
  325. package/dist/types/run/run-metrics.d.ts +3 -3
  326. package/dist/types/run/run-models.d.ts +3 -2
  327. package/dist/types/run/run-output.d.ts +1 -1
  328. package/dist/types/run/run-settings.d.ts +20 -5
  329. package/dist/types/run/run-stream.d.ts +2 -2
  330. package/dist/types/run/runner.d.ts +3 -2
  331. package/dist/types/run/slides-cli.d.ts +9 -0
  332. package/dist/types/run/slides-render.d.ts +30 -0
  333. package/dist/types/run/stdin-temp-file.d.ts +9 -0
  334. package/dist/types/run/stream-output.d.ts +3 -2
  335. package/dist/types/run/streaming.d.ts +4 -4
  336. package/dist/types/run/summary-engine.d.ts +22 -12
  337. package/dist/types/run/summary-llm.d.ts +5 -5
  338. package/dist/types/run/transcriber-cli.d.ts +8 -0
  339. package/dist/types/run/types.d.ts +4 -4
  340. package/dist/types/run.d.ts +1 -1
  341. package/dist/types/shared/contracts.d.ts +2 -2
  342. package/dist/types/shared/sse-events.d.ts +26 -6
  343. package/dist/types/slides/extract.d.ts +43 -0
  344. package/dist/types/slides/index.d.ts +5 -0
  345. package/dist/types/slides/settings.d.ts +20 -0
  346. package/dist/types/slides/store.d.ts +15 -0
  347. package/dist/types/slides/types.d.ts +40 -0
  348. package/dist/types/tty/osc-progress.d.ts +5 -5
  349. package/dist/types/tty/progress/fetch-html.d.ts +5 -3
  350. package/dist/types/tty/progress/transcript.d.ts +5 -3
  351. package/dist/types/tty/spinner.d.ts +3 -1
  352. package/dist/types/tty/theme.d.ts +44 -0
  353. package/dist/types/tty/website-progress.d.ts +5 -3
  354. package/dist/types/version.d.ts +1 -1
  355. package/docs/README.md +1 -1
  356. package/docs/_config.yml +26 -0
  357. package/docs/_layouts/default.html +60 -0
  358. package/docs/agent.md +367 -0
  359. package/docs/assets/site.css +748 -0
  360. package/docs/assets/site.js +72 -0
  361. package/docs/assets/summarize-cli.png +0 -0
  362. package/docs/assets/summarize-extension.png +0 -0
  363. package/docs/assets/youtube-slides.png +0 -0
  364. package/docs/cache.md +29 -3
  365. package/docs/chrome-extension.md +72 -16
  366. package/docs/cli.md +59 -13
  367. package/docs/config.md +109 -12
  368. package/docs/extract-only.md +10 -0
  369. package/docs/index.html +224 -0
  370. package/docs/index.md +25 -0
  371. package/docs/llm.md +18 -5
  372. package/docs/manual-tests.md +2 -0
  373. package/docs/media.md +6 -2
  374. package/docs/model-auto.md +3 -2
  375. package/docs/nvidia-onnx-transcription.md +55 -0
  376. package/docs/openai.md +1 -1
  377. package/docs/releasing.md +3 -0
  378. package/docs/site/404.html +4 -1
  379. package/docs/site/assets/site.css +399 -228
  380. package/docs/site/assets/site.js +46 -46
  381. package/docs/site/assets/summarize-cli.png +0 -0
  382. package/docs/site/assets/summarize-extension.png +0 -0
  383. package/docs/site/docs/chrome-extension.html +101 -0
  384. package/docs/site/docs/config.html +30 -8
  385. package/docs/site/docs/extract-only.html +17 -4
  386. package/docs/site/docs/firecrawl.html +13 -3
  387. package/docs/site/docs/index.html +40 -6
  388. package/docs/site/docs/llm.html +20 -5
  389. package/docs/site/docs/openai.html +19 -5
  390. package/docs/site/docs/website.html +30 -9
  391. package/docs/site/docs/youtube.html +13 -3
  392. package/docs/site/index.html +168 -85
  393. package/docs/slides.md +82 -0
  394. package/docs/smoketest.md +29 -20
  395. package/docs/timestamps.md +124 -0
  396. package/docs/website.md +13 -0
  397. package/docs/youtube.md +20 -0
  398. package/package.json +57 -48
@@ -8,7 +8,10 @@
8
8
  <link rel="canonical" href="https://summarize.sh/docs/website" />
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com" />
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
11
- <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap" rel="stylesheet" />
11
+ <link
12
+ href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap"
13
+ rel="stylesheet"
14
+ />
12
15
  <link rel="stylesheet" href="../assets/site.css" />
13
16
  </head>
14
17
  <body>
@@ -29,6 +32,7 @@
29
32
  <aside class="side" aria-label="Docs navigation">
30
33
  <h2>Docs</h2>
31
34
  <a href="./index.html">Overview</a>
35
+ <a href="./chrome-extension.html">Chrome extension</a>
32
36
  <a href="./website.html">Website mode</a>
33
37
  <a href="./youtube.html">YouTube mode</a>
34
38
  <a href="./extract-only.html">Extract</a>
@@ -41,9 +45,19 @@
41
45
  <article class="doc reveal">
42
46
  <p class="kicker">mode</p>
43
47
  <h1>Website mode</h1>
44
- <p>Fetch HTML → extract “article-ish” content → normalize to clean text. If extraction looks blocked or too thin, retry via Firecrawl Markdown (optional). With <code>--format md</code>, the CLI prefers Firecrawl Markdown when configured and can also convert HTML → Markdown via <code>--markdown-mode</code> (LLM) or <code>uvx markitdown</code>.</p>
48
+ <p>
49
+ Fetch HTML → extract “article-ish” content → normalize to clean text. If extraction
50
+ looks blocked or too thin, retry via Firecrawl Markdown (optional). With
51
+ <code>--format md</code>, the CLI prefers Firecrawl Markdown when configured and can
52
+ also convert HTML → Markdown via <code>--markdown-mode</code> (LLM) or
53
+ <code>uvx markitdown</code>.
54
+ </p>
45
55
 
46
- <p>Podcast pages are supported (Apple Podcasts, Spotify episodes, RSS feeds, Podbean, Podchaser, embedded YouTube). Summaries use published transcripts when available, otherwise Whisper.</p>
56
+ <p>
57
+ Podcast pages are supported (Apple Podcasts, Spotify episodes, RSS feeds, Podbean,
58
+ Podchaser, embedded YouTube). Summaries use published transcripts when available,
59
+ otherwise Whisper.
60
+ </p>
47
61
 
48
62
  <h2>Flags</h2>
49
63
  <ul>
@@ -51,22 +65,29 @@
51
65
  <li><code>--timeout 30s|2m|5000ms</code> (default <code>2m</code>)</li>
52
66
  <li><code>--extract</code> (print extracted content; no summary call)</li>
53
67
  <li><code>--format md|text</code> (default <code>text</code>)</li>
54
- <li><code>--markdown-mode off|auto|llm|readability</code> (only with <code>--format md</code>)</li>
55
- <li><code>--preprocess off|auto|always</code> (default <code>auto</code>; controls markitdown usage)</li>
68
+ <li>
69
+ <code>--markdown-mode off|auto|llm|readability</code> (only with
70
+ <code>--format md</code>)
71
+ </li>
72
+ <li>
73
+ <code>--preprocess off|auto|always</code> (default <code>auto</code>; controls
74
+ markitdown usage)
75
+ </li>
56
76
  <li><code>--json</code> (emit a single JSON object)</li>
57
77
  <li><code>--verbose</code> (progress + which extractor was used)</li>
58
78
  <li><code>--metrics off|on|detailed</code></li>
59
79
  </ul>
60
80
 
61
- <div class="note">
62
- Plain-text mode: <code>--extract --format text</code>.
63
- </div>
81
+ <div class="note">Plain-text mode: <code>--extract --format text</code>.</div>
64
82
  </article>
65
83
  </section>
66
84
 
67
85
  <footer class="footer">
68
86
  <span>summarize — Link → clean text → summary.</span>
69
- <span><a href="./index.html">Docs</a> · <a href="https://github.com/steipete/summarize">Repo</a></span>
87
+ <span
88
+ ><a href="./index.html">Docs</a> ·
89
+ <a href="https://github.com/steipete/summarize">Repo</a></span
90
+ >
70
91
  </footer>
71
92
  </main>
72
93
 
@@ -8,7 +8,10 @@
8
8
  <link rel="canonical" href="https://summarize.sh/docs/youtube" />
9
9
  <link rel="preconnect" href="https://fonts.googleapis.com" />
10
10
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
11
- <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap" rel="stylesheet" />
11
+ <link
12
+ href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap"
13
+ rel="stylesheet"
14
+ />
12
15
  <link rel="stylesheet" href="../assets/site.css" />
13
16
  </head>
14
17
  <body>
@@ -29,6 +32,7 @@
29
32
  <aside class="side" aria-label="Docs navigation">
30
33
  <h2>Docs</h2>
31
34
  <a href="./index.html">Overview</a>
35
+ <a href="./chrome-extension.html">Chrome extension</a>
32
36
  <a href="./website.html">Website mode</a>
33
37
  <a href="./youtube.html">YouTube mode</a>
34
38
  <a href="./extract-only.html">Extract</a>
@@ -41,7 +45,10 @@
41
45
  <article class="doc reveal">
42
46
  <p class="kicker">mode</p>
43
47
  <h1>YouTube mode</h1>
44
- <p>Extracts transcripts via multiple strategies. The goal: reliable text, even when YouTube is being “difficult”.</p>
48
+ <p>
49
+ Extracts transcripts via multiple strategies. The goal: reliable text, even when YouTube
50
+ is being “difficult”.
51
+ </p>
45
52
 
46
53
  <h2>Tip</h2>
47
54
  <ul>
@@ -53,7 +60,10 @@
53
60
 
54
61
  <footer class="footer">
55
62
  <span>summarize — Link → clean text → summary.</span>
56
- <span><a href="./index.html">Docs</a> · <a href="https://github.com/steipete/summarize">Repo</a></span>
63
+ <span
64
+ ><a href="./index.html">Docs</a> ·
65
+ <a href="https://github.com/steipete/summarize">Repo</a></span
66
+ >
57
67
  </footer>
58
68
  </main>
59
69
 
@@ -4,18 +4,27 @@
4
4
  <meta charset="utf-8" />
5
5
  <meta name="viewport" content="width=device-width,initial-scale=1" />
6
6
  <meta name="color-scheme" content="dark light" />
7
- <title>summarize — Link clean text summary.</title>
8
- <meta name="description" content="Link → clean text → summary. A CLI that turns URLs into clean text and fast summaries." />
7
+ <title>summarize — CLI + Chrome Side Panel for fast summaries</title>
8
+ <meta
9
+ name="description"
10
+ content="Summarize is a fast CLI and a Chrome Side Panel extension for clean extraction and sharp summaries."
11
+ />
9
12
  <link rel="canonical" href="https://summarize.sh/" />
10
13
  <meta property="og:title" content="summarize" />
11
- <meta property="og:description" content="Link → clean text → summary." />
14
+ <meta
15
+ property="og:description"
16
+ content="Fast summaries, in the CLI and the Chrome Side Panel."
17
+ />
12
18
  <meta property="og:type" content="website" />
13
19
  <meta property="og:url" content="https://summarize.sh/" />
14
- <meta name="theme-color" content="#0b1018" />
20
+ <meta name="theme-color" content="#0b0f12" />
15
21
 
16
22
  <link rel="preconnect" href="https://fonts.googleapis.com" />
17
23
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
18
- <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap" rel="stylesheet" />
24
+ <link
25
+ href="https://fonts.googleapis.com/css2?family=Fraunces:wght@600;700&family=IBM+Plex+Mono:wght@400;500;600&family=IBM+Plex+Sans:wght@400;500;600&display=swap"
26
+ rel="stylesheet"
27
+ />
19
28
  <link rel="stylesheet" href="./assets/site.css" />
20
29
  </head>
21
30
  <body>
@@ -33,106 +42,180 @@
33
42
  </header>
34
43
 
35
44
  <section class="hero">
36
- <div class="hero__card reveal">
37
- <div class="hero__grid">
38
- <div class="hero__inner">
39
- <p class="kicker">CLI</p>
40
- <h1 class="title">Link → clean text → summary.</h1>
41
- <p class="lede">
42
- A pragmatic pipeline for the web: <strong>extract</strong> the good stuff, <strong>sanitize</strong> it,
43
- then <strong>summarize</strong> with your model of choice. Podcast episode pages included. Plus a Chrome
44
- side panel extension when you want it in-browser.
45
- </p>
46
-
47
- <div class="pillRow">
48
- <span class="pill"><span class="pill__dot" aria-hidden="true"></span> Website extraction</span>
49
- <span class="pill"><span class="pill__dot" aria-hidden="true" style="background: var(--accent2)"></span> YouTube transcripts</span>
50
- <span class="pill"><span class="pill__dot" aria-hidden="true" style="background: var(--accent3)"></span> Podcast compatibility</span>
51
- <span class="pill"><span class="pill__dot" aria-hidden="true" style="background: var(--accent3)"></span> JSON + metrics</span>
52
- <span class="pill"><span class="pill__dot" aria-hidden="true" style="background: var(--accent2)"></span> Chrome extension</span>
45
+ <div class="hero__frame reveal">
46
+ <div class="hero__copy">
47
+ <p class="kicker">CLI + Chrome Extension</p>
48
+ <h1 class="title">Summaries that live where you work.</h1>
49
+ <p class="lede">
50
+ Summarize turns links, files, and media into sharp summaries with a real extraction
51
+ pipeline. Use the <strong>CLI</strong> for automation or the
52
+ <strong>Chrome Side Panel</strong> for one-click summaries of the current tab.
53
+ Supports <strong>local, paid, and free</strong> models.
54
+ </p>
55
+ <div class="ctaRow">
56
+ <a class="btn btn--primary" href="./docs/index.html">Docs</a>
57
+ <a class="btn" href="https://github.com/steipete/summarize">GitHub</a>
58
+ </div>
59
+ <div class="quickRow">
60
+ <div class="quickRow__label">Quickstart</div>
61
+ <div class="quickRow__code">
62
+ <code id="install">npm i -g @steipete/summarize</code>
63
+ <code id="run">summarize "https://example.com/article"</code>
53
64
  </div>
54
-
55
- <div class="ctaRow">
56
- <a class="btn btn--primary" href="./docs/index.html" aria-label="Read docs">
57
- <svg class="btn__icon" viewBox="0 0 24 24" fill="none" aria-hidden="true">
58
- <path d="M6 4h9l3 3v13a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2Z" stroke="currentColor" stroke-width="1.5"/>
59
- <path d="M15 4v4h4" stroke="currentColor" stroke-width="1.5"/>
60
- </svg>
61
- Docs
62
- </a>
63
- <a class="btn" href="https://github.com/steipete/summarize">
64
- <svg class="btn__icon" viewBox="0 0 24 24" fill="none" aria-hidden="true">
65
- <path d="M12 2a10 10 0 0 0-3.16 19.49c.5.09.68-.22.68-.48v-1.7c-2.77.6-3.35-1.18-3.35-1.18-.45-1.14-1.1-1.45-1.1-1.45-.9-.62.07-.6.07-.6 1 .07 1.52 1.02 1.52 1.02.9 1.52 2.36 1.08 2.94.82.09-.64.35-1.08.63-1.33-2.2-.25-4.52-1.1-4.52-4.88 0-1.08.39-1.96 1.02-2.65-.1-.25-.44-1.27.1-2.65 0 0 .84-.27 2.75 1.02a9.46 9.46 0 0 1 5 0c1.9-1.29 2.75-1.02 2.75-1.02.54 1.38.2 2.4.1 2.65.64.69 1.02 1.57 1.02 2.65 0 3.79-2.33 4.63-4.55 4.88.36.31.68.92.68 1.86v2.76c0 .26.18.58.69.48A10 10 0 0 0 12 2Z" fill="currentColor" opacity=".9"/>
66
- </svg>
67
- Repo
68
- </a>
65
+ <div class="quickRow__actions">
66
+ <button class="btn" data-copy="#install">Copy install</button>
67
+ <button class="btn" data-copy="#run">Copy run</button>
69
68
  </div>
70
69
  </div>
70
+ </div>
71
71
 
72
- <aside class="codeCard">
73
- <p class="kicker">Quickstart</p>
72
+ <div class="hero__visual">
73
+ <figure class="shot shot--cli">
74
+ <img src="./assets/summarize-cli.png" alt="Summarize CLI output" loading="lazy" />
75
+ <figcaption>CLI: streaming summaries in the terminal.</figcaption>
76
+ </figure>
77
+ <figure class="shot shot--ext">
78
+ <img
79
+ src="./assets/summarize-extension.png"
80
+ alt="Summarize Chrome extension side panel"
81
+ loading="lazy"
82
+ />
83
+ <figcaption>Extension: a live Side Panel for the active tab.</figcaption>
84
+ </figure>
85
+ </div>
86
+ </div>
87
+ </section>
74
88
 
75
- <div class="terminal">
76
- <div class="terminal__bar" aria-hidden="true">
77
- <span class="terminal__dot terminal__dot--a"></span>
78
- <span class="terminal__dot terminal__dot--b"></span>
79
- <span class="terminal__dot terminal__dot--c"></span>
80
- </div>
81
- <pre><code id="install">npm i -g @steipete/summarize</code>
82
- <code id="run">summarize "https://example.com/article"</code></pre>
83
- </div>
89
+ <section class="productGrid" aria-label="Products">
90
+ <article class="productCard reveal" id="cli">
91
+ <div class="productCard__head">
92
+ <span class="badge">CLI</span>
93
+ <h2>Fast summaries, scripted or interactive.</h2>
94
+ </div>
95
+ <p>
96
+ Built for automation: extract clean text, summarize with your model, and output JSON or
97
+ Markdown. Works with URLs, PDFs, images, audio/video, YouTube, and podcasts.
98
+ </p>
99
+ <ul class="list">
100
+ <li><strong>Extract + summarize</strong> with Firecrawl fallback.</li>
101
+ <li>
102
+ <strong>Media pipeline</strong> with transcript-first flow and Whisper fallback.
103
+ </li>
104
+ <li>
105
+ <strong>Scriptable output</strong> via <code>--json</code>, <code>--extract</code>,
106
+ <code>--metrics</code>.
107
+ </li>
108
+ </ul>
109
+ <div class="cardCode">
110
+ <pre><code>summarize "https://example.com" --length long
111
+ summarize "https://youtu.be/..." --youtube auto
112
+ summarize "/path/report.pdf" --model google/gemini-3-flash-preview</code></pre>
113
+ </div>
114
+ <div class="ctaRow">
115
+ <a class="btn btn--ghost" href="./docs/cli.html">CLI docs</a>
116
+ <a class="btn" href="./docs/config.html">Config</a>
117
+ </div>
118
+ </article>
84
119
 
85
- <div class="copyRow">
86
- <span class="hint">Install, then summarize a URL.</span>
87
- <div class="ctaRow" style="margin-top:0">
88
- <button class="btn" data-copy="#install">Copy install</button>
89
- <button class="btn" data-copy="#run">Copy run</button>
90
- </div>
91
- </div>
92
- </aside>
120
+ <article class="productCard reveal" id="extension">
121
+ <div class="productCard__head">
122
+ <span class="badge badge--alt">Chrome Extension</span>
123
+ <h2>Summaries in the Side Panel, one click away.</h2>
93
124
  </div>
94
- </div>
125
+ <p>
126
+ A real Chrome Side Panel with a tiny local daemon. It streams Markdown summaries for the
127
+ active tab, with auto-summary on navigation.
128
+ </p>
129
+ <ol class="steps">
130
+ <li>Install the CLI + daemon.</li>
131
+ <li>Load the unpacked extension.</li>
132
+ <li>Open Side Panel and connect with the token.</li>
133
+ </ol>
134
+ <div class="callout">
135
+ <strong>Runs locally</strong> on your machine. The daemon is localhost-only and
136
+ token-protected.
137
+ </div>
138
+ <div class="ctaRow">
139
+ <a class="btn btn--ghost" href="./docs/chrome-extension.html">Extension docs</a>
140
+ <a class="btn" href="https://github.com/steipete/summarize/releases/latest"
141
+ >Latest release</a
142
+ >
143
+ </div>
144
+ </article>
95
145
  </section>
96
146
 
97
- <section class="grid" aria-label="Features">
98
- <div class="card reveal">
99
- <h2>Extraction that’s not naive</h2>
100
- <p>HTML normalized text, with fallbacks when a site fights back.</p>
101
- <div class="small">Cheerio + sanitization + optional Firecrawl</div>
147
+ <section class="capGrid" aria-label="Capabilities">
148
+ <div class="capCard reveal">
149
+ <span class="capCard__eyebrow">Extraction</span>
150
+ <h3>HTML -> clean text -> summary</h3>
151
+ <p>Readability, markitdown, and Firecrawl fallback when sites fight back.</p>
102
152
  </div>
103
- <div class="card reveal">
104
- <h2>Podcast-friendly</h2>
105
- <p>Apple/Spotify/RSS episode pages, plus embedded YouTube podcasts.</p>
106
- <div class="small">Prefers published transcripts; Whisper fallback</div>
153
+ <div class="capCard reveal">
154
+ <span class="capCard__eyebrow">Media</span>
155
+ <h3>Podcast + YouTube aware</h3>
156
+ <p>Prefers published transcripts, then Whisper when needed.</p>
107
157
  </div>
108
- <div class="card reveal">
109
- <h2>YouTube transcripts, without drama</h2>
110
- <p>Pull captions via multiple paths so “missing transcript” becomes rare.</p>
111
- <div class="small">Website vs YouTube modes</div>
158
+ <div class="capCard reveal">
159
+ <span class="capCard__eyebrow">Models</span>
160
+ <h3>Provider-agnostic</h3>
161
+ <p>Local OpenAI-compatible gateways, paid providers, and OpenRouter free models.</p>
112
162
  </div>
113
- <div class="card reveal">
114
- <h2>Built for pipelines</h2>
115
- <p><code>--extract</code>, <code>--json</code>, and <code>--metrics</code> make it scriptable.</p>
116
- <div class="small">Compose it with your own tools</div>
163
+ <div class="capCard reveal">
164
+ <span class="capCard__eyebrow">Outputs</span>
165
+ <h3>Readable + scriptable</h3>
166
+ <p>Streaming TTY output, ANSI Markdown, JSON diagnostics, and metrics.</p>
117
167
  </div>
118
- <div class="card reveal">
119
- <h2>Provider-agnostic LLMs</h2>
120
- <p>OpenAI, xAI, Gemini — use what you’ve got, pin what you need.</p>
121
- <div class="small">Control via <code>--model</code> + env vars</div>
168
+ </section>
169
+
170
+ <section class="flow">
171
+ <div class="flow__card reveal">
172
+ <h2>How it works</h2>
173
+ <div class="flow__steps">
174
+ <div class="flowStep">
175
+ <span class="flowStep__num">01</span>
176
+ <div>
177
+ <h4>Fetch + extract</h4>
178
+ <p>Pull the source, clean HTML, normalize, or convert to Markdown.</p>
179
+ </div>
180
+ </div>
181
+ <div class="flowStep">
182
+ <span class="flowStep__num">02</span>
183
+ <div>
184
+ <h4>Transcript when needed</h4>
185
+ <p>Use published transcripts, then Whisper fallback for media.</p>
186
+ </div>
187
+ </div>
188
+ <div class="flowStep">
189
+ <span class="flowStep__num">03</span>
190
+ <div>
191
+ <h4>Summarize + format</h4>
192
+ <p>LLM output, streaming in the CLI or Side Panel, with metrics.</p>
193
+ </div>
194
+ </div>
195
+ </div>
122
196
  </div>
123
- <div class="card reveal">
124
- <h2>Chrome side panel</h2>
125
- <p>Summarize the active tab without leaving your browser.</p>
126
- <div class="small">
127
- Companion extension for the CLI. Download from the
128
- <a href="https://github.com/steipete/summarize/releases/latest">latest GitHub release</a>.
197
+ </section>
198
+
199
+ <section class="more">
200
+ <div class="more__card reveal">
201
+ <h2>More</h2>
202
+ <div class="more__grid">
203
+ <a class="moreLink" href="./docs/website.html">Website extraction</a>
204
+ <a class="moreLink" href="./docs/youtube.html">YouTube transcripts</a>
205
+ <a class="moreLink" href="./docs/media.html">Media pipeline</a>
206
+ <a class="moreLink" href="./docs/model-auto.html">Auto model rules</a>
207
+ <a class="moreLink" href="./docs/llm.html">Model + key setup</a>
208
+ <a class="moreLink" href="./docs/config.html">Config schema</a>
129
209
  </div>
130
210
  </div>
131
211
  </section>
132
212
 
133
213
  <footer class="footer">
134
214
  <span>Canonical: <a href="https://summarize.sh">summarize.sh</a></span>
135
- <span><a href="./docs/index.html">Docs</a> · <a href="https://github.com/steipete/summarize">GitHub</a></span>
215
+ <span
216
+ ><a href="./docs/index.html">Docs</a> ·
217
+ <a href="https://github.com/steipete/summarize">GitHub</a></span
218
+ >
136
219
  </footer>
137
220
  </main>
138
221
 
package/docs/slides.md ADDED
@@ -0,0 +1,82 @@
1
+ ---
2
+ summary: "Plan for slide-first UX without model usage."
3
+ read_when:
4
+ - "When changing slide summaries, slide UI, or slide/seek behavior in the side panel."
5
+ ---
6
+
7
+ # Slides plan (no model)
8
+
9
+ ## Goals
10
+
11
+ - Expanded slides view = full-width cards, top of summary.
12
+ - Click slide = seek video timestamp (no modal).
13
+ - Descriptions scale with length setting.
14
+ - Always show all slides (even if text missing).
15
+ - No model call for slide descriptions.
16
+
17
+ ## Data sources
18
+
19
+ - Primary: transcript timed text (already available with timestamps).
20
+ - Secondary: OCR text from slides (truncate, selectable).
21
+ - Tertiary: empty description (still render card).
22
+
23
+ ## Description generation (no model)
24
+
25
+ - For each slide timestamp `t`:
26
+ - Pull transcript segments within a time window around `t`.
27
+ - Concatenate into plain text (no bullets).
28
+ - If no transcript: use OCR text (trim).
29
+ - If neither: empty string.
30
+ - Always render all slide cards; missing text → show slide only.
31
+
32
+ ## Length scaling
33
+
34
+ - Map summary length to per-slide target chars.
35
+ - Use existing length presets (short/medium/long/xl/xxl + custom):
36
+ - `short`: ~120 chars/slide
37
+ - `medium`: ~200 chars/slide
38
+ - `long`: ~320 chars/slide
39
+ - `xl`: ~480 chars/slide
40
+ - `xxl`: ~700 chars/slide
41
+ - custom: derive from maxCharacters (e.g. `maxChars / min(slideCount, 10)`, clamp).
42
+ - Clamp per-slide text: `[80, 900]` chars.
43
+ - Window size should expand with length (e.g. 20s → 90s).
44
+
45
+ ## UI behavior
46
+
47
+ - Default summary stays unchanged (no slide text).
48
+ - Slide strip (compact) stays horizontal; no modal required.
49
+ - Expand toggle switches to vertical full-width list:
50
+ - cards: thumbnail, timestamp, text.
51
+ - cards appear above summary.
52
+ - Slide click: seek only (no modal).
53
+ - OCR toggle appears near summarize control only when OCR is significant
54
+ (enough slides + total OCR chars); otherwise hide it.
55
+
56
+ ## CLI
57
+
58
+ - `summarize <url> --slides` streams a short intro paragraph and then a continuous narrative with slide images inserted inline where `[slide:N]` markers appear.
59
+ - The model is responsible for inserting every slide marker in order; text length is still governed by `--length`.
60
+ - If inline images are unsupported, the CLI prints text-only output and notes how to export slides to disk.
61
+ - Timestamp links use OSC-8 when supported (YouTube/Vimeo/Loom/Dropbox).
62
+ - Progress line reports slide extraction steps (includes slide counts when available).
63
+ - `summarize <url> --slides --extract` prints the full timed transcript and inserts slide images inline at matching timestamps.
64
+ - `summarize slides <url>` extracts slides without summarizing (use `--render auto|kitty|iterm` for inline thumbnails).
65
+ - Defaults to writing images under `./slides/<sourceId>/` (override via `--slides-dir` / `--output`).
66
+
67
+ ## Implementation notes
68
+
69
+ - Build `slideDescriptions` map in panel:
70
+ - Use `summary.timedText` when available.
71
+ - Split transcript into segments with timestamps (already in payload).
72
+ - Store per-slide text on client (no daemon model calls).
73
+ - Ensure summary cache keys untouched; only client-only rendering.
74
+ - Slide extraction downloads the media once for detect+extract; set `SLIDES_EXTRACT_STREAM=1` to allow stream fallback (lower accuracy).
75
+
76
+ ## Steps
77
+
78
+ 1. Add slide-description builder in sidepanel using transcript timed text + OCR fallback.
79
+ 2. Add length-based per-slide char budget and window sizing.
80
+ 3. Render expanded card list with timestamps + text.
81
+ 4. Remove modal; click = seek only.
82
+ 5. Add tests for slide description + fallback.
package/docs/smoketest.md CHANGED
@@ -9,55 +9,64 @@ read_when:
9
9
  Goal: exercise URL + file inputs, extraction + LLM summary paths, multiple models.
10
10
 
11
11
  ## Preconditions
12
+
12
13
  - API keys set for at least: `OPENAI_API_KEY`, `GEMINI_API_KEY`.
13
14
  - Optional: `FIRECRAWL_API_KEY` to test fallback (if available).
14
15
 
15
16
  ## Models (cheap/fast)
17
+
16
18
  - `openai/gpt-5-mini`
17
19
  - `google/gemini-3-flash-preview`
18
20
 
19
21
  ## Matrix (20 cases)
20
22
 
21
23
  ### Websites (LLM summary, 10)
22
- 1) Static HTML: `https://example.com` (model: gemini-3-flash)
23
- 2) Wikipedia article: `https://en.wikipedia.org/wiki/Swift_(programming_language)` (model: gpt-5-mini)
24
- 3) MDN doc: `https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200` (model: gemini-3-flash)
25
- 4) Reuters article: `https://www.reuters.com/world/` (model: gpt-5-mini)
26
- 5) BBC article: `https://www.bbc.com/news` (model: gemini-3-flash)
27
- 6) GitHub README: `https://github.com/vitejs/vite` (model: gpt-5-mini)
28
- 7) Substack post: pick any public post (model: gemini-3-flash)
29
- 8) Medium post: pick any public post (model: gpt-5-mini)
30
- 9) JS-heavy page: `https://vercel.com` (model: gemini-3-flash)
31
- 10) 404 page: `https://example.com/does-not-exist` (model: gpt-5-mini)
24
+
25
+ 1. Static HTML: `https://example.com` (model: gemini-3-flash)
26
+ 2. Wikipedia article: `https://en.wikipedia.org/wiki/Swift_(programming_language)` (model: gpt-5-mini)
27
+ 3. MDN doc: `https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/200` (model: gemini-3-flash)
28
+ 4. Reuters article: `https://www.reuters.com/world/` (model: gpt-5-mini)
29
+ 5. BBC article: `https://www.bbc.com/news` (model: gemini-3-flash)
30
+ 6. GitHub README: `https://github.com/vitejs/vite` (model: gpt-5-mini)
31
+ 7. Substack post: pick any public post (model: gemini-3-flash)
32
+ 8. Medium post: pick any public post (model: gpt-5-mini)
33
+ 9. JS-heavy page: `https://vercel.com` (model: gemini-3-flash)
34
+ 10. 404 page: `https://example.com/does-not-exist` (model: gpt-5-mini)
32
35
 
33
36
  ### YouTube (LLM summary, 2)
34
- 11) Captions available: pick a popular talk/interview (model: gemini-3-flash, `--youtube auto`)
35
- 12) No captions: pick a random channel upload w/o captions (model: gpt-5-mini, `--youtube auto`)
37
+
38
+ 11. Captions available: pick a popular talk/interview (model: gemini-3-flash, `--youtube auto`)
39
+ 12. No captions: pick a random channel upload w/o captions (model: gpt-5-mini, `--youtube auto`)
36
40
 
37
41
  ### Remote files (LLM summary, 4)
38
- 13) PDF URL: any public PDF report (model: gemini-3-flash)
39
- 14) PNG URL: `https://upload.wikimedia.org/wikipedia/commons/7/70/Example.png` (model: gpt-5-mini)
40
- 15) MP3 URL: any public MP3 sample (model: gemini-3-flash)
41
- 16) CSV URL: any public CSV sample (model: gpt-5-mini)
42
+
43
+ 13. PDF URL: any public PDF report (model: gemini-3-flash)
44
+ 14. PNG URL: `https://upload.wikimedia.org/wikipedia/commons/7/70/Example.png` (model: gpt-5-mini)
45
+ 15. MP3 URL: any public MP3 sample (model: gemini-3-flash)
46
+ 16. CSV URL: any public CSV sample (model: gpt-5-mini)
42
47
 
43
48
  ### Local files (LLM summary, 4)
44
- 17) `tests/fixtures/sample.txt` (create if missing) (model: gemini-3-flash)
45
- 18) `tests/fixtures/sample.md` (create if missing) (model: gpt-5-mini)
46
- 19) `tests/fixtures/sample.json` (create if missing) (model: gemini-3-flash)
47
- 20) `tests/fixtures/sample.png` (create if missing; use a real PNG, not 1x1) (model: gpt-5-mini)
49
+
50
+ 17. `tests/fixtures/sample.txt` (create if missing) (model: gemini-3-flash)
51
+ 18. `tests/fixtures/sample.md` (create if missing) (model: gpt-5-mini)
52
+ 19. `tests/fixtures/sample.json` (create if missing) (model: gemini-3-flash)
53
+ 20. `tests/fixtures/sample.png` (create if missing; use a real PNG, not 1x1) (model: gpt-5-mini)
48
54
 
49
55
  ## Commands (template)
56
+
50
57
  - Website: `pnpm summarize -- "<url>" --model <model> --length short`
51
58
  - YouTube: `pnpm summarize -- "<url>" --model <model> --youtube auto`
52
59
  - File URL: `pnpm summarize -- "<url>" --model <model>`
53
60
  - Local file: `pnpm summarize -- "<path>" --model <model>`
54
61
 
55
62
  ## Capture
63
+
56
64
  - Log: stdout + stderr, exit code, and timing line.
57
65
  - Note extraction path (HTML vs Firecrawl vs YouTube transcript).
58
66
  - File errors: media type rejection, size limits, token preflight.
59
67
 
60
68
  ## Bug bar
69
+
61
70
  - Crash, hang, or non-zero exit.
62
71
  - Empty summary with non-empty input.
63
72
  - Incorrect mode selection (e.g., YouTube treated as normal URL).