@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
|
@@ -4,96 +4,242 @@
|
|
|
4
4
|
* Eliminates duplicated session logic between TUI (cli_ratatui.ts) and headless (headless.ts).
|
|
5
5
|
* Each renderer provides its own deps for message access and logging.
|
|
6
6
|
*/
|
|
7
|
-
import {
|
|
7
|
+
import { randomUUID } from 'node:crypto';
|
|
8
|
+
import { createUsageSnapshot, mergeUsageSnapshots } from '../usage_snapshot.js';
|
|
9
|
+
import { createDiagnosticSnapshot, captureSessionDiagnosticSnapshot, mergeDiagnosticSnapshots, recordDiagnosticEvent } from '../diagnostics/session_export.js';
|
|
10
|
+
import { saveSession, saveSessionToFile, saveMuxStateOnly, cleanupOldSessions, retainCurrentSession, loadSessionFromFile } from '../session.js';
|
|
8
11
|
import { pruneZtcTempDirs } from '../utils/ztc_cleanup.js';
|
|
9
12
|
import { configStore } from '../config.js';
|
|
10
|
-
import { estimateConversationTokens, formatTokenCount, getContextStatus, contextStatusFromUsed, resolveAutoCompact, } from '../utils/context.js';
|
|
13
|
+
import { estimateConversationTokens, formatTokenCount, getContextStatus, getContextWindowSize, contextStatusFromUsed, resolveAutoCompact, } from '../utils/context.js';
|
|
11
14
|
import { compactConversation, describeCompaction, compactMessages, smartSummarizer, localSummarizer } from '../utils/compaction.js';
|
|
12
|
-
import {
|
|
15
|
+
import { prepareSessionMessages } from './session_messages.js';
|
|
13
16
|
/**
|
|
14
17
|
* Manages session persistence, auto-save timers, and context compaction.
|
|
15
18
|
*/
|
|
16
19
|
export class SessionManager {
|
|
17
20
|
deps;
|
|
21
|
+
diagnostics = createDiagnosticSnapshot();
|
|
22
|
+
usage = createUsageSnapshot();
|
|
23
|
+
jobDiagnosticStates = new Map();
|
|
18
24
|
autoSaveTimer = null;
|
|
19
25
|
saveQueue = Promise.resolve();
|
|
20
|
-
|
|
26
|
+
muxSnapshot;
|
|
27
|
+
muxCapture = null;
|
|
28
|
+
muxGeneration = 0;
|
|
29
|
+
cleanupPromise = null;
|
|
21
30
|
constructor(deps) {
|
|
22
31
|
this.deps = deps;
|
|
23
32
|
}
|
|
24
33
|
setSessionId(sessionId) {
|
|
34
|
+
if (this.deps.sessionId !== sessionId) {
|
|
35
|
+
this.diagnostics = createDiagnosticSnapshot();
|
|
36
|
+
this.usage = createUsageSnapshot();
|
|
37
|
+
this.jobDiagnosticStates.clear();
|
|
38
|
+
this.muxSnapshot = undefined;
|
|
39
|
+
this.muxCapture = null;
|
|
40
|
+
this.muxGeneration++;
|
|
41
|
+
}
|
|
25
42
|
this.deps.sessionId = sessionId;
|
|
26
43
|
}
|
|
44
|
+
/** Capture the current agent before replacement, then return detached canonical facts. */
|
|
45
|
+
getDiagnostics() {
|
|
46
|
+
const current = this.deps.getRuntimeState?.().diagnostics;
|
|
47
|
+
if (current)
|
|
48
|
+
this.diagnostics = mergeDiagnosticSnapshots(this.diagnostics, current);
|
|
49
|
+
this.diagnostics = captureSessionDiagnosticSnapshot({ messages: this.deps.getMessages(), diagnostics: this.diagnostics });
|
|
50
|
+
return structuredClone(this.diagnostics);
|
|
51
|
+
}
|
|
52
|
+
restoreDiagnostics(snapshot) {
|
|
53
|
+
if (snapshot)
|
|
54
|
+
this.diagnostics = mergeDiagnosticSnapshots(this.diagnostics, snapshot);
|
|
55
|
+
}
|
|
56
|
+
getUsageSnapshot() {
|
|
57
|
+
const current = this.deps.getRuntimeState?.().usage;
|
|
58
|
+
if (current)
|
|
59
|
+
this.usage = mergeUsageSnapshots(this.usage, current);
|
|
60
|
+
return structuredClone(this.usage);
|
|
61
|
+
}
|
|
62
|
+
restoreUsageSnapshot(snapshot) {
|
|
63
|
+
if (snapshot)
|
|
64
|
+
this.usage = mergeUsageSnapshots(this.usage, snapshot);
|
|
65
|
+
}
|
|
66
|
+
recordHostDiagnostic(kind, data) {
|
|
67
|
+
this.diagnostics = recordDiagnosticEvent(this.diagnostics, {
|
|
68
|
+
id: randomUUID(), kind, origin: 'host', storedRole: null,
|
|
69
|
+
timestamp: new Date().toISOString(), data,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
recordCommandJob(job) {
|
|
73
|
+
// Observation polling must not create duplicate transitions or imply fresh output.
|
|
74
|
+
const state = JSON.stringify([job.status, job.ended_at ?? null, job.exit_code ?? null]);
|
|
75
|
+
if (this.jobDiagnosticStates.get(job.job_id) === state)
|
|
76
|
+
return;
|
|
77
|
+
this.jobDiagnosticStates.set(job.job_id, state);
|
|
78
|
+
this.recordHostDiagnostic('job', {
|
|
79
|
+
jobId: job.job_id, status: job.status, command: job.command, cwd: job.cwd,
|
|
80
|
+
startedAt: job.started_at, endedAt: job.ended_at ?? null, exitCode: job.exit_code ?? null,
|
|
81
|
+
error: job.error ?? null, logReference: job.log_path, logAvailability: 'not_verified',
|
|
82
|
+
outputTruncated: job.output_truncated ?? null, droppedBytes: job.dropped_bytes ?? null,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
27
85
|
/**
|
|
28
86
|
* Run one-time cleanup of stale sessions and temp dirs.
|
|
29
87
|
* Called after session load so we never delete a session the caller
|
|
30
88
|
* is about to resume.
|
|
31
89
|
*/
|
|
32
90
|
runStartupCleanup() {
|
|
33
|
-
if (this.
|
|
34
|
-
return;
|
|
35
|
-
this.
|
|
36
|
-
|
|
37
|
-
|
|
91
|
+
if (this.cleanupPromise)
|
|
92
|
+
return this.cleanupPromise;
|
|
93
|
+
this.cleanupPromise = (async () => {
|
|
94
|
+
if (!this.deps.sessionFile) {
|
|
95
|
+
try {
|
|
96
|
+
await retainCurrentSession(this.deps.getSessionCwd?.() ?? process.cwd(), this.deps.sessionId);
|
|
97
|
+
await cleanupOldSessions(this.deps.getSessionCwd?.() ?? process.cwd(), configStore.get().sessionRetentionCount ?? null);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
this.deps.debugLog(`[SessionManager.cleanup] Session retention skipped: ${error.message}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
await pruneZtcTempDirs().catch(() => { });
|
|
104
|
+
})();
|
|
105
|
+
return this.cleanupPromise;
|
|
38
106
|
}
|
|
39
107
|
/**
|
|
40
108
|
* Save the current session, filtering out ephemeral system messages.
|
|
41
109
|
*/
|
|
42
110
|
async save(options = {}) {
|
|
111
|
+
options.signal?.throwIfAborted();
|
|
112
|
+
// Start a fresh renderer projection outside the durability queue. Required
|
|
113
|
+
// admission saves wait only briefly, retaining the last detached projection
|
|
114
|
+
// if the renderer is unavailable; a responsive renderer supplies its current
|
|
115
|
+
// layout even on the first required save.
|
|
116
|
+
if (options.captureLayout ?? true) {
|
|
117
|
+
const capture = this.refreshMuxState();
|
|
118
|
+
if (options.required && options.captureLayout !== true) {
|
|
119
|
+
let timer;
|
|
120
|
+
try {
|
|
121
|
+
await Promise.race([capture, new Promise(resolve => { timer = setTimeout(resolve, 250); })]);
|
|
122
|
+
}
|
|
123
|
+
finally {
|
|
124
|
+
clearTimeout(timer);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
else
|
|
128
|
+
await capture;
|
|
129
|
+
}
|
|
130
|
+
options.signal?.throwIfAborted();
|
|
43
131
|
const pendingSave = this.saveQueue.then(() => this.writeCurrentSession(options));
|
|
44
132
|
this.saveQueue = pendingSave.catch(() => { });
|
|
45
133
|
return pendingSave;
|
|
46
134
|
}
|
|
135
|
+
async refreshMuxState() {
|
|
136
|
+
if (!this.deps.getMuxState)
|
|
137
|
+
return;
|
|
138
|
+
if (this.muxCapture)
|
|
139
|
+
return this.muxCapture;
|
|
140
|
+
const generation = this.muxGeneration;
|
|
141
|
+
const read = this.deps.getMuxState;
|
|
142
|
+
const capture = (async () => {
|
|
143
|
+
try {
|
|
144
|
+
const state = await read.call(this.deps);
|
|
145
|
+
if (generation === this.muxGeneration && state !== undefined)
|
|
146
|
+
this.muxSnapshot = structuredClone(state);
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
this.deps.debugLog(`[SessionManager.save] Optional layout unavailable: ${String(error)}`);
|
|
150
|
+
}
|
|
151
|
+
})();
|
|
152
|
+
this.muxCapture = capture;
|
|
153
|
+
try {
|
|
154
|
+
await capture;
|
|
155
|
+
}
|
|
156
|
+
finally {
|
|
157
|
+
if (this.muxCapture === capture)
|
|
158
|
+
this.muxCapture = null;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
47
161
|
async writeCurrentSession(options) {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
162
|
+
options.signal?.throwIfAborted();
|
|
163
|
+
await this.deps.flushToolResponses?.();
|
|
164
|
+
const muxState = structuredClone(this.muxSnapshot);
|
|
165
|
+
// Capture transcript and runtime together after raw receipt durability;
|
|
166
|
+
// optional layout replies never gate required restart state.
|
|
167
|
+
const messages = structuredClone(this.deps.getMessages());
|
|
168
|
+
const capturedRuntime = this.deps.getRuntimeState ? structuredClone(this.deps.getRuntimeState()) : undefined;
|
|
169
|
+
if (capturedRuntime?.diagnostics)
|
|
170
|
+
this.restoreDiagnostics(capturedRuntime.diagnostics);
|
|
171
|
+
if (capturedRuntime?.usage)
|
|
172
|
+
this.restoreUsageSnapshot(capturedRuntime.usage);
|
|
173
|
+
this.diagnostics = captureSessionDiagnosticSnapshot({ messages, diagnostics: this.diagnostics });
|
|
174
|
+
const hasDiagnostics = this.diagnostics.events.length > 0 || this.diagnostics.omittedEvents > 0
|
|
175
|
+
|| this.diagnostics.omittedTextBytes > 0;
|
|
176
|
+
const hasUsage = this.usage.receipts.length > 0 || this.usage.omittedReceipts > 0;
|
|
177
|
+
const runtimeState = {
|
|
178
|
+
...capturedRuntime,
|
|
179
|
+
authMode: configStore.getResolvedAuthMode(),
|
|
180
|
+
routerOrigin: configStore.getResolvedAuthMode() === 'direct' ? undefined : configStore.get().zergProxyUrl,
|
|
181
|
+
...(hasUsage ? { usage: structuredClone(this.usage) } : {}),
|
|
182
|
+
...(hasDiagnostics ? { diagnostics: structuredClone(this.diagnostics) } : {}),
|
|
183
|
+
};
|
|
184
|
+
const hostedSettings = this.deps.getHostedSettings ? structuredClone(this.deps.getHostedSettings()) : undefined;
|
|
185
|
+
const paneSpecs = this.deps.getPaneSpecs ? structuredClone(this.deps.getPaneSpecs()) : undefined;
|
|
186
|
+
const hasRuntimeState = runtimeState !== undefined && (runtimeState.environment != null
|
|
187
|
+
|| runtimeState.mode !== undefined
|
|
53
188
|
|| runtimeState.planFile !== undefined
|
|
54
189
|
|| runtimeState.artifactPath !== undefined
|
|
55
190
|
// A live goal counts as runtime state worth persisting on its own; a null
|
|
56
191
|
// goal (serialize() with no goal) does not, so empty sessions stay unwritten.
|
|
57
|
-
|| runtimeState.goal != null
|
|
192
|
+
|| runtimeState.goal != null
|
|
193
|
+
|| Boolean(runtimeState.evidence?.records.length)
|
|
194
|
+
|| hasDiagnostics
|
|
195
|
+
|| hasUsage);
|
|
58
196
|
if (messages.length === 0 && !muxState && !hasRuntimeState && !options.persistEmpty)
|
|
59
197
|
return;
|
|
60
|
-
|
|
61
|
-
// See utils/ephemeral.ts — messages are dropped if either (a) they carry
|
|
62
|
-
// `metadata.ephemeral === true` or (b) they match a legacy content prefix
|
|
63
|
-
// (for backward compat with already-persisted sessions).
|
|
64
|
-
const TOOL_RESULT_PERSIST_CAP = 2000;
|
|
65
|
-
const persistMessages = stripEphemeralMessages(messages).map(m => {
|
|
66
|
-
if (!m.metadata?.toolResult)
|
|
67
|
-
return m;
|
|
68
|
-
// Truncate tool_result content for session persistence — the full
|
|
69
|
-
// output is redundant (buildRequest truncates old results anyway)
|
|
70
|
-
// and bloats the session file.
|
|
71
|
-
try {
|
|
72
|
-
const results = JSON.parse(m.content);
|
|
73
|
-
const trimmed = results.map(r => ({
|
|
74
|
-
...r,
|
|
75
|
-
content: r.content.length > TOOL_RESULT_PERSIST_CAP
|
|
76
|
-
? r.content.slice(0, TOOL_RESULT_PERSIST_CAP) + '…'
|
|
77
|
-
: r.content,
|
|
78
|
-
}));
|
|
79
|
-
return { ...m, content: JSON.stringify(trimmed) };
|
|
80
|
-
}
|
|
81
|
-
catch {
|
|
82
|
-
return m;
|
|
83
|
-
}
|
|
84
|
-
});
|
|
198
|
+
const persistMessages = prepareSessionMessages(messages);
|
|
85
199
|
try {
|
|
86
200
|
const model = configStore.getModel();
|
|
87
201
|
const provider = configStore.getProvider();
|
|
88
|
-
|
|
202
|
+
let writtenPath;
|
|
89
203
|
if (this.deps.sessionFile) {
|
|
90
|
-
await saveSessionToFile(this.deps.sessionFile, this.deps.sessionId, process.cwd(), persistMessages, model, provider, muxState, paneSpecs, runtimeState, hostedSettings);
|
|
204
|
+
writtenPath = await saveSessionToFile(this.deps.sessionFile, this.deps.sessionId, this.deps.getSessionCwd?.() ?? process.cwd(), persistMessages, model, provider, muxState, paneSpecs, runtimeState, hostedSettings, options.signal);
|
|
91
205
|
this.deps.debugLog(`[SessionManager.save] Saved ${this.deps.sessionId} to ${this.deps.sessionFile} (${persistMessages.length} messages)`);
|
|
92
206
|
}
|
|
93
207
|
else {
|
|
94
|
-
await saveSession(this.deps.sessionId, process.cwd(), persistMessages, model, provider, muxState, paneSpecs, runtimeState, hostedSettings);
|
|
208
|
+
writtenPath = await saveSession(this.deps.sessionId, this.deps.getSessionCwd?.() ?? process.cwd(), persistMessages, model, provider, muxState, paneSpecs, runtimeState, hostedSettings, options.signal);
|
|
95
209
|
this.deps.debugLog(`[SessionManager.save] Saved ${this.deps.sessionId} with ${persistMessages.length} messages`);
|
|
96
210
|
}
|
|
211
|
+
if (this.deps.onCheckpoint || persistMessages.some(message => message.attachments?.length)) {
|
|
212
|
+
const saved = await loadSessionFromFile(writtenPath, false);
|
|
213
|
+
if (!saved)
|
|
214
|
+
throw new Error('Written session checkpoint could not be read back.');
|
|
215
|
+
// The writer detaches its checkpoint before adopting uploaded images.
|
|
216
|
+
// Rebind only unchanged live sources after the canonical commit; never
|
|
217
|
+
// replace messages that arrived or were edited while disk I/O yielded.
|
|
218
|
+
// Preserve attachment object identity for already captured steering and
|
|
219
|
+
// queue owners, which may still hold that exact accepted upload.
|
|
220
|
+
const current = this.deps.getMessages();
|
|
221
|
+
let rebound = false;
|
|
222
|
+
for (const message of current) {
|
|
223
|
+
const source = persistMessages.find(candidate => candidate.id === message.id
|
|
224
|
+
&& candidate.role === message.role && candidate.content === message.content);
|
|
225
|
+
const committed = saved.messages.find(candidate => candidate.id === message.id);
|
|
226
|
+
if (!source || !committed)
|
|
227
|
+
continue;
|
|
228
|
+
for (const attachment of message.attachments ?? []) {
|
|
229
|
+
const captured = source.attachments?.find(candidate => candidate.id === attachment.id);
|
|
230
|
+
const durable = committed.attachments?.find(candidate => candidate.id === attachment.id);
|
|
231
|
+
if (!captured || !durable?.durable
|
|
232
|
+
|| JSON.stringify(attachment) !== JSON.stringify(captured)
|
|
233
|
+
|| JSON.stringify(attachment) === JSON.stringify(durable))
|
|
234
|
+
continue;
|
|
235
|
+
Object.assign(attachment, durable);
|
|
236
|
+
rebound = true;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
if (rebound)
|
|
240
|
+
this.deps.setMessages([...current]);
|
|
241
|
+
this.deps.onCheckpoint?.(saved);
|
|
242
|
+
}
|
|
97
243
|
}
|
|
98
244
|
catch (err) {
|
|
99
245
|
const msg = err.message;
|
|
@@ -117,11 +263,12 @@ export class SessionManager {
|
|
|
117
263
|
async saveMuxOnly() {
|
|
118
264
|
if (!this.deps.getMuxState)
|
|
119
265
|
return false;
|
|
120
|
-
|
|
266
|
+
await this.refreshMuxState();
|
|
267
|
+
const muxState = structuredClone(this.muxSnapshot);
|
|
121
268
|
if (!muxState)
|
|
122
269
|
return false;
|
|
123
270
|
try {
|
|
124
|
-
return await saveMuxStateOnly(this.deps.sessionId, process.cwd(), muxState);
|
|
271
|
+
return await saveMuxStateOnly(this.deps.sessionId, this.deps.getSessionCwd?.() ?? process.cwd(), muxState);
|
|
125
272
|
}
|
|
126
273
|
catch (err) {
|
|
127
274
|
this.deps.debugLog(`[SessionManager.saveMuxOnly] Error: ${err.message}`);
|
|
@@ -153,8 +300,8 @@ export class SessionManager {
|
|
|
153
300
|
// /context); fall back to the char/4 estimate only before the first API call.
|
|
154
301
|
const realUsed = this.deps.getContextTokens?.() ?? 0;
|
|
155
302
|
const status = realUsed > 0
|
|
156
|
-
? contextStatusFromUsed(realUsed, model, this.deps.getContextWindow?.())
|
|
157
|
-
: getContextStatus(messages, model);
|
|
303
|
+
? contextStatusFromUsed(realUsed, model, (configStore.getModelContextWindow(model) !== undefined ? configStore.getModelContextWindow(model) : this.deps.getContextWindow?.()))
|
|
304
|
+
: getContextStatus(messages, model, configStore.getModelContextWindow(model));
|
|
158
305
|
const threshold = opts?.threshold ?? configStore.getAutoCompactThreshold();
|
|
159
306
|
const targetPercent = configStore.getCompactionTargetPercent();
|
|
160
307
|
const triggerMode = configStore.getCompactionTriggerMode();
|
|
@@ -164,7 +311,7 @@ export class SessionManager {
|
|
|
164
311
|
const decision = resolveAutoCompact({
|
|
165
312
|
used: realUsed > 0 ? realUsed : estimateConversationTokens(messages),
|
|
166
313
|
model,
|
|
167
|
-
windowOverride: this.deps.getContextWindow?.(),
|
|
314
|
+
windowOverride: (configStore.getModelContextWindow(model) !== undefined ? configStore.getModelContextWindow(model) : this.deps.getContextWindow?.()),
|
|
168
315
|
thresholdPercent: threshold,
|
|
169
316
|
triggerMode,
|
|
170
317
|
tokenBudget: configStore.getContextTokenBudget(),
|
|
@@ -176,13 +323,17 @@ export class SessionManager {
|
|
|
176
323
|
role: 'system',
|
|
177
324
|
content: `Context ${Math.round(status.percentage)}% full. Auto-compacting...`,
|
|
178
325
|
});
|
|
179
|
-
const
|
|
326
|
+
const onUsage = this.deps.getUsageObserver?.();
|
|
327
|
+
const activityFinished = onUsage?.workerStarted?.();
|
|
328
|
+
const summarizer = this.buildSummarizer(onUsage);
|
|
329
|
+
const checkpointSources = this.captureCheckpointSources(messages);
|
|
180
330
|
try {
|
|
181
331
|
const compaction = configStore.getCompactionSettings();
|
|
182
332
|
const result = await compactConversation(messages, model, {
|
|
183
333
|
method: compaction.method,
|
|
184
334
|
jev: compaction.jev,
|
|
185
335
|
summarizer,
|
|
336
|
+
onUsage,
|
|
186
337
|
targetPercentage: targetPercent,
|
|
187
338
|
keepRecentMin: 10,
|
|
188
339
|
targetTokens: decision.targetTokens,
|
|
@@ -198,8 +349,8 @@ export class SessionManager {
|
|
|
198
349
|
});
|
|
199
350
|
return false;
|
|
200
351
|
}
|
|
201
|
-
this.deps.setMessages(result.messages);
|
|
202
|
-
const newStatus = getContextStatus(result.messages, model);
|
|
352
|
+
this.deps.setMessages(this.preserveCheckpointSources(result.messages, checkpointSources));
|
|
353
|
+
const newStatus = getContextStatus(result.messages, model, configStore.getModelContextWindow(model));
|
|
203
354
|
const verb = describeCompaction(result);
|
|
204
355
|
this.deps.addMessage({
|
|
205
356
|
role: 'system',
|
|
@@ -215,6 +366,9 @@ export class SessionManager {
|
|
|
215
366
|
this.deps.debugLog(`[SessionManager.maybeAutoCompact] Error: ${err.message}`);
|
|
216
367
|
return false;
|
|
217
368
|
}
|
|
369
|
+
finally {
|
|
370
|
+
activityFinished?.();
|
|
371
|
+
}
|
|
218
372
|
}
|
|
219
373
|
/**
|
|
220
374
|
* Force compaction regardless of threshold (aggressive settings).
|
|
@@ -225,16 +379,23 @@ export class SessionManager {
|
|
|
225
379
|
if (messages.length < 3)
|
|
226
380
|
return false;
|
|
227
381
|
const model = configStore.getModel();
|
|
228
|
-
const
|
|
382
|
+
const onUsage = this.deps.getUsageObserver?.();
|
|
383
|
+
const activityFinished = onUsage?.workerStarted?.();
|
|
384
|
+
const summarizer = this.buildSummarizer(onUsage);
|
|
385
|
+
const checkpointSources = this.captureCheckpointSources(messages);
|
|
229
386
|
this.deps.debugLog('[SessionManager.forceCompact] Forcing aggressive compaction');
|
|
230
387
|
try {
|
|
231
|
-
|
|
388
|
+
// A provider can reject request structure before its token window fills.
|
|
389
|
+
// Forced recovery must shrink even when the history already fits 30% of
|
|
390
|
+
// that window; otherwise the next request repeats the same rejection.
|
|
391
|
+
const targetTokens = Math.max(1, Math.min(Math.floor((getContextWindowSize(model, configStore.getModelContextWindow(model)) || estimateConversationTokens(messages)) * 0.3), Math.floor(estimateConversationTokens(messages) / 2)));
|
|
392
|
+
const result = await compactMessages(messages, model, summarizer, 30, 5, targetTokens);
|
|
232
393
|
if (result.removed === 0) {
|
|
233
394
|
this.deps.debugLog('[SessionManager.forceCompact] Nothing to compact — all messages are recent or system');
|
|
234
395
|
return false;
|
|
235
396
|
}
|
|
236
|
-
this.deps.setMessages(result.messages);
|
|
237
|
-
const newStatus = getContextStatus(result.messages, model);
|
|
397
|
+
this.deps.setMessages(this.preserveCheckpointSources(result.messages, checkpointSources));
|
|
398
|
+
const newStatus = getContextStatus(result.messages, model, configStore.getModelContextWindow(model));
|
|
238
399
|
this.deps.debugLog(`[SessionManager.forceCompact] Compacted ${result.removed} msgs: ${formatTokenCount(result.tokensBefore)} → ${formatTokenCount(result.tokensAfter)} (${Math.round(newStatus.percentage)}%)`);
|
|
239
400
|
return true;
|
|
240
401
|
}
|
|
@@ -242,6 +403,9 @@ export class SessionManager {
|
|
|
242
403
|
this.deps.debugLog(`[SessionManager.forceCompact] Error: ${err.message}`);
|
|
243
404
|
return false;
|
|
244
405
|
}
|
|
406
|
+
finally {
|
|
407
|
+
activityFinished?.();
|
|
408
|
+
}
|
|
245
409
|
}
|
|
246
410
|
/**
|
|
247
411
|
* Start periodic auto-save.
|
|
@@ -261,15 +425,54 @@ export class SessionManager {
|
|
|
261
425
|
this.autoSaveTimer = null;
|
|
262
426
|
}
|
|
263
427
|
}
|
|
264
|
-
/**
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
428
|
+
/** Capture source signatures before awaiting, including IDs of ordinary rows. */
|
|
429
|
+
captureCheckpointSources(messages) {
|
|
430
|
+
// A summarizer may evict settled calls. Retain their actual sources first.
|
|
431
|
+
this.getDiagnostics();
|
|
432
|
+
return new Map(messages.map(message => [message.id, this.checkpointSourceState(message)]));
|
|
433
|
+
}
|
|
434
|
+
checkpointSourceState(message) {
|
|
435
|
+
return message.toolCalls?.length || message.metadata?.toolResult === true
|
|
436
|
+
|| message.metadata?.toolCheckpoint === true || message.metadata?.taskHandoffCorrection
|
|
437
|
+
? JSON.stringify(message) : null;
|
|
438
|
+
}
|
|
439
|
+
/** Preserve current invocation and correction sources without restoring old settled history. */
|
|
440
|
+
preserveCheckpointSources(compacted, before) {
|
|
441
|
+
const required = new Set((this.deps.getRuntimeState?.().taskHandoffInput?.corrections ?? [])
|
|
442
|
+
.filter(correction => correction.deliveryState !== 'delivered')
|
|
443
|
+
.map(correction => correction.sourceMessageId));
|
|
444
|
+
const live = this.deps.getMessages();
|
|
445
|
+
const byId = new Map(live.map(message => [message.id, message]));
|
|
446
|
+
const unresolved = (message) => Boolean(message.toolCalls?.some(call => call.status === 'pending'
|
|
447
|
+
|| call.status === 'running' || (call.result === undefined && call.error === undefined)));
|
|
448
|
+
const changed = (message) => {
|
|
449
|
+
const state = this.checkpointSourceState(message);
|
|
450
|
+
return state !== null && (!before.has(message.id) || before.get(message.id) !== state);
|
|
451
|
+
};
|
|
452
|
+
const rebound = compacted.map(message => {
|
|
453
|
+
const current = byId.get(message.id);
|
|
454
|
+
if (!current)
|
|
455
|
+
return message;
|
|
456
|
+
return unresolved(message) || unresolved(current) || required.has(message.id)
|
|
457
|
+
|| current.metadata?.taskHandoffCorrection || changed(current) ? structuredClone(current) : message;
|
|
458
|
+
});
|
|
459
|
+
const retained = new Set(rebound.map(message => message.id));
|
|
460
|
+
const sources = live.filter(message => {
|
|
461
|
+
const raw = message.metadata?.taskHandoffCorrection;
|
|
462
|
+
const pending = raw && typeof raw === 'object' && 'deliveryState' in raw && raw.deliveryState !== 'delivered';
|
|
463
|
+
return !retained.has(message.id) && (required.has(message.id) || pending || unresolved(message) || changed(message));
|
|
464
|
+
});
|
|
465
|
+
// Accepted corrections and original unresolved calls are never replaced
|
|
466
|
+
// by a summarizer's guess about delivery or completion. Read live state
|
|
467
|
+
// after the summarizer awaits so newly accepted sources also survive.
|
|
468
|
+
return [...rebound, ...structuredClone(sources)];
|
|
469
|
+
}
|
|
470
|
+
buildSummarizer(onUsage) {
|
|
268
471
|
const provider = configStore.getProvider();
|
|
269
472
|
const apiKey = configStore.getApiKey(provider);
|
|
270
473
|
return async (msgs) => {
|
|
271
474
|
if (apiKey) {
|
|
272
|
-
return smartSummarizer(msgs, { provider, apiKey });
|
|
475
|
+
return smartSummarizer(msgs, { provider, apiKey, onUsage });
|
|
273
476
|
}
|
|
274
477
|
return localSummarizer(msgs);
|
|
275
478
|
};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { describeDiagnosticTruncation, redactDiagnosticValue } from '../diagnostics/session_export.js';
|
|
2
|
+
import { stripEphemeralMessages } from '../utils/ephemeral.js';
|
|
3
|
+
/** Preserve authored sources while bounding historical tool-result copies. */
|
|
4
|
+
export function prepareSessionMessages(messages) {
|
|
5
|
+
const TOOL_RESULT_PERSIST_CAP = 2000;
|
|
6
|
+
// Argument labels can identify credentials echoed without labels in output.
|
|
7
|
+
// Hash the same redacted source as the diagnostic ledger, before trimming it.
|
|
8
|
+
const credentialContext = messages.map(message => ({
|
|
9
|
+
content: message.content, args: message.toolCalls?.map(call => call.args) ?? [],
|
|
10
|
+
}));
|
|
11
|
+
return stripEphemeralMessages(messages).map(m => {
|
|
12
|
+
if (!m.metadata?.toolResult)
|
|
13
|
+
return m;
|
|
14
|
+
// Truncate tool_result content for session persistence — the full
|
|
15
|
+
// output is redundant (buildRequest truncates old results anyway)
|
|
16
|
+
// and bloats the session file.
|
|
17
|
+
try {
|
|
18
|
+
const results = JSON.parse(m.content);
|
|
19
|
+
const truncations = {};
|
|
20
|
+
const trimmed = results.map(r => {
|
|
21
|
+
if (typeof r.content !== 'string' || r.content.length <= TOOL_RESULT_PERSIST_CAP)
|
|
22
|
+
return r;
|
|
23
|
+
const content = r.content.slice(0, TOOL_RESULT_PERSIST_CAP) + '…';
|
|
24
|
+
const prior = m.metadata?.toolResultTruncation;
|
|
25
|
+
const previous = prior && typeof prior === 'object'
|
|
26
|
+
? prior[r.tool_use_id] : undefined;
|
|
27
|
+
if (previous && typeof previous === 'object' && 'originalBytes' in previous && 'retainedBytes' in previous
|
|
28
|
+
&& 'sha256' in previous && 'reference' in previous && 'availability' in previous
|
|
29
|
+
&& typeof previous.originalBytes === 'number' && Number.isSafeInteger(previous.originalBytes)
|
|
30
|
+
&& typeof previous.retainedBytes === 'number' && Number.isSafeInteger(previous.retainedBytes)
|
|
31
|
+
&& previous.originalBytes >= previous.retainedBytes && previous.retainedBytes >= 0
|
|
32
|
+
&& typeof previous.sha256 === 'string' && /^[a-f0-9]{64}$/.test(previous.sha256)
|
|
33
|
+
&& previous.reference === `sha256:${previous.sha256}`
|
|
34
|
+
&& (previous.availability === 'unavailable' || previous.availability === 'truncated')
|
|
35
|
+
&& content === r.content) {
|
|
36
|
+
// An already trimmed checkpoint carries the original source identity.
|
|
37
|
+
truncations[r.tool_use_id] = { originalBytes: previous.originalBytes,
|
|
38
|
+
retainedBytes: previous.retainedBytes, sha256: previous.sha256,
|
|
39
|
+
reference: previous.reference, availability: previous.availability };
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
const redacted = redactDiagnosticValue({ credentialContext, fullText: r.content,
|
|
43
|
+
retainedText: content }, { propertyNames: path => path.length > 0 });
|
|
44
|
+
const { field: _field, ...provenance } = describeDiagnosticTruncation('content', redacted.fullText, redacted.retainedText, 'unavailable');
|
|
45
|
+
truncations[r.tool_use_id] = provenance;
|
|
46
|
+
}
|
|
47
|
+
return { ...r, content };
|
|
48
|
+
});
|
|
49
|
+
const prior = m.metadata?.toolResultTruncation;
|
|
50
|
+
return { ...m, content: JSON.stringify(trimmed), metadata: { ...m.metadata,
|
|
51
|
+
...(Object.keys(truncations).length ? { toolResultTruncation: {
|
|
52
|
+
...(prior && typeof prior === 'object' ? prior : {}), ...truncations,
|
|
53
|
+
} } : {}),
|
|
54
|
+
} };
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return m;
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type AgentFactoryOptions } from '../agent/factory.js';
|
|
2
|
+
import type { UsageReceipt } from '../usage_snapshot.js';
|
|
3
|
+
type ScopeDecision = {
|
|
4
|
+
route: 'steer' | 'divergent';
|
|
5
|
+
source: 'classifier' | 'fallback';
|
|
6
|
+
};
|
|
7
|
+
/** Classify a busy submission independently of the live task's backend, tools,
|
|
8
|
+
* credentials binding, and cancellation. Failure always preserves steering. */
|
|
9
|
+
export declare function classifyBusyInput(options: {
|
|
10
|
+
backendOptions: AgentFactoryOptions;
|
|
11
|
+
currentTask: string;
|
|
12
|
+
inputText: string;
|
|
13
|
+
hosted: boolean;
|
|
14
|
+
/** Dedicated routing cancellation only; never pass the parent's run signal. */
|
|
15
|
+
signal?: AbortSignal;
|
|
16
|
+
/** One accounting observation per dispatched request, including cancellation.
|
|
17
|
+
* Published synchronously on cancellation before the host retires its scope. */
|
|
18
|
+
onUsage?: (receipt: UsageReceipt) => void;
|
|
19
|
+
}): Promise<ScopeDecision>;
|
|
20
|
+
export {};
|