@humain/terminal 0.0.4-beta.1 → 0.0.5
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 +26 -0
- package/README.md +1 -0
- package/dist/bun/cli.d.ts.map +1 -1
- package/dist/bun/cli.js.map +1 -1
- package/dist/bun/restore-sandbox-env.d.ts.map +1 -1
- package/dist/bun/restore-sandbox-env.js.map +1 -1
- package/dist/cli/args.d.ts +1 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +11 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/auth-check.d.ts.map +1 -1
- package/dist/cli/auth-check.js.map +1 -1
- package/dist/cli/auth-command.d.ts.map +1 -1
- package/dist/cli/auth-command.js.map +1 -1
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/credential-print.d.ts.map +1 -1
- package/dist/cli/credential-print.js.map +1 -1
- package/dist/cli/experimental/auth.d.ts.map +1 -1
- package/dist/cli/experimental/auth.js.map +1 -1
- package/dist/cli/experimental/cli.d.ts.map +1 -1
- package/dist/cli/experimental/command-options.d.ts.map +1 -1
- package/dist/cli/experimental/command-options.js.map +1 -1
- package/dist/cli/experimental/command.d.ts.map +1 -1
- package/dist/cli/experimental/command.js +2 -5
- package/dist/cli/experimental/command.js.map +1 -1
- package/dist/cli/experimental/commands/client.d.ts.map +1 -1
- package/dist/cli/experimental/commands/client.js.map +1 -1
- package/dist/cli/experimental/commands/pi.d.ts.map +1 -1
- package/dist/cli/experimental/commands/pi.js.map +1 -1
- package/dist/cli/experimental/commands/server.d.ts.map +1 -1
- package/dist/cli/experimental/commands/server.js.map +1 -1
- package/dist/cli/experimental/transport-address.d.ts.map +1 -1
- package/dist/cli/experimental/transport-address.js.map +1 -1
- package/dist/cli/file-processor.d.ts.map +1 -1
- package/dist/cli/file-processor.js.map +1 -1
- package/dist/cli/initial-message.d.ts +1 -1
- package/dist/cli/initial-message.d.ts.map +1 -1
- package/dist/cli/initial-message.js.map +1 -1
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli/project-trust.d.ts.map +1 -1
- package/dist/cli/project-trust.js.map +1 -1
- package/dist/cli/session-picker.d.ts.map +1 -1
- package/dist/cli/session-picker.js.map +1 -1
- package/dist/cli/startup-ui.d.ts.map +1 -1
- package/dist/cli/startup-ui.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/remote-session.d.ts.map +1 -1
- package/dist/client/remote-session.js.map +1 -1
- package/dist/client/transcript.d.ts.map +1 -1
- package/dist/client/transcript.js +1 -1
- package/dist/client/transcript.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +0 -8
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +36 -2
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +100 -128
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-guidance.d.ts.map +1 -1
- package/dist/core/auth-guidance.js.map +1 -1
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +3 -8
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/bash-executor.d.ts.map +1 -1
- package/dist/core/bash-executor.js.map +1 -1
- package/dist/core/cache-stats.d.ts.map +1 -1
- package/dist/core/cache-stats.js.map +1 -1
- package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
- package/dist/core/compaction/branch-summarization.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/compaction/index.d.ts.map +1 -1
- package/dist/core/compaction/utils.d.ts.map +1 -1
- package/dist/core/compaction/utils.js.map +1 -1
- package/dist/core/defaults.d.ts.map +1 -1
- package/dist/core/diagnostics.d.ts.map +1 -1
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/exec.d.ts.map +1 -1
- package/dist/core/exec.js.map +1 -1
- package/dist/core/experimental.d.ts +4 -0
- package/dist/core/experimental.d.ts.map +1 -1
- package/dist/core/experimental.js +4 -0
- package/dist/core/experimental.js.map +1 -1
- package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
- package/dist/core/export-html/ansi-to-html.js.map +1 -1
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js.map +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +22 -30
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +4 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/extensions/wrapper.d.ts.map +1 -1
- package/dist/core/extensions/wrapper.js.map +1 -1
- package/dist/core/footer-data-provider.d.ts.map +1 -1
- package/dist/core/footer-data-provider.js +17 -18
- package/dist/core/footer-data-provider.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/keybindings.d.ts +24 -0
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +0 -1
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js.map +1 -1
- package/dist/core/model-config.d.ts +5 -0
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +1 -2
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +0 -1
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +15 -25
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/models-store.d.ts.map +1 -1
- package/dist/core/models-store.js +3 -4
- package/dist/core/models-store.js.map +1 -1
- package/dist/core/output-guard.d.ts.map +1 -1
- package/dist/core/output-guard.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +0 -7
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/pi-manifest.d.ts.map +1 -1
- package/dist/core/pi-manifest.js.map +1 -1
- package/dist/core/project-trust.d.ts.map +1 -1
- package/dist/core/project-trust.js.map +1 -1
- package/dist/core/prompt-templates.d.ts.map +1 -1
- package/dist/core/prompt-templates.js.map +1 -1
- package/dist/core/provider-attribution.d.ts.map +1 -1
- package/dist/core/provider-attribution.js.map +1 -1
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/core/radius.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/resolve-config-value.d.ts.map +1 -1
- package/dist/core/resolve-config-value.js.map +1 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +0 -44
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/runtime-credentials.d.ts.map +1 -1
- package/dist/core/runtime-credentials.js +1 -2
- package/dist/core/runtime-credentials.js.map +1 -1
- package/dist/core/sdk.d.ts +5 -3
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +2 -1
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-cwd.d.ts.map +1 -1
- package/dist/core/session-cwd.js +0 -1
- package/dist/core/session-cwd.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +9 -13
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +6 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +19 -17
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/skills.d.ts.map +1 -1
- package/dist/core/skills.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/source-info.d.ts.map +1 -1
- package/dist/core/source-info.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +1 -1
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/telemetry.d.ts.map +1 -1
- package/dist/core/telemetry.js.map +1 -1
- package/dist/core/timings.d.ts.map +1 -1
- package/dist/core/timings.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +10 -5
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit-diff.d.ts.map +1 -1
- package/dist/core/tools/edit-diff.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +2 -0
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
- package/dist/core/tools/file-mutation-queue.js.map +1 -1
- package/dist/core/tools/find.d.ts +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +1 -1
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +1 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/index.d.ts.map +1 -1
- package/dist/core/tools/index.js.map +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/output-accumulator.d.ts.map +1 -1
- package/dist/core/tools/output-accumulator.js +12 -18
- package/dist/core/tools/output-accumulator.js.map +1 -1
- package/dist/core/tools/path-utils.d.ts.map +1 -1
- package/dist/core/tools/path-utils.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +2 -0
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/subagent.d.ts +3 -0
- package/dist/core/tools/subagent.d.ts.map +1 -1
- package/dist/core/tools/subagent.js +30 -9
- package/dist/core/tools/subagent.js.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
- package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
- package/dist/core/tools/truncate.d.ts.map +1 -1
- package/dist/core/tools/truncate.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +2 -1
- package/dist/core/tools/write.js.map +1 -1
- package/dist/core/trust-manager.d.ts.map +1 -1
- package/dist/core/trust-manager.js +0 -1
- package/dist/core/trust-manager.js.map +1 -1
- package/dist/core/usage-totals.d.ts.map +1 -1
- package/dist/core/usage-totals.js.map +1 -1
- package/dist/extensions/index.d.ts.map +1 -1
- package/dist/extensions/llama/client.d.ts.map +1 -1
- package/dist/extensions/llama/client.js +0 -2
- package/dist/extensions/llama/client.js.map +1 -1
- package/dist/extensions/llama/huggingface.d.ts.map +1 -1
- package/dist/extensions/llama/huggingface.js +0 -2
- package/dist/extensions/llama/huggingface.js.map +1 -1
- package/dist/extensions/llama/index.d.ts.map +1 -1
- package/dist/extensions/llama/index.js.map +1 -1
- package/dist/extensions/llama/provider.d.ts.map +1 -1
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/extensions/llama/ui.d.ts.map +1 -1
- package/dist/extensions/llama/ui.js +12 -28
- package/dist/extensions/llama/ui.js.map +1 -1
- package/dist/humain/agent-execution-protocol.d.ts.map +1 -1
- package/dist/humain/agent-execution-protocol.js.map +1 -1
- package/dist/humain/agent-execution-runtime.d.ts.map +1 -1
- package/dist/humain/agent-execution-runtime.js.map +1 -1
- package/dist/humain/bedrock-provider/vendor/index.bundle.mjs +127 -7
- package/dist/humain/brand-logo.d.ts.map +1 -1
- package/dist/humain/index.d.ts.map +1 -1
- package/dist/humain/index.js.map +1 -1
- package/dist/humain/legacy-workflow-tiers.d.ts.map +1 -1
- package/dist/humain/legacy-workflow-tiers.js.map +1 -1
- package/dist/humain/mcp-adapter/vendor/package.json +3 -3
- package/dist/humain/mcp-adapter.d.ts.map +1 -1
- package/dist/humain/mcp-adapter.js.map +1 -1
- package/dist/humain/pi-agent-execution-host.d.ts.map +1 -1
- package/dist/humain/pi-agent-execution-host.js.map +1 -1
- package/dist/humain/web-access/host.d.ts.map +1 -1
- package/dist/humain/web-access/index.d.ts.map +1 -1
- package/dist/humain/web-access/index.js.map +1 -1
- package/dist/humain/web-access/vendor/activity.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/activity.js +7 -5
- package/dist/humain/web-access/vendor/activity.js.map +1 -1
- package/dist/humain/web-access/vendor/anysearch.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/anysearch.js.map +1 -1
- package/dist/humain/web-access/vendor/auth-fetch.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/auth-fetch.js.map +1 -1
- package/dist/humain/web-access/vendor/bocha.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/bocha.js.map +1 -1
- package/dist/humain/web-access/vendor/brave.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/brave.js.map +1 -1
- package/dist/humain/web-access/vendor/brightdata-unlocker.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/brightdata-unlocker.js.map +1 -1
- package/dist/humain/web-access/vendor/brightdata.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/brightdata.js.map +1 -1
- package/dist/humain/web-access/vendor/chrome-cookies.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/chrome-cookies.js +101 -19
- package/dist/humain/web-access/vendor/chrome-cookies.js.map +1 -1
- package/dist/humain/web-access/vendor/content-find.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/content-find.js.map +1 -1
- package/dist/humain/web-access/vendor/credential-source.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/credential-source.js +0 -2
- package/dist/humain/web-access/vendor/credential-source.js.map +1 -1
- package/dist/humain/web-access/vendor/curator-page.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/curator-page.js.map +1 -1
- package/dist/humain/web-access/vendor/curator-server.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/curator-server.js.map +1 -1
- package/dist/humain/web-access/vendor/data-uri-sanitize.d.ts +21 -0
- package/dist/humain/web-access/vendor/data-uri-sanitize.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/data-uri-sanitize.js +373 -0
- package/dist/humain/web-access/vendor/data-uri-sanitize.js.map +1 -0
- package/dist/humain/web-access/vendor/datalab-pdf-extract.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/datalab-pdf-extract.js.map +1 -1
- package/dist/humain/web-access/vendor/declared-web-links.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/declared-web-links.js.map +1 -1
- package/dist/humain/web-access/vendor/duckduckgo.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/duckduckgo.js.map +1 -1
- package/dist/humain/web-access/vendor/exa.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/exa.js.map +1 -1
- package/dist/humain/web-access/vendor/extract.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/extract.js +14 -2
- package/dist/humain/web-access/vendor/extract.js.map +1 -1
- package/dist/humain/web-access/vendor/feature-config.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/feature-config.js.map +1 -1
- package/dist/humain/web-access/vendor/fetch-params.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/fetch-params.js.map +1 -1
- package/dist/humain/web-access/vendor/firecrawl.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/firecrawl.js +15 -2
- package/dist/humain/web-access/vendor/firecrawl.js.map +1 -1
- package/dist/humain/web-access/vendor/gemini-api.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/gemini-api.js.map +1 -1
- package/dist/humain/web-access/vendor/gemini-pdf-extract.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/gemini-pdf-extract.js.map +1 -1
- package/dist/humain/web-access/vendor/gemini-search.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/gemini-search.js +30 -16
- package/dist/humain/web-access/vendor/gemini-search.js.map +1 -1
- package/dist/humain/web-access/vendor/gemini-url-context.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/gemini-url-context.js.map +1 -1
- package/dist/humain/web-access/vendor/gemini-web-config.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/gemini-web-config.js.map +1 -1
- package/dist/humain/web-access/vendor/gemini-web.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/gemini-web.js.map +1 -1
- package/dist/humain/web-access/vendor/github-api.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/github-api.js.map +1 -1
- package/dist/humain/web-access/vendor/github-extract.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/github-extract.js +69 -35
- package/dist/humain/web-access/vendor/github-extract.js.map +1 -1
- package/dist/humain/web-access/vendor/index.d.ts +74 -1
- package/dist/humain/web-access/vendor/index.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/index.js +38 -15
- package/dist/humain/web-access/vendor/index.js.map +1 -1
- package/dist/humain/web-access/vendor/jina-search.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/jina-search.js.map +1 -1
- package/dist/humain/web-access/vendor/kagi.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/kagi.js.map +1 -1
- package/dist/humain/web-access/vendor/ollama.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/ollama.js.map +1 -1
- package/dist/humain/web-access/vendor/openai-search.d.ts +1 -1
- package/dist/humain/web-access/vendor/openai-search.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/openai-search.js +15 -5
- package/dist/humain/web-access/vendor/openai-search.js.map +1 -1
- package/dist/humain/web-access/vendor/page-query.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/page-query.js.map +1 -1
- package/dist/humain/web-access/vendor/parallel-mcp.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/parallel-mcp.js.map +1 -1
- package/dist/humain/web-access/vendor/parallel.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/parallel.js.map +1 -1
- package/dist/humain/web-access/vendor/pdf-extract.d.ts +1 -0
- package/dist/humain/web-access/vendor/pdf-extract.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/pdf-extract.js +15 -5
- package/dist/humain/web-access/vendor/pdf-extract.js.map +1 -1
- package/dist/humain/web-access/vendor/perplexity.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/perplexity.js.map +1 -1
- package/dist/humain/web-access/vendor/querit.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/querit.js.map +1 -1
- package/dist/humain/web-access/vendor/query-rewrite.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/query-rewrite.js.map +1 -1
- package/dist/humain/web-access/vendor/render-search-error.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/render-search-error.js.map +1 -1
- package/dist/humain/web-access/vendor/rsc-extract.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/rsc-extract.js.map +1 -1
- package/dist/humain/web-access/vendor/search1api.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/search1api.js.map +1 -1
- package/dist/humain/web-access/vendor/searchinfinity.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/searchinfinity.js.map +1 -1
- package/dist/humain/web-access/vendor/searxng.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/searxng.js.map +1 -1
- package/dist/humain/web-access/vendor/serpbase.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/serpbase.js.map +1 -1
- package/dist/humain/web-access/vendor/serpdive.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/serpdive.js.map +1 -1
- package/dist/humain/web-access/vendor/serper.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/serper.js.map +1 -1
- package/dist/humain/web-access/vendor/source-check.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/source-check.js.map +1 -1
- package/dist/humain/web-access/vendor/ssrf-protection.d.ts +2 -0
- package/dist/humain/web-access/vendor/ssrf-protection.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/ssrf-protection.js +11 -2
- package/dist/humain/web-access/vendor/ssrf-protection.js.map +1 -1
- package/dist/humain/web-access/vendor/storage.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/storage.js.map +1 -1
- package/dist/humain/web-access/vendor/summary-model-scope.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/summary-model-scope.js.map +1 -1
- package/dist/humain/web-access/vendor/summary-review.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/summary-review.js.map +1 -1
- package/dist/humain/web-access/vendor/tavily.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/tavily.js.map +1 -1
- package/dist/humain/web-access/vendor/tinyfish.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/tinyfish.js.map +1 -1
- package/dist/humain/web-access/vendor/utils.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/utils.js.map +1 -1
- package/dist/humain/web-access/vendor/valyu.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/valyu.js.map +1 -1
- package/dist/humain/web-access/vendor/video-extract.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/video-extract.js.map +1 -1
- package/dist/humain/web-access/vendor/xai-search.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/xai-search.js.map +1 -1
- package/dist/humain/web-access/vendor/youtube-extract.d.ts.map +1 -1
- package/dist/humain/web-access/vendor/youtube-extract.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +4 -0
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js.map +1 -1
- package/dist/modes/agent-exec-mode.d.ts.map +1 -1
- package/dist/modes/agent-exec-mode.js.map +1 -1
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/armin.d.ts.map +1 -1
- package/dist/modes/interactive/components/armin.js +6 -10
- package/dist/modes/interactive/components/armin.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +2 -9
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +4 -9
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
- package/dist/modes/interactive/components/bordered-loader.js +0 -3
- package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +1 -3
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +1 -3
- package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/config-selector.js +5 -22
- package/dist/modes/interactive/components/config-selector.js.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
- package/dist/modes/interactive/components/countdown-timer.js +0 -5
- package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +1 -8
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-entry.js +1 -4
- package/dist/modes/interactive/components/custom-entry.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +1 -7
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
- package/dist/modes/interactive/components/daxnuts.js +6 -8
- package/dist/modes/interactive/components/daxnuts.js.map +1 -1
- package/dist/modes/interactive/components/diff.d.ts.map +1 -1
- package/dist/modes/interactive/components/diff.js +2 -2
- package/dist/modes/interactive/components/diff.js.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
- package/dist/modes/interactive/components/dynamic-border.js +0 -1
- package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
- package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-editor.js +1 -7
- package/dist/modes/interactive/components/extension-editor.js.map +1 -1
- package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-input.js +2 -8
- package/dist/modes/interactive/components/extension-input.js.map +1 -1
- package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/extension-selector.js +1 -9
- package/dist/modes/interactive/components/extension-selector.js.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
- package/dist/modes/interactive/components/first-time-setup.js +2 -4
- package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +1 -3
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/index.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
- package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
- package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
- package/dist/modes/interactive/components/login-dialog.js +3 -9
- package/dist/modes/interactive/components/login-dialog.js.map +1 -1
- package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -1
- package/dist/modes/interactive/components/markdown-transform.js.map +1 -1
- package/dist/modes/interactive/components/mermaid.d.ts.map +1 -1
- package/dist/modes/interactive/components/mermaid.js.map +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +14 -26
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/oauth-selector.js +3 -11
- package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +9 -14
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +33 -57
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +10 -14
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/show-images-selector.js +0 -1
- package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +1 -3
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-indicator.js +0 -2
- package/dist/modes/interactive/components/status-indicator.js.map +1 -1
- package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/theme-selector.js +0 -2
- package/dist/modes/interactive/components/theme-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-selector.js +0 -1
- package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +19 -25
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/tree-selector.js +18 -34
- package/dist/modes/interactive/components/tree-selector.js.map +1 -1
- package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/trust-selector.js +0 -6
- package/dist/modes/interactive/components/trust-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message-selector.js +3 -6
- package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +0 -4
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
- package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
- package/dist/modes/interactive/external-editor.d.ts.map +1 -1
- package/dist/modes/interactive/external-editor.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +18 -2
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +147 -137
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/model-catalog-refresh.d.ts +7 -0
- package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -0
- package/dist/modes/interactive/model-catalog-refresh.js +36 -0
- package/dist/modes/interactive/model-catalog-refresh.js.map +1 -0
- package/dist/modes/interactive/model-search.d.ts.map +1 -1
- package/dist/modes/interactive/model-search.js.map +1 -1
- package/dist/modes/interactive/theme/dark.json +2 -0
- package/dist/modes/interactive/theme/light.json +2 -0
- package/dist/modes/interactive/theme/theme-controller.d.ts +10 -2
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.js +25 -18
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
- package/dist/modes/interactive/theme/theme-schema.json +9 -1
- package/dist/modes/interactive/theme/theme.d.ts +7 -5
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +12 -8
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/json-event.d.ts +4 -1
- package/dist/modes/json-event.d.ts.map +1 -1
- package/dist/modes/json-event.js +5 -2
- package/dist/modes/json-event.js.map +1 -1
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/jsonl.d.ts.map +1 -1
- package/dist/modes/rpc/jsonl.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +9 -10
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/rpc-entry.d.ts.map +1 -1
- package/dist/rpc-entry.js.map +1 -1
- package/dist/server/create-harness.d.ts.map +1 -1
- package/dist/server/create-harness.js +2 -0
- package/dist/server/create-harness.js.map +1 -1
- package/dist/utils/abort.d.ts.map +1 -1
- package/dist/utils/abort.js.map +1 -1
- package/dist/utils/ansi.d.ts.map +1 -1
- package/dist/utils/ansi.js.map +1 -1
- package/dist/utils/changelog.d.ts.map +1 -1
- package/dist/utils/changelog.js.map +1 -1
- package/dist/utils/child-process.d.ts.map +1 -1
- package/dist/utils/child-process.js.map +1 -1
- package/dist/utils/clipboard-image.d.ts.map +1 -1
- package/dist/utils/clipboard-image.js +1 -1
- package/dist/utils/clipboard-image.js.map +1 -1
- package/dist/utils/clipboard-native.d.ts.map +1 -1
- package/dist/utils/clipboard-native.js.map +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/deprecation.d.ts.map +1 -1
- package/dist/utils/deprecation.js.map +1 -1
- package/dist/utils/exif-orientation.d.ts.map +1 -1
- package/dist/utils/exif-orientation.js.map +1 -1
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/fs-watch.d.ts.map +1 -1
- package/dist/utils/fs-watch.js.map +1 -1
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js.map +1 -1
- package/dist/utils/html.d.ts.map +1 -1
- package/dist/utils/html.js.map +1 -1
- package/dist/utils/image-convert.d.ts.map +1 -1
- package/dist/utils/image-convert.js.map +1 -1
- package/dist/utils/image-process.d.ts.map +1 -1
- package/dist/utils/image-process.js.map +1 -1
- package/dist/utils/image-resize-core.d.ts.map +1 -1
- package/dist/utils/image-resize-core.js.map +1 -1
- package/dist/utils/image-resize-worker.d.ts.map +1 -1
- package/dist/utils/image-resize-worker.js.map +1 -1
- package/dist/utils/image-resize.d.ts.map +1 -1
- package/dist/utils/image-resize.js.map +1 -1
- package/dist/utils/json.d.ts.map +1 -1
- package/dist/utils/json.js.map +1 -1
- package/dist/utils/management-http.d.ts.map +1 -1
- package/dist/utils/management-http.js.map +1 -1
- package/dist/utils/mime.d.ts.map +1 -1
- package/dist/utils/mime.js.map +1 -1
- package/dist/utils/open-browser.d.ts.map +1 -1
- package/dist/utils/open-browser.js.map +1 -1
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/photon.d.ts.map +1 -1
- package/dist/utils/photon.js.map +1 -1
- package/dist/utils/pi-user-agent.d.ts.map +1 -1
- package/dist/utils/pi-user-agent.js.map +1 -1
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js.map +1 -1
- package/dist/utils/sleep.d.ts.map +1 -1
- package/dist/utils/sleep.js.map +1 -1
- package/dist/utils/syntax-highlight.d.ts.map +1 -1
- package/dist/utils/syntax-highlight.js +1 -1
- package/dist/utils/syntax-highlight.js.map +1 -1
- package/dist/utils/tool-result-images.d.ts.map +1 -1
- package/dist/utils/tool-result-images.js.map +1 -1
- package/dist/utils/tools-manager.d.ts +10 -1
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +14 -19
- package/dist/utils/tools-manager.js.map +1 -1
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js.map +1 -1
- package/dist/utils/windows-self-update.d.ts.map +1 -1
- package/dist/utils/windows-self-update.js.map +1 -1
- package/docs/compaction.md +3 -3
- package/docs/custom-provider.md +1 -1
- package/docs/environment-variables.md +1 -0
- package/docs/extensions.md +4 -0
- package/docs/json.md +6 -4
- package/docs/keybindings.md +8 -2
- package/docs/rpc.md +15 -4
- package/docs/sdk.md +9 -0
- package/docs/settings.md +31 -0
- package/docs/terminal-setup.md +23 -2
- package/docs/themes.md +23 -3
- package/docs/tui.md +2 -2
- package/docs/usage.md +3 -2
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +2 -2
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/minimal-mode.ts +6 -6
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +2 -2
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/npm-shrinkwrap.json +853 -661
- package/package.json +33 -33
- package/src/humain/web-access/UPSTREAM.md +1 -1
- package/src/humain/web-access/upstream.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tinyfish.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/tinyfish.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAoDrE,UAAU,qBAAsB,SAAQ,aAAa;IACpD,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;AAqBD,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAoBD,wBAAgB,mBAAmB,IAAI,OAAO,CAM7C;AAsND,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,cAAc,CAAC,CAuCpH;AAED,wBAAsB,mBAAmB,CACxC,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,GAAE,cAAmB,GAC1B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA+BlC","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { activityMonitor } from \"./activity.ts\";\nimport type { ExtractedContent, ExtractOptions } from \"./extract.ts\";\nimport type { SearchOptions, SearchResponse } from \"./perplexity.ts\";\nimport { hasCredentialSource, redactCredential, resolveCredential } from \"./credential-source.ts\";\nimport { getWebSearchConfigPath } from \"./utils.ts\";\n\nconst TINYFISH_SEARCH_URL = \"https://api.search.tinyfish.ai\";\nconst TINYFISH_FETCH_URL = \"https://api.fetch.tinyfish.ai\";\nconst CONFIG_PATH = getWebSearchConfigPath();\nconst SEARCH_TIMEOUT_MS = 60_000;\nconst FETCH_TIMEOUT_MS = 150_000;\nconst MAX_FETCH_URLS = 10;\nconst MAX_FETCH_PER_URL_TIMEOUT_MS = 110_000;\n\ninterface WebSearchConfig {\n\ttinyfishApiKey?: unknown;\n}\n\ninterface TinyFishSearchResult {\n\tposition?: number;\n\tsite_name?: string | null;\n\ttitle?: string | null;\n\tsnippet?: string | null;\n\turl?: string | null;\n\tdate?: string | null;\n\tpublisher?: string | null;\n}\n\ninterface TinyFishSearchResponse {\n\tquery?: string;\n\tresults?: TinyFishSearchResult[];\n\ttotal_results?: number;\n\tpage?: number;\n}\n\ninterface TinyFishFetchResult {\n\turl?: string;\n\tfinal_url?: string;\n\ttitle?: string | null;\n\ttext?: string | Record<string, unknown> | null;\n\tformat?: string;\n}\n\ninterface TinyFishFetchError {\n\turl?: string;\n\terror?: string;\n\tstatus?: number;\n}\n\ninterface TinyFishFetchResponse {\n\tresults?: TinyFishFetchResult[];\n\terrors?: TinyFishFetchError[];\n}\n\ninterface TinyFishSearchOptions extends SearchOptions {\n\tincludeContent?: boolean;\n}\n\nlet cachedConfig: WebSearchConfig | null = null;\n\nfunction loadConfig(): WebSearchConfig {\n\tif (cachedConfig) return cachedConfig;\n\tif (!existsSync(CONFIG_PATH)) {\n\t\tcachedConfig = {};\n\t\treturn cachedConfig;\n\t}\n\n\tconst raw = readFileSync(CONFIG_PATH, \"utf-8\");\n\ttry {\n\t\tcachedConfig = JSON.parse(raw) as WebSearchConfig;\n\t\treturn cachedConfig;\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${CONFIG_PATH}: ${message}`);\n\t}\n}\n\nexport function clearTinyFishConfigCache(): void {\n\tcachedConfig = null;\n}\n\nasync function getApiKey(signal?: AbortSignal): Promise<string> {\n\tconst key = await resolveCredential({\n\t\tprovider: \"TinyFish\",\n\t\tconfiguredValue: loadConfig().tinyfishApiKey,\n\t\tenvironmentValue: process.env.TINYFISH_API_KEY,\n\t\tsignal,\n\t});\n\tif (!key) {\n\t\tthrow new Error(\n\t\t\t\"TinyFish API key not found. Either:\\n\" +\n\t\t\t` 1. Create ${CONFIG_PATH} with { \"tinyfishApiKey\": \"your-key\" }\\n` +\n\t\t\t\" 2. Set TINYFISH_API_KEY environment variable\\n\" +\n\t\t\t\"Get a key at https://agent.tinyfish.ai/api-keys\",\n\t\t);\n\t}\n\treturn key;\n}\n\nexport function isTinyFishAvailable(): boolean {\n\treturn hasCredentialSource({\n\t\tprovider: \"TinyFish\",\n\t\tconfiguredValue: loadConfig().tinyfishApiKey,\n\t\tenvironmentValue: process.env.TINYFISH_API_KEY,\n\t});\n}\n\nfunction errorMessage(err: unknown): string {\n\treturn err instanceof Error ? err.message : String(err);\n}\n\nfunction requestSignal(signal: AbortSignal | undefined, timeoutMs: number): AbortSignal {\n\tconst timeout = AbortSignal.timeout(timeoutMs);\n\treturn signal ? AbortSignal.any([signal, timeout]) : timeout;\n}\n\nfunction normalizeDomain(value: string): string | null {\n\tlet input = value.trim().toLowerCase();\n\tif (!input) return null;\n\tif (input.startsWith(\"-\")) input = input.slice(1).trim();\n\tif (!input) return null;\n\ttry {\n\t\tconst parsed = input.includes(\"://\") ? new URL(input) : new URL(`https://${input}`);\n\t\tinput = parsed.hostname;\n\t} catch {\n\t\tinput = input.split(\"/\")[0]?.split(\":\")[0] ?? \"\";\n\t}\n\tinput = input.replace(/^\\.+|\\.+$/g, \"\");\n\treturn /^[a-z0-9][a-z0-9.-]*\\.[a-z]{2,}$/i.test(input) ? input : null;\n}\n\nfunction mapDomainFilter(domainFilter: string[] | undefined): { includeDomains: string[]; excludeDomains: string[] } {\n\tconst includeDomains: string[] = [];\n\tconst excludeDomains: string[] = [];\n\tfor (const raw of domainFilter ?? []) {\n\t\tconst domain = normalizeDomain(raw);\n\t\tif (!domain) continue;\n\t\tconst target = raw.trim().startsWith(\"-\") ? excludeDomains : includeDomains;\n\t\tif (!target.includes(domain)) target.push(domain);\n\t}\n\treturn { includeDomains, excludeDomains };\n}\n\nfunction recencyMinutes(filter: SearchOptions[\"recencyFilter\"]): number | undefined {\n\tif (!filter) return undefined;\n\tconst minutes: Record<NonNullable<SearchOptions[\"recencyFilter\"]>, number> = {\n\t\tday: 1_440,\n\t\tweek: 10_080,\n\t\tmonth: 43_200,\n\t\tyear: 525_600,\n\t};\n\treturn minutes[filter];\n}\n\nfunction normalizeNumResults(value: number | undefined): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return 5;\n\treturn Math.max(1, Math.min(Math.floor(value), 20));\n}\n\nfunction buildSearchUrl(query: string, options: SearchOptions, page: number): string {\n\tconst params = new URLSearchParams({ query });\n\tconst { includeDomains, excludeDomains } = mapDomainFilter(options.domainFilter);\n\tif (includeDomains.length > 0) params.set(\"include_domains\", includeDomains.join(\",\"));\n\tif (excludeDomains.length > 0) params.set(\"exclude_domains\", excludeDomains.join(\",\"));\n\tconst recency = recencyMinutes(options.recencyFilter);\n\tif (recency !== undefined) params.set(\"recency_minutes\", String(recency));\n\tif (page > 0) params.set(\"page\", String(page));\n\treturn `${TINYFISH_SEARCH_URL}?${params.toString()}`;\n}\n\nasync function tinyFishJsonRequest<T>(\n\tlabel: \"Search\" | \"Fetch\",\n\turl: string,\n\tapiKey: string,\n\tinit: RequestInit,\n\ttimeoutMs: number,\n\tsignal?: AbortSignal,\n): Promise<T> {\n\tlet response: Response;\n\ttry {\n\t\tresponse = await fetch(url, {\n\t\t\t...init,\n\t\t\theaders: {\n\t\t\t\t\"X-API-Key\": apiKey,\n\t\t\t\t...(init.body ? { \"Content-Type\": \"application/json\" } : {}),\n\t\t\t\t...init.headers,\n\t\t\t},\n\t\t\tsignal: requestSignal(signal, timeoutMs),\n\t\t});\n\t} catch (err) {\n\t\tconst message = errorMessage(err);\n\t\tconst redactedMessage = redactCredential(message, apiKey);\n\t\tif (redactedMessage === message) throw err;\n\t\tconst redactedError = new Error(redactedMessage);\n\t\tif (err instanceof Error) redactedError.name = err.name;\n\t\tthrow redactedError;\n\t}\n\n\tconst raw = await response.text();\n\tif (!response.ok) {\n\t\tthrow new Error(`TinyFish ${label} API error ${response.status}: ${redactCredential(raw, apiKey).slice(0, 300)}`);\n\t}\n\ttry {\n\t\treturn JSON.parse(raw) as T;\n\t} catch (err) {\n\t\tthrow new Error(`TinyFish ${label} API returned invalid JSON: ${errorMessage(err)}`);\n\t}\n}\n\nfunction mapSearchResults(results: TinyFishSearchResult[] | undefined): SearchResponse[\"results\"] {\n\tif (!Array.isArray(results)) return [];\n\treturn results.flatMap((item) => {\n\t\tif (!item || typeof item.url !== \"string\" || item.url.trim().length === 0) return [];\n\t\tconst url = item.url.trim();\n\t\treturn [{\n\t\t\ttitle: typeof item.title === \"string\" && item.title.trim() ? item.title.trim() : url,\n\t\t\turl,\n\t\t\tsnippet: typeof item.snippet === \"string\" ? item.snippet.replace(/\\s+/g, \" \").trim() : \"\",\n\t\t}];\n\t});\n}\n\nfunction deduplicateResults(results: SearchResponse[\"results\"], limit: number): SearchResponse[\"results\"] {\n\tconst seen = new Set<string>();\n\tconst unique: SearchResponse[\"results\"] = [];\n\tfor (const result of results) {\n\t\tif (seen.has(result.url)) continue;\n\t\tseen.add(result.url);\n\t\tunique.push(result);\n\t\tif (unique.length >= limit) break;\n\t}\n\treturn unique;\n}\n\nfunction buildAnswer(results: SearchResponse[\"results\"]): string {\n\treturn results.map((result) => {\n\t\tif (result.snippet) return `${result.snippet}\\nSource: ${result.title} (${result.url})`;\n\t\treturn `Source: ${result.title} (${result.url})`;\n\t}).join(\"\\n\\n\");\n}\n\nfunction fetchPerUrlTimeout(value: number | undefined): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return MAX_FETCH_PER_URL_TIMEOUT_MS;\n\treturn Math.max(1, Math.min(Math.floor(value), MAX_FETCH_PER_URL_TIMEOUT_MS));\n}\n\nfunction fetchBody(urls: string[], options: ExtractOptions = {}): Record<string, unknown> {\n\tconst body: Record<string, unknown> = {\n\t\turls,\n\t\tformat: \"markdown\",\n\t\tper_url_timeout_ms: fetchPerUrlTimeout(options.timeoutMs),\n\t};\n\tconst purpose = options.prompt?.trim();\n\tif (purpose) body.purpose = purpose.slice(0, 2_000);\n\treturn body;\n}\n\nfunction findFetchError(errors: TinyFishFetchError[] | undefined, url: string): TinyFishFetchError | undefined {\n\tif (!Array.isArray(errors)) return undefined;\n\treturn errors.find(item => item?.url === url) ?? errors[0];\n}\n\nfunction fetchResultContent(result: TinyFishFetchResult): string {\n\tif (typeof result.text === \"string\") return result.text.trim();\n\tif (result.text && typeof result.text === \"object\") return JSON.stringify(result.text, null, 2);\n\treturn \"\";\n}\n\nfunction mapFetchResult(result: TinyFishFetchResult | undefined, requestedUrl: string): ExtractedContent | null {\n\tif (!result) return null;\n\tconst content = fetchResultContent(result);\n\tif (!content) return null;\n\treturn {\n\t\turl: requestedUrl,\n\t\ttitle: typeof result.title === \"string\" ? result.title.trim() : \"\",\n\t\tcontent,\n\t\terror: null,\n\t};\n}\n\nasync function fetchBatch(\n\turls: string[],\n\tapiKey: string,\n\tsignal?: AbortSignal,\n\toptions: ExtractOptions = {},\n): Promise<TinyFishFetchResponse> {\n\treturn tinyFishJsonRequest<TinyFishFetchResponse>(\n\t\t\"Fetch\",\n\t\tTINYFISH_FETCH_URL,\n\t\tapiKey,\n\t\t{ method: \"POST\", body: JSON.stringify(fetchBody(urls, options)) },\n\t\tFETCH_TIMEOUT_MS,\n\t\tsignal,\n\t);\n}\n\nasync function fetchInlineContent(\n\turls: string[],\n\tapiKey: string,\n\tsignal?: AbortSignal,\n): Promise<ExtractedContent[]> {\n\tconst content: ExtractedContent[] = [];\n\tfor (let offset = 0; offset < urls.length; offset += MAX_FETCH_URLS) {\n\t\tconst batch = urls.slice(offset, offset + MAX_FETCH_URLS);\n\t\tconst data = await fetchBatch(batch, apiKey, signal);\n\t\tif (!Array.isArray(data.results) || !Array.isArray(data.errors)) {\n\t\t\tthrow new Error(\"TinyFish Fetch API returned an unexpected response shape\");\n\t\t}\n\t\tfor (const url of batch) {\n\t\t\tconst result = Array.isArray(data.results)\n\t\t\t\t? data.results.find(item => item?.url === url || item?.final_url === url)\n\t\t\t\t: undefined;\n\t\t\tconst mapped = mapFetchResult(result, url);\n\t\t\tif (mapped) content.push(mapped);\n\t\t}\n\t}\n\treturn content;\n}\n\nexport async function searchWithTinyFish(query: string, options: TinyFishSearchOptions = {}): Promise<SearchResponse> {\n\tconst apiKey = await getApiKey(options.signal);\n\tconst numResults = normalizeNumResults(options.numResults);\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query });\n\ttry {\n\t\tconst combined: SearchResponse[\"results\"] = [];\n\t\tconst pages = numResults > 10 ? 2 : 1;\n\t\tfor (let page = 0; page < pages; page++) {\n\t\t\tconst data = await tinyFishJsonRequest<TinyFishSearchResponse>(\n\t\t\t\t\"Search\",\n\t\t\t\tbuildSearchUrl(query, options, page),\n\t\t\t\tapiKey,\n\t\t\t\t{ method: \"GET\" },\n\t\t\t\tSEARCH_TIMEOUT_MS,\n\t\t\t\toptions.signal,\n\t\t\t);\n\t\t\tif (!Array.isArray(data.results)) throw new Error(\"TinyFish Search API returned an unexpected response shape\");\n\t\t\tcombined.push(...mapSearchResults(data.results));\n\t\t\tif (data.results.length < 10) break;\n\t\t}\n\n\t\tconst results = deduplicateResults(combined, numResults);\n\t\tconst response: SearchResponse = { answer: buildAnswer(results), results };\n\t\tif (options.includeContent && results.length > 0) {\n\t\t\tconst inlineContent = await fetchInlineContent(results.map(result => result.url), apiKey, options.signal);\n\t\t\tif (inlineContent.length > 0) response.inlineContent = inlineContent;\n\t\t}\n\t\tactivityMonitor.logComplete(activityId, 200);\n\t\treturn response;\n\t} catch (err) {\n\t\tconst message = errorMessage(err);\n\t\tconst redactedMessage = redactCredential(message, apiKey);\n\t\tif (redactedMessage.toLowerCase().includes(\"abort\")) activityMonitor.logComplete(activityId, 0);\n\t\telse activityMonitor.logError(activityId, redactedMessage);\n\t\tif (redactedMessage === message) throw err;\n\t\tconst redactedError = new Error(redactedMessage);\n\t\tif (err instanceof Error) redactedError.name = err.name;\n\t\tthrow redactedError;\n\t}\n}\n\nexport async function extractWithTinyFish(\n\turl: string,\n\tsignal?: AbortSignal,\n\toptions: ExtractOptions = {},\n): Promise<ExtractedContent | null> {\n\tconst apiKey = await getApiKey(signal);\n\tconst activityId = activityMonitor.logStart({ type: \"fetch\", url });\n\ttry {\n\t\tconst data = await fetchBatch([url], apiKey, signal, options);\n\t\tif (!Array.isArray(data.results) || !Array.isArray(data.errors)) {\n\t\t\tthrow new Error(\"TinyFish Fetch API returned an unexpected response shape\");\n\t\t}\n\t\tconst result = data.results.find(item => item?.url === url || item?.final_url === url) ?? data.results[0];\n\t\tconst mapped = mapFetchResult(result, url);\n\t\tif (mapped) {\n\t\t\tactivityMonitor.logComplete(activityId, 200);\n\t\t\treturn mapped;\n\t\t}\n\t\tconst fetchError = findFetchError(data.errors, url);\n\t\tif (fetchError) {\n\t\t\tconst status = typeof fetchError.status === \"number\" ? ` (HTTP ${fetchError.status})` : \"\";\n\t\t\tthrow new Error(`TinyFish Fetch failed for ${url}: ${fetchError.error || \"unknown error\"}${status}`);\n\t\t}\n\t\tactivityMonitor.logComplete(activityId, 200);\n\t\treturn null;\n\t} catch (err) {\n\t\tconst message = errorMessage(err);\n\t\tconst redactedMessage = redactCredential(message, apiKey);\n\t\tif (redactedMessage.toLowerCase().includes(\"abort\")) activityMonitor.logComplete(activityId, 0);\n\t\telse activityMonitor.logError(activityId, redactedMessage);\n\t\tif (redactedMessage === message) throw err;\n\t\tconst redactedError = new Error(redactedMessage);\n\t\tif (err instanceof Error) redactedError.name = err.name;\n\t\tthrow redactedError;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tinyfish.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/tinyfish.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAoDrE,UAAU,qBAAsB,SAAQ,aAAa;IACpD,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;AAqBD,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAoBD,wBAAgB,mBAAmB,IAAI,OAAO,CAM7C;AAsND,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,cAAc,CAAC,CAuCpH;AAED,wBAAsB,mBAAmB,CACxC,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,GAAE,cAAmB,GAC1B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CA+BlC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tinyfish.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/tinyfish.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { activityMonitor } from \"./activity.ts\";\nimport type { ExtractedContent, ExtractOptions } from \"./extract.ts\";\nimport type { SearchOptions, SearchResponse } from \"./perplexity.ts\";\nimport { hasCredentialSource, redactCredential, resolveCredential } from \"./credential-source.ts\";\nimport { getWebSearchConfigPath } from \"./utils.ts\";\n\nconst TINYFISH_SEARCH_URL = \"https://api.search.tinyfish.ai\";\nconst TINYFISH_FETCH_URL = \"https://api.fetch.tinyfish.ai\";\nconst CONFIG_PATH = getWebSearchConfigPath();\nconst SEARCH_TIMEOUT_MS = 60_000;\nconst FETCH_TIMEOUT_MS = 150_000;\nconst MAX_FETCH_URLS = 10;\nconst MAX_FETCH_PER_URL_TIMEOUT_MS = 110_000;\n\ninterface WebSearchConfig {\n\ttinyfishApiKey?: unknown;\n}\n\ninterface TinyFishSearchResult {\n\tposition?: number;\n\tsite_name?: string | null;\n\ttitle?: string | null;\n\tsnippet?: string | null;\n\turl?: string | null;\n\tdate?: string | null;\n\tpublisher?: string | null;\n}\n\ninterface TinyFishSearchResponse {\n\tquery?: string;\n\tresults?: TinyFishSearchResult[];\n\ttotal_results?: number;\n\tpage?: number;\n}\n\ninterface TinyFishFetchResult {\n\turl?: string;\n\tfinal_url?: string;\n\ttitle?: string | null;\n\ttext?: string | Record<string, unknown> | null;\n\tformat?: string;\n}\n\ninterface TinyFishFetchError {\n\turl?: string;\n\terror?: string;\n\tstatus?: number;\n}\n\ninterface TinyFishFetchResponse {\n\tresults?: TinyFishFetchResult[];\n\terrors?: TinyFishFetchError[];\n}\n\ninterface TinyFishSearchOptions extends SearchOptions {\n\tincludeContent?: boolean;\n}\n\nlet cachedConfig: WebSearchConfig | null = null;\n\nfunction loadConfig(): WebSearchConfig {\n\tif (cachedConfig) return cachedConfig;\n\tif (!existsSync(CONFIG_PATH)) {\n\t\tcachedConfig = {};\n\t\treturn cachedConfig;\n\t}\n\n\tconst raw = readFileSync(CONFIG_PATH, \"utf-8\");\n\ttry {\n\t\tcachedConfig = JSON.parse(raw) as WebSearchConfig;\n\t\treturn cachedConfig;\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${CONFIG_PATH}: ${message}`);\n\t}\n}\n\nexport function clearTinyFishConfigCache(): void {\n\tcachedConfig = null;\n}\n\nasync function getApiKey(signal?: AbortSignal): Promise<string> {\n\tconst key = await resolveCredential({\n\t\tprovider: \"TinyFish\",\n\t\tconfiguredValue: loadConfig().tinyfishApiKey,\n\t\tenvironmentValue: process.env.TINYFISH_API_KEY,\n\t\tsignal,\n\t});\n\tif (!key) {\n\t\tthrow new Error(\n\t\t\t\"TinyFish API key not found. Either:\\n\" +\n\t\t\t` 1. Create ${CONFIG_PATH} with { \"tinyfishApiKey\": \"your-key\" }\\n` +\n\t\t\t\" 2. Set TINYFISH_API_KEY environment variable\\n\" +\n\t\t\t\"Get a key at https://agent.tinyfish.ai/api-keys\",\n\t\t);\n\t}\n\treturn key;\n}\n\nexport function isTinyFishAvailable(): boolean {\n\treturn hasCredentialSource({\n\t\tprovider: \"TinyFish\",\n\t\tconfiguredValue: loadConfig().tinyfishApiKey,\n\t\tenvironmentValue: process.env.TINYFISH_API_KEY,\n\t});\n}\n\nfunction errorMessage(err: unknown): string {\n\treturn err instanceof Error ? err.message : String(err);\n}\n\nfunction requestSignal(signal: AbortSignal | undefined, timeoutMs: number): AbortSignal {\n\tconst timeout = AbortSignal.timeout(timeoutMs);\n\treturn signal ? AbortSignal.any([signal, timeout]) : timeout;\n}\n\nfunction normalizeDomain(value: string): string | null {\n\tlet input = value.trim().toLowerCase();\n\tif (!input) return null;\n\tif (input.startsWith(\"-\")) input = input.slice(1).trim();\n\tif (!input) return null;\n\ttry {\n\t\tconst parsed = input.includes(\"://\") ? new URL(input) : new URL(`https://${input}`);\n\t\tinput = parsed.hostname;\n\t} catch {\n\t\tinput = input.split(\"/\")[0]?.split(\":\")[0] ?? \"\";\n\t}\n\tinput = input.replace(/^\\.+|\\.+$/g, \"\");\n\treturn /^[a-z0-9][a-z0-9.-]*\\.[a-z]{2,}$/i.test(input) ? input : null;\n}\n\nfunction mapDomainFilter(domainFilter: string[] | undefined): { includeDomains: string[]; excludeDomains: string[] } {\n\tconst includeDomains: string[] = [];\n\tconst excludeDomains: string[] = [];\n\tfor (const raw of domainFilter ?? []) {\n\t\tconst domain = normalizeDomain(raw);\n\t\tif (!domain) continue;\n\t\tconst target = raw.trim().startsWith(\"-\") ? excludeDomains : includeDomains;\n\t\tif (!target.includes(domain)) target.push(domain);\n\t}\n\treturn { includeDomains, excludeDomains };\n}\n\nfunction recencyMinutes(filter: SearchOptions[\"recencyFilter\"]): number | undefined {\n\tif (!filter) return undefined;\n\tconst minutes: Record<NonNullable<SearchOptions[\"recencyFilter\"]>, number> = {\n\t\tday: 1_440,\n\t\tweek: 10_080,\n\t\tmonth: 43_200,\n\t\tyear: 525_600,\n\t};\n\treturn minutes[filter];\n}\n\nfunction normalizeNumResults(value: number | undefined): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return 5;\n\treturn Math.max(1, Math.min(Math.floor(value), 20));\n}\n\nfunction buildSearchUrl(query: string, options: SearchOptions, page: number): string {\n\tconst params = new URLSearchParams({ query });\n\tconst { includeDomains, excludeDomains } = mapDomainFilter(options.domainFilter);\n\tif (includeDomains.length > 0) params.set(\"include_domains\", includeDomains.join(\",\"));\n\tif (excludeDomains.length > 0) params.set(\"exclude_domains\", excludeDomains.join(\",\"));\n\tconst recency = recencyMinutes(options.recencyFilter);\n\tif (recency !== undefined) params.set(\"recency_minutes\", String(recency));\n\tif (page > 0) params.set(\"page\", String(page));\n\treturn `${TINYFISH_SEARCH_URL}?${params.toString()}`;\n}\n\nasync function tinyFishJsonRequest<T>(\n\tlabel: \"Search\" | \"Fetch\",\n\turl: string,\n\tapiKey: string,\n\tinit: RequestInit,\n\ttimeoutMs: number,\n\tsignal?: AbortSignal,\n): Promise<T> {\n\tlet response: Response;\n\ttry {\n\t\tresponse = await fetch(url, {\n\t\t\t...init,\n\t\t\theaders: {\n\t\t\t\t\"X-API-Key\": apiKey,\n\t\t\t\t...(init.body ? { \"Content-Type\": \"application/json\" } : {}),\n\t\t\t\t...init.headers,\n\t\t\t},\n\t\t\tsignal: requestSignal(signal, timeoutMs),\n\t\t});\n\t} catch (err) {\n\t\tconst message = errorMessage(err);\n\t\tconst redactedMessage = redactCredential(message, apiKey);\n\t\tif (redactedMessage === message) throw err;\n\t\tconst redactedError = new Error(redactedMessage);\n\t\tif (err instanceof Error) redactedError.name = err.name;\n\t\tthrow redactedError;\n\t}\n\n\tconst raw = await response.text();\n\tif (!response.ok) {\n\t\tthrow new Error(`TinyFish ${label} API error ${response.status}: ${redactCredential(raw, apiKey).slice(0, 300)}`);\n\t}\n\ttry {\n\t\treturn JSON.parse(raw) as T;\n\t} catch (err) {\n\t\tthrow new Error(`TinyFish ${label} API returned invalid JSON: ${errorMessage(err)}`);\n\t}\n}\n\nfunction mapSearchResults(results: TinyFishSearchResult[] | undefined): SearchResponse[\"results\"] {\n\tif (!Array.isArray(results)) return [];\n\treturn results.flatMap((item) => {\n\t\tif (!item || typeof item.url !== \"string\" || item.url.trim().length === 0) return [];\n\t\tconst url = item.url.trim();\n\t\treturn [{\n\t\t\ttitle: typeof item.title === \"string\" && item.title.trim() ? item.title.trim() : url,\n\t\t\turl,\n\t\t\tsnippet: typeof item.snippet === \"string\" ? item.snippet.replace(/\\s+/g, \" \").trim() : \"\",\n\t\t}];\n\t});\n}\n\nfunction deduplicateResults(results: SearchResponse[\"results\"], limit: number): SearchResponse[\"results\"] {\n\tconst seen = new Set<string>();\n\tconst unique: SearchResponse[\"results\"] = [];\n\tfor (const result of results) {\n\t\tif (seen.has(result.url)) continue;\n\t\tseen.add(result.url);\n\t\tunique.push(result);\n\t\tif (unique.length >= limit) break;\n\t}\n\treturn unique;\n}\n\nfunction buildAnswer(results: SearchResponse[\"results\"]): string {\n\treturn results.map((result) => {\n\t\tif (result.snippet) return `${result.snippet}\\nSource: ${result.title} (${result.url})`;\n\t\treturn `Source: ${result.title} (${result.url})`;\n\t}).join(\"\\n\\n\");\n}\n\nfunction fetchPerUrlTimeout(value: number | undefined): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return MAX_FETCH_PER_URL_TIMEOUT_MS;\n\treturn Math.max(1, Math.min(Math.floor(value), MAX_FETCH_PER_URL_TIMEOUT_MS));\n}\n\nfunction fetchBody(urls: string[], options: ExtractOptions = {}): Record<string, unknown> {\n\tconst body: Record<string, unknown> = {\n\t\turls,\n\t\tformat: \"markdown\",\n\t\tper_url_timeout_ms: fetchPerUrlTimeout(options.timeoutMs),\n\t};\n\tconst purpose = options.prompt?.trim();\n\tif (purpose) body.purpose = purpose.slice(0, 2_000);\n\treturn body;\n}\n\nfunction findFetchError(errors: TinyFishFetchError[] | undefined, url: string): TinyFishFetchError | undefined {\n\tif (!Array.isArray(errors)) return undefined;\n\treturn errors.find(item => item?.url === url) ?? errors[0];\n}\n\nfunction fetchResultContent(result: TinyFishFetchResult): string {\n\tif (typeof result.text === \"string\") return result.text.trim();\n\tif (result.text && typeof result.text === \"object\") return JSON.stringify(result.text, null, 2);\n\treturn \"\";\n}\n\nfunction mapFetchResult(result: TinyFishFetchResult | undefined, requestedUrl: string): ExtractedContent | null {\n\tif (!result) return null;\n\tconst content = fetchResultContent(result);\n\tif (!content) return null;\n\treturn {\n\t\turl: requestedUrl,\n\t\ttitle: typeof result.title === \"string\" ? result.title.trim() : \"\",\n\t\tcontent,\n\t\terror: null,\n\t};\n}\n\nasync function fetchBatch(\n\turls: string[],\n\tapiKey: string,\n\tsignal?: AbortSignal,\n\toptions: ExtractOptions = {},\n): Promise<TinyFishFetchResponse> {\n\treturn tinyFishJsonRequest<TinyFishFetchResponse>(\n\t\t\"Fetch\",\n\t\tTINYFISH_FETCH_URL,\n\t\tapiKey,\n\t\t{ method: \"POST\", body: JSON.stringify(fetchBody(urls, options)) },\n\t\tFETCH_TIMEOUT_MS,\n\t\tsignal,\n\t);\n}\n\nasync function fetchInlineContent(\n\turls: string[],\n\tapiKey: string,\n\tsignal?: AbortSignal,\n): Promise<ExtractedContent[]> {\n\tconst content: ExtractedContent[] = [];\n\tfor (let offset = 0; offset < urls.length; offset += MAX_FETCH_URLS) {\n\t\tconst batch = urls.slice(offset, offset + MAX_FETCH_URLS);\n\t\tconst data = await fetchBatch(batch, apiKey, signal);\n\t\tif (!Array.isArray(data.results) || !Array.isArray(data.errors)) {\n\t\t\tthrow new Error(\"TinyFish Fetch API returned an unexpected response shape\");\n\t\t}\n\t\tfor (const url of batch) {\n\t\t\tconst result = Array.isArray(data.results)\n\t\t\t\t? data.results.find(item => item?.url === url || item?.final_url === url)\n\t\t\t\t: undefined;\n\t\t\tconst mapped = mapFetchResult(result, url);\n\t\t\tif (mapped) content.push(mapped);\n\t\t}\n\t}\n\treturn content;\n}\n\nexport async function searchWithTinyFish(query: string, options: TinyFishSearchOptions = {}): Promise<SearchResponse> {\n\tconst apiKey = await getApiKey(options.signal);\n\tconst numResults = normalizeNumResults(options.numResults);\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query });\n\ttry {\n\t\tconst combined: SearchResponse[\"results\"] = [];\n\t\tconst pages = numResults > 10 ? 2 : 1;\n\t\tfor (let page = 0; page < pages; page++) {\n\t\t\tconst data = await tinyFishJsonRequest<TinyFishSearchResponse>(\n\t\t\t\t\"Search\",\n\t\t\t\tbuildSearchUrl(query, options, page),\n\t\t\t\tapiKey,\n\t\t\t\t{ method: \"GET\" },\n\t\t\t\tSEARCH_TIMEOUT_MS,\n\t\t\t\toptions.signal,\n\t\t\t);\n\t\t\tif (!Array.isArray(data.results)) throw new Error(\"TinyFish Search API returned an unexpected response shape\");\n\t\t\tcombined.push(...mapSearchResults(data.results));\n\t\t\tif (data.results.length < 10) break;\n\t\t}\n\n\t\tconst results = deduplicateResults(combined, numResults);\n\t\tconst response: SearchResponse = { answer: buildAnswer(results), results };\n\t\tif (options.includeContent && results.length > 0) {\n\t\t\tconst inlineContent = await fetchInlineContent(results.map(result => result.url), apiKey, options.signal);\n\t\t\tif (inlineContent.length > 0) response.inlineContent = inlineContent;\n\t\t}\n\t\tactivityMonitor.logComplete(activityId, 200);\n\t\treturn response;\n\t} catch (err) {\n\t\tconst message = errorMessage(err);\n\t\tconst redactedMessage = redactCredential(message, apiKey);\n\t\tif (redactedMessage.toLowerCase().includes(\"abort\")) activityMonitor.logComplete(activityId, 0);\n\t\telse activityMonitor.logError(activityId, redactedMessage);\n\t\tif (redactedMessage === message) throw err;\n\t\tconst redactedError = new Error(redactedMessage);\n\t\tif (err instanceof Error) redactedError.name = err.name;\n\t\tthrow redactedError;\n\t}\n}\n\nexport async function extractWithTinyFish(\n\turl: string,\n\tsignal?: AbortSignal,\n\toptions: ExtractOptions = {},\n): Promise<ExtractedContent | null> {\n\tconst apiKey = await getApiKey(signal);\n\tconst activityId = activityMonitor.logStart({ type: \"fetch\", url });\n\ttry {\n\t\tconst data = await fetchBatch([url], apiKey, signal, options);\n\t\tif (!Array.isArray(data.results) || !Array.isArray(data.errors)) {\n\t\t\tthrow new Error(\"TinyFish Fetch API returned an unexpected response shape\");\n\t\t}\n\t\tconst result = data.results.find(item => item?.url === url || item?.final_url === url) ?? data.results[0];\n\t\tconst mapped = mapFetchResult(result, url);\n\t\tif (mapped) {\n\t\t\tactivityMonitor.logComplete(activityId, 200);\n\t\t\treturn mapped;\n\t\t}\n\t\tconst fetchError = findFetchError(data.errors, url);\n\t\tif (fetchError) {\n\t\t\tconst status = typeof fetchError.status === \"number\" ? ` (HTTP ${fetchError.status})` : \"\";\n\t\t\tthrow new Error(`TinyFish Fetch failed for ${url}: ${fetchError.error || \"unknown error\"}${status}`);\n\t\t}\n\t\tactivityMonitor.logComplete(activityId, 200);\n\t\treturn null;\n\t} catch (err) {\n\t\tconst message = errorMessage(err);\n\t\tconst redactedMessage = redactCredential(message, apiKey);\n\t\tif (redactedMessage.toLowerCase().includes(\"abort\")) activityMonitor.logComplete(activityId, 0);\n\t\telse activityMonitor.logError(activityId, redactedMessage);\n\t\tif (redactedMessage === message) throw err;\n\t\tconst redactedError = new Error(redactedMessage);\n\t\tif (err instanceof Error) redactedError.name = err.name;\n\t\tthrow redactedError;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tinyfish.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/tinyfish.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { activityMonitor } from \"./activity.ts\";\nimport type { ExtractedContent, ExtractOptions } from \"./extract.ts\";\nimport type { SearchOptions, SearchResponse } from \"./perplexity.ts\";\nimport { hasCredentialSource, redactCredential, resolveCredential } from \"./credential-source.ts\";\nimport { getWebSearchConfigPath } from \"./utils.ts\";\n\nconst TINYFISH_SEARCH_URL = \"https://api.search.tinyfish.ai\";\nconst TINYFISH_FETCH_URL = \"https://api.fetch.tinyfish.ai\";\nconst CONFIG_PATH = getWebSearchConfigPath();\nconst SEARCH_TIMEOUT_MS = 60_000;\nconst FETCH_TIMEOUT_MS = 150_000;\nconst MAX_FETCH_URLS = 10;\nconst MAX_FETCH_PER_URL_TIMEOUT_MS = 110_000;\n\ninterface WebSearchConfig {\n\ttinyfishApiKey?: unknown;\n}\n\ninterface TinyFishSearchResult {\n\tposition?: number;\n\tsite_name?: string | null;\n\ttitle?: string | null;\n\tsnippet?: string | null;\n\turl?: string | null;\n\tdate?: string | null;\n\tpublisher?: string | null;\n}\n\ninterface TinyFishSearchResponse {\n\tquery?: string;\n\tresults?: TinyFishSearchResult[];\n\ttotal_results?: number;\n\tpage?: number;\n}\n\ninterface TinyFishFetchResult {\n\turl?: string;\n\tfinal_url?: string;\n\ttitle?: string | null;\n\ttext?: string | Record<string, unknown> | null;\n\tformat?: string;\n}\n\ninterface TinyFishFetchError {\n\turl?: string;\n\terror?: string;\n\tstatus?: number;\n}\n\ninterface TinyFishFetchResponse {\n\tresults?: TinyFishFetchResult[];\n\terrors?: TinyFishFetchError[];\n}\n\ninterface TinyFishSearchOptions extends SearchOptions {\n\tincludeContent?: boolean;\n}\n\nlet cachedConfig: WebSearchConfig | null = null;\n\nfunction loadConfig(): WebSearchConfig {\n\tif (cachedConfig) return cachedConfig;\n\tif (!existsSync(CONFIG_PATH)) {\n\t\tcachedConfig = {};\n\t\treturn cachedConfig;\n\t}\n\n\tconst raw = readFileSync(CONFIG_PATH, \"utf-8\");\n\ttry {\n\t\tcachedConfig = JSON.parse(raw) as WebSearchConfig;\n\t\treturn cachedConfig;\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${CONFIG_PATH}: ${message}`);\n\t}\n}\n\nexport function clearTinyFishConfigCache(): void {\n\tcachedConfig = null;\n}\n\nasync function getApiKey(signal?: AbortSignal): Promise<string> {\n\tconst key = await resolveCredential({\n\t\tprovider: \"TinyFish\",\n\t\tconfiguredValue: loadConfig().tinyfishApiKey,\n\t\tenvironmentValue: process.env.TINYFISH_API_KEY,\n\t\tsignal,\n\t});\n\tif (!key) {\n\t\tthrow new Error(\n\t\t\t\"TinyFish API key not found. Either:\\n\" +\n\t\t\t` 1. Create ${CONFIG_PATH} with { \"tinyfishApiKey\": \"your-key\" }\\n` +\n\t\t\t\" 2. Set TINYFISH_API_KEY environment variable\\n\" +\n\t\t\t\"Get a key at https://agent.tinyfish.ai/api-keys\",\n\t\t);\n\t}\n\treturn key;\n}\n\nexport function isTinyFishAvailable(): boolean {\n\treturn hasCredentialSource({\n\t\tprovider: \"TinyFish\",\n\t\tconfiguredValue: loadConfig().tinyfishApiKey,\n\t\tenvironmentValue: process.env.TINYFISH_API_KEY,\n\t});\n}\n\nfunction errorMessage(err: unknown): string {\n\treturn err instanceof Error ? err.message : String(err);\n}\n\nfunction requestSignal(signal: AbortSignal | undefined, timeoutMs: number): AbortSignal {\n\tconst timeout = AbortSignal.timeout(timeoutMs);\n\treturn signal ? AbortSignal.any([signal, timeout]) : timeout;\n}\n\nfunction normalizeDomain(value: string): string | null {\n\tlet input = value.trim().toLowerCase();\n\tif (!input) return null;\n\tif (input.startsWith(\"-\")) input = input.slice(1).trim();\n\tif (!input) return null;\n\ttry {\n\t\tconst parsed = input.includes(\"://\") ? new URL(input) : new URL(`https://${input}`);\n\t\tinput = parsed.hostname;\n\t} catch {\n\t\tinput = input.split(\"/\")[0]?.split(\":\")[0] ?? \"\";\n\t}\n\tinput = input.replace(/^\\.+|\\.+$/g, \"\");\n\treturn /^[a-z0-9][a-z0-9.-]*\\.[a-z]{2,}$/i.test(input) ? input : null;\n}\n\nfunction mapDomainFilter(domainFilter: string[] | undefined): { includeDomains: string[]; excludeDomains: string[] } {\n\tconst includeDomains: string[] = [];\n\tconst excludeDomains: string[] = [];\n\tfor (const raw of domainFilter ?? []) {\n\t\tconst domain = normalizeDomain(raw);\n\t\tif (!domain) continue;\n\t\tconst target = raw.trim().startsWith(\"-\") ? excludeDomains : includeDomains;\n\t\tif (!target.includes(domain)) target.push(domain);\n\t}\n\treturn { includeDomains, excludeDomains };\n}\n\nfunction recencyMinutes(filter: SearchOptions[\"recencyFilter\"]): number | undefined {\n\tif (!filter) return undefined;\n\tconst minutes: Record<NonNullable<SearchOptions[\"recencyFilter\"]>, number> = {\n\t\tday: 1_440,\n\t\tweek: 10_080,\n\t\tmonth: 43_200,\n\t\tyear: 525_600,\n\t};\n\treturn minutes[filter];\n}\n\nfunction normalizeNumResults(value: number | undefined): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return 5;\n\treturn Math.max(1, Math.min(Math.floor(value), 20));\n}\n\nfunction buildSearchUrl(query: string, options: SearchOptions, page: number): string {\n\tconst params = new URLSearchParams({ query });\n\tconst { includeDomains, excludeDomains } = mapDomainFilter(options.domainFilter);\n\tif (includeDomains.length > 0) params.set(\"include_domains\", includeDomains.join(\",\"));\n\tif (excludeDomains.length > 0) params.set(\"exclude_domains\", excludeDomains.join(\",\"));\n\tconst recency = recencyMinutes(options.recencyFilter);\n\tif (recency !== undefined) params.set(\"recency_minutes\", String(recency));\n\tif (page > 0) params.set(\"page\", String(page));\n\treturn `${TINYFISH_SEARCH_URL}?${params.toString()}`;\n}\n\nasync function tinyFishJsonRequest<T>(\n\tlabel: \"Search\" | \"Fetch\",\n\turl: string,\n\tapiKey: string,\n\tinit: RequestInit,\n\ttimeoutMs: number,\n\tsignal?: AbortSignal,\n): Promise<T> {\n\tlet response: Response;\n\ttry {\n\t\tresponse = await fetch(url, {\n\t\t\t...init,\n\t\t\theaders: {\n\t\t\t\t\"X-API-Key\": apiKey,\n\t\t\t\t...(init.body ? { \"Content-Type\": \"application/json\" } : {}),\n\t\t\t\t...init.headers,\n\t\t\t},\n\t\t\tsignal: requestSignal(signal, timeoutMs),\n\t\t});\n\t} catch (err) {\n\t\tconst message = errorMessage(err);\n\t\tconst redactedMessage = redactCredential(message, apiKey);\n\t\tif (redactedMessage === message) throw err;\n\t\tconst redactedError = new Error(redactedMessage);\n\t\tif (err instanceof Error) redactedError.name = err.name;\n\t\tthrow redactedError;\n\t}\n\n\tconst raw = await response.text();\n\tif (!response.ok) {\n\t\tthrow new Error(`TinyFish ${label} API error ${response.status}: ${redactCredential(raw, apiKey).slice(0, 300)}`);\n\t}\n\ttry {\n\t\treturn JSON.parse(raw) as T;\n\t} catch (err) {\n\t\tthrow new Error(`TinyFish ${label} API returned invalid JSON: ${errorMessage(err)}`);\n\t}\n}\n\nfunction mapSearchResults(results: TinyFishSearchResult[] | undefined): SearchResponse[\"results\"] {\n\tif (!Array.isArray(results)) return [];\n\treturn results.flatMap((item) => {\n\t\tif (!item || typeof item.url !== \"string\" || item.url.trim().length === 0) return [];\n\t\tconst url = item.url.trim();\n\t\treturn [{\n\t\t\ttitle: typeof item.title === \"string\" && item.title.trim() ? item.title.trim() : url,\n\t\t\turl,\n\t\t\tsnippet: typeof item.snippet === \"string\" ? item.snippet.replace(/\\s+/g, \" \").trim() : \"\",\n\t\t}];\n\t});\n}\n\nfunction deduplicateResults(results: SearchResponse[\"results\"], limit: number): SearchResponse[\"results\"] {\n\tconst seen = new Set<string>();\n\tconst unique: SearchResponse[\"results\"] = [];\n\tfor (const result of results) {\n\t\tif (seen.has(result.url)) continue;\n\t\tseen.add(result.url);\n\t\tunique.push(result);\n\t\tif (unique.length >= limit) break;\n\t}\n\treturn unique;\n}\n\nfunction buildAnswer(results: SearchResponse[\"results\"]): string {\n\treturn results.map((result) => {\n\t\tif (result.snippet) return `${result.snippet}\\nSource: ${result.title} (${result.url})`;\n\t\treturn `Source: ${result.title} (${result.url})`;\n\t}).join(\"\\n\\n\");\n}\n\nfunction fetchPerUrlTimeout(value: number | undefined): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return MAX_FETCH_PER_URL_TIMEOUT_MS;\n\treturn Math.max(1, Math.min(Math.floor(value), MAX_FETCH_PER_URL_TIMEOUT_MS));\n}\n\nfunction fetchBody(urls: string[], options: ExtractOptions = {}): Record<string, unknown> {\n\tconst body: Record<string, unknown> = {\n\t\turls,\n\t\tformat: \"markdown\",\n\t\tper_url_timeout_ms: fetchPerUrlTimeout(options.timeoutMs),\n\t};\n\tconst purpose = options.prompt?.trim();\n\tif (purpose) body.purpose = purpose.slice(0, 2_000);\n\treturn body;\n}\n\nfunction findFetchError(errors: TinyFishFetchError[] | undefined, url: string): TinyFishFetchError | undefined {\n\tif (!Array.isArray(errors)) return undefined;\n\treturn errors.find(item => item?.url === url) ?? errors[0];\n}\n\nfunction fetchResultContent(result: TinyFishFetchResult): string {\n\tif (typeof result.text === \"string\") return result.text.trim();\n\tif (result.text && typeof result.text === \"object\") return JSON.stringify(result.text, null, 2);\n\treturn \"\";\n}\n\nfunction mapFetchResult(result: TinyFishFetchResult | undefined, requestedUrl: string): ExtractedContent | null {\n\tif (!result) return null;\n\tconst content = fetchResultContent(result);\n\tif (!content) return null;\n\treturn {\n\t\turl: requestedUrl,\n\t\ttitle: typeof result.title === \"string\" ? result.title.trim() : \"\",\n\t\tcontent,\n\t\terror: null,\n\t};\n}\n\nasync function fetchBatch(\n\turls: string[],\n\tapiKey: string,\n\tsignal?: AbortSignal,\n\toptions: ExtractOptions = {},\n): Promise<TinyFishFetchResponse> {\n\treturn tinyFishJsonRequest<TinyFishFetchResponse>(\n\t\t\"Fetch\",\n\t\tTINYFISH_FETCH_URL,\n\t\tapiKey,\n\t\t{ method: \"POST\", body: JSON.stringify(fetchBody(urls, options)) },\n\t\tFETCH_TIMEOUT_MS,\n\t\tsignal,\n\t);\n}\n\nasync function fetchInlineContent(\n\turls: string[],\n\tapiKey: string,\n\tsignal?: AbortSignal,\n): Promise<ExtractedContent[]> {\n\tconst content: ExtractedContent[] = [];\n\tfor (let offset = 0; offset < urls.length; offset += MAX_FETCH_URLS) {\n\t\tconst batch = urls.slice(offset, offset + MAX_FETCH_URLS);\n\t\tconst data = await fetchBatch(batch, apiKey, signal);\n\t\tif (!Array.isArray(data.results) || !Array.isArray(data.errors)) {\n\t\t\tthrow new Error(\"TinyFish Fetch API returned an unexpected response shape\");\n\t\t}\n\t\tfor (const url of batch) {\n\t\t\tconst result = Array.isArray(data.results)\n\t\t\t\t? data.results.find(item => item?.url === url || item?.final_url === url)\n\t\t\t\t: undefined;\n\t\t\tconst mapped = mapFetchResult(result, url);\n\t\t\tif (mapped) content.push(mapped);\n\t\t}\n\t}\n\treturn content;\n}\n\nexport async function searchWithTinyFish(query: string, options: TinyFishSearchOptions = {}): Promise<SearchResponse> {\n\tconst apiKey = await getApiKey(options.signal);\n\tconst numResults = normalizeNumResults(options.numResults);\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query });\n\ttry {\n\t\tconst combined: SearchResponse[\"results\"] = [];\n\t\tconst pages = numResults > 10 ? 2 : 1;\n\t\tfor (let page = 0; page < pages; page++) {\n\t\t\tconst data = await tinyFishJsonRequest<TinyFishSearchResponse>(\n\t\t\t\t\"Search\",\n\t\t\t\tbuildSearchUrl(query, options, page),\n\t\t\t\tapiKey,\n\t\t\t\t{ method: \"GET\" },\n\t\t\t\tSEARCH_TIMEOUT_MS,\n\t\t\t\toptions.signal,\n\t\t\t);\n\t\t\tif (!Array.isArray(data.results)) throw new Error(\"TinyFish Search API returned an unexpected response shape\");\n\t\t\tcombined.push(...mapSearchResults(data.results));\n\t\t\tif (data.results.length < 10) break;\n\t\t}\n\n\t\tconst results = deduplicateResults(combined, numResults);\n\t\tconst response: SearchResponse = { answer: buildAnswer(results), results };\n\t\tif (options.includeContent && results.length > 0) {\n\t\t\tconst inlineContent = await fetchInlineContent(results.map(result => result.url), apiKey, options.signal);\n\t\t\tif (inlineContent.length > 0) response.inlineContent = inlineContent;\n\t\t}\n\t\tactivityMonitor.logComplete(activityId, 200);\n\t\treturn response;\n\t} catch (err) {\n\t\tconst message = errorMessage(err);\n\t\tconst redactedMessage = redactCredential(message, apiKey);\n\t\tif (redactedMessage.toLowerCase().includes(\"abort\")) activityMonitor.logComplete(activityId, 0);\n\t\telse activityMonitor.logError(activityId, redactedMessage);\n\t\tif (redactedMessage === message) throw err;\n\t\tconst redactedError = new Error(redactedMessage);\n\t\tif (err instanceof Error) redactedError.name = err.name;\n\t\tthrow redactedError;\n\t}\n}\n\nexport async function extractWithTinyFish(\n\turl: string,\n\tsignal?: AbortSignal,\n\toptions: ExtractOptions = {},\n): Promise<ExtractedContent | null> {\n\tconst apiKey = await getApiKey(signal);\n\tconst activityId = activityMonitor.logStart({ type: \"fetch\", url });\n\ttry {\n\t\tconst data = await fetchBatch([url], apiKey, signal, options);\n\t\tif (!Array.isArray(data.results) || !Array.isArray(data.errors)) {\n\t\t\tthrow new Error(\"TinyFish Fetch API returned an unexpected response shape\");\n\t\t}\n\t\tconst result = data.results.find(item => item?.url === url || item?.final_url === url) ?? data.results[0];\n\t\tconst mapped = mapFetchResult(result, url);\n\t\tif (mapped) {\n\t\t\tactivityMonitor.logComplete(activityId, 200);\n\t\t\treturn mapped;\n\t\t}\n\t\tconst fetchError = findFetchError(data.errors, url);\n\t\tif (fetchError) {\n\t\t\tconst status = typeof fetchError.status === \"number\" ? ` (HTTP ${fetchError.status})` : \"\";\n\t\t\tthrow new Error(`TinyFish Fetch failed for ${url}: ${fetchError.error || \"unknown error\"}${status}`);\n\t\t}\n\t\tactivityMonitor.logComplete(activityId, 200);\n\t\treturn null;\n\t} catch (err) {\n\t\tconst message = errorMessage(err);\n\t\tconst redactedMessage = redactCredential(message, apiKey);\n\t\tif (redactedMessage.toLowerCase().includes(\"abort\")) activityMonitor.logComplete(activityId, 0);\n\t\telse activityMonitor.logError(activityId, redactedMessage);\n\t\tif (redactedMessage === message) throw err;\n\t\tconst redactedError = new Error(redactedMessage);\n\t\tif (err instanceof Error) redactedError.name = err.name;\n\t\tthrow redactedError;\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/utils.ts"],"names":[],"mappings":"AAKA,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,UAAU,iBAAiB;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAgCpE;AAMD,wBAAsB,4BAA4B,CACjD,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,iBAAiB,EAAE,SAAS,MAAM,EAAE,GAClC,OAAO,CAAC,QAAQ,CAAC,CAmCnB;AAED,MAAM,WAAW,oBAAoB;IACpC,8DAA8D;IAC9D,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACb;AAUD,kFAAkF;AAClF,wBAAgB,2BAA2B,IAAI,oBAAoB,CAyBlE;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAM/C;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAa9F;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAOpD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAOnD"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/utils.ts"],"names":[],"mappings":"AAKA,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED,UAAU,iBAAiB;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAgCpE;AAMD,wBAAsB,4BAA4B,CACjD,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,iBAAiB,EAAE,SAAS,MAAM,EAAE,GAClC,OAAO,CAAC,QAAQ,CAAC,CAmCnB;AAED,MAAM,WAAW,oBAAoB;IACpC,8DAA8D;IAC9D,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACb;AAUD,kFAAkF;AAClF,wBAAgB,2BAA2B,IAAI,oBAAoB,CAyBlE;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAM/C;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAa9F;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAOpD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAOnD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { hostname } from \"node:os\";\nimport { join } from \"node:path\";\nimport { getAgentDir } from \"../host.ts\";\n\nexport function getWebSearchConfigDir(): string {\n\treturn getAgentDir();\n}\n\nexport function getWebSearchConfigPath(): string {\n\treturn join(getWebSearchConfigDir(), \"web-search.json\");\n}\n\ninterface ApiBaseUrlOptions {\n\tconfigKey: string;\n\tconfiguredValue: unknown;\n\tdefaultValue: string;\n\tenvironmentKey: string;\n\tenvironmentValue: string | undefined;\n}\n\nexport function resolveApiBaseUrl(options: ApiBaseUrlOptions): string {\n\tconst fromEnvironment = options.environmentValue !== undefined;\n\tconst value = fromEnvironment ? options.environmentValue : options.configuredValue;\n\tif (value === undefined) return options.defaultValue;\n\n\tconst source = fromEnvironment\n\t\t? options.environmentKey\n\t\t: `${options.configKey} in ${getWebSearchConfigPath()}`;\n\tif (typeof value !== \"string\" || value.trim().length === 0) {\n\t\tthrow new Error(`${source} must be an absolute HTTP(S) URL`);\n\t}\n\n\tlet url: URL;\n\ttry {\n\t\turl = new URL(value.trim());\n\t} catch {\n\t\tthrow new Error(`${source} must be an absolute HTTP(S) URL`);\n\t}\n\tif (url.protocol !== \"https:\") {\n\t\tthrow new Error(`${source} must be an absolute HTTPS URL`);\n\t}\n\tif (url.username || url.password) {\n\t\tthrow new Error(`${source} must not include credentials`);\n\t}\n\tif (url.search || url.hash) {\n\t\tthrow new Error(`${source} must not include query parameters or fragments`);\n\t}\n\n\turl.search = \"\";\n\turl.hash = \"\";\n\turl.pathname = url.pathname.replace(/\\/+$/, \"\");\n\treturn url.toString().replace(/\\/+$/, \"\");\n}\n\nconst API_REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);\nconst API_REQUEST_BODY_HEADERS = [\"Content-Encoding\", \"Content-Language\", \"Content-Location\", \"Content-Type\"];\nconst MAX_API_REDIRECTS = 5;\n\nexport async function fetchWithCredentialRedirects(\n\turl: string,\n\tinit: RequestInit,\n\tcredentialHeaders: readonly string[],\n): Promise<Response> {\n\tlet current = new URL(url);\n\tlet requestInit = init;\n\n\tfor (let redirects = 0; ; redirects++) {\n\t\tconst response = await fetch(current, { ...requestInit, redirect: \"manual\" });\n\t\tif (!API_REDIRECT_STATUSES.has(response.status)) return response;\n\n\t\tconst location = response.headers.get(\"location\");\n\t\tif (!location) return response;\n\t\tif (redirects === MAX_API_REDIRECTS) {\n\t\t\tthrow new Error(`Too many API redirects from ${url}`);\n\t\t}\n\n\t\tconst next = new URL(location, current);\n\t\tif (next.protocol !== \"http:\" && next.protocol !== \"https:\") {\n\t\t\tthrow new Error(`API redirect from ${current.origin} must use HTTP(S)`);\n\t\t}\n\t\tconst method = requestInit.method?.toUpperCase() ?? \"GET\";\n\t\tif (\n\t\t\t((response.status === 301 || response.status === 302) && method === \"POST\")\n\t\t\t|| (response.status === 303 && method !== \"GET\" && method !== \"HEAD\")\n\t\t) {\n\t\t\tconst headers = new Headers(requestInit.headers);\n\t\t\tfor (const name of API_REQUEST_BODY_HEADERS) headers.delete(name);\n\t\t\tconst { body: _body, ...withoutBody } = requestInit;\n\t\t\trequestInit = { ...withoutBody, method: \"GET\", headers };\n\t\t}\n\t\tif (next.origin !== current.origin) {\n\t\t\tconst headers = new Headers(requestInit.headers);\n\t\t\tfor (const name of credentialHeaders) headers.delete(name);\n\t\t\trequestInit = { ...requestInit, headers };\n\t\t}\n\t\tcurrent = next;\n\t}\n}\n\nexport interface CuratorNetworkConfig {\n\t/** Whether remote access was opted into via curatorRemote. */\n\tenabled: boolean;\n\thost: string;\n\tbind: string;\n}\n\nconst LOCAL_CURATOR_NETWORK_DEFAULTS: CuratorNetworkConfig = { enabled: false, host: \"localhost\", bind: \"127.0.0.1\" };\n\nfunction trimmedString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst trimmed = value.trim();\n\treturn trimmed.length > 0 ? trimmed : undefined;\n}\n\n/** Resolves the curator server bind address and URL host from `curatorRemote`. */\nexport function resolveCuratorNetworkConfig(): CuratorNetworkConfig {\n\tconst configPath = getWebSearchConfigPath();\n\tif (!existsSync(configPath)) return LOCAL_CURATOR_NETWORK_DEFAULTS;\n\n\tlet raw: unknown;\n\ttry {\n\t\traw = JSON.parse(readFileSync(configPath, \"utf-8\"));\n\t} catch {\n\t\treturn LOCAL_CURATOR_NETWORK_DEFAULTS;\n\t}\n\tif (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return LOCAL_CURATOR_NETWORK_DEFAULTS;\n\n\tconst curatorRemote = (raw as Record<string, unknown>).curatorRemote;\n\tif (curatorRemote === true) return { enabled: true, host: hostname(), bind: \"0.0.0.0\" };\n\n\tif (curatorRemote && typeof curatorRemote === \"object\" && !Array.isArray(curatorRemote)) {\n\t\tconst obj = curatorRemote as Record<string, unknown>;\n\t\treturn {\n\t\t\tenabled: true,\n\t\t\thost: trimmedString(obj.host) ?? hostname(),\n\t\t\tbind: trimmedString(obj.bind) ?? \"0.0.0.0\",\n\t\t};\n\t}\n\n\treturn LOCAL_CURATOR_NETWORK_DEFAULTS;\n}\n\nexport function formatSeconds(s: number): string {\n\tconst h = Math.floor(s / 3600);\n\tconst m = Math.floor((s % 3600) / 60);\n\tconst sec = s % 60;\n\tif (h > 0) return `${h}:${String(m).padStart(2, \"0\")}:${String(sec).padStart(2, \"0\")}`;\n\treturn `${m}:${String(sec).padStart(2, \"0\")}`;\n}\n\nexport function readExecError(err: unknown): { code?: string; stderr: string; message: string } {\n\tif (!err || typeof err !== \"object\") {\n\t\treturn { stderr: \"\", message: String(err) };\n\t}\n\tconst code = (err as { code?: string }).code;\n\tconst message = (err as { message?: string }).message ?? \"\";\n\tconst stderrRaw = (err as { stderr?: Buffer | string }).stderr;\n\tconst stderr = Buffer.isBuffer(stderrRaw)\n\t\t? stderrRaw.toString(\"utf-8\")\n\t\t: typeof stderrRaw === \"string\"\n\t\t\t? stderrRaw\n\t\t\t: \"\";\n\treturn { code, stderr, message };\n}\n\nexport function isTimeoutError(err: unknown): boolean {\n\tif (!err || typeof err !== \"object\") return false;\n\tif ((err as { killed?: boolean }).killed) return true;\n\tconst name = (err as { name?: string }).name;\n\tconst code = (err as { code?: string }).code;\n\tconst message = (err as { message?: string }).message ?? \"\";\n\treturn name === \"AbortError\" || code === \"ETIMEDOUT\" || message.toLowerCase().includes(\"timed out\");\n}\n\nexport function trimErrorText(text: string): string {\n\treturn text.replace(/\\s+/g, \" \").trim().slice(0, 200);\n}\n\nexport function mapFfmpegError(err: unknown): string {\n\tconst { code, stderr, message } = readExecError(err);\n\tif (code === \"ENOENT\") return \"ffmpeg is not installed. Install with: brew install ffmpeg\";\n\tif (isTimeoutError(err)) return \"ffmpeg timed out extracting frame\";\n\tif (stderr.includes(\"403\")) return \"Stream URL returned 403 — may have expired, try again\";\n\tconst snippet = trimErrorText(stderr || message);\n\treturn snippet ? `ffmpeg failed: ${snippet}` : \"ffmpeg failed\";\n}\n"]}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { hostname } from \"node:os\";\nimport { join } from \"node:path\";\nimport { getAgentDir } from \"../host.ts\";\n\nexport function getWebSearchConfigDir(): string {\n\treturn getAgentDir();\n}\n\nexport function getWebSearchConfigPath(): string {\n\treturn join(getWebSearchConfigDir(), \"web-search.json\");\n}\n\ninterface ApiBaseUrlOptions {\n\tconfigKey: string;\n\tconfiguredValue: unknown;\n\tdefaultValue: string;\n\tenvironmentKey: string;\n\tenvironmentValue: string | undefined;\n}\n\nexport function resolveApiBaseUrl(options: ApiBaseUrlOptions): string {\n\tconst fromEnvironment = options.environmentValue !== undefined;\n\tconst value = fromEnvironment ? options.environmentValue : options.configuredValue;\n\tif (value === undefined) return options.defaultValue;\n\n\tconst source = fromEnvironment\n\t\t? options.environmentKey\n\t\t: `${options.configKey} in ${getWebSearchConfigPath()}`;\n\tif (typeof value !== \"string\" || value.trim().length === 0) {\n\t\tthrow new Error(`${source} must be an absolute HTTP(S) URL`);\n\t}\n\n\tlet url: URL;\n\ttry {\n\t\turl = new URL(value.trim());\n\t} catch {\n\t\tthrow new Error(`${source} must be an absolute HTTP(S) URL`);\n\t}\n\tif (url.protocol !== \"https:\") {\n\t\tthrow new Error(`${source} must be an absolute HTTPS URL`);\n\t}\n\tif (url.username || url.password) {\n\t\tthrow new Error(`${source} must not include credentials`);\n\t}\n\tif (url.search || url.hash) {\n\t\tthrow new Error(`${source} must not include query parameters or fragments`);\n\t}\n\n\turl.search = \"\";\n\turl.hash = \"\";\n\turl.pathname = url.pathname.replace(/\\/+$/, \"\");\n\treturn url.toString().replace(/\\/+$/, \"\");\n}\n\nconst API_REDIRECT_STATUSES = new Set([301, 302, 303, 307, 308]);\nconst API_REQUEST_BODY_HEADERS = [\"Content-Encoding\", \"Content-Language\", \"Content-Location\", \"Content-Type\"];\nconst MAX_API_REDIRECTS = 5;\n\nexport async function fetchWithCredentialRedirects(\n\turl: string,\n\tinit: RequestInit,\n\tcredentialHeaders: readonly string[],\n): Promise<Response> {\n\tlet current = new URL(url);\n\tlet requestInit = init;\n\n\tfor (let redirects = 0; ; redirects++) {\n\t\tconst response = await fetch(current, { ...requestInit, redirect: \"manual\" });\n\t\tif (!API_REDIRECT_STATUSES.has(response.status)) return response;\n\n\t\tconst location = response.headers.get(\"location\");\n\t\tif (!location) return response;\n\t\tif (redirects === MAX_API_REDIRECTS) {\n\t\t\tthrow new Error(`Too many API redirects from ${url}`);\n\t\t}\n\n\t\tconst next = new URL(location, current);\n\t\tif (next.protocol !== \"http:\" && next.protocol !== \"https:\") {\n\t\t\tthrow new Error(`API redirect from ${current.origin} must use HTTP(S)`);\n\t\t}\n\t\tconst method = requestInit.method?.toUpperCase() ?? \"GET\";\n\t\tif (\n\t\t\t((response.status === 301 || response.status === 302) && method === \"POST\")\n\t\t\t|| (response.status === 303 && method !== \"GET\" && method !== \"HEAD\")\n\t\t) {\n\t\t\tconst headers = new Headers(requestInit.headers);\n\t\t\tfor (const name of API_REQUEST_BODY_HEADERS) headers.delete(name);\n\t\t\tconst { body: _body, ...withoutBody } = requestInit;\n\t\t\trequestInit = { ...withoutBody, method: \"GET\", headers };\n\t\t}\n\t\tif (next.origin !== current.origin) {\n\t\t\tconst headers = new Headers(requestInit.headers);\n\t\t\tfor (const name of credentialHeaders) headers.delete(name);\n\t\t\trequestInit = { ...requestInit, headers };\n\t\t}\n\t\tcurrent = next;\n\t}\n}\n\nexport interface CuratorNetworkConfig {\n\t/** Whether remote access was opted into via curatorRemote. */\n\tenabled: boolean;\n\thost: string;\n\tbind: string;\n}\n\nconst LOCAL_CURATOR_NETWORK_DEFAULTS: CuratorNetworkConfig = { enabled: false, host: \"localhost\", bind: \"127.0.0.1\" };\n\nfunction trimmedString(value: unknown): string | undefined {\n\tif (typeof value !== \"string\") return undefined;\n\tconst trimmed = value.trim();\n\treturn trimmed.length > 0 ? trimmed : undefined;\n}\n\n/** Resolves the curator server bind address and URL host from `curatorRemote`. */\nexport function resolveCuratorNetworkConfig(): CuratorNetworkConfig {\n\tconst configPath = getWebSearchConfigPath();\n\tif (!existsSync(configPath)) return LOCAL_CURATOR_NETWORK_DEFAULTS;\n\n\tlet raw: unknown;\n\ttry {\n\t\traw = JSON.parse(readFileSync(configPath, \"utf-8\"));\n\t} catch {\n\t\treturn LOCAL_CURATOR_NETWORK_DEFAULTS;\n\t}\n\tif (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return LOCAL_CURATOR_NETWORK_DEFAULTS;\n\n\tconst curatorRemote = (raw as Record<string, unknown>).curatorRemote;\n\tif (curatorRemote === true) return { enabled: true, host: hostname(), bind: \"0.0.0.0\" };\n\n\tif (curatorRemote && typeof curatorRemote === \"object\" && !Array.isArray(curatorRemote)) {\n\t\tconst obj = curatorRemote as Record<string, unknown>;\n\t\treturn {\n\t\t\tenabled: true,\n\t\t\thost: trimmedString(obj.host) ?? hostname(),\n\t\t\tbind: trimmedString(obj.bind) ?? \"0.0.0.0\",\n\t\t};\n\t}\n\n\treturn LOCAL_CURATOR_NETWORK_DEFAULTS;\n}\n\nexport function formatSeconds(s: number): string {\n\tconst h = Math.floor(s / 3600);\n\tconst m = Math.floor((s % 3600) / 60);\n\tconst sec = s % 60;\n\tif (h > 0) return `${h}:${String(m).padStart(2, \"0\")}:${String(sec).padStart(2, \"0\")}`;\n\treturn `${m}:${String(sec).padStart(2, \"0\")}`;\n}\n\nexport function readExecError(err: unknown): { code?: string; stderr: string; message: string } {\n\tif (!err || typeof err !== \"object\") {\n\t\treturn { stderr: \"\", message: String(err) };\n\t}\n\tconst code = (err as { code?: string }).code;\n\tconst message = (err as { message?: string }).message ?? \"\";\n\tconst stderrRaw = (err as { stderr?: Buffer | string }).stderr;\n\tconst stderr = Buffer.isBuffer(stderrRaw)\n\t\t? stderrRaw.toString(\"utf-8\")\n\t\t: typeof stderrRaw === \"string\"\n\t\t\t? stderrRaw\n\t\t\t: \"\";\n\treturn { code, stderr, message };\n}\n\nexport function isTimeoutError(err: unknown): boolean {\n\tif (!err || typeof err !== \"object\") return false;\n\tif ((err as { killed?: boolean }).killed) return true;\n\tconst name = (err as { name?: string }).name;\n\tconst code = (err as { code?: string }).code;\n\tconst message = (err as { message?: string }).message ?? \"\";\n\treturn name === \"AbortError\" || code === \"ETIMEDOUT\" || message.toLowerCase().includes(\"timed out\");\n}\n\nexport function trimErrorText(text: string): string {\n\treturn text.replace(/\\s+/g, \" \").trim().slice(0, 200);\n}\n\nexport function mapFfmpegError(err: unknown): string {\n\tconst { code, stderr, message } = readExecError(err);\n\tif (code === \"ENOENT\") return \"ffmpeg is not installed. Install with: brew install ffmpeg\";\n\tif (isTimeoutError(err)) return \"ffmpeg timed out extracting frame\";\n\tif (stderr.includes(\"403\")) return \"Stream URL returned 403 — may have expired, try again\";\n\tconst snippet = trimErrorText(stderr || message);\n\treturn snippet ? `ffmpeg failed: ${snippet}` : \"ffmpeg failed\";\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"valyu.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/valyu.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAsIrE,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAa,GAAG;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAyDxI"
|
|
1
|
+
{"version":3,"file":"valyu.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/valyu.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAsIrE,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAa,GAAG;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAyDxI"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"valyu.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/valyu.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { activityMonitor } from \"./activity.ts\";\nimport type { ExtractedContent } from \"./extract.ts\";\nimport type { SearchOptions, SearchResponse } from \"./perplexity.ts\";\nimport { hasCredentialSource, redactCredential, resolveCredential } from \"./credential-source.ts\";\nimport { getWebSearchConfigPath } from \"./utils.ts\";\n\nconst VALYU_SEARCH_URL = \"https://api.valyu.ai/v1/search\";\nconst CONFIG_PATH = getWebSearchConfigPath();\nconst SEARCH_TIMEOUT_MS = 60_000;\nconst MAX_SNIPPET_CHARS = 2_500;\nconst MAX_CONTENT_CHARS = 4_000;\n\ninterface WebSearchConfig {\n\tvalyuApiKey?: unknown;\n}\n\ninterface ValyuResult {\n\ttitle?: unknown;\n\turl?: unknown;\n\tdescription?: unknown;\n\tcontent?: unknown;\n}\n\nlet cachedConfig: WebSearchConfig | null = null;\n\nfunction loadConfig(): WebSearchConfig {\n\tif (cachedConfig) return cachedConfig;\n\tif (!existsSync(CONFIG_PATH)) {\n\t\tcachedConfig = {};\n\t\treturn cachedConfig;\n\t}\n\tconst raw = readFileSync(CONFIG_PATH, \"utf-8\");\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${CONFIG_PATH}: ${message}`);\n\t}\n\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\tthrow new Error(`Invalid config in ${CONFIG_PATH}: expected a JSON object`);\n\t}\n\tcachedConfig = parsed as WebSearchConfig;\n\treturn cachedConfig;\n}\n\nasync function getApiKey(signal?: AbortSignal): Promise<string | null> {\n\treturn resolveCredential({\n\t\tprovider: \"Valyu\",\n\t\tconfiguredValue: loadConfig().valyuApiKey,\n\t\tenvironmentValue: process.env.VALYU_API_KEY,\n\t\tsignal,\n\t});\n}\n\nasync function requireApiKey(signal?: AbortSignal): Promise<string> {\n\tconst apiKey = await getApiKey(signal);\n\tif (!apiKey) {\n\t\tthrow new Error(\n\t\t\t\"Valyu API key not found. Either:\\n\" +\n\t\t\t` 1. Create ${CONFIG_PATH} with { \"valyuApiKey\": \"your-key\" }\\n` +\n\t\t\t\" 2. Set VALYU_API_KEY environment variable\\n\" +\n\t\t\t\"Get a key at https://platform.valyu.ai\",\n\t\t);\n\t}\n\treturn apiKey;\n}\n\nfunction normalizeCount(value: number | undefined): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return 5;\n\treturn Math.max(1, Math.min(Math.floor(value), 20));\n}\n\nfunction normalizeDomain(value: string): string | null {\n\tlet input = value.trim().toLowerCase();\n\tif (!input) return null;\n\tif (input.startsWith(\"-\")) input = input.slice(1).trim();\n\tif (!input) return null;\n\ttry {\n\t\tconst parsed = input.includes(\"://\") ? new URL(input) : new URL(`https://${input}`);\n\t\tinput = parsed.hostname;\n\t} catch {\n\t\tinput = input.split(\"/\")[0]?.split(\":\")[0] ?? \"\";\n\t}\n\tinput = input.replace(/^\\.+|\\.+$/g, \"\");\n\treturn /^[a-z0-9][a-z0-9.-]*\\.[a-z]{2,}$/i.test(input) ? input : null;\n}\n\nfunction mapDomainFilter(domainFilter: string[] | undefined): { included_sources?: string[]; excluded_sources?: string[] } {\n\tif (!domainFilter?.length) return {};\n\tconst included_sources: string[] = [];\n\tconst excluded_sources: string[] = [];\n\tfor (const raw of domainFilter) {\n\t\tconst domain = normalizeDomain(raw);\n\t\tif (!domain) continue;\n\t\tconst target = raw.trim().startsWith(\"-\") ? excluded_sources : included_sources;\n\t\tif (!target.includes(domain)) target.push(domain);\n\t}\n\treturn {\n\t\t...(included_sources.length > 0 ? { included_sources } : {}),\n\t\t...(excluded_sources.length > 0 ? { excluded_sources } : {}),\n\t};\n}\n\nfunction recencyToStartDate(filter: SearchOptions[\"recencyFilter\"]): string | undefined {\n\tif (!filter) return undefined;\n\tconst days = { day: 1, week: 7, month: 30, year: 365 }[filter];\n\treturn days ? new Date(Date.now() - days * 86_400_000).toISOString().slice(0, 10) : undefined;\n}\n\nfunction text(value: unknown, limit: number): string {\n\treturn typeof value === \"string\" ? value.replace(/\\s+/g, \" \").trim().slice(0, limit) : \"\";\n}\n\nfunction errorMessage(err: unknown): string {\n\treturn err instanceof Error ? err.message : String(err);\n}\n\nfunction invalidResponse(message: string): Error {\n\treturn new Error(`Valyu API returned invalid response: ${message}`);\n}\n\nfunction parseResponse(value: unknown): ValyuResult[] {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) throw invalidResponse(\"expected an object envelope\");\n\tconst envelope = value as Record<string, unknown>;\n\tif (envelope.success !== true) throw invalidResponse(\"expected success true\");\n\tif (!Array.isArray(envelope.results)) throw invalidResponse(\"expected results array\");\n\treturn envelope.results as ValyuResult[];\n}\n\nfunction buildAnswer(results: SearchResponse[\"results\"]): string {\n\treturn results.map((result) => result.snippet\n\t\t? `${result.snippet}\\nSource: ${result.title} (${result.url})`\n\t\t: `Source: ${result.title} (${result.url})`).join(\"\\n\\n\");\n}\n\nexport function isValyuAvailable(): boolean {\n\treturn hasCredentialSource({ provider: \"Valyu\", configuredValue: loadConfig().valyuApiKey, environmentValue: process.env.VALYU_API_KEY });\n}\n\nexport async function searchWithValyu(query: string, options: SearchOptions & { includeContent?: boolean } = {}): Promise<SearchResponse> {\n\tconst apiKey = await requireApiKey(options.signal);\n\tconst numResults = normalizeCount(options.numResults);\n\tconst startDate = recencyToStartDate(options.recencyFilter);\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query });\n\tlet response: Response;\n\ttry {\n\t\tresponse = await fetch(VALYU_SEARCH_URL, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"x-api-key\": apiKey, \"Content-Type\": \"application/json\", Accept: \"application/json\" },\n\t\t\tbody: JSON.stringify({ query, max_num_results: numResults, ...mapDomainFilter(options.domainFilter), ...(startDate ? { start_date: startDate } : {}) }),\n\t\t\tsignal: options.signal ? AbortSignal.any([AbortSignal.timeout(SEARCH_TIMEOUT_MS), options.signal]) : AbortSignal.timeout(SEARCH_TIMEOUT_MS),\n\t\t});\n\t} catch (err) {\n\t\tconst message = errorMessage(err);\n\t\tconst redactedMessage = redactCredential(message, apiKey);\n\t\tif (redactedMessage.toLowerCase().includes(\"abort\")) activityMonitor.logComplete(activityId, 0);\n\t\telse activityMonitor.logError(activityId, redactedMessage);\n\t\tif (redactedMessage === message) throw err;\n\t\tconst redactedError = new Error(redactedMessage);\n\t\tif (err instanceof Error) redactedError.name = err.name;\n\t\tthrow redactedError;\n\t}\n\tif (!response.ok) {\n\t\tactivityMonitor.logComplete(activityId, response.status);\n\t\tconst errorText = redactCredential(await response.text(), apiKey);\n\t\tthrow new Error(`Valyu API error ${response.status}: ${errorText.slice(0, 300)}`);\n\t}\n\tlet rawData: unknown;\n\ttry {\n\t\trawData = await response.json();\n\t} catch (err) {\n\t\tactivityMonitor.logComplete(activityId, response.status);\n\t\tthrow new Error(`Valyu API returned invalid JSON: ${errorMessage(err)}`);\n\t}\n\tlet entries: ValyuResult[];\n\ttry {\n\t\tentries = parseResponse(rawData);\n\t} catch (err) {\n\t\tactivityMonitor.logComplete(activityId, response.status);\n\t\tthrow err;\n\t}\n\tactivityMonitor.logComplete(activityId, response.status);\n\tconst results: SearchResponse[\"results\"] = [];\n\tconst inlineContent: ExtractedContent[] = [];\n\tfor (const entry of entries) {\n\t\tif (!entry || typeof entry !== \"object\") continue;\n\t\tconst url = text(entry.url, Number.MAX_SAFE_INTEGER);\n\t\tif (!url) continue;\n\t\tconst title = text(entry.title, Number.MAX_SAFE_INTEGER) || `Source ${results.length + 1}`;\n\t\tconst content = text(entry.content, MAX_CONTENT_CHARS);\n\t\tconst description = text(entry.description, MAX_SNIPPET_CHARS);\n\t\tresults.push({ title, url, snippet: (content || description).slice(0, MAX_SNIPPET_CHARS) });\n\t\tif (options.includeContent && content) inlineContent.push({ url, title, content, error: null });\n\t\tif (results.length >= numResults) break;\n\t}\n\treturn { answer: buildAnswer(results), results, ...(inlineContent.length > 0 ? { inlineContent } : {}) };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"valyu.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/valyu.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { activityMonitor } from \"./activity.ts\";\nimport type { ExtractedContent } from \"./extract.ts\";\nimport type { SearchOptions, SearchResponse } from \"./perplexity.ts\";\nimport { hasCredentialSource, redactCredential, resolveCredential } from \"./credential-source.ts\";\nimport { getWebSearchConfigPath } from \"./utils.ts\";\n\nconst VALYU_SEARCH_URL = \"https://api.valyu.ai/v1/search\";\nconst CONFIG_PATH = getWebSearchConfigPath();\nconst SEARCH_TIMEOUT_MS = 60_000;\nconst MAX_SNIPPET_CHARS = 2_500;\nconst MAX_CONTENT_CHARS = 4_000;\n\ninterface WebSearchConfig {\n\tvalyuApiKey?: unknown;\n}\n\ninterface ValyuResult {\n\ttitle?: unknown;\n\turl?: unknown;\n\tdescription?: unknown;\n\tcontent?: unknown;\n}\n\nlet cachedConfig: WebSearchConfig | null = null;\n\nfunction loadConfig(): WebSearchConfig {\n\tif (cachedConfig) return cachedConfig;\n\tif (!existsSync(CONFIG_PATH)) {\n\t\tcachedConfig = {};\n\t\treturn cachedConfig;\n\t}\n\tconst raw = readFileSync(CONFIG_PATH, \"utf-8\");\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${CONFIG_PATH}: ${message}`);\n\t}\n\tif (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\tthrow new Error(`Invalid config in ${CONFIG_PATH}: expected a JSON object`);\n\t}\n\tcachedConfig = parsed as WebSearchConfig;\n\treturn cachedConfig;\n}\n\nasync function getApiKey(signal?: AbortSignal): Promise<string | null> {\n\treturn resolveCredential({\n\t\tprovider: \"Valyu\",\n\t\tconfiguredValue: loadConfig().valyuApiKey,\n\t\tenvironmentValue: process.env.VALYU_API_KEY,\n\t\tsignal,\n\t});\n}\n\nasync function requireApiKey(signal?: AbortSignal): Promise<string> {\n\tconst apiKey = await getApiKey(signal);\n\tif (!apiKey) {\n\t\tthrow new Error(\n\t\t\t\"Valyu API key not found. Either:\\n\" +\n\t\t\t` 1. Create ${CONFIG_PATH} with { \"valyuApiKey\": \"your-key\" }\\n` +\n\t\t\t\" 2. Set VALYU_API_KEY environment variable\\n\" +\n\t\t\t\"Get a key at https://platform.valyu.ai\",\n\t\t);\n\t}\n\treturn apiKey;\n}\n\nfunction normalizeCount(value: number | undefined): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return 5;\n\treturn Math.max(1, Math.min(Math.floor(value), 20));\n}\n\nfunction normalizeDomain(value: string): string | null {\n\tlet input = value.trim().toLowerCase();\n\tif (!input) return null;\n\tif (input.startsWith(\"-\")) input = input.slice(1).trim();\n\tif (!input) return null;\n\ttry {\n\t\tconst parsed = input.includes(\"://\") ? new URL(input) : new URL(`https://${input}`);\n\t\tinput = parsed.hostname;\n\t} catch {\n\t\tinput = input.split(\"/\")[0]?.split(\":\")[0] ?? \"\";\n\t}\n\tinput = input.replace(/^\\.+|\\.+$/g, \"\");\n\treturn /^[a-z0-9][a-z0-9.-]*\\.[a-z]{2,}$/i.test(input) ? input : null;\n}\n\nfunction mapDomainFilter(domainFilter: string[] | undefined): { included_sources?: string[]; excluded_sources?: string[] } {\n\tif (!domainFilter?.length) return {};\n\tconst included_sources: string[] = [];\n\tconst excluded_sources: string[] = [];\n\tfor (const raw of domainFilter) {\n\t\tconst domain = normalizeDomain(raw);\n\t\tif (!domain) continue;\n\t\tconst target = raw.trim().startsWith(\"-\") ? excluded_sources : included_sources;\n\t\tif (!target.includes(domain)) target.push(domain);\n\t}\n\treturn {\n\t\t...(included_sources.length > 0 ? { included_sources } : {}),\n\t\t...(excluded_sources.length > 0 ? { excluded_sources } : {}),\n\t};\n}\n\nfunction recencyToStartDate(filter: SearchOptions[\"recencyFilter\"]): string | undefined {\n\tif (!filter) return undefined;\n\tconst days = { day: 1, week: 7, month: 30, year: 365 }[filter];\n\treturn days ? new Date(Date.now() - days * 86_400_000).toISOString().slice(0, 10) : undefined;\n}\n\nfunction text(value: unknown, limit: number): string {\n\treturn typeof value === \"string\" ? value.replace(/\\s+/g, \" \").trim().slice(0, limit) : \"\";\n}\n\nfunction errorMessage(err: unknown): string {\n\treturn err instanceof Error ? err.message : String(err);\n}\n\nfunction invalidResponse(message: string): Error {\n\treturn new Error(`Valyu API returned invalid response: ${message}`);\n}\n\nfunction parseResponse(value: unknown): ValyuResult[] {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) throw invalidResponse(\"expected an object envelope\");\n\tconst envelope = value as Record<string, unknown>;\n\tif (envelope.success !== true) throw invalidResponse(\"expected success true\");\n\tif (!Array.isArray(envelope.results)) throw invalidResponse(\"expected results array\");\n\treturn envelope.results as ValyuResult[];\n}\n\nfunction buildAnswer(results: SearchResponse[\"results\"]): string {\n\treturn results.map((result) => result.snippet\n\t\t? `${result.snippet}\\nSource: ${result.title} (${result.url})`\n\t\t: `Source: ${result.title} (${result.url})`).join(\"\\n\\n\");\n}\n\nexport function isValyuAvailable(): boolean {\n\treturn hasCredentialSource({ provider: \"Valyu\", configuredValue: loadConfig().valyuApiKey, environmentValue: process.env.VALYU_API_KEY });\n}\n\nexport async function searchWithValyu(query: string, options: SearchOptions & { includeContent?: boolean } = {}): Promise<SearchResponse> {\n\tconst apiKey = await requireApiKey(options.signal);\n\tconst numResults = normalizeCount(options.numResults);\n\tconst startDate = recencyToStartDate(options.recencyFilter);\n\tconst activityId = activityMonitor.logStart({ type: \"api\", query });\n\tlet response: Response;\n\ttry {\n\t\tresponse = await fetch(VALYU_SEARCH_URL, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"x-api-key\": apiKey, \"Content-Type\": \"application/json\", Accept: \"application/json\" },\n\t\t\tbody: JSON.stringify({ query, max_num_results: numResults, ...mapDomainFilter(options.domainFilter), ...(startDate ? { start_date: startDate } : {}) }),\n\t\t\tsignal: options.signal ? AbortSignal.any([AbortSignal.timeout(SEARCH_TIMEOUT_MS), options.signal]) : AbortSignal.timeout(SEARCH_TIMEOUT_MS),\n\t\t});\n\t} catch (err) {\n\t\tconst message = errorMessage(err);\n\t\tconst redactedMessage = redactCredential(message, apiKey);\n\t\tif (redactedMessage.toLowerCase().includes(\"abort\")) activityMonitor.logComplete(activityId, 0);\n\t\telse activityMonitor.logError(activityId, redactedMessage);\n\t\tif (redactedMessage === message) throw err;\n\t\tconst redactedError = new Error(redactedMessage);\n\t\tif (err instanceof Error) redactedError.name = err.name;\n\t\tthrow redactedError;\n\t}\n\tif (!response.ok) {\n\t\tactivityMonitor.logComplete(activityId, response.status);\n\t\tconst errorText = redactCredential(await response.text(), apiKey);\n\t\tthrow new Error(`Valyu API error ${response.status}: ${errorText.slice(0, 300)}`);\n\t}\n\tlet rawData: unknown;\n\ttry {\n\t\trawData = await response.json();\n\t} catch (err) {\n\t\tactivityMonitor.logComplete(activityId, response.status);\n\t\tthrow new Error(`Valyu API returned invalid JSON: ${errorMessage(err)}`);\n\t}\n\tlet entries: ValyuResult[];\n\ttry {\n\t\tentries = parseResponse(rawData);\n\t} catch (err) {\n\t\tactivityMonitor.logComplete(activityId, response.status);\n\t\tthrow err;\n\t}\n\tactivityMonitor.logComplete(activityId, response.status);\n\tconst results: SearchResponse[\"results\"] = [];\n\tconst inlineContent: ExtractedContent[] = [];\n\tfor (const entry of entries) {\n\t\tif (!entry || typeof entry !== \"object\") continue;\n\t\tconst url = text(entry.url, Number.MAX_SAFE_INTEGER);\n\t\tif (!url) continue;\n\t\tconst title = text(entry.title, Number.MAX_SAFE_INTEGER) || `Source ${results.length + 1}`;\n\t\tconst content = text(entry.content, MAX_CONTENT_CHARS);\n\t\tconst description = text(entry.description, MAX_SNIPPET_CHARS);\n\t\tresults.push({ title, url, snippet: (content || description).slice(0, MAX_SNIPPET_CHARS) });\n\t\tif (options.includeContent && content) inlineContent.push({ url, title, content, error: null });\n\t\tif (results.length >= numResults) break;\n\t}\n\treturn { answer: buildAnswer(results), results, ...(inlineContent.length > 0 ? { inlineContent } : {}) };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"video-extract.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/video-extract.ts"],"names":[],"mappings":"AAQA,OAAO,EAAuB,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AA+BjH,UAAU,aAAa;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,OAAO,CAAC;CAC3B;AAwDD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAuC/D;AAuBD,wBAAsB,YAAY,CACjC,IAAI,EAAE,aAAa,EACnB,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,cAAc,GACtB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAkClC;AASD,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,MAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAWnG;AAED,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAcjG","sourcesContent":["import { execFileSync } from \"node:child_process\";\nimport { existsSync, readFileSync, readdirSync, statSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { resolve, extname, basename, join, dirname } from \"node:path\";\nimport { activityMonitor } from \"./activity.ts\";\nimport { canAttachImages } from \"./feature-config.ts\";\nimport { isGeminiWebAvailable, queryWithCookies } from \"./gemini-web.ts\";\nimport { queryGeminiApiWithVideo, getApiKey, fetchGeminiApi, getVersionedApiBase, getUploadBase, redactGeminiApiResponse } from \"./gemini-api.ts\";\nimport { extractHeadingTitle, type ExtractedContent, type ExtractOptions, type FrameResult } from \"./extract.ts\";\nimport { readExecError, trimErrorText, mapFfmpegError, getWebSearchConfigPath } from \"./utils.ts\";\n\nconst CONFIG_PATH = getWebSearchConfigPath();\n\nconst DEFAULT_VIDEO_PROMPT = `Extract the complete content of this video. Include:\n1. Video title (infer from content if not explicit), duration\n2. A brief summary (2-3 sentences)\n3. Full transcript with timestamps\n4. Descriptions of any code, terminal commands, diagrams, slides, or UI shown on screen\n\nFormat as markdown.`;\n\nconst VIDEO_EXTENSIONS: Record<string, string> = {\n\t\".mp4\": \"video/mp4\",\n\t\".mov\": \"video/quicktime\",\n\t\".webm\": \"video/webm\",\n\t\".avi\": \"video/x-msvideo\",\n\t\".mpeg\": \"video/mpeg\",\n\t\".mpg\": \"video/mpeg\",\n\t\".wmv\": \"video/x-ms-wmv\",\n\t\".flv\": \"video/x-flv\",\n\t\".3gp\": \"video/3gpp\",\n\t\".3gpp\": \"video/3gpp\",\n};\n\nfunction shouldRethrow(err: unknown): boolean {\n\tconst message = err instanceof Error ? err.message : String(err);\n\treturn message.startsWith(\"Failed to parse \");\n}\n\ninterface VideoFileInfo {\n\tabsolutePath: string;\n\tmimeType: string;\n\tsizeBytes: number;\n\tmaxSizeBytes: number;\n\twithinUploadLimit: boolean;\n}\n\ninterface VideoConfig {\n\tenabled: boolean;\n\tpreferredModel: string;\n\tmaxSizeMB: number;\n}\n\nfunction normalizePreferredModel(value: unknown, fallback: string): string {\n\tif (typeof value !== \"string\") return fallback;\n\tconst normalized = value.trim();\n\treturn normalized.length > 0 ? normalized : fallback;\n}\n\nfunction normalizeEnabled(value: unknown, fallback: boolean): boolean {\n\treturn typeof value === \"boolean\" ? value : fallback;\n}\n\nfunction normalizeMaxSizeMB(value: unknown, fallback: number): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return fallback;\n\treturn value > 0 ? value : fallback;\n}\n\nconst VIDEO_CONFIG_DEFAULTS: VideoConfig = {\n\tenabled: true,\n\tpreferredModel: \"gemini-3.6-flash\",\n\tmaxSizeMB: 50,\n};\n\nlet cachedVideoConfig: VideoConfig | null = null;\n\nfunction loadVideoConfig(): VideoConfig {\n\tif (cachedVideoConfig) return cachedVideoConfig;\n\tif (!existsSync(CONFIG_PATH)) {\n\t\tcachedVideoConfig = { ...VIDEO_CONFIG_DEFAULTS };\n\t\treturn cachedVideoConfig;\n\t}\n\n\tconst rawText = readFileSync(CONFIG_PATH, \"utf-8\");\n\tlet raw: { video?: { enabled?: boolean; preferredModel?: string; maxSizeMB?: number } };\n\ttry {\n\t\traw = JSON.parse(rawText) as { video?: { enabled?: boolean; preferredModel?: string; maxSizeMB?: number } };\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${CONFIG_PATH}: ${message}`);\n\t}\n\n\tconst v = raw.video ?? {};\n\tcachedVideoConfig = {\n\t\tenabled: normalizeEnabled(v.enabled, VIDEO_CONFIG_DEFAULTS.enabled),\n\t\tpreferredModel: normalizePreferredModel(v.preferredModel, VIDEO_CONFIG_DEFAULTS.preferredModel),\n\t\tmaxSizeMB: normalizeMaxSizeMB(v.maxSizeMB, VIDEO_CONFIG_DEFAULTS.maxSizeMB),\n\t};\n\treturn cachedVideoConfig;\n}\n\nexport function isVideoFile(input: string): VideoFileInfo | null {\n\tconst config = loadVideoConfig();\n\tif (!config.enabled) return null;\n\n\tconst isFilePath = input.startsWith(\"/\") || input.startsWith(\"./\") || input.startsWith(\"../\") || input.startsWith(\"file://\");\n\tif (!isFilePath) return null;\n\n\tlet filePath = input;\n\tif (input.startsWith(\"file://\")) {\n\t\ttry {\n\t\t\tfilePath = decodeURIComponent(new URL(input).pathname);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tconst ext = extname(filePath).toLowerCase();\n\tconst mimeType = VIDEO_EXTENSIONS[ext];\n\tif (!mimeType) return null;\n\n\tconst absolutePath = resolveFilePath(filePath);\n\tif (!absolutePath) return null;\n\n\tlet stat: ReturnType<typeof statSync>;\n\ttry {\n\t\tstat = statSync(absolutePath);\n\t} catch {\n\t\treturn null;\n\t}\n\tif (!stat.isFile()) return null;\n\n\tconst maxBytes = config.maxSizeMB * 1024 * 1024;\n\treturn {\n\t\tabsolutePath,\n\t\tmimeType,\n\t\tsizeBytes: stat.size,\n\t\tmaxSizeBytes: maxBytes,\n\t\twithinUploadLimit: stat.size <= maxBytes,\n\t};\n}\n\nfunction resolveFilePath(filePath: string): string | null {\n\tconst absolutePath = resolve(filePath);\n\tif (existsSync(absolutePath)) return absolutePath;\n\n\tconst dir = dirname(absolutePath);\n\tconst base = basename(absolutePath);\n\tif (!existsSync(dir)) return null;\n\n\ttry {\n\t\tconst normalizedBase = normalizeSpaces(base);\n\t\tconst match = readdirSync(dir).find(f => normalizeSpaces(f) === normalizedBase);\n\t\treturn match ? join(dir, match) : null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction normalizeSpaces(s: string): string {\n\treturn s.replace(/[\\u00A0\\u2000-\\u200B\\u202F\\u205F\\u3000\\uFEFF]/g, \" \");\n}\n\nexport async function extractVideo(\n\tinfo: VideoFileInfo,\n\tsignal?: AbortSignal,\n\toptions?: ExtractOptions,\n): Promise<ExtractedContent | null> {\n\tconst config = loadVideoConfig();\n\tconst effectivePrompt = options?.prompt ?? DEFAULT_VIDEO_PROMPT;\n\tconst effectiveModel = options?.model ?? config.preferredModel;\n\tconst displayName = basename(info.absolutePath);\n\tif (!info.withinUploadLimit) {\n\t\tconst sizeMB = (info.sizeBytes / 1024 / 1024).toFixed(1);\n\t\tconst maxSizeMB = (info.maxSizeBytes / 1024 / 1024).toFixed(1);\n\t\tconst error = `Local video ${displayName} is ${sizeMB} MiB, above configured video.maxSizeMB (${maxSizeMB} MiB) for Gemini analysis. Use timestamp/frames for ffmpeg frame extraction, increase video.maxSizeMB, or compress the file.`;\n\t\treturn { url: info.absolutePath, title: displayName, content: error, error };\n\t}\n\tconst activityId = activityMonitor.logStart({ type: \"fetch\", url: `video:${displayName}` });\n\n\tconst result = await tryVideoGeminiApi(info, effectivePrompt, effectiveModel, signal)\n\t\t?? await tryVideoGeminiWeb(info, effectivePrompt, effectiveModel, signal);\n\n\tif (result) {\n\t\tif (canAttachImages()) {\n\t\t\tconst thumbnail = await extractVideoFrame(info.absolutePath);\n\t\t\tif (!(\"error\" in thumbnail)) {\n\t\t\t\tresult.thumbnail = thumbnail;\n\t\t\t}\n\t\t}\n\t\tactivityMonitor.logComplete(activityId, 200);\n\t\treturn result;\n\t}\n\n\tif (signal?.aborted) {\n\t\tactivityMonitor.logComplete(activityId, 0);\n\t\treturn null;\n\t}\n\n\tactivityMonitor.logError(activityId, \"all video extraction paths failed\");\n\treturn null;\n}\n\nfunction mapFfprobeError(err: unknown): string {\n\tconst { code, stderr, message } = readExecError(err);\n\tif (code === \"ENOENT\") return \"ffprobe is not installed. Install ffmpeg which includes ffprobe\";\n\tconst snippet = trimErrorText(stderr || message);\n\treturn snippet ? `ffprobe failed: ${snippet}` : \"ffprobe failed\";\n}\n\nexport async function extractVideoFrame(filePath: string, seconds: number = 1): Promise<FrameResult> {\n\ttry {\n\t\tconst buffer = execFileSync(\"ffmpeg\", [\n\t\t\t\"-ss\", String(seconds), \"-i\", filePath,\n\t\t\t\"-frames:v\", \"1\", \"-f\", \"image2pipe\", \"-vcodec\", \"mjpeg\", \"pipe:1\",\n\t\t], { maxBuffer: 5 * 1024 * 1024, timeout: 10000, stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n\t\tif (buffer.length === 0) return { error: \"ffmpeg failed: empty output\" };\n\t\treturn { data: buffer.toString(\"base64\"), mimeType: \"image/jpeg\" };\n\t} catch (err) {\n\t\treturn { error: mapFfmpegError(err) };\n\t}\n}\n\nexport async function getLocalVideoDuration(filePath: string): Promise<number | { error: string }> {\n\ttry {\n\t\tconst output = execFileSync(\"ffprobe\", [\n\t\t\t\"-v\", \"quiet\",\n\t\t\t\"-show_entries\", \"format=duration\",\n\t\t\t\"-of\", \"csv=p=0\",\n\t\t\tfilePath,\n\t\t], { timeout: 10000, encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"pipe\"] }).trim();\n\t\tconst duration = Number.parseFloat(output);\n\t\tif (!Number.isFinite(duration)) return { error: \"ffprobe failed: invalid duration output\" };\n\t\treturn duration;\n\t} catch (err) {\n\t\treturn { error: mapFfprobeError(err) };\n\t}\n}\n\nasync function tryVideoGeminiWeb(\n\tinfo: VideoFileInfo,\n\tprompt: string,\n\tmodel: string,\n\tsignal?: AbortSignal,\n): Promise<ExtractedContent | null> {\n\ttry {\n\t\tconst cookies = await isGeminiWebAvailable();\n\t\tif (!cookies) return null;\n\t\tif (signal?.aborted) return null;\n\n\t\tconst text = await queryWithCookies(prompt, cookies, {\n\t\t\tfiles: [info.absolutePath],\n\t\t\t...(model !== \"gemini-3.6-flash\" ? { model } : {}),\n\t\t\tsignal,\n\t\t\ttimeoutMs: 180000,\n\t\t});\n\n\t\treturn {\n\t\t\turl: info.absolutePath,\n\t\t\ttitle: extractVideoTitle(text, info.absolutePath),\n\t\t\tcontent: text,\n\t\t\terror: null,\n\t\t};\n\t} catch (err) {\n\t\tif (shouldRethrow(err)) throw err;\n\t\treturn null;\n\t}\n}\n\nasync function tryVideoGeminiApi(\n\tinfo: VideoFileInfo,\n\tprompt: string,\n\tmodel: string,\n\tsignal?: AbortSignal,\n): Promise<ExtractedContent | null> {\n\tconst apiKey = await getApiKey(signal);\n\tif (!apiKey) return null;\n\tif (signal?.aborted) return null;\n\n\tlet fileName: string | null = null;\n\ttry {\n\t\tconst uploaded = await uploadToFilesApi(info, apiKey, signal);\n\t\tfileName = uploaded.name;\n\n\t\tawait pollFileState(fileName, apiKey, signal, 120000);\n\n\t\tconst text = await queryGeminiApiWithVideo(prompt, uploaded.uri, {\n\t\t\tapiKey,\n\t\t\tmodel,\n\t\t\tmimeType: info.mimeType,\n\t\t\tsignal,\n\t\t\ttimeoutMs: 120000,\n\t\t});\n\n\t\treturn {\n\t\t\turl: info.absolutePath,\n\t\t\ttitle: extractVideoTitle(text, info.absolutePath),\n\t\t\tcontent: text,\n\t\t\terror: null,\n\t\t};\n\t} catch (err) {\n\t\tif (shouldRethrow(err)) throw err;\n\t\treturn null;\n\t} finally {\n\t\tif (fileName) deleteGeminiFile(fileName, apiKey);\n\t}\n}\n\nasync function uploadToFilesApi(\n\tinfo: VideoFileInfo,\n\tapiKey: string,\n\tsignal?: AbortSignal,\n): Promise<{ name: string; uri: string }> {\n\tconst displayName = basename(info.absolutePath);\n\n\tconst initRes = await fetchGeminiApi(`${getUploadBase()}/files`, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"X-Goog-Upload-Protocol\": \"resumable\",\n\t\t\t\"X-Goog-Upload-Command\": \"start\",\n\t\t\t\"X-Goog-Upload-Header-Content-Length\": String(info.sizeBytes),\n\t\t\t\"X-Goog-Upload-Header-Content-Type\": info.mimeType,\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t\tbody: JSON.stringify({ file: { display_name: displayName } }),\n\t\tsignal,\n\t}, apiKey);\n\n\tif (!initRes.ok) {\n\t\tconst text = redactGeminiApiResponse(initRes, await initRes.text(), apiKey);\n\t\tthrow new Error(`File upload init failed: ${initRes.status} (${text.slice(0, 200)})`);\n\t}\n\n\tconst uploadUrl = initRes.headers.get(\"x-goog-upload-url\");\n\tif (!uploadUrl) throw new Error(\"No upload URL in response headers\");\n\n\tconst fileData = await readFile(info.absolutePath);\n\tconst uploadRes = await fetchGeminiApi(uploadUrl, {\n\t\tmethod: \"PUT\",\n\t\theaders: {\n\t\t\t\"Content-Length\": String(info.sizeBytes),\n\t\t\t\"X-Goog-Upload-Offset\": \"0\",\n\t\t\t\"X-Goog-Upload-Command\": \"upload, finalize\",\n\t\t},\n\t\tbody: fileData,\n\t\tsignal,\n\t}, apiKey);\n\n\tif (!uploadRes.ok) {\n\t\tconst text = redactGeminiApiResponse(uploadRes, await uploadRes.text(), apiKey);\n\t\tthrow new Error(`File upload failed: ${uploadRes.status} (${text.slice(0, 200)})`);\n\t}\n\n\tconst result = await uploadRes.json() as { file: { name: string; uri: string } };\n\treturn result.file;\n}\n\nasync function pollFileState(\n\tfileName: string,\n\tapiKey: string,\n\tsignal?: AbortSignal,\n\ttimeoutMs: number = 120000,\n): Promise<void> {\n\tconst deadline = Date.now() + timeoutMs;\n\n\twhile (Date.now() < deadline) {\n\t\tif (signal?.aborted) throw new Error(\"Aborted\");\n\n\t\tconst res = await fetchGeminiApi(`${getVersionedApiBase()}/${fileName}`, { signal }, apiKey);\n\t\tif (!res.ok) throw new Error(`File state check failed: ${res.status}`);\n\n\t\tconst data = await res.json() as { state: string };\n\t\tif (data.state === \"ACTIVE\") return;\n\t\tif (data.state === \"FAILED\") throw new Error(\"File processing failed\");\n\n\t\tawait new Promise(r => setTimeout(r, 5000));\n\t}\n\n\tthrow new Error(\"File processing timed out\");\n}\n\nfunction deleteGeminiFile(fileName: string, apiKey: string): void {\n\tvoid fetchGeminiApi(`${getVersionedApiBase()}/${fileName}`, { method: \"DELETE\" }, apiKey).catch((err) => {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tconsole.error(`Failed to delete Gemini file ${fileName}: ${message}`);\n\t});\n}\n\nfunction extractVideoTitle(text: string, filePath: string): string {\n\treturn extractHeadingTitle(text) ?? basename(filePath, extname(filePath));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"video-extract.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/video-extract.ts"],"names":[],"mappings":"AAQA,OAAO,EAAuB,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AA+BjH,UAAU,aAAa;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,OAAO,CAAC;CAC3B;AAwDD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAuC/D;AAuBD,wBAAsB,YAAY,CACjC,IAAI,EAAE,aAAa,EACnB,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,cAAc,GACtB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAkClC;AASD,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,MAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAWnG;AAED,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAcjG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"video-extract.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/video-extract.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFileSync } from \"node:child_process\";\nimport { existsSync, readFileSync, readdirSync, statSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { resolve, extname, basename, join, dirname } from \"node:path\";\nimport { activityMonitor } from \"./activity.ts\";\nimport { canAttachImages } from \"./feature-config.ts\";\nimport { isGeminiWebAvailable, queryWithCookies } from \"./gemini-web.ts\";\nimport { queryGeminiApiWithVideo, getApiKey, fetchGeminiApi, getVersionedApiBase, getUploadBase, redactGeminiApiResponse } from \"./gemini-api.ts\";\nimport { extractHeadingTitle, type ExtractedContent, type ExtractOptions, type FrameResult } from \"./extract.ts\";\nimport { readExecError, trimErrorText, mapFfmpegError, getWebSearchConfigPath } from \"./utils.ts\";\n\nconst CONFIG_PATH = getWebSearchConfigPath();\n\nconst DEFAULT_VIDEO_PROMPT = `Extract the complete content of this video. Include:\n1. Video title (infer from content if not explicit), duration\n2. A brief summary (2-3 sentences)\n3. Full transcript with timestamps\n4. Descriptions of any code, terminal commands, diagrams, slides, or UI shown on screen\n\nFormat as markdown.`;\n\nconst VIDEO_EXTENSIONS: Record<string, string> = {\n\t\".mp4\": \"video/mp4\",\n\t\".mov\": \"video/quicktime\",\n\t\".webm\": \"video/webm\",\n\t\".avi\": \"video/x-msvideo\",\n\t\".mpeg\": \"video/mpeg\",\n\t\".mpg\": \"video/mpeg\",\n\t\".wmv\": \"video/x-ms-wmv\",\n\t\".flv\": \"video/x-flv\",\n\t\".3gp\": \"video/3gpp\",\n\t\".3gpp\": \"video/3gpp\",\n};\n\nfunction shouldRethrow(err: unknown): boolean {\n\tconst message = err instanceof Error ? err.message : String(err);\n\treturn message.startsWith(\"Failed to parse \");\n}\n\ninterface VideoFileInfo {\n\tabsolutePath: string;\n\tmimeType: string;\n\tsizeBytes: number;\n\tmaxSizeBytes: number;\n\twithinUploadLimit: boolean;\n}\n\ninterface VideoConfig {\n\tenabled: boolean;\n\tpreferredModel: string;\n\tmaxSizeMB: number;\n}\n\nfunction normalizePreferredModel(value: unknown, fallback: string): string {\n\tif (typeof value !== \"string\") return fallback;\n\tconst normalized = value.trim();\n\treturn normalized.length > 0 ? normalized : fallback;\n}\n\nfunction normalizeEnabled(value: unknown, fallback: boolean): boolean {\n\treturn typeof value === \"boolean\" ? value : fallback;\n}\n\nfunction normalizeMaxSizeMB(value: unknown, fallback: number): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return fallback;\n\treturn value > 0 ? value : fallback;\n}\n\nconst VIDEO_CONFIG_DEFAULTS: VideoConfig = {\n\tenabled: true,\n\tpreferredModel: \"gemini-3.6-flash\",\n\tmaxSizeMB: 50,\n};\n\nlet cachedVideoConfig: VideoConfig | null = null;\n\nfunction loadVideoConfig(): VideoConfig {\n\tif (cachedVideoConfig) return cachedVideoConfig;\n\tif (!existsSync(CONFIG_PATH)) {\n\t\tcachedVideoConfig = { ...VIDEO_CONFIG_DEFAULTS };\n\t\treturn cachedVideoConfig;\n\t}\n\n\tconst rawText = readFileSync(CONFIG_PATH, \"utf-8\");\n\tlet raw: { video?: { enabled?: boolean; preferredModel?: string; maxSizeMB?: number } };\n\ttry {\n\t\traw = JSON.parse(rawText) as { video?: { enabled?: boolean; preferredModel?: string; maxSizeMB?: number } };\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${CONFIG_PATH}: ${message}`);\n\t}\n\n\tconst v = raw.video ?? {};\n\tcachedVideoConfig = {\n\t\tenabled: normalizeEnabled(v.enabled, VIDEO_CONFIG_DEFAULTS.enabled),\n\t\tpreferredModel: normalizePreferredModel(v.preferredModel, VIDEO_CONFIG_DEFAULTS.preferredModel),\n\t\tmaxSizeMB: normalizeMaxSizeMB(v.maxSizeMB, VIDEO_CONFIG_DEFAULTS.maxSizeMB),\n\t};\n\treturn cachedVideoConfig;\n}\n\nexport function isVideoFile(input: string): VideoFileInfo | null {\n\tconst config = loadVideoConfig();\n\tif (!config.enabled) return null;\n\n\tconst isFilePath = input.startsWith(\"/\") || input.startsWith(\"./\") || input.startsWith(\"../\") || input.startsWith(\"file://\");\n\tif (!isFilePath) return null;\n\n\tlet filePath = input;\n\tif (input.startsWith(\"file://\")) {\n\t\ttry {\n\t\t\tfilePath = decodeURIComponent(new URL(input).pathname);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tconst ext = extname(filePath).toLowerCase();\n\tconst mimeType = VIDEO_EXTENSIONS[ext];\n\tif (!mimeType) return null;\n\n\tconst absolutePath = resolveFilePath(filePath);\n\tif (!absolutePath) return null;\n\n\tlet stat: ReturnType<typeof statSync>;\n\ttry {\n\t\tstat = statSync(absolutePath);\n\t} catch {\n\t\treturn null;\n\t}\n\tif (!stat.isFile()) return null;\n\n\tconst maxBytes = config.maxSizeMB * 1024 * 1024;\n\treturn {\n\t\tabsolutePath,\n\t\tmimeType,\n\t\tsizeBytes: stat.size,\n\t\tmaxSizeBytes: maxBytes,\n\t\twithinUploadLimit: stat.size <= maxBytes,\n\t};\n}\n\nfunction resolveFilePath(filePath: string): string | null {\n\tconst absolutePath = resolve(filePath);\n\tif (existsSync(absolutePath)) return absolutePath;\n\n\tconst dir = dirname(absolutePath);\n\tconst base = basename(absolutePath);\n\tif (!existsSync(dir)) return null;\n\n\ttry {\n\t\tconst normalizedBase = normalizeSpaces(base);\n\t\tconst match = readdirSync(dir).find(f => normalizeSpaces(f) === normalizedBase);\n\t\treturn match ? join(dir, match) : null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction normalizeSpaces(s: string): string {\n\treturn s.replace(/[\\u00A0\\u2000-\\u200B\\u202F\\u205F\\u3000\\uFEFF]/g, \" \");\n}\n\nexport async function extractVideo(\n\tinfo: VideoFileInfo,\n\tsignal?: AbortSignal,\n\toptions?: ExtractOptions,\n): Promise<ExtractedContent | null> {\n\tconst config = loadVideoConfig();\n\tconst effectivePrompt = options?.prompt ?? DEFAULT_VIDEO_PROMPT;\n\tconst effectiveModel = options?.model ?? config.preferredModel;\n\tconst displayName = basename(info.absolutePath);\n\tif (!info.withinUploadLimit) {\n\t\tconst sizeMB = (info.sizeBytes / 1024 / 1024).toFixed(1);\n\t\tconst maxSizeMB = (info.maxSizeBytes / 1024 / 1024).toFixed(1);\n\t\tconst error = `Local video ${displayName} is ${sizeMB} MiB, above configured video.maxSizeMB (${maxSizeMB} MiB) for Gemini analysis. Use timestamp/frames for ffmpeg frame extraction, increase video.maxSizeMB, or compress the file.`;\n\t\treturn { url: info.absolutePath, title: displayName, content: error, error };\n\t}\n\tconst activityId = activityMonitor.logStart({ type: \"fetch\", url: `video:${displayName}` });\n\n\tconst result = await tryVideoGeminiApi(info, effectivePrompt, effectiveModel, signal)\n\t\t?? await tryVideoGeminiWeb(info, effectivePrompt, effectiveModel, signal);\n\n\tif (result) {\n\t\tif (canAttachImages()) {\n\t\t\tconst thumbnail = await extractVideoFrame(info.absolutePath);\n\t\t\tif (!(\"error\" in thumbnail)) {\n\t\t\t\tresult.thumbnail = thumbnail;\n\t\t\t}\n\t\t}\n\t\tactivityMonitor.logComplete(activityId, 200);\n\t\treturn result;\n\t}\n\n\tif (signal?.aborted) {\n\t\tactivityMonitor.logComplete(activityId, 0);\n\t\treturn null;\n\t}\n\n\tactivityMonitor.logError(activityId, \"all video extraction paths failed\");\n\treturn null;\n}\n\nfunction mapFfprobeError(err: unknown): string {\n\tconst { code, stderr, message } = readExecError(err);\n\tif (code === \"ENOENT\") return \"ffprobe is not installed. Install ffmpeg which includes ffprobe\";\n\tconst snippet = trimErrorText(stderr || message);\n\treturn snippet ? `ffprobe failed: ${snippet}` : \"ffprobe failed\";\n}\n\nexport async function extractVideoFrame(filePath: string, seconds: number = 1): Promise<FrameResult> {\n\ttry {\n\t\tconst buffer = execFileSync(\"ffmpeg\", [\n\t\t\t\"-ss\", String(seconds), \"-i\", filePath,\n\t\t\t\"-frames:v\", \"1\", \"-f\", \"image2pipe\", \"-vcodec\", \"mjpeg\", \"pipe:1\",\n\t\t], { maxBuffer: 5 * 1024 * 1024, timeout: 10000, stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n\t\tif (buffer.length === 0) return { error: \"ffmpeg failed: empty output\" };\n\t\treturn { data: buffer.toString(\"base64\"), mimeType: \"image/jpeg\" };\n\t} catch (err) {\n\t\treturn { error: mapFfmpegError(err) };\n\t}\n}\n\nexport async function getLocalVideoDuration(filePath: string): Promise<number | { error: string }> {\n\ttry {\n\t\tconst output = execFileSync(\"ffprobe\", [\n\t\t\t\"-v\", \"quiet\",\n\t\t\t\"-show_entries\", \"format=duration\",\n\t\t\t\"-of\", \"csv=p=0\",\n\t\t\tfilePath,\n\t\t], { timeout: 10000, encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"pipe\"] }).trim();\n\t\tconst duration = Number.parseFloat(output);\n\t\tif (!Number.isFinite(duration)) return { error: \"ffprobe failed: invalid duration output\" };\n\t\treturn duration;\n\t} catch (err) {\n\t\treturn { error: mapFfprobeError(err) };\n\t}\n}\n\nasync function tryVideoGeminiWeb(\n\tinfo: VideoFileInfo,\n\tprompt: string,\n\tmodel: string,\n\tsignal?: AbortSignal,\n): Promise<ExtractedContent | null> {\n\ttry {\n\t\tconst cookies = await isGeminiWebAvailable();\n\t\tif (!cookies) return null;\n\t\tif (signal?.aborted) return null;\n\n\t\tconst text = await queryWithCookies(prompt, cookies, {\n\t\t\tfiles: [info.absolutePath],\n\t\t\t...(model !== \"gemini-3.6-flash\" ? { model } : {}),\n\t\t\tsignal,\n\t\t\ttimeoutMs: 180000,\n\t\t});\n\n\t\treturn {\n\t\t\turl: info.absolutePath,\n\t\t\ttitle: extractVideoTitle(text, info.absolutePath),\n\t\t\tcontent: text,\n\t\t\terror: null,\n\t\t};\n\t} catch (err) {\n\t\tif (shouldRethrow(err)) throw err;\n\t\treturn null;\n\t}\n}\n\nasync function tryVideoGeminiApi(\n\tinfo: VideoFileInfo,\n\tprompt: string,\n\tmodel: string,\n\tsignal?: AbortSignal,\n): Promise<ExtractedContent | null> {\n\tconst apiKey = await getApiKey(signal);\n\tif (!apiKey) return null;\n\tif (signal?.aborted) return null;\n\n\tlet fileName: string | null = null;\n\ttry {\n\t\tconst uploaded = await uploadToFilesApi(info, apiKey, signal);\n\t\tfileName = uploaded.name;\n\n\t\tawait pollFileState(fileName, apiKey, signal, 120000);\n\n\t\tconst text = await queryGeminiApiWithVideo(prompt, uploaded.uri, {\n\t\t\tapiKey,\n\t\t\tmodel,\n\t\t\tmimeType: info.mimeType,\n\t\t\tsignal,\n\t\t\ttimeoutMs: 120000,\n\t\t});\n\n\t\treturn {\n\t\t\turl: info.absolutePath,\n\t\t\ttitle: extractVideoTitle(text, info.absolutePath),\n\t\t\tcontent: text,\n\t\t\terror: null,\n\t\t};\n\t} catch (err) {\n\t\tif (shouldRethrow(err)) throw err;\n\t\treturn null;\n\t} finally {\n\t\tif (fileName) deleteGeminiFile(fileName, apiKey);\n\t}\n}\n\nasync function uploadToFilesApi(\n\tinfo: VideoFileInfo,\n\tapiKey: string,\n\tsignal?: AbortSignal,\n): Promise<{ name: string; uri: string }> {\n\tconst displayName = basename(info.absolutePath);\n\n\tconst initRes = await fetchGeminiApi(`${getUploadBase()}/files`, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"X-Goog-Upload-Protocol\": \"resumable\",\n\t\t\t\"X-Goog-Upload-Command\": \"start\",\n\t\t\t\"X-Goog-Upload-Header-Content-Length\": String(info.sizeBytes),\n\t\t\t\"X-Goog-Upload-Header-Content-Type\": info.mimeType,\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t\tbody: JSON.stringify({ file: { display_name: displayName } }),\n\t\tsignal,\n\t}, apiKey);\n\n\tif (!initRes.ok) {\n\t\tconst text = redactGeminiApiResponse(initRes, await initRes.text(), apiKey);\n\t\tthrow new Error(`File upload init failed: ${initRes.status} (${text.slice(0, 200)})`);\n\t}\n\n\tconst uploadUrl = initRes.headers.get(\"x-goog-upload-url\");\n\tif (!uploadUrl) throw new Error(\"No upload URL in response headers\");\n\n\tconst fileData = await readFile(info.absolutePath);\n\tconst uploadRes = await fetchGeminiApi(uploadUrl, {\n\t\tmethod: \"PUT\",\n\t\theaders: {\n\t\t\t\"Content-Length\": String(info.sizeBytes),\n\t\t\t\"X-Goog-Upload-Offset\": \"0\",\n\t\t\t\"X-Goog-Upload-Command\": \"upload, finalize\",\n\t\t},\n\t\tbody: fileData,\n\t\tsignal,\n\t}, apiKey);\n\n\tif (!uploadRes.ok) {\n\t\tconst text = redactGeminiApiResponse(uploadRes, await uploadRes.text(), apiKey);\n\t\tthrow new Error(`File upload failed: ${uploadRes.status} (${text.slice(0, 200)})`);\n\t}\n\n\tconst result = await uploadRes.json() as { file: { name: string; uri: string } };\n\treturn result.file;\n}\n\nasync function pollFileState(\n\tfileName: string,\n\tapiKey: string,\n\tsignal?: AbortSignal,\n\ttimeoutMs: number = 120000,\n): Promise<void> {\n\tconst deadline = Date.now() + timeoutMs;\n\n\twhile (Date.now() < deadline) {\n\t\tif (signal?.aborted) throw new Error(\"Aborted\");\n\n\t\tconst res = await fetchGeminiApi(`${getVersionedApiBase()}/${fileName}`, { signal }, apiKey);\n\t\tif (!res.ok) throw new Error(`File state check failed: ${res.status}`);\n\n\t\tconst data = await res.json() as { state: string };\n\t\tif (data.state === \"ACTIVE\") return;\n\t\tif (data.state === \"FAILED\") throw new Error(\"File processing failed\");\n\n\t\tawait new Promise(r => setTimeout(r, 5000));\n\t}\n\n\tthrow new Error(\"File processing timed out\");\n}\n\nfunction deleteGeminiFile(fileName: string, apiKey: string): void {\n\tvoid fetchGeminiApi(`${getVersionedApiBase()}/${fileName}`, { method: \"DELETE\" }, apiKey).catch((err) => {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tconsole.error(`Failed to delete Gemini file ${fileName}: ${message}`);\n\t});\n}\n\nfunction extractVideoTitle(text: string, filePath: string): string {\n\treturn extractHeadingTitle(text) ?? basename(filePath, extname(filePath));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"video-extract.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/video-extract.ts"],"names":[],"mappings":"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","sourcesContent":["import { execFileSync } from \"node:child_process\";\nimport { existsSync, readFileSync, readdirSync, statSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { resolve, extname, basename, join, dirname } from \"node:path\";\nimport { activityMonitor } from \"./activity.ts\";\nimport { canAttachImages } from \"./feature-config.ts\";\nimport { isGeminiWebAvailable, queryWithCookies } from \"./gemini-web.ts\";\nimport { queryGeminiApiWithVideo, getApiKey, fetchGeminiApi, getVersionedApiBase, getUploadBase, redactGeminiApiResponse } from \"./gemini-api.ts\";\nimport { extractHeadingTitle, type ExtractedContent, type ExtractOptions, type FrameResult } from \"./extract.ts\";\nimport { readExecError, trimErrorText, mapFfmpegError, getWebSearchConfigPath } from \"./utils.ts\";\n\nconst CONFIG_PATH = getWebSearchConfigPath();\n\nconst DEFAULT_VIDEO_PROMPT = `Extract the complete content of this video. Include:\n1. Video title (infer from content if not explicit), duration\n2. A brief summary (2-3 sentences)\n3. Full transcript with timestamps\n4. Descriptions of any code, terminal commands, diagrams, slides, or UI shown on screen\n\nFormat as markdown.`;\n\nconst VIDEO_EXTENSIONS: Record<string, string> = {\n\t\".mp4\": \"video/mp4\",\n\t\".mov\": \"video/quicktime\",\n\t\".webm\": \"video/webm\",\n\t\".avi\": \"video/x-msvideo\",\n\t\".mpeg\": \"video/mpeg\",\n\t\".mpg\": \"video/mpeg\",\n\t\".wmv\": \"video/x-ms-wmv\",\n\t\".flv\": \"video/x-flv\",\n\t\".3gp\": \"video/3gpp\",\n\t\".3gpp\": \"video/3gpp\",\n};\n\nfunction shouldRethrow(err: unknown): boolean {\n\tconst message = err instanceof Error ? err.message : String(err);\n\treturn message.startsWith(\"Failed to parse \");\n}\n\ninterface VideoFileInfo {\n\tabsolutePath: string;\n\tmimeType: string;\n\tsizeBytes: number;\n\tmaxSizeBytes: number;\n\twithinUploadLimit: boolean;\n}\n\ninterface VideoConfig {\n\tenabled: boolean;\n\tpreferredModel: string;\n\tmaxSizeMB: number;\n}\n\nfunction normalizePreferredModel(value: unknown, fallback: string): string {\n\tif (typeof value !== \"string\") return fallback;\n\tconst normalized = value.trim();\n\treturn normalized.length > 0 ? normalized : fallback;\n}\n\nfunction normalizeEnabled(value: unknown, fallback: boolean): boolean {\n\treturn typeof value === \"boolean\" ? value : fallback;\n}\n\nfunction normalizeMaxSizeMB(value: unknown, fallback: number): number {\n\tif (typeof value !== \"number\" || !Number.isFinite(value)) return fallback;\n\treturn value > 0 ? value : fallback;\n}\n\nconst VIDEO_CONFIG_DEFAULTS: VideoConfig = {\n\tenabled: true,\n\tpreferredModel: \"gemini-3.6-flash\",\n\tmaxSizeMB: 50,\n};\n\nlet cachedVideoConfig: VideoConfig | null = null;\n\nfunction loadVideoConfig(): VideoConfig {\n\tif (cachedVideoConfig) return cachedVideoConfig;\n\tif (!existsSync(CONFIG_PATH)) {\n\t\tcachedVideoConfig = { ...VIDEO_CONFIG_DEFAULTS };\n\t\treturn cachedVideoConfig;\n\t}\n\n\tconst rawText = readFileSync(CONFIG_PATH, \"utf-8\");\n\tlet raw: { video?: { enabled?: boolean; preferredModel?: string; maxSizeMB?: number } };\n\ttry {\n\t\traw = JSON.parse(rawText) as { video?: { enabled?: boolean; preferredModel?: string; maxSizeMB?: number } };\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${CONFIG_PATH}: ${message}`);\n\t}\n\n\tconst v = raw.video ?? {};\n\tcachedVideoConfig = {\n\t\tenabled: normalizeEnabled(v.enabled, VIDEO_CONFIG_DEFAULTS.enabled),\n\t\tpreferredModel: normalizePreferredModel(v.preferredModel, VIDEO_CONFIG_DEFAULTS.preferredModel),\n\t\tmaxSizeMB: normalizeMaxSizeMB(v.maxSizeMB, VIDEO_CONFIG_DEFAULTS.maxSizeMB),\n\t};\n\treturn cachedVideoConfig;\n}\n\nexport function isVideoFile(input: string): VideoFileInfo | null {\n\tconst config = loadVideoConfig();\n\tif (!config.enabled) return null;\n\n\tconst isFilePath = input.startsWith(\"/\") || input.startsWith(\"./\") || input.startsWith(\"../\") || input.startsWith(\"file://\");\n\tif (!isFilePath) return null;\n\n\tlet filePath = input;\n\tif (input.startsWith(\"file://\")) {\n\t\ttry {\n\t\t\tfilePath = decodeURIComponent(new URL(input).pathname);\n\t\t} catch {\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tconst ext = extname(filePath).toLowerCase();\n\tconst mimeType = VIDEO_EXTENSIONS[ext];\n\tif (!mimeType) return null;\n\n\tconst absolutePath = resolveFilePath(filePath);\n\tif (!absolutePath) return null;\n\n\tlet stat: ReturnType<typeof statSync>;\n\ttry {\n\t\tstat = statSync(absolutePath);\n\t} catch {\n\t\treturn null;\n\t}\n\tif (!stat.isFile()) return null;\n\n\tconst maxBytes = config.maxSizeMB * 1024 * 1024;\n\treturn {\n\t\tabsolutePath,\n\t\tmimeType,\n\t\tsizeBytes: stat.size,\n\t\tmaxSizeBytes: maxBytes,\n\t\twithinUploadLimit: stat.size <= maxBytes,\n\t};\n}\n\nfunction resolveFilePath(filePath: string): string | null {\n\tconst absolutePath = resolve(filePath);\n\tif (existsSync(absolutePath)) return absolutePath;\n\n\tconst dir = dirname(absolutePath);\n\tconst base = basename(absolutePath);\n\tif (!existsSync(dir)) return null;\n\n\ttry {\n\t\tconst normalizedBase = normalizeSpaces(base);\n\t\tconst match = readdirSync(dir).find(f => normalizeSpaces(f) === normalizedBase);\n\t\treturn match ? join(dir, match) : null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction normalizeSpaces(s: string): string {\n\treturn s.replace(/[\\u00A0\\u2000-\\u200B\\u202F\\u205F\\u3000\\uFEFF]/g, \" \");\n}\n\nexport async function extractVideo(\n\tinfo: VideoFileInfo,\n\tsignal?: AbortSignal,\n\toptions?: ExtractOptions,\n): Promise<ExtractedContent | null> {\n\tconst config = loadVideoConfig();\n\tconst effectivePrompt = options?.prompt ?? DEFAULT_VIDEO_PROMPT;\n\tconst effectiveModel = options?.model ?? config.preferredModel;\n\tconst displayName = basename(info.absolutePath);\n\tif (!info.withinUploadLimit) {\n\t\tconst sizeMB = (info.sizeBytes / 1024 / 1024).toFixed(1);\n\t\tconst maxSizeMB = (info.maxSizeBytes / 1024 / 1024).toFixed(1);\n\t\tconst error = `Local video ${displayName} is ${sizeMB} MiB, above configured video.maxSizeMB (${maxSizeMB} MiB) for Gemini analysis. Use timestamp/frames for ffmpeg frame extraction, increase video.maxSizeMB, or compress the file.`;\n\t\treturn { url: info.absolutePath, title: displayName, content: error, error };\n\t}\n\tconst activityId = activityMonitor.logStart({ type: \"fetch\", url: `video:${displayName}` });\n\n\tconst result = await tryVideoGeminiApi(info, effectivePrompt, effectiveModel, signal)\n\t\t?? await tryVideoGeminiWeb(info, effectivePrompt, effectiveModel, signal);\n\n\tif (result) {\n\t\tif (canAttachImages()) {\n\t\t\tconst thumbnail = await extractVideoFrame(info.absolutePath);\n\t\t\tif (!(\"error\" in thumbnail)) {\n\t\t\t\tresult.thumbnail = thumbnail;\n\t\t\t}\n\t\t}\n\t\tactivityMonitor.logComplete(activityId, 200);\n\t\treturn result;\n\t}\n\n\tif (signal?.aborted) {\n\t\tactivityMonitor.logComplete(activityId, 0);\n\t\treturn null;\n\t}\n\n\tactivityMonitor.logError(activityId, \"all video extraction paths failed\");\n\treturn null;\n}\n\nfunction mapFfprobeError(err: unknown): string {\n\tconst { code, stderr, message } = readExecError(err);\n\tif (code === \"ENOENT\") return \"ffprobe is not installed. Install ffmpeg which includes ffprobe\";\n\tconst snippet = trimErrorText(stderr || message);\n\treturn snippet ? `ffprobe failed: ${snippet}` : \"ffprobe failed\";\n}\n\nexport async function extractVideoFrame(filePath: string, seconds: number = 1): Promise<FrameResult> {\n\ttry {\n\t\tconst buffer = execFileSync(\"ffmpeg\", [\n\t\t\t\"-ss\", String(seconds), \"-i\", filePath,\n\t\t\t\"-frames:v\", \"1\", \"-f\", \"image2pipe\", \"-vcodec\", \"mjpeg\", \"pipe:1\",\n\t\t], { maxBuffer: 5 * 1024 * 1024, timeout: 10000, stdio: [\"pipe\", \"pipe\", \"pipe\"] });\n\t\tif (buffer.length === 0) return { error: \"ffmpeg failed: empty output\" };\n\t\treturn { data: buffer.toString(\"base64\"), mimeType: \"image/jpeg\" };\n\t} catch (err) {\n\t\treturn { error: mapFfmpegError(err) };\n\t}\n}\n\nexport async function getLocalVideoDuration(filePath: string): Promise<number | { error: string }> {\n\ttry {\n\t\tconst output = execFileSync(\"ffprobe\", [\n\t\t\t\"-v\", \"quiet\",\n\t\t\t\"-show_entries\", \"format=duration\",\n\t\t\t\"-of\", \"csv=p=0\",\n\t\t\tfilePath,\n\t\t], { timeout: 10000, encoding: \"utf-8\", stdio: [\"pipe\", \"pipe\", \"pipe\"] }).trim();\n\t\tconst duration = Number.parseFloat(output);\n\t\tif (!Number.isFinite(duration)) return { error: \"ffprobe failed: invalid duration output\" };\n\t\treturn duration;\n\t} catch (err) {\n\t\treturn { error: mapFfprobeError(err) };\n\t}\n}\n\nasync function tryVideoGeminiWeb(\n\tinfo: VideoFileInfo,\n\tprompt: string,\n\tmodel: string,\n\tsignal?: AbortSignal,\n): Promise<ExtractedContent | null> {\n\ttry {\n\t\tconst cookies = await isGeminiWebAvailable();\n\t\tif (!cookies) return null;\n\t\tif (signal?.aborted) return null;\n\n\t\tconst text = await queryWithCookies(prompt, cookies, {\n\t\t\tfiles: [info.absolutePath],\n\t\t\t...(model !== \"gemini-3.6-flash\" ? { model } : {}),\n\t\t\tsignal,\n\t\t\ttimeoutMs: 180000,\n\t\t});\n\n\t\treturn {\n\t\t\turl: info.absolutePath,\n\t\t\ttitle: extractVideoTitle(text, info.absolutePath),\n\t\t\tcontent: text,\n\t\t\terror: null,\n\t\t};\n\t} catch (err) {\n\t\tif (shouldRethrow(err)) throw err;\n\t\treturn null;\n\t}\n}\n\nasync function tryVideoGeminiApi(\n\tinfo: VideoFileInfo,\n\tprompt: string,\n\tmodel: string,\n\tsignal?: AbortSignal,\n): Promise<ExtractedContent | null> {\n\tconst apiKey = await getApiKey(signal);\n\tif (!apiKey) return null;\n\tif (signal?.aborted) return null;\n\n\tlet fileName: string | null = null;\n\ttry {\n\t\tconst uploaded = await uploadToFilesApi(info, apiKey, signal);\n\t\tfileName = uploaded.name;\n\n\t\tawait pollFileState(fileName, apiKey, signal, 120000);\n\n\t\tconst text = await queryGeminiApiWithVideo(prompt, uploaded.uri, {\n\t\t\tapiKey,\n\t\t\tmodel,\n\t\t\tmimeType: info.mimeType,\n\t\t\tsignal,\n\t\t\ttimeoutMs: 120000,\n\t\t});\n\n\t\treturn {\n\t\t\turl: info.absolutePath,\n\t\t\ttitle: extractVideoTitle(text, info.absolutePath),\n\t\t\tcontent: text,\n\t\t\terror: null,\n\t\t};\n\t} catch (err) {\n\t\tif (shouldRethrow(err)) throw err;\n\t\treturn null;\n\t} finally {\n\t\tif (fileName) deleteGeminiFile(fileName, apiKey);\n\t}\n}\n\nasync function uploadToFilesApi(\n\tinfo: VideoFileInfo,\n\tapiKey: string,\n\tsignal?: AbortSignal,\n): Promise<{ name: string; uri: string }> {\n\tconst displayName = basename(info.absolutePath);\n\n\tconst initRes = await fetchGeminiApi(`${getUploadBase()}/files`, {\n\t\tmethod: \"POST\",\n\t\theaders: {\n\t\t\t\"X-Goog-Upload-Protocol\": \"resumable\",\n\t\t\t\"X-Goog-Upload-Command\": \"start\",\n\t\t\t\"X-Goog-Upload-Header-Content-Length\": String(info.sizeBytes),\n\t\t\t\"X-Goog-Upload-Header-Content-Type\": info.mimeType,\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t\tbody: JSON.stringify({ file: { display_name: displayName } }),\n\t\tsignal,\n\t}, apiKey);\n\n\tif (!initRes.ok) {\n\t\tconst text = redactGeminiApiResponse(initRes, await initRes.text(), apiKey);\n\t\tthrow new Error(`File upload init failed: ${initRes.status} (${text.slice(0, 200)})`);\n\t}\n\n\tconst uploadUrl = initRes.headers.get(\"x-goog-upload-url\");\n\tif (!uploadUrl) throw new Error(\"No upload URL in response headers\");\n\n\tconst fileData = await readFile(info.absolutePath);\n\tconst uploadRes = await fetchGeminiApi(uploadUrl, {\n\t\tmethod: \"PUT\",\n\t\theaders: {\n\t\t\t\"Content-Length\": String(info.sizeBytes),\n\t\t\t\"X-Goog-Upload-Offset\": \"0\",\n\t\t\t\"X-Goog-Upload-Command\": \"upload, finalize\",\n\t\t},\n\t\tbody: fileData,\n\t\tsignal,\n\t}, apiKey);\n\n\tif (!uploadRes.ok) {\n\t\tconst text = redactGeminiApiResponse(uploadRes, await uploadRes.text(), apiKey);\n\t\tthrow new Error(`File upload failed: ${uploadRes.status} (${text.slice(0, 200)})`);\n\t}\n\n\tconst result = await uploadRes.json() as { file: { name: string; uri: string } };\n\treturn result.file;\n}\n\nasync function pollFileState(\n\tfileName: string,\n\tapiKey: string,\n\tsignal?: AbortSignal,\n\ttimeoutMs: number = 120000,\n): Promise<void> {\n\tconst deadline = Date.now() + timeoutMs;\n\n\twhile (Date.now() < deadline) {\n\t\tif (signal?.aborted) throw new Error(\"Aborted\");\n\n\t\tconst res = await fetchGeminiApi(`${getVersionedApiBase()}/${fileName}`, { signal }, apiKey);\n\t\tif (!res.ok) throw new Error(`File state check failed: ${res.status}`);\n\n\t\tconst data = await res.json() as { state: string };\n\t\tif (data.state === \"ACTIVE\") return;\n\t\tif (data.state === \"FAILED\") throw new Error(\"File processing failed\");\n\n\t\tawait new Promise(r => setTimeout(r, 5000));\n\t}\n\n\tthrow new Error(\"File processing timed out\");\n}\n\nfunction deleteGeminiFile(fileName: string, apiKey: string): void {\n\tvoid fetchGeminiApi(`${getVersionedApiBase()}/${fileName}`, { method: \"DELETE\" }, apiKey).catch((err) => {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tconsole.error(`Failed to delete Gemini file ${fileName}: ${message}`);\n\t});\n}\n\nfunction extractVideoTitle(text: string, filePath: string): string {\n\treturn extractHeadingTitle(text) ?? basename(filePath, extname(filePath));\n}\n"]}
|