@steipete/summarize 0.8.2 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/CHANGELOG.md +114 -1
  2. package/LICENSE +1 -1
  3. package/README.md +309 -182
  4. package/dist/cli.js +1 -1
  5. package/dist/esm/cache.js +72 -4
  6. package/dist/esm/cache.js.map +1 -1
  7. package/dist/esm/config.js +197 -1
  8. package/dist/esm/config.js.map +1 -1
  9. package/dist/esm/content/asset.js +75 -2
  10. package/dist/esm/content/asset.js.map +1 -1
  11. package/dist/esm/daemon/agent.js +547 -0
  12. package/dist/esm/daemon/agent.js.map +1 -0
  13. package/dist/esm/daemon/chat.js +97 -0
  14. package/dist/esm/daemon/chat.js.map +1 -0
  15. package/dist/esm/daemon/cli.js +105 -10
  16. package/dist/esm/daemon/cli.js.map +1 -1
  17. package/dist/esm/daemon/env-snapshot.js +3 -0
  18. package/dist/esm/daemon/env-snapshot.js.map +1 -1
  19. package/dist/esm/daemon/flow-context.js +53 -28
  20. package/dist/esm/daemon/flow-context.js.map +1 -1
  21. package/dist/esm/daemon/launchd.js +27 -0
  22. package/dist/esm/daemon/launchd.js.map +1 -1
  23. package/dist/esm/daemon/process-registry.js +206 -0
  24. package/dist/esm/daemon/process-registry.js.map +1 -0
  25. package/dist/esm/daemon/schtasks.js +64 -0
  26. package/dist/esm/daemon/schtasks.js.map +1 -1
  27. package/dist/esm/daemon/server.js +1034 -52
  28. package/dist/esm/daemon/server.js.map +1 -1
  29. package/dist/esm/daemon/summarize.js +66 -18
  30. package/dist/esm/daemon/summarize.js.map +1 -1
  31. package/dist/esm/daemon/systemd.js +61 -0
  32. package/dist/esm/daemon/systemd.js.map +1 -1
  33. package/dist/esm/flags.js +24 -0
  34. package/dist/esm/flags.js.map +1 -1
  35. package/dist/esm/llm/attachments.js +2 -0
  36. package/dist/esm/llm/attachments.js.map +1 -0
  37. package/dist/esm/llm/errors.js +6 -0
  38. package/dist/esm/llm/errors.js.map +1 -0
  39. package/dist/esm/llm/generate-text.js +206 -356
  40. package/dist/esm/llm/generate-text.js.map +1 -1
  41. package/dist/esm/llm/html-to-markdown.js +1 -2
  42. package/dist/esm/llm/html-to-markdown.js.map +1 -1
  43. package/dist/esm/llm/prompt.js.map +1 -1
  44. package/dist/esm/llm/providers/anthropic.js +126 -0
  45. package/dist/esm/llm/providers/anthropic.js.map +1 -0
  46. package/dist/esm/llm/providers/google.js +78 -0
  47. package/dist/esm/llm/providers/google.js.map +1 -0
  48. package/dist/esm/llm/providers/models.js +111 -0
  49. package/dist/esm/llm/providers/models.js.map +1 -0
  50. package/dist/esm/llm/providers/openai.js +150 -0
  51. package/dist/esm/llm/providers/openai.js.map +1 -0
  52. package/dist/esm/llm/providers/shared.js +48 -0
  53. package/dist/esm/llm/providers/shared.js.map +1 -0
  54. package/dist/esm/llm/providers/types.js +2 -0
  55. package/dist/esm/llm/providers/types.js.map +1 -0
  56. package/dist/esm/llm/transcript-to-markdown.js +1 -2
  57. package/dist/esm/llm/transcript-to-markdown.js.map +1 -1
  58. package/dist/esm/llm/types.js +2 -0
  59. package/dist/esm/llm/types.js.map +1 -0
  60. package/dist/esm/llm/usage.js +69 -0
  61. package/dist/esm/llm/usage.js.map +1 -0
  62. package/dist/esm/logging/daemon.js +124 -0
  63. package/dist/esm/logging/daemon.js.map +1 -0
  64. package/dist/esm/logging/ring-file.js +66 -0
  65. package/dist/esm/logging/ring-file.js.map +1 -0
  66. package/dist/esm/media-cache.js +251 -0
  67. package/dist/esm/media-cache.js.map +1 -0
  68. package/dist/esm/model-auto.js +103 -5
  69. package/dist/esm/model-auto.js.map +1 -1
  70. package/dist/esm/processes.js +2 -0
  71. package/dist/esm/processes.js.map +1 -0
  72. package/dist/esm/refresh-free.js +3 -3
  73. package/dist/esm/refresh-free.js.map +1 -1
  74. package/dist/esm/run/attachments.js +8 -4
  75. package/dist/esm/run/attachments.js.map +1 -1
  76. package/dist/esm/run/bird.js +118 -5
  77. package/dist/esm/run/bird.js.map +1 -1
  78. package/dist/esm/run/cache-state.js +3 -2
  79. package/dist/esm/run/cache-state.js.map +1 -1
  80. package/dist/esm/run/cli-preflight.js +19 -1
  81. package/dist/esm/run/cli-preflight.js.map +1 -1
  82. package/dist/esm/run/constants.js +0 -7
  83. package/dist/esm/run/constants.js.map +1 -1
  84. package/dist/esm/run/finish-line.js +58 -11
  85. package/dist/esm/run/finish-line.js.map +1 -1
  86. package/dist/esm/run/flows/asset/extract.js +70 -0
  87. package/dist/esm/run/flows/asset/extract.js.map +1 -0
  88. package/dist/esm/run/flows/asset/input.js +209 -25
  89. package/dist/esm/run/flows/asset/input.js.map +1 -1
  90. package/dist/esm/run/flows/asset/media-policy.js +3 -0
  91. package/dist/esm/run/flows/asset/media-policy.js.map +1 -0
  92. package/dist/esm/run/flows/asset/media.js +224 -0
  93. package/dist/esm/run/flows/asset/media.js.map +1 -0
  94. package/dist/esm/run/flows/asset/output.js +98 -0
  95. package/dist/esm/run/flows/asset/output.js.map +1 -0
  96. package/dist/esm/run/flows/asset/preprocess.js +92 -16
  97. package/dist/esm/run/flows/asset/preprocess.js.map +1 -1
  98. package/dist/esm/run/flows/asset/summary.js +165 -11
  99. package/dist/esm/run/flows/asset/summary.js.map +1 -1
  100. package/dist/esm/run/flows/url/extract.js +6 -6
  101. package/dist/esm/run/flows/url/extract.js.map +1 -1
  102. package/dist/esm/run/flows/url/flow.js +338 -36
  103. package/dist/esm/run/flows/url/flow.js.map +1 -1
  104. package/dist/esm/run/flows/url/markdown.js +6 -1
  105. package/dist/esm/run/flows/url/markdown.js.map +1 -1
  106. package/dist/esm/run/flows/url/slides-output.js +485 -0
  107. package/dist/esm/run/flows/url/slides-output.js.map +1 -0
  108. package/dist/esm/run/flows/url/slides-text.js +628 -0
  109. package/dist/esm/run/flows/url/slides-text.js.map +1 -0
  110. package/dist/esm/run/flows/url/summary.js +358 -83
  111. package/dist/esm/run/flows/url/summary.js.map +1 -1
  112. package/dist/esm/run/help.js +94 -5
  113. package/dist/esm/run/help.js.map +1 -1
  114. package/dist/esm/run/logging.js +12 -4
  115. package/dist/esm/run/logging.js.map +1 -1
  116. package/dist/esm/run/media-cache-state.js +33 -0
  117. package/dist/esm/run/media-cache-state.js.map +1 -0
  118. package/dist/esm/run/progress.js +19 -1
  119. package/dist/esm/run/progress.js.map +1 -1
  120. package/dist/esm/run/run-context.js +19 -0
  121. package/dist/esm/run/run-context.js.map +1 -0
  122. package/dist/esm/run/run-output.js +1 -1
  123. package/dist/esm/run/run-output.js.map +1 -1
  124. package/dist/esm/run/run-settings.js +182 -0
  125. package/dist/esm/run/run-settings.js.map +1 -0
  126. package/dist/esm/run/runner.js +225 -32
  127. package/dist/esm/run/runner.js.map +1 -1
  128. package/dist/esm/run/slides-cli.js +225 -0
  129. package/dist/esm/run/slides-cli.js.map +1 -0
  130. package/dist/esm/run/slides-render.js +163 -0
  131. package/dist/esm/run/slides-render.js.map +1 -0
  132. package/dist/esm/run/stream-output.js +63 -0
  133. package/dist/esm/run/stream-output.js.map +1 -0
  134. package/dist/esm/run/streaming.js +16 -43
  135. package/dist/esm/run/streaming.js.map +1 -1
  136. package/dist/esm/run/summary-engine.js +59 -41
  137. package/dist/esm/run/summary-engine.js.map +1 -1
  138. package/dist/esm/run/transcriber-cli.js +148 -0
  139. package/dist/esm/run/transcriber-cli.js.map +1 -0
  140. package/dist/esm/shared/sse-events.js +26 -0
  141. package/dist/esm/shared/sse-events.js.map +1 -0
  142. package/dist/esm/shared/streaming-merge.js +44 -0
  143. package/dist/esm/shared/streaming-merge.js.map +1 -0
  144. package/dist/esm/slides/extract.js +1942 -0
  145. package/dist/esm/slides/extract.js.map +1 -0
  146. package/dist/esm/slides/index.js +4 -0
  147. package/dist/esm/slides/index.js.map +1 -0
  148. package/dist/esm/slides/settings.js +73 -0
  149. package/dist/esm/slides/settings.js.map +1 -0
  150. package/dist/esm/slides/store.js +111 -0
  151. package/dist/esm/slides/store.js.map +1 -0
  152. package/dist/esm/slides/types.js +2 -0
  153. package/dist/esm/slides/types.js.map +1 -0
  154. package/dist/esm/tty/osc-progress.js +21 -1
  155. package/dist/esm/tty/osc-progress.js.map +1 -1
  156. package/dist/esm/tty/progress/fetch-html.js +8 -4
  157. package/dist/esm/tty/progress/fetch-html.js.map +1 -1
  158. package/dist/esm/tty/progress/transcript.js +82 -31
  159. package/dist/esm/tty/progress/transcript.js.map +1 -1
  160. package/dist/esm/tty/spinner.js +2 -2
  161. package/dist/esm/tty/spinner.js.map +1 -1
  162. package/dist/esm/tty/theme.js +189 -0
  163. package/dist/esm/tty/theme.js.map +1 -0
  164. package/dist/esm/tty/website-progress.js +17 -13
  165. package/dist/esm/tty/website-progress.js.map +1 -1
  166. package/dist/esm/version.js +1 -1
  167. package/dist/esm/version.js.map +1 -1
  168. package/dist/types/cache.d.ts +14 -2
  169. package/dist/types/config.d.ts +34 -0
  170. package/dist/types/daemon/agent.d.ts +25 -0
  171. package/dist/types/daemon/chat.d.ts +27 -0
  172. package/dist/types/daemon/env-snapshot.d.ts +1 -1
  173. package/dist/types/daemon/flow-context.d.ts +24 -3
  174. package/dist/types/daemon/launchd.d.ts +4 -0
  175. package/dist/types/daemon/process-registry.d.ts +73 -0
  176. package/dist/types/daemon/schtasks.d.ts +4 -0
  177. package/dist/types/daemon/server.d.ts +7 -1
  178. package/dist/types/daemon/summarize.d.ts +47 -5
  179. package/dist/types/daemon/systemd.d.ts +4 -0
  180. package/dist/types/flags.d.ts +1 -0
  181. package/dist/types/llm/attachments.d.ts +6 -0
  182. package/dist/types/llm/errors.d.ts +1 -0
  183. package/dist/types/llm/generate-text.d.ts +29 -13
  184. package/dist/types/llm/prompt.d.ts +7 -2
  185. package/dist/types/llm/providers/anthropic.d.ts +30 -0
  186. package/dist/types/llm/providers/google.d.ts +29 -0
  187. package/dist/types/llm/providers/models.d.ts +27 -0
  188. package/dist/types/llm/providers/openai.d.ts +38 -0
  189. package/dist/types/llm/providers/shared.d.ts +14 -0
  190. package/dist/types/llm/providers/types.d.ts +6 -0
  191. package/dist/types/llm/types.d.ts +5 -0
  192. package/dist/types/llm/usage.d.ts +5 -0
  193. package/dist/types/logging/daemon.d.ts +26 -0
  194. package/dist/types/logging/ring-file.d.ts +10 -0
  195. package/dist/types/media-cache.d.ts +22 -0
  196. package/dist/types/model-auto.d.ts +1 -0
  197. package/dist/types/processes.d.ts +1 -0
  198. package/dist/types/run/attachments.d.ts +9 -6
  199. package/dist/types/run/bird.d.ts +7 -0
  200. package/dist/types/run/constants.d.ts +0 -2
  201. package/dist/types/run/finish-line.d.ts +59 -1
  202. package/dist/types/run/flows/asset/extract.d.ts +18 -0
  203. package/dist/types/run/flows/asset/input.d.ts +12 -2
  204. package/dist/types/run/flows/asset/media-policy.d.ts +2 -0
  205. package/dist/types/run/flows/asset/media.d.ts +21 -0
  206. package/dist/types/run/flows/asset/output.d.ts +42 -0
  207. package/dist/types/run/flows/asset/preprocess.d.ts +22 -2
  208. package/dist/types/run/flows/asset/summary.d.ts +6 -0
  209. package/dist/types/run/flows/url/extract.d.ts +2 -1
  210. package/dist/types/run/flows/url/slides-output.d.ts +66 -0
  211. package/dist/types/run/flows/url/slides-text.d.ts +87 -0
  212. package/dist/types/run/flows/url/summary.d.ts +11 -3
  213. package/dist/types/run/flows/url/types.d.ts +29 -2
  214. package/dist/types/run/help.d.ts +3 -0
  215. package/dist/types/run/logging.d.ts +3 -2
  216. package/dist/types/run/media-cache-state.d.ts +7 -0
  217. package/dist/types/run/progress.d.ts +2 -1
  218. package/dist/types/run/run-context.d.ts +44 -0
  219. package/dist/types/run/run-settings.d.ts +62 -0
  220. package/dist/types/run/slides-cli.d.ts +9 -0
  221. package/dist/types/run/slides-render.d.ts +30 -0
  222. package/dist/types/run/stream-output.d.ts +12 -0
  223. package/dist/types/run/streaming.d.ts +10 -4
  224. package/dist/types/run/summary-engine.d.ts +15 -3
  225. package/dist/types/run/summary-llm.d.ts +2 -2
  226. package/dist/types/run/transcriber-cli.d.ts +8 -0
  227. package/dist/types/shared/sse-events.d.ts +64 -0
  228. package/dist/types/shared/streaming-merge.d.ts +4 -0
  229. package/dist/types/slides/extract.d.ts +42 -0
  230. package/dist/types/slides/index.d.ts +5 -0
  231. package/dist/types/slides/settings.d.ts +20 -0
  232. package/dist/types/slides/store.d.ts +15 -0
  233. package/dist/types/slides/types.d.ts +40 -0
  234. package/dist/types/tty/osc-progress.d.ts +2 -2
  235. package/dist/types/tty/progress/fetch-html.d.ts +3 -1
  236. package/dist/types/tty/progress/transcript.d.ts +3 -1
  237. package/dist/types/tty/spinner.d.ts +3 -1
  238. package/dist/types/tty/theme.d.ts +44 -0
  239. package/dist/types/tty/website-progress.d.ts +3 -1
  240. package/dist/types/version.d.ts +1 -1
  241. package/docs/README.md +13 -8
  242. package/docs/_config.yml +26 -0
  243. package/docs/_layouts/default.html +60 -0
  244. package/docs/agent.md +333 -0
  245. package/docs/assets/site.css +748 -0
  246. package/docs/assets/site.js +72 -0
  247. package/docs/assets/summarize-cli.png +0 -0
  248. package/docs/assets/summarize-extension.png +0 -0
  249. package/docs/assets/youtube-slides.png +0 -0
  250. package/docs/cache.md +29 -3
  251. package/docs/chrome-extension.md +85 -7
  252. package/docs/config.md +74 -2
  253. package/docs/extract-only.md +10 -2
  254. package/docs/index.html +205 -0
  255. package/docs/index.md +25 -0
  256. package/docs/language.md +1 -1
  257. package/docs/llm.md +17 -1
  258. package/docs/manual-tests.md +2 -0
  259. package/docs/media.md +37 -0
  260. package/docs/model-auto.md +2 -1
  261. package/docs/nvidia-onnx-transcription.md +55 -0
  262. package/docs/openai.md +5 -0
  263. package/docs/releasing.md +26 -0
  264. package/docs/site/assets/site.css +399 -228
  265. package/docs/site/assets/summarize-cli.png +0 -0
  266. package/docs/site/assets/summarize-extension.png +0 -0
  267. package/docs/site/docs/chrome-extension.html +89 -0
  268. package/docs/site/docs/config.html +1 -0
  269. package/docs/site/docs/extract-only.html +1 -0
  270. package/docs/site/docs/firecrawl.html +1 -0
  271. package/docs/site/docs/index.html +5 -0
  272. package/docs/site/docs/llm.html +1 -0
  273. package/docs/site/docs/openai.html +1 -0
  274. package/docs/site/docs/website.html +1 -0
  275. package/docs/site/docs/youtube.html +1 -0
  276. package/docs/site/index.html +148 -84
  277. package/docs/slides.md +74 -0
  278. package/docs/timestamps.md +103 -0
  279. package/docs/website.md +13 -0
  280. package/docs/youtube.md +16 -0
  281. package/package.json +22 -18
  282. package/dist/esm/daemon/request-settings.js +0 -91
  283. package/dist/esm/daemon/request-settings.js.map +0 -1
  284. package/dist/types/daemon/request-settings.d.ts +0 -27
