@steipete/summarize 0.10.0 → 0.11.1

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 (374) hide show
  1. package/CHANGELOG.md +80 -28
  2. package/README.md +115 -30
  3. package/dist/cli.js +1 -1
  4. package/dist/esm/cache.js +67 -65
  5. package/dist/esm/cache.js.map +1 -1
  6. package/dist/esm/cli-main.js +27 -27
  7. package/dist/esm/cli-main.js.map +1 -1
  8. package/dist/esm/cli.js +2 -2
  9. package/dist/esm/cli.js.map +1 -1
  10. package/dist/esm/config.js +310 -166
  11. package/dist/esm/config.js.map +1 -1
  12. package/dist/esm/content/asset.js +53 -50
  13. package/dist/esm/content/asset.js.map +1 -1
  14. package/dist/esm/content/index.js +1 -1
  15. package/dist/esm/content/index.js.map +1 -1
  16. package/dist/esm/costs.js +1 -1
  17. package/dist/esm/costs.js.map +1 -1
  18. package/dist/esm/daemon/agent.js +165 -164
  19. package/dist/esm/daemon/agent.js.map +1 -1
  20. package/dist/esm/daemon/auto-mode.js +3 -3
  21. package/dist/esm/daemon/auto-mode.js.map +1 -1
  22. package/dist/esm/daemon/chat.js +16 -14
  23. package/dist/esm/daemon/chat.js.map +1 -1
  24. package/dist/esm/daemon/cli-entrypoint.js +72 -0
  25. package/dist/esm/daemon/cli-entrypoint.js.map +1 -0
  26. package/dist/esm/daemon/cli.js +63 -87
  27. package/dist/esm/daemon/cli.js.map +1 -1
  28. package/dist/esm/daemon/config.js +15 -15
  29. package/dist/esm/daemon/config.js.map +1 -1
  30. package/dist/esm/daemon/constants.js +6 -6
  31. package/dist/esm/daemon/constants.js.map +1 -1
  32. package/dist/esm/daemon/env-merge.js.map +1 -1
  33. package/dist/esm/daemon/env-snapshot.js +36 -31
  34. package/dist/esm/daemon/env-snapshot.js.map +1 -1
  35. package/dist/esm/daemon/flow-context.js +59 -28
  36. package/dist/esm/daemon/flow-context.js.map +1 -1
  37. package/dist/esm/daemon/launchd.js +100 -55
  38. package/dist/esm/daemon/launchd.js.map +1 -1
  39. package/dist/esm/daemon/meta.js +5 -5
  40. package/dist/esm/daemon/meta.js.map +1 -1
  41. package/dist/esm/daemon/models.js +54 -31
  42. package/dist/esm/daemon/models.js.map +1 -1
  43. package/dist/esm/daemon/process-registry.js +15 -15
  44. package/dist/esm/daemon/process-registry.js.map +1 -1
  45. package/dist/esm/daemon/schtasks.js +42 -42
  46. package/dist/esm/daemon/schtasks.js.map +1 -1
  47. package/dist/esm/daemon/server.js +248 -244
  48. package/dist/esm/daemon/server.js.map +1 -1
  49. package/dist/esm/daemon/summarize-progress.js +11 -11
  50. package/dist/esm/daemon/summarize-progress.js.map +1 -1
  51. package/dist/esm/daemon/summarize.js +29 -29
  52. package/dist/esm/daemon/summarize.js.map +1 -1
  53. package/dist/esm/daemon/systemd.js +47 -47
  54. package/dist/esm/daemon/systemd.js.map +1 -1
  55. package/dist/esm/firecrawl.js +12 -12
  56. package/dist/esm/firecrawl.js.map +1 -1
  57. package/dist/esm/flags.js +32 -32
  58. package/dist/esm/flags.js.map +1 -1
  59. package/dist/esm/index.js +3 -3
  60. package/dist/esm/index.js.map +1 -1
  61. package/dist/esm/language.js +1 -1
  62. package/dist/esm/language.js.map +1 -1
  63. package/dist/esm/llm/cli.js +128 -64
  64. package/dist/esm/llm/cli.js.map +1 -1
  65. package/dist/esm/llm/errors.js +1 -1
  66. package/dist/esm/llm/errors.js.map +1 -1
  67. package/dist/esm/llm/generate-text.js +107 -98
  68. package/dist/esm/llm/generate-text.js.map +1 -1
  69. package/dist/esm/llm/google-models.js +17 -17
  70. package/dist/esm/llm/google-models.js.map +1 -1
  71. package/dist/esm/llm/html-to-markdown.js +3 -3
  72. package/dist/esm/llm/html-to-markdown.js.map +1 -1
  73. package/dist/esm/llm/model-id.js +38 -16
  74. package/dist/esm/llm/model-id.js.map +1 -1
  75. package/dist/esm/llm/prompt.js +5 -5
  76. package/dist/esm/llm/prompt.js.map +1 -1
  77. package/dist/esm/llm/providers/anthropic.js +33 -33
  78. package/dist/esm/llm/providers/anthropic.js.map +1 -1
  79. package/dist/esm/llm/providers/google.js +19 -19
  80. package/dist/esm/llm/providers/google.js.map +1 -1
  81. package/dist/esm/llm/providers/models.js +30 -30
  82. package/dist/esm/llm/providers/models.js.map +1 -1
  83. package/dist/esm/llm/providers/openai.js +35 -34
  84. package/dist/esm/llm/providers/openai.js.map +1 -1
  85. package/dist/esm/llm/providers/shared.js +8 -8
  86. package/dist/esm/llm/providers/shared.js.map +1 -1
  87. package/dist/esm/llm/transcript-to-markdown.js +9 -5
  88. package/dist/esm/llm/transcript-to-markdown.js.map +1 -1
  89. package/dist/esm/llm/usage.js +18 -18
  90. package/dist/esm/llm/usage.js.map +1 -1
  91. package/dist/esm/logging/daemon.js +21 -21
  92. package/dist/esm/logging/daemon.js.map +1 -1
  93. package/dist/esm/logging/ring-file.js +5 -5
  94. package/dist/esm/logging/ring-file.js.map +1 -1
  95. package/dist/esm/markitdown.js +21 -19
  96. package/dist/esm/markitdown.js.map +1 -1
  97. package/dist/esm/media-cache.js +39 -39
  98. package/dist/esm/media-cache.js.map +1 -1
  99. package/dist/esm/model-auto.js +175 -106
  100. package/dist/esm/model-auto.js.map +1 -1
  101. package/dist/esm/model-spec.js +52 -42
  102. package/dist/esm/model-spec.js.map +1 -1
  103. package/dist/esm/pricing/litellm.js +4 -4
  104. package/dist/esm/pricing/litellm.js.map +1 -1
  105. package/dist/esm/processes.js +1 -1
  106. package/dist/esm/processes.js.map +1 -1
  107. package/dist/esm/prompts/index.js +1 -1
  108. package/dist/esm/prompts/index.js.map +1 -1
  109. package/dist/esm/refresh-free.js +81 -81
  110. package/dist/esm/refresh-free.js.map +1 -1
  111. package/dist/esm/run/attachments.js +47 -44
  112. package/dist/esm/run/attachments.js.map +1 -1
  113. package/dist/esm/run/bird.js +26 -26
  114. package/dist/esm/run/bird.js.map +1 -1
  115. package/dist/esm/run/cache-state.js +7 -7
  116. package/dist/esm/run/cache-state.js.map +1 -1
  117. package/dist/esm/run/cli-fallback-state.js +45 -0
  118. package/dist/esm/run/cli-fallback-state.js.map +1 -0
  119. package/dist/esm/run/cli-preflight.js +24 -24
  120. package/dist/esm/run/cli-preflight.js.map +1 -1
  121. package/dist/esm/run/constants.js +12 -12
  122. package/dist/esm/run/constants.js.map +1 -1
  123. package/dist/esm/run/cookies/twitter.js +47 -47
  124. package/dist/esm/run/cookies/twitter.js.map +1 -1
  125. package/dist/esm/run/env.js +21 -15
  126. package/dist/esm/run/env.js.map +1 -1
  127. package/dist/esm/run/fetch-with-timeout.js +4 -4
  128. package/dist/esm/run/fetch-with-timeout.js.map +1 -1
  129. package/dist/esm/run/finish-line.js +68 -68
  130. package/dist/esm/run/finish-line.js.map +1 -1
  131. package/dist/esm/run/flows/asset/extract.js +15 -15
  132. package/dist/esm/run/flows/asset/extract.js.map +1 -1
  133. package/dist/esm/run/flows/asset/input.js +47 -66
  134. package/dist/esm/run/flows/asset/input.js.map +1 -1
  135. package/dist/esm/run/flows/asset/media-policy.js +1 -1
  136. package/dist/esm/run/flows/asset/media-policy.js.map +1 -1
  137. package/dist/esm/run/flows/asset/media.js +49 -40
  138. package/dist/esm/run/flows/asset/media.js.map +1 -1
  139. package/dist/esm/run/flows/asset/output.js +12 -12
  140. package/dist/esm/run/flows/asset/output.js.map +1 -1
  141. package/dist/esm/run/flows/asset/preprocess.js +79 -44
  142. package/dist/esm/run/flows/asset/preprocess.js.map +1 -1
  143. package/dist/esm/run/flows/asset/summary.js +173 -106
  144. package/dist/esm/run/flows/asset/summary.js.map +1 -1
  145. package/dist/esm/run/flows/url/extract.js +26 -26
  146. package/dist/esm/run/flows/url/extract.js.map +1 -1
  147. package/dist/esm/run/flows/url/flow.js +104 -98
  148. package/dist/esm/run/flows/url/flow.js.map +1 -1
  149. package/dist/esm/run/flows/url/markdown.js +57 -57
  150. package/dist/esm/run/flows/url/markdown.js.map +1 -1
  151. package/dist/esm/run/flows/url/slides-output.js +61 -59
  152. package/dist/esm/run/flows/url/slides-output.js.map +1 -1
  153. package/dist/esm/run/flows/url/slides-text.js +85 -85
  154. package/dist/esm/run/flows/url/slides-text.js.map +1 -1
  155. package/dist/esm/run/flows/url/summary.js +174 -107
  156. package/dist/esm/run/flows/url/summary.js.map +1 -1
  157. package/dist/esm/run/format.js +10 -10
  158. package/dist/esm/run/format.js.map +1 -1
  159. package/dist/esm/run/help.js +141 -135
  160. package/dist/esm/run/help.js.map +1 -1
  161. package/dist/esm/run/logging.js +10 -10
  162. package/dist/esm/run/logging.js.map +1 -1
  163. package/dist/esm/run/markdown.js +12 -12
  164. package/dist/esm/run/markdown.js.map +1 -1
  165. package/dist/esm/run/media-cache-state.js +5 -5
  166. package/dist/esm/run/media-cache-state.js.map +1 -1
  167. package/dist/esm/run/model-attempts.js.map +1 -1
  168. package/dist/esm/run/openrouter.js +11 -11
  169. package/dist/esm/run/openrouter.js.map +1 -1
  170. package/dist/esm/run/progress.js +1 -1
  171. package/dist/esm/run/progress.js.map +1 -1
  172. package/dist/esm/run/run-config.js +16 -16
  173. package/dist/esm/run/run-config.js.map +1 -1
  174. package/dist/esm/run/run-context.js +2 -2
  175. package/dist/esm/run/run-context.js.map +1 -1
  176. package/dist/esm/run/run-env.js +55 -54
  177. package/dist/esm/run/run-env.js.map +1 -1
  178. package/dist/esm/run/run-input.js +3 -3
  179. package/dist/esm/run/run-input.js.map +1 -1
  180. package/dist/esm/run/run-metrics.js +16 -16
  181. package/dist/esm/run/run-metrics.js.map +1 -1
  182. package/dist/esm/run/run-models.js +28 -23
  183. package/dist/esm/run/run-models.js.map +1 -1
  184. package/dist/esm/run/run-output.js +3 -3
  185. package/dist/esm/run/run-output.js.map +1 -1
  186. package/dist/esm/run/run-settings.js +83 -34
  187. package/dist/esm/run/run-settings.js.map +1 -1
  188. package/dist/esm/run/run-stream.js +4 -4
  189. package/dist/esm/run/run-stream.js.map +1 -1
  190. package/dist/esm/run/runner.js +166 -127
  191. package/dist/esm/run/runner.js.map +1 -1
  192. package/dist/esm/run/slides-cli.js +43 -42
  193. package/dist/esm/run/slides-cli.js.map +1 -1
  194. package/dist/esm/run/slides-render.js +36 -36
  195. package/dist/esm/run/slides-render.js.map +1 -1
  196. package/dist/esm/run/stdin-temp-file.js +77 -0
  197. package/dist/esm/run/stdin-temp-file.js.map +1 -0
  198. package/dist/esm/run/stream-output.js +7 -7
  199. package/dist/esm/run/stream-output.js.map +1 -1
  200. package/dist/esm/run/streaming.js +16 -16
  201. package/dist/esm/run/streaming.js.map +1 -1
  202. package/dist/esm/run/summary-engine.js +57 -51
  203. package/dist/esm/run/summary-engine.js.map +1 -1
  204. package/dist/esm/run/summary-llm.js +3 -3
  205. package/dist/esm/run/summary-llm.js.map +1 -1
  206. package/dist/esm/run/terminal.js +4 -4
  207. package/dist/esm/run/terminal.js.map +1 -1
  208. package/dist/esm/run/tips.js +2 -2
  209. package/dist/esm/run/tips.js.map +1 -1
  210. package/dist/esm/run/transcriber-cli.js +49 -49
  211. package/dist/esm/run/transcriber-cli.js.map +1 -1
  212. package/dist/esm/run.js +1 -1
  213. package/dist/esm/run.js.map +1 -1
  214. package/dist/esm/shared/contracts.js +1 -1
  215. package/dist/esm/shared/contracts.js.map +1 -1
  216. package/dist/esm/shared/sse-events.js +16 -16
  217. package/dist/esm/shared/sse-events.js.map +1 -1
  218. package/dist/esm/shared/streaming-merge.js +3 -3
  219. package/dist/esm/shared/streaming-merge.js.map +1 -1
  220. package/dist/esm/slides/extract.js +258 -249
  221. package/dist/esm/slides/extract.js.map +1 -1
  222. package/dist/esm/slides/index.js +3 -3
  223. package/dist/esm/slides/index.js.map +1 -1
  224. package/dist/esm/slides/settings.js +14 -14
  225. package/dist/esm/slides/settings.js.map +1 -1
  226. package/dist/esm/slides/store.js +9 -9
  227. package/dist/esm/slides/store.js.map +1 -1
  228. package/dist/esm/tty/format.js +13 -13
  229. package/dist/esm/tty/format.js.map +1 -1
  230. package/dist/esm/tty/osc-progress.js +1 -1
  231. package/dist/esm/tty/osc-progress.js.map +1 -1
  232. package/dist/esm/tty/progress/fetch-html.js +14 -14
  233. package/dist/esm/tty/progress/fetch-html.js.map +1 -1
  234. package/dist/esm/tty/progress/transcript.js +70 -62
  235. package/dist/esm/tty/progress/transcript.js.map +1 -1
  236. package/dist/esm/tty/spinner.js +20 -9
  237. package/dist/esm/tty/spinner.js.map +1 -1
  238. package/dist/esm/tty/theme.js +92 -92
  239. package/dist/esm/tty/theme.js.map +1 -1
  240. package/dist/esm/tty/website-progress.js +32 -32
  241. package/dist/esm/tty/website-progress.js.map +1 -1
  242. package/dist/esm/version.js +29 -29
  243. package/dist/esm/version.js.map +1 -1
  244. package/dist/types/cache.d.ts +6 -6
  245. package/dist/types/config.d.ts +49 -7
  246. package/dist/types/content/asset.d.ts +8 -6
  247. package/dist/types/content/index.d.ts +1 -1
  248. package/dist/types/costs.d.ts +3 -3
  249. package/dist/types/daemon/agent.d.ts +1 -1
  250. package/dist/types/daemon/auto-mode.d.ts +3 -3
  251. package/dist/types/daemon/chat.d.ts +2 -2
  252. package/dist/types/daemon/cli-entrypoint.d.ts +2 -0
  253. package/dist/types/daemon/config.d.ts +2 -2
  254. package/dist/types/daemon/env-merge.d.ts +1 -1
  255. package/dist/types/daemon/env-snapshot.d.ts +1 -1
  256. package/dist/types/daemon/flow-context.d.ts +7 -7
  257. package/dist/types/daemon/launchd.d.ts +8 -0
  258. package/dist/types/daemon/models.d.ts +6 -2
  259. package/dist/types/daemon/process-registry.d.ts +5 -5
  260. package/dist/types/daemon/server.d.ts +2 -2
  261. package/dist/types/daemon/summarize-progress.d.ts +1 -1
  262. package/dist/types/daemon/summarize.d.ts +7 -7
  263. package/dist/types/firecrawl.d.ts +1 -1
  264. package/dist/types/flags.d.ts +11 -11
  265. package/dist/types/index.d.ts +4 -4
  266. package/dist/types/language.d.ts +1 -1
  267. package/dist/types/llm/attachments.d.ts +1 -1
  268. package/dist/types/llm/cli.d.ts +3 -3
  269. package/dist/types/llm/generate-text.d.ts +7 -7
  270. package/dist/types/llm/html-to-markdown.d.ts +3 -3
  271. package/dist/types/llm/model-id.d.ts +1 -1
  272. package/dist/types/llm/prompt.d.ts +2 -2
  273. package/dist/types/llm/providers/anthropic.d.ts +3 -3
  274. package/dist/types/llm/providers/google.d.ts +3 -3
  275. package/dist/types/llm/providers/models.d.ts +2 -2
  276. package/dist/types/llm/providers/openai.d.ts +4 -4
  277. package/dist/types/llm/providers/shared.d.ts +2 -2
  278. package/dist/types/llm/transcript-to-markdown.d.ts +4 -2
  279. package/dist/types/llm/usage.d.ts +1 -1
  280. package/dist/types/logging/daemon.d.ts +4 -4
  281. package/dist/types/markitdown.d.ts +1 -1
  282. package/dist/types/media-cache.d.ts +2 -2
  283. package/dist/types/model-auto.d.ts +14 -4
  284. package/dist/types/model-spec.d.ts +10 -10
  285. package/dist/types/pricing/litellm.d.ts +1 -1
  286. package/dist/types/processes.d.ts +1 -1
  287. package/dist/types/prompts/index.d.ts +1 -1
  288. package/dist/types/run/attachments.d.ts +7 -7
  289. package/dist/types/run/bird.d.ts +2 -2
  290. package/dist/types/run/cache-state.d.ts +2 -2
  291. package/dist/types/run/cli-fallback-state.d.ts +6 -0
  292. package/dist/types/run/constants.d.ts +1 -1
  293. package/dist/types/run/cookies/twitter.d.ts +1 -1
  294. package/dist/types/run/env.d.ts +1 -1
  295. package/dist/types/run/finish-line.d.ts +5 -5
  296. package/dist/types/run/flows/asset/extract.d.ts +4 -4
  297. package/dist/types/run/flows/asset/input.d.ts +9 -3
  298. package/dist/types/run/flows/asset/media.d.ts +1 -1
  299. package/dist/types/run/flows/asset/output.d.ts +5 -5
  300. package/dist/types/run/flows/asset/preprocess.d.ts +23 -17
  301. package/dist/types/run/flows/asset/summary.d.ts +19 -17
  302. package/dist/types/run/flows/url/extract.d.ts +1 -1
  303. package/dist/types/run/flows/url/flow.d.ts +1 -1
  304. package/dist/types/run/flows/url/markdown.d.ts +6 -6
  305. package/dist/types/run/flows/url/slides-output.d.ts +7 -7
  306. package/dist/types/run/flows/url/slides-text.d.ts +9 -9
  307. package/dist/types/run/flows/url/summary.d.ts +11 -11
  308. package/dist/types/run/flows/url/types.d.ts +26 -22
  309. package/dist/types/run/format.d.ts +3 -3
  310. package/dist/types/run/help.d.ts +1 -1
  311. package/dist/types/run/media-cache-state.d.ts +2 -2
  312. package/dist/types/run/model-attempts.d.ts +1 -1
  313. package/dist/types/run/run-config.d.ts +4 -4
  314. package/dist/types/run/run-context.d.ts +3 -1
  315. package/dist/types/run/run-env.d.ts +3 -1
  316. package/dist/types/run/run-input.d.ts +2 -2
  317. package/dist/types/run/run-metrics.d.ts +3 -3
  318. package/dist/types/run/run-models.d.ts +3 -2
  319. package/dist/types/run/run-output.d.ts +1 -1
  320. package/dist/types/run/run-settings.d.ts +15 -6
  321. package/dist/types/run/run-stream.d.ts +2 -2
  322. package/dist/types/run/runner.d.ts +3 -2
  323. package/dist/types/run/slides-render.d.ts +4 -4
  324. package/dist/types/run/stdin-temp-file.d.ts +9 -0
  325. package/dist/types/run/stream-output.d.ts +1 -1
  326. package/dist/types/run/streaming.d.ts +4 -4
  327. package/dist/types/run/summary-engine.d.ts +11 -11
  328. package/dist/types/run/summary-llm.d.ts +5 -5
  329. package/dist/types/run/types.d.ts +4 -4
  330. package/dist/types/run.d.ts +1 -1
  331. package/dist/types/shared/contracts.d.ts +2 -2
  332. package/dist/types/shared/sse-events.d.ts +9 -9
  333. package/dist/types/slides/extract.d.ts +5 -4
  334. package/dist/types/slides/index.d.ts +5 -5
  335. package/dist/types/slides/store.d.ts +2 -2
  336. package/dist/types/slides/types.d.ts +2 -2
  337. package/dist/types/tty/osc-progress.d.ts +5 -5
  338. package/dist/types/tty/progress/fetch-html.d.ts +3 -3
  339. package/dist/types/tty/progress/transcript.d.ts +3 -3
  340. package/dist/types/tty/spinner.d.ts +2 -2
  341. package/dist/types/tty/theme.d.ts +2 -2
  342. package/dist/types/tty/website-progress.d.ts +3 -3
  343. package/dist/types/version.d.ts +1 -1
  344. package/docs/agent.md +38 -4
  345. package/docs/assets/site.js +46 -46
  346. package/docs/chrome-extension.md +11 -5
  347. package/docs/cli.md +59 -13
  348. package/docs/config.md +59 -10
  349. package/docs/extract-only.md +2 -0
  350. package/docs/index.html +33 -14
  351. package/docs/llm.md +7 -4
  352. package/docs/media.md +5 -4
  353. package/docs/model-auto.md +3 -2
  354. package/docs/nvidia-onnx-transcription.md +3 -3
  355. package/docs/openai.md +1 -1
  356. package/docs/releasing.md +3 -0
  357. package/docs/site/404.html +4 -1
  358. package/docs/site/assets/site.js +46 -46
  359. package/docs/site/docs/chrome-extension.html +18 -6
  360. package/docs/site/docs/config.html +29 -8
  361. package/docs/site/docs/extract-only.html +16 -4
  362. package/docs/site/docs/firecrawl.html +12 -3
  363. package/docs/site/docs/index.html +35 -6
  364. package/docs/site/docs/llm.html +19 -5
  365. package/docs/site/docs/openai.html +18 -5
  366. package/docs/site/docs/website.html +29 -9
  367. package/docs/site/docs/youtube.html +12 -3
  368. package/docs/site/index.html +33 -14
  369. package/docs/slides.md +13 -5
  370. package/docs/smoketest.md +29 -20
  371. package/docs/timestamps.md +21 -0
  372. package/docs/website.md +2 -1
  373. package/docs/youtube.md +4 -0
  374. package/package.json +36 -35
