@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.
- package/CHANGELOG.md +114 -1
- package/LICENSE +1 -1
- package/README.md +309 -182
- package/dist/cli.js +1 -1
- package/dist/esm/cache.js +72 -4
- package/dist/esm/cache.js.map +1 -1
- package/dist/esm/config.js +197 -1
- package/dist/esm/config.js.map +1 -1
- package/dist/esm/content/asset.js +75 -2
- package/dist/esm/content/asset.js.map +1 -1
- package/dist/esm/daemon/agent.js +547 -0
- package/dist/esm/daemon/agent.js.map +1 -0
- package/dist/esm/daemon/chat.js +97 -0
- package/dist/esm/daemon/chat.js.map +1 -0
- package/dist/esm/daemon/cli.js +105 -10
- package/dist/esm/daemon/cli.js.map +1 -1
- package/dist/esm/daemon/env-snapshot.js +3 -0
- package/dist/esm/daemon/env-snapshot.js.map +1 -1
- package/dist/esm/daemon/flow-context.js +53 -28
- package/dist/esm/daemon/flow-context.js.map +1 -1
- package/dist/esm/daemon/launchd.js +27 -0
- package/dist/esm/daemon/launchd.js.map +1 -1
- package/dist/esm/daemon/process-registry.js +206 -0
- package/dist/esm/daemon/process-registry.js.map +1 -0
- package/dist/esm/daemon/schtasks.js +64 -0
- package/dist/esm/daemon/schtasks.js.map +1 -1
- package/dist/esm/daemon/server.js +1034 -52
- package/dist/esm/daemon/server.js.map +1 -1
- package/dist/esm/daemon/summarize.js +66 -18
- package/dist/esm/daemon/summarize.js.map +1 -1
- package/dist/esm/daemon/systemd.js +61 -0
- package/dist/esm/daemon/systemd.js.map +1 -1
- package/dist/esm/flags.js +24 -0
- package/dist/esm/flags.js.map +1 -1
- package/dist/esm/llm/attachments.js +2 -0
- package/dist/esm/llm/attachments.js.map +1 -0
- package/dist/esm/llm/errors.js +6 -0
- package/dist/esm/llm/errors.js.map +1 -0
- package/dist/esm/llm/generate-text.js +206 -356
- package/dist/esm/llm/generate-text.js.map +1 -1
- package/dist/esm/llm/html-to-markdown.js +1 -2
- package/dist/esm/llm/html-to-markdown.js.map +1 -1
- package/dist/esm/llm/prompt.js.map +1 -1
- package/dist/esm/llm/providers/anthropic.js +126 -0
- package/dist/esm/llm/providers/anthropic.js.map +1 -0
- package/dist/esm/llm/providers/google.js +78 -0
- package/dist/esm/llm/providers/google.js.map +1 -0
- package/dist/esm/llm/providers/models.js +111 -0
- package/dist/esm/llm/providers/models.js.map +1 -0
- package/dist/esm/llm/providers/openai.js +150 -0
- package/dist/esm/llm/providers/openai.js.map +1 -0
- package/dist/esm/llm/providers/shared.js +48 -0
- package/dist/esm/llm/providers/shared.js.map +1 -0
- package/dist/esm/llm/providers/types.js +2 -0
- package/dist/esm/llm/providers/types.js.map +1 -0
- package/dist/esm/llm/transcript-to-markdown.js +1 -2
- package/dist/esm/llm/transcript-to-markdown.js.map +1 -1
- package/dist/esm/llm/types.js +2 -0
- package/dist/esm/llm/types.js.map +1 -0
- package/dist/esm/llm/usage.js +69 -0
- package/dist/esm/llm/usage.js.map +1 -0
- package/dist/esm/logging/daemon.js +124 -0
- package/dist/esm/logging/daemon.js.map +1 -0
- package/dist/esm/logging/ring-file.js +66 -0
- package/dist/esm/logging/ring-file.js.map +1 -0
- package/dist/esm/media-cache.js +251 -0
- package/dist/esm/media-cache.js.map +1 -0
- package/dist/esm/model-auto.js +103 -5
- package/dist/esm/model-auto.js.map +1 -1
- package/dist/esm/processes.js +2 -0
- package/dist/esm/processes.js.map +1 -0
- package/dist/esm/refresh-free.js +3 -3
- package/dist/esm/refresh-free.js.map +1 -1
- package/dist/esm/run/attachments.js +8 -4
- package/dist/esm/run/attachments.js.map +1 -1
- package/dist/esm/run/bird.js +118 -5
- package/dist/esm/run/bird.js.map +1 -1
- package/dist/esm/run/cache-state.js +3 -2
- package/dist/esm/run/cache-state.js.map +1 -1
- package/dist/esm/run/cli-preflight.js +19 -1
- package/dist/esm/run/cli-preflight.js.map +1 -1
- package/dist/esm/run/constants.js +0 -7
- package/dist/esm/run/constants.js.map +1 -1
- package/dist/esm/run/finish-line.js +58 -11
- package/dist/esm/run/finish-line.js.map +1 -1
- package/dist/esm/run/flows/asset/extract.js +70 -0
- package/dist/esm/run/flows/asset/extract.js.map +1 -0
- package/dist/esm/run/flows/asset/input.js +209 -25
- package/dist/esm/run/flows/asset/input.js.map +1 -1
- package/dist/esm/run/flows/asset/media-policy.js +3 -0
- package/dist/esm/run/flows/asset/media-policy.js.map +1 -0
- package/dist/esm/run/flows/asset/media.js +224 -0
- package/dist/esm/run/flows/asset/media.js.map +1 -0
- package/dist/esm/run/flows/asset/output.js +98 -0
- package/dist/esm/run/flows/asset/output.js.map +1 -0
- package/dist/esm/run/flows/asset/preprocess.js +92 -16
- package/dist/esm/run/flows/asset/preprocess.js.map +1 -1
- package/dist/esm/run/flows/asset/summary.js +165 -11
- package/dist/esm/run/flows/asset/summary.js.map +1 -1
- package/dist/esm/run/flows/url/extract.js +6 -6
- package/dist/esm/run/flows/url/extract.js.map +1 -1
- package/dist/esm/run/flows/url/flow.js +338 -36
- package/dist/esm/run/flows/url/flow.js.map +1 -1
- package/dist/esm/run/flows/url/markdown.js +6 -1
- package/dist/esm/run/flows/url/markdown.js.map +1 -1
- package/dist/esm/run/flows/url/slides-output.js +485 -0
- package/dist/esm/run/flows/url/slides-output.js.map +1 -0
- package/dist/esm/run/flows/url/slides-text.js +628 -0
- package/dist/esm/run/flows/url/slides-text.js.map +1 -0
- package/dist/esm/run/flows/url/summary.js +358 -83
- package/dist/esm/run/flows/url/summary.js.map +1 -1
- package/dist/esm/run/help.js +94 -5
- package/dist/esm/run/help.js.map +1 -1
- package/dist/esm/run/logging.js +12 -4
- package/dist/esm/run/logging.js.map +1 -1
- package/dist/esm/run/media-cache-state.js +33 -0
- package/dist/esm/run/media-cache-state.js.map +1 -0
- package/dist/esm/run/progress.js +19 -1
- package/dist/esm/run/progress.js.map +1 -1
- package/dist/esm/run/run-context.js +19 -0
- package/dist/esm/run/run-context.js.map +1 -0
- package/dist/esm/run/run-output.js +1 -1
- package/dist/esm/run/run-output.js.map +1 -1
- package/dist/esm/run/run-settings.js +182 -0
- package/dist/esm/run/run-settings.js.map +1 -0
- package/dist/esm/run/runner.js +225 -32
- package/dist/esm/run/runner.js.map +1 -1
- package/dist/esm/run/slides-cli.js +225 -0
- package/dist/esm/run/slides-cli.js.map +1 -0
- package/dist/esm/run/slides-render.js +163 -0
- package/dist/esm/run/slides-render.js.map +1 -0
- package/dist/esm/run/stream-output.js +63 -0
- package/dist/esm/run/stream-output.js.map +1 -0
- package/dist/esm/run/streaming.js +16 -43
- package/dist/esm/run/streaming.js.map +1 -1
- package/dist/esm/run/summary-engine.js +59 -41
- package/dist/esm/run/summary-engine.js.map +1 -1
- package/dist/esm/run/transcriber-cli.js +148 -0
- package/dist/esm/run/transcriber-cli.js.map +1 -0
- package/dist/esm/shared/sse-events.js +26 -0
- package/dist/esm/shared/sse-events.js.map +1 -0
- package/dist/esm/shared/streaming-merge.js +44 -0
- package/dist/esm/shared/streaming-merge.js.map +1 -0
- package/dist/esm/slides/extract.js +1942 -0
- package/dist/esm/slides/extract.js.map +1 -0
- package/dist/esm/slides/index.js +4 -0
- package/dist/esm/slides/index.js.map +1 -0
- package/dist/esm/slides/settings.js +73 -0
- package/dist/esm/slides/settings.js.map +1 -0
- package/dist/esm/slides/store.js +111 -0
- package/dist/esm/slides/store.js.map +1 -0
- package/dist/esm/slides/types.js +2 -0
- package/dist/esm/slides/types.js.map +1 -0
- package/dist/esm/tty/osc-progress.js +21 -1
- package/dist/esm/tty/osc-progress.js.map +1 -1
- package/dist/esm/tty/progress/fetch-html.js +8 -4
- package/dist/esm/tty/progress/fetch-html.js.map +1 -1
- package/dist/esm/tty/progress/transcript.js +82 -31
- package/dist/esm/tty/progress/transcript.js.map +1 -1
- package/dist/esm/tty/spinner.js +2 -2
- package/dist/esm/tty/spinner.js.map +1 -1
- package/dist/esm/tty/theme.js +189 -0
- package/dist/esm/tty/theme.js.map +1 -0
- package/dist/esm/tty/website-progress.js +17 -13
- package/dist/esm/tty/website-progress.js.map +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/esm/version.js.map +1 -1
- package/dist/types/cache.d.ts +14 -2
- package/dist/types/config.d.ts +34 -0
- package/dist/types/daemon/agent.d.ts +25 -0
- package/dist/types/daemon/chat.d.ts +27 -0
- package/dist/types/daemon/env-snapshot.d.ts +1 -1
- package/dist/types/daemon/flow-context.d.ts +24 -3
- package/dist/types/daemon/launchd.d.ts +4 -0
- package/dist/types/daemon/process-registry.d.ts +73 -0
- package/dist/types/daemon/schtasks.d.ts +4 -0
- package/dist/types/daemon/server.d.ts +7 -1
- package/dist/types/daemon/summarize.d.ts +47 -5
- package/dist/types/daemon/systemd.d.ts +4 -0
- package/dist/types/flags.d.ts +1 -0
- package/dist/types/llm/attachments.d.ts +6 -0
- package/dist/types/llm/errors.d.ts +1 -0
- package/dist/types/llm/generate-text.d.ts +29 -13
- package/dist/types/llm/prompt.d.ts +7 -2
- package/dist/types/llm/providers/anthropic.d.ts +30 -0
- package/dist/types/llm/providers/google.d.ts +29 -0
- package/dist/types/llm/providers/models.d.ts +27 -0
- package/dist/types/llm/providers/openai.d.ts +38 -0
- package/dist/types/llm/providers/shared.d.ts +14 -0
- package/dist/types/llm/providers/types.d.ts +6 -0
- package/dist/types/llm/types.d.ts +5 -0
- package/dist/types/llm/usage.d.ts +5 -0
- package/dist/types/logging/daemon.d.ts +26 -0
- package/dist/types/logging/ring-file.d.ts +10 -0
- package/dist/types/media-cache.d.ts +22 -0
- package/dist/types/model-auto.d.ts +1 -0
- package/dist/types/processes.d.ts +1 -0
- package/dist/types/run/attachments.d.ts +9 -6
- package/dist/types/run/bird.d.ts +7 -0
- package/dist/types/run/constants.d.ts +0 -2
- package/dist/types/run/finish-line.d.ts +59 -1
- package/dist/types/run/flows/asset/extract.d.ts +18 -0
- package/dist/types/run/flows/asset/input.d.ts +12 -2
- package/dist/types/run/flows/asset/media-policy.d.ts +2 -0
- package/dist/types/run/flows/asset/media.d.ts +21 -0
- package/dist/types/run/flows/asset/output.d.ts +42 -0
- package/dist/types/run/flows/asset/preprocess.d.ts +22 -2
- package/dist/types/run/flows/asset/summary.d.ts +6 -0
- package/dist/types/run/flows/url/extract.d.ts +2 -1
- package/dist/types/run/flows/url/slides-output.d.ts +66 -0
- package/dist/types/run/flows/url/slides-text.d.ts +87 -0
- package/dist/types/run/flows/url/summary.d.ts +11 -3
- package/dist/types/run/flows/url/types.d.ts +29 -2
- package/dist/types/run/help.d.ts +3 -0
- package/dist/types/run/logging.d.ts +3 -2
- package/dist/types/run/media-cache-state.d.ts +7 -0
- package/dist/types/run/progress.d.ts +2 -1
- package/dist/types/run/run-context.d.ts +44 -0
- package/dist/types/run/run-settings.d.ts +62 -0
- package/dist/types/run/slides-cli.d.ts +9 -0
- package/dist/types/run/slides-render.d.ts +30 -0
- package/dist/types/run/stream-output.d.ts +12 -0
- package/dist/types/run/streaming.d.ts +10 -4
- package/dist/types/run/summary-engine.d.ts +15 -3
- package/dist/types/run/summary-llm.d.ts +2 -2
- package/dist/types/run/transcriber-cli.d.ts +8 -0
- package/dist/types/shared/sse-events.d.ts +64 -0
- package/dist/types/shared/streaming-merge.d.ts +4 -0
- package/dist/types/slides/extract.d.ts +42 -0
- package/dist/types/slides/index.d.ts +5 -0
- package/dist/types/slides/settings.d.ts +20 -0
- package/dist/types/slides/store.d.ts +15 -0
- package/dist/types/slides/types.d.ts +40 -0
- package/dist/types/tty/osc-progress.d.ts +2 -2
- package/dist/types/tty/progress/fetch-html.d.ts +3 -1
- package/dist/types/tty/progress/transcript.d.ts +3 -1
- package/dist/types/tty/spinner.d.ts +3 -1
- package/dist/types/tty/theme.d.ts +44 -0
- package/dist/types/tty/website-progress.d.ts +3 -1
- package/dist/types/version.d.ts +1 -1
- package/docs/README.md +13 -8
- package/docs/_config.yml +26 -0
- package/docs/_layouts/default.html +60 -0
- package/docs/agent.md +333 -0
- package/docs/assets/site.css +748 -0
- package/docs/assets/site.js +72 -0
- package/docs/assets/summarize-cli.png +0 -0
- package/docs/assets/summarize-extension.png +0 -0
- package/docs/assets/youtube-slides.png +0 -0
- package/docs/cache.md +29 -3
- package/docs/chrome-extension.md +85 -7
- package/docs/config.md +74 -2
- package/docs/extract-only.md +10 -2
- package/docs/index.html +205 -0
- package/docs/index.md +25 -0
- package/docs/language.md +1 -1
- package/docs/llm.md +17 -1
- package/docs/manual-tests.md +2 -0
- package/docs/media.md +37 -0
- package/docs/model-auto.md +2 -1
- package/docs/nvidia-onnx-transcription.md +55 -0
- package/docs/openai.md +5 -0
- package/docs/releasing.md +26 -0
- package/docs/site/assets/site.css +399 -228
- package/docs/site/assets/summarize-cli.png +0 -0
- package/docs/site/assets/summarize-extension.png +0 -0
- package/docs/site/docs/chrome-extension.html +89 -0
- package/docs/site/docs/config.html +1 -0
- package/docs/site/docs/extract-only.html +1 -0
- package/docs/site/docs/firecrawl.html +1 -0
- package/docs/site/docs/index.html +5 -0
- package/docs/site/docs/llm.html +1 -0
- package/docs/site/docs/openai.html +1 -0
- package/docs/site/docs/website.html +1 -0
- package/docs/site/docs/youtube.html +1 -0
- package/docs/site/index.html +148 -84
- package/docs/slides.md +74 -0
- package/docs/timestamps.md +103 -0
- package/docs/website.md +13 -0
- package/docs/youtube.md +16 -0
- package/package.json +22 -18
- package/dist/esm/daemon/request-settings.js +0 -91
- package/dist/esm/daemon/request-settings.js.map +0 -1
- package/dist/types/daemon/request-settings.d.ts +0 -27
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { parseDurationMs, parseFirecrawlMode, parseLengthArg, parseMarkdownMode, parseMaxOutputTokensArg, parsePreprocessMode, parseRetriesArg, parseVideoMode, parseYoutubeMode, } from '../flags.js';
|
|
2
|
+
import { resolveOutputLanguage } from '../language.js';
|
|
3
|
+
export function resolveSummaryLength(raw, fallback = 'xl') {
|
|
4
|
+
const value = typeof raw === 'string' ? raw.trim() : '';
|
|
5
|
+
const lengthArg = parseLengthArg(value || fallback);
|
|
6
|
+
const summaryLength = lengthArg.kind === 'preset' ? lengthArg.preset : { maxCharacters: lengthArg.maxCharacters };
|
|
7
|
+
return { lengthArg, summaryLength };
|
|
8
|
+
}
|
|
9
|
+
export function resolveOutputLanguageSetting({ raw, fallback, }) {
|
|
10
|
+
const value = typeof raw === 'string' ? raw.trim() : '';
|
|
11
|
+
if (!value)
|
|
12
|
+
return fallback;
|
|
13
|
+
return resolveOutputLanguage(value);
|
|
14
|
+
}
|
|
15
|
+
export function resolveCliRunSettings({ length, firecrawl, markdownMode, markdown, format, preprocess, youtube, timeout, retries, maxOutputTokens, }) {
|
|
16
|
+
const strictOverrides = resolveRunOverrides({
|
|
17
|
+
firecrawl,
|
|
18
|
+
markdownMode: format === 'markdown' ? (markdownMode ?? markdown ?? 'readability') : 'off',
|
|
19
|
+
preprocess,
|
|
20
|
+
youtube,
|
|
21
|
+
timeout,
|
|
22
|
+
retries,
|
|
23
|
+
maxOutputTokens,
|
|
24
|
+
}, { strict: true });
|
|
25
|
+
const requireOverride = (value, label) => {
|
|
26
|
+
if (value == null) {
|
|
27
|
+
throw new Error(`Missing ${label} override value.`);
|
|
28
|
+
}
|
|
29
|
+
return value;
|
|
30
|
+
};
|
|
31
|
+
return {
|
|
32
|
+
lengthArg: parseLengthArg(length),
|
|
33
|
+
firecrawlMode: requireOverride(strictOverrides.firecrawlMode, '--firecrawl'),
|
|
34
|
+
markdownMode: requireOverride(strictOverrides.markdownMode, '--markdown-mode'),
|
|
35
|
+
preprocessMode: requireOverride(strictOverrides.preprocessMode, '--preprocess'),
|
|
36
|
+
youtubeMode: requireOverride(strictOverrides.youtubeMode, '--youtube'),
|
|
37
|
+
timeoutMs: requireOverride(strictOverrides.timeoutMs, '--timeout'),
|
|
38
|
+
retries: requireOverride(strictOverrides.retries, '--retries'),
|
|
39
|
+
maxOutputTokensArg: strictOverrides.maxOutputTokensArg,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
const parseOptionalSetting = (raw, parse, strict) => {
|
|
43
|
+
if (typeof raw !== 'string')
|
|
44
|
+
return null;
|
|
45
|
+
try {
|
|
46
|
+
return parse(raw);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
if (strict)
|
|
50
|
+
throw error;
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const parseOptionalBoolean = (raw, strict) => {
|
|
55
|
+
if (typeof raw === 'boolean')
|
|
56
|
+
return raw;
|
|
57
|
+
if (typeof raw !== 'string')
|
|
58
|
+
return null;
|
|
59
|
+
const normalized = raw.trim().toLowerCase();
|
|
60
|
+
if (!normalized)
|
|
61
|
+
return null;
|
|
62
|
+
if (normalized === 'true' || normalized === '1' || normalized === 'yes' || normalized === 'on') {
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
if (normalized === 'false' || normalized === '0' || normalized === 'no' || normalized === 'off') {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
if (strict) {
|
|
69
|
+
throw new Error(`Unsupported --timestamps: ${raw}`);
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
};
|
|
73
|
+
export function resolveRunOverrides({ firecrawl, markdownMode, preprocess, youtube, videoMode, timestamps, forceSummary, timeout, retries, maxOutputTokens, transcriber, }, options = {}) {
|
|
74
|
+
const strict = options.strict ?? false;
|
|
75
|
+
const timeoutMs = (() => {
|
|
76
|
+
if (typeof timeout === 'number') {
|
|
77
|
+
if (Number.isFinite(timeout) && timeout > 0) {
|
|
78
|
+
return Math.floor(timeout);
|
|
79
|
+
}
|
|
80
|
+
if (strict) {
|
|
81
|
+
throw new Error(`Unsupported --timeout: ${String(timeout)}`);
|
|
82
|
+
}
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
if (typeof timeout !== 'string')
|
|
86
|
+
return null;
|
|
87
|
+
try {
|
|
88
|
+
return parseDurationMs(timeout);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
if (strict)
|
|
92
|
+
throw error;
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
})();
|
|
96
|
+
const retriesResolved = (() => {
|
|
97
|
+
if (typeof retries === 'number') {
|
|
98
|
+
if (Number.isFinite(retries) && Number.isInteger(retries)) {
|
|
99
|
+
try {
|
|
100
|
+
return parseRetriesArg(String(retries));
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
if (strict)
|
|
104
|
+
throw error;
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
if (strict) {
|
|
109
|
+
throw new Error(`Unsupported --retries: ${String(retries)}`);
|
|
110
|
+
}
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
if (typeof retries !== 'string')
|
|
114
|
+
return null;
|
|
115
|
+
try {
|
|
116
|
+
return parseRetriesArg(retries);
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
if (strict)
|
|
120
|
+
throw error;
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
})();
|
|
124
|
+
const maxOutputTokensArg = (() => {
|
|
125
|
+
if (typeof maxOutputTokens === 'number') {
|
|
126
|
+
if (Number.isFinite(maxOutputTokens) && maxOutputTokens > 0) {
|
|
127
|
+
try {
|
|
128
|
+
return parseMaxOutputTokensArg(String(maxOutputTokens));
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
if (strict)
|
|
132
|
+
throw error;
|
|
133
|
+
return null;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
if (strict) {
|
|
137
|
+
throw new Error(`Unsupported --max-output-tokens: ${String(maxOutputTokens)}`);
|
|
138
|
+
}
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
if (typeof maxOutputTokens !== 'string')
|
|
142
|
+
return null;
|
|
143
|
+
try {
|
|
144
|
+
return parseMaxOutputTokensArg(maxOutputTokens);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
if (strict)
|
|
148
|
+
throw error;
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
})();
|
|
152
|
+
const transcriberOverride = (() => {
|
|
153
|
+
if (typeof transcriber !== 'string')
|
|
154
|
+
return null;
|
|
155
|
+
const normalized = transcriber.trim().toLowerCase();
|
|
156
|
+
if (normalized === 'auto' ||
|
|
157
|
+
normalized === 'whisper' ||
|
|
158
|
+
normalized === 'parakeet' ||
|
|
159
|
+
normalized === 'canary') {
|
|
160
|
+
return normalized;
|
|
161
|
+
}
|
|
162
|
+
if (strict) {
|
|
163
|
+
throw new Error(`Unsupported transcriber: ${transcriber}`);
|
|
164
|
+
}
|
|
165
|
+
return null;
|
|
166
|
+
})();
|
|
167
|
+
const forceSummaryResolved = parseOptionalBoolean(forceSummary, strict);
|
|
168
|
+
return {
|
|
169
|
+
firecrawlMode: parseOptionalSetting(firecrawl, parseFirecrawlMode, strict),
|
|
170
|
+
markdownMode: parseOptionalSetting(markdownMode, parseMarkdownMode, strict),
|
|
171
|
+
preprocessMode: parseOptionalSetting(preprocess, parsePreprocessMode, strict),
|
|
172
|
+
youtubeMode: parseOptionalSetting(youtube, parseYoutubeMode, strict),
|
|
173
|
+
videoMode: parseOptionalSetting(videoMode, parseVideoMode, strict),
|
|
174
|
+
transcriptTimestamps: parseOptionalBoolean(timestamps, strict),
|
|
175
|
+
forceSummary: forceSummaryResolved,
|
|
176
|
+
timeoutMs,
|
|
177
|
+
retries: retriesResolved,
|
|
178
|
+
maxOutputTokensArg,
|
|
179
|
+
transcriber: transcriberOverride,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=run-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-settings.js","sourceRoot":"","sources":["../../../src/run/run-settings.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/run/runner.js
CHANGED
|
@@ -3,25 +3,33 @@ import { readFile } from 'node:fs/promises';
|
|
|
3
3
|
import { CommanderError } from 'commander';
|
|
4
4
|
import { clearCacheFiles, DEFAULT_CACHE_MAX_MB, resolveCachePath, } from '../cache.js';
|
|
5
5
|
import { loadSummarizeConfig } from '../config.js';
|
|
6
|
-
import {
|
|
6
|
+
import { parseExtractFormat, parseMaxExtractCharactersArg, parseMetricsMode, parseStreamMode, } from '../flags.js';
|
|
7
|
+
import { resolveSlideSettings } from '../slides/index.js';
|
|
8
|
+
import { createThemeRenderer, resolveThemeNameFromSources, resolveTrueColor } from '../tty/theme.js';
|
|
7
9
|
import { formatVersionLine } from '../version.js';
|
|
8
10
|
import { createCacheStateFromConfig } from './cache-state.js';
|
|
9
11
|
import { handleDaemonCliRequest, handleHelpRequest, handleRefreshFreeRequest, } from './cli-preflight.js';
|
|
10
12
|
import { parseCliProviderArg } from './env.js';
|
|
11
|
-
import {
|
|
13
|
+
import { extractAssetContent } from './flows/asset/extract.js';
|
|
14
|
+
import { handleFileInput, withUrlAsset } from './flows/asset/input.js';
|
|
15
|
+
import { summarizeMediaFile as summarizeMediaFileImpl } from './flows/asset/media.js';
|
|
16
|
+
import { outputExtractedAsset } from './flows/asset/output.js';
|
|
12
17
|
import { summarizeAsset as summarizeAssetFlow } from './flows/asset/summary.js';
|
|
13
18
|
import { runUrlFlow } from './flows/url/flow.js';
|
|
14
19
|
import { attachRichHelp, buildProgram } from './help.js';
|
|
20
|
+
import { createMediaCacheFromConfig } from './media-cache-state.js';
|
|
15
21
|
import { createProgressGate } from './progress.js';
|
|
16
|
-
import {
|
|
17
|
-
import { resolveEnvState } from './run-env.js';
|
|
22
|
+
import { resolveRunContextState } from './run-context.js';
|
|
18
23
|
import { resolveRunInput } from './run-input.js';
|
|
19
24
|
import { createRunMetrics } from './run-metrics.js';
|
|
20
25
|
import { resolveModelSelection } from './run-models.js';
|
|
21
26
|
import { resolveDesiredOutputTokens } from './run-output.js';
|
|
27
|
+
import { resolveCliRunSettings } from './run-settings.js';
|
|
22
28
|
import { resolveStreamSettings } from './run-stream.js';
|
|
29
|
+
import { handleSlidesCliRequest } from './slides-cli.js';
|
|
23
30
|
import { createSummaryEngine } from './summary-engine.js';
|
|
24
|
-
import {
|
|
31
|
+
import { isRichTty, supportsColor } from './terminal.js';
|
|
32
|
+
import { handleTranscriberCliRequest } from './transcriber-cli.js';
|
|
25
33
|
export async function runCli(argv, { env, fetch, execFile: execFileOverride, stdout, stderr }) {
|
|
26
34
|
;
|
|
27
35
|
globalThis.AI_SDK_LOG_WARNINGS = false;
|
|
@@ -49,6 +57,23 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
|
|
|
49
57
|
})) {
|
|
50
58
|
return;
|
|
51
59
|
}
|
|
60
|
+
if (await handleSlidesCliRequest({
|
|
61
|
+
normalizedArgv,
|
|
62
|
+
envForRun,
|
|
63
|
+
fetchImpl: fetch,
|
|
64
|
+
stdout,
|
|
65
|
+
stderr,
|
|
66
|
+
})) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
if (await handleTranscriberCliRequest({
|
|
70
|
+
normalizedArgv,
|
|
71
|
+
envForRun,
|
|
72
|
+
stdout,
|
|
73
|
+
stderr,
|
|
74
|
+
})) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
52
77
|
const execFileImpl = execFileOverride ?? execFile;
|
|
53
78
|
const program = buildProgram();
|
|
54
79
|
program.configureOutput({
|
|
@@ -162,33 +187,45 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
|
|
|
162
187
|
const inputTarget = inputResolution.inputTarget;
|
|
163
188
|
const url = inputResolution.url;
|
|
164
189
|
const runStartedAtMs = Date.now();
|
|
165
|
-
const youtubeMode = parseYoutubeMode(program.opts().youtube);
|
|
166
190
|
const videoModeExplicitlySet = normalizedArgv.some((arg) => arg === '--video-mode' || arg.startsWith('--video-mode='));
|
|
167
191
|
const lengthExplicitlySet = normalizedArgv.some((arg) => arg === '--length' || arg.startsWith('--length='));
|
|
168
|
-
const lengthArg = parseLengthArg(program.opts().length);
|
|
169
|
-
const maxOutputTokensArg = parseMaxOutputTokensArg(program.opts().maxOutputTokens);
|
|
170
|
-
const timeoutMs = parseDurationMs(program.opts().timeout);
|
|
171
192
|
const languageExplicitlySet = normalizedArgv.some((arg) => arg === '--language' ||
|
|
172
193
|
arg.startsWith('--language=') ||
|
|
173
194
|
arg === '--lang' ||
|
|
174
195
|
arg.startsWith('--lang='));
|
|
175
|
-
const retries = parseRetriesArg(program.opts().retries);
|
|
176
196
|
const noCacheFlag = program.opts().cache === false;
|
|
197
|
+
const noMediaCacheFlag = program.opts().mediaCache === false;
|
|
177
198
|
const extractMode = Boolean(program.opts().extract) || Boolean(program.opts().extractOnly);
|
|
178
199
|
const json = Boolean(program.opts().json);
|
|
200
|
+
const forceSummary = Boolean(program.opts().forceSummary);
|
|
201
|
+
const slidesDebug = Boolean(program.opts().slidesDebug);
|
|
179
202
|
const streamMode = parseStreamMode(program.opts().stream);
|
|
180
203
|
const plain = Boolean(program.opts().plain);
|
|
181
204
|
const debug = Boolean(program.opts().debug);
|
|
182
205
|
const verbose = Boolean(program.opts().verbose) || debug;
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
206
|
+
const normalizeTranscriber = (value) => {
|
|
207
|
+
if (typeof value !== 'string')
|
|
208
|
+
return null;
|
|
209
|
+
const normalized = value.trim().toLowerCase();
|
|
210
|
+
if (normalized === 'auto' ||
|
|
211
|
+
normalized === 'whisper' ||
|
|
212
|
+
normalized === 'parakeet' ||
|
|
213
|
+
normalized === 'canary')
|
|
214
|
+
return normalized;
|
|
215
|
+
return null;
|
|
216
|
+
};
|
|
217
|
+
const transcriberExplicitlySet = normalizedArgv.some((arg) => arg === '--transcriber' || arg.startsWith('--transcriber='));
|
|
218
|
+
const envTranscriber = envForRun?.SUMMARIZE_TRANSCRIBER ??
|
|
219
|
+
process.env.SUMMARIZE_TRANSCRIBER ??
|
|
220
|
+
null;
|
|
221
|
+
const transcriber = normalizeTranscriber(transcriberExplicitlySet ? program.opts().transcriber : envTranscriber) ??
|
|
222
|
+
'auto';
|
|
223
|
+
envForRun.SUMMARIZE_TRANSCRIBER = transcriber;
|
|
224
|
+
const maxExtractCharacters = parseMaxExtractCharactersArg(typeof program.opts().maxExtractCharacters === 'string'
|
|
225
|
+
? program.opts().maxExtractCharacters
|
|
226
|
+
: program.opts().maxExtractCharacters != null
|
|
227
|
+
? String(program.opts().maxExtractCharacters)
|
|
228
|
+
: undefined);
|
|
192
229
|
const isYoutubeUrl = typeof url === 'string' ? /youtube\.com|youtu\.be/i.test(url) : false;
|
|
193
230
|
const formatExplicitlySet = normalizedArgv.some((arg) => arg === '--format' || arg.startsWith('--format='));
|
|
194
231
|
const rawFormatOpt = typeof program.opts().format === 'string' ? program.opts().format : null;
|
|
@@ -197,17 +234,36 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
|
|
|
197
234
|
: extractMode && inputTarget.kind === 'url' && !isYoutubeUrl
|
|
198
235
|
? 'md'
|
|
199
236
|
: 'text');
|
|
237
|
+
const runSettings = resolveCliRunSettings({
|
|
238
|
+
length: String(program.opts().length),
|
|
239
|
+
firecrawl: String(program.opts().firecrawl),
|
|
240
|
+
markdownMode: typeof program.opts().markdownMode === 'string' ? program.opts().markdownMode : undefined,
|
|
241
|
+
markdown: typeof program.opts().markdown === 'string' ? program.opts().markdown : undefined,
|
|
242
|
+
format,
|
|
243
|
+
preprocess: String(program.opts().preprocess),
|
|
244
|
+
youtube: String(program.opts().youtube),
|
|
245
|
+
timeout: String(program.opts().timeout),
|
|
246
|
+
retries: String(program.opts().retries),
|
|
247
|
+
maxOutputTokens: typeof program.opts().maxOutputTokens === 'string'
|
|
248
|
+
? program.opts().maxOutputTokens
|
|
249
|
+
: program.opts().maxOutputTokens != null
|
|
250
|
+
? String(program.opts().maxOutputTokens)
|
|
251
|
+
: undefined,
|
|
252
|
+
});
|
|
253
|
+
const { youtubeMode, lengthArg, maxOutputTokensArg, timeoutMs, retries, preprocessMode, firecrawlMode: requestedFirecrawlMode, markdownMode, } = runSettings;
|
|
254
|
+
if (extractMode && lengthExplicitlySet && !json && isRichTty(stderr)) {
|
|
255
|
+
stderr.write('Warning: --length is ignored with --extract (no summary is generated).\n');
|
|
256
|
+
}
|
|
257
|
+
const metricsExplicitlySet = normalizedArgv.some((arg) => arg === '--metrics' || arg.startsWith('--metrics='));
|
|
258
|
+
const metricsMode = parseMetricsMode(debug && !metricsExplicitlySet ? 'detailed' : program.opts().metrics);
|
|
259
|
+
const metricsEnabled = metricsMode !== 'off';
|
|
260
|
+
const metricsDetailed = metricsMode === 'detailed';
|
|
261
|
+
const shouldComputeReport = metricsEnabled;
|
|
200
262
|
const _firecrawlExplicitlySet = normalizedArgv.some((arg) => arg === '--firecrawl' || arg.startsWith('--firecrawl='));
|
|
201
263
|
const markdownModeExplicitlySet = normalizedArgv.some((arg) => arg === '--markdown-mode' ||
|
|
202
264
|
arg.startsWith('--markdown-mode=') ||
|
|
203
265
|
arg === '--markdown' ||
|
|
204
266
|
arg.startsWith('--markdown='));
|
|
205
|
-
const markdownMode = format === 'markdown'
|
|
206
|
-
? parseMarkdownMode(program.opts().markdownMode ??
|
|
207
|
-
program.opts().markdown ??
|
|
208
|
-
'readability')
|
|
209
|
-
: 'off';
|
|
210
|
-
const requestedFirecrawlMode = parseFirecrawlMode(program.opts().firecrawl);
|
|
211
267
|
const modelArg = typeof program.opts().model === 'string' ? program.opts().model : null;
|
|
212
268
|
const cliProviderArg = typeof cliProviderArgRaw === 'string' && cliProviderArgRaw.trim().length > 0
|
|
213
269
|
? parseCliProviderArg(cliProviderArgRaw)
|
|
@@ -220,7 +276,8 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
|
|
|
220
276
|
: cliFlagPresent
|
|
221
277
|
? 'auto'
|
|
222
278
|
: modelArg;
|
|
223
|
-
const { config, configPath, outputLanguage, openaiWhisperUsdPerMinute, videoMode, cliConfigForRun, configForCli, openaiUseChatCompletions, configModelLabel, } =
|
|
279
|
+
const { config, configPath, outputLanguage, openaiWhisperUsdPerMinute, videoMode, cliConfigForRun, configForCli, openaiUseChatCompletions, configModelLabel, apiKey, openrouterApiKey, openrouterConfigured, openaiTranscriptionKey, xaiApiKey, googleApiKey, anthropicApiKey, zaiApiKey, zaiBaseUrl, providerBaseUrls, firecrawlApiKey, firecrawlConfigured, googleConfigured, anthropicConfigured, apifyToken, ytDlpPath, falApiKey, cliAvailability, envForAuto, } = resolveRunContextState({
|
|
280
|
+
env,
|
|
224
281
|
envForRun,
|
|
225
282
|
programOpts: program.opts(),
|
|
226
283
|
languageExplicitlySet,
|
|
@@ -228,9 +285,48 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
|
|
|
228
285
|
cliFlagPresent,
|
|
229
286
|
cliProviderArg,
|
|
230
287
|
});
|
|
288
|
+
const themeName = resolveThemeNameFromSources({
|
|
289
|
+
cli: program.opts().theme,
|
|
290
|
+
env: envForRun.SUMMARIZE_THEME,
|
|
291
|
+
config: config?.ui?.theme,
|
|
292
|
+
});
|
|
293
|
+
envForRun.SUMMARIZE_THEME = themeName;
|
|
231
294
|
if (!promptOverride && typeof config?.prompt === 'string' && config.prompt.trim().length > 0) {
|
|
232
295
|
promptOverride = config.prompt.trim();
|
|
233
296
|
}
|
|
297
|
+
const slidesExplicitlySet = normalizedArgv.some((arg) => arg === '--slides' || arg === '--no-slides' || arg.startsWith('--slides='));
|
|
298
|
+
const slidesOcrExplicitlySet = normalizedArgv.some((arg) => arg === '--slides-ocr' || arg === '--no-slides-ocr' || arg.startsWith('--slides-ocr='));
|
|
299
|
+
const slidesDirExplicitlySet = normalizedArgv.some((arg) => arg === '--slides-dir' || arg.startsWith('--slides-dir='));
|
|
300
|
+
const slidesSceneThresholdExplicitlySet = normalizedArgv.some((arg) => arg === '--slides-scene-threshold' || arg.startsWith('--slides-scene-threshold='));
|
|
301
|
+
const slidesMaxExplicitlySet = normalizedArgv.some((arg) => arg === '--slides-max' || arg.startsWith('--slides-max='));
|
|
302
|
+
const slidesMinDurationExplicitlySet = normalizedArgv.some((arg) => arg === '--slides-min-duration' || arg.startsWith('--slides-min-duration='));
|
|
303
|
+
const slidesConfig = config?.slides;
|
|
304
|
+
const slidesSettings = resolveSlideSettings({
|
|
305
|
+
slides: slidesExplicitlySet
|
|
306
|
+
? program.opts().slides
|
|
307
|
+
: (slidesConfig?.enabled ?? program.opts().slides),
|
|
308
|
+
slidesOcr: slidesOcrExplicitlySet
|
|
309
|
+
? program.opts().slidesOcr
|
|
310
|
+
: (slidesConfig?.ocr ?? program.opts().slidesOcr),
|
|
311
|
+
slidesDir: slidesDirExplicitlySet
|
|
312
|
+
? program.opts().slidesDir
|
|
313
|
+
: (slidesConfig?.dir ?? program.opts().slidesDir),
|
|
314
|
+
slidesSceneThreshold: slidesSceneThresholdExplicitlySet
|
|
315
|
+
? program.opts().slidesSceneThreshold
|
|
316
|
+
: (slidesConfig?.sceneThreshold ?? program.opts().slidesSceneThreshold),
|
|
317
|
+
slidesSceneThresholdExplicit: slidesSceneThresholdExplicitlySet || typeof slidesConfig?.sceneThreshold === 'number',
|
|
318
|
+
slidesMax: slidesMaxExplicitlySet
|
|
319
|
+
? program.opts().slidesMax
|
|
320
|
+
: (slidesConfig?.max ?? program.opts().slidesMax),
|
|
321
|
+
slidesMinDuration: slidesMinDurationExplicitlySet
|
|
322
|
+
? program.opts().slidesMinDuration
|
|
323
|
+
: (slidesConfig?.minDuration ?? program.opts().slidesMinDuration),
|
|
324
|
+
cwd: process.cwd(),
|
|
325
|
+
});
|
|
326
|
+
if (slidesSettings && inputTarget.kind !== 'url') {
|
|
327
|
+
throw new Error('--slides is only supported for URL inputs');
|
|
328
|
+
}
|
|
329
|
+
const transcriptTimestamps = Boolean(program.opts().timestamps) || Boolean(slidesSettings);
|
|
234
330
|
const lengthInstruction = promptOverride && lengthExplicitlySet && lengthArg.kind === 'chars'
|
|
235
331
|
? `Output is ${lengthArg.maxCharacters.toLocaleString()} characters.`
|
|
236
332
|
: null;
|
|
@@ -241,11 +337,15 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
|
|
|
241
337
|
const cacheState = await createCacheStateFromConfig({
|
|
242
338
|
envForRun,
|
|
243
339
|
config,
|
|
244
|
-
noCacheFlag,
|
|
340
|
+
noCacheFlag: false,
|
|
245
341
|
transcriptNamespace,
|
|
246
342
|
});
|
|
343
|
+
const mediaCache = await createMediaCacheFromConfig({
|
|
344
|
+
envForRun,
|
|
345
|
+
config,
|
|
346
|
+
noMediaCacheFlag,
|
|
347
|
+
});
|
|
247
348
|
try {
|
|
248
|
-
const { apiKey, openrouterApiKey, openrouterConfigured, openaiTranscriptionKey, xaiApiKey, googleApiKey, anthropicApiKey, zaiApiKey, zaiBaseUrl, providerBaseUrls, firecrawlApiKey, firecrawlConfigured, googleConfigured, anthropicConfigured, apifyToken, ytDlpPath, falApiKey, cliAvailability, envForAuto, } = resolveEnvState({ env, envForRun, configForCli });
|
|
249
349
|
if (markdownModeExplicitlySet && format !== 'markdown') {
|
|
250
350
|
throw new Error('--markdown-mode is only supported with --format md');
|
|
251
351
|
}
|
|
@@ -266,6 +366,13 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
|
|
|
266
366
|
explicitModelArg,
|
|
267
367
|
});
|
|
268
368
|
const verboseColor = supportsColor(stderr, envForRun);
|
|
369
|
+
const themeForStderr = createThemeRenderer({
|
|
370
|
+
themeName,
|
|
371
|
+
enabled: verboseColor,
|
|
372
|
+
trueColor: resolveTrueColor(envForRun),
|
|
373
|
+
});
|
|
374
|
+
const renderSpinnerStatus = (label, detail = '…') => `${themeForStderr.label(label)}${themeForStderr.dim(detail)}`;
|
|
375
|
+
const renderSpinnerStatusWithModel = (label, modelId) => `${themeForStderr.label(label)}${themeForStderr.dim(' (model: ')}${themeForStderr.accent(modelId)}${themeForStderr.dim(')…')}`;
|
|
269
376
|
const { streamingEnabled } = resolveStreamSettings({
|
|
270
377
|
streamMode,
|
|
271
378
|
stdout,
|
|
@@ -279,7 +386,7 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
|
|
|
279
386
|
// streaming output), we stop + clear progress via the progress gate to keep scrollback clean.
|
|
280
387
|
const progressEnabled = isRichTty(stderr) && !verbose && !json;
|
|
281
388
|
const progressGate = createProgressGate();
|
|
282
|
-
const { clearProgressForStdout, setClearProgressBeforeStdout, clearProgressIfCurrent } = progressGate;
|
|
389
|
+
const { clearProgressForStdout, restoreProgressAfterStdout, setClearProgressBeforeStdout, clearProgressIfCurrent, } = progressGate;
|
|
283
390
|
const fixedModelSpec = requestedModel.kind === 'fixed' ? requestedModel : null;
|
|
284
391
|
const desiredOutputTokens = resolveDesiredOutputTokens({ lengthArg, maxOutputTokensArg });
|
|
285
392
|
const summaryEngine = createSummaryEngine({
|
|
@@ -302,6 +409,7 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
|
|
|
302
409
|
resolveMaxInputTokensForCall,
|
|
303
410
|
llmCalls,
|
|
304
411
|
clearProgressForStdout,
|
|
412
|
+
restoreProgressAfterStdout,
|
|
305
413
|
apiKeys: {
|
|
306
414
|
xaiApiKey,
|
|
307
415
|
openaiApiKey: apiKey,
|
|
@@ -329,7 +437,8 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
|
|
|
329
437
|
if (filtered.length === 0)
|
|
330
438
|
return;
|
|
331
439
|
clearProgressForStdout();
|
|
332
|
-
stderr.write(`${
|
|
440
|
+
stderr.write(`${themeForStderr.dim(`via ${filtered.join(', ')}`)}\n`);
|
|
441
|
+
restoreProgressAfterStdout?.();
|
|
333
442
|
};
|
|
334
443
|
const assetSummaryContext = {
|
|
335
444
|
env,
|
|
@@ -340,7 +449,9 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
|
|
|
340
449
|
timeoutMs,
|
|
341
450
|
preprocessMode,
|
|
342
451
|
format,
|
|
452
|
+
extractMode,
|
|
343
453
|
lengthArg,
|
|
454
|
+
forceSummary,
|
|
344
455
|
outputLanguage,
|
|
345
456
|
videoMode,
|
|
346
457
|
fixedModelSpec,
|
|
@@ -371,11 +482,14 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
|
|
|
371
482
|
trackedFetch,
|
|
372
483
|
writeViaFooter,
|
|
373
484
|
clearProgressForStdout,
|
|
485
|
+
restoreProgressAfterStdout,
|
|
374
486
|
getLiteLlmCatalog,
|
|
375
487
|
buildReport,
|
|
376
488
|
estimateCostUsd,
|
|
377
489
|
llmCalls,
|
|
378
490
|
cache: cacheState,
|
|
491
|
+
summaryCacheBypass: noCacheFlag,
|
|
492
|
+
mediaCache,
|
|
379
493
|
apiStatus: {
|
|
380
494
|
xaiApiKey,
|
|
381
495
|
apiKey,
|
|
@@ -390,20 +504,86 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
|
|
|
390
504
|
},
|
|
391
505
|
};
|
|
392
506
|
const summarizeAsset = (args) => summarizeAssetFlow(assetSummaryContext, args);
|
|
507
|
+
const summarizeMediaFile = (args) => summarizeMediaFileImpl(assetSummaryContext, args);
|
|
393
508
|
const assetInputContext = {
|
|
394
509
|
env,
|
|
510
|
+
envForRun,
|
|
395
511
|
stderr,
|
|
396
512
|
progressEnabled,
|
|
397
513
|
timeoutMs,
|
|
398
514
|
trackedFetch,
|
|
399
515
|
summarizeAsset,
|
|
516
|
+
summarizeMediaFile,
|
|
400
517
|
setClearProgressBeforeStdout,
|
|
401
518
|
clearProgressIfCurrent,
|
|
402
519
|
};
|
|
403
520
|
if (await handleFileInput(assetInputContext, inputTarget)) {
|
|
404
521
|
return;
|
|
405
522
|
}
|
|
406
|
-
if (url &&
|
|
523
|
+
if (url &&
|
|
524
|
+
(await withUrlAsset(assetInputContext, url, isYoutubeUrl, async ({ loaded, spinner }) => {
|
|
525
|
+
if (extractMode) {
|
|
526
|
+
if (progressEnabled)
|
|
527
|
+
spinner.setText(renderSpinnerStatus('Extracting text'));
|
|
528
|
+
const extracted = await extractAssetContent({
|
|
529
|
+
ctx: {
|
|
530
|
+
env,
|
|
531
|
+
envForRun,
|
|
532
|
+
execFileImpl,
|
|
533
|
+
timeoutMs,
|
|
534
|
+
preprocessMode,
|
|
535
|
+
},
|
|
536
|
+
attachment: loaded.attachment,
|
|
537
|
+
});
|
|
538
|
+
await outputExtractedAsset({
|
|
539
|
+
io: { env, envForRun, stdout, stderr },
|
|
540
|
+
flags: {
|
|
541
|
+
timeoutMs,
|
|
542
|
+
preprocessMode,
|
|
543
|
+
format,
|
|
544
|
+
plain,
|
|
545
|
+
json,
|
|
546
|
+
metricsEnabled,
|
|
547
|
+
metricsDetailed,
|
|
548
|
+
shouldComputeReport,
|
|
549
|
+
runStartedAtMs,
|
|
550
|
+
verboseColor,
|
|
551
|
+
},
|
|
552
|
+
hooks: {
|
|
553
|
+
clearProgressForStdout,
|
|
554
|
+
restoreProgressAfterStdout,
|
|
555
|
+
buildReport,
|
|
556
|
+
estimateCostUsd,
|
|
557
|
+
},
|
|
558
|
+
url,
|
|
559
|
+
sourceLabel: loaded.sourceLabel,
|
|
560
|
+
attachment: loaded.attachment,
|
|
561
|
+
extracted,
|
|
562
|
+
apiStatus: {
|
|
563
|
+
xaiApiKey,
|
|
564
|
+
apiKey,
|
|
565
|
+
openrouterApiKey,
|
|
566
|
+
apifyToken,
|
|
567
|
+
firecrawlConfigured,
|
|
568
|
+
googleConfigured,
|
|
569
|
+
anthropicConfigured,
|
|
570
|
+
},
|
|
571
|
+
});
|
|
572
|
+
return;
|
|
573
|
+
}
|
|
574
|
+
if (progressEnabled)
|
|
575
|
+
spinner.setText(renderSpinnerStatus('Summarizing'));
|
|
576
|
+
await summarizeAsset({
|
|
577
|
+
sourceKind: 'asset-url',
|
|
578
|
+
sourceLabel: loaded.sourceLabel,
|
|
579
|
+
attachment: loaded.attachment,
|
|
580
|
+
onModelChosen: (modelId) => {
|
|
581
|
+
if (!progressEnabled)
|
|
582
|
+
return;
|
|
583
|
+
spinner.setText(renderSpinnerStatusWithModel('Summarizing', modelId));
|
|
584
|
+
},
|
|
585
|
+
});
|
|
586
|
+
}))) {
|
|
407
587
|
return;
|
|
408
588
|
}
|
|
409
589
|
if (!url) {
|
|
@@ -420,7 +600,7 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
|
|
|
420
600
|
},
|
|
421
601
|
flags: {
|
|
422
602
|
timeoutMs,
|
|
423
|
-
maxExtractCharacters: null,
|
|
603
|
+
maxExtractCharacters: extractMode ? maxExtractCharacters : null,
|
|
424
604
|
retries,
|
|
425
605
|
format,
|
|
426
606
|
markdownMode,
|
|
@@ -428,11 +608,14 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
|
|
|
428
608
|
youtubeMode,
|
|
429
609
|
firecrawlMode: requestedFirecrawlMode,
|
|
430
610
|
videoMode,
|
|
611
|
+
transcriptTimestamps,
|
|
431
612
|
outputLanguage,
|
|
432
613
|
lengthArg,
|
|
614
|
+
forceSummary,
|
|
433
615
|
promptOverride,
|
|
434
616
|
lengthInstruction,
|
|
435
617
|
languageInstruction,
|
|
618
|
+
summaryCacheBypass: noCacheFlag,
|
|
436
619
|
maxOutputTokensArg,
|
|
437
620
|
json,
|
|
438
621
|
extractMode,
|
|
@@ -443,10 +626,14 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
|
|
|
443
626
|
verbose,
|
|
444
627
|
verboseColor,
|
|
445
628
|
progressEnabled,
|
|
629
|
+
streamMode,
|
|
446
630
|
streamingEnabled,
|
|
447
631
|
plain,
|
|
448
632
|
configPath,
|
|
449
633
|
configModelLabel,
|
|
634
|
+
slides: slidesSettings,
|
|
635
|
+
slidesDebug,
|
|
636
|
+
slidesOutput: true,
|
|
450
637
|
},
|
|
451
638
|
model: {
|
|
452
639
|
requestedModel,
|
|
@@ -486,19 +673,25 @@ export async function runCli(argv, { env, fetch, execFile: execFileOverride, std
|
|
|
486
673
|
llmCalls,
|
|
487
674
|
},
|
|
488
675
|
cache: cacheState,
|
|
676
|
+
mediaCache,
|
|
489
677
|
hooks: {
|
|
490
678
|
onModelChosen: null,
|
|
491
679
|
onExtracted: null,
|
|
680
|
+
onSlidesExtracted: null,
|
|
681
|
+
onSlidesProgress: null,
|
|
492
682
|
onLinkPreviewProgress: null,
|
|
493
683
|
onSummaryCached: null,
|
|
494
684
|
setTranscriptionCost,
|
|
495
685
|
summarizeAsset,
|
|
496
686
|
writeViaFooter,
|
|
497
687
|
clearProgressForStdout,
|
|
688
|
+
restoreProgressAfterStdout,
|
|
498
689
|
setClearProgressBeforeStdout,
|
|
499
690
|
clearProgressIfCurrent,
|
|
500
691
|
buildReport,
|
|
501
692
|
estimateCostUsd,
|
|
693
|
+
onSlideChunk: undefined,
|
|
694
|
+
onSlidesDone: null,
|
|
502
695
|
},
|
|
503
696
|
};
|
|
504
697
|
await runUrlFlow({ ctx: urlFlowContext, url, isYoutubeUrl });
|