@steipete/summarize 0.9.0 → 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 (203) hide show
  1. package/CHANGELOG.md +75 -0
  2. package/LICENSE +1 -1
  3. package/README.md +307 -184
  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 +127 -1
  8. package/dist/esm/config.js.map +1 -1
  9. package/dist/esm/daemon/agent.js +547 -0
  10. package/dist/esm/daemon/agent.js.map +1 -0
  11. package/dist/esm/daemon/chat.js +83 -175
  12. package/dist/esm/daemon/chat.js.map +1 -1
  13. package/dist/esm/daemon/cli.js +35 -3
  14. package/dist/esm/daemon/cli.js.map +1 -1
  15. package/dist/esm/daemon/env-snapshot.js +3 -0
  16. package/dist/esm/daemon/env-snapshot.js.map +1 -1
  17. package/dist/esm/daemon/flow-context.js +31 -8
  18. package/dist/esm/daemon/flow-context.js.map +1 -1
  19. package/dist/esm/daemon/launchd.js +27 -0
  20. package/dist/esm/daemon/launchd.js.map +1 -1
  21. package/dist/esm/daemon/process-registry.js +206 -0
  22. package/dist/esm/daemon/process-registry.js.map +1 -0
  23. package/dist/esm/daemon/schtasks.js +64 -0
  24. package/dist/esm/daemon/schtasks.js.map +1 -1
  25. package/dist/esm/daemon/server.js +712 -42
  26. package/dist/esm/daemon/server.js.map +1 -1
  27. package/dist/esm/daemon/summarize.js +33 -4
  28. package/dist/esm/daemon/summarize.js.map +1 -1
  29. package/dist/esm/daemon/systemd.js +61 -0
  30. package/dist/esm/daemon/systemd.js.map +1 -1
  31. package/dist/esm/flags.js +24 -0
  32. package/dist/esm/flags.js.map +1 -1
  33. package/dist/esm/llm/providers/openai.js +1 -1
  34. package/dist/esm/llm/providers/openai.js.map +1 -1
  35. package/dist/esm/media-cache.js +251 -0
  36. package/dist/esm/media-cache.js.map +1 -0
  37. package/dist/esm/processes.js +2 -0
  38. package/dist/esm/processes.js.map +1 -0
  39. package/dist/esm/run/bird.js +118 -5
  40. package/dist/esm/run/bird.js.map +1 -1
  41. package/dist/esm/run/cli-preflight.js +19 -1
  42. package/dist/esm/run/cli-preflight.js.map +1 -1
  43. package/dist/esm/run/finish-line.js +11 -4
  44. package/dist/esm/run/finish-line.js.map +1 -1
  45. package/dist/esm/run/flows/asset/extract.js +70 -0
  46. package/dist/esm/run/flows/asset/extract.js.map +1 -0
  47. package/dist/esm/run/flows/asset/input.js +208 -24
  48. package/dist/esm/run/flows/asset/input.js.map +1 -1
  49. package/dist/esm/run/flows/asset/media-policy.js +3 -0
  50. package/dist/esm/run/flows/asset/media-policy.js.map +1 -0
  51. package/dist/esm/run/flows/asset/media.js +224 -0
  52. package/dist/esm/run/flows/asset/media.js.map +1 -0
  53. package/dist/esm/run/flows/asset/output.js +98 -0
  54. package/dist/esm/run/flows/asset/output.js.map +1 -0
  55. package/dist/esm/run/flows/asset/summary.js +157 -7
  56. package/dist/esm/run/flows/asset/summary.js.map +1 -1
  57. package/dist/esm/run/flows/url/extract.js +6 -6
  58. package/dist/esm/run/flows/url/extract.js.map +1 -1
  59. package/dist/esm/run/flows/url/flow.js +336 -36
  60. package/dist/esm/run/flows/url/flow.js.map +1 -1
  61. package/dist/esm/run/flows/url/markdown.js +6 -1
  62. package/dist/esm/run/flows/url/markdown.js.map +1 -1
  63. package/dist/esm/run/flows/url/slides-output.js +485 -0
  64. package/dist/esm/run/flows/url/slides-output.js.map +1 -0
  65. package/dist/esm/run/flows/url/slides-text.js +628 -0
  66. package/dist/esm/run/flows/url/slides-text.js.map +1 -0
  67. package/dist/esm/run/flows/url/summary.js +356 -82
  68. package/dist/esm/run/flows/url/summary.js.map +1 -1
  69. package/dist/esm/run/help.js +94 -5
  70. package/dist/esm/run/help.js.map +1 -1
  71. package/dist/esm/run/logging.js +12 -4
  72. package/dist/esm/run/logging.js.map +1 -1
  73. package/dist/esm/run/media-cache-state.js +33 -0
  74. package/dist/esm/run/media-cache-state.js.map +1 -0
  75. package/dist/esm/run/progress.js +19 -1
  76. package/dist/esm/run/progress.js.map +1 -1
  77. package/dist/esm/run/run-settings.js +39 -1
  78. package/dist/esm/run/run-settings.js.map +1 -1
  79. package/dist/esm/run/runner.js +196 -8
  80. package/dist/esm/run/runner.js.map +1 -1
  81. package/dist/esm/run/slides-cli.js +225 -0
  82. package/dist/esm/run/slides-cli.js.map +1 -0
  83. package/dist/esm/run/slides-render.js +163 -0
  84. package/dist/esm/run/slides-render.js.map +1 -0
  85. package/dist/esm/run/stream-output.js +10 -3
  86. package/dist/esm/run/stream-output.js.map +1 -1
  87. package/dist/esm/run/summary-engine.js +33 -7
  88. package/dist/esm/run/summary-engine.js.map +1 -1
  89. package/dist/esm/run/transcriber-cli.js +148 -0
  90. package/dist/esm/run/transcriber-cli.js.map +1 -0
  91. package/dist/esm/shared/sse-events.js +4 -0
  92. package/dist/esm/shared/sse-events.js.map +1 -1
  93. package/dist/esm/slides/extract.js +1942 -0
  94. package/dist/esm/slides/extract.js.map +1 -0
  95. package/dist/esm/slides/index.js +4 -0
  96. package/dist/esm/slides/index.js.map +1 -0
  97. package/dist/esm/slides/settings.js +73 -0
  98. package/dist/esm/slides/settings.js.map +1 -0
  99. package/dist/esm/slides/store.js +111 -0
  100. package/dist/esm/slides/store.js.map +1 -0
  101. package/dist/esm/slides/types.js +2 -0
  102. package/dist/esm/slides/types.js.map +1 -0
  103. package/dist/esm/tty/osc-progress.js +21 -1
  104. package/dist/esm/tty/osc-progress.js.map +1 -1
  105. package/dist/esm/tty/progress/fetch-html.js +8 -4
  106. package/dist/esm/tty/progress/fetch-html.js.map +1 -1
  107. package/dist/esm/tty/progress/transcript.js +82 -31
  108. package/dist/esm/tty/progress/transcript.js.map +1 -1
  109. package/dist/esm/tty/spinner.js +2 -2
  110. package/dist/esm/tty/spinner.js.map +1 -1
  111. package/dist/esm/tty/theme.js +189 -0
  112. package/dist/esm/tty/theme.js.map +1 -0
  113. package/dist/esm/tty/website-progress.js +17 -13
  114. package/dist/esm/tty/website-progress.js.map +1 -1
  115. package/dist/esm/version.js +1 -1
  116. package/dist/esm/version.js.map +1 -1
  117. package/dist/types/cache.d.ts +14 -2
  118. package/dist/types/config.d.ts +23 -0
  119. package/dist/types/daemon/agent.d.ts +25 -0
  120. package/dist/types/daemon/chat.d.ts +10 -18
  121. package/dist/types/daemon/env-snapshot.d.ts +1 -1
  122. package/dist/types/daemon/flow-context.d.ts +21 -1
  123. package/dist/types/daemon/launchd.d.ts +4 -0
  124. package/dist/types/daemon/process-registry.d.ts +73 -0
  125. package/dist/types/daemon/schtasks.d.ts +4 -0
  126. package/dist/types/daemon/summarize.d.ts +36 -5
  127. package/dist/types/daemon/systemd.d.ts +4 -0
  128. package/dist/types/flags.d.ts +1 -0
  129. package/dist/types/media-cache.d.ts +22 -0
  130. package/dist/types/processes.d.ts +1 -0
  131. package/dist/types/run/bird.d.ts +7 -0
  132. package/dist/types/run/finish-line.d.ts +2 -1
  133. package/dist/types/run/flows/asset/extract.d.ts +18 -0
  134. package/dist/types/run/flows/asset/input.d.ts +12 -2
  135. package/dist/types/run/flows/asset/media-policy.d.ts +2 -0
  136. package/dist/types/run/flows/asset/media.d.ts +21 -0
  137. package/dist/types/run/flows/asset/output.d.ts +42 -0
  138. package/dist/types/run/flows/asset/summary.d.ts +6 -0
  139. package/dist/types/run/flows/url/extract.d.ts +2 -1
  140. package/dist/types/run/flows/url/slides-output.d.ts +66 -0
  141. package/dist/types/run/flows/url/slides-text.d.ts +87 -0
  142. package/dist/types/run/flows/url/summary.d.ts +11 -3
  143. package/dist/types/run/flows/url/types.d.ts +29 -2
  144. package/dist/types/run/help.d.ts +3 -0
  145. package/dist/types/run/logging.d.ts +3 -2
  146. package/dist/types/run/media-cache-state.d.ts +7 -0
  147. package/dist/types/run/progress.d.ts +2 -1
  148. package/dist/types/run/run-settings.d.ts +7 -1
  149. package/dist/types/run/slides-cli.d.ts +9 -0
  150. package/dist/types/run/slides-render.d.ts +30 -0
  151. package/dist/types/run/stream-output.d.ts +2 -1
  152. package/dist/types/run/summary-engine.d.ts +11 -1
  153. package/dist/types/run/transcriber-cli.d.ts +8 -0
  154. package/dist/types/shared/sse-events.d.ts +20 -0
  155. package/dist/types/slides/extract.d.ts +42 -0
  156. package/dist/types/slides/index.d.ts +5 -0
  157. package/dist/types/slides/settings.d.ts +20 -0
  158. package/dist/types/slides/store.d.ts +15 -0
  159. package/dist/types/slides/types.d.ts +40 -0
  160. package/dist/types/tty/osc-progress.d.ts +2 -2
  161. package/dist/types/tty/progress/fetch-html.d.ts +3 -1
  162. package/dist/types/tty/progress/transcript.d.ts +3 -1
  163. package/dist/types/tty/spinner.d.ts +3 -1
  164. package/dist/types/tty/theme.d.ts +44 -0
  165. package/dist/types/tty/website-progress.d.ts +3 -1
  166. package/dist/types/version.d.ts +1 -1
  167. package/docs/README.md +1 -1
  168. package/docs/_config.yml +26 -0
  169. package/docs/_layouts/default.html +60 -0
  170. package/docs/agent.md +333 -0
  171. package/docs/assets/site.css +748 -0
  172. package/docs/assets/site.js +72 -0
  173. package/docs/assets/summarize-cli.png +0 -0
  174. package/docs/assets/summarize-extension.png +0 -0
  175. package/docs/assets/youtube-slides.png +0 -0
  176. package/docs/cache.md +29 -3
  177. package/docs/chrome-extension.md +61 -11
  178. package/docs/config.md +50 -2
  179. package/docs/extract-only.md +8 -0
  180. package/docs/index.html +205 -0
  181. package/docs/index.md +25 -0
  182. package/docs/llm.md +11 -1
  183. package/docs/manual-tests.md +2 -0
  184. package/docs/media.md +3 -0
  185. package/docs/nvidia-onnx-transcription.md +55 -0
  186. package/docs/site/assets/site.css +399 -228
  187. package/docs/site/assets/summarize-cli.png +0 -0
  188. package/docs/site/assets/summarize-extension.png +0 -0
  189. package/docs/site/docs/chrome-extension.html +89 -0
  190. package/docs/site/docs/config.html +1 -0
  191. package/docs/site/docs/extract-only.html +1 -0
  192. package/docs/site/docs/firecrawl.html +1 -0
  193. package/docs/site/docs/index.html +5 -0
  194. package/docs/site/docs/llm.html +1 -0
  195. package/docs/site/docs/openai.html +1 -0
  196. package/docs/site/docs/website.html +1 -0
  197. package/docs/site/docs/youtube.html +1 -0
  198. package/docs/site/index.html +148 -84
  199. package/docs/slides.md +74 -0
  200. package/docs/timestamps.md +103 -0
  201. package/docs/website.md +12 -0
  202. package/docs/youtube.md +16 -0
  203. package/package.json +16 -15
@@ -0,0 +1,225 @@
1
+ import { CommanderError } from 'commander';
2
+ import { loadSummarizeConfig } from '../config.js';
3
+ import { parseDurationMs } from '../flags.js';
4
+ import { extractSlidesForSource, resolveSlideSettings, resolveSlideSourceFromUrl, } from '../slides/index.js';
5
+ import { createOscProgressController } from '../tty/osc-progress.js';
6
+ import { startSpinner } from '../tty/spinner.js';
7
+ import { createThemeRenderer, resolveThemeNameFromSources, resolveTrueColor } from '../tty/theme.js';
8
+ import { formatVersionLine } from '../version.js';
9
+ import { applyHelpStyle, buildSlidesProgram } from './help.js';
10
+ import { writeVerbose } from './logging.js';
11
+ import { createMediaCacheFromConfig } from './media-cache-state.js';
12
+ import { resolveEnvState } from './run-env.js';
13
+ import { renderSlidesInline } from './slides-render.js';
14
+ import { isRichTty, supportsColor } from './terminal.js';
15
+ function formatTimestamp(seconds) {
16
+ const clamped = Math.max(0, Math.floor(seconds));
17
+ const hours = Math.floor(clamped / 3600);
18
+ const minutes = Math.floor((clamped % 3600) / 60);
19
+ const secs = clamped % 60;
20
+ const mm = String(minutes).padStart(2, '0');
21
+ const ss = String(secs).padStart(2, '0');
22
+ if (hours <= 0)
23
+ return `${minutes}:${ss}`;
24
+ const hh = String(hours).padStart(2, '0');
25
+ return `${hh}:${mm}:${ss}`;
26
+ }
27
+ function parseRenderMode(raw) {
28
+ const value = typeof raw === 'string' ? raw.trim().toLowerCase() : '';
29
+ if (!value || value === 'none')
30
+ return 'none';
31
+ if (value === 'auto' || value === 'kitty' || value === 'iterm')
32
+ return value;
33
+ throw new Error(`Unsupported --render: ${String(raw)}`);
34
+ }
35
+ export async function handleSlidesCliRequest({ normalizedArgv, envForRun, stdout, stderr, }) {
36
+ if (normalizedArgv[0]?.toLowerCase() !== 'slides')
37
+ return false;
38
+ const program = buildSlidesProgram();
39
+ program.configureOutput({
40
+ writeOut(str) {
41
+ stdout.write(str);
42
+ },
43
+ writeErr(str) {
44
+ stderr.write(str);
45
+ },
46
+ });
47
+ applyHelpStyle(program, envForRun, stdout);
48
+ program.exitOverride();
49
+ try {
50
+ program.parse(normalizedArgv.slice(1), { from: 'user' });
51
+ }
52
+ catch (error) {
53
+ if (error instanceof CommanderError && error.code === 'commander.helpDisplayed') {
54
+ return true;
55
+ }
56
+ throw error;
57
+ }
58
+ if (program.opts().version) {
59
+ stdout.write(`${formatVersionLine()}\n`);
60
+ return true;
61
+ }
62
+ const url = program.args[0];
63
+ if (!url) {
64
+ throw new Error('summarize slides requires a URL input.');
65
+ }
66
+ const opts = program.opts();
67
+ const renderMode = parseRenderMode(opts.render);
68
+ if (opts.json && renderMode !== 'none') {
69
+ throw new Error('--render is not supported with --json output.');
70
+ }
71
+ const slidesSettings = resolveSlideSettings({
72
+ slides: true,
73
+ slidesOcr: opts.slidesOcr ?? false,
74
+ slidesDir: opts.output ?? opts.slidesDir,
75
+ slidesSceneThreshold: opts.slidesSceneThreshold,
76
+ slidesSceneThresholdExplicit: normalizedArgv.some((arg) => arg === '--slides-scene-threshold' || arg.startsWith('--slides-scene-threshold=')),
77
+ slidesMax: opts.slidesMax,
78
+ slidesMinDuration: opts.slidesMinDuration,
79
+ cwd: process.cwd(),
80
+ });
81
+ if (!slidesSettings) {
82
+ throw new Error('Slides are disabled (enable --slides-ocr or check arguments).');
83
+ }
84
+ const timeoutRaw = typeof opts.timeout === 'string' && opts.timeout.trim() ? opts.timeout : '2m';
85
+ const timeoutMs = parseDurationMs(timeoutRaw);
86
+ const { config } = loadSummarizeConfig({ env: envForRun });
87
+ const mediaCache = await createMediaCacheFromConfig({
88
+ envForRun,
89
+ config,
90
+ noMediaCacheFlag: false,
91
+ });
92
+ const themeName = resolveThemeNameFromSources({
93
+ cli: opts.theme,
94
+ env: envForRun.SUMMARIZE_THEME,
95
+ config: config?.ui?.theme,
96
+ });
97
+ envForRun.SUMMARIZE_THEME = themeName;
98
+ const envState = resolveEnvState({ env: envForRun, envForRun, configForCli: config });
99
+ const source = resolveSlideSourceFromUrl(url);
100
+ if (!source) {
101
+ throw new Error('Slides are only supported for YouTube or direct video URLs.');
102
+ }
103
+ const verboseEnabled = Boolean(opts.verbose || opts.debug);
104
+ const progressEnabled = isRichTty(stderr) && !opts.json && !verboseEnabled;
105
+ const theme = createThemeRenderer({
106
+ themeName,
107
+ enabled: progressEnabled,
108
+ trueColor: resolveTrueColor(envForRun),
109
+ });
110
+ const renderStatus = (label, detail = '…') => `${theme.label(label)}${theme.dim(detail)}`;
111
+ const renderStatusFromText = (text) => {
112
+ const match = text.match(/^([^:]+):(.*)$/);
113
+ if (!match)
114
+ return renderStatus(text);
115
+ const [, prefix, rest] = match;
116
+ return `${theme.label(prefix.trim())}${theme.dim(`:${rest}`)}`;
117
+ };
118
+ const oscProgress = progressEnabled
119
+ ? createOscProgressController({
120
+ label: 'Slides',
121
+ env: envForRun,
122
+ isTty: progressEnabled,
123
+ write: (data) => stderr.write(data),
124
+ })
125
+ : null;
126
+ const spinner = startSpinner({
127
+ text: renderStatus('Extracting slides'),
128
+ enabled: progressEnabled,
129
+ stream: stderr,
130
+ color: theme.palette.spinner,
131
+ });
132
+ const handleSignal = () => {
133
+ try {
134
+ spinner.stopAndClear();
135
+ }
136
+ catch {
137
+ // ignore
138
+ }
139
+ oscProgress?.clear();
140
+ };
141
+ const handleSigint = () => {
142
+ handleSignal();
143
+ process.exit(130);
144
+ };
145
+ const handleSigterm = () => {
146
+ handleSignal();
147
+ process.exit(143);
148
+ };
149
+ if (progressEnabled) {
150
+ process.once('SIGINT', handleSigint);
151
+ process.once('SIGTERM', handleSigterm);
152
+ }
153
+ const verboseColor = supportsColor(stderr, envForRun);
154
+ const logSlides = (message) => {
155
+ writeVerbose(stderr, verboseEnabled, `slides ${message}`, verboseColor, envForRun);
156
+ };
157
+ const onSlidesProgress = (text) => {
158
+ if (progressEnabled) {
159
+ spinner.setText(renderStatusFromText(text));
160
+ const match = text.match(/(\d{1,3})%/);
161
+ const percent = match ? Number(match[1]) : null;
162
+ if (Number.isFinite(percent) && percent !== null) {
163
+ oscProgress?.setPercent('Slides', Math.max(0, Math.min(100, percent)));
164
+ }
165
+ else {
166
+ oscProgress?.setIndeterminate('Slides');
167
+ }
168
+ return;
169
+ }
170
+ if (verboseEnabled) {
171
+ stderr.write(`${text}\n`);
172
+ }
173
+ };
174
+ let slidesExtracted;
175
+ try {
176
+ slidesExtracted = await extractSlidesForSource({
177
+ source,
178
+ settings: slidesSettings,
179
+ noCache: opts.cache === false,
180
+ mediaCache,
181
+ env: envForRun,
182
+ timeoutMs,
183
+ ytDlpPath: envState.ytDlpPath,
184
+ ffmpegPath: null,
185
+ tesseractPath: null,
186
+ hooks: {
187
+ onSlidesProgress,
188
+ onSlidesLog: logSlides,
189
+ },
190
+ });
191
+ }
192
+ finally {
193
+ spinner.stopAndClear();
194
+ oscProgress?.clear();
195
+ if (progressEnabled) {
196
+ process.off('SIGINT', handleSigint);
197
+ process.off('SIGTERM', handleSigterm);
198
+ }
199
+ }
200
+ if (opts.json) {
201
+ stdout.write(`${JSON.stringify({ ok: true, slides: slidesExtracted }, null, 2)}\n`);
202
+ return true;
203
+ }
204
+ const count = slidesExtracted.slides.length;
205
+ stdout.write(`Slides extracted: ${count}\n`);
206
+ stdout.write(`Slides dir: ${slidesExtracted.slidesDir}\n`);
207
+ if (renderMode !== 'none') {
208
+ if (!isRichTty(stdout)) {
209
+ throw new Error('--render requires a TTY stdout.');
210
+ }
211
+ await renderSlidesInline({
212
+ slides: slidesExtracted.slides,
213
+ mode: renderMode,
214
+ env: envForRun,
215
+ stdout,
216
+ labelForSlide: (slide) => `Slide ${slide.index} · ${formatTimestamp(slide.timestamp)} (${slide.imagePath})`,
217
+ });
218
+ return true;
219
+ }
220
+ for (const slide of slidesExtracted.slides) {
221
+ stdout.write(`${slide.index}\t${formatTimestamp(slide.timestamp)}\t${slide.imagePath}\n`);
222
+ }
223
+ return true;
224
+ }
225
+ //# sourceMappingURL=slides-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slides-cli.js","sourceRoot":"","sources":["../../../src/run/slides-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,163 @@
1
+ import { promises as fs } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { isRichTty, terminalWidth } from './terminal.js';
4
+ function parsePngSize(data) {
5
+ if (data.length < 24)
6
+ return null;
7
+ if (data[0] !== 0x89 ||
8
+ data[1] !== 0x50 ||
9
+ data[2] !== 0x4e ||
10
+ data[3] !== 0x47 ||
11
+ data[4] !== 0x0d ||
12
+ data[5] !== 0x0a ||
13
+ data[6] !== 0x1a ||
14
+ data[7] !== 0x0a) {
15
+ return null;
16
+ }
17
+ const width = data.readUInt32BE(16);
18
+ const height = data.readUInt32BE(20);
19
+ if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0)
20
+ return null;
21
+ return { width, height };
22
+ }
23
+ function resolveInlineProtocol({ mode, env, stdout, }) {
24
+ if (mode === 'none')
25
+ return 'none';
26
+ if (!isRichTty(stdout))
27
+ return 'none';
28
+ if (mode === 'kitty' || mode === 'iterm')
29
+ return mode;
30
+ const termProgram = (env.TERM_PROGRAM ?? '').toLowerCase();
31
+ const term = (env.TERM ?? '').toLowerCase();
32
+ if (env.KITTY_WINDOW_ID ||
33
+ term.includes('xterm-kitty') ||
34
+ termProgram.includes('ghostty') ||
35
+ termProgram.includes('konsole') ||
36
+ env.KONSOLE_VERSION) {
37
+ return 'kitty';
38
+ }
39
+ if (termProgram.includes('iterm') || env.ITERM_SESSION_ID) {
40
+ return 'iterm';
41
+ }
42
+ return 'none';
43
+ }
44
+ function clampInt(min, max, value) {
45
+ if (value < min)
46
+ return min;
47
+ if (value > max)
48
+ return max;
49
+ return value;
50
+ }
51
+ function resolveSlideCellSize({ width, height, termCols, }) {
52
+ const maxCols = clampInt(24, 64, Math.floor(termCols * 0.75));
53
+ const cols = clampInt(16, maxCols, 32);
54
+ if (!width || !height) {
55
+ return { cols, rows: 10 };
56
+ }
57
+ const aspect = height / width;
58
+ const rows = clampInt(4, 24, Math.round(cols * 0.5 * aspect));
59
+ return { cols, rows };
60
+ }
61
+ function writeKittyImage({ stdout, data, cols, rows, id, }) {
62
+ const encoded = data.toString('base64');
63
+ const chunkSize = 4096;
64
+ let offset = 0;
65
+ let first = true;
66
+ while (offset < encoded.length) {
67
+ const chunk = encoded.slice(offset, offset + chunkSize);
68
+ offset += chunkSize;
69
+ const more = offset < encoded.length ? 1 : 0;
70
+ if (first) {
71
+ const params = [
72
+ 'a=T',
73
+ 'f=100',
74
+ `i=${id}`,
75
+ `m=${more}`,
76
+ 'q=2',
77
+ `c=${cols}`,
78
+ `r=${rows}`,
79
+ 'C=1',
80
+ ].join(',');
81
+ stdout.write(`\u001b_G${params};${chunk}\u001b\\`);
82
+ first = false;
83
+ }
84
+ else {
85
+ stdout.write(`\u001b_Gm=${more};${chunk}\u001b\\`);
86
+ }
87
+ }
88
+ }
89
+ function writeItermImage({ stdout, data, cols, rows, name, }) {
90
+ const encodedName = Buffer.from(name).toString('base64');
91
+ const encodedData = data.toString('base64');
92
+ const args = [
93
+ `name=${encodedName}`,
94
+ `size=${data.length}`,
95
+ 'inline=1',
96
+ 'preserveAspectRatio=1',
97
+ `width=${cols}`,
98
+ `height=${rows}`,
99
+ ].join(';');
100
+ stdout.write(`\u001b]1337;File=${args}:${encodedData}\u001b\\`);
101
+ }
102
+ export async function renderSlidesInline({ slides, mode, env, stdout, labelForSlide, }) {
103
+ const renderer = createSlidesInlineRenderer({ mode, env, stdout });
104
+ return renderer.renderSlides({ slides, labelForSlide });
105
+ }
106
+ export function createSlidesInlineRenderer({ mode, env, stdout, }) {
107
+ const protocol = resolveInlineProtocol({ mode, env, stdout });
108
+ let nextId = 1;
109
+ const renderSlide = async (slide, label) => {
110
+ if (protocol === 'none')
111
+ return false;
112
+ if (label)
113
+ stdout.write(`${label}\n`);
114
+ let data;
115
+ try {
116
+ data = await fs.readFile(slide.imagePath);
117
+ }
118
+ catch {
119
+ stdout.write('(missing slide image)\n');
120
+ return false;
121
+ }
122
+ if (data.length === 0) {
123
+ stdout.write('(empty slide image)\n');
124
+ return false;
125
+ }
126
+ const termCols = terminalWidth(stdout, env);
127
+ const size = parsePngSize(data);
128
+ const { cols, rows } = resolveSlideCellSize({
129
+ width: size?.width ?? null,
130
+ height: size?.height ?? null,
131
+ termCols,
132
+ });
133
+ if (protocol === 'kitty') {
134
+ writeKittyImage({ stdout, data, cols, rows, id: nextId });
135
+ nextId += 1;
136
+ }
137
+ else if (protocol === 'iterm') {
138
+ writeItermImage({
139
+ stdout,
140
+ data,
141
+ cols,
142
+ rows,
143
+ name: path.basename(slide.imagePath) || 'slide.png',
144
+ });
145
+ }
146
+ stdout.write('\n'.repeat(Math.max(1, rows)));
147
+ stdout.write('\n');
148
+ return true;
149
+ };
150
+ const renderSlides = async ({ slides, labelForSlide, }) => {
151
+ if (protocol === 'none')
152
+ return { rendered: 0, protocol };
153
+ let rendered = 0;
154
+ for (const slide of slides) {
155
+ const label = labelForSlide?.(slide) ?? null;
156
+ if (await renderSlide(slide, label))
157
+ rendered += 1;
158
+ }
159
+ return { rendered, protocol };
160
+ };
161
+ return { protocol, renderSlide, renderSlides };
162
+ }
163
+ //# sourceMappingURL=slides-render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slides-render.js","sourceRoot":"","sources":["../../../src/run/slides-render.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- export function createStreamOutputGate({ stdout, clearProgressForStdout, outputMode, richTty, }) {
1
+ export function createStreamOutputGate({ stdout, clearProgressForStdout, restoreProgressAfterStdout, outputMode, richTty, }) {
2
2
  let cleared = false;
3
3
  let plainFlushedLen = 0;
4
4
  const ensureCleared = () => {
@@ -12,6 +12,7 @@ export function createStreamOutputGate({ stdout, clearProgressForStdout, outputM
12
12
  const flush = (text) => {
13
13
  clearProgressForStdout();
14
14
  stdout.write(text);
15
+ restoreProgressAfterStdout?.();
15
16
  };
16
17
  const handleChunk = (streamed, prevStreamed) => {
17
18
  if (plainFlushedLen === 0) {
@@ -43,13 +44,19 @@ export function createStreamOutputGate({ stdout, clearProgressForStdout, outputM
43
44
  };
44
45
  const finalize = (finalText) => {
45
46
  const remaining = plainFlushedLen < finalText.length ? finalText.slice(plainFlushedLen) : '';
46
- if (remaining)
47
+ if (remaining) {
48
+ clearProgressForStdout();
47
49
  stdout.write(remaining);
50
+ restoreProgressAfterStdout?.();
51
+ }
48
52
  const endedWithNewline = remaining
49
53
  ? remaining.endsWith('\n')
50
54
  : plainFlushedLen > 0 && finalText[plainFlushedLen - 1] === '\n';
51
- if (!endedWithNewline)
55
+ if (!endedWithNewline) {
56
+ clearProgressForStdout();
52
57
  stdout.write('\n');
58
+ restoreProgressAfterStdout?.();
59
+ }
53
60
  };
54
61
  return { handleChunk, finalize, getFlushedLen: () => plainFlushedLen };
55
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"stream-output.js","sourceRoot":"","sources":["../../../src/run/stream-output.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,sBAAsB,CAAC,EACrC,MAAM,EACN,sBAAsB,EACtB,UAAU,EACV,OAAO,GAMR;IACC,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,IAAI,eAAe,GAAG,CAAC,CAAA;IAEvB,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,IAAI,OAAO;YAAE,OAAM;QACnB,sBAAsB,EAAE,CAAA;QACxB,IAAI,OAAO;YAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAC/B,OAAO,GAAG,IAAI,CAAA;IAChB,CAAC,CAAA;IAED,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE;QAC7B,sBAAsB,EAAE,CAAA;QACxB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACpB,CAAC,CAAA;IAED,MAAM,WAAW,GAAG,CAAC,QAAgB,EAAE,YAAoB,EAAE,EAAE;QAC7D,IAAI,eAAe,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YACpC,IAAI,KAAK;gBAAE,eAAe,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;QAC9C,CAAC;QAED,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;YACzC,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,GAAG,CAAC,GAAG,eAAe,EAAE,CAAC;gBAChD,aAAa,EAAE,CAAA;gBACf,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,eAAe,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;gBAClD,eAAe,GAAG,MAAM,GAAG,CAAC,CAAA;YAC9B,CAAC;YACD,OAAM;QACR,CAAC;QAED,MAAM,YAAY,GAAG,QAAQ,CAAC,UAAU,CAAC,YAAY,CAAC,CAAA;QACtD,IAAI,QAAQ,CAAC,MAAM,GAAG,eAAe,IAAI,YAAY,EAAE,CAAC;YACtD,aAAa,EAAE,CAAA;YACf,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAA;YACtC,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAA;YACjC,OAAM;QACR,CAAC;QACD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,aAAa,EAAE,CAAA;YACf,KAAK,CAAC,QAAQ,CAAC,CAAA;YACf,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAA;QACnC,CAAC;IACH,CAAC,CAAA;IAED,MAAM,QAAQ,GAAG,CAAC,SAAiB,EAAE,EAAE;QACrC,MAAM,SAAS,GAAG,eAAe,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAC5F,IAAI,SAAS;YAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QACtC,MAAM,gBAAgB,GAAG,SAAS;YAChC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC1B,CAAC,CAAC,eAAe,GAAG,CAAC,IAAI,SAAS,CAAC,eAAe,GAAG,CAAC,CAAC,KAAK,IAAI,CAAA;QAClE,IAAI,CAAC,gBAAgB;YAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC3C,CAAC,CAAA;IAED,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,eAAe,EAAE,CAAA;AACxE,CAAC"}
1
+ {"version":3,"file":"stream-output.js","sourceRoot":"","sources":["../../../src/run/stream-output.ts"],"names":[],"mappings":"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"}
@@ -60,7 +60,7 @@ export function createSummaryEngine(deps) {
60
60
  }
61
61
  return `Missing ${attempt.requiredEnv} for model ${attempt.userModelId}. Set the env var or choose a different --model.`;
62
62
  };
63
- const runSummaryAttempt = async ({ attempt, prompt, allowStreaming, onModelChosen, cli, }) => {
63
+ const runSummaryAttempt = async ({ attempt, prompt, allowStreaming, onModelChosen, cli, streamHandler, }) => {
64
64
  onModelChosen?.(attempt.userModelId);
65
65
  if (attempt.transport === 'cli') {
66
66
  const hasAttachments = (prompt.attachments?.length ?? 0) > 0;
@@ -123,7 +123,7 @@ export function createSummaryEngine(deps) {
123
123
  timeoutMs: deps.timeoutMs,
124
124
  });
125
125
  if (modelResolution.note && deps.verbose) {
126
- writeVerbose(deps.stderr, deps.verbose, modelResolution.note, deps.verboseColor);
126
+ writeVerbose(deps.stderr, deps.verbose, modelResolution.note, deps.verboseColor, deps.envForRun);
127
127
  }
128
128
  const parsedModelEffective = parseGatewayStyleModelId(modelResolution.modelId);
129
129
  const streamingEnabledForCall = allowStreaming &&
@@ -167,6 +167,7 @@ export function createSummaryEngine(deps) {
167
167
  verbose: deps.verbose,
168
168
  color: deps.verboseColor,
169
169
  modelId: parsedModelEffective.canonical,
170
+ env: deps.envForRun,
170
171
  }),
171
172
  });
172
173
  deps.llmCalls.push({
@@ -192,8 +193,9 @@ export function createSummaryEngine(deps) {
192
193
  };
193
194
  }
194
195
  const shouldRenderMarkdownToAnsi = !deps.plain && isRichTty(deps.stdout);
195
- const shouldStreamSummaryToStdout = streamingEnabledForCall && !shouldRenderMarkdownToAnsi;
196
- const shouldStreamRenderedMarkdownToStdout = streamingEnabledForCall && shouldRenderMarkdownToAnsi;
196
+ const hasStreamHandler = Boolean(streamHandler);
197
+ const shouldStreamSummaryToStdout = streamingEnabledForCall && !shouldRenderMarkdownToAnsi && !hasStreamHandler;
198
+ const shouldStreamRenderedMarkdownToStdout = streamingEnabledForCall && shouldRenderMarkdownToAnsi && !hasStreamHandler;
197
199
  let summaryAlreadyPrinted = false;
198
200
  let summary = '';
199
201
  let getLastStreamError = null;
@@ -217,7 +219,7 @@ export function createSummaryEngine(deps) {
217
219
  }
218
220
  catch (error) {
219
221
  if (isStreamingTimeoutError(error)) {
220
- writeVerbose(deps.stderr, deps.verbose, `Streaming timed out for ${parsedModelEffective.canonical}; falling back to non-streaming.`, deps.verboseColor);
222
+ writeVerbose(deps.stderr, deps.verbose, `Streaming timed out for ${parsedModelEffective.canonical}; falling back to non-streaming.`, deps.verboseColor, deps.envForRun);
221
223
  const result = await summarizeWithModelId({
222
224
  modelId: parsedModelEffective.canonical,
223
225
  prompt,
@@ -237,6 +239,7 @@ export function createSummaryEngine(deps) {
237
239
  verbose: deps.verbose,
238
240
  color: deps.verboseColor,
239
241
  modelId: parsedModelEffective.canonical,
242
+ env: deps.envForRun,
240
243
  }),
241
244
  });
242
245
  deps.llmCalls.push({
@@ -250,7 +253,7 @@ export function createSummaryEngine(deps) {
250
253
  }
251
254
  else if (parsedModelEffective.provider === 'google' &&
252
255
  isGoogleStreamingUnsupportedError(error)) {
253
- writeVerbose(deps.stderr, deps.verbose, `Google model ${parsedModelEffective.canonical} rejected streamGenerateContent; falling back to non-streaming.`, deps.verboseColor);
256
+ writeVerbose(deps.stderr, deps.verbose, `Google model ${parsedModelEffective.canonical} rejected streamGenerateContent; falling back to non-streaming.`, deps.verboseColor, deps.envForRun);
254
257
  const result = await summarizeWithModelId({
255
258
  modelId: parsedModelEffective.canonical,
256
259
  prompt,
@@ -269,6 +272,7 @@ export function createSummaryEngine(deps) {
269
272
  verbose: deps.verbose,
270
273
  color: deps.verboseColor,
271
274
  modelId: parsedModelEffective.canonical,
275
+ env: deps.envForRun,
272
276
  }),
273
277
  });
274
278
  deps.llmCalls.push({
@@ -286,6 +290,7 @@ export function createSummaryEngine(deps) {
286
290
  }
287
291
  if (streamResult) {
288
292
  deps.clearProgressForStdout();
293
+ deps.restoreProgressAfterStdout?.();
289
294
  getLastStreamError = streamResult.lastError;
290
295
  let streamed = '';
291
296
  let streamedRaw = '';
@@ -306,6 +311,7 @@ export function createSummaryEngine(deps) {
306
311
  ? createStreamOutputGate({
307
312
  stdout: deps.stdout,
308
313
  clearProgressForStdout: deps.clearProgressForStdout,
314
+ restoreProgressAfterStdout: deps.restoreProgressAfterStdout ?? null,
309
315
  outputMode: deps.streamingOutputMode ?? 'line',
310
316
  richTty: isRichTty(deps.stdout),
311
317
  })
@@ -315,6 +321,14 @@ export function createSummaryEngine(deps) {
315
321
  const prevStreamed = streamed;
316
322
  const merged = mergeStreamingChunk(streamed, delta);
317
323
  streamed = merged.next;
324
+ if (streamHandler) {
325
+ await streamHandler.onChunk({
326
+ streamed: merged.next,
327
+ prevStreamed,
328
+ appended: merged.appended,
329
+ });
330
+ continue;
331
+ }
318
332
  if (shouldStreamSummaryToStdout && outputGate) {
319
333
  outputGate.handleChunk(streamed, prevStreamed);
320
334
  continue;
@@ -330,6 +344,7 @@ export function createSummaryEngine(deps) {
330
344
  else {
331
345
  deps.stdout.write(out);
332
346
  }
347
+ deps.restoreProgressAfterStdout?.();
333
348
  }
334
349
  }
335
350
  }
@@ -338,7 +353,11 @@ export function createSummaryEngine(deps) {
338
353
  streamed = trimmed;
339
354
  }
340
355
  finally {
341
- if (shouldStreamRenderedMarkdownToStdout) {
356
+ if (streamHandler) {
357
+ await streamHandler.onDone?.(streamedRaw || streamed);
358
+ summaryAlreadyPrinted = true;
359
+ }
360
+ else if (shouldStreamRenderedMarkdownToStdout) {
342
361
  const out = streamer?.finish();
343
362
  if (out) {
344
363
  deps.clearProgressForStdout();
@@ -349,6 +368,7 @@ export function createSummaryEngine(deps) {
349
368
  else {
350
369
  deps.stdout.write(out);
351
370
  }
371
+ deps.restoreProgressAfterStdout?.();
352
372
  }
353
373
  summaryAlreadyPrinted = true;
354
374
  }
@@ -375,6 +395,12 @@ export function createSummaryEngine(deps) {
375
395
  }
376
396
  throw new Error('LLM returned an empty summary');
377
397
  }
398
+ if (!streamResult && streamHandler) {
399
+ const cleaned = summary.trim();
400
+ await streamHandler.onChunk({ streamed: cleaned, prevStreamed: '', appended: cleaned });
401
+ await streamHandler.onDone?.(cleaned);
402
+ summaryAlreadyPrinted = true;
403
+ }
378
404
  return {
379
405
  summary,
380
406
  summaryAlreadyPrinted,