package/docs/cli.md CHANGED
@@ -1,35 +1,39 @@
1
1
  ---
2
- summary: "CLI model providers and config for Claude, Codex, and Gemini."
2
+ summary: "CLI model providers and config for Claude, Codex, Gemini, and Cursor Agent."
3
3
  read_when:
4
4
  - "When changing CLI model integration."
5
5
  ---
6
6
 
7
7
  # CLI models
8
8
 
9
- Summarize can use installed CLIs (Claude, Codex, Gemini) as local model backends.
9
+ Summarize can use installed CLIs (Claude, Codex, Gemini, Cursor Agent) as local model backends.
10
10
 
11
11
  ## Model ids
12
12
 
13
13
  - `cli/claude/<model>` (e.g. `cli/claude/sonnet`)
14
14
  - `cli/codex/<model>` (e.g. `cli/codex/gpt-5.2`)
15
15
  - `cli/gemini/<model>` (e.g. `cli/gemini/gemini-3-flash-preview`)
16
+ - `cli/agent/<model>` (e.g. `cli/agent/gpt-5.2`)
16
17
 
17
18
  Use `--cli [provider]` (case-insensitive) for the provider default, or `--model cli/<provider>/<model>` to pin a model.
18
19
  If `--cli` is provided without a provider, auto selection is used with CLI enabled.
