@zergai/ztc 0.4.0-beta.1 → 0.5.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +398 -45
- package/RUST_THIRD_PARTY_LICENSES.txt +1080 -822
- package/THIRD_PARTY_NOTICES.md +273 -12
- package/bin/zmux-darwin-arm64 +0 -0
- package/bin/ztc-audio-darwin-arm64 +0 -0
- package/bin/ztc-capture-darwin-arm64 +0 -0
- package/bin/ztc-computer-darwin-arm64 +0 -0
- package/bin/ztc-llm-darwin-arm64 +0 -0
- package/bin/ztc-tts-darwin-arm64 +0 -0
- package/bin/ztc-tui-darwin-arm64 +0 -0
- package/bin/ztc-zlicky-overlay-darwin-arm64 +0 -0
- package/bin/zterm-darwin-arm64 +0 -0
- package/dist/App.js +1206 -209
- package/dist/agent/agent.d.ts +74 -8
- package/dist/agent/agent.js +1073 -184
- package/dist/agent/backends/account_rotation.d.ts +4 -0
- package/dist/agent/backends/account_rotation.js +8 -2
- package/dist/agent/backends/anthropic.d.ts +13 -0
- package/dist/agent/backends/anthropic.js +169 -28
- package/dist/agent/backends/claude_cli.js +18 -8
- package/dist/agent/backends/codex_app_server.d.ts +1 -0
- package/dist/agent/backends/codex_app_server.js +55 -3
- package/dist/agent/backends/codex_auth.d.ts +1 -0
- package/dist/agent/backends/codex_auth.js +67 -13
- package/dist/agent/backends/codex_buffered_recovery.d.ts +27 -0
- package/dist/agent/backends/codex_buffered_recovery.js +293 -0
- package/dist/agent/backends/gemini.js +3 -1
- package/dist/agent/backends/http_error.d.ts +26 -0
- package/dist/agent/backends/http_error.js +221 -0
- package/dist/agent/backends/index.d.ts +9 -2
- package/dist/agent/backends/index.js +22 -2
- package/dist/agent/backends/openai.d.ts +0 -6
- package/dist/agent/backends/openai.js +5 -2
- package/dist/agent/backends/openai_compatible.d.ts +5 -4
- package/dist/agent/backends/openai_compatible.js +26 -19
- package/dist/agent/backends/openai_responses.d.ts +8 -3
- package/dist/agent/backends/openai_responses.js +77 -33
- package/dist/agent/backends/provider_ids.d.ts +1 -0
- package/dist/agent/backends/provider_ids.js +4 -0
- package/dist/agent/backends/request_metrics.js +12 -2
- package/dist/agent/backends/types.d.ts +109 -6
- package/dist/agent/backends/types.js +5 -1
- package/dist/agent/backends/zrouter_stream.d.ts +6 -1
- package/dist/agent/backends/zrouter_stream.js +160 -42
- package/dist/agent/background_registry.d.ts +2 -0
- package/dist/agent/background_registry.js +1 -0
- package/dist/agent/claim_observation.d.ts +6 -0
- package/dist/agent/claim_observation.js +54 -0
- package/dist/agent/commands/accounts.js +46 -177
- package/dist/agent/commands/attention.d.ts +2 -0
- package/dist/agent/commands/attention.js +67 -0
- package/dist/agent/commands/auth.js +18 -2
- package/dist/agent/commands/board.d.ts +2 -0
- package/dist/agent/commands/board.js +169 -0
- package/dist/agent/commands/clipboard.js +50 -1
- package/dist/agent/commands/compact.js +21 -13
- package/dist/agent/commands/config.js +4 -1
- package/dist/agent/commands/context.js +6 -1
- package/dist/agent/commands/desktop.d.ts +2 -0
- package/dist/agent/commands/desktop.js +29 -0
- package/dist/agent/commands/effort.js +14 -6
- package/dist/agent/commands/environment.d.ts +3 -0
- package/dist/agent/commands/environment.js +109 -0
- package/dist/agent/commands/evidence.d.ts +2 -0
- package/dist/agent/commands/evidence.js +9 -0
- package/dist/agent/commands/fork.js +4 -3
- package/dist/agent/commands/goal.d.ts +33 -1
- package/dist/agent/commands/goal.js +174 -14
- package/dist/agent/commands/goal_exit.d.ts +36 -0
- package/dist/agent/commands/goal_exit.js +120 -0
- package/dist/agent/commands/help.js +3 -1
- package/dist/agent/commands/history.js +3 -1
- package/dist/agent/commands/inbox.d.ts +2 -0
- package/dist/agent/commands/inbox.js +148 -0
- package/dist/agent/commands/index.js +16 -1
- package/dist/agent/commands/input_mode.js +8 -6
- package/dist/agent/commands/job.d.ts +2 -0
- package/dist/agent/commands/job.js +93 -0
- package/dist/agent/commands/keybindings.js +4 -1
- package/dist/agent/commands/label.d.ts +2 -0
- package/dist/agent/commands/label.js +77 -0
- package/dist/agent/commands/layout.d.ts +2 -0
- package/dist/agent/commands/layout.js +20 -0
- package/dist/agent/commands/mirror.js +16 -1
- package/dist/agent/commands/model.js +12 -2
- package/dist/agent/commands/permissions.d.ts +3 -1
- package/dist/agent/commands/permissions.js +79 -89
- package/dist/agent/commands/plan.js +5 -15
- package/dist/agent/commands/profile.js +21 -2
- package/dist/agent/commands/provider_selection.js +20 -1
- package/dist/agent/commands/rename.js +1 -1
- package/dist/agent/commands/resources.d.ts +2 -0
- package/dist/agent/commands/resources.js +67 -0
- package/dist/agent/commands/rewind.d.ts +3 -0
- package/dist/agent/commands/rewind.js +16 -0
- package/dist/agent/commands/runbooks.d.ts +2 -0
- package/dist/agent/commands/runbooks.js +73 -0
- package/dist/agent/commands/runbooks_lazy.d.ts +2 -0
- package/dist/agent/commands/runbooks_lazy.js +8 -0
- package/dist/agent/commands/sessions.d.ts +1 -1
- package/dist/agent/commands/sessions.js +33 -5
- package/dist/agent/commands/settings.js +185 -39
- package/dist/agent/commands/setup.d.ts +2 -0
- package/dist/agent/commands/setup.js +78 -0
- package/dist/agent/commands/share.d.ts +2 -0
- package/dist/agent/commands/share.js +64 -0
- package/dist/agent/commands/status.js +14 -2
- package/dist/agent/commands/types.d.ts +99 -6
- package/dist/agent/commands/update.js +8 -0
- package/dist/agent/commands/usage.d.ts +2 -0
- package/dist/agent/commands/usage.js +8 -0
- package/dist/agent/factory.d.ts +11 -0
- package/dist/agent/factory.js +113 -88
- package/dist/agent/loop_policy.d.ts +6 -3
- package/dist/agent/loop_policy.js +12 -3
- package/dist/agent/measurement_guidance.d.ts +2 -0
- package/dist/agent/measurement_guidance.js +5 -0
- package/dist/agent/request_encoder.d.ts +8 -1
- package/dist/agent/request_encoder.js +95 -23
- package/dist/agent/runtime/benchmark_comparison.d.ts +30 -0
- package/dist/agent/runtime/benchmark_comparison.js +94 -0
- package/dist/agent/runtime/benchmark_contract.d.ts +48 -0
- package/dist/agent/runtime/benchmark_contract.js +90 -0
- package/dist/agent/runtime/checked_commands.d.ts +32 -0
- package/dist/agent/runtime/checked_commands.js +119 -0
- package/dist/agent/runtime/command_execution_policy.d.ts +26 -0
- package/dist/agent/runtime/command_execution_policy.js +91 -0
- package/dist/agent/runtime/command_jobs.d.ts +36 -18
- package/dist/agent/runtime/command_jobs.js +151 -13
- package/dist/agent/runtime/command_panes.d.ts +59 -0
- package/dist/agent/runtime/command_panes.js +398 -0
- package/dist/agent/runtime/command_wait.d.ts +19 -0
- package/dist/agent/runtime/command_wait.js +167 -0
- package/dist/agent/runtime/cpu_benchmark.d.ts +30 -0
- package/dist/agent/runtime/cpu_benchmark.js +126 -0
- package/dist/agent/runtime/delegated_evidence.d.ts +26 -0
- package/dist/agent/runtime/delegated_evidence.js +80 -0
- package/dist/agent/runtime/evidence.d.ts +127 -0
- package/dist/agent/runtime/evidence.js +468 -0
- package/dist/agent/runtime/execution_context.d.ts +7 -0
- package/dist/agent/runtime/execution_context.js +39 -3
- package/dist/agent/runtime/json_verifier_recipe.d.ts +8 -0
- package/dist/agent/runtime/json_verifier_recipe.js +66 -0
- package/dist/agent/runtime/measurements.d.ts +110 -0
- package/dist/agent/runtime/measurements.js +317 -0
- package/dist/agent/runtime/policy.d.ts +4 -0
- package/dist/agent/runtime/policy.js +31 -20
- package/dist/agent/runtime/provider_native_evidence.d.ts +20 -0
- package/dist/agent/runtime/provider_native_evidence.js +86 -0
- package/dist/agent/runtime/recovery.d.ts +2 -0
- package/dist/agent/runtime/recovery.js +45 -2
- package/dist/agent/runtime/remote_broker_transport.d.ts +10 -0
- package/dist/agent/runtime/remote_broker_transport.js +84 -0
- package/dist/agent/runtime/remote_deletion_receipts.d.ts +3 -0
- package/dist/agent/runtime/remote_deletion_receipts.js +43 -0
- package/dist/agent/runtime/remote_journal_replay.d.ts +13 -0
- package/dist/agent/runtime/remote_journal_replay.js +233 -0
- package/dist/agent/runtime/remote_mutation_journal.d.ts +25 -0
- package/dist/agent/runtime/remote_mutation_journal.js +208 -0
- package/dist/agent/runtime/remote_resource_endpoint.d.ts +7 -0
- package/dist/agent/runtime/remote_resource_endpoint.js +6 -0
- package/dist/agent/runtime/remote_resource_errors.d.ts +5 -0
- package/dist/agent/runtime/remote_resource_errors.js +9 -0
- package/dist/agent/runtime/remote_resource_script.d.ts +2 -0
- package/dist/agent/runtime/remote_resource_script.js +1009 -0
- package/dist/agent/runtime/remote_resources.d.ts +29 -0
- package/dist/agent/runtime/remote_resources.js +160 -0
- package/dist/agent/runtime/source_verification.d.ts +12 -0
- package/dist/agent/runtime/source_verification.js +210 -0
- package/dist/agent/runtime/source_verification_contract.d.ts +75 -0
- package/dist/agent/runtime/source_verification_contract.js +203 -0
- package/dist/agent/runtime/tool_checkpoints.d.ts +11 -0
- package/dist/agent/runtime/tool_checkpoints.js +26 -0
- package/dist/agent/runtime/tool_effects.d.ts +5 -0
- package/dist/agent/runtime/tool_progress.d.ts +12 -0
- package/dist/agent/runtime/tool_progress.js +76 -0
- package/dist/agent/runtime/tool_runtime.d.ts +16 -1
- package/dist/agent/runtime/tool_runtime.js +204 -10
- package/dist/agent/runtime/tracing.d.ts +1 -1
- package/dist/agent/runtime/verifier_capture.d.ts +9 -0
- package/dist/agent/runtime/verifier_capture.js +100 -0
- package/dist/agent/runtime/verifier_contract.d.ts +24 -0
- package/dist/agent/runtime/verifier_contract.js +41 -0
- package/dist/agent/subagent.d.ts +20 -10
- package/dist/agent/subagent.js +266 -29
- package/dist/agent/tool_response_directory.d.ts +24 -0
- package/dist/agent/tool_response_directory.js +61 -0
- package/dist/agent/tool_response_source.d.ts +8 -0
- package/dist/agent/tool_response_source.js +49 -0
- package/dist/agent/tool_response_store.d.ts +75 -4
- package/dist/agent/tool_response_store.js +583 -64
- package/dist/agent/tools/ask_user.d.ts +3 -1
- package/dist/agent/tools/ask_user.js +30 -11
- package/dist/agent/tools/background.js +1 -0
- package/dist/agent/tools/benchmark_cpu.d.ts +2 -0
- package/dist/agent/tools/benchmark_cpu.js +102 -0
- package/dist/agent/tools/compare_benchmarks.d.ts +2 -0
- package/dist/agent/tools/compare_benchmarks.js +53 -0
- package/dist/agent/tools/deferred.js +1 -0
- package/dist/agent/tools/delegate.js +18 -2
- package/dist/agent/tools/helper_requirements.d.ts +7 -0
- package/dist/agent/tools/helper_requirements.js +19 -0
- package/dist/agent/tools/index.d.ts +1 -0
- package/dist/agent/tools/index.js +3 -0
- package/dist/agent/tools/measurement_report.d.ts +22 -0
- package/dist/agent/tools/measurement_report.js +190 -0
- package/dist/agent/tools/pane.d.ts +0 -7
- package/dist/agent/tools/pane.js +5 -4
- package/dist/agent/tools/project_context.d.ts +3 -0
- package/dist/agent/tools/project_context.js +45 -0
- package/dist/agent/tools/recall_tool_response.d.ts +3 -5
- package/dist/agent/tools/recall_tool_response.js +19 -29
- package/dist/agent/tools/registry.d.ts +1 -0
- package/dist/agent/tools/registry.js +23 -0
- package/dist/agent/tools/related_sessions.d.ts +2 -0
- package/dist/agent/tools/related_sessions.js +156 -0
- package/dist/agent/tools/routine.js +13 -3
- package/dist/agent/tools/session_evidence.d.ts +3 -0
- package/dist/agent/tools/session_evidence.js +72 -0
- package/dist/agent/tools/shell.d.ts +4 -3
- package/dist/agent/tools/shell.js +174 -47
- package/dist/agent/tools/tool_search.js +3 -2
- package/dist/agent/tools/types.d.ts +28 -0
- package/dist/agent/tools/verify_artifact.d.ts +2 -0
- package/dist/agent/tools/verify_artifact.js +60 -0
- package/dist/agent/tools/workflow.js +1 -0
- package/dist/app/activity.d.ts +6 -1
- package/dist/app/activity.js +81 -12
- package/dist/app/agent_runner.d.ts +6 -1
- package/dist/app/agent_runner.js +34 -19
- package/dist/app/command_context.js +106 -10
- package/dist/app/controller.d.ts +15 -4
- package/dist/app/controller.js +29 -3
- package/dist/app/escape_stop.d.ts +11 -0
- package/dist/app/escape_stop.js +15 -0
- package/dist/app/liveness.d.ts +6 -4
- package/dist/app/liveness.js +13 -3
- package/dist/app/model_catalog_cache.d.ts +5 -0
- package/dist/app/model_catalog_cache.js +138 -0
- package/dist/app/ordered_transcript.js +43 -4
- package/dist/app/prompt_turn.d.ts +14 -0
- package/dist/app/prompt_turn.js +53 -0
- package/dist/app/recap.d.ts +3 -0
- package/dist/app/recap.js +9 -3
- package/dist/app/restart.d.ts +3 -2
- package/dist/app/restart.js +22 -7
- package/dist/app/rewind.d.ts +3 -3
- package/dist/app/rewind.js +3 -3
- package/dist/app/selection_completion.d.ts +17 -2
- package/dist/app/selection_completion.js +84 -9
- package/dist/app/session_manager.d.ts +38 -6
- package/dist/app/session_manager.js +263 -60
- package/dist/app/session_messages.d.ts +3 -0
- package/dist/app/session_messages.js +60 -0
- package/dist/app/task_scope_router.d.ts +20 -0
- package/dist/app/task_scope_router.js +173 -0
- package/dist/app/transcript_window.d.ts +2 -0
- package/dist/app/transcript_window.js +4 -0
- package/dist/app/workspace_admission_details.d.ts +3 -0
- package/dist/app/workspace_admission_details.js +26 -0
- package/dist/app/workspace_layout_controller.d.ts +11 -0
- package/dist/app/workspace_layout_controller.js +88 -0
- package/dist/app/workspace_monitor.d.ts +1 -0
- package/dist/app/workspace_monitor.js +216 -0
- package/dist/app/workspace_presets.d.ts +29 -0
- package/dist/app/workspace_presets.js +192 -0
- package/dist/attention/queue.d.ts +37 -0
- package/dist/attention/queue.js +183 -0
- package/dist/bench/rf_shared.d.ts +2 -0
- package/dist/board/binding.d.ts +42 -0
- package/dist/board/binding.js +38 -0
- package/dist/board/client.d.ts +42 -0
- package/dist/board/client.js +60 -0
- package/dist/cli.js +1 -1
- package/dist/cli_args.js +19 -17
- package/dist/cli_main.js +110 -13
- package/dist/cli_ratatui.d.ts +183 -16
- package/dist/cli_ratatui.js +3989 -1255
- package/dist/components/ActivityLine.d.ts +3 -2
- package/dist/components/ActivityLine.js +2 -2
- package/dist/components/InputArea.d.ts +19 -1
- package/dist/components/InputArea.js +264 -190
- package/dist/components/MessageList.d.ts +2 -0
- package/dist/components/MessageList.js +3 -1
- package/dist/components/SingleMessage.d.ts +2 -0
- package/dist/components/SingleMessage.js +4 -2
- package/dist/components/StatusBar.d.ts +4 -2
- package/dist/components/StatusBar.js +3 -1
- package/dist/conductor_branch.js +3 -0
- package/dist/config/api_retry.d.ts +6 -1
- package/dist/config/api_retry.js +19 -1
- package/dist/config/defaults.d.ts +2 -1
- package/dist/config/defaults.js +9 -2
- package/dist/config/message_display.d.ts +1 -0
- package/dist/config/message_display.js +17 -2
- package/dist/config/permissions.d.ts +21 -0
- package/dist/config/permissions.js +89 -0
- package/dist/config/resolved.d.ts +2 -2
- package/dist/config/types.d.ts +32 -5
- package/dist/config.d.ts +38 -4
- package/dist/config.js +290 -42
- package/dist/context/project_intelligence.d.ts +44 -0
- package/dist/context/project_intelligence.js +246 -0
- package/dist/desktop/cli_launch.d.ts +8 -0
- package/dist/desktop/cli_launch.js +6 -0
- package/dist/desktop/cli_shim.d.ts +8 -0
- package/dist/desktop/cli_shim.js +120 -0
- package/dist/desktop/runtime.d.ts +16 -0
- package/dist/desktop/runtime.js +161 -0
- package/dist/desktop/worker_launch.d.ts +7 -0
- package/dist/desktop/worker_launch.js +7 -0
- package/dist/diagnostics/cargo_mutants_selection.d.ts +27 -0
- package/dist/diagnostics/cargo_mutants_selection.js +48 -0
- package/dist/diagnostics/native_terminal_benchmark.d.ts +58 -0
- package/dist/diagnostics/native_terminal_benchmark.js +1247 -0
- package/dist/diagnostics/session_evidence_package.d.ts +40 -0
- package/dist/diagnostics/session_evidence_package.js +234 -0
- package/dist/diagnostics/session_export.d.ts +93 -0
- package/dist/diagnostics/session_export.js +634 -0
- package/dist/emulation/tool_adapters.js +48 -18
- package/dist/emulation/ztc_addendum.d.ts +1 -0
- package/dist/emulation/ztc_addendum.js +13 -12
- package/dist/environment/service_runner.d.ts +1 -0
- package/dist/environment/service_runner.js +68 -0
- package/dist/environment/store.d.ts +120 -0
- package/dist/environment/store.js +387 -0
- package/dist/events.d.ts +40 -1
- package/dist/events.js +10 -17
- package/dist/goal_contract.d.ts +25 -0
- package/dist/goal_contract.js +44 -0
- package/dist/headless.d.ts +31 -0
- package/dist/headless.js +578 -70
- package/dist/headless_cli.js +8 -0
- package/dist/headless_cli_args.d.ts +1 -0
- package/dist/headless_cli_args.js +1 -0
- package/dist/intake/cli.d.ts +1 -0
- package/dist/intake/cli.js +33 -0
- package/dist/intake/format.d.ts +2 -0
- package/dist/intake/format.js +14 -0
- package/dist/intake/notifications.d.ts +16 -0
- package/dist/intake/notifications.js +132 -0
- package/dist/intake/store.d.ts +56 -0
- package/dist/intake/store.js +238 -0
- package/dist/library.d.ts +8 -0
- package/dist/library.js +19 -10
- package/dist/mcp/client.d.ts +1 -0
- package/dist/mcp/client.js +20 -0
- package/dist/modes/builtin/plan.yaml +2 -2
- package/dist/modes/handlers.js +1 -1
- package/dist/onboarding/first_run.d.ts +3 -0
- package/dist/onboarding/first_run.js +33 -25
- package/dist/onboarding/setup.d.ts +32 -0
- package/dist/onboarding/setup.js +133 -0
- package/dist/onboarding/setup_agent_health.d.ts +17 -0
- package/dist/onboarding/setup_agent_health.js +79 -0
- package/dist/onboarding/setup_environment.d.ts +66 -0
- package/dist/onboarding/setup_environment.js +219 -0
- package/dist/onboarding/setup_workspace.d.ts +17 -0
- package/dist/onboarding/setup_workspace.js +129 -0
- package/dist/optimize/adapters/index.d.ts +4 -1
- package/dist/optimize/adapters/index.js +7 -0
- package/dist/optimize/adapters/kernelbench.js +14 -5
- package/dist/optimize/adapters/popcorn.js +3 -2
- package/dist/optimize/adapters/profile_benchmark.js +13 -7
- package/dist/optimize/adapters/rfbench.js +25 -14
- package/dist/optimize/adapters/types.d.ts +3 -0
- package/dist/optimize/adapters/zergpod.js +5 -2
- package/dist/optimize/baseline.js +10 -21
- package/dist/optimize/branch.js +9 -12
- package/dist/optimize/combine.js +2 -3
- package/dist/optimize/executor.js +34 -48
- package/dist/optimize/measurements.d.ts +55 -0
- package/dist/optimize/measurements.js +173 -0
- package/dist/optimize/results.d.ts +1 -0
- package/dist/optimize/results.js +11 -33
- package/dist/optimize/tge.js +2 -1
- package/dist/panes/initial_input.d.ts +19 -0
- package/dist/panes/initial_input.js +206 -0
- package/dist/panes/labels.d.ts +16 -0
- package/dist/panes/labels.js +42 -0
- package/dist/panes/model_catalog.d.ts +3 -3
- package/dist/panes/model_catalog.js +28 -4
- package/dist/panes/pane_registry.js +6 -2
- package/dist/panes/types.d.ts +3 -0
- package/dist/panes/ztc_launch.js +19 -0
- package/dist/plugin/optimization.d.ts +2 -0
- package/dist/plugin/optimization.js +1 -0
- package/dist/plugin/runtime.d.ts +2 -0
- package/dist/plugin/simulation.d.ts +6 -1
- package/dist/plugin/simulation_contract.d.ts +836 -1
- package/dist/plugin/simulation_documents.d.ts +22 -0
- package/dist/plugin/simulation_documents.js +1 -0
- package/dist/plugin/simulation_interventions.d.ts +103 -0
- package/dist/plugin/simulation_interventions.js +1 -0
- package/dist/plugin/simulation_living.d.ts +1 -0
- package/dist/plugin/simulation_living.js +3 -0
- package/dist/plugin/simulation_meetings.d.ts +121 -0
- package/dist/plugin/simulation_meetings.js +1 -0
- package/dist/plugin/simulation_story_review.d.ts +111 -0
- package/dist/plugin/simulation_story_review.js +1 -0
- package/dist/plugin/simulation_storyteller.d.ts +91 -0
- package/dist/plugin/simulation_storyteller.js +1 -0
- package/dist/plugin/simulation_structured.d.ts +2 -0
- package/dist/plugin/simulation_structured.js +2 -0
- package/dist/plugin/simulation_toolkit.d.ts +21 -0
- package/dist/plugin/simulation_toolkit.js +24 -0
- package/dist/prompts/tool_delegate_task.j2 +1 -1
- package/dist/remote-broker/Dockerfile +10 -0
- package/dist/remote-broker/archive.py +1227 -0
- package/dist/remote-broker/cutover.py +761 -0
- package/dist/remote-broker/requirements.txt +5 -0
- package/dist/remote-broker/resources.json +6 -0
- package/dist/remote-broker/resources.write-staging.example.json +18 -0
- package/dist/remote-broker/retained.py +686 -0
- package/dist/remote-broker/retained_cleanup.py +550 -0
- package/dist/remote-broker/server.py +648 -0
- package/dist/remote-broker/worker.py +1007 -0
- package/dist/router_auth.d.ts +31 -0
- package/dist/router_auth.js +155 -9
- package/dist/runbooks/catalog.d.ts +3 -0
- package/dist/runbooks/catalog.js +26 -0
- package/dist/runbooks/library.d.ts +11 -0
- package/dist/runbooks/library.js +95 -0
- package/dist/runbooks/package.d.ts +43 -0
- package/dist/runbooks/package.js +102 -0
- package/dist/session.d.ts +65 -13
- package/dist/session.js +548 -43
- package/dist/session_handoff.d.ts +25 -0
- package/dist/session_handoff.js +322 -0
- package/dist/session_handoff_contract.d.ts +89 -0
- package/dist/session_handoff_contract.js +179 -0
- package/dist/session_media.d.ts +41 -0
- package/dist/session_media.js +357 -0
- package/dist/session_ownership.d.ts +16 -0
- package/dist/session_ownership.js +221 -0
- package/dist/session_public.d.ts +10 -2
- package/dist/session_public.js +6 -1
- package/dist/simulation/dynamic_history.d.ts +42 -0
- package/dist/simulation/dynamic_history.js +173 -0
- package/dist/simulation/engines/swarm/pane_manager.js +7 -6
- package/dist/simulation/inference.d.ts +3 -1
- package/dist/simulation/inference.js +19 -1
- package/dist/simulation/intervention_generation.d.ts +27 -0
- package/dist/simulation/intervention_generation.js +246 -0
- package/dist/simulation/intervention_material.d.ts +4 -0
- package/dist/simulation/intervention_material.js +81 -0
- package/dist/simulation/living/context.d.ts +3130 -0
- package/dist/simulation/living/context.js +944 -0
- package/dist/simulation/living/definer.d.ts +12 -0
- package/dist/simulation/living/definer.js +223 -0
- package/dist/simulation/living/definition.d.ts +257 -0
- package/dist/simulation/living/definition.js +341 -0
- package/dist/simulation/living/frame.d.ts +259 -0
- package/dist/simulation/living/frame.js +223 -0
- package/dist/simulation/living/identifiers.d.ts +2 -0
- package/dist/simulation/living/identifiers.js +12 -0
- package/dist/simulation/living/index.d.ts +15 -0
- package/dist/simulation/living/index.js +15 -0
- package/dist/simulation/living/inference.d.ts +219 -0
- package/dist/simulation/living/inference.js +576 -0
- package/dist/simulation/living/mechanics.d.ts +54 -0
- package/dist/simulation/living/mechanics.js +588 -0
- package/dist/simulation/living/model-input.d.ts +25 -0
- package/dist/simulation/living/model-input.js +215 -0
- package/dist/simulation/living/open-world.d.ts +257 -0
- package/dist/simulation/living/open-world.js +102 -0
- package/dist/simulation/living/projection.d.ts +7 -0
- package/dist/simulation/living/projection.js +31 -0
- package/dist/simulation/living/recall.d.ts +17 -0
- package/dist/simulation/living/recall.js +25 -0
- package/dist/simulation/living/reduce.d.ts +15 -0
- package/dist/simulation/living/reduce.js +1853 -0
- package/dist/simulation/living/replay.d.ts +6 -0
- package/dist/simulation/living/replay.js +22 -0
- package/dist/simulation/living/runtime.d.ts +140 -0
- package/dist/simulation/living/runtime.js +3020 -0
- package/dist/simulation/living/shared-kinds.d.ts +24 -0
- package/dist/simulation/living/shared-kinds.js +96 -0
- package/dist/simulation/living/types.d.ts +2785 -0
- package/dist/simulation/living/types.js +669 -0
- package/dist/simulation/llm.d.ts +3 -1
- package/dist/simulation/llm.js +90 -30
- package/dist/simulation/memory/embedding.d.ts +1 -1
- package/dist/simulation/memory/embedding.js +9 -3
- package/dist/simulation/memory/filesystem.d.ts +2 -0
- package/dist/simulation/memory/filesystem.js +5 -1
- package/dist/simulation/memory/filesystem_file_tree.d.ts +4 -1
- package/dist/simulation/memory/filesystem_file_tree.js +41 -10
- package/dist/simulation/memory/filesystem_invariants.js +1 -2
- package/dist/simulation/memory/filesystem_types.d.ts +1 -0
- package/dist/simulation/memory/memory.d.ts +2 -0
- package/dist/simulation/memory/memory.js +5 -1
- package/dist/simulation/orchestration/intent.js +0 -2
- package/dist/simulation/orchestration/lifecycle.js +0 -2
- package/dist/simulation/plugin_host.d.ts +25 -1
- package/dist/simulation/plugin_host.js +334 -17
- package/dist/simulation/session_documents.d.ts +20 -0
- package/dist/simulation/session_documents.js +62 -0
- package/dist/simulation/session_input_validation.d.ts +43 -0
- package/dist/simulation/session_input_validation.js +364 -0
- package/dist/simulation/session_inputs.d.ts +32 -0
- package/dist/simulation/session_inputs.js +154 -0
- package/dist/simulation/telemetry.d.ts +11 -14
- package/dist/simulation/telemetry.js +177 -54
- package/dist/simulation/toolkit/bounded_turns.d.ts +13 -0
- package/dist/simulation/toolkit/bounded_turns.js +80 -0
- package/dist/simulation/toolkit/dynamic_agents.d.ts +25 -0
- package/dist/simulation/toolkit/dynamic_agents.js +218 -0
- package/dist/simulation/toolkit/dynamic_digest.d.ts +1 -0
- package/dist/simulation/toolkit/dynamic_digest.js +8 -0
- package/dist/simulation/toolkit/dynamic_documents.d.ts +7 -0
- package/dist/simulation/toolkit/dynamic_documents.js +71 -0
- package/dist/simulation/toolkit/dynamic_driver.d.ts +8 -0
- package/dist/simulation/toolkit/dynamic_driver.js +269 -0
- package/dist/simulation/toolkit/dynamic_game.d.ts +53 -0
- package/dist/simulation/toolkit/dynamic_game.js +805 -0
- package/dist/simulation/toolkit/dynamic_knowledge.d.ts +15 -0
- package/dist/simulation/toolkit/dynamic_knowledge.js +91 -0
- package/dist/simulation/toolkit/dynamic_mechanics.d.ts +22 -0
- package/dist/simulation/toolkit/dynamic_mechanics.js +910 -0
- package/dist/simulation/toolkit/dynamic_meetings.d.ts +239 -0
- package/dist/simulation/toolkit/dynamic_meetings.js +350 -0
- package/dist/simulation/toolkit/dynamic_progress.d.ts +131 -0
- package/dist/simulation/toolkit/dynamic_progress.js +214 -0
- package/dist/simulation/toolkit/dynamic_projection.d.ts +9 -0
- package/dist/simulation/toolkit/dynamic_projection.js +219 -0
- package/dist/simulation/toolkit/dynamic_runtime.d.ts +412 -0
- package/dist/simulation/toolkit/dynamic_runtime.js +6536 -0
- package/dist/simulation/toolkit/dynamic_state.d.ts +111 -0
- package/dist/simulation/toolkit/dynamic_state.js +1967 -0
- package/dist/simulation/toolkit/dynamic_story_review.d.ts +508 -0
- package/dist/simulation/toolkit/dynamic_story_review.js +333 -0
- package/dist/simulation/toolkit/dynamic_storyteller.d.ts +77 -0
- package/dist/simulation/toolkit/dynamic_storyteller.js +114 -0
- package/dist/simulation/toolkit/dynamic_storyteller_runtime.d.ts +26 -0
- package/dist/simulation/toolkit/dynamic_storyteller_runtime.js +126 -0
- package/dist/simulation/toolkit/dynamic_world.d.ts +22 -0
- package/dist/simulation/toolkit/dynamic_world.js +377 -0
- package/dist/simulation/toolkit/structured_output.d.ts +5 -0
- package/dist/simulation/toolkit/structured_output.js +321 -0
- package/dist/simulation/types/world.d.ts +2 -0
- package/dist/simulation/world/artifact_store.js +1 -1
- package/dist/simulation/world/memory_manager.d.ts +5 -0
- package/dist/simulation/world/memory_manager.js +17 -2
- package/dist/simulation/world/state.d.ts +3 -2
- package/dist/simulation/world/state.js +15 -5
- package/dist/skills/bundled/measurement-validation/SKILL.md +144 -0
- package/dist/terminal_attach.d.ts +1 -0
- package/dist/terminal_attach.js +113 -0
- package/dist/tool_progress.d.ts +3 -0
- package/dist/tool_progress.js +27 -0
- package/dist/types.d.ts +145 -10
- package/dist/types.js +3 -0
- package/dist/ui/core/input.d.ts +3 -0
- package/dist/ui/core/input_segments.d.ts +18 -1
- package/dist/ui/core/input_segments.js +131 -47
- package/dist/ui/core/input_state.d.ts +12 -0
- package/dist/ui/core/layout_yoga.d.ts +1 -1
- package/dist/ui/core/turn_metadata.d.ts +5 -0
- package/dist/ui/core/turn_metadata.js +22 -0
- package/dist/ui/ink/render.d.ts +2 -1
- package/dist/ui/ink/render.js +6 -5
- package/dist/ui/ratatui/headless_pane_manager.d.ts +14 -1
- package/dist/ui/ratatui/headless_pane_manager.js +293 -104
- package/dist/ui/ratatui/index.d.ts +1 -0
- package/dist/ui/ratatui/input.d.ts +4 -0
- package/dist/ui/ratatui/input.js +15 -0
- package/dist/ui/ratatui/ipc_path.d.ts +2 -0
- package/dist/ui/ratatui/ipc_path.js +29 -1
- package/dist/ui/ratatui/mux_persistence.d.ts +3 -1
- package/dist/ui/ratatui/mux_persistence.js +139 -1
- package/dist/ui/ratatui/pane_relay.d.ts +1 -1
- package/dist/ui/ratatui/pane_relay.js +55 -27
- package/dist/ui/ratatui/process.d.ts +17 -1
- package/dist/ui/ratatui/process.js +80 -7
- package/dist/ui/ratatui/protocol.d.ts +236 -1
- package/dist/ui/ratatui/protocol.js +90 -0
- package/dist/ui/scrollback.d.ts +2 -1
- package/dist/ui/scrollback.js +9 -4
- package/dist/ui/stream_typewriter.d.ts +8 -3
- package/dist/ui/stream_typewriter.js +30 -1
- package/dist/ui/streaming_scrollback.d.ts +1 -0
- package/dist/ui/streaming_scrollback.js +1 -1
- package/dist/ui/transcript_render_cache.js +10 -0
- package/dist/ui/views/activity_line.d.ts +5 -3
- package/dist/ui/views/activity_line.js +65 -7
- package/dist/ui/views/app.d.ts +6 -3
- package/dist/ui/views/app.js +17 -6
- package/dist/ui/views/completion_menu.js +10 -5
- package/dist/ui/views/input_area.d.ts +7 -3
- package/dist/ui/views/input_area.js +15 -9
- package/dist/ui/views/message_list.d.ts +4 -1
- package/dist/ui/views/message_list.js +89 -19
- package/dist/ui/views/queue_panel.d.ts +3 -1
- package/dist/ui/views/queue_panel.js +9 -2
- package/dist/ui/views/status_bar.d.ts +4 -2
- package/dist/ui/views/status_bar.js +28 -13
- package/dist/ui/views/theme.d.ts +2 -0
- package/dist/ui/views/theme.js +2 -0
- package/dist/ui/widgets/color_panel.js +18 -0
- package/dist/ui/widgets/form.js +8 -0
- package/dist/ui/widgets/log_view.js +7 -0
- package/dist/ui/widgets/navigator_panel.js +8 -0
- package/dist/ui/widgets/prompt_viewer.js +2 -0
- package/dist/ui/widgets/questionnaire.d.ts +2 -0
- package/dist/ui/widgets/questionnaire.js +79 -16
- package/dist/ui/widgets/resume_panel.d.ts +2 -0
- package/dist/ui/widgets/resume_panel.js +26 -15
- package/dist/ui/widgets/rewind_panel.d.ts +2 -2
- package/dist/ui/widgets/rewind_panel.js +4 -2
- package/dist/ui/widgets/select.js +16 -27
- package/dist/ui/widgets/settings_panel.js +16 -0
- package/dist/ui/widgets/status_line_panel.d.ts +1 -0
- package/dist/ui/widgets/status_line_panel.js +30 -4
- package/dist/ui/widgets/text_input.d.ts +2 -0
- package/dist/ui/widgets/text_input.js +15 -1
- package/dist/ui/widgets/types.d.ts +2 -0
- package/dist/usage_projection.d.ts +24 -0
- package/dist/usage_projection.js +130 -0
- package/dist/usage_snapshot.d.ts +36 -0
- package/dist/usage_snapshot.js +131 -0
- package/dist/utils/assistant_message.d.ts +2 -0
- package/dist/utils/assistant_message.js +5 -0
- package/dist/utils/atomic_write.d.ts +6 -2
- package/dist/utils/atomic_write.js +29 -4
- package/dist/utils/checked_shell.d.ts +25 -0
- package/dist/utils/checked_shell.js +107 -0
- package/dist/utils/compaction.d.ts +4 -1
- package/dist/utils/compaction.js +31 -7
- package/dist/utils/context.d.ts +4 -4
- package/dist/utils/context.js +14 -12
- package/dist/utils/deepseek.d.ts +2 -2
- package/dist/utils/deepseek.js +13 -5
- package/dist/utils/ephemeral.js +4 -0
- package/dist/utils/ephemeral_tools.d.ts +18 -0
- package/dist/utils/ephemeral_tools.js +97 -0
- package/dist/utils/jev_client.d.ts +4 -0
- package/dist/utils/jev_client.js +15 -0
- package/dist/utils/model_cache.d.ts +15 -0
- package/dist/utils/model_cache.js +143 -0
- package/dist/utils/models.d.ts +4 -2
- package/dist/utils/models.js +12 -16
- package/dist/utils/reasoning.d.ts +8 -1
- package/dist/utils/reasoning.js +31 -11
- package/dist/utils/router_catalog.d.ts +49 -0
- package/dist/utils/router_catalog.js +271 -0
- package/dist/utils/sandbox.d.ts +9 -0
- package/dist/utils/sandbox.js +118 -15
- package/dist/utils/shell.d.ts +7 -0
- package/dist/utils/shell.js +98 -34
- package/dist/utils/subprocess_env.d.ts +3 -0
- package/dist/utils/subprocess_env.js +27 -1
- package/dist/web/accounts_mirror.d.ts +3 -1
- package/dist/web/accounts_mirror.js +13 -9
- package/dist/web/child_publication.d.ts +17 -0
- package/dist/web/child_publication.js +45 -0
- package/dist/web/mirror_authenticator.d.ts +31 -11
- package/dist/web/mirror_authenticator.js +67 -17
- package/dist/web/mirror_client.d.ts +31 -4
- package/dist/web/mirror_client.js +189 -23
- package/dist/web/mirror_stream.d.ts +84 -22
- package/dist/web/mirror_stream.js +676 -95
- package/dist/web/observer_query_redaction.d.ts +6 -0
- package/dist/web/observer_query_redaction.js +58 -0
- package/dist/web/pane_registry.d.ts +2 -0
- package/dist/web/pane_registry.js +86 -22
- package/dist/web/tool_image.d.ts +6 -0
- package/dist/web/tool_image.js +17 -0
- package/dist/web/view_plugin.d.ts +14 -0
- package/dist/web/view_plugin.js +23 -1
- package/dist/worker/executor.js +31 -12
- package/dist/worker/index.d.ts +1 -0
- package/dist/worker/toolsets.js +3 -1
- package/dist/worker/types.d.ts +12 -1
- package/dist/workflows/registry.js +1 -0
- package/dist/workflows/registry_handle.d.ts +2 -0
- package/dist/workflows/runtime.d.ts +2 -0
- package/dist/workflows/runtime.js +1 -0
- package/dist/workspace_agent.d.ts +7 -0
- package/dist/workspace_agent.js +36 -0
- package/dist/workspace_collision.d.ts +76 -0
- package/dist/workspace_collision.js +688 -0
- package/dist/workspace_layout.d.ts +18 -0
- package/dist/workspace_layout.js +121 -0
- package/dist/workspace_runtime.d.ts +44 -0
- package/dist/workspace_runtime.js +82 -0
- package/dist/workspace_session_context.d.ts +62 -0
- package/dist/workspace_session_context.js +160 -0
- package/dist/zlm-embed.mjs +32518 -9615
- package/dist/zlm.js +1 -0
- package/node_modules/@zerg/model-contracts/LICENSE.md +375 -0
- package/node_modules/@zerg/model-contracts/README.md +90 -0
- package/node_modules/@zerg/model-contracts/index.d.ts +20 -0
- package/node_modules/@zerg/model-contracts/index.js +223 -0
- package/node_modules/@zerg/model-contracts/package.json +8 -0
- package/node_modules/glob/node_modules/brace-expansion/index.js +78 -22
- package/node_modules/glob/node_modules/brace-expansion/package.json +1 -1
- package/node_modules/readdir-glob/node_modules/brace-expansion/index.js +78 -22
- package/node_modules/readdir-glob/node_modules/brace-expansion/package.json +1 -1
- package/package.json +45 -24
- package/packages/model-contracts/LICENSE.md +375 -0
- package/packages/model-contracts/README.md +90 -0
- package/packages/model-contracts/index.d.ts +20 -0
- package/packages/model-contracts/index.js +223 -0
- package/packages/model-contracts/package.json +8 -0
- package/remote-broker/Dockerfile +10 -0
- package/remote-broker/README.md +308 -0
- package/remote-broker/archive.py +1227 -0
- package/remote-broker/cutover.py +761 -0
- package/remote-broker/requirements.txt +5 -0
- package/remote-broker/resources.example.json +6 -0
- package/remote-broker/resources.write-staging.example.json +18 -0
- package/remote-broker/retained.py +686 -0
- package/remote-broker/retained_cleanup.py +550 -0
- package/remote-broker/server.py +648 -0
- package/scripts/build-remote-broker.mjs +13 -0
- package/scripts/ensure-local-packages.mjs +6 -0
- package/scripts/node-pty-helpers.mjs +103 -0
|
@@ -1,7 +1,45 @@
|
|
|
1
1
|
import { resolveExecutionSettings } from '../../config/execution.js';
|
|
2
|
+
import { isHealthyManagedCommandRead } from '../loop_policy.js';
|
|
3
|
+
import { COMMAND_EXECUTION_POLICY_MAX_BYTES, parseCommandExecutionObservation, parseCommandExecutionPolicy, } from './command_execution_policy.js';
|
|
4
|
+
const encoder = new TextEncoder();
|
|
5
|
+
/** Recognize only the terminal foreground formatter suffix; shape is not provenance. */
|
|
6
|
+
function failureDiagnostics(content) {
|
|
7
|
+
const marker = '\nexecution: ';
|
|
8
|
+
const position = content.lastIndexOf(marker);
|
|
9
|
+
if (position < 0)
|
|
10
|
+
return content;
|
|
11
|
+
const prefix = content.slice(0, position);
|
|
12
|
+
if (!/(?:^|\n)Command failed \(exit \d+\):\n/.test(prefix))
|
|
13
|
+
return content;
|
|
14
|
+
const suffix = content.slice(position + marker.length).match(/^([^\n]*)(\n\nhint: [^\n]*)?$/);
|
|
15
|
+
if (!suffix || encoder.encode(suffix[1]).byteLength > COMMAND_EXECUTION_POLICY_MAX_BYTES)
|
|
16
|
+
return content;
|
|
17
|
+
let value;
|
|
18
|
+
try {
|
|
19
|
+
value = JSON.parse(suffix[1]);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return content;
|
|
23
|
+
}
|
|
24
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value))
|
|
25
|
+
return content;
|
|
26
|
+
const row = value;
|
|
27
|
+
const keys = Object.keys(row);
|
|
28
|
+
const policyOnly = keys.length === 1 && keys[0] === 'execution_policy';
|
|
29
|
+
const withObservation = keys.length === 3
|
|
30
|
+
&& keys.every(key => ['execution_policy', 'observed_at', 'elapsed_ms'].includes(key));
|
|
31
|
+
if (!policyOnly && !withObservation)
|
|
32
|
+
return content;
|
|
33
|
+
const policy = parseCommandExecutionPolicy(row.execution_policy);
|
|
34
|
+
if (!policy || policy.mode !== 'foreground')
|
|
35
|
+
return content;
|
|
36
|
+
if (withObservation && !parseCommandExecutionObservation({ observed_at: row.observed_at, elapsed_ms: row.elapsed_ms }, policy.started_at))
|
|
37
|
+
return content;
|
|
38
|
+
return prefix + (suffix[2] ?? '');
|
|
39
|
+
}
|
|
2
40
|
/** Group failures by cause rather than command spelling, paths, or changing IDs. */
|
|
3
41
|
export function normalizeFailure(content) {
|
|
4
|
-
const text = content.toLowerCase();
|
|
42
|
+
const text = failureDiagnostics(content).toLowerCase();
|
|
5
43
|
if (/not_executed/.test(text))
|
|
6
44
|
return '';
|
|
7
45
|
for (const [pattern, cause] of [
|
|
@@ -27,10 +65,15 @@ export function createRecoveryGuard(settings) {
|
|
|
27
65
|
let neutralSteps = 0;
|
|
28
66
|
const observations = new Set();
|
|
29
67
|
return (results) => {
|
|
68
|
+
// Waiting preserves every part of an unrelated failed-effect budget. It is
|
|
69
|
+
// neither a new success nor another neutral recovery attempt.
|
|
70
|
+
const considered = results.filter(result => result.isError || !isHealthyManagedCommandRead(result.managedCommand));
|
|
71
|
+
if (results.length > 0 && considered.length === 0)
|
|
72
|
+
return 'continue';
|
|
30
73
|
let failed = false;
|
|
31
74
|
let progress = false;
|
|
32
75
|
let neutral = false;
|
|
33
|
-
for (const result of
|
|
76
|
+
for (const result of considered) {
|
|
34
77
|
if (result.isError) {
|
|
35
78
|
const next = normalizeFailure(result.content);
|
|
36
79
|
if (!next)
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { RemoteResource, RemoteResourceTransport } from './remote_resources.js';
|
|
2
|
+
export interface RemoteBrokerConfiguration {
|
|
3
|
+
url: string;
|
|
4
|
+
/** Host environment variable containing the broker credential; never a model argument. */
|
|
5
|
+
tokenEnv: string;
|
|
6
|
+
/** Explicit host-only development exception, limited to numeric loopback addresses. */
|
|
7
|
+
allowInsecureLoopback?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/** Resolve the host endpoint and credential before reserving a mutation. */
|
|
10
|
+
export declare function makeRemoteBrokerTransport(resource: Readonly<RemoteResource>): RemoteResourceTransport;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { isIP } from 'node:net';
|
|
2
|
+
import { remoteResourceEndpoint } from './remote_resource_endpoint.js';
|
|
3
|
+
import { RemoteResourceRejectedError } from './remote_resource_errors.js';
|
|
4
|
+
const maximumBytes = 8 * 1024 * 1024;
|
|
5
|
+
/** Resolve the host endpoint and credential before reserving a mutation. */
|
|
6
|
+
export function makeRemoteBrokerTransport(resource) {
|
|
7
|
+
const broker = resource.broker;
|
|
8
|
+
if (!broker)
|
|
9
|
+
throw new Error('An immutable RPC broker is required for guarded remote execution; legacy SSH is unavailable');
|
|
10
|
+
const url = new URL(broker.url);
|
|
11
|
+
const identity = remoteResourceEndpoint(resource);
|
|
12
|
+
if (url.hostname.replace(/^\[|\]$/g, '') !== resource.host || (resource.port !== undefined && resource.port !== identity.port))
|
|
13
|
+
throw new Error('Remote broker URL must match the configured host and port');
|
|
14
|
+
const loopback = url.hostname === '127.0.0.1' || url.hostname === '[::1]';
|
|
15
|
+
if (url.username || url.password || url.hash || url.search || url.pathname !== '/v1/resources'
|
|
16
|
+
|| (url.protocol !== 'https:' && !(url.protocol === 'http:' && broker.allowInsecureLoopback === true && loopback && isIP(url.hostname.replace(/^\[|\]$/g, ''))))) {
|
|
17
|
+
throw new Error('Remote broker requires HTTPS at /v1/resources; only explicitly enabled numeric loopback HTTP is permitted');
|
|
18
|
+
}
|
|
19
|
+
if (typeof broker.tokenEnv !== 'string' || !/^[A-Za-z_][A-Za-z0-9_]{0,127}$/.test(broker.tokenEnv))
|
|
20
|
+
throw new Error('Invalid host broker credential environment variable');
|
|
21
|
+
const token = process.env[broker.tokenEnv];
|
|
22
|
+
if (!token || !/^[!-~]{32,4096}$/.test(token))
|
|
23
|
+
throw new Error('Host broker credential must contain 32 to 4096 ASCII non-whitespace characters');
|
|
24
|
+
const endpoint = url.href;
|
|
25
|
+
return async (_resource, request, signal) => {
|
|
26
|
+
const body = JSON.stringify(request);
|
|
27
|
+
if (Buffer.byteLength(body) > maximumBytes)
|
|
28
|
+
throw new Error('Remote broker request exceeds 8 MiB');
|
|
29
|
+
const controller = new AbortController();
|
|
30
|
+
let timedOut = false;
|
|
31
|
+
const abort = () => controller.abort();
|
|
32
|
+
signal?.addEventListener('abort', abort, { once: true });
|
|
33
|
+
if (signal?.aborted)
|
|
34
|
+
abort();
|
|
35
|
+
const timer = setTimeout(() => { timedOut = true; controller.abort(); }, 30_000);
|
|
36
|
+
try {
|
|
37
|
+
const response = await fetch(endpoint, { method: 'POST', redirect: 'error', signal: controller.signal,
|
|
38
|
+
headers: { Authorization: 'Bearer ' + token, 'Content-Type': 'application/json', Accept: 'application/json' }, body });
|
|
39
|
+
if (!response.body)
|
|
40
|
+
throw new Error('Remote broker returned an empty response');
|
|
41
|
+
const reader = response.body.getReader(), decoder = new TextDecoder();
|
|
42
|
+
let bytes = 0, output = '';
|
|
43
|
+
try {
|
|
44
|
+
while (true) {
|
|
45
|
+
const chunk = await reader.read();
|
|
46
|
+
if (chunk.done)
|
|
47
|
+
break;
|
|
48
|
+
bytes += chunk.value.byteLength;
|
|
49
|
+
if (bytes > maximumBytes)
|
|
50
|
+
throw new Error('Remote broker response exceeds 8 MiB');
|
|
51
|
+
output += decoder.decode(chunk.value, { stream: true });
|
|
52
|
+
}
|
|
53
|
+
output += decoder.decode();
|
|
54
|
+
}
|
|
55
|
+
finally {
|
|
56
|
+
await reader.cancel().catch(() => undefined);
|
|
57
|
+
reader.releaseLock();
|
|
58
|
+
}
|
|
59
|
+
const envelope = JSON.parse(output);
|
|
60
|
+
if (!envelope || typeof envelope !== 'object' || Array.isArray(envelope) || typeof envelope.ok !== 'boolean')
|
|
61
|
+
throw new Error('Invalid remote broker response envelope');
|
|
62
|
+
const diagnostic = typeof envelope.error === 'string' ? envelope.error.slice(0, 2000) : 'Remote broker refused the request';
|
|
63
|
+
if (response.status === 200 && envelope.ok === false && envelope.admitted === false && typeof request.operation_id === 'string' && envelope.operation_id === request.operation_id) {
|
|
64
|
+
throw new RemoteResourceRejectedError(diagnostic, envelope.operation_id);
|
|
65
|
+
}
|
|
66
|
+
if (response.status !== 200 || !envelope.ok)
|
|
67
|
+
throw new Error(`Remote broker failed (${response.status}): ${diagnostic}`);
|
|
68
|
+
if (!envelope.result || typeof envelope.result !== 'object' || Array.isArray(envelope.result))
|
|
69
|
+
throw new Error('Invalid remote broker result');
|
|
70
|
+
return envelope.result;
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
if (timedOut)
|
|
74
|
+
throw new Error('Remote resource request timed out; inspect current lease and target before retrying');
|
|
75
|
+
if (signal?.aborted)
|
|
76
|
+
throw new Error('Remote resource request interrupted; inspect current lease and target before retrying');
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
clearTimeout(timer);
|
|
81
|
+
signal?.removeEventListener('abort', abort);
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** Host-authored reports; model prose is never evidence of a remote effect. */
|
|
2
|
+
export declare function remoteDeletionReport(content: string): string | undefined;
|
|
3
|
+
export declare const NO_VERIFIED_DELETION_REPORT = "Guarded remote session: no verified deletion receipt. Inspect the tool results for observed state; use ask_user for questions or confirmation. Reclaimed quota/free space is unknown.";
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** Host-authored reports; model prose is never evidence of a remote effect. */
|
|
2
|
+
export function remoteDeletionReport(content) {
|
|
3
|
+
let envelope;
|
|
4
|
+
try {
|
|
5
|
+
envelope = JSON.parse(content);
|
|
6
|
+
}
|
|
7
|
+
catch {
|
|
8
|
+
return undefined;
|
|
9
|
+
}
|
|
10
|
+
const value = envelope?.result?.receipt;
|
|
11
|
+
if (!value || typeof value !== 'object')
|
|
12
|
+
return undefined;
|
|
13
|
+
const r = value;
|
|
14
|
+
if (r.operation === 'write')
|
|
15
|
+
return undefined;
|
|
16
|
+
const target = r.target;
|
|
17
|
+
const verification = r.verification;
|
|
18
|
+
const space = r.space;
|
|
19
|
+
const timestamp = (value) => typeof value === 'number' && Number.isFinite(value) && value > 0 && value <= 8.64e12;
|
|
20
|
+
const valid = r.version === 1 && r.operation === 'delete'
|
|
21
|
+
&& typeof r.id === 'string' && /^[a-f0-9]{8}(?:-[a-f0-9]{4}){3}-[a-f0-9]{12}$/.test(r.id)
|
|
22
|
+
&& typeof r.resource_id === 'string' && typeof r.owner_id === 'string'
|
|
23
|
+
&& r.resource_id === envelope.resource && r.owner_id === envelope.requesting_owner_id
|
|
24
|
+
&& Number.isSafeInteger(r.generation) && Number(r.generation) > 0
|
|
25
|
+
&& typeof target?.path === 'string' && target.path.startsWith('/')
|
|
26
|
+
&& Number.isSafeInteger(r.removed_bytes) && Number(r.removed_bytes) >= 0
|
|
27
|
+
&& timestamp(r.started_at)
|
|
28
|
+
&& space?.reclaimed_bytes === null && space.attribution === 'unknown' && space.source === 'not measured' && space.interval === null;
|
|
29
|
+
if (!valid)
|
|
30
|
+
return 'Remote deletion receipt is not verifiable. Target state and reclaimed space are unknown.';
|
|
31
|
+
const reference = `Receipt ${r.id}; target ${JSON.stringify(target.path)}; tool call ${JSON.stringify(r.tool_call_id ?? null)}; owner ${JSON.stringify(r.owner_id)}; lease generation ${r.generation}.`;
|
|
32
|
+
const unknownSpace = 'Reclaimed quota/free space: unknown (not measured; attribution unavailable).';
|
|
33
|
+
if (r.status === 'dry_run' && r.removed_bytes === 0 && verification?.target_absent === null && timestamp(r.completed_at) && r.completed_at >= Number(r.started_at))
|
|
34
|
+
return `Deletion dry run: no target mutation was performed. ${reference} ${unknownSpace}`;
|
|
35
|
+
if (r.status !== 'verified' || verification?.target_absent !== true || !timestamp(verification.checked_at)
|
|
36
|
+
|| !Number.isSafeInteger(target.device) || Number(target.device) < 0
|
|
37
|
+
|| !Number.isSafeInteger(target.inode) || Number(target.inode) <= 0
|
|
38
|
+
|| !timestamp(r.completed_at) || Number(r.started_at) > Number(verification.checked_at) || Number(verification.checked_at) > r.completed_at) {
|
|
39
|
+
return `Deletion ${r.status === 'failed' ? 'failed' : 'outcome unresolved'}: no verified completion. ${reference} ${unknownSpace}`;
|
|
40
|
+
}
|
|
41
|
+
return `Deletion verified at ${new Date(Number(verification.checked_at) * 1000).toISOString()}: target absent at the verification time. ${reference} Removed logical bytes: ${r.removed_bytes}. ${unknownSpace}`;
|
|
42
|
+
}
|
|
43
|
+
export const NO_VERIFIED_DELETION_REPORT = 'Guarded remote session: no verified deletion receipt. Inspect the tool results for observed state; use ask_user for questions or confirmation. Reclaimed quota/free space is unknown.';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { RemoteMutationRecord } from './remote_mutation_journal.js';
|
|
2
|
+
export interface ArchivedMutationPointer {
|
|
3
|
+
id: string;
|
|
4
|
+
archive: string;
|
|
5
|
+
sha256: string;
|
|
6
|
+
kind: 'client' | 'receipt';
|
|
7
|
+
}
|
|
8
|
+
export declare function readBoundedArchiveFile(path: string, limit: number): Buffer;
|
|
9
|
+
export declare function archivedMutation(directory: string, key: unknown[]): ArchivedMutationPointer | undefined;
|
|
10
|
+
export declare function readArchivedMutation(directory: string, pointer: ArchivedMutationPointer): string;
|
|
11
|
+
/** Called only under the journal's existing admission lock. Full records and
|
|
12
|
+
* replay keys are durable before any terminal record leaves the hot scan. */
|
|
13
|
+
export declare function retainTerminalMutations(directory: string, records: readonly RemoteMutationRecord[]): boolean;
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
2
|
+
import { closeSync, constants, fsyncSync, fstatSync, linkSync, lstatSync, mkdirSync, openSync, readSync, renameSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
const hex = /^[a-f0-9]{64}$/, uuid = /^[a-f0-9]{8}(?:-[a-f0-9]{4}){3}-[a-f0-9]{12}$/;
|
|
5
|
+
const digest = (bytes) => createHash('sha256').update(bytes).digest('hex');
|
|
6
|
+
const keysAre = (value, keys) => Object.keys(value).sort().join(',') === keys.sort().join(',');
|
|
7
|
+
const object = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
8
|
+
function present(path) {
|
|
9
|
+
try {
|
|
10
|
+
lstatSync(path);
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
if (error.code === 'ENOENT')
|
|
15
|
+
return false;
|
|
16
|
+
throw error;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function readBoundedArchiveFile(path, limit) {
|
|
20
|
+
const fd = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW | constants.O_NONBLOCK);
|
|
21
|
+
try {
|
|
22
|
+
const info = fstatSync(fd);
|
|
23
|
+
if (!info.isFile() || info.size > limit)
|
|
24
|
+
throw new Error('Replay index or archived record exceeds its regular-file bound');
|
|
25
|
+
const bytes = Buffer.alloc(limit + 1);
|
|
26
|
+
let count = 0;
|
|
27
|
+
while (count <= limit) {
|
|
28
|
+
const got = readSync(fd, bytes, count, limit + 1 - count, null);
|
|
29
|
+
if (!got)
|
|
30
|
+
break;
|
|
31
|
+
count += got;
|
|
32
|
+
}
|
|
33
|
+
if (count > limit)
|
|
34
|
+
throw new Error('Replay index or archived record exceeds its byte bound');
|
|
35
|
+
return bytes.subarray(0, count);
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
closeSync(fd);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function manifest(directory) {
|
|
42
|
+
const root = directory + '.replay';
|
|
43
|
+
if (!present(root) && !present(directory + '.archives') && !present(directory + '.replay-required.json'))
|
|
44
|
+
return undefined;
|
|
45
|
+
try {
|
|
46
|
+
if (!lstatSync(root).isDirectory())
|
|
47
|
+
throw new Error('Replay index root must be a real directory');
|
|
48
|
+
const value = JSON.parse(readBoundedArchiveFile(join(root, 'manifest.json'), 1048576).toString('utf8'));
|
|
49
|
+
if (!object(value) || !keysAre(value, ['version', 'total', 'buckets']) || value.version !== 1 || !Number.isSafeInteger(value.total)
|
|
50
|
+
|| typeof value.total !== 'number' || value.total < 0 || value.total > 1000000 || !object(value.buckets) || Object.keys(value.buckets).length > 4096)
|
|
51
|
+
throw new Error('Invalid bounded replay manifest');
|
|
52
|
+
let count = 0;
|
|
53
|
+
for (const [prefix, bucket] of Object.entries(value.buckets)) {
|
|
54
|
+
if (!/^[a-f0-9]{3}$/.test(prefix) || !object(bucket) || !keysAre(bucket, ['sha256', 'count']) || typeof bucket.sha256 !== 'string' || !hex.test(bucket.sha256)
|
|
55
|
+
|| typeof bucket.count !== 'number' || !Number.isSafeInteger(bucket.count) || bucket.count < 1 || bucket.count > 4096)
|
|
56
|
+
throw new Error('Invalid replay manifest bucket');
|
|
57
|
+
count += bucket.count;
|
|
58
|
+
}
|
|
59
|
+
if (count !== value.total)
|
|
60
|
+
throw new Error('Replay manifest count changed');
|
|
61
|
+
return value;
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
throw new Error('Required replay index manifest is unavailable or invalid', { cause: error });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
function readBucket(directory, prefix, bucket) {
|
|
68
|
+
try {
|
|
69
|
+
if (!lstatSync(join(directory + '.replay', 'objects')).isDirectory())
|
|
70
|
+
throw new Error('Replay objects must be a real directory');
|
|
71
|
+
const bytes = readBoundedArchiveFile(join(directory + '.replay', 'objects', bucket.sha256 + '.json'), 2097152);
|
|
72
|
+
if (digest(bytes) !== bucket.sha256)
|
|
73
|
+
throw new Error('Replay bucket checksum changed');
|
|
74
|
+
const value = JSON.parse(bytes.toString('utf8'));
|
|
75
|
+
if (!object(value) || !keysAre(value, ['version', 'entries']) || value.version !== 1 || !object(value.entries) || Object.keys(value.entries).length !== bucket.count)
|
|
76
|
+
throw new Error('Invalid replay bucket');
|
|
77
|
+
for (const [entry, pointer] of Object.entries(value.entries)) {
|
|
78
|
+
if (!hex.test(entry) || !entry.startsWith(prefix) || !object(pointer) || !keysAre(pointer, ['id', 'archive', 'sha256', 'kind'])
|
|
79
|
+
|| typeof pointer.id !== 'string' || !uuid.test(pointer.id) || typeof pointer.archive !== 'string' || !hex.test(pointer.archive)
|
|
80
|
+
|| typeof pointer.sha256 !== 'string' || !hex.test(pointer.sha256) || typeof pointer.kind !== 'string' || !['client', 'receipt'].includes(pointer.kind))
|
|
81
|
+
throw new Error('Invalid replay bucket pointer');
|
|
82
|
+
}
|
|
83
|
+
return value.entries;
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
throw new Error('Required replay index bucket is unavailable or invalid', { cause: error });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
export function archivedMutation(directory, key) {
|
|
90
|
+
const header = manifest(directory);
|
|
91
|
+
if (!header)
|
|
92
|
+
return undefined;
|
|
93
|
+
const hashed = digest(JSON.stringify(key)), prefix = hashed.slice(0, 3), bucket = header.buckets[prefix];
|
|
94
|
+
return bucket ? readBucket(directory, prefix, bucket)[hashed] : undefined;
|
|
95
|
+
}
|
|
96
|
+
export function readArchivedMutation(directory, pointer) {
|
|
97
|
+
if (pointer.kind !== 'client')
|
|
98
|
+
throw new Error('Archived client record has a different source kind');
|
|
99
|
+
for (const path of [directory + '.archives', join(directory + '.archives', pointer.archive), join(directory + '.archives', pointer.archive, 'records')]) {
|
|
100
|
+
if (!lstatSync(path).isDirectory())
|
|
101
|
+
throw new Error('Archived record directory changed');
|
|
102
|
+
}
|
|
103
|
+
const bytes = readBoundedArchiveFile(join(directory + '.archives', pointer.archive, 'records', pointer.id + '.json'), 1048576);
|
|
104
|
+
if (digest(bytes) !== pointer.sha256)
|
|
105
|
+
throw new Error('Archived record checksum changed; inspect durable exported evidence');
|
|
106
|
+
return bytes.toString('utf8');
|
|
107
|
+
}
|
|
108
|
+
function syncDirectory(path) {
|
|
109
|
+
const fd = openSync(path, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
110
|
+
try {
|
|
111
|
+
fsyncSync(fd);
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
closeSync(fd);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function privateDirectory(path) {
|
|
118
|
+
mkdirSync(path, { recursive: true, mode: 0o700 });
|
|
119
|
+
const info = lstatSync(path);
|
|
120
|
+
if (!info.isDirectory() || (process.platform !== 'win32'
|
|
121
|
+
&& (info.uid !== process.getuid() || (info.mode & 0o077) !== 0))) {
|
|
122
|
+
throw new Error('Runtime archive requires a private real directory');
|
|
123
|
+
}
|
|
124
|
+
syncDirectory(dirname(path));
|
|
125
|
+
}
|
|
126
|
+
function publish(path, bytes, replace = false) {
|
|
127
|
+
if (!replace && present(path)) {
|
|
128
|
+
if (!readBoundedArchiveFile(path, 2097152).equals(bytes))
|
|
129
|
+
throw new Error('Immutable runtime archive changed');
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
const temporary = path + '.tmp-' + randomUUID();
|
|
133
|
+
try {
|
|
134
|
+
const fd = openSync(temporary, 'wx', 0o600);
|
|
135
|
+
try {
|
|
136
|
+
writeFileSync(fd, bytes);
|
|
137
|
+
fsyncSync(fd);
|
|
138
|
+
}
|
|
139
|
+
finally {
|
|
140
|
+
closeSync(fd);
|
|
141
|
+
}
|
|
142
|
+
if (replace)
|
|
143
|
+
renameSync(temporary, path);
|
|
144
|
+
else
|
|
145
|
+
linkSync(temporary, path);
|
|
146
|
+
syncDirectory(dirname(path));
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
try {
|
|
150
|
+
unlinkSync(temporary);
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
if (error.code !== 'ENOENT')
|
|
154
|
+
throw error;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/** Called only under the journal's existing admission lock. Full records and
|
|
159
|
+
* replay keys are durable before any terminal record leaves the hot scan. */
|
|
160
|
+
export function retainTerminalMutations(directory, records) {
|
|
161
|
+
if (records.length < 512)
|
|
162
|
+
return false;
|
|
163
|
+
const selected = records.filter(record => record.status !== 'pending')
|
|
164
|
+
.sort((left, right) => left.id.localeCompare(right.id)).slice(0, 64);
|
|
165
|
+
if (selected.length === 0)
|
|
166
|
+
return false;
|
|
167
|
+
let bytesRead = 0;
|
|
168
|
+
const originals = selected.map(record => {
|
|
169
|
+
const bytes = readBoundedArchiveFile(join(directory, record.id + '.json'), 1048576);
|
|
170
|
+
bytesRead += bytes.length;
|
|
171
|
+
if (bytesRead > 128 * 1048576)
|
|
172
|
+
throw new Error('Runtime archive exceeds its bounded batch byte budget');
|
|
173
|
+
return { record, bytes, sha256: digest(bytes) };
|
|
174
|
+
});
|
|
175
|
+
const batch = digest(JSON.stringify(originals.map(({ record, sha256 }) => [record.id, sha256])));
|
|
176
|
+
const header = manifest(directory) ?? { version: 1, total: 0, buckets: {} };
|
|
177
|
+
privateDirectory(directory + '.replay');
|
|
178
|
+
privateDirectory(join(directory + '.replay', 'objects'));
|
|
179
|
+
// Creating the index root makes missing/damaged manifests fail closed even
|
|
180
|
+
// if the process stops before publishing the first cold archive directory.
|
|
181
|
+
if (!present(join(directory + '.replay', 'manifest.json'))) {
|
|
182
|
+
publish(join(directory + '.replay', 'manifest.json'), Buffer.from(JSON.stringify(header)));
|
|
183
|
+
}
|
|
184
|
+
publish(directory + '.replay-required.json', Buffer.from('{"version":1}'));
|
|
185
|
+
const archive = join(directory + '.archives', batch, 'records');
|
|
186
|
+
for (const path of [directory + '.archives', dirname(archive), archive])
|
|
187
|
+
privateDirectory(path);
|
|
188
|
+
const additions = new Map();
|
|
189
|
+
for (const { record, bytes, sha256 } of originals) {
|
|
190
|
+
publish(join(archive, record.id + '.json'), bytes);
|
|
191
|
+
const pointer = { id: record.id, archive: batch, sha256, kind: 'client' };
|
|
192
|
+
const keys = [['operation', record.id]];
|
|
193
|
+
if (record.tool_call_id !== null)
|
|
194
|
+
keys.push(['call', record.endpoint.host, record.endpoint.user,
|
|
195
|
+
record.endpoint.port, record.owner_id, record.tool_call_id]);
|
|
196
|
+
for (const key of keys) {
|
|
197
|
+
const hashed = digest(JSON.stringify(key)), prefix = hashed.slice(0, 3);
|
|
198
|
+
let entries = additions.get(prefix);
|
|
199
|
+
if (!entries) {
|
|
200
|
+
entries = header.buckets[prefix] ? readBucket(directory, prefix, header.buckets[prefix]) : {};
|
|
201
|
+
additions.set(prefix, entries);
|
|
202
|
+
}
|
|
203
|
+
const previous = entries[hashed];
|
|
204
|
+
if (previous && (previous.id !== pointer.id || previous.sha256 !== pointer.sha256 || previous.kind !== 'client')) {
|
|
205
|
+
throw new Error('Conflicting original runtime archive linkage; preserve active records');
|
|
206
|
+
}
|
|
207
|
+
if (!previous)
|
|
208
|
+
entries[hashed] = pointer;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
for (const [prefix, entries] of additions) {
|
|
212
|
+
const bytes = Buffer.from(JSON.stringify({ version: 1, entries }));
|
|
213
|
+
const count = Object.keys(entries).length;
|
|
214
|
+
if (count > 4096 || bytes.length > 2097152)
|
|
215
|
+
throw new Error('Replay bucket is full; existing protection cannot be discarded');
|
|
216
|
+
header.total += count - (header.buckets[prefix]?.count ?? 0);
|
|
217
|
+
const sha256 = digest(bytes);
|
|
218
|
+
publish(join(directory + '.replay', 'objects', sha256 + '.json'), bytes);
|
|
219
|
+
header.buckets[prefix] = { sha256, count };
|
|
220
|
+
}
|
|
221
|
+
const encoded = Buffer.from(JSON.stringify(header));
|
|
222
|
+
if (header.total > 1000000 || encoded.length > 1048576)
|
|
223
|
+
throw new Error('Runtime replay index exceeds its bounded key budget');
|
|
224
|
+
publish(join(directory + '.replay', 'manifest.json'), encoded, true);
|
|
225
|
+
for (const { record, bytes } of originals) {
|
|
226
|
+
const path = join(directory, record.id + '.json');
|
|
227
|
+
if (!readBoundedArchiveFile(path, 1048576).equals(bytes))
|
|
228
|
+
throw new Error('Active runtime archive record changed before retirement');
|
|
229
|
+
unlinkSync(path);
|
|
230
|
+
}
|
|
231
|
+
syncDirectory(directory);
|
|
232
|
+
return true;
|
|
233
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { RemoteResource, RemoteResourceSession } from './remote_resources.js';
|
|
2
|
+
export interface RemoteMutationRecord {
|
|
3
|
+
version: 1;
|
|
4
|
+
id: string;
|
|
5
|
+
status: 'pending' | 'resolved' | 'not_dispatched';
|
|
6
|
+
operation: 'write' | 'delete';
|
|
7
|
+
owner_id: string;
|
|
8
|
+
resource_id: string;
|
|
9
|
+
endpoint: {
|
|
10
|
+
host: string;
|
|
11
|
+
user: string;
|
|
12
|
+
port: number;
|
|
13
|
+
};
|
|
14
|
+
target: string;
|
|
15
|
+
requested_path: string;
|
|
16
|
+
tool_call_id: string | null;
|
|
17
|
+
}
|
|
18
|
+
export declare function remoteMutationJournalDirectory(session: RemoteResourceSession): string;
|
|
19
|
+
export declare function admitRemoteMutation(session: RemoteResourceSession, resource: RemoteResource, operation: 'write' | 'delete', args: Record<string, unknown>): RemoteMutationRecord;
|
|
20
|
+
export declare function resolveRemoteMutation(session: RemoteResourceSession, id: string, status?: 'resolved' | 'not_dispatched'): void;
|
|
21
|
+
export declare function findRemoteMutation(session: RemoteResourceSession, id: string): RemoteMutationRecord | undefined;
|
|
22
|
+
export declare function pendingRemoteMutations(session: RemoteResourceSession, resource: RemoteResource): {
|
|
23
|
+
operations: Readonly<RemoteMutationRecord>[];
|
|
24
|
+
count: number;
|
|
25
|
+
};
|