@zergai/ztc 0.4.0-beta.1 → 0.5.0-beta.1
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/README.md +398 -45
- package/RUST_THIRD_PARTY_LICENSES.txt +1080 -822
- package/THIRD_PARTY_NOTICES.md +273 -12
- package/bin/zmux-darwin-arm64 +0 -0
- package/bin/ztc-audio-darwin-arm64 +0 -0
- package/bin/ztc-capture-darwin-arm64 +0 -0
- package/bin/ztc-computer-darwin-arm64 +0 -0
- package/bin/ztc-llm-darwin-arm64 +0 -0
- package/bin/ztc-tts-darwin-arm64 +0 -0
- package/bin/ztc-tui-darwin-arm64 +0 -0
- package/bin/ztc-zlicky-overlay-darwin-arm64 +0 -0
- package/bin/zterm-darwin-arm64 +0 -0
- package/dist/App.js +1206 -209
- package/dist/agent/agent.d.ts +74 -8
- package/dist/agent/agent.js +1073 -184
- package/dist/agent/backends/account_rotation.d.ts +4 -0
- package/dist/agent/backends/account_rotation.js +8 -2
- package/dist/agent/backends/anthropic.d.ts +13 -0
- package/dist/agent/backends/anthropic.js +169 -28
- package/dist/agent/backends/claude_cli.js +18 -8
- package/dist/agent/backends/codex_app_server.d.ts +1 -0
- package/dist/agent/backends/codex_app_server.js +55 -3
- package/dist/agent/backends/codex_auth.d.ts +1 -0
- package/dist/agent/backends/codex_auth.js +67 -13
- package/dist/agent/backends/codex_buffered_recovery.d.ts +27 -0
- package/dist/agent/backends/codex_buffered_recovery.js +293 -0
- package/dist/agent/backends/gemini.js +3 -1
- package/dist/agent/backends/http_error.d.ts +26 -0
- package/dist/agent/backends/http_error.js +221 -0
- package/dist/agent/backends/index.d.ts +9 -2
- package/dist/agent/backends/index.js +22 -2
- package/dist/agent/backends/openai.d.ts +0 -6
- package/dist/agent/backends/openai.js +5 -2
- package/dist/agent/backends/openai_compatible.d.ts +5 -4
- package/dist/agent/backends/openai_compatible.js +26 -19
- package/dist/agent/backends/openai_responses.d.ts +8 -3
- package/dist/agent/backends/openai_responses.js +77 -33
- package/dist/agent/backends/provider_ids.d.ts +1 -0
- package/dist/agent/backends/provider_ids.js +4 -0
- package/dist/agent/backends/request_metrics.js +12 -2
- package/dist/agent/backends/types.d.ts +109 -6
- package/dist/agent/backends/types.js +5 -1
- package/dist/agent/backends/zrouter_stream.d.ts +6 -1
- package/dist/agent/backends/zrouter_stream.js +160 -42
- package/dist/agent/background_registry.d.ts +2 -0
- package/dist/agent/background_registry.js +1 -0
- package/dist/agent/claim_observation.d.ts +6 -0
- package/dist/agent/claim_observation.js +54 -0
- package/dist/agent/commands/accounts.js +46 -177
- package/dist/agent/commands/attention.d.ts +2 -0
- package/dist/agent/commands/attention.js +67 -0
- package/dist/agent/commands/auth.js +18 -2
- package/dist/agent/commands/board.d.ts +2 -0
- package/dist/agent/commands/board.js +169 -0
- package/dist/agent/commands/clipboard.js +50 -1
- package/dist/agent/commands/compact.js +21 -13
- package/dist/agent/commands/config.js +4 -1
- package/dist/agent/commands/context.js +6 -1
- package/dist/agent/commands/desktop.d.ts +2 -0
- package/dist/agent/commands/desktop.js +29 -0
- package/dist/agent/commands/effort.js +14 -6
- package/dist/agent/commands/environment.d.ts +3 -0
- package/dist/agent/commands/environment.js +109 -0
- package/dist/agent/commands/evidence.d.ts +2 -0
- package/dist/agent/commands/evidence.js +9 -0
- package/dist/agent/commands/fork.js +4 -3
- package/dist/agent/commands/goal.d.ts +33 -1
- package/dist/agent/commands/goal.js +174 -14
- package/dist/agent/commands/goal_exit.d.ts +36 -0
- package/dist/agent/commands/goal_exit.js +120 -0
- package/dist/agent/commands/help.js +3 -1
- package/dist/agent/commands/history.js +3 -1
- package/dist/agent/commands/inbox.d.ts +2 -0
- package/dist/agent/commands/inbox.js +148 -0
- package/dist/agent/commands/index.js +16 -1
- package/dist/agent/commands/input_mode.js +8 -6
- package/dist/agent/commands/job.d.ts +2 -0
- package/dist/agent/commands/job.js +93 -0
- package/dist/agent/commands/keybindings.js +4 -1
- package/dist/agent/commands/label.d.ts +2 -0
- package/dist/agent/commands/label.js +77 -0
- package/dist/agent/commands/layout.d.ts +2 -0
- package/dist/agent/commands/layout.js +20 -0
- package/dist/agent/commands/mirror.js +16 -1
- package/dist/agent/commands/model.js +12 -2
- package/dist/agent/commands/permissions.d.ts +3 -1
- package/dist/agent/commands/permissions.js +79 -89
- package/dist/agent/commands/plan.js +5 -15
- package/dist/agent/commands/profile.js +21 -2
- package/dist/agent/commands/provider_selection.js +20 -1
- package/dist/agent/commands/rename.js +1 -1
- package/dist/agent/commands/resources.d.ts +2 -0
- package/dist/agent/commands/resources.js +67 -0
- package/dist/agent/commands/rewind.d.ts +3 -0
- package/dist/agent/commands/rewind.js +16 -0
- package/dist/agent/commands/runbooks.d.ts +2 -0
- package/dist/agent/commands/runbooks.js +73 -0
- package/dist/agent/commands/runbooks_lazy.d.ts +2 -0
- package/dist/agent/commands/runbooks_lazy.js +8 -0
- package/dist/agent/commands/sessions.d.ts +1 -1
- package/dist/agent/commands/sessions.js +33 -5
- package/dist/agent/commands/settings.js +185 -39
- package/dist/agent/commands/setup.d.ts +2 -0
- package/dist/agent/commands/setup.js +78 -0
- package/dist/agent/commands/share.d.ts +2 -0
- package/dist/agent/commands/share.js +64 -0
- package/dist/agent/commands/status.js +14 -2
- package/dist/agent/commands/types.d.ts +99 -6
- package/dist/agent/commands/update.js +8 -0
- package/dist/agent/commands/usage.d.ts +2 -0
- package/dist/agent/commands/usage.js +8 -0
- package/dist/agent/factory.d.ts +11 -0
- package/dist/agent/factory.js +113 -88
- package/dist/agent/loop_policy.d.ts +6 -3
- package/dist/agent/loop_policy.js +12 -3
- package/dist/agent/measurement_guidance.d.ts +2 -0
- package/dist/agent/measurement_guidance.js +5 -0
- package/dist/agent/request_encoder.d.ts +8 -1
- package/dist/agent/request_encoder.js +95 -23
- package/dist/agent/runtime/benchmark_comparison.d.ts +30 -0
- package/dist/agent/runtime/benchmark_comparison.js +94 -0
- package/dist/agent/runtime/benchmark_contract.d.ts +48 -0
- package/dist/agent/runtime/benchmark_contract.js +90 -0
- package/dist/agent/runtime/checked_commands.d.ts +32 -0
- package/dist/agent/runtime/checked_commands.js +119 -0
- package/dist/agent/runtime/command_execution_policy.d.ts +26 -0
- package/dist/agent/runtime/command_execution_policy.js +91 -0
- package/dist/agent/runtime/command_jobs.d.ts +36 -18
- package/dist/agent/runtime/command_jobs.js +151 -13
- package/dist/agent/runtime/command_panes.d.ts +59 -0
- package/dist/agent/runtime/command_panes.js +398 -0
- package/dist/agent/runtime/command_wait.d.ts +19 -0
- package/dist/agent/runtime/command_wait.js +167 -0
- package/dist/agent/runtime/cpu_benchmark.d.ts +30 -0
- package/dist/agent/runtime/cpu_benchmark.js +126 -0
- package/dist/agent/runtime/delegated_evidence.d.ts +26 -0
- package/dist/agent/runtime/delegated_evidence.js +80 -0
- package/dist/agent/runtime/evidence.d.ts +127 -0
- package/dist/agent/runtime/evidence.js +468 -0
- package/dist/agent/runtime/execution_context.d.ts +7 -0
- package/dist/agent/runtime/execution_context.js +39 -3
- package/dist/agent/runtime/json_verifier_recipe.d.ts +8 -0
- package/dist/agent/runtime/json_verifier_recipe.js +66 -0
- package/dist/agent/runtime/measurements.d.ts +110 -0
- package/dist/agent/runtime/measurements.js +317 -0
- package/dist/agent/runtime/policy.d.ts +4 -0
- package/dist/agent/runtime/policy.js +31 -20
- package/dist/agent/runtime/provider_native_evidence.d.ts +20 -0
- package/dist/agent/runtime/provider_native_evidence.js +86 -0
- package/dist/agent/runtime/recovery.d.ts +2 -0
- package/dist/agent/runtime/recovery.js +45 -2
- package/dist/agent/runtime/remote_broker_transport.d.ts +10 -0
- package/dist/agent/runtime/remote_broker_transport.js +84 -0
- package/dist/agent/runtime/remote_deletion_receipts.d.ts +3 -0
- package/dist/agent/runtime/remote_deletion_receipts.js +43 -0
- package/dist/agent/runtime/remote_journal_replay.d.ts +13 -0
- package/dist/agent/runtime/remote_journal_replay.js +233 -0
- package/dist/agent/runtime/remote_mutation_journal.d.ts +25 -0
- package/dist/agent/runtime/remote_mutation_journal.js +208 -0
- package/dist/agent/runtime/remote_resource_endpoint.d.ts +7 -0
- package/dist/agent/runtime/remote_resource_endpoint.js +6 -0
- package/dist/agent/runtime/remote_resource_errors.d.ts +5 -0
- package/dist/agent/runtime/remote_resource_errors.js +9 -0
- package/dist/agent/runtime/remote_resource_script.d.ts +2 -0
- package/dist/agent/runtime/remote_resource_script.js +1009 -0
- package/dist/agent/runtime/remote_resources.d.ts +29 -0
- package/dist/agent/runtime/remote_resources.js +160 -0
- package/dist/agent/runtime/source_verification.d.ts +12 -0
- package/dist/agent/runtime/source_verification.js +210 -0
- package/dist/agent/runtime/source_verification_contract.d.ts +75 -0
- package/dist/agent/runtime/source_verification_contract.js +203 -0
- package/dist/agent/runtime/tool_checkpoints.d.ts +11 -0
- package/dist/agent/runtime/tool_checkpoints.js +26 -0
- package/dist/agent/runtime/tool_effects.d.ts +5 -0
- package/dist/agent/runtime/tool_progress.d.ts +12 -0
- package/dist/agent/runtime/tool_progress.js +76 -0
- package/dist/agent/runtime/tool_runtime.d.ts +16 -1
- package/dist/agent/runtime/tool_runtime.js +204 -10
- package/dist/agent/runtime/tracing.d.ts +1 -1
- package/dist/agent/runtime/verifier_capture.d.ts +9 -0
- package/dist/agent/runtime/verifier_capture.js +100 -0
- package/dist/agent/runtime/verifier_contract.d.ts +24 -0
- package/dist/agent/runtime/verifier_contract.js +41 -0
- package/dist/agent/subagent.d.ts +20 -10
- package/dist/agent/subagent.js +266 -29
- package/dist/agent/tool_response_directory.d.ts +24 -0
- package/dist/agent/tool_response_directory.js +61 -0
- package/dist/agent/tool_response_source.d.ts +8 -0
- package/dist/agent/tool_response_source.js +49 -0
- package/dist/agent/tool_response_store.d.ts +75 -4
- package/dist/agent/tool_response_store.js +583 -64
- package/dist/agent/tools/ask_user.d.ts +3 -1
- package/dist/agent/tools/ask_user.js +30 -11
- package/dist/agent/tools/background.js +1 -0
- package/dist/agent/tools/benchmark_cpu.d.ts +2 -0
- package/dist/agent/tools/benchmark_cpu.js +102 -0
- package/dist/agent/tools/compare_benchmarks.d.ts +2 -0
- package/dist/agent/tools/compare_benchmarks.js +53 -0
- package/dist/agent/tools/deferred.js +1 -0
- package/dist/agent/tools/delegate.js +18 -2
- package/dist/agent/tools/helper_requirements.d.ts +7 -0
- package/dist/agent/tools/helper_requirements.js +19 -0
- package/dist/agent/tools/index.d.ts +1 -0
- package/dist/agent/tools/index.js +3 -0
- package/dist/agent/tools/measurement_report.d.ts +22 -0
- package/dist/agent/tools/measurement_report.js +190 -0
- package/dist/agent/tools/pane.d.ts +0 -7
- package/dist/agent/tools/pane.js +5 -4
- package/dist/agent/tools/project_context.d.ts +3 -0
- package/dist/agent/tools/project_context.js +45 -0
- package/dist/agent/tools/recall_tool_response.d.ts +3 -5
- package/dist/agent/tools/recall_tool_response.js +19 -29
- package/dist/agent/tools/registry.d.ts +1 -0
- package/dist/agent/tools/registry.js +23 -0
- package/dist/agent/tools/related_sessions.d.ts +2 -0
- package/dist/agent/tools/related_sessions.js +156 -0
- package/dist/agent/tools/routine.js +13 -3
- package/dist/agent/tools/session_evidence.d.ts +3 -0
- package/dist/agent/tools/session_evidence.js +72 -0
- package/dist/agent/tools/shell.d.ts +4 -3
- package/dist/agent/tools/shell.js +174 -47
- package/dist/agent/tools/tool_search.js +3 -2
- package/dist/agent/tools/types.d.ts +28 -0
- package/dist/agent/tools/verify_artifact.d.ts +2 -0
- package/dist/agent/tools/verify_artifact.js +60 -0
- package/dist/agent/tools/workflow.js +1 -0
- package/dist/app/activity.d.ts +6 -1
- package/dist/app/activity.js +81 -12
- package/dist/app/agent_runner.d.ts +6 -1
- package/dist/app/agent_runner.js +34 -19
- package/dist/app/command_context.js +106 -10
- package/dist/app/controller.d.ts +15 -4
- package/dist/app/controller.js +29 -3
- package/dist/app/escape_stop.d.ts +11 -0
- package/dist/app/escape_stop.js +15 -0
- package/dist/app/liveness.d.ts +6 -4
- package/dist/app/liveness.js +13 -3
- package/dist/app/model_catalog_cache.d.ts +5 -0
- package/dist/app/model_catalog_cache.js +138 -0
- package/dist/app/ordered_transcript.js +43 -4
- package/dist/app/prompt_turn.d.ts +14 -0
- package/dist/app/prompt_turn.js +53 -0
- package/dist/app/recap.d.ts +3 -0
- package/dist/app/recap.js +9 -3
- package/dist/app/restart.d.ts +3 -2
- package/dist/app/restart.js +22 -7
- package/dist/app/rewind.d.ts +3 -3
- package/dist/app/rewind.js +3 -3
- package/dist/app/selection_completion.d.ts +17 -2
- package/dist/app/selection_completion.js +84 -9
- package/dist/app/session_manager.d.ts +38 -6
- package/dist/app/session_manager.js +263 -60
- package/dist/app/session_messages.d.ts +3 -0
- package/dist/app/session_messages.js +60 -0
- package/dist/app/task_scope_router.d.ts +20 -0
- package/dist/app/task_scope_router.js +173 -0
- package/dist/app/transcript_window.d.ts +2 -0
- package/dist/app/transcript_window.js +4 -0
- package/dist/app/workspace_admission_details.d.ts +3 -0
- package/dist/app/workspace_admission_details.js +26 -0
- package/dist/app/workspace_layout_controller.d.ts +11 -0
- package/dist/app/workspace_layout_controller.js +88 -0
- package/dist/app/workspace_monitor.d.ts +1 -0
- package/dist/app/workspace_monitor.js +216 -0
- package/dist/app/workspace_presets.d.ts +29 -0
- package/dist/app/workspace_presets.js +192 -0
- package/dist/attention/queue.d.ts +37 -0
- package/dist/attention/queue.js +183 -0
- package/dist/bench/rf_shared.d.ts +2 -0
- package/dist/board/binding.d.ts +42 -0
- package/dist/board/binding.js +38 -0
- package/dist/board/client.d.ts +42 -0
- package/dist/board/client.js +60 -0
- package/dist/cli.js +1 -1
- package/dist/cli_args.js +19 -17
- package/dist/cli_main.js +110 -13
- package/dist/cli_ratatui.d.ts +183 -16
- package/dist/cli_ratatui.js +3989 -1255
- package/dist/components/ActivityLine.d.ts +3 -2
- package/dist/components/ActivityLine.js +2 -2
- package/dist/components/InputArea.d.ts +19 -1
- package/dist/components/InputArea.js +264 -190
- package/dist/components/MessageList.d.ts +2 -0
- package/dist/components/MessageList.js +3 -1
- package/dist/components/SingleMessage.d.ts +2 -0
- package/dist/components/SingleMessage.js +4 -2
- package/dist/components/StatusBar.d.ts +4 -2
- package/dist/components/StatusBar.js +3 -1
- package/dist/conductor_branch.js +3 -0
- package/dist/config/api_retry.d.ts +6 -1
- package/dist/config/api_retry.js +19 -1
- package/dist/config/defaults.d.ts +2 -1
- package/dist/config/defaults.js +9 -2
- package/dist/config/message_display.d.ts +1 -0
- package/dist/config/message_display.js +17 -2
- package/dist/config/permissions.d.ts +21 -0
- package/dist/config/permissions.js +89 -0
- package/dist/config/resolved.d.ts +2 -2
- package/dist/config/types.d.ts +32 -5
- package/dist/config.d.ts +38 -4
- package/dist/config.js +290 -42
- package/dist/context/project_intelligence.d.ts +44 -0
- package/dist/context/project_intelligence.js +246 -0
- package/dist/desktop/cli_launch.d.ts +8 -0
- package/dist/desktop/cli_launch.js +6 -0
- package/dist/desktop/cli_shim.d.ts +8 -0
- package/dist/desktop/cli_shim.js +120 -0
- package/dist/desktop/runtime.d.ts +16 -0
- package/dist/desktop/runtime.js +161 -0
- package/dist/desktop/worker_launch.d.ts +7 -0
- package/dist/desktop/worker_launch.js +7 -0
- package/dist/diagnostics/cargo_mutants_selection.d.ts +27 -0
- package/dist/diagnostics/cargo_mutants_selection.js +48 -0
- package/dist/diagnostics/native_terminal_benchmark.d.ts +58 -0
- package/dist/diagnostics/native_terminal_benchmark.js +1247 -0
- package/dist/diagnostics/session_evidence_package.d.ts +40 -0
- package/dist/diagnostics/session_evidence_package.js +234 -0
- package/dist/diagnostics/session_export.d.ts +93 -0
- package/dist/diagnostics/session_export.js +634 -0
- package/dist/emulation/tool_adapters.js +48 -18
- package/dist/emulation/ztc_addendum.d.ts +1 -0
- package/dist/emulation/ztc_addendum.js +13 -12
- package/dist/environment/service_runner.d.ts +1 -0
- package/dist/environment/service_runner.js +68 -0
- package/dist/environment/store.d.ts +120 -0
- package/dist/environment/store.js +387 -0
- package/dist/events.d.ts +40 -1
- package/dist/events.js +10 -17
- package/dist/goal_contract.d.ts +25 -0
- package/dist/goal_contract.js +44 -0
- package/dist/headless.d.ts +31 -0
- package/dist/headless.js +578 -70
- package/dist/headless_cli.js +8 -0
- package/dist/headless_cli_args.d.ts +1 -0
- package/dist/headless_cli_args.js +1 -0
- package/dist/intake/cli.d.ts +1 -0
- package/dist/intake/cli.js +33 -0
- package/dist/intake/format.d.ts +2 -0
- package/dist/intake/format.js +14 -0
- package/dist/intake/notifications.d.ts +16 -0
- package/dist/intake/notifications.js +132 -0
- package/dist/intake/store.d.ts +56 -0
- package/dist/intake/store.js +238 -0
- package/dist/library.d.ts +8 -0
- package/dist/library.js +19 -10
- package/dist/mcp/client.d.ts +1 -0
- package/dist/mcp/client.js +20 -0
- package/dist/modes/builtin/plan.yaml +2 -2
- package/dist/modes/handlers.js +1 -1
- package/dist/onboarding/first_run.d.ts +3 -0
- package/dist/onboarding/first_run.js +33 -25
- package/dist/onboarding/setup.d.ts +32 -0
- package/dist/onboarding/setup.js +133 -0
- package/dist/onboarding/setup_agent_health.d.ts +17 -0
- package/dist/onboarding/setup_agent_health.js +79 -0
- package/dist/onboarding/setup_environment.d.ts +66 -0
- package/dist/onboarding/setup_environment.js +219 -0
- package/dist/onboarding/setup_workspace.d.ts +17 -0
- package/dist/onboarding/setup_workspace.js +129 -0
- package/dist/optimize/adapters/index.d.ts +4 -1
- package/dist/optimize/adapters/index.js +7 -0
- package/dist/optimize/adapters/kernelbench.js +14 -5
- package/dist/optimize/adapters/popcorn.js +3 -2
- package/dist/optimize/adapters/profile_benchmark.js +13 -7
- package/dist/optimize/adapters/rfbench.js +25 -14
- package/dist/optimize/adapters/types.d.ts +3 -0
- package/dist/optimize/adapters/zergpod.js +5 -2
- package/dist/optimize/baseline.js +10 -21
- package/dist/optimize/branch.js +9 -12
- package/dist/optimize/combine.js +2 -3
- package/dist/optimize/executor.js +34 -48
- package/dist/optimize/measurements.d.ts +55 -0
- package/dist/optimize/measurements.js +173 -0
- package/dist/optimize/results.d.ts +1 -0
- package/dist/optimize/results.js +11 -33
- package/dist/optimize/tge.js +2 -1
- package/dist/panes/initial_input.d.ts +19 -0
- package/dist/panes/initial_input.js +206 -0
- package/dist/panes/labels.d.ts +16 -0
- package/dist/panes/labels.js +42 -0
- package/dist/panes/model_catalog.d.ts +3 -3
- package/dist/panes/model_catalog.js +28 -4
- package/dist/panes/pane_registry.js +6 -2
- package/dist/panes/types.d.ts +3 -0
- package/dist/panes/ztc_launch.js +19 -0
- package/dist/plugin/optimization.d.ts +2 -0
- package/dist/plugin/optimization.js +1 -0
- package/dist/plugin/runtime.d.ts +2 -0
- package/dist/plugin/simulation.d.ts +6 -1
- package/dist/plugin/simulation_contract.d.ts +836 -1
- package/dist/plugin/simulation_documents.d.ts +22 -0
- package/dist/plugin/simulation_documents.js +1 -0
- package/dist/plugin/simulation_interventions.d.ts +103 -0
- package/dist/plugin/simulation_interventions.js +1 -0
- package/dist/plugin/simulation_living.d.ts +1 -0
- package/dist/plugin/simulation_living.js +3 -0
- package/dist/plugin/simulation_meetings.d.ts +121 -0
- package/dist/plugin/simulation_meetings.js +1 -0
- package/dist/plugin/simulation_story_review.d.ts +111 -0
- package/dist/plugin/simulation_story_review.js +1 -0
- package/dist/plugin/simulation_storyteller.d.ts +91 -0
- package/dist/plugin/simulation_storyteller.js +1 -0
- package/dist/plugin/simulation_structured.d.ts +2 -0
- package/dist/plugin/simulation_structured.js +2 -0
- package/dist/plugin/simulation_toolkit.d.ts +21 -0
- package/dist/plugin/simulation_toolkit.js +24 -0
- package/dist/prompts/tool_delegate_task.j2 +1 -1
- package/dist/remote-broker/Dockerfile +10 -0
- package/dist/remote-broker/archive.py +1227 -0
- package/dist/remote-broker/cutover.py +761 -0
- package/dist/remote-broker/requirements.txt +5 -0
- package/dist/remote-broker/resources.json +6 -0
- package/dist/remote-broker/resources.write-staging.example.json +18 -0
- package/dist/remote-broker/retained.py +686 -0
- package/dist/remote-broker/retained_cleanup.py +550 -0
- package/dist/remote-broker/server.py +648 -0
- package/dist/remote-broker/worker.py +1007 -0
- package/dist/router_auth.d.ts +31 -0
- package/dist/router_auth.js +155 -9
- package/dist/runbooks/catalog.d.ts +3 -0
- package/dist/runbooks/catalog.js +26 -0
- package/dist/runbooks/library.d.ts +11 -0
- package/dist/runbooks/library.js +95 -0
- package/dist/runbooks/package.d.ts +43 -0
- package/dist/runbooks/package.js +102 -0
- package/dist/session.d.ts +65 -13
- package/dist/session.js +548 -43
- package/dist/session_handoff.d.ts +25 -0
- package/dist/session_handoff.js +322 -0
- package/dist/session_handoff_contract.d.ts +89 -0
- package/dist/session_handoff_contract.js +179 -0
- package/dist/session_media.d.ts +41 -0
- package/dist/session_media.js +357 -0
- package/dist/session_ownership.d.ts +16 -0
- package/dist/session_ownership.js +221 -0
- package/dist/session_public.d.ts +10 -2
- package/dist/session_public.js +6 -1
- package/dist/simulation/dynamic_history.d.ts +42 -0
- package/dist/simulation/dynamic_history.js +173 -0
- package/dist/simulation/engines/swarm/pane_manager.js +7 -6
- package/dist/simulation/inference.d.ts +3 -1
- package/dist/simulation/inference.js +19 -1
- package/dist/simulation/intervention_generation.d.ts +27 -0
- package/dist/simulation/intervention_generation.js +246 -0
- package/dist/simulation/intervention_material.d.ts +4 -0
- package/dist/simulation/intervention_material.js +81 -0
- package/dist/simulation/living/context.d.ts +3130 -0
- package/dist/simulation/living/context.js +944 -0
- package/dist/simulation/living/definer.d.ts +12 -0
- package/dist/simulation/living/definer.js +223 -0
- package/dist/simulation/living/definition.d.ts +257 -0
- package/dist/simulation/living/definition.js +341 -0
- package/dist/simulation/living/frame.d.ts +259 -0
- package/dist/simulation/living/frame.js +223 -0
- package/dist/simulation/living/identifiers.d.ts +2 -0
- package/dist/simulation/living/identifiers.js +12 -0
- package/dist/simulation/living/index.d.ts +15 -0
- package/dist/simulation/living/index.js +15 -0
- package/dist/simulation/living/inference.d.ts +219 -0
- package/dist/simulation/living/inference.js +576 -0
- package/dist/simulation/living/mechanics.d.ts +54 -0
- package/dist/simulation/living/mechanics.js +588 -0
- package/dist/simulation/living/model-input.d.ts +25 -0
- package/dist/simulation/living/model-input.js +215 -0
- package/dist/simulation/living/open-world.d.ts +257 -0
- package/dist/simulation/living/open-world.js +102 -0
- package/dist/simulation/living/projection.d.ts +7 -0
- package/dist/simulation/living/projection.js +31 -0
- package/dist/simulation/living/recall.d.ts +17 -0
- package/dist/simulation/living/recall.js +25 -0
- package/dist/simulation/living/reduce.d.ts +15 -0
- package/dist/simulation/living/reduce.js +1853 -0
- package/dist/simulation/living/replay.d.ts +6 -0
- package/dist/simulation/living/replay.js +22 -0
- package/dist/simulation/living/runtime.d.ts +140 -0
- package/dist/simulation/living/runtime.js +3020 -0
- package/dist/simulation/living/shared-kinds.d.ts +24 -0
- package/dist/simulation/living/shared-kinds.js +96 -0
- package/dist/simulation/living/types.d.ts +2785 -0
- package/dist/simulation/living/types.js +669 -0
- package/dist/simulation/llm.d.ts +3 -1
- package/dist/simulation/llm.js +90 -30
- package/dist/simulation/memory/embedding.d.ts +1 -1
- package/dist/simulation/memory/embedding.js +9 -3
- package/dist/simulation/memory/filesystem.d.ts +2 -0
- package/dist/simulation/memory/filesystem.js +5 -1
- package/dist/simulation/memory/filesystem_file_tree.d.ts +4 -1
- package/dist/simulation/memory/filesystem_file_tree.js +41 -10
- package/dist/simulation/memory/filesystem_invariants.js +1 -2
- package/dist/simulation/memory/filesystem_types.d.ts +1 -0
- package/dist/simulation/memory/memory.d.ts +2 -0
- package/dist/simulation/memory/memory.js +5 -1
- package/dist/simulation/orchestration/intent.js +0 -2
- package/dist/simulation/orchestration/lifecycle.js +0 -2
- package/dist/simulation/plugin_host.d.ts +25 -1
- package/dist/simulation/plugin_host.js +334 -17
- package/dist/simulation/session_documents.d.ts +20 -0
- package/dist/simulation/session_documents.js +62 -0
- package/dist/simulation/session_input_validation.d.ts +43 -0
- package/dist/simulation/session_input_validation.js +364 -0
- package/dist/simulation/session_inputs.d.ts +32 -0
- package/dist/simulation/session_inputs.js +154 -0
- package/dist/simulation/telemetry.d.ts +11 -14
- package/dist/simulation/telemetry.js +177 -54
- package/dist/simulation/toolkit/bounded_turns.d.ts +13 -0
- package/dist/simulation/toolkit/bounded_turns.js +80 -0
- package/dist/simulation/toolkit/dynamic_agents.d.ts +25 -0
- package/dist/simulation/toolkit/dynamic_agents.js +218 -0
- package/dist/simulation/toolkit/dynamic_digest.d.ts +1 -0
- package/dist/simulation/toolkit/dynamic_digest.js +8 -0
- package/dist/simulation/toolkit/dynamic_documents.d.ts +7 -0
- package/dist/simulation/toolkit/dynamic_documents.js +71 -0
- package/dist/simulation/toolkit/dynamic_driver.d.ts +8 -0
- package/dist/simulation/toolkit/dynamic_driver.js +269 -0
- package/dist/simulation/toolkit/dynamic_game.d.ts +53 -0
- package/dist/simulation/toolkit/dynamic_game.js +805 -0
- package/dist/simulation/toolkit/dynamic_knowledge.d.ts +15 -0
- package/dist/simulation/toolkit/dynamic_knowledge.js +91 -0
- package/dist/simulation/toolkit/dynamic_mechanics.d.ts +22 -0
- package/dist/simulation/toolkit/dynamic_mechanics.js +910 -0
- package/dist/simulation/toolkit/dynamic_meetings.d.ts +239 -0
- package/dist/simulation/toolkit/dynamic_meetings.js +350 -0
- package/dist/simulation/toolkit/dynamic_progress.d.ts +131 -0
- package/dist/simulation/toolkit/dynamic_progress.js +214 -0
- package/dist/simulation/toolkit/dynamic_projection.d.ts +9 -0
- package/dist/simulation/toolkit/dynamic_projection.js +219 -0
- package/dist/simulation/toolkit/dynamic_runtime.d.ts +412 -0
- package/dist/simulation/toolkit/dynamic_runtime.js +6536 -0
- package/dist/simulation/toolkit/dynamic_state.d.ts +111 -0
- package/dist/simulation/toolkit/dynamic_state.js +1967 -0
- package/dist/simulation/toolkit/dynamic_story_review.d.ts +508 -0
- package/dist/simulation/toolkit/dynamic_story_review.js +333 -0
- package/dist/simulation/toolkit/dynamic_storyteller.d.ts +77 -0
- package/dist/simulation/toolkit/dynamic_storyteller.js +114 -0
- package/dist/simulation/toolkit/dynamic_storyteller_runtime.d.ts +26 -0
- package/dist/simulation/toolkit/dynamic_storyteller_runtime.js +126 -0
- package/dist/simulation/toolkit/dynamic_world.d.ts +22 -0
- package/dist/simulation/toolkit/dynamic_world.js +377 -0
- package/dist/simulation/toolkit/structured_output.d.ts +5 -0
- package/dist/simulation/toolkit/structured_output.js +321 -0
- package/dist/simulation/types/world.d.ts +2 -0
- package/dist/simulation/world/artifact_store.js +1 -1
- package/dist/simulation/world/memory_manager.d.ts +5 -0
- package/dist/simulation/world/memory_manager.js +17 -2
- package/dist/simulation/world/state.d.ts +3 -2
- package/dist/simulation/world/state.js +15 -5
- package/dist/skills/bundled/measurement-validation/SKILL.md +144 -0
- package/dist/terminal_attach.d.ts +1 -0
- package/dist/terminal_attach.js +113 -0
- package/dist/tool_progress.d.ts +3 -0
- package/dist/tool_progress.js +27 -0
- package/dist/types.d.ts +145 -10
- package/dist/types.js +3 -0
- package/dist/ui/core/input.d.ts +3 -0
- package/dist/ui/core/input_segments.d.ts +18 -1
- package/dist/ui/core/input_segments.js +131 -47
- package/dist/ui/core/input_state.d.ts +12 -0
- package/dist/ui/core/layout_yoga.d.ts +1 -1
- package/dist/ui/core/turn_metadata.d.ts +5 -0
- package/dist/ui/core/turn_metadata.js +22 -0
- package/dist/ui/ink/render.d.ts +2 -1
- package/dist/ui/ink/render.js +6 -5
- package/dist/ui/ratatui/headless_pane_manager.d.ts +14 -1
- package/dist/ui/ratatui/headless_pane_manager.js +293 -104
- package/dist/ui/ratatui/index.d.ts +1 -0
- package/dist/ui/ratatui/input.d.ts +4 -0
- package/dist/ui/ratatui/input.js +15 -0
- package/dist/ui/ratatui/ipc_path.d.ts +2 -0
- package/dist/ui/ratatui/ipc_path.js +29 -1
- package/dist/ui/ratatui/mux_persistence.d.ts +3 -1
- package/dist/ui/ratatui/mux_persistence.js +139 -1
- package/dist/ui/ratatui/pane_relay.d.ts +1 -1
- package/dist/ui/ratatui/pane_relay.js +55 -27
- package/dist/ui/ratatui/process.d.ts +17 -1
- package/dist/ui/ratatui/process.js +80 -7
- package/dist/ui/ratatui/protocol.d.ts +236 -1
- package/dist/ui/ratatui/protocol.js +90 -0
- package/dist/ui/scrollback.d.ts +2 -1
- package/dist/ui/scrollback.js +9 -4
- package/dist/ui/stream_typewriter.d.ts +8 -3
- package/dist/ui/stream_typewriter.js +30 -1
- package/dist/ui/streaming_scrollback.d.ts +1 -0
- package/dist/ui/streaming_scrollback.js +1 -1
- package/dist/ui/transcript_render_cache.js +10 -0
- package/dist/ui/views/activity_line.d.ts +5 -3
- package/dist/ui/views/activity_line.js +65 -7
- package/dist/ui/views/app.d.ts +6 -3
- package/dist/ui/views/app.js +17 -6
- package/dist/ui/views/completion_menu.js +10 -5
- package/dist/ui/views/input_area.d.ts +7 -3
- package/dist/ui/views/input_area.js +15 -9
- package/dist/ui/views/message_list.d.ts +4 -1
- package/dist/ui/views/message_list.js +89 -19
- package/dist/ui/views/queue_panel.d.ts +3 -1
- package/dist/ui/views/queue_panel.js +9 -2
- package/dist/ui/views/status_bar.d.ts +4 -2
- package/dist/ui/views/status_bar.js +28 -13
- package/dist/ui/views/theme.d.ts +2 -0
- package/dist/ui/views/theme.js +2 -0
- package/dist/ui/widgets/color_panel.js +18 -0
- package/dist/ui/widgets/form.js +8 -0
- package/dist/ui/widgets/log_view.js +7 -0
- package/dist/ui/widgets/navigator_panel.js +8 -0
- package/dist/ui/widgets/prompt_viewer.js +2 -0
- package/dist/ui/widgets/questionnaire.d.ts +2 -0
- package/dist/ui/widgets/questionnaire.js +79 -16
- package/dist/ui/widgets/resume_panel.d.ts +2 -0
- package/dist/ui/widgets/resume_panel.js +26 -15
- package/dist/ui/widgets/rewind_panel.d.ts +2 -2
- package/dist/ui/widgets/rewind_panel.js +4 -2
- package/dist/ui/widgets/select.js +16 -27
- package/dist/ui/widgets/settings_panel.js +16 -0
- package/dist/ui/widgets/status_line_panel.d.ts +1 -0
- package/dist/ui/widgets/status_line_panel.js +30 -4
- package/dist/ui/widgets/text_input.d.ts +2 -0
- package/dist/ui/widgets/text_input.js +15 -1
- package/dist/ui/widgets/types.d.ts +2 -0
- package/dist/usage_projection.d.ts +24 -0
- package/dist/usage_projection.js +130 -0
- package/dist/usage_snapshot.d.ts +36 -0
- package/dist/usage_snapshot.js +131 -0
- package/dist/utils/assistant_message.d.ts +2 -0
- package/dist/utils/assistant_message.js +5 -0
- package/dist/utils/atomic_write.d.ts +6 -2
- package/dist/utils/atomic_write.js +29 -4
- package/dist/utils/checked_shell.d.ts +25 -0
- package/dist/utils/checked_shell.js +107 -0
- package/dist/utils/compaction.d.ts +4 -1
- package/dist/utils/compaction.js +31 -7
- package/dist/utils/context.d.ts +4 -4
- package/dist/utils/context.js +14 -12
- package/dist/utils/deepseek.d.ts +2 -2
- package/dist/utils/deepseek.js +13 -5
- package/dist/utils/ephemeral.js +4 -0
- package/dist/utils/ephemeral_tools.d.ts +18 -0
- package/dist/utils/ephemeral_tools.js +97 -0
- package/dist/utils/jev_client.d.ts +4 -0
- package/dist/utils/jev_client.js +15 -0
- package/dist/utils/model_cache.d.ts +15 -0
- package/dist/utils/model_cache.js +143 -0
- package/dist/utils/models.d.ts +4 -2
- package/dist/utils/models.js +12 -16
- package/dist/utils/reasoning.d.ts +8 -1
- package/dist/utils/reasoning.js +31 -11
- package/dist/utils/router_catalog.d.ts +49 -0
- package/dist/utils/router_catalog.js +271 -0
- package/dist/utils/sandbox.d.ts +9 -0
- package/dist/utils/sandbox.js +118 -15
- package/dist/utils/shell.d.ts +7 -0
- package/dist/utils/shell.js +98 -34
- package/dist/utils/subprocess_env.d.ts +3 -0
- package/dist/utils/subprocess_env.js +27 -1
- package/dist/web/accounts_mirror.d.ts +3 -1
- package/dist/web/accounts_mirror.js +13 -9
- package/dist/web/child_publication.d.ts +17 -0
- package/dist/web/child_publication.js +45 -0
- package/dist/web/mirror_authenticator.d.ts +31 -11
- package/dist/web/mirror_authenticator.js +67 -17
- package/dist/web/mirror_client.d.ts +31 -4
- package/dist/web/mirror_client.js +189 -23
- package/dist/web/mirror_stream.d.ts +84 -22
- package/dist/web/mirror_stream.js +676 -95
- package/dist/web/observer_query_redaction.d.ts +6 -0
- package/dist/web/observer_query_redaction.js +58 -0
- package/dist/web/pane_registry.d.ts +2 -0
- package/dist/web/pane_registry.js +86 -22
- package/dist/web/tool_image.d.ts +6 -0
- package/dist/web/tool_image.js +17 -0
- package/dist/web/view_plugin.d.ts +14 -0
- package/dist/web/view_plugin.js +23 -1
- package/dist/worker/executor.js +31 -12
- package/dist/worker/index.d.ts +1 -0
- package/dist/worker/toolsets.js +3 -1
- package/dist/worker/types.d.ts +12 -1
- package/dist/workflows/registry.js +1 -0
- package/dist/workflows/registry_handle.d.ts +2 -0
- package/dist/workflows/runtime.d.ts +2 -0
- package/dist/workflows/runtime.js +1 -0
- package/dist/workspace_agent.d.ts +7 -0
- package/dist/workspace_agent.js +36 -0
- package/dist/workspace_collision.d.ts +76 -0
- package/dist/workspace_collision.js +688 -0
- package/dist/workspace_layout.d.ts +18 -0
- package/dist/workspace_layout.js +121 -0
- package/dist/workspace_runtime.d.ts +44 -0
- package/dist/workspace_runtime.js +82 -0
- package/dist/workspace_session_context.d.ts +62 -0
- package/dist/workspace_session_context.js +160 -0
- package/dist/zlm-embed.mjs +32518 -9615
- package/dist/zlm.js +1 -0
- package/node_modules/@zerg/model-contracts/LICENSE.md +375 -0
- package/node_modules/@zerg/model-contracts/README.md +90 -0
- package/node_modules/@zerg/model-contracts/index.d.ts +20 -0
- package/node_modules/@zerg/model-contracts/index.js +223 -0
- package/node_modules/@zerg/model-contracts/package.json +8 -0
- package/node_modules/glob/node_modules/brace-expansion/index.js +78 -22
- package/node_modules/glob/node_modules/brace-expansion/package.json +1 -1
- package/node_modules/readdir-glob/node_modules/brace-expansion/index.js +78 -22
- package/node_modules/readdir-glob/node_modules/brace-expansion/package.json +1 -1
- package/package.json +45 -24
- package/packages/model-contracts/LICENSE.md +375 -0
- package/packages/model-contracts/README.md +90 -0
- package/packages/model-contracts/index.d.ts +20 -0
- package/packages/model-contracts/index.js +223 -0
- package/packages/model-contracts/package.json +8 -0
- package/remote-broker/Dockerfile +10 -0
- package/remote-broker/README.md +308 -0
- package/remote-broker/archive.py +1227 -0
- package/remote-broker/cutover.py +761 -0
- package/remote-broker/requirements.txt +5 -0
- package/remote-broker/resources.example.json +6 -0
- package/remote-broker/resources.write-staging.example.json +18 -0
- package/remote-broker/retained.py +686 -0
- package/remote-broker/retained_cleanup.py +550 -0
- package/remote-broker/server.py +648 -0
- package/scripts/build-remote-broker.mjs +13 -0
- package/scripts/ensure-local-packages.mjs +6 -0
- package/scripts/node-pty-helpers.mjs +103 -0
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { MAX_TIMER_DELAY_MS } from '../../config/api_retry.js';
|
|
2
|
+
const BODY_BYTES = 16 * 1024;
|
|
3
|
+
const DIAGNOSTIC_BYTES = 4 * 1024;
|
|
4
|
+
const BODY_TIMEOUT_MS = 1000;
|
|
5
|
+
const REDACTED = '[REDACTED]';
|
|
6
|
+
const CREDENTIAL_NAME = 'x[-_]api[-_]key|api[-_]?key|access[-_]?token|refresh[-_]?token|token|password|passwd|client[-_]?secret|secret|authorization|proxy-authorization|cookie|set-cookie';
|
|
7
|
+
const CREDENTIAL_KEY = new RegExp(`^(?:${CREDENTIAL_NAME})$`, 'i');
|
|
8
|
+
const CREDENTIAL_ASSIGNMENT = new RegExp(`(?:["']?)(?:${CREDENTIAL_NAME})(?:["']?)\\s*[:=]\\s*`, 'i');
|
|
9
|
+
/** Retains the canonical API-error envelope consumed by admission and OAuth adapters. */
|
|
10
|
+
export class BackendHttpError extends Error {
|
|
11
|
+
status;
|
|
12
|
+
body;
|
|
13
|
+
httpError;
|
|
14
|
+
/** Transport control only; never copied into the public body diagnostic. */
|
|
15
|
+
retryAtMs;
|
|
16
|
+
constructor(status, body, options = {}) {
|
|
17
|
+
const raw = boundedText(body, BODY_BYTES);
|
|
18
|
+
const state = options.bodyReadState ?? (raw.truncated ? 'truncated' : 'complete');
|
|
19
|
+
const safe = boundedCanonicalBody(redact(raw.text, options.headers, state !== 'complete'));
|
|
20
|
+
super(`${options.prefix ?? 'API'} error (${status}): ${safe.text}`);
|
|
21
|
+
this.name = 'BackendHttpError';
|
|
22
|
+
this.status = status;
|
|
23
|
+
this.body = safe.text;
|
|
24
|
+
if (status === 429) {
|
|
25
|
+
const now = Date.now();
|
|
26
|
+
this.retryAtMs = parseRetryDeadline(options.retryAfter, now, true)
|
|
27
|
+
?? parseRetryDeadline(options.rateLimitReset, now, false);
|
|
28
|
+
}
|
|
29
|
+
const diagnostic = boundedText(safe.text, DIAGNOSTIC_BYTES);
|
|
30
|
+
this.httpError = {
|
|
31
|
+
status,
|
|
32
|
+
body: diagnostic.text,
|
|
33
|
+
bodyTruncated: raw.truncated || safe.truncated || diagnostic.truncated || state !== 'complete',
|
|
34
|
+
bodyReadState: state,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function parseRetryDeadline(header, now, allowDate) {
|
|
39
|
+
if (header === undefined || header === null || header.length > 128)
|
|
40
|
+
return undefined;
|
|
41
|
+
const value = header.trim();
|
|
42
|
+
let delayMs;
|
|
43
|
+
if (/^\d+$/.test(value)) {
|
|
44
|
+
delayMs = Number(value) * 1000;
|
|
45
|
+
}
|
|
46
|
+
else if (allowDate && /^[A-Za-z]{3,9},? /.test(value)) {
|
|
47
|
+
// The obsolete asctime form has no zone; HTTP dates are always UTC.
|
|
48
|
+
const date = /^[A-Za-z]{3} [A-Za-z]{3} {1,2}\d{1,2} \d{2}:\d{2}:\d{2} \d{4}$/.test(value)
|
|
49
|
+
? `${value} GMT` : value;
|
|
50
|
+
delayMs = Date.parse(date) - now;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
if (!Number.isFinite(delayMs))
|
|
56
|
+
return undefined;
|
|
57
|
+
return now + Math.min(MAX_TIMER_DELAY_MS, Math.max(0, delayMs));
|
|
58
|
+
}
|
|
59
|
+
/** Respect a server's minimum wait, then spread concurrent callers by up to one second. */
|
|
60
|
+
export function retryAfterDelayMs(error) {
|
|
61
|
+
if (!(error instanceof BackendHttpError) || error.retryAtMs === undefined)
|
|
62
|
+
return 0;
|
|
63
|
+
const remaining = error.retryAtMs - Date.now();
|
|
64
|
+
if (remaining <= 0)
|
|
65
|
+
return 0;
|
|
66
|
+
return Math.min(MAX_TIMER_DELAY_MS, remaining + Math.floor(Math.random() * 1000));
|
|
67
|
+
}
|
|
68
|
+
/** Read at most 16 KiB, then cancel. A failed body never erases already-known status. */
|
|
69
|
+
export async function readHttpErrorBody(response, signal) {
|
|
70
|
+
if (!response.body)
|
|
71
|
+
return { body: '', bodyReadState: 'complete' };
|
|
72
|
+
const reader = response.body.getReader();
|
|
73
|
+
const decoder = new TextDecoder();
|
|
74
|
+
let bytes = 0;
|
|
75
|
+
let body = '';
|
|
76
|
+
let bodyReadState = 'complete';
|
|
77
|
+
let stopRead;
|
|
78
|
+
const stopped = new Promise(resolve => { stopRead = resolve; });
|
|
79
|
+
const timer = setTimeout(() => stopRead('timeout'), BODY_TIMEOUT_MS);
|
|
80
|
+
const aborted = () => stopRead('failed');
|
|
81
|
+
signal?.addEventListener('abort', aborted, { once: true });
|
|
82
|
+
if (signal?.aborted)
|
|
83
|
+
aborted();
|
|
84
|
+
try {
|
|
85
|
+
while (true) {
|
|
86
|
+
const next = await Promise.race([reader.read(), stopped]);
|
|
87
|
+
if (typeof next === 'string') {
|
|
88
|
+
bodyReadState = next;
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
if (next.done) {
|
|
92
|
+
body += decoder.decode();
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
const remaining = BODY_BYTES - bytes;
|
|
96
|
+
body += decoder.decode(next.value.subarray(0, remaining), { stream: true });
|
|
97
|
+
bytes += Math.min(next.value.byteLength, remaining);
|
|
98
|
+
if (next.value.byteLength > remaining) {
|
|
99
|
+
bodyReadState = 'truncated';
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
bodyReadState = 'failed';
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
clearTimeout(timer);
|
|
109
|
+
signal?.removeEventListener('abort', aborted);
|
|
110
|
+
// Cancellation is best-effort: a broken peer must not hold diagnostics open.
|
|
111
|
+
if (bodyReadState !== 'complete')
|
|
112
|
+
void reader.cancel().catch(() => { });
|
|
113
|
+
reader.releaseLock();
|
|
114
|
+
}
|
|
115
|
+
return { body, bodyReadState };
|
|
116
|
+
}
|
|
117
|
+
function boundedText(text, maxBytes) {
|
|
118
|
+
const bytes = Buffer.from(text);
|
|
119
|
+
if (bytes.length <= maxBytes)
|
|
120
|
+
return { text, truncated: false };
|
|
121
|
+
// Streaming decode drops a split final code point rather than exceeding the byte cap.
|
|
122
|
+
return { text: new TextDecoder().decode(bytes.subarray(0, maxBytes), { stream: true }), truncated: true };
|
|
123
|
+
}
|
|
124
|
+
function boundedCanonicalBody(text) {
|
|
125
|
+
const bounded = boundedText(text, BODY_BYTES);
|
|
126
|
+
if (!bounded.truncated)
|
|
127
|
+
return bounded;
|
|
128
|
+
try {
|
|
129
|
+
const value = JSON.parse(text);
|
|
130
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
131
|
+
return bounded;
|
|
132
|
+
const source = value;
|
|
133
|
+
// Redaction can expand a complete body. Retain the small canonical fields
|
|
134
|
+
// used by admission and Kimi rate-limit parsing instead of cutting JSON.
|
|
135
|
+
const keys = ['type', 'status', 'statusCode', 'code', 'message', 'detail', 'statusMessage', 'retry_after', 'resets_at', 'provider_dispatched', 'source', 'limit', 'resetSeconds'];
|
|
136
|
+
const project = (record) => Object.fromEntries(keys.flatMap(key => {
|
|
137
|
+
const item = record[key];
|
|
138
|
+
// 39 strings × 64 bytes × worst-case JSON escaping stays below 16 KiB.
|
|
139
|
+
return typeof item === 'string' ? [[key, boundedText(item, 64).text]]
|
|
140
|
+
: typeof item === 'number' || typeof item === 'boolean' ? [[key, item]] : [];
|
|
141
|
+
}));
|
|
142
|
+
const result = project(source);
|
|
143
|
+
for (const key of ['error', 'data']) {
|
|
144
|
+
const item = source[key];
|
|
145
|
+
if (item && typeof item === 'object' && !Array.isArray(item))
|
|
146
|
+
result[key] = project(item);
|
|
147
|
+
else if (typeof item === 'string')
|
|
148
|
+
result[key] = boundedText(item, 64).text;
|
|
149
|
+
else if (typeof item === 'boolean')
|
|
150
|
+
result[key] = item;
|
|
151
|
+
}
|
|
152
|
+
return { text: JSON.stringify(result), truncated: true };
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return bounded;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
function redact(text, headers, incomplete) {
|
|
159
|
+
const secrets = new Set();
|
|
160
|
+
for (const [name, value] of new Headers(headers)) {
|
|
161
|
+
if (!/authorization|api[-_]?key|token|secret|credential|cookie/i.test(name) || !value)
|
|
162
|
+
continue;
|
|
163
|
+
secrets.add(value);
|
|
164
|
+
if (/^(?:Bearer|Basic)\s+/i.test(value))
|
|
165
|
+
secrets.add(value.replace(/^\S+\s+/, ''));
|
|
166
|
+
if (/cookie/i.test(name)) {
|
|
167
|
+
for (const part of value.split(';')) {
|
|
168
|
+
const separator = part.indexOf('=');
|
|
169
|
+
if (separator >= 0 && part.slice(separator + 1).trim())
|
|
170
|
+
secrets.add(part.slice(separator + 1).trim());
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
try {
|
|
175
|
+
// Decode strings first: credential labels embedded in JSON messages may be
|
|
176
|
+
// escaped on the wire. Sanitizing raw JSON could leave part of that value.
|
|
177
|
+
return JSON.stringify(JSON.parse(text, (key, value) => {
|
|
178
|
+
if (CREDENTIAL_KEY.test(key))
|
|
179
|
+
return REDACTED;
|
|
180
|
+
if (value !== null && typeof value === 'object' && !Array.isArray(value)) {
|
|
181
|
+
return Object.fromEntries(Object.entries(value).map(([name, item]) => [redactText(name, secrets, false), item]));
|
|
182
|
+
}
|
|
183
|
+
return typeof value === 'string' ? redactText(value, secrets, false) : value;
|
|
184
|
+
}));
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
// A cut JSON message can leave escaped quote delimiters around a credential
|
|
188
|
+
// label. Normalize those delimiters before the conservative raw-body pass.
|
|
189
|
+
return redactText(text.replace(/\\+(["'])/g, '$1'), secrets, incomplete);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
function redactText(text, secrets, incomplete) {
|
|
193
|
+
if (incomplete) {
|
|
194
|
+
// An unfinished quoted credential can contain whitespace. None of the
|
|
195
|
+
// remaining tail is reliable as a delimiter, so keep only its label.
|
|
196
|
+
const assignment = CREDENTIAL_ASSIGNMENT.exec(text);
|
|
197
|
+
if (assignment)
|
|
198
|
+
text = text.slice(0, assignment.index + assignment[0].length) + REDACTED;
|
|
199
|
+
}
|
|
200
|
+
for (const secret of [...secrets].sort((a, b) => b.length - a.length)) {
|
|
201
|
+
for (const form of new Set([secret, JSON.stringify(secret).slice(1, -1), encodeURIComponent(secret)])) {
|
|
202
|
+
text = text.split(form).join(REDACTED);
|
|
203
|
+
if (incomplete) {
|
|
204
|
+
// A raw capture may end inside an echoed credential. Remove its suffix
|
|
205
|
+
// even when the full value never arrived inside our byte budget.
|
|
206
|
+
for (let start = text.lastIndexOf(form[0]); start >= 0; start = text.lastIndexOf(form[0], start - 1)) {
|
|
207
|
+
if (form.startsWith(text.slice(start))) {
|
|
208
|
+
text = text.slice(0, start) + REDACTED;
|
|
209
|
+
break;
|
|
210
|
+
}
|
|
211
|
+
if (start === 0)
|
|
212
|
+
break;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return text
|
|
218
|
+
.replace(/\b(Bearer|Basic)\s+[A-Za-z0-9._~+/=-]+/gi, '$1 [REDACTED]')
|
|
219
|
+
.replace(/((?:["']?)(?:x[-_]api[-_]key|api[-_]?key|access[-_]?token|refresh[-_]?token|token|password|passwd|client[-_]?secret|secret|authorization|proxy-authorization|cookie|set-cookie)(?:["']?)\s*[:=]\s*)("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|[^\s,;}\]]+)/gi, (_match, key, value) => `${key}${value.startsWith('"') ? '"[REDACTED]"' : value.startsWith("'") ? "'[REDACTED]'" : REDACTED}`)
|
|
220
|
+
.replace(/\bsk-[A-Za-z0-9_-]+/g, REDACTED);
|
|
221
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
export { AnthropicBackend, AnthropicApiError } from './anthropic.js';
|
|
1
|
+
export { AnthropicBackend, AnthropicApiError, createNativeAnthropicMessagesRouterBackend } from './anthropic.js';
|
|
2
|
+
export type { NativeAnthropicMessagesRouterConfig } from './anthropic.js';
|
|
2
3
|
export { OpenAIBackend } from './openai.js';
|
|
3
4
|
export { OpenAICompatibleBackend } from './openai_compatible.js';
|
|
4
5
|
export { OpenAIResponsesBackend } from './openai_responses.js';
|
|
@@ -14,7 +15,7 @@ export { ClarifaiBackend, normalizeClarifaiModel, CLARIFAI_BASE_URL } from './cl
|
|
|
14
15
|
export { ClaudeCodeAuthBackend, ClaudeCodeAuthManager } from './claude_code_auth.js';
|
|
15
16
|
export { KimiCodeAuthBackend, KimiCodeAuthManager, KIMI_CODE_AUTH_SENTINEL, KIMI_CODE_PROVIDER, hasUsableKimiCodeAuth } from './kimi_code_auth.js';
|
|
16
17
|
export { ClaudeCliBackend, ClaudeCliError, CLAUDE_CODE_AUTH_SENTINEL, hasUsableClaudeCodeCliAuth as hasUsableClaudeCodeAuth } from './claude_cli.js';
|
|
17
|
-
export type { AgentBackend, BackendObservation, BackendRequest, BackendResponse, ContentBlock, TextBlock, ToolUseBlock, LlmMessage, RequestContentBlock, RequestVideoBlock, ToolResultBlock, TokenUsage, StreamEvent } from './types.js';
|
|
18
|
+
export type { AgentBackend, BackendObservation, BackendRequest, BackendResponse, ContentBlock, TextBlock, ToolUseBlock, ThinkingBlock, RedactedThinkingBlock, LlmMessage, RequestContentBlock, RequestVideoBlock, ToolResultBlock, TokenUsage, StreamEvent } from './types.js';
|
|
18
19
|
import type { AgentBackend, BackendRequest, BackendResponse, StreamEvent } from './types.js';
|
|
19
20
|
import { AccountPool, type RotationMode } from './account_rotation.js';
|
|
20
21
|
import type { Message } from '../../types.js';
|
|
@@ -58,7 +59,10 @@ export interface CreateBackendOptions {
|
|
|
58
59
|
export declare class TracedBackend implements AgentBackend {
|
|
59
60
|
private readonly provider;
|
|
60
61
|
private readonly backend;
|
|
62
|
+
get preservesNativeHistory(): boolean;
|
|
63
|
+
isAuthenticationConfigured(): boolean;
|
|
61
64
|
constructor(provider: string, backend: AgentBackend);
|
|
65
|
+
getModelCapabilities(model: string): import("../../utils/router_catalog.js").RouterModelCapabilities | undefined;
|
|
62
66
|
steerUserMessage(message: Message): Promise<boolean>;
|
|
63
67
|
/** Forward disposal so a process-backed inner (RotatingBackend, codex child)
|
|
64
68
|
* is closed when the agent is. Without this, tracing (ZTC_BACKEND_TRACE=1)
|
|
@@ -66,6 +70,9 @@ export declare class TracedBackend implements AgentBackend {
|
|
|
66
70
|
close(): void;
|
|
67
71
|
/** Forward the wrapped backend's per-request streaming nature so the agent's path choice is unchanged by tracing. */
|
|
68
72
|
streamsSyntheticallyFor(request: BackendRequest): boolean;
|
|
73
|
+
allowsRequestRetryAfterFailure(request: BackendRequest): boolean;
|
|
74
|
+
allowsBufferedFallbackAfterStreamFailure(request: BackendRequest): boolean;
|
|
75
|
+
handlesTransportRetries(request: BackendRequest): boolean;
|
|
69
76
|
generate(request: BackendRequest): Promise<BackendResponse>;
|
|
70
77
|
generateStream(request: BackendRequest): AsyncIterable<StreamEvent>;
|
|
71
78
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { AnthropicBackend, AnthropicApiError } from './anthropic.js';
|
|
1
|
+
export { AnthropicBackend, AnthropicApiError, createNativeAnthropicMessagesRouterBackend } from './anthropic.js';
|
|
2
2
|
export { OpenAIBackend } from './openai.js';
|
|
3
3
|
export { OpenAICompatibleBackend } from './openai_compatible.js';
|
|
4
4
|
export { OpenAIResponsesBackend } from './openai_responses.js';
|
|
@@ -34,10 +34,13 @@ import { RotatingBackend } from './account_rotation.js';
|
|
|
34
34
|
export class TracedBackend {
|
|
35
35
|
provider;
|
|
36
36
|
backend;
|
|
37
|
+
get preservesNativeHistory() { return this.backend.preservesNativeHistory ?? false; }
|
|
38
|
+
isAuthenticationConfigured() { return this.backend.isAuthenticationConfigured?.() ?? false; }
|
|
37
39
|
constructor(provider, backend) {
|
|
38
40
|
this.provider = provider;
|
|
39
41
|
this.backend = backend;
|
|
40
42
|
}
|
|
43
|
+
getModelCapabilities(model) { return this.backend.getModelCapabilities?.(model); }
|
|
41
44
|
async steerUserMessage(message) {
|
|
42
45
|
return this.backend.steerUserMessage?.(message) ?? false;
|
|
43
46
|
}
|
|
@@ -51,6 +54,15 @@ export class TracedBackend {
|
|
|
51
54
|
streamsSyntheticallyFor(request) {
|
|
52
55
|
return this.backend.streamsSyntheticallyFor?.(request) ?? false;
|
|
53
56
|
}
|
|
57
|
+
allowsRequestRetryAfterFailure(request) {
|
|
58
|
+
return this.backend.allowsRequestRetryAfterFailure?.(request) ?? true;
|
|
59
|
+
}
|
|
60
|
+
allowsBufferedFallbackAfterStreamFailure(request) {
|
|
61
|
+
return this.backend.allowsBufferedFallbackAfterStreamFailure?.(request) ?? true;
|
|
62
|
+
}
|
|
63
|
+
handlesTransportRetries(request) {
|
|
64
|
+
return this.backend.handlesTransportRetries?.(request) ?? false;
|
|
65
|
+
}
|
|
54
66
|
async generate(request) {
|
|
55
67
|
writeBackendTrace({ event: 'request', provider: this.provider, backend: this.backend.constructor.name, model: request.model });
|
|
56
68
|
const startedAt = Date.now();
|
|
@@ -148,10 +160,17 @@ export function createBackendForProvider(provider, opts) {
|
|
|
148
160
|
return traced(provider, new KimiBackend({ apiKey: opts.apiKey }));
|
|
149
161
|
case 'deepseek':
|
|
150
162
|
return traced(provider, new OpenAICompatibleBackend({
|
|
163
|
+
provider: 'deepseek',
|
|
151
164
|
apiKey: opts.apiKey,
|
|
152
165
|
baseUrl: opts.baseUrl || 'https://api.deepseek.com/v1',
|
|
153
166
|
requestBodyExtras: deepseekRequestParams,
|
|
154
167
|
}));
|
|
168
|
+
case 'fireworks':
|
|
169
|
+
return traced(provider, new OpenAICompatibleBackend({
|
|
170
|
+
apiKey: opts.apiKey,
|
|
171
|
+
baseUrl: opts.baseUrl || 'https://api.fireworks.ai/inference/v1',
|
|
172
|
+
provider: 'fireworks',
|
|
173
|
+
}));
|
|
155
174
|
case 'clarifai':
|
|
156
175
|
return traced(provider, new ClarifaiBackend({ apiKey: opts.apiKey, headers: opts.extraHeaders }));
|
|
157
176
|
case CODEX_APP_SERVER_PROVIDER:
|
|
@@ -206,7 +225,8 @@ export function createBackendForProvider(provider, opts) {
|
|
|
206
225
|
}
|
|
207
226
|
case 'anthropic':
|
|
208
227
|
case 'claude':
|
|
209
|
-
default:
|
|
210
228
|
return traced(provider, new AnthropicBackend({ apiKey: opts.apiKey, apiEndpoint: opts.apiEndpoint }));
|
|
229
|
+
default:
|
|
230
|
+
throw new Error(`Unknown provider: ${provider}. Select a Router integration or a supported direct provider.`);
|
|
211
231
|
}
|
|
212
232
|
}
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OpenAI backend — smart router between Chat Completions and Responses API.
|
|
3
|
-
*
|
|
4
|
-
* Codex models and GPT-6 Sol/Luna use Responses so reasoning and tool calls
|
|
5
|
-
* can be combined. Everything else goes through Chat Completions.
|
|
6
|
-
*/
|
|
7
1
|
import { AgentBackend, BackendRequest, BackendResponse, StreamEvent } from './types.js';
|
|
8
2
|
interface OpenAIConfig {
|
|
9
3
|
apiKey: string;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
import { modelContract } from '@zerg/model-contracts';
|
|
1
2
|
/**
|
|
2
3
|
* OpenAI backend — smart router between Chat Completions and Responses API.
|
|
3
4
|
*
|
|
4
|
-
* Codex models and
|
|
5
|
+
* Codex models and reviewed Responses tool models use Responses so reasoning and tool calls
|
|
5
6
|
* can be combined. Everything else goes through Chat Completions.
|
|
6
7
|
*/
|
|
7
8
|
import { OpenAICompatibleBackend } from './openai_compatible.js';
|
|
@@ -12,7 +13,8 @@ const RESPONSES_API_PATTERNS = [
|
|
|
12
13
|
/^gpt-6-(?:sol|luna)$/i,
|
|
13
14
|
];
|
|
14
15
|
function needsResponsesAPI(model) {
|
|
15
|
-
return
|
|
16
|
+
return modelContract('openai', model)?.chatToolReasoningEfforts !== undefined
|
|
17
|
+
|| RESPONSES_API_PATTERNS.some(p => p.test(model));
|
|
16
18
|
}
|
|
17
19
|
export class OpenAIBackend {
|
|
18
20
|
chatBackend;
|
|
@@ -23,6 +25,7 @@ export class OpenAIBackend {
|
|
|
23
25
|
apiKey: config.apiKey,
|
|
24
26
|
baseUrl,
|
|
25
27
|
apiPath: '/chat/completions',
|
|
28
|
+
provider: 'openai',
|
|
26
29
|
});
|
|
27
30
|
this.responsesBackend = new OpenAIResponsesBackend({
|
|
28
31
|
apiKey: config.apiKey,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { BackendHttpError } from './http_error.js';
|
|
1
2
|
import { AgentBackend, BackendRequest, BackendResponse, StreamEvent } from './types.js';
|
|
2
3
|
interface OpenAICompatibleConfig {
|
|
3
4
|
apiKey: string;
|
|
@@ -18,12 +19,11 @@ interface OpenAICompatibleConfig {
|
|
|
18
19
|
* Cannot override `model`/`messages`/`tools`/the token limit — those are set
|
|
19
20
|
* after this spread.
|
|
20
21
|
*/
|
|
22
|
+
provider?: string;
|
|
21
23
|
requestBodyExtras?: (request: BackendRequest) => Record<string, unknown>;
|
|
22
24
|
}
|
|
23
|
-
export declare class OpenAICompatibleApiError extends
|
|
24
|
-
|
|
25
|
-
readonly body: string;
|
|
26
|
-
constructor(status: number, body: string);
|
|
25
|
+
export declare class OpenAICompatibleApiError extends BackendHttpError {
|
|
26
|
+
constructor(status: number, body: string, options?: ConstructorParameters<typeof BackendHttpError>[2]);
|
|
27
27
|
}
|
|
28
28
|
export declare class OpenAICompatibleBackend implements AgentBackend {
|
|
29
29
|
private apiKey;
|
|
@@ -31,6 +31,7 @@ export declare class OpenAICompatibleBackend implements AgentBackend {
|
|
|
31
31
|
private apiPath;
|
|
32
32
|
private headers;
|
|
33
33
|
private extraBody;
|
|
34
|
+
private provider?;
|
|
34
35
|
private requestBodyExtras?;
|
|
35
36
|
private authTokenProvider?;
|
|
36
37
|
constructor(config: OpenAICompatibleConfig);
|
|
@@ -1,18 +1,16 @@
|
|
|
1
|
+
import { fireworksRequestModel, modelContract, reasoningRequestParams } from '@zerg/model-contracts';
|
|
1
2
|
import { measureResponse, measureStream } from './request_metrics.js';
|
|
3
|
+
import { BackendHttpError, readHttpErrorBody } from './http_error.js';
|
|
2
4
|
import { parseSSEStream } from './sse.js';
|
|
3
5
|
import { parseTokenUsage } from './token_usage.js';
|
|
4
6
|
import { buildOpenAIMessages, buildOpenAIToolDefs } from './openai_format.js';
|
|
5
7
|
import { isKimiModel } from './kimi_params.js';
|
|
6
8
|
import { normalizeOpenAICompatibleCompletionState } from '../completion_state.js';
|
|
7
9
|
import { DEEPSEEK_FLASH_MAX_OUTPUT, isDeepSeekFlashModel } from '../../utils/deepseek.js';
|
|
8
|
-
export class OpenAICompatibleApiError extends
|
|
9
|
-
status
|
|
10
|
-
|
|
11
|
-
constructor(status, body) {
|
|
12
|
-
super(`API error (${status}): ${body}`);
|
|
10
|
+
export class OpenAICompatibleApiError extends BackendHttpError {
|
|
11
|
+
constructor(status, body, options) {
|
|
12
|
+
super(status, body, options);
|
|
13
13
|
this.name = 'OpenAICompatibleApiError';
|
|
14
|
-
this.status = status;
|
|
15
|
-
this.body = body;
|
|
16
14
|
}
|
|
17
15
|
}
|
|
18
16
|
export class OpenAICompatibleBackend {
|
|
@@ -21,6 +19,7 @@ export class OpenAICompatibleBackend {
|
|
|
21
19
|
apiPath;
|
|
22
20
|
headers;
|
|
23
21
|
extraBody;
|
|
22
|
+
provider;
|
|
24
23
|
requestBodyExtras;
|
|
25
24
|
authTokenProvider;
|
|
26
25
|
constructor(config) {
|
|
@@ -29,6 +28,7 @@ export class OpenAICompatibleBackend {
|
|
|
29
28
|
this.apiPath = config.apiPath || '/chat/completions';
|
|
30
29
|
this.headers = config.headers || {};
|
|
31
30
|
this.extraBody = config.extraBody || {};
|
|
31
|
+
this.provider = config.provider;
|
|
32
32
|
this.requestBodyExtras = config.requestBodyExtras;
|
|
33
33
|
this.authTokenProvider = config.authTokenProvider;
|
|
34
34
|
}
|
|
@@ -39,29 +39,36 @@ export class OpenAICompatibleBackend {
|
|
|
39
39
|
// O-series (o1, o3, o4-mini) and GPT-5/6 use max_completion_tokens instead of
|
|
40
40
|
// max_tokens; Moonshot marks max_tokens "Deprecated, please refer to
|
|
41
41
|
// max_completion_tokens" for the Kimi models too.
|
|
42
|
-
const useCompletionTokens = /^o\d/.test(request.model)
|
|
42
|
+
const useCompletionTokens = this.provider === 'fireworks' ? false : /^o\d/.test(request.model)
|
|
43
43
|
|| /^gpt-[56]/.test(request.model)
|
|
44
44
|
|| isKimiModel(request.model);
|
|
45
45
|
// Cap max_tokens for models with lower limits (gpt-4o: 16384)
|
|
46
46
|
const isGpt4o = request.model.startsWith('gpt-4o');
|
|
47
|
-
const
|
|
47
|
+
const reviewedLimit = this.provider ? modelContract(this.provider, request.model)?.maxOutputTokens?.max : undefined;
|
|
48
|
+
const limit = reviewedLimit ?? (isGpt4o ? 16384 : isDeepSeekFlashModel(request.model) ? DEEPSEEK_FLASH_MAX_OUTPUT : Infinity);
|
|
48
49
|
const effectiveMaxTokens = request.maxTokens === undefined ? undefined : Math.min(request.maxTokens, limit);
|
|
49
50
|
const tokenParam = effectiveMaxTokens === undefined ? {} : useCompletionTokens
|
|
50
51
|
? { max_completion_tokens: effectiveMaxTokens }
|
|
51
52
|
: { max_tokens: effectiveMaxTokens };
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
53
|
+
// Chat tool support differs from Responses. Never silently downgrade an
|
|
54
|
+
// explicit grade; default Chat requests use the reviewed tool-safe value.
|
|
55
|
+
const policyProvider = this.provider ?? 'openai';
|
|
56
|
+
const chatEfforts = modelContract(policyProvider, request.model)?.chatToolReasoningEfforts;
|
|
57
|
+
const toolRestricted = request.tools.length > 0 && chatEfforts !== undefined;
|
|
58
|
+
if (toolRestricted && request.codexEffort !== undefined && !chatEfforts.includes(request.codexEffort)) {
|
|
59
|
+
throw new Error('Use Responses for graded reasoning with tools on this model. Chat Completions supports effort none.');
|
|
60
|
+
}
|
|
61
|
+
const reasoningEffort = toolRestricted ? request.codexEffort ?? 'none' : request.codexEffort;
|
|
56
62
|
const body = {
|
|
57
63
|
...this.extraBody,
|
|
64
|
+
...reasoningRequestParams(policyProvider, request.model, reasoningEffort),
|
|
58
65
|
...(this.requestBodyExtras?.(request) ?? {}),
|
|
59
|
-
model: request.model,
|
|
66
|
+
model: this.provider === 'fireworks' ? fireworksRequestModel(request.model) : request.model,
|
|
60
67
|
...tokenParam,
|
|
61
68
|
// Chat Completions accepts GPT-6 Sol/Luna function tools only with
|
|
62
69
|
// reasoning disabled. The direct OpenAI backend uses Responses instead;
|
|
63
70
|
// keep this rule for explicitly configured compatible endpoints.
|
|
64
|
-
...(
|
|
71
|
+
...(toolRestricted ? { reasoning_effort: reasoningEffort } : {}),
|
|
65
72
|
messages: buildOpenAIMessages(request),
|
|
66
73
|
...(request.tools.length > 0 ? { tools: buildOpenAIToolDefs(request.tools) } : {})
|
|
67
74
|
};
|
|
@@ -97,8 +104,8 @@ export class OpenAICompatibleBackend {
|
|
|
97
104
|
'Check network access, proxy configuration, and API key/model access.');
|
|
98
105
|
}
|
|
99
106
|
if (!response.ok) {
|
|
100
|
-
const
|
|
101
|
-
throw new OpenAICompatibleApiError(response.status,
|
|
107
|
+
const failure = await readHttpErrorBody(response, request.signal);
|
|
108
|
+
throw new OpenAICompatibleApiError(response.status, failure.body, { headers, bodyReadState: failure.bodyReadState });
|
|
102
109
|
}
|
|
103
110
|
const data = await response.json();
|
|
104
111
|
const choice = data.choices?.[0];
|
|
@@ -168,8 +175,8 @@ export class OpenAICompatibleBackend {
|
|
|
168
175
|
'Check network access, proxy configuration, and API key/model access.');
|
|
169
176
|
}
|
|
170
177
|
if (!response.ok) {
|
|
171
|
-
const
|
|
172
|
-
throw new OpenAICompatibleApiError(response.status,
|
|
178
|
+
const failure = await readHttpErrorBody(response, request.signal);
|
|
179
|
+
throw new OpenAICompatibleApiError(response.status, failure.body, { headers, bodyReadState: failure.bodyReadState });
|
|
173
180
|
}
|
|
174
181
|
if (!response.body) {
|
|
175
182
|
throw new Error('API error: no response body for streaming request');
|
|
@@ -72,9 +72,14 @@ export declare function isValidResponsesOutputItem(value: unknown): value is Rec
|
|
|
72
72
|
export declare function requireValidResponsesOutputItem(value: unknown): asserts value is Record<string, unknown>;
|
|
73
73
|
/** A terminal event must carry a valid response shape or follow real output. */
|
|
74
74
|
export declare function isValidResponsesTerminal(value: unknown, observedOutput?: boolean): value is Record<string, unknown>;
|
|
75
|
-
export declare const MAX_RESPONSES_RESPONSE_BYTES
|
|
75
|
+
export declare const MAX_RESPONSES_RESPONSE_BYTES: number;
|
|
76
|
+
export declare const MAX_PROVIDER_ERROR_BYTES: number;
|
|
77
|
+
export declare const MAX_RESPONSES_SSE_EVENT_BYTES: number;
|
|
78
|
+
export declare const MAX_RESPONSES_SSE_STREAM_BYTES: number;
|
|
76
79
|
/** Read a provider body without allowing fetch helpers to buffer it without limit. */
|
|
77
|
-
export declare function readBoundedResponsesText(response: Response): Promise<string>;
|
|
80
|
+
export declare function readBoundedResponsesText(response: Response, maxBytes?: number): Promise<string>;
|
|
81
|
+
/** Keep the HTTP status authoritative when an oversized diagnostic must be omitted. */
|
|
82
|
+
export declare function readBoundedProviderError(response: Response): Promise<string>;
|
|
78
83
|
interface InputTextContent {
|
|
79
84
|
type: 'input_text';
|
|
80
85
|
text: string;
|
|
@@ -128,7 +133,7 @@ export declare function parseResponsesOutput(data: {
|
|
|
128
133
|
* request was sent with `stream: true`). If the body isn't readable (rare), it
|
|
129
134
|
* buffers the SSE text and parses it whole — the same events, just not live.
|
|
130
135
|
*/
|
|
131
|
-
export declare function streamResponsesSSE(response: Response): AsyncIterable<StreamEvent>;
|
|
136
|
+
export declare function streamResponsesSSE(response: Response, maxBytes?: number): AsyncIterable<StreamEvent>;
|
|
132
137
|
export declare class OpenAIResponsesBackend extends BaseBackend {
|
|
133
138
|
private apiKey;
|
|
134
139
|
private baseUrl;
|