19
20
 
20
21
  ## Auto mode
21
22
 
22
- Auto mode does **not** use CLIs unless you set `cli.enabled` in config.
23
+ Auto mode can prepend CLI attempts in two ways:
23
24
 
24
- Why: CLI adds ~4s latency per attempt and higher variance.
25
- Recommendation: enable only Gemini unless you have a reason to add others.
25
+ - `cli.enabled` set in config:
26
+ - Auto always uses this list order.
27
+ - Also acts as an allowlist for explicit `--cli` / `--model cli/...`.
28
+ - Auto CLI fallback (`cli.autoFallback`, default enabled):
29
+ - Applies only to **implicit** auto (when no model is set via flag/env/config).
30
+ - Default behavior: only when no API key is configured.
31
+ - Default order: `claude, gemini, codex, agent`.
32
+ - Remembers + prioritizes the last successful CLI provider (`~/.summarize/cli-state.json`).
26
33
 
27
34
  Gemini CLI performance: summarize sets `GEMINI_CLI_NO_RELAUNCH=true` for Gemini CLI runs to avoid a costly self-relaunch (can be overridden by setting it yourself).
28
35
 
29
- When enabled, auto prepends CLI attempts in the order listed in `cli.enabled`
30
- (recommended: `["gemini"]`).
31
-
32
- Enable CLI attempts:
36
+ Set explicit CLI allowlist:
33
37
 
