@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
|
@@ -1,12 +1,15 @@
|
|
|
1
|
+
import { modelContract, normalizeContractModel } from '@zerg/model-contracts';
|
|
2
|
+
import { readRouterCatalog, resolveRouterModel } from '../../utils/router_catalog.js';
|
|
1
3
|
import { randomUUID } from 'node:crypto';
|
|
2
4
|
import { measureResponse, measureStream } from './request_metrics.js';
|
|
5
|
+
import { BackendHttpError, readHttpErrorBody, retryAfterDelayMs } from './http_error.js';
|
|
3
6
|
import { parseSSEEvents } from './sse.js';
|
|
4
7
|
import { buildOpenAIMessages, buildOpenAIToolDefs } from './openai_format.js';
|
|
5
|
-
import {
|
|
8
|
+
import { isKimiModel } from './kimi_params.js';
|
|
6
9
|
import { runtimeDiag } from '../../utils/debug_log.js';
|
|
7
10
|
import { createZrouterEventMapper } from './zrouter_events.js';
|
|
8
11
|
import { parseTokenUsage } from './token_usage.js';
|
|
9
|
-
import {
|
|
12
|
+
import { DEEPSEEK_FLASH_MAX_OUTPUT, isModalDeepSeekFlashModel, MODAL_DEEPSEEK_FLASH_MAX_OUTPUT, isDeepSeekFlashModel } from '../../utils/deepseek.js';
|
|
10
13
|
import { getVersion } from '../../utils/version.js';
|
|
11
14
|
import { isTransportError } from './transport_errors.js';
|
|
12
15
|
const ZROUTER_HEADERS_TIMEOUT_MS = 90_000;
|
|
@@ -23,19 +26,13 @@ const PINNABLE_DECORATION = /^[A-Za-z0-9._:-]{1,64}$/;
|
|
|
23
26
|
function isPinnableDecoration(value) {
|
|
24
27
|
return value !== undefined && PINNABLE_DECORATION.test(value);
|
|
25
28
|
}
|
|
26
|
-
//
|
|
27
|
-
//
|
|
28
|
-
//
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
// the reconnect resumes instead of restarting. Every knob is env-overridable
|
|
34
|
-
// because a self-hosted Router may restart more slowly.
|
|
35
|
-
const DEFAULT_RECONNECT_ATTEMPTS = 6;
|
|
36
|
-
const DEFAULT_RECONNECT_BASE_MS = 500;
|
|
37
|
-
const DEFAULT_RECONNECT_CAP_MS = 10_000;
|
|
38
|
-
const MAX_RECONNECT_ATTEMPTS = 20;
|
|
29
|
+
// Allow Router restarts to recover through bounded, cancellable retries. Each
|
|
30
|
+
// reconnect reports progress and resumes the same turn/cursor. Hosts can tune
|
|
31
|
+
// the attempt count and backoff through the environment.
|
|
32
|
+
const DEFAULT_RECONNECT_ATTEMPTS = 120;
|
|
33
|
+
const DEFAULT_RECONNECT_BASE_MS = 1_000;
|
|
34
|
+
const DEFAULT_RECONNECT_CAP_MS = 30_000;
|
|
35
|
+
const MAX_RECONNECT_ATTEMPTS = 120;
|
|
39
36
|
const MAX_RECONNECT_MS = 300_000;
|
|
40
37
|
function envBoundedInt(name, fallback, min, max) {
|
|
41
38
|
const parsed = Number(process.env[name]);
|
|
@@ -59,6 +56,10 @@ function resolveReconnectPolicy() {
|
|
|
59
56
|
* uses the unified chat endpoint so routing can fall back across providers.
|
|
60
57
|
*/
|
|
61
58
|
export class ZRouterStreamBackend {
|
|
59
|
+
initialCatalog;
|
|
60
|
+
get catalog() {
|
|
61
|
+
return readRouterCatalog({ origin: this.proxyUrl, token: this.apiKey, workspaceId: this.workspaceId }) ?? this.initialCatalog;
|
|
62
|
+
}
|
|
62
63
|
apiKey;
|
|
63
64
|
proxyUrl;
|
|
64
65
|
provider;
|
|
@@ -67,6 +68,7 @@ export class ZRouterStreamBackend {
|
|
|
67
68
|
conversationId;
|
|
68
69
|
clientName;
|
|
69
70
|
constructor(config) {
|
|
71
|
+
this.initialCatalog = config.catalog ? structuredClone(config.catalog) : undefined;
|
|
70
72
|
this.apiKey = config.apiKey;
|
|
71
73
|
this.proxyUrl = config.proxyUrl.replace(/\/+$/, '');
|
|
72
74
|
this.provider = config.provider;
|
|
@@ -87,12 +89,45 @@ export class ZRouterStreamBackend {
|
|
|
87
89
|
handlesTransportRetries() {
|
|
88
90
|
return true;
|
|
89
91
|
}
|
|
92
|
+
getModelCapabilities(model) {
|
|
93
|
+
return this.catalog?.version === 1
|
|
94
|
+
? resolveRouterModel(this.catalog, this.provider, model)?.capabilities : undefined;
|
|
95
|
+
}
|
|
90
96
|
buildOpenAIBody(request) {
|
|
91
|
-
|
|
97
|
+
if (this.catalog?.version === 1) {
|
|
98
|
+
const descriptor = resolveRouterModel(this.catalog, this.provider, request.model);
|
|
99
|
+
if (!descriptor?.capabilities?.chat)
|
|
100
|
+
throw new Error('This model is no longer in the Router chat catalog. Refresh /model.');
|
|
101
|
+
const caps = descriptor.capabilities;
|
|
102
|
+
if (request.codexEffort && caps.reasoning && !caps.reasoning.choices.includes(request.codexEffort)) {
|
|
103
|
+
throw new Error(`Unsupported reasoning effort: ${request.codexEffort}`);
|
|
104
|
+
}
|
|
105
|
+
if (request.maxTokens !== undefined && caps.max_output_tokens !== undefined && request.maxTokens > caps.max_output_tokens) {
|
|
106
|
+
throw new Error(`Max output tokens exceeds the advertised limit (${caps.max_output_tokens}).`);
|
|
107
|
+
}
|
|
108
|
+
if (caps.images === false && request.messages.some(message => Array.isArray(message.content)
|
|
109
|
+
&& message.content.some(block => block.type === 'image' || block.type === 'video')))
|
|
110
|
+
throw new Error('This model does not support images.');
|
|
111
|
+
const prepared = caps.tools === false ? chatOnlyRequest(request) : request;
|
|
112
|
+
return { provider: descriptor.owned_by, model: descriptor.id,
|
|
113
|
+
...(request.routePlan ? { route: request.routePlan } : {}),
|
|
114
|
+
...(request.maxTokens === undefined ? {} : { max_output_tokens: request.maxTokens }),
|
|
115
|
+
...(caps.reasoning && request.codexEffort ? { reasoning_effort: request.codexEffort } : {}),
|
|
116
|
+
messages: buildOpenAIMessages(prepared),
|
|
117
|
+
...(prepared.tools.length ? { tools: buildOpenAIToolDefs(prepared.tools) } : {}),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
// Legacy contract for older Routers only. ZTC stores the model separately from its provider. Router's global model
|
|
92
121
|
// namespace is a wire concern; keep existing namespaced IDs compatible.
|
|
93
122
|
if (this.provider === 'modal' && !/^modal\//i.test(request.model)) {
|
|
94
123
|
request = { ...request, model: `modal/${request.model}` };
|
|
95
124
|
}
|
|
125
|
+
// Router resolves the Fireworks upstream id from the NAMESPACED form:
|
|
126
|
+
// fireworksUpstreamModelId returns null without the prefix and provider-client
|
|
127
|
+
// then answers 400 before dispatch. ZTC stores the bare slug, so add it here.
|
|
128
|
+
if (this.provider === 'fireworks') {
|
|
129
|
+
request = { ...request, model: `fireworks/${normalizeContractModel('fireworks', request.model)}` };
|
|
130
|
+
}
|
|
96
131
|
// Kimi deprecates max_tokens in favour of max_completion_tokens, same as the
|
|
97
132
|
// o-series and GPT-5+; keep this in step with the direct backend so the token
|
|
98
133
|
// field does not depend on how the user authenticated.
|
|
@@ -115,20 +150,42 @@ export class ZRouterStreamBackend {
|
|
|
115
150
|
model: request.model,
|
|
116
151
|
...(request.routePlan ? { route: request.routePlan } : {}),
|
|
117
152
|
...tokenParam,
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
// No-op for every non-Kimi model.
|
|
121
|
-
// Modal uses Kimi's effort ladder but keeps its own max_tokens contract.
|
|
122
|
-
...buildKimiRequestParams(this.provider === 'modal'
|
|
123
|
-
? { ...request, model: request.model.slice('modal/'.length) }
|
|
124
|
-
: request),
|
|
125
|
-
...deepseekRequestParams(request),
|
|
153
|
+
...(request.codexEffort && modelContract(this.provider, request.model, 'chat_tools')?.reasoningEfforts.includes(request.codexEffort)
|
|
154
|
+
? { reasoning_effort: request.codexEffort } : {}),
|
|
126
155
|
messages: buildOpenAIMessages(request),
|
|
127
156
|
...(request.tools.length > 0 ? { tools: buildOpenAIToolDefs(request.tools) } : {})
|
|
128
157
|
};
|
|
129
158
|
}
|
|
130
|
-
|
|
131
|
-
|
|
159
|
+
serializeBody(request, stream = false) {
|
|
160
|
+
const body = {
|
|
161
|
+
...this.buildOpenAIBody(request),
|
|
162
|
+
...(stream ? { stream: true } : {}),
|
|
163
|
+
};
|
|
164
|
+
const serialized = JSON.stringify(body);
|
|
165
|
+
// Funded DeepSeek admission scans at most 10,000 JSON values, independently
|
|
166
|
+
// of the model's token window. A longer text history is otherwise rejected
|
|
167
|
+
// as non-text trial input, and resumable streaming masks that as a 5xx.
|
|
168
|
+
// Signal context overflow locally so hosts compact and retry, including
|
|
169
|
+
// when an agent's tool loop crosses the limit before returning to idle.
|
|
170
|
+
if (body.model === 'modal/deepseek-v4.1-flash'
|
|
171
|
+
|| body.model === 'fireworks/deepseek-v4p1-flash') {
|
|
172
|
+
// Count the serialized wire shape: undefined properties disappear, and
|
|
173
|
+
// tool calls/results expand into separate messages during encoding.
|
|
174
|
+
const pending = [JSON.parse(serialized)];
|
|
175
|
+
let values = 1;
|
|
176
|
+
while (pending.length > 0) {
|
|
177
|
+
const value = pending.pop();
|
|
178
|
+
if (value === null || typeof value !== 'object')
|
|
179
|
+
continue;
|
|
180
|
+
for (const child of Object.values(value)) {
|
|
181
|
+
if (++values > 10_000) {
|
|
182
|
+
throw new Error('Prompt is too long for Router\'s context structure limit (10,000 JSON values). Compact the conversation before retrying.');
|
|
183
|
+
}
|
|
184
|
+
pending.push(child);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return serialized;
|
|
132
189
|
}
|
|
133
190
|
async buildHeaders(request) {
|
|
134
191
|
const token = this.authTokenProvider
|
|
@@ -141,6 +198,7 @@ export class ZRouterStreamBackend {
|
|
|
141
198
|
const conversationPin = this.conversationPin(request);
|
|
142
199
|
return {
|
|
143
200
|
'Content-Type': 'application/json',
|
|
201
|
+
...(this.catalog?.version === 1 ? { 'X-Zerg-Model-Contract': '1' } : {}),
|
|
144
202
|
'Authorization': `Bearer ${normalizedToken}`,
|
|
145
203
|
'X-Zerg-Client': this.clientName,
|
|
146
204
|
'X-Zerg-Client-Version': getVersion(),
|
|
@@ -183,7 +241,7 @@ export class ZRouterStreamBackend {
|
|
|
183
241
|
return measureResponse(routedRequest, fetcher => this.generateResponse(routedRequest, fetcher));
|
|
184
242
|
}
|
|
185
243
|
async generateResponse(request, fetcher) {
|
|
186
|
-
const body = this.
|
|
244
|
+
const body = this.serializeBody(request);
|
|
187
245
|
const headers = await this.buildHeaders(request);
|
|
188
246
|
// Proof-chain log: the exact router endpoint + model this turn dispatches to.
|
|
189
247
|
runtimeDiag('info', `[ztc] zrouter dispatch ${JSON.stringify({
|
|
@@ -195,15 +253,23 @@ export class ZRouterStreamBackend {
|
|
|
195
253
|
const response = await fetcher(this.endpointFor(), {
|
|
196
254
|
method: 'POST',
|
|
197
255
|
headers,
|
|
198
|
-
body
|
|
256
|
+
body,
|
|
199
257
|
signal: request.signal,
|
|
200
258
|
});
|
|
201
259
|
if (!response.ok) {
|
|
202
|
-
const
|
|
203
|
-
|
|
260
|
+
const failure = await readHttpErrorBody(response, request.signal);
|
|
261
|
+
const error = new BackendHttpError(response.status, failure.body, { prefix: 'ZRouter API', headers,
|
|
262
|
+
bodyReadState: failure.bodyReadState, retryAfter: response.headers.get('retry-after'),
|
|
263
|
+
rateLimitReset: response.headers.get('x-ratelimit-reset') });
|
|
264
|
+
error.message += failureHeaderSuffix(response);
|
|
265
|
+
throw error;
|
|
204
266
|
}
|
|
205
267
|
const data = await response.json();
|
|
206
|
-
|
|
268
|
+
const parsed = this.parseOpenAIResponse(data);
|
|
269
|
+
if (this.getModelCapabilities(request.model)?.tools === false && parsed.content.some(block => block.type === 'tool_use')) {
|
|
270
|
+
throw new Error('Chat-only model returned tools; execution is disabled.');
|
|
271
|
+
}
|
|
272
|
+
return parsed;
|
|
207
273
|
}
|
|
208
274
|
parseOpenAIResponse(data) {
|
|
209
275
|
// ZRouter wraps OpenAI responses in OpenAI-compatible format
|
|
@@ -248,12 +314,15 @@ export class ZRouterStreamBackend {
|
|
|
248
314
|
return measureStream(routedRequest, fetcher => this.streamResponse(routedRequest, fetcher));
|
|
249
315
|
}
|
|
250
316
|
async *streamResponse(request, fetcher) {
|
|
251
|
-
const body =
|
|
317
|
+
const body = this.serializeBody(request, true);
|
|
252
318
|
const mapEvent = createZrouterEventMapper();
|
|
253
319
|
let resumeAfter;
|
|
254
320
|
let emittedMappedEvent = false;
|
|
255
321
|
let resumeSupported = false;
|
|
256
322
|
const policy = resolveReconnectPolicy();
|
|
323
|
+
let reconnectStarted;
|
|
324
|
+
const budget = () => resumeAfter ? 300_000 : 30_000;
|
|
325
|
+
const remaining = () => budget() - (reconnectStarted === undefined ? 0 : Date.now() - reconnectStarted);
|
|
257
326
|
for (let attempt = 1; attempt <= policy.attempts; attempt++) {
|
|
258
327
|
try {
|
|
259
328
|
const headers = await this.buildHeaders(request);
|
|
@@ -262,12 +331,16 @@ export class ZRouterStreamBackend {
|
|
|
262
331
|
const response = await fetchWithHeadersTimeout(fetcher, this.endpointFor(), {
|
|
263
332
|
method: 'POST',
|
|
264
333
|
headers,
|
|
265
|
-
body
|
|
334
|
+
body,
|
|
266
335
|
signal: request.signal,
|
|
267
|
-
}, ZROUTER_HEADERS_TIMEOUT_MS);
|
|
336
|
+
}, Math.min(ZROUTER_HEADERS_TIMEOUT_MS, Math.max(1, remaining())));
|
|
268
337
|
if (!response.ok) {
|
|
269
|
-
const
|
|
270
|
-
|
|
338
|
+
const failure = await readHttpErrorBody(response, request.signal);
|
|
339
|
+
const error = new BackendHttpError(response.status, failure.body, { prefix: 'ZRouter API', headers,
|
|
340
|
+
bodyReadState: failure.bodyReadState, retryAfter: response.headers.get('retry-after'),
|
|
341
|
+
rateLimitReset: response.headers.get('x-ratelimit-reset') });
|
|
342
|
+
error.message += failureHeaderSuffix(response);
|
|
343
|
+
throw error;
|
|
271
344
|
}
|
|
272
345
|
if (!response.body) {
|
|
273
346
|
throw new Error('ZRouter API error: no response body for streaming request');
|
|
@@ -295,9 +368,12 @@ export class ZRouterStreamBackend {
|
|
|
295
368
|
const status = Number.isInteger(suppliedStatus) && suppliedStatus >= 400 && suppliedStatus <= 599
|
|
296
369
|
? suppliedStatus
|
|
297
370
|
: 502;
|
|
298
|
-
throw new
|
|
371
|
+
throw new BackendHttpError(status, JSON.stringify(ev.body ?? {}), { prefix: 'ZRouter API', headers });
|
|
299
372
|
}
|
|
300
373
|
const mapped = mapEvent(ev);
|
|
374
|
+
if (this.getModelCapabilities(request.model)?.tools === false && mapped.some(event => event.type.startsWith('tool_use'))) {
|
|
375
|
+
throw new Error('Chat-only model returned tools; execution is disabled.');
|
|
376
|
+
}
|
|
301
377
|
if (mapped.length > 0) {
|
|
302
378
|
// Heartbeats are liveness, not model output. A drop while only
|
|
303
379
|
// heartbeats have arrived cannot duplicate visible text, so it
|
|
@@ -317,8 +393,9 @@ export class ZRouterStreamBackend {
|
|
|
317
393
|
// emitted output. So a transient HTTP failure on a resume (the Router's
|
|
318
394
|
// coordination 503 while its shared store blips, a gateway 502/504) is
|
|
319
395
|
// retryable here, not just a raw socket error.
|
|
320
|
-
const retryable =
|
|
321
|
-
|
|
396
|
+
const retryable = error instanceof BackendHttpError
|
|
397
|
+
? resumeAfter !== undefined && isRetryableResumeStatus(error)
|
|
398
|
+
: isTransportError(error);
|
|
322
399
|
if (request.signal?.aborted
|
|
323
400
|
|| !retryable
|
|
324
401
|
|| (emittedMappedEvent && (!resumeSupported || !resumeAfter))) {
|
|
@@ -328,15 +405,23 @@ export class ZRouterStreamBackend {
|
|
|
328
405
|
// second copy of the turn, so fail the attempt instead.
|
|
329
406
|
throw error;
|
|
330
407
|
}
|
|
331
|
-
|
|
408
|
+
reconnectStarted ??= Date.now();
|
|
409
|
+
const attempts = resumeAfter ? policy.attempts : Math.min(6, policy.attempts);
|
|
410
|
+
if (attempt >= attempts || remaining() <= 0)
|
|
332
411
|
throw error;
|
|
333
412
|
// The Router keeps producing under this turn id, so waiting costs the
|
|
334
413
|
// turn nothing: the next attempt resumes from the cursor, not from zero.
|
|
335
|
-
const delayMs = reconnectDelay(policy, attempt);
|
|
414
|
+
const delayMs = Math.min(Math.max(reconnectDelay(policy, attempt), retryAfterDelayMs(error)), remaining());
|
|
336
415
|
const reason = error instanceof Error ? error.message : String(error);
|
|
337
416
|
runtimeDiag('warn', `[ztc] zrouter stream dropped (${reason}); reconnecting in ${delayMs}ms (attempt ${attempt + 1}/${policy.attempts})`);
|
|
338
|
-
|
|
417
|
+
const publicReason = isRetryableResumeStatus(error)
|
|
418
|
+
? `Router temporarily unavailable ${reason.match(/\(\d{3}\)/)?.[0] ?? ''}. Resuming the response.`
|
|
419
|
+
: reason;
|
|
420
|
+
request.onTransportRetry?.({ attempt, maxAttempts: attempts, delayMs, reason: publicReason,
|
|
421
|
+
...(error instanceof BackendHttpError && error.status === 429 ? { rateLimited: true } : {}) });
|
|
339
422
|
await waitForReconnect(delayMs, request.signal);
|
|
423
|
+
if (remaining() <= 0)
|
|
424
|
+
throw error;
|
|
340
425
|
}
|
|
341
426
|
}
|
|
342
427
|
}
|
|
@@ -387,6 +472,27 @@ async function waitForReconnect(delayMs, signal) {
|
|
|
387
472
|
signal?.addEventListener('abort', abort, { once: true });
|
|
388
473
|
});
|
|
389
474
|
}
|
|
475
|
+
/**
|
|
476
|
+
* Diagnostics that survive a body-less failure.
|
|
477
|
+
*
|
|
478
|
+
* A gateway that throws before it can classify anything often answers with a
|
|
479
|
+
* bare `Server Error` and puts the identifying information in the headers
|
|
480
|
+
* instead. Fly (Router's host) stamps a request id on every response; carrying
|
|
481
|
+
* it into the error is the only way to correlate a client-visible 500 with the
|
|
482
|
+
* server-side exception, since the body has nothing to correlate on.
|
|
483
|
+
*
|
|
484
|
+
* Bounded and header-only: never reads the body (already consumed), and caps
|
|
485
|
+
* each value so a hostile/proxied header cannot bloat an error message.
|
|
486
|
+
*/
|
|
487
|
+
function failureHeaderSuffix(response) {
|
|
488
|
+
const parts = [];
|
|
489
|
+
for (const name of ['fly-request-id', 'x-request-id', 'cf-ray', 'x-zerg-error-code']) {
|
|
490
|
+
const value = response.headers.get(name)?.trim();
|
|
491
|
+
if (value && value.length <= 128 && !/[\r\n\0]/.test(value))
|
|
492
|
+
parts.push(`${name}=${value}`);
|
|
493
|
+
}
|
|
494
|
+
return parts.length > 0 ? ` [${parts.join(' ')}]` : '';
|
|
495
|
+
}
|
|
390
496
|
/**
|
|
391
497
|
* True for a `ZRouter API error (NNN)` a resume is worth retrying: a gateway or
|
|
392
498
|
* rate-limit failure that is expected to clear. Kept separate from
|
|
@@ -415,3 +521,15 @@ function normalizeHeaderValue(value, label, maxLength) {
|
|
|
415
521
|
}
|
|
416
522
|
return normalized;
|
|
417
523
|
}
|
|
524
|
+
/** A wire-only projection: saved tool history remains byte-for-byte intact. */
|
|
525
|
+
function chatOnlyRequest(request) {
|
|
526
|
+
return { ...request, tools: [], messages: request.messages.map(message => ({ ...message,
|
|
527
|
+
content: typeof message.content === 'string' ? message.content : message.content.map(block => {
|
|
528
|
+
if (block.type === 'tool_use')
|
|
529
|
+
return { type: 'text', text: `Previous tool call ${block.name} (${block.id}): ${JSON.stringify(block.input)}` };
|
|
530
|
+
if (block.type === 'tool_result')
|
|
531
|
+
return { type: 'text', text: `Previous tool result (${block.tool_use_id}): ${typeof block.content === 'string' ? block.content : block.content.map(part => part.type === 'text' ? part.text : '[image]').join('\n')}` };
|
|
532
|
+
return block;
|
|
533
|
+
}),
|
|
534
|
+
})) };
|
|
535
|
+
}
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
*/
|
|
14
14
|
import type { WorkerExecutor } from '../worker/index.js';
|
|
15
15
|
import type { WorkerResult } from '../worker/index.js';
|
|
16
|
+
import type { ModelUsageObserver } from '../types.js';
|
|
16
17
|
export type BackgroundTaskStatus = 'running' | 'completed' | 'failed' | 'cancelled';
|
|
17
18
|
/** Public view of a background task — omits internal abort machinery. */
|
|
18
19
|
export interface BackgroundTaskInfo {
|
|
@@ -45,6 +46,7 @@ export interface BackgroundRegistryConfig {
|
|
|
45
46
|
timeoutMs?: number;
|
|
46
47
|
}
|
|
47
48
|
export interface SpawnOptions {
|
|
49
|
+
onUsage?: ModelUsageObserver;
|
|
48
50
|
maxIterations?: number;
|
|
49
51
|
cwd?: string;
|
|
50
52
|
timeoutMs?: number;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { HostClaimObservation, Message } from '../types.js';
|
|
2
|
+
export declare function claimObservationWarning(basis: HostClaimObservation['basis']): string;
|
|
3
|
+
/** Canonical message metadata; the original text, identity, and timestamp stay intact. */
|
|
4
|
+
export declare function withHostClaimObservation(message: Message, basis: HostClaimObservation['basis'], toolCallCount: number, observedAt: Date): Message;
|
|
5
|
+
/** This is a historical host observation, not proof that the requested work occurred. */
|
|
6
|
+
export declare function assistantClaimReplayContent(message: Message): string;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
export function claimObservationWarning(basis) {
|
|
3
|
+
return basis === 'no_tool_calls'
|
|
4
|
+
? 'Heads up: the agent claimed completion without actually invoking any tools. '
|
|
5
|
+
+ 'The task likely was not performed. Retry with a more specific instruction, '
|
|
6
|
+
+ 'or break the work into smaller steps.'
|
|
7
|
+
: 'Heads up: the agent reported success while its own tool output showed errors. '
|
|
8
|
+
+ 'Check the result above before trusting it, and retry if the work is incomplete.';
|
|
9
|
+
}
|
|
10
|
+
function sourceDigest(content) {
|
|
11
|
+
return createHash('sha256').update(content, 'utf8').digest('hex');
|
|
12
|
+
}
|
|
13
|
+
/** Validate persisted observations against their unchanged authored source. */
|
|
14
|
+
function validObservation(message, value) {
|
|
15
|
+
if (message.role !== 'assistant' || !value || typeof value !== 'object' || Array.isArray(value))
|
|
16
|
+
return false;
|
|
17
|
+
const record = value;
|
|
18
|
+
return Object.keys(record).length === 6
|
|
19
|
+
&& record.version === 1
|
|
20
|
+
&& typeof record.sourceMessageId === 'string'
|
|
21
|
+
&& record.sourceMessageId === message.id
|
|
22
|
+
&& Buffer.byteLength(record.sourceMessageId, 'utf8') > 0
|
|
23
|
+
&& Buffer.byteLength(record.sourceMessageId, 'utf8') <= 256
|
|
24
|
+
&& !/[\u0000-\u001f\u007f]/.test(record.sourceMessageId)
|
|
25
|
+
&& record.sourceSha256 === sourceDigest(message.content)
|
|
26
|
+
&& (record.basis === 'no_tool_calls' || record.basis === 'contradictory_tool_output')
|
|
27
|
+
&& Number.isSafeInteger(record.toolCallCount)
|
|
28
|
+
&& (record.basis === 'no_tool_calls' ? record.toolCallCount === 0 : record.toolCallCount > 0)
|
|
29
|
+
&& typeof record.observedAt === 'string'
|
|
30
|
+
&& record.observedAt.length === 24
|
|
31
|
+
&& Number.isFinite(Date.parse(record.observedAt))
|
|
32
|
+
&& new Date(record.observedAt).toISOString() === record.observedAt;
|
|
33
|
+
}
|
|
34
|
+
/** Canonical message metadata; the original text, identity, and timestamp stay intact. */
|
|
35
|
+
export function withHostClaimObservation(message, basis, toolCallCount, observedAt) {
|
|
36
|
+
const observation = {
|
|
37
|
+
version: 1, sourceMessageId: message.id, sourceSha256: sourceDigest(message.content),
|
|
38
|
+
basis, toolCallCount, observedAt: observedAt.toISOString(),
|
|
39
|
+
};
|
|
40
|
+
if (!validObservation(message, observation))
|
|
41
|
+
throw new RangeError('Invalid host claim observation source or count');
|
|
42
|
+
return { ...message, metadata: { ...message.metadata, hostClaimObservation: observation } };
|
|
43
|
+
}
|
|
44
|
+
/** This is a historical host observation, not proof that the requested work occurred. */
|
|
45
|
+
export function assistantClaimReplayContent(message) {
|
|
46
|
+
const observation = message.metadata?.hostClaimObservation;
|
|
47
|
+
if (!validObservation(message, observation))
|
|
48
|
+
return message.content;
|
|
49
|
+
return '[Unverified assistant claim; historical host observation for source '
|
|
50
|
+
+ JSON.stringify(observation.sourceMessageId) + ' at ' + observation.observedAt + ']\n'
|
|
51
|
+
+ claimObservationWarning(observation.basis) + '\n'
|
|
52
|
+
+ 'Treat the following original statement as unverified, not as evidence of completed work:\n'
|
|
53
|
+
+ message.content;
|
|
54
|
+
}
|