@srouterhq/server 0.0.0-stage → 0.9.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/LICENSE +21 -0
- package/client/dist/assets/am-TQ7Jmdqe.js +1 -0
- package/client/dist/assets/ar-Bf5a7yfC.js +1 -0
- package/client/dist/assets/az-CrosE1xH.js +1 -0
- package/client/dist/assets/bg-BvWnmcUz.js +1 -0
- package/client/dist/assets/bn-ams5TsJp.js +1 -0
- package/client/dist/assets/cs-Dh67CaJ_.js +1 -0
- package/client/dist/assets/da-9WlT8Iq7.js +1 -0
- package/client/dist/assets/de-lWhJJzz7.js +1 -0
- package/client/dist/assets/el-Cu7_GhNq.js +1 -0
- package/client/dist/assets/es-BZuzsBcP.js +1 -0
- package/client/dist/assets/fa-Dwdn-jKS.js +1 -0
- package/client/dist/assets/fi-BFrFyOTy.js +1 -0
- package/client/dist/assets/fr-XhbtmPpj.js +1 -0
- package/client/dist/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- package/client/dist/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- package/client/dist/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- package/client/dist/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/client/dist/assets/geist-mono-cyrillic-ext-wght-normal-I4S5GZfc.woff2 +0 -0
- package/client/dist/assets/geist-mono-cyrillic-wght-normal-BmXc_FBt.woff2 +0 -0
- package/client/dist/assets/geist-mono-latin-ext-wght-normal-DrnZ1wKl.woff2 +0 -0
- package/client/dist/assets/geist-mono-latin-wght-normal-B_7UjwxQ.woff2 +0 -0
- package/client/dist/assets/geist-mono-symbols2-wght-normal-GZpp1pK2.woff2 +0 -0
- package/client/dist/assets/geist-mono-vietnamese-wght-normal-D8KDMBhC.woff2 +0 -0
- package/client/dist/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- package/client/dist/assets/gu-D0uhLUB8.js +1 -0
- package/client/dist/assets/ha-CVlm9pqp.js +1 -0
- package/client/dist/assets/he-CMIFeoWr.js +1 -0
- package/client/dist/assets/hi-ENTwhBpn.js +1 -0
- package/client/dist/assets/hr-fc03vMy_.js +1 -0
- package/client/dist/assets/hu-YBo2BIYt.js +1 -0
- package/client/dist/assets/id-BEWXYX69.js +1 -0
- package/client/dist/assets/ig-BKLZFKka.js +1 -0
- package/client/dist/assets/index-D9I4KtvR.js +145 -0
- package/client/dist/assets/index-txhEmCdb.css +2 -0
- package/client/dist/assets/it-Bzmei1Y2.js +1 -0
- package/client/dist/assets/ja-BfcpuqEl.js +1 -0
- package/client/dist/assets/ka-CnWjRgLo.js +1 -0
- package/client/dist/assets/km-BAjPR3Qj.js +1 -0
- package/client/dist/assets/kn-B15WKU5m.js +1 -0
- package/client/dist/assets/ko-C61fAB-w.js +1 -0
- package/client/dist/assets/lt-CYTr4_YW.js +1 -0
- package/client/dist/assets/ml-CtqxgyH3.js +1 -0
- package/client/dist/assets/mr-X5TMY7aR.js +1 -0
- package/client/dist/assets/ms-DSg8RqPS.js +1 -0
- package/client/dist/assets/my-D7RqR8uE.js +1 -0
- package/client/dist/assets/ne-DaflxkDj.js +1 -0
- package/client/dist/assets/nl-BOqqtsC8.js +1 -0
- package/client/dist/assets/no-BSHp_StB.js +1 -0
- package/client/dist/assets/or-BkLR9Vub.js +1 -0
- package/client/dist/assets/pa-CarJ2XgI.js +1 -0
- package/client/dist/assets/pl-C2n0V-0k.js +1 -0
- package/client/dist/assets/pt-BR-CqJdNhg2.js +1 -0
- package/client/dist/assets/pt-PT-C_HpMyKz.js +1 -0
- package/client/dist/assets/ro-DVRZqSAS.js +1 -0
- package/client/dist/assets/ru-DwAJG7VC.js +1 -0
- package/client/dist/assets/si-BxUezXm0.js +1 -0
- package/client/dist/assets/sk-eI1VcIfY.js +1 -0
- package/client/dist/assets/sr-CJF3auCr.js +1 -0
- package/client/dist/assets/srouter-logo-C6ZfjGIi.svg +14 -0
- package/client/dist/assets/sv-nqvwHAq_.js +1 -0
- package/client/dist/assets/sw-DWynE2pW.js +1 -0
- package/client/dist/assets/ta-BVM12knC.js +1 -0
- package/client/dist/assets/te-oyzEkF7_.js +1 -0
- package/client/dist/assets/th-COVeE0ZQ.js +1 -0
- package/client/dist/assets/tl-DsJANnQz.js +1 -0
- package/client/dist/assets/tr-B-Fl-urO.js +1 -0
- package/client/dist/assets/uk-C5qketAO.js +1 -0
- package/client/dist/assets/ur-QU9KugfV.js +1 -0
- package/client/dist/assets/uz-DL9cG_mY.js +1 -0
- package/client/dist/assets/vi-CQiVy3Pu.js +1 -0
- package/client/dist/assets/yo-DqazMdrZ.js +1 -0
- package/client/dist/assets/zh-CN-DnYL_Kio.js +1 -0
- package/client/dist/assets/zh-TW-5bdbosKj.js +1 -0
- package/client/dist/favicon.svg +14 -0
- package/client/dist/icons.svg +24 -0
- package/client/dist/index.html +37 -0
- package/dist/app.d.ts +4 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +372 -0
- package/dist/app.js.map +1 -0
- package/dist/db/index.d.ts +49 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +203 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrate/TEMPLATE.d.ts +4 -0
- package/dist/db/migrate/TEMPLATE.d.ts.map +1 -0
- package/dist/db/migrate/TEMPLATE.js +18 -0
- package/dist/db/migrate/TEMPLATE.js.map +1 -0
- package/dist/db/migrate/cli.d.ts +2 -0
- package/dist/db/migrate/cli.d.ts.map +1 -0
- package/dist/db/migrate/cli.js +177 -0
- package/dist/db/migrate/cli.js.map +1 -0
- package/dist/db/migrate/defaults.d.ts +52 -0
- package/dist/db/migrate/defaults.d.ts.map +1 -0
- package/dist/db/migrate/defaults.js +126 -0
- package/dist/db/migrate/defaults.js.map +1 -0
- package/dist/db/migrate/runner.d.ts +16 -0
- package/dist/db/migrate/runner.d.ts.map +1 -0
- package/dist/db/migrate/runner.js +178 -0
- package/dist/db/migrate/runner.js.map +1 -0
- package/dist/db/migrations/20260101_000000_legacy_baseline.d.ts +4 -0
- package/dist/db/migrations/20260101_000000_legacy_baseline.d.ts.map +1 -0
- package/dist/db/migrations/20260101_000000_legacy_baseline.js +2240 -0
- package/dist/db/migrations/20260101_000000_legacy_baseline.js.map +1 -0
- package/dist/db/migrations/20260627_000001_custom_provider_modalities.d.ts +4 -0
- package/dist/db/migrations/20260627_000001_custom_provider_modalities.d.ts.map +1 -0
- package/dist/db/migrations/20260627_000001_custom_provider_modalities.js +27 -0
- package/dist/db/migrations/20260627_000001_custom_provider_modalities.js.map +1 -0
- package/dist/db/migrations/20260627_000002_catalog_model_state.d.ts +4 -0
- package/dist/db/migrations/20260627_000002_catalog_model_state.d.ts.map +1 -0
- package/dist/db/migrations/20260627_000002_catalog_model_state.js +30 -0
- package/dist/db/migrations/20260627_000002_catalog_model_state.js.map +1 -0
- package/dist/db/migrations/20260628_120000_request_aggregates.d.ts +6 -0
- package/dist/db/migrations/20260628_120000_request_aggregates.d.ts.map +1 -0
- package/dist/db/migrations/20260628_120000_request_aggregates.js +104 -0
- package/dist/db/migrations/20260628_120000_request_aggregates.js.map +1 -0
- package/dist/db/migrations/20260630_000001_github_gpt41_context.d.ts +9 -0
- package/dist/db/migrations/20260630_000001_github_gpt41_context.d.ts.map +1 -0
- package/dist/db/migrations/20260630_000001_github_gpt41_context.js +22 -0
- package/dist/db/migrations/20260630_000001_github_gpt41_context.js.map +1 -0
- package/dist/db/migrations/20260706_000001_request_client_info.d.ts +4 -0
- package/dist/db/migrations/20260706_000001_request_client_info.d.ts.map +1 -0
- package/dist/db/migrations/20260706_000001_request_client_info.js +30 -0
- package/dist/db/migrations/20260706_000001_request_client_info.js.map +1 -0
- package/dist/db/migrations/20260706_000002_custom_model_tool_support.d.ts +17 -0
- package/dist/db/migrations/20260706_000002_custom_model_tool_support.d.ts.map +1 -0
- package/dist/db/migrations/20260706_000002_custom_model_tool_support.js +20 -0
- package/dist/db/migrations/20260706_000002_custom_model_tool_support.js.map +1 -0
- package/dist/db/migrations/20260714_000001_profile_chain_backfill.d.ts +12 -0
- package/dist/db/migrations/20260714_000001_profile_chain_backfill.d.ts.map +1 -0
- package/dist/db/migrations/20260714_000001_profile_chain_backfill.js +45 -0
- package/dist/db/migrations/20260714_000001_profile_chain_backfill.js.map +1 -0
- package/dist/db/migrations/20260720_000001_key_health_error.d.ts +5 -0
- package/dist/db/migrations/20260720_000001_key_health_error.d.ts.map +1 -0
- package/dist/db/migrations/20260720_000001_key_health_error.js +16 -0
- package/dist/db/migrations/20260720_000001_key_health_error.js.map +1 -0
- package/dist/db/migrations/20260726_000001_cooldown_probe_provenance.d.ts +4 -0
- package/dist/db/migrations/20260726_000001_cooldown_probe_provenance.d.ts.map +1 -0
- package/dist/db/migrations/20260726_000001_cooldown_probe_provenance.js +38 -0
- package/dist/db/migrations/20260726_000001_cooldown_probe_provenance.js.map +1 -0
- package/dist/db/migrations/20260726_000002_request_attempts.d.ts +4 -0
- package/dist/db/migrations/20260726_000002_request_attempts.d.ts.map +1 -0
- package/dist/db/migrations/20260726_000002_request_attempts.js +43 -0
- package/dist/db/migrations/20260726_000002_request_attempts.js.map +1 -0
- package/dist/db/migrations/20260726_000003_model_source_provenance.d.ts +4 -0
- package/dist/db/migrations/20260726_000003_model_source_provenance.d.ts.map +1 -0
- package/dist/db/migrations/20260726_000003_model_source_provenance.js +80 -0
- package/dist/db/migrations/20260726_000003_model_source_provenance.js.map +1 -0
- package/dist/db/migrations/20260726_000004_media_model_meta.d.ts +4 -0
- package/dist/db/migrations/20260726_000004_media_model_meta.d.ts.map +1 -0
- package/dist/db/migrations/20260726_000004_media_model_meta.js +34 -0
- package/dist/db/migrations/20260726_000004_media_model_meta.js.map +1 -0
- package/dist/db/migrations/20260726_000005_request_served_model.d.ts +4 -0
- package/dist/db/migrations/20260726_000005_request_served_model.d.ts.map +1 -0
- package/dist/db/migrations/20260726_000005_request_served_model.js +31 -0
- package/dist/db/migrations/20260726_000005_request_served_model.js.map +1 -0
- package/dist/db/migrations/20260726_000006_attempt_error_summary.d.ts +4 -0
- package/dist/db/migrations/20260726_000006_attempt_error_summary.d.ts.map +1 -0
- package/dist/db/migrations/20260726_000006_attempt_error_summary.js +29 -0
- package/dist/db/migrations/20260726_000006_attempt_error_summary.js.map +1 -0
- package/dist/db/migrations/20260727_000001_agent_compatibility.d.ts +4 -0
- package/dist/db/migrations/20260727_000001_agent_compatibility.d.ts.map +1 -0
- package/dist/db/migrations/20260727_000001_agent_compatibility.js +41 -0
- package/dist/db/migrations/20260727_000001_agent_compatibility.js.map +1 -0
- package/dist/db/migrations/20260728_000001_tombstone_provenance.d.ts +12 -0
- package/dist/db/migrations/20260728_000001_tombstone_provenance.d.ts.map +1 -0
- package/dist/db/migrations/20260728_000001_tombstone_provenance.js +37 -0
- package/dist/db/migrations/20260728_000001_tombstone_provenance.js.map +1 -0
- package/dist/db/migrations/20260729_000001_custom_model_endpoint_identity.d.ts +4 -0
- package/dist/db/migrations/20260729_000001_custom_model_endpoint_identity.d.ts.map +1 -0
- package/dist/db/migrations/20260729_000001_custom_model_endpoint_identity.js +145 -0
- package/dist/db/migrations/20260729_000001_custom_model_endpoint_identity.js.map +1 -0
- package/dist/db/migrations/20260802_000001_custom_endpoint_host_labels.d.ts +6 -0
- package/dist/db/migrations/20260802_000001_custom_endpoint_host_labels.d.ts.map +1 -0
- package/dist/db/migrations/20260802_000001_custom_endpoint_host_labels.js +52 -0
- package/dist/db/migrations/20260802_000001_custom_endpoint_host_labels.js.map +1 -0
- package/dist/db/migrations/20260805_000001_key_model_scope.d.ts +6 -0
- package/dist/db/migrations/20260805_000001_key_model_scope.d.ts.map +1 -0
- package/dist/db/migrations/20260805_000001_key_model_scope.js +17 -0
- package/dist/db/migrations/20260805_000001_key_model_scope.js.map +1 -0
- package/dist/db/migrations/20260805_000002_client_profiles.d.ts +4 -0
- package/dist/db/migrations/20260805_000002_client_profiles.d.ts.map +1 -0
- package/dist/db/migrations/20260805_000002_client_profiles.js +33 -0
- package/dist/db/migrations/20260805_000002_client_profiles.js.map +1 -0
- package/dist/db/migrations/20260810_000001_api_key_proxy.d.ts +4 -0
- package/dist/db/migrations/20260810_000001_api_key_proxy.d.ts.map +1 -0
- package/dist/db/migrations/20260810_000001_api_key_proxy.js +33 -0
- package/dist/db/migrations/20260810_000001_api_key_proxy.js.map +1 -0
- package/dist/db/migrations/20260819_000001_custom_model_tombstones.d.ts +4 -0
- package/dist/db/migrations/20260819_000001_custom_model_tombstones.d.ts.map +1 -0
- package/dist/db/migrations/20260819_000001_custom_model_tombstones.js +19 -0
- package/dist/db/migrations/20260819_000001_custom_model_tombstones.js.map +1 -0
- package/dist/db/migrations/20260820_000001_playground_conversations.d.ts +4 -0
- package/dist/db/migrations/20260820_000001_playground_conversations.d.ts.map +1 -0
- package/dist/db/migrations/20260820_000001_playground_conversations.js +47 -0
- package/dist/db/migrations/20260820_000001_playground_conversations.js.map +1 -0
- package/dist/db/migrations/20260823_000001_server_logs.d.ts +4 -0
- package/dist/db/migrations/20260823_000001_server_logs.d.ts.map +1 -0
- package/dist/db/migrations/20260823_000001_server_logs.js +53 -0
- package/dist/db/migrations/20260823_000001_server_logs.js.map +1 -0
- package/dist/db/migrations/20260823_000002_backups_table.d.ts +8 -0
- package/dist/db/migrations/20260823_000002_backups_table.d.ts.map +1 -0
- package/dist/db/migrations/20260823_000002_backups_table.js +22 -0
- package/dist/db/migrations/20260823_000002_backups_table.js.map +1 -0
- package/dist/db/migrations/20260823_000003_attempt_key_label.d.ts +19 -0
- package/dist/db/migrations/20260823_000003_attempt_key_label.d.ts.map +1 -0
- package/dist/db/migrations/20260823_000003_attempt_key_label.js +28 -0
- package/dist/db/migrations/20260823_000003_attempt_key_label.js.map +1 -0
- package/dist/db/migrations/20260823_000004_profile_auto_include.d.ts +14 -0
- package/dist/db/migrations/20260823_000004_profile_auto_include.d.ts.map +1 -0
- package/dist/db/migrations/20260823_000004_profile_auto_include.js +25 -0
- package/dist/db/migrations/20260823_000004_profile_auto_include.js.map +1 -0
- package/dist/db/migrations/20260901_000001_idempotency_claims.d.ts +4 -0
- package/dist/db/migrations/20260901_000001_idempotency_claims.d.ts.map +1 -0
- package/dist/db/migrations/20260901_000001_idempotency_claims.js +46 -0
- package/dist/db/migrations/20260901_000001_idempotency_claims.js.map +1 -0
- package/dist/db/migrations/20260901_000002_quota_observation_lookup.d.ts +4 -0
- package/dist/db/migrations/20260901_000002_quota_observation_lookup.d.ts.map +1 -0
- package/dist/db/migrations/20260901_000002_quota_observation_lookup.js +37 -0
- package/dist/db/migrations/20260901_000002_quota_observation_lookup.js.map +1 -0
- package/dist/db/migrations/20260901_000003_request_caller.d.ts +4 -0
- package/dist/db/migrations/20260901_000003_request_caller.d.ts.map +1 -0
- package/dist/db/migrations/20260901_000003_request_caller.js +27 -0
- package/dist/db/migrations/20260901_000003_request_caller.js.map +1 -0
- package/dist/db/migrations/20260902_000001_analytics_latency_percentile_index.d.ts +4 -0
- package/dist/db/migrations/20260902_000001_analytics_latency_percentile_index.d.ts.map +1 -0
- package/dist/db/migrations/20260902_000001_analytics_latency_percentile_index.js +35 -0
- package/dist/db/migrations/20260902_000001_analytics_latency_percentile_index.js.map +1 -0
- package/dist/db/migrations/20260903_000001_mcp_enabled_default.d.ts +4 -0
- package/dist/db/migrations/20260903_000001_mcp_enabled_default.d.ts.map +1 -0
- package/dist/db/migrations/20260903_000001_mcp_enabled_default.js +37 -0
- package/dist/db/migrations/20260903_000001_mcp_enabled_default.js.map +1 -0
- package/dist/db/migrations/20260903_000002_response_cache.d.ts +4 -0
- package/dist/db/migrations/20260903_000002_response_cache.d.ts.map +1 -0
- package/dist/db/migrations/20260903_000002_response_cache.js +53 -0
- package/dist/db/migrations/20260903_000002_response_cache.js.map +1 -0
- package/dist/db/migrations/20260904_000001_key_monthly_budget.d.ts +13 -0
- package/dist/db/migrations/20260904_000001_key_monthly_budget.d.ts.map +1 -0
- package/dist/db/migrations/20260904_000001_key_monthly_budget.js +35 -0
- package/dist/db/migrations/20260904_000001_key_monthly_budget.js.map +1 -0
- package/dist/db/migrations/20260913_000001_request_model_attribution.d.ts +4 -0
- package/dist/db/migrations/20260913_000001_request_model_attribution.d.ts.map +1 -0
- package/dist/db/migrations/20260913_000001_request_model_attribution.js +68 -0
- package/dist/db/migrations/20260913_000001_request_model_attribution.js.map +1 -0
- package/dist/db/migrations/20260914_000001_key_monthly_usage.d.ts +5 -0
- package/dist/db/migrations/20260914_000001_key_monthly_usage.d.ts.map +1 -0
- package/dist/db/migrations/20260914_000001_key_monthly_usage.js +37 -0
- package/dist/db/migrations/20260914_000001_key_monthly_usage.js.map +1 -0
- package/dist/db/migrations/20260915_000001_quota_snapshot_freshness.d.ts +4 -0
- package/dist/db/migrations/20260915_000001_quota_snapshot_freshness.d.ts.map +1 -0
- package/dist/db/migrations/20260915_000001_quota_snapshot_freshness.js +28 -0
- package/dist/db/migrations/20260915_000001_quota_snapshot_freshness.js.map +1 -0
- package/dist/db/migrations/20261004_000001_unified_key_sr_prefix.d.ts +4 -0
- package/dist/db/migrations/20261004_000001_unified_key_sr_prefix.d.ts.map +1 -0
- package/dist/db/migrations/20261004_000001_unified_key_sr_prefix.js +25 -0
- package/dist/db/migrations/20261004_000001_unified_key_sr_prefix.js.map +1 -0
- package/dist/db/migrations/20261005_000001_key_budget_period.d.ts +10 -0
- package/dist/db/migrations/20261005_000001_key_budget_period.d.ts.map +1 -0
- package/dist/db/migrations/20261005_000001_key_budget_period.js +78 -0
- package/dist/db/migrations/20261005_000001_key_budget_period.js.map +1 -0
- package/dist/db/migrations/20261005_000002_key_budget_period_auto.d.ts +21 -0
- package/dist/db/migrations/20261005_000002_key_budget_period_auto.d.ts.map +1 -0
- package/dist/db/migrations/20261005_000002_key_budget_period_auto.js +41 -0
- package/dist/db/migrations/20261005_000002_key_budget_period_auto.js.map +1 -0
- package/dist/db/model-pricing.d.ts +39 -0
- package/dist/db/model-pricing.d.ts.map +1 -0
- package/dist/db/model-pricing.js +274 -0
- package/dist/db/model-pricing.js.map +1 -0
- package/dist/db/node-sqlite.d.ts +9 -0
- package/dist/db/node-sqlite.d.ts.map +1 -0
- package/dist/db/node-sqlite.js +87 -0
- package/dist/db/node-sqlite.js.map +1 -0
- package/dist/db/types.d.ts +22 -0
- package/dist/db/types.d.ts.map +1 -0
- package/dist/db/types.js +2 -0
- package/dist/db/types.js.map +1 -0
- package/dist/docs/docs-page.d.ts +2 -0
- package/dist/docs/docs-page.d.ts.map +1 -0
- package/dist/docs/docs-page.js +319 -0
- package/dist/docs/docs-page.js.map +1 -0
- package/dist/docs/openapi.d.ts +1896 -0
- package/dist/docs/openapi.d.ts.map +1 -0
- package/dist/docs/openapi.js +1096 -0
- package/dist/docs/openapi.js.map +1 -0
- package/dist/env.d.ts +2 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +9 -0
- package/dist/env.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +144 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/anthropic-documents.d.ts +41 -0
- package/dist/lib/anthropic-documents.d.ts.map +1 -0
- package/dist/lib/anthropic-documents.js +132 -0
- package/dist/lib/anthropic-documents.js.map +1 -0
- package/dist/lib/app-version.d.ts +5 -0
- package/dist/lib/app-version.d.ts.map +1 -0
- package/dist/lib/app-version.js +61 -0
- package/dist/lib/app-version.js.map +1 -0
- package/dist/lib/attempt-trace.d.ts +23 -0
- package/dist/lib/attempt-trace.d.ts.map +1 -0
- package/dist/lib/attempt-trace.js +32 -0
- package/dist/lib/attempt-trace.js.map +1 -0
- package/dist/lib/budget.d.ts +6 -0
- package/dist/lib/budget.d.ts.map +1 -0
- package/dist/lib/budget.js +40 -0
- package/dist/lib/budget.js.map +1 -0
- package/dist/lib/client-classifier.d.ts +10 -0
- package/dist/lib/client-classifier.d.ts.map +1 -0
- package/dist/lib/client-classifier.js +126 -0
- package/dist/lib/client-classifier.js.map +1 -0
- package/dist/lib/client-context.d.ts +10 -0
- package/dist/lib/client-context.d.ts.map +1 -0
- package/dist/lib/client-context.js +39 -0
- package/dist/lib/client-context.js.map +1 -0
- package/dist/lib/config.d.ts +33 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +94 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/content.d.ts +33 -0
- package/dist/lib/content.d.ts.map +1 -0
- package/dist/lib/content.js +201 -0
- package/dist/lib/content.js.map +1 -0
- package/dist/lib/credential.d.ts +11 -0
- package/dist/lib/credential.d.ts.map +1 -0
- package/dist/lib/credential.js +18 -0
- package/dist/lib/credential.js.map +1 -0
- package/dist/lib/crypto.d.ts +31 -0
- package/dist/lib/crypto.d.ts.map +1 -0
- package/dist/lib/crypto.js +206 -0
- package/dist/lib/crypto.js.map +1 -0
- package/dist/lib/custom-provider-cleanup.d.ts +13 -0
- package/dist/lib/custom-provider-cleanup.d.ts.map +1 -0
- package/dist/lib/custom-provider-cleanup.js +43 -0
- package/dist/lib/custom-provider-cleanup.js.map +1 -0
- package/dist/lib/db-backup.d.ts +31 -0
- package/dist/lib/db-backup.d.ts.map +1 -0
- package/dist/lib/db-backup.js +255 -0
- package/dist/lib/db-backup.js.map +1 -0
- package/dist/lib/endpoint-scope.d.ts +42 -0
- package/dist/lib/endpoint-scope.d.ts.map +1 -0
- package/dist/lib/endpoint-scope.js +95 -0
- package/dist/lib/endpoint-scope.js.map +1 -0
- package/dist/lib/env-drift.d.ts +17 -0
- package/dist/lib/env-drift.d.ts.map +1 -0
- package/dist/lib/env-drift.js +108 -0
- package/dist/lib/env-drift.js.map +1 -0
- package/dist/lib/error-classify.d.ts +40 -0
- package/dist/lib/error-classify.d.ts.map +1 -0
- package/dist/lib/error-classify.js +687 -0
- package/dist/lib/error-classify.js.map +1 -0
- package/dist/lib/error-redaction.d.ts +8 -0
- package/dist/lib/error-redaction.d.ts.map +1 -0
- package/dist/lib/error-redaction.js +45 -0
- package/dist/lib/error-redaction.js.map +1 -0
- package/dist/lib/fallback-loop.d.ts +306 -0
- package/dist/lib/fallback-loop.d.ts.map +1 -0
- package/dist/lib/fallback-loop.js +1336 -0
- package/dist/lib/fallback-loop.js.map +1 -0
- package/dist/lib/file-permissions.d.ts +98 -0
- package/dist/lib/file-permissions.d.ts.map +1 -0
- package/dist/lib/file-permissions.js +159 -0
- package/dist/lib/file-permissions.js.map +1 -0
- package/dist/lib/gemini-wire.d.ts +76 -0
- package/dist/lib/gemini-wire.d.ts.map +1 -0
- package/dist/lib/gemini-wire.js +392 -0
- package/dist/lib/gemini-wire.js.map +1 -0
- package/dist/lib/guardrails.d.ts +37 -0
- package/dist/lib/guardrails.d.ts.map +1 -0
- package/dist/lib/guardrails.js +106 -0
- package/dist/lib/guardrails.js.map +1 -0
- package/dist/lib/header-value.d.ts +8 -0
- package/dist/lib/header-value.d.ts.map +1 -0
- package/dist/lib/header-value.js +55 -0
- package/dist/lib/header-value.js.map +1 -0
- package/dist/lib/image-normalize.d.ts +21 -0
- package/dist/lib/image-normalize.d.ts.map +1 -0
- package/dist/lib/image-normalize.js +218 -0
- package/dist/lib/image-normalize.js.map +1 -0
- package/dist/lib/inbound-chat.d.ts +48 -0
- package/dist/lib/inbound-chat.d.ts.map +1 -0
- package/dist/lib/inbound-chat.js +406 -0
- package/dist/lib/inbound-chat.js.map +1 -0
- package/dist/lib/key-parser.d.ts +79 -0
- package/dist/lib/key-parser.d.ts.map +1 -0
- package/dist/lib/key-parser.js +701 -0
- package/dist/lib/key-parser.js.map +1 -0
- package/dist/lib/key-proxy.d.ts +49 -0
- package/dist/lib/key-proxy.d.ts.map +1 -0
- package/dist/lib/key-proxy.js +92 -0
- package/dist/lib/key-proxy.js.map +1 -0
- package/dist/lib/log-redaction.d.ts +28 -0
- package/dist/lib/log-redaction.d.ts.map +1 -0
- package/dist/lib/log-redaction.js +166 -0
- package/dist/lib/log-redaction.js.map +1 -0
- package/dist/lib/model-scope.d.ts +9 -0
- package/dist/lib/model-scope.d.ts.map +1 -0
- package/dist/lib/model-scope.js +29 -0
- package/dist/lib/model-scope.js.map +1 -0
- package/dist/lib/one-time-code.d.ts +15 -0
- package/dist/lib/one-time-code.d.ts.map +1 -0
- package/dist/lib/one-time-code.js +41 -0
- package/dist/lib/one-time-code.js.map +1 -0
- package/dist/lib/output-cap.d.ts +24 -0
- package/dist/lib/output-cap.d.ts.map +1 -0
- package/dist/lib/output-cap.js +80 -0
- package/dist/lib/output-cap.js.map +1 -0
- package/dist/lib/password.d.ts +3 -0
- package/dist/lib/password.d.ts.map +1 -0
- package/dist/lib/password.js +27 -0
- package/dist/lib/password.js.map +1 -0
- package/dist/lib/process-safety-net.d.ts +32 -0
- package/dist/lib/process-safety-net.d.ts.map +1 -0
- package/dist/lib/process-safety-net.js +123 -0
- package/dist/lib/process-safety-net.js.map +1 -0
- package/dist/lib/provider-identity.d.ts +37 -0
- package/dist/lib/provider-identity.d.ts.map +1 -0
- package/dist/lib/provider-identity.js +110 -0
- package/dist/lib/provider-identity.js.map +1 -0
- package/dist/lib/provider-size-parser.d.ts +6 -0
- package/dist/lib/provider-size-parser.d.ts.map +1 -0
- package/dist/lib/provider-size-parser.js +72 -0
- package/dist/lib/provider-size-parser.js.map +1 -0
- package/dist/lib/provider-timeout.d.ts +17 -0
- package/dist/lib/provider-timeout.d.ts.map +1 -0
- package/dist/lib/provider-timeout.js +70 -0
- package/dist/lib/provider-timeout.js.map +1 -0
- package/dist/lib/proxy.d.ts +180 -0
- package/dist/lib/proxy.d.ts.map +1 -0
- package/dist/lib/proxy.js +1002 -0
- package/dist/lib/proxy.js.map +1 -0
- package/dist/lib/request-log.d.ts +4 -0
- package/dist/lib/request-log.d.ts.map +1 -0
- package/dist/lib/request-log.js +161 -0
- package/dist/lib/request-log.js.map +1 -0
- package/dist/lib/reset-code.d.ts +5 -0
- package/dist/lib/reset-code.d.ts.map +1 -0
- package/dist/lib/reset-code.js +39 -0
- package/dist/lib/reset-code.js.map +1 -0
- package/dist/lib/retry-hint.d.ts +14 -0
- package/dist/lib/retry-hint.d.ts.map +1 -0
- package/dist/lib/retry-hint.js +36 -0
- package/dist/lib/retry-hint.js.map +1 -0
- package/dist/lib/route-live.d.ts +29 -0
- package/dist/lib/route-live.d.ts.map +1 -0
- package/dist/lib/route-live.js +97 -0
- package/dist/lib/route-live.js.map +1 -0
- package/dist/lib/sampling-params.d.ts +183 -0
- package/dist/lib/sampling-params.d.ts.map +1 -0
- package/dist/lib/sampling-params.js +386 -0
- package/dist/lib/sampling-params.js.map +1 -0
- package/dist/lib/scheduler.d.ts +13 -0
- package/dist/lib/scheduler.d.ts.map +1 -0
- package/dist/lib/scheduler.js +11 -0
- package/dist/lib/scheduler.js.map +1 -0
- package/dist/lib/served-model.d.ts +16 -0
- package/dist/lib/served-model.d.ts.map +1 -0
- package/dist/lib/served-model.js +0 -0
- package/dist/lib/served-model.js.map +1 -0
- package/dist/lib/server-logs.d.ts +132 -0
- package/dist/lib/server-logs.d.ts.map +1 -0
- package/dist/lib/server-logs.js +473 -0
- package/dist/lib/server-logs.js.map +1 -0
- package/dist/lib/setup-code.d.ts +5 -0
- package/dist/lib/setup-code.d.ts.map +1 -0
- package/dist/lib/setup-code.js +35 -0
- package/dist/lib/setup-code.js.map +1 -0
- package/dist/lib/structured-output.d.ts +9 -0
- package/dist/lib/structured-output.d.ts.map +1 -0
- package/dist/lib/structured-output.js +72 -0
- package/dist/lib/structured-output.js.map +1 -0
- package/dist/lib/system-prompt.d.ts +30 -0
- package/dist/lib/system-prompt.d.ts.map +1 -0
- package/dist/lib/system-prompt.js +66 -0
- package/dist/lib/system-prompt.js.map +1 -0
- package/dist/lib/task-type.d.ts +18 -0
- package/dist/lib/task-type.d.ts.map +1 -0
- package/dist/lib/task-type.js +92 -0
- package/dist/lib/task-type.js.map +1 -0
- package/dist/lib/think-tags.d.ts +37 -0
- package/dist/lib/think-tags.d.ts.map +1 -0
- package/dist/lib/think-tags.js +203 -0
- package/dist/lib/think-tags.js.map +1 -0
- package/dist/lib/tool-args.d.ts +36 -0
- package/dist/lib/tool-args.d.ts.map +1 -0
- package/dist/lib/tool-args.js +190 -0
- package/dist/lib/tool-args.js.map +1 -0
- package/dist/lib/tool-call-rescue.d.ts +62 -0
- package/dist/lib/tool-call-rescue.d.ts.map +1 -0
- package/dist/lib/tool-call-rescue.js +258 -0
- package/dist/lib/tool-call-rescue.js.map +1 -0
- package/dist/lib/tool-capability.d.ts +13 -0
- package/dist/lib/tool-capability.d.ts.map +1 -0
- package/dist/lib/tool-capability.js +70 -0
- package/dist/lib/tool-capability.js.map +1 -0
- package/dist/lib/tool-validate.d.ts +44 -0
- package/dist/lib/tool-validate.d.ts.map +1 -0
- package/dist/lib/tool-validate.js +165 -0
- package/dist/lib/tool-validate.js.map +1 -0
- package/dist/lib/ttfb-budget.d.ts +13 -0
- package/dist/lib/ttfb-budget.d.ts.map +1 -0
- package/dist/lib/ttfb-budget.js +153 -0
- package/dist/lib/ttfb-budget.js.map +1 -0
- package/dist/lib/url-guard.d.ts +47 -0
- package/dist/lib/url-guard.d.ts.map +1 -0
- package/dist/lib/url-guard.js +229 -0
- package/dist/lib/url-guard.js.map +1 -0
- package/dist/lib/wake-detect.d.ts +12 -0
- package/dist/lib/wake-detect.d.ts.map +1 -0
- package/dist/lib/wake-detect.js +99 -0
- package/dist/lib/wake-detect.js.map +1 -0
- package/dist/middleware/errorHandler.d.ts +3 -0
- package/dist/middleware/errorHandler.d.ts.map +1 -0
- package/dist/middleware/errorHandler.js +45 -0
- package/dist/middleware/errorHandler.js.map +1 -0
- package/dist/middleware/rateLimit.d.ts +4 -0
- package/dist/middleware/rateLimit.d.ts.map +1 -0
- package/dist/middleware/rateLimit.js +125 -0
- package/dist/middleware/rateLimit.js.map +1 -0
- package/dist/middleware/requireAuth.d.ts +3 -0
- package/dist/middleware/requireAuth.d.ts.map +1 -0
- package/dist/middleware/requireAuth.js +17 -0
- package/dist/middleware/requireAuth.js.map +1 -0
- package/dist/providers/aclide.d.ts +18 -0
- package/dist/providers/aclide.d.ts.map +1 -0
- package/dist/providers/aclide.js +174 -0
- package/dist/providers/aclide.js.map +1 -0
- package/dist/providers/aihorde.d.ts +42 -0
- package/dist/providers/aihorde.d.ts.map +1 -0
- package/dist/providers/aihorde.js +192 -0
- package/dist/providers/aihorde.js.map +1 -0
- package/dist/providers/airforce.d.ts +11 -0
- package/dist/providers/airforce.d.ts.map +1 -0
- package/dist/providers/airforce.js +32 -0
- package/dist/providers/airforce.js.map +1 -0
- package/dist/providers/base.d.ts +177 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +354 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/blaze.d.ts +11 -0
- package/dist/providers/blaze.d.ts.map +1 -0
- package/dist/providers/blaze.js +33 -0
- package/dist/providers/blaze.js.map +1 -0
- package/dist/providers/blockrun.d.ts +14 -0
- package/dist/providers/blockrun.d.ts.map +1 -0
- package/dist/providers/blockrun.js +36 -0
- package/dist/providers/blockrun.js.map +1 -0
- package/dist/providers/clod.d.ts +11 -0
- package/dist/providers/clod.d.ts.map +1 -0
- package/dist/providers/clod.js +39 -0
- package/dist/providers/clod.js.map +1 -0
- package/dist/providers/cloudflare.d.ts +15 -0
- package/dist/providers/cloudflare.d.ts.map +1 -0
- package/dist/providers/cloudflare.js +175 -0
- package/dist/providers/cloudflare.js.map +1 -0
- package/dist/providers/cohere.d.ts +11 -0
- package/dist/providers/cohere.d.ts.map +1 -0
- package/dist/providers/cohere.js +117 -0
- package/dist/providers/cohere.js.map +1 -0
- package/dist/providers/dreamprompting.d.ts +11 -0
- package/dist/providers/dreamprompting.d.ts.map +1 -0
- package/dist/providers/dreamprompting.js +41 -0
- package/dist/providers/dreamprompting.js.map +1 -0
- package/dist/providers/electronhub.d.ts +10 -0
- package/dist/providers/electronhub.d.ts.map +1 -0
- package/dist/providers/electronhub.js +56 -0
- package/dist/providers/electronhub.js.map +1 -0
- package/dist/providers/experiential.d.ts +10 -0
- package/dist/providers/experiential.d.ts.map +1 -0
- package/dist/providers/experiential.js +33 -0
- package/dist/providers/experiential.js.map +1 -0
- package/dist/providers/gizmo.d.ts +15 -0
- package/dist/providers/gizmo.d.ts.map +1 -0
- package/dist/providers/gizmo.js +54 -0
- package/dist/providers/gizmo.js.map +1 -0
- package/dist/providers/google.d.ts +30 -0
- package/dist/providers/google.d.ts.map +1 -0
- package/dist/providers/google.js +766 -0
- package/dist/providers/google.js.map +1 -0
- package/dist/providers/index.d.ts +13 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +561 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/llmtr.d.ts +15 -0
- package/dist/providers/llmtr.d.ts.map +1 -0
- package/dist/providers/llmtr.js +51 -0
- package/dist/providers/llmtr.js.map +1 -0
- package/dist/providers/logfare.d.ts +11 -0
- package/dist/providers/logfare.d.ts.map +1 -0
- package/dist/providers/logfare.js +33 -0
- package/dist/providers/logfare.js.map +1 -0
- package/dist/providers/lucidity.d.ts +11 -0
- package/dist/providers/lucidity.d.ts.map +1 -0
- package/dist/providers/lucidity.js +37 -0
- package/dist/providers/lucidity.js.map +1 -0
- package/dist/providers/modelscope.d.ts +50 -0
- package/dist/providers/modelscope.d.ts.map +1 -0
- package/dist/providers/modelscope.js +143 -0
- package/dist/providers/modelscope.js.map +1 -0
- package/dist/providers/moondream.d.ts +17 -0
- package/dist/providers/moondream.d.ts.map +1 -0
- package/dist/providers/moondream.js +140 -0
- package/dist/providers/moondream.js.map +1 -0
- package/dist/providers/openai-compat.d.ts +140 -0
- package/dist/providers/openai-compat.d.ts.map +1 -0
- package/dist/providers/openai-compat.js +537 -0
- package/dist/providers/openai-compat.js.map +1 -0
- package/dist/providers/opencode-free.d.ts +24 -0
- package/dist/providers/opencode-free.d.ts.map +1 -0
- package/dist/providers/opencode-free.js +262 -0
- package/dist/providers/opencode-free.js.map +1 -0
- package/dist/providers/pollinations.d.ts +32 -0
- package/dist/providers/pollinations.d.ts.map +1 -0
- package/dist/providers/pollinations.js +65 -0
- package/dist/providers/pollinations.js.map +1 -0
- package/dist/providers/router9.d.ts +16 -0
- package/dist/providers/router9.d.ts.map +1 -0
- package/dist/providers/router9.js +42 -0
- package/dist/providers/router9.js.map +1 -0
- package/dist/providers/sail.d.ts +44 -0
- package/dist/providers/sail.d.ts.map +1 -0
- package/dist/providers/sail.js +302 -0
- package/dist/providers/sail.js.map +1 -0
- package/dist/providers/septor.d.ts +10 -0
- package/dist/providers/septor.d.ts.map +1 -0
- package/dist/providers/septor.js +36 -0
- package/dist/providers/septor.js.map +1 -0
- package/dist/providers/speechify.d.ts +14 -0
- package/dist/providers/speechify.d.ts.map +1 -0
- package/dist/providers/speechify.js +28 -0
- package/dist/providers/speechify.js.map +1 -0
- package/dist/providers/speka.d.ts +12 -0
- package/dist/providers/speka.d.ts.map +1 -0
- package/dist/providers/speka.js +37 -0
- package/dist/providers/speka.js.map +1 -0
- package/dist/providers/waterfall.d.ts +11 -0
- package/dist/providers/waterfall.d.ts.map +1 -0
- package/dist/providers/waterfall.js +33 -0
- package/dist/providers/waterfall.js.map +1 -0
- package/dist/providers/xkiro.d.ts +71 -0
- package/dist/providers/xkiro.d.ts.map +1 -0
- package/dist/providers/xkiro.js +119 -0
- package/dist/providers/xkiro.js.map +1 -0
- package/dist/providers/zhipu.d.ts +43 -0
- package/dist/providers/zhipu.d.ts.map +1 -0
- package/dist/providers/zhipu.js +95 -0
- package/dist/providers/zhipu.js.map +1 -0
- package/dist/routes/analytics.d.ts +2 -0
- package/dist/routes/analytics.d.ts.map +1 -0
- package/dist/routes/analytics.js +738 -0
- package/dist/routes/analytics.js.map +1 -0
- package/dist/routes/anthropic.d.ts +7 -0
- package/dist/routes/anthropic.d.ts.map +1 -0
- package/dist/routes/anthropic.js +1076 -0
- package/dist/routes/anthropic.js.map +1 -0
- package/dist/routes/auth.d.ts +2 -0
- package/dist/routes/auth.d.ts.map +1 -0
- package/dist/routes/auth.js +310 -0
- package/dist/routes/auth.js.map +1 -0
- package/dist/routes/backups.d.ts +2 -0
- package/dist/routes/backups.d.ts.map +1 -0
- package/dist/routes/backups.js +127 -0
- package/dist/routes/backups.js.map +1 -0
- package/dist/routes/cache.d.ts +2 -0
- package/dist/routes/cache.d.ts.map +1 -0
- package/dist/routes/cache.js +40 -0
- package/dist/routes/cache.js.map +1 -0
- package/dist/routes/client-profiles.d.ts +2 -0
- package/dist/routes/client-profiles.d.ts.map +1 -0
- package/dist/routes/client-profiles.js +128 -0
- package/dist/routes/client-profiles.js.map +1 -0
- package/dist/routes/compression.d.ts +2 -0
- package/dist/routes/compression.d.ts.map +1 -0
- package/dist/routes/compression.js +82 -0
- package/dist/routes/compression.js.map +1 -0
- package/dist/routes/conversations.d.ts +3 -0
- package/dist/routes/conversations.d.ts.map +1 -0
- package/dist/routes/conversations.js +215 -0
- package/dist/routes/conversations.js.map +1 -0
- package/dist/routes/docs.d.ts +2 -0
- package/dist/routes/docs.d.ts.map +1 -0
- package/dist/routes/docs.js +21 -0
- package/dist/routes/docs.js.map +1 -0
- package/dist/routes/embeddings.d.ts +2 -0
- package/dist/routes/embeddings.d.ts.map +1 -0
- package/dist/routes/embeddings.js +255 -0
- package/dist/routes/embeddings.js.map +1 -0
- package/dist/routes/fallback.d.ts +2 -0
- package/dist/routes/fallback.d.ts.map +1 -0
- package/dist/routes/fallback.js +631 -0
- package/dist/routes/fallback.js.map +1 -0
- package/dist/routes/free-tier.d.ts +22 -0
- package/dist/routes/free-tier.d.ts.map +1 -0
- package/dist/routes/free-tier.js +175 -0
- package/dist/routes/free-tier.js.map +1 -0
- package/dist/routes/gemini.d.ts +2 -0
- package/dist/routes/gemini.d.ts.map +1 -0
- package/dist/routes/gemini.js +218 -0
- package/dist/routes/gemini.js.map +1 -0
- package/dist/routes/health.d.ts +2 -0
- package/dist/routes/health.d.ts.map +1 -0
- package/dist/routes/health.js +72 -0
- package/dist/routes/health.js.map +1 -0
- package/dist/routes/keys.d.ts +17 -0
- package/dist/routes/keys.d.ts.map +1 -0
- package/dist/routes/keys.js +1787 -0
- package/dist/routes/keys.js.map +1 -0
- package/dist/routes/logs.d.ts +2 -0
- package/dist/routes/logs.d.ts.map +1 -0
- package/dist/routes/logs.js +88 -0
- package/dist/routes/logs.js.map +1 -0
- package/dist/routes/mcp.d.ts +4 -0
- package/dist/routes/mcp.d.ts.map +1 -0
- package/dist/routes/mcp.js +563 -0
- package/dist/routes/mcp.js.map +1 -0
- package/dist/routes/media.d.ts +2 -0
- package/dist/routes/media.d.ts.map +1 -0
- package/dist/routes/media.js +180 -0
- package/dist/routes/media.js.map +1 -0
- package/dist/routes/models.d.ts +2 -0
- package/dist/routes/models.d.ts.map +1 -0
- package/dist/routes/models.js +439 -0
- package/dist/routes/models.js.map +1 -0
- package/dist/routes/ollama.d.ts +7 -0
- package/dist/routes/ollama.d.ts.map +1 -0
- package/dist/routes/ollama.js +595 -0
- package/dist/routes/ollama.js.map +1 -0
- package/dist/routes/profiles.d.ts +3 -0
- package/dist/routes/profiles.d.ts.map +1 -0
- package/dist/routes/profiles.js +431 -0
- package/dist/routes/profiles.js.map +1 -0
- package/dist/routes/proxy.d.ts +32 -0
- package/dist/routes/proxy.d.ts.map +1 -0
- package/dist/routes/proxy.js +2793 -0
- package/dist/routes/proxy.js.map +1 -0
- package/dist/routes/responses.d.ts +1161 -0
- package/dist/routes/responses.d.ts.map +1 -0
- package/dist/routes/responses.js +1521 -0
- package/dist/routes/responses.js.map +1 -0
- package/dist/routes/settings.d.ts +2 -0
- package/dist/routes/settings.d.ts.map +1 -0
- package/dist/routes/settings.js +549 -0
- package/dist/routes/settings.js.map +1 -0
- package/dist/routes/status.d.ts +3 -0
- package/dist/routes/status.d.ts.map +1 -0
- package/dist/routes/status.js +214 -0
- package/dist/routes/status.js.map +1 -0
- package/dist/routes/update.d.ts +31 -0
- package/dist/routes/update.d.ts.map +1 -0
- package/dist/routes/update.js +536 -0
- package/dist/routes/update.js.map +1 -0
- package/dist/routes/url-tokens.d.ts +2 -0
- package/dist/routes/url-tokens.d.ts.map +1 -0
- package/dist/routes/url-tokens.js +31 -0
- package/dist/routes/url-tokens.js.map +1 -0
- package/dist/scripts/export-catalog.d.ts +2 -0
- package/dist/scripts/export-catalog.d.ts.map +1 -0
- package/dist/scripts/export-catalog.js +114 -0
- package/dist/scripts/export-catalog.js.map +1 -0
- package/dist/scripts/rotate-encryption-key.d.ts +81 -0
- package/dist/scripts/rotate-encryption-key.d.ts.map +1 -0
- package/dist/scripts/rotate-encryption-key.js +232 -0
- package/dist/scripts/rotate-encryption-key.js.map +1 -0
- package/dist/scripts/routing-sim.d.ts +2 -0
- package/dist/scripts/routing-sim.d.ts.map +1 -0
- package/dist/scripts/routing-sim.js +130 -0
- package/dist/scripts/routing-sim.js.map +1 -0
- package/dist/scripts/test-all-models.d.ts +2 -0
- package/dist/scripts/test-all-models.d.ts.map +1 -0
- package/dist/scripts/test-all-models.js +56 -0
- package/dist/scripts/test-all-models.js.map +1 -0
- package/dist/services/anthropic-map.d.ts +39 -0
- package/dist/services/anthropic-map.d.ts.map +1 -0
- package/dist/services/anthropic-map.js +138 -0
- package/dist/services/anthropic-map.js.map +1 -0
- package/dist/services/auth.d.ts +30 -0
- package/dist/services/auth.d.ts.map +1 -0
- package/dist/services/auth.js +124 -0
- package/dist/services/auth.js.map +1 -0
- package/dist/services/auto-discover.d.ts +77 -0
- package/dist/services/auto-discover.d.ts.map +1 -0
- package/dist/services/auto-discover.js +1047 -0
- package/dist/services/auto-discover.js.map +1 -0
- package/dist/services/backups.d.ts +67 -0
- package/dist/services/backups.d.ts.map +1 -0
- package/dist/services/backups.js +444 -0
- package/dist/services/backups.js.map +1 -0
- package/dist/services/builtin-model-discovery.d.ts +107 -0
- package/dist/services/builtin-model-discovery.d.ts.map +1 -0
- package/dist/services/builtin-model-discovery.js +296 -0
- package/dist/services/builtin-model-discovery.js.map +1 -0
- package/dist/services/cache.d.ts +190 -0
- package/dist/services/cache.d.ts.map +1 -0
- package/dist/services/cache.js +617 -0
- package/dist/services/cache.js.map +1 -0
- package/dist/services/catalog-sync.d.ts +257 -0
- package/dist/services/catalog-sync.d.ts.map +1 -0
- package/dist/services/catalog-sync.js +1041 -0
- package/dist/services/catalog-sync.js.map +1 -0
- package/dist/services/compression/config.d.ts +33 -0
- package/dist/services/compression/config.d.ts.map +1 -0
- package/dist/services/compression/config.js +158 -0
- package/dist/services/compression/config.js.map +1 -0
- package/dist/services/compression/engines/aging.d.ts +2 -0
- package/dist/services/compression/engines/aging.d.ts.map +1 -0
- package/dist/services/compression/engines/aging.js +53 -0
- package/dist/services/compression/engines/aging.js.map +1 -0
- package/dist/services/compression/engines/custom-filters.d.ts +4 -0
- package/dist/services/compression/engines/custom-filters.d.ts.map +1 -0
- package/dist/services/compression/engines/custom-filters.js +49 -0
- package/dist/services/compression/engines/custom-filters.js.map +1 -0
- package/dist/services/compression/engines/dedup.d.ts +2 -0
- package/dist/services/compression/engines/dedup.d.ts.map +1 -0
- package/dist/services/compression/engines/dedup.js +61 -0
- package/dist/services/compression/engines/dedup.js.map +1 -0
- package/dist/services/compression/engines/filter-definitions.d.ts +75 -0
- package/dist/services/compression/engines/filter-definitions.d.ts.map +1 -0
- package/dist/services/compression/engines/filter-definitions.js +45 -0
- package/dist/services/compression/engines/filter-definitions.js.map +1 -0
- package/dist/services/compression/engines/hard-budget.d.ts +2 -0
- package/dist/services/compression/engines/hard-budget.d.ts.map +1 -0
- package/dist/services/compression/engines/hard-budget.js +52 -0
- package/dist/services/compression/engines/hard-budget.js.map +1 -0
- package/dist/services/compression/engines/index.d.ts +9 -0
- package/dist/services/compression/engines/index.d.ts.map +1 -0
- package/dist/services/compression/engines/index.js +9 -0
- package/dist/services/compression/engines/index.js.map +1 -0
- package/dist/services/compression/engines/jsoncompact.d.ts +3 -0
- package/dist/services/compression/engines/jsoncompact.d.ts.map +1 -0
- package/dist/services/compression/engines/jsoncompact.js +145 -0
- package/dist/services/compression/engines/jsoncompact.js.map +1 -0
- package/dist/services/compression/engines/lite.d.ts +2 -0
- package/dist/services/compression/engines/lite.d.ts.map +1 -0
- package/dist/services/compression/engines/lite.js +34 -0
- package/dist/services/compression/engines/lite.js.map +1 -0
- package/dist/services/compression/engines/read-lifecycle.d.ts +2 -0
- package/dist/services/compression/engines/read-lifecycle.d.ts.map +1 -0
- package/dist/services/compression/engines/read-lifecycle.js +70 -0
- package/dist/services/compression/engines/read-lifecycle.js.map +1 -0
- package/dist/services/compression/engines/relevance.d.ts +2 -0
- package/dist/services/compression/engines/relevance.d.ts.map +1 -0
- package/dist/services/compression/engines/relevance.js +74 -0
- package/dist/services/compression/engines/relevance.js.map +1 -0
- package/dist/services/compression/engines/toolfilter.d.ts +2 -0
- package/dist/services/compression/engines/toolfilter.d.ts.map +1 -0
- package/dist/services/compression/engines/toolfilter.js +195 -0
- package/dist/services/compression/engines/toolfilter.js.map +1 -0
- package/dist/services/compression/fidelity-gate.d.ts +12 -0
- package/dist/services/compression/fidelity-gate.d.ts.map +1 -0
- package/dist/services/compression/fidelity-gate.js +90 -0
- package/dist/services/compression/fidelity-gate.js.map +1 -0
- package/dist/services/compression/helpers.d.ts +9 -0
- package/dist/services/compression/helpers.d.ts.map +1 -0
- package/dist/services/compression/helpers.js +52 -0
- package/dist/services/compression/helpers.js.map +1 -0
- package/dist/services/compression/pipeline.d.ts +7 -0
- package/dist/services/compression/pipeline.d.ts.map +1 -0
- package/dist/services/compression/pipeline.js +245 -0
- package/dist/services/compression/pipeline.js.map +1 -0
- package/dist/services/compression/preservation.d.ts +27 -0
- package/dist/services/compression/preservation.d.ts.map +1 -0
- package/dist/services/compression/preservation.js +109 -0
- package/dist/services/compression/preservation.js.map +1 -0
- package/dist/services/compression/registry.d.ts +6 -0
- package/dist/services/compression/registry.d.ts.map +1 -0
- package/dist/services/compression/registry.js +16 -0
- package/dist/services/compression/registry.js.map +1 -0
- package/dist/services/compression/stats.d.ts +29 -0
- package/dist/services/compression/stats.d.ts.map +1 -0
- package/dist/services/compression/stats.js +55 -0
- package/dist/services/compression/stats.js.map +1 -0
- package/dist/services/compression/types.d.ts +90 -0
- package/dist/services/compression/types.d.ts.map +1 -0
- package/dist/services/compression/types.js +2 -0
- package/dist/services/compression/types.js.map +1 -0
- package/dist/services/context-handoff.d.ts +22 -0
- package/dist/services/context-handoff.d.ts.map +1 -0
- package/dist/services/context-handoff.js +164 -0
- package/dist/services/context-handoff.js.map +1 -0
- package/dist/services/cooldown-probe.d.ts +24 -0
- package/dist/services/cooldown-probe.d.ts.map +1 -0
- package/dist/services/cooldown-probe.js +181 -0
- package/dist/services/cooldown-probe.js.map +1 -0
- package/dist/services/custom-endpoint.d.ts +58 -0
- package/dist/services/custom-endpoint.d.ts.map +1 -0
- package/dist/services/custom-endpoint.js +167 -0
- package/dist/services/custom-endpoint.js.map +1 -0
- package/dist/services/custom-media-register.d.ts +22 -0
- package/dist/services/custom-media-register.d.ts.map +1 -0
- package/dist/services/custom-media-register.js +45 -0
- package/dist/services/custom-media-register.js.map +1 -0
- package/dist/services/custom-model-register.d.ts +50 -0
- package/dist/services/custom-model-register.d.ts.map +1 -0
- package/dist/services/custom-model-register.js +103 -0
- package/dist/services/custom-model-register.js.map +1 -0
- package/dist/services/custom-model-seed.d.ts +18 -0
- package/dist/services/custom-model-seed.d.ts.map +1 -0
- package/dist/services/custom-model-seed.js +42 -0
- package/dist/services/custom-model-seed.js.map +1 -0
- package/dist/services/custom-model-sync.d.ts +37 -0
- package/dist/services/custom-model-sync.d.ts.map +1 -0
- package/dist/services/custom-model-sync.js +118 -0
- package/dist/services/custom-model-sync.js.map +1 -0
- package/dist/services/custom-model-tombstone.d.ts +5 -0
- package/dist/services/custom-model-tombstone.d.ts.map +1 -0
- package/dist/services/custom-model-tombstone.js +30 -0
- package/dist/services/custom-model-tombstone.js.map +1 -0
- package/dist/services/declarative-config.d.ts +356 -0
- package/dist/services/declarative-config.d.ts.map +1 -0
- package/dist/services/declarative-config.js +427 -0
- package/dist/services/declarative-config.js.map +1 -0
- package/dist/services/degradation.d.ts +40 -0
- package/dist/services/degradation.d.ts.map +1 -0
- package/dist/services/degradation.js +119 -0
- package/dist/services/degradation.js.map +1 -0
- package/dist/services/embeddings.d.ts +76 -0
- package/dist/services/embeddings.d.ts.map +1 -0
- package/dist/services/embeddings.js +319 -0
- package/dist/services/embeddings.js.map +1 -0
- package/dist/services/fusion.d.ts +162 -0
- package/dist/services/fusion.d.ts.map +1 -0
- package/dist/services/fusion.js +789 -0
- package/dist/services/fusion.js.map +1 -0
- package/dist/services/gemini-map.d.ts +14 -0
- package/dist/services/gemini-map.d.ts.map +1 -0
- package/dist/services/gemini-map.js +78 -0
- package/dist/services/gemini-map.js.map +1 -0
- package/dist/services/health.d.ts +52 -0
- package/dist/services/health.d.ts.map +1 -0
- package/dist/services/health.js +352 -0
- package/dist/services/health.js.map +1 -0
- package/dist/services/idempotency.d.ts +49 -0
- package/dist/services/idempotency.d.ts.map +1 -0
- package/dist/services/idempotency.js +140 -0
- package/dist/services/idempotency.js.map +1 -0
- package/dist/services/key-budget.d.ts +74 -0
- package/dist/services/key-budget.d.ts.map +1 -0
- package/dist/services/key-budget.js +200 -0
- package/dist/services/key-budget.js.map +1 -0
- package/dist/services/media.d.ts +123 -0
- package/dist/services/media.d.ts.map +1 -0
- package/dist/services/media.js +954 -0
- package/dist/services/media.js.map +1 -0
- package/dist/services/model-discovery.d.ts +126 -0
- package/dist/services/model-discovery.d.ts.map +1 -0
- package/dist/services/model-discovery.js +662 -0
- package/dist/services/model-discovery.js.map +1 -0
- package/dist/services/model-groups.d.ts +149 -0
- package/dist/services/model-groups.d.ts.map +1 -0
- package/dist/services/model-groups.js +314 -0
- package/dist/services/model-groups.js.map +1 -0
- package/dist/services/model-listing.d.ts +18 -0
- package/dist/services/model-listing.d.ts.map +1 -0
- package/dist/services/model-listing.js +94 -0
- package/dist/services/model-listing.js.map +1 -0
- package/dist/services/model-retirement.d.ts +29 -0
- package/dist/services/model-retirement.d.ts.map +1 -0
- package/dist/services/model-retirement.js +86 -0
- package/dist/services/model-retirement.js.map +1 -0
- package/dist/services/model-state.d.ts +90 -0
- package/dist/services/model-state.d.ts.map +1 -0
- package/dist/services/model-state.js +342 -0
- package/dist/services/model-state.js.map +1 -0
- package/dist/services/model-weight-overrides.d.ts +48 -0
- package/dist/services/model-weight-overrides.d.ts.map +1 -0
- package/dist/services/model-weight-overrides.js +127 -0
- package/dist/services/model-weight-overrides.js.map +1 -0
- package/dist/services/notification-emitter.d.ts +50 -0
- package/dist/services/notification-emitter.d.ts.map +1 -0
- package/dist/services/notification-emitter.js +177 -0
- package/dist/services/notification-emitter.js.map +1 -0
- package/dist/services/opencode-free-sync.d.ts +29 -0
- package/dist/services/opencode-free-sync.d.ts.map +1 -0
- package/dist/services/opencode-free-sync.js +206 -0
- package/dist/services/opencode-free-sync.js.map +1 -0
- package/dist/services/penalty-inspector.d.ts +56 -0
- package/dist/services/penalty-inspector.d.ts.map +1 -0
- package/dist/services/penalty-inspector.js +167 -0
- package/dist/services/penalty-inspector.js.map +1 -0
- package/dist/services/profile-models.d.ts +5 -0
- package/dist/services/profile-models.d.ts.map +1 -0
- package/dist/services/profile-models.js +62 -0
- package/dist/services/profile-models.js.map +1 -0
- package/dist/services/provider-credential.d.ts +19 -0
- package/dist/services/provider-credential.d.ts.map +1 -0
- package/dist/services/provider-credential.js +51 -0
- package/dist/services/provider-credential.js.map +1 -0
- package/dist/services/provider-quota.d.ts +64 -0
- package/dist/services/provider-quota.d.ts.map +1 -0
- package/dist/services/provider-quota.js +563 -0
- package/dist/services/provider-quota.js.map +1 -0
- package/dist/services/quirks.d.ts +0 -0
- package/dist/services/quirks.d.ts.map +1 -0
- package/dist/services/quirks.js +0 -0
- package/dist/services/quirks.js.map +1 -0
- package/dist/services/quota-forecast.d.ts +50 -0
- package/dist/services/quota-forecast.d.ts.map +1 -0
- package/dist/services/quota-forecast.js +150 -0
- package/dist/services/quota-forecast.js.map +1 -0
- package/dist/services/quota-outlook.d.ts +4 -0
- package/dist/services/quota-outlook.d.ts.map +1 -0
- package/dist/services/quota-outlook.js +92 -0
- package/dist/services/quota-outlook.js.map +1 -0
- package/dist/services/ratelimit.d.ts +249 -0
- package/dist/services/ratelimit.d.ts.map +1 -0
- package/dist/services/ratelimit.js +1182 -0
- package/dist/services/ratelimit.js.map +1 -0
- package/dist/services/request-retention.d.ts +60 -0
- package/dist/services/request-retention.d.ts.map +1 -0
- package/dist/services/request-retention.js +229 -0
- package/dist/services/request-retention.js.map +1 -0
- package/dist/services/router.d.ts +384 -0
- package/dist/services/router.d.ts.map +1 -0
- package/dist/services/router.js +1986 -0
- package/dist/services/router.js.map +1 -0
- package/dist/services/scoring.d.ts +156 -0
- package/dist/services/scoring.d.ts.map +1 -0
- package/dist/services/scoring.js +435 -0
- package/dist/services/scoring.js.map +1 -0
- package/dist/services/url-tokens.d.ts +15 -0
- package/dist/services/url-tokens.d.ts.map +1 -0
- package/dist/services/url-tokens.js +55 -0
- package/dist/services/url-tokens.js.map +1 -0
- package/package.json +77 -4
- package/README.md +0 -3
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { createOneTimeCode } from './one-time-code.js';
|
|
2
|
+
// One-time first-run setup code.
|
|
3
|
+
//
|
|
4
|
+
// POST /api/auth/setup creates the first admin account while there are zero
|
|
5
|
+
// users. The server binds all interfaces by default, so an exposed fresh
|
|
6
|
+
// install could be claimed by whoever reaches it first. To gate that without
|
|
7
|
+
// hurting the local/desktop first-run experience, we mint a random code at boot
|
|
8
|
+
// when the dashboard is unclaimed and log it. A browser on the same machine
|
|
9
|
+
// (a loopback socket) never needs the code; a request from any other address
|
|
10
|
+
// must present it. The code is regenerated once per boot and cleared as soon as
|
|
11
|
+
// an account exists.
|
|
12
|
+
const _code = createOneTimeCode();
|
|
13
|
+
// Mint a fresh code and log it prominently. Call once at boot when there are
|
|
14
|
+
// zero accounts. Returns the code (handy for tests).
|
|
15
|
+
export function generateSetupCode() {
|
|
16
|
+
const code = _code.generate();
|
|
17
|
+
console.log('');
|
|
18
|
+
console.log(' First-run setup code: ' + code);
|
|
19
|
+
console.log(' A browser on this machine can finish setup without it. From any');
|
|
20
|
+
console.log(' other device, enter this code to create the first account.');
|
|
21
|
+
console.log('');
|
|
22
|
+
return code;
|
|
23
|
+
}
|
|
24
|
+
export function getSetupCode() {
|
|
25
|
+
return _code.get();
|
|
26
|
+
}
|
|
27
|
+
export function clearSetupCode() {
|
|
28
|
+
_code.clear();
|
|
29
|
+
}
|
|
30
|
+
// Constant-time comparison against the active code. Returns false when no code
|
|
31
|
+
// is active or the input is not a matching string.
|
|
32
|
+
export function setupCodeMatches(provided) {
|
|
33
|
+
return _code.matches(provided);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=setup-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup-code.js","sourceRoot":"","sources":["../../src/lib/setup-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,iCAAiC;AACjC,EAAE;AACF,4EAA4E;AAC5E,yEAAyE;AACzE,6EAA6E;AAC7E,gFAAgF;AAChF,4EAA4E;AAC5E,6EAA6E;AAC7E,gFAAgF;AAChF,qBAAqB;AAErB,MAAM,KAAK,GAAG,iBAAiB,EAAE,CAAC;AAElC,6EAA6E;AAC7E,qDAAqD;AACrD,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,0BAA0B,GAAG,IAAI,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,KAAK,CAAC,GAAG,EAAE,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,KAAK,CAAC,KAAK,EAAE,CAAC;AAChB,CAAC;AAED,+EAA+E;AAC/E,mDAAmD;AACnD,MAAM,UAAU,gBAAgB,CAAC,QAAiB;IAChD,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured-output.d.ts","sourceRoot":"","sources":["../../src/lib/structured-output.ts"],"names":[],"mappings":"AAsBA,MAAM,MAAM,eAAe,GACvB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAC9C;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,CAAC;AAiClB,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAmBnE"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// Structured-output enforcement for the fallback chain (#514 follow-up).
|
|
2
|
+
//
|
|
3
|
+
// Forwarding response_format is necessary but not sufficient: a free-tier
|
|
4
|
+
// model that doesn't understand JSON mode often just answers in prose (or
|
|
5
|
+
// wraps the JSON in a markdown fence) and the request LOOKS successful — the
|
|
6
|
+
// worst failure mode, because the client asked for machine-readable output
|
|
7
|
+
// and got an essay. On non-streaming responses the gateway can check, heal,
|
|
8
|
+
// or fail over:
|
|
9
|
+
//
|
|
10
|
+
// 1. content parses as JSON → pass through untouched
|
|
11
|
+
// 2. content wraps JSON in ```fences``` or leading/trailing prose
|
|
12
|
+
// → heal: replace content with the JSON
|
|
13
|
+
// 3. nothing parseable → retryable failure (skipBench: the
|
|
14
|
+
// provider is healthy, the MODEL ignored the format — no cooldown, no
|
|
15
|
+
// penalty; the chain just tries the next candidate)
|
|
16
|
+
//
|
|
17
|
+
// Streaming responses used to skip enforcement entirely (bytes already on
|
|
18
|
+
// the wire). Since #933 the proxy's stream path buffers structured-output
|
|
19
|
+
// requests in a 'json' hold mode — headers are held until the stream ends,
|
|
20
|
+
// so the same check/heal/fail-over applies there too. The response cache
|
|
21
|
+
// remains non-stream only.
|
|
22
|
+
/** Match a fenced code block (```json ... ``` or bare ``` ... ```). */
|
|
23
|
+
const FENCE_RE = /```(?:json)?\s*\n?([\s\S]*?)```/i;
|
|
24
|
+
function parses(text) {
|
|
25
|
+
try {
|
|
26
|
+
JSON.parse(text);
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Candidate slices from the first '{' to the last '}' and from the first '['
|
|
35
|
+
* to the last ']', longest first. Both bracket types must be tried
|
|
36
|
+
* independently: picking whichever opener appears FIRST turned
|
|
37
|
+
* `According to [1], here is the JSON: {"city":"Paris"}` into the citation
|
|
38
|
+
* marker `[1]` — a valid parse of the wrong value, silently delivered as the
|
|
39
|
+
* structured output. Longest-first means an incidental bracket token in prose
|
|
40
|
+
* can never shadow the real payload next to it.
|
|
41
|
+
*/
|
|
42
|
+
function candidateJsonSlices(text) {
|
|
43
|
+
const out = [];
|
|
44
|
+
for (const [open, close] of [['{', '}'], ['[', ']']]) {
|
|
45
|
+
const first = text.indexOf(open);
|
|
46
|
+
const last = text.lastIndexOf(close);
|
|
47
|
+
if (first !== -1 && last > first)
|
|
48
|
+
out.push(text.slice(first, last + 1));
|
|
49
|
+
}
|
|
50
|
+
return out.sort((a, b) => b.length - a.length);
|
|
51
|
+
}
|
|
52
|
+
export function enforceJsonContent(content) {
|
|
53
|
+
const trimmed = content.trim();
|
|
54
|
+
if (trimmed.length === 0)
|
|
55
|
+
return { ok: false };
|
|
56
|
+
if (parses(trimmed))
|
|
57
|
+
return { ok: true, content: trimmed === content ? content : trimmed, healed: trimmed !== content };
|
|
58
|
+
// Fenced block: the most common "almost right" shape free models produce.
|
|
59
|
+
const fence = FENCE_RE.exec(trimmed);
|
|
60
|
+
if (fence) {
|
|
61
|
+
const inner = fence[1].trim();
|
|
62
|
+
if (parses(inner))
|
|
63
|
+
return { ok: true, content: inner, healed: true };
|
|
64
|
+
}
|
|
65
|
+
// Leading/trailing prose around one JSON value ("Here is your JSON: {...}").
|
|
66
|
+
for (const slice of candidateJsonSlices(trimmed)) {
|
|
67
|
+
if (parses(slice))
|
|
68
|
+
return { ok: true, content: slice, healed: true };
|
|
69
|
+
}
|
|
70
|
+
return { ok: false };
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=structured-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured-output.js","sourceRoot":"","sources":["../../src/lib/structured-output.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,EAAE;AACF,0EAA0E;AAC1E,0EAA0E;AAC1E,6EAA6E;AAC7E,2EAA2E;AAC3E,4EAA4E;AAC5E,gBAAgB;AAChB,EAAE;AACF,kEAAkE;AAClE,oEAAoE;AACpE,+EAA+E;AAC/E,6EAA6E;AAC7E,2EAA2E;AAC3E,yDAAyD;AACzD,EAAE;AACF,0EAA0E;AAC1E,0EAA0E;AAC1E,2EAA2E;AAC3E,yEAAyE;AACzE,2BAA2B;AAM3B,uEAAuE;AACvE,MAAM,QAAQ,GAAG,kCAAkC,CAAC;AAEpD,SAAS,MAAM,CAAC,IAAY;IAC1B,IAAI,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,mBAAmB,CAAC,IAAY;IACvC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAU,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,IAAI,GAAG,KAAK;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IAE/C,IAAI,MAAM,CAAC,OAAO,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,KAAK,OAAO,EAAE,CAAC;IAExH,0EAA0E;IAC1E,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACvE,CAAC;IAED,6EAA6E;IAC7E,KAAK,MAAM,KAAK,IAAI,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,IAAI,MAAM,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACvE,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ChatMessage } from '@srouter/shared/types.js';
|
|
2
|
+
export declare const CLIENT_PROFILE_KEY_PREFIX = "sk-cp-";
|
|
3
|
+
export declare function timingSafeStringEqual(provided: string, expected: string): boolean;
|
|
4
|
+
export declare function mintClientProfileKey(): string;
|
|
5
|
+
export declare function hashClientProfileKey(key: string): string;
|
|
6
|
+
export type ResolvedAuth = {
|
|
7
|
+
kind: 'unified';
|
|
8
|
+
systemPrompt: null;
|
|
9
|
+
} | {
|
|
10
|
+
kind: 'profile';
|
|
11
|
+
profileId: number;
|
|
12
|
+
name: string;
|
|
13
|
+
systemPrompt: string | null;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Resolve an inference credential. The unified key maps to today's behavior
|
|
17
|
+
* (no enforced prompt); a client-profile key carries its own prompt; a
|
|
18
|
+
* disabled profile is rejected exactly like an unknown key so a revoked
|
|
19
|
+
* client can't distinguish "disabled" from "deleted".
|
|
20
|
+
*/
|
|
21
|
+
export declare function resolveAuth(token: string | undefined): ResolvedAuth | null;
|
|
22
|
+
/**
|
|
23
|
+
* Prepend the server-enforced system prompt. It goes FIRST, ahead of any
|
|
24
|
+
* caller-supplied system message, so the enforced instructions take priority
|
|
25
|
+
* while the caller's own system message is preserved after it — the caller
|
|
26
|
+
* can add context but cannot override or remove the profile's prompt.
|
|
27
|
+
* An empty/null prompt is a neutral passthrough: nothing is injected.
|
|
28
|
+
*/
|
|
29
|
+
export declare function prependSystemPrompt(messages: ChatMessage[], prompt: string | null | undefined): ChatMessage[];
|
|
30
|
+
//# sourceMappingURL=system-prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../src/lib/system-prompt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAS5D,eAAO,MAAM,yBAAyB,WAAW,CAAC;AAKlD,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CASjF;AAED,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAMD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,YAAY,EAAE,IAAI,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAStF;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,YAAY,GAAG,IAAI,CAc1E;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,EAAE,CAG7G"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import crypto from 'crypto';
|
|
2
|
+
import { getDb, getUnifiedApiKey } from '../db/index.js';
|
|
3
|
+
// Per-client API keys with server-enforced system prompts (#411). A client
|
|
4
|
+
// profile is a second kind of inference credential: it authenticates ONLY the
|
|
5
|
+
// /v1 inference surface (proxy + responses), never the /api dashboard routes —
|
|
6
|
+
// those require a dashboard session (middleware/requireAuth). The unified key
|
|
7
|
+
// keeps today's behavior exactly: full inference access, no injected prompt.
|
|
8
|
+
export const CLIENT_PROFILE_KEY_PREFIX = 'sk-cp-';
|
|
9
|
+
// Constant-time string comparison for inference credentials. Plain `===` leaks
|
|
10
|
+
// length and per-character timing, which a network attacker could in principle
|
|
11
|
+
// use to recover the key one byte at a time.
|
|
12
|
+
export function timingSafeStringEqual(provided, expected) {
|
|
13
|
+
// Use HMAC to produce fixed-length digests so timingSafeEqual always
|
|
14
|
+
// receives same-length buffers regardless of input length. This eliminates
|
|
15
|
+
// both the per-character timing leak and the length-branch timing leak that
|
|
16
|
+
// the Buffer.alloc-on-mismatch approach had.
|
|
17
|
+
const key = Buffer.alloc(32);
|
|
18
|
+
const a = crypto.createHmac('sha256', key).update(provided).digest();
|
|
19
|
+
const b = crypto.createHmac('sha256', key).update(expected).digest();
|
|
20
|
+
return crypto.timingSafeEqual(a, b);
|
|
21
|
+
}
|
|
22
|
+
export function mintClientProfileKey() {
|
|
23
|
+
return `${CLIENT_PROFILE_KEY_PREFIX}${crypto.randomBytes(24).toString('hex')}`;
|
|
24
|
+
}
|
|
25
|
+
// Profile keys are stored and looked up by SHA-256 digest, so the DB never
|
|
26
|
+
// holds the plaintext for auth purposes (the encrypted copy exists only for
|
|
27
|
+
// masked display in the dashboard). The digest also makes the indexed lookup
|
|
28
|
+
// timing-independent of the secret's bytes.
|
|
29
|
+
export function hashClientProfileKey(key) {
|
|
30
|
+
return crypto.createHash('sha256').update(key).digest('hex');
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Resolve an inference credential. The unified key maps to today's behavior
|
|
34
|
+
* (no enforced prompt); a client-profile key carries its own prompt; a
|
|
35
|
+
* disabled profile is rejected exactly like an unknown key so a revoked
|
|
36
|
+
* client can't distinguish "disabled" from "deleted".
|
|
37
|
+
*/
|
|
38
|
+
export function resolveAuth(token) {
|
|
39
|
+
if (!token)
|
|
40
|
+
return null;
|
|
41
|
+
if (timingSafeStringEqual(token, getUnifiedApiKey())) {
|
|
42
|
+
return { kind: 'unified', systemPrompt: null };
|
|
43
|
+
}
|
|
44
|
+
if (!token.startsWith(CLIENT_PROFILE_KEY_PREFIX))
|
|
45
|
+
return null;
|
|
46
|
+
const row = getDb().prepare('SELECT id, name, system_prompt, enabled FROM client_profiles WHERE token_hash = ?').get(hashClientProfileKey(token));
|
|
47
|
+
if (!row || !row.enabled)
|
|
48
|
+
return null;
|
|
49
|
+
const prompt = row.system_prompt != null && row.system_prompt.trim().length > 0
|
|
50
|
+
? row.system_prompt
|
|
51
|
+
: null;
|
|
52
|
+
return { kind: 'profile', profileId: row.id, name: row.name, systemPrompt: prompt };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Prepend the server-enforced system prompt. It goes FIRST, ahead of any
|
|
56
|
+
* caller-supplied system message, so the enforced instructions take priority
|
|
57
|
+
* while the caller's own system message is preserved after it — the caller
|
|
58
|
+
* can add context but cannot override or remove the profile's prompt.
|
|
59
|
+
* An empty/null prompt is a neutral passthrough: nothing is injected.
|
|
60
|
+
*/
|
|
61
|
+
export function prependSystemPrompt(messages, prompt) {
|
|
62
|
+
if (prompt == null || prompt.trim().length === 0)
|
|
63
|
+
return messages;
|
|
64
|
+
return [{ role: 'system', content: prompt }, ...messages];
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=system-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system-prompt.js","sourceRoot":"","sources":["../../src/lib/system-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,2EAA2E;AAC3E,8EAA8E;AAC9E,+EAA+E;AAC/E,8EAA8E;AAC9E,6EAA6E;AAE7E,MAAM,CAAC,MAAM,yBAAyB,GAAG,QAAQ,CAAC;AAElD,+EAA+E;AAC/E,+EAA+E;AAC/E,6CAA6C;AAC7C,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,QAAgB;IACtE,qEAAqE;IACrE,2EAA2E;IAC3E,4EAA4E;IAC5E,6CAA6C;IAC7C,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7B,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;IACrE,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;IACrE,OAAO,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,GAAG,yBAAyB,GAAG,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AACjF,CAAC;AAED,2EAA2E;AAC3E,4EAA4E;AAC5E,6EAA6E;AAC7E,4CAA4C;AAC5C,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC;AAaD;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,KAAyB;IACnD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,IAAI,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,EAAE,CAAC,EAAE,CAAC;QACrD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;IACjD,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,yBAAyB,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9D,MAAM,GAAG,GAAG,KAAK,EAAE,CAAC,OAAO,CACzB,mFAAmF,CACpF,CAAC,GAAG,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAA2B,CAAC;IAC7D,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,IAAI,IAAI,IAAI,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAC7E,CAAC,CAAC,GAAG,CAAC,aAAa;QACnB,CAAC,CAAC,IAAI,CAAC;IACT,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;AACtF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAuB,EAAE,MAAiC;IAC5F,IAAI,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAClE,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,QAAQ,CAAC,CAAC;AAC5D,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Request } from 'express';
|
|
2
|
+
import type { ChatMessage } from '@srouter/shared/types.js';
|
|
3
|
+
export type TaskType = 'code' | 'chat' | 'auto';
|
|
4
|
+
export declare const TASK_TYPE_HEADER = "x-freellm-task-type";
|
|
5
|
+
/** Read the client-declared task type from the request header (default 'auto'). */
|
|
6
|
+
export declare function parseTaskTypeHeader(req: Request): TaskType;
|
|
7
|
+
/** Derive a concrete task type from the request shape. Bounded, never throws. */
|
|
8
|
+
export declare function deriveTaskType(tools: unknown[] | undefined, messages: ChatMessage[] | undefined): 'code' | 'chat';
|
|
9
|
+
/**
|
|
10
|
+
* Resolve the effective task bias for a request: the explicit header wins;
|
|
11
|
+
* `auto` falls back to derivation. Returns undefined when there is no signal
|
|
12
|
+
* worth biasing for — callers then leave the routing weights untouched, so the
|
|
13
|
+
* default behaviour is unchanged. `auto` only ever biases UP toward `code`:
|
|
14
|
+
* `chat` is the ordinary case, and silently re-weighting the bulk of traffic
|
|
15
|
+
* in `auto` mode would defeat the point of an opt-in knob.
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolveTaskType(req: Request, tools: unknown[] | undefined, messages: ChatMessage[] | undefined): 'code' | 'chat' | undefined;
|
|
18
|
+
//# sourceMappingURL=task-type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-type.d.ts","sourceRoot":"","sources":["../../src/lib/task-type.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAG5D,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEhD,eAAO,MAAM,gBAAgB,wBAAwB,CAAC;AAgDtD,mFAAmF;AACnF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,QAAQ,CAK1D;AAOD,iFAAiF;AACjF,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAOjH;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,OAAO,EAAE,GAAG,SAAS,EAC5B,QAAQ,EAAE,WAAW,EAAE,GAAG,SAAS,GAClC,MAAM,GAAG,MAAM,GAAG,SAAS,CAI7B"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// Task-type-aware routing (#1127): lets a client declare what kind of work a
|
|
2
|
+
// request is (code vs chat) so the router can bias the bandit weights toward
|
|
3
|
+
// quality or speed. A coding turn is quality-sensitive — a weak model
|
|
4
|
+
// "completes" it with wrong code the user must manually verify; a chat turn is
|
|
5
|
+
// budget/speed-sensitive. The declared header is the strongest signal; when it
|
|
6
|
+
// is absent or `auto`, a cheap bounded rule derives the type from the request
|
|
7
|
+
// shape (tool-bearing requests → code; code markers in the last user message →
|
|
8
|
+
// code). The result is a SOFT preference: capability gates and the failover
|
|
9
|
+
// chain are untouched, and `undefined` means "leave the preset weights alone".
|
|
10
|
+
import { contentToString } from './content.js';
|
|
11
|
+
export const TASK_TYPE_HEADER = 'x-freellm-task-type';
|
|
12
|
+
// Bounded scan so a huge user message never costs the router a full read.
|
|
13
|
+
const MAX_SCAN_CHARS = 4000;
|
|
14
|
+
/**
|
|
15
|
+
* Markers that a turn is about code. Every one of these is SYNTAX, not
|
|
16
|
+
* vocabulary: an earlier revision matched bare English words (`function`,
|
|
17
|
+
* `class`, `cargo`, `docker`, `git`) and a bare `=>`, which classified
|
|
18
|
+
* "What class of animals are dolphins?" and "Explain the function of the
|
|
19
|
+
* mitochondria" as code. Auto-derivation is silent — the user never asked for
|
|
20
|
+
* it — so it has to err toward `chat`: a missed code turn just routes the way
|
|
21
|
+
* it always did, while a false positive quietly re-weights ordinary chat
|
|
22
|
+
* traffic. Hence: a marker has to be something that essentially cannot occur
|
|
23
|
+
* in prose.
|
|
24
|
+
*/
|
|
25
|
+
const CODE_MARKERS = [
|
|
26
|
+
// Fenced code block (with or without a language tag).
|
|
27
|
+
/```/,
|
|
28
|
+
// Shell prompt at the start of a line, followed by a command-looking word.
|
|
29
|
+
// The word gate keeps "$ 20 per seat" out.
|
|
30
|
+
/^[ \t]*\$[ \t]+[a-z][\w./-]*(?=[ \t]|$)/m,
|
|
31
|
+
// Declarations and definitions.
|
|
32
|
+
/\b(?:const|let|var)\s+[A-Za-z_$][\w$]*\s*=/,
|
|
33
|
+
/\bfunction\s*\*?\s*[A-Za-z_$][\w$]*\s*\(/,
|
|
34
|
+
/\bdef\s+[A-Za-z_]\w*\s*\(/,
|
|
35
|
+
// `class Foo:` / `class Foo {` / `class Foo(Base)` at the start of a line,
|
|
36
|
+
// or `class Foo extends Bar` anywhere. Bare "class" never matches.
|
|
37
|
+
/^[ \t]*class\s+[A-Za-z_$][\w$]*\s*[({:]/m,
|
|
38
|
+
/\bclass\s+[A-Za-z_$][\w$]*\s+extends\s+[A-Za-z_$][\w$]*/,
|
|
39
|
+
// ES imports: `import {` , or an import whose source is a quoted module.
|
|
40
|
+
/\bimport\s*\{/,
|
|
41
|
+
/\bimport\s[^\n;]{0,200}?\bfrom\s*['"][^'"\n]+['"]/,
|
|
42
|
+
// Python: `from x.y import z` at the start of a line.
|
|
43
|
+
/^[ \t]*from\s+[A-Za-z_.][\w.]*\s+import\s+\S/m,
|
|
44
|
+
/\brequire\s*\(\s*['"]/,
|
|
45
|
+
/^[ \t]*#\s*include\s*[<"]/m,
|
|
46
|
+
// A source file path next to a line number: `src/router.ts:214`.
|
|
47
|
+
/\b[\w./-]+\.(?:[jt]sx?|mjs|cjs|py|rb|go|rs|java|kt|swift|php|cs|cpp|cc|hpp|sh|sql|css|scss|html|vue|svelte|ya?ml|json|toml)\s*:\s*\d+/,
|
|
48
|
+
// Same, for the one-letter C extensions — the base name must start with a
|
|
49
|
+
// letter so an enumerated prose clause ("4.c: twelve") cannot match.
|
|
50
|
+
/\b[A-Za-z_][\w./-]*\.[ch]\s*:\s*\d+/,
|
|
51
|
+
// Stack frames: V8 (`at fn (file.js:1:2)`), Python (`File "x.py", line 3`).
|
|
52
|
+
/^\s*at\s+\S.*\(.*:\d+:\d+\)/m,
|
|
53
|
+
/^\s*File\s+"[^"\n]+",\s*line\s+\d+/m,
|
|
54
|
+
/\bTraceback\s+\(most recent call last\)/,
|
|
55
|
+
];
|
|
56
|
+
/** Read the client-declared task type from the request header (default 'auto'). */
|
|
57
|
+
export function parseTaskTypeHeader(req) {
|
|
58
|
+
const raw = req.headers[TASK_TYPE_HEADER];
|
|
59
|
+
const value = Array.isArray(raw) ? raw[0] : raw;
|
|
60
|
+
const trimmed = value?.trim().toLowerCase();
|
|
61
|
+
return trimmed === 'code' || trimmed === 'chat' || trimmed === 'auto' ? trimmed : 'auto';
|
|
62
|
+
}
|
|
63
|
+
/** True when `text` carries at least one unambiguous code marker. */
|
|
64
|
+
function hasCodeMarker(text) {
|
|
65
|
+
return CODE_MARKERS.some(re => re.test(text));
|
|
66
|
+
}
|
|
67
|
+
/** Derive a concrete task type from the request shape. Bounded, never throws. */
|
|
68
|
+
export function deriveTaskType(tools, messages) {
|
|
69
|
+
// Tool-bearing requests are overwhelmingly agent/coding turns.
|
|
70
|
+
if (tools && tools.length > 0)
|
|
71
|
+
return 'code';
|
|
72
|
+
const lastUser = messages ? [...messages].reverse().find((m) => m.role === 'user') : undefined;
|
|
73
|
+
const text = lastUser ? contentToString(lastUser.content) : '';
|
|
74
|
+
if (text.length > 0 && hasCodeMarker(text.slice(0, MAX_SCAN_CHARS)))
|
|
75
|
+
return 'code';
|
|
76
|
+
return 'chat';
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Resolve the effective task bias for a request: the explicit header wins;
|
|
80
|
+
* `auto` falls back to derivation. Returns undefined when there is no signal
|
|
81
|
+
* worth biasing for — callers then leave the routing weights untouched, so the
|
|
82
|
+
* default behaviour is unchanged. `auto` only ever biases UP toward `code`:
|
|
83
|
+
* `chat` is the ordinary case, and silently re-weighting the bulk of traffic
|
|
84
|
+
* in `auto` mode would defeat the point of an opt-in knob.
|
|
85
|
+
*/
|
|
86
|
+
export function resolveTaskType(req, tools, messages) {
|
|
87
|
+
const declared = parseTaskTypeHeader(req);
|
|
88
|
+
if (declared === 'code' || declared === 'chat')
|
|
89
|
+
return declared;
|
|
90
|
+
return deriveTaskType(tools, messages) === 'code' ? 'code' : undefined;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=task-type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-type.js","sourceRoot":"","sources":["../../src/lib/task-type.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { ChatCompletionChunk } from '@srouter/shared/types.js';
|
|
2
|
+
export interface ThinkSplit {
|
|
3
|
+
content: string;
|
|
4
|
+
reasoning: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class ThinkTagStreamFilter {
|
|
7
|
+
private state;
|
|
8
|
+
private pending;
|
|
9
|
+
/** Feed a text delta; returns the content/reasoning to emit for it. */
|
|
10
|
+
push(text: string): ThinkSplit;
|
|
11
|
+
/** Stream ended: release whatever is held. Unclosed `<think>` flushes as
|
|
12
|
+
* reasoning; an undecided lead buffer flushes as content. */
|
|
13
|
+
flush(): ThinkSplit;
|
|
14
|
+
}
|
|
15
|
+
/** Non-streaming split of a complete message body. Returns the original text
|
|
16
|
+
* as `content` (reasoning: '') when the message doesn't open with `<think>`. */
|
|
17
|
+
export declare function splitThinkTag(text: string): ThinkSplit;
|
|
18
|
+
/**
|
|
19
|
+
* In-place extraction for a non-streaming choice message: moves a leading
|
|
20
|
+
* `<think>…</think>` block out of `content` into `reasoning_content`
|
|
21
|
+
* (appending when the provider already set one). No-op for messages without
|
|
22
|
+
* an opening tag, so no-knob/no-tag responses are byte-identical.
|
|
23
|
+
*/
|
|
24
|
+
export declare function extractThinkFromMessage(msg: {
|
|
25
|
+
content?: unknown;
|
|
26
|
+
reasoning_content?: string;
|
|
27
|
+
}): void;
|
|
28
|
+
/**
|
|
29
|
+
* Streaming wrapper: rewrites `choices[0].delta.content` through the filter,
|
|
30
|
+
* emitting extracted reasoning as `delta.reasoning_content` on the same
|
|
31
|
+
* chunk. Chunks without text (role preambles, tool_call deltas, usage frames,
|
|
32
|
+
* native reasoning deltas) pass through untouched. When the source ends with
|
|
33
|
+
* held bytes (unclosed tag / undecided prefix) a final synthetic chunk
|
|
34
|
+
* carries them, so text is never lost.
|
|
35
|
+
*/
|
|
36
|
+
export declare function extractThinkTagsFromStream(source: AsyncGenerator<ChatCompletionChunk>): AsyncGenerator<ChatCompletionChunk>;
|
|
37
|
+
//# sourceMappingURL=think-tags.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"think-tags.d.ts","sourceRoot":"","sources":["../../src/lib/think-tags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAmCpE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAaD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,KAAK,CAAuB;IAIpC,OAAO,CAAC,OAAO,CAAM;IAErB,uEAAuE;IACvE,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;IAwD9B;kEAC8D;IAC9D,KAAK,IAAI,UAAU;CAUpB;AAED;iFACiF;AACjF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAKtD;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAQpG;AAED;;;;;;;GAOG;AACH,wBAAuB,0BAA0B,CAC/C,MAAM,EAAE,cAAc,CAAC,mBAAmB,CAAC,GAC1C,cAAc,CAAC,mBAAmB,CAAC,CA8CrC"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
// Inline `<think>…</think>` extraction (DeepSeek-style reasoning models).
|
|
2
|
+
//
|
|
3
|
+
// Some models serialize their reasoning trace INTO `content` as a leading
|
|
4
|
+
// `<think>…</think>` block instead of the separate `reasoning_content` field
|
|
5
|
+
// other providers use (Z.ai, Ollama, Gemini thought parts — all already
|
|
6
|
+
// normalized elsewhere). Forwarding the tags verbatim makes downstream tools
|
|
7
|
+
// render thinking as answer text. This module splits it back out into the
|
|
8
|
+
// OpenAI-convention `reasoning_content` field (non-streaming) and
|
|
9
|
+
// `delta.reasoning_content` chunks (streaming).
|
|
10
|
+
//
|
|
11
|
+
// Deliberately conservative: only a `<think>` that OPENS the message (after
|
|
12
|
+
// optional whitespace) starts extraction — a model *quoting* the literal tag
|
|
13
|
+
// mid-answer is left untouched. Once the block closes, everything after it is
|
|
14
|
+
// passed through verbatim (no re-arming), so at most one block per message is
|
|
15
|
+
// extracted. Matching is exact and lowercase — the only spelling observed live.
|
|
16
|
+
//
|
|
17
|
+
// Streaming buffer strategy (the tag can split across chunk boundaries):
|
|
18
|
+
// - 'lead': holds at most leading whitespace plus a strict prefix of
|
|
19
|
+
// `<think>` (7 chars); decides passthrough the moment a byte diverges.
|
|
20
|
+
// - 'thinking': emits reasoning incrementally, holding back only the longest
|
|
21
|
+
// trailing run that is a strict prefix of `</think>` (≤ 7 chars).
|
|
22
|
+
// - 'passthrough': zero-copy.
|
|
23
|
+
// The whole stream is never buffered. An unclosed tag at stream end flushes
|
|
24
|
+
// the held bytes as reasoning; an undecided lead buffer (e.g. a message that
|
|
25
|
+
// is just "<thi") flushes as content — text is never lost.
|
|
26
|
+
const OPEN_TAG = '<think>';
|
|
27
|
+
const CLOSE_TAG = '</think>';
|
|
28
|
+
// A lead buffer longer than this cannot plausibly be "whitespace before
|
|
29
|
+
// <think>" — bail to passthrough so a pathological all-whitespace stream
|
|
30
|
+
// can't grow the hold buffer unboundedly.
|
|
31
|
+
const MAX_LEAD_HOLD = 512;
|
|
32
|
+
/** Length of the longest suffix of `s` that is a strict prefix of `tag`. */
|
|
33
|
+
function partialTagSuffix(s, tag) {
|
|
34
|
+
const max = Math.min(s.length, tag.length - 1);
|
|
35
|
+
for (let len = max; len > 0; len--) {
|
|
36
|
+
if (s.endsWith(tag.slice(0, len)))
|
|
37
|
+
return len;
|
|
38
|
+
}
|
|
39
|
+
return 0;
|
|
40
|
+
}
|
|
41
|
+
export class ThinkTagStreamFilter {
|
|
42
|
+
state = 'lead';
|
|
43
|
+
// 'lead': optional whitespace + a strict prefix of OPEN_TAG.
|
|
44
|
+
// 'thinking': a strict prefix of CLOSE_TAG.
|
|
45
|
+
// Other states: always empty.
|
|
46
|
+
pending = '';
|
|
47
|
+
/** Feed a text delta; returns the content/reasoning to emit for it. */
|
|
48
|
+
push(text) {
|
|
49
|
+
let content = '';
|
|
50
|
+
let reasoning = '';
|
|
51
|
+
let input = this.pending + text;
|
|
52
|
+
this.pending = '';
|
|
53
|
+
while (input.length > 0) {
|
|
54
|
+
if (this.state === 'lead') {
|
|
55
|
+
const trimmed = input.replace(/^\s+/, '');
|
|
56
|
+
if (trimmed.length === 0) {
|
|
57
|
+
// All whitespace so far — could still precede a tag. Hold (bounded).
|
|
58
|
+
if (input.length > MAX_LEAD_HOLD) {
|
|
59
|
+
this.state = 'passthrough';
|
|
60
|
+
content += input;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
this.pending = input;
|
|
64
|
+
}
|
|
65
|
+
input = '';
|
|
66
|
+
}
|
|
67
|
+
else if (trimmed.startsWith(OPEN_TAG)) {
|
|
68
|
+
this.state = 'thinking';
|
|
69
|
+
input = trimmed.slice(OPEN_TAG.length);
|
|
70
|
+
}
|
|
71
|
+
else if (OPEN_TAG.startsWith(trimmed)) {
|
|
72
|
+
// Strict prefix of the tag — wait for the next delta to decide.
|
|
73
|
+
this.pending = input;
|
|
74
|
+
input = '';
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
// Provably not a think-opened message: everything is content.
|
|
78
|
+
this.state = 'passthrough';
|
|
79
|
+
content += input;
|
|
80
|
+
input = '';
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
else if (this.state === 'thinking') {
|
|
84
|
+
const idx = input.indexOf(CLOSE_TAG);
|
|
85
|
+
if (idx !== -1) {
|
|
86
|
+
reasoning += input.slice(0, idx);
|
|
87
|
+
input = input.slice(idx + CLOSE_TAG.length);
|
|
88
|
+
this.state = 'afterClose';
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
const hold = partialTagSuffix(input, CLOSE_TAG);
|
|
92
|
+
reasoning += input.slice(0, input.length - hold);
|
|
93
|
+
this.pending = hold > 0 ? input.slice(input.length - hold) : '';
|
|
94
|
+
input = '';
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
else if (this.state === 'afterClose') {
|
|
98
|
+
// Drop the whitespace models emit between `</think>` and the answer.
|
|
99
|
+
const trimmed = input.replace(/^\s+/, '');
|
|
100
|
+
if (trimmed.length > 0)
|
|
101
|
+
this.state = 'passthrough';
|
|
102
|
+
input = trimmed;
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
content += input;
|
|
106
|
+
input = '';
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return { content, reasoning };
|
|
110
|
+
}
|
|
111
|
+
/** Stream ended: release whatever is held. Unclosed `<think>` flushes as
|
|
112
|
+
* reasoning; an undecided lead buffer flushes as content. */
|
|
113
|
+
flush() {
|
|
114
|
+
const held = this.pending;
|
|
115
|
+
this.pending = '';
|
|
116
|
+
if (this.state === 'thinking') {
|
|
117
|
+
this.state = 'passthrough';
|
|
118
|
+
return { content: '', reasoning: held };
|
|
119
|
+
}
|
|
120
|
+
this.state = 'passthrough';
|
|
121
|
+
return { content: held, reasoning: '' };
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/** Non-streaming split of a complete message body. Returns the original text
|
|
125
|
+
* as `content` (reasoning: '') when the message doesn't open with `<think>`. */
|
|
126
|
+
export function splitThinkTag(text) {
|
|
127
|
+
const filter = new ThinkTagStreamFilter();
|
|
128
|
+
const main = filter.push(text);
|
|
129
|
+
const tail = filter.flush();
|
|
130
|
+
return { content: main.content + tail.content, reasoning: main.reasoning + tail.reasoning };
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* In-place extraction for a non-streaming choice message: moves a leading
|
|
134
|
+
* `<think>…</think>` block out of `content` into `reasoning_content`
|
|
135
|
+
* (appending when the provider already set one). No-op for messages without
|
|
136
|
+
* an opening tag, so no-knob/no-tag responses are byte-identical.
|
|
137
|
+
*/
|
|
138
|
+
export function extractThinkFromMessage(msg) {
|
|
139
|
+
if (typeof msg.content !== 'string' || !msg.content.includes(OPEN_TAG))
|
|
140
|
+
return;
|
|
141
|
+
const { content, reasoning } = splitThinkTag(msg.content);
|
|
142
|
+
if (reasoning.length === 0)
|
|
143
|
+
return;
|
|
144
|
+
msg.content = content;
|
|
145
|
+
msg.reasoning_content = msg.reasoning_content && msg.reasoning_content.length > 0
|
|
146
|
+
? `${msg.reasoning_content}\n${reasoning}`
|
|
147
|
+
: reasoning;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Streaming wrapper: rewrites `choices[0].delta.content` through the filter,
|
|
151
|
+
* emitting extracted reasoning as `delta.reasoning_content` on the same
|
|
152
|
+
* chunk. Chunks without text (role preambles, tool_call deltas, usage frames,
|
|
153
|
+
* native reasoning deltas) pass through untouched. When the source ends with
|
|
154
|
+
* held bytes (unclosed tag / undecided prefix) a final synthetic chunk
|
|
155
|
+
* carries them, so text is never lost.
|
|
156
|
+
*/
|
|
157
|
+
export async function* extractThinkTagsFromStream(source) {
|
|
158
|
+
const filter = new ThinkTagStreamFilter();
|
|
159
|
+
let meta = null;
|
|
160
|
+
for await (const chunk of source) {
|
|
161
|
+
if (chunk?.id)
|
|
162
|
+
meta = { id: chunk.id, model: chunk.model, created: chunk.created };
|
|
163
|
+
const choice = chunk?.choices?.[0];
|
|
164
|
+
const raw = choice?.delta?.content;
|
|
165
|
+
if (typeof raw !== 'string' || raw.length === 0) {
|
|
166
|
+
yield chunk;
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
const { content, reasoning } = filter.push(raw);
|
|
170
|
+
if (content === raw && reasoning.length === 0) {
|
|
171
|
+
// Fast path (passthrough state): forward untouched.
|
|
172
|
+
yield chunk;
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
// Chunks are parsed fresh from JSON per SSE frame, so in-place mutation is
|
|
176
|
+
// safe — same rationale as normalizeOutboundContent.
|
|
177
|
+
choice.delta.content = content;
|
|
178
|
+
if (reasoning.length > 0) {
|
|
179
|
+
choice.delta.reasoning_content = choice.delta.reasoning_content
|
|
180
|
+
? choice.delta.reasoning_content + reasoning
|
|
181
|
+
: reasoning;
|
|
182
|
+
}
|
|
183
|
+
yield chunk;
|
|
184
|
+
}
|
|
185
|
+
const tail = filter.flush();
|
|
186
|
+
if (tail.content.length > 0 || tail.reasoning.length > 0) {
|
|
187
|
+
yield {
|
|
188
|
+
id: meta?.id ?? `chatcmpl-${Date.now()}`,
|
|
189
|
+
object: 'chat.completion.chunk',
|
|
190
|
+
created: meta?.created ?? Math.floor(Date.now() / 1000),
|
|
191
|
+
model: meta?.model ?? '',
|
|
192
|
+
choices: [{
|
|
193
|
+
index: 0,
|
|
194
|
+
delta: {
|
|
195
|
+
...(tail.content.length > 0 ? { content: tail.content } : {}),
|
|
196
|
+
...(tail.reasoning.length > 0 ? { reasoning_content: tail.reasoning } : {}),
|
|
197
|
+
},
|
|
198
|
+
finish_reason: null,
|
|
199
|
+
}],
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=think-tags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"think-tags.js","sourceRoot":"","sources":["../../src/lib/think-tags.ts"],"names":[],"mappings":"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"}
|