@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,3 +1,4 @@
|
|
|
1
|
+
import type { ManagedCommandObservation } from './runtime/command_jobs.js';
|
|
1
2
|
/**
|
|
2
3
|
* Shared loop-policy helpers applied by BOTH run loops (Agent.run and
|
|
3
4
|
* SubAgent.run) so the two cannot drift (Eng review A5). Pure and stateless
|
|
@@ -8,10 +9,12 @@
|
|
|
8
9
|
* input, and result content, appends a corrective hint when the SAME call
|
|
9
10
|
* (name + canonical input) produced a byte-identical result to a previous call
|
|
10
11
|
* in this run — the non-progressing repeat behind F8 churn / F1 re-fire.
|
|
11
|
-
*
|
|
12
|
-
*
|
|
12
|
+
* Changed results and host-verified silent managed reads are legitimate
|
|
13
|
+
* observations, so neither receives a corrective warning.
|
|
13
14
|
*/
|
|
14
|
-
export declare function createRepeatGuard(): (name: string, input: unknown, content: string) => string;
|
|
15
|
+
export declare function createRepeatGuard(): (name: string, input: unknown, content: string, managedCommand?: ManagedCommandObservation) => string;
|
|
16
|
+
/** This metadata is supplied by the host tools, never inferred from result text. */
|
|
17
|
+
export declare function isHealthyManagedCommandRead(observation?: ManagedCommandObservation): boolean;
|
|
15
18
|
/** Suffix createRepeatGuard appends to a repeated identical result. */
|
|
16
19
|
export declare const REPEAT_GUARD_MARKER = "\n\n[repeat-guard] ";
|
|
17
20
|
/**
|
|
@@ -8,12 +8,14 @@
|
|
|
8
8
|
* input, and result content, appends a corrective hint when the SAME call
|
|
9
9
|
* (name + canonical input) produced a byte-identical result to a previous call
|
|
10
10
|
* in this run — the non-progressing repeat behind F8 churn / F1 re-fire.
|
|
11
|
-
*
|
|
12
|
-
*
|
|
11
|
+
* Changed results and host-verified silent managed reads are legitimate
|
|
12
|
+
* observations, so neither receives a corrective warning.
|
|
13
13
|
*/
|
|
14
14
|
export function createRepeatGuard() {
|
|
15
15
|
const seen = new Map();
|
|
16
|
-
return (name, input, content) => {
|
|
16
|
+
return (name, input, content, managedCommand) => {
|
|
17
|
+
if (isHealthyManagedCommandRead(managedCommand))
|
|
18
|
+
return content;
|
|
17
19
|
let sig;
|
|
18
20
|
try {
|
|
19
21
|
// NUL separator: unambiguous by construction — it cannot appear in a tool
|
|
@@ -31,6 +33,13 @@ export function createRepeatGuard() {
|
|
|
31
33
|
return content;
|
|
32
34
|
};
|
|
33
35
|
}
|
|
36
|
+
/** This metadata is supplied by the host tools, never inferred from result text. */
|
|
37
|
+
export function isHealthyManagedCommandRead(observation) {
|
|
38
|
+
return observation?.kind === 'read'
|
|
39
|
+
&& observation.result.status === 'running'
|
|
40
|
+
&& observation.result.output === ''
|
|
41
|
+
&& observation.result.has_more === false;
|
|
42
|
+
}
|
|
34
43
|
/** Suffix createRepeatGuard appends to a repeated identical result. */
|
|
35
44
|
export const REPEAT_GUARD_MARKER = '\n\n[repeat-guard] ';
|
|
36
45
|
/**
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Guidance for the generic retained-source checker, only when that tool is reachable. */
|
|
2
|
+
export const MEASUREMENT_EVIDENCE_GUIDANCE = `
|
|
3
|
+
MEASUREMENT VALIDATION — before ranking a reported optimization target, establish its metric definition and selected runtime path. Discover measurement_report with tool_search and assess original retained managed-command observation IDs against explicit workload/stage/input shape, units, timing domain, scope/ranks and instrumentation requirements. Use the measurement-validation skill for the producer envelope and workflow.
|
|
4
|
+
Compatibility does not establish source verification or benchmark eligibility; both remain unknown. A running startup artifact with passed=false is incomplete, not a failed final run. Demonstrate the expected metric field in a small smoke in the requested mode/path before an expensive full run. Never sum inclusive parent/child spans or overlapping ranks as exclusive wall time. Keep unexplained residuals unattributed hypotheses, not measured removable performance wins. No report grants execution authorization.
|
|
5
|
+
`.trim();
|
|
@@ -15,9 +15,12 @@
|
|
|
15
15
|
* field write. The tool-result selector itself stays agent-owned: the agent
|
|
16
16
|
* computes the verdict and passes it in; the encoder only assembles blocks.
|
|
17
17
|
*/
|
|
18
|
-
import { Message } from '../types.js';
|
|
18
|
+
import { Message, ToolDefinition } from '../types.js';
|
|
19
19
|
import { LlmMessage, RequestContentBlock } from './backends/index.js';
|
|
20
20
|
export interface EncodeDeps {
|
|
21
|
+
preserveNativeHistory?: boolean;
|
|
22
|
+
model?: string;
|
|
23
|
+
nativeContextId?: string;
|
|
21
24
|
/**
|
|
22
25
|
* Per-request tool-result selector verdict (tool_use_id -> rendered content),
|
|
23
26
|
* or null when no tool results are present. Computed by the agent (selector is
|
|
@@ -45,12 +48,14 @@ export interface EncodeResult {
|
|
|
45
48
|
*/
|
|
46
49
|
transientOverageTokens: number;
|
|
47
50
|
}
|
|
51
|
+
export declare const STABLE_RESULT_LIMIT = 4096;
|
|
48
52
|
export declare class RequestEncoder {
|
|
49
53
|
private readonly deps;
|
|
50
54
|
private overage;
|
|
51
55
|
constructor(deps: EncodeDeps);
|
|
52
56
|
/** Full request encoding: role filter + per-message content + same-role merge. */
|
|
53
57
|
encode(messages: Message[]): EncodeResult;
|
|
58
|
+
private freezeContent;
|
|
54
59
|
/**
|
|
55
60
|
* Build the request content for a single message string: tool-result JSON ->
|
|
56
61
|
* tool_result blocks (selector-rendered), `[image …]`/`[video …]` -> media
|
|
@@ -64,3 +69,5 @@ export declare class RequestEncoder {
|
|
|
64
69
|
private parseToolResultForImages;
|
|
65
70
|
private buildToolResultBlocks;
|
|
66
71
|
}
|
|
72
|
+
/** Provider reasoning binds the system prompt and ordered tool vocabulary. */
|
|
73
|
+
export declare function nativeHistoryContextId(system: string, tools: ToolDefinition[]): string;
|
|
@@ -15,12 +15,15 @@
|
|
|
15
15
|
* field write. The tool-result selector itself stays agent-owned: the agent
|
|
16
16
|
* computes the verdict and passes it in; the encoder only assembles blocks.
|
|
17
17
|
*/
|
|
18
|
+
import { createHash } from 'node:crypto';
|
|
18
19
|
import { isMirrorMediaPath } from '../utils/mirror_media.js';
|
|
20
|
+
import { readDurableSessionImageSync, SessionMediaError } from '../session_media.js';
|
|
19
21
|
import { parseImageToolResult } from './tool_result_parsing.js';
|
|
22
|
+
import { assistantClaimReplayContent } from './claim_observation.js';
|
|
20
23
|
const OLD_RESULT_CAP = 2000;
|
|
21
24
|
// Rewriting a near-cap result saves little but changes the cacheable history.
|
|
22
25
|
// Keep small results stable; large historical results still use the 2K cap.
|
|
23
|
-
const STABLE_RESULT_LIMIT = 4096;
|
|
26
|
+
export const STABLE_RESULT_LIMIT = 4096;
|
|
24
27
|
export class RequestEncoder {
|
|
25
28
|
deps;
|
|
26
29
|
overage = 0;
|
|
@@ -29,7 +32,7 @@ export class RequestEncoder {
|
|
|
29
32
|
}
|
|
30
33
|
/** Full request encoding: role filter + per-message content + same-role merge. */
|
|
31
34
|
encode(messages) {
|
|
32
|
-
const
|
|
35
|
+
const eligibleMessages = messages
|
|
33
36
|
.filter((m) => {
|
|
34
37
|
if (m.role !== 'user' && m.role !== 'assistant')
|
|
35
38
|
return false;
|
|
@@ -37,15 +40,44 @@ export class RequestEncoder {
|
|
|
37
40
|
return false;
|
|
38
41
|
return true;
|
|
39
42
|
})
|
|
43
|
+
.flatMap(message => {
|
|
44
|
+
if (!this.deps.preserveNativeHistory || message.role !== 'assistant' || !Array.isArray(message.nativeContent))
|
|
45
|
+
return [message];
|
|
46
|
+
const observation = assistantClaimReplayContent(message);
|
|
47
|
+
if (observation === message.content
|
|
48
|
+
|| message.nativeContent.some(block => block.type === 'text' && block.text === observation))
|
|
49
|
+
return [message];
|
|
50
|
+
// Opaque provider blocks stay unchanged. Place the validated historical
|
|
51
|
+
// observation before this assistant so its tool/result pair remains
|
|
52
|
+
// adjacent and the current authored request retains the final row.
|
|
53
|
+
return [{
|
|
54
|
+
id: `${message.id}_claim_observation`, role: 'user',
|
|
55
|
+
content: observation, timestamp: message.timestamp,
|
|
56
|
+
metadata: { synthetic: true, hostContext: true, preserveUserBoundary: true },
|
|
57
|
+
}, message];
|
|
58
|
+
});
|
|
59
|
+
const formatted = eligibleMessages
|
|
40
60
|
.map(m => {
|
|
61
|
+
const assistantContent = m.role === 'assistant' ? assistantClaimReplayContent(m) : m.content;
|
|
62
|
+
if (this.deps.preserveNativeHistory && m.nativeContent !== undefined && m.nativeModel === this.deps.model
|
|
63
|
+
&& m.nativeContextId === this.deps.nativeContextId) {
|
|
64
|
+
if (typeof m.nativeContent === 'string' && assistantContent !== m.content) {
|
|
65
|
+
// The host may have observed this claim after its plain native text
|
|
66
|
+
// was frozen. Retain the admitted qualification on every replay.
|
|
67
|
+
this.freezeContent(m, assistantContent);
|
|
68
|
+
return { role: m.role, content: assistantContent };
|
|
69
|
+
}
|
|
70
|
+
return { role: m.role, content: structuredClone(m.nativeContent) };
|
|
71
|
+
}
|
|
41
72
|
if (m.role === 'user') {
|
|
42
|
-
//
|
|
43
|
-
//
|
|
44
|
-
//
|
|
45
|
-
if (m.metadata?.compactionSummary) {
|
|
73
|
+
// Summaries and host observations quote source text. Preserve those
|
|
74
|
+
// quotes literally rather than treating them as new media directives
|
|
75
|
+
// or tool results. Other synthetic messages can be real tool results.
|
|
76
|
+
if (m.metadata?.compactionSummary || m.metadata?.hostContext === true) {
|
|
46
77
|
return { role: m.role, content: m.content };
|
|
47
78
|
}
|
|
48
79
|
const content = this.buildUserContentBlocks(m.content, m.attachments || []);
|
|
80
|
+
this.freezeContent(m, content);
|
|
49
81
|
return {
|
|
50
82
|
role: m.role,
|
|
51
83
|
content
|
|
@@ -54,13 +86,20 @@ export class RequestEncoder {
|
|
|
54
86
|
const reasoning = typeof m.metadata?.reasoningContent === 'string'
|
|
55
87
|
? m.metadata.reasoningContent
|
|
56
88
|
: undefined;
|
|
89
|
+
// A model switch starts a fresh reasoning context. Preserve factual
|
|
90
|
+
// native text/tool blocks, but never send another model's signatures.
|
|
91
|
+
if (this.deps.preserveNativeHistory && Array.isArray(m.nativeContent)) {
|
|
92
|
+
const content = m.nativeContent.filter(block => block.type !== 'thinking' && block.type !== 'redacted_thinking');
|
|
93
|
+
this.freezeContent(m, content);
|
|
94
|
+
return { role: m.role, content };
|
|
95
|
+
}
|
|
57
96
|
// Assistant message - may need to include tool_use blocks
|
|
58
97
|
if (m.toolCalls && m.toolCalls.length > 0) {
|
|
59
98
|
// Build content array with text and tool_use blocks
|
|
60
99
|
const contentBlocks = [];
|
|
61
100
|
// Add text content if present
|
|
62
|
-
if (
|
|
63
|
-
contentBlocks.push({ type: 'text', text:
|
|
101
|
+
if (assistantContent && assistantContent.trim() && assistantContent !== '[Using tools...]') {
|
|
102
|
+
contentBlocks.push({ type: 'text', text: assistantContent });
|
|
64
103
|
}
|
|
65
104
|
// Add tool_use blocks
|
|
66
105
|
for (const tc of m.toolCalls) {
|
|
@@ -71,6 +110,7 @@ export class RequestEncoder {
|
|
|
71
110
|
input: tc.args
|
|
72
111
|
});
|
|
73
112
|
}
|
|
113
|
+
this.freezeContent(m, contentBlocks);
|
|
74
114
|
return {
|
|
75
115
|
role: m.role,
|
|
76
116
|
content: contentBlocks,
|
|
@@ -78,9 +118,10 @@ export class RequestEncoder {
|
|
|
78
118
|
};
|
|
79
119
|
}
|
|
80
120
|
// Plain text assistant message
|
|
121
|
+
this.freezeContent(m, assistantContent);
|
|
81
122
|
return {
|
|
82
123
|
role: m.role,
|
|
83
|
-
content:
|
|
124
|
+
content: assistantContent,
|
|
84
125
|
...(reasoning ? { reasoning } : {}),
|
|
85
126
|
};
|
|
86
127
|
});
|
|
@@ -88,8 +129,14 @@ export class RequestEncoder {
|
|
|
88
129
|
// Two sources: (1) repair injects synthetic tool_result user before real user prompt,
|
|
89
130
|
// (2) multi-iteration runs where formatMessages filters intervening role:'tool' messages
|
|
90
131
|
const merged = [];
|
|
91
|
-
|
|
92
|
-
|
|
132
|
+
const preservesUserBoundary = (message) => message?.role === 'user' && message.metadata?.hostContext === true
|
|
133
|
+
&& message.metadata.preserveUserBoundary === true;
|
|
134
|
+
for (const [index, msg] of formatted.entries()) {
|
|
135
|
+
// A historical host handoff is its own user row on both sides. Keep this
|
|
136
|
+
// metadata local to encoding; ordinary user and tool-result merging stays intact.
|
|
137
|
+
if (merged.length > 0 && msg.role === merged[merged.length - 1].role
|
|
138
|
+
&& !preservesUserBoundary(eligibleMessages[index])
|
|
139
|
+
&& !preservesUserBoundary(eligibleMessages[index - 1])) {
|
|
93
140
|
const prev = merged[merged.length - 1];
|
|
94
141
|
const prevBlocks = this.toContentBlocks(prev.content);
|
|
95
142
|
const currBlocks = this.toContentBlocks(msg.content);
|
|
@@ -108,6 +155,13 @@ export class RequestEncoder {
|
|
|
108
155
|
}
|
|
109
156
|
return { messages: merged, transientOverageTokens: this.overage };
|
|
110
157
|
}
|
|
158
|
+
freezeContent(message, content) {
|
|
159
|
+
if (!this.deps.preserveNativeHistory)
|
|
160
|
+
return;
|
|
161
|
+
message.nativeContent = structuredClone(content);
|
|
162
|
+
message.nativeModel = this.deps.model;
|
|
163
|
+
message.nativeContextId = this.deps.nativeContextId;
|
|
164
|
+
}
|
|
111
165
|
/**
|
|
112
166
|
* Build the request content for a single message string: tool-result JSON ->
|
|
113
167
|
* tool_result blocks (selector-rendered), `[image …]`/`[video …]` -> media
|
|
@@ -132,10 +186,10 @@ export class RequestEncoder {
|
|
|
132
186
|
// block (content must be a string for the API), not as undefined —
|
|
133
187
|
// which would crash parseImageToolResult and silently degrade the
|
|
134
188
|
// whole message to plain text, breaking tool_use/tool_result pairing.
|
|
135
|
-
content: verdict?.get(r.tool_use_id)
|
|
189
|
+
content: (verdict?.get(r.tool_use_id)
|
|
136
190
|
?? this.deps.renderForContext(r.tool_use_id)
|
|
137
191
|
?? r.content
|
|
138
|
-
?? '',
|
|
192
|
+
?? '') + (typeof r.context_annotation === 'string' ? r.context_annotation : ''),
|
|
139
193
|
}));
|
|
140
194
|
return this.buildToolResultBlocks(rerendered);
|
|
141
195
|
}
|
|
@@ -211,17 +265,31 @@ export class RequestEncoder {
|
|
|
211
265
|
buildAttachmentBlocks(attachments) {
|
|
212
266
|
const blocks = [];
|
|
213
267
|
for (const attachment of attachments) {
|
|
214
|
-
if (attachment.kind !== 'image'
|
|
215
|
-
continue;
|
|
216
|
-
// Structured attachments are read off disk (loadImageBlock -> readFileSync). A child
|
|
217
|
-
// pane receives them from the mirror over an unauthenticated wire, so a forged localPath
|
|
218
|
-
// pointing outside the mirror media root would be an arbitrary server-file read. Only
|
|
219
|
-
// genuine mirror uploads live under MIRROR_MEDIA_ROOT; refuse anything else.
|
|
220
|
-
if (!isMirrorMediaPath(attachment.localPath))
|
|
268
|
+
if (attachment.kind !== 'image')
|
|
221
269
|
continue;
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
270
|
+
try {
|
|
271
|
+
const durable = readDurableSessionImageSync(attachment);
|
|
272
|
+
if (durable) {
|
|
273
|
+
blocks.push({ type: 'image', mediaType: durable.mediaType,
|
|
274
|
+
data: durable.data.toString('base64'), path: durable.localPath });
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
// Keep legacy staging references confined to the admitted upload root.
|
|
278
|
+
if (isMirrorMediaPath(attachment.localPath)) {
|
|
279
|
+
const block = this.deps.loadImageBlock(attachment.localPath);
|
|
280
|
+
if (block) {
|
|
281
|
+
blocks.push(block);
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
catch (error) {
|
|
287
|
+
if (!(error instanceof SessionMediaError))
|
|
288
|
+
throw error;
|
|
289
|
+
}
|
|
290
|
+
const leaf = typeof attachment.name === 'string' ? attachment.name.split(/[\\/]/).pop() ?? 'image' : 'image';
|
|
291
|
+
const name = leaf.replace(/[\u0000-\u001f\u007f]/g, ' ').slice(0, 120) || 'image';
|
|
292
|
+
blocks.push({ type: 'text', text: `Image attachment "${name}" is unavailable. Reattach the image to inspect it.` });
|
|
225
293
|
}
|
|
226
294
|
return blocks;
|
|
227
295
|
}
|
|
@@ -277,3 +345,7 @@ export class RequestEncoder {
|
|
|
277
345
|
});
|
|
278
346
|
}
|
|
279
347
|
}
|
|
348
|
+
/** Provider reasoning binds the system prompt and ordered tool vocabulary. */
|
|
349
|
+
export function nativeHistoryContextId(system, tools) {
|
|
350
|
+
return createHash('sha256').update(JSON.stringify({ system, tools })).digest('hex');
|
|
351
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { BenchmarkVerifierDecision } from './benchmark_contract.js';
|
|
2
|
+
import type { CommandVerificationReceipt } from './source_verification_contract.js';
|
|
3
|
+
export interface BenchmarkComparisonSource {
|
|
4
|
+
observation_id: string;
|
|
5
|
+
receipt_id: string;
|
|
6
|
+
source_id: string;
|
|
7
|
+
program_sha256: string;
|
|
8
|
+
value_ms: number;
|
|
9
|
+
}
|
|
10
|
+
export interface BenchmarkComparisonDecision {
|
|
11
|
+
schema_version: 1;
|
|
12
|
+
adapter_id: 'cpu_integer_sum_comparison';
|
|
13
|
+
scope: 'benchmark:cpu_integer_sum';
|
|
14
|
+
outcome: 'comparable' | 'incompatible' | 'unknown';
|
|
15
|
+
benchmark_eligibility: 'eligible' | 'ineligible' | 'unknown';
|
|
16
|
+
baseline: BenchmarkComparisonSource | null;
|
|
17
|
+
candidate: BenchmarkComparisonSource | null;
|
|
18
|
+
delta_ms: number | null;
|
|
19
|
+
relative_change_percent: number | null;
|
|
20
|
+
reason: string;
|
|
21
|
+
}
|
|
22
|
+
export interface RegisteredBenchmarkObservation {
|
|
23
|
+
id: string;
|
|
24
|
+
receipt: CommandVerificationReceipt;
|
|
25
|
+
decision: BenchmarkVerifierDecision;
|
|
26
|
+
}
|
|
27
|
+
/** Historical comparison metadata never invents another execution or verifies the observation itself. */
|
|
28
|
+
export declare function parseBenchmarkComparisonDecision(value: unknown): BenchmarkComparisonDecision | null;
|
|
29
|
+
/** Compare declared fixture conditions, never infer causal improvement or a plateau from a delta. */
|
|
30
|
+
export declare function compareRegisteredBenchmarks(baseline: RegisteredBenchmarkObservation | null, candidate: RegisteredBenchmarkObservation | null): BenchmarkComparisonDecision;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
const encoded = new TextEncoder();
|
|
2
|
+
function object(value, fields) {
|
|
3
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
4
|
+
throw new TypeError('Invalid comparison object');
|
|
5
|
+
const proto = Object.getPrototypeOf(value);
|
|
6
|
+
if (proto !== Object.prototype && proto !== null)
|
|
7
|
+
throw new TypeError('Invalid comparison prototype');
|
|
8
|
+
const row = value;
|
|
9
|
+
if (Object.keys(row).length !== fields.length || fields.some(key => !Object.hasOwn(row, key)))
|
|
10
|
+
throw new TypeError('Invalid comparison fields');
|
|
11
|
+
return row;
|
|
12
|
+
}
|
|
13
|
+
const hash = (value) => typeof value === 'string' && /^[a-f0-9]{64}$/u.test(value);
|
|
14
|
+
const text = (value, limit) => typeof value === 'string' && value.trim().length > 0
|
|
15
|
+
&& encoded.encode(value).length <= limit && !/[\u0000-\u001f\u007f]/u.test(value);
|
|
16
|
+
function source(value) {
|
|
17
|
+
if (value === null)
|
|
18
|
+
return null;
|
|
19
|
+
const row = object(value, ['observation_id', 'receipt_id', 'source_id', 'program_sha256', 'value_ms']);
|
|
20
|
+
if (!text(row.observation_id, 256) || !text(row.receipt_id, 256) || !hash(row.source_id) || !hash(row.program_sha256)
|
|
21
|
+
|| typeof row.value_ms !== 'number' || !Number.isFinite(row.value_ms) || row.value_ms <= 0 || row.value_ms > 60000) {
|
|
22
|
+
throw new TypeError('Invalid bounded comparison source');
|
|
23
|
+
}
|
|
24
|
+
return row;
|
|
25
|
+
}
|
|
26
|
+
/** Historical comparison metadata never invents another execution or verifies the observation itself. */
|
|
27
|
+
export function parseBenchmarkComparisonDecision(value) {
|
|
28
|
+
try {
|
|
29
|
+
if (encoded.encode(JSON.stringify(value)).length > 4096)
|
|
30
|
+
return null;
|
|
31
|
+
const row = object(value, ['schema_version', 'adapter_id', 'scope', 'outcome', 'benchmark_eligibility', 'baseline', 'candidate',
|
|
32
|
+
'delta_ms', 'relative_change_percent', 'reason']);
|
|
33
|
+
if (row.schema_version !== 1 || row.adapter_id !== 'cpu_integer_sum_comparison' || row.scope !== 'benchmark:cpu_integer_sum'
|
|
34
|
+
|| !text(row.reason, 512) || !['comparable', 'incompatible', 'unknown'].includes(String(row.outcome)))
|
|
35
|
+
return null;
|
|
36
|
+
const baseline = source(row.baseline);
|
|
37
|
+
const candidate = source(row.candidate);
|
|
38
|
+
if (row.outcome === 'comparable') {
|
|
39
|
+
if (row.benchmark_eligibility !== 'eligible' || !baseline || !candidate
|
|
40
|
+
|| baseline.observation_id === candidate.observation_id || baseline.receipt_id === candidate.receipt_id
|
|
41
|
+
|| row.delta_ms !== candidate.value_ms - baseline.value_ms
|
|
42
|
+
|| typeof row.relative_change_percent !== 'number' || !Number.isFinite(row.relative_change_percent)
|
|
43
|
+
|| row.relative_change_percent !== (candidate.value_ms - baseline.value_ms) / baseline.value_ms * 100)
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
else if (row.delta_ms !== null || row.relative_change_percent !== null
|
|
47
|
+
|| row.benchmark_eligibility !== (row.outcome === 'incompatible' ? 'ineligible' : 'unknown'))
|
|
48
|
+
return null;
|
|
49
|
+
return structuredClone(row);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const describe = (observed) => observed.decision.measurement
|
|
56
|
+
&& observed.decision.program_sha256 ? { observation_id: observed.id, receipt_id: observed.receipt.receipt_id,
|
|
57
|
+
source_id: observed.receipt.source.source_id, program_sha256: observed.decision.program_sha256,
|
|
58
|
+
value_ms: observed.decision.measurement.value_ms } : null;
|
|
59
|
+
function sameFields(first, second, fields) {
|
|
60
|
+
const left = first;
|
|
61
|
+
const right = second;
|
|
62
|
+
return fields.every(key => left[key] === right[key]);
|
|
63
|
+
}
|
|
64
|
+
/** Compare declared fixture conditions, never infer causal improvement or a plateau from a delta. */
|
|
65
|
+
export function compareRegisteredBenchmarks(baseline, candidate) {
|
|
66
|
+
const result = { schema_version: 1, adapter_id: 'cpu_integer_sum_comparison', scope: 'benchmark:cpu_integer_sum',
|
|
67
|
+
outcome: 'unknown', benchmark_eligibility: 'unknown', baseline: baseline ? describe(baseline) : null,
|
|
68
|
+
candidate: candidate ? describe(candidate) : null, delta_ms: null, relative_change_percent: null,
|
|
69
|
+
reason: 'Two complete retained host-admitted eligible CPU measurements are required.' };
|
|
70
|
+
if (!baseline || !candidate || baseline.decision.benchmark_eligibility !== 'eligible'
|
|
71
|
+
|| candidate.decision.benchmark_eligibility !== 'eligible' || !result.baseline || !result.candidate)
|
|
72
|
+
return result;
|
|
73
|
+
result.outcome = 'incompatible';
|
|
74
|
+
result.benchmark_eligibility = 'ineligible';
|
|
75
|
+
if (baseline.id === candidate.id || baseline.receipt.receipt_id === candidate.receipt.receipt_id) {
|
|
76
|
+
result.reason = 'Two aliases of the same original run are not independent measurements.';
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
const first = baseline.decision;
|
|
80
|
+
const second = candidate.decision;
|
|
81
|
+
if (first.recipe_sha256 !== second.recipe_sha256 || first.checker_sha256 !== second.checker_sha256
|
|
82
|
+
|| !sameFields(first.conditions, second.conditions, ['host_instance_id', 'cpu_model', 'logical_cpus', 'os_release'])
|
|
83
|
+
|| !sameFields(baseline.receipt.environment, candidate.receipt.environment, ['platform', 'arch', 'node_version', 'declared_id'])
|
|
84
|
+
|| !first.workload || !second.workload || !sameFields(first.workload, second.workload, ['id', 'input_sha256', 'length', 'iterations', 'warmup', 'samples'])) {
|
|
85
|
+
result.reason = 'Workload, checker, runner or declared execution/measurement conditions differ.';
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
result.outcome = 'comparable';
|
|
89
|
+
result.benchmark_eligibility = 'eligible';
|
|
90
|
+
result.delta_ms = result.candidate.value_ms - result.baseline.value_ms;
|
|
91
|
+
result.relative_change_percent = result.delta_ms / result.baseline.value_ms * 100;
|
|
92
|
+
result.reason = 'Independent registered measurements share the declared workload and conditions; no causal improvement or plateau is inferred.';
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { CommandVerificationReceipt } from './source_verification_contract.js';
|
|
2
|
+
/** Eligibility is scoped to this registered CPU fixture and its captured measurement conditions. */
|
|
3
|
+
export interface BenchmarkVerifierDecision {
|
|
4
|
+
schema_version: 1;
|
|
5
|
+
adapter_id: 'cpu_integer_sum';
|
|
6
|
+
recipe_version: 1;
|
|
7
|
+
execution: 'host_node_subprocess';
|
|
8
|
+
recipe_sha256: string;
|
|
9
|
+
receipt_id: string;
|
|
10
|
+
source_id: string;
|
|
11
|
+
scope: 'benchmark:cpu_integer_sum';
|
|
12
|
+
input_path: string;
|
|
13
|
+
config_path: string;
|
|
14
|
+
input_binding: 'immutable_bytes' | 'unknown';
|
|
15
|
+
outcome: 'passed' | 'failed' | 'unknown';
|
|
16
|
+
checks_total: number;
|
|
17
|
+
checks_passed: number;
|
|
18
|
+
reason: string;
|
|
19
|
+
benchmark_eligibility: 'eligible' | 'ineligible' | 'unknown';
|
|
20
|
+
variant: 'for_loop' | 'array_reduce' | null;
|
|
21
|
+
program_sha256: string | null;
|
|
22
|
+
checker_sha256: string;
|
|
23
|
+
conditions: {
|
|
24
|
+
host_instance_id: string;
|
|
25
|
+
cpu_model: string;
|
|
26
|
+
logical_cpus: number;
|
|
27
|
+
os_release: string;
|
|
28
|
+
};
|
|
29
|
+
workload: {
|
|
30
|
+
id: 'cpu_integer_sum/v1';
|
|
31
|
+
input_sha256: string;
|
|
32
|
+
length: number;
|
|
33
|
+
iterations: number;
|
|
34
|
+
warmup: number;
|
|
35
|
+
samples: number;
|
|
36
|
+
} | null;
|
|
37
|
+
measurement: {
|
|
38
|
+
samples_ms: number[];
|
|
39
|
+
value_ms: number;
|
|
40
|
+
unit: 'ms';
|
|
41
|
+
timing_domain: 'node_performance_now';
|
|
42
|
+
scope: 'integer_sum_kernel';
|
|
43
|
+
rank: 0;
|
|
44
|
+
world_size: 1;
|
|
45
|
+
} | null;
|
|
46
|
+
}
|
|
47
|
+
/** Decode a host-admitted decision; provider output must never enter this trusted channel. */
|
|
48
|
+
export declare function parseBenchmarkVerifierDecision(value: unknown, receipt: CommandVerificationReceipt): BenchmarkVerifierDecision | null;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
const hash = (value) => typeof value === 'string' && /^[a-f0-9]{64}$/u.test(value);
|
|
2
|
+
const integer = (value, low, high) => typeof value === 'number'
|
|
3
|
+
&& Number.isSafeInteger(value) && value >= low && value <= high;
|
|
4
|
+
const encoded = new TextEncoder();
|
|
5
|
+
const text = (value, bound) => typeof value === 'string' && value.trim().length > 0
|
|
6
|
+
&& encoded.encode(value).length <= bound && !/[\u0000-\u001f\u007f]/u.test(value);
|
|
7
|
+
function object(value, fields) {
|
|
8
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
9
|
+
throw new TypeError('Invalid benchmark object');
|
|
10
|
+
const proto = Object.getPrototypeOf(value);
|
|
11
|
+
if (proto !== Object.prototype && proto !== null)
|
|
12
|
+
throw new TypeError('Invalid benchmark prototype');
|
|
13
|
+
const row = value;
|
|
14
|
+
if (Object.keys(row).length !== fields.length || fields.some(key => !Object.hasOwn(row, key))) {
|
|
15
|
+
throw new TypeError('Invalid benchmark fields');
|
|
16
|
+
}
|
|
17
|
+
return row;
|
|
18
|
+
}
|
|
19
|
+
/** Decode a host-admitted decision; provider output must never enter this trusted channel. */
|
|
20
|
+
export function parseBenchmarkVerifierDecision(value, receipt) {
|
|
21
|
+
try {
|
|
22
|
+
if (encoded.encode(JSON.stringify(value)).length > 8192)
|
|
23
|
+
return null;
|
|
24
|
+
const row = object(value, ['schema_version', 'adapter_id', 'recipe_version', 'execution', 'recipe_sha256', 'receipt_id', 'source_id',
|
|
25
|
+
'scope', 'input_path', 'config_path', 'input_binding', 'outcome', 'checks_total', 'checks_passed', 'reason', 'benchmark_eligibility',
|
|
26
|
+
'variant', 'program_sha256', 'checker_sha256', 'conditions', 'workload', 'measurement']);
|
|
27
|
+
if (row.schema_version !== 1 || row.adapter_id !== 'cpu_integer_sum' || row.recipe_version !== 1
|
|
28
|
+
|| row.execution !== 'host_node_subprocess' || row.scope !== 'benchmark:cpu_integer_sum'
|
|
29
|
+
|| !hash(row.recipe_sha256) || row.recipe_sha256 !== receipt.command_sha256
|
|
30
|
+
|| row.receipt_id !== receipt.receipt_id || row.source_id !== receipt.source.source_id
|
|
31
|
+
|| receipt.command_kind !== 'host_verifier' || receipt.purpose !== 'benchmark' || receipt.scope !== row.scope
|
|
32
|
+
|| receipt.source.origin !== 'local' || !hash(row.checker_sha256) || !text(row.reason, 512)
|
|
33
|
+
|| !['immutable_bytes', 'unknown'].includes(String(row.input_binding))
|
|
34
|
+
|| !['passed', 'failed', 'unknown'].includes(String(row.outcome))
|
|
35
|
+
|| !['eligible', 'ineligible', 'unknown'].includes(String(row.benchmark_eligibility))
|
|
36
|
+
|| !integer(row.checks_total, 0, 9) || !integer(row.checks_passed, 0, row.checks_total))
|
|
37
|
+
return null;
|
|
38
|
+
const input = receipt.source.files.find(file => file.path === row.input_path);
|
|
39
|
+
const config = receipt.source.files.find(file => file.path === row.config_path);
|
|
40
|
+
if (!input || !config || input.path === config.path || receipt.source.files.length !== 2)
|
|
41
|
+
return null;
|
|
42
|
+
if (row.variant !== null && row.variant !== 'for_loop' && row.variant !== 'array_reduce')
|
|
43
|
+
return null;
|
|
44
|
+
if (row.variant === null ? row.program_sha256 !== null : !hash(row.program_sha256))
|
|
45
|
+
return null;
|
|
46
|
+
const conditions = object(row.conditions, ['host_instance_id', 'cpu_model', 'logical_cpus', 'os_release']);
|
|
47
|
+
if (!hash(conditions.host_instance_id) || !text(conditions.cpu_model, 256) || !integer(conditions.logical_cpus, 1, 1024)
|
|
48
|
+
|| !text(conditions.os_release, 128))
|
|
49
|
+
return null;
|
|
50
|
+
let workload = null;
|
|
51
|
+
if (row.workload !== null) {
|
|
52
|
+
workload = object(row.workload, ['id', 'input_sha256', 'length', 'iterations', 'warmup', 'samples']);
|
|
53
|
+
if (workload.id !== 'cpu_integer_sum/v1' || workload.input_sha256 !== input.sha256
|
|
54
|
+
|| !integer(workload.length, 1, 1024) || !integer(workload.iterations, 1, 2048)
|
|
55
|
+
|| !integer(workload.warmup, 0, 4) || !integer(workload.samples, 3, 9) || workload.samples % 2 === 0)
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
if (row.measurement !== null) {
|
|
59
|
+
const measured = object(row.measurement, ['samples_ms', 'value_ms', 'unit', 'timing_domain', 'scope', 'rank', 'world_size']);
|
|
60
|
+
if (!workload || measured.unit !== 'ms' || measured.timing_domain !== 'node_performance_now'
|
|
61
|
+
|| measured.scope !== 'integer_sum_kernel' || measured.rank !== 0 || measured.world_size !== 1
|
|
62
|
+
|| !Array.isArray(measured.samples_ms) || measured.samples_ms.length !== workload.samples
|
|
63
|
+
|| measured.samples_ms.some(sample => typeof sample !== 'number' || !Number.isFinite(sample) || sample <= 0 || sample > 60000))
|
|
64
|
+
return null;
|
|
65
|
+
const sorted = [...measured.samples_ms].sort((a, b) => a - b);
|
|
66
|
+
if (measured.value_ms !== sorted[Math.floor(sorted.length / 2)])
|
|
67
|
+
return null;
|
|
68
|
+
}
|
|
69
|
+
if (row.outcome === 'unknown') {
|
|
70
|
+
if (row.checks_total !== 0 || row.checks_passed !== 0 || row.measurement !== null || row.benchmark_eligibility === 'eligible')
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
if (row.input_binding !== 'immutable_bytes' || receipt.source.coverage !== 'complete'
|
|
75
|
+
|| input.kind !== 'file' || config.kind !== 'file' || input.bytes > 65536 || config.bytes > 65536
|
|
76
|
+
|| !workload || row.measurement === null || row.variant === null || row.checks_total !== workload.samples
|
|
77
|
+
|| receipt.process_outcome !== 'passed')
|
|
78
|
+
return null;
|
|
79
|
+
if (row.outcome === 'passed' ? row.checks_passed !== row.checks_total : row.checks_passed === row.checks_total)
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
if (row.benchmark_eligibility === 'eligible' && (row.outcome !== 'passed' || receipt.instrumentation !== 'production'
|
|
83
|
+
|| receipt.source_binding !== 'observed_endpoints' || receipt.build_identity !== row.recipe_sha256))
|
|
84
|
+
return null;
|
|
85
|
+
return structuredClone(row);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** Explicit declared-process outcomes; never source or build qualification. */
|
|
2
|
+
export interface CheckedCommandStage {
|
|
3
|
+
executable: string;
|
|
4
|
+
args: string[];
|
|
5
|
+
acceptable_exit_codes?: number[];
|
|
6
|
+
}
|
|
7
|
+
export interface CheckedCommandPlan {
|
|
8
|
+
steps: {
|
|
9
|
+
id: string;
|
|
10
|
+
pipeline: CheckedCommandStage[];
|
|
11
|
+
}[];
|
|
12
|
+
}
|
|
13
|
+
export interface CheckedCommandResult {
|
|
14
|
+
schema_version: 1;
|
|
15
|
+
status: 'passed' | 'failed' | 'incomplete' | 'timed_out' | 'cancelled';
|
|
16
|
+
verification: 'unknown';
|
|
17
|
+
plan_sha256: string;
|
|
18
|
+
steps: {
|
|
19
|
+
id: string;
|
|
20
|
+
status: 'passed' | 'failed' | 'skipped' | 'unknown';
|
|
21
|
+
stages: {
|
|
22
|
+
exit_code: number | null;
|
|
23
|
+
acceptable_exit_codes: number[];
|
|
24
|
+
accepted: boolean | null;
|
|
25
|
+
}[];
|
|
26
|
+
}[];
|
|
27
|
+
reason?: string;
|
|
28
|
+
}
|
|
29
|
+
/** Parse a bounded literal process plan; shell text is never inferred from its arguments. */
|
|
30
|
+
export declare function parseCheckedCommandPlan(value: unknown): CheckedCommandPlan | null;
|
|
31
|
+
/** Parse declared process outcomes without turning them into source or build qualification. */
|
|
32
|
+
export declare function parseCheckedCommandResult(value: unknown): CheckedCommandResult | null;
|