@@ -1,10 +1,12 @@
1
1
  import type { LinkPreviewProgressEvent } from '@steipete/summarize-core/content';
2
2
  import type { OscProgressController } from '../osc-progress.js';
3
- export declare function createTranscriptProgressRenderer({ spinner, oscProgress, }: {
3
+ import type { ThemeRenderer } from '../theme.js';
4
+ export declare function createTranscriptProgressRenderer({ spinner, oscProgress, theme, }: {
4
5
  spinner: {
5
6
  setText: (text: string) => void;
6
7
  };
7
8
  oscProgress?: OscProgressController | null;
9
+ theme?: ThemeRenderer | null;
8
10
  }): {
9
11
  stop: () => void;
10
12
  onProgress: (event: LinkPreviewProgressEvent) => void;
@@ -1,7 +1,9 @@
1
- export declare function startSpinner({ text, enabled, stream, }: {
1
+ import { type Options as OraOptions } from 'ora';
2
+ export declare function startSpinner({ text, enabled, stream, color, }: {
2
3
  text: string;
3
4
  enabled: boolean;
4
5
  stream: NodeJS.WritableStream;
6
+ color?: OraOptions['color'];
5
7
  }): {
6
8
  stop: () => void;
7
9
  clear: () => void;
@@ -0,0 +1,44 @@
1
+ export declare const CLI_THEME_NAMES: readonly ["aurora", "ember", "moss", "mono"];
2
+ export type CliThemeName = (typeof CLI_THEME_NAMES)[number];
3
+ export type ThemeRole = 'heading' | 'accent' | 'accentStrong' | 'muted' | 'dim' | 'success' | 'warning' | 'error' | 'label' | 'value' | 'code';
4
+ type ThemePalette = {
5
+ name: CliThemeName;
6
+ roles: Record<ThemeRole, string>;
7
+ spinner: 'cyan' | 'magenta' | 'yellow' | 'green' | 'gray' | 'blue';
8
+ };
9
+ export declare const DEFAULT_CLI_THEME: CliThemeName;
10
+ export declare function listCliThemes(): CliThemeName[];
11
+ export declare function isCliThemeName(value: string): value is CliThemeName;
12
+ export declare function parseCliThemeName(raw: unknown, label: string): CliThemeName | null;
13
+ export declare function resolveThemeNameFromSources({ cli, env, config, fallback, }: {
14
+ cli?: unknown;
15
+ env?: unknown;
16
+ config?: unknown;
17
+ fallback?: CliThemeName;
18
+ }): CliThemeName;
19
+ export declare function resolveTrueColor(env: Record<string, string | undefined>): boolean;
20
+ type ThemeRendererOptions = {
21
+ themeName: CliThemeName;
22
+ enabled: boolean;
23
+ trueColor: boolean;
24
+ };
25
+ export type ThemeRenderer = {
26
+ name: CliThemeName;
27
+ enabled: boolean;
28
+ trueColor: boolean;
29
+ palette: ThemePalette;
30
+ heading: (text: string) => string;
31
+ accent: (text: string) => string;
32
+ accentStrong: (text: string) => string;
33
+ label: (text: string) => string;
34
+ value: (text: string) => string;
35
+ muted: (text: string) => string;
36
+ dim: (text: string) => string;
37
+ success: (text: string) => string;
38
+ warning: (text: string) => string;
39
+ error: (text: string) => string;
40
+ code: (text: string) => string;
41
+ };
42
+ export declare function createThemeRenderer({ themeName, enabled, trueColor, }: ThemeRendererOptions): ThemeRenderer;
43
+ export declare function resolveThemePalette(themeName: CliThemeName): ThemePalette;
44
+ export {};
@@ -1,11 +1,13 @@
1
1
  import type { LinkPreviewProgressEvent } from '@steipete/summarize-core/content';
2
2
  import type { OscProgressController } from './osc-progress.js';
3
- export declare function createWebsiteProgress({ enabled, spinner, oscProgress, }: {
3
+ import type { ThemeRenderer } from './theme.js';
4
+ export declare function createWebsiteProgress({ enabled, spinner, oscProgress, theme, }: {
4
5
  enabled: boolean;
5
6
  spinner: {
6
7
  setText: (text: string) => void;
7
8
  };
8
9
  oscProgress?: OscProgressController | null;
10
+ theme?: ThemeRenderer | null;
9
11
  }): {
10
12
  stop: () => void;
11
13
  onProgress: (event: LinkPreviewProgressEvent) => void;
@@ -1,4 +1,4 @@
1
- export declare const FALLBACK_VERSION = "0.8.2";
1
+ export declare const FALLBACK_VERSION = "0.10.0";
2
2
  export declare function resolvePackageVersion(importMetaUrl?: string): string;
3
3
  export declare function resolveGitSha(importMetaUrl?: string): string | null;
4
4
  export declare function formatVersionLine(importMetaUrl?: string): string;
package/docs/README.md CHANGED
@@ -4,17 +4,22 @@ summary: "Docs index for summarize behaviors and modes."
4
4
 
5
5
  # Docs
6
6
 
7
- - `docs/website.md` — normal websites (HTML extraction + Firecrawl fallback)
8
- - `docs/youtube.md` — YouTube transcript extraction (youtubei / captionTracks / Apify)
9
- - `docs/firecrawl.md` — Firecrawl mode + API key
10
- - `docs/llm.md` — LLM summarization + model config (Gateway/OpenAI)
7
+ - `docs/chrome-extension.md` — Chrome side panel extension + daemon setup/troubleshooting
8
+ - `docs/cache.md` — cache design + config (SQLite)
11
9
  - `docs/cli.md` — CLI models (Claude/Codex/Gemini)
12
- - `docs/model-auto.md` — automatic model selection (`--model auto`)
10
+ - `docs/config.md` — config file location, precedence, and schema
11
+ - `docs/extract-only.md` — extract mode (no summary LLM call)
12
+ - `docs/firecrawl.md` — Firecrawl mode + API key
13
13
  - `docs/language.md` — output language (`--language` / config `language`)
14
- - `docs/cache.md` — cache design + config (SQLite)
14
+ - `docs/llm.md` — LLM summarization + model config (Gateway/OpenAI)
15
15
  - `docs/manual-tests.md` — manual end-to-end test checklist
16
- - `docs/extract-only.md` — extract mode (no summary LLM call)
16
+ - `docs/model-auto.md` — automatic model selection (`--model auto`)
17
+ - `docs/openai.md` — OpenAI model usage + flags
18
+ - `docs/releasing.md` — release checklist + Homebrew tap update
19
+ - `docs/smoketest.md` — 20-case smoke test plan
20
+ - `docs/website.md` — normal websites (HTML extraction + Firecrawl fallback)
21
+ - `docs/youtube.md` — YouTube transcript extraction (youtubei / captionTracks / Apify)
17
22
 
18
23
  ## Website
19
24
 
20
- - Static site source: `docs/site/` (GitHub Pages via Actions)
25
+ - Jekyll site source: `docs/` (Markdown → HTML via GitHub Pages Actions)
@@ -0,0 +1,26 @@
1
+ title: "summarize"
2
+ description: "Summarize docs"
3
+ markdown: kramdown
4
+ highlighter: rouge
5
+
6
+ plugins:
7
+ - jekyll-relative-links
8
+
9
+ relative_links:
10
+ enabled: true
11
+ collections: true
12
+
13
+ exclude:
14
+ - site
15
+
16
+ defaults:
17
+ - scope:
18
+ path: ""
19
+ values:
20
+ layout: default
21
+ permalink: /docs/:basename:output_ext
22
+
23
+ kramdown:
24
+ input: GFM
25
+ hard_wrap: false
26
+ syntax_highlighter: rouge
@@ -0,0 +1,60 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width,initial-scale=1" />
6
+ <meta name="color-scheme" content="dark light" />
7
+ {% assign page_title = page.title | default: page.name | default: "Docs" | replace: ".md", "" | replace: "-", " " %}
8
+ <title>{{ page_title }} — summarize</title>
9
+ <meta name="description" content="{{ page.summary | default: site.description | escape }}" />
10
+ <link rel="canonical" href="https://summarize.sh{{ page.url | replace: 'index.html', '' }}" />
11
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
12
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
13
+ <link
14
+ href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap"
15
+ rel="stylesheet"
16
+ />
17
+ <link rel="stylesheet" href="/assets/site.css" />
18
+ </head>
19
+ <body>
20
+ <main class="shell">
21
+ <header class="top">
22
+ <a class="brand" href="/" aria-label="summarize home">
23
+ <span class="brand__mark" aria-hidden="true">s</span>
24
+ <span class="brand__word">summarize</span>
25
+ </a>
26
+ <nav class="nav" aria-label="Primary">
27
+ <a data-nav="home" href="/">Home</a>
28
+ <a data-nav="docs" href="/docs/index.html">Docs</a>
29
+ <a href="https://github.com/steipete/summarize">GitHub</a>
30
+ </nav>
31
+ </header>
32
+
33
+ <section class="docShell">
34
+ <aside class="side" aria-label="Docs navigation">
35
+ <h2>Docs</h2>
36
+ <a href="/docs/index.html">Overview</a>
37
+ <a href="/docs/chrome-extension.html">Chrome extension</a>
38
+ <a href="/docs/website.html">Website mode</a>
39
+ <a href="/docs/youtube.html">YouTube mode</a>
40
+ <a href="/docs/extract-only.html">Extract</a>
41
+ <a href="/docs/llm.html">LLM</a>
42
+ <a href="/docs/openai.html">OpenAI</a>
43
+ <a href="/docs/firecrawl.html">Firecrawl</a>
44
+ <a href="/docs/config.html">Config</a>
45
+ </aside>
46
+
47
+ <article class="doc reveal">
48
+ {{ content }}
49
+ </article>
50
+ </section>
51
+
52
+ <footer class="footer">
53
+ <span>summarize — Link → clean text → summary.</span>
54
+ <span><a href="/docs/index.html">Docs</a> · <a href="https://github.com/steipete/summarize">Repo</a></span>
55
+ </footer>
56
+ </main>
57
+
58
+ <script type="module" src="/assets/site.js"></script>
59
+ </body>
60
+ </html>
package/docs/agent.md ADDED
@@ -0,0 +1,333 @@
1
+ ---
2
+ summary: "Automation agent for the Chrome side panel (daemon-backed)."
3
+ read_when:
4
+ - "When working on automation tools, /v1/agent, or the side panel agent loop."
5
+ ---
6
+
7
+ # Automation Agent (Side Panel + Daemon)
8
+
9
+ Summarize can run as a **website automation agent** inside the Chrome side panel. This is **optional** and **gated by a checkbox** in Options.
10
+
11
+ Scope:
12
+ - **Off (default):** chat is Q&A only (no tools).
13
+ - **On:** chat runs a tool-capable agent for web automation.
14
+
15
+ Explicit exclusions (per product direction): **no update checker**, **no tutorial/welcome flow**, **no proxy config**, **no API key dialog**. All model calls go through the **local daemon**.
16
+
17
+ ## Architecture (High Level)
18
+
19
+ 1) **Side panel** maintains the agent loop + chat UI.
20
+ 2) **Background** handles tab data, extraction, and tool execution.
21
+ 3) **Content scripts** handle element picking and native-input bridge.
22
+ 4) **Daemon** provides `/v1/agent` (SSE stream of chunks + final assistant message).
23
+
24
+ ### Data Flow (Agent Loop)
25
+
26
+ - User sends a message in the side panel.
27
+ - Panel compacts history and sends `panel:agent` to background with:
28
+ - `messages` (pi-ai Message[])
29
+ - `tools` (names)
30
+ - `summary` (optional current summary markdown)
31
+ - Background builds `pageContent` using the latest extract (summary + transcript/text + metadata).
32
+ - Background calls daemon `POST /v1/agent` (SSE).
33
+ - Daemon streams `chunk` events, then an `assistant` event (may include tool calls).
34
+ - Panel executes tool calls locally, appends `toolResult` messages, and repeats `/v1/agent` until no tool calls remain.
35
+
36
+ The daemon **never** executes tools. It only returns the next assistant message.
37
+
38
+ ## Settings + Permissions
39
+
40
+ ### Settings
41
+
42
+ `automationEnabled` (boolean) lives in `apps/chrome-extension/src/lib/settings.ts`.
43
+
44
+ - Options UI provides the toggle.
45
+ - When disabled, the tool list is empty and the daemon uses the **chat-only** prompt.
46
+
47
+ ### Optional Permissions
48
+
49
+ Defined in `apps/chrome-extension/wxt.config.ts` and requested via Options:
50
+
51
+ - `debugger` – required for **native input** and the **debugger** tool.
52
+ - `userScripts` – reserved for main-world script execution (not required for current REPL path).
53
+
54
+ #### Chrome: enable User Scripts (if needed)
55
+
56
+ 1. `chrome://extensions`
57
+ 2. Open extension details
58
+ 3. Enable **Allow User Scripts**
59
+ 4. Reload the tab
60
+
61
+ ## Daemon Endpoint
62
+
63
+ ### `POST /v1/agent` (SSE)
64
+
65
+ **Headers**
66
+ - `Authorization: Bearer <token>`
67
+ - `Content-Type: application/json`
68
+
69
+ **Body**
70
+ ```
71
+ {
72
+ "url": "https://...",
73
+ "title": "Page title",
74
+ "pageContent": "<summary + transcript + metadata>",
75
+ "cacheContent": "<transcript/text used for cache key>",
76
+ "messages": [/* pi-ai Message[] */],
77
+ "model": "auto" | "openai/..." | "anthropic/..." | ...,
78
+ "length": "short" | "xl" | "20k" | ...,
79
+ "language": "auto" | "en" | "de" | ...,
80
+ "tools": ["navigate", "repl", "ask_user_which_element", "skill", "debugger"],
81
+ "automationEnabled": true
82
+ }
83
+ ```
84
+
85
+ **Response (SSE, default)**
86
+ ```
87
+ event: chunk
88
+ data: { "text": "..." }
89
+
90
+ event: assistant
91
+ data: { /* AssistantMessage */ }
92
+
93
+ event: done
94
+ data: {}
95
+
96
+ event: error
97
+ data: { "message": "..." }
98
+ ```
99
+
100
+ **Response (JSON)**
101
+ Use `Accept: application/json` or `?format=json`.
102
+ ```
103
+ { "ok": true, "assistant": { /* AssistantMessage */ } }
104
+ ```
105
+
106
+ ### `POST /v1/agent/history`
107
+
108
+ Returns cached chat history for the same cache key as `/v1/agent`.
109
+
110
+ **Body**
111
+ ```
112
+ {
113
+ "url": "https://...",
114
+ "pageContent": "<summary + transcript + metadata>",
115
+ "cacheContent": "<transcript/text used for cache key>",
116
+ "model": "auto" | "openai/..." | "anthropic/..." | ...,
117
+ "length": "short" | "xl" | "20k" | ...,
118
+ "language": "auto" | "en" | "de" | ...,
119
+ "automationEnabled": true
120
+ }
121
+ ```
122
+
123
+ **Response**
124
+ ```
125
+ { "ok": true, "messages": [/* Message[] */] }
126
+ ```
127
+
128
+ ### Model Resolution (Daemon)
129
+
130
+ - **Fixed model** (explicit `model`): parsed as `<provider>/<model>`. Provider base URL overrides come from config/env (OpenAI, Anthropic, Google, xAI, ZAI). OpenRouter uses OpenAI-compatible completions.
131
+ - **Auto model**: uses existing auto-selection logic (`buildAutoModelAttempts`), skipping CLI transports.
132
+ - **Synthetic models**: created for OpenAI-compatible base URLs (local/openrouter).
133
+ - `maxOutputTokens` defaults to 2048 or `maxOutputTokens` override.
134
+ - CLI models are **not** supported in the daemon.
135
+
136
+ ## Page Content Payload
137
+
138
+ `pageContent` is built from the latest extract and includes:
139
+
140
+ - **Summary** (optional): current summary markdown (truncated to settings cap).
141
+ - **Transcript/text**: timed transcript when available, otherwise extracted text.
142
+ - **Metadata**: URL/title, source (`page` vs `url`), extraction strategy, markdown provider, Firecrawl usage, transcript provider + cache status, media duration, word counts, truncation flags.
143
+
144
+ See `buildChatPageContent()` usage in `apps/chrome-extension/src/entrypoints/background.ts`.
145
+
146
+ ## Tools
147
+
148
+ ### 1) `navigate`
149
+ Navigate the active tab.
150
+
151
+ Params:
152
+ ```
153
+ { "url": "https://...", "newTab": false }
154
+ ```
155
+
156
+ Result:
157
+ ```
158
+ { "finalUrl": "https://...", "title": "...", "tabId": 123 }
159
+ ```
160
+
161
+ Notes:
162
+ - Uses `chrome.tabs.update` or `chrome.tabs.create`.
163
+ - Waits for tab status `complete` (15s timeout).
164
+
165
+ ### 2) `repl`
166
+ Execute JavaScript in a sandbox, with `browserjs()` to run in the page context.
167
+
168
+ Params:
169
+ ```
170
+ { "title": "...", "code": "..." }
171
+ ```
172
+
173
+ Result:
174
+ ```
175
+ { "output": "console/return output", "files": [{ "fileName": "...", "mimeType": "...", "contentBase64": "..." }] }
176
+ ```
177
+
178
+ REPL environment:
179
+ - Runs in a **sandboxed iframe** (no DOM access to the panel).
180
+ - `browserjs(fn, ...args)` runs the function **in the page context**.
181
+ - Uses `chrome.userScripts.execute` (main world) when available.
182
+ - Falls back to `chrome.scripting.executeScript` (isolated world).
183
+ - `navigate({ url })` available inside the REPL (always use for navigation).
184
+ - `sleep(ms)` helper.
185
+ - Console output is captured and returned; return values are appended as `=> value`.
186
+ - `returnFile(name, content, mimeType)` or `returnFile({ fileName, content, mimeType })` attaches files to the tool result.
187
+
188
+ Safety:
189
+ - Navigation inside REPL code (`window.location`, `history`, etc.) is rejected. Use `navigate()` instead.
190
+
191
+ Page-context helpers (via `browserjs()`):
192
+ - Skills libraries are auto-injected when domain patterns match the active URL.
193
+ - If `debugger` permission is granted, native helpers are exposed:
194
+ - `nativeClick(selector)`
195
+ - `nativeType(selector, text)`
196
+ - `nativePress(key)`
197
+ - `nativeKeyDown(key)` / `nativeKeyUp(key)`
198
+
199
+ ### 3) `ask_user_which_element`
200
+ Shows a click-to-select overlay and returns element metadata.
201
+
202
+ Params:
203
+ ```
204
+ { "message": "Optional guidance" }
205
+ ```
206
+
207
+ Result (example):
208
+ ```
209
+ {
210
+ "selector": "#submit",
211
+ "xpath": "//button[1]",
212
+ "text": "Send",
213
+ "tagName": "button",
214
+ "attributes": { "type": "submit" },
215
+ "html": "<button ...>",
216
+ "boundingBox": { "x": 20, "y": 120, "width": 180, "height": 40 }
217
+ }
218
+ ```
219
+
220
+ Overlay UX:
221
+ - Hover highlights element under cursor.
222
+ - Click selects.
223
+ - ↑ / ↓ moves up or down the DOM tree.
224
+ - Esc cancels.
225
+
226
+ ### 4) `skill`
227
+ CRUD for domain-specific libraries (stored in `chrome.storage.local`).
228
+
229
+ Storage keys:
230
+ - `automation.skills` (map of name → skill)
231
+ - `automation.skillsSeeded` (one-time default seed)
232
+
233
+ Actions:
234
+ - `list` (optionally filtered by URL)
235
+ - `get` (optionally includes library code)
236
+ - `create` / `rewrite`
237
+ - `update` (string replacement)
238
+ - `delete`
239
+
240
+ Default skills seed from `apps/chrome-extension/src/automation/default-skills.json`.
241
+
242
+ Matching:
243
+ - Glob-like domain patterns (supports `*` and `**`).
244
+ - Match is done against hostname + path (e.g. `github.com/*/issues`).
245
+
246
+ Notes:
247
+ - `update` is intended for in-place string replacements; use `rewrite` to rename.
248
+ - Skills libraries run inside `browserjs()` and must avoid navigation.
249
+
250
+ ### 5) `debugger` (optional)
251
+ Runs JavaScript in the **main world** via the Chrome debugger. **Last resort** (shows Chrome debug banner).
252
+
253
+ Params:
254
+ ```
255
+ { "action": "eval", "code": "..." }
256
+ ```
257
+
258
+ Result:
259
+ ```
260
+ { "text": "...", "details": { ... } }
261
+ ```
262
+
263
+ ### 6) `summarize`
264
+ Run the Summarize pipeline against a URL (summary or extract-only).
265
+
266
+ Params:
267
+ ```
268
+ {
269
+ "url": "https://...",
270
+ "extractOnly": false,
271
+ "format": "text",
272
+ "markdownMode": "readability",
273
+ "model": "openai/gpt-5-mini",
274
+ "length": "short",
275
+ "language": "auto",
276
+ "prompt": "Optional override",
277
+ "timeout": "2m",
278
+ "maxOutputTokens": "2k",
279
+ "noCache": false,
280
+ "firecrawl": "auto",
281
+ "preprocess": "auto",
282
+ "youtube": "auto",
283
+ "videoMode": "auto",
284
+ "timestamps": false,
285
+ "maxCharacters": 120000
286
+ }
287
+ ```
288
+
289
+ Result (summary):
290
+ ```
291
+ { "output": "..." }
292
+ ```
293
+
294
+ Result (extract-only):
295
+ ```
296
+ { "output": "...", "details": { "content": "...", "title": "...", "wordCount": 123, ... } }
297
+ ```
298
+
299
+ Notes:
300
+ - URL-only (uses daemon URL pipeline).
301
+ - Use `extractOnly: true` + `format: "markdown"` to return extracted Markdown.
302
+ - When `format: "markdown"`, `markdownMode` defaults to `readability`.
303
+
304
+ ## Native Input Bridge (Debugger Permission)
305
+
306
+ Native input events use the Chrome debugger protocol:
307
+
308
+ - `browserjs()` posts a message to the content script.
309
+ - Content script forwards to background (`automation:native-input`).
310
+ - Background attaches debugger and dispatches:
311
+ - `Input.dispatchMouseEvent` (click)
312
+ - `Input.insertText` (type)
313
+ - `Input.dispatchKeyEvent` (press/keydown/keyup)
314
+
315
+ If permission is missing, the call fails and the tool reports the error.
316
+
317
+ ## UX Notes
318
+
319
+ - Automation is opt-in via Options checkbox.
320
+ - Regular summarize flows remain unchanged.
321
+ - Tool results are treated as **data**, not instructions. The system prompt still asks the assistant to repeat important tool-derived info in plain text.
322
+ - Tool results are currently rendered in the chat UI for debugging; they may be hidden in the future.
323
+ - When the active tab URL changes during a conversation, the panel appends a **navigation tool result** with the new URL, title, and matching skills. This keeps the agent aware of user-driven navigation.
324
+ - REPL executions that call `browserjs()` show a small overlay with an **Abort** action; aborting stops the current agent loop (best-effort).
325
+
326
+ ## Where Things Live
327
+
328
+ - **Daemon**: `src/daemon/server.ts`, `src/daemon/agent.ts`
329
+ - **Automation tools**: `apps/chrome-extension/src/automation/`
330
+ - **Element picker + native input bridge**: `apps/chrome-extension/src/entrypoints/automation.content.ts`
331
+ - **Background agent proxy**: `apps/chrome-extension/src/entrypoints/background.ts`
332
+ - **Side panel agent loop**: `apps/chrome-extension/src/entrypoints/sidepanel/`
333
+ - **Options toggle**: `apps/chrome-extension/src/entrypoints/options/`