@steipete/summarize 0.11.1 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (427) hide show
  1. package/CHANGELOG.md +73 -1
  2. package/README.md +102 -32
  3. package/dist/cli.js +1 -1
  4. package/dist/esm/cache-keys.js +83 -0
  5. package/dist/esm/cache-keys.js.map +1 -0
  6. package/dist/esm/cache-slides-cleanup.js +47 -0
  7. package/dist/esm/cache-slides-cleanup.js.map +1 -0
  8. package/dist/esm/cache.js +15 -92
  9. package/dist/esm/cache.js.map +1 -1
  10. package/dist/esm/config/env.js +49 -0
  11. package/dist/esm/config/env.js.map +1 -0
  12. package/dist/esm/config/model.js +193 -0
  13. package/dist/esm/config/model.js.map +1 -0
  14. package/dist/esm/config/parse-helpers.js +55 -0
  15. package/dist/esm/config/parse-helpers.js.map +1 -0
  16. package/dist/esm/config/read.js +83 -0
  17. package/dist/esm/config/read.js.map +1 -0
  18. package/dist/esm/config/sections.js +472 -0
  19. package/dist/esm/config/sections.js.map +1 -0
  20. package/dist/esm/config/types.js +2 -0
  21. package/dist/esm/config/types.js.map +1 -0
  22. package/dist/esm/config.js +24 -807
  23. package/dist/esm/config.js.map +1 -1
  24. package/dist/esm/content/asset.js +2 -2
  25. package/dist/esm/content/asset.js.map +1 -1
  26. package/dist/esm/costs.js.map +1 -1
  27. package/dist/esm/daemon/agent-model.js +283 -0
  28. package/dist/esm/daemon/agent-model.js.map +1 -0
  29. package/dist/esm/daemon/agent-request.js +87 -0
  30. package/dist/esm/daemon/agent-request.js.map +1 -0
  31. package/dist/esm/daemon/agent.js +42 -243
  32. package/dist/esm/daemon/agent.js.map +1 -1
  33. package/dist/esm/daemon/chat.js +118 -9
  34. package/dist/esm/daemon/chat.js.map +1 -1
  35. package/dist/esm/daemon/cli.js +121 -9
  36. package/dist/esm/daemon/cli.js.map +1 -1
  37. package/dist/esm/daemon/config.js +65 -9
  38. package/dist/esm/daemon/config.js.map +1 -1
  39. package/dist/esm/daemon/env-snapshot.js +6 -0
  40. package/dist/esm/daemon/env-snapshot.js.map +1 -1
  41. package/dist/esm/daemon/flow-context.js +84 -74
  42. package/dist/esm/daemon/flow-context.js.map +1 -1
  43. package/dist/esm/daemon/models.js +26 -0
  44. package/dist/esm/daemon/models.js.map +1 -1
  45. package/dist/esm/daemon/process-registry.js.map +1 -1
  46. package/dist/esm/daemon/schtasks.js +101 -5
  47. package/dist/esm/daemon/schtasks.js.map +1 -1
  48. package/dist/esm/daemon/server-admin-routes.js +134 -0
  49. package/dist/esm/daemon/server-admin-routes.js.map +1 -0
  50. package/dist/esm/daemon/server-agent-route.js +104 -0
  51. package/dist/esm/daemon/server-agent-route.js.map +1 -0
  52. package/dist/esm/daemon/server-http.js +89 -0
  53. package/dist/esm/daemon/server-http.js.map +1 -0
  54. package/dist/esm/daemon/server-session-routes.js +209 -0
  55. package/dist/esm/daemon/server-session-routes.js.map +1 -0
  56. package/dist/esm/daemon/server-session.js +118 -0
  57. package/dist/esm/daemon/server-session.js.map +1 -0
  58. package/dist/esm/daemon/server-sse.js +28 -0
  59. package/dist/esm/daemon/server-sse.js.map +1 -0
  60. package/dist/esm/daemon/server-summarize-execution.js +357 -0
  61. package/dist/esm/daemon/server-summarize-execution.js.map +1 -0
  62. package/dist/esm/daemon/server-summarize-request.js +119 -0
  63. package/dist/esm/daemon/server-summarize-request.js.map +1 -0
  64. package/dist/esm/daemon/server.js +79 -1121
  65. package/dist/esm/daemon/server.js.map +1 -1
  66. package/dist/esm/daemon/summarize-progress.js +1 -1
  67. package/dist/esm/daemon/summarize-progress.js.map +1 -1
  68. package/dist/esm/daemon/summarize.js.map +1 -1
  69. package/dist/esm/daemon/windows-container.js +21 -0
  70. package/dist/esm/daemon/windows-container.js.map +1 -0
  71. package/dist/esm/llm/cli-exec.js +75 -0
  72. package/dist/esm/llm/cli-exec.js.map +1 -0
  73. package/dist/esm/llm/cli-provider-output.js +415 -0
  74. package/dist/esm/llm/cli-provider-output.js.map +1 -0
  75. package/dist/esm/llm/cli.js +97 -218
  76. package/dist/esm/llm/cli.js.map +1 -1
  77. package/dist/esm/llm/generate-text-document.js +109 -0
  78. package/dist/esm/llm/generate-text-document.js.map +1 -0
  79. package/dist/esm/llm/generate-text-shared.js +121 -0
  80. package/dist/esm/llm/generate-text-shared.js.map +1 -0
  81. package/dist/esm/llm/generate-text-stream.js +291 -0
  82. package/dist/esm/llm/generate-text-stream.js.map +1 -0
  83. package/dist/esm/llm/generate-text.js +172 -480
  84. package/dist/esm/llm/generate-text.js.map +1 -1
  85. package/dist/esm/llm/github-models.js +45 -0
  86. package/dist/esm/llm/github-models.js.map +1 -0
  87. package/dist/esm/llm/html-to-markdown.js.map +1 -1
  88. package/dist/esm/llm/model-id.js +37 -20
  89. package/dist/esm/llm/model-id.js.map +1 -1
  90. package/dist/esm/llm/provider-capabilities.js +2 -0
  91. package/dist/esm/llm/provider-capabilities.js.map +1 -0
  92. package/dist/esm/llm/provider-profile.js +184 -0
  93. package/dist/esm/llm/provider-profile.js.map +1 -0
  94. package/dist/esm/llm/providers/google.js +42 -5
  95. package/dist/esm/llm/providers/google.js.map +1 -1
  96. package/dist/esm/llm/providers/models.js +19 -1
  97. package/dist/esm/llm/providers/models.js.map +1 -1
  98. package/dist/esm/llm/providers/openai.js +243 -5
  99. package/dist/esm/llm/providers/openai.js.map +1 -1
  100. package/dist/esm/llm/transcript-to-markdown.js.map +1 -1
  101. package/dist/esm/media-cache.js +3 -0
  102. package/dist/esm/media-cache.js.map +1 -1
  103. package/dist/esm/model-auto-cli.js +91 -0
  104. package/dist/esm/model-auto-cli.js.map +1 -0
  105. package/dist/esm/model-auto-rules.js +86 -0
  106. package/dist/esm/model-auto-rules.js.map +1 -0
  107. package/dist/esm/model-auto.js +10 -245
  108. package/dist/esm/model-auto.js.map +1 -1
  109. package/dist/esm/model-spec.js +62 -19
  110. package/dist/esm/model-spec.js.map +1 -1
  111. package/dist/esm/refresh-free.js +1 -1
  112. package/dist/esm/refresh-free.js.map +1 -1
  113. package/dist/esm/run/attachments.js +1 -1
  114. package/dist/esm/run/attachments.js.map +1 -1
  115. package/dist/esm/run/bird/exec.js +23 -0
  116. package/dist/esm/run/bird/exec.js.map +1 -0
  117. package/dist/esm/run/bird/media.js +171 -0
  118. package/dist/esm/run/bird/media.js.map +1 -0
  119. package/dist/esm/run/bird/parse.js +82 -0
  120. package/dist/esm/run/bird/parse.js.map +1 -0
  121. package/dist/esm/run/bird/types.js +2 -0
  122. package/dist/esm/run/bird/types.js.map +1 -0
  123. package/dist/esm/run/bird.js +86 -144
  124. package/dist/esm/run/bird.js.map +1 -1
  125. package/dist/esm/run/cache-state.js.map +1 -1
  126. package/dist/esm/run/cli-fallback-state.js +6 -1
  127. package/dist/esm/run/cli-fallback-state.js.map +1 -1
  128. package/dist/esm/run/constants.js +2 -1
  129. package/dist/esm/run/constants.js.map +1 -1
  130. package/dist/esm/run/env.js +24 -3
  131. package/dist/esm/run/env.js.map +1 -1
  132. package/dist/esm/run/finish-line-labels.js +76 -0
  133. package/dist/esm/run/finish-line-labels.js.map +1 -0
  134. package/dist/esm/run/finish-line-lengths.js +96 -0
  135. package/dist/esm/run/finish-line-lengths.js.map +1 -0
  136. package/dist/esm/run/finish-line.js +3 -169
  137. package/dist/esm/run/finish-line.js.map +1 -1
  138. package/dist/esm/run/flows/asset/extract.js.map +1 -1
  139. package/dist/esm/run/flows/asset/input.js +1 -1
  140. package/dist/esm/run/flows/asset/input.js.map +1 -1
  141. package/dist/esm/run/flows/asset/media.js +19 -10
  142. package/dist/esm/run/flows/asset/media.js.map +1 -1
  143. package/dist/esm/run/flows/asset/output.js.map +1 -1
  144. package/dist/esm/run/flows/asset/preprocess.js.map +1 -1
  145. package/dist/esm/run/flows/asset/summary-attempts.js +117 -0
  146. package/dist/esm/run/flows/asset/summary-attempts.js.map +1 -0
  147. package/dist/esm/run/flows/asset/summary.js +30 -107
  148. package/dist/esm/run/flows/asset/summary.js.map +1 -1
  149. package/dist/esm/run/flows/url/extract.js +7 -4
  150. package/dist/esm/run/flows/url/extract.js.map +1 -1
  151. package/dist/esm/run/flows/url/extraction-session.js +174 -0
  152. package/dist/esm/run/flows/url/extraction-session.js.map +1 -0
  153. package/dist/esm/run/flows/url/fetch-options.js +32 -0
  154. package/dist/esm/run/flows/url/fetch-options.js.map +1 -0
  155. package/dist/esm/run/flows/url/flow-progress.js +123 -0
  156. package/dist/esm/run/flows/url/flow-progress.js.map +1 -0
  157. package/dist/esm/run/flows/url/flow.js +70 -462
  158. package/dist/esm/run/flows/url/flow.js.map +1 -1
  159. package/dist/esm/run/flows/url/markdown.js +38 -3
  160. package/dist/esm/run/flows/url/markdown.js.map +1 -1
  161. package/dist/esm/run/flows/url/progress-status-state.js +28 -0
  162. package/dist/esm/run/flows/url/progress-status-state.js.map +1 -0
  163. package/dist/esm/run/flows/url/progress-status.js +51 -0
  164. package/dist/esm/run/flows/url/progress-status.js.map +1 -0
  165. package/dist/esm/run/flows/url/slides-output-render.js +78 -0
  166. package/dist/esm/run/flows/url/slides-output-render.js.map +1 -0
  167. package/dist/esm/run/flows/url/slides-output-state.js +86 -0
  168. package/dist/esm/run/flows/url/slides-output-state.js.map +1 -0
  169. package/dist/esm/run/flows/url/slides-output-stream.js +271 -0
  170. package/dist/esm/run/flows/url/slides-output-stream.js.map +1 -0
  171. package/dist/esm/run/flows/url/slides-output.js +29 -422
  172. package/dist/esm/run/flows/url/slides-output.js.map +1 -1
  173. package/dist/esm/run/flows/url/slides-session.js +159 -0
  174. package/dist/esm/run/flows/url/slides-session.js.map +1 -0
  175. package/dist/esm/run/flows/url/slides-text-markdown.js +431 -0
  176. package/dist/esm/run/flows/url/slides-text-markdown.js.map +1 -0
  177. package/dist/esm/run/flows/url/slides-text-transcript.js +199 -0
  178. package/dist/esm/run/flows/url/slides-text-transcript.js.map +1 -0
  179. package/dist/esm/run/flows/url/slides-text-types.js +2 -0
  180. package/dist/esm/run/flows/url/slides-text-types.js.map +1 -0
  181. package/dist/esm/run/flows/url/slides-text.js +2 -627
  182. package/dist/esm/run/flows/url/slides-text.js.map +1 -1
  183. package/dist/esm/run/flows/url/summary-finish.js +40 -0
  184. package/dist/esm/run/flows/url/summary-finish.js.map +1 -0
  185. package/dist/esm/run/flows/url/summary-json.js +32 -0
  186. package/dist/esm/run/flows/url/summary-json.js.map +1 -0
  187. package/dist/esm/run/flows/url/summary-prompt.js +147 -0
  188. package/dist/esm/run/flows/url/summary-prompt.js.map +1 -0
  189. package/dist/esm/run/flows/url/summary-resolution.js +327 -0
  190. package/dist/esm/run/flows/url/summary-resolution.js.map +1 -0
  191. package/dist/esm/run/flows/url/summary-timestamps.js +136 -0
  192. package/dist/esm/run/flows/url/summary-timestamps.js.map +1 -0
  193. package/dist/esm/run/flows/url/summary.js +139 -667
  194. package/dist/esm/run/flows/url/summary.js.map +1 -1
  195. package/dist/esm/run/flows/url/types.js +31 -1
  196. package/dist/esm/run/flows/url/types.js.map +1 -1
  197. package/dist/esm/run/flows/url/video-only.js +68 -0
  198. package/dist/esm/run/flows/url/video-only.js.map +1 -0
  199. package/dist/esm/run/help.js +15 -5
  200. package/dist/esm/run/help.js.map +1 -1
  201. package/dist/esm/run/markdown-transforms.js +89 -0
  202. package/dist/esm/run/markdown-transforms.js.map +1 -0
  203. package/dist/esm/run/markdown.js +1 -96
  204. package/dist/esm/run/markdown.js.map +1 -1
  205. package/dist/esm/run/run-config.js +1 -1
  206. package/dist/esm/run/run-config.js.map +1 -1
  207. package/dist/esm/run/run-env.js +28 -7
  208. package/dist/esm/run/run-env.js.map +1 -1
  209. package/dist/esm/run/run-models.js +35 -5
  210. package/dist/esm/run/run-models.js.map +1 -1
  211. package/dist/esm/run/run-settings-parse.js +77 -0
  212. package/dist/esm/run/run-settings-parse.js.map +1 -0
  213. package/dist/esm/run/run-settings.js +7 -72
  214. package/dist/esm/run/run-settings.js.map +1 -1
  215. package/dist/esm/run/runner-contexts.js +122 -0
  216. package/dist/esm/run/runner-contexts.js.map +1 -0
  217. package/dist/esm/run/runner-execution.js +82 -0
  218. package/dist/esm/run/runner-execution.js.map +1 -0
  219. package/dist/esm/run/runner-flags.js +97 -0
  220. package/dist/esm/run/runner-flags.js.map +1 -0
  221. package/dist/esm/run/runner-plan.js +369 -0
  222. package/dist/esm/run/runner-plan.js.map +1 -0
  223. package/dist/esm/run/runner-setup.js +109 -0
  224. package/dist/esm/run/runner-setup.js.map +1 -0
  225. package/dist/esm/run/runner-slides.js +49 -0
  226. package/dist/esm/run/runner-slides.js.map +1 -0
  227. package/dist/esm/run/runner.js +53 -692
  228. package/dist/esm/run/runner.js.map +1 -1
  229. package/dist/esm/run/slides-cli.js +3 -2
  230. package/dist/esm/run/slides-cli.js.map +1 -1
  231. package/dist/esm/run/slides-render.js +5 -2
  232. package/dist/esm/run/slides-render.js.map +1 -1
  233. package/dist/esm/run/stdin-temp-file.js +1 -1
  234. package/dist/esm/run/stdin-temp-file.js.map +1 -1
  235. package/dist/esm/run/streaming.js +2 -0
  236. package/dist/esm/run/streaming.js.map +1 -1
  237. package/dist/esm/run/summary-engine.js +50 -10
  238. package/dist/esm/run/summary-engine.js.map +1 -1
  239. package/dist/esm/run/summary-llm.js +2 -1
  240. package/dist/esm/run/summary-llm.js.map +1 -1
  241. package/dist/esm/run/terminal.js +4 -1
  242. package/dist/esm/run/terminal.js.map +1 -1
  243. package/dist/esm/run/transcriber-cli.js +1 -1
  244. package/dist/esm/run/transcriber-cli.js.map +1 -1
  245. package/dist/esm/shared/slides-text.js +2 -0
  246. package/dist/esm/shared/slides-text.js.map +1 -0
  247. package/dist/esm/slides/download.js +242 -0
  248. package/dist/esm/slides/download.js.map +1 -0
  249. package/dist/esm/slides/extract-finalize.js +98 -0
  250. package/dist/esm/slides/extract-finalize.js.map +1 -0
  251. package/dist/esm/slides/extract.js +105 -1685
  252. package/dist/esm/slides/extract.js.map +1 -1
  253. package/dist/esm/slides/frame-extraction.js +372 -0
  254. package/dist/esm/slides/frame-extraction.js.map +1 -0
  255. package/dist/esm/slides/index.js +2 -1
  256. package/dist/esm/slides/index.js.map +1 -1
  257. package/dist/esm/slides/ingest.js +194 -0
  258. package/dist/esm/slides/ingest.js.map +1 -0
  259. package/dist/esm/slides/ocr.js +91 -0
  260. package/dist/esm/slides/ocr.js.map +1 -0
  261. package/dist/esm/slides/process.js +218 -0
  262. package/dist/esm/slides/process.js.map +1 -0
  263. package/dist/esm/slides/scene-detection.js +387 -0
  264. package/dist/esm/slides/scene-detection.js.map +1 -0
  265. package/dist/esm/slides/source-id.js +42 -0
  266. package/dist/esm/slides/source-id.js.map +1 -0
  267. package/dist/esm/slides/source.js +80 -0
  268. package/dist/esm/slides/source.js.map +1 -0
  269. package/dist/esm/tty/progress/fetch-html.js +6 -0
  270. package/dist/esm/tty/progress/fetch-html.js.map +1 -1
  271. package/dist/esm/tty/progress/transcript-state.js +202 -0
  272. package/dist/esm/tty/progress/transcript-state.js.map +1 -0
  273. package/dist/esm/tty/progress/transcript.js +43 -194
  274. package/dist/esm/tty/progress/transcript.js.map +1 -1
  275. package/dist/esm/tty/spinner.js +17 -3
  276. package/dist/esm/tty/spinner.js.map +1 -1
  277. package/dist/esm/tty/website-progress.js +16 -3
  278. package/dist/esm/tty/website-progress.js.map +1 -1
  279. package/dist/esm/version.js +1 -1
  280. package/dist/types/cache-keys.d.ts +44 -0
  281. package/dist/types/cache-slides-cleanup.d.ts +1 -0
  282. package/dist/types/cache.d.ts +2 -10
  283. package/dist/types/config/env.d.ts +6 -0
  284. package/dist/types/config/model.d.ts +3 -0
  285. package/dist/types/config/parse-helpers.d.ts +7 -0
  286. package/dist/types/config/read.d.ts +2 -0
  287. package/dist/types/config/sections.d.ts +34 -0
  288. package/dist/types/config/types.d.ts +238 -0
  289. package/dist/types/config.d.ts +3 -209
  290. package/dist/types/costs.d.ts +1 -1
  291. package/dist/types/daemon/agent-model.d.ts +40 -0
  292. package/dist/types/daemon/agent-request.d.ts +14 -0
  293. package/dist/types/daemon/chat.d.ts +3 -1
  294. package/dist/types/daemon/config.d.ts +13 -2
  295. package/dist/types/daemon/env-snapshot.d.ts +1 -1
  296. package/dist/types/daemon/flow-context.d.ts +2 -2
  297. package/dist/types/daemon/models.d.ts +3 -0
  298. package/dist/types/daemon/schtasks.d.ts +2 -1
  299. package/dist/types/daemon/server-admin-routes.d.ts +22 -0
  300. package/dist/types/daemon/server-agent-route.d.ts +9 -0
  301. package/dist/types/daemon/server-http.d.ts +10 -0
  302. package/dist/types/daemon/server-session-routes.d.ts +11 -0
  303. package/dist/types/daemon/server-session.d.ts +52 -0
  304. package/dist/types/daemon/server-sse.d.ts +12 -0
  305. package/dist/types/daemon/server-summarize-execution.d.ts +70 -0
  306. package/dist/types/daemon/server-summarize-request.d.ts +36 -0
  307. package/dist/types/daemon/server.d.ts +4 -4
  308. package/dist/types/daemon/summarize.d.ts +1 -1
  309. package/dist/types/daemon/windows-container.d.ts +1 -0
  310. package/dist/types/llm/cli-exec.d.ts +13 -0
  311. package/dist/types/llm/cli-provider-output.d.ts +25 -0
  312. package/dist/types/llm/generate-text-document.d.ts +35 -0
  313. package/dist/types/llm/generate-text-shared.d.ts +32 -0
  314. package/dist/types/llm/generate-text-stream.d.ts +27 -0
  315. package/dist/types/llm/generate-text.d.ts +7 -26
  316. package/dist/types/llm/github-models.d.ts +5 -0
  317. package/dist/types/llm/html-to-markdown.d.ts +2 -1
  318. package/dist/types/llm/model-id.d.ts +1 -1
  319. package/dist/types/llm/provider-capabilities.d.ts +2 -0
  320. package/dist/types/llm/provider-profile.d.ts +31 -0
  321. package/dist/types/llm/providers/google.d.ts +6 -0
  322. package/dist/types/llm/providers/models.d.ts +5 -0
  323. package/dist/types/llm/providers/openai.d.ts +9 -5
  324. package/dist/types/llm/providers/types.d.ts +1 -0
  325. package/dist/types/llm/transcript-to-markdown.d.ts +2 -1
  326. package/dist/types/model-auto-cli.d.ts +15 -0
  327. package/dist/types/model-auto-rules.d.ts +7 -0
  328. package/dist/types/model-auto.d.ts +5 -7
  329. package/dist/types/model-spec.d.ts +4 -3
  330. package/dist/types/run/attachments.d.ts +3 -2
  331. package/dist/types/run/bird/exec.d.ts +1 -0
  332. package/dist/types/run/bird/media.d.ts +3 -0
  333. package/dist/types/run/bird/parse.d.ts +3 -0
  334. package/dist/types/run/bird/types.d.ts +18 -0
  335. package/dist/types/run/bird.d.ts +12 -17
  336. package/dist/types/run/cache-state.d.ts +1 -1
  337. package/dist/types/run/constants.d.ts +2 -1
  338. package/dist/types/run/env.d.ts +6 -0
  339. package/dist/types/run/finish-line-labels.d.ts +29 -0
  340. package/dist/types/run/finish-line-lengths.d.ts +23 -0
  341. package/dist/types/run/finish-line.d.ts +2 -52
  342. package/dist/types/run/flows/asset/extract.d.ts +1 -1
  343. package/dist/types/run/flows/asset/input.d.ts +1 -1
  344. package/dist/types/run/flows/asset/preprocess.d.ts +1 -1
  345. package/dist/types/run/flows/asset/summary-attempts.d.ts +24 -0
  346. package/dist/types/run/flows/asset/summary.d.ts +16 -2
  347. package/dist/types/run/flows/url/extraction-session.d.ts +22 -0
  348. package/dist/types/run/flows/url/fetch-options.d.ts +29 -0
  349. package/dist/types/run/flows/url/flow-progress.d.ts +43 -0
  350. package/dist/types/run/flows/url/markdown.d.ts +2 -2
  351. package/dist/types/run/flows/url/progress-status-state.d.ts +17 -0
  352. package/dist/types/run/flows/url/progress-status.d.ts +17 -0
  353. package/dist/types/run/flows/url/slides-output-render.d.ts +43 -0
  354. package/dist/types/run/flows/url/slides-output-state.d.ts +21 -0
  355. package/dist/types/run/flows/url/slides-output-stream.d.ts +18 -0
  356. package/dist/types/run/flows/url/slides-output.d.ts +2 -17
  357. package/dist/types/run/flows/url/slides-session.d.ts +26 -0
  358. package/dist/types/run/flows/url/slides-text-markdown.d.ts +46 -0
  359. package/dist/types/run/flows/url/slides-text-transcript.d.ts +36 -0
  360. package/dist/types/run/flows/url/slides-text-types.d.ts +8 -0
  361. package/dist/types/run/flows/url/slides-text.d.ts +3 -87
  362. package/dist/types/run/flows/url/summary-finish.d.ts +16 -0
  363. package/dist/types/run/flows/url/summary-json.d.ts +51 -0
  364. package/dist/types/run/flows/url/summary-prompt.d.ts +22 -0
  365. package/dist/types/run/flows/url/summary-resolution.d.ts +31 -0
  366. package/dist/types/run/flows/url/summary-timestamps.d.ts +11 -0
  367. package/dist/types/run/flows/url/types.d.ts +20 -0
  368. package/dist/types/run/flows/url/video-only.d.ts +27 -0
  369. package/dist/types/run/markdown-transforms.d.ts +3 -0
  370. package/dist/types/run/run-context.d.ts +4 -0
  371. package/dist/types/run/run-env.d.ts +4 -0
  372. package/dist/types/run/run-settings-parse.d.ts +5 -0
  373. package/dist/types/run/run-settings.d.ts +2 -1
  374. package/dist/types/run/runner-contexts.d.ts +37 -0
  375. package/dist/types/run/runner-execution.d.ts +58 -0
  376. package/dist/types/run/runner-flags.d.ts +41 -0
  377. package/dist/types/run/runner-plan.d.ts +19 -0
  378. package/dist/types/run/runner-setup.d.ts +21 -0
  379. package/dist/types/run/runner-slides.d.ts +9 -0
  380. package/dist/types/run/streaming.d.ts +2 -1
  381. package/dist/types/run/summary-engine.d.ts +8 -4
  382. package/dist/types/run/summary-llm.d.ts +5 -3
  383. package/dist/types/run/terminal.d.ts +2 -0
  384. package/dist/types/run/types.d.ts +3 -2
  385. package/dist/types/shared/slides-text.d.ts +1 -0
  386. package/dist/types/slides/download.d.ts +29 -0
  387. package/dist/types/slides/extract-finalize.d.ts +57 -0
  388. package/dist/types/slides/extract.d.ts +2 -13
  389. package/dist/types/slides/frame-extraction.d.ts +38 -0
  390. package/dist/types/slides/index.d.ts +2 -1
  391. package/dist/types/slides/ingest.d.ts +47 -0
  392. package/dist/types/slides/ocr.d.ts +5 -0
  393. package/dist/types/slides/process.d.ts +22 -0
  394. package/dist/types/slides/scene-detection.d.ts +75 -0
  395. package/dist/types/slides/source-id.d.ts +2 -0
  396. package/dist/types/slides/source.d.ts +8 -0
  397. package/dist/types/tty/progress/fetch-html.d.ts +1 -0
  398. package/dist/types/tty/progress/transcript-state.d.ts +27 -0
  399. package/dist/types/tty/progress/transcript.d.ts +1 -0
  400. package/dist/types/tty/spinner.d.ts +1 -0
  401. package/dist/types/version.d.ts +1 -1
  402. package/docs/README.md +1 -1
  403. package/docs/_config.yml +1 -0
  404. package/docs/agent.md +3 -2
  405. package/docs/assets/site.css +145 -2
  406. package/docs/cache.md +2 -1
  407. package/docs/chrome-extension.md +19 -5
  408. package/docs/cli.md +26 -8
  409. package/docs/config.md +30 -9
  410. package/docs/extract-only.md +2 -2
  411. package/docs/firecrawl.md +2 -1
  412. package/docs/index.html +5 -0
  413. package/docs/llm.md +34 -5
  414. package/docs/manual-tests.md +3 -0
  415. package/docs/media.md +9 -1
  416. package/docs/model-auto.md +2 -2
  417. package/docs/model-provider-resolution.md +57 -0
  418. package/docs/releasing.md +9 -12
  419. package/docs/site/docs/chrome-extension.html +1 -1
  420. package/docs/site/index.html +5 -0
  421. package/docs/slides-rendering-flow.md +46 -0
  422. package/docs/slides.md +5 -5
  423. package/docs/smoketest.md +1 -1
  424. package/docs/transcript-provider-flow.md +73 -0
  425. package/docs/website.md +3 -1
  426. package/docs/youtube.md +4 -2
  427. package/package.json +17 -16
