@zergai/ztc 0.4.0-beta.1 → 0.5.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +398 -45
- package/RUST_THIRD_PARTY_LICENSES.txt +1080 -822
- package/THIRD_PARTY_NOTICES.md +273 -12
- package/bin/zmux-darwin-arm64 +0 -0
- package/bin/ztc-audio-darwin-arm64 +0 -0
- package/bin/ztc-capture-darwin-arm64 +0 -0
- package/bin/ztc-computer-darwin-arm64 +0 -0
- package/bin/ztc-llm-darwin-arm64 +0 -0
- package/bin/ztc-tts-darwin-arm64 +0 -0
- package/bin/ztc-tui-darwin-arm64 +0 -0
- package/bin/ztc-zlicky-overlay-darwin-arm64 +0 -0
- package/bin/zterm-darwin-arm64 +0 -0
- package/dist/App.js +1206 -209
- package/dist/agent/agent.d.ts +74 -8
- package/dist/agent/agent.js +1073 -184
- package/dist/agent/backends/account_rotation.d.ts +4 -0
- package/dist/agent/backends/account_rotation.js +8 -2
- package/dist/agent/backends/anthropic.d.ts +13 -0
- package/dist/agent/backends/anthropic.js +169 -28
- package/dist/agent/backends/claude_cli.js +18 -8
- package/dist/agent/backends/codex_app_server.d.ts +1 -0
- package/dist/agent/backends/codex_app_server.js +55 -3
- package/dist/agent/backends/codex_auth.d.ts +1 -0
- package/dist/agent/backends/codex_auth.js +67 -13
- package/dist/agent/backends/codex_buffered_recovery.d.ts +27 -0
- package/dist/agent/backends/codex_buffered_recovery.js +293 -0
- package/dist/agent/backends/gemini.js +3 -1
- package/dist/agent/backends/http_error.d.ts +26 -0
- package/dist/agent/backends/http_error.js +221 -0
- package/dist/agent/backends/index.d.ts +9 -2
- package/dist/agent/backends/index.js +22 -2
- package/dist/agent/backends/openai.d.ts +0 -6
- package/dist/agent/backends/openai.js +5 -2
- package/dist/agent/backends/openai_compatible.d.ts +5 -4
- package/dist/agent/backends/openai_compatible.js +26 -19
- package/dist/agent/backends/openai_responses.d.ts +8 -3
- package/dist/agent/backends/openai_responses.js +77 -33
- package/dist/agent/backends/provider_ids.d.ts +1 -0
- package/dist/agent/backends/provider_ids.js +4 -0
- package/dist/agent/backends/request_metrics.js +12 -2
- package/dist/agent/backends/types.d.ts +109 -6
- package/dist/agent/backends/types.js +5 -1
- package/dist/agent/backends/zrouter_stream.d.ts +6 -1
- package/dist/agent/backends/zrouter_stream.js +160 -42
- package/dist/agent/background_registry.d.ts +2 -0
- package/dist/agent/background_registry.js +1 -0
- package/dist/agent/claim_observation.d.ts +6 -0
- package/dist/agent/claim_observation.js +54 -0
- package/dist/agent/commands/accounts.js +46 -177
- package/dist/agent/commands/attention.d.ts +2 -0
- package/dist/agent/commands/attention.js +67 -0
- package/dist/agent/commands/auth.js +18 -2
- package/dist/agent/commands/board.d.ts +2 -0
- package/dist/agent/commands/board.js +169 -0
- package/dist/agent/commands/clipboard.js +50 -1
- package/dist/agent/commands/compact.js +21 -13
- package/dist/agent/commands/config.js +4 -1
- package/dist/agent/commands/context.js +6 -1
- package/dist/agent/commands/desktop.d.ts +2 -0
- package/dist/agent/commands/desktop.js +29 -0
- package/dist/agent/commands/effort.js +14 -6
- package/dist/agent/commands/environment.d.ts +3 -0
- package/dist/agent/commands/environment.js +109 -0
- package/dist/agent/commands/evidence.d.ts +2 -0
- package/dist/agent/commands/evidence.js +9 -0
- package/dist/agent/commands/fork.js +4 -3
- package/dist/agent/commands/goal.d.ts +33 -1
- package/dist/agent/commands/goal.js +174 -14
- package/dist/agent/commands/goal_exit.d.ts +36 -0
- package/dist/agent/commands/goal_exit.js +120 -0
- package/dist/agent/commands/help.js +3 -1
- package/dist/agent/commands/history.js +3 -1
- package/dist/agent/commands/inbox.d.ts +2 -0
- package/dist/agent/commands/inbox.js +148 -0
- package/dist/agent/commands/index.js +16 -1
- package/dist/agent/commands/input_mode.js +8 -6
- package/dist/agent/commands/job.d.ts +2 -0
- package/dist/agent/commands/job.js +93 -0
- package/dist/agent/commands/keybindings.js +4 -1
- package/dist/agent/commands/label.d.ts +2 -0
- package/dist/agent/commands/label.js +77 -0
- package/dist/agent/commands/layout.d.ts +2 -0
- package/dist/agent/commands/layout.js +20 -0
- package/dist/agent/commands/mirror.js +16 -1
- package/dist/agent/commands/model.js +12 -2
- package/dist/agent/commands/permissions.d.ts +3 -1
- package/dist/agent/commands/permissions.js +79 -89
- package/dist/agent/commands/plan.js +5 -15
- package/dist/agent/commands/profile.js +21 -2
- package/dist/agent/commands/provider_selection.js +20 -1
- package/dist/agent/commands/rename.js +1 -1
- package/dist/agent/commands/resources.d.ts +2 -0
- package/dist/agent/commands/resources.js +67 -0
- package/dist/agent/commands/rewind.d.ts +3 -0
- package/dist/agent/commands/rewind.js +16 -0
- package/dist/agent/commands/runbooks.d.ts +2 -0
- package/dist/agent/commands/runbooks.js +73 -0
- package/dist/agent/commands/runbooks_lazy.d.ts +2 -0
- package/dist/agent/commands/runbooks_lazy.js +8 -0
- package/dist/agent/commands/sessions.d.ts +1 -1
- package/dist/agent/commands/sessions.js +33 -5
- package/dist/agent/commands/settings.js +185 -39
- package/dist/agent/commands/setup.d.ts +2 -0
- package/dist/agent/commands/setup.js +78 -0
- package/dist/agent/commands/share.d.ts +2 -0
- package/dist/agent/commands/share.js +64 -0
- package/dist/agent/commands/status.js +14 -2
- package/dist/agent/commands/types.d.ts +99 -6
- package/dist/agent/commands/update.js +8 -0
- package/dist/agent/commands/usage.d.ts +2 -0
- package/dist/agent/commands/usage.js +8 -0
- package/dist/agent/factory.d.ts +11 -0
- package/dist/agent/factory.js +113 -88
- package/dist/agent/loop_policy.d.ts +6 -3
- package/dist/agent/loop_policy.js +12 -3
- package/dist/agent/measurement_guidance.d.ts +2 -0
- package/dist/agent/measurement_guidance.js +5 -0
- package/dist/agent/request_encoder.d.ts +8 -1
- package/dist/agent/request_encoder.js +95 -23
- package/dist/agent/runtime/benchmark_comparison.d.ts +30 -0
- package/dist/agent/runtime/benchmark_comparison.js +94 -0
- package/dist/agent/runtime/benchmark_contract.d.ts +48 -0
- package/dist/agent/runtime/benchmark_contract.js +90 -0
- package/dist/agent/runtime/checked_commands.d.ts +32 -0
- package/dist/agent/runtime/checked_commands.js +119 -0
- package/dist/agent/runtime/command_execution_policy.d.ts +26 -0
- package/dist/agent/runtime/command_execution_policy.js +91 -0
- package/dist/agent/runtime/command_jobs.d.ts +36 -18
- package/dist/agent/runtime/command_jobs.js +151 -13
- package/dist/agent/runtime/command_panes.d.ts +59 -0
- package/dist/agent/runtime/command_panes.js +398 -0
- package/dist/agent/runtime/command_wait.d.ts +19 -0
- package/dist/agent/runtime/command_wait.js +167 -0
- package/dist/agent/runtime/cpu_benchmark.d.ts +30 -0
- package/dist/agent/runtime/cpu_benchmark.js +126 -0
- package/dist/agent/runtime/delegated_evidence.d.ts +26 -0
- package/dist/agent/runtime/delegated_evidence.js +80 -0
- package/dist/agent/runtime/evidence.d.ts +127 -0
- package/dist/agent/runtime/evidence.js +468 -0
- package/dist/agent/runtime/execution_context.d.ts +7 -0
- package/dist/agent/runtime/execution_context.js +39 -3
- package/dist/agent/runtime/json_verifier_recipe.d.ts +8 -0
- package/dist/agent/runtime/json_verifier_recipe.js +66 -0
- package/dist/agent/runtime/measurements.d.ts +110 -0
- package/dist/agent/runtime/measurements.js +317 -0
- package/dist/agent/runtime/policy.d.ts +4 -0
- package/dist/agent/runtime/policy.js +31 -20
- package/dist/agent/runtime/provider_native_evidence.d.ts +20 -0
- package/dist/agent/runtime/provider_native_evidence.js +86 -0
- package/dist/agent/runtime/recovery.d.ts +2 -0
- package/dist/agent/runtime/recovery.js +45 -2
- package/dist/agent/runtime/remote_broker_transport.d.ts +10 -0
- package/dist/agent/runtime/remote_broker_transport.js +84 -0
- package/dist/agent/runtime/remote_deletion_receipts.d.ts +3 -0
- package/dist/agent/runtime/remote_deletion_receipts.js +43 -0
- package/dist/agent/runtime/remote_journal_replay.d.ts +13 -0
- package/dist/agent/runtime/remote_journal_replay.js +233 -0
- package/dist/agent/runtime/remote_mutation_journal.d.ts +25 -0
- package/dist/agent/runtime/remote_mutation_journal.js +208 -0
- package/dist/agent/runtime/remote_resource_endpoint.d.ts +7 -0
- package/dist/agent/runtime/remote_resource_endpoint.js +6 -0
- package/dist/agent/runtime/remote_resource_errors.d.ts +5 -0
- package/dist/agent/runtime/remote_resource_errors.js +9 -0
- package/dist/agent/runtime/remote_resource_script.d.ts +2 -0
- package/dist/agent/runtime/remote_resource_script.js +1009 -0
- package/dist/agent/runtime/remote_resources.d.ts +29 -0
- package/dist/agent/runtime/remote_resources.js +160 -0
- package/dist/agent/runtime/source_verification.d.ts +12 -0
- package/dist/agent/runtime/source_verification.js +210 -0
- package/dist/agent/runtime/source_verification_contract.d.ts +75 -0
- package/dist/agent/runtime/source_verification_contract.js +203 -0
- package/dist/agent/runtime/tool_checkpoints.d.ts +11 -0
- package/dist/agent/runtime/tool_checkpoints.js +26 -0
- package/dist/agent/runtime/tool_effects.d.ts +5 -0
- package/dist/agent/runtime/tool_progress.d.ts +12 -0
- package/dist/agent/runtime/tool_progress.js +76 -0
- package/dist/agent/runtime/tool_runtime.d.ts +16 -1
- package/dist/agent/runtime/tool_runtime.js +204 -10
- package/dist/agent/runtime/tracing.d.ts +1 -1
- package/dist/agent/runtime/verifier_capture.d.ts +9 -0
- package/dist/agent/runtime/verifier_capture.js +100 -0
- package/dist/agent/runtime/verifier_contract.d.ts +24 -0
- package/dist/agent/runtime/verifier_contract.js +41 -0
- package/dist/agent/subagent.d.ts +20 -10
- package/dist/agent/subagent.js +266 -29
- package/dist/agent/tool_response_directory.d.ts +24 -0
- package/dist/agent/tool_response_directory.js +61 -0
- package/dist/agent/tool_response_source.d.ts +8 -0
- package/dist/agent/tool_response_source.js +49 -0
- package/dist/agent/tool_response_store.d.ts +75 -4
- package/dist/agent/tool_response_store.js +583 -64
- package/dist/agent/tools/ask_user.d.ts +3 -1
- package/dist/agent/tools/ask_user.js +30 -11
- package/dist/agent/tools/background.js +1 -0
- package/dist/agent/tools/benchmark_cpu.d.ts +2 -0
- package/dist/agent/tools/benchmark_cpu.js +102 -0
- package/dist/agent/tools/compare_benchmarks.d.ts +2 -0
- package/dist/agent/tools/compare_benchmarks.js +53 -0
- package/dist/agent/tools/deferred.js +1 -0
- package/dist/agent/tools/delegate.js +18 -2
- package/dist/agent/tools/helper_requirements.d.ts +7 -0
- package/dist/agent/tools/helper_requirements.js +19 -0
- package/dist/agent/tools/index.d.ts +1 -0
- package/dist/agent/tools/index.js +3 -0
- package/dist/agent/tools/measurement_report.d.ts +22 -0
- package/dist/agent/tools/measurement_report.js +190 -0
- package/dist/agent/tools/pane.d.ts +0 -7
- package/dist/agent/tools/pane.js +5 -4
- package/dist/agent/tools/project_context.d.ts +3 -0
- package/dist/agent/tools/project_context.js +45 -0
- package/dist/agent/tools/recall_tool_response.d.ts +3 -5
- package/dist/agent/tools/recall_tool_response.js +19 -29
- package/dist/agent/tools/registry.d.ts +1 -0
- package/dist/agent/tools/registry.js +23 -0
- package/dist/agent/tools/related_sessions.d.ts +2 -0
- package/dist/agent/tools/related_sessions.js +156 -0
- package/dist/agent/tools/routine.js +13 -3
- package/dist/agent/tools/session_evidence.d.ts +3 -0
- package/dist/agent/tools/session_evidence.js +72 -0
- package/dist/agent/tools/shell.d.ts +4 -3
- package/dist/agent/tools/shell.js +174 -47
- package/dist/agent/tools/tool_search.js +3 -2
- package/dist/agent/tools/types.d.ts +28 -0
- package/dist/agent/tools/verify_artifact.d.ts +2 -0
- package/dist/agent/tools/verify_artifact.js +60 -0
- package/dist/agent/tools/workflow.js +1 -0
- package/dist/app/activity.d.ts +6 -1
- package/dist/app/activity.js +81 -12
- package/dist/app/agent_runner.d.ts +6 -1
- package/dist/app/agent_runner.js +34 -19
- package/dist/app/command_context.js +106 -10
- package/dist/app/controller.d.ts +15 -4
- package/dist/app/controller.js +29 -3
- package/dist/app/escape_stop.d.ts +11 -0
- package/dist/app/escape_stop.js +15 -0
- package/dist/app/liveness.d.ts +6 -4
- package/dist/app/liveness.js +13 -3
- package/dist/app/model_catalog_cache.d.ts +5 -0
- package/dist/app/model_catalog_cache.js +138 -0
- package/dist/app/ordered_transcript.js +43 -4
- package/dist/app/prompt_turn.d.ts +14 -0
- package/dist/app/prompt_turn.js +53 -0
- package/dist/app/recap.d.ts +3 -0
- package/dist/app/recap.js +9 -3
- package/dist/app/restart.d.ts +3 -2
- package/dist/app/restart.js +22 -7
- package/dist/app/rewind.d.ts +3 -3
- package/dist/app/rewind.js +3 -3
- package/dist/app/selection_completion.d.ts +17 -2
- package/dist/app/selection_completion.js +84 -9
- package/dist/app/session_manager.d.ts +38 -6
- package/dist/app/session_manager.js +263 -60
- package/dist/app/session_messages.d.ts +3 -0
- package/dist/app/session_messages.js +60 -0
- package/dist/app/task_scope_router.d.ts +20 -0
- package/dist/app/task_scope_router.js +173 -0
- package/dist/app/transcript_window.d.ts +2 -0
- package/dist/app/transcript_window.js +4 -0
- package/dist/app/workspace_admission_details.d.ts +3 -0
- package/dist/app/workspace_admission_details.js +26 -0
- package/dist/app/workspace_layout_controller.d.ts +11 -0
- package/dist/app/workspace_layout_controller.js +88 -0
- package/dist/app/workspace_monitor.d.ts +1 -0
- package/dist/app/workspace_monitor.js +216 -0
- package/dist/app/workspace_presets.d.ts +29 -0
- package/dist/app/workspace_presets.js +192 -0
- package/dist/attention/queue.d.ts +37 -0
- package/dist/attention/queue.js +183 -0
- package/dist/bench/rf_shared.d.ts +2 -0
- package/dist/board/binding.d.ts +42 -0
- package/dist/board/binding.js +38 -0
- package/dist/board/client.d.ts +42 -0
- package/dist/board/client.js +60 -0
- package/dist/cli.js +1 -1
- package/dist/cli_args.js +19 -17
- package/dist/cli_main.js +110 -13
- package/dist/cli_ratatui.d.ts +183 -16
- package/dist/cli_ratatui.js +3989 -1255
- package/dist/components/ActivityLine.d.ts +3 -2
- package/dist/components/ActivityLine.js +2 -2
- package/dist/components/InputArea.d.ts +19 -1
- package/dist/components/InputArea.js +264 -190
- package/dist/components/MessageList.d.ts +2 -0
- package/dist/components/MessageList.js +3 -1
- package/dist/components/SingleMessage.d.ts +2 -0
- package/dist/components/SingleMessage.js +4 -2
- package/dist/components/StatusBar.d.ts +4 -2
- package/dist/components/StatusBar.js +3 -1
- package/dist/conductor_branch.js +3 -0
- package/dist/config/api_retry.d.ts +6 -1
- package/dist/config/api_retry.js +19 -1
- package/dist/config/defaults.d.ts +2 -1
- package/dist/config/defaults.js +9 -2
- package/dist/config/message_display.d.ts +1 -0
- package/dist/config/message_display.js +17 -2
- package/dist/config/permissions.d.ts +21 -0
- package/dist/config/permissions.js +89 -0
- package/dist/config/resolved.d.ts +2 -2
- package/dist/config/types.d.ts +32 -5
- package/dist/config.d.ts +38 -4
- package/dist/config.js +290 -42
- package/dist/context/project_intelligence.d.ts +44 -0
- package/dist/context/project_intelligence.js +246 -0
- package/dist/desktop/cli_launch.d.ts +8 -0
- package/dist/desktop/cli_launch.js +6 -0
- package/dist/desktop/cli_shim.d.ts +8 -0
- package/dist/desktop/cli_shim.js +120 -0
- package/dist/desktop/runtime.d.ts +16 -0
- package/dist/desktop/runtime.js +161 -0
- package/dist/desktop/worker_launch.d.ts +7 -0
- package/dist/desktop/worker_launch.js +7 -0
- package/dist/diagnostics/cargo_mutants_selection.d.ts +27 -0
- package/dist/diagnostics/cargo_mutants_selection.js +48 -0
- package/dist/diagnostics/native_terminal_benchmark.d.ts +58 -0
- package/dist/diagnostics/native_terminal_benchmark.js +1247 -0
- package/dist/diagnostics/session_evidence_package.d.ts +40 -0
- package/dist/diagnostics/session_evidence_package.js +234 -0
- package/dist/diagnostics/session_export.d.ts +93 -0
- package/dist/diagnostics/session_export.js +634 -0
- package/dist/emulation/tool_adapters.js +48 -18
- package/dist/emulation/ztc_addendum.d.ts +1 -0
- package/dist/emulation/ztc_addendum.js +13 -12
- package/dist/environment/service_runner.d.ts +1 -0
- package/dist/environment/service_runner.js +68 -0
- package/dist/environment/store.d.ts +120 -0
- package/dist/environment/store.js +387 -0
- package/dist/events.d.ts +40 -1
- package/dist/events.js +10 -17
- package/dist/goal_contract.d.ts +25 -0
- package/dist/goal_contract.js +44 -0
- package/dist/headless.d.ts +31 -0
- package/dist/headless.js +578 -70
- package/dist/headless_cli.js +8 -0
- package/dist/headless_cli_args.d.ts +1 -0
- package/dist/headless_cli_args.js +1 -0
- package/dist/intake/cli.d.ts +1 -0
- package/dist/intake/cli.js +33 -0
- package/dist/intake/format.d.ts +2 -0
- package/dist/intake/format.js +14 -0
- package/dist/intake/notifications.d.ts +16 -0
- package/dist/intake/notifications.js +132 -0
- package/dist/intake/store.d.ts +56 -0
- package/dist/intake/store.js +238 -0
- package/dist/library.d.ts +8 -0
- package/dist/library.js +19 -10
- package/dist/mcp/client.d.ts +1 -0
- package/dist/mcp/client.js +20 -0
- package/dist/modes/builtin/plan.yaml +2 -2
- package/dist/modes/handlers.js +1 -1
- package/dist/onboarding/first_run.d.ts +3 -0
- package/dist/onboarding/first_run.js +33 -25
- package/dist/onboarding/setup.d.ts +32 -0
- package/dist/onboarding/setup.js +133 -0
- package/dist/onboarding/setup_agent_health.d.ts +17 -0
- package/dist/onboarding/setup_agent_health.js +79 -0
- package/dist/onboarding/setup_environment.d.ts +66 -0
- package/dist/onboarding/setup_environment.js +219 -0
- package/dist/onboarding/setup_workspace.d.ts +17 -0
- package/dist/onboarding/setup_workspace.js +129 -0
- package/dist/optimize/adapters/index.d.ts +4 -1
- package/dist/optimize/adapters/index.js +7 -0
- package/dist/optimize/adapters/kernelbench.js +14 -5
- package/dist/optimize/adapters/popcorn.js +3 -2
- package/dist/optimize/adapters/profile_benchmark.js +13 -7
- package/dist/optimize/adapters/rfbench.js +25 -14
- package/dist/optimize/adapters/types.d.ts +3 -0
- package/dist/optimize/adapters/zergpod.js +5 -2
- package/dist/optimize/baseline.js +10 -21
- package/dist/optimize/branch.js +9 -12
- package/dist/optimize/combine.js +2 -3
- package/dist/optimize/executor.js +34 -48
- package/dist/optimize/measurements.d.ts +55 -0
- package/dist/optimize/measurements.js +173 -0
- package/dist/optimize/results.d.ts +1 -0
- package/dist/optimize/results.js +11 -33
- package/dist/optimize/tge.js +2 -1
- package/dist/panes/initial_input.d.ts +19 -0
- package/dist/panes/initial_input.js +206 -0
- package/dist/panes/labels.d.ts +16 -0
- package/dist/panes/labels.js +42 -0
- package/dist/panes/model_catalog.d.ts +3 -3
- package/dist/panes/model_catalog.js +28 -4
- package/dist/panes/pane_registry.js +6 -2
- package/dist/panes/types.d.ts +3 -0
- package/dist/panes/ztc_launch.js +19 -0
- package/dist/plugin/optimization.d.ts +2 -0
- package/dist/plugin/optimization.js +1 -0
- package/dist/plugin/runtime.d.ts +2 -0
- package/dist/plugin/simulation.d.ts +6 -1
- package/dist/plugin/simulation_contract.d.ts +836 -1
- package/dist/plugin/simulation_documents.d.ts +22 -0
- package/dist/plugin/simulation_documents.js +1 -0
- package/dist/plugin/simulation_interventions.d.ts +103 -0
- package/dist/plugin/simulation_interventions.js +1 -0
- package/dist/plugin/simulation_living.d.ts +1 -0
- package/dist/plugin/simulation_living.js +3 -0
- package/dist/plugin/simulation_meetings.d.ts +121 -0
- package/dist/plugin/simulation_meetings.js +1 -0
- package/dist/plugin/simulation_story_review.d.ts +111 -0
- package/dist/plugin/simulation_story_review.js +1 -0
- package/dist/plugin/simulation_storyteller.d.ts +91 -0
- package/dist/plugin/simulation_storyteller.js +1 -0
- package/dist/plugin/simulation_structured.d.ts +2 -0
- package/dist/plugin/simulation_structured.js +2 -0
- package/dist/plugin/simulation_toolkit.d.ts +21 -0
- package/dist/plugin/simulation_toolkit.js +24 -0
- package/dist/prompts/tool_delegate_task.j2 +1 -1
- package/dist/remote-broker/Dockerfile +10 -0
- package/dist/remote-broker/archive.py +1227 -0
- package/dist/remote-broker/cutover.py +761 -0
- package/dist/remote-broker/requirements.txt +5 -0
- package/dist/remote-broker/resources.json +6 -0
- package/dist/remote-broker/resources.write-staging.example.json +18 -0
- package/dist/remote-broker/retained.py +686 -0
- package/dist/remote-broker/retained_cleanup.py +550 -0
- package/dist/remote-broker/server.py +648 -0
- package/dist/remote-broker/worker.py +1007 -0
- package/dist/router_auth.d.ts +31 -0
- package/dist/router_auth.js +155 -9
- package/dist/runbooks/catalog.d.ts +3 -0
- package/dist/runbooks/catalog.js +26 -0
- package/dist/runbooks/library.d.ts +11 -0
- package/dist/runbooks/library.js +95 -0
- package/dist/runbooks/package.d.ts +43 -0
- package/dist/runbooks/package.js +102 -0
- package/dist/session.d.ts +65 -13
- package/dist/session.js +548 -43
- package/dist/session_handoff.d.ts +25 -0
- package/dist/session_handoff.js +322 -0
- package/dist/session_handoff_contract.d.ts +89 -0
- package/dist/session_handoff_contract.js +179 -0
- package/dist/session_media.d.ts +41 -0
- package/dist/session_media.js +357 -0
- package/dist/session_ownership.d.ts +16 -0
- package/dist/session_ownership.js +221 -0
- package/dist/session_public.d.ts +10 -2
- package/dist/session_public.js +6 -1
- package/dist/simulation/dynamic_history.d.ts +42 -0
- package/dist/simulation/dynamic_history.js +173 -0
- package/dist/simulation/engines/swarm/pane_manager.js +7 -6
- package/dist/simulation/inference.d.ts +3 -1
- package/dist/simulation/inference.js +19 -1
- package/dist/simulation/intervention_generation.d.ts +27 -0
- package/dist/simulation/intervention_generation.js +246 -0
- package/dist/simulation/intervention_material.d.ts +4 -0
- package/dist/simulation/intervention_material.js +81 -0
- package/dist/simulation/living/context.d.ts +3130 -0
- package/dist/simulation/living/context.js +944 -0
- package/dist/simulation/living/definer.d.ts +12 -0
- package/dist/simulation/living/definer.js +223 -0
- package/dist/simulation/living/definition.d.ts +257 -0
- package/dist/simulation/living/definition.js +341 -0
- package/dist/simulation/living/frame.d.ts +259 -0
- package/dist/simulation/living/frame.js +223 -0
- package/dist/simulation/living/identifiers.d.ts +2 -0
- package/dist/simulation/living/identifiers.js +12 -0
- package/dist/simulation/living/index.d.ts +15 -0
- package/dist/simulation/living/index.js +15 -0
- package/dist/simulation/living/inference.d.ts +219 -0
- package/dist/simulation/living/inference.js +576 -0
- package/dist/simulation/living/mechanics.d.ts +54 -0
- package/dist/simulation/living/mechanics.js +588 -0
- package/dist/simulation/living/model-input.d.ts +25 -0
- package/dist/simulation/living/model-input.js +215 -0
- package/dist/simulation/living/open-world.d.ts +257 -0
- package/dist/simulation/living/open-world.js +102 -0
- package/dist/simulation/living/projection.d.ts +7 -0
- package/dist/simulation/living/projection.js +31 -0
- package/dist/simulation/living/recall.d.ts +17 -0
- package/dist/simulation/living/recall.js +25 -0
- package/dist/simulation/living/reduce.d.ts +15 -0
- package/dist/simulation/living/reduce.js +1853 -0
- package/dist/simulation/living/replay.d.ts +6 -0
- package/dist/simulation/living/replay.js +22 -0
- package/dist/simulation/living/runtime.d.ts +140 -0
- package/dist/simulation/living/runtime.js +3020 -0
- package/dist/simulation/living/shared-kinds.d.ts +24 -0
- package/dist/simulation/living/shared-kinds.js +96 -0
- package/dist/simulation/living/types.d.ts +2785 -0
- package/dist/simulation/living/types.js +669 -0
- package/dist/simulation/llm.d.ts +3 -1
- package/dist/simulation/llm.js +90 -30
- package/dist/simulation/memory/embedding.d.ts +1 -1
- package/dist/simulation/memory/embedding.js +9 -3
- package/dist/simulation/memory/filesystem.d.ts +2 -0
- package/dist/simulation/memory/filesystem.js +5 -1
- package/dist/simulation/memory/filesystem_file_tree.d.ts +4 -1
- package/dist/simulation/memory/filesystem_file_tree.js +41 -10
- package/dist/simulation/memory/filesystem_invariants.js +1 -2
- package/dist/simulation/memory/filesystem_types.d.ts +1 -0
- package/dist/simulation/memory/memory.d.ts +2 -0
- package/dist/simulation/memory/memory.js +5 -1
- package/dist/simulation/orchestration/intent.js +0 -2
- package/dist/simulation/orchestration/lifecycle.js +0 -2
- package/dist/simulation/plugin_host.d.ts +25 -1
- package/dist/simulation/plugin_host.js +334 -17
- package/dist/simulation/session_documents.d.ts +20 -0
- package/dist/simulation/session_documents.js +62 -0
- package/dist/simulation/session_input_validation.d.ts +43 -0
- package/dist/simulation/session_input_validation.js +364 -0
- package/dist/simulation/session_inputs.d.ts +32 -0
- package/dist/simulation/session_inputs.js +154 -0
- package/dist/simulation/telemetry.d.ts +11 -14
- package/dist/simulation/telemetry.js +177 -54
- package/dist/simulation/toolkit/bounded_turns.d.ts +13 -0
- package/dist/simulation/toolkit/bounded_turns.js +80 -0
- package/dist/simulation/toolkit/dynamic_agents.d.ts +25 -0
- package/dist/simulation/toolkit/dynamic_agents.js +218 -0
- package/dist/simulation/toolkit/dynamic_digest.d.ts +1 -0
- package/dist/simulation/toolkit/dynamic_digest.js +8 -0
- package/dist/simulation/toolkit/dynamic_documents.d.ts +7 -0
- package/dist/simulation/toolkit/dynamic_documents.js +71 -0
- package/dist/simulation/toolkit/dynamic_driver.d.ts +8 -0
- package/dist/simulation/toolkit/dynamic_driver.js +269 -0
- package/dist/simulation/toolkit/dynamic_game.d.ts +53 -0
- package/dist/simulation/toolkit/dynamic_game.js +805 -0
- package/dist/simulation/toolkit/dynamic_knowledge.d.ts +15 -0
- package/dist/simulation/toolkit/dynamic_knowledge.js +91 -0
- package/dist/simulation/toolkit/dynamic_mechanics.d.ts +22 -0
- package/dist/simulation/toolkit/dynamic_mechanics.js +910 -0
- package/dist/simulation/toolkit/dynamic_meetings.d.ts +239 -0
- package/dist/simulation/toolkit/dynamic_meetings.js +350 -0
- package/dist/simulation/toolkit/dynamic_progress.d.ts +131 -0
- package/dist/simulation/toolkit/dynamic_progress.js +214 -0
- package/dist/simulation/toolkit/dynamic_projection.d.ts +9 -0
- package/dist/simulation/toolkit/dynamic_projection.js +219 -0
- package/dist/simulation/toolkit/dynamic_runtime.d.ts +412 -0
- package/dist/simulation/toolkit/dynamic_runtime.js +6536 -0
- package/dist/simulation/toolkit/dynamic_state.d.ts +111 -0
- package/dist/simulation/toolkit/dynamic_state.js +1967 -0
- package/dist/simulation/toolkit/dynamic_story_review.d.ts +508 -0
- package/dist/simulation/toolkit/dynamic_story_review.js +333 -0
- package/dist/simulation/toolkit/dynamic_storyteller.d.ts +77 -0
- package/dist/simulation/toolkit/dynamic_storyteller.js +114 -0
- package/dist/simulation/toolkit/dynamic_storyteller_runtime.d.ts +26 -0
- package/dist/simulation/toolkit/dynamic_storyteller_runtime.js +126 -0
- package/dist/simulation/toolkit/dynamic_world.d.ts +22 -0
- package/dist/simulation/toolkit/dynamic_world.js +377 -0
- package/dist/simulation/toolkit/structured_output.d.ts +5 -0
- package/dist/simulation/toolkit/structured_output.js +321 -0
- package/dist/simulation/types/world.d.ts +2 -0
- package/dist/simulation/world/artifact_store.js +1 -1
- package/dist/simulation/world/memory_manager.d.ts +5 -0
- package/dist/simulation/world/memory_manager.js +17 -2
- package/dist/simulation/world/state.d.ts +3 -2
- package/dist/simulation/world/state.js +15 -5
- package/dist/skills/bundled/measurement-validation/SKILL.md +144 -0
- package/dist/terminal_attach.d.ts +1 -0
- package/dist/terminal_attach.js +113 -0
- package/dist/tool_progress.d.ts +3 -0
- package/dist/tool_progress.js +27 -0
- package/dist/types.d.ts +145 -10
- package/dist/types.js +3 -0
- package/dist/ui/core/input.d.ts +3 -0
- package/dist/ui/core/input_segments.d.ts +18 -1
- package/dist/ui/core/input_segments.js +131 -47
- package/dist/ui/core/input_state.d.ts +12 -0
- package/dist/ui/core/layout_yoga.d.ts +1 -1
- package/dist/ui/core/turn_metadata.d.ts +5 -0
- package/dist/ui/core/turn_metadata.js +22 -0
- package/dist/ui/ink/render.d.ts +2 -1
- package/dist/ui/ink/render.js +6 -5
- package/dist/ui/ratatui/headless_pane_manager.d.ts +14 -1
- package/dist/ui/ratatui/headless_pane_manager.js +293 -104
- package/dist/ui/ratatui/index.d.ts +1 -0
- package/dist/ui/ratatui/input.d.ts +4 -0
- package/dist/ui/ratatui/input.js +15 -0
- package/dist/ui/ratatui/ipc_path.d.ts +2 -0
- package/dist/ui/ratatui/ipc_path.js +29 -1
- package/dist/ui/ratatui/mux_persistence.d.ts +3 -1
- package/dist/ui/ratatui/mux_persistence.js +139 -1
- package/dist/ui/ratatui/pane_relay.d.ts +1 -1
- package/dist/ui/ratatui/pane_relay.js +55 -27
- package/dist/ui/ratatui/process.d.ts +17 -1
- package/dist/ui/ratatui/process.js +80 -7
- package/dist/ui/ratatui/protocol.d.ts +236 -1
- package/dist/ui/ratatui/protocol.js +90 -0
- package/dist/ui/scrollback.d.ts +2 -1
- package/dist/ui/scrollback.js +9 -4
- package/dist/ui/stream_typewriter.d.ts +8 -3
- package/dist/ui/stream_typewriter.js +30 -1
- package/dist/ui/streaming_scrollback.d.ts +1 -0
- package/dist/ui/streaming_scrollback.js +1 -1
- package/dist/ui/transcript_render_cache.js +10 -0
- package/dist/ui/views/activity_line.d.ts +5 -3
- package/dist/ui/views/activity_line.js +65 -7
- package/dist/ui/views/app.d.ts +6 -3
- package/dist/ui/views/app.js +17 -6
- package/dist/ui/views/completion_menu.js +10 -5
- package/dist/ui/views/input_area.d.ts +7 -3
- package/dist/ui/views/input_area.js +15 -9
- package/dist/ui/views/message_list.d.ts +4 -1
- package/dist/ui/views/message_list.js +89 -19
- package/dist/ui/views/queue_panel.d.ts +3 -1
- package/dist/ui/views/queue_panel.js +9 -2
- package/dist/ui/views/status_bar.d.ts +4 -2
- package/dist/ui/views/status_bar.js +28 -13
- package/dist/ui/views/theme.d.ts +2 -0
- package/dist/ui/views/theme.js +2 -0
- package/dist/ui/widgets/color_panel.js +18 -0
- package/dist/ui/widgets/form.js +8 -0
- package/dist/ui/widgets/log_view.js +7 -0
- package/dist/ui/widgets/navigator_panel.js +8 -0
- package/dist/ui/widgets/prompt_viewer.js +2 -0
- package/dist/ui/widgets/questionnaire.d.ts +2 -0
- package/dist/ui/widgets/questionnaire.js +79 -16
- package/dist/ui/widgets/resume_panel.d.ts +2 -0
- package/dist/ui/widgets/resume_panel.js +26 -15
- package/dist/ui/widgets/rewind_panel.d.ts +2 -2
- package/dist/ui/widgets/rewind_panel.js +4 -2
- package/dist/ui/widgets/select.js +16 -27
- package/dist/ui/widgets/settings_panel.js +16 -0
- package/dist/ui/widgets/status_line_panel.d.ts +1 -0
- package/dist/ui/widgets/status_line_panel.js +30 -4
- package/dist/ui/widgets/text_input.d.ts +2 -0
- package/dist/ui/widgets/text_input.js +15 -1
- package/dist/ui/widgets/types.d.ts +2 -0
- package/dist/usage_projection.d.ts +24 -0
- package/dist/usage_projection.js +130 -0
- package/dist/usage_snapshot.d.ts +36 -0
- package/dist/usage_snapshot.js +131 -0
- package/dist/utils/assistant_message.d.ts +2 -0
- package/dist/utils/assistant_message.js +5 -0
- package/dist/utils/atomic_write.d.ts +6 -2
- package/dist/utils/atomic_write.js +29 -4
- package/dist/utils/checked_shell.d.ts +25 -0
- package/dist/utils/checked_shell.js +107 -0
- package/dist/utils/compaction.d.ts +4 -1
- package/dist/utils/compaction.js +31 -7
- package/dist/utils/context.d.ts +4 -4
- package/dist/utils/context.js +14 -12
- package/dist/utils/deepseek.d.ts +2 -2
- package/dist/utils/deepseek.js +13 -5
- package/dist/utils/ephemeral.js +4 -0
- package/dist/utils/ephemeral_tools.d.ts +18 -0
- package/dist/utils/ephemeral_tools.js +97 -0
- package/dist/utils/jev_client.d.ts +4 -0
- package/dist/utils/jev_client.js +15 -0
- package/dist/utils/model_cache.d.ts +15 -0
- package/dist/utils/model_cache.js +143 -0
- package/dist/utils/models.d.ts +4 -2
- package/dist/utils/models.js +12 -16
- package/dist/utils/reasoning.d.ts +8 -1
- package/dist/utils/reasoning.js +31 -11
- package/dist/utils/router_catalog.d.ts +49 -0
- package/dist/utils/router_catalog.js +271 -0
- package/dist/utils/sandbox.d.ts +9 -0
- package/dist/utils/sandbox.js +118 -15
- package/dist/utils/shell.d.ts +7 -0
- package/dist/utils/shell.js +98 -34
- package/dist/utils/subprocess_env.d.ts +3 -0
- package/dist/utils/subprocess_env.js +27 -1
- package/dist/web/accounts_mirror.d.ts +3 -1
- package/dist/web/accounts_mirror.js +13 -9
- package/dist/web/child_publication.d.ts +17 -0
- package/dist/web/child_publication.js +45 -0
- package/dist/web/mirror_authenticator.d.ts +31 -11
- package/dist/web/mirror_authenticator.js +67 -17
- package/dist/web/mirror_client.d.ts +31 -4
- package/dist/web/mirror_client.js +189 -23
- package/dist/web/mirror_stream.d.ts +84 -22
- package/dist/web/mirror_stream.js +676 -95
- package/dist/web/observer_query_redaction.d.ts +6 -0
- package/dist/web/observer_query_redaction.js +58 -0
- package/dist/web/pane_registry.d.ts +2 -0
- package/dist/web/pane_registry.js +86 -22
- package/dist/web/tool_image.d.ts +6 -0
- package/dist/web/tool_image.js +17 -0
- package/dist/web/view_plugin.d.ts +14 -0
- package/dist/web/view_plugin.js +23 -1
- package/dist/worker/executor.js +31 -12
- package/dist/worker/index.d.ts +1 -0
- package/dist/worker/toolsets.js +3 -1
- package/dist/worker/types.d.ts +12 -1
- package/dist/workflows/registry.js +1 -0
- package/dist/workflows/registry_handle.d.ts +2 -0
- package/dist/workflows/runtime.d.ts +2 -0
- package/dist/workflows/runtime.js +1 -0
- package/dist/workspace_agent.d.ts +7 -0
- package/dist/workspace_agent.js +36 -0
- package/dist/workspace_collision.d.ts +76 -0
- package/dist/workspace_collision.js +688 -0
- package/dist/workspace_layout.d.ts +18 -0
- package/dist/workspace_layout.js +121 -0
- package/dist/workspace_runtime.d.ts +44 -0
- package/dist/workspace_runtime.js +82 -0
- package/dist/workspace_session_context.d.ts +62 -0
- package/dist/workspace_session_context.js +160 -0
- package/dist/zlm-embed.mjs +32518 -9615
- package/dist/zlm.js +1 -0
- package/node_modules/@zerg/model-contracts/LICENSE.md +375 -0
- package/node_modules/@zerg/model-contracts/README.md +90 -0
- package/node_modules/@zerg/model-contracts/index.d.ts +20 -0
- package/node_modules/@zerg/model-contracts/index.js +223 -0
- package/node_modules/@zerg/model-contracts/package.json +8 -0
- package/node_modules/glob/node_modules/brace-expansion/index.js +78 -22
- package/node_modules/glob/node_modules/brace-expansion/package.json +1 -1
- package/node_modules/readdir-glob/node_modules/brace-expansion/index.js +78 -22
- package/node_modules/readdir-glob/node_modules/brace-expansion/package.json +1 -1
- package/package.json +45 -24
- package/packages/model-contracts/LICENSE.md +375 -0
- package/packages/model-contracts/README.md +90 -0
- package/packages/model-contracts/index.d.ts +20 -0
- package/packages/model-contracts/index.js +223 -0
- package/packages/model-contracts/package.json +8 -0
- package/remote-broker/Dockerfile +10 -0
- package/remote-broker/README.md +308 -0
- package/remote-broker/archive.py +1227 -0
- package/remote-broker/cutover.py +761 -0
- package/remote-broker/requirements.txt +5 -0
- package/remote-broker/resources.example.json +6 -0
- package/remote-broker/resources.write-staging.example.json +18 -0
- package/remote-broker/retained.py +686 -0
- package/remote-broker/retained_cleanup.py +550 -0
- package/remote-broker/server.py +648 -0
- package/scripts/build-remote-broker.mjs +13 -0
- package/scripts/ensure-local-packages.mjs +6 -0
- package/scripts/node-pty-helpers.mjs +103 -0
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { basename, win32 } from 'node:path';
|
|
3
|
+
import { sanitizeTerminalText } from '../ui/core/text_width.js';
|
|
4
|
+
const PROBE_TIMEOUT_MS = 2000;
|
|
5
|
+
const INSTALL_TIMEOUT_MS = 120_000;
|
|
6
|
+
const TERMINATION_GRACE_MS = 150;
|
|
7
|
+
const OUTPUT_LIMIT_BYTES = 8192;
|
|
8
|
+
const CONCURRENT_PROBES = 4;
|
|
9
|
+
const SHELL_SENTINEL = 'ZTC_SETUP_SHELL_READY';
|
|
10
|
+
const PROBES = [
|
|
11
|
+
{ id: 'git', label: 'Git', command: 'git', args: ['--version'], version: /\bgit version (\d[^\s]*)/, required: true },
|
|
12
|
+
{ id: 'rg', label: 'ripgrep', command: 'rg', args: ['--version'], version: /\bripgrep (\d[^\s]*)/, required: false },
|
|
13
|
+
{ id: 'gh', label: 'GitHub CLI', command: 'gh', args: ['--version'], version: /\bgh version (\d[^\s]*)/, required: false },
|
|
14
|
+
{ id: 'python', label: 'Python', command: 'python3', args: ['--version'], version: /\bPython (\d[^\s]*)/, required: false },
|
|
15
|
+
{ id: 'bun', label: 'Bun', command: 'bun', args: ['--version'], version: /^(\d+\.\d+[^\s]*)/m, required: false },
|
|
16
|
+
{ id: 'deno', label: 'Deno', command: 'deno', args: ['--version'], version: /\bdeno (\d[^\s]*)/, required: false },
|
|
17
|
+
{ id: 'make', label: 'Make', command: 'make', args: ['--version'], version: /\b(?:GNU )?Make (\d[^\s]*)/i, required: false },
|
|
18
|
+
{ id: 'curl', label: 'curl', command: 'curl', args: ['--version'], version: /\bcurl (\d[^\s]*)/, required: false },
|
|
19
|
+
{ id: 'ssh', label: 'SSH', command: 'ssh', args: ['-V'], version: /\bOpenSSH[_ ](\d[^\s,]*)/, required: false },
|
|
20
|
+
{ id: 'tar', label: 'tar', command: 'tar', args: ['--version'], version: /\b(?:bsdtar|tar(?: \(GNU tar\))?) (\d[^\s]*)/, required: false },
|
|
21
|
+
{ id: 'unzip', label: 'unzip', command: 'unzip', args: ['-v'], version: /\bUnZip (\d[^\s]*)/, required: false },
|
|
22
|
+
];
|
|
23
|
+
function text(value) {
|
|
24
|
+
return sanitizeTerminalText(value).replace(/\s+/g, ' ').trim().slice(0, 256);
|
|
25
|
+
}
|
|
26
|
+
function environment(options) {
|
|
27
|
+
return { ...(options.env ?? process.env) };
|
|
28
|
+
}
|
|
29
|
+
/** A fixed executable/argv process, never a caller-provided shell command. */
|
|
30
|
+
async function run(command, args, options, timeoutMs) {
|
|
31
|
+
if (options.signal?.aborted)
|
|
32
|
+
return { status: 'cancelled', output: '' };
|
|
33
|
+
return new Promise(resolve => {
|
|
34
|
+
const child = spawn(command, [...args], {
|
|
35
|
+
cwd: options.cwd, env: environment(options), shell: false,
|
|
36
|
+
stdio: ['ignore', 'pipe', 'pipe'], detached: process.platform !== 'win32',
|
|
37
|
+
});
|
|
38
|
+
let reason;
|
|
39
|
+
let bytes = 0;
|
|
40
|
+
let output = '';
|
|
41
|
+
let escalation;
|
|
42
|
+
let errorCode;
|
|
43
|
+
const terminate = (signal) => {
|
|
44
|
+
if (!child.pid)
|
|
45
|
+
return;
|
|
46
|
+
try {
|
|
47
|
+
if (process.platform !== 'win32')
|
|
48
|
+
process.kill(-child.pid, signal);
|
|
49
|
+
else
|
|
50
|
+
child.kill(signal);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
if (error.code !== 'ESRCH')
|
|
54
|
+
child.kill(signal);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
const stop = (status) => {
|
|
58
|
+
if (reason)
|
|
59
|
+
return;
|
|
60
|
+
reason = status;
|
|
61
|
+
terminate('SIGTERM');
|
|
62
|
+
escalation = setTimeout(() => terminate('SIGKILL'), TERMINATION_GRACE_MS);
|
|
63
|
+
};
|
|
64
|
+
const deadline = setTimeout(() => stop('timeout'), timeoutMs);
|
|
65
|
+
const abort = () => stop('cancelled');
|
|
66
|
+
options.signal?.addEventListener('abort', abort, { once: true });
|
|
67
|
+
const receive = (chunk) => {
|
|
68
|
+
bytes += chunk.length;
|
|
69
|
+
if (bytes > OUTPUT_LIMIT_BYTES) {
|
|
70
|
+
stop('output_limit');
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (!reason)
|
|
74
|
+
output += chunk.toString('utf8');
|
|
75
|
+
};
|
|
76
|
+
child.stdout.on('data', receive);
|
|
77
|
+
child.stderr.on('data', receive);
|
|
78
|
+
child.on('error', error => {
|
|
79
|
+
errorCode = error.code;
|
|
80
|
+
reason ??= errorCode === 'ENOENT' ? 'missing' : 'failed';
|
|
81
|
+
});
|
|
82
|
+
child.on('close', (exitCode, signal) => {
|
|
83
|
+
clearTimeout(deadline);
|
|
84
|
+
if (escalation)
|
|
85
|
+
clearTimeout(escalation);
|
|
86
|
+
options.signal?.removeEventListener('abort', abort);
|
|
87
|
+
resolve({ status: reason ?? (exitCode === 0 && signal === null ? 'ready' : 'failed'),
|
|
88
|
+
output: reason ? '' : output, ...(exitCode !== null ? { exitCode } : {}), ...(errorCode ? { errorCode } : {}) });
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
function failureDetail(label, result) {
|
|
93
|
+
switch (result.status) {
|
|
94
|
+
case 'missing': return `${label} is missing from PATH. Install it or use /setup to select a supported installation.`;
|
|
95
|
+
case 'timeout': return `${label} probe timed out. Check the executable and retry /setup.`;
|
|
96
|
+
case 'cancelled': return `${label} check was cancelled. Retry /setup when ready.`;
|
|
97
|
+
case 'output_limit': return `${label} exceeded the bounded output limit. Check the executable and retry /setup.`;
|
|
98
|
+
default: return `${label} failed${result.exitCode !== undefined ? ` with exit ${result.exitCode}` : result.errorCode ? ` (${text(result.errorCode)})` : ''}. Repair the tool or PATH and retry /setup.`;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async function inspectTool(probe, options) {
|
|
102
|
+
const result = await run(probe.command, probe.args, options, PROBE_TIMEOUT_MS);
|
|
103
|
+
const version = result.status === 'ready' ? probe.version.exec(result.output)?.[1] : undefined;
|
|
104
|
+
return { id: probe.id, label: probe.label, required: probe.required,
|
|
105
|
+
status: result.status === 'ready' && !version ? 'failed' : result.status,
|
|
106
|
+
detail: result.status === 'ready' ? version ? `${probe.label} is available.` : `${probe.label} did not return a recognized version. Repair the executable and retry /setup.` : failureDetail(probe.label, result),
|
|
107
|
+
...(version ? { version: text(version) } : {}) };
|
|
108
|
+
}
|
|
109
|
+
async function inspectGitHubAuth(options) {
|
|
110
|
+
// Do not request --show-token/JSON or retain any auth stdout/stderr in the report.
|
|
111
|
+
const result = await run('gh', ['auth', 'status', '--active', '--hostname', 'github.com'], options, PROBE_TIMEOUT_MS);
|
|
112
|
+
return { id: 'gh_auth', label: 'GitHub authentication', required: false, status: result.status,
|
|
113
|
+
detail: result.status === 'ready' ? 'The active GitHub account is authenticated for github.com.'
|
|
114
|
+
: result.status === 'failed' ? 'GitHub authentication is unavailable. Run gh auth login manually, then retry /setup.'
|
|
115
|
+
: failureDetail('GitHub authentication', result) };
|
|
116
|
+
}
|
|
117
|
+
/** Health uses only an allowlisted shell name and a fixed, literal sentinel. */
|
|
118
|
+
export async function runSetupShellHealth(options = {}) {
|
|
119
|
+
const env = environment(options);
|
|
120
|
+
const path = (process.platform === 'win32' ? env.COMSPEC ?? env.ComSpec ?? 'cmd.exe' : env.SHELL ?? '/bin/sh');
|
|
121
|
+
const name = (process.platform === 'win32' ? win32.basename(path) : basename(path)).toLowerCase().replace(/\.exe$/, '');
|
|
122
|
+
let args;
|
|
123
|
+
if (['sh', 'bash', 'zsh', 'dash', 'ksh', 'fish'].includes(name))
|
|
124
|
+
args = ['-c', `printf %s ${SHELL_SENTINEL}`];
|
|
125
|
+
else if (name === 'cmd' && process.platform === 'win32')
|
|
126
|
+
args = ['/d', '/s', '/c', `echo ${SHELL_SENTINEL}`];
|
|
127
|
+
else if (['powershell', 'pwsh'].includes(name))
|
|
128
|
+
args = ['-NoLogo', '-NoProfile', '-NonInteractive', '-Command', `[Console]::Write('${SHELL_SENTINEL}')`];
|
|
129
|
+
else
|
|
130
|
+
return { name: text(name), path: text(path), status: 'unsupported', detail: 'Selected shell is unsupported. Select sh, bash, zsh, fish, PowerShell or cmd outside ZTC and retry /setup.' };
|
|
131
|
+
if (!path || path.length > 1024 || /[\0\r\n]/.test(path)) {
|
|
132
|
+
return { name: text(name), path: text(path), status: 'unsupported', detail: 'Selected shell path is invalid. Correct the shell environment and retry /setup.' };
|
|
133
|
+
}
|
|
134
|
+
const result = await run(path, args, options, PROBE_TIMEOUT_MS);
|
|
135
|
+
const healthReady = result.status === 'ready' && result.output.trim() === SHELL_SENTINEL;
|
|
136
|
+
return { name: text(name), path: text(path), status: result.status === 'ready' && !healthReady ? 'failed' : result.status,
|
|
137
|
+
detail: healthReady ? 'Selected shell executed the setup health sentinel.'
|
|
138
|
+
: result.status === 'ready' ? 'Selected shell did not return the expected health sentinel. Repair its startup configuration and retry /setup.' : failureDetail('Selected shell', result) };
|
|
139
|
+
}
|
|
140
|
+
async function bounded(work) {
|
|
141
|
+
const result = new Array(work.length);
|
|
142
|
+
let next = 0;
|
|
143
|
+
await Promise.all(Array.from({ length: Math.min(CONCURRENT_PROBES, work.length) }, async () => {
|
|
144
|
+
while (next < work.length) {
|
|
145
|
+
const index = next++;
|
|
146
|
+
result[index] = await work[index]();
|
|
147
|
+
}
|
|
148
|
+
}));
|
|
149
|
+
return result;
|
|
150
|
+
}
|
|
151
|
+
export async function inspectSetupEnvironment(options = {}) {
|
|
152
|
+
const managers = process.platform === 'darwin' ? ['brew']
|
|
153
|
+
: process.platform === 'linux' ? ['apt', 'dnf', 'brew'] : [];
|
|
154
|
+
const work = [
|
|
155
|
+
() => runSetupShellHealth(options), ...PROBES.map(probe => () => inspectTool(probe, options)),
|
|
156
|
+
() => inspectGitHubAuth(options), ...managers.map(manager => () => run(manager === 'apt' ? 'apt-get' : manager, ['--version'], options, PROBE_TIMEOUT_MS)),
|
|
157
|
+
];
|
|
158
|
+
const results = await bounded(work);
|
|
159
|
+
const shell = results[0];
|
|
160
|
+
const checks = results.slice(1, PROBES.length + 2);
|
|
161
|
+
const managerResults = results.slice(PROBES.length + 2);
|
|
162
|
+
const managerIndex = managerResults.findIndex((result, index) => result.status === 'ready'
|
|
163
|
+
&& (managers[index] === 'brew' ? /\bHomebrew \d/.test(result.output) : managers[index] === 'apt' ? /\bapt \d/.test(result.output) : /^(?:dnf5? version )?\d+\./m.test(result.output)));
|
|
164
|
+
const problemManager = managerResults.find(result => result.status !== 'missing');
|
|
165
|
+
const packageManager = managerIndex >= 0
|
|
166
|
+
? { id: managers[managerIndex], status: 'ready', detail: `${managers[managerIndex]} is available for explicitly selected Git/ripgrep installations.` }
|
|
167
|
+
: managers.length === 0 ? { id: null, status: 'unsupported', detail: 'Automatic tool installation supports Homebrew, apt and dnf. Install missing tools manually on this platform.' }
|
|
168
|
+
: problemManager ? { id: null, status: problemManager.status === 'ready' ? 'failed' : problemManager.status, detail: failureDetail('Supported package manager', { ...problemManager, status: problemManager.status === 'ready' ? 'failed' : problemManager.status }) }
|
|
169
|
+
: { id: null, status: 'missing', detail: 'No supported package manager is available. Install missing tools manually or configure Homebrew, apt or dnf outside ZTC.' };
|
|
170
|
+
const runtimeKind = options.runtimeKind ?? 'host';
|
|
171
|
+
const nodeReady = /^v\d+\./.test(process.version) && Number(process.versions.node.split('.')[0]) >= 20;
|
|
172
|
+
const node = {
|
|
173
|
+
version: process.version, executable: process.execPath, runtimeKind,
|
|
174
|
+
status: nodeReady ? 'ready' : 'unsupported',
|
|
175
|
+
detail: nodeReady ? `The running ${runtimeKind === 'bundled' ? 'bundled' : 'host'} Node runtime meets ZTC's Node 20 requirement.`
|
|
176
|
+
: runtimeKind === 'bundled' ? 'The bundled runtime requires Node 20 or later. Update or reinstall the desktop app.' : 'ZTC requires Node 20 or later. Update the Node runtime used to launch ZTC.',
|
|
177
|
+
};
|
|
178
|
+
return { platform: process.platform, shell, node, packageManager, checks,
|
|
179
|
+
ready: nodeReady && shell.status === 'ready' && checks.filter(check => check.required).every(check => check.status === 'ready') };
|
|
180
|
+
}
|
|
181
|
+
/** Only fixed package names/argv are supported; no sudo or arbitrary command input. */
|
|
182
|
+
export async function installMissingSetupTools(options) {
|
|
183
|
+
if (!Array.isArray(options.tools) || options.tools.length > 16 || options.tools.some(tool => tool !== 'git' && tool !== 'rg')) {
|
|
184
|
+
throw new RangeError('Unsupported setup install tool: choose Git and/or ripgrep.');
|
|
185
|
+
}
|
|
186
|
+
const tools = [...new Set(options.tools)];
|
|
187
|
+
const before = await inspectSetupEnvironment(options);
|
|
188
|
+
const attempts = [];
|
|
189
|
+
for (const tool of tools) {
|
|
190
|
+
const check = before.checks.find(entry => entry.id === tool);
|
|
191
|
+
if (options.signal?.aborted || check.status === 'cancelled') {
|
|
192
|
+
attempts.push({ tool, status: 'cancelled', action: 'not_installed', detail: 'Installation was cancelled. Retry /setup when ready.' });
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
if (check.status !== 'missing') {
|
|
196
|
+
attempts.push({ tool, status: check.status, action: 'skipped', detail: check.status === 'ready' ? `${check.label} is already available; no installation is needed.` : `${check.label} is present but unhealthy. Repair the executable before retrying installation.` });
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
const manager = before.packageManager.id;
|
|
200
|
+
if (!manager) {
|
|
201
|
+
attempts.push({ tool, status: 'unsupported', action: 'not_installed', detail: 'No supported package manager is available. Install this tool manually, then retry /setup.' });
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
// Official fixed install syntax: docs.brew.sh/Manpage; Debian apt-get(8); dnf command_ref.
|
|
205
|
+
const command = manager === 'apt' ? 'apt-get' : manager;
|
|
206
|
+
const packageName = tool === 'rg' ? 'ripgrep' : 'git';
|
|
207
|
+
const args = manager === 'brew' ? ['install', packageName] : ['install', '-y', packageName];
|
|
208
|
+
const env = { ...environment(options), ...(manager === 'brew' ? { HOMEBREW_NO_AUTO_UPDATE: '1', HOMEBREW_NO_INSTALL_CLEANUP: '1' } : manager === 'apt' ? { DEBIAN_FRONTEND: 'noninteractive' } : {}) };
|
|
209
|
+
const result = await run(command, args, { ...options, env }, INSTALL_TIMEOUT_MS);
|
|
210
|
+
const verification = result.status === 'ready' ? await inspectTool(PROBES.find(probe => probe.id === tool), options) : undefined;
|
|
211
|
+
const installed = result.status === 'ready' && verification?.status === 'ready';
|
|
212
|
+
attempts.push({ tool, status: installed ? 'ready' : result.status === 'ready' ? 'failed' : result.status,
|
|
213
|
+
action: installed ? 'installed' : 'not_installed', command, args,
|
|
214
|
+
detail: installed ? `${check.label} installation was verified.`
|
|
215
|
+
: result.status === 'ready' ? `${check.label} installation could not be verified; the tool is still missing or unhealthy. Check PATH and retry /setup.`
|
|
216
|
+
: `${failureDetail(`${check.label} installation`, result)} No privilege escalation was attempted; use your system administrator's normal installation process if permissions are required.` });
|
|
217
|
+
}
|
|
218
|
+
return { before, attempts, after: tools.length ? await inspectSetupEnvironment(options) : before };
|
|
219
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare class SetupWorkspaceError extends Error {
|
|
2
|
+
readonly code: 'unowned' | 'invalid_marker' | 'unsupported_path' | 'invalid_configuration' | 'cancelled' | 'persistence';
|
|
3
|
+
constructor(message: string, code: 'unowned' | 'invalid_marker' | 'unsupported_path' | 'invalid_configuration' | 'cancelled' | 'persistence');
|
|
4
|
+
}
|
|
5
|
+
export interface SetupWorkspaceOptions {
|
|
6
|
+
workspaceRoot?: string;
|
|
7
|
+
provider: string;
|
|
8
|
+
model: string;
|
|
9
|
+
signal?: AbortSignal;
|
|
10
|
+
}
|
|
11
|
+
export interface SetupWorkspaceResult {
|
|
12
|
+
path: string;
|
|
13
|
+
sessionId: string;
|
|
14
|
+
created: boolean;
|
|
15
|
+
}
|
|
16
|
+
/** Create only our sample files; reruns preserve the marker, session and edits. */
|
|
17
|
+
export declare function ensureSetupWorkspace(options: SetupWorkspaceOptions): Promise<SetupWorkspaceResult>;
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { constants } from 'node:fs';
|
|
2
|
+
import { lstat, mkdir, open, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { dirname, join, resolve } from 'node:path';
|
|
4
|
+
import { profileConfigDir } from '../config/profiles.js';
|
|
5
|
+
import { generateSessionId, loadSessionById, saveSession, setSessionName } from '../session.js';
|
|
6
|
+
const MARKER = '.ztc-setup.json';
|
|
7
|
+
const SAMPLE_FILES = {
|
|
8
|
+
'hello.js': "console.log('Hello from ZTC');\n",
|
|
9
|
+
'README.md': '# Getting started with ZTC\n\nAsk ZTC to explain hello.js, then make a small change and review the diff.\nYour current project and conversation remain separate from this sample.\n',
|
|
10
|
+
};
|
|
11
|
+
export class SetupWorkspaceError extends Error {
|
|
12
|
+
code;
|
|
13
|
+
constructor(message, code) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.code = code;
|
|
16
|
+
this.name = 'SetupWorkspaceError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function requireActive(signal) {
|
|
20
|
+
if (signal?.aborted)
|
|
21
|
+
throw new SetupWorkspaceError('Setup was cancelled. Run /setup to try again.', 'cancelled');
|
|
22
|
+
}
|
|
23
|
+
function parseMarker(text) {
|
|
24
|
+
let value;
|
|
25
|
+
try {
|
|
26
|
+
value = JSON.parse(text);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
throw new SetupWorkspaceError('The sample workspace marker is unreadable. Preserve this directory and choose a different sample location.', 'invalid_marker');
|
|
30
|
+
}
|
|
31
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
32
|
+
throw new SetupWorkspaceError('The sample workspace marker is invalid. Preserve this directory and choose a different sample location.', 'invalid_marker');
|
|
33
|
+
}
|
|
34
|
+
const marker = value;
|
|
35
|
+
if (marker._schema_version !== 1 || marker.product !== 'ZTC'
|
|
36
|
+
|| typeof marker.sessionId !== 'string' || !/^[A-Za-z0-9][A-Za-z0-9_-]{1,127}$/.test(marker.sessionId)
|
|
37
|
+
|| typeof marker.provider !== 'string' || !marker.provider.trim()
|
|
38
|
+
|| typeof marker.model !== 'string' || !marker.model.trim()) {
|
|
39
|
+
throw new SetupWorkspaceError('The sample workspace marker is invalid. Preserve this directory and choose a different sample location.', 'invalid_marker');
|
|
40
|
+
}
|
|
41
|
+
return { _schema_version: 1, product: 'ZTC', sessionId: marker.sessionId, provider: marker.provider, model: marker.model };
|
|
42
|
+
}
|
|
43
|
+
async function readMarker(path) {
|
|
44
|
+
let handle;
|
|
45
|
+
try {
|
|
46
|
+
handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
if (error.code === 'ENOENT') {
|
|
50
|
+
throw new SetupWorkspaceError('Setup will not overwrite an existing directory that it does not own. Preserve it and choose another sample location.', 'unowned');
|
|
51
|
+
}
|
|
52
|
+
throw new SetupWorkspaceError('The sample workspace marker cannot be opened as a regular file.', 'invalid_marker');
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
const stat = await handle.stat();
|
|
56
|
+
if (!stat.isFile() || stat.size > 4096)
|
|
57
|
+
throw new SetupWorkspaceError('The sample workspace marker is invalid or too large.', 'invalid_marker');
|
|
58
|
+
return parseMarker(await handle.readFile('utf8'));
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
await handle.close();
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/** Create only our sample files; reruns preserve the marker, session and edits. */
|
|
65
|
+
export async function ensureSetupWorkspace(options) {
|
|
66
|
+
requireActive(options.signal);
|
|
67
|
+
if (!options.provider.trim() || !options.model.trim()) {
|
|
68
|
+
throw new SetupWorkspaceError('Choose an account and model before creating the sample workspace.', 'invalid_configuration');
|
|
69
|
+
}
|
|
70
|
+
const path = resolve(options.workspaceRoot ?? join(profileConfigDir(), 'workspaces', 'getting-started'));
|
|
71
|
+
const markerPath = join(path, MARKER);
|
|
72
|
+
let created = false;
|
|
73
|
+
let marker;
|
|
74
|
+
try {
|
|
75
|
+
const parent = dirname(path);
|
|
76
|
+
await mkdir(parent, { recursive: true });
|
|
77
|
+
requireActive(options.signal);
|
|
78
|
+
await mkdir(path);
|
|
79
|
+
created = true;
|
|
80
|
+
}
|
|
81
|
+
catch (error) {
|
|
82
|
+
if (error.code !== 'EEXIST')
|
|
83
|
+
throw error;
|
|
84
|
+
const stat = await lstat(path);
|
|
85
|
+
if (!stat.isDirectory() || stat.isSymbolicLink()) {
|
|
86
|
+
throw new SetupWorkspaceError('The sample path must be an ordinary directory. Choose another sample location.', 'unsupported_path');
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
if (created) {
|
|
90
|
+
marker = { _schema_version: 1, product: 'ZTC', sessionId: generateSessionId(), provider: options.provider, model: options.model };
|
|
91
|
+
requireActive(options.signal);
|
|
92
|
+
// Exclusive publication prevents a rerun from replacing another workspace's identity.
|
|
93
|
+
const handle = await open(markerPath, 'wx', 0o600);
|
|
94
|
+
try {
|
|
95
|
+
await handle.writeFile(JSON.stringify(marker, null, 2) + '\n', 'utf8');
|
|
96
|
+
await handle.sync();
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
await handle.close();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
marker = await readMarker(markerPath);
|
|
104
|
+
}
|
|
105
|
+
for (const [name, content] of Object.entries(SAMPLE_FILES)) {
|
|
106
|
+
requireActive(options.signal);
|
|
107
|
+
try {
|
|
108
|
+
await writeFile(join(path, name), content, { flag: 'wx', mode: 0o600 });
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
if (error.code !== 'EEXIST')
|
|
112
|
+
throw error;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
requireActive(options.signal);
|
|
116
|
+
const existing = await loadSessionById(marker.sessionId, path);
|
|
117
|
+
if (!existing) {
|
|
118
|
+
await saveSession(marker.sessionId, path, [], marker.model, marker.provider);
|
|
119
|
+
const named = await setSessionName(marker.sessionId, path, 'Getting started with ZTC');
|
|
120
|
+
if (!named || named.metadata.id !== marker.sessionId) {
|
|
121
|
+
throw new SetupWorkspaceError('The sample session could not be saved. Check storage permissions and rerun /setup.', 'persistence');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const saved = await loadSessionById(marker.sessionId, path);
|
|
125
|
+
if (!saved || saved.metadata.id !== marker.sessionId || saved.metadata.cwd !== path) {
|
|
126
|
+
throw new SetupWorkspaceError('The sample session could not be verified. Check storage permissions and rerun /setup.', 'persistence');
|
|
127
|
+
}
|
|
128
|
+
return { path, sessionId: marker.sessionId, created };
|
|
129
|
+
}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import type { OptimizationSpec } from '../types.js';
|
|
2
|
-
import type { OptimizationAdapter } from './types.js';
|
|
2
|
+
import type { OptimizationAdapter, OptimizationExecutionResult, OptimizationExecutorDeps } from './types.js';
|
|
3
|
+
import type { OptimizationPlanArtifacts } from '../types.js';
|
|
3
4
|
export declare function list_optimization_adapters(): OptimizationAdapter[];
|
|
4
5
|
export declare function resolve_optimization_adapter(spec: OptimizationSpec): OptimizationAdapter | null;
|
|
6
|
+
/** Canonical result projection for built-in and plugin producers, including legacy or failed output. */
|
|
7
|
+
export declare function evaluate_optimization_adapter(adapter: OptimizationAdapter, spec: OptimizationSpec, deps: OptimizationExecutorDeps, artifacts: OptimizationPlanArtifacts): Promise<OptimizationExecutionResult>;
|
|
5
8
|
export { kernelbenchCandidateOptimizationAdapter, kernelbenchOptimizationAdapter, } from './kernelbench.js';
|
|
6
9
|
export { popcornOptimizationAdapter } from './popcorn.js';
|
|
7
10
|
export { profileBenchmarkOptimizationAdapter } from './profile_benchmark.js';
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { describeOptimizationResult } from '../measurements.js';
|
|
1
2
|
import { runtimePluginRegistry } from '../../plugin/runtime_registry.js';
|
|
2
3
|
import { kernelbenchCandidateOptimizationAdapter, kernelbenchOptimizationAdapter, } from './kernelbench.js';
|
|
3
4
|
import { popcornOptimizationAdapter } from './popcorn.js';
|
|
@@ -26,6 +27,12 @@ export function resolve_optimization_adapter(spec) {
|
|
|
26
27
|
}
|
|
27
28
|
return null;
|
|
28
29
|
}
|
|
30
|
+
/** Canonical result projection for built-in and plugin producers, including legacy or failed output. */
|
|
31
|
+
export async function evaluate_optimization_adapter(adapter, spec, deps, artifacts) {
|
|
32
|
+
return describeOptimizationResult(adapter.evaluate
|
|
33
|
+
? await adapter.evaluate(spec, deps, artifacts)
|
|
34
|
+
: await adapter.execute(spec, deps, artifacts));
|
|
35
|
+
}
|
|
29
36
|
export { kernelbenchCandidateOptimizationAdapter, kernelbenchOptimizationAdapter, } from './kernelbench.js';
|
|
30
37
|
export { popcornOptimizationAdapter } from './popcorn.js';
|
|
31
38
|
export { profileBenchmarkOptimizationAdapter } from './profile_benchmark.js';
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
|
2
2
|
import { join, resolve } from 'path';
|
|
3
|
+
import { captureAdapterOptimizationMeasurement } from '../measurements.js';
|
|
3
4
|
import { resolve_benchmark_repo_root, run_shell_with_timeout, shell_join, sh_quote } from './runtime.js';
|
|
4
5
|
import { resolve_path_reference, resolve_path_within_cwd } from '../paths.js';
|
|
5
6
|
function request_includes(spec, needle) {
|
|
@@ -141,7 +142,8 @@ function load_kernelbench_metrics(spec, stdout) {
|
|
|
141
142
|
return null;
|
|
142
143
|
}
|
|
143
144
|
try {
|
|
144
|
-
const
|
|
145
|
+
const rawOutput = readFileSync(stackReportPath, 'utf-8');
|
|
146
|
+
const payload = JSON.parse(rawOutput);
|
|
145
147
|
const rows = payload.layers || [];
|
|
146
148
|
if (rows.length === 0) {
|
|
147
149
|
return null;
|
|
@@ -162,6 +164,7 @@ function load_kernelbench_metrics(spec, stdout) {
|
|
|
162
164
|
&& candidateSpeedup > baselineSpeedup);
|
|
163
165
|
const layerName = typeof finalLayer.layer === 'string' ? finalLayer.layer : 'final';
|
|
164
166
|
return {
|
|
167
|
+
sourcePath: stackReportPath, rawOutput,
|
|
165
168
|
summary: `KernelBench execution completed. Final layer ${layerName} scored ${candidateScore.toFixed(3)}.`,
|
|
166
169
|
notes: [
|
|
167
170
|
`KernelBench selected layer: ${layerName}.`,
|
|
@@ -370,7 +373,7 @@ async function evaluate_candidate_spec(spec, deps, artifacts) {
|
|
|
370
373
|
const name = typeof payload.name === 'string' ? payload.name : 'unknown';
|
|
371
374
|
const mode = typeof payload.mode === 'string' ? payload.mode : 'structural';
|
|
372
375
|
const correctness = Boolean(payload.correctness);
|
|
373
|
-
return {
|
|
376
|
+
return captureAdapterOptimizationMeasurement({
|
|
374
377
|
ok: shellResult.exitCode === 0 && candidateScore !== undefined,
|
|
375
378
|
status: shellResult.exitCode === 0 && candidateScore !== undefined ? 'completed' : 'failed',
|
|
376
379
|
adapterId: 'kernelbench',
|
|
@@ -400,7 +403,10 @@ async function evaluate_candidate_spec(spec, deps, artifacts) {
|
|
|
400
403
|
improved: undefined,
|
|
401
404
|
}
|
|
402
405
|
: undefined,
|
|
403
|
-
}
|
|
406
|
+
}, stdoutPath, shellResult.stdout || '', !shellResult.truncated, { runId: artifacts.runId, unit: 'score', selection: {
|
|
407
|
+
repositoryRoot: resolve_benchmark_repo_root(spec.cwd), selector: JSON.stringify(parse_kernelbench_task_selector(spec)),
|
|
408
|
+
profile: spec.profile, gpuRequested: build_kernelbench_flags(spec).gpu, mode, reportedLevel: level, reportedProblem: problemId,
|
|
409
|
+
} });
|
|
404
410
|
}
|
|
405
411
|
function build_command(spec, model) {
|
|
406
412
|
const { supportedStages, deferredStages } = executable_stages(spec);
|
|
@@ -541,7 +547,7 @@ export const kernelbenchOptimizationAdapter = {
|
|
|
541
547
|
const loadedMetrics = shellResult.exitCode === 0
|
|
542
548
|
? load_kernelbench_metrics(spec, shellResult.stdout || '')
|
|
543
549
|
: null;
|
|
544
|
-
return {
|
|
550
|
+
return captureAdapterOptimizationMeasurement({
|
|
545
551
|
ok: shellResult.exitCode === 0,
|
|
546
552
|
status: shellResult.exitCode === 0 ? 'completed' : 'failed',
|
|
547
553
|
adapterId: 'kernelbench',
|
|
@@ -558,6 +564,9 @@ export const kernelbenchOptimizationAdapter = {
|
|
|
558
564
|
deferredStages: plan.deferredStages,
|
|
559
565
|
notes: [...plan.notes, ...(loadedMetrics?.notes || [])],
|
|
560
566
|
metrics: loadedMetrics?.metrics,
|
|
561
|
-
}
|
|
567
|
+
}, loadedMetrics?.sourcePath || stdoutPath, loadedMetrics?.rawOutput || shellResult.stdout || '', !shellResult.truncated && loadedMetrics !== null && !build_kernelbench_flags(spec).random, { runId: artifacts.runId, unit: 'score', selection: { repositoryRoot: resolve_benchmark_repo_root(spec.cwd),
|
|
568
|
+
evaluator: spec.evaluator?.ref ?? null, profile: spec.profile, model: deps.model ?? null,
|
|
569
|
+
flags: JSON.stringify(build_kernelbench_flags(spec)),
|
|
570
|
+
} });
|
|
562
571
|
},
|
|
563
572
|
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { mkdirSync, writeFileSync } from 'fs';
|
|
2
2
|
import { join } from 'path';
|
|
3
|
+
import { captureAdapterOptimizationMeasurement } from '../measurements.js';
|
|
3
4
|
import { resolve_benchmark_repo_root, run_shell_with_timeout, shell_join, sh_quote } from './runtime.js';
|
|
4
5
|
import { resolve_path_reference, resolve_path_within_cwd } from '../paths.js';
|
|
5
6
|
function parse_gpu(spec) {
|
|
@@ -252,7 +253,7 @@ async function evaluate_candidate(spec, deps, artifacts) {
|
|
|
252
253
|
const breakdown = payload.score_breakdown && typeof payload.score_breakdown === 'object'
|
|
253
254
|
? JSON.stringify(payload.score_breakdown)
|
|
254
255
|
: null;
|
|
255
|
-
return {
|
|
256
|
+
return captureAdapterOptimizationMeasurement({
|
|
256
257
|
ok: benchmarkResult.exitCode === 0 && candidateValue !== undefined,
|
|
257
258
|
status: benchmarkResult.exitCode === 0 && candidateValue !== undefined ? 'completed' : 'failed',
|
|
258
259
|
adapterId: 'popcorn',
|
|
@@ -280,7 +281,7 @@ async function evaluate_candidate(spec, deps, artifacts) {
|
|
|
280
281
|
improved: undefined,
|
|
281
282
|
}
|
|
282
283
|
: undefined,
|
|
283
|
-
};
|
|
284
|
+
}, stdoutPath, benchmarkResult.stdout || '', !benchmarkResult.truncated && !testResult.truncated, { runId: artifacts.runId, unit: 'microseconds', selection: { repositoryRoot: repoRoot, leaderboard, gpu, profile: spec.profile } });
|
|
284
285
|
}
|
|
285
286
|
export const popcornOptimizationAdapter = {
|
|
286
287
|
id: 'popcorn',
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { writeFileSync } from 'fs';
|
|
2
2
|
import { join } from 'path';
|
|
3
|
+
import { captureAdapterOptimizationMeasurement, describeOptimizationResult } from '../measurements.js';
|
|
3
4
|
import { resolve_benchmark_repo_root, run_shell_with_timeout, shell_join, sh_quote } from './runtime.js';
|
|
4
5
|
const SUPPORTED_PROFILE_BENCHMARKS = new Set([
|
|
5
6
|
'ifbench',
|
|
@@ -218,13 +219,12 @@ async function evaluate(spec, deps, artifacts) {
|
|
|
218
219
|
writeFileSync(stdoutPath, result.stdout || '', 'utf-8');
|
|
219
220
|
writeFileSync(stderrPath, result.stderr || '', 'utf-8');
|
|
220
221
|
const parsed = parse_summary(result.stdout || '');
|
|
221
|
-
const
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
status: ok ? 'completed' : 'failed',
|
|
222
|
+
const execution = captureAdapterOptimizationMeasurement({
|
|
223
|
+
ok: result.exitCode === 0,
|
|
224
|
+
status: result.exitCode === 0 ? 'completed' : 'failed',
|
|
225
225
|
adapterId: profileBenchmarkOptimizationAdapter.id,
|
|
226
|
-
summary:
|
|
227
|
-
? `${benchmark_name(spec)} completed with ${parsed.passed}/${parsed.total} passing.`
|
|
226
|
+
summary: parsed
|
|
227
|
+
? `${benchmark_name(spec)} completed with ${parsed.passed}/${parsed.total} reported passing.`
|
|
228
228
|
: `${benchmark_name(spec)} benchmark did not produce a parseable successful summary.`,
|
|
229
229
|
command: adapterPlan.command,
|
|
230
230
|
planPath: artifacts.planPath,
|
|
@@ -240,7 +240,13 @@ async function evaluate(spec, deps, artifacts) {
|
|
|
240
240
|
direction: 'maximize',
|
|
241
241
|
candidateValue: parsed.score,
|
|
242
242
|
} : undefined,
|
|
243
|
-
}
|
|
243
|
+
}, stdoutPath, result.stdout || '', !result.truncated, { runId: artifacts.runId, unit: 'fraction', selection: {
|
|
244
|
+
repositoryRoot: repoRoot, benchmark: benchmark_name(spec), selector: benchmark_selector(spec),
|
|
245
|
+
profile: spec.profile, limit: parse_limit(spec), reportedTotal: parsed?.total ?? null, model: benchmark_model_arg(deps.model) ?? null,
|
|
246
|
+
} });
|
|
247
|
+
const ok = result.exitCode === 0 && (parsed !== null || execution.measurementReport?.value !== null && execution.measurementReport?.value !== undefined);
|
|
248
|
+
return describeOptimizationResult({ ...execution, ok, status: ok ? 'completed' : 'failed',
|
|
249
|
+
summary: parsed ? execution.summary : ok ? `${benchmark_name(spec)} completed with an explicitly declared reported objective.` : execution.summary });
|
|
244
250
|
}
|
|
245
251
|
export const profileBenchmarkOptimizationAdapter = {
|
|
246
252
|
id: 'profile-benchmark',
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
2
2
|
import { basename, dirname, join, resolve } from 'path';
|
|
3
|
+
import { captureAdapterOptimizationMeasurement, assessOptimizationResult } from '../measurements.js';
|
|
4
|
+
import { is_better_result, result_score } from '../results.js';
|
|
3
5
|
import { build_rf_report, } from '../../bench/rf_shared.js';
|
|
4
6
|
import { resolve_path_reference, resolve_path_within_cwd } from '../paths.js';
|
|
5
7
|
function failed_openems_backend_result(candidate, targetSpec, payload) {
|
|
@@ -391,6 +393,8 @@ function read_candidate_evaluation_pair(resultRunDir) {
|
|
|
391
393
|
function load_combine_donors(branchRecords) {
|
|
392
394
|
const donors = [];
|
|
393
395
|
for (const record of branchRecords) {
|
|
396
|
+
if (record.survivedFamilyPolicy !== true)
|
|
397
|
+
continue;
|
|
394
398
|
const candidatePath = record.selectedTarget || record.materializedTarget;
|
|
395
399
|
if (!candidatePath || !existsSync(candidatePath)) {
|
|
396
400
|
continue;
|
|
@@ -1429,26 +1433,30 @@ async function try_openems_evaluation(projectDir, candidatePath, targetSpecPath,
|
|
|
1429
1433
|
};
|
|
1430
1434
|
}
|
|
1431
1435
|
function write_backend_status(projectDir, payload) {
|
|
1436
|
+
ensure_bench_artifact_dirs(projectDir);
|
|
1432
1437
|
const paths = bench_paths(projectDir);
|
|
1433
1438
|
writeFileSync(paths.backendStatus, `${JSON.stringify(payload, null, 2)}\n`, 'utf-8');
|
|
1434
1439
|
}
|
|
1435
|
-
function sync_bench_state(projectDir, targetSpec, baselineCandidate, baselineEval, candidate, evaluation, score, note, backend, backendNote, pipeline, baselineScore, runId) {
|
|
1440
|
+
function sync_bench_state(projectDir, targetSpec, baselineCandidate, baselineEval, candidate, evaluation, score, note, backend, backendNote, pipeline, baselineScore, runId, execution) {
|
|
1436
1441
|
ensure_bench_artifact_dirs(projectDir);
|
|
1437
1442
|
const paths = bench_paths(projectDir);
|
|
1438
1443
|
const timestamp = new Date().toISOString();
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
+
const bestResultPath = join(projectDir, 'artifacts', 'best_optimization_result.json');
|
|
1445
|
+
const bestExists = existsSync(paths.bestCandidate);
|
|
1446
|
+
const previousResult = bestExists && existsSync(bestResultPath) ? read_json(bestResultPath) : null;
|
|
1447
|
+
// Historical best files remain readable; no scalar-only incumbent or new output confers comparison authority.
|
|
1448
|
+
const promoted = result_score(execution) !== null && (bestExists
|
|
1449
|
+
? previousResult !== null && is_better_result(previousResult, execution)
|
|
1450
|
+
: is_better_result(null, execution));
|
|
1451
|
+
const measurementReport = assessOptimizationResult(execution);
|
|
1444
1452
|
writeFileSync(paths.currentCandidate, `${JSON.stringify(candidate, null, 2)}\n`, 'utf-8');
|
|
1445
1453
|
writeFileSync(paths.currentEval, `${JSON.stringify(evaluation, null, 2)}\n`, 'utf-8');
|
|
1446
1454
|
writeFileSync(paths.baselineCandidate, `${JSON.stringify(baselineCandidate, null, 2)}\n`, 'utf-8');
|
|
1447
1455
|
writeFileSync(paths.baselineEval, `${JSON.stringify(baselineEval, null, 2)}\n`, 'utf-8');
|
|
1448
|
-
const promoted = score >= bestScore;
|
|
1449
1456
|
if (promoted) {
|
|
1450
1457
|
writeFileSync(paths.bestCandidate, `${JSON.stringify(candidate, null, 2)}\n`, 'utf-8');
|
|
1451
1458
|
writeFileSync(paths.bestEval, `${JSON.stringify(evaluation, null, 2)}\n`, 'utf-8');
|
|
1459
|
+
writeFileSync(bestResultPath, `${JSON.stringify(execution, null, 2)}\n`, 'utf-8');
|
|
1452
1460
|
}
|
|
1453
1461
|
const previousState = existsSync(paths.sessionState)
|
|
1454
1462
|
? read_json(paths.sessionState)
|
|
@@ -1460,9 +1468,10 @@ function sync_bench_state(projectDir, targetSpec, baselineCandidate, baselineEva
|
|
|
1460
1468
|
generation: nextGeneration,
|
|
1461
1469
|
evaluations: previousEvaluations + 1,
|
|
1462
1470
|
population_size: Number(previousState.population_size) || 24,
|
|
1463
|
-
elite_id: promoted ? candidate.id : String(previousState.elite_id ||
|
|
1464
|
-
best_score: promoted ?
|
|
1465
|
-
|
|
1471
|
+
elite_id: promoted ? candidate.id : String(previousState.elite_id || ''),
|
|
1472
|
+
best_score: promoted ? measurementReport.value : Number(previousState.best_score) || 0,
|
|
1473
|
+
measurementReport,
|
|
1474
|
+
phase: promoted ? 'reported_elite_update' : 'candidate_evaluation',
|
|
1466
1475
|
strategy: note,
|
|
1467
1476
|
checkpoint_path: `artifacts/checkpoints/g${String(nextGeneration).padStart(3, '0')}_checkpoint.json`,
|
|
1468
1477
|
current_job: `evaluate:${candidate.id}`,
|
|
@@ -1475,7 +1484,7 @@ function sync_bench_state(projectDir, targetSpec, baselineCandidate, baselineEva
|
|
|
1475
1484
|
generation: nextGeneration,
|
|
1476
1485
|
candidate: candidate.id,
|
|
1477
1486
|
score,
|
|
1478
|
-
outcome: promoted ? '
|
|
1487
|
+
outcome: promoted ? 'reported_comparable_selection' : 'recorded_unqualified',
|
|
1479
1488
|
note,
|
|
1480
1489
|
timestamp,
|
|
1481
1490
|
})}\n`, 'utf-8');
|
|
@@ -1710,7 +1719,6 @@ async function evaluate_candidate_spec(spec, deps, artifacts) {
|
|
|
1710
1719
|
});
|
|
1711
1720
|
const pipeline = spec.pipeline.map((stage) => stage.engine).join(' -> ');
|
|
1712
1721
|
const note = finalCandidate.mutation_summary || `evaluated ${finalCandidate.topology}`;
|
|
1713
|
-
sync_bench_state(projectDir, targetSpec, finalBaselineCandidate, finalBaselineEvaluation, finalCandidateWithScore, finalEvaluation, finalScored.score, [note, strategyAdjusted.note, diversityAdjusted.note].filter(Boolean).join('; '), finalBackend, backendAttempt.note, pipeline, finalBaselineScore, artifacts.runId);
|
|
1714
1722
|
writeFileSync(join(artifacts.runDir, 'candidate_normalized.json'), `${JSON.stringify(finalCandidateWithScore, null, 2)}\n`, 'utf-8');
|
|
1715
1723
|
writeFileSync(join(artifacts.runDir, 'evaluation.json'), `${JSON.stringify(finalEvaluation, null, 2)}\n`, 'utf-8');
|
|
1716
1724
|
writeFileSync(join(artifacts.runDir, 'baseline_evaluation.json'), `${JSON.stringify(finalBaselineEvaluation, null, 2)}\n`, 'utf-8');
|
|
@@ -1747,9 +1755,12 @@ async function evaluate_candidate_spec(spec, deps, artifacts) {
|
|
|
1747
1755
|
improved: finalScored.score > finalBaselineScore,
|
|
1748
1756
|
},
|
|
1749
1757
|
};
|
|
1750
|
-
|
|
1758
|
+
const capturedResult = captureAdapterOptimizationMeasurement(result, join(artifacts.runDir, 'evaluation.json'), `${JSON.stringify(finalEvaluation, null, 2)}\n`, true, { runId: artifacts.runId, unit: 'score', selection: { projectDir, benchName, backend: finalBackend,
|
|
1759
|
+
targetSpec: JSON.stringify(targetSpec), baselineScore: finalBaselineScore, profile: spec.profile } });
|
|
1760
|
+
sync_bench_state(projectDir, targetSpec, finalBaselineCandidate, finalBaselineEvaluation, finalCandidateWithScore, finalEvaluation, finalScored.score, [note, strategyAdjusted.note, diversityAdjusted.note].filter(Boolean).join('; '), finalBackend, backendAttempt.note, pipeline, finalBaselineScore, artifacts.runId, capturedResult);
|
|
1761
|
+
writeFileSync(join(artifacts.runDir, 'execution_result.json'), `${JSON.stringify(capturedResult, null, 2)}\n`, 'utf-8');
|
|
1751
1762
|
deps.onProgress?.(`RF bench: ${finalCandidateWithScore.id} completed with candidate_value=${finalScored.score.toFixed(4)} baseline_value=${finalBaselineScore.toFixed(4)} improved=${finalScored.score > finalBaselineScore}.`);
|
|
1752
|
-
return
|
|
1763
|
+
return capturedResult;
|
|
1753
1764
|
}
|
|
1754
1765
|
export const rfbenchOptimizationAdapter = {
|
|
1755
1766
|
id: 'rfbench',
|