34
38
  ```json
35
39
  {
@@ -37,21 +41,36 @@ Enable CLI attempts:
37
41
  }
38
42
  ```
39
43
 
40
- Disable CLI attempts:
44
+ Configure auto CLI fallback:
41
45
 
42
46
  ```json
43
47
  {
44
- "cli": { "enabled": [] }
48
+ "cli": {
49
+ "autoFallback": {
50
+ "enabled": true,
51
+ "onlyWhenNoApiKeys": true,
52
+ "order": ["claude", "gemini", "codex", "agent"]
53
+ }
54
+ }
45
55
  }
46
56
  ```
47
57
 
48
- Note: when `cli.enabled` is set, it also acts as an allowlist for explicit `--cli` / `--model cli/...`.
58
+ Disable auto CLI fallback:
59
+
60
+ ```json
61
+ {
62
+ "cli": { "autoFallback": { "enabled": false } }
63
+ }
64
+ ```
65
+
66
+ Note: `--model auto` (explicit) does not trigger auto CLI fallback unless `cli.enabled` is set.
49
67
 
50
68
  ## CLI discovery
51
69
 
52
70
  Binary lookup:
53
71
 
54
72
  - `CLAUDE_PATH`, `CODEX_PATH`, `GEMINI_PATH` (optional overrides)
73
+ - `AGENT_PATH` (optional override)
55
74
  - Otherwise uses `PATH`
56
75
 
57
76
  ## Attachments (images/files)
