@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,387 @@
|
|
|
1
|
+
import { randomUUID, createHash } from 'node:crypto';
|
|
2
|
+
import { cp, mkdir, readFile, readdir, rename, rm, lstat, realpath, readlink, writeFile, open } from 'node:fs/promises';
|
|
3
|
+
import { createReadStream } from 'node:fs';
|
|
4
|
+
import { homedir } from 'node:os';
|
|
5
|
+
import { join, resolve, relative, isAbsolute, dirname, sep } from 'node:path';
|
|
6
|
+
import { spawn } from 'node:child_process';
|
|
7
|
+
import { fileURLToPath } from 'node:url';
|
|
8
|
+
import { activeProfile, validateProfileName } from '../config/profiles.js';
|
|
9
|
+
import { writeFileAtomic } from '../utils/atomic_write.js';
|
|
10
|
+
const root = () => join(process.env.ZTC_CONFIG_DIR || join(homedir(), '.ztc'), 'environments');
|
|
11
|
+
const namePattern = /^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$/;
|
|
12
|
+
const valid = (name) => {
|
|
13
|
+
if (!namePattern.test(name))
|
|
14
|
+
throw new Error('Environment name must use 1–64 letters, numbers, underscores or hyphens.');
|
|
15
|
+
return name;
|
|
16
|
+
};
|
|
17
|
+
const envPath = (name) => join(root(), valid(name));
|
|
18
|
+
const now = () => new Date().toISOString();
|
|
19
|
+
function alive(pid) {
|
|
20
|
+
try {
|
|
21
|
+
process.kill(pid, 0);
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
return e.code !== 'ESRCH';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/** Only this exact directory owns files; symlinked environment roots are refused. */
|
|
29
|
+
async function directory(name) {
|
|
30
|
+
await requireDirectory(root());
|
|
31
|
+
const path = envPath(name);
|
|
32
|
+
const info = await lstat(path);
|
|
33
|
+
if (!info.isDirectory() || info.isSymbolicLink())
|
|
34
|
+
throw new Error('Environment directory is not an owned local directory.');
|
|
35
|
+
return path;
|
|
36
|
+
}
|
|
37
|
+
async function requireDirectory(path) {
|
|
38
|
+
const info = await lstat(path);
|
|
39
|
+
if (!info.isDirectory() || info.isSymbolicLink())
|
|
40
|
+
throw new Error('Environment requires an owned local directory.');
|
|
41
|
+
}
|
|
42
|
+
async function ownedDirectory(parent, name) {
|
|
43
|
+
const path = join(parent, name);
|
|
44
|
+
await mkdir(path, { mode: 0o700 }).catch(error => {
|
|
45
|
+
if (error.code !== 'EEXIST')
|
|
46
|
+
throw error;
|
|
47
|
+
});
|
|
48
|
+
await requireDirectory(path);
|
|
49
|
+
return path;
|
|
50
|
+
}
|
|
51
|
+
async function read(name) {
|
|
52
|
+
const path = await directory(name);
|
|
53
|
+
const data = JSON.parse(await readFile(join(path, 'manifest.json'), 'utf8'));
|
|
54
|
+
if (data.schemaVersion !== 1 || data.name !== name || data.backend !== 'local')
|
|
55
|
+
throw new Error('Invalid environment manifest.');
|
|
56
|
+
const expectedWorkspace = join(path, 'workspace');
|
|
57
|
+
const workspace = await lstat(expectedWorkspace);
|
|
58
|
+
if (!workspace.isDirectory() || workspace.isSymbolicLink())
|
|
59
|
+
throw new Error('Environment no longer has an owned workspace directory.');
|
|
60
|
+
const canonicalWorkspace = await realpath(expectedWorkspace);
|
|
61
|
+
if (data.workspacePath !== expectedWorkspace && data.workspacePath !== canonicalWorkspace)
|
|
62
|
+
throw new Error('Invalid environment workspace path.');
|
|
63
|
+
data.workspacePath = canonicalWorkspace;
|
|
64
|
+
const uuid = /^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/;
|
|
65
|
+
if (!uuid.test(data.id) || !Array.isArray(data.checkpoints) || !Array.isArray(data.services)
|
|
66
|
+
|| data.checkpoints.some(c => !uuid.test(c.id)) || data.services.some(s => !uuid.test(s.id)))
|
|
67
|
+
throw new Error('Invalid environment identities.');
|
|
68
|
+
validateProfileName(data.credentialProfile);
|
|
69
|
+
return data;
|
|
70
|
+
}
|
|
71
|
+
async function save(record) { record.updatedAt = now(); await writeFileAtomic(join(envPath(record.name), 'manifest.json'), JSON.stringify(record, null, 2)); }
|
|
72
|
+
async function mutate(name, fn) {
|
|
73
|
+
const path = await directory(name);
|
|
74
|
+
const lock = join(path, 'operation.lock');
|
|
75
|
+
const handle = await open(lock, 'wx', 0o600).catch(error => {
|
|
76
|
+
if (error.code === 'EEXIST')
|
|
77
|
+
throw new Error('Environment operation is already in progress. Inspect operation.lock before recovery.');
|
|
78
|
+
throw error;
|
|
79
|
+
});
|
|
80
|
+
try {
|
|
81
|
+
await handle.writeFile(JSON.stringify({ pid: process.pid, startedAt: now() }));
|
|
82
|
+
return await fn(await read(name), path);
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
await handle.close();
|
|
86
|
+
await rm(lock).catch(e => {
|
|
87
|
+
if (e.code !== 'ENOENT')
|
|
88
|
+
throw e;
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function assertOwner(record, sessionId) {
|
|
93
|
+
if (!record.owner || record.owner.sessionId !== sessionId || record.owner.pid !== process.pid)
|
|
94
|
+
throw new Error('Environment is not owned by this session. Open it before changing it.');
|
|
95
|
+
}
|
|
96
|
+
async function inventory(path, prefix = '') {
|
|
97
|
+
await requireDirectory(path);
|
|
98
|
+
const files = [];
|
|
99
|
+
for (const entry of (await readdir(path, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name))) {
|
|
100
|
+
const full = join(path, entry.name);
|
|
101
|
+
const child = prefix ? `${prefix}/${entry.name}` : entry.name;
|
|
102
|
+
const info = await lstat(full);
|
|
103
|
+
const mode = info.mode & 0o777;
|
|
104
|
+
if (entry.isDirectory()) {
|
|
105
|
+
files.push({ path: child, kind: 'directory', bytes: 0, sha256: '', mode });
|
|
106
|
+
files.push(...await inventory(full, child));
|
|
107
|
+
}
|
|
108
|
+
else if (entry.isFile()) {
|
|
109
|
+
const hash = createHash('sha256');
|
|
110
|
+
let bytes = 0;
|
|
111
|
+
for await (const chunk of createReadStream(full)) {
|
|
112
|
+
hash.update(chunk);
|
|
113
|
+
bytes += chunk.length;
|
|
114
|
+
}
|
|
115
|
+
files.push({ path: child, kind: 'file', bytes, sha256: hash.digest('hex'), mode });
|
|
116
|
+
}
|
|
117
|
+
else if (entry.isSymbolicLink()) {
|
|
118
|
+
const target = await readlink(full);
|
|
119
|
+
files.push({ path: child, kind: 'symlink', target, mode, bytes: Buffer.byteLength(target), sha256: createHash('sha256').update(target).digest('hex') });
|
|
120
|
+
}
|
|
121
|
+
else
|
|
122
|
+
throw new Error(`Checkpoint cannot capture special file ${child}; pause its service first.`);
|
|
123
|
+
}
|
|
124
|
+
return files;
|
|
125
|
+
}
|
|
126
|
+
async function services(record) {
|
|
127
|
+
const results = [];
|
|
128
|
+
if (record.services.length)
|
|
129
|
+
await requireDirectory(join(envPath(record.name), 'services'));
|
|
130
|
+
for (const service of record.services) {
|
|
131
|
+
await requireDirectory(join(envPath(record.name), 'services', service.id));
|
|
132
|
+
let receipt;
|
|
133
|
+
try {
|
|
134
|
+
receipt = JSON.parse(await readFile(join(envPath(record.name), 'services', service.id, 'receipt.json'), 'utf8'));
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
if (error.code !== 'ENOENT')
|
|
138
|
+
throw error;
|
|
139
|
+
receipt = { ...service };
|
|
140
|
+
}
|
|
141
|
+
if (receipt.id !== service.id || !['starting', 'running', 'stopped', 'failed', 'recovery_required'].includes(receipt.status))
|
|
142
|
+
throw new Error('Invalid service receipt; inspect the environment before recovery.');
|
|
143
|
+
receipt = { ...service, status: receipt.status, heartbeat: receipt.heartbeat, exitCode: receipt.exitCode, endedAt: receipt.endedAt, failure: receipt.failure, outputTruncated: receipt.outputTruncated };
|
|
144
|
+
if (['starting', 'running'].includes(receipt.status) && (!receipt.heartbeat || Date.now() - Date.parse(receipt.heartbeat) > 5000))
|
|
145
|
+
receipt.status = 'recovery_required';
|
|
146
|
+
results.push(receipt);
|
|
147
|
+
}
|
|
148
|
+
return results;
|
|
149
|
+
}
|
|
150
|
+
export async function getEnvironment(name) {
|
|
151
|
+
const record = await read(name);
|
|
152
|
+
record.services = await services(record);
|
|
153
|
+
return record;
|
|
154
|
+
}
|
|
155
|
+
export async function listEnvironments() {
|
|
156
|
+
let names;
|
|
157
|
+
try {
|
|
158
|
+
names = await readdir(root());
|
|
159
|
+
}
|
|
160
|
+
catch (e) {
|
|
161
|
+
if (e.code === 'ENOENT')
|
|
162
|
+
return [];
|
|
163
|
+
throw e;
|
|
164
|
+
}
|
|
165
|
+
const records = [];
|
|
166
|
+
for (const name of names.filter(name => namePattern.test(name))) {
|
|
167
|
+
const info = await lstat(envPath(name));
|
|
168
|
+
if (info.isDirectory() && !info.isSymbolicLink())
|
|
169
|
+
records.push(await getEnvironment(name));
|
|
170
|
+
}
|
|
171
|
+
return records;
|
|
172
|
+
}
|
|
173
|
+
export async function createEnvironment(name, sessionId) {
|
|
174
|
+
valid(name);
|
|
175
|
+
await mkdir(root(), { recursive: true, mode: 0o700 });
|
|
176
|
+
await requireDirectory(root());
|
|
177
|
+
const path = envPath(name);
|
|
178
|
+
await mkdir(path, { mode: 0o700 }).catch(e => {
|
|
179
|
+
if (e.code === 'EEXIST')
|
|
180
|
+
throw new Error('Environment already exists; open it to resume.');
|
|
181
|
+
throw e;
|
|
182
|
+
});
|
|
183
|
+
try {
|
|
184
|
+
await mkdir(join(path, 'workspace'), { mode: 0o700 });
|
|
185
|
+
const record = { schemaVersion: 1, id: randomUUID(), name, backend: 'local', workspacePath: await realpath(join(path, 'workspace')), credentialProfile: activeProfile(), status: 'active', createdAt: now(), updatedAt: now(), owner: { sessionId, pid: process.pid, token: randomUUID() }, checkpoints: [], services: [], setupNotes: [] };
|
|
186
|
+
await save(record);
|
|
187
|
+
return record;
|
|
188
|
+
}
|
|
189
|
+
catch (e) {
|
|
190
|
+
await rm(path, { recursive: true, force: true });
|
|
191
|
+
throw e;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
export async function openEnvironment(name, sessionId) {
|
|
195
|
+
return mutate(name, async (record) => {
|
|
196
|
+
if (record.credentialProfile !== activeProfile())
|
|
197
|
+
throw new Error(`Environment credentials reference profile ${record.credentialProfile}. Select that profile before opening it.`);
|
|
198
|
+
if (record.owner && alive(record.owner.pid) && (record.owner.pid !== process.pid || record.owner.sessionId !== sessionId))
|
|
199
|
+
throw new Error('Environment is owned by another live session.');
|
|
200
|
+
record.owner = { sessionId, pid: process.pid, token: randomUUID() };
|
|
201
|
+
await save(record);
|
|
202
|
+
return getEnvironment(name);
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
export async function releaseEnvironment(name, sessionId) {
|
|
206
|
+
await mutate(name, async (record) => { assertOwner(record, sessionId); delete record.owner; await save(record); });
|
|
207
|
+
}
|
|
208
|
+
export async function checkpointEnvironment(name, sessionId, label) {
|
|
209
|
+
return mutate(name, async (record, path) => {
|
|
210
|
+
assertOwner(record, sessionId);
|
|
211
|
+
const live = await services(record);
|
|
212
|
+
if (live.some(s => ['running', 'starting', 'recovery_required'].includes(s.status)))
|
|
213
|
+
throw new Error('Pause environment services before checkpointing a consistent workspace.');
|
|
214
|
+
const id = randomUUID();
|
|
215
|
+
const checkpoints = await ownedDirectory(path, 'checkpoints');
|
|
216
|
+
const dest = await ownedDirectory(checkpoints, id);
|
|
217
|
+
try {
|
|
218
|
+
const before = await inventory(record.workspacePath);
|
|
219
|
+
await cp(record.workspacePath, join(dest, 'workspace'), { recursive: true, dereference: false, verbatimSymlinks: true });
|
|
220
|
+
const copied = await inventory(join(dest, 'workspace'));
|
|
221
|
+
const after = await inventory(record.workspacePath);
|
|
222
|
+
if (JSON.stringify(before) !== JSON.stringify(copied) || JSON.stringify(before) !== JSON.stringify(after))
|
|
223
|
+
throw new Error('Workspace changed during checkpoint. Pause writers and retry.');
|
|
224
|
+
const checkpoint = { id, label: label.slice(0, 200), createdAt: now(), files: copied, services: live.map(s => ({ name: s.name, command: s.command, cwd: s.cwd ?? record.workspacePath })) };
|
|
225
|
+
await writeFile(join(dest, 'checkpoint.json'), JSON.stringify(checkpoint), { mode: 0o600, flag: 'wx' });
|
|
226
|
+
record.checkpoints.unshift(checkpoint);
|
|
227
|
+
await save(record);
|
|
228
|
+
return checkpoint;
|
|
229
|
+
}
|
|
230
|
+
catch (e) {
|
|
231
|
+
await rm(dest, { recursive: true, force: true });
|
|
232
|
+
throw e;
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
export async function restoreEnvironment(name, sessionId, checkpointId) {
|
|
237
|
+
return mutate(name, async (record, path) => {
|
|
238
|
+
assertOwner(record, sessionId);
|
|
239
|
+
if (record.status !== 'paused')
|
|
240
|
+
throw new Error('Pause the environment before restoring.');
|
|
241
|
+
const checkpoint = record.checkpoints.find(c => c.id === checkpointId);
|
|
242
|
+
if (!checkpoint)
|
|
243
|
+
throw new Error('Checkpoint not found.');
|
|
244
|
+
if ((await services(record)).some(s => ['running', 'starting', 'recovery_required'].includes(s.status)))
|
|
245
|
+
throw new Error('Service recovery is unresolved; inspect it before restoring.');
|
|
246
|
+
await requireDirectory(join(path, 'checkpoints'));
|
|
247
|
+
await requireDirectory(join(path, 'checkpoints', checkpoint.id));
|
|
248
|
+
const source = join(path, 'checkpoints', checkpoint.id, 'workspace');
|
|
249
|
+
const sourceInfo = await lstat(source);
|
|
250
|
+
if (!sourceInfo.isDirectory() || sourceInfo.isSymbolicLink())
|
|
251
|
+
throw new Error('Checkpoint integrity failed; current workspace preserved.');
|
|
252
|
+
if (JSON.stringify(await inventory(source)) !== JSON.stringify(checkpoint.files))
|
|
253
|
+
throw new Error('Checkpoint integrity failed; current workspace preserved.');
|
|
254
|
+
const replacement = join(path, `restore-${randomUUID()}`);
|
|
255
|
+
await cp(source, replacement, { recursive: true, dereference: false, verbatimSymlinks: true });
|
|
256
|
+
if (JSON.stringify(await inventory(replacement)) !== JSON.stringify(checkpoint.files)) {
|
|
257
|
+
await rm(replacement, { recursive: true, force: true });
|
|
258
|
+
throw new Error('Checkpoint integrity failed; current workspace preserved.');
|
|
259
|
+
}
|
|
260
|
+
const backup = join(path, `before-restore-${randomUUID()}`);
|
|
261
|
+
await rename(record.workspacePath, backup);
|
|
262
|
+
try {
|
|
263
|
+
await rename(replacement, record.workspacePath);
|
|
264
|
+
}
|
|
265
|
+
catch (e) {
|
|
266
|
+
await rename(backup, record.workspacePath);
|
|
267
|
+
throw e;
|
|
268
|
+
}
|
|
269
|
+
// Preserve the replaced workspace as recovery evidence instead of deleting it.
|
|
270
|
+
const externalLinks = checkpoint.files.filter(f => f.kind === 'symlink' && !isEnvironmentWorkspacePath(record.workspacePath, resolve(dirname(join(record.workspacePath, f.path)), f.target))).map(f => f.path);
|
|
271
|
+
record.recovery = { checkpointId, restoredAt: now(), retainedFiles: checkpoint.files.filter(f => f.kind !== 'directory').length, servicesNeedingRestart: checkpoint.services.map(s => s.name), externalLinks };
|
|
272
|
+
await save(record);
|
|
273
|
+
return getEnvironment(name);
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
export async function addEnvironmentNote(name, sessionId, text) {
|
|
277
|
+
if (!text.trim() || text.length > 4000)
|
|
278
|
+
throw new Error('Setup note must contain 1–4000 characters.');
|
|
279
|
+
await mutate(name, async (record) => { assertOwner(record, sessionId); record.setupNotes.push({ text, createdAt: now() }); await save(record); });
|
|
280
|
+
}
|
|
281
|
+
export async function startEnvironmentService(name, sessionId, serviceName, command, shell, workingDirectory) {
|
|
282
|
+
valid(serviceName);
|
|
283
|
+
if (!command.trim() || command.length > 16000)
|
|
284
|
+
throw new Error('Service command must contain 1–16000 characters.');
|
|
285
|
+
return mutate(name, async (record, path) => {
|
|
286
|
+
assertOwner(record, sessionId);
|
|
287
|
+
if (record.status !== 'active')
|
|
288
|
+
throw new Error('Resume the environment before starting a service.');
|
|
289
|
+
const serviceCwd = await realpath(workingDirectory ?? record.workspacePath);
|
|
290
|
+
if (!isEnvironmentWorkspacePath(await realpath(record.workspacePath), serviceCwd))
|
|
291
|
+
throw new Error('Service directory must remain inside its owned environment workspace.');
|
|
292
|
+
const live = await services(record);
|
|
293
|
+
if (live.some(s => s.name === serviceName && ['running', 'starting', 'recovery_required'].includes(s.status)))
|
|
294
|
+
throw new Error('Service already runs or needs recovery; inspect it before restarting.');
|
|
295
|
+
const id = randomUUID();
|
|
296
|
+
const serviceRoot = await ownedDirectory(path, 'services');
|
|
297
|
+
const serviceDir = await ownedDirectory(serviceRoot, id);
|
|
298
|
+
const service = { id, name: serviceName, command, cwd: serviceCwd, status: 'starting', startedAt: now(), heartbeat: now(), logPath: join(serviceDir, 'output.log') };
|
|
299
|
+
await writeFile(join(serviceDir, 'launch.json'), JSON.stringify({ service, cwd: serviceCwd, shell }), { flag: 'wx', mode: 0o600 });
|
|
300
|
+
record.services.push(service);
|
|
301
|
+
await save(record);
|
|
302
|
+
const extension = import.meta.url.endsWith('.ts') ? 'ts' : 'js';
|
|
303
|
+
const runner = fileURLToPath(new URL(`./service_runner.${extension}`, import.meta.url));
|
|
304
|
+
const child = spawn(process.execPath, [...(extension === 'ts' ? ['--import', import.meta.resolve('tsx')] : []), runner, serviceDir], { cwd: serviceCwd, detached: true, stdio: 'ignore', env: process.env });
|
|
305
|
+
child.unref();
|
|
306
|
+
try {
|
|
307
|
+
await new Promise((resolve, reject) => { child.once('spawn', resolve); child.once('error', reject); });
|
|
308
|
+
}
|
|
309
|
+
catch (error) {
|
|
310
|
+
service.status = 'failed';
|
|
311
|
+
service.failure = String(error);
|
|
312
|
+
await writeFileAtomic(join(serviceDir, 'receipt.json'), JSON.stringify(service));
|
|
313
|
+
throw error;
|
|
314
|
+
}
|
|
315
|
+
return service;
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
export async function pauseEnvironment(name, sessionId) {
|
|
319
|
+
return mutate(name, async (record) => {
|
|
320
|
+
assertOwner(record, sessionId);
|
|
321
|
+
const live = await services(record);
|
|
322
|
+
for (const service of live)
|
|
323
|
+
if (['running', 'starting', 'recovery_required'].includes(service.status))
|
|
324
|
+
await writeFile(join(envPath(name), 'services', service.id, 'stop'), service.id, { mode: 0o600 });
|
|
325
|
+
const until = Date.now() + 8000;
|
|
326
|
+
while ((await services(record)).some(s => ['running', 'starting'].includes(s.status)) && Date.now() < until)
|
|
327
|
+
await new Promise(r => setTimeout(r, 50));
|
|
328
|
+
record.services = await services(record);
|
|
329
|
+
if (record.services.some(s => ['running', 'starting', 'recovery_required'].includes(s.status)))
|
|
330
|
+
throw new Error('Service did not stop or requires recovery. Workspace unchanged; inspect its receipt and output.');
|
|
331
|
+
record.status = 'paused';
|
|
332
|
+
await save(record);
|
|
333
|
+
return getEnvironment(name);
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
export async function resumeEnvironment(name, sessionId) { return mutate(name, async (record) => { assertOwner(record, sessionId); record.status = 'active'; await save(record); return getEnvironment(name); }); }
|
|
337
|
+
export async function discardEnvironment(name, sessionId) {
|
|
338
|
+
return mutate(name, async (record, path) => {
|
|
339
|
+
assertOwner(record, sessionId);
|
|
340
|
+
if (record.status !== 'paused' || (await services(record)).some(s => ['running', 'starting', 'recovery_required'].includes(s.status)))
|
|
341
|
+
throw new Error('Pause the environment and resolve services before discarding.');
|
|
342
|
+
const archive = await ownedDirectory(root(), '.discarded');
|
|
343
|
+
const target = join(archive, `${name}-${record.id}`);
|
|
344
|
+
await rename(path, target);
|
|
345
|
+
await rm(join(target, 'operation.lock'));
|
|
346
|
+
return target;
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
export async function environmentForWorkspace(cwd) {
|
|
350
|
+
const absolute = await realpath(cwd);
|
|
351
|
+
for (const record of await listEnvironments()) {
|
|
352
|
+
const workspace = await realpath(record.workspacePath);
|
|
353
|
+
if (isEnvironmentWorkspacePath(workspace, absolute))
|
|
354
|
+
return record;
|
|
355
|
+
}
|
|
356
|
+
return undefined;
|
|
357
|
+
}
|
|
358
|
+
/** Bounded setup context, without keys, owner tokens or service launch commands. */
|
|
359
|
+
export function describeEnvironmentForAgent(record) {
|
|
360
|
+
return [
|
|
361
|
+
`Durable local environment: ${record.name} (${record.id}), ${record.status}.`,
|
|
362
|
+
`Workspace: ${record.workspacePath}. Credentials reference config profile ${record.credentialProfile}.`,
|
|
363
|
+
'Installed dependencies and repositories persist here. Checkpoint restore never restarts services.',
|
|
364
|
+
record.recovery ? `Restored checkpoint ${record.recovery.checkpointId}; services requiring explicit restart: ${record.recovery.servicesNeedingRestart.join(', ') || 'none'}.` : '',
|
|
365
|
+
...record.setupNotes.slice(-20).map(note => `Saved setup note: ${note.text}`),
|
|
366
|
+
].filter(Boolean).join('\n');
|
|
367
|
+
}
|
|
368
|
+
/** Observable status excludes potentially huge per-file inventories and owner tokens. */
|
|
369
|
+
export function environmentSummary(record) {
|
|
370
|
+
return {
|
|
371
|
+
...record,
|
|
372
|
+
owner: record.owner ? { sessionId: record.owner.sessionId, pid: record.owner.pid } : undefined,
|
|
373
|
+
checkpointCount: record.checkpoints.length,
|
|
374
|
+
checkpoints: record.checkpoints.slice(0, 100).map(point => ({ id: point.id, label: point.label, createdAt: point.createdAt, retainedFiles: point.files.filter(file => file.kind !== 'directory').length, services: point.services.map(service => service.name) })),
|
|
375
|
+
serviceCount: record.services.length,
|
|
376
|
+
services: record.services.slice(-100),
|
|
377
|
+
setupNoteCount: record.setupNotes.length,
|
|
378
|
+
setupNotes: record.setupNotes.slice(-20),
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
export function isEnvironmentWorkspacePath(workspace, path) {
|
|
382
|
+
const child = relative(workspace, path);
|
|
383
|
+
return child === '' || (!isAbsolute(child) && child !== '..' && !child.startsWith(`..${sep}`));
|
|
384
|
+
}
|
|
385
|
+
/** A saved environment could not be attached without violating recovery guards. */
|
|
386
|
+
export class EnvironmentRecoveryError extends Error {
|
|
387
|
+
}
|
package/dist/events.d.ts
CHANGED
|
@@ -1,3 +1,23 @@
|
|
|
1
|
+
import type { GoalView } from './goal_contract.js';
|
|
2
|
+
export type { GoalView, GoalProjection } from './goal_contract.js';
|
|
3
|
+
export { parseGoalView, parseGoalProjection, retainGoalView } from './goal_contract.js';
|
|
4
|
+
import type { CommandWaitingState } from './types.js';
|
|
5
|
+
import type { EvidenceSnapshot } from './agent/runtime/evidence.js';
|
|
6
|
+
import type { TaskHandoffProjection } from './session_handoff_contract.js';
|
|
7
|
+
export type { TaskHandoffSnapshot, TaskHandoffProjection, TaskHandoffCorrection } from './session_handoff_contract.js';
|
|
8
|
+
export { parseTaskHandoffSnapshot, parseTaskHandoffProjection } from './session_handoff_contract.js';
|
|
9
|
+
export type { TaskHandoffView } from './web/view_plugin.js';
|
|
10
|
+
export { parseTaskHandoffView, retainTaskHandoffView } from './web/view_plugin.js';
|
|
11
|
+
export type { EvidenceSnapshot, EvidenceRecord, EvidenceSource } from './agent/runtime/evidence.js';
|
|
12
|
+
export type { DelegatedEvidenceHandoff } from './agent/runtime/delegated_evidence.js';
|
|
13
|
+
export { parseEvidenceSnapshot } from './agent/runtime/evidence.js';
|
|
14
|
+
export { parseCheckedCommandResult } from './agent/runtime/checked_commands.js';
|
|
15
|
+
export type { CommandExecutionPolicy, CommandExecutionObservation } from './agent/runtime/command_execution_policy.js';
|
|
16
|
+
export { parseCommandExecutionPolicy, parseCommandExecutionObservation } from './agent/runtime/command_execution_policy.js';
|
|
17
|
+
export type { VerifierDecision, HostVerifierDecision } from './agent/runtime/verifier_contract.js';
|
|
18
|
+
export { parseVerifierDecision, parseHostVerifierDecision } from './agent/runtime/verifier_contract.js';
|
|
19
|
+
export type { CommandVerificationReceipt, CurrentVerificationProjection, SourceSnapshot } from './agent/runtime/source_verification_contract.js';
|
|
20
|
+
export { parseCommandVerificationReceipt, parseCurrentVerificationProjection } from './agent/runtime/source_verification_contract.js';
|
|
1
21
|
/**
|
|
2
22
|
* Public library entry for ZTC event types.
|
|
3
23
|
*
|
|
@@ -15,7 +35,7 @@
|
|
|
15
35
|
* Both are exported here as a discriminated union so embedders don't have to
|
|
16
36
|
* re-declare them.
|
|
17
37
|
*/
|
|
18
|
-
export type { AgentEvent } from './types.js';
|
|
38
|
+
export type { AgentEvent, CommandWaitingState } from './types.js';
|
|
19
39
|
export type { Message, MessageRole, ToolCall, AgentStatus, TodoStatus } from './types.js';
|
|
20
40
|
export type HeadlessStatus = 'session_loaded' | 'session_new' | 'ready' | 'thinking' | 'streaming' | 'tool_use' | 'idle' | 'auto_continue' | 'output_saved' | 'task_completed_detected' | 'session_saved' | 'debug' | 'headless_shell_mode' | 'prompt_too_long';
|
|
21
41
|
export interface HeadlessEventBase {
|
|
@@ -23,9 +43,24 @@ export interface HeadlessEventBase {
|
|
|
23
43
|
session_id?: string;
|
|
24
44
|
}
|
|
25
45
|
export type HeadlessEvent = (HeadlessEventBase & {
|
|
46
|
+
type: 'goal';
|
|
47
|
+
data: GoalView;
|
|
48
|
+
}) | (HeadlessEventBase & {
|
|
49
|
+
type: 'task_handoff';
|
|
50
|
+
data: {
|
|
51
|
+
sessionId: string;
|
|
52
|
+
projection: TaskHandoffProjection | null;
|
|
53
|
+
};
|
|
54
|
+
}) | (HeadlessEventBase & {
|
|
55
|
+
type: 'evidence';
|
|
56
|
+
data: {
|
|
57
|
+
snapshot: EvidenceSnapshot;
|
|
58
|
+
};
|
|
59
|
+
}) | (HeadlessEventBase & {
|
|
26
60
|
type: 'status';
|
|
27
61
|
data: {
|
|
28
62
|
status: HeadlessStatus | string;
|
|
63
|
+
waiting?: CommandWaitingState;
|
|
29
64
|
[k: string]: unknown;
|
|
30
65
|
};
|
|
31
66
|
}) | (HeadlessEventBase & {
|
|
@@ -109,3 +144,7 @@ export declare function parseHeadlessEvent(line: string): HeadlessEvent | null;
|
|
|
109
144
|
* reading multi-prompt sessions don't exit early.
|
|
110
145
|
*/
|
|
111
146
|
export declare function isTurnComplete(event: HeadlessEvent): boolean;
|
|
147
|
+
export type { BenchmarkVerifierDecision } from './agent/runtime/benchmark_contract.js';
|
|
148
|
+
export { parseBenchmarkVerifierDecision } from './agent/runtime/benchmark_contract.js';
|
|
149
|
+
export type { BenchmarkComparisonDecision } from './agent/runtime/benchmark_comparison.js';
|
|
150
|
+
export { parseBenchmarkComparisonDecision } from './agent/runtime/benchmark_comparison.js';
|
package/dist/events.js
CHANGED
|
@@ -1,20 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
* the root `zerg-ztc` export) subscribe to these directly.
|
|
10
|
-
*
|
|
11
|
-
* 2. `HeadlessEvent` — the NDJSON protocol the `--headless --json` runner
|
|
12
|
-
* writes to stdout, and reads from stdin. Embedders running ZTC as a
|
|
13
|
-
* subprocess (e.g. ca_org's ZtcPool) parse these line-by-line.
|
|
14
|
-
*
|
|
15
|
-
* Both are exported here as a discriminated union so embedders don't have to
|
|
16
|
-
* re-declare them.
|
|
17
|
-
*/
|
|
1
|
+
export { parseGoalView, parseGoalProjection, retainGoalView } from './goal_contract.js';
|
|
2
|
+
export { parseTaskHandoffSnapshot, parseTaskHandoffProjection } from './session_handoff_contract.js';
|
|
3
|
+
export { parseTaskHandoffView, retainTaskHandoffView } from './web/view_plugin.js';
|
|
4
|
+
export { parseEvidenceSnapshot } from './agent/runtime/evidence.js';
|
|
5
|
+
export { parseCheckedCommandResult } from './agent/runtime/checked_commands.js';
|
|
6
|
+
export { parseCommandExecutionPolicy, parseCommandExecutionObservation } from './agent/runtime/command_execution_policy.js';
|
|
7
|
+
export { parseVerifierDecision, parseHostVerifierDecision } from './agent/runtime/verifier_contract.js';
|
|
8
|
+
export { parseCommandVerificationReceipt, parseCurrentVerificationProjection } from './agent/runtime/source_verification_contract.js';
|
|
18
9
|
/**
|
|
19
10
|
* Parse one NDJSON line into a typed `HeadlessEvent`. Returns null on non-JSON
|
|
20
11
|
* or on unknown shapes — embedders should typically just `continue` in that
|
|
@@ -57,3 +48,5 @@ export function isTurnComplete(event) {
|
|
|
57
48
|
return false;
|
|
58
49
|
return true; // Unknown scope: fail-open so consumers stop instead of hanging.
|
|
59
50
|
}
|
|
51
|
+
export { parseBenchmarkVerifierDecision } from './agent/runtime/benchmark_contract.js';
|
|
52
|
+
export { parseBenchmarkComparisonDecision } from './agent/runtime/benchmark_comparison.js';
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { GoalRecord } from './agent/commands/goal.js';
|
|
2
|
+
import { type GoalPlateauState, type GoalExitReason, type SustainedGoalAuthority } from './agent/commands/goal_exit.js';
|
|
3
|
+
/** Bounded projection of the existing goal, never another experiment ledger. */
|
|
4
|
+
export interface GoalProjection {
|
|
5
|
+
schemaVersion: 1;
|
|
6
|
+
goalId: string;
|
|
7
|
+
objective: string;
|
|
8
|
+
status: GoalRecord['status'];
|
|
9
|
+
tokenBudget: number | null;
|
|
10
|
+
tokensUsed: number;
|
|
11
|
+
maxTurns: number | null;
|
|
12
|
+
turns: number;
|
|
13
|
+
updatedAt: number;
|
|
14
|
+
plateau: GoalPlateauState | null;
|
|
15
|
+
exitReason: GoalExitReason | null;
|
|
16
|
+
sustained: SustainedGoalAuthority | null;
|
|
17
|
+
}
|
|
18
|
+
export interface GoalView {
|
|
19
|
+
sessionId: string;
|
|
20
|
+
goal: GoalProjection | null;
|
|
21
|
+
}
|
|
22
|
+
export declare function parseGoalProjection(value: unknown): GoalProjection | null;
|
|
23
|
+
export declare function projectGoal(record: GoalRecord | null): GoalProjection | null;
|
|
24
|
+
export declare function parseGoalView(value: unknown): GoalView | null;
|
|
25
|
+
export declare function retainGoalView(previous: GoalView | undefined, next: GoalView): GoalView;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { parseGoalPlateauState, parseGoalExitReason, parseSustainedGoalAuthority } from './agent/commands/goal_exit.js';
|
|
2
|
+
const boundedText = (value, bytes) => typeof value === 'string'
|
|
3
|
+
&& value.trim().length > 0 && new TextEncoder().encode(value).length <= bytes && !/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/u.test(value);
|
|
4
|
+
const integer = (value, min = 0) => typeof value === 'number' && Number.isSafeInteger(value) && value >= min;
|
|
5
|
+
function exact(value, keys) {
|
|
6
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value)
|
|
7
|
+
&& (Object.getPrototypeOf(value) === Object.prototype || Object.getPrototypeOf(value) === null)
|
|
8
|
+
&& Object.keys(value).length === keys.length && keys.every(key => Object.hasOwn(value, key));
|
|
9
|
+
}
|
|
10
|
+
export function parseGoalProjection(value) {
|
|
11
|
+
if (!exact(value, ['schemaVersion', 'goalId', 'objective', 'status', 'tokenBudget', 'tokensUsed', 'maxTurns',
|
|
12
|
+
'turns', 'updatedAt', 'plateau', 'exitReason', 'sustained']) || value.schemaVersion !== 1
|
|
13
|
+
|| !boundedText(value.goalId, 256) || /[\r\n\t]/u.test(value.goalId) || !boundedText(value.objective, 8000)
|
|
14
|
+
|| typeof value.status !== 'string' || !['active', 'paused', 'complete', 'budget_limited', 'blocked'].includes(value.status)
|
|
15
|
+
|| !(value.tokenBudget === null || integer(value.tokenBudget, 1)) || !integer(value.tokensUsed)
|
|
16
|
+
|| !(value.maxTurns === null || integer(value.maxTurns, 1)) || !integer(value.turns) || !integer(value.updatedAt))
|
|
17
|
+
return null;
|
|
18
|
+
const plateau = value.plateau === null ? null : parseGoalPlateauState(value.plateau);
|
|
19
|
+
const exitReason = value.exitReason === null ? null : parseGoalExitReason(value.exitReason);
|
|
20
|
+
const sustained = value.sustained === null ? null : parseSustainedGoalAuthority(value.sustained);
|
|
21
|
+
if ((value.plateau !== null && !plateau) || (value.exitReason !== null && !exitReason) || (value.sustained !== null && !sustained))
|
|
22
|
+
return null;
|
|
23
|
+
return { ...structuredClone(value), plateau, exitReason, sustained };
|
|
24
|
+
}
|
|
25
|
+
export function projectGoal(record) {
|
|
26
|
+
if (!record)
|
|
27
|
+
return null;
|
|
28
|
+
return parseGoalProjection({ schemaVersion: 1, goalId: record.goalId, objective: record.objective, status: record.status,
|
|
29
|
+
tokenBudget: record.tokenBudget ?? null, tokensUsed: record.tokensUsed, maxTurns: record.maxTurns ?? null,
|
|
30
|
+
turns: record.turns, updatedAt: record.updatedAt, plateau: record.plateau ?? null,
|
|
31
|
+
exitReason: record.exitReason ?? null, sustained: record.sustained ?? null });
|
|
32
|
+
}
|
|
33
|
+
export function parseGoalView(value) {
|
|
34
|
+
if (!exact(value, ['sessionId', 'goal']) || !boundedText(value.sessionId, 256) || /[\r\n\t]/u.test(value.sessionId))
|
|
35
|
+
return null;
|
|
36
|
+
const goal = value.goal === null ? null : parseGoalProjection(value.goal);
|
|
37
|
+
return value.goal !== null && !goal ? null : { sessionId: value.sessionId, goal };
|
|
38
|
+
}
|
|
39
|
+
export function retainGoalView(previous, next) {
|
|
40
|
+
if (previous?.sessionId === next.sessionId && previous.goal?.goalId === next.goal?.goalId
|
|
41
|
+
&& previous.goal && next.goal && next.goal.updatedAt < previous.goal.updatedAt)
|
|
42
|
+
return previous;
|
|
43
|
+
return next;
|
|
44
|
+
}
|