@steipete/summarize 0.12.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/CHANGELOG.md +36 -1
  2. package/README.md +41 -17
  3. package/dist/cli.js +1 -1
  4. package/dist/esm/cache-keys.js +10 -2
  5. package/dist/esm/cache-keys.js.map +1 -1
  6. package/dist/esm/cache.js +1 -1
  7. package/dist/esm/config/parse-helpers.js +6 -1
  8. package/dist/esm/config/parse-helpers.js.map +1 -1
  9. package/dist/esm/config/sections.js +35 -1
  10. package/dist/esm/config/sections.js.map +1 -1
  11. package/dist/esm/costs.js.map +1 -1
  12. package/dist/esm/daemon/agent-model.js +56 -8
  13. package/dist/esm/daemon/agent-model.js.map +1 -1
  14. package/dist/esm/daemon/chat.js +52 -4
  15. package/dist/esm/daemon/chat.js.map +1 -1
  16. package/dist/esm/daemon/cli.js +100 -5
  17. package/dist/esm/daemon/cli.js.map +1 -1
  18. package/dist/esm/daemon/env-snapshot.js +2 -0
  19. package/dist/esm/daemon/env-snapshot.js.map +1 -1
  20. package/dist/esm/daemon/flow-context.js +76 -73
  21. package/dist/esm/daemon/flow-context.js.map +1 -1
  22. package/dist/esm/daemon/models.js +10 -0
  23. package/dist/esm/daemon/models.js.map +1 -1
  24. package/dist/esm/daemon/schtasks.js +101 -5
  25. package/dist/esm/daemon/schtasks.js.map +1 -1
  26. package/dist/esm/daemon/server.js +8 -1
  27. package/dist/esm/daemon/server.js.map +1 -1
  28. package/dist/esm/daemon/windows-container.js +21 -0
  29. package/dist/esm/daemon/windows-container.js.map +1 -0
  30. package/dist/esm/llm/cli-provider-output.js +225 -1
  31. package/dist/esm/llm/cli-provider-output.js.map +1 -1
  32. package/dist/esm/llm/cli.js +95 -7
  33. package/dist/esm/llm/cli.js.map +1 -1
  34. package/dist/esm/llm/generate-text-document.js.map +1 -1
  35. package/dist/esm/llm/generate-text-shared.js +22 -3
  36. package/dist/esm/llm/generate-text-shared.js.map +1 -1
  37. package/dist/esm/llm/generate-text-stream.js +34 -1
  38. package/dist/esm/llm/generate-text-stream.js.map +1 -1
  39. package/dist/esm/llm/generate-text.js +33 -6
  40. package/dist/esm/llm/generate-text.js.map +1 -1
  41. package/dist/esm/llm/github-models.js +45 -0
  42. package/dist/esm/llm/github-models.js.map +1 -0
  43. package/dist/esm/llm/html-to-markdown.js.map +1 -1
  44. package/dist/esm/llm/model-id.js +18 -2
  45. package/dist/esm/llm/model-id.js.map +1 -1
  46. package/dist/esm/llm/provider-profile.js +44 -2
  47. package/dist/esm/llm/provider-profile.js.map +1 -1
  48. package/dist/esm/llm/providers/models.js +6 -1
  49. package/dist/esm/llm/providers/models.js.map +1 -1
  50. package/dist/esm/llm/providers/openai.js +243 -5
  51. package/dist/esm/llm/providers/openai.js.map +1 -1
  52. package/dist/esm/llm/transcript-to-markdown.js.map +1 -1
  53. package/dist/esm/media-cache.js +3 -0
  54. package/dist/esm/media-cache.js.map +1 -1
  55. package/dist/esm/model-auto-cli.js +7 -5
  56. package/dist/esm/model-auto-cli.js.map +1 -1
  57. package/dist/esm/model-spec.js +39 -2
  58. package/dist/esm/model-spec.js.map +1 -1
  59. package/dist/esm/run/attachments.js.map +1 -1
  60. package/dist/esm/run/cli-fallback-state.js +6 -1
  61. package/dist/esm/run/cli-fallback-state.js.map +1 -1
  62. package/dist/esm/run/env.js +21 -3
  63. package/dist/esm/run/env.js.map +1 -1
  64. package/dist/esm/run/flows/asset/summary-attempts.js +9 -1
  65. package/dist/esm/run/flows/asset/summary-attempts.js.map +1 -1
  66. package/dist/esm/run/flows/asset/summary.js +11 -0
  67. package/dist/esm/run/flows/asset/summary.js.map +1 -1
  68. package/dist/esm/run/flows/url/extraction-session.js +174 -0
  69. package/dist/esm/run/flows/url/extraction-session.js.map +1 -0
  70. package/dist/esm/run/flows/url/fetch-options.js +32 -0
  71. package/dist/esm/run/flows/url/fetch-options.js.map +1 -0
  72. package/dist/esm/run/flows/url/flow-progress.js +11 -7
  73. package/dist/esm/run/flows/url/flow-progress.js.map +1 -1
  74. package/dist/esm/run/flows/url/flow.js +64 -385
  75. package/dist/esm/run/flows/url/flow.js.map +1 -1
  76. package/dist/esm/run/flows/url/markdown.js +18 -1
  77. package/dist/esm/run/flows/url/markdown.js.map +1 -1
  78. package/dist/esm/run/flows/url/progress-status-state.js +28 -0
  79. package/dist/esm/run/flows/url/progress-status-state.js.map +1 -0
  80. package/dist/esm/run/flows/url/progress-status.js +18 -23
  81. package/dist/esm/run/flows/url/progress-status.js.map +1 -1
  82. package/dist/esm/run/flows/url/slides-session.js +159 -0
  83. package/dist/esm/run/flows/url/slides-session.js.map +1 -0
  84. package/dist/esm/run/flows/url/summary-finish.js +10 -4
  85. package/dist/esm/run/flows/url/summary-finish.js.map +1 -1
  86. package/dist/esm/run/flows/url/summary-resolution.js +8 -1
  87. package/dist/esm/run/flows/url/summary-resolution.js.map +1 -1
  88. package/dist/esm/run/flows/url/summary.js +115 -149
  89. package/dist/esm/run/flows/url/summary.js.map +1 -1
  90. package/dist/esm/run/flows/url/types.js +31 -1
  91. package/dist/esm/run/flows/url/types.js.map +1 -1
  92. package/dist/esm/run/flows/url/video-only.js +68 -0
  93. package/dist/esm/run/flows/url/video-only.js.map +1 -0
  94. package/dist/esm/run/help.js +6 -2
  95. package/dist/esm/run/help.js.map +1 -1
  96. package/dist/esm/run/run-config.js +1 -1
  97. package/dist/esm/run/run-config.js.map +1 -1
  98. package/dist/esm/run/run-models.js +35 -5
  99. package/dist/esm/run/run-models.js.map +1 -1
  100. package/dist/esm/run/run-settings-parse.js +4 -0
  101. package/dist/esm/run/run-settings-parse.js.map +1 -1
  102. package/dist/esm/run/run-settings.js +6 -0
  103. package/dist/esm/run/run-settings.js.map +1 -1
  104. package/dist/esm/run/runner-contexts.js +70 -64
  105. package/dist/esm/run/runner-contexts.js.map +1 -1
  106. package/dist/esm/run/runner-execution.js +22 -2
  107. package/dist/esm/run/runner-execution.js.map +1 -1
  108. package/dist/esm/run/runner-plan.js +369 -0
  109. package/dist/esm/run/runner-plan.js.map +1 -0
  110. package/dist/esm/run/runner-slides.js +14 -3
  111. package/dist/esm/run/runner-slides.js.map +1 -1
  112. package/dist/esm/run/runner.js +50 -398
  113. package/dist/esm/run/runner.js.map +1 -1
  114. package/dist/esm/run/slides-cli.js +3 -2
  115. package/dist/esm/run/slides-cli.js.map +1 -1
  116. package/dist/esm/run/streaming.js +1 -0
  117. package/dist/esm/run/streaming.js.map +1 -1
  118. package/dist/esm/run/summary-engine.js +24 -0
  119. package/dist/esm/run/summary-engine.js.map +1 -1
  120. package/dist/esm/run/summary-llm.js.map +1 -1
  121. package/dist/esm/shared/slides-text.js +2 -0
  122. package/dist/esm/shared/slides-text.js.map +1 -0
  123. package/dist/esm/slides/extract.js +43 -66
  124. package/dist/esm/slides/extract.js.map +1 -1
  125. package/dist/esm/slides/index.js +2 -1
  126. package/dist/esm/slides/index.js.map +1 -1
  127. package/dist/esm/slides/ingest.js +27 -0
  128. package/dist/esm/slides/ingest.js.map +1 -1
  129. package/dist/esm/slides/source.js +80 -0
  130. package/dist/esm/slides/source.js.map +1 -0
  131. package/dist/esm/tty/progress/fetch-html.js +6 -0
  132. package/dist/esm/tty/progress/fetch-html.js.map +1 -1
  133. package/dist/esm/tty/progress/transcript-state.js +202 -0
  134. package/dist/esm/tty/progress/transcript-state.js.map +1 -0
  135. package/dist/esm/tty/progress/transcript.js +43 -207
  136. package/dist/esm/tty/progress/transcript.js.map +1 -1
  137. package/dist/esm/tty/spinner.js +14 -6
  138. package/dist/esm/tty/spinner.js.map +1 -1
  139. package/dist/esm/tty/website-progress.js +11 -0
  140. package/dist/esm/tty/website-progress.js.map +1 -1
  141. package/dist/esm/version.js +1 -1
  142. package/dist/types/cache-keys.d.ts +1 -1
  143. package/dist/types/cache.d.ts +1 -1
  144. package/dist/types/config/sections.d.ts +2 -1
  145. package/dist/types/config/types.d.ts +9 -1
  146. package/dist/types/costs.d.ts +1 -1
  147. package/dist/types/daemon/env-snapshot.d.ts +1 -1
  148. package/dist/types/daemon/flow-context.d.ts +1 -1
  149. package/dist/types/daemon/models.d.ts +2 -0
  150. package/dist/types/daemon/schtasks.d.ts +2 -1
  151. package/dist/types/daemon/server.d.ts +1 -0
  152. package/dist/types/daemon/windows-container.d.ts +1 -0
  153. package/dist/types/llm/cli-provider-output.d.ts +10 -1
  154. package/dist/types/llm/generate-text-document.d.ts +2 -1
  155. package/dist/types/llm/generate-text-shared.d.ts +7 -0
  156. package/dist/types/llm/generate-text-stream.d.ts +2 -1
  157. package/dist/types/llm/generate-text.d.ts +3 -2
  158. package/dist/types/llm/github-models.d.ts +5 -0
  159. package/dist/types/llm/html-to-markdown.d.ts +2 -1
  160. package/dist/types/llm/model-id.d.ts +1 -1
  161. package/dist/types/llm/provider-profile.d.ts +4 -4
  162. package/dist/types/llm/providers/openai.d.ts +9 -5
  163. package/dist/types/llm/providers/types.d.ts +1 -0
  164. package/dist/types/llm/transcript-to-markdown.d.ts +2 -1
  165. package/dist/types/model-spec.d.ts +4 -3
  166. package/dist/types/run/attachments.d.ts +3 -2
  167. package/dist/types/run/env.d.ts +5 -0
  168. package/dist/types/run/flows/asset/summary.d.ts +10 -0
  169. package/dist/types/run/flows/url/extraction-session.d.ts +22 -0
  170. package/dist/types/run/flows/url/fetch-options.d.ts +29 -0
  171. package/dist/types/run/flows/url/flow-progress.d.ts +3 -1
  172. package/dist/types/run/flows/url/markdown.d.ts +1 -1
  173. package/dist/types/run/flows/url/progress-status-state.d.ts +17 -0
  174. package/dist/types/run/flows/url/progress-status.d.ts +1 -0
  175. package/dist/types/run/flows/url/slides-session.d.ts +26 -0
  176. package/dist/types/run/flows/url/types.d.ts +16 -0
  177. package/dist/types/run/flows/url/video-only.d.ts +27 -0
  178. package/dist/types/run/run-settings.d.ts +2 -1
  179. package/dist/types/run/runner-contexts.d.ts +3 -28
  180. package/dist/types/run/runner-execution.d.ts +1 -0
  181. package/dist/types/run/runner-plan.d.ts +19 -0
  182. package/dist/types/run/runner-slides.d.ts +2 -1
  183. package/dist/types/run/streaming.d.ts +2 -1
  184. package/dist/types/run/summary-engine.d.ts +1 -1
  185. package/dist/types/run/summary-llm.d.ts +2 -1
  186. package/dist/types/run/types.d.ts +3 -2
  187. package/dist/types/shared/slides-text.d.ts +1 -0
  188. package/dist/types/slides/extract.d.ts +1 -6
  189. package/dist/types/slides/index.d.ts +2 -1
  190. package/dist/types/slides/source.d.ts +8 -0
  191. package/dist/types/tty/progress/fetch-html.d.ts +1 -0
  192. package/dist/types/tty/progress/transcript-state.d.ts +27 -0
  193. package/dist/types/tty/progress/transcript.d.ts +1 -0
  194. package/dist/types/tty/spinner.d.ts +1 -0
  195. package/dist/types/version.d.ts +1 -1
  196. package/docs/README.md +1 -1
  197. package/docs/agent.md +1 -1
  198. package/docs/assets/site.css +11 -0
  199. package/docs/chrome-extension.md +7 -1
  200. package/docs/cli.md +24 -6
  201. package/docs/config.md +19 -5
  202. package/docs/extract-only.md +2 -2
  203. package/docs/firecrawl.md +2 -1
  204. package/docs/llm.md +29 -3
  205. package/docs/media.md +6 -0
  206. package/docs/releasing.md +9 -12
  207. package/docs/site/docs/chrome-extension.html +1 -1
  208. package/docs/transcript-provider-flow.md +7 -0
  209. package/docs/website.md +2 -1
  210. package/package.json +15 -14
