meridian-cli 0.2.26__tar.gz → 0.2.28__tar.gz
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.
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/PKG-INFO +1 -1
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/__init__.py +1 -1
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/core/.context/CONTEXT.md +54 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/core/lifecycle.py +42 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/core/process_cleanup.py +8 -8
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/core/spawn_lifecycle.py +24 -4
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/core/spawn_service.py +130 -78
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/process/runner.py +0 -3
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/streaming_runner.py +93 -9
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/platform/process_scope/base.py +29 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/.context/CONTEXT.md +14 -5
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/process_scope_projection.py +22 -6
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/reaper.py +55 -3
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/spawn/model.py +13 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/spawn/repository.py +7 -1
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/spawn/transitions.py +20 -1
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/spawn_store.py +49 -1
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/streaming/.context/CONTEXT.md +12 -5
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/streaming/signal_canceller.py +69 -60
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/.gitignore +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/LICENSE +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/README.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/pyproject.toml +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/ag_ui/__init__.pyi +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/ag_ui/core.pyi +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/__main__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/_cmd_utils.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/agent_help.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/app_tree.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/argv_normalization.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/bootstrap.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/bootstrap_cmd.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/chat_cmd.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/config_cmd.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/doctor_cmd.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/entrypoint.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/ext_cmd.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/ext_registration.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/hooks_authority.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/hooks_commands.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/kg_cmd.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/main.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/mars_passthrough.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/mermaid_cmd.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/migrate_cmd.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/misc_commands.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/models_cmd.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/output.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/primary_launch.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/qi_cmd.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/report_cmd.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/session_cmd.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/spawn.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/spawn_inject.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/startup/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/startup/catalog.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/startup/classify.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/startup/cyclopts_app.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/startup/help.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/startup/lazy_dispatch.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/startup/policy.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/streaming_serve.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/sync_cmd.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/telemetry_cmd.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/utils.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/work_cmd.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/cli/workspace_cmd.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/dev/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/dev/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/dev/pytests.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/bootstrap/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/bootstrap/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/bootstrap/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/bootstrap/config.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/bootstrap/project_state.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/bootstrap/runtime_state.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/bootstrap/services.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/catalog/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/catalog/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/catalog/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/catalog/agent.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/catalog/bootstrap.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/catalog/catalog_session.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/catalog/model_aliases.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/catalog/models.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/catalog/skill.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/backend_acquisition.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/backend_handle.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/checkpoint.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/command_handler.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/command_invariants.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/commands.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/dev_frontend/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/dev_frontend/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/dev_frontend/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/dev_frontend/discovery.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/dev_frontend/launcher.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/dev_frontend/policy.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/dev_frontend/portless.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/dev_frontend/raw_vite.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/dev_frontend/supervisor.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/event_index.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/event_log.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/event_observer.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/event_pipeline.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/frontend.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/normalization/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/normalization/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/normalization/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/normalization/base.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/normalization/claude.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/normalization/codex.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/normalization/common.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/normalization/opencode.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/normalization/registry.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/normalization/synthetic.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/policy.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/protocol.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/recovery.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/replay.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/runtime.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/server.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/session_service.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/chat/ws_fanout.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/config/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/config/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/config/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/config/catalog.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/config/context_config.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/config/preserving_edit.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/config/project_config_state.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/config/project_paths.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/config/project_root.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/config/schema.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/config/settings.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/config/workspace.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/context/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/context/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/context/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/context/resolver.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/core/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/core/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/core/child_env.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/core/clock.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/core/codec.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/core/command_strings.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/core/context.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/core/conversation.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/core/depth.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/core/domain.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/core/execution_policy.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/core/formatting.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/core/launch_policy_snapshot.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/core/logging.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/core/overrides.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/core/resolved_context.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/core/sink.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/core/spawn_start.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/core/telemetry.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/core/types.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/core/util.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/diagnostics.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/extensions/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/extensions/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/extensions/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/extensions/commands/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/extensions/commands/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/extensions/commands/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/extensions/commands/biomed.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/extensions/commands/mermaid.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/extensions/commands/sessions.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/extensions/commands/workbench.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/extensions/context.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/extensions/descriptors.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/extensions/dispatcher.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/extensions/first_party.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/extensions/observability.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/extensions/registry.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/extensions/types.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/adapter.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/bundle.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/claude.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/claude_preflight.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/claude_utils.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/codex.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/codex_rollout.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/common.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/connections/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/connections/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/connections/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/connections/base.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/connections/claude_ws.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/connections/codex_ws.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/connections/cursor_subprocess.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/connections/errors.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/connections/opencode_http.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/connections/pi_rpc.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/control_action.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/cost.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/cursor.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/errors.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/extractor.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/extractors/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/extractors/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/extractors/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/extractors/base.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/extractors/claude.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/extractors/codex.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/extractors/cursor.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/extractors/opencode.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/extractors/pi.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/launch_spec.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/launch_types.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/opencode.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/opencode_storage.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/opencode_transcript.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/passthrough/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/passthrough/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/passthrough/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/passthrough/base.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/passthrough/claude.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/passthrough/codex.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/passthrough/opencode.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/passthrough/registry.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/permission_broker.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/pi.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/pi_lifecycle_events.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/pi_paths.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/pi_runtime_resolver.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/projections/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/projections/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/projections/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/projections/_guards.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/projections/permission_flags.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/projections/pi_extension_projection.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/projections/project_claude.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/projections/project_codex_common.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/projections/project_codex_streaming.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/projections/project_codex_subprocess.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/projections/project_cursor.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/projections/project_opencode_streaming.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/projections/project_opencode_subprocess.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/projections/project_pi_native_tui.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/projections/project_pi_rpc.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/projections/projection_errors.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/registry.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/semantics.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/session_detection.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/harness/transcript.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/hooks/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/hooks/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/hooks/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/hooks/builtin/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/hooks/builtin/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/hooks/builtin/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/hooks/builtin/autosync_store.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/hooks/builtin/base.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/hooks/builtin/git_autosync.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/hooks/builtin_registry.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/hooks/config.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/hooks/dispatch.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/hooks/interval.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/hooks/registry.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/hooks/runner.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/hooks/types.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ignores.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/kg/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/kg/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/kg/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/kg/graph.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/kg/report.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/kg/serializer.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/kg/types.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/artifact_io.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/bundle_adapter.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/claude_session_access.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/command.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/compiler.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/composition.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/composition_spawn.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/constants.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/context.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/cwd.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/env.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/errors.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/extract.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/fork.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/launch_types.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/materialize.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/permissions.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/plan.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/policies.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/policy_snapshot.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/process/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/process/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/process/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/process/ports.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/process/primary_attach.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/process/pty_launcher.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/process/session.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/process/subprocess_launcher.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/process/windows_launcher.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/prompt.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/reference.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/report.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/request.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/resolution.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/resolve.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/run_inputs.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/runner_helpers.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/session_scope.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/signals.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/streaming/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/streaming/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/streaming/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/streaming/heartbeat.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/streaming/terminal_arbitrator.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/text_utils.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/types.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/workspace.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/workspace_projection.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/launch/written_files.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/markdown/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/markdown/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/markdown/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/markdown/extract.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/markdown/types.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/mermaid/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/mermaid/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/mermaid/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/mermaid/report.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/mermaid/scanner.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/mermaid/serializer.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/mermaid/style/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/mermaid/style/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/mermaid/style/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/mermaid/style/bare_end.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/mermaid/style/fill_no_color.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/mermaid/style/line_map.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/mermaid/style/ox_edge.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/mermaid/style/preprocess.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/mermaid/style/suppression.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/mermaid/style/types.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/mermaid/validator.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/observability/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/observability/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/observability/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/observability/debug_tracer.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/observability/trace_helpers.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/catalog.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/commands.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/config.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/config_surface.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/context.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/diag.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/hooks.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/init_ops.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/mars.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/migration.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/pruning.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/qi.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/reference.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/reference_recovery.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/report.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/runtime.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/session_corpus.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/session_export.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/session_log.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/session_log_render.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/session_render.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/session_repair.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/session_search.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/session_target.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/session_transcript.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/spawn/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/spawn/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/spawn/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/spawn/api.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/spawn/context_ref.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/spawn/execute.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/spawn/execute_bg.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/spawn/execute_init.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/spawn/execute_runner.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/spawn/execute_session.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/spawn/failure_policy.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/spawn/models.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/spawn/prepare.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/spawn/query.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/sync_conflicts.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/work_attachment.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/work_dashboard.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/work_lifecycle.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/work_sessions.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/ops/workspace.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/platform/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/platform/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/platform/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/platform/locking.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/platform/process_scope/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/platform/process_scope/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/platform/process_scope/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/platform/process_scope/fallback.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/platform/process_scope/posix.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/platform/process_scope/windows_job.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/platform/terminate.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/platform/unix_modules.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/platform/windows_job.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/safety/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/safety/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/safety/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/safety/budget.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/safety/guardrails.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/safety/permissions.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/safety/redaction.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/service_context.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/spawn/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/spawn/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/spawn/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/spawn/archive.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/artifact_store.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/atomic.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/event_store.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/history.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/launch_boundary.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/liveness.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/managed_primary.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/paths.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/primary_meta.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/runtime_root.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/session_store.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/spawn/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/spawn/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/spawn/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/spawn/terminal_policy.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/user_paths.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/wordgen.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/wordlists.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/state/work_store.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/streaming/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/streaming/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/streaming/control_socket.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/streaming/disk_watcher.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/streaming/drain_policy.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/streaming/drain_wait.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/streaming/event_observers.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/streaming/heartbeat.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/streaming/pi_drain.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/streaming/pi_process_cleanup.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/streaming/pi_quiescence.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/streaming/pi_subspawn_tracker.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/streaming/spawn_dispatch.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/streaming/spawn_drain_loop.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/streaming/spawn_manager.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/streaming/spawn_session.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/streaming/types.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/telemetry/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/telemetry/bootstrap.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/telemetry/correlation.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/telemetry/events.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/telemetry/init.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/telemetry/local_jsonl.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/telemetry/maintenance.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/telemetry/observer.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/telemetry/observers.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/telemetry/query.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/telemetry/reader.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/telemetry/retention.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/telemetry/router.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/telemetry/sinks.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/telemetry/status.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/tools.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/utils/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/lib/utils/time.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/README.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/dist/extensions/managed-bash/index.js +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/dist/extensions/meridian-spawn-watch/index.js +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/extensions/managed-bash/bundle.smoke.test.ts +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/extensions/managed-bash/src/bash_log_store.ts +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/extensions/managed-bash/src/bash_runtime.test.ts +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/extensions/managed-bash/src/bash_runtime.ts +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/extensions/managed-bash/src/index.ts +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/extensions/meridian-spawn-watch/bundle.smoke.test.ts +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/extensions/meridian-spawn-watch/src/index.test.ts +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/extensions/meridian-spawn-watch/src/index.ts +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/extensions/shared/ids.ts +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/extensions/shared/json_file.ts +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/extensions/shared/log_overlay.ts +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/extensions/shared/meridian_cli.ts +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/extensions/shared/meridian_spawn.test.ts +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/extensions/shared/meridian_spawn.ts +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/extensions/shared/pi_harness_profile.ts +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/extensions/shared/pi_state_paths.ts +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/extensions/shared/schemas.ts +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/extensions/shared/selectable_panel.test.ts +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/extensions/shared/selectable_panel.ts +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/extensions/shared/spawn_origins.test.ts +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/extensions/shared/spawn_origins.ts +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/extensions/shared/ui.ts +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/package.json +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/pnpm-lock.yaml +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/pnpm-workspace.yaml +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/scripts/verify-extensions-loop.mjs +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/pi_runtime/vitest.config.ts +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/plugin_api/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/plugin_api/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/plugin_api/config.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/plugin_api/fs.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/plugin_api/git.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/plugin_api/state.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/plugin_api/types.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/py.typed +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/server/AGENTS.md +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/server/__init__.py +0 -0
- {meridian_cli-0.2.26 → meridian_cli-0.2.28}/src/meridian/server/main.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: meridian-cli
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.28
|
|
4
4
|
Summary: Orchestrate CLI + MCP server for multi-model agent workflows
|
|
5
5
|
Project-URL: Homepage, https://github.com/haowjy/meridian-cli
|
|
6
6
|
Project-URL: Repository, https://github.com/haowjy/meridian-cli
|
|
@@ -148,6 +148,60 @@ root has already died must be reclaimed, not silently preserved forever.
|
|
|
148
148
|
This function was removed — it had zero callers and was fully superseded by
|
|
149
149
|
`reclaim_session_owned_scopes_for_chat()`. Do not reference it.
|
|
150
150
|
|
|
151
|
+
## Spawn Lifecycle Decisions (`spawn_lifecycle.py`)
|
|
152
|
+
|
|
153
|
+
`spawn_lifecycle.py` owns lifecycle resolution rules — pure stateless functions shared by the
|
|
154
|
+
runner, reaper, and spawn application service. It does not own persistence or side effects.
|
|
155
|
+
|
|
156
|
+
### Has Durable Report Completion
|
|
157
|
+
|
|
158
|
+
`has_durable_report_completion(report_text)` returns True when a non-empty final report
|
|
159
|
+
exists on disk and its content is not a terminal control frame:
|
|
160
|
+
|
|
161
|
+
- Returns `False` for empty/whitespace strings, `None`, or `"# Spawn failed"` generated
|
|
162
|
+
markdown (runner-produced failure wrappers do not constitute durable completion).
|
|
163
|
+
- Returns `False` for JSON payloads whose top-level or nested `event_type` / `event` /
|
|
164
|
+
`type` is `"cancelled"` or `"error"`.
|
|
165
|
+
- Returns `True` for all other non-empty content (plain markdown, JSON payloads with
|
|
166
|
+
neutral/completion event types).
|
|
167
|
+
|
|
168
|
+
### Centralized Completion-vs-Cancel Precedence
|
|
169
|
+
|
|
170
|
+
`resolve_completion_cancel_precedence(*, durable_report_completion, cancel_requested, ...)`
|
|
171
|
+
is the **single** shared resolution rule for the durable-completion-wins-over-late-cancel
|
|
172
|
+
policy:
|
|
173
|
+
|
|
174
|
+
- If a durable report exists → `ExecutionTerminalOutcome(status="succeeded", exit_code=0)`.
|
|
175
|
+
- Else if cancellation was requested → `ExecutionTerminalOutcome(status="cancelled", ...)`.
|
|
176
|
+
- Else → `None` (no opinion — caller must fall back to its own outcome).
|
|
177
|
+
|
|
178
|
+
This helper is consumed by `SpawnApplicationService._force_cancel_convergence()`,
|
|
179
|
+
`SpawnApplicationService.complete_execution()`, and `reaper._completion_or_cancel_decision()`.
|
|
180
|
+
All three converge on the same precedence rule.
|
|
181
|
+
|
|
182
|
+
### Execution Terminal State Resolution
|
|
183
|
+
|
|
184
|
+
`resolve_execution_terminal_state()` normalizes raw execution facts into a terminal tuple
|
|
185
|
+
`(status, exit_code, error)`. It takes `exit_code`, `failure_reason`, `cancelled`, and
|
|
186
|
+
`durable_report_completion`:
|
|
187
|
+
|
|
188
|
+
| durable completion | cancelled | exit_code | Result |
|
|
189
|
+
|---|---|---|---|
|
|
190
|
+
| True | any | any | `succeeded`, 0, None |
|
|
191
|
+
| False | True | 143 | `cancelled`, 143, failure_reason |
|
|
192
|
+
| False | True | 0 | `cancelled`, 130, failure_reason |
|
|
193
|
+
| False | False | 0 | `succeeded`, 0, failure_reason |
|
|
194
|
+
| False | False | non-zero | `failed`, exit_code, failure_reason |
|
|
195
|
+
|
|
196
|
+
`resolve_execution_terminal_outcome(facts: ExecutionTerminalFacts)` wraps this for the
|
|
197
|
+
runner path.
|
|
198
|
+
|
|
199
|
+
### Reaper-Specific Resolved State
|
|
200
|
+
|
|
201
|
+
`resolve_reconciled_terminal_state(*, durable_report_completion, fallback_error)` produces
|
|
202
|
+
the terminal state for read-path reconciliation. Durable completion → `succeeded`; otherwise
|
|
203
|
+
→ `failed` with the supplied fallback error.
|
|
204
|
+
|
|
151
205
|
## Related KB
|
|
152
206
|
|
|
153
207
|
→ [KB: codebase/guide.md](/home/jimyao/.meridian/git/meridian-flow-docs/kb/codebase/guide.md) — core module orientation and codebase navigation
|
|
@@ -468,6 +468,48 @@ class SpawnLifecycleService:
|
|
|
468
468
|
)
|
|
469
469
|
return True
|
|
470
470
|
|
|
471
|
+
def request_cancel(
|
|
472
|
+
self,
|
|
473
|
+
spawn_id: str,
|
|
474
|
+
*,
|
|
475
|
+
exit_code: int = 130,
|
|
476
|
+
error: str | None = "cancelled",
|
|
477
|
+
requested_by: Literal["user", "system"] = "user",
|
|
478
|
+
requested_at: str | None = None,
|
|
479
|
+
clock: Clock | None = None,
|
|
480
|
+
) -> SpawnRecord | None:
|
|
481
|
+
"""Persist pre-terminal spawn-level cancel intent."""
|
|
482
|
+
|
|
483
|
+
with bind_lifecycle_correlation(
|
|
484
|
+
self._correlation(operation="request_cancel", spawn_id=spawn_id)
|
|
485
|
+
):
|
|
486
|
+
record = _spawn_store().record_cancel_intent(
|
|
487
|
+
self._runtime_root,
|
|
488
|
+
spawn_id,
|
|
489
|
+
exit_code=exit_code,
|
|
490
|
+
error=error,
|
|
491
|
+
requested_by=requested_by,
|
|
492
|
+
requested_at=requested_at,
|
|
493
|
+
clock=clock,
|
|
494
|
+
)
|
|
495
|
+
if record is None:
|
|
496
|
+
return None
|
|
497
|
+
self._emit_telemetry_event(
|
|
498
|
+
"spawn.updated",
|
|
499
|
+
record,
|
|
500
|
+
payload={
|
|
501
|
+
"cancel_intent": {
|
|
502
|
+
"requested_at": record.cancel_intent.requested_at,
|
|
503
|
+
"exit_code": record.cancel_intent.exit_code,
|
|
504
|
+
"error": record.cancel_intent.error,
|
|
505
|
+
"requested_by": record.cancel_intent.requested_by,
|
|
506
|
+
}
|
|
507
|
+
if record.cancel_intent is not None
|
|
508
|
+
else None,
|
|
509
|
+
},
|
|
510
|
+
)
|
|
511
|
+
return record
|
|
512
|
+
|
|
471
513
|
def finalize(
|
|
472
514
|
self,
|
|
473
515
|
spawn_id: str,
|
|
@@ -55,7 +55,7 @@ def terminate_spawn_scopes(
|
|
|
55
55
|
|
|
56
56
|
spawn_id = SpawnId(spawn_record.id)
|
|
57
57
|
for scope in scopes:
|
|
58
|
-
if is_scope_released(runtime_root, spawn_id, scope.
|
|
58
|
+
if is_scope_released(runtime_root, spawn_id, scope.release_id):
|
|
59
59
|
result = CleanupResult(
|
|
60
60
|
scope_id=scope.scope_id,
|
|
61
61
|
root_pid=scope.root_pid,
|
|
@@ -108,7 +108,7 @@ def terminate_spawn_scopes(
|
|
|
108
108
|
continue
|
|
109
109
|
|
|
110
110
|
result = terminate_scope_sync(scope, grace_seconds=grace_seconds, reason=reason)
|
|
111
|
-
mark_scope_released(runtime_root, spawn_id, scope.
|
|
111
|
+
mark_scope_released(runtime_root, spawn_id, scope.release_id)
|
|
112
112
|
logger.debug(
|
|
113
113
|
"Terminated process scope.",
|
|
114
114
|
spawn_id=spawn_record.id,
|
|
@@ -241,10 +241,10 @@ def cancel_managed_primary(
|
|
|
241
241
|
# 1. Terminate launcher scope first (spawn_owned).
|
|
242
242
|
for scope in scopes:
|
|
243
243
|
if scope.scope_id == "launcher":
|
|
244
|
-
if is_scope_released(runtime_root, spawn_id, scope.
|
|
244
|
+
if is_scope_released(runtime_root, spawn_id, scope.release_id):
|
|
245
245
|
continue
|
|
246
246
|
result = terminate_scope_sync(scope, grace_seconds=grace_seconds, reason="cancel")
|
|
247
|
-
mark_scope_released(runtime_root, spawn_id, scope.
|
|
247
|
+
mark_scope_released(runtime_root, spawn_id, scope.release_id)
|
|
248
248
|
logger.debug(
|
|
249
249
|
"Terminated managed primary launcher scope.",
|
|
250
250
|
spawn_id=spawn_record.id,
|
|
@@ -267,7 +267,7 @@ def cancel_managed_primary(
|
|
|
267
267
|
for scope in scopes:
|
|
268
268
|
if scope.scope_id not in {"backend", "tui"}:
|
|
269
269
|
continue
|
|
270
|
-
if is_scope_released(runtime_root, spawn_id, scope.
|
|
270
|
+
if is_scope_released(runtime_root, spawn_id, scope.release_id):
|
|
271
271
|
result = CleanupResult(
|
|
272
272
|
scope_id=scope.scope_id,
|
|
273
273
|
root_pid=scope.root_pid,
|
|
@@ -293,7 +293,7 @@ def cancel_managed_primary(
|
|
|
293
293
|
results.append(result)
|
|
294
294
|
continue
|
|
295
295
|
result = terminate_scope_sync(scope, grace_seconds=grace_seconds, reason="cancel")
|
|
296
|
-
mark_scope_released(runtime_root, spawn_id, scope.
|
|
296
|
+
mark_scope_released(runtime_root, spawn_id, scope.release_id)
|
|
297
297
|
logger.debug(
|
|
298
298
|
"Terminated managed primary runtime scope.",
|
|
299
299
|
spawn_id=spawn_record.id,
|
|
@@ -333,10 +333,10 @@ def reclaim_session_owned_scopes_for_chat(
|
|
|
333
333
|
for scope in scopes:
|
|
334
334
|
if scope.owner_policy != "session_owned":
|
|
335
335
|
continue
|
|
336
|
-
if is_scope_released(runtime_root, spawn_id, scope.
|
|
336
|
+
if is_scope_released(runtime_root, spawn_id, scope.release_id):
|
|
337
337
|
continue
|
|
338
338
|
result = terminate_scope_sync(scope, grace_seconds=grace_seconds, reason="session_exit")
|
|
339
|
-
mark_scope_released(runtime_root, spawn_id, scope.
|
|
339
|
+
mark_scope_released(runtime_root, spawn_id, scope.release_id)
|
|
340
340
|
logger.debug(
|
|
341
341
|
"Reclaimed session-owned scope at session exit.",
|
|
342
342
|
spawn_id=record.id,
|
|
@@ -29,7 +29,6 @@ class ExecutionTerminalFacts:
|
|
|
29
29
|
failure_reason: str | None = None
|
|
30
30
|
cancellation_observed: bool = False
|
|
31
31
|
durable_report_completion: bool = False
|
|
32
|
-
terminated_after_completion: bool = False
|
|
33
32
|
|
|
34
33
|
|
|
35
34
|
@dataclass(frozen=True)
|
|
@@ -58,6 +57,9 @@ def has_durable_report_completion(report_text: str | None) -> bool:
|
|
|
58
57
|
return False
|
|
59
58
|
|
|
60
59
|
stripped = report_text.strip()
|
|
60
|
+
if stripped.lower().startswith("# spawn failed"):
|
|
61
|
+
return False
|
|
62
|
+
|
|
61
63
|
try:
|
|
62
64
|
payload_obj = json.loads(stripped)
|
|
63
65
|
except json.JSONDecodeError:
|
|
@@ -98,11 +100,10 @@ def resolve_execution_terminal_state(
|
|
|
98
100
|
failure_reason: str | None,
|
|
99
101
|
cancelled: bool = False,
|
|
100
102
|
durable_report_completion: bool = False,
|
|
101
|
-
terminated_after_completion: bool = False,
|
|
102
103
|
) -> tuple[SpawnStatus, int, str | None]:
|
|
103
104
|
"""Normalize one execution outcome into the persisted terminal state."""
|
|
104
105
|
|
|
105
|
-
if durable_report_completion
|
|
106
|
+
if durable_report_completion:
|
|
106
107
|
return "succeeded", 0, None
|
|
107
108
|
if cancelled:
|
|
108
109
|
resolved_exit_code = exit_code if exit_code != 0 else 130
|
|
@@ -122,7 +123,6 @@ def resolve_execution_terminal_outcome(
|
|
|
122
123
|
failure_reason=facts.failure_reason,
|
|
123
124
|
cancelled=facts.cancellation_observed,
|
|
124
125
|
durable_report_completion=facts.durable_report_completion,
|
|
125
|
-
terminated_after_completion=facts.terminated_after_completion,
|
|
126
126
|
)
|
|
127
127
|
return ExecutionTerminalOutcome(
|
|
128
128
|
status=status,
|
|
@@ -131,6 +131,26 @@ def resolve_execution_terminal_outcome(
|
|
|
131
131
|
)
|
|
132
132
|
|
|
133
133
|
|
|
134
|
+
def resolve_completion_cancel_precedence(
|
|
135
|
+
*,
|
|
136
|
+
durable_report_completion: bool,
|
|
137
|
+
cancel_requested: bool,
|
|
138
|
+
cancel_exit_code: int = 130,
|
|
139
|
+
cancel_error: str | None = "cancelled",
|
|
140
|
+
) -> ExecutionTerminalOutcome | None:
|
|
141
|
+
"""Resolve the shared durable-completion-vs-late-cancel precedence rule."""
|
|
142
|
+
|
|
143
|
+
if durable_report_completion:
|
|
144
|
+
return ExecutionTerminalOutcome(status="succeeded", exit_code=0, error=None)
|
|
145
|
+
if cancel_requested:
|
|
146
|
+
return ExecutionTerminalOutcome(
|
|
147
|
+
status="cancelled",
|
|
148
|
+
exit_code=cancel_exit_code,
|
|
149
|
+
error=cancel_error,
|
|
150
|
+
)
|
|
151
|
+
return None
|
|
152
|
+
|
|
153
|
+
|
|
134
154
|
def resolve_reconciled_terminal_state(
|
|
135
155
|
*,
|
|
136
156
|
durable_report_completion: bool,
|
|
@@ -17,6 +17,8 @@ from meridian.lib.core.lifecycle import SpawnLifecycleService
|
|
|
17
17
|
from meridian.lib.core.spawn_lifecycle import (
|
|
18
18
|
ExecutionTerminalFacts,
|
|
19
19
|
ExecutionTerminalOutcome,
|
|
20
|
+
has_durable_report_completion,
|
|
21
|
+
resolve_completion_cancel_precedence,
|
|
20
22
|
resolve_execution_terminal_outcome,
|
|
21
23
|
)
|
|
22
24
|
from meridian.lib.core.spawn_start import SpawnStartMetadata
|
|
@@ -48,7 +50,7 @@ from meridian.lib.launch.types import PrimarySessionMetadata
|
|
|
48
50
|
from meridian.lib.state import spawn_store
|
|
49
51
|
from meridian.lib.state.liveness import is_process_alive
|
|
50
52
|
from meridian.lib.state.paths import RuntimePaths
|
|
51
|
-
from meridian.lib.state.spawn.model import LaunchMode, SpawnOrigin
|
|
53
|
+
from meridian.lib.state.spawn.model import APP_LAUNCH_MODE, LaunchMode, SpawnOrigin
|
|
52
54
|
from meridian.lib.streaming.signal_canceller import CancelOutcome as SignalCancelOutcome
|
|
53
55
|
|
|
54
56
|
if TYPE_CHECKING:
|
|
@@ -511,47 +513,84 @@ class SpawnApplicationService:
|
|
|
511
513
|
self._cleanup_orphan_managed_primary(spawn_id, record)
|
|
512
514
|
return _cancel_outcome_from_record(str(spawn_id), record, already_terminal=True)
|
|
513
515
|
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
primary_metadata = read_primary_metadata(self._runtime_root, str(spawn_id))
|
|
518
|
-
|
|
519
|
-
if not is_finalizing:
|
|
520
|
-
if primary_metadata is not None and primary_metadata.managed_backend:
|
|
521
|
-
return await self._cancel_managed_primary(spawn_id, record, primary_metadata)
|
|
522
|
-
|
|
523
|
-
from meridian.lib.streaming.signal_canceller import SignalCanceller
|
|
524
|
-
|
|
525
|
-
signal_outcome = await SignalCanceller(
|
|
526
|
-
runtime_root=self._runtime_root,
|
|
527
|
-
manager=self._spawn_manager,
|
|
528
|
-
complete_spawn=self._complete_spawn_unlocked,
|
|
529
|
-
).cancel(spawn_id)
|
|
530
|
-
latest = self.get_spawn(spawn_id) or record
|
|
531
|
-
return _cancel_outcome_from_signal(str(spawn_id), signal_outcome, latest)
|
|
532
|
-
|
|
533
|
-
if is_finalizing:
|
|
534
|
-
terminal = await self._wait_for_terminal(spawn_id, timeout=5.0)
|
|
535
|
-
lock = await self._locks.acquire(str(spawn_id))
|
|
536
|
-
async with lock:
|
|
537
|
-
latest = terminal or self.get_spawn(spawn_id) or record
|
|
538
|
-
if (
|
|
539
|
-
terminal is None
|
|
540
|
-
and latest.status == "finalizing"
|
|
541
|
-
and latest.runner_exit_status is None
|
|
542
|
-
and (
|
|
543
|
-
(primary_metadata is not None and primary_metadata.managed_backend)
|
|
544
|
-
or _is_managed_primary_candidate(latest)
|
|
545
|
-
)
|
|
546
|
-
):
|
|
547
|
-
latest = await self._ensure_cancel_timeout_intent(spawn_id, latest)
|
|
548
|
-
return _cancel_outcome_from_record(
|
|
516
|
+
record = (
|
|
517
|
+
await asyncio.to_thread(
|
|
518
|
+
self._lifecycle.request_cancel,
|
|
549
519
|
str(spawn_id),
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
520
|
+
exit_code=130,
|
|
521
|
+
error="cancelled",
|
|
522
|
+
requested_by="user",
|
|
553
523
|
)
|
|
554
|
-
|
|
524
|
+
or self.get_spawn(spawn_id)
|
|
525
|
+
or record
|
|
526
|
+
)
|
|
527
|
+
|
|
528
|
+
from meridian.lib.state.primary_meta import read_primary_metadata
|
|
529
|
+
|
|
530
|
+
primary_metadata = read_primary_metadata(self._runtime_root, str(spawn_id))
|
|
531
|
+
signal_outcome: SignalCancelOutcome | None = None
|
|
532
|
+
delivery_finalizing = False
|
|
533
|
+
if primary_metadata is not None and primary_metadata.managed_backend:
|
|
534
|
+
managed_outcome = await self._cancel_managed_primary(
|
|
535
|
+
spawn_id, record, primary_metadata
|
|
536
|
+
)
|
|
537
|
+
delivery_finalizing = managed_outcome.finalizing
|
|
538
|
+
else:
|
|
539
|
+
from meridian.lib.streaming.signal_canceller import SignalCanceller
|
|
540
|
+
|
|
541
|
+
signal_outcome = await SignalCanceller(
|
|
542
|
+
runtime_root=self._runtime_root,
|
|
543
|
+
manager=self._spawn_manager,
|
|
544
|
+
).cancel(spawn_id)
|
|
545
|
+
|
|
546
|
+
terminal = await self._wait_for_terminal(spawn_id, timeout=1.0)
|
|
547
|
+
if terminal is not None:
|
|
548
|
+
return _cancel_outcome_from_record(str(spawn_id), terminal, already_terminal=True)
|
|
549
|
+
|
|
550
|
+
lock = await self._locks.acquire(str(spawn_id))
|
|
551
|
+
async with lock:
|
|
552
|
+
latest = self.get_spawn(spawn_id) or record
|
|
553
|
+
if self.is_terminal(latest.status):
|
|
554
|
+
return _cancel_outcome_from_record(str(spawn_id), latest, already_terminal=True)
|
|
555
|
+
if not _has_live_execution_owner(latest, primary_metadata):
|
|
556
|
+
converged = await self._force_cancel_convergence(spawn_id, latest)
|
|
557
|
+
if converged is not None:
|
|
558
|
+
return _cancel_outcome_from_record(
|
|
559
|
+
str(spawn_id),
|
|
560
|
+
converged,
|
|
561
|
+
finalizing=not self.is_terminal(converged.status),
|
|
562
|
+
)
|
|
563
|
+
latest = self.get_spawn(spawn_id) or latest
|
|
564
|
+
if delivery_finalizing or (signal_outcome is not None and signal_outcome.finalizing):
|
|
565
|
+
return _cancel_outcome_from_record(str(spawn_id), latest, finalizing=True)
|
|
566
|
+
if signal_outcome is None:
|
|
567
|
+
return _cancel_outcome_from_record(str(spawn_id), latest)
|
|
568
|
+
return _cancel_outcome_from_signal(str(spawn_id), signal_outcome, latest)
|
|
569
|
+
|
|
570
|
+
async def _force_cancel_convergence(
|
|
571
|
+
self,
|
|
572
|
+
spawn_id: SpawnId,
|
|
573
|
+
record: SpawnRecord,
|
|
574
|
+
) -> SpawnRecord | None:
|
|
575
|
+
if self.is_terminal(record.status):
|
|
576
|
+
return record
|
|
577
|
+
intent = record.cancel_intent
|
|
578
|
+
resolved = resolve_completion_cancel_precedence(
|
|
579
|
+
durable_report_completion=_durable_report_completed(self._runtime_root, str(spawn_id)),
|
|
580
|
+
cancel_requested=True,
|
|
581
|
+
cancel_exit_code=intent.exit_code if intent is not None else 130,
|
|
582
|
+
cancel_error=intent.error if intent is not None else "cancelled",
|
|
583
|
+
)
|
|
584
|
+
if resolved is None:
|
|
585
|
+
return None
|
|
586
|
+
outcome = await self._complete_spawn_unlocked(
|
|
587
|
+
spawn_id,
|
|
588
|
+
resolved.status,
|
|
589
|
+
resolved.exit_code,
|
|
590
|
+
origin="reconciler" if resolved.status == "succeeded" else "cancel",
|
|
591
|
+
error=resolved.error,
|
|
592
|
+
)
|
|
593
|
+
return outcome.snapshot
|
|
555
594
|
|
|
556
595
|
def _cleanup_orphan_managed_primary(
|
|
557
596
|
self,
|
|
@@ -663,17 +702,6 @@ class SpawnApplicationService:
|
|
|
663
702
|
|
|
664
703
|
if latest is None:
|
|
665
704
|
latest = self.get_spawn(spawn_id) or record
|
|
666
|
-
if latest.status == "finalizing":
|
|
667
|
-
latest = await self._ensure_cancel_timeout_intent(spawn_id, latest)
|
|
668
|
-
return _cancel_outcome_from_record(str(spawn_id), latest, finalizing=True)
|
|
669
|
-
if self.is_terminal(latest.status):
|
|
670
|
-
return _cancel_outcome_from_record(
|
|
671
|
-
str(spawn_id),
|
|
672
|
-
latest,
|
|
673
|
-
already_terminal=True,
|
|
674
|
-
)
|
|
675
|
-
|
|
676
|
-
latest = await self._ensure_cancel_timeout_intent(spawn_id, latest)
|
|
677
705
|
if latest.status == "finalizing":
|
|
678
706
|
return _cancel_outcome_from_record(str(spawn_id), latest, finalizing=True)
|
|
679
707
|
if self.is_terminal(latest.status):
|
|
@@ -685,11 +713,9 @@ class SpawnApplicationService:
|
|
|
685
713
|
|
|
686
714
|
if self._lifecycle.mark_finalizing(str(spawn_id)):
|
|
687
715
|
latest = self.get_spawn(spawn_id) or latest
|
|
688
|
-
latest = await self._ensure_cancel_timeout_intent(spawn_id, latest)
|
|
689
716
|
else:
|
|
690
717
|
latest = self.get_spawn(spawn_id) or latest
|
|
691
718
|
if latest.status == "finalizing":
|
|
692
|
-
latest = await self._ensure_cancel_timeout_intent(spawn_id, latest)
|
|
693
719
|
return _cancel_outcome_from_record(str(spawn_id), latest, finalizing=True)
|
|
694
720
|
if self.is_terminal(latest.status):
|
|
695
721
|
return _cancel_outcome_from_record(
|
|
@@ -697,14 +723,6 @@ class SpawnApplicationService:
|
|
|
697
723
|
latest,
|
|
698
724
|
already_terminal=True,
|
|
699
725
|
)
|
|
700
|
-
self._lifecycle.finalize(
|
|
701
|
-
str(spawn_id),
|
|
702
|
-
"failed",
|
|
703
|
-
1,
|
|
704
|
-
origin="cancel",
|
|
705
|
-
error="cancel_timeout",
|
|
706
|
-
)
|
|
707
|
-
latest = self.get_spawn(spawn_id) or latest
|
|
708
726
|
|
|
709
727
|
# Best-effort: release any Phase-3 scope records so the reaper does not
|
|
710
728
|
# re-terminate processes that the metadata path already signalled.
|
|
@@ -724,22 +742,6 @@ class SpawnApplicationService:
|
|
|
724
742
|
finalizing=latest.status == "finalizing",
|
|
725
743
|
)
|
|
726
744
|
|
|
727
|
-
async def _ensure_cancel_timeout_intent(
|
|
728
|
-
self,
|
|
729
|
-
spawn_id: SpawnId,
|
|
730
|
-
record: SpawnRecord,
|
|
731
|
-
) -> SpawnRecord:
|
|
732
|
-
if self.is_terminal(record.status) or record.runner_exit_status is not None:
|
|
733
|
-
return record
|
|
734
|
-
await asyncio.to_thread(
|
|
735
|
-
self._lifecycle.record_runner_exit,
|
|
736
|
-
str(spawn_id),
|
|
737
|
-
status=cast("TerminalStatus", "cancelled"),
|
|
738
|
-
exit_code=130,
|
|
739
|
-
error="cancel_timeout",
|
|
740
|
-
)
|
|
741
|
-
return self.get_spawn(spawn_id) or record
|
|
742
|
-
|
|
743
745
|
async def complete_spawn(
|
|
744
746
|
self,
|
|
745
747
|
spawn_id: SpawnId,
|
|
@@ -782,6 +784,17 @@ class SpawnApplicationService:
|
|
|
782
784
|
resolved = resolve_execution_terminal_outcome(facts)
|
|
783
785
|
lock = await self._locks.acquire(str(spawn_id))
|
|
784
786
|
async with lock:
|
|
787
|
+
record = self.get_spawn(spawn_id)
|
|
788
|
+
if record is not None and record.cancel_intent is not None:
|
|
789
|
+
resolved = (
|
|
790
|
+
resolve_completion_cancel_precedence(
|
|
791
|
+
durable_report_completion=facts.durable_report_completion,
|
|
792
|
+
cancel_requested=True,
|
|
793
|
+
cancel_exit_code=record.cancel_intent.exit_code,
|
|
794
|
+
cancel_error=record.cancel_intent.error,
|
|
795
|
+
)
|
|
796
|
+
or resolved
|
|
797
|
+
)
|
|
785
798
|
completion = await self._complete_spawn_unlocked(
|
|
786
799
|
spawn_id,
|
|
787
800
|
resolved.status,
|
|
@@ -852,7 +865,7 @@ class SpawnApplicationService:
|
|
|
852
865
|
scopes = read_scopes_from_disk(self._runtime_root, spawn_id)
|
|
853
866
|
for scope in scopes:
|
|
854
867
|
if scope.owner_policy == "spawn_owned":
|
|
855
|
-
mark_scope_released(self._runtime_root, spawn_id, scope.
|
|
868
|
+
mark_scope_released(self._runtime_root, spawn_id, scope.release_id)
|
|
856
869
|
return CompleteSpawnOutcome(
|
|
857
870
|
wrote=outcome.wrote,
|
|
858
871
|
transitioned=outcome.transitioned,
|
|
@@ -1004,6 +1017,45 @@ def _is_managed_primary_candidate(record: SpawnRecord) -> bool:
|
|
|
1004
1017
|
return record.kind == "primary" and harness in {"codex", "opencode"}
|
|
1005
1018
|
|
|
1006
1019
|
|
|
1020
|
+
def _durable_report_completed(runtime_root: Path, spawn_id: str) -> bool:
|
|
1021
|
+
report_path = runtime_root / "spawns" / spawn_id / "report.md"
|
|
1022
|
+
try:
|
|
1023
|
+
report_text = report_path.read_text(encoding="utf-8", errors="ignore")
|
|
1024
|
+
except OSError:
|
|
1025
|
+
return False
|
|
1026
|
+
return has_durable_report_completion(report_text)
|
|
1027
|
+
|
|
1028
|
+
|
|
1029
|
+
def _has_live_execution_owner(
|
|
1030
|
+
record: SpawnRecord,
|
|
1031
|
+
primary_metadata: PrimaryMetadata | None,
|
|
1032
|
+
) -> bool:
|
|
1033
|
+
if record.launch_mode == APP_LAUNCH_MODE:
|
|
1034
|
+
return True
|
|
1035
|
+
started_epoch = _started_at_epoch(record.started_at)
|
|
1036
|
+
runner_created_at_epoch = record.runner_created_at_epoch or started_epoch
|
|
1037
|
+
if record.runner_pid is not None and is_process_alive(
|
|
1038
|
+
record.runner_pid,
|
|
1039
|
+
created_after_epoch=runner_created_at_epoch,
|
|
1040
|
+
):
|
|
1041
|
+
return True
|
|
1042
|
+
if record.worker_pid is not None and is_process_alive(
|
|
1043
|
+
record.worker_pid,
|
|
1044
|
+
created_after_epoch=started_epoch,
|
|
1045
|
+
):
|
|
1046
|
+
return True
|
|
1047
|
+
if primary_metadata is None:
|
|
1048
|
+
return False
|
|
1049
|
+
for pid in (
|
|
1050
|
+
primary_metadata.launcher_pid,
|
|
1051
|
+
primary_metadata.backend_pid,
|
|
1052
|
+
primary_metadata.tui_pid,
|
|
1053
|
+
):
|
|
1054
|
+
if pid is not None and is_process_alive(pid, created_after_epoch=started_epoch):
|
|
1055
|
+
return True
|
|
1056
|
+
return False
|
|
1057
|
+
|
|
1058
|
+
|
|
1007
1059
|
def _started_at_epoch(started_at: str | None) -> float | None:
|
|
1008
1060
|
normalized = (started_at or "").strip()
|
|
1009
1061
|
if not normalized:
|
|
@@ -563,9 +563,6 @@ def _finalize_lifecycle_and_observe_session(
|
|
|
563
563
|
ExecutionTerminalFacts(
|
|
564
564
|
exit_code=exit_code,
|
|
565
565
|
durable_report_completion=durable_report_completion,
|
|
566
|
-
terminated_after_completion=(
|
|
567
|
-
durable_report_completion and exit_code in (143, -15)
|
|
568
|
-
),
|
|
569
566
|
),
|
|
570
567
|
origin="launcher",
|
|
571
568
|
duration_secs=duration,
|