@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,10 +1,20 @@
|
|
|
1
1
|
import { basename, dirname, join, relative, resolve } from 'path';
|
|
2
2
|
import { realpathSync } from 'node:fs';
|
|
3
3
|
import { appendFile } from 'node:fs/promises';
|
|
4
|
+
import { getRuntimeCapabilities } from '../tools/helper_requirements.js';
|
|
4
5
|
import { ToolCapability } from './capabilities.js';
|
|
5
6
|
import { configStore } from '../../config.js';
|
|
6
7
|
import { loadIntentsContext, maybeAutoUpdateIntents } from '../../context/intents_loader.js';
|
|
7
8
|
import { resolveToolEffect } from './tool_effects.js';
|
|
9
|
+
import { isManagedRemoteResourceTool } from './remote_resources.js';
|
|
10
|
+
import { askUserTool } from '../tools/ask_user.js';
|
|
11
|
+
import { recallToolResponseTool } from '../tools/recall_tool_response.js';
|
|
12
|
+
import { sessionEvidenceTool } from '../tools/session_evidence.js';
|
|
13
|
+
import { parseVerificationRequest } from './source_verification_contract.js';
|
|
14
|
+
import { readCommandTool, runCommandTool, stopCommandTool } from '../tools/shell.js';
|
|
15
|
+
import { verifyArtifactTool } from '../tools/verify_artifact.js';
|
|
16
|
+
import { benchmarkCPUTool } from '../tools/benchmark_cpu.js';
|
|
17
|
+
import { compareBenchmarksTool } from '../tools/compare_benchmarks.js';
|
|
8
18
|
function getTool(name, tools) {
|
|
9
19
|
return tools.find(t => t.definition.name === name);
|
|
10
20
|
}
|
|
@@ -24,6 +34,49 @@ function isHostControlPlaneWrite(tool, args, cwd) {
|
|
|
24
34
|
return false;
|
|
25
35
|
}
|
|
26
36
|
}
|
|
37
|
+
/** Missing sources still require permission for the resolved parent and leaf. */
|
|
38
|
+
function canonicalSourcePath(path) {
|
|
39
|
+
let probe = path;
|
|
40
|
+
const missing = [];
|
|
41
|
+
while (true) {
|
|
42
|
+
try {
|
|
43
|
+
return join(realpathSync(probe), ...missing);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
const code = error.code;
|
|
47
|
+
if (code !== 'ENOENT' && code !== 'ENOTDIR')
|
|
48
|
+
throw error;
|
|
49
|
+
const parent = dirname(probe);
|
|
50
|
+
if (parent === probe)
|
|
51
|
+
throw error;
|
|
52
|
+
missing.unshift(basename(probe));
|
|
53
|
+
probe = parent;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function sourceReadDecision(cwd, paths, policy) {
|
|
58
|
+
let approvalRequired = false;
|
|
59
|
+
for (const path of paths) {
|
|
60
|
+
const lexical = resolve(cwd, path);
|
|
61
|
+
const check = (target) => policy?.evaluateTool({
|
|
62
|
+
name: 'read_file', args: { path: target }, capabilities: [ToolCapability.FILE_READ],
|
|
63
|
+
}) ?? { allowed: true };
|
|
64
|
+
const lexicalDecision = check(lexical);
|
|
65
|
+
if (!lexicalDecision.allowed)
|
|
66
|
+
return lexicalDecision;
|
|
67
|
+
approvalRequired ||= lexicalDecision.approvalRequired === true;
|
|
68
|
+
try {
|
|
69
|
+
const canonicalDecision = check(canonicalSourcePath(lexical));
|
|
70
|
+
if (!canonicalDecision.allowed)
|
|
71
|
+
return canonicalDecision;
|
|
72
|
+
approvalRequired ||= canonicalDecision.approvalRequired === true;
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return { allowed: false, reason: 'Permission denied: source verification path cannot be resolved for read admission.' };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return { allowed: true, ...(approvalRequired ? { approvalRequired } : {}) };
|
|
79
|
+
}
|
|
27
80
|
async function executeTool(name, args, tools, context) {
|
|
28
81
|
const tool = getTool(name, tools);
|
|
29
82
|
if (!tool)
|
|
@@ -43,11 +96,11 @@ function normalizeChangedPath(path, cwd) {
|
|
|
43
96
|
const rel = relative(cwd, resolve(cwd, path));
|
|
44
97
|
return rel.startsWith('..') ? path : rel || '.';
|
|
45
98
|
}
|
|
46
|
-
function extractChangedPaths(
|
|
99
|
+
function extractChangedPaths(capabilities, output, cwd) {
|
|
47
100
|
// Only tools that declare FILE_WRITE can produce file-change events.
|
|
48
101
|
// Inspecting capabilities (rather than tool name) lets new write tools opt
|
|
49
102
|
// in without changing this file — they just need `.path` or `.paths`.
|
|
50
|
-
if (!
|
|
103
|
+
if (!capabilities.includes(ToolCapability.FILE_WRITE))
|
|
51
104
|
return [];
|
|
52
105
|
try {
|
|
53
106
|
const parsed = JSON.parse(output);
|
|
@@ -109,9 +162,28 @@ async function recordToolTrace(entry) {
|
|
|
109
162
|
export async function executeToolWithRuntime(name, args, options) {
|
|
110
163
|
const tool = getTool(name, options.tools);
|
|
111
164
|
const traceStartedAt = Date.now();
|
|
112
|
-
const
|
|
165
|
+
const ordinaryCapabilities = getRuntimeCapabilities(tool);
|
|
166
|
+
const requiredCapabilities = (input) => (tool === runCommandTool && Object.hasOwn(input, 'verification')
|
|
167
|
+
? [...new Set([...ordinaryCapabilities, ToolCapability.FILE_READ])]
|
|
168
|
+
: ordinaryCapabilities);
|
|
169
|
+
let capabilities = requiredCapabilities(args);
|
|
113
170
|
let effectiveArgs = args;
|
|
114
171
|
let approvalGranted = false;
|
|
172
|
+
let managedCommand;
|
|
173
|
+
let verificationReceipt;
|
|
174
|
+
let verifierDecision;
|
|
175
|
+
let benchmarkComparisonDecision;
|
|
176
|
+
let policyExecutionCwd;
|
|
177
|
+
// A guarded remote session has a closed host-owned tool surface. This must
|
|
178
|
+
// precede hooks/approval: neither a model, plugin name nor permission update
|
|
179
|
+
// can turn a generic command into the verified remote broker.
|
|
180
|
+
if (options.remoteResourceSession && (!tool || (!isManagedRemoteResourceTool(tool, options.remoteResourceSession)
|
|
181
|
+
&& tool !== askUserTool && tool !== recallToolResponseTool && tool !== sessionEvidenceTool))) {
|
|
182
|
+
return {
|
|
183
|
+
content: 'Guarded remote session: use the host-managed remote_resource tool under a required lease. Unrestricted shell, network and plugin execution is blocked.',
|
|
184
|
+
isError: true, effectiveArgs,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
115
187
|
// R6/F7: the model sometimes passes a shell flag (e.g. `--pane`) as a tool
|
|
116
188
|
// ARGUMENT KEY rather than inside the command string (`grep: unrecognized
|
|
117
189
|
// option '--pane'`). A flag-style key the tool does NOT declare is never a
|
|
@@ -150,6 +222,7 @@ export async function executeToolWithRuntime(name, args, options) {
|
|
|
150
222
|
// drop fields by omitting them. The old replace-semantics turned
|
|
151
223
|
// `{path: '/tmp/safe'}` into a write of empty content.
|
|
152
224
|
effectiveArgs = { ...effectiveArgs, ...preHook.updatedArgs };
|
|
225
|
+
capabilities = requiredCapabilities(effectiveArgs);
|
|
153
226
|
}
|
|
154
227
|
if (preHook.failed || preHook.decision === 'deny') {
|
|
155
228
|
return {
|
|
@@ -238,14 +311,23 @@ export async function executeToolWithRuntime(name, args, options) {
|
|
|
238
311
|
}
|
|
239
312
|
approvalGranted = true;
|
|
240
313
|
}
|
|
314
|
+
let profileApprovalRequired = false;
|
|
241
315
|
if (options.policy
|
|
242
316
|
&& tool
|
|
243
317
|
&& !hostControlPlaneWrite) {
|
|
318
|
+
try {
|
|
319
|
+
policyExecutionCwd = tool.resolveExecutionCwd?.(effectiveArgs, options.context);
|
|
320
|
+
}
|
|
321
|
+
catch (error) {
|
|
322
|
+
return handleToolFailure(error);
|
|
323
|
+
}
|
|
244
324
|
const decision = options.policy.evaluateTool({
|
|
245
325
|
name,
|
|
246
326
|
args: effectiveArgs,
|
|
247
|
-
capabilities,
|
|
327
|
+
capabilities: ordinaryCapabilities,
|
|
328
|
+
...(policyExecutionCwd === undefined ? {} : { executionCwd: policyExecutionCwd }),
|
|
248
329
|
});
|
|
330
|
+
profileApprovalRequired = decision.approvalRequired === true;
|
|
249
331
|
if (!decision.allowed) {
|
|
250
332
|
return {
|
|
251
333
|
content: decision.reason || `Permission denied: ${name}`,
|
|
@@ -254,7 +336,33 @@ export async function executeToolWithRuntime(name, args, options) {
|
|
|
254
336
|
};
|
|
255
337
|
}
|
|
256
338
|
}
|
|
257
|
-
const
|
|
339
|
+
const verificationAdmission = () => {
|
|
340
|
+
const adapter = tool === verifyArtifactTool || tool === benchmarkCPUTool;
|
|
341
|
+
const measured = tool === benchmarkCPUTool;
|
|
342
|
+
if (!adapter && (tool !== runCommandTool || !Object.hasOwn(effectiveArgs, 'verification')))
|
|
343
|
+
return undefined;
|
|
344
|
+
if (!options.context)
|
|
345
|
+
return {
|
|
346
|
+
content: 'Source verification requires a host execution context.', isError: true, effectiveArgs,
|
|
347
|
+
};
|
|
348
|
+
const request = parseVerificationRequest(adapter ? { purpose: measured ? 'benchmark' : 'test', scope: measured ? 'benchmark:cpu_integer_sum' : 'artifact:json_assertions',
|
|
349
|
+
source_paths: [effectiveArgs.input_path, effectiveArgs.config_path], instrumentation: measured ? 'production' : 'unknown' } : effectiveArgs.verification);
|
|
350
|
+
if (!request)
|
|
351
|
+
return { content: `${name}: invalid source verification request`, isError: true, effectiveArgs };
|
|
352
|
+
const cwd = !adapter && effectiveArgs.cwd ? resolve(options.context.cwd, String(effectiveArgs.cwd)) : options.context.cwd;
|
|
353
|
+
const decision = sourceReadDecision(cwd, request.source_paths, options.policy);
|
|
354
|
+
if (!decision.allowed)
|
|
355
|
+
return {
|
|
356
|
+
content: decision.reason || 'Permission denied: source verification requires file_read.',
|
|
357
|
+
isError: true, effectiveArgs,
|
|
358
|
+
};
|
|
359
|
+
profileApprovalRequired ||= decision.approvalRequired === true;
|
|
360
|
+
return undefined;
|
|
361
|
+
};
|
|
362
|
+
const preflight = verificationAdmission();
|
|
363
|
+
if (preflight)
|
|
364
|
+
return preflight;
|
|
365
|
+
const directlyGated = options.approvalRequiredCapabilities?.some(capability => capabilities.includes(capability)) === true || profileApprovalRequired;
|
|
258
366
|
if (directlyGated && !approvalGranted) {
|
|
259
367
|
if (!options.approvalRequester) {
|
|
260
368
|
return {
|
|
@@ -283,6 +391,19 @@ export async function executeToolWithRuntime(name, args, options) {
|
|
|
283
391
|
}
|
|
284
392
|
approvalGranted = true;
|
|
285
393
|
}
|
|
394
|
+
const canInspectVerificationSource = (source) => {
|
|
395
|
+
if (source.origin !== 'local')
|
|
396
|
+
return false;
|
|
397
|
+
// A shell approval for stop_command grants cancellation, not a new read.
|
|
398
|
+
if (options.approvalRequiredCapabilities?.includes(ToolCapability.FILE_READ)
|
|
399
|
+
&& !(approvalGranted && capabilities.includes(ToolCapability.FILE_READ)))
|
|
400
|
+
return false;
|
|
401
|
+
const decision = sourceReadDecision(source.cwd, source.files.map(file => file.path), options.policy);
|
|
402
|
+
if (decision.approvalRequired && !(approvalGranted && capabilities.includes(ToolCapability.FILE_READ)))
|
|
403
|
+
return false;
|
|
404
|
+
return decision.allowed;
|
|
405
|
+
};
|
|
406
|
+
let checkpointRejected = false;
|
|
286
407
|
try {
|
|
287
408
|
// Systemic tool timeout: read-only tools get a 2-minute timeout to
|
|
288
409
|
// prevent the agent from hanging indefinitely on stuck searches,
|
|
@@ -290,21 +411,69 @@ export async function executeToolWithRuntime(name, args, options) {
|
|
|
290
411
|
// are NOT timed out because a write completing after the runtime
|
|
291
412
|
// returned an error would produce invisible disk mutations.
|
|
292
413
|
const TOOL_TIMEOUT_MS = 120_000;
|
|
414
|
+
const cwd = options.context?.cwd || options.hooks?.getBaseContext().cwd || process.cwd();
|
|
415
|
+
// Built-in commands and host-created adapters share their actual structured
|
|
416
|
+
// invocation mapping; tools without a declaration retain the base context.
|
|
417
|
+
const effectCwd = policyExecutionCwd ?? tool?.resolveExecutionCwd?.(effectiveArgs, options.context) ?? cwd;
|
|
293
418
|
const isWriteTool = capabilities.includes(ToolCapability.FILE_WRITE)
|
|
294
419
|
|| capabilities.includes(ToolCapability.SHELL_EXEC);
|
|
295
420
|
if (tool && options.onToolEffect) {
|
|
296
421
|
await options.onToolEffect({
|
|
297
422
|
phase: 'before_execute',
|
|
298
423
|
toolName: name,
|
|
299
|
-
effect: resolveToolEffect(tool),
|
|
424
|
+
effect: resolveToolEffect({ ...tool, capabilities: ordinaryCapabilities }),
|
|
300
425
|
args: effectiveArgs,
|
|
426
|
+
cwd: effectCwd,
|
|
427
|
+
signal: options.context?.signal,
|
|
301
428
|
...(options.context?.toolCallId
|
|
302
429
|
? { toolCallId: options.context.toolCallId }
|
|
303
430
|
: {}),
|
|
304
431
|
});
|
|
305
432
|
}
|
|
306
|
-
|
|
307
|
-
|
|
433
|
+
if (options.context?.signal?.aborted)
|
|
434
|
+
return {
|
|
435
|
+
content: 'not_executed: the turn was cancelled before tool dispatch.', isError: true, effectiveArgs,
|
|
436
|
+
};
|
|
437
|
+
if (tool && options.beforeExecute) {
|
|
438
|
+
try {
|
|
439
|
+
await options.beforeExecute(effectiveArgs);
|
|
440
|
+
}
|
|
441
|
+
catch (error) {
|
|
442
|
+
checkpointRejected = true;
|
|
443
|
+
throw error;
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
// Approval, observers and checkpoint writes may yield. Recheck the actual
|
|
447
|
+
// dispatch paths and cancellation immediately before invoking the tool.
|
|
448
|
+
if (options.context?.signal?.aborted)
|
|
449
|
+
return {
|
|
450
|
+
content: 'not_executed: the turn was cancelled before tool dispatch.', isError: true, effectiveArgs,
|
|
451
|
+
};
|
|
452
|
+
const dispatchAdmission = verificationAdmission();
|
|
453
|
+
if (dispatchAdmission)
|
|
454
|
+
return dispatchAdmission;
|
|
455
|
+
const toolContext = options.context ? { ...options.context,
|
|
456
|
+
onOutput: tool === runCommandTool || tool?.outputSource === runCommandTool
|
|
457
|
+
? options.context.onOutput : undefined,
|
|
458
|
+
canInspectVerificationSource: tool === runCommandTool || tool === readCommandTool || tool === stopCommandTool || tool === verifyArtifactTool || tool === benchmarkCPUTool
|
|
459
|
+
? canInspectVerificationSource : undefined,
|
|
460
|
+
managedCommandWaitSliceMs: tool === readCommandTool || tool === runCommandTool
|
|
461
|
+
? options.context.managedCommandWaitSliceMs : undefined,
|
|
462
|
+
onManagedCommand: tool === readCommandTool || tool === runCommandTool
|
|
463
|
+
? (observation) => { managedCommand = observation; }
|
|
464
|
+
: undefined,
|
|
465
|
+
onVerificationReceipt: tool === runCommandTool || tool === stopCommandTool || tool === benchmarkCPUTool
|
|
466
|
+
? (receipt) => { verificationReceipt = structuredClone(receipt); }
|
|
467
|
+
: undefined,
|
|
468
|
+
onHostVerifier: tool === verifyArtifactTool || tool === benchmarkCPUTool ? (receipt, decision) => {
|
|
469
|
+
verificationReceipt = structuredClone(receipt);
|
|
470
|
+
verifierDecision = structuredClone(decision);
|
|
471
|
+
} : undefined,
|
|
472
|
+
onHostBenchmarkComparison: tool === compareBenchmarksTool ? (decision) => {
|
|
473
|
+
benchmarkComparisonDecision = structuredClone(decision);
|
|
474
|
+
} : undefined,
|
|
475
|
+
} : undefined;
|
|
476
|
+
const toolPromise = executeTool(name, effectiveArgs, options.tools, toolContext);
|
|
308
477
|
let output;
|
|
309
478
|
if (isWriteTool) {
|
|
310
479
|
output = await toolPromise;
|
|
@@ -328,6 +497,7 @@ export async function executeToolWithRuntime(name, args, options) {
|
|
|
328
497
|
const TOOL_OUTPUT_CAP = 80_000;
|
|
329
498
|
output = augmentReadResultWithIntent(name, effectiveArgs, output, cwd);
|
|
330
499
|
let resultContent = output;
|
|
500
|
+
const contentTruncated = resultContent.length > TOOL_OUTPUT_CAP;
|
|
331
501
|
if (resultContent.length > TOOL_OUTPUT_CAP) {
|
|
332
502
|
const HEAD = Math.floor(TOOL_OUTPUT_CAP * 0.8);
|
|
333
503
|
const TAIL = TOOL_OUTPUT_CAP - HEAD;
|
|
@@ -336,7 +506,7 @@ export async function executeToolWithRuntime(name, args, options) {
|
|
|
336
506
|
+ `\n\n[output truncated: ${resultContent.length.toLocaleString()} chars / ~${totalLines.toLocaleString()} lines — showing first ${HEAD.toLocaleString()} and last ${TAIL.toLocaleString()} chars]\n\n`
|
|
337
507
|
+ resultContent.slice(-TAIL);
|
|
338
508
|
}
|
|
339
|
-
const changedPaths = extractChangedPaths(
|
|
509
|
+
const changedPaths = extractChangedPaths(ordinaryCapabilities, output, cwd);
|
|
340
510
|
// The plan artifact is host control-plane state outside the workspace.
|
|
341
511
|
// Auto-intents would turn this exact-one-file exception into a second
|
|
342
512
|
// workspace write, violating plan mode's safety boundary.
|
|
@@ -348,12 +518,22 @@ export async function executeToolWithRuntime(name, args, options) {
|
|
|
348
518
|
toolName: name,
|
|
349
519
|
settings: configStore.get().intents,
|
|
350
520
|
});
|
|
521
|
+
const allChangedPaths = [...new Set([...changedPaths, ...intentChangedPaths])];
|
|
522
|
+
if (allChangedPaths.length > 0 && options.onLocalFileChange) {
|
|
523
|
+
try {
|
|
524
|
+
await options.onLocalFileChange(allChangedPaths, cwd);
|
|
525
|
+
}
|
|
526
|
+
catch {
|
|
527
|
+
// The write has committed. An observation-store error must not invite
|
|
528
|
+
// replay of the successful mutation by presenting it as a tool failure.
|
|
529
|
+
resultContent += '\nLocal workspace evidence unavailable; the file write already completed.';
|
|
530
|
+
}
|
|
531
|
+
}
|
|
351
532
|
if (options.hooks) {
|
|
352
533
|
// FileChanged fires before PostToolUse: the write has already committed
|
|
353
534
|
// to disk, so watchers must observe it regardless of a later PostToolUse
|
|
354
535
|
// deny. PostToolUse itself is observational — deny surfaces as text,
|
|
355
536
|
// never isError:true, otherwise the model retries a call that succeeded.
|
|
356
|
-
const allChangedPaths = [...new Set([...changedPaths, ...intentChangedPaths])];
|
|
357
537
|
if (allChangedPaths.length > 0) {
|
|
358
538
|
await options.hooks.dispatch('FileChanged', {
|
|
359
539
|
paths: allChangedPaths,
|
|
@@ -379,10 +559,22 @@ export async function executeToolWithRuntime(name, args, options) {
|
|
|
379
559
|
return {
|
|
380
560
|
content: resultContent,
|
|
381
561
|
isError: false,
|
|
562
|
+
contentTruncated,
|
|
382
563
|
effectiveArgs,
|
|
564
|
+
...(managedCommand ? { managedCommand } : {}),
|
|
565
|
+
...(verificationReceipt ? { verificationReceipt } : {}),
|
|
566
|
+
...(!contentTruncated && verifierDecision ? { verifierDecision } : {}),
|
|
567
|
+
...(!contentTruncated && benchmarkComparisonDecision ? { benchmarkComparisonDecision } : {}),
|
|
383
568
|
};
|
|
384
569
|
}
|
|
385
570
|
catch (error) {
|
|
571
|
+
// Losing the host's required invocation checkpoint is a fatal persistence
|
|
572
|
+
// failure, never a normal tool error that invites inference to continue.
|
|
573
|
+
if (checkpointRejected)
|
|
574
|
+
throw error;
|
|
575
|
+
return handleToolFailure(error);
|
|
576
|
+
}
|
|
577
|
+
async function handleToolFailure(error) {
|
|
386
578
|
let message = error instanceof Error ? error.message : String(error);
|
|
387
579
|
if (options.hooks) {
|
|
388
580
|
const failureHook = await options.hooks.dispatch('PostToolUseFailure', {
|
|
@@ -401,6 +593,8 @@ export async function executeToolWithRuntime(name, args, options) {
|
|
|
401
593
|
content: message,
|
|
402
594
|
isError: true,
|
|
403
595
|
effectiveArgs,
|
|
596
|
+
...(managedCommand ? { managedCommand } : {}),
|
|
597
|
+
...(verificationReceipt ? { verificationReceipt } : {}),
|
|
404
598
|
};
|
|
405
599
|
}
|
|
406
600
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type TraceEventType = 'api_request' | 'api_response' | 'request_metrics' | 'prompt_echo' | 'tool_start' | 'tool_end' | 'tool_error' | 'policy_denied' | 'max_iterations';
|
|
1
|
+
export type TraceEventType = 'api_request' | 'api_response' | 'request_metrics' | 'prompt_echo' | 'tool_start' | 'tool_end' | 'tool_error' | 'policy_denied' | 'max_iterations' | 'turn_end';
|
|
2
2
|
export interface TraceEvent {
|
|
3
3
|
type: TraceEventType;
|
|
4
4
|
timestamp: Date;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type SourceSnapshot } from './source_verification_contract.js';
|
|
2
|
+
import type { ToolContext } from '../tools/types.js';
|
|
3
|
+
export declare const VERIFIER_INPUT_MAX_BYTES = 65536;
|
|
4
|
+
/** The recipe consumes these detached strings, not paths it could reopen.
|
|
5
|
+
* File reads are sequential observations; no atomic filesystem snapshot is claimed. */
|
|
6
|
+
export declare function captureVerifierInputs(context: Pick<ToolContext, 'cwd' | 'signal' | 'canInspectVerificationSource'>, paths: readonly string[]): Promise<{
|
|
7
|
+
source: SourceSnapshot;
|
|
8
|
+
documents: ReadonlyMap<string, string>;
|
|
9
|
+
}>;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { constants } from 'node:fs';
|
|
3
|
+
import { lstat, open, realpath } from 'node:fs/promises';
|
|
4
|
+
import { dirname, resolve } from 'node:path';
|
|
5
|
+
import { canonicalSourceContent, canonicalSourceIdentity, parseSourceSnapshot, parseVerificationRequest } from './source_verification_contract.js';
|
|
6
|
+
export const VERIFIER_INPUT_MAX_BYTES = 65536;
|
|
7
|
+
const hash = (bytes) => createHash('sha256').update(bytes).digest('hex');
|
|
8
|
+
function seal(source) {
|
|
9
|
+
const content = canonicalSourceContent(source);
|
|
10
|
+
if (content === null)
|
|
11
|
+
throw new Error('Invalid verifier input capture');
|
|
12
|
+
source.content_sha256 = hash(content);
|
|
13
|
+
const identity = canonicalSourceIdentity(source);
|
|
14
|
+
if (identity === null)
|
|
15
|
+
throw new Error('Invalid verifier source identity');
|
|
16
|
+
source.source_id = hash(identity);
|
|
17
|
+
const parsed = parseSourceSnapshot(source);
|
|
18
|
+
if (!parsed)
|
|
19
|
+
throw new Error('Verifier input metadata exceeds its bound');
|
|
20
|
+
return parsed;
|
|
21
|
+
}
|
|
22
|
+
/** The recipe consumes these detached strings, not paths it could reopen.
|
|
23
|
+
* File reads are sequential observations; no atomic filesystem snapshot is claimed. */
|
|
24
|
+
export async function captureVerifierInputs(context, paths) {
|
|
25
|
+
const request = parseVerificationRequest({ purpose: 'test', scope: 'artifact:json_assertions',
|
|
26
|
+
source_paths: [...paths], instrumentation: 'unknown' });
|
|
27
|
+
if (!request || paths.length !== 2)
|
|
28
|
+
throw new TypeError('Verifier capture requires two distinct scoped relative paths');
|
|
29
|
+
const cwd = await realpath(resolve(context.cwd));
|
|
30
|
+
const source = { schema_version: 1, source_id: '0'.repeat(64), content_sha256: '0'.repeat(64),
|
|
31
|
+
cwd, origin: 'local', captured_at: new Date().toISOString(), git: { commit: null, dirty: null }, coverage: 'incomplete',
|
|
32
|
+
files: [...paths].sort().map(path => ({ path, kind: 'unavailable', sha256: null, bytes: 0, mode: 0 })) };
|
|
33
|
+
const documents = new Map();
|
|
34
|
+
for (const row of source.files) {
|
|
35
|
+
const absolute = resolve(cwd, row.path);
|
|
36
|
+
try {
|
|
37
|
+
if (context.signal?.aborted || (context.canInspectVerificationSource
|
|
38
|
+
&& !await context.canInspectVerificationSource(seal(structuredClone(source)))))
|
|
39
|
+
continue;
|
|
40
|
+
// Reject linked parents and leaves, and nonregular files before opening (including FIFOs).
|
|
41
|
+
if (await realpath(dirname(absolute)) !== dirname(absolute))
|
|
42
|
+
continue;
|
|
43
|
+
const location = await lstat(absolute);
|
|
44
|
+
row.bytes = Number.isSafeInteger(location.size) && location.size >= 0 ? location.size : 0;
|
|
45
|
+
row.mode = location.mode & 0o7777;
|
|
46
|
+
if (!location.isFile() || location.size > VERIFIER_INPUT_MAX_BYTES || context.signal?.aborted)
|
|
47
|
+
continue;
|
|
48
|
+
const handle = await open(absolute, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
49
|
+
try {
|
|
50
|
+
const before = await handle.stat();
|
|
51
|
+
if (!before.isFile() || before.size > VERIFIER_INPUT_MAX_BYTES || before.dev !== location.dev || before.ino !== location.ino)
|
|
52
|
+
continue;
|
|
53
|
+
// One extra byte detects growth without exceeding the capture budget.
|
|
54
|
+
const bytes = Buffer.alloc(before.size + 1);
|
|
55
|
+
let used = 0;
|
|
56
|
+
while (used < bytes.length) {
|
|
57
|
+
if (context.signal?.aborted)
|
|
58
|
+
break;
|
|
59
|
+
const read = await handle.read(bytes, used, bytes.length - used, used);
|
|
60
|
+
if (!read.bytesRead)
|
|
61
|
+
break;
|
|
62
|
+
used += read.bytesRead;
|
|
63
|
+
}
|
|
64
|
+
const after = await handle.stat();
|
|
65
|
+
const current = await lstat(absolute);
|
|
66
|
+
if (context.signal?.aborted || used !== before.size || before.dev !== after.dev || before.ino !== after.ino
|
|
67
|
+
|| before.size !== after.size || before.mtimeMs !== after.mtimeMs || before.ctimeMs !== after.ctimeMs
|
|
68
|
+
|| current.dev !== before.dev || current.ino !== before.ino
|
|
69
|
+
|| await realpath(dirname(absolute)) !== dirname(absolute))
|
|
70
|
+
continue;
|
|
71
|
+
if (context.canInspectVerificationSource && !await context.canInspectVerificationSource(seal(structuredClone(source))))
|
|
72
|
+
continue;
|
|
73
|
+
if (context.signal?.aborted)
|
|
74
|
+
continue;
|
|
75
|
+
const captured = bytes.subarray(0, used);
|
|
76
|
+
row.kind = 'file';
|
|
77
|
+
row.sha256 = hash(captured);
|
|
78
|
+
row.bytes = used;
|
|
79
|
+
row.mode = before.mode & 0o7777;
|
|
80
|
+
// Preserve the exact byte digest even if the document is not valid UTF-8.
|
|
81
|
+
try {
|
|
82
|
+
documents.set(row.path, new TextDecoder('utf-8', { fatal: true }).decode(captured));
|
|
83
|
+
}
|
|
84
|
+
catch { /* An undecodable input cannot enter the JSON recipe. */ }
|
|
85
|
+
}
|
|
86
|
+
finally {
|
|
87
|
+
await handle.close();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
if (error.code === 'ENOENT')
|
|
92
|
+
row.kind = 'missing';
|
|
93
|
+
// Missing, changed, denied and nonregular inputs remain explicitly incomplete.
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
source.coverage = source.files.every(row => row.kind === 'file') ? 'complete' : 'incomplete';
|
|
97
|
+
if (source.coverage === 'incomplete')
|
|
98
|
+
source.reason = 'Some verifier inputs were missing, changed, denied, nonregular or exceeded 65536 bytes.';
|
|
99
|
+
return { source: seal(source), documents };
|
|
100
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { CommandVerificationReceipt } from './source_verification_contract.js';
|
|
2
|
+
import { type BenchmarkVerifierDecision } from './benchmark_contract.js';
|
|
3
|
+
/** A registered recipe proves only its configured artifact property, never a whole program or benchmark. */
|
|
4
|
+
export interface VerifierDecision {
|
|
5
|
+
schema_version: 1;
|
|
6
|
+
adapter_id: 'json_assertions';
|
|
7
|
+
recipe_version: 1;
|
|
8
|
+
execution: 'host_in_process';
|
|
9
|
+
recipe_sha256: string;
|
|
10
|
+
receipt_id: string;
|
|
11
|
+
source_id: string;
|
|
12
|
+
scope: 'artifact:json_assertions';
|
|
13
|
+
input_path: string;
|
|
14
|
+
config_path: string;
|
|
15
|
+
input_binding: 'immutable_bytes' | 'unknown';
|
|
16
|
+
outcome: 'passed' | 'failed' | 'unknown';
|
|
17
|
+
checks_total: number;
|
|
18
|
+
checks_passed: number;
|
|
19
|
+
reason: string;
|
|
20
|
+
benchmark_eligibility: 'unknown';
|
|
21
|
+
}
|
|
22
|
+
export type HostVerifierDecision = VerifierDecision | BenchmarkVerifierDecision;
|
|
23
|
+
export declare function parseHostVerifierDecision(value: unknown, receipt: CommandVerificationReceipt): HostVerifierDecision | null;
|
|
24
|
+
export declare function parseVerifierDecision(value: unknown, receipt: CommandVerificationReceipt): VerifierDecision | null;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { parseBenchmarkVerifierDecision } from './benchmark_contract.js';
|
|
2
|
+
export function parseHostVerifierDecision(value, receipt) {
|
|
3
|
+
return parseVerifierDecision(value, receipt) ?? parseBenchmarkVerifierDecision(value, receipt);
|
|
4
|
+
}
|
|
5
|
+
export function parseVerifierDecision(value, receipt) {
|
|
6
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
7
|
+
return null;
|
|
8
|
+
const row = value;
|
|
9
|
+
const allowed = ['schema_version', 'adapter_id', 'recipe_version', 'execution', 'recipe_sha256', 'receipt_id', 'source_id', 'scope',
|
|
10
|
+
'input_path', 'config_path', 'input_binding', 'outcome', 'checks_total', 'checks_passed', 'reason', 'benchmark_eligibility'];
|
|
11
|
+
if (Object.keys(row).length !== allowed.length || Object.keys(row).some(key => !allowed.includes(key)))
|
|
12
|
+
return null;
|
|
13
|
+
if (row.schema_version !== 1 || row.adapter_id !== 'json_assertions' || row.recipe_version !== 1 || row.execution !== 'host_in_process'
|
|
14
|
+
|| row.scope !== 'artifact:json_assertions' || row.benchmark_eligibility !== 'unknown'
|
|
15
|
+
|| row.receipt_id !== receipt.receipt_id || row.source_id !== receipt.source.source_id
|
|
16
|
+
|| row.recipe_sha256 !== receipt.command_sha256 || receipt.command_kind !== 'host_verifier'
|
|
17
|
+
|| receipt.scope !== row.scope || receipt.purpose !== 'test' || receipt.source.origin !== 'local'
|
|
18
|
+
|| typeof row.reason !== 'string' || !row.reason.trim() || Buffer.byteLength(row.reason) > 512
|
|
19
|
+
|| /[\u0000-\u001f\u007f]/u.test(row.reason))
|
|
20
|
+
return null;
|
|
21
|
+
if (!['passed', 'failed', 'unknown'].includes(String(row.outcome))
|
|
22
|
+
|| !['immutable_bytes', 'unknown'].includes(String(row.input_binding))
|
|
23
|
+
|| typeof row.checks_total !== 'number' || !Number.isSafeInteger(row.checks_total) || row.checks_total < 0 || row.checks_total > 32
|
|
24
|
+
|| typeof row.checks_passed !== 'number' || !Number.isSafeInteger(row.checks_passed) || row.checks_passed < 0
|
|
25
|
+
|| row.checks_passed > row.checks_total || receipt.process_outcome !== row.outcome)
|
|
26
|
+
return null;
|
|
27
|
+
const input = receipt.source.files.find(file => file.path === row.input_path);
|
|
28
|
+
const config = receipt.source.files.find(file => file.path === row.config_path);
|
|
29
|
+
if (!input || !config || input.path === config.path || receipt.source.files.length !== 2)
|
|
30
|
+
return null;
|
|
31
|
+
if (row.outcome !== 'unknown' && (row.input_binding !== 'immutable_bytes' || receipt.source.coverage !== 'complete'
|
|
32
|
+
|| input.kind !== 'file' || config.kind !== 'file' || input.bytes > 65536 || config.bytes > 65536 || row.checks_total === 0))
|
|
33
|
+
return null;
|
|
34
|
+
if (row.outcome === 'passed' && row.checks_passed !== row.checks_total)
|
|
35
|
+
return null;
|
|
36
|
+
if (row.outcome === 'failed' && row.checks_passed === row.checks_total)
|
|
37
|
+
return null;
|
|
38
|
+
if (row.outcome === 'unknown' && (row.checks_total !== 0 || row.checks_passed !== 0))
|
|
39
|
+
return null;
|
|
40
|
+
return structuredClone(row);
|
|
41
|
+
}
|
package/dist/agent/subagent.d.ts
CHANGED
|
@@ -1,19 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* Spawns a separate agent with its own context to handle tasks like:
|
|
5
|
-
* - Exploring codebases
|
|
6
|
-
* - Searching for patterns
|
|
7
|
-
* - Reading multiple files
|
|
8
|
-
*
|
|
9
|
-
* Only the final summary is returned to the main agent, keeping the main context clean.
|
|
10
|
-
*/
|
|
1
|
+
import { Message, type AgentEvent } from '../types.js';
|
|
2
|
+
import type { ModelUsageObserver } from '../types.js';
|
|
11
3
|
import { AgentBackend } from './backends/index.js';
|
|
12
4
|
import type { Tool } from './tools/types.js';
|
|
5
|
+
import { type EvidenceSnapshot } from './runtime/evidence.js';
|
|
6
|
+
import { type DelegatedEvidenceHandoff } from './runtime/delegated_evidence.js';
|
|
13
7
|
import type { Policy } from './runtime/policy.js';
|
|
14
8
|
import { HookDispatcher } from '../hooks/dispatcher.js';
|
|
15
9
|
import type { HookApprovalRequester } from '../hooks/types.js';
|
|
16
10
|
export interface SubAgentConfig {
|
|
11
|
+
/** Host-owned resume handle; checked against the original parent and cwd. */
|
|
12
|
+
resumeSessionId?: string;
|
|
13
|
+
parentSessionId?: string;
|
|
14
|
+
commandPolicy?: import('../utils/sandbox.js').SandboxCommandOptions;
|
|
17
15
|
provider: string;
|
|
18
16
|
apiKey: string;
|
|
19
17
|
model?: string;
|
|
@@ -27,6 +25,7 @@ export interface SubAgentConfig {
|
|
|
27
25
|
temporaryWriteRoot?: string;
|
|
28
26
|
}
|
|
29
27
|
export interface SubAgentResult {
|
|
28
|
+
evidence: DelegatedEvidenceHandoff;
|
|
30
29
|
summary: string;
|
|
31
30
|
filesRead: string[];
|
|
32
31
|
commandsRun: string[];
|
|
@@ -63,10 +62,14 @@ export declare class SubAgent {
|
|
|
63
62
|
private inputTokens;
|
|
64
63
|
private outputTokens;
|
|
65
64
|
private readonly toolResponseStore;
|
|
65
|
+
private readonly sessionId;
|
|
66
66
|
private readonly discoveredTools;
|
|
67
67
|
private hooks?;
|
|
68
68
|
private approvalRequester?;
|
|
69
69
|
constructor(config: SubAgentConfig);
|
|
70
|
+
getSessionId(): string;
|
|
71
|
+
getEvidenceSnapshot(): EvidenceSnapshot;
|
|
72
|
+
getEvidenceHandoff(summary?: string): DelegatedEvidenceHandoff;
|
|
70
73
|
/**
|
|
71
74
|
* Run a task and return a summary.
|
|
72
75
|
*
|
|
@@ -77,12 +80,19 @@ export declare class SubAgent {
|
|
|
77
80
|
signal?: AbortSignal;
|
|
78
81
|
systemPrompt?: string;
|
|
79
82
|
tools?: Tool[];
|
|
83
|
+
/** Compacted history supplies context, never new source observations. */
|
|
84
|
+
messages?: Message[];
|
|
80
85
|
onIteration?: (info: {
|
|
81
86
|
iteration: number;
|
|
82
87
|
max: number;
|
|
83
88
|
toolsCalled: string[];
|
|
84
89
|
}) => void;
|
|
90
|
+
onUsage?: ModelUsageObserver;
|
|
91
|
+
onEvent?: (event: AgentEvent) => void;
|
|
85
92
|
}): Promise<SubAgentResult>;
|
|
93
|
+
private hasStoredToolIdentity;
|
|
94
|
+
private persistEvidenceCheckpoint;
|
|
95
|
+
private evidenceSource;
|
|
86
96
|
/**
|
|
87
97
|
* Track what the sub-agent accessed
|
|
88
98
|
*/
|