@@ -62,19 +81,29 @@ path-based prompt and enables the required tool flags:
62
81
  - Claude: `--tools Read --dangerously-skip-permissions`
63
82
  - Gemini: `--yolo` and `--include-directories <dir>`
64
83
  - Codex: `codex exec --output-last-message ...` and `-i <image>` for images
84
+ - Agent: uses built-in file tools in `agent --print` mode (no extra flags)
65
85
 
66
86
  ## Config
67
87
 
68
88
  ```json
69
89
  {
70
90
  "cli": {
71
- "enabled": ["claude", "gemini", "codex"],
91
+ "enabled": ["claude", "gemini", "codex", "agent"],
92
+ "autoFallback": {
93
+ "enabled": true,
94
+ "onlyWhenNoApiKeys": true,
95
+ "order": ["claude", "gemini", "codex", "agent"]
96
+ },
72
97
  "codex": { "model": "gpt-5.2" },
73
98
  "gemini": { "model": "gemini-3-flash-preview", "extraArgs": ["--verbose"] },
74
99
  "claude": {
75
100
  "model": "sonnet",
76
101
  "binary": "/usr/local/bin/claude",
77
102
  "extraArgs": ["--verbose"]
103
+ },
104
+ "agent": {
105
+ "model": "gpt-5.2",
106
+ "binary": "/usr/local/bin/agent"
78
107
  }
79
108
  }
80
109
  }
@@ -84,6 +113,23 @@ Notes:
84
113
 
85
114
  - CLI output is treated as text only (no token accounting).
86
115
  - If a CLI call fails, auto mode falls back to the next candidate.
116
+ - Cursor Agent CLI uses the `agent` binary and relies on Cursor CLI auth (login or `CURSOR_API_KEY`).
117
+ - Gemini CLI is invoked in headless mode with `--prompt` for compatibility with current Gemini CLI releases.
118
+
119
+ ## Quick smoke test (all CLI providers)
120
+
121
+ Use a tiny local text file and run each provider with a longer timeout (Gemini can be slower):
122
+
123
+ ```bash
124
+ printf "Summarize CLI smoke input.\nOne short paragraph. Reply can be brief.\n" >/tmp/summarize-cli-smoke.txt
125
+
126
+ summarize --cli codex --plain --timeout 2m /tmp/summarize-cli-smoke.txt
127
+ summarize --cli claude --plain --timeout 2m /tmp/summarize-cli-smoke.txt
128
+ summarize --cli gemini --plain --timeout 2m /tmp/summarize-cli-smoke.txt
129
+ summarize --cli agent --plain --timeout 2m /tmp/summarize-cli-smoke.txt
130
+ ```
131
+
132
+ If Agent fails with auth, run `agent login` (interactive) or set `CURSOR_API_KEY`.
87
133
 
88
134
  ## Generate free preset (OpenRouter)
89
135
 
package/docs/config.md CHANGED
@@ -37,12 +37,19 @@ For prompt:
37
37
  2. Config file `prompt`
38
38
  3. Built-in default prompt
39
39
 
40
+ For environment variables:
41
+
42
+ 1. Process environment variables
43
+ 2. Config file `env`
44
+ 3. Legacy config file `apiKeys` (mapped to env names)
45
+
40
46
  For UI theme:
41
47
 
42
48
  1. CLI flag `--theme`
43
49
  2. Env `SUMMARIZE_THEME`
44
50
  3. Config file `ui.theme`
45
51
  4. Built-in default (`aurora`)
52
+
46
53
  ## Format
47
54
 
48
55
  `~/.summarize/config.json`:
@@ -50,6 +57,7 @@ For UI theme:
50
57
  ```json
51
58
  {
52
59
  "model": { "id": "google/gemini-3-flash-preview" },
60
+ "env": { "OPENAI_API_KEY": "sk-..." },
53
61
  "output": { "language": "auto" },
54
62
  "prompt": "Explain like I am five.",
55
63
  "ui": { "theme": "ember" }
@@ -92,6 +100,39 @@ Example:
92
100
  }
93
101
  ```
94
102
 
103
+ ## Environment defaults
104
+
105
+ Set any env var in config (process env still wins):
106
+
107
+ ```json
108
+ {
109
+ "env": {
110
+ "OPENAI_API_KEY": "sk-...",
111
+ "OPENROUTER_API_KEY": "sk-or-...",
112
+ "FIRECRAWL_API_KEY": "...",
113
+ "CUSTOM_FLAG": "1"
114
+ }
115
+ }
116
+ ```
117
+
118
+ Legacy shortcut (still supported):
119
+
120
+ ```json
121
+ {
122
+ "apiKeys": {
123
+ "openai": "sk-...",
124
+ "anthropic": "sk-ant-...",
125
+ "google": "...",
126
+ "openrouter": "sk-or-...",
127
+ "xai": "...",
128
+ "zai": "...",
129
+ "apify": "...",
130
+ "firecrawl": "...",
131
+ "fal": "..."
132
+ }
133
+ }
134
+ ```
135
+
95
136
  ## Cache
96
137
 
97
138
  Configure the on-disk SQLite cache (extracted content, transcripts, summaries).
@@ -272,17 +313,25 @@ Examples:
272
313
  ```json
273
314
  {
274
315
  "cli": {
275
- "enabled": ["gemini"],
316
+ "enabled": ["gemini", "agent"],
317
+ "autoFallback": {
318
+ "enabled": true,
319
+ "onlyWhenNoApiKeys": true,
320
+ "order": ["claude", "gemini", "codex", "agent"]
321
+ },
276
322
  "codex": { "model": "gpt-5.2" },
277
- "claude": { "binary": "/usr/local/bin/claude", "extraArgs": ["--verbose"] }
323
+ "claude": { "binary": "/usr/local/bin/claude", "extraArgs": ["--verbose"] },
324
+ "agent": { "binary": "/usr/local/bin/agent", "model": "gpt-5.2" }
278
325
  }
279
326
  }
