@humain/terminal 0.0.2 → 0.0.3-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +241 -24
- package/README.md +143 -119
- package/dist/cli/args.d.ts +4 -2
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +37 -39
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/auth-check.d.ts +19 -0
- package/dist/cli/auth-check.d.ts.map +1 -0
- package/dist/cli/auth-check.js +50 -0
- package/dist/cli/auth-check.js.map +1 -0
- package/dist/cli/auth-command.d.ts +24 -0
- package/dist/cli/auth-command.d.ts.map +1 -0
- package/dist/cli/auth-command.js +103 -0
- package/dist/cli/auth-command.js.map +1 -0
- package/dist/cli/config-selector.d.ts.map +1 -1
- package/dist/cli/config-selector.js +2 -2
- package/dist/cli/config-selector.js.map +1 -1
- package/dist/cli/credential-print.d.ts +5 -15
- package/dist/cli/credential-print.d.ts.map +1 -1
- package/dist/cli/credential-print.js +42 -83
- package/dist/cli/credential-print.js.map +1 -1
- package/dist/cli/experimental/auth.d.ts +16 -0
- package/dist/cli/experimental/auth.d.ts.map +1 -0
- package/dist/cli/experimental/auth.js +13 -0
- package/dist/cli/experimental/auth.js.map +1 -0
- package/dist/cli/experimental/cli.d.ts +6 -0
- package/dist/cli/experimental/cli.d.ts.map +1 -0
- package/dist/cli/experimental/cli.js +5 -0
- package/dist/cli/experimental/cli.js.map +1 -0
- package/dist/cli/experimental/command-options.d.ts +17 -0
- package/dist/cli/experimental/command-options.d.ts.map +1 -0
- package/dist/cli/experimental/command-options.js +35 -0
- package/dist/cli/experimental/command-options.js.map +1 -0
- package/dist/cli/experimental/command.d.ts +63 -0
- package/dist/cli/experimental/command.d.ts.map +1 -0
- package/dist/cli/experimental/command.js +130 -0
- package/dist/cli/experimental/command.js.map +1 -0
- package/dist/cli/experimental/commands/client.d.ts +13 -0
- package/dist/cli/experimental/commands/client.d.ts.map +1 -0
- package/dist/cli/experimental/commands/client.js +25 -0
- package/dist/cli/experimental/commands/client.js.map +1 -0
- package/dist/cli/experimental/commands/pi.d.ts +15 -0
- package/dist/cli/experimental/commands/pi.d.ts.map +1 -0
- package/dist/cli/experimental/commands/pi.js +28 -0
- package/dist/cli/experimental/commands/pi.js.map +1 -0
- package/dist/cli/experimental/commands/server.d.ts +13 -0
- package/dist/cli/experimental/commands/server.d.ts.map +1 -0
- package/dist/cli/experimental/commands/server.js +25 -0
- package/dist/cli/experimental/commands/server.js.map +1 -0
- package/dist/cli/experimental/transport-address.d.ts +10 -0
- package/dist/cli/experimental/transport-address.d.ts.map +1 -0
- package/dist/cli/experimental/transport-address.js +38 -0
- package/dist/cli/experimental/transport-address.js.map +1 -0
- package/dist/cli/list-models.d.ts +1 -1
- package/dist/cli/list-models.d.ts.map +1 -1
- package/dist/cli/list-models.js +2 -2
- package/dist/cli/list-models.js.map +1 -1
- package/dist/cli/startup-ui.d.ts +1 -1
- package/dist/cli/startup-ui.d.ts.map +1 -1
- package/dist/cli/startup-ui.js +2 -2
- package/dist/cli/startup-ui.js.map +1 -1
- package/dist/client/index.d.ts +3 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +3 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/remote-session.d.ts +53 -0
- package/dist/client/remote-session.d.ts.map +1 -0
- package/dist/client/remote-session.js +340 -0
- package/dist/client/remote-session.js.map +1 -0
- package/dist/client/transcript.d.ts +12 -0
- package/dist/client/transcript.d.ts.map +1 -0
- package/dist/client/transcript.js +98 -0
- package/dist/client/transcript.js.map +1 -0
- package/dist/core/agent-session-services.d.ts +1 -0
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +1 -0
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/agent-session.d.ts +1 -10
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +72 -70
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/auth-storage.d.ts +25 -9
- package/dist/core/auth-storage.d.ts.map +1 -1
- package/dist/core/auth-storage.js +237 -39
- package/dist/core/auth-storage.js.map +1 -1
- package/dist/core/extensions/index.d.ts +1 -1
- package/dist/core/extensions/index.d.ts.map +1 -1
- package/dist/core/extensions/index.js.map +1 -1
- package/dist/core/extensions/loader.d.ts.map +1 -1
- package/dist/core/extensions/loader.js +60 -41
- package/dist/core/extensions/loader.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +2 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +3 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +27 -4
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/http-dispatcher.d.ts.map +1 -1
- package/dist/core/http-dispatcher.js +5 -0
- package/dist/core/http-dispatcher.js.map +1 -1
- package/dist/core/keybindings.d.ts +45 -5
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-config.d.ts +29 -5
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +4 -0
- package/dist/core/model-config.js.map +1 -1
- package/dist/core/model-registry.d.ts +5 -3
- package/dist/core/model-registry.d.ts.map +1 -1
- package/dist/core/model-registry.js +13 -10
- package/dist/core/model-registry.js.map +1 -1
- package/dist/core/model-resolver.d.ts +4 -3
- package/dist/core/model-resolver.d.ts.map +1 -1
- package/dist/core/model-resolver.js +42 -10
- package/dist/core/model-resolver.js.map +1 -1
- package/dist/core/model-runtime.d.ts +30 -13
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +233 -73
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/models-store.d.ts +12 -7
- package/dist/core/models-store.d.ts.map +1 -1
- package/dist/core/models-store.js +83 -14
- package/dist/core/models-store.js.map +1 -1
- package/dist/core/package-manager.d.ts +6 -3
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +80 -61
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/pi-manifest.d.ts +8 -0
- package/dist/core/pi-manifest.d.ts.map +1 -0
- package/dist/core/pi-manifest.js +28 -0
- package/dist/core/pi-manifest.js.map +1 -0
- package/dist/core/provider-composer.d.ts +4 -1
- package/dist/core/provider-composer.d.ts.map +1 -1
- package/dist/core/provider-composer.js +36 -15
- package/dist/core/provider-composer.js.map +1 -1
- package/dist/core/remote-catalog-provider.d.ts.map +1 -1
- package/dist/core/remote-catalog-provider.js +73 -67
- package/dist/core/remote-catalog-provider.js.map +1 -1
- package/dist/core/resource-loader.d.ts.map +1 -1
- package/dist/core/resource-loader.js +2 -2
- package/dist/core/resource-loader.js.map +1 -1
- package/dist/core/runtime-credentials.d.ts +5 -5
- package/dist/core/runtime-credentials.d.ts.map +1 -1
- package/dist/core/runtime-credentials.js +11 -8
- package/dist/core/runtime-credentials.js.map +1 -1
- package/dist/core/sdk.d.ts +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +2 -2
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +3 -1
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +12 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +40 -16
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +8 -0
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/tools/bash.d.ts +5 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +16 -15
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts +4 -0
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +11 -7
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.d.ts +7 -0
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +16 -19
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts +4 -0
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +5 -1
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/ls.d.ts +4 -0
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +5 -1
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/read.d.ts +4 -0
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +7 -3
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/write.d.ts +4 -0
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +6 -2
- package/dist/core/tools/write.js.map +1 -1
- package/dist/extensions/llama/index.d.ts.map +1 -1
- package/dist/extensions/llama/index.js +11 -2
- 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 +21 -7
- package/dist/extensions/llama/provider.js.map +1 -1
- package/dist/humain/agent-execution-protocol.d.ts +218 -0
- package/dist/humain/agent-execution-protocol.d.ts.map +1 -0
- package/dist/humain/agent-execution-protocol.js +204 -0
- package/dist/humain/agent-execution-protocol.js.map +1 -0
- package/dist/humain/agent-execution-runtime.d.ts +35 -0
- package/dist/humain/agent-execution-runtime.d.ts.map +1 -0
- package/dist/humain/agent-execution-runtime.js +170 -0
- package/dist/humain/agent-execution-runtime.js.map +1 -0
- package/dist/humain/index.d.ts.map +1 -1
- package/dist/humain/index.js +8 -7
- package/dist/humain/index.js.map +1 -1
- package/dist/humain/mcp-adapter/vendor/CHANGELOG.md +660 -0
- package/dist/humain/mcp-adapter/vendor/LICENSE +21 -0
- package/dist/humain/mcp-adapter/vendor/README.md +733 -0
- package/dist/humain/mcp-adapter/vendor/abort.ts +34 -0
- package/dist/humain/mcp-adapter/vendor/agent-dir.ts +60 -0
- package/dist/humain/mcp-adapter/vendor/agent-plugin-loader.ts +377 -0
- package/dist/humain/mcp-adapter/vendor/app-bridge.bundle.js +67 -0
- package/dist/humain/mcp-adapter/vendor/banner.png +0 -0
- package/dist/humain/mcp-adapter/vendor/cli.js +209 -0
- package/dist/humain/mcp-adapter/vendor/commands.ts +627 -0
- package/dist/humain/mcp-adapter/vendor/config.ts +1226 -0
- package/dist/humain/mcp-adapter/vendor/consent-manager.ts +64 -0
- package/dist/humain/mcp-adapter/vendor/direct-tools.ts +604 -0
- package/dist/humain/mcp-adapter/vendor/elicitation-handler.ts +348 -0
- package/dist/humain/mcp-adapter/vendor/error-signal.ts +21 -0
- package/dist/humain/mcp-adapter/vendor/errors.ts +223 -0
- package/dist/humain/mcp-adapter/vendor/glimpse-ui.ts +80 -0
- package/dist/humain/mcp-adapter/vendor/host-html-template.ts +461 -0
- package/dist/humain/mcp-adapter/vendor/index.bundle.d.mts +4 -0
- package/dist/humain/mcp-adapter/vendor/index.bundle.mjs +15923 -0
- package/dist/humain/mcp-adapter/vendor/index.ts +898 -0
- package/dist/humain/mcp-adapter/vendor/init.ts +649 -0
- package/dist/humain/mcp-adapter/vendor/json-schema-validator.ts +69 -0
- package/dist/humain/mcp-adapter/vendor/lifecycle.ts +147 -0
- package/dist/humain/mcp-adapter/vendor/logger.ts +169 -0
- package/dist/humain/mcp-adapter/vendor/mcp-auth-flow.ts +993 -0
- package/dist/humain/mcp-adapter/vendor/mcp-auth.ts +1000 -0
- package/dist/humain/mcp-adapter/vendor/mcp-callback-server.ts +510 -0
- package/dist/humain/mcp-adapter/vendor/mcp-code.ts +354 -0
- package/dist/humain/mcp-adapter/vendor/mcp-keyring-helper.cjs +89 -0
- package/dist/humain/mcp-adapter/vendor/mcp-oauth-provider.ts +616 -0
- package/dist/humain/mcp-adapter/vendor/mcp-output-guard.ts +408 -0
- package/dist/humain/mcp-adapter/vendor/mcp-panel.ts +1015 -0
- package/dist/humain/mcp-adapter/vendor/mcp-probe.ts +187 -0
- package/dist/humain/mcp-adapter/vendor/mcp-script-worker.mjs +130 -0
- package/dist/humain/mcp-adapter/vendor/mcp-setup-panel.ts +666 -0
- package/dist/humain/mcp-adapter/vendor/mcp-status.ts +109 -0
- package/dist/humain/mcp-adapter/vendor/mcp-trace.ts +306 -0
- package/dist/humain/mcp-adapter/vendor/metadata-cache.ts +353 -0
- package/dist/humain/mcp-adapter/vendor/npx-resolver.ts +543 -0
- package/dist/humain/mcp-adapter/vendor/oauth-handler.ts +30 -0
- package/dist/humain/mcp-adapter/vendor/oauth.ts +48 -0
- package/dist/humain/mcp-adapter/vendor/onboarding-state.ts +76 -0
- package/dist/humain/mcp-adapter/vendor/package.json +178 -0
- package/dist/humain/mcp-adapter/vendor/panel-keys.ts +53 -0
- package/dist/humain/mcp-adapter/vendor/prompts.ts +353 -0
- package/dist/humain/mcp-adapter/vendor/proxy-modes.ts +1331 -0
- package/dist/humain/mcp-adapter/vendor/resource-tools.ts +17 -0
- package/dist/humain/mcp-adapter/vendor/runtime-owner.ts +91 -0
- package/dist/humain/mcp-adapter/vendor/sampling-handler.ts +284 -0
- package/dist/humain/mcp-adapter/vendor/search-ranking.ts +206 -0
- package/dist/humain/mcp-adapter/vendor/server-manager.ts +1124 -0
- package/dist/humain/mcp-adapter/vendor/session-recovery.ts +151 -0
- package/dist/humain/mcp-adapter/vendor/skills/mcp-scripting/SKILL.md +38 -0
- package/dist/humain/mcp-adapter/vendor/state.ts +62 -0
- package/dist/humain/mcp-adapter/vendor/tool-approval.ts +182 -0
- package/dist/humain/mcp-adapter/vendor/tool-metadata.ts +276 -0
- package/dist/humain/mcp-adapter/vendor/tool-registrar.ts +253 -0
- package/dist/humain/mcp-adapter/vendor/tool-result-renderer.ts +423 -0
- package/dist/humain/mcp-adapter/vendor/ts-shape.ts +149 -0
- package/dist/humain/mcp-adapter/vendor/types.ts +859 -0
- package/dist/humain/mcp-adapter/vendor/ui-app-bridge-helpers.ts +40 -0
- package/dist/humain/mcp-adapter/vendor/ui-resource-handler.ts +250 -0
- package/dist/humain/mcp-adapter/vendor/ui-server.ts +866 -0
- package/dist/humain/mcp-adapter/vendor/ui-session.ts +570 -0
- package/dist/humain/mcp-adapter/vendor/ui-stream-types.ts +89 -0
- package/dist/humain/mcp-adapter/vendor/ui-tool-visibility.ts +25 -0
- package/dist/humain/mcp-adapter/vendor/unix-socket-transport.ts +85 -0
- package/dist/humain/mcp-adapter/vendor/utils.ts +310 -0
- package/dist/humain/mcp-adapter.d.ts +3 -0
- package/dist/humain/mcp-adapter.d.ts.map +1 -0
- package/dist/humain/mcp-adapter.js +5 -0
- package/dist/humain/mcp-adapter.js.map +1 -0
- package/dist/humain/pi-agent-execution-host.d.ts +34 -0
- package/dist/humain/pi-agent-execution-host.d.ts.map +1 -0
- package/dist/humain/pi-agent-execution-host.js +77 -0
- package/dist/humain/pi-agent-execution-host.js.map +1 -0
- package/dist/humain/web-access/host.d.ts +4 -0
- package/dist/humain/web-access/host.d.ts.map +1 -0
- package/dist/humain/web-access/host.js +3 -0
- package/dist/humain/web-access/host.js.map +1 -0
- package/dist/humain/web-access/index.d.ts +3 -0
- package/dist/humain/web-access/index.d.ts.map +1 -0
- package/dist/humain/web-access/index.js +5 -0
- package/dist/humain/web-access/index.js.map +1 -0
- package/dist/humain/web-access/vendor/activity.d.ts +34 -0
- package/dist/humain/web-access/vendor/activity.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/activity.js +68 -0
- package/dist/humain/web-access/vendor/activity.js.map +1 -0
- package/dist/humain/web-access/vendor/anysearch.d.ts +8 -0
- package/dist/humain/web-access/vendor/anysearch.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/anysearch.js +167 -0
- package/dist/humain/web-access/vendor/anysearch.js.map +1 -0
- package/dist/humain/web-access/vendor/bocha.d.ts +4 -0
- package/dist/humain/web-access/vendor/bocha.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/bocha.js +219 -0
- package/dist/humain/web-access/vendor/bocha.js.map +1 -0
- package/dist/humain/web-access/vendor/brave.d.ts +4 -0
- package/dist/humain/web-access/vendor/brave.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/brave.js +194 -0
- package/dist/humain/web-access/vendor/brave.js.map +1 -0
- package/dist/humain/web-access/vendor/brightdata-unlocker.d.ts +12 -0
- package/dist/humain/web-access/vendor/brightdata-unlocker.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/brightdata-unlocker.js +230 -0
- package/dist/humain/web-access/vendor/brightdata-unlocker.js.map +1 -0
- package/dist/humain/web-access/vendor/brightdata.d.ts +8 -0
- package/dist/humain/web-access/vendor/brightdata.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/brightdata.js +519 -0
- package/dist/humain/web-access/vendor/brightdata.js.map +1 -0
- package/dist/humain/web-access/vendor/chrome-cookies.d.ts +10 -0
- package/dist/humain/web-access/vendor/chrome-cookies.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/chrome-cookies.js +438 -0
- package/dist/humain/web-access/vendor/chrome-cookies.js.map +1 -0
- package/dist/humain/web-access/vendor/content-find.d.ts +11 -0
- package/dist/humain/web-access/vendor/content-find.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/content-find.js +117 -0
- package/dist/humain/web-access/vendor/content-find.js.map +1 -0
- package/dist/humain/web-access/vendor/credential-source.d.ts +28 -0
- package/dist/humain/web-access/vendor/credential-source.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/credential-source.js +151 -0
- package/dist/humain/web-access/vendor/credential-source.js.map +1 -0
- package/dist/humain/web-access/vendor/curator-page.d.ts +29 -0
- package/dist/humain/web-access/vendor/curator-page.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/curator-page.js +3554 -0
- package/dist/humain/web-access/vendor/curator-page.js.map +1 -0
- package/dist/humain/web-access/vendor/curator-server.d.ts +93 -0
- package/dist/humain/web-access/vendor/curator-server.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/curator-server.js +688 -0
- package/dist/humain/web-access/vendor/curator-server.js.map +1 -0
- package/dist/humain/web-access/vendor/datalab-pdf-extract.d.ts +60 -0
- package/dist/humain/web-access/vendor/datalab-pdf-extract.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/datalab-pdf-extract.js +416 -0
- package/dist/humain/web-access/vendor/datalab-pdf-extract.js.map +1 -0
- package/dist/humain/web-access/vendor/declared-web-links.d.ts +16 -0
- package/dist/humain/web-access/vendor/declared-web-links.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/declared-web-links.js +168 -0
- package/dist/humain/web-access/vendor/declared-web-links.js.map +1 -0
- package/dist/humain/web-access/vendor/duckduckgo.d.ts +4 -0
- package/dist/humain/web-access/vendor/duckduckgo.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/duckduckgo.js +123 -0
- package/dist/humain/web-access/vendor/duckduckgo.js.map +1 -0
- package/dist/humain/web-access/vendor/exa.d.ts +10 -0
- package/dist/humain/web-access/vendor/exa.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/exa.js +426 -0
- package/dist/humain/web-access/vendor/exa.js.map +1 -0
- package/dist/humain/web-access/vendor/extract.d.ts +46 -0
- package/dist/humain/web-access/vendor/extract.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/extract.js +1064 -0
- package/dist/humain/web-access/vendor/extract.js.map +1 -0
- package/dist/humain/web-access/vendor/feature-config.d.ts +3 -0
- package/dist/humain/web-access/vendor/feature-config.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/feature-config.js +27 -0
- package/dist/humain/web-access/vendor/feature-config.js.map +1 -0
- package/dist/humain/web-access/vendor/fetch-params.d.ts +25 -0
- package/dist/humain/web-access/vendor/fetch-params.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/fetch-params.js +57 -0
- package/dist/humain/web-access/vendor/fetch-params.js.map +1 -0
- package/dist/humain/web-access/vendor/firecrawl.d.ts +12 -0
- package/dist/humain/web-access/vendor/firecrawl.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/firecrawl.js +239 -0
- package/dist/humain/web-access/vendor/firecrawl.js.map +1 -0
- package/dist/humain/web-access/vendor/gemini-api.d.ts +27 -0
- package/dist/humain/web-access/vendor/gemini-api.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/gemini-api.js +230 -0
- package/dist/humain/web-access/vendor/gemini-api.js.map +1 -0
- package/dist/humain/web-access/vendor/gemini-pdf-extract.d.ts +9 -0
- package/dist/humain/web-access/vendor/gemini-pdf-extract.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/gemini-pdf-extract.js +85 -0
- package/dist/humain/web-access/vendor/gemini-pdf-extract.js.map +1 -0
- package/dist/humain/web-access/vendor/gemini-search.d.ts +40 -0
- package/dist/humain/web-access/vendor/gemini-search.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/gemini-search.js +814 -0
- package/dist/humain/web-access/vendor/gemini-search.js.map +1 -0
- package/dist/humain/web-access/vendor/gemini-url-context.d.ts +4 -0
- package/dist/humain/web-access/vendor/gemini-url-context.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/gemini-url-context.js +101 -0
- package/dist/humain/web-access/vendor/gemini-url-context.js.map +1 -0
- package/dist/humain/web-access/vendor/gemini-web-config.d.ts +4 -0
- package/dist/humain/web-access/vendor/gemini-web-config.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/gemini-web-config.js +42 -0
- package/dist/humain/web-access/vendor/gemini-web-config.js.map +1 -0
- package/dist/humain/web-access/vendor/gemini-web.d.ts +18 -0
- package/dist/humain/web-access/vendor/gemini-web.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/gemini-web.js +385 -0
- package/dist/humain/web-access/vendor/gemini-web.js.map +1 -0
- package/dist/humain/web-access/vendor/github-api.d.ts +7 -0
- package/dist/humain/web-access/vendor/github-api.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/github-api.js +160 -0
- package/dist/humain/web-access/vendor/github-api.js.map +1 -0
- package/dist/humain/web-access/vendor/github-extract.d.ts +13 -0
- package/dist/humain/web-access/vendor/github-extract.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/github-extract.js +635 -0
- package/dist/humain/web-access/vendor/github-extract.js.map +1 -0
- package/dist/humain/web-access/vendor/index.d.ts +4 -0
- package/dist/humain/web-access/vendor/index.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/index.js +3002 -0
- package/dist/humain/web-access/vendor/index.js.map +1 -0
- package/dist/humain/web-access/vendor/jina-search.d.ts +8 -0
- package/dist/humain/web-access/vendor/jina-search.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/jina-search.js +255 -0
- package/dist/humain/web-access/vendor/jina-search.js.map +1 -0
- package/dist/humain/web-access/vendor/kagi.d.ts +15 -0
- package/dist/humain/web-access/vendor/kagi.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/kagi.js +262 -0
- package/dist/humain/web-access/vendor/kagi.js.map +1 -0
- package/dist/humain/web-access/vendor/ollama.d.ts +15 -0
- package/dist/humain/web-access/vendor/ollama.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/ollama.js +216 -0
- package/dist/humain/web-access/vendor/ollama.js.map +1 -0
- package/dist/humain/web-access/vendor/openai-search.d.ts +15 -0
- package/dist/humain/web-access/vendor/openai-search.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/openai-search.js +459 -0
- package/dist/humain/web-access/vendor/openai-search.js.map +1 -0
- package/dist/humain/web-access/vendor/page-query.d.ts +16 -0
- package/dist/humain/web-access/vendor/page-query.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/page-query.js +79 -0
- package/dist/humain/web-access/vendor/page-query.js.map +1 -0
- package/dist/humain/web-access/vendor/parallel.d.ts +12 -0
- package/dist/humain/web-access/vendor/parallel.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/parallel.js +343 -0
- package/dist/humain/web-access/vendor/parallel.js.map +1 -0
- package/dist/humain/web-access/vendor/pdf-extract.d.ts +44 -0
- package/dist/humain/web-access/vendor/pdf-extract.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/pdf-extract.js +298 -0
- package/dist/humain/web-access/vendor/pdf-extract.js.map +1 -0
- package/dist/humain/web-access/vendor/perplexity.d.ts +20 -0
- package/dist/humain/web-access/vendor/perplexity.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/perplexity.js +159 -0
- package/dist/humain/web-access/vendor/perplexity.js.map +1 -0
- package/dist/humain/web-access/vendor/querit.d.ts +10 -0
- package/dist/humain/web-access/vendor/querit.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/querit.js +335 -0
- package/dist/humain/web-access/vendor/querit.js.map +1 -0
- package/dist/humain/web-access/vendor/render-search-error.d.ts +57 -0
- package/dist/humain/web-access/vendor/render-search-error.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/render-search-error.js +130 -0
- package/dist/humain/web-access/vendor/render-search-error.js.map +1 -0
- package/dist/humain/web-access/vendor/rsc-extract.d.ts +12 -0
- package/dist/humain/web-access/vendor/rsc-extract.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/rsc-extract.js +329 -0
- package/dist/humain/web-access/vendor/rsc-extract.js.map +1 -0
- package/dist/humain/web-access/vendor/search1api.d.ts +10 -0
- package/dist/humain/web-access/vendor/search1api.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/search1api.js +251 -0
- package/dist/humain/web-access/vendor/search1api.js.map +1 -0
- package/dist/humain/web-access/vendor/searchinfinity.d.ts +8 -0
- package/dist/humain/web-access/vendor/searchinfinity.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/searchinfinity.js +229 -0
- package/dist/humain/web-access/vendor/searchinfinity.js.map +1 -0
- package/dist/humain/web-access/vendor/searxng.d.ts +4 -0
- package/dist/humain/web-access/vendor/searxng.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/searxng.js +238 -0
- package/dist/humain/web-access/vendor/searxng.js.map +1 -0
- package/dist/humain/web-access/vendor/serpbase.d.ts +4 -0
- package/dist/humain/web-access/vendor/serpbase.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/serpbase.js +211 -0
- package/dist/humain/web-access/vendor/serpbase.js.map +1 -0
- package/dist/humain/web-access/vendor/serpdive.d.ts +8 -0
- package/dist/humain/web-access/vendor/serpdive.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/serpdive.js +267 -0
- package/dist/humain/web-access/vendor/serpdive.js.map +1 -0
- package/dist/humain/web-access/vendor/source-check.d.ts +99 -0
- package/dist/humain/web-access/vendor/source-check.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/source-check.js +205 -0
- package/dist/humain/web-access/vendor/source-check.js.map +1 -0
- package/dist/humain/web-access/vendor/ssrf-protection.d.ts +50 -0
- package/dist/humain/web-access/vendor/ssrf-protection.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/ssrf-protection.js +466 -0
- package/dist/humain/web-access/vendor/ssrf-protection.js.map +1 -0
- package/dist/humain/web-access/vendor/storage.d.ts +55 -0
- package/dist/humain/web-access/vendor/storage.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/storage.js +485 -0
- package/dist/humain/web-access/vendor/storage.js.map +1 -0
- package/dist/humain/web-access/vendor/summary-model-scope.d.ts +25 -0
- package/dist/humain/web-access/vendor/summary-model-scope.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/summary-model-scope.js +98 -0
- package/dist/humain/web-access/vendor/summary-model-scope.js.map +1 -0
- package/dist/humain/web-access/vendor/summary-review.d.ts +24 -0
- package/dist/humain/web-access/vendor/summary-review.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/summary-review.js +341 -0
- package/dist/humain/web-access/vendor/summary-review.js.map +1 -0
- package/dist/humain/web-access/vendor/tavily.d.ts +8 -0
- package/dist/humain/web-access/vendor/tavily.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/tavily.js +194 -0
- package/dist/humain/web-access/vendor/tavily.js.map +1 -0
- package/dist/humain/web-access/vendor/tinyfish.d.ts +11 -0
- package/dist/humain/web-access/vendor/tinyfish.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/tinyfish.js +331 -0
- package/dist/humain/web-access/vendor/tinyfish.js.map +1 -0
- package/dist/humain/web-access/vendor/utils.d.ts +20 -0
- package/dist/humain/web-access/vendor/utils.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/utils.js +91 -0
- package/dist/humain/web-access/vendor/utils.js.map +1 -0
- package/dist/humain/web-access/vendor/video-extract.d.ts +16 -0
- package/dist/humain/web-access/vendor/video-extract.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/video-extract.js +335 -0
- package/dist/humain/web-access/vendor/video-extract.js.map +1 -0
- package/dist/humain/web-access/vendor/xai-search.d.ts +13 -0
- package/dist/humain/web-access/vendor/xai-search.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/xai-search.js +331 -0
- package/dist/humain/web-access/vendor/xai-search.js.map +1 -0
- package/dist/humain/web-access/vendor/youtube-extract.d.ts +27 -0
- package/dist/humain/web-access/vendor/youtube-extract.d.ts.map +1 -0
- package/dist/humain/web-access/vendor/youtube-extract.js +282 -0
- package/dist/humain/web-access/vendor/youtube-extract.js.map +1 -0
- package/dist/index.d.ts +7 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts +2 -2
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +169 -102
- package/dist/main.js.map +1 -1
- package/dist/modes/agent-exec-mode.d.ts +14 -0
- package/dist/modes/agent-exec-mode.d.ts.map +1 -0
- package/dist/modes/agent-exec-mode.js +92 -0
- package/dist/modes/agent-exec-mode.js.map +1 -0
- package/dist/modes/index.d.ts +4 -2
- package/dist/modes/index.d.ts.map +1 -1
- package/dist/modes/index.js +2 -1
- package/dist/modes/index.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +5 -2
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +13 -4
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-editor.js +7 -0
- package/dist/modes/interactive/components/custom-editor.js.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
- package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -0
- package/dist/modes/interactive/components/earendil-announcement.js +40 -0
- package/dist/modes/interactive/components/earendil-announcement.js.map +1 -0
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +1 -1
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/markdown-transform.d.ts +3 -0
- package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -0
- package/dist/modes/interactive/components/markdown-transform.js +19 -0
- package/dist/modes/interactive/components/markdown-transform.js.map +1 -0
- package/dist/modes/interactive/components/mermaid.d.ts +11 -0
- package/dist/modes/interactive/components/mermaid.d.ts.map +1 -0
- package/dist/modes/interactive/components/mermaid.js +75 -0
- package/dist/modes/interactive/components/mermaid.js.map +1 -0
- package/dist/modes/interactive/components/model-selector.d.ts +1 -1
- package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/model-selector.js +16 -4
- package/dist/modes/interactive/components/model-selector.js.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +4 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/scoped-models-selector.js +26 -0
- package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +8 -2
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +30 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/user-message.d.ts +3 -1
- package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/user-message.js +9 -2
- package/dist/modes/interactive/components/user-message.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +45 -9
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +581 -211
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/dark.json +1 -0
- package/dist/modes/interactive/theme/light.json +1 -0
- package/dist/modes/interactive/theme/theme-controller.d.ts +3 -0
- package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme-controller.js +10 -1
- package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
- package/dist/modes/interactive/theme/theme-schema.json +5 -1
- package/dist/modes/interactive/theme/theme.d.ts +2 -2
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +24 -6
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/modes/json-event.d.ts +28 -0
- package/dist/modes/json-event.d.ts.map +1 -0
- package/dist/modes/json-event.js +12 -0
- package/dist/modes/json-event.js.map +1 -0
- package/dist/modes/print-mode.d.ts.map +1 -1
- package/dist/modes/print-mode.js +12 -2
- package/dist/modes/print-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-client.d.ts +12 -5
- package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-client.js +55 -1
- package/dist/modes/rpc/rpc-client.js.map +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts +1 -1
- package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-mode.js +13 -3
- package/dist/modes/rpc/rpc-mode.js.map +1 -1
- package/dist/modes/rpc/rpc-types.d.ts +15 -0
- package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
- package/dist/modes/rpc/rpc-types.js.map +1 -1
- package/dist/package-manager-cli.d.ts.map +1 -1
- package/dist/package-manager-cli.js +11 -9
- package/dist/package-manager-cli.js.map +1 -1
- package/dist/rpc-entry.d.ts.map +1 -1
- package/dist/rpc-entry.js +3 -2
- package/dist/rpc-entry.js.map +1 -1
- package/dist/server/create-harness.d.ts +26 -0
- package/dist/server/create-harness.d.ts.map +1 -0
- package/dist/server/create-harness.js +104 -0
- package/dist/server/create-harness.js.map +1 -0
- package/dist/utils/abort.d.ts +5 -0
- package/dist/utils/abort.d.ts.map +1 -0
- package/dist/utils/abort.js +48 -0
- package/dist/utils/abort.js.map +1 -0
- package/dist/utils/clipboard.d.ts +1 -1
- package/dist/utils/clipboard.d.ts.map +1 -1
- package/dist/utils/clipboard.js +22 -2
- package/dist/utils/clipboard.js.map +1 -1
- package/dist/utils/management-http.d.ts +23 -0
- package/dist/utils/management-http.d.ts.map +1 -0
- package/dist/utils/management-http.js +50 -0
- package/dist/utils/management-http.js.map +1 -0
- package/dist/utils/paths.d.ts +3 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +23 -1
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/tool-result-images.d.ts +19 -0
- package/dist/utils/tool-result-images.d.ts.map +1 -0
- package/dist/utils/tool-result-images.js +45 -0
- package/dist/utils/tool-result-images.js.map +1 -0
- package/dist/utils/tools-manager.d.ts.map +1 -1
- package/dist/utils/tools-manager.js +13 -25
- package/dist/utils/tools-manager.js.map +1 -1
- package/dist/utils/version-check.d.ts +4 -0
- package/dist/utils/version-check.d.ts.map +1 -1
- package/dist/utils/version-check.js +23 -5
- package/dist/utils/version-check.js.map +1 -1
- package/docs/compaction.md +2 -2
- package/docs/custom-provider.md +7 -5
- package/docs/extensions.md +30 -5
- package/docs/humain-terminal.md +21 -1
- package/docs/json.md +24 -19
- package/docs/keybindings.md +46 -14
- package/docs/models.md +32 -11
- package/docs/providers.md +9 -1
- package/docs/quickstart.md +39 -37
- package/docs/rpc.md +31 -11
- package/docs/sdk.md +21 -2
- package/docs/security.md +21 -21
- package/docs/session-format.md +14 -14
- package/docs/settings.md +4 -1
- package/docs/themes.md +5 -3
- package/docs/usage.md +7 -0
- package/examples/extensions/custom-compaction.ts +3 -18
- package/examples/extensions/custom-provider-anthropic/index.ts +5 -1
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/index.ts +5 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/doom-overlay/wad-finder.ts +7 -3
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/handoff.ts +4 -13
- package/examples/extensions/qna.ts +5 -9
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/summarize.ts +9 -20
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/rpc-extension-ui.ts +11 -2
- package/examples/sdk/02-custom-model.ts +2 -3
- package/examples/sdk/09-api-keys-and-oauth.ts +1 -1
- package/examples/sdk/12-full-control.ts +1 -1
- package/examples/sdk/README.md +1 -1
- package/npm-shrinkwrap.json +2771 -535
- package/package.json +40 -11
- package/src/humain/mcp-adapter/UPSTREAM.md +15 -0
- package/src/humain/mcp-adapter/upstream.json +7 -0
- package/src/humain/mcp-adapter/vendor/CHANGELOG.md +660 -0
- package/src/humain/mcp-adapter/vendor/LICENSE +21 -0
- package/src/humain/web-access/UPSTREAM.md +17 -0
- package/src/humain/web-access/upstream.json +23 -0
- package/src/humain/web-access/vendor/LICENSE +21 -0
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
import { closeSync, constants, fchmodSync, fstatSync, fsyncSync, lstatSync, mkdirSync, openSync, readFileSync, readdirSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { randomBytes } from "node:crypto";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { getWebSearchConfigDir } from "./utils.js";
|
|
5
|
+
const CACHE_TTL_MS = 60 * 60 * 1000;
|
|
6
|
+
const FETCH_CACHE_DIR = "web-search-cache";
|
|
7
|
+
const FETCH_CACHE_VERSION = 1;
|
|
8
|
+
const CACHE_KEY_PATTERN = /^[A-Za-z0-9_-]+\.json$/;
|
|
9
|
+
const CACHE_TMP_PATTERN = /^[A-Za-z0-9_-]+\.json\.\d+\.\d+(?:\.[a-f0-9]{32})?\.tmp$/;
|
|
10
|
+
const CACHE_ID_PATTERN = /^[A-Za-z0-9_-]+$/;
|
|
11
|
+
const MAX_METADATA_TEXT = 8192;
|
|
12
|
+
const DEFAULT_CACHE_LIMITS = { maxEntries: 128, maxBytes: 128 * 1024 * 1024 };
|
|
13
|
+
const O_DIRECTORY = process.platform === "win32" ? 0 : (constants.O_DIRECTORY ?? 0);
|
|
14
|
+
const O_NOFOLLOW = process.platform === "win32" ? 0 : (constants.O_NOFOLLOW ?? 0);
|
|
15
|
+
const storedResults = new Map();
|
|
16
|
+
export function generateId() {
|
|
17
|
+
return Date.now().toString(36) + Math.random().toString(36).slice(2, 8);
|
|
18
|
+
}
|
|
19
|
+
export function getFetchCacheDir() {
|
|
20
|
+
return join(getWebSearchConfigDir(), FETCH_CACHE_DIR);
|
|
21
|
+
}
|
|
22
|
+
function fetchCachePath(key) {
|
|
23
|
+
if (!CACHE_KEY_PATTERN.test(key))
|
|
24
|
+
return null;
|
|
25
|
+
return join(getFetchCacheDir(), key);
|
|
26
|
+
}
|
|
27
|
+
function cacheKeyForId(id) {
|
|
28
|
+
if (!CACHE_ID_PATTERN.test(id)) {
|
|
29
|
+
throw new Error(`Invalid fetched content cache id: ${id}`);
|
|
30
|
+
}
|
|
31
|
+
return `${id}.json`;
|
|
32
|
+
}
|
|
33
|
+
function truncateMetadataText(value) {
|
|
34
|
+
if (!value)
|
|
35
|
+
return "";
|
|
36
|
+
return value.length > MAX_METADATA_TEXT ? `${value.slice(0, MAX_METADATA_TEXT)}...` : value;
|
|
37
|
+
}
|
|
38
|
+
function metadataForUrls(urls) {
|
|
39
|
+
return urls.map((url) => ({
|
|
40
|
+
url: truncateMetadataText(url.url),
|
|
41
|
+
title: truncateMetadataText(url.title),
|
|
42
|
+
error: url.error ? truncateMetadataText(url.error) : null,
|
|
43
|
+
contentLength: url.content.length,
|
|
44
|
+
...(url.mimeType ? { mimeType: truncateMetadataText(url.mimeType) } : {}),
|
|
45
|
+
...(typeof url.status === "number" ? { status: url.status } : {}),
|
|
46
|
+
...(typeof url.duration === "number" ? { duration: url.duration } : {}),
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
49
|
+
function isFetchCacheRef(value) {
|
|
50
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
51
|
+
return false;
|
|
52
|
+
const ref = value;
|
|
53
|
+
return ref.version === FETCH_CACHE_VERSION &&
|
|
54
|
+
typeof ref.key === "string" && CACHE_KEY_PATTERN.test(ref.key) &&
|
|
55
|
+
typeof ref.storedAt === "number" && Number.isFinite(ref.storedAt);
|
|
56
|
+
}
|
|
57
|
+
function isStoredFetchUrlMetadata(value) {
|
|
58
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
59
|
+
return false;
|
|
60
|
+
const meta = value;
|
|
61
|
+
return typeof meta.url === "string" &&
|
|
62
|
+
typeof meta.title === "string" &&
|
|
63
|
+
(meta.error === null || typeof meta.error === "string") &&
|
|
64
|
+
typeof meta.contentLength === "number" && Number.isFinite(meta.contentLength) && meta.contentLength >= 0 &&
|
|
65
|
+
(meta.mimeType === undefined || typeof meta.mimeType === "string") &&
|
|
66
|
+
(meta.status === undefined || typeof meta.status === "number") &&
|
|
67
|
+
(meta.duration === undefined || typeof meta.duration === "number");
|
|
68
|
+
}
|
|
69
|
+
function isInlineFetchedUrl(value) {
|
|
70
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
71
|
+
return false;
|
|
72
|
+
const url = value;
|
|
73
|
+
return typeof url.url === "string" &&
|
|
74
|
+
typeof url.title === "string" &&
|
|
75
|
+
typeof url.content === "string" &&
|
|
76
|
+
(url.error === null || typeof url.error === "string");
|
|
77
|
+
}
|
|
78
|
+
function isInlineFetchData(data) {
|
|
79
|
+
return data.type === "fetch" && Array.isArray(data.urls) && data.urls.every(isInlineFetchedUrl);
|
|
80
|
+
}
|
|
81
|
+
function cacheLimits(limits) {
|
|
82
|
+
const resolved = {
|
|
83
|
+
maxEntries: limits?.maxEntries ?? DEFAULT_CACHE_LIMITS.maxEntries,
|
|
84
|
+
maxBytes: limits?.maxBytes ?? DEFAULT_CACHE_LIMITS.maxBytes,
|
|
85
|
+
};
|
|
86
|
+
if (!Number.isFinite(resolved.maxEntries) || !Number.isInteger(resolved.maxEntries) || resolved.maxEntries <= 0 ||
|
|
87
|
+
!Number.isFinite(resolved.maxBytes) || !Number.isInteger(resolved.maxBytes) || resolved.maxBytes <= 0) {
|
|
88
|
+
throw new Error("Fetched content cache limits must be finite positive integers");
|
|
89
|
+
}
|
|
90
|
+
return resolved;
|
|
91
|
+
}
|
|
92
|
+
function enforceDirectoryMode(fd) {
|
|
93
|
+
try {
|
|
94
|
+
fchmodSync(fd, 0o700);
|
|
95
|
+
}
|
|
96
|
+
catch (err) {
|
|
97
|
+
if (process.platform !== "win32")
|
|
98
|
+
throw err;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function enforceFileMode(fd) {
|
|
102
|
+
try {
|
|
103
|
+
fchmodSync(fd, 0o600);
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
if (process.platform !== "win32")
|
|
107
|
+
throw err;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
function safeFetchCacheDir(create) {
|
|
111
|
+
const dir = getFetchCacheDir();
|
|
112
|
+
if (create)
|
|
113
|
+
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
114
|
+
let before;
|
|
115
|
+
try {
|
|
116
|
+
before = lstatSync(dir);
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
if (!create && err.code === "ENOENT")
|
|
120
|
+
return null;
|
|
121
|
+
throw err;
|
|
122
|
+
}
|
|
123
|
+
if (before.isSymbolicLink() || !before.isDirectory()) {
|
|
124
|
+
throw new Error("Fetched content cache path is not a safe directory");
|
|
125
|
+
}
|
|
126
|
+
if (process.platform === "win32") {
|
|
127
|
+
const after = lstatSync(dir);
|
|
128
|
+
if (after.isSymbolicLink() || !after.isDirectory() || after.dev !== before.dev || after.ino !== before.ino) {
|
|
129
|
+
throw new Error("Fetched content cache directory changed while securing it");
|
|
130
|
+
}
|
|
131
|
+
return dir;
|
|
132
|
+
}
|
|
133
|
+
let fd = null;
|
|
134
|
+
try {
|
|
135
|
+
fd = openSync(dir, constants.O_RDONLY | O_DIRECTORY | O_NOFOLLOW);
|
|
136
|
+
const opened = fstatSync(fd);
|
|
137
|
+
if (!opened.isDirectory() || opened.dev !== before.dev || opened.ino !== before.ino) {
|
|
138
|
+
throw new Error("Fetched content cache directory changed while opening");
|
|
139
|
+
}
|
|
140
|
+
enforceDirectoryMode(fd);
|
|
141
|
+
closeSync(fd);
|
|
142
|
+
fd = null;
|
|
143
|
+
const after = lstatSync(dir);
|
|
144
|
+
if (after.isSymbolicLink() || !after.isDirectory() || after.dev !== before.dev || after.ino !== before.ino) {
|
|
145
|
+
throw new Error("Fetched content cache directory changed while securing it");
|
|
146
|
+
}
|
|
147
|
+
return dir;
|
|
148
|
+
}
|
|
149
|
+
finally {
|
|
150
|
+
if (fd !== null)
|
|
151
|
+
try {
|
|
152
|
+
closeSync(fd);
|
|
153
|
+
}
|
|
154
|
+
catch { }
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
function openRegularFile(path) {
|
|
158
|
+
const before = lstatSync(path);
|
|
159
|
+
if (before.isSymbolicLink() || !before.isFile())
|
|
160
|
+
throw new Error("Fetched content cache entry is not a regular file");
|
|
161
|
+
const fd = openSync(path, constants.O_RDONLY | O_NOFOLLOW);
|
|
162
|
+
try {
|
|
163
|
+
const info = fstatSync(fd);
|
|
164
|
+
if (!info.isFile() || info.dev !== before.dev || info.ino !== before.ino) {
|
|
165
|
+
throw new Error("Fetched content cache entry changed while opening");
|
|
166
|
+
}
|
|
167
|
+
return { fd, info };
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
closeSync(fd);
|
|
171
|
+
throw err;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function unlinkCacheFile(dir, file) {
|
|
175
|
+
try {
|
|
176
|
+
const root = lstatSync(dir);
|
|
177
|
+
if (root.isSymbolicLink() || !root.isDirectory())
|
|
178
|
+
return "changed";
|
|
179
|
+
const path = join(dir, file.name);
|
|
180
|
+
let current;
|
|
181
|
+
try {
|
|
182
|
+
current = lstatSync(path);
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
return err.code === "ENOENT" ? "missing" : "error";
|
|
186
|
+
}
|
|
187
|
+
if (current.isSymbolicLink() || !current.isFile() || current.dev !== file.dev || current.ino !== file.ino)
|
|
188
|
+
return "changed";
|
|
189
|
+
try {
|
|
190
|
+
unlinkSync(path);
|
|
191
|
+
return "removed";
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
return err.code === "ENOENT" ? "missing" : "error";
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
return "error";
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
function pruneFetchCache(now, limits, preferredKey, reservation) {
|
|
202
|
+
let dir;
|
|
203
|
+
try {
|
|
204
|
+
dir = safeFetchCacheDir(false);
|
|
205
|
+
}
|
|
206
|
+
catch {
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
if (!dir)
|
|
210
|
+
return true;
|
|
211
|
+
let entries;
|
|
212
|
+
try {
|
|
213
|
+
entries = readdirSync(dir);
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
const files = [];
|
|
219
|
+
for (const entry of entries) {
|
|
220
|
+
if (!CACHE_KEY_PATTERN.test(entry) && !CACHE_TMP_PATTERN.test(entry))
|
|
221
|
+
continue;
|
|
222
|
+
const path = join(dir, entry);
|
|
223
|
+
let opened;
|
|
224
|
+
try {
|
|
225
|
+
opened = openRegularFile(path);
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
try {
|
|
231
|
+
enforceFileMode(opened.fd);
|
|
232
|
+
}
|
|
233
|
+
catch {
|
|
234
|
+
closeSync(opened.fd);
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
closeSync(opened.fd);
|
|
238
|
+
const file = { name: entry, size: opened.info.size, mtimeMs: opened.info.mtimeMs, dev: opened.info.dev, ino: opened.info.ino };
|
|
239
|
+
if (now - file.mtimeMs >= CACHE_TTL_MS) {
|
|
240
|
+
const removed = unlinkCacheFile(dir, file);
|
|
241
|
+
if (removed !== "removed" && removed !== "missing")
|
|
242
|
+
return false;
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
if (CACHE_KEY_PATTERN.test(entry))
|
|
246
|
+
files.push(file);
|
|
247
|
+
}
|
|
248
|
+
files.sort((a, b) => a.mtimeMs - b.mtimeMs || a.name.localeCompare(b.name));
|
|
249
|
+
const projectedUsage = () => {
|
|
250
|
+
const replaced = reservation ? files.find((file) => file.name === reservation.key) : undefined;
|
|
251
|
+
return {
|
|
252
|
+
entries: files.length + (reservation && !replaced ? 1 : 0),
|
|
253
|
+
bytes: files.reduce((total, file) => total + file.size, 0) + (reservation ? reservation.bytes - (replaced?.size ?? 0) : 0),
|
|
254
|
+
};
|
|
255
|
+
};
|
|
256
|
+
const attempted = new Set();
|
|
257
|
+
let usage = projectedUsage();
|
|
258
|
+
while (usage.entries > limits.maxEntries || usage.bytes > limits.maxBytes) {
|
|
259
|
+
const index = files.findIndex((file) => file.name !== preferredKey && !attempted.has(file.name));
|
|
260
|
+
if (index < 0)
|
|
261
|
+
break;
|
|
262
|
+
const file = files[index];
|
|
263
|
+
attempted.add(file.name);
|
|
264
|
+
const removed = unlinkCacheFile(dir, file);
|
|
265
|
+
if (removed === "removed" || removed === "missing")
|
|
266
|
+
files.splice(index, 1);
|
|
267
|
+
usage = projectedUsage();
|
|
268
|
+
}
|
|
269
|
+
return usage.entries <= limits.maxEntries && usage.bytes <= limits.maxBytes;
|
|
270
|
+
}
|
|
271
|
+
function writeFetchCache(data) {
|
|
272
|
+
const limits = DEFAULT_CACHE_LIMITS;
|
|
273
|
+
const serialized = JSON.stringify(data);
|
|
274
|
+
const size = Buffer.byteLength(serialized);
|
|
275
|
+
if (size > limits.maxBytes)
|
|
276
|
+
throw new Error(`Fetched content cache entry exceeds ${limits.maxBytes} bytes`);
|
|
277
|
+
const dir = safeFetchCacheDir(true);
|
|
278
|
+
const key = cacheKeyForId(data.id);
|
|
279
|
+
if (!pruneFetchCache(Date.now(), limits, key, { key, bytes: size })) {
|
|
280
|
+
throw new Error("Fetched content cache could not reserve space for a new entry");
|
|
281
|
+
}
|
|
282
|
+
const finalPath = join(dir, key);
|
|
283
|
+
const tmpName = `${key}.${process.pid}.${Date.now()}.${randomBytes(16).toString("hex")}.tmp`;
|
|
284
|
+
const tmpPath = join(dir, tmpName);
|
|
285
|
+
let fd = null;
|
|
286
|
+
let tmpFile = null;
|
|
287
|
+
let renamed = false;
|
|
288
|
+
try {
|
|
289
|
+
fd = openSync(tmpPath, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY | O_NOFOLLOW, 0o600);
|
|
290
|
+
const tmpInfo = fstatSync(fd);
|
|
291
|
+
tmpFile = { name: tmpName, size: tmpInfo.size, mtimeMs: tmpInfo.mtimeMs, dev: tmpInfo.dev, ino: tmpInfo.ino };
|
|
292
|
+
enforceFileMode(fd);
|
|
293
|
+
writeFileSync(fd, serialized, "utf8");
|
|
294
|
+
fsyncSync(fd);
|
|
295
|
+
closeSync(fd);
|
|
296
|
+
fd = null;
|
|
297
|
+
safeFetchCacheDir(false);
|
|
298
|
+
renameSync(tmpPath, finalPath);
|
|
299
|
+
renamed = true;
|
|
300
|
+
const written = lstatSync(finalPath);
|
|
301
|
+
if (!written.isFile() || written.dev !== tmpFile.dev || written.ino !== tmpFile.ino) {
|
|
302
|
+
throw new Error("Fetched content cache entry changed after writing");
|
|
303
|
+
}
|
|
304
|
+
if (!pruneFetchCache(Date.now(), limits, key)) {
|
|
305
|
+
throw new Error("Fetched content cache could not meet its limits after writing");
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
catch (err) {
|
|
309
|
+
if (fd !== null)
|
|
310
|
+
try {
|
|
311
|
+
closeSync(fd);
|
|
312
|
+
}
|
|
313
|
+
catch { }
|
|
314
|
+
if (tmpFile)
|
|
315
|
+
unlinkCacheFile(dir, { ...tmpFile, name: renamed ? key : tmpName });
|
|
316
|
+
throw err;
|
|
317
|
+
}
|
|
318
|
+
return { version: FETCH_CACHE_VERSION, key, storedAt: Date.now() };
|
|
319
|
+
}
|
|
320
|
+
function cacheWriteError(err) {
|
|
321
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
322
|
+
return `Failed to write fetched content cache: ${message}`;
|
|
323
|
+
}
|
|
324
|
+
function createFetchSessionData(data, ref, cacheError) {
|
|
325
|
+
return {
|
|
326
|
+
id: data.id,
|
|
327
|
+
type: "fetch",
|
|
328
|
+
timestamp: data.timestamp,
|
|
329
|
+
urlMetadata: metadataForUrls(data.urls),
|
|
330
|
+
...(ref ? { fetchCache: ref } : {}),
|
|
331
|
+
...(cacheError ? { fetchCacheError: truncateMetadataText(cacheError) } : {}),
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
function fetchUrlMetadata(data) {
|
|
335
|
+
if (data.urlMetadata)
|
|
336
|
+
return data.urlMetadata;
|
|
337
|
+
return isInlineFetchData(data) ? metadataForUrls(data.urls) : [];
|
|
338
|
+
}
|
|
339
|
+
function unavailableFetchData(data, reason) {
|
|
340
|
+
return {
|
|
341
|
+
...data,
|
|
342
|
+
urls: fetchUrlMetadata(data).map((meta) => ({
|
|
343
|
+
url: meta.url,
|
|
344
|
+
title: meta.title,
|
|
345
|
+
content: "",
|
|
346
|
+
error: reason,
|
|
347
|
+
...(meta.mimeType ? { mimeType: meta.mimeType } : {}),
|
|
348
|
+
...(typeof meta.status === "number" ? { status: meta.status } : {}),
|
|
349
|
+
...(typeof meta.duration === "number" ? { duration: meta.duration } : {}),
|
|
350
|
+
})),
|
|
351
|
+
};
|
|
352
|
+
}
|
|
353
|
+
function readCachedFetchData(data, now = Date.now()) {
|
|
354
|
+
if (data.type !== "fetch")
|
|
355
|
+
return data;
|
|
356
|
+
if (now - data.timestamp >= CACHE_TTL_MS) {
|
|
357
|
+
return unavailableFetchData(data, "Cached fetched content is missing or expired");
|
|
358
|
+
}
|
|
359
|
+
if (isInlineFetchData(data))
|
|
360
|
+
return data;
|
|
361
|
+
if (!data.fetchCache) {
|
|
362
|
+
return unavailableFetchData(data, data.fetchCacheError ?? "Cached fetched content is unavailable");
|
|
363
|
+
}
|
|
364
|
+
const path = fetchCachePath(data.fetchCache.key);
|
|
365
|
+
if (!path)
|
|
366
|
+
return unavailableFetchData(data, "Cached fetched content is missing or expired");
|
|
367
|
+
let fd = null;
|
|
368
|
+
try {
|
|
369
|
+
if (!safeFetchCacheDir(false))
|
|
370
|
+
return unavailableFetchData(data, "Cached fetched content is missing or expired");
|
|
371
|
+
const opened = openRegularFile(path);
|
|
372
|
+
fd = opened.fd;
|
|
373
|
+
enforceFileMode(fd);
|
|
374
|
+
const parsed = JSON.parse(readFileSync(fd, "utf8"));
|
|
375
|
+
if (!isValidStoredData(parsed) || parsed.type !== "fetch" || parsed.id !== data.id || !isInlineFetchData(parsed)) {
|
|
376
|
+
return unavailableFetchData(data, "Cached fetched content is invalid");
|
|
377
|
+
}
|
|
378
|
+
return { ...parsed, fetchCache: data.fetchCache, urlMetadata: data.urlMetadata };
|
|
379
|
+
}
|
|
380
|
+
catch (err) {
|
|
381
|
+
if (err.code === "ENOENT") {
|
|
382
|
+
return unavailableFetchData(data, "Cached fetched content is missing or expired");
|
|
383
|
+
}
|
|
384
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
385
|
+
return unavailableFetchData(data, `Cached fetched content could not be read: ${message}`);
|
|
386
|
+
}
|
|
387
|
+
finally {
|
|
388
|
+
if (fd !== null)
|
|
389
|
+
try {
|
|
390
|
+
closeSync(fd);
|
|
391
|
+
}
|
|
392
|
+
catch { }
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
export function pruneExpiredFetchCache(now = Date.now(), requestedLimits) {
|
|
396
|
+
const limits = cacheLimits(requestedLimits);
|
|
397
|
+
try {
|
|
398
|
+
pruneFetchCache(now, limits);
|
|
399
|
+
}
|
|
400
|
+
catch { }
|
|
401
|
+
}
|
|
402
|
+
export function storeResult(id, data) {
|
|
403
|
+
storedResults.set(id, data);
|
|
404
|
+
}
|
|
405
|
+
export function storeFetchedContentResult(id, data) {
|
|
406
|
+
let ref = null;
|
|
407
|
+
let cacheError;
|
|
408
|
+
try {
|
|
409
|
+
ref = writeFetchCache(data);
|
|
410
|
+
}
|
|
411
|
+
catch (err) {
|
|
412
|
+
cacheError = cacheWriteError(err);
|
|
413
|
+
}
|
|
414
|
+
storedResults.set(id, ref ? { ...data, fetchCache: ref, urlMetadata: metadataForUrls(data.urls) } : { ...data, fetchCacheError: cacheError });
|
|
415
|
+
return createFetchSessionData(data, ref, cacheError);
|
|
416
|
+
}
|
|
417
|
+
export function getResult(id) {
|
|
418
|
+
const data = storedResults.get(id);
|
|
419
|
+
if (!data)
|
|
420
|
+
return null;
|
|
421
|
+
const loaded = readCachedFetchData(data);
|
|
422
|
+
if (loaded !== data)
|
|
423
|
+
storedResults.set(id, loaded);
|
|
424
|
+
return loaded;
|
|
425
|
+
}
|
|
426
|
+
export function getAllResults() {
|
|
427
|
+
return Array.from(storedResults.values());
|
|
428
|
+
}
|
|
429
|
+
export function deleteResult(id) {
|
|
430
|
+
const data = storedResults.get(id);
|
|
431
|
+
if (data?.fetchCache) {
|
|
432
|
+
try {
|
|
433
|
+
const dir = safeFetchCacheDir(false);
|
|
434
|
+
const path = fetchCachePath(data.fetchCache.key);
|
|
435
|
+
if (dir && path) {
|
|
436
|
+
const info = lstatSync(path);
|
|
437
|
+
if (!info.isSymbolicLink() && info.isFile()) {
|
|
438
|
+
unlinkCacheFile(dir, { name: data.fetchCache.key, size: info.size, mtimeMs: info.mtimeMs, dev: info.dev, ino: info.ino });
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
catch { }
|
|
443
|
+
}
|
|
444
|
+
return storedResults.delete(id);
|
|
445
|
+
}
|
|
446
|
+
export function clearResults() {
|
|
447
|
+
storedResults.clear();
|
|
448
|
+
}
|
|
449
|
+
function isValidStoredData(data) {
|
|
450
|
+
if (!data || typeof data !== "object")
|
|
451
|
+
return false;
|
|
452
|
+
const d = data;
|
|
453
|
+
if (typeof d.id !== "string" || !d.id)
|
|
454
|
+
return false;
|
|
455
|
+
if (d.type !== "search" && d.type !== "fetch" && d.type !== "research")
|
|
456
|
+
return false;
|
|
457
|
+
if (typeof d.timestamp !== "number")
|
|
458
|
+
return false;
|
|
459
|
+
if (d.type === "search" && !Array.isArray(d.queries))
|
|
460
|
+
return false;
|
|
461
|
+
if (d.type === "fetch") {
|
|
462
|
+
if (Array.isArray(d.urls))
|
|
463
|
+
return d.urls.every(isInlineFetchedUrl);
|
|
464
|
+
if (!Array.isArray(d.urlMetadata) || !d.urlMetadata.every(isStoredFetchUrlMetadata))
|
|
465
|
+
return false;
|
|
466
|
+
return d.fetchCache === undefined ? d.fetchCacheError === undefined || typeof d.fetchCacheError === "string" : isFetchCacheRef(d.fetchCache);
|
|
467
|
+
}
|
|
468
|
+
if (d.type === "research" && (!d.artifact || typeof d.artifact !== "object"))
|
|
469
|
+
return false;
|
|
470
|
+
return true;
|
|
471
|
+
}
|
|
472
|
+
export function restoreFromSession(ctx) {
|
|
473
|
+
storedResults.clear();
|
|
474
|
+
const now = Date.now();
|
|
475
|
+
pruneExpiredFetchCache(now);
|
|
476
|
+
for (const entry of ctx.sessionManager.getBranch()) {
|
|
477
|
+
if (entry.type === "custom" && entry.customType === "web-search-results") {
|
|
478
|
+
const data = entry.data;
|
|
479
|
+
if (isValidStoredData(data) && now - data.timestamp < CACHE_TTL_MS) {
|
|
480
|
+
storedResults.set(data.id, data);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
//# sourceMappingURL=storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/storage.ts"],"names":[],"mappings":"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","sourcesContent":["import { closeSync, constants, fchmodSync, fstatSync, fsyncSync, lstatSync, mkdirSync, openSync, readFileSync, readdirSync, renameSync, type Stats, unlinkSync, writeFileSync } from \"node:fs\";\nimport { randomBytes } from \"node:crypto\";\nimport { join } from \"node:path\";\nimport type { ExtensionContext } from \"../host.ts\";\nimport type { ExtractedContent } from \"./extract.ts\";\nimport type { SearchResult } from \"./perplexity.ts\";\nimport { getWebSearchConfigDir } from \"./utils.ts\";\n\nconst CACHE_TTL_MS = 60 * 60 * 1000;\nconst FETCH_CACHE_DIR = \"web-search-cache\";\nconst FETCH_CACHE_VERSION = 1;\nconst CACHE_KEY_PATTERN = /^[A-Za-z0-9_-]+\\.json$/;\nconst CACHE_TMP_PATTERN = /^[A-Za-z0-9_-]+\\.json\\.\\d+\\.\\d+(?:\\.[a-f0-9]{32})?\\.tmp$/;\nconst CACHE_ID_PATTERN = /^[A-Za-z0-9_-]+$/;\nconst MAX_METADATA_TEXT = 8192;\nconst DEFAULT_CACHE_LIMITS = { maxEntries: 128, maxBytes: 128 * 1024 * 1024 };\nconst O_DIRECTORY = process.platform === \"win32\" ? 0 : (constants.O_DIRECTORY ?? 0);\nconst O_NOFOLLOW = process.platform === \"win32\" ? 0 : (constants.O_NOFOLLOW ?? 0);\n\ninterface FetchCacheLimits {\n\tmaxEntries: number;\n\tmaxBytes: number;\n}\n\ninterface CacheFile {\n\tname: string;\n\tsize: number;\n\tmtimeMs: number;\n\tdev: number;\n\tino: number;\n}\n\nexport interface QueryResultData {\n\tquery: string;\n\tanswer: string;\n\tresults: SearchResult[];\n\terror: string | null;\n\tprovider?: string;\n}\n\ninterface FetchCacheRef {\n\tversion: typeof FETCH_CACHE_VERSION;\n\tkey: string;\n\tstoredAt: number;\n}\n\ninterface StoredFetchUrlMetadata {\n\turl: string;\n\ttitle: string;\n\terror: string | null;\n\tcontentLength: number;\n\tmimeType?: string;\n\tstatus?: number;\n\tduration?: number;\n}\n\nexport interface StoredSearchData {\n\tid: string;\n\ttype: \"search\" | \"fetch\" | \"research\";\n\ttimestamp: number;\n\tqueries?: QueryResultData[];\n\turls?: ExtractedContent[];\n\tartifact?: unknown;\n\tfetchCache?: FetchCacheRef;\n\turlMetadata?: StoredFetchUrlMetadata[];\n\tfetchCacheError?: string;\n}\n\nconst storedResults = new Map<string, StoredSearchData>();\n\nexport function generateId(): string {\n\treturn Date.now().toString(36) + Math.random().toString(36).slice(2, 8);\n}\n\nexport function getFetchCacheDir(): string {\n\treturn join(getWebSearchConfigDir(), FETCH_CACHE_DIR);\n}\n\nfunction fetchCachePath(key: string): string | null {\n\tif (!CACHE_KEY_PATTERN.test(key)) return null;\n\treturn join(getFetchCacheDir(), key);\n}\n\nfunction cacheKeyForId(id: string): string {\n\tif (!CACHE_ID_PATTERN.test(id)) {\n\t\tthrow new Error(`Invalid fetched content cache id: ${id}`);\n\t}\n\treturn `${id}.json`;\n}\n\nfunction truncateMetadataText(value: string | undefined): string {\n\tif (!value) return \"\";\n\treturn value.length > MAX_METADATA_TEXT ? `${value.slice(0, MAX_METADATA_TEXT)}...` : value;\n}\n\nfunction metadataForUrls(urls: ExtractedContent[]): StoredFetchUrlMetadata[] {\n\treturn urls.map((url) => ({\n\t\turl: truncateMetadataText(url.url),\n\t\ttitle: truncateMetadataText(url.title),\n\t\terror: url.error ? truncateMetadataText(url.error) : null,\n\t\tcontentLength: url.content.length,\n\t\t...(url.mimeType ? { mimeType: truncateMetadataText(url.mimeType) } : {}),\n\t\t...(typeof url.status === \"number\" ? { status: url.status } : {}),\n\t\t...(typeof url.duration === \"number\" ? { duration: url.duration } : {}),\n\t}));\n}\n\nfunction isFetchCacheRef(value: unknown): value is FetchCacheRef {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst ref = value as Record<string, unknown>;\n\treturn ref.version === FETCH_CACHE_VERSION &&\n\t\ttypeof ref.key === \"string\" && CACHE_KEY_PATTERN.test(ref.key) &&\n\t\ttypeof ref.storedAt === \"number\" && Number.isFinite(ref.storedAt);\n}\n\nfunction isStoredFetchUrlMetadata(value: unknown): value is StoredFetchUrlMetadata {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst meta = value as Record<string, unknown>;\n\treturn typeof meta.url === \"string\" &&\n\t\ttypeof meta.title === \"string\" &&\n\t\t(meta.error === null || typeof meta.error === \"string\") &&\n\t\ttypeof meta.contentLength === \"number\" && Number.isFinite(meta.contentLength) && meta.contentLength >= 0 &&\n\t\t(meta.mimeType === undefined || typeof meta.mimeType === \"string\") &&\n\t\t(meta.status === undefined || typeof meta.status === \"number\") &&\n\t\t(meta.duration === undefined || typeof meta.duration === \"number\");\n}\n\nfunction isInlineFetchedUrl(value: unknown): value is ExtractedContent {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tconst url = value as Record<string, unknown>;\n\treturn typeof url.url === \"string\" &&\n\t\ttypeof url.title === \"string\" &&\n\t\ttypeof url.content === \"string\" &&\n\t\t(url.error === null || typeof url.error === \"string\");\n}\n\nfunction isInlineFetchData(data: StoredSearchData): data is StoredSearchData & { urls: ExtractedContent[] } {\n\treturn data.type === \"fetch\" && Array.isArray(data.urls) && data.urls.every(isInlineFetchedUrl);\n}\n\nfunction cacheLimits(limits?: Partial<FetchCacheLimits>): FetchCacheLimits {\n\tconst resolved = {\n\t\tmaxEntries: limits?.maxEntries ?? DEFAULT_CACHE_LIMITS.maxEntries,\n\t\tmaxBytes: limits?.maxBytes ?? DEFAULT_CACHE_LIMITS.maxBytes,\n\t};\n\tif (!Number.isFinite(resolved.maxEntries) || !Number.isInteger(resolved.maxEntries) || resolved.maxEntries <= 0 ||\n\t\t!Number.isFinite(resolved.maxBytes) || !Number.isInteger(resolved.maxBytes) || resolved.maxBytes <= 0) {\n\t\tthrow new Error(\"Fetched content cache limits must be finite positive integers\");\n\t}\n\treturn resolved;\n}\n\nfunction enforceDirectoryMode(fd: number): void {\n\ttry {\n\t\tfchmodSync(fd, 0o700);\n\t} catch (err) {\n\t\tif (process.platform !== \"win32\") throw err;\n\t}\n}\n\nfunction enforceFileMode(fd: number): void {\n\ttry {\n\t\tfchmodSync(fd, 0o600);\n\t} catch (err) {\n\t\tif (process.platform !== \"win32\") throw err;\n\t}\n}\n\nfunction safeFetchCacheDir(create: true): string;\nfunction safeFetchCacheDir(create: false): string | null;\nfunction safeFetchCacheDir(create: boolean): string | null {\n\tconst dir = getFetchCacheDir();\n\tif (create) mkdirSync(dir, { recursive: true, mode: 0o700 });\n\tlet before: Stats;\n\ttry {\n\t\tbefore = lstatSync(dir);\n\t} catch (err) {\n\t\tif (!create && (err as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n\t\tthrow err;\n\t}\n\tif (before.isSymbolicLink() || !before.isDirectory()) {\n\t\tthrow new Error(\"Fetched content cache path is not a safe directory\");\n\t}\n\tif (process.platform === \"win32\") {\n\t\tconst after = lstatSync(dir);\n\t\tif (after.isSymbolicLink() || !after.isDirectory() || after.dev !== before.dev || after.ino !== before.ino) {\n\t\t\tthrow new Error(\"Fetched content cache directory changed while securing it\");\n\t\t}\n\t\treturn dir;\n\t}\n\tlet fd: number | null = null;\n\ttry {\n\t\tfd = openSync(dir, constants.O_RDONLY | O_DIRECTORY | O_NOFOLLOW);\n\t\tconst opened = fstatSync(fd);\n\t\tif (!opened.isDirectory() || opened.dev !== before.dev || opened.ino !== before.ino) {\n\t\t\tthrow new Error(\"Fetched content cache directory changed while opening\");\n\t\t}\n\t\tenforceDirectoryMode(fd);\n\t\tcloseSync(fd);\n\t\tfd = null;\n\t\tconst after = lstatSync(dir);\n\t\tif (after.isSymbolicLink() || !after.isDirectory() || after.dev !== before.dev || after.ino !== before.ino) {\n\t\t\tthrow new Error(\"Fetched content cache directory changed while securing it\");\n\t\t}\n\t\treturn dir;\n\t} finally {\n\t\tif (fd !== null) try { closeSync(fd); } catch {}\n\t}\n}\n\nfunction openRegularFile(path: string): { fd: number; info: Stats } {\n\tconst before = lstatSync(path);\n\tif (before.isSymbolicLink() || !before.isFile()) throw new Error(\"Fetched content cache entry is not a regular file\");\n\tconst fd = openSync(path, constants.O_RDONLY | O_NOFOLLOW);\n\ttry {\n\t\tconst info = fstatSync(fd);\n\t\tif (!info.isFile() || info.dev !== before.dev || info.ino !== before.ino) {\n\t\t\tthrow new Error(\"Fetched content cache entry changed while opening\");\n\t\t}\n\t\treturn { fd, info };\n\t} catch (err) {\n\t\tcloseSync(fd);\n\t\tthrow err;\n\t}\n}\n\ntype CacheUnlinkResult = \"removed\" | \"missing\" | \"changed\" | \"error\";\n\nfunction unlinkCacheFile(dir: string, file: CacheFile): CacheUnlinkResult {\n\ttry {\n\t\tconst root = lstatSync(dir);\n\t\tif (root.isSymbolicLink() || !root.isDirectory()) return \"changed\";\n\t\tconst path = join(dir, file.name);\n\t\tlet current: Stats;\n\t\ttry {\n\t\t\tcurrent = lstatSync(path);\n\t\t} catch (err) {\n\t\t\treturn (err as NodeJS.ErrnoException).code === \"ENOENT\" ? \"missing\" : \"error\";\n\t\t}\n\t\tif (current.isSymbolicLink() || !current.isFile() || current.dev !== file.dev || current.ino !== file.ino) return \"changed\";\n\t\ttry {\n\t\t\tunlinkSync(path);\n\t\t\treturn \"removed\";\n\t\t} catch (err) {\n\t\t\treturn (err as NodeJS.ErrnoException).code === \"ENOENT\" ? \"missing\" : \"error\";\n\t\t}\n\t} catch {\n\t\treturn \"error\";\n\t}\n}\n\nfunction pruneFetchCache(now: number, limits: FetchCacheLimits, preferredKey?: string, reservation?: { key: string; bytes: number }): boolean {\n\tlet dir: string | null;\n\ttry {\n\t\tdir = safeFetchCacheDir(false);\n\t} catch {\n\t\treturn false;\n\t}\n\tif (!dir) return true;\n\n\tlet entries: string[];\n\ttry {\n\t\tentries = readdirSync(dir);\n\t} catch {\n\t\treturn false;\n\t}\n\n\tconst files: CacheFile[] = [];\n\tfor (const entry of entries) {\n\t\tif (!CACHE_KEY_PATTERN.test(entry) && !CACHE_TMP_PATTERN.test(entry)) continue;\n\t\tconst path = join(dir, entry);\n\t\tlet opened: ReturnType<typeof openRegularFile>;\n\t\ttry {\n\t\t\topened = openRegularFile(path);\n\t\t} catch {\n\t\t\tcontinue;\n\t\t}\n\t\ttry {\n\t\t\tenforceFileMode(opened.fd);\n\t\t} catch {\n\t\t\tcloseSync(opened.fd);\n\t\t\tcontinue;\n\t\t}\n\t\tcloseSync(opened.fd);\n\t\tconst file = { name: entry, size: opened.info.size, mtimeMs: opened.info.mtimeMs, dev: opened.info.dev, ino: opened.info.ino };\n\t\tif (now - file.mtimeMs >= CACHE_TTL_MS) {\n\t\t\tconst removed = unlinkCacheFile(dir, file);\n\t\t\tif (removed !== \"removed\" && removed !== \"missing\") return false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (CACHE_KEY_PATTERN.test(entry)) files.push(file);\n\t}\n\n\tfiles.sort((a, b) => a.mtimeMs - b.mtimeMs || a.name.localeCompare(b.name));\n\tconst projectedUsage = () => {\n\t\tconst replaced = reservation ? files.find((file) => file.name === reservation.key) : undefined;\n\t\treturn {\n\t\t\tentries: files.length + (reservation && !replaced ? 1 : 0),\n\t\t\tbytes: files.reduce((total, file) => total + file.size, 0) + (reservation ? reservation.bytes - (replaced?.size ?? 0) : 0),\n\t\t};\n\t};\n\tconst attempted = new Set<string>();\n\tlet usage = projectedUsage();\n\twhile (usage.entries > limits.maxEntries || usage.bytes > limits.maxBytes) {\n\t\tconst index = files.findIndex((file) => file.name !== preferredKey && !attempted.has(file.name));\n\t\tif (index < 0) break;\n\t\tconst file = files[index];\n\t\tattempted.add(file.name);\n\t\tconst removed = unlinkCacheFile(dir, file);\n\t\tif (removed === \"removed\" || removed === \"missing\") files.splice(index, 1);\n\t\tusage = projectedUsage();\n\t}\n\treturn usage.entries <= limits.maxEntries && usage.bytes <= limits.maxBytes;\n}\n\nfunction writeFetchCache(data: StoredSearchData & { urls: ExtractedContent[] }): FetchCacheRef {\n\tconst limits = DEFAULT_CACHE_LIMITS;\n\tconst serialized = JSON.stringify(data);\n\tconst size = Buffer.byteLength(serialized);\n\tif (size > limits.maxBytes) throw new Error(`Fetched content cache entry exceeds ${limits.maxBytes} bytes`);\n\n\tconst dir = safeFetchCacheDir(true);\n\tconst key = cacheKeyForId(data.id);\n\tif (!pruneFetchCache(Date.now(), limits, key, { key, bytes: size })) {\n\t\tthrow new Error(\"Fetched content cache could not reserve space for a new entry\");\n\t}\n\tconst finalPath = join(dir, key);\n\tconst tmpName = `${key}.${process.pid}.${Date.now()}.${randomBytes(16).toString(\"hex\")}.tmp`;\n\tconst tmpPath = join(dir, tmpName);\n\tlet fd: number | null = null;\n\tlet tmpFile: CacheFile | null = null;\n\tlet renamed = false;\n\ttry {\n\t\tfd = openSync(tmpPath, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY | O_NOFOLLOW, 0o600);\n\t\tconst tmpInfo = fstatSync(fd);\n\t\ttmpFile = { name: tmpName, size: tmpInfo.size, mtimeMs: tmpInfo.mtimeMs, dev: tmpInfo.dev, ino: tmpInfo.ino };\n\t\tenforceFileMode(fd);\n\t\twriteFileSync(fd, serialized, \"utf8\");\n\t\tfsyncSync(fd);\n\t\tcloseSync(fd);\n\t\tfd = null;\n\t\tsafeFetchCacheDir(false);\n\t\trenameSync(tmpPath, finalPath);\n\t\trenamed = true;\n\t\tconst written = lstatSync(finalPath);\n\t\tif (!written.isFile() || written.dev !== tmpFile.dev || written.ino !== tmpFile.ino) {\n\t\t\tthrow new Error(\"Fetched content cache entry changed after writing\");\n\t\t}\n\t\tif (!pruneFetchCache(Date.now(), limits, key)) {\n\t\t\tthrow new Error(\"Fetched content cache could not meet its limits after writing\");\n\t\t}\n\t} catch (err) {\n\t\tif (fd !== null) try { closeSync(fd); } catch {}\n\t\tif (tmpFile) unlinkCacheFile(dir, { ...tmpFile, name: renamed ? key : tmpName });\n\t\tthrow err;\n\t}\n\treturn { version: FETCH_CACHE_VERSION, key, storedAt: Date.now() };\n}\n\nfunction cacheWriteError(err: unknown): string {\n\tconst message = err instanceof Error ? err.message : String(err);\n\treturn `Failed to write fetched content cache: ${message}`;\n}\n\nfunction createFetchSessionData(data: StoredSearchData & { urls: ExtractedContent[] }, ref: FetchCacheRef | null, cacheError?: string): StoredSearchData {\n\treturn {\n\t\tid: data.id,\n\t\ttype: \"fetch\",\n\t\ttimestamp: data.timestamp,\n\t\turlMetadata: metadataForUrls(data.urls),\n\t\t...(ref ? { fetchCache: ref } : {}),\n\t\t...(cacheError ? { fetchCacheError: truncateMetadataText(cacheError) } : {}),\n\t};\n}\n\nfunction fetchUrlMetadata(data: StoredSearchData): StoredFetchUrlMetadata[] {\n\tif (data.urlMetadata) return data.urlMetadata;\n\treturn isInlineFetchData(data) ? metadataForUrls(data.urls) : [];\n}\n\nfunction unavailableFetchData(data: StoredSearchData, reason: string): StoredSearchData {\n\treturn {\n\t\t...data,\n\t\turls: fetchUrlMetadata(data).map((meta) => ({\n\t\t\turl: meta.url,\n\t\t\ttitle: meta.title,\n\t\t\tcontent: \"\",\n\t\t\terror: reason,\n\t\t\t...(meta.mimeType ? { mimeType: meta.mimeType } : {}),\n\t\t\t...(typeof meta.status === \"number\" ? { status: meta.status } : {}),\n\t\t\t...(typeof meta.duration === \"number\" ? { duration: meta.duration } : {}),\n\t\t})),\n\t};\n}\n\nfunction readCachedFetchData(data: StoredSearchData, now = Date.now()): StoredSearchData {\n\tif (data.type !== \"fetch\") return data;\n\tif (now - data.timestamp >= CACHE_TTL_MS) {\n\t\treturn unavailableFetchData(data, \"Cached fetched content is missing or expired\");\n\t}\n\tif (isInlineFetchData(data)) return data;\n\tif (!data.fetchCache) {\n\t\treturn unavailableFetchData(data, data.fetchCacheError ?? \"Cached fetched content is unavailable\");\n\t}\n\tconst path = fetchCachePath(data.fetchCache.key);\n\tif (!path) return unavailableFetchData(data, \"Cached fetched content is missing or expired\");\n\tlet fd: number | null = null;\n\ttry {\n\t\tif (!safeFetchCacheDir(false)) return unavailableFetchData(data, \"Cached fetched content is missing or expired\");\n\t\tconst opened = openRegularFile(path);\n\t\tfd = opened.fd;\n\t\tenforceFileMode(fd);\n\t\tconst parsed: unknown = JSON.parse(readFileSync(fd, \"utf8\"));\n\t\tif (!isValidStoredData(parsed) || parsed.type !== \"fetch\" || parsed.id !== data.id || !isInlineFetchData(parsed)) {\n\t\t\treturn unavailableFetchData(data, \"Cached fetched content is invalid\");\n\t\t}\n\t\treturn { ...parsed, fetchCache: data.fetchCache, urlMetadata: data.urlMetadata };\n\t} catch (err) {\n\t\tif ((err as NodeJS.ErrnoException).code === \"ENOENT\") {\n\t\t\treturn unavailableFetchData(data, \"Cached fetched content is missing or expired\");\n\t\t}\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\treturn unavailableFetchData(data, `Cached fetched content could not be read: ${message}`);\n\t} finally {\n\t\tif (fd !== null) try { closeSync(fd); } catch {}\n\t}\n}\n\nexport function pruneExpiredFetchCache(now = Date.now(), requestedLimits?: Partial<FetchCacheLimits>): void {\n\tconst limits = cacheLimits(requestedLimits);\n\ttry { pruneFetchCache(now, limits); } catch {}\n}\n\nexport function storeResult(id: string, data: StoredSearchData): void {\n\tstoredResults.set(id, data);\n}\n\nexport function storeFetchedContentResult(id: string, data: StoredSearchData & { type: \"fetch\"; urls: ExtractedContent[] }): StoredSearchData {\n\tlet ref: FetchCacheRef | null = null;\n\tlet cacheError: string | undefined;\n\ttry {\n\t\tref = writeFetchCache(data);\n\t} catch (err) {\n\t\tcacheError = cacheWriteError(err);\n\t}\n\tstoredResults.set(id, ref ? { ...data, fetchCache: ref, urlMetadata: metadataForUrls(data.urls) } : { ...data, fetchCacheError: cacheError });\n\treturn createFetchSessionData(data, ref, cacheError);\n}\n\nexport function getResult(id: string): StoredSearchData | null {\n\tconst data = storedResults.get(id);\n\tif (!data) return null;\n\tconst loaded = readCachedFetchData(data);\n\tif (loaded !== data) storedResults.set(id, loaded);\n\treturn loaded;\n}\n\nexport function getAllResults(): StoredSearchData[] {\n\treturn Array.from(storedResults.values());\n}\n\nexport function deleteResult(id: string): boolean {\n\tconst data = storedResults.get(id);\n\tif (data?.fetchCache) {\n\t\ttry {\n\t\t\tconst dir = safeFetchCacheDir(false);\n\t\t\tconst path = fetchCachePath(data.fetchCache.key);\n\t\t\tif (dir && path) {\n\t\t\t\tconst info = lstatSync(path);\n\t\t\t\tif (!info.isSymbolicLink() && info.isFile()) {\n\t\t\t\t\tunlinkCacheFile(dir, { name: data.fetchCache.key, size: info.size, mtimeMs: info.mtimeMs, dev: info.dev, ino: info.ino });\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {}\n\t}\n\treturn storedResults.delete(id);\n}\n\nexport function clearResults(): void {\n\tstoredResults.clear();\n}\n\nfunction isValidStoredData(data: unknown): data is StoredSearchData {\n\tif (!data || typeof data !== \"object\") return false;\n\tconst d = data as Record<string, unknown>;\n\tif (typeof d.id !== \"string\" || !d.id) return false;\n\tif (d.type !== \"search\" && d.type !== \"fetch\" && d.type !== \"research\") return false;\n\tif (typeof d.timestamp !== \"number\") return false;\n\tif (d.type === \"search\" && !Array.isArray(d.queries)) return false;\n\tif (d.type === \"fetch\") {\n\t\tif (Array.isArray(d.urls)) return d.urls.every(isInlineFetchedUrl);\n\t\tif (!Array.isArray(d.urlMetadata) || !d.urlMetadata.every(isStoredFetchUrlMetadata)) return false;\n\t\treturn d.fetchCache === undefined ? d.fetchCacheError === undefined || typeof d.fetchCacheError === \"string\" : isFetchCacheRef(d.fetchCache);\n\t}\n\tif (d.type === \"research\" && (!d.artifact || typeof d.artifact !== \"object\")) return false;\n\treturn true;\n}\n\nexport function restoreFromSession(ctx: ExtensionContext): void {\n\tstoredResults.clear();\n\tconst now = Date.now();\n\tpruneExpiredFetchCache(now);\n\n\tfor (const entry of ctx.sessionManager.getBranch()) {\n\t\tif (entry.type === \"custom\" && entry.customType === \"web-search-results\") {\n\t\t\tconst data = entry.data;\n\t\t\tif (isValidStoredData(data) && now - data.timestamp < CACHE_TTL_MS) {\n\t\t\t\tstoredResults.set(data.id, data);\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
interface SummaryModelScopeContext {
|
|
2
|
+
cwd: string;
|
|
3
|
+
isProjectTrusted(): boolean;
|
|
4
|
+
}
|
|
5
|
+
export interface ModelLike {
|
|
6
|
+
provider: string;
|
|
7
|
+
id: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ModelRegistryLike<T extends ModelLike = ModelLike> {
|
|
10
|
+
find(provider: string, id: string): T | undefined;
|
|
11
|
+
getAvailable(): readonly T[];
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Resolve a model through its native provider or a provider that routes that model ID.
|
|
15
|
+
*
|
|
16
|
+
* The direct registry fallback preserves explicit/native model resolution when a
|
|
17
|
+
* provider's availability snapshot does not include the configured model. Callers
|
|
18
|
+
* continue to apply their existing enabled-model and authentication checks.
|
|
19
|
+
*/
|
|
20
|
+
export declare function findModelWithProviderRouting<T extends ModelLike>(registry: ModelRegistryLike<T>, provider: string, id: string): T | undefined;
|
|
21
|
+
export declare function loadEnabledModelPatterns(ctx: SummaryModelScopeContext): string[] | null;
|
|
22
|
+
export declare function summaryModelValue(model: ModelLike): string;
|
|
23
|
+
export declare function modelMatchesEnabledPatterns(model: ModelLike, patterns: string[] | null): boolean;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=summary-model-scope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary-model-scope.d.ts","sourceRoot":"","sources":["../../../../src/humain/web-access/vendor/summary-model-scope.ts"],"names":[],"mappings":"AAMA,UAAU,wBAAwB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,gBAAgB,IAAI,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,SAAS;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IACjE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IAClD,YAAY,IAAI,SAAS,CAAC,EAAE,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAAC,CAAC,SAAS,SAAS,EAC/D,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAC9B,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,GACR,CAAC,GAAG,SAAS,CAWf;AAaD,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,wBAAwB,GAAG,MAAM,EAAE,GAAG,IAAI,CAcvF;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAE1D;AAuBD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,GAAG,OAAO,CAehG","sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { getAgentDir } from \"../host.ts\";\n\nconst THINKING_LEVELS = new Set([\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"]);\n\ninterface SummaryModelScopeContext {\n\tcwd: string;\n\tisProjectTrusted(): boolean;\n}\n\nexport interface ModelLike {\n\tprovider: string;\n\tid: string;\n}\n\nexport interface ModelRegistryLike<T extends ModelLike = ModelLike> {\n\tfind(provider: string, id: string): T | undefined;\n\tgetAvailable(): readonly T[];\n}\n\n/**\n * Resolve a model through its native provider or a provider that routes that model ID.\n *\n * The direct registry fallback preserves explicit/native model resolution when a\n * provider's availability snapshot does not include the configured model. Callers\n * continue to apply their existing enabled-model and authentication checks.\n */\nexport function findModelWithProviderRouting<T extends ModelLike>(\n\tregistry: ModelRegistryLike<T>,\n\tprovider: string,\n\tid: string,\n): T | undefined {\n\tconst available = registry.getAvailable();\n\tconst direct = available.find(model => model.provider === provider && model.id === id);\n\tif (direct) return direct;\n\n\tconst routedId = `${provider}/${id}`;\n\t// If multiple routers expose the same model ID, Pi's available-model ordering\n\t// determines which route is selected. An explicit provider/model selector can\n\t// select a specific route when that distinction matters.\n\tconst routed = available.find(model => model.id === routedId);\n\treturn routed ?? registry.find(provider, id);\n}\n\nfunction readSettings(path: string): Record<string, unknown> {\n\tif (!existsSync(path)) return {};\n\tconst raw = readFileSync(path, \"utf8\");\n\ttry {\n\t\treturn JSON.parse(raw) as Record<string, unknown>;\n\t} catch (err) {\n\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\tthrow new Error(`Failed to parse ${path}: ${message}`);\n\t}\n}\n\nexport function loadEnabledModelPatterns(ctx: SummaryModelScopeContext): string[] | null {\n\tconst globalSettings = readSettings(join(getAgentDir(), \"settings.json\"));\n\tconst projectSettings = ctx.isProjectTrusted()\n\t\t? readSettings(join(ctx.cwd, \".humain-terminal\", \"settings.json\"))\n\t\t: {};\n\tconst value = Object.hasOwn(projectSettings, \"enabledModels\")\n\t\t? projectSettings.enabledModels\n\t\t: globalSettings.enabledModels;\n\tif (value === undefined) return null;\n\tif (!Array.isArray(value)) throw new Error(\"enabledModels must be an array\");\n\treturn value\n\t\t.filter((item): item is string => typeof item === \"string\")\n\t\t.map(item => item.trim())\n\t\t.filter(Boolean);\n}\n\nexport function summaryModelValue(model: ModelLike): string {\n\treturn `${model.provider}/${model.id}`;\n}\n\nfunction stripThinkingSuffix(pattern: string): string {\n\tconst index = pattern.lastIndexOf(\":\");\n\tif (index < 0) return pattern;\n\tconst suffix = pattern.slice(index + 1);\n\treturn THINKING_LEVELS.has(suffix) ? pattern.slice(0, index) : pattern;\n}\n\nfunction globToRegExp(pattern: string): RegExp {\n\tlet source = \"^\";\n\tfor (const char of pattern) {\n\t\tif (char === \"*\") {\n\t\t\tsource += \".*\";\n\t\t} else if (char === \"?\") {\n\t\t\tsource += \".\";\n\t\t} else {\n\t\t\tsource += char.replace(/[|\\\\{}()[\\]^$+?.]/g, \"\\\\$&\");\n\t\t}\n\t}\n\treturn new RegExp(`${source}$`, \"i\");\n}\n\nexport function modelMatchesEnabledPatterns(model: ModelLike, patterns: string[] | null): boolean {\n\tif (patterns === null) return true;\n\tconst value = summaryModelValue(model).toLowerCase();\n\tconst id = model.id.toLowerCase();\n\tfor (const rawPattern of patterns) {\n\t\tconst pattern = stripThinkingSuffix(rawPattern.trim()).toLowerCase();\n\t\tif (!pattern) continue;\n\t\tif (pattern.includes(\"*\") || pattern.includes(\"?\")) {\n\t\t\tconst regex = globToRegExp(pattern);\n\t\t\tif (regex.test(value) || regex.test(id)) return true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (pattern === value || pattern === id) return true;\n\t}\n\treturn false;\n}\n"]}
|