@@ -1,628 +1,3 @@
1
- import { extractYouTubeVideoId } from "@steipete/summarize-core/content/url";
2
- const SLIDE_TEXT_BUDGET_BY_PRESET = {
3
- short: 120,
4
- medium: 200,
5
- long: 320,
6
- xl: 480,
7
- xxl: 700,
8
- };
9
- const SLIDE_TEXT_BUDGET_MIN = 80;
10
- const SLIDE_TEXT_BUDGET_MAX = 900;
11
- const SLIDE_WINDOW_SECONDS_BY_PRESET = {
12
- short: 30,
13
- medium: 60,
14
- long: 90,
15
- xl: 120,
16
- xxl: 180,
17
- };
18
- const SLIDE_WINDOW_SECONDS_MIN = 30;
19
- const SLIDE_WINDOW_SECONDS_MAX = 180;
20
- const SLIDE_TAG_PATTERN = /^\[[^\]]*slide[^\d\]]*(\d+)[^\]]*\]\s*(.*)$/i;
21
- const SLIDE_LABEL_PATTERN = /^(?:\[)?slide\s+(\d+)(?:\s*(?:\/|of)\s*\d+)?(?:\])?(?:\s*[\u00b7:-]\s*.*)?$/i;
22
- const TITLE_ONLY_MAX_CHARS = 80;
23
- const clampNumber = (value, min, max) => Math.min(max, Math.max(min, value));
24
- const collapseLineWhitespace = (value) => value.replace(/\s+/g, " ").trim();
25
- const deriveHeadlineFromBody = (body) => {
26
- const cleaned = collapseLineWhitespace(body);
27
- if (!cleaned)
28
- return null;
29
- const firstSentence = cleaned.split(/[.!?]/)[0] ?? "";
30
- const clause = firstSentence.split(/[,;:\u2013\u2014-]/)[0] ?? firstSentence;
31
- const words = clause.trim().split(/\s+/).filter(Boolean);
32
- if (words.length < 2)
33
- return null;
34
- const title = words.slice(0, Math.min(6, words.length)).join(" ");
35
- return title.replace(/[,:;-]+$/g, "").trim() || null;
36
- };
37
- const isTitleOnlySlideText = (value) => {
38
- const trimmed = value.trim();
39
- if (!trimmed)
40
- return true;
41
- const lines = trimmed
42
- .split("\n")
43
- .map((line) => line.trim())
44
- .filter(Boolean);
45
- if (lines.length !== 1)
46
- return false;
47
- if (trimmed.length > TITLE_ONLY_MAX_CHARS)
48
- return false;
49
- if (/[.!?]/.test(trimmed))
50
- return false;
51
- return true;
52
- };
53
- const stripSlideTitleList = (markdown) => {
54
- if (!markdown.trim())
55
- return markdown;
56
- const lines = markdown.split("\n");
57
- const out = [];
58
- let skipNextTitle = false;
59
- for (const line of lines) {
60
- const trimmed = line.trim();
61
- if (SLIDE_TAG_PATTERN.test(trimmed) || SLIDE_LABEL_PATTERN.test(trimmed)) {
62
- skipNextTitle = true;
63
- continue;
64
- }
65
- if (skipNextTitle) {
66
- if (!trimmed)
67
- continue;
68
- if (isTitleOnlySlideText(trimmed)) {
69
- skipNextTitle = false;
70
- continue;
71
- }
72
- skipNextTitle = false;
73
- }
74
- out.push(line);
75
- }
76
- return out.join("\n");
77
- };
78
- export const splitSlideTitleFromText = ({ text, }) => {
79
- const trimmed = text.trim();
80
- if (!trimmed)
81
- return { title: null, body: "" };
82
- const lines = trimmed
83
- .split("\n")
84
- .map((line) => line.trim())
85
- .filter(Boolean);
86
- if (lines.length === 0)
87
- return { title: null, body: "" };
88
- const cleaned = lines.slice();
89
- while (cleaned.length > 0) {
90
- const first = cleaned[0] ?? "";
91
- if (SLIDE_LABEL_PATTERN.test(first) || SLIDE_TAG_PATTERN.test(first)) {
92
- cleaned.shift();
93
- continue;
94
- }
95
- break;
96
- }
97
- if (cleaned.length === 0)
98
- return { title: null, body: "" };
99
- const filtered = cleaned.filter((line) => !SLIDE_LABEL_PATTERN.test(line) && !SLIDE_TAG_PATTERN.test(line));
100
- if (filtered.length === 0)
101
- return { title: null, body: "" };
102
- const labelPattern = /^(?:title|headline)\s*:\s*(.*)$/i;
103
- let title = null;
104
- let bodyLines = filtered.slice();
105
- for (let i = 0; i < filtered.length; i += 1) {
106
- const line = filtered[i] ?? "";
107
- const labelMatch = line.match(labelPattern);
108
- if (!labelMatch)
109
- continue;
110
- const labelText = collapseLineWhitespace(labelMatch[1] ?? "").trim();
111
- if (labelText) {
112
- title = labelText;
113
- bodyLines = filtered.filter((_, idx) => idx !== i);
114
- }
115
- else {
116
- const fallbackTitle = collapseLineWhitespace(filtered[i + 1] ?? "").trim();
117
- if (fallbackTitle)
118
- title = fallbackTitle;
119
- bodyLines = filtered.filter((_, idx) => idx !== i && idx !== i + 1);
120
- }
121
- break;
122
- }
123
- if (!title) {
124
- for (let i = 0; i < filtered.length; i += 1) {
125
- const line = filtered[i] ?? "";
126
- const headingMatch = line.match(/^#{1,6}\s+(.+)/);
127
- if (!headingMatch)
128
- continue;
129
- const headingText = collapseLineWhitespace(headingMatch[1] ?? "").trim();
130
- const headingLabelMatch = headingText.match(labelPattern);
131
- if (headingLabelMatch) {
132
- const headingLabel = collapseLineWhitespace(headingLabelMatch[1] ?? "").trim();
133
- if (headingLabel) {
134
- title = headingLabel;
135
- bodyLines = filtered.filter((_, idx) => idx !== i);
136
- }
137
- else {
138
- const fallbackTitle = collapseLineWhitespace(filtered[i + 1] ?? "").trim();
139
- if (fallbackTitle)
140
- title = fallbackTitle;
141
- bodyLines = filtered.filter((_, idx) => idx !== i && idx !== i + 1);
142
- }
143
- }
144
- else {
145
- title = headingText || null;
146
- bodyLines = filtered.filter((_, idx) => idx !== i);
147
- }
148
- break;
149
- }
150
- }
151
- if (!title && filtered.length > 1) {
152
- const candidates = filtered
153
- .map((line, idx) => ({ line, idx }))
154
- .filter(({ line }) => isTitleOnlySlideText(line));
155
- if (candidates.length === 1) {
156
- const pick = candidates[0];
157
- title = collapseLineWhitespace(pick?.line ?? "").trim() || null;
158
- bodyLines = filtered.filter((_, idx) => idx !== pick?.idx);
159
- }
160
- else if (isTitleOnlySlideText(filtered[0] ?? "")) {
161
- title = collapseLineWhitespace(filtered[0] ?? "").trim() || null;
162
- bodyLines = filtered.slice(1);
163
- }
164
- }
165
- const body = bodyLines.join("\n").trim();
166
- if (!title && body) {
167
- title = deriveHeadlineFromBody(body);
168
- }
169
- return { title, body };
170
- };
171
- export const ensureSlideTitleLine = ({ text, slide, total, }) => {
172
- void slide;
173
- void total;
174
- return text.trim();
175
- };
176
- export function findSlidesSectionStart(markdown) {
177
- if (!markdown)
178
- return null;
179
- const heading = markdown.match(/^#{1,3}\s+Slides\b.*$/im);
180
- const tag = markdown.match(/^\[slide:\d+\]/im);
181
- const label = markdown.match(/^\s*slide\s+\d+(?:\s*(?:\/|of)\s*\d+)?(?:\s*[\u00b7:-].*)?$/im);
182
- const indexes = [heading?.index, tag?.index, label?.index].filter((idx) => idx != null);
183
- if (indexes.length === 0)
184
- return null;
185
- return Math.min(...indexes);
186
- }
187
- export function splitSummaryFromSlides(markdown) {
188
- const start = findSlidesSectionStart(markdown);
189
- if (start == null)
190
- return { summary: markdown.trim(), slidesSection: null };
191
- const summary = markdown.slice(0, start).trim();
192
- const slidesSection = markdown.slice(start);
193
- return { summary, slidesSection };
194
- }
195
- export function parseSlideSummariesFromMarkdown(markdown) {
196
- const result = new Map();
197
- if (!markdown.trim())
198
- return result;
199
- const start = findSlidesSectionStart(markdown);
200
- if (start == null) {
201
- const inline = parseInlineSlideSummaries(markdown);
202
- return inline.size > 0 ? inline : result;
203
- }
204
- const slice = markdown.slice(start);
205
- const lines = slice.split("\n");
206
- let currentIndex = null;
207
- let buffer = [];
208
- let sawBlankAfterTitle = false;
209
- const hasFutureMarker = (start) => lines.slice(start).some((line) => {
210
- const trimmed = line.trim();
211
- return SLIDE_TAG_PATTERN.test(trimmed) || SLIDE_LABEL_PATTERN.test(trimmed);
212
- });
213
- const flush = () => {
214
- if (currentIndex == null)
215
- return;
216
- const text = buffer
217
- .map((line) => collapseLineWhitespace(line))
218
- .join("\n")
219
- .trim();
220
- result.set(currentIndex, text);
221
- currentIndex = null;
222
- buffer = [];
223
- sawBlankAfterTitle = false;
224
- };
225
- for (let i = 0; i < lines.length; i += 1) {
226
- const line = lines[i] ?? "";
227
- const trimmed = line.trim();
228
- const heading = trimmed.match(/^#{1,3}\s+\S/);
229
- if (heading && !trimmed.toLowerCase().startsWith("### slides")) {
230
- flush();
231
- break;
232
- }
233
- const match = trimmed.match(SLIDE_TAG_PATTERN);
234
- if (match) {
235
- flush();
236
- const index = Number.parseInt(match[1] ?? "", 10);
237
- if (!Number.isFinite(index) || index <= 0)
238
- continue;
239
- currentIndex = index;
240
- sawBlankAfterTitle = false;
241
- const rest = (match[2] ?? "").trim();
242
- if (rest)
243
- buffer.push(rest);
244
- continue;
245
- }
246
- const label = trimmed.match(SLIDE_LABEL_PATTERN);
247
- if (label) {
248
- flush();
249
- const index = Number.parseInt(label[1] ?? "", 10);
250
- if (!Number.isFinite(index) || index <= 0)
251
- continue;
252
- currentIndex = index;
253
- sawBlankAfterTitle = false;
254
- continue;
255
- }
256
- if (currentIndex == null)
257
- continue;
258
- if (!trimmed) {
259
- if (buffer.length === 1 && isTitleOnlySlideText(buffer[0] ?? "")) {
260
- sawBlankAfterTitle = true;
261
- }
262
- continue;
263
- }
264
- if (sawBlankAfterTitle &&
265
- buffer.length === 1 &&
266
- isTitleOnlySlideText(buffer[0] ?? "") &&
267
- !isTitleOnlySlideText(trimmed) &&
268
- !hasFutureMarker(i)) {
269
- flush();
270
- break;
271
- }
272
- sawBlankAfterTitle = false;
273
- buffer.push(trimmed);
274
- }
275
- flush();
276
- return result;
277
- }
278
- function parseInlineSlideSummaries(markdown) {
279
- const result = new Map();
280
- const matches = Array.from(markdown.matchAll(/\[slide:(\d+)\]/gi));
281
- if (matches.length === 0)
282
- return result;
283
- for (let i = 0; i < matches.length; i += 1) {
284
- const match = matches[i];
285
- const index = Number.parseInt(match?.[1] ?? "", 10);
286
- if (!Number.isFinite(index) || index <= 0)
287
- continue;
288
- const start = (match.index ?? 0) + match[0].length;
289
- const next = i + 1 < matches.length ? matches[i + 1] : null;
290
- const end = next?.index ?? markdown.length;
291
- if (end <= start) {
292
- result.set(index, "");
293
- continue;
294
- }
295
- const segment = markdown
296
- .slice(start, end)
297
- .replace(/^\s*[:\-\u2013\u2014]?\s*/, "")
298
- .trim();
299
- result.set(index, segment);
300
- }
301
- return result;
302
- }
303
- export function extractSlideMarkers(markdown) {
304
- if (!markdown.trim())
305
- return [];
306
- const indexes = [];
307
- const regex = /\[[^\]]*slide[^\d\]]*(\d+)[^\]]*\]/gi;
308
- let match = regex.exec(markdown);
309
- while (match) {
310
- const index = Number.parseInt(match[1] ?? "", 10);
311
- if (!Number.isFinite(index) || index <= 0)
312
- continue;
313
- indexes.push(index);
314
- match = regex.exec(markdown);
315
- }
316
- return indexes;
317
- }
318
- export function normalizeSummarySlideHeadings(markdown) {
319
- if (!markdown.trim())
320
- return markdown;
321
- if (!/\[slide:\d+\]/i.test(markdown))
322
- return markdown;
323
- const deleteMarker = "__SUMMARIZE_DELETE__";
324
- const lines = markdown.split("\n");
325
- for (let i = 0; i < lines.length; i += 1) {
326
- const line = lines[i] ?? "";
327
- if (!SLIDE_TAG_PATTERN.test(line.trim()))
328
- continue;
329
- for (let k = i + 1; k < lines.length; k += 1) {
330
- const candidate = lines[k] ?? "";
331
- const trimmed = candidate.trim();
332
- if (!trimmed)
333
- continue;
334
- if (SLIDE_LABEL_PATTERN.test(trimmed)) {
335
- lines[k] = deleteMarker;
336
- continue;
337
- }
338
- const labelMatch = trimmed.match(/^(?:title|headline)\s*:\s*(.*)$/i);
339
- if (labelMatch) {
340
- const labelText = collapseLineWhitespace(labelMatch[1] ?? "").trim();
341
- lines[k] = labelText ? `## ${labelText}` : deleteMarker;
342
- }
343
- break;
344
- }
345
- }
346
- return lines.filter((line) => line !== deleteMarker).join("\n");
347
- }
348
- function splitMarkdownParagraphs(markdown) {
349
- return markdown
350
- .split(/\n\s*\n+/)
351
- .map((part) => part.trim())
352
- .filter(Boolean);
353
- }
354
- function pickIntroParagraph(markdown) {
355
- const paragraphs = splitMarkdownParagraphs(markdown);
356
- if (paragraphs.length === 0)
357
- return "";
358
- const firstNonHeading = paragraphs.find((paragraph) => !/^#{1,6}\s+\S/.test(paragraph.trim())) ?? paragraphs[0];
359
- if (!firstNonHeading)
360
- return "";
361
- const sentences = firstNonHeading.match(/[^.!?]+[.!?]+|[^.!?]+$/g) ?? [firstNonHeading];
362
- if (sentences.length <= 3)
363
- return firstNonHeading.trim();
364
- return sentences.slice(0, 3).join(" ").trim();
365
- }
366
- export function buildSlideTextFallback({ slides, transcriptTimedText, lengthArg, }) {
367
- const map = new Map();
368
- if (!transcriptTimedText || !transcriptTimedText.trim())
369
- return map;
370
- if (slides.length === 0)
371
- return map;
372
- const segments = parseTranscriptTimedText(transcriptTimedText);
373
- if (segments.length === 0)
374
- return map;
375
- const ordered = slides.slice().sort((a, b) => a.index - b.index);
376
- const budget = resolveSlideTextBudget({ lengthArg, slideCount: ordered.length });
377
- const windowSeconds = resolveSlideWindowSeconds({ lengthArg });
378
- for (let i = 0; i < ordered.length; i += 1) {
379
- const slide = ordered[i];
380
- if (!slide)
381
- continue;
382
- const nextSlide = i + 1 < ordered.length ? (ordered[i + 1] ?? null) : null;
383
- const text = getTranscriptTextForSlide({
384
- slide,
385
- nextSlide,
386
- segments,
387
- budget,
388
- windowSeconds,
389
- });
390
- if (text)
391
- map.set(slide.index, text);
392
- }
393
- return map;
394
- }
395
- export function coerceSummaryWithSlides({ markdown, slides, transcriptTimedText, lengthArg, }) {
396
- if (!markdown.trim() || slides.length === 0)
397
- return markdown;
398
- const ordered = slides.slice().sort((a, b) => a.index - b.index);
399
- const { summary, slidesSection } = splitSummaryFromSlides(markdown);
400
- const intro = pickIntroParagraph(summary);
401
- const slideSummaries = slidesSection ? parseSlideSummariesFromMarkdown(markdown) : new Map();
402
- const titleOnlySlideSummaries = slideSummaries.size > 0 &&
403
- Array.from(slideSummaries.values()).every((text) => isTitleOnlySlideText(text));
404
- const distributionMarkdown = titleOnlySlideSummaries ? stripSlideTitleList(markdown) : markdown;
405
- const fallbackSummaries = buildSlideTextFallback({
406
- slides: ordered,
407
- transcriptTimedText,
408
- lengthArg,
409
- });
410
- if (slideSummaries.size > 0 && !titleOnlySlideSummaries) {
411
- const parts = [];
412
- if (intro)
413
- parts.push(intro);
414
- for (const slide of ordered) {
415
- const text = slideSummaries.get(slide.index) ?? fallbackSummaries.get(slide.index) ?? "";
416
- const withTitle = text ? ensureSlideTitleLine({ text, slide, total: ordered.length }) : "";
417
- parts.push(withTitle ? `[slide:${slide.index}]\n${withTitle}` : `[slide:${slide.index}]`);
418
- }
419
- return parts.join("\n\n");
420
- }
421
- const paragraphs = splitMarkdownParagraphs(distributionMarkdown);
422
- if (paragraphs.length === 0)
423
- return markdown;
424
- const introParagraph = intro || paragraphs[0] || "";
425
- const introIndex = paragraphs.indexOf(introParagraph);
426
- const remaining = introIndex >= 0 ? paragraphs.filter((_, index) => index !== introIndex) : paragraphs.slice(1);
427
- const parts = [];
428
- if (introParagraph)
429
- parts.push(introParagraph.trim());
430
- if (remaining.length === 0) {
431
- for (const slide of ordered) {
432
- parts.push(`[slide:${slide.index}]`);
433
- }
434
- return parts.join("\n\n");
435
- }
436
- const total = ordered.length;
437
- for (let i = 0; i < total; i += 1) {
438
- const start = Math.round((i * remaining.length) / total);
439
- const end = Math.round(((i + 1) * remaining.length) / total);
440
- const segment = remaining.slice(start, end).join("\n\n").trim();
441
- const slideIndex = ordered[i]?.index ?? i + 1;
442
- const fallback = fallbackSummaries.get(slideIndex) ?? "";
443
- const text = segment || fallback;
444
- const slide = ordered[i] ?? { index: slideIndex, timestamp: Number.NaN };
445
- const withTitle = text ? ensureSlideTitleLine({ text, slide, total }) : "";
446
- parts.push(withTitle ? `[slide:${slideIndex}]\n${withTitle}` : `[slide:${slideIndex}]`);
447
- }
448
- return parts.join("\n\n");
449
- }
450
- function parseTimestampSeconds(value) {
451
- const parts = value.split(":").map((item) => Number(item));
452
- if (parts.some((item) => !Number.isFinite(item)))
453
- return null;
454
- if (parts.length === 2) {
455
- const [minutes, seconds] = parts;
456
- return minutes * 60 + seconds;
457
- }
458
- if (parts.length === 3) {
459
- const [hours, minutes, seconds] = parts;
460
- return hours * 3600 + minutes * 60 + seconds;
461
- }
462
- return null;
463
- }
464
- export function interleaveSlidesIntoTranscript({ transcriptTimedText, slides, }) {
465
- if (!transcriptTimedText.trim() || slides.length === 0)
466
- return transcriptTimedText;
467
- const ordered = slides
468
- .filter((slide) => Number.isFinite(slide.timestamp))
469
- .map((slide) => ({ index: slide.index, timestamp: slide.timestamp }))
470
- .sort((a, b) => a.timestamp - b.timestamp);
471
- if (ordered.length === 0)
472
- return transcriptTimedText;
473
- let nextIndex = 0;
474
- const out = [];
475
- const lines = transcriptTimedText.split("\n");
476
- for (const line of lines) {
477
- const trimmed = line.trim();
478
- const match = trimmed.match(/^\[(\d{1,2}:\d{2}(?::\d{2})?)\]/);
479
- const seconds = match ? parseTimestampSeconds(match[1] ?? "") : null;
480
- if (seconds != null) {
481
- while (nextIndex < ordered.length && (ordered[nextIndex]?.timestamp ?? 0) <= seconds) {
482
- const slide = ordered[nextIndex];
483
- if (slide)
484
- out.push(`[slide:${slide.index}]`);
485
- nextIndex += 1;
486
- }
487
- }
488
- out.push(line);
489
- }
490
- while (nextIndex < ordered.length) {
491
- const slide = ordered[nextIndex];
492
- if (slide)
493
- out.push(`[slide:${slide.index}]`);
494
- nextIndex += 1;
495
- }
496
- return out.join("\n");
497
- }
498
- export function parseTranscriptTimedText(input) {
499
- if (!input)
500
- return [];
501
- const segments = [];
502
- for (const line of input.split("\n")) {
503
- const trimmed = line.trim();
504
- if (!trimmed.startsWith("["))
505
- continue;
506
- const match = trimmed.match(/^\[(\d{1,2}:\d{2}(?::\d{2})?)\]\s*(.*)$/);
507
- if (!match)
508
- continue;
509
- const seconds = parseTimestampSeconds(match[1]);
510
- if (seconds == null)
511
- continue;
512
- const text = (match[2] ?? "").trim();
513
- if (!text)
514
- continue;
515
- segments.push({ startSeconds: seconds, text });
516
- }
517
- segments.sort((a, b) => a.startSeconds - b.startSeconds);
518
- return segments;
519
- }
520
- export function formatTimestamp(seconds) {
521
- const clamped = Math.max(0, Math.floor(seconds));
522
- const hours = Math.floor(clamped / 3600);
523
- const minutes = Math.floor((clamped % 3600) / 60);
524
- const secs = clamped % 60;
525
- const mm = String(minutes).padStart(2, "0");
526
- const ss = String(secs).padStart(2, "0");
527
- if (hours <= 0)
528
- return `${minutes}:${ss}`;
529
- const hh = String(hours).padStart(2, "0");
530
- return `${hh}:${mm}:${ss}`;
531
- }
532
- function normalizeSlideText(value) {
533
- return value.replace(/\s+/g, " ").trim();
534
- }
535
- function truncateSlideText(value, limit) {
536
- if (value.length <= limit)
537
- return value;
538
- const truncated = value.slice(0, limit).trimEnd();
539
- const clean = truncated.replace(/\s+\S*$/, "").trim();
540
- const result = clean.length > 0 ? clean : truncated.trim();
541
- return result.length > 0 ? `${result}...` : "";
542
- }
543
- export function resolveSlideTextBudget({ lengthArg, slideCount, }) {
544
- if (lengthArg.kind === "preset") {
545
- return SLIDE_TEXT_BUDGET_BY_PRESET[lengthArg.preset];
546
- }
547
- const divisor = Math.max(1, Math.min(slideCount, 10));
548
- const perSlide = Math.round(lengthArg.maxCharacters / divisor);
549
- return clampNumber(perSlide, SLIDE_TEXT_BUDGET_MIN, SLIDE_TEXT_BUDGET_MAX);
550
- }
551
- export function resolveSlideWindowSeconds({ lengthArg, }) {
552
- if (lengthArg.kind === "preset") {
553
- return SLIDE_WINDOW_SECONDS_BY_PRESET[lengthArg.preset];
554
- }
555
- const window = Math.round(lengthArg.maxCharacters / 100);
556
- return clampNumber(window, SLIDE_WINDOW_SECONDS_MIN, SLIDE_WINDOW_SECONDS_MAX);
557
- }
558
- export function getTranscriptTextForSlide({ slide, nextSlide, segments, budget, windowSeconds, }) {
559
- if (!Number.isFinite(slide.timestamp))
560
- return "";
561
- if (segments.length === 0)
562
- return "";
563
- const start = Math.max(0, Math.floor(slide.timestamp));
564
- const leadIn = Math.min(6, Math.floor(windowSeconds * 0.2));
565
- const lower = Math.max(0, start - leadIn);
566
- let upper = start + windowSeconds;
567
- if (nextSlide && Number.isFinite(nextSlide.timestamp)) {
568
- const next = Math.max(start, Math.floor(nextSlide.timestamp));
569
- if (next > start) {
570
- upper = Math.min(upper, next);
571
- }
572
- }
573
- if (upper < lower)
574
- return "";
575
- const parts = [];
576
- for (const segment of segments) {
577
- if (segment.startSeconds < lower)
578
- continue;
579
- if (segment.startSeconds > upper)
580
- break;
581
- parts.push(segment.text);
582
- }
583
- const text = normalizeSlideText(parts.join(" "));
584
- return text ? truncateSlideText(text, budget) : "";
585
- }
586
- export function formatOsc8Link(label, url, enabled) {
587
- if (!enabled || !url)
588
- return label;
589
- const osc = "\u001b]8;;";
590
- const st = "\u001b\\";
591
- return `${osc}${url}${st}${label}${osc}${st}`;
592
- }
593
- export function buildTimestampUrl(sourceUrl, seconds) {
594
- if (!sourceUrl)
595
- return null;
596
- let url;
597
- try {
598
- url = new URL(sourceUrl);
599
- }
600
- catch {
601
- return null;
602
- }
603
- const host = url.hostname.replace(/^www\./, "").toLowerCase();
604
- const clamped = Math.max(0, Math.floor(seconds));
605
- if (host === "youtu.be" || host === "youtube.com" || host === "m.youtube.com") {
606
- const id = extractYouTubeVideoId(sourceUrl);
607
- if (!id)
608
- return null;
609
- return `https://www.youtube.com/watch?v=${id}&t=${clamped}s`;
610
- }
611
- if (host === "vimeo.com" || host === "player.vimeo.com") {
612
- const match = url.pathname.match(/\/(\d+)(?:$|\/)/);
613
- if (!match)
614
- return null;
615
- url.hash = `t=${clamped}s`;
616
- return url.toString();
617
- }
618
- if (host === "loom.com" || host.endsWith(".loom.com")) {
619
- url.searchParams.set("t", clamped.toString());
620
- return url.toString();
621
- }
622
- if (host === "dropbox.com" || host.endsWith(".dropbox.com")) {
623
- url.searchParams.set("t", clamped.toString());
624
- return url.toString();
625
- }
626
- return null;
627
- }
1
+ export { buildSlideTextFallback, coerceSummaryWithSlides, ensureSlideTitleLine, extractSlideMarkers, findSlidesSectionStart, normalizeSummarySlideHeadings, parseSlideSummariesFromMarkdown, splitSlideTitleFromText, splitSummaryFromSlides, } from "./slides-text-markdown.js";
2
+ export { buildTimestampUrl, formatOsc8Link, formatTimestamp, getTranscriptTextForSlide, interleaveSlidesIntoTranscript, parseTranscriptTimedText, resolveSlideTextBudget, resolveSlideWindowSeconds, } from "./slides-text-transcript.js";
628
3
  //# sourceMappingURL=slides-text.js.map