280
327
  ```
281
328
 
282
329
  Notes:
283
330
 
284
- - `cli.enabled` is an allowlist (auto uses CLIs only when set; explicit `--cli` / `--model cli/...` must be included).
285
- - Recommendation: keep `cli.enabled` to `["gemini"]` unless you have a reason to add others (extra latency/variance).
331
+ - `cli.enabled` is an allowlist (and order) for auto + explicit CLI model ids.
332
+ - `cli.autoFallback` controls implicit-auto CLI fallback when `cli.enabled` is not set.
333
+ - Default auto fallback order: `claude, gemini, codex, agent`.
334
+ - Auto fallback stores the last successful provider in `~/.summarize/cli-state.json` and prioritizes it on the next run.
286
335
  - `cli.<provider>.binary` overrides CLI binary discovery.
287
336
  - `cli.<provider>.extraArgs` appends extra CLI args.
288
337
 
@@ -318,9 +367,9 @@ Override API endpoints for any provider to use proxies, gateways, or compatible
318
367
 
319
368
  Or via environment variables (which take precedence over config):
320
369
 
321
- | Provider | Environment Variable(s) |
322
- | ---------- | -------------------------------------- |
323
- | OpenAI | `OPENAI_BASE_URL` |
324
- | Anthropic | `ANTHROPIC_BASE_URL` |
325
- | Google | `GOOGLE_BASE_URL` (alias: `GEMINI_BASE_URL`) |
326
- | xAI | `XAI_BASE_URL` |
370
+ | Provider | Environment Variable(s) |
371
+ | --------- | -------------------------------------------- |
372
+ | OpenAI | `OPENAI_BASE_URL` |
373
+ | Anthropic | `ANTHROPIC_BASE_URL` |
374
+ | Google | `GOOGLE_BASE_URL` (alias: `GEMINI_BASE_URL`) |
375
+ | xAI | `XAI_BASE_URL` |
@@ -13,6 +13,7 @@ Deprecated alias: `--extract-only`.
13
13
  ## Notes
14
14
 
15
15
  - No summarization LLM call happens in this mode.
16
+ - Input must be a URL (`-` stdin is not supported with `--extract`).
16
17
  - No extraction cap is applied. Use `--max-extract-characters <count>` to cap output if needed.
17
18
  - `--format md` may still convert HTML to Markdown (depending on `--markdown-mode` and available tools).
18
19
  - `--length` is intended for summarization guidance; extraction prints full content.
@@ -30,4 +31,5 @@ Deprecated alias: `--extract-only`.
30
31
  - `--markdown-mode readability` uses Readability to extract article HTML before Markdown conversion.
31
32
 
32
33
  Daemon note:
34
+
33
35
  - `/v1/summarize` supports `format: "markdown"` + `markdownMode` for extract-only output (use `extractOnly: true`).
package/docs/index.html CHANGED
@@ -11,7 +11,10 @@
11
11
  />
12
12
  <link rel="canonical" href="https://summarize.sh/" />
13
13
  <meta property="og:title" content="summarize" />
14
- <meta property="og:description" content="Fast summaries, in the CLI and the Chrome Side Panel." />
14
+ <meta
15
+ property="og:description"
16
+ content="Fast summaries, in the CLI and the Chrome Side Panel."
17
+ />
15
18
  <meta property="og:type" content="website" />
16
19
  <meta property="og:url" content="https://summarize.sh/" />
17
20
  <meta name="theme-color" content="#0b0f12" />
@@ -44,9 +47,10 @@
44
47
  <p class="kicker">CLI + Chrome Extension</p>
45
48
  <h1 class="title">Summaries that live where you work.</h1>
46
49
  <p class="lede">
47
- Summarize turns links, files, and media into sharp summaries with a real extraction pipeline.
48
- Use the <strong>CLI</strong> for automation or the <strong>Chrome Side Panel</strong> for one-click
49
- summaries of the current tab. Supports <strong>local, paid, and free</strong> models.
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.
50
54
  </p>
51
55
  <div class="ctaRow">
52
56
  <a class="btn btn--primary" href="./docs/index.html">Docs</a>
@@ -71,7 +75,11 @@
71
75
  <figcaption>CLI: streaming summaries in the terminal.</figcaption>
72
76
  </figure>
73
77
  <figure class="shot shot--ext">
74
- <img src="./assets/summarize-extension.png" alt="Summarize Chrome extension side panel" loading="lazy" />
78
+ <img
79
+ src="./assets/summarize-extension.png"
80
+ alt="Summarize Chrome extension side panel"
81
+ loading="lazy"
82
+ />
75
83
  <figcaption>Extension: a live Side Panel for the active tab.</figcaption>
76
84
  </figure>
77
85
  </div>
@@ -85,13 +93,18 @@
85
93
  <h2>Fast summaries, scripted or interactive.</h2>
86
94
  </div>
87
95
  <p>
88
- Built for automation: extract clean text, summarize with your model, and output JSON or Markdown.
89
- Works with URLs, PDFs, images, audio/video, YouTube, and podcasts.
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.
90
98
  </p>
91
99
  <ul class="list">
92
100
  <li><strong>Extract + summarize</strong> with Firecrawl fallback.</li>
93
- <li><strong>Media pipeline</strong> with transcript-first flow and Whisper fallback.</li>
94
- <li><strong>Scriptable output</strong> via <code>--json</code>, <code>--extract</code>, <code>--metrics</code>.</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>
95
108
  </ul>
96
109
  <div class="cardCode">
97
110
  <pre><code>summarize "https://example.com" --length long
@@ -110,8 +123,8 @@ summarize "/path/report.pdf" --model google/gemini-3-flash-preview</code></pre>
110
123
  <h2>Summaries in the Side Panel, one click away.</h2>
111
124
  </div>
112
125
  <p>
113
- A real Chrome Side Panel with a tiny local daemon. It streams Markdown summaries for the active tab,
114
- with auto-summary on navigation.
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.
115
128
  </p>
116
129
  <ol class="steps">
117
130
  <li>Install the CLI + daemon.</li>
@@ -119,11 +132,14 @@ summarize "/path/report.pdf" --model google/gemini-3-flash-preview</code></pre>
119
132
  <li>Open Side Panel and connect with the token.</li>
120
133
  </ol>
121
134
  <div class="callout">
122
- <strong>Runs locally</strong> on your machine. The daemon is localhost-only and token-protected.
135
+ <strong>Runs locally</strong> on your machine. The daemon is localhost-only and
136
+ token-protected.
123
137
  </div>
124
138
  <div class="ctaRow">
125
139
  <a class="btn btn--ghost" href="./docs/chrome-extension.html">Extension docs</a>
126
- <a class="btn" href="https://github.com/steipete/summarize/releases/latest">Latest release</a>
140
+ <a class="btn" href="https://github.com/steipete/summarize/releases/latest"
141
+ >Latest release</a
142
+ >
127
143
  </div>
128
144
  </article>
129
145
  </section>
@@ -196,7 +212,10 @@ summarize "/path/report.pdf" --model google/gemini-3-flash-preview</code></pre>
196
212
 
197
213
  <footer class="footer">
198
214
  <span>Canonical: <a href="https://summarize.sh">summarize.sh</a></span>
199
- <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
+ >
200
219
  </footer>
201
220
  </main>
202
221
 
package/docs/llm.md CHANGED
@@ -7,7 +7,8 @@ read_when:
7
7
  # LLM / summarization mode
8
8
 
9
9
  By default `summarize` will call an LLM using **direct provider API keys**. When CLI tools are
10
- installed, auto mode can use local CLI models when `cli.enabled` is set (see `docs/cli.md`).
10
+ installed, auto mode can use local CLI models via `cli.enabled` or implicit auto CLI fallback
11
+ (`cli.autoFallback`; see `docs/cli.md`).
11
12
 
12
13
  ## Defaults
13
14
 
@@ -17,6 +18,7 @@ installed, auto mode can use local CLI models when `cli.enabled` is set (see `do
17
18
  ## Env
18
19
 
19
20
  - `.env` (optional): when running the CLI, `summarize` also reads `.env` in the current working directory and merges it into the environment (real env vars win).
21
+ - `~/.summarize/config.json` `env` (optional): fallback env defaults when process env is missing/blank.
20
22
  - `XAI_API_KEY` (required for `xai/...` models)