@@ -1,7 +1,7 @@
1
1
  import fs from "node:fs";
2
2
  import path from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
- export const FALLBACK_VERSION = "0.12.0";
4
+ export const FALLBACK_VERSION = "0.13.0";
5
5
  export function resolvePackageVersion(importMetaUrl) {
6
6
  const injected = typeof process !== "undefined" && typeof process.env.SUMMARIZE_VERSION === "string"
7
7
  ? process.env.SUMMARIZE_VERSION.trim()
@@ -3,7 +3,7 @@ import type { OutputLanguage } from "./language.js";
3
3
  export declare function hashString(value: string): string;
4
4
  export declare function hashJson(value: unknown): string;
5
5
  export declare function normalizeContentForHash(content: string): string;
6
- export declare function extractTaggedBlock(prompt: string, tag: "instructions" | "content"): string | null;
6
+ export declare function extractTaggedBlock(prompt: string, tag: "instructions" | "content" | "context"): string | null;
7
7
  export declare function buildPromptHash(prompt: string): string;
8
8
  export declare function buildPromptContentHash({ prompt, fallbackContent, }: {
9
9
  prompt: string;
@@ -7,7 +7,7 @@ export type CacheConfig = {
7
7
  ttlDays?: number;
8
8
  path?: string;
9
9
  };
10
- export declare const CACHE_FORMAT_VERSION = 1;
10
+ export declare const CACHE_FORMAT_VERSION = 2;
11
11
  export declare const DEFAULT_CACHE_MAX_MB = 512;
12
12
  export declare const DEFAULT_CACHE_TTL_DAYS = 30;
13
13
  export type CacheStore = {
@@ -22,7 +22,8 @@ export declare function parseSlidesConfig(root: Record<string, unknown>, path: s
22
22
  } | undefined;
23
23
  export declare function parseCliConfig(root: Record<string, unknown>, path: string): CliConfig | undefined;
24
24
  export declare function parseOutputConfig(root: Record<string, unknown>, path: string): {
25
- language: string;
25
+ length?: string | undefined;
26
+ language?: string | undefined;
26
27
  } | undefined;
27
28
  export declare function parseUiConfig(root: Record<string, unknown>, path: string): {
28
29
  theme: string;
@@ -1,6 +1,6 @@
1
1
  export type AutoRuleKind = "text" | "website" | "youtube" | "image" | "video" | "file";
2
2
  export type VideoMode = "auto" | "transcript" | "understand";
3
- export type CliProvider = "claude" | "codex" | "gemini" | "agent";
3
+ export type CliProvider = "claude" | "codex" | "gemini" | "agent" | "openclaw" | "opencode";
4
4
  export type CliProviderConfig = {
5
5
  binary?: string;
6
6
  extraArgs?: string[];
@@ -18,6 +18,8 @@ export type CliConfig = {
18
18
  codex?: CliProviderConfig;
19
19
  gemini?: CliProviderConfig;
20
20
  agent?: CliProviderConfig;
21
+ openclaw?: CliProviderConfig;
22
+ opencode?: CliProviderConfig;
21
23
  autoFallback?: CliAutoFallbackConfig;
22
24
  magicAuto?: CliAutoFallbackConfig;
23
25
  promptOverride?: string;
@@ -200,6 +202,12 @@ export type SummarizeConfig = {
200
202
  * - otherwise: translate the output into the requested language
201
203
  */
202
204
  language?: string;
205
+ /**
206
+ * Default summary length (same values as `--length`).
207
+ *
208
+ * Examples: "short", "long", "xl", "20k".
209
+ */
210
+ length?: string;
203
211
  };
204
212
  ui?: {
205
213
  /**
@@ -1,5 +1,5 @@
1
1
  import type { LlmTokenUsage } from "./llm/generate-text.js";
2
- export type LlmProvider = "xai" | "openai" | "google" | "anthropic" | "zai" | "nvidia" | "cli";
2
+ export type LlmProvider = "xai" | "openai" | "google" | "anthropic" | "zai" | "nvidia" | "github-copilot" | "cli";
3
3
  export type LlmCall = {
4
4
  provider: LlmProvider;
5
5
  model: string;
@@ -1,4 +1,4 @@
1
- declare const ENV_KEYS: readonly ["PATH", "XAI_API_KEY", "XAI_BASE_URL", "OPENAI_API_KEY", "OPENAI_WHISPER_BASE_URL", "OPENAI_BASE_URL", "OPENROUTER_API_KEY", "OPENAI_USE_CHAT_COMPLETIONS", "NVIDIA_API_KEY", "NGC_API_KEY", "NVIDIA_BASE_URL", "Z_AI_API_KEY", "ZAI_API_KEY", "Z_AI_BASE_URL", "ZAI_BASE_URL", "GEMINI_API_KEY", "GOOGLE_BASE_URL", "GEMINI_BASE_URL", "GOOGLE_GENERATIVE_AI_API_KEY", "GOOGLE_API_KEY", "ANTHROPIC_API_KEY", "ANTHROPIC_BASE_URL", "FIRECRAWL_API_KEY", "APIFY_API_TOKEN", "YT_DLP_PATH", "SUMMARIZE_YT_DLP_COOKIES_FROM_BROWSER", "YT_DLP_COOKIES_FROM_BROWSER", "FAL_KEY", "GROQ_API_KEY", "ASSEMBLYAI_API_KEY", "SUMMARIZE_MODEL", "SUMMARIZE_TRANSCRIBER", "SUMMARIZE_ONNX_PARAKEET_CMD", "SUMMARIZE_ONNX_CANARY_CMD", "CLAUDE_PATH", "CODEX_PATH", "GEMINI_PATH", "AGENT_PATH", "UVX_PATH"];
1
+ declare const ENV_KEYS: readonly ["PATH", "XAI_API_KEY", "XAI_BASE_URL", "OPENAI_API_KEY", "OPENAI_WHISPER_BASE_URL", "OPENAI_BASE_URL", "OPENROUTER_API_KEY", "OPENAI_USE_CHAT_COMPLETIONS", "NVIDIA_API_KEY", "NGC_API_KEY", "NVIDIA_BASE_URL", "Z_AI_API_KEY", "ZAI_API_KEY", "Z_AI_BASE_URL", "ZAI_BASE_URL", "GEMINI_API_KEY", "GOOGLE_BASE_URL", "GEMINI_BASE_URL", "GOOGLE_GENERATIVE_AI_API_KEY", "GOOGLE_API_KEY", "ANTHROPIC_API_KEY", "ANTHROPIC_BASE_URL", "FIRECRAWL_API_KEY", "APIFY_API_TOKEN", "YT_DLP_PATH", "SUMMARIZE_YT_DLP_COOKIES_FROM_BROWSER", "YT_DLP_COOKIES_FROM_BROWSER", "FAL_KEY", "GROQ_API_KEY", "ASSEMBLYAI_API_KEY", "SUMMARIZE_MODEL", "SUMMARIZE_TRANSCRIBER", "SUMMARIZE_ONNX_PARAKEET_CMD", "SUMMARIZE_ONNX_CANARY_CMD", "CLAUDE_PATH", "CODEX_PATH", "GEMINI_PATH", "AGENT_PATH", "OPENCLAW_PATH", "OPENCODE_PATH", "UVX_PATH"];
2
2
  export type EnvSnapshot = Partial<Record<(typeof ENV_KEYS)[number], string>>;
3
3
  export declare function buildEnvSnapshotFromEnv(env: Record<string, string | undefined>): EnvSnapshot;
4
4
  export {};
@@ -1,6 +1,6 @@
1
1
  import type { CacheState } from "../cache.js";
2
2
  import type { ExtractedLinkContent, LinkPreviewProgressEvent, MediaCache } from "../content/index.js";
3
- import type { UrlFlowContext } from "../run/flows/url/types.js";
3
+ import { type UrlFlowContext } from "../run/flows/url/types.js";
4
4
  import { type RunOverrides } from "../run/run-settings.js";
5
5
  import type { SlideImage, SlideSettings, SlideSourceKind } from "../slides/index.js";
6
6
  type TextSink = {
@@ -23,6 +23,8 @@ export declare function buildModelPickerOptions({ env, envForRun, configForCli,
23
23
  cliGemini: boolean;
24
24
  cliCodex: boolean;
25
25
  cliAgent: boolean;
26
+ cliOpenclaw: boolean;
27
+ cliOpencode: boolean;
26
28
  };
27
29
  openaiBaseUrl: string | null;
28
30
  localModelsSource: {
@@ -14,7 +14,8 @@ export declare function uninstallScheduledTask({ env, stdout, }: {
14
14
  env: Record<string, string | undefined>;
15
15
  stdout: NodeJS.WritableStream;
16
16
  }): Promise<void>;
17
- export declare function restartScheduledTask({ stdout, }: {
17
+ export declare function restartScheduledTask({ env, stdout, }: {
18
+ env: Record<string, string | undefined>;
18
19
  stdout: NodeJS.WritableStream;
19
20
  }): Promise<void>;
20
21
  export declare function isScheduledTaskInstalled(): Promise<boolean>;
@@ -1,6 +1,7 @@
1
1
  import { type DaemonConfig } from "./config.js";
2
2
  import { type SessionEvent } from "./server-session.js";
3
3
  export { corsHeaders, isTrustedOrigin } from "./server-http.js";
4
+ export declare function resolveDaemonListenHost(env: Record<string, string | undefined>): string;
4
5
  export declare function buildHealthPayload(importMetaUrl?: string): {
5
6
  ok: boolean;
6
7
  pid: number;
@@ -0,0 +1 @@
1
+ export declare function isWindowsContainerEnvironment(env: Record<string, string | undefined>): boolean;
@@ -1,11 +1,20 @@
1
1
  import type { CliProvider } from "../config.js";
2
2
  import type { LlmTokenUsage } from "./generate-text.js";
3
- export type JsonCliProvider = Exclude<CliProvider, "codex">;
3
+ export type JsonCliProvider = Exclude<CliProvider, "codex" | "openclaw" | "opencode">;
4
4
  export declare function isJsonCliProvider(provider: CliProvider): provider is JsonCliProvider;
5
5
  export declare const parseCodexUsageFromJsonl: (output: string) => {
6
6
  usage: LlmTokenUsage | null;
7
7
  costUsd: number | null;
8
8
  };
9
+ export declare function parseCodexOutputFromJsonl(output: string): {
10
+ text: string | null;
11
+ sawStructuredEvent: boolean;
12
+ };
13
+ export declare function parseOpenCodeOutputFromJsonl(output: string): {
14
+ text: string;
15
+ usage: LlmTokenUsage | null;
16
+ costUsd: number | null;
17
+ };
9
18
  export declare function parseJsonProviderOutput(args: {
10
19
  provider: JsonCliProvider;
11
20
  stdout: string;
@@ -1,7 +1,8 @@
1
+ import type { LlmProvider } from "./model-id.js";
1
2
  import type { Prompt } from "./prompt.js";
2
3
  import type { LlmTokenUsage } from "./types.js";
3
4
  type ParsedModel = {
4
- provider: "xai" | "openai" | "google" | "anthropic" | "zai" | "nvidia";
5
+ provider: LlmProvider;
5
6
  model: string;
6
7
  canonical: string;
7
8
  };
@@ -16,10 +16,17 @@ export declare function streamUsageWithTimeout({ result, timeoutMs, }: {
16
16
  }>;
17
17
  timeoutMs: number;
18
18
  }): Promise<LlmTokenUsage | null>;
19
+ export declare function isOpenAiGpt5Model(provider: string, model: string): boolean;
19
20
  export declare function resolveEffectiveTemperature({ provider, model, temperature, }: {
20
21
  provider: string;
21
22
  model: string;
22
23
  temperature?: number;
23
24
  }): number | undefined;
25
+ export declare function shouldRetryGpt5WithoutTokenCap({ provider, model, maxOutputTokens, error, }: {
26
+ provider: string;
27
+ model: string;
28
+ maxOutputTokens?: number;
29
+ error: unknown;
30
+ }): boolean;
24
31
  export declare function resolveGoogleEmptyResponseFallbackModelId(modelId: string): string | null;
25
32
  export declare function isGoogleEmptySummaryError(error: unknown): boolean;
@@ -1,5 +1,6 @@
1
1
  import type { Context } from "@mariozechner/pi-ai";
2
2
  import type { LlmApiKeys } from "./generate-text.js";
3
+ import type { LlmProvider } from "./model-id.js";
3
4
  import type { LlmTokenUsage } from "./types.js";
4
5
  export type StreamTextWithContextArgs = {
5
6
  modelId: string;
@@ -19,7 +20,7 @@ export type StreamTextWithContextArgs = {
19
20
  export type StreamTextResult = {
20
21
  textStream: AsyncIterable<string>;
21
22
  canonicalModelId: string;
22
- provider: "xai" | "openai" | "google" | "anthropic" | "zai" | "nvidia";
23
+ provider: LlmProvider;
23
24
  usage: Promise<LlmTokenUsage | null>;
24
25
  lastError: () => unknown;
25
26
  };
@@ -1,3 +1,4 @@
1
+ import type { LlmProvider } from "./model-id.js";
1
2
  import type { Prompt } from "./prompt.js";
2
3
  import type { LlmTokenUsage } from "./types.js";
3
4
  export { streamTextWithContext } from "./generate-text-stream.js";
@@ -38,7 +39,7 @@ export declare function generateTextWithModelId({ modelId, apiKeys, prompt, temp
38
39
  }): Promise<{
39
40
  text: string;
40
41
  canonicalModelId: string;
41
- provider: "xai" | "openai" | "google" | "anthropic" | "zai" | "nvidia";
42
+ provider: LlmProvider;
42
43
  usage: LlmTokenUsage | null;
43
44
  }>;
44
45
  export declare function streamTextWithModelId({ modelId, apiKeys, prompt, temperature, maxOutputTokens, timeoutMs, fetchImpl, forceOpenRouter, openaiBaseUrlOverride, anthropicBaseUrlOverride, googleBaseUrlOverride, xaiBaseUrlOverride, forceChatCompletions, }: {
@@ -58,7 +59,7 @@ export declare function streamTextWithModelId({ modelId, apiKeys, prompt, temper
58
59
  }): Promise<{
59
60
  textStream: AsyncIterable<string>;
60
61
  canonicalModelId: string;
61
- provider: "xai" | "openai" | "google" | "anthropic" | "zai" | "nvidia";
62
+ provider: LlmProvider;
62
63
  usage: Promise<LlmTokenUsage | null>;
63
64
  lastError: () => unknown;
64
65
  }>;
@@ -0,0 +1,5 @@
1
+ export declare const GITHUB_MODELS_BASE_URL = "https://models.github.ai/inference";
2
+ export declare const GITHUB_MODELS_API_VERSION = "2026-03-10";
3
+ export declare function resolveGitHubModelsApiKey(env: Record<string, string | undefined>): string | null;
4
+ export declare function resolveGitHubCopilotBackendModelId(model: string): string;
5
+ export declare function buildGitHubModelsHeaders(existing?: Record<string, string>): Record<string, string>;
@@ -1,5 +1,6 @@
1
1
  import type { ConvertHtmlToMarkdown } from "@steipete/summarize-core/content";
2
2
  import type { LlmTokenUsage } from "./generate-text.js";
3
+ import type { LlmProvider } from "./model-id.js";
3
4
  export declare function createHtmlToMarkdownConverter({ modelId, forceOpenRouter, xaiApiKey, googleApiKey, openaiApiKey, openaiBaseUrlOverride, anthropicBaseUrlOverride, googleBaseUrlOverride, xaiBaseUrlOverride, anthropicApiKey, openrouterApiKey, fetchImpl, forceChatCompletions, retries, onRetry, onUsage, }: {
4
5
  modelId: string;
5
6
  forceOpenRouter?: boolean;
@@ -23,7 +24,7 @@ export declare function createHtmlToMarkdownConverter({ modelId, forceOpenRouter
23
24
  }) => void;
24
25
  onUsage?: (usage: {
25
26
  model: string;
26
- provider: "xai" | "openai" | "google" | "anthropic" | "zai" | "nvidia";
27
+ provider: LlmProvider;
27
28
  usage: LlmTokenUsage | null;
28
29
  }) => void;
29
30
  }): ConvertHtmlToMarkdown;
@@ -1,4 +1,4 @@
1
- export type LlmProvider = "xai" | "openai" | "google" | "anthropic" | "zai" | "nvidia";
1
+ export type LlmProvider = "xai" | "openai" | "google" | "anthropic" | "zai" | "nvidia" | "github-copilot";
2
2
  export type ParsedModelId = {
3
3
  provider: LlmProvider;
4
4
  /**
@@ -1,14 +1,14 @@
1
1
  import type { CliProvider } from "../config.js";
2
2
  import type { OpenAiClientConfig } from "./providers/types.js";
3
- export type GatewayProvider = "xai" | "openai" | "google" | "anthropic" | "zai" | "nvidia";
4
- export type RequiredModelEnv = "XAI_API_KEY" | "OPENAI_API_KEY" | "NVIDIA_API_KEY" | "GEMINI_API_KEY" | "ANTHROPIC_API_KEY" | "OPENROUTER_API_KEY" | "Z_AI_API_KEY" | "CLI_CLAUDE" | "CLI_CODEX" | "CLI_GEMINI" | "CLI_AGENT";
3
+ export type GatewayProvider = "xai" | "openai" | "google" | "anthropic" | "zai" | "nvidia" | "github-copilot";
4
+ export type RequiredModelEnv = "XAI_API_KEY" | "OPENAI_API_KEY" | "NVIDIA_API_KEY" | "GEMINI_API_KEY" | "ANTHROPIC_API_KEY" | "OPENROUTER_API_KEY" | "Z_AI_API_KEY" | "GITHUB_TOKEN" | "CLI_CLAUDE" | "CLI_CODEX" | "CLI_GEMINI" | "CLI_AGENT" | "CLI_OPENCLAW" | "CLI_OPENCODE";
5
5
  type GatewayProviderProfile = {
6
6
  requiredEnv: RequiredModelEnv;
7
7
  supportsDocuments: boolean;
8
8
  supportsStreaming: boolean;
9
9
  supportsVideoUnderstanding: boolean;
10
10
  };
11
- export declare const DEFAULT_CLI_MODELS: Record<CliProvider, string>;
11
+ export declare const DEFAULT_CLI_MODELS: Record<CliProvider, string | null>;
12
12
  export declare const DEFAULT_AUTO_CLI_ORDER: CliProvider[];
13
13
  export declare function parseCliProviderName(raw: string): CliProvider | null;
14
14
  export declare function requiredEnvForCliProvider(provider: CliProvider): RequiredModelEnv;
@@ -21,7 +21,7 @@ export declare function envHasRequiredKey(env: Record<string, string | undefined
21
21
  export declare function resolveRequiredEnvForModelId(modelId: string): RequiredModelEnv;
22
22
  export declare function isVideoUnderstandingCapableModelId(modelId: string): boolean;
23
23
  export declare function resolveOpenAiCompatibleClientConfigForProvider({ provider, openaiApiKey, openrouterApiKey, forceOpenRouter, openaiBaseUrlOverride, forceChatCompletions, }: {
24
- provider: "openai" | "zai" | "nvidia";
24
+ provider: "openai" | "zai" | "nvidia" | "github-copilot";
25
25
  openaiApiKey: string | null;
26
26
  openrouterApiKey: string | null;
27
27
  forceOpenRouter?: boolean;
@@ -11,18 +11,21 @@ export type OpenAiClientConfigInput = {
11
11
  openaiBaseUrlOverride?: string | null;
12
12
  forceChatCompletions?: boolean;
13
13
  };
14
+ type OpenAiTextCompletionResult = {
15
+ text: string;
16
+ usage: LlmTokenUsage | null;
17
+ resolvedModelId?: string;
18
+ };
14
19
  export declare function resolveOpenAiClientConfig({ apiKeys, forceOpenRouter, openaiBaseUrlOverride, forceChatCompletions, }: OpenAiClientConfigInput): OpenAiClientConfig;
15
- export declare function completeOpenAiText({ modelId, openaiConfig, context, temperature, maxOutputTokens, signal, }: {
20
+ export declare function completeOpenAiText({ modelId, openaiConfig, context, temperature, maxOutputTokens, signal, fetchImpl, }: {
16
21
  modelId: string;
17
22
  openaiConfig: OpenAiClientConfig;
18
23
  context: Context;
19
24
  temperature?: number;
20
25
  maxOutputTokens?: number;
21
26
  signal: AbortSignal;
22
- }): Promise<{
23
- text: string;
24
- usage: LlmTokenUsage | null;
25
- }>;
27
+ fetchImpl?: typeof fetch;
28
+ }): Promise<OpenAiTextCompletionResult>;
26
29
  export declare function completeOpenAiDocument({ modelId, openaiConfig, promptText, document, maxOutputTokens, temperature, timeoutMs, fetchImpl, }: {
27
30
  modelId: string;
28
31
  openaiConfig: OpenAiClientConfig;
@@ -36,3 +39,4 @@ export declare function completeOpenAiDocument({ modelId, openaiConfig, promptTe
36
39
  text: string;
37
40
  usage: LlmTokenUsage | null;
38
41
  }>;
42
+ export {};
@@ -3,4 +3,5 @@ export type OpenAiClientConfig = {
3
3
  baseURL?: string;
4
4
  useChatCompletions: boolean;
5
5
  isOpenRouter: boolean;
6
+ extraHeaders?: Record<string, string>;
6
7
  };
@@ -1,5 +1,6 @@
1
1
  import type { OutputLanguage } from "../language.js";
2
2
  import type { LlmTokenUsage } from "./generate-text.js";
3
+ import type { LlmProvider } from "./model-id.js";
3
4
  export type ConvertTranscriptToMarkdown = (args: {
4
5
  title: string | null;
5
6
  source: string | null;
@@ -30,7 +31,7 @@ export declare function createTranscriptToMarkdownConverter({ modelId, forceOpen
30
31
  }) => void;
31
32
  onUsage?: (usage: {
32
33
  model: string;
33
- provider: "xai" | "openai" | "google" | "anthropic" | "zai" | "nvidia";
34
+ provider: LlmProvider;
34
35
  usage: LlmTokenUsage | null;
35
36
  }) => void;
36
37
  }): ConvertTranscriptToMarkdown;
@@ -1,12 +1,13 @@
1
1
  import type { CliProvider } from "./config.js";
2
+ import type { LlmProvider } from "./llm/model-id.js";
2
3
  export type FixedModelSpec = {
3
4
  transport: "native";
4
5
  userModelId: string;
5
6
  llmModelId: string;
6
- provider: "xai" | "openai" | "google" | "anthropic" | "zai" | "nvidia";
7
+ provider: LlmProvider;
7
8
  openrouterProviders: string[] | null;
8
9
  forceOpenRouter: false;
9
- requiredEnv: "XAI_API_KEY" | "OPENAI_API_KEY" | "GEMINI_API_KEY" | "ANTHROPIC_API_KEY" | "Z_AI_API_KEY" | "NVIDIA_API_KEY";
10
+ requiredEnv: "XAI_API_KEY" | "OPENAI_API_KEY" | "GEMINI_API_KEY" | "ANTHROPIC_API_KEY" | "Z_AI_API_KEY" | "NVIDIA_API_KEY" | "GITHUB_TOKEN";
10
11
  openaiBaseUrlOverride?: string | null;
11
12
  forceChatCompletions?: boolean;
12
13
  } | {
@@ -23,7 +24,7 @@ export type FixedModelSpec = {
23
24
  llmModelId: null;
24
25
  openrouterProviders: null;
25
26
  forceOpenRouter: false;
26
- requiredEnv: "CLI_CLAUDE" | "CLI_CODEX" | "CLI_GEMINI" | "CLI_AGENT";
27
+ requiredEnv: "CLI_CLAUDE" | "CLI_CODEX" | "CLI_GEMINI" | "CLI_AGENT" | "CLI_OPENCLAW" | "CLI_OPENCODE";
27
28
  cliProvider: CliProvider;
28
29
  cliModel: string | null;
29
30
  };
@@ -1,4 +1,5 @@
1
1
  import type { loadLocalAsset } from "../content/asset.js";
2
+ import type { LlmProvider } from "../llm/model-id.js";
2
3
  export type AssetAttachment = Awaited<ReturnType<typeof loadLocalAsset>>["attachment"];
3
4
  export declare const MAX_DOCUMENT_BYTES_DEFAULT: number;
4
5
  export declare function isUnsupportedAttachmentError(error: unknown): boolean;
@@ -19,14 +20,14 @@ export declare function ensureCliAttachmentPath({ sourceKind, sourceLabel, attac
19
20
  }): Promise<string>;
20
21
  export declare function shouldMarkitdownConvertMediaType(mediaType: string): boolean;
21
22
  export declare function supportsNativeFileAttachment({ provider, attachment, }: {
22
- provider: "xai" | "openai" | "google" | "anthropic" | "zai" | "nvidia";
23
+ provider: LlmProvider;
23
24
  attachment: {
24
25
  kind: "image" | "file";
25
26
  mediaType: string;
26
27
  };
27
28
  }): boolean;
28
29
  export declare function assertProviderSupportsAttachment({ provider, modelId, attachment, }: {
29
- provider: "xai" | "openai" | "google" | "anthropic" | "zai" | "nvidia";
30
+ provider: LlmProvider;
30
31
  modelId: string;
31
32
  attachment: {
32
33
  kind: "image" | "file";
@@ -1,6 +1,11 @@
1
1
  import type { CliProvider, SummarizeConfig } from "../config.js";
2
2
  type ConfigForCli = SummarizeConfig | null;
3
3
  export declare function resolveExecutableInPath(binary: string, env: Record<string, string | undefined>): string | null;
4
+ export declare function canSpawnCommand({ command, args, env, }: {
5
+ command: string;
6
+ args?: string[];
7
+ env: Record<string, string | undefined>;
8
+ }): Promise<boolean>;
4
9
  export declare function hasBirdCli(env: Record<string, string | undefined>): boolean;
5
10
  export declare function hasXurlCli(env: Record<string, string | undefined>): boolean;
6
11
  export declare function hasUvxCli(env: Record<string, string | undefined>): boolean;
@@ -88,6 +88,16 @@ export type AssetSummaryContext = {
88
88
  assemblyaiApiKey: string | null;
89
89
  };
90
90
  };
91
+ export type AssetSummaryContextInput = {
92
+ io: Pick<AssetSummaryContext, "env" | "envForRun" | "stdout" | "stderr" | "execFileImpl" | "trackedFetch">;
93
+ summary: Pick<AssetSummaryContext, "timeoutMs" | "preprocessMode" | "format" | "extractMode" | "lengthArg" | "forceSummary" | "outputLanguage" | "videoMode" | "promptOverride" | "lengthInstruction" | "languageInstruction" | "maxOutputTokensArg" | "summaryCacheBypass">;
94
+ model: Pick<AssetSummaryContext, "fixedModelSpec" | "isFallbackModel" | "isImplicitAutoSelection" | "allowAutoCliFallback" | "desiredOutputTokens" | "envForAuto" | "configForModelSelection" | "cliAvailability" | "requestedModel" | "requestedModelInput" | "requestedModelLabel" | "wantsFreeNamedModel" | "isNamedModelSelection" | "summaryEngine" | "getLiteLlmCatalog" | "llmCalls">;
95
+ output: Pick<AssetSummaryContext, "json" | "metricsEnabled" | "metricsDetailed" | "shouldComputeReport" | "runStartedAtMs" | "verbose" | "verboseColor" | "streamingEnabled" | "plain">;
96
+ hooks: Pick<AssetSummaryContext, "writeViaFooter" | "clearProgressForStdout" | "restoreProgressAfterStdout" | "buildReport" | "estimateCostUsd">;
97
+ cache: Pick<AssetSummaryContext, "cache" | "mediaCache">;
98
+ apiStatus: AssetSummaryContext["apiStatus"];
99
+ };
100
+ export declare function createAssetSummaryContext(input: AssetSummaryContextInput): AssetSummaryContext;
91
101
  export type SummarizeAssetArgs = {
92
102
  sourceKind: "file" | "asset-url";
93
103
  sourceLabel: string;
@@ -0,0 +1,22 @@
1
+ import { createLinkPreviewClient, type ExtractedLinkContent, type LinkPreviewProgressEvent } from "../../../content/index.js";
2
+ import type { UrlFlowContext } from "./types.js";
3
+ type LinkPreviewClientOptions = NonNullable<Parameters<typeof createLinkPreviewClient>[0]>;
4
+ type ConvertHtmlToMarkdown = LinkPreviewClientOptions["convertHtmlToMarkdown"];
5
+ type LinkPreviewProgressHandler = ((event: LinkPreviewProgressEvent) => void) | null;
6
+ export type UrlExtractionSession = {
7
+ cacheStore: UrlFlowContext["cache"]["store"] | null;
8
+ fetchInitialExtract: (url: string) => Promise<ExtractedLinkContent>;
9
+ fetchWithCache: (targetUrl: string, options?: {
10
+ bypassExtractCache?: boolean;
11
+ }) => Promise<ExtractedLinkContent>;
12
+ };
13
+ export declare function createUrlExtractionSession({ ctx, markdown, onProgress, }: {
14
+ ctx: UrlFlowContext;
15
+ markdown: {
16
+ convertHtmlToMarkdown: ConvertHtmlToMarkdown;
17
+ effectiveMarkdownMode: "off" | "auto" | "llm" | "readability";
18
+ markdownRequested: boolean;
19
+ };
20
+ onProgress: LinkPreviewProgressHandler;
21
+ }): UrlExtractionSession;
22
+ export {};
@@ -0,0 +1,29 @@
1
+ import type { CacheMode, FetchLinkContentOptions } from "../../../content/index.js";
2
+ type UrlFetchFlags = {
3
+ timeoutMs: number;
4
+ maxExtractCharacters?: number | null;
5
+ youtubeMode: "auto" | "web" | "apify" | "yt-dlp" | "no-auto";
6
+ videoMode: "auto" | "transcript" | "understand";
7
+ transcriptTimestamps: boolean;
8
+ firecrawlMode: "off" | "auto" | "always";
9
+ slides: object | null;
10
+ };
11
+ type UrlMarkdownOptions = {
12
+ effectiveMarkdownMode: "off" | "auto" | "llm" | "readability";
13
+ markdownRequested: boolean;
14
+ };
15
+ export declare function shouldPreferTranscriptForTarget({ targetUrl, videoMode, slides, }: {
16
+ targetUrl: string;
17
+ videoMode: UrlFetchFlags["videoMode"];
18
+ slides: UrlFetchFlags["slides"];
19
+ }): boolean;
20
+ export declare function resolveUrlFetchOptions({ targetUrl, flags, markdown, cacheMode, }: {
21
+ targetUrl: string;
22
+ flags: UrlFetchFlags;
23
+ markdown: UrlMarkdownOptions;
24
+ cacheMode: CacheMode;
25
+ }): {
26
+ localFile: boolean;
27
+ options: FetchLinkContentOptions;
28
+ };
29
+ export {};
@@ -1,5 +1,5 @@
1
1
  import type { createThemeRenderer } from "../../../tty/theme.js";
2
- import type { UrlFlowContext } from "./types.js";
2
+ import { type UrlFlowContext } from "./types.js";
3
3
  export declare function writeSlidesBackgroundFailureWarning({ ctx, theme, message, }: {
4
4
  ctx: Pick<UrlFlowContext, "io" | "flags" | "hooks">;
5
5
  theme: ReturnType<typeof createThemeRenderer>;
@@ -17,6 +17,7 @@ export declare function createUrlFlowProgress({ ctx, theme, }: {
17
17
  getSummaryText(): string | null;
18
18
  getSlidesText(): string | null;
19
19
  };
20
+ hooks: import("./types.js").UrlFlowHooks;
20
21
  pauseProgress: () => () => void;
21
22
  renderStatus: (label: string, detail?: string) => string;
22
23
  renderStatusFromText: (text: string) => string;
@@ -25,6 +26,7 @@ export declare function createUrlFlowProgress({ ctx, theme, }: {
25
26
  stop: () => void;
26
27
  clear: () => void;
27
28
  pause: () => void;
29
+ refresh: () => void;
28
30
  resume: () => void;
29
31
  stopAndClear: () => void;
30
32
  setText: (next: string) => void;
@@ -13,7 +13,7 @@ export type MarkdownConverters = {
13
13
  markdownRequested: boolean;
14
14
  transcriptMarkdownRequested: boolean;
15
15
  effectiveMarkdownMode: "off" | "auto" | "llm" | "readability";
16
- markdownProvider: "none" | "xai" | "openai" | "google" | "anthropic" | "zai" | "nvidia";
16
+ markdownProvider: "none" | "xai" | "openai" | "google" | "anthropic" | "zai" | "nvidia" | "github-copilot";
17
17
  markdownModel: MarkdownModel | null;
18
18
  convertHtmlToMarkdown: ((args: {
19
19
  url: string;
@@ -0,0 +1,17 @@
1
+ export type UrlProgressStatusState = {
2
+ summaryText: string | null;
3
+ slidesActive: boolean;
4
+ slidesText: string | null;
5
+ lastSlideRenderAt: number;
6
+ };
7
+ export declare function createUrlProgressStatusState(): UrlProgressStatusState;
8
+ export declare function applySummaryText(state: UrlProgressStatusState, text: string): {
9
+ renderText: string | null;
10
+ };
11
+ export declare function applySlidesText(state: UrlProgressStatusState, text: string, nowMs: number): {
12
+ renderText: string | null;
13
+ };
14
+ export declare function clearSlidesText(state: UrlProgressStatusState): {
15
+ renderText: string | null;
16
+ summaryText: string | null;
17
+ };
@@ -3,6 +3,7 @@ export declare function createUrlProgressStatus({ enabled, spinner, oscProgress,
3
3
  enabled: boolean;
4
4
  spinner: {
5
5
  setText: (text: string) => void;
6
+ refresh?: () => void;
6
7
  };
7
8
  oscProgress: OscProgressController;
8
9
  now?: () => number;
@@ -0,0 +1,26 @@
1
+ import type { ExtractedLinkContent } from "../../../content/index.js";
2
+ import { type SlideExtractionResult } from "../../../slides/index.js";
3
+ import { type SlidesTerminalOutput } from "./slides-output.js";
4
+ import { type UrlFlowContext } from "./types.js";
5
+ type ProgressStatusLike = {
6
+ clearSlides: () => void;
7
+ setSlides: (text: string, percent?: number | null) => void;
8
+ };
9
+ export type UrlSlidesSession = {
10
+ getSlidesExtracted: () => SlideExtractionResult | null;
11
+ runSlidesExtraction: () => Promise<SlideExtractionResult | null>;
12
+ slidesOutput: SlidesTerminalOutput | null;
13
+ slidesTimelinePromise: Promise<SlideExtractionResult | null> | null;
14
+ setExtracted: (value: ExtractedLinkContent) => void;
15
+ };
16
+ export declare function createUrlSlidesSession({ ctx, url, extracted: initialExtracted, cacheStore, progressStatus, renderStatus, renderStatusFromText, updateSummaryProgress, }: {
17
+ ctx: UrlFlowContext;
18
+ url: string;
19
+ extracted: ExtractedLinkContent;
20
+ cacheStore: UrlFlowContext["cache"]["store"] | null;
21
+ progressStatus: ProgressStatusLike;
22
+ renderStatus: (label: string, detail?: string) => string;
23
+ renderStatusFromText: (text: string) => string;
24
+ updateSummaryProgress: () => void;
25
+ }): UrlSlidesSession;
26
+ export {};
@@ -142,6 +142,22 @@ export type UrlFlowHooks = {
142
142
  buildReport: () => Promise<RunMetricsReport>;
143
143
  estimateCostUsd: () => Promise<number | null>;
144
144
  };
145
+ export type UrlFlowEventHooks = Pick<UrlFlowHooks, "onModelChosen" | "onExtracted" | "onSlidesExtracted" | "onSlidesProgress" | "onSlidesDone" | "onSlideChunk" | "onLinkPreviewProgress" | "onSummaryCached">;
146
+ export type UrlFlowRuntimeHooks = Pick<UrlFlowHooks, "setTranscriptionCost" | "summarizeAsset" | "writeViaFooter" | "clearProgressForStdout" | "restoreProgressAfterStdout" | "setClearProgressBeforeStdout" | "clearProgressIfCurrent" | "buildReport" | "estimateCostUsd">;
147
+ export declare function createUrlFlowHooks(options: {
148
+ runtime: UrlFlowRuntimeHooks;
149
+ events?: Partial<UrlFlowEventHooks>;
150
+ }): UrlFlowHooks;
151
+ export declare function composeUrlFlowHooks(base: UrlFlowHooks, overrides: Partial<UrlFlowHooks>): UrlFlowHooks;
152
+ export declare function createUrlFlowContext(options: {
153
+ io: UrlFlowIo;
154
+ flags: UrlFlowFlags;
155
+ model: UrlFlowModel;
156
+ cache: CacheState;
157
+ mediaCache: MediaCache | null;
158
+ runtimeHooks: UrlFlowRuntimeHooks;
159
+ eventHooks?: Partial<UrlFlowEventHooks>;
160
+ }): UrlFlowContext;
145
161
  /**
146
162
  * Wiring struct for `runUrlFlow`.
147
163
  * CLI runner populates the full surface; daemon uses a smaller subset (no TTY/progress/footer),
@@ -0,0 +1,27 @@
1
+ import { type ExtractedLinkContent } from "../../../content/index.js";
2
+ import type { SlideExtractionResult } from "../../../slides/index.js";
3
+ import { type UrlExtractionUi } from "./extract.js";
4
+ import type { UrlFlowContext } from "./types.js";
5
+ export type VideoOnlyResult = {
6
+ handled: true;
7
+ } | {
8
+ handled: false;
9
+ extracted: ExtractedLinkContent;
10
+ extractionUi: UrlExtractionUi;
11
+ };
12
+ export declare function handleVideoOnlyExtractedContent({ ctx, extracted, extractionUi, isYoutubeUrl, fetchWithCache, runSlidesExtraction, renderStatus, renderStatusWithMeta, spinner, styleDim, updateSummaryProgress, accent, }: {
13
+ ctx: UrlFlowContext;
14
+ extracted: ExtractedLinkContent;
15
+ extractionUi: UrlExtractionUi;
16
+ isYoutubeUrl: boolean;
17
+ fetchWithCache: (url: string) => Promise<ExtractedLinkContent>;
18
+ runSlidesExtraction: () => Promise<SlideExtractionResult | null>;
19
+ renderStatus: (label: string, detail?: string) => string;
20
+ renderStatusWithMeta: (label: string, meta: string, suffix?: string) => string;
21
+ spinner: {
22
+ setText: (text: string) => void;
23
+ };
24
+ styleDim: (text: string) => string;
25
+ updateSummaryProgress: () => void;
26
+ accent: (text: string) => string;
27
+ }): Promise<VideoOnlyResult>;