@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
|
@@ -101,8 +101,12 @@ export declare class RotatingBackend implements AgentBackend {
|
|
|
101
101
|
*/
|
|
102
102
|
private current;
|
|
103
103
|
private steeringAccepted;
|
|
104
|
+
private lastRequestRetryAllowed;
|
|
104
105
|
constructor(opts: RotatingBackendOptions);
|
|
105
106
|
steerUserMessage(message: Message): Promise<boolean>;
|
|
107
|
+
/** Preserve the admission decision of the backend that actually dispatched,
|
|
108
|
+
* even after rotation selects a different account for the next user turn. */
|
|
109
|
+
allowsRequestRetryAfterFailure(): boolean;
|
|
106
110
|
/** Close a per-turn inner and forget it as current if it still is. */
|
|
107
111
|
private releaseInner;
|
|
108
112
|
/**
|
|
@@ -121,6 +121,7 @@ export class RotatingBackend {
|
|
|
121
121
|
*/
|
|
122
122
|
current = null;
|
|
123
123
|
steeringAccepted = false;
|
|
124
|
+
lastRequestRetryAllowed = true;
|
|
124
125
|
constructor(opts) {
|
|
125
126
|
this.opts = opts;
|
|
126
127
|
this.now = opts.now ?? (() => Date.now());
|
|
@@ -131,6 +132,9 @@ export class RotatingBackend {
|
|
|
131
132
|
this.steeringAccepted = true;
|
|
132
133
|
return accepted;
|
|
133
134
|
}
|
|
135
|
+
/** Preserve the admission decision of the backend that actually dispatched,
|
|
136
|
+
* even after rotation selects a different account for the next user turn. */
|
|
137
|
+
allowsRequestRetryAfterFailure() { return this.lastRequestRetryAllowed; }
|
|
134
138
|
/** Close a per-turn inner and forget it as current if it still is. */
|
|
135
139
|
releaseInner(inner) {
|
|
136
140
|
if (this.current === inner) {
|
|
@@ -229,6 +233,7 @@ export class RotatingBackend {
|
|
|
229
233
|
if (!account)
|
|
230
234
|
throw this.terminalError();
|
|
231
235
|
const inner = this.current = this.opts.buildInner(account);
|
|
236
|
+
this.lastRequestRetryAllowed = inner.allowsRequestRetryAfterFailure?.(req) !== false;
|
|
232
237
|
this.steeringAccepted = false;
|
|
233
238
|
try {
|
|
234
239
|
return await inner.generate(req);
|
|
@@ -250,7 +255,7 @@ export class RotatingBackend {
|
|
|
250
255
|
const next = this.rotate(account, sig);
|
|
251
256
|
// A dynamic tool already ran this turn -> replaying re-fires its side
|
|
252
257
|
// effect. Cool the failed account for the next turn, but surface this error.
|
|
253
|
-
if (replayUnsafe || this.steeringAccepted)
|
|
258
|
+
if (!this.lastRequestRetryAllowed || replayUnsafe || this.steeringAccepted)
|
|
254
259
|
throw error;
|
|
255
260
|
if (!next)
|
|
256
261
|
throw this.terminalError();
|
|
@@ -273,6 +278,7 @@ export class RotatingBackend {
|
|
|
273
278
|
throw this.terminalError();
|
|
274
279
|
let emitted = false;
|
|
275
280
|
const inner = this.current = this.opts.buildInner(account);
|
|
281
|
+
this.lastRequestRetryAllowed = inner.allowsRequestRetryAfterFailure?.(req) !== false;
|
|
276
282
|
this.steeringAccepted = false;
|
|
277
283
|
try {
|
|
278
284
|
// generateStream is required on AgentBackend — no fallback probe.
|
|
@@ -299,7 +305,7 @@ export class RotatingBackend {
|
|
|
299
305
|
const next = this.rotate(account, sig);
|
|
300
306
|
// Mid-stream partial output OR a dynamic tool that already ran -> can't
|
|
301
307
|
// replay cleanly. Pool is rotated for the next turn; surface this error.
|
|
302
|
-
if (emitted || replayUnsafe || this.steeringAccepted)
|
|
308
|
+
if (!this.lastRequestRetryAllowed || emitted || replayUnsafe || this.steeringAccepted)
|
|
303
309
|
throw error;
|
|
304
310
|
if (!next)
|
|
305
311
|
throw this.terminalError();
|
|
@@ -4,14 +4,27 @@ interface AnthropicBackendConfig {
|
|
|
4
4
|
authToken?: string;
|
|
5
5
|
authTokenProvider?: () => Promise<string>;
|
|
6
6
|
apiEndpoint?: string;
|
|
7
|
+
validateStrictTools?: boolean;
|
|
8
|
+
preserveNativeHistory?: boolean;
|
|
7
9
|
}
|
|
10
|
+
export interface NativeAnthropicMessagesRouterConfig {
|
|
11
|
+
baseUrl: string;
|
|
12
|
+
authToken?: string;
|
|
13
|
+
authTokenProvider?: () => Promise<string>;
|
|
14
|
+
}
|
|
15
|
+
/** Hosted transport with no provider-key or ambient-credential path. */
|
|
16
|
+
export declare function createNativeAnthropicMessagesRouterBackend(config: NativeAnthropicMessagesRouterConfig): AnthropicBackend;
|
|
8
17
|
export declare class AnthropicBackend implements AgentBackend {
|
|
18
|
+
readonly preservesNativeHistory: boolean;
|
|
9
19
|
private apiKey?;
|
|
10
20
|
private authToken?;
|
|
11
21
|
private authTokenProvider?;
|
|
12
22
|
private apiEndpoint;
|
|
13
23
|
private cacheControl;
|
|
24
|
+
private readonly validateStrictTools;
|
|
14
25
|
constructor(config: AnthropicBackendConfig);
|
|
26
|
+
isAuthenticationConfigured(): boolean;
|
|
27
|
+
allowsBufferedFallbackAfterStreamFailure(): boolean;
|
|
15
28
|
private buildHeaders;
|
|
16
29
|
private buildBody;
|
|
17
30
|
generate(request: BackendRequest): Promise<BackendResponse>;
|
|
@@ -1,5 +1,57 @@
|
|
|
1
|
+
import { modelContract } from '@zerg/model-contracts';
|
|
1
2
|
import { parseSSEStream } from './sse.js';
|
|
2
|
-
import {
|
|
3
|
+
import { readBoundedProviderError } from './openai_responses.js';
|
|
4
|
+
/** Hosted transport with no provider-key or ambient-credential path. */
|
|
5
|
+
export function createNativeAnthropicMessagesRouterBackend(config) {
|
|
6
|
+
const url = new URL(config.baseUrl);
|
|
7
|
+
if (!['https:', 'http:'].includes(url.protocol) || url.username || url.password || url.search || url.hash) {
|
|
8
|
+
throw new Error('Native Anthropic Router requires an HTTP(S) base URL without credentials, query or fragment');
|
|
9
|
+
}
|
|
10
|
+
if (!config.authToken?.trim() && !config.authTokenProvider) {
|
|
11
|
+
throw new Error('Native Anthropic Router requires a scoped bearer credential');
|
|
12
|
+
}
|
|
13
|
+
return new AnthropicBackend({
|
|
14
|
+
apiEndpoint: `${url.toString().replace(/\/+$/, '')}/v1/messages`,
|
|
15
|
+
authToken: config.authToken,
|
|
16
|
+
authTokenProvider: config.authTokenProvider,
|
|
17
|
+
validateStrictTools: true,
|
|
18
|
+
preserveNativeHistory: true,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/** Reject unsupported strict constraints; never silently narrow an open map. */
|
|
22
|
+
function validateNativeStrictSchema(name, schema) {
|
|
23
|
+
if ((schema.type === 'object' || schema.properties !== undefined || schema.additionalProperties !== undefined)
|
|
24
|
+
&& schema.additionalProperties !== false) {
|
|
25
|
+
throw new Error(`Native Anthropic Router tool "${name}" requires additionalProperties:false on every object; use a closed schema or a validated JSON string`);
|
|
26
|
+
}
|
|
27
|
+
for (const key of ['minimum', 'maximum', 'exclusiveMinimum', 'exclusiveMaximum', 'multipleOf',
|
|
28
|
+
'minLength', 'maxLength', 'maxItems', 'uniqueItems', 'contains', 'minContains', 'maxContains']) {
|
|
29
|
+
if (schema[key] !== undefined)
|
|
30
|
+
throw new Error(`Native Anthropic Router tool "${name}" does not support ${key}; validate that constraint in the host`);
|
|
31
|
+
}
|
|
32
|
+
if (schema.minItems !== undefined && schema.minItems !== 0 && schema.minItems !== 1) {
|
|
33
|
+
throw new Error(`Native Anthropic Router tool "${name}" supports only minItems 0 or 1`);
|
|
34
|
+
}
|
|
35
|
+
if (typeof schema.$ref === 'string' && !schema.$ref.startsWith('#/')) {
|
|
36
|
+
throw new Error(`Native Anthropic Router tool "${name}" does not support external schema references`);
|
|
37
|
+
}
|
|
38
|
+
for (const key of ['properties', '$defs', 'definitions']) {
|
|
39
|
+
const definitions = schema[key];
|
|
40
|
+
if (definitions && typeof definitions === 'object' && !Array.isArray(definitions)) {
|
|
41
|
+
for (const child of Object.values(definitions)) {
|
|
42
|
+
if (child && typeof child === 'object' && !Array.isArray(child))
|
|
43
|
+
validateNativeStrictSchema(name, child);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
for (const key of ['items', 'anyOf', 'allOf', 'oneOf']) {
|
|
48
|
+
const children = schema[key];
|
|
49
|
+
for (const child of Array.isArray(children) ? children : [children]) {
|
|
50
|
+
if (child && typeof child === 'object' && !Array.isArray(child))
|
|
51
|
+
validateNativeStrictSchema(name, child);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
3
55
|
// The TRUE context size for a request = uncached input + cache-read + cache-write.
|
|
4
56
|
// Reading only input_tokens makes the context bar jump BACKWARDS on a cache hit
|
|
5
57
|
// (input_tokens is then just the small uncached delta), which looks non-monotonic.
|
|
@@ -10,29 +62,37 @@ function anthropicInputTokens(usage) {
|
|
|
10
62
|
}
|
|
11
63
|
const EXTENDED_CACHE_BETA = 'extended-cache-ttl-2025-04-11';
|
|
12
64
|
export class AnthropicBackend {
|
|
65
|
+
preservesNativeHistory;
|
|
13
66
|
apiKey;
|
|
14
67
|
authToken;
|
|
15
68
|
authTokenProvider;
|
|
16
69
|
apiEndpoint;
|
|
17
70
|
cacheControl;
|
|
71
|
+
validateStrictTools;
|
|
18
72
|
constructor(config) {
|
|
19
73
|
this.apiKey = config.apiKey;
|
|
20
74
|
this.authToken = config.authToken;
|
|
21
75
|
this.authTokenProvider = config.authTokenProvider;
|
|
22
76
|
this.apiEndpoint = config.apiEndpoint || 'https://api.anthropic.com/v1/messages';
|
|
77
|
+
this.validateStrictTools = config.validateStrictTools ?? false;
|
|
78
|
+
this.preservesNativeHistory = config.preserveNativeHistory ?? false;
|
|
23
79
|
const ttl = (process.env.ZTC_PROMPT_CACHE_TTL || '1h').toLowerCase();
|
|
24
80
|
this.cacheControl = ttl === 'off' ? null : ttl === '5m' ? { type: 'ephemeral' } : { type: 'ephemeral', ttl: '1h' };
|
|
25
81
|
}
|
|
82
|
+
isAuthenticationConfigured() {
|
|
83
|
+
return Boolean(this.apiKey || this.authToken || this.authTokenProvider);
|
|
84
|
+
}
|
|
85
|
+
allowsBufferedFallbackAfterStreamFailure() { return false; }
|
|
26
86
|
async buildHeaders() {
|
|
27
87
|
const headers = {
|
|
28
88
|
'Content-Type': 'application/json',
|
|
29
89
|
'anthropic-version': '2023-06-01'
|
|
30
90
|
};
|
|
31
91
|
const authToken = this.authTokenProvider ? await this.authTokenProvider() : this.authToken;
|
|
32
|
-
if (authToken) {
|
|
92
|
+
if (authToken?.trim()) {
|
|
33
93
|
headers.Authorization = `Bearer ${authToken}`;
|
|
34
94
|
}
|
|
35
|
-
else if (this.apiKey) {
|
|
95
|
+
else if (this.apiKey && !this.authTokenProvider) {
|
|
36
96
|
headers['x-api-key'] = this.apiKey;
|
|
37
97
|
}
|
|
38
98
|
else {
|
|
@@ -60,6 +120,9 @@ export class AnthropicBackend {
|
|
|
60
120
|
if (block.type === 'tool_use') {
|
|
61
121
|
return block;
|
|
62
122
|
}
|
|
123
|
+
if (block.type === 'thinking' || block.type === 'redacted_thinking') {
|
|
124
|
+
return block;
|
|
125
|
+
}
|
|
63
126
|
if (block.type === 'video') {
|
|
64
127
|
return { type: 'video', source: { type: 'base64', media_type: block.mediaType, data: block.data } };
|
|
65
128
|
}
|
|
@@ -67,11 +130,28 @@ export class AnthropicBackend {
|
|
|
67
130
|
return { type: 'image', source: { type: 'base64', media_type: block.mediaType, data: block.data } };
|
|
68
131
|
})
|
|
69
132
|
}));
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
133
|
+
const opus55 = /^claude-opus-5-5(?:$|-)/.test(request.model);
|
|
134
|
+
const tools = request.tools.map(t => {
|
|
135
|
+
let strict = false;
|
|
136
|
+
if (opus55) {
|
|
137
|
+
try {
|
|
138
|
+
validateNativeStrictSchema(t.name, t.parameters);
|
|
139
|
+
strict = true;
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
// The hosted native transport requires closed, supported schemas.
|
|
143
|
+
// Direct credentials retain the caller's valid non-strict schemas.
|
|
144
|
+
if (this.validateStrictTools)
|
|
145
|
+
throw error;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
name: t.name,
|
|
150
|
+
description: t.description,
|
|
151
|
+
input_schema: t.parameters,
|
|
152
|
+
...(strict ? { strict: true } : {}),
|
|
153
|
+
};
|
|
154
|
+
});
|
|
75
155
|
// Render order is tools → system → messages. A breakpoint on the last system
|
|
76
156
|
// block caches tools+system together; a breakpoint on the last message block
|
|
77
157
|
// caches the conversation prefix. On the next turn (or a wake within the TTL)
|
|
@@ -89,8 +169,12 @@ export class AnthropicBackend {
|
|
|
89
169
|
lastMsg.content = [{ type: 'text', text: lastMsg.content, cache_control: cc }];
|
|
90
170
|
}
|
|
91
171
|
else if (Array.isArray(lastMsg.content) && lastMsg.content.length > 0) {
|
|
92
|
-
|
|
93
|
-
|
|
172
|
+
// Signed blocks cannot accept cache-control or any other mutation.
|
|
173
|
+
let i = lastMsg.content.length - 1;
|
|
174
|
+
while (i >= 0 && ['thinking', 'redacted_thinking'].includes(lastMsg.content[i].type))
|
|
175
|
+
i--;
|
|
176
|
+
if (i >= 0)
|
|
177
|
+
lastMsg.content[i] = { ...lastMsg.content[i], cache_control: cc };
|
|
94
178
|
}
|
|
95
179
|
}
|
|
96
180
|
// With no system to anchor it, the tools cache needs its own breakpoint on
|
|
@@ -99,16 +183,11 @@ export class AnthropicBackend {
|
|
|
99
183
|
tools[tools.length - 1] = { ...tools[tools.length - 1], cache_control: cc };
|
|
100
184
|
}
|
|
101
185
|
}
|
|
102
|
-
//
|
|
103
|
-
//
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
// (drop) and undefined for unrecognized ids (stay permissive).
|
|
108
|
-
const effort = request.codexEffort;
|
|
109
|
-
const supportedEfforts = getSupportedClaudeReasoningEfforts(request.model);
|
|
110
|
-
const modelAllowsEffort = supportedEfforts === undefined ||
|
|
111
|
-
(effort !== undefined && supportedEfforts.includes(effort));
|
|
186
|
+
// Exact reviewed families, including dated aliases, own the effort ladder.
|
|
187
|
+
// Unknown families and Haiku expose no unverified effort parameter.
|
|
188
|
+
const effort = request.codexEffort ?? (opus55 ? 'high' : undefined);
|
|
189
|
+
const supportedEfforts = modelContract('anthropic', request.model)?.reasoningEfforts ?? [];
|
|
190
|
+
const modelAllowsEffort = effort !== undefined && supportedEfforts.includes(effort);
|
|
112
191
|
const outputConfig = effort && ['low', 'medium', 'high', 'xhigh', 'max'].includes(effort) && modelAllowsEffort
|
|
113
192
|
? { output_config: { effort } }
|
|
114
193
|
: {};
|
|
@@ -119,6 +198,7 @@ export class AnthropicBackend {
|
|
|
119
198
|
system,
|
|
120
199
|
messages,
|
|
121
200
|
tools,
|
|
201
|
+
...(opus55 ? { thinking: { type: 'adaptive' }, tool_choice: { type: 'auto' } } : {}),
|
|
122
202
|
...outputConfig,
|
|
123
203
|
};
|
|
124
204
|
}
|
|
@@ -131,7 +211,7 @@ export class AnthropicBackend {
|
|
|
131
211
|
signal: request.signal,
|
|
132
212
|
});
|
|
133
213
|
if (!response.ok) {
|
|
134
|
-
const errorText = await response
|
|
214
|
+
const errorText = await readBoundedProviderError(response);
|
|
135
215
|
throw new AnthropicApiError(response.status, errorText);
|
|
136
216
|
}
|
|
137
217
|
const data = await response.json();
|
|
@@ -140,6 +220,7 @@ export class AnthropicBackend {
|
|
|
140
220
|
return {
|
|
141
221
|
content: data.content,
|
|
142
222
|
stopReason: data.stop_reason,
|
|
223
|
+
...(data.stop_details ? { stopDetails: data.stop_details } : {}),
|
|
143
224
|
usage: data.usage ? {
|
|
144
225
|
inputTokens,
|
|
145
226
|
outputTokens,
|
|
@@ -156,13 +237,18 @@ export class AnthropicBackend {
|
|
|
156
237
|
signal: request.signal,
|
|
157
238
|
});
|
|
158
239
|
if (!response.ok) {
|
|
159
|
-
const errorText = await response
|
|
240
|
+
const errorText = await readBoundedProviderError(response);
|
|
160
241
|
throw new AnthropicApiError(response.status, errorText);
|
|
161
242
|
}
|
|
162
243
|
if (!response.body) {
|
|
163
244
|
throw new Error('API error: no response body for streaming request');
|
|
164
245
|
}
|
|
165
246
|
let stopReason = 'end_turn';
|
|
247
|
+
let messageCompleted = false;
|
|
248
|
+
let stopDetails;
|
|
249
|
+
let accumulatedUsage = {};
|
|
250
|
+
const blocks = new Map();
|
|
251
|
+
const toolInputs = new Map();
|
|
166
252
|
// Track index → real tool ID mapping (Anthropic sends real ID only in content_block_start)
|
|
167
253
|
const indexToId = new Map();
|
|
168
254
|
for await (const jsonStr of parseSSEStream(response.body)) {
|
|
@@ -171,12 +257,28 @@ export class AnthropicBackend {
|
|
|
171
257
|
event = JSON.parse(jsonStr);
|
|
172
258
|
}
|
|
173
259
|
catch {
|
|
260
|
+
if (this.validateStrictTools)
|
|
261
|
+
throw new Error('Anthropic stream contained malformed JSON');
|
|
174
262
|
continue;
|
|
175
263
|
}
|
|
176
264
|
const eventType = event.type;
|
|
177
|
-
|
|
265
|
+
request.onActivity?.();
|
|
266
|
+
if (eventType === 'error') {
|
|
267
|
+
const providerError = event.error;
|
|
268
|
+
if (providerError?.type === 'overloaded_error') {
|
|
269
|
+
throw new AnthropicApiError(529, JSON.stringify({ error: { type: 'overloaded_error', message: 'Anthropic stream failed' } }));
|
|
270
|
+
}
|
|
271
|
+
throw new Error('Anthropic stream failed');
|
|
272
|
+
}
|
|
273
|
+
else if (eventType === 'message_stop') {
|
|
274
|
+
messageCompleted = true;
|
|
275
|
+
}
|
|
276
|
+
else if (eventType === 'content_block_start') {
|
|
178
277
|
const index = event.index;
|
|
179
278
|
const block = event.content_block;
|
|
279
|
+
if (['thinking', 'redacted_thinking', 'text', 'tool_use'].includes(String(block.type))) {
|
|
280
|
+
blocks.set(index, { ...block });
|
|
281
|
+
}
|
|
180
282
|
if (block.type === 'tool_use') {
|
|
181
283
|
const id = block.id;
|
|
182
284
|
indexToId.set(index, id);
|
|
@@ -185,17 +287,43 @@ export class AnthropicBackend {
|
|
|
185
287
|
}
|
|
186
288
|
else if (eventType === 'content_block_delta') {
|
|
187
289
|
const delta = event.delta;
|
|
290
|
+
const index = event.index;
|
|
291
|
+
const block = blocks.get(index);
|
|
188
292
|
if (delta.type === 'text_delta') {
|
|
293
|
+
if (block?.type === 'text')
|
|
294
|
+
block.text += delta.text;
|
|
189
295
|
yield { type: 'text_delta', text: delta.text };
|
|
190
296
|
}
|
|
297
|
+
else if (delta.type === 'thinking_delta') {
|
|
298
|
+
if (block?.type === 'thinking')
|
|
299
|
+
block.thinking += delta.thinking;
|
|
300
|
+
yield { type: 'reasoning_delta', text: delta.thinking };
|
|
301
|
+
}
|
|
302
|
+
else if (delta.type === 'signature_delta') {
|
|
303
|
+
if (block?.type === 'thinking')
|
|
304
|
+
block.signature += delta.signature;
|
|
305
|
+
}
|
|
191
306
|
else if (delta.type === 'input_json_delta') {
|
|
192
|
-
|
|
307
|
+
toolInputs.set(index, (toolInputs.get(index) ?? '') + String(delta.partial_json ?? ''));
|
|
193
308
|
const id = indexToId.get(index) || `_idx_${index}`;
|
|
194
309
|
yield { type: 'tool_use_delta', id, input_json: delta.partial_json };
|
|
195
310
|
}
|
|
196
311
|
}
|
|
197
312
|
else if (eventType === 'content_block_stop') {
|
|
198
313
|
const index = event.index;
|
|
314
|
+
const block = blocks.get(index);
|
|
315
|
+
if (block) {
|
|
316
|
+
if (block.type === 'tool_use' && toolInputs.has(index)) {
|
|
317
|
+
try {
|
|
318
|
+
block.input = JSON.parse(toolInputs.get(index));
|
|
319
|
+
}
|
|
320
|
+
catch {
|
|
321
|
+
throw new Error('Anthropic stream ended a tool block with invalid JSON');
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
yield { type: 'content_block', block };
|
|
325
|
+
blocks.delete(index);
|
|
326
|
+
}
|
|
199
327
|
if (indexToId.has(index)) {
|
|
200
328
|
yield { type: 'tool_use_end', id: indexToId.get(index) };
|
|
201
329
|
}
|
|
@@ -204,15 +332,23 @@ export class AnthropicBackend {
|
|
|
204
332
|
const delta = event.delta;
|
|
205
333
|
if (delta.stop_reason) {
|
|
206
334
|
stopReason = delta.stop_reason;
|
|
335
|
+
// A terminal message_delta is also a complete response boundary;
|
|
336
|
+
// older compatible relays omit the trailing message_stop frame.
|
|
337
|
+
messageCompleted = true;
|
|
207
338
|
}
|
|
339
|
+
if (delta.stop_details && typeof delta.stop_details === 'object')
|
|
340
|
+
stopDetails = delta.stop_details;
|
|
208
341
|
const usage = event.usage;
|
|
209
342
|
if (usage) {
|
|
343
|
+
accumulatedUsage = { ...accumulatedUsage, ...usage };
|
|
210
344
|
yield {
|
|
211
345
|
type: 'usage',
|
|
212
346
|
usage: {
|
|
213
|
-
inputTokens: anthropicInputTokens(
|
|
214
|
-
outputTokens:
|
|
215
|
-
totalTokens: anthropicInputTokens(
|
|
347
|
+
inputTokens: anthropicInputTokens(accumulatedUsage),
|
|
348
|
+
outputTokens: accumulatedUsage.output_tokens ?? 0,
|
|
349
|
+
totalTokens: anthropicInputTokens(accumulatedUsage) + (accumulatedUsage.output_tokens ?? 0),
|
|
350
|
+
...(accumulatedUsage.cache_read_input_tokens === undefined ? {} : { cachedInputTokens: accumulatedUsage.cache_read_input_tokens }),
|
|
351
|
+
...(accumulatedUsage.cache_creation_input_tokens === undefined ? {} : { cacheWriteInputTokens: accumulatedUsage.cache_creation_input_tokens }),
|
|
216
352
|
}
|
|
217
353
|
};
|
|
218
354
|
}
|
|
@@ -221,6 +357,7 @@ export class AnthropicBackend {
|
|
|
221
357
|
const message = event.message;
|
|
222
358
|
const usage = message.usage;
|
|
223
359
|
if (usage) {
|
|
360
|
+
accumulatedUsage = { ...accumulatedUsage, ...usage };
|
|
224
361
|
yield {
|
|
225
362
|
type: 'usage',
|
|
226
363
|
usage: {
|
|
@@ -232,7 +369,11 @@ export class AnthropicBackend {
|
|
|
232
369
|
}
|
|
233
370
|
}
|
|
234
371
|
}
|
|
235
|
-
|
|
372
|
+
if (blocks.size > 0)
|
|
373
|
+
throw new Error('Anthropic stream ended before a native content block completed');
|
|
374
|
+
if (!messageCompleted)
|
|
375
|
+
throw new Error('Anthropic stream ended before message completion');
|
|
376
|
+
yield { type: 'done', stopReason, ...(stopDetails ? { stopDetails } : {}) };
|
|
236
377
|
}
|
|
237
378
|
}
|
|
238
379
|
export class AnthropicApiError extends Error {
|
|
@@ -160,18 +160,17 @@ export function normalizeClaudeCliModel(model) {
|
|
|
160
160
|
const trimmed = model.trim();
|
|
161
161
|
if (!trimmed)
|
|
162
162
|
return 'claude-sonnet-4-5';
|
|
163
|
-
//
|
|
164
|
-
//
|
|
165
|
-
if (trimmed === 'claude-
|
|
166
|
-
return 'opus';
|
|
167
|
-
}
|
|
168
|
-
if (trimmed === 'claude-code-sonnet' || trimmed === 'sonnet' || trimmed.startsWith('claude-sonnet-') || trimmed.includes('sonnet')) {
|
|
163
|
+
// Retain ZTC's standard-context choice for its exact legacy Sonnet aliases.
|
|
164
|
+
// Do not reinterpret other Sonnet selections as these legacy aliases.
|
|
165
|
+
if (trimmed === 'claude-code-sonnet' || trimmed === 'sonnet') {
|
|
169
166
|
return 'claude-sonnet-4-5';
|
|
170
167
|
}
|
|
171
|
-
|
|
168
|
+
// Reserve compatibility mappings for exact picker aliases; explicit names
|
|
169
|
+
// and context suffixes are selections for the CLI to resolve or reject.
|
|
170
|
+
if (trimmed === 'claude-code-opus' || trimmed === 'opus') {
|
|
172
171
|
return 'opus';
|
|
173
172
|
}
|
|
174
|
-
if (trimmed
|
|
173
|
+
if (trimmed === 'claude-code-haiku' || trimmed === 'haiku') {
|
|
175
174
|
return 'haiku';
|
|
176
175
|
}
|
|
177
176
|
return trimmed;
|
|
@@ -215,6 +214,9 @@ function blockToText(block) {
|
|
|
215
214
|
return `[tool result ${block.tool_use_id}] ${typeof block.content === 'string' ? block.content : JSON.stringify(block.content)}`;
|
|
216
215
|
case 'tool_use':
|
|
217
216
|
return `[assistant tool use ${block.name}] ${JSON.stringify(block.input)}`;
|
|
217
|
+
case 'thinking':
|
|
218
|
+
case 'redacted_thinking':
|
|
219
|
+
return ''; // Native signed reasoning belongs only to its originating API.
|
|
218
220
|
default: {
|
|
219
221
|
const neverBlock = block;
|
|
220
222
|
return JSON.stringify(neverBlock);
|
|
@@ -301,6 +303,8 @@ export function parseClaudeCliOutput(stdout) {
|
|
|
301
303
|
usage: typeof inputTokens === 'number' && typeof outputTokens === 'number'
|
|
302
304
|
? { inputTokens, outputTokens, totalTokens: inputTokens + outputTokens }
|
|
303
305
|
: undefined,
|
|
306
|
+
...(typeof parsed.total_cost_usd === 'number' && Number.isFinite(parsed.total_cost_usd)
|
|
307
|
+
&& parsed.total_cost_usd >= 0 ? { costUsd: parsed.total_cost_usd } : {}),
|
|
304
308
|
};
|
|
305
309
|
}
|
|
306
310
|
catch (error) {
|
|
@@ -455,6 +459,7 @@ export class ClaudeCliBackend {
|
|
|
455
459
|
content: [{ type: 'tool_use', id: `cli_${randomUUID()}`, name: call.name, input: call.input }],
|
|
456
460
|
stopReason: 'tool_use',
|
|
457
461
|
usage: resp.usage,
|
|
462
|
+
costUsd: resp.costUsd,
|
|
458
463
|
};
|
|
459
464
|
}
|
|
460
465
|
/**
|
|
@@ -497,6 +502,7 @@ export class ClaudeCliBackend {
|
|
|
497
502
|
let stderr = '';
|
|
498
503
|
let streamedText = false;
|
|
499
504
|
let resultUsage;
|
|
505
|
+
let resultCostUsd;
|
|
500
506
|
let stopReason = 'end_turn';
|
|
501
507
|
let resultText = '';
|
|
502
508
|
// Tool-marker guard. `fullText` is everything the model produced; `emittedLen`
|
|
@@ -565,6 +571,8 @@ export class ClaudeCliBackend {
|
|
|
565
571
|
return;
|
|
566
572
|
}
|
|
567
573
|
resultUsage = evt.usage;
|
|
574
|
+
resultCostUsd = typeof evt.total_cost_usd === 'number' && Number.isFinite(evt.total_cost_usd)
|
|
575
|
+
&& evt.total_cost_usd >= 0 ? evt.total_cost_usd : undefined;
|
|
568
576
|
stopReason = evt.stop_reason || 'end_turn';
|
|
569
577
|
resultText = typeof evt.result === 'string' ? evt.result : '';
|
|
570
578
|
}
|
|
@@ -616,6 +624,8 @@ export class ClaudeCliBackend {
|
|
|
616
624
|
const inputTokens = resultUsage.input_tokens + (resultUsage.cache_read_input_tokens ?? 0) + (resultUsage.cache_creation_input_tokens ?? 0);
|
|
617
625
|
push({ type: 'usage', usage: { inputTokens, outputTokens: resultUsage.output_tokens, totalTokens: inputTokens + resultUsage.output_tokens } });
|
|
618
626
|
}
|
|
627
|
+
if (resultCostUsd !== undefined)
|
|
628
|
+
push({ type: 'cost', costUsd: resultCostUsd });
|
|
619
629
|
push({ type: 'done', stopReason });
|
|
620
630
|
finish();
|
|
621
631
|
});
|
|
@@ -215,6 +215,7 @@ export declare class CodexAppServerClient {
|
|
|
215
215
|
export declare class CodexAppServerBackend implements AgentBackend {
|
|
216
216
|
private client;
|
|
217
217
|
constructor(client?: CodexAppServerClient, options?: CodexAppServerClientOptions);
|
|
218
|
+
allowsRequestRetryAfterFailure(): boolean;
|
|
218
219
|
/** The sandbox this backend's thread runs under. Observable so the factory's
|
|
219
220
|
* plan-mode read-only downgrade can be asserted. */
|
|
220
221
|
get sandbox(): CodexSandboxMode;
|
|
@@ -2,6 +2,7 @@ import { spawn } from 'node:child_process';
|
|
|
2
2
|
import { createHash } from 'node:crypto';
|
|
3
3
|
import { RateLimitError, parseResetAt } from './rate_limit.js';
|
|
4
4
|
import { CODEX_APP_SERVER_PROVIDER } from './provider_ids.js';
|
|
5
|
+
import { NativeObservationLimitError } from '../runtime/provider_native_evidence.js';
|
|
5
6
|
export const MAX_CODEX_APP_SERVER_FRAME_BYTES = 1_048_576;
|
|
6
7
|
export const MAX_CODEX_APP_SERVER_QUEUED_FRAMES = 1_024;
|
|
7
8
|
/** Keep managed profiles on their own auth.json and ChatGPT subscription. */
|
|
@@ -14,6 +15,7 @@ const MAX_CODEX_APP_SERVER_REQUEST_TIMEOUT_MS = 120_000;
|
|
|
14
15
|
const DEFAULT_CODEX_APP_SERVER_TURN_TIMEOUT_MS = 30 * 60_000;
|
|
15
16
|
const MAX_CODEX_APP_SERVER_TURN_TIMEOUT_MS = 60 * 60_000;
|
|
16
17
|
const MAX_CODEX_APP_SERVER_TOOL_CALLS_PER_TURN = 64;
|
|
18
|
+
const MAX_CODEX_APP_SERVER_OBSERVATIONS_PER_TURN = 128;
|
|
17
19
|
const MAX_CODEX_APP_SERVER_MODEL_PAGES = 20;
|
|
18
20
|
const MAX_CODEX_APP_SERVER_MODELS = 2_000;
|
|
19
21
|
/**
|
|
@@ -119,7 +121,30 @@ export function codexItemToObservation(rawItem) {
|
|
|
119
121
|
const { type: _t, id: _i, ...detail } = item;
|
|
120
122
|
void _t;
|
|
121
123
|
void _i;
|
|
122
|
-
|
|
124
|
+
const changes = Array.isArray(item.changes) ? item.changes : [];
|
|
125
|
+
const artifact = (value) => ({ path: value.path,
|
|
126
|
+
...(typeof value.sha256 === 'string' ? { sha256: value.sha256 } : {}) });
|
|
127
|
+
const artifacts = changes.filter((change) => !!change && typeof change === 'object'
|
|
128
|
+
&& typeof change.path === 'string').map(artifact);
|
|
129
|
+
let partial = changes.length !== artifacts.length;
|
|
130
|
+
if (typeof item.path === 'string')
|
|
131
|
+
artifacts.unshift(artifact({ path: item.path, sha256: item.sha256 }));
|
|
132
|
+
let output = typeof item.output === 'string' ? item.output : undefined;
|
|
133
|
+
let isError;
|
|
134
|
+
if (type === 'mcpToolCall' && item.result && typeof item.result === 'object') {
|
|
135
|
+
const result = item.result;
|
|
136
|
+
if (Array.isArray(result.content)) {
|
|
137
|
+
const content = result.content.filter((entry) => !!entry
|
|
138
|
+
&& typeof entry === 'object' && entry.type === 'text' && typeof entry.text === 'string').map(entry => ({ type: entry.type, text: entry.text }));
|
|
139
|
+
isError = result.isError === true;
|
|
140
|
+
partial ||= content.length !== result.content.length;
|
|
141
|
+
output = JSON.stringify({ content, isError });
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return { kind: 'action', id, label: type, detail,
|
|
145
|
+
...(typeof item.status === 'string' ? { status: item.status } : {}),
|
|
146
|
+
...(output === undefined ? {} : { output }), ...(partial === undefined ? {} : { partial }),
|
|
147
|
+
...(isError === undefined ? {} : { isError }), artifacts };
|
|
123
148
|
}
|
|
124
149
|
}
|
|
125
150
|
}
|
|
@@ -587,6 +612,8 @@ export class CodexAppServerClient {
|
|
|
587
612
|
onToolCall: toolsActive ? options.onToolCall : undefined,
|
|
588
613
|
toolChain: Promise.resolve(),
|
|
589
614
|
toolCallCount: 0,
|
|
615
|
+
observationCount: 0,
|
|
616
|
+
observationFailure: false,
|
|
590
617
|
terminalReceived: false,
|
|
591
618
|
toolCancellation: new AbortController(),
|
|
592
619
|
};
|
|
@@ -994,7 +1021,29 @@ export class CodexAppServerClient {
|
|
|
994
1021
|
if (observation) {
|
|
995
1022
|
for (const waiter of this.turnWaiters) {
|
|
996
1023
|
if (waiter.threadId === params.threadId && waiter.turnId === nonEmptyId(params.turnId)) {
|
|
997
|
-
waiter.
|
|
1024
|
+
if (waiter.terminalReceived)
|
|
1025
|
+
continue;
|
|
1026
|
+
if (++waiter.observationCount > MAX_CODEX_APP_SERVER_OBSERVATIONS_PER_TURN) {
|
|
1027
|
+
waiter.terminalReceived = true;
|
|
1028
|
+
waiter.toolCancellation.abort();
|
|
1029
|
+
waiter.toolChain = waiter.toolChain.then(() => {
|
|
1030
|
+
waiter.queue.fail(new NativeObservationLimitError(MAX_CODEX_APP_SERVER_OBSERVATIONS_PER_TURN));
|
|
1031
|
+
});
|
|
1032
|
+
continue;
|
|
1033
|
+
}
|
|
1034
|
+
const scoped = { ...observation, native: { provider: CODEX_APP_SERVER_PROVIDER,
|
|
1035
|
+
threadId: waiter.threadId, turnId: waiter.turnId } };
|
|
1036
|
+
// Completed reports join the same drain as native dynamic calls. A
|
|
1037
|
+
// terminal response cannot outrun durable report capture.
|
|
1038
|
+
waiter.toolChain = waiter.toolChain.then(async () => {
|
|
1039
|
+
if (!waiter.observationFailure)
|
|
1040
|
+
await waiter.onObservation?.(scoped);
|
|
1041
|
+
}).catch(error => {
|
|
1042
|
+
waiter.observationFailure = true;
|
|
1043
|
+
waiter.terminalReceived = true;
|
|
1044
|
+
waiter.toolCancellation.abort();
|
|
1045
|
+
waiter.queue.fail(error instanceof Error ? error : new Error(String(error)));
|
|
1046
|
+
});
|
|
998
1047
|
}
|
|
999
1048
|
}
|
|
1000
1049
|
}
|
|
@@ -1222,7 +1271,7 @@ export class CodexAppServerClient {
|
|
|
1222
1271
|
trust: message.role === 'user' ? 'authorized_user_request' : 'assistant_context',
|
|
1223
1272
|
};
|
|
1224
1273
|
}
|
|
1225
|
-
const content = message.content.map((block) => {
|
|
1274
|
+
const content = message.content.filter(block => block.type !== 'thinking' && block.type !== 'redacted_thinking').map((block) => {
|
|
1226
1275
|
if (block.type === 'text') {
|
|
1227
1276
|
return {
|
|
1228
1277
|
type: block.type,
|
|
@@ -1309,6 +1358,9 @@ export class CodexAppServerBackend {
|
|
|
1309
1358
|
constructor(client, options = {}) {
|
|
1310
1359
|
this.client = client || new CodexAppServerClient(options);
|
|
1311
1360
|
}
|
|
1361
|
+
// Dispatch starts a native tool loop. A failed turn can have effects even
|
|
1362
|
+
// before a completed-item observation; generic retries must not regenerate it.
|
|
1363
|
+
allowsRequestRetryAfterFailure() { return false; }
|
|
1312
1364
|
/** The sandbox this backend's thread runs under. Observable so the factory's
|
|
1313
1365
|
* plan-mode read-only downgrade can be asserted. */
|
|
1314
1366
|
get sandbox() {
|
|
@@ -71,6 +71,7 @@ export declare class CodexAuthBackend implements AgentBackend {
|
|
|
71
71
|
private buildHeaders;
|
|
72
72
|
/** POST the streaming Responses request, refreshing the token once on 401. */
|
|
73
73
|
private fetchResponses;
|
|
74
|
+
private boundResponse;
|
|
74
75
|
/** Buffered path — kept as the fallback when streaming can't run. */
|
|
75
76
|
generate(request: BackendRequest): Promise<BackendResponse>;
|
|
76
77
|
/**
|