21
23
  - `XAI_BASE_URL` (optional; override xAI API endpoint)
22
24
  - `OPENAI_API_KEY` (required for `openai/...` models)
@@ -30,7 +32,7 @@ installed, auto mode can use local CLI models when `cli.enabled` is set (see `do
30
32
  - `ANTHROPIC_API_KEY` (required for `anthropic/...` models)
31
33
  - `ANTHROPIC_BASE_URL` (optional; override Anthropic API endpoint)
32
34
  - `SUMMARIZE_MODEL` (optional; overrides default model selection)
33
- - `CLAUDE_PATH` / `CODEX_PATH` / `GEMINI_PATH` (optional; override CLI binary paths)
35
+ - `CLAUDE_PATH` / `CODEX_PATH` / `GEMINI_PATH` / `AGENT_PATH` (optional; override CLI binary paths)
34
36
 
35
37
  ## Flags
36
38
 
@@ -39,6 +41,7 @@ installed, auto mode can use local CLI models when `cli.enabled` is set (see `do
39
41
  - `cli/codex/gpt-5.2`
40
42
  - `cli/claude/sonnet`
41
43
  - `cli/gemini/gemini-3-flash-preview`
44
+ - `cli/agent/gpt-5.2`
42
45
  - `google/gemini-3-flash-preview`
43
46
  - `openai/gpt-5-mini`
44
47
  - `zai/glm-4.7`
@@ -47,7 +50,7 @@ installed, auto mode can use local CLI models when `cli.enabled` is set (see `do
47
50
  - `anthropic/claude-sonnet-4-5`
48
51
  - `openrouter/meta-llama/llama-3.3-70b-instruct:free` (force OpenRouter)
49
52
  - `--cli [provider]`
50
- - Examples: `--cli claude`, `--cli Gemini`, `--cli codex` (equivalent to `--model cli/<provider>`); `--cli` alone uses auto selection with CLI enabled.
53
+ - Examples: `--cli claude`, `--cli Gemini`, `--cli codex`, `--cli agent` (equivalent to `--model cli/<provider>`); `--cli` alone uses auto selection with CLI enabled.
51
54
  - `--model auto`
52
55
  - See `docs/model-auto.md`
53
56
  - `--model <preset>`
@@ -65,7 +68,7 @@ installed, auto mode can use local CLI models when `cli.enabled` is set (see `do
65
68
  - `--video-mode auto|transcript|understand`
66
69
  - Only relevant for video inputs / video-only pages.
67
70
  - `--length short|medium|long|xl|xxl|<chars>`
68
- - This is *soft guidance* to the model (no hard truncation).
71
+ - This is _soft guidance_ to the model (no hard truncation).
69
72
  - Minimum numeric value: 50 chars.
70
73
  - Default: `long`.
71
74
  - Output format is Markdown; use short paragraphs and only add bullets when they improve scanability.
package/docs/media.md CHANGED
@@ -13,8 +13,8 @@ read_when:
13
13
 
14
14
  ## Transcript resolution order
15
15
 
16
- 1) Embedded captions (VTT/JSON) when available.
17
- 2) yt-dlp download + Whisper transcription (prefers local whisper.cpp; OpenAI/FAL fallback).
16
+ 1. Embedded captions (VTT/JSON) when available.
17
+ 2. yt-dlp download + Whisper transcription (Groq first; then ONNX/local/OpenAI/FAL fallback).
18
18
 
19
19
  ## CLI behavior
20
20
 
@@ -22,8 +22,9 @@ read_when:
22
22
  - Direct media URLs (mp4/webm/m4a/etc) skip HTML and transcribe.
23
23
  - Local audio/video files are routed through the same transcript-first pipeline.
24
24
  - YouTube still uses the YouTube transcript pipeline (captions → yt-dlp fallback).
25
- - X/Twitter status URLs with detected video auto-switch to transcript-first (yt-dlp), even in auto mode.
26
- - Local media files are capped at 2 GB; remote media URLs are best-effort via yt-dlp (no explicit size limit).
25
+ - X/Twitter status URLs with detected video auto-switch to transcript-first (yt-dlp), even in auto mode.
26
+ - X broadcasts (`/i/broadcasts/...`) are treated as media-only and go transcript-first by default.
27
+ - Local media files are capped at 2 GB; remote media URLs are best-effort via yt-dlp (no explicit size limit).
27
28
 
28
29
  ## Chrome extension behavior
29
30
 
@@ -16,8 +16,9 @@ This is also the built-in default when you don’t specify a model.
16
16
  - Skips attempts that don’t have the required API key configured.
17
17
  - On any request error, tries the next attempt.
18
18
  - If no model is usable, prints the extracted text (no LLM summary). Use `--extract` if you want the raw extracted content even when models are available.
19
- - Auto prepends CLI attempts only when `cli.enabled` is set (see `docs/cli.md`).
20
- - Order follows `cli.enabled`.
19
+ - Auto prepends CLI attempts when either:
20
+ - `cli.enabled` is set (order follows `cli.enabled`), or
21
+ - implicit auto selection is active and `cli.autoFallback` allows it.
21
22
 
22
23
  ## OpenRouter vs native
23
24
 
@@ -10,8 +10,8 @@ Summarize can now run local transcription through NVIDIA's Parakeet-TDT 0.6B-v3
10
10
 
11
11
  ## How to enable
12
12
 
13
- 1) Install a CLI capable of running the ONNX models (e.g. `sherpa-onnx` or a custom wrapper). Homebrew may not have a formula; use upstream binaries or build from source if needed. The CLI must emit the transcribed text on stdout and accept a single WAV input path. **Summarize now downloads the Hugging Face model files automatically on first use** into the cache (see below), so your command template can reference the provided paths.
14
- 2) Set one (or both) command templates:
13
+ 1. Install a CLI capable of running the ONNX models (e.g. `sherpa-onnx` or a custom wrapper). Homebrew may not have a formula; use upstream binaries or build from source if needed. The CLI must emit the transcribed text on stdout and accept a single WAV input path. **Summarize now downloads the Hugging Face model files automatically on first use** into the cache (see below), so your command template can reference the provided paths.
14
+ 2. Set one (or both) command templates:
15
15
 
16
16
  - Recommended (no shell): provide a JSON array (command + args):
17
17
  - `SUMMARIZE_ONNX_PARAKEET_CMD='["sherpa-onnx", "...", "--tokens", "{vocab}", "--offline-ctc-model", "{model}", "--input-wav", "{input}"]'`
@@ -29,7 +29,7 @@ Placeholders:
29
29
  - `{vocab}` — downloaded `vocab.txt` path
30
30
  - `{model_dir}` — parent directory containing the downloaded files
31
31
 
32
- 3) Pick the ONNX model via CLI or env:
32
+ 3. Pick the ONNX model via CLI or env:
33
33
 
34
34
  - Auto (default): leave `SUMMARIZE_TRANSCRIBER` unset or set `SUMMARIZE_TRANSCRIBER=auto`
35
35
  - CLI: `--transcriber parakeet` or `--transcriber canary`
package/docs/openai.md CHANGED
@@ -19,7 +19,7 @@ For the full model/provider matrix, see `docs/llm.md`.
19
19
 
20
20
  - `--model openai/<model>`
21
21
  - `--length short|medium|long|xl|xxl|<chars>`
22
- - This is *soft guidance* to the model (no hard truncation).
22
+ - This is _soft guidance_ to the model (no hard truncation).
23
23
  - `--max-output-tokens <count>`
24
24
  - Hard cap for output tokens (optional).
25
25
  - `--json` (includes prompt + summary in one JSON object)
package/docs/releasing.md CHANGED
@@ -5,11 +5,13 @@ summary: "Release checklist + Homebrew tap update."
5
5
  # Releasing
6
6
 
7
7
  ## Goals
8
+
8
9
  - Ship npm packages (core first, then CLI).
9
10
  - Tag + GitHub release.
10
11
  - Update Homebrew tap so `brew install steipete/tap/summarize` matches latest tag.
11
12
 
12
13
  ## Checklist
14
+
13
15
  1. `scripts/release.sh all` (gates → build → verify → publish → smoke → tag → tap).
14
16
  2. Create GitHub release for the new tag (match version, attach notes/assets as needed).
15
17
  3. If you didn’t run `tap` in the script, update the Homebrew tap formula for `summarize`:
@@ -22,5 +24,6 @@ summary: "Release checklist + Homebrew tap update."
22
24
  5. If anything fails, fix and re-cut the release (no partials).
23
25
 
24
26
  ## Common failure
27
+
25
28
  - NPM/GitHub release updated, tap not updated → users stuck on old version.
26
29
  Fix: always do step 3–4 before announcing.
@@ -7,7 +7,10 @@
7
7
  <title>Not found — summarize</title>
8
8
  <link rel="preconnect" href="https://fonts.googleapis.com" />
9
9
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
10
- <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap" rel="stylesheet" />
10
+ <link
11
+ href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap"
12
+ rel="stylesheet"
13
+ />
11
14
  <link rel="stylesheet" href="./assets/site.css" />
12
15
  </head>
13
16
  <body>
@@ -1,72 +1,72 @@
1
- const canonicalHost = 'summarize.sh'
2
- const redirectHostnames = new Set(['summarize.is', 'www.summarize.is'])
1
+ const canonicalHost = "summarize.sh";
2
+ const redirectHostnames = new Set(["summarize.is", "www.summarize.is"]);
3
3
 
4
4
  const maybeRedirect = () => {
5
5
  try {
6
- const { hostname, pathname, search, hash } = window.location
7
- if (!redirectHostnames.has(hostname)) return
8
- const target = `https://${canonicalHost}${pathname}${search}${hash}`
9
- window.location.replace(target)
6
+ const { hostname, pathname, search, hash } = window.location;
7
+ if (!redirectHostnames.has(hostname)) return;
8
+ const target = `https://${canonicalHost}${pathname}${search}${hash}`;
9
+ window.location.replace(target);
10
10
  } catch {
11
11
  // ignore
12
12
  }
13
- }
13
+ };
14
14
 
15
15
  const highlightNav = () => {
16
- const path = window.location.pathname
17
- const isDocs = path.includes('/docs/')
18
- const navDocs = document.querySelector('a[data-nav="docs"]')
19
- const navHome = document.querySelector('a[data-nav="home"]')
20
- if (navDocs && isDocs) navDocs.setAttribute('aria-current', 'page')
21
- if (navHome && !isDocs) navHome.setAttribute('aria-current', 'page')
16
+ const path = window.location.pathname;
17
+ const isDocs = path.includes("/docs/");
18
+ const navDocs = document.querySelector('a[data-nav="docs"]');
19
+ const navHome = document.querySelector('a[data-nav="home"]');
20
+ if (navDocs && isDocs) navDocs.setAttribute("aria-current", "page");
21
+ if (navHome && !isDocs) navHome.setAttribute("aria-current", "page");
22
22
 
23
- const sideLinks = document.querySelectorAll('.side a[href]')
23
+ const sideLinks = document.querySelectorAll(".side a[href]");
24
24
  for (const a of sideLinks) {
25
- const href = a.getAttribute('href') ?? ''
26
- if (!href) continue
27
- const normalized = href.replace(/^\.\//, '')
28
- if (path.endsWith(normalized)) a.setAttribute('aria-current', 'page')
25
+ const href = a.getAttribute("href") ?? "";
26
+ if (!href) continue;
27
+ const normalized = href.replace(/^\.\//, "");
28
+ if (path.endsWith(normalized)) a.setAttribute("aria-current", "page");
29
29
  }
30
- }
30
+ };
31
31
 
32
32
  const wireCopyButtons = () => {
33
- const buttons = document.querySelectorAll('[data-copy]')
33
+ const buttons = document.querySelectorAll("[data-copy]");
34
34
  const handleCopyClick = async (button) => {
35
- const selector = button.getAttribute('data-copy')
36
- const target = selector ? document.querySelector(selector) : null
37
- const text = target?.textContent?.trim() ?? ''
38
- if (!text) return
35
+ const selector = button.getAttribute("data-copy");
36
+ const target = selector ? document.querySelector(selector) : null;
37
+ const text = target?.textContent?.trim() ?? "";
38
+ if (!text) return;
39
39
  try {
40
- await navigator.clipboard.writeText(text)
41
- const prev = button.textContent ?? ''
42
- button.textContent = 'Copied'
43
- button.setAttribute('data-copied', '1')
40
+ await navigator.clipboard.writeText(text);
41
+ const prev = button.textContent ?? "";
42
+ button.textContent = "Copied";
43
+ button.setAttribute("data-copied", "1");
44
44
  window.setTimeout(() => {
45
- button.textContent = prev
46
- button.removeAttribute('data-copied')
47
- }, 900)
45
+ button.textContent = prev;
46
+ button.removeAttribute("data-copied");
47
+ }, 900);
48
48
  } catch {
49
49
  // ignore
50
50
  }
51
- }
51
+ };
52
52
  for (const button of buttons) {
53
- button.addEventListener('click', () => {
54
- void handleCopyClick(button)
55
- })
53
+ button.addEventListener("click", () => {
54
+ void handleCopyClick(button);
55
+ });
56
56
  }
57
- }
57
+ };
58
58
 
59
59
  const reveal = () => {
60
- const items = document.querySelectorAll('.reveal')
61
- let i = 0
60
+ const items = document.querySelectorAll(".reveal");
61
+ let i = 0;
62
62
  for (const el of items) {
63
- const delay = Math.min(380, i * 70)
64
- window.setTimeout(() => el.classList.add('is-on'), delay)
65
- i++
63
+ const delay = Math.min(380, i * 70);
64
+ window.setTimeout(() => el.classList.add("is-on"), delay);
65
+ i++;
66
66
  }
67
- }
67
+ };
68
68
 
69
- maybeRedirect()
70
- highlightNav()
71
- wireCopyButtons()
72
- reveal()
69
+ maybeRedirect();
70
+ highlightNav();
71
+ wireCopyButtons();
72
+ reveal();