@steipete/summarize 0.11.0 → 0.12.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 +44 -1
- package/README.md +63 -17
- package/dist/cli.js +1 -1
- package/dist/esm/cache-keys.js +75 -0
- package/dist/esm/cache-keys.js.map +1 -0
- package/dist/esm/cache-slides-cleanup.js +47 -0
- package/dist/esm/cache-slides-cleanup.js.map +1 -0
- package/dist/esm/cache.js +14 -91
- package/dist/esm/cache.js.map +1 -1
- package/dist/esm/config/env.js +49 -0
- package/dist/esm/config/env.js.map +1 -0
- package/dist/esm/config/model.js +193 -0
- package/dist/esm/config/model.js.map +1 -0
- package/dist/esm/config/parse-helpers.js +50 -0
- package/dist/esm/config/parse-helpers.js.map +1 -0
- package/dist/esm/config/read.js +83 -0
- package/dist/esm/config/read.js.map +1 -0
- package/dist/esm/config/sections.js +438 -0
- package/dist/esm/config/sections.js.map +1 -0
- package/dist/esm/config/types.js +2 -0
- package/dist/esm/config/types.js.map +1 -0
- package/dist/esm/config.js +24 -807
- package/dist/esm/config.js.map +1 -1
- package/dist/esm/content/asset.js +2 -2
- package/dist/esm/content/asset.js.map +1 -1
- package/dist/esm/daemon/agent-model.js +235 -0
- package/dist/esm/daemon/agent-model.js.map +1 -0
- package/dist/esm/daemon/agent-request.js +87 -0
- package/dist/esm/daemon/agent-request.js.map +1 -0
- package/dist/esm/daemon/agent.js +42 -243
- package/dist/esm/daemon/agent.js.map +1 -1
- package/dist/esm/daemon/chat.js +69 -8
- package/dist/esm/daemon/chat.js.map +1 -1
- package/dist/esm/daemon/cli.js +21 -4
- package/dist/esm/daemon/cli.js.map +1 -1
- package/dist/esm/daemon/config.js +65 -9
- package/dist/esm/daemon/config.js.map +1 -1
- package/dist/esm/daemon/env-snapshot.js +4 -0
- package/dist/esm/daemon/env-snapshot.js.map +1 -1
- package/dist/esm/daemon/flow-context.js +8 -1
- package/dist/esm/daemon/flow-context.js.map +1 -1
- package/dist/esm/daemon/models.js +16 -0
- package/dist/esm/daemon/models.js.map +1 -1
- package/dist/esm/daemon/process-registry.js.map +1 -1
- package/dist/esm/daemon/server-admin-routes.js +134 -0
- package/dist/esm/daemon/server-admin-routes.js.map +1 -0
- package/dist/esm/daemon/server-agent-route.js +104 -0
- package/dist/esm/daemon/server-agent-route.js.map +1 -0
- package/dist/esm/daemon/server-http.js +89 -0
- package/dist/esm/daemon/server-http.js.map +1 -0
- package/dist/esm/daemon/server-session-routes.js +209 -0
- package/dist/esm/daemon/server-session-routes.js.map +1 -0
- package/dist/esm/daemon/server-session.js +118 -0
- package/dist/esm/daemon/server-session.js.map +1 -0
- package/dist/esm/daemon/server-sse.js +28 -0
- package/dist/esm/daemon/server-sse.js.map +1 -0
- package/dist/esm/daemon/server-summarize-execution.js +357 -0
- package/dist/esm/daemon/server-summarize-execution.js.map +1 -0
- package/dist/esm/daemon/server-summarize-request.js +119 -0
- package/dist/esm/daemon/server-summarize-request.js.map +1 -0
- package/dist/esm/daemon/server.js +72 -1121
- package/dist/esm/daemon/server.js.map +1 -1
- package/dist/esm/daemon/summarize-progress.js +1 -1
- package/dist/esm/daemon/summarize-progress.js.map +1 -1
- package/dist/esm/daemon/summarize.js.map +1 -1
- package/dist/esm/llm/cli-exec.js +75 -0
- package/dist/esm/llm/cli-exec.js.map +1 -0
- package/dist/esm/llm/cli-provider-output.js +191 -0
- package/dist/esm/llm/cli-provider-output.js.map +1 -0
- package/dist/esm/llm/cli.js +3 -212
- package/dist/esm/llm/cli.js.map +1 -1
- package/dist/esm/llm/generate-text-document.js +109 -0
- package/dist/esm/llm/generate-text-document.js.map +1 -0
- package/dist/esm/llm/generate-text-shared.js +102 -0
- package/dist/esm/llm/generate-text-shared.js.map +1 -0
- package/dist/esm/llm/generate-text-stream.js +258 -0
- package/dist/esm/llm/generate-text-stream.js.map +1 -0
- package/dist/esm/llm/generate-text.js +145 -480
- package/dist/esm/llm/generate-text.js.map +1 -1
- package/dist/esm/llm/model-id.js +21 -20
- package/dist/esm/llm/model-id.js.map +1 -1
- package/dist/esm/llm/provider-capabilities.js +2 -0
- package/dist/esm/llm/provider-capabilities.js.map +1 -0
- package/dist/esm/llm/provider-profile.js +142 -0
- package/dist/esm/llm/provider-profile.js.map +1 -0
- package/dist/esm/llm/providers/google.js +42 -5
- package/dist/esm/llm/providers/google.js.map +1 -1
- package/dist/esm/llm/providers/models.js +13 -0
- package/dist/esm/llm/providers/models.js.map +1 -1
- package/dist/esm/llm/providers/openai.js.map +1 -1
- package/dist/esm/llm/transcript-to-markdown.js.map +1 -1
- package/dist/esm/model-auto-cli.js +89 -0
- package/dist/esm/model-auto-cli.js.map +1 -0
- package/dist/esm/model-auto-rules.js +86 -0
- package/dist/esm/model-auto-rules.js.map +1 -0
- package/dist/esm/model-auto.js +10 -245
- package/dist/esm/model-auto.js.map +1 -1
- package/dist/esm/model-spec.js +23 -17
- package/dist/esm/model-spec.js.map +1 -1
- package/dist/esm/refresh-free.js +1 -1
- package/dist/esm/refresh-free.js.map +1 -1
- package/dist/esm/run/attachments.js +1 -1
- package/dist/esm/run/attachments.js.map +1 -1
- package/dist/esm/run/bird/exec.js +23 -0
- package/dist/esm/run/bird/exec.js.map +1 -0
- package/dist/esm/run/bird/media.js +171 -0
- package/dist/esm/run/bird/media.js.map +1 -0
- package/dist/esm/run/bird/parse.js +82 -0
- package/dist/esm/run/bird/parse.js.map +1 -0
- package/dist/esm/run/bird/types.js +2 -0
- package/dist/esm/run/bird/types.js.map +1 -0
- package/dist/esm/run/bird.js +86 -144
- package/dist/esm/run/bird.js.map +1 -1
- package/dist/esm/run/cache-state.js.map +1 -1
- package/dist/esm/run/constants.js +2 -1
- package/dist/esm/run/constants.js.map +1 -1
- package/dist/esm/run/env.js +3 -0
- package/dist/esm/run/env.js.map +1 -1
- package/dist/esm/run/finish-line-labels.js +76 -0
- package/dist/esm/run/finish-line-labels.js.map +1 -0
- package/dist/esm/run/finish-line-lengths.js +96 -0
- package/dist/esm/run/finish-line-lengths.js.map +1 -0
- package/dist/esm/run/finish-line.js +3 -169
- package/dist/esm/run/finish-line.js.map +1 -1
- package/dist/esm/run/flows/asset/extract.js.map +1 -1
- package/dist/esm/run/flows/asset/input.js +1 -1
- package/dist/esm/run/flows/asset/input.js.map +1 -1
- package/dist/esm/run/flows/asset/media.js +19 -10
- package/dist/esm/run/flows/asset/media.js.map +1 -1
- package/dist/esm/run/flows/asset/output.js.map +1 -1
- package/dist/esm/run/flows/asset/preprocess.js.map +1 -1
- package/dist/esm/run/flows/asset/summary-attempts.js +109 -0
- package/dist/esm/run/flows/asset/summary-attempts.js.map +1 -0
- package/dist/esm/run/flows/asset/summary.js +19 -107
- package/dist/esm/run/flows/asset/summary.js.map +1 -1
- package/dist/esm/run/flows/url/extract.js +7 -4
- package/dist/esm/run/flows/url/extract.js.map +1 -1
- package/dist/esm/run/flows/url/flow-progress.js +119 -0
- package/dist/esm/run/flows/url/flow-progress.js.map +1 -0
- package/dist/esm/run/flows/url/flow.js +22 -93
- package/dist/esm/run/flows/url/flow.js.map +1 -1
- package/dist/esm/run/flows/url/markdown.js +21 -3
- package/dist/esm/run/flows/url/markdown.js.map +1 -1
- package/dist/esm/run/flows/url/progress-status.js +56 -0
- package/dist/esm/run/flows/url/progress-status.js.map +1 -0
- package/dist/esm/run/flows/url/slides-output-render.js +78 -0
- package/dist/esm/run/flows/url/slides-output-render.js.map +1 -0
- package/dist/esm/run/flows/url/slides-output-state.js +86 -0
- package/dist/esm/run/flows/url/slides-output-state.js.map +1 -0
- package/dist/esm/run/flows/url/slides-output-stream.js +271 -0
- package/dist/esm/run/flows/url/slides-output-stream.js.map +1 -0
- package/dist/esm/run/flows/url/slides-output.js +29 -422
- package/dist/esm/run/flows/url/slides-output.js.map +1 -1
- package/dist/esm/run/flows/url/slides-text-markdown.js +431 -0
- package/dist/esm/run/flows/url/slides-text-markdown.js.map +1 -0
- package/dist/esm/run/flows/url/slides-text-transcript.js +199 -0
- package/dist/esm/run/flows/url/slides-text-transcript.js.map +1 -0
- package/dist/esm/run/flows/url/slides-text-types.js +2 -0
- package/dist/esm/run/flows/url/slides-text-types.js.map +1 -0
- package/dist/esm/run/flows/url/slides-text.js +2 -627
- package/dist/esm/run/flows/url/slides-text.js.map +1 -1
- package/dist/esm/run/flows/url/summary-finish.js +34 -0
- package/dist/esm/run/flows/url/summary-finish.js.map +1 -0
- package/dist/esm/run/flows/url/summary-json.js +32 -0
- package/dist/esm/run/flows/url/summary-json.js.map +1 -0
- package/dist/esm/run/flows/url/summary-prompt.js +147 -0
- package/dist/esm/run/flows/url/summary-prompt.js.map +1 -0
- package/dist/esm/run/flows/url/summary-resolution.js +320 -0
- package/dist/esm/run/flows/url/summary-resolution.js.map +1 -0
- package/dist/esm/run/flows/url/summary-timestamps.js +136 -0
- package/dist/esm/run/flows/url/summary-timestamps.js.map +1 -0
- package/dist/esm/run/flows/url/summary.js +49 -543
- package/dist/esm/run/flows/url/summary.js.map +1 -1
- package/dist/esm/run/help.js +9 -3
- package/dist/esm/run/help.js.map +1 -1
- package/dist/esm/run/markdown-transforms.js +89 -0
- package/dist/esm/run/markdown-transforms.js.map +1 -0
- package/dist/esm/run/markdown.js +1 -96
- package/dist/esm/run/markdown.js.map +1 -1
- package/dist/esm/run/run-env.js +28 -7
- package/dist/esm/run/run-env.js.map +1 -1
- package/dist/esm/run/run-settings-parse.js +73 -0
- package/dist/esm/run/run-settings-parse.js.map +1 -0
- package/dist/esm/run/run-settings.js +1 -72
- package/dist/esm/run/run-settings.js.map +1 -1
- package/dist/esm/run/runner-contexts.js +116 -0
- package/dist/esm/run/runner-contexts.js.map +1 -0
- package/dist/esm/run/runner-execution.js +62 -0
- package/dist/esm/run/runner-execution.js.map +1 -0
- package/dist/esm/run/runner-flags.js +97 -0
- package/dist/esm/run/runner-flags.js.map +1 -0
- package/dist/esm/run/runner-setup.js +109 -0
- package/dist/esm/run/runner-setup.js.map +1 -0
- package/dist/esm/run/runner-slides.js +38 -0
- package/dist/esm/run/runner-slides.js.map +1 -0
- package/dist/esm/run/runner.js +99 -390
- package/dist/esm/run/runner.js.map +1 -1
- package/dist/esm/run/slides-render.js +5 -2
- package/dist/esm/run/slides-render.js.map +1 -1
- package/dist/esm/run/stdin-temp-file.js +1 -1
- package/dist/esm/run/stdin-temp-file.js.map +1 -1
- package/dist/esm/run/streaming.js +1 -0
- package/dist/esm/run/streaming.js.map +1 -1
- package/dist/esm/run/summary-engine.js +26 -10
- package/dist/esm/run/summary-engine.js.map +1 -1
- package/dist/esm/run/summary-llm.js +2 -1
- package/dist/esm/run/summary-llm.js.map +1 -1
- package/dist/esm/run/terminal.js +4 -1
- package/dist/esm/run/terminal.js.map +1 -1
- package/dist/esm/run/transcriber-cli.js +1 -1
- package/dist/esm/run/transcriber-cli.js.map +1 -1
- package/dist/esm/slides/download.js +242 -0
- package/dist/esm/slides/download.js.map +1 -0
- package/dist/esm/slides/extract-finalize.js +98 -0
- package/dist/esm/slides/extract-finalize.js.map +1 -0
- package/dist/esm/slides/extract.js +64 -1621
- package/dist/esm/slides/extract.js.map +1 -1
- package/dist/esm/slides/frame-extraction.js +372 -0
- package/dist/esm/slides/frame-extraction.js.map +1 -0
- package/dist/esm/slides/ingest.js +167 -0
- package/dist/esm/slides/ingest.js.map +1 -0
- package/dist/esm/slides/ocr.js +91 -0
- package/dist/esm/slides/ocr.js.map +1 -0
- package/dist/esm/slides/process.js +218 -0
- package/dist/esm/slides/process.js.map +1 -0
- package/dist/esm/slides/scene-detection.js +387 -0
- package/dist/esm/slides/scene-detection.js.map +1 -0
- package/dist/esm/slides/source-id.js +42 -0
- package/dist/esm/slides/source-id.js.map +1 -0
- package/dist/esm/tty/progress/fetch-html.js.map +1 -1
- package/dist/esm/tty/progress/transcript.js +21 -8
- package/dist/esm/tty/progress/transcript.js.map +1 -1
- package/dist/esm/tty/spinner.js +8 -2
- package/dist/esm/tty/spinner.js.map +1 -1
- package/dist/esm/tty/website-progress.js +5 -3
- package/dist/esm/tty/website-progress.js.map +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/types/cache-keys.d.ts +44 -0
- package/dist/types/cache-slides-cleanup.d.ts +1 -0
- package/dist/types/cache.d.ts +1 -9
- package/dist/types/config/env.d.ts +6 -0
- package/dist/types/config/model.d.ts +3 -0
- package/dist/types/config/parse-helpers.d.ts +7 -0
- package/dist/types/config/read.d.ts +2 -0
- package/dist/types/config/sections.d.ts +33 -0
- package/dist/types/config/types.d.ts +230 -0
- package/dist/types/config.d.ts +3 -209
- package/dist/types/costs.d.ts +1 -1
- package/dist/types/daemon/agent-model.d.ts +40 -0
- package/dist/types/daemon/agent-request.d.ts +14 -0
- package/dist/types/daemon/chat.d.ts +3 -1
- package/dist/types/daemon/config.d.ts +13 -2
- package/dist/types/daemon/env-snapshot.d.ts +1 -1
- package/dist/types/daemon/flow-context.d.ts +1 -1
- package/dist/types/daemon/models.d.ts +1 -0
- package/dist/types/daemon/server-admin-routes.d.ts +22 -0
- package/dist/types/daemon/server-agent-route.d.ts +9 -0
- package/dist/types/daemon/server-http.d.ts +10 -0
- package/dist/types/daemon/server-session-routes.d.ts +11 -0
- package/dist/types/daemon/server-session.d.ts +52 -0
- package/dist/types/daemon/server-sse.d.ts +12 -0
- package/dist/types/daemon/server-summarize-execution.d.ts +70 -0
- package/dist/types/daemon/server-summarize-request.d.ts +36 -0
- package/dist/types/daemon/server.d.ts +3 -4
- package/dist/types/daemon/summarize.d.ts +1 -1
- package/dist/types/llm/cli-exec.d.ts +13 -0
- package/dist/types/llm/cli-provider-output.d.ts +16 -0
- package/dist/types/llm/generate-text-document.d.ts +34 -0
- package/dist/types/llm/generate-text-shared.d.ts +25 -0
- package/dist/types/llm/generate-text-stream.d.ts +26 -0
- package/dist/types/llm/generate-text.d.ts +6 -26
- package/dist/types/llm/html-to-markdown.d.ts +1 -1
- package/dist/types/llm/model-id.d.ts +1 -1
- package/dist/types/llm/provider-capabilities.d.ts +2 -0
- package/dist/types/llm/provider-profile.d.ts +31 -0
- package/dist/types/llm/providers/google.d.ts +6 -0
- package/dist/types/llm/providers/models.d.ts +5 -0
- package/dist/types/llm/transcript-to-markdown.d.ts +1 -1
- package/dist/types/model-auto-cli.d.ts +15 -0
- package/dist/types/model-auto-rules.d.ts +7 -0
- package/dist/types/model-auto.d.ts +5 -7
- package/dist/types/model-spec.d.ts +2 -2
- package/dist/types/run/attachments.d.ts +2 -2
- package/dist/types/run/bird/exec.d.ts +1 -0
- package/dist/types/run/bird/media.d.ts +3 -0
- package/dist/types/run/bird/parse.d.ts +3 -0
- package/dist/types/run/bird/types.d.ts +18 -0
- package/dist/types/run/bird.d.ts +12 -17
- package/dist/types/run/cache-state.d.ts +1 -1
- package/dist/types/run/constants.d.ts +2 -1
- package/dist/types/run/env.d.ts +1 -0
- package/dist/types/run/finish-line-labels.d.ts +29 -0
- package/dist/types/run/finish-line-lengths.d.ts +23 -0
- package/dist/types/run/finish-line.d.ts +2 -52
- package/dist/types/run/flows/asset/extract.d.ts +1 -1
- package/dist/types/run/flows/asset/input.d.ts +1 -1
- package/dist/types/run/flows/asset/preprocess.d.ts +1 -1
- package/dist/types/run/flows/asset/summary-attempts.d.ts +24 -0
- package/dist/types/run/flows/asset/summary.d.ts +6 -2
- package/dist/types/run/flows/url/flow-progress.d.ts +41 -0
- package/dist/types/run/flows/url/markdown.d.ts +2 -2
- package/dist/types/run/flows/url/progress-status.d.ts +16 -0
- package/dist/types/run/flows/url/slides-output-render.d.ts +43 -0
- package/dist/types/run/flows/url/slides-output-state.d.ts +21 -0
- package/dist/types/run/flows/url/slides-output-stream.d.ts +18 -0
- package/dist/types/run/flows/url/slides-output.d.ts +2 -17
- package/dist/types/run/flows/url/slides-text-markdown.d.ts +46 -0
- package/dist/types/run/flows/url/slides-text-transcript.d.ts +36 -0
- package/dist/types/run/flows/url/slides-text-types.d.ts +8 -0
- package/dist/types/run/flows/url/slides-text.d.ts +3 -87
- package/dist/types/run/flows/url/summary-finish.d.ts +16 -0
- package/dist/types/run/flows/url/summary-json.d.ts +51 -0
- package/dist/types/run/flows/url/summary-prompt.d.ts +22 -0
- package/dist/types/run/flows/url/summary-resolution.d.ts +31 -0
- package/dist/types/run/flows/url/summary-timestamps.d.ts +11 -0
- package/dist/types/run/flows/url/types.d.ts +4 -0
- package/dist/types/run/markdown-transforms.d.ts +3 -0
- package/dist/types/run/run-context.d.ts +4 -0
- package/dist/types/run/run-env.d.ts +4 -0
- package/dist/types/run/run-settings-parse.d.ts +5 -0
- package/dist/types/run/runner-contexts.d.ts +62 -0
- package/dist/types/run/runner-execution.d.ts +57 -0
- package/dist/types/run/runner-flags.d.ts +41 -0
- package/dist/types/run/runner-setup.d.ts +21 -0
- package/dist/types/run/runner-slides.d.ts +8 -0
- package/dist/types/run/streaming.d.ts +1 -1
- package/dist/types/run/summary-engine.d.ts +8 -4
- package/dist/types/run/summary-llm.d.ts +4 -3
- package/dist/types/run/terminal.d.ts +2 -0
- package/dist/types/run/types.d.ts +2 -2
- package/dist/types/slides/download.d.ts +29 -0
- package/dist/types/slides/extract-finalize.d.ts +57 -0
- package/dist/types/slides/extract.d.ts +1 -7
- package/dist/types/slides/frame-extraction.d.ts +38 -0
- package/dist/types/slides/ingest.d.ts +47 -0
- package/dist/types/slides/ocr.d.ts +5 -0
- package/dist/types/slides/process.d.ts +22 -0
- package/dist/types/slides/scene-detection.d.ts +75 -0
- package/dist/types/slides/source-id.d.ts +2 -0
- package/dist/types/version.d.ts +1 -1
- package/docs/_config.yml +1 -0
- package/docs/agent.md +3 -2
- package/docs/assets/site.css +134 -2
- package/docs/cache.md +2 -1
- package/docs/chrome-extension.md +12 -4
- package/docs/cli.md +2 -2
- package/docs/config.md +11 -4
- package/docs/index.html +5 -0
- package/docs/llm.md +5 -2
- package/docs/manual-tests.md +3 -0
- package/docs/media.md +3 -1
- package/docs/model-auto.md +2 -2
- package/docs/model-provider-resolution.md +57 -0
- package/docs/site/index.html +5 -0
- package/docs/slides-rendering-flow.md +46 -0
- package/docs/slides.md +5 -5
- package/docs/smoketest.md +1 -1
- package/docs/transcript-provider-flow.md +66 -0
- package/docs/website.md +1 -0
- package/docs/youtube.md +4 -2
- package/package.json +34 -41
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export declare function buildYtDlpCookiesArgs(cookiesFromBrowser?: string | null): string[];
|
|
2
|
+
export declare function buildSlidesMediaCacheKey(url: string): string;
|
|
3
|
+
export declare function formatBytes(bytes: number): string;
|
|
4
|
+
export declare function downloadYoutubeVideo(options: {
|
|
5
|
+
ytDlpPath: string;
|
|
6
|
+
url: string;
|
|
7
|
+
timeoutMs: number;
|
|
8
|
+
format: string;
|
|
9
|
+
cookiesFromBrowser?: string | null;
|
|
10
|
+
onProgress?: ((percent: number, detail?: string) => void) | null;
|
|
11
|
+
}): Promise<{
|
|
12
|
+
filePath: string;
|
|
13
|
+
cleanup: () => Promise<void>;
|
|
14
|
+
}>;
|
|
15
|
+
export declare function downloadRemoteVideo(options: {
|
|
16
|
+
url: string;
|
|
17
|
+
timeoutMs: number;
|
|
18
|
+
onProgress?: ((percent: number, detail?: string) => void) | null;
|
|
19
|
+
}): Promise<{
|
|
20
|
+
filePath: string;
|
|
21
|
+
cleanup: () => Promise<void>;
|
|
22
|
+
}>;
|
|
23
|
+
export declare function resolveYoutubeStreamUrl(options: {
|
|
24
|
+
ytDlpPath: string;
|
|
25
|
+
url: string;
|
|
26
|
+
timeoutMs: number;
|
|
27
|
+
format: string;
|
|
28
|
+
cookiesFromBrowser?: string | null;
|
|
29
|
+
}): Promise<string>;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { SlideAutoTune, SlideExtractionResult, SlideImage, SlideSource, SlideSourceKind } from "./types.js";
|
|
2
|
+
export declare const SLIDES_PROGRESS: {
|
|
3
|
+
readonly PREPARE: 2;
|
|
4
|
+
readonly FETCH_VIDEO: 6;
|
|
5
|
+
readonly DOWNLOAD_VIDEO: 35;
|
|
6
|
+
readonly DETECT_SCENES: 60;
|
|
7
|
+
readonly EXTRACT_FRAMES: 90;
|
|
8
|
+
readonly OCR: 99;
|
|
9
|
+
readonly FINAL: 100;
|
|
10
|
+
};
|
|
11
|
+
export type SlidesChunkMeta = {
|
|
12
|
+
slidesDir: string;
|
|
13
|
+
sourceUrl: string;
|
|
14
|
+
sourceId: string;
|
|
15
|
+
sourceKind: SlideSourceKind;
|
|
16
|
+
ocrAvailable: boolean;
|
|
17
|
+
};
|
|
18
|
+
export declare function buildSlidesChunkMeta(args: {
|
|
19
|
+
slidesDir: string;
|
|
20
|
+
source: SlideSource;
|
|
21
|
+
ocrAvailable: boolean;
|
|
22
|
+
}): SlidesChunkMeta;
|
|
23
|
+
export declare function buildSlideTimeline(args: {
|
|
24
|
+
source: SlideSource;
|
|
25
|
+
slidesDir: string;
|
|
26
|
+
sceneThreshold: number;
|
|
27
|
+
autoTuneThreshold: boolean;
|
|
28
|
+
autoTune: SlideAutoTune;
|
|
29
|
+
maxSlides: number;
|
|
30
|
+
minSlideDuration: number;
|
|
31
|
+
ocrRequested: boolean;
|
|
32
|
+
ocrAvailable: boolean;
|
|
33
|
+
warnings: string[];
|
|
34
|
+
slides: Array<SlideImage & {
|
|
35
|
+
segment?: unknown;
|
|
36
|
+
}>;
|
|
37
|
+
}): SlideExtractionResult;
|
|
38
|
+
export declare function emitPlaceholderSlides(args: {
|
|
39
|
+
slides: Array<SlideImage & {
|
|
40
|
+
segment?: unknown;
|
|
41
|
+
}>;
|
|
42
|
+
meta: SlidesChunkMeta;
|
|
43
|
+
onSlideChunk?: ((value: {
|
|
44
|
+
slide: SlideImage;
|
|
45
|
+
meta: SlidesChunkMeta;
|
|
46
|
+
}) => void) | null;
|
|
47
|
+
}): void;
|
|
48
|
+
export declare function emitFinalSlides(args: {
|
|
49
|
+
slides: SlideImage[];
|
|
50
|
+
meta: SlidesChunkMeta;
|
|
51
|
+
onSlideChunk?: ((value: {
|
|
52
|
+
slide: SlideImage;
|
|
53
|
+
meta: SlidesChunkMeta;
|
|
54
|
+
}) => void) | null;
|
|
55
|
+
}): void;
|
|
56
|
+
export declare function renameSlidesWithTimestamps(slides: SlideImage[], slidesDir: string): Promise<SlideImage[]>;
|
|
57
|
+
export declare function writeSlidesJson(result: SlideExtractionResult, slidesDir: string): Promise<void>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ExtractedLinkContent, MediaCache } from "../content/index.js";
|
|
2
2
|
import type { SlideSettings } from "./settings.js";
|
|
3
3
|
import type { SlideExtractionResult, SlideImage, SlideSource, SlideSourceKind } from "./types.js";
|
|
4
|
+
export { parseShowinfoTimestamp, resolveExtractedTimestamp } from "./scene-detection.js";
|
|
4
5
|
type ExtractSlidesArgs = {
|
|
5
6
|
source: SlideSource;
|
|
6
7
|
settings: SlideSettings;
|
|
@@ -34,10 +35,3 @@ export declare function resolveSlideSource({ url, extracted, }: {
|
|
|
34
35
|
}): SlideSource | null;
|
|
35
36
|
export declare function resolveSlideSourceFromUrl(url: string): SlideSource | null;
|
|
36
37
|
export declare function extractSlidesForSource({ source, settings, noCache, mediaCache, env, timeoutMs, ytDlpPath, ytDlpCookiesFromBrowser, ffmpegPath, tesseractPath, hooks, }: ExtractSlidesArgs): Promise<SlideExtractionResult>;
|
|
37
|
-
export declare function parseShowinfoTimestamp(line: string): number | null;
|
|
38
|
-
export declare function resolveExtractedTimestamp({ requested, actual, seekBase, }: {
|
|
39
|
-
requested: number;
|
|
40
|
-
actual: number | null;
|
|
41
|
-
seekBase?: number | null;
|
|
42
|
-
}): number;
|
|
43
|
-
export {};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { SlideAutoTune, SlideImage } from "./types.js";
|
|
2
|
+
export declare function detectSlideTimestamps({ ffmpegPath, ffprobePath, inputPath, sceneThreshold, autoTuneThreshold, env, timeoutMs, warnings, workers, sampleCount, onSegmentProgress, logSlides, logSlidesTiming, }: {
|
|
3
|
+
ffmpegPath: string;
|
|
4
|
+
ffprobePath: string | null;
|
|
5
|
+
inputPath: string;
|
|
6
|
+
sceneThreshold: number;
|
|
7
|
+
autoTuneThreshold: boolean;
|
|
8
|
+
env: Record<string, string | undefined>;
|
|
9
|
+
timeoutMs: number;
|
|
10
|
+
warnings: string[];
|
|
11
|
+
workers: number;
|
|
12
|
+
sampleCount: number;
|
|
13
|
+
onSegmentProgress?: ((completed: number, total: number) => void) | null;
|
|
14
|
+
logSlides?: ((message: string) => void) | null;
|
|
15
|
+
logSlidesTiming?: ((label: string, startedAt: number) => number) | null;
|
|
16
|
+
}): Promise<{
|
|
17
|
+
timestamps: number[];
|
|
18
|
+
autoTune: SlideAutoTune;
|
|
19
|
+
durationSeconds: number | null;
|
|
20
|
+
}>;
|
|
21
|
+
export declare function extractFramesAtTimestamps({ ffmpegPath, inputPath, outputDir, timestamps, segments, durationSeconds, timeoutMs, workers, onProgress, onStatus, onSlide, logSlides, logSlidesTiming, }: {
|
|
22
|
+
ffmpegPath: string;
|
|
23
|
+
inputPath: string;
|
|
24
|
+
outputDir: string;
|
|
25
|
+
timestamps: number[];
|
|
26
|
+
segments?: Array<{
|
|
27
|
+
start: number;
|
|
28
|
+
end: number | null;
|
|
29
|
+
} | null>;
|
|
30
|
+
durationSeconds?: number | null;
|
|
31
|
+
timeoutMs: number;
|
|
32
|
+
workers: number;
|
|
33
|
+
onProgress?: ((completed: number, total: number) => void) | null;
|
|
34
|
+
onStatus?: ((text: string) => void) | null;
|
|
35
|
+
onSlide?: ((slide: SlideImage) => void) | null;
|
|
36
|
+
logSlides?: ((message: string) => void) | null;
|
|
37
|
+
logSlidesTiming?: ((label: string, startedAt: number) => number) | null;
|
|
38
|
+
}): Promise<SlideImage[]>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { MediaCache } from "../content/index.js";
|
|
2
|
+
import type { SlideSource } from "./types.js";
|
|
3
|
+
export type SlidesIngestProgress = (label: string, percent: number, detail?: string) => void;
|
|
4
|
+
export declare function prepareSlidesInput({ source, mediaCache, timeoutMs, ytDlpPath, ytDlpCookiesFromBrowser, resolveSlidesYtDlpExtractFormat, resolveSlidesStreamFallback, buildSlidesMediaCacheKey, formatBytes, reportSlidesProgress, logSlidesTiming, downloadYoutubeVideo, downloadRemoteVideo, resolveYoutubeStreamUrl, }: {
|
|
5
|
+
source: SlideSource;
|
|
6
|
+
mediaCache: MediaCache | null;
|
|
7
|
+
timeoutMs: number;
|
|
8
|
+
ytDlpPath: string | null;
|
|
9
|
+
ytDlpCookiesFromBrowser?: string | null;
|
|
10
|
+
resolveSlidesYtDlpExtractFormat: () => string;
|
|
11
|
+
resolveSlidesStreamFallback: () => boolean;
|
|
12
|
+
buildSlidesMediaCacheKey: (url: string) => string;
|
|
13
|
+
formatBytes: (bytes: number) => string;
|
|
14
|
+
reportSlidesProgress?: SlidesIngestProgress | null;
|
|
15
|
+
logSlidesTiming?: ((label: string, startedAt: number) => number) | null;
|
|
16
|
+
downloadYoutubeVideo: (args: {
|
|
17
|
+
ytDlpPath: string;
|
|
18
|
+
url: string;
|
|
19
|
+
timeoutMs: number;
|
|
20
|
+
format: string;
|
|
21
|
+
cookiesFromBrowser?: string | null;
|
|
22
|
+
onProgress?: ((percent: number, detail?: string) => void) | null;
|
|
23
|
+
}) => Promise<{
|
|
24
|
+
filePath: string;
|
|
25
|
+
cleanup: () => Promise<void>;
|
|
26
|
+
}>;
|
|
27
|
+
downloadRemoteVideo: (args: {
|
|
28
|
+
url: string;
|
|
29
|
+
timeoutMs: number;
|
|
30
|
+
onProgress?: ((percent: number, detail?: string) => void) | null;
|
|
31
|
+
}) => Promise<{
|
|
32
|
+
filePath: string;
|
|
33
|
+
cleanup: () => Promise<void>;
|
|
34
|
+
}>;
|
|
35
|
+
resolveYoutubeStreamUrl: (args: {
|
|
36
|
+
ytDlpPath: string;
|
|
37
|
+
url: string;
|
|
38
|
+
timeoutMs: number;
|
|
39
|
+
format: string;
|
|
40
|
+
cookiesFromBrowser?: string | null;
|
|
41
|
+
}) => Promise<string>;
|
|
42
|
+
}): Promise<{
|
|
43
|
+
inputPath: string;
|
|
44
|
+
inputCleanup: (() => Promise<void>) | null;
|
|
45
|
+
cachedMedia: Awaited<ReturnType<NonNullable<MediaCache>["get"]>> | null;
|
|
46
|
+
warnings: string[];
|
|
47
|
+
}>;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { SlideImage } from "./types.js";
|
|
2
|
+
export declare function cleanOcrText(text: string): string;
|
|
3
|
+
export declare function estimateOcrConfidence(text: string): number;
|
|
4
|
+
export declare function runTesseract(tesseractPath: string, imagePath: string): Promise<string>;
|
|
5
|
+
export declare function runOcrOnSlides(slides: SlideImage[], tesseractPath: string, workers: number, onProgress?: ((completed: number, total: number) => void) | null): Promise<SlideImage[]>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ProcessHandle } from "../processes.js";
|
|
2
|
+
export declare function runProcess({ command, args, timeoutMs, errorLabel, onStderrLine, onStdoutLine, }: {
|
|
3
|
+
command: string;
|
|
4
|
+
args: string[];
|
|
5
|
+
timeoutMs: number;
|
|
6
|
+
errorLabel: string;
|
|
7
|
+
onStderrLine?: (line: string, handle: ProcessHandle | null) => void;
|
|
8
|
+
onStdoutLine?: (line: string, handle: ProcessHandle | null) => void;
|
|
9
|
+
}): Promise<void>;
|
|
10
|
+
export declare function runProcessCapture({ command, args, timeoutMs, errorLabel, }: {
|
|
11
|
+
command: string;
|
|
12
|
+
args: string[];
|
|
13
|
+
timeoutMs: number;
|
|
14
|
+
errorLabel: string;
|
|
15
|
+
}): Promise<string>;
|
|
16
|
+
export declare function runProcessCaptureBuffer({ command, args, timeoutMs, errorLabel, }: {
|
|
17
|
+
command: string;
|
|
18
|
+
args: string[];
|
|
19
|
+
timeoutMs: number;
|
|
20
|
+
errorLabel: string;
|
|
21
|
+
}): Promise<Buffer>;
|
|
22
|
+
export declare function runWithConcurrency<T>(tasks: Array<() => Promise<T>>, workers: number, onProgress?: ((completed: number, total: number) => void) | null): Promise<T[]>;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { SlideImage } from "./types.js";
|
|
2
|
+
export type SceneSegment = {
|
|
3
|
+
start: number;
|
|
4
|
+
end: number | null;
|
|
5
|
+
};
|
|
6
|
+
export declare function clamp(value: number, min: number, max: number): number;
|
|
7
|
+
export declare function parseShowinfoTimestamp(line: string): number | null;
|
|
8
|
+
export declare function resolveExtractedTimestamp({ requested, actual, seekBase, }: {
|
|
9
|
+
requested: number;
|
|
10
|
+
actual: number | null;
|
|
11
|
+
seekBase?: number | null;
|
|
12
|
+
}): number;
|
|
13
|
+
export declare function roundThreshold(value: number): number;
|
|
14
|
+
export declare function calibrateSceneThreshold({ ffmpegPath, inputPath, durationSeconds, sampleCount, timeoutMs, logSlides, }: {
|
|
15
|
+
ffmpegPath: string;
|
|
16
|
+
inputPath: string;
|
|
17
|
+
durationSeconds: number | null;
|
|
18
|
+
sampleCount: number;
|
|
19
|
+
timeoutMs: number;
|
|
20
|
+
logSlides?: ((message: string) => void) | null;
|
|
21
|
+
}): Promise<{
|
|
22
|
+
threshold: number;
|
|
23
|
+
confidence: number;
|
|
24
|
+
}>;
|
|
25
|
+
export declare function buildSegments(durationSeconds: number | null, workers: number): Array<{
|
|
26
|
+
start: number;
|
|
27
|
+
duration: number;
|
|
28
|
+
}>;
|
|
29
|
+
export declare function detectSceneTimestamps({ ffmpegPath, inputPath, threshold, timeoutMs, segments, workers, onSegmentProgress, runWithConcurrency, }: {
|
|
30
|
+
ffmpegPath: string;
|
|
31
|
+
inputPath: string;
|
|
32
|
+
threshold: number;
|
|
33
|
+
timeoutMs: number;
|
|
34
|
+
segments?: Array<{
|
|
35
|
+
start: number;
|
|
36
|
+
duration: number;
|
|
37
|
+
}>;
|
|
38
|
+
workers?: number;
|
|
39
|
+
onSegmentProgress?: ((completed: number, total: number) => void) | null;
|
|
40
|
+
runWithConcurrency: <T>(tasks: Array<() => Promise<T>>, workers: number, onProgress?: ((completed: number, total: number) => void) | null) => Promise<T[]>;
|
|
41
|
+
}): Promise<number[]>;
|
|
42
|
+
export declare function applyMinDurationFilter(slides: SlideImage[], minDurationSeconds: number, warnings: string[], removeFile: (path: string) => void): SlideImage[];
|
|
43
|
+
export declare function mergeTimestamps(sceneTimestamps: number[], intervalTimestamps: number[], minDurationSeconds: number): number[];
|
|
44
|
+
export declare function filterTimestampsByMinDuration(timestamps: number[], minDurationSeconds: number): number[];
|
|
45
|
+
export declare function buildSceneSegments(sceneTimestamps: number[], durationSeconds: number | null): SceneSegment[];
|
|
46
|
+
export declare function findSceneSegment(segments: SceneSegment[], timestamp: number): SceneSegment | null;
|
|
47
|
+
export declare function adjustTimestampWithinSegment(timestamp: number, segment: SceneSegment | null): number;
|
|
48
|
+
export declare function selectTimestampTargets({ targets, sceneTimestamps, minDurationSeconds, intervalSeconds, }: {
|
|
49
|
+
targets: number[];
|
|
50
|
+
sceneTimestamps: number[];
|
|
51
|
+
minDurationSeconds: number;
|
|
52
|
+
intervalSeconds: number;
|
|
53
|
+
}): number[];
|
|
54
|
+
export declare function buildIntervalTimestamps({ durationSeconds, minDurationSeconds, maxSlides, }: {
|
|
55
|
+
durationSeconds: number | null;
|
|
56
|
+
minDurationSeconds: number;
|
|
57
|
+
maxSlides: number;
|
|
58
|
+
}): {
|
|
59
|
+
timestamps: number[];
|
|
60
|
+
intervalSeconds: number;
|
|
61
|
+
} | null;
|
|
62
|
+
export declare function probeVideoInfo({ ffprobePath, inputPath, timeoutMs, }: {
|
|
63
|
+
ffprobePath: string;
|
|
64
|
+
inputPath: string;
|
|
65
|
+
timeoutMs: number;
|
|
66
|
+
}): Promise<{
|
|
67
|
+
durationSeconds: number | null;
|
|
68
|
+
width: number | null;
|
|
69
|
+
height: number | null;
|
|
70
|
+
}>;
|
|
71
|
+
export declare function applyMaxSlidesFilter<T extends {
|
|
72
|
+
index: number;
|
|
73
|
+
timestamp: number;
|
|
74
|
+
imagePath: string;
|
|
75
|
+
}>(slides: T[], maxSlides: number, warnings: string[], removeFile: (path: string) => void): T[];
|
package/dist/types/version.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const FALLBACK_VERSION = "0.
|
|
1
|
+
export declare const FALLBACK_VERSION = "0.12.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/_config.yml
CHANGED
package/docs/agent.md
CHANGED
|
@@ -135,10 +135,11 @@ Returns cached chat history for the same cache key as `/v1/agent`.
|
|
|
135
135
|
### Model Resolution (Daemon)
|
|
136
136
|
|
|
137
137
|
- **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.
|
|
138
|
-
- **Auto model**: uses existing auto-selection logic (`buildAutoModelAttempts`),
|
|
138
|
+
- **Auto model**: uses existing auto-selection logic (`buildAutoModelAttempts`), preferring API-key transports and then CLI fallback when available.
|
|
139
139
|
- **Synthetic models**: created for OpenAI-compatible base URLs (local/openrouter).
|
|
140
140
|
- `maxOutputTokens` defaults to 2048 or `maxOutputTokens` override.
|
|
141
|
-
- CLI models are
|
|
141
|
+
- CLI models are supported as auto fallback and via explicit `cli/<provider>/<model>` overrides.
|
|
142
|
+
- If the daemon still says no model is available after key/install changes, restart or reinstall it so the saved environment snapshot refreshes.
|
|
142
143
|
|
|
143
144
|
## Page Content Payload
|
|
144
145
|
|
package/docs/assets/site.css
CHANGED
|
@@ -184,6 +184,7 @@ a:hover {
|
|
|
184
184
|
grid-template-columns: 1.1fr 0.9fr;
|
|
185
185
|
gap: 20px;
|
|
186
186
|
padding: 26px;
|
|
187
|
+
min-width: 0;
|
|
187
188
|
}
|
|
188
189
|
|
|
189
190
|
.hero__frame::after {
|
|
@@ -197,6 +198,7 @@ a:hover {
|
|
|
197
198
|
.hero__copy {
|
|
198
199
|
position: relative;
|
|
199
200
|
z-index: 1;
|
|
201
|
+
min-width: 0;
|
|
200
202
|
}
|
|
201
203
|
|
|
202
204
|
.kicker {
|
|
@@ -313,6 +315,7 @@ a:hover {
|
|
|
313
315
|
z-index: 1;
|
|
314
316
|
display: grid;
|
|
315
317
|
gap: 14px;
|
|
318
|
+
min-width: 0;
|
|
316
319
|
}
|
|
317
320
|
|
|
318
321
|
.shot {
|
|
@@ -356,6 +359,8 @@ a:hover {
|
|
|
356
359
|
background: rgba(255, 255, 255, 0.03);
|
|
357
360
|
padding: 20px 18px;
|
|
358
361
|
box-shadow: var(--shadow2);
|
|
362
|
+
overflow: hidden;
|
|
363
|
+
min-width: 0;
|
|
359
364
|
}
|
|
360
365
|
|
|
361
366
|
.productCard__head {
|
|
@@ -411,6 +416,7 @@ a:hover {
|
|
|
411
416
|
border-radius: 16px;
|
|
412
417
|
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
413
418
|
background: rgba(0, 0, 0, 0.35);
|
|
419
|
+
overflow: hidden;
|
|
414
420
|
}
|
|
415
421
|
|
|
416
422
|
pre {
|
|
@@ -736,13 +742,139 @@ code {
|
|
|
736
742
|
}
|
|
737
743
|
|
|
738
744
|
@media (max-width: 640px) {
|
|
745
|
+
.shell {
|
|
746
|
+
padding: 20px 12px 60px;
|
|
747
|
+
}
|
|
748
|
+
.top {
|
|
749
|
+
padding: 8px 2px 12px;
|
|
750
|
+
}
|
|
751
|
+
.nav a {
|
|
752
|
+
padding: 6px 8px;
|
|
753
|
+
font-size: 11px;
|
|
754
|
+
}
|
|
755
|
+
.hero {
|
|
756
|
+
padding: 6px 0 0;
|
|
757
|
+
}
|
|
758
|
+
.hero__frame {
|
|
759
|
+
padding: 18px 14px;
|
|
760
|
+
border-radius: 20px;
|
|
761
|
+
gap: 16px;
|
|
762
|
+
}
|
|
763
|
+
.title {
|
|
764
|
+
font-size: clamp(26px, 7vw, 36px);
|
|
765
|
+
}
|
|
766
|
+
.lede {
|
|
767
|
+
font-size: 15px;
|
|
768
|
+
}
|
|
769
|
+
.quickRow {
|
|
770
|
+
padding: 10px;
|
|
771
|
+
}
|
|
772
|
+
.quickRow__code code {
|
|
773
|
+
font-size: 12px;
|
|
774
|
+
overflow-x: auto;
|
|
775
|
+
white-space: nowrap;
|
|
776
|
+
-webkit-overflow-scrolling: touch;
|
|
777
|
+
}
|
|
778
|
+
.quickRow__actions {
|
|
779
|
+
flex-direction: column;
|
|
780
|
+
}
|
|
781
|
+
.quickRow__actions .btn {
|
|
782
|
+
width: 100%;
|
|
783
|
+
}
|
|
784
|
+
.ctaRow {
|
|
785
|
+
flex-direction: column;
|
|
786
|
+
}
|
|
787
|
+
.ctaRow .btn {
|
|
788
|
+
width: 100%;
|
|
789
|
+
text-align: center;
|
|
790
|
+
}
|
|
791
|
+
.productGrid {
|
|
792
|
+
gap: 14px;
|
|
793
|
+
padding: 0 2px;
|
|
794
|
+
}
|
|
795
|
+
.productCard {
|
|
796
|
+
padding: 16px 14px;
|
|
797
|
+
border-radius: 20px;
|
|
798
|
+
}
|
|
799
|
+
.productCard h2 {
|
|
800
|
+
font-size: 19px;
|
|
801
|
+
}
|
|
802
|
+
pre {
|
|
803
|
+
font-size: 11.5px;
|
|
804
|
+
padding: 12px 10px;
|
|
805
|
+
}
|
|
739
806
|
.capGrid {
|
|
740
807
|
grid-template-columns: 1fr;
|
|
808
|
+
gap: 12px;
|
|
809
|
+
padding: 0 2px;
|
|
741
810
|
}
|
|
742
|
-
.
|
|
743
|
-
|
|
811
|
+
.capCard {
|
|
812
|
+
padding: 14px;
|
|
813
|
+
border-radius: 14px;
|
|
814
|
+
}
|
|
815
|
+
.flow {
|
|
816
|
+
padding: 0 2px;
|
|
817
|
+
}
|
|
818
|
+
.flow__card {
|
|
819
|
+
padding: 16px 14px;
|
|
820
|
+
border-radius: 20px;
|
|
744
821
|
}
|
|
745
822
|
.flowStep {
|
|
746
823
|
grid-template-columns: 1fr;
|
|
824
|
+
padding: 10px;
|
|
825
|
+
}
|
|
826
|
+
.more {
|
|
827
|
+
padding: 0 2px;
|
|
828
|
+
}
|
|
829
|
+
.more__card {
|
|
830
|
+
padding: 16px 14px;
|
|
831
|
+
border-radius: 20px;
|
|
832
|
+
}
|
|
833
|
+
.more__grid {
|
|
834
|
+
grid-template-columns: 1fr;
|
|
835
|
+
gap: 8px;
|
|
836
|
+
}
|
|
837
|
+
.callout {
|
|
838
|
+
font-size: 14px;
|
|
839
|
+
}
|
|
840
|
+
.shot {
|
|
841
|
+
border-radius: 14px;
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
@media (max-width: 380px) {
|
|
846
|
+
.shell {
|
|
847
|
+
padding: 14px 8px 48px;
|
|
848
|
+
}
|
|
849
|
+
.brand__word {
|
|
850
|
+
font-size: 16px;
|
|
851
|
+
}
|
|
852
|
+
.nav {
|
|
853
|
+
gap: 4px;
|
|
854
|
+
}
|
|
855
|
+
.nav a {
|
|
856
|
+
padding: 5px 6px;
|
|
857
|
+
font-size: 10px;
|
|
858
|
+
letter-spacing: 0.04em;
|
|
859
|
+
}
|
|
860
|
+
.hero__frame {
|
|
861
|
+
padding: 14px 10px;
|
|
862
|
+
}
|
|
863
|
+
.title {
|
|
864
|
+
font-size: 24px;
|
|
865
|
+
}
|
|
866
|
+
.lede {
|
|
867
|
+
font-size: 14px;
|
|
868
|
+
}
|
|
869
|
+
.btn {
|
|
870
|
+
padding: 10px 12px;
|
|
871
|
+
font-size: 11px;
|
|
872
|
+
}
|
|
873
|
+
.productCard {
|
|
874
|
+
padding: 14px 12px;
|
|
875
|
+
}
|
|
876
|
+
.footer {
|
|
877
|
+
flex-direction: column;
|
|
878
|
+
gap: 6px;
|
|
747
879
|
}
|
|
748
880
|
}
|
package/docs/cache.md
CHANGED
|
@@ -41,13 +41,14 @@ Separate file cache for downloaded media (yt-dlp, direct media URLs). This is **
|
|
|
41
41
|
- **Summaries**
|
|
42
42
|
- key: `sha256({contentHash, promptHash, model, length, language, formatVersion})`
|
|
43
43
|
- cache hit even if URL differs (content hash wins).
|
|
44
|
+
- `contentHash` comes from the `<content>` block actually sent to the model (so slide timelines / transcript extras affect the key).
|
|
44
45
|
- **Slides** (manifest + on-disk images in the slides output dir)
|
|
45
46
|
- key: `sha256({url, slideSettings, formatVersion})`
|
|
46
47
|
|
|
47
48
|
## Keys / hashes
|
|
48
49
|
|
|
49
50
|
- `sha256` from Node `crypto` / Bun `crypto`.
|
|
50
|
-
- `contentHash` from normalized extracted content.
|
|
51
|
+
- `contentHash` from normalized prompt `<content>` (fallback: normalized extracted content when no tagged block exists).
|
|
51
52
|
- `promptHash` from instruction block (custom prompt or default).
|
|
52
53
|
- `formatVersion`: hardcoded constant to invalidate on prompt format changes.
|
|
53
54
|
|
package/docs/chrome-extension.md
CHANGED
|
@@ -32,7 +32,8 @@ Dev (repo checkout):
|
|
|
32
32
|
- Use: `pnpm summarize daemon install --token <TOKEN> --dev` (autostart service runs `src/cli.ts` via `tsx`, no `dist/` build required).
|
|
33
33
|
- E2E (Playwright): `pnpm -C apps/chrome-extension test:e2e`
|
|
34
34
|
- First run: `pnpm -C apps/chrome-extension exec playwright install chromium`
|
|
35
|
-
-
|
|
35
|
+
- Chromium runs headless by default.
|
|
36
|
+
- Visible debugging: `SHOW_UI=1 pnpm -C apps/chrome-extension test:e2e` or `HEADLESS=0 pnpm -C apps/chrome-extension test:e2e`
|
|
36
37
|
|
|
37
38
|
## Troubleshooting
|
|
38
39
|
|
|
@@ -49,8 +50,10 @@ Dev (repo checkout):
|
|
|
49
50
|
- “Stream ended unexpectedly” / empty chat response:
|
|
50
51
|
- The daemon likely stopped mid-stream. Restart it, then click “Try again”.
|
|
51
52
|
- `summarize daemon restart`
|
|
53
|
+
- Slide strip/gallery missing after a parallel slide run failure:
|
|
54
|
+
- Click the slide notice “Try again” button. If the dedicated slide run never started, the extension now requests a fresh summarize+slides run instead of reusing the summary-only run.
|
|
52
55
|
- Tweet video not transcribing / no progress:
|
|
53
|
-
- Ensure `yt-dlp` is available on your PATH (or set `YT_DLP_PATH`) and you have a transcription provider (`whisper.cpp` installed or `OPENAI_API_KEY` / `FAL_KEY`).
|
|
56
|
+
- Ensure `yt-dlp` is available on your PATH (or set `YT_DLP_PATH`) and you have a transcription provider (`whisper.cpp` installed or `GROQ_API_KEY` / `ASSEMBLYAI_API_KEY` / `GEMINI_API_KEY` / `OPENAI_API_KEY` / `FAL_KEY`).
|
|
54
57
|
- Re-run `summarize daemon install --token <TOKEN>` to refresh the daemon env snapshot (launchd won’t inherit your shell PATH).
|
|
55
58
|
- “Could not establish connection / Receiving end does not exist”:
|
|
56
59
|
- The content script wasn’t injected (yet), or Chrome blocked site access.
|
|
@@ -105,6 +108,11 @@ See `docs/media.md` for detection and transcript rules.
|
|
|
105
108
|
|
|
106
109
|
- The slides toggle lights up on media-friendly URLs (YouTube/watch|shorts, youtu.be, direct media) or when the page reports video/audio. Defaults to Video on those pages.
|
|
107
110
|
- Turning slides **on** refreshes the current summary and requests slide extraction (`yt-dlp`, `ffmpeg`). OCR text is opt-in (Advanced setting) and requires `tesseract`. Missing tools surface a footer notice with install instructions; restart the daemon after installing.
|
|
111
|
+
- Active slide mode is slide-first:
|
|
112
|
+
- vertical image/text cards
|
|
113
|
+
- transcript-first text; OCR fallback
|
|
114
|
+
- text can appear before slide images finish extracting
|
|
115
|
+
- the large summary block is hidden while slide cards are active
|
|
108
116
|
- Slides stay off elsewhere and the toggle is disabled on non-media pages.
|
|
109
117
|
|
|
110
118
|
## SPA Navigation
|
|
@@ -161,7 +169,7 @@ Problem: daemon must be secured; extension must discover and pair with it.
|
|
|
161
169
|
- `summarize daemon install --token <TOKEN>` (macOS: LaunchAgent, Linux: systemd user, Windows: Scheduled Task)
|
|
162
170
|
- `summarize daemon status`
|
|
163
171
|
- “Copy command” button.
|
|
164
|
-
- Daemon stores
|
|
172
|
+
- Daemon stores paired tokens in `~/.summarize/daemon.json`.
|
|
165
173
|
- Extension stores token in `chrome.storage.local`.
|
|
166
174
|
- If daemon unreachable or 401: show Setup state + troubleshooting.
|
|
167
175
|
|
|
@@ -245,7 +253,7 @@ Notes:
|
|
|
245
253
|
- `summarize daemon run` (foreground; used by autostart service)
|
|
246
254
|
- Ensure “single daemon”:
|
|
247
255
|
- Stable service name + predictable unit/task path
|
|
248
|
-
- `install`
|
|
256
|
+
- `install` reuses the same daemon service and appends new tokens instead of invalidating older paired browsers
|
|
249
257
|
|
|
250
258
|
Platform details:
|
|
251
259
|
|
package/docs/cli.md
CHANGED
|
@@ -12,7 +12,7 @@ Summarize can use installed CLIs (Claude, Codex, Gemini, Cursor Agent) as local
|
|
|
12
12
|
|
|
13
13
|
- `cli/claude/<model>` (e.g. `cli/claude/sonnet`)
|
|
14
14
|
- `cli/codex/<model>` (e.g. `cli/codex/gpt-5.2`)
|
|
15
|
-
- `cli/gemini/<model>` (e.g. `cli/gemini/gemini-3-flash
|
|
15
|
+
- `cli/gemini/<model>` (e.g. `cli/gemini/gemini-3-flash`)
|
|
16
16
|
- `cli/agent/<model>` (e.g. `cli/agent/gpt-5.2`)
|
|
17
17
|
|
|
18
18
|
Use `--cli [provider]` (case-insensitive) for the provider default, or `--model cli/<provider>/<model>` to pin a model.
|
|
@@ -95,7 +95,7 @@ path-based prompt and enables the required tool flags:
|
|
|
95
95
|
"order": ["claude", "gemini", "codex", "agent"]
|
|
96
96
|
},
|
|
97
97
|
"codex": { "model": "gpt-5.2" },
|
|
98
|
-
"gemini": { "model": "gemini-3-flash
|
|
98
|
+
"gemini": { "model": "gemini-3-flash", "extraArgs": ["--verbose"] },
|
|
99
99
|
"claude": {
|
|
100
100
|
"model": "sonnet",
|
|
101
101
|
"binary": "/usr/local/bin/claude",
|
package/docs/config.md
CHANGED
|
@@ -56,7 +56,7 @@ For UI theme:
|
|
|
56
56
|
|
|
57
57
|
```json
|
|
58
58
|
{
|
|
59
|
-
"model": { "id": "google/gemini-3-flash
|
|
59
|
+
"model": { "id": "google/gemini-3-flash" },
|
|
60
60
|
"env": { "OPENAI_API_KEY": "sk-..." },
|
|
61
61
|
"output": { "language": "auto" },
|
|
62
62
|
"prompt": "Explain like I am five.",
|
|
@@ -68,7 +68,7 @@ Shorthand (equivalent):
|
|
|
68
68
|
|
|
69
69
|
```json
|
|
70
70
|
{
|
|
71
|
-
"model": "google/gemini-3-flash
|
|
71
|
+
"model": "google/gemini-3-flash"
|
|
72
72
|
}
|
|
73
73
|
```
|
|
74
74
|
|
|
@@ -107,6 +107,7 @@ Set any env var in config (process env still wins):
|
|
|
107
107
|
```json
|
|
108
108
|
{
|
|
109
109
|
"env": {
|
|
110
|
+
"ASSEMBLYAI_API_KEY": "...",
|
|
110
111
|
"OPENAI_API_KEY": "sk-...",
|
|
111
112
|
"OPENROUTER_API_KEY": "sk-or-...",
|
|
112
113
|
"FIRECRAWL_API_KEY": "...",
|
|
@@ -121,6 +122,8 @@ Legacy shortcut (still supported):
|
|
|
121
122
|
{
|
|
122
123
|
"apiKeys": {
|
|
123
124
|
"openai": "sk-...",
|
|
125
|
+
"groq": "gsk-...",
|
|
126
|
+
"assemblyai": "...",
|
|
124
127
|
"anthropic": "sk-ant-...",
|
|
125
128
|
"google": "...",
|
|
126
129
|
"openrouter": "sk-or-...",
|
|
@@ -260,7 +263,7 @@ For auto selection with rules:
|
|
|
260
263
|
"rules": [
|
|
261
264
|
{
|
|
262
265
|
"when": ["video"],
|
|
263
|
-
"candidates": ["google/gemini-3-flash
|
|
266
|
+
"candidates": ["google/gemini-3-flash"]
|
|
264
267
|
},
|
|
265
268
|
{
|
|
266
269
|
"when": ["website", "youtube"],
|
|
@@ -359,9 +362,11 @@ Override API endpoints for any provider to use proxies, gateways, or compatible
|
|
|
359
362
|
```json
|
|
360
363
|
{
|
|
361
364
|
"openai": { "baseUrl": "https://my-openai-proxy.example.com/v1" },
|
|
365
|
+
"nvidia": { "baseUrl": "https://integrate.api.nvidia.com/v1" },
|
|
362
366
|
"anthropic": { "baseUrl": "https://my-anthropic-proxy.example.com" },
|
|
363
367
|
"google": { "baseUrl": "https://my-google-proxy.example.com" },
|
|
364
|
-
"xai": { "baseUrl": "https://my-xai-proxy.example.com" }
|
|
368
|
+
"xai": { "baseUrl": "https://my-xai-proxy.example.com" },
|
|
369
|
+
"zai": { "baseUrl": "https://api.zhipuai.cn/paas/v4" }
|
|
365
370
|
}
|
|
366
371
|
```
|
|
367
372
|
|
|
@@ -370,6 +375,8 @@ Or via environment variables (which take precedence over config):
|
|
|
370
375
|
| Provider | Environment Variable(s) |
|
|
371
376
|
| --------- | -------------------------------------------- |
|
|
372
377
|
| OpenAI | `OPENAI_BASE_URL` |
|
|
378
|
+
| NVIDIA | `NVIDIA_BASE_URL` |
|
|
373
379
|
| Anthropic | `ANTHROPIC_BASE_URL` |
|
|
374
380
|
| Google | `GOOGLE_BASE_URL` (alias: `GEMINI_BASE_URL`) |
|
|
375
381
|
| xAI | `XAI_BASE_URL` |
|
|
382
|
+
| Z.AI | `Z_AI_BASE_URL` (alias: `ZAI_BASE_URL`) |
|