meridian-cli 0.3.52__tar.gz → 0.3.53__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.3.52 → meridian_cli-0.3.53}/PKG-INFO +1 -1
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/__init__.py +1 -1
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/spawn.py +8 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/process_cleanup.py +28 -5
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/spawn_service.py +115 -12
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/process/pty_launcher.py +16 -1
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/streaming_runner.py +1 -1
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/spawn/api.py +13 -1
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/spawn/models.py +1 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/safety/redaction.py +6 -1
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/history.py +47 -6
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/liveness.py +8 -2
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/session_store.py +41 -14
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/.gitignore +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/LICENSE +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/README.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/pyproject.toml +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/ag_ui/__init__.pyi +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/ag_ui/core.pyi +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/__main__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/_cmd_utils.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/agent_help.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/app_tree.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/argv_normalization.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/artifact_cmd.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/bootstrap.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/bootstrap_cmd.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/command_groups.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/config_cmd.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/doctor_cmd.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/entrypoint.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/ext_cmd.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/ext_registration.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/help_content.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/help_tiers.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/hooks_authority.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/hooks_commands.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/kg_cmd.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/main.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/mars_passthrough.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/mermaid_cmd.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/migrate_cmd.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/misc_commands.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/mode.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/models_cmd.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/output.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/primary_launch.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/qi_cmd.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/report_cmd.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/session_cmd.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/spawn_inject.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/startup/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/startup/catalog.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/startup/classify.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/startup/cyclopts_app.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/startup/help.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/startup/lazy_dispatch.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/startup/policy.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/streaming_serve.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/sync_cmd.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/task_dir_cmd.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/telemetry_cmd.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/utils.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/work_cmd.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/cli/workspace_cmd.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/dev/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/dev/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/dev/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/dev/pytests.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/env_registry.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/artifact/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/artifact/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/artifact/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/artifact/_serve_dir.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/artifact/service.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/artifact/store.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/bootstrap/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/bootstrap/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/bootstrap/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/bootstrap/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/bootstrap/config.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/bootstrap/project_state.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/bootstrap/runtime_state.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/bootstrap/services.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/catalog/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/catalog/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/catalog/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/catalog/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/catalog/agent.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/catalog/bootstrap.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/catalog/catalog_session.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/catalog/model_aliases.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/catalog/models.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/catalog/skill.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/config/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/config/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/config/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/config/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/config/catalog.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/config/context_config.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/config/preserving_edit.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/config/project_config_state.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/config/project_paths.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/config/project_root.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/config/schema.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/config/settings.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/config/workspace.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/context/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/context/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/context/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/context/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/context/resolver.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/child_env.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/clock.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/codec.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/command_strings.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/context.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/conversation.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/depth.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/domain.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/execution_policy.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/formatting.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/launch_policy_snapshot.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/lifecycle.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/logging.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/overrides.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/resolved_context.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/sink.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/spawn_lifecycle.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/spawn_start.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/telemetry.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/types.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/core/util.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/diagnostics.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/extensions/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/extensions/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/extensions/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/extensions/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/extensions/commands/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/extensions/commands/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/extensions/commands/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/extensions/commands/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/extensions/commands/biomed.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/extensions/commands/mermaid.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/extensions/commands/sessions.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/extensions/commands/workbench.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/extensions/context.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/extensions/descriptors.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/extensions/dispatcher.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/extensions/first_party.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/extensions/observability.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/extensions/registry.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/extensions/types.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/.context/pi-integration.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/.context/session-transcripts.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/adapter.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/bundle.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/claude.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/claude_preflight.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/claude_sessions.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/claude_utils.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/codex.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/codex_rollout.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/common.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/connections/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/connections/.context/FUTURE +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/connections/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/connections/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/connections/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/connections/base.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/connections/claude_ws.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/connections/codex_ws.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/connections/cursor_subprocess.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/connections/errors.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/connections/liveness.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/connections/managed_backend.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/connections/managed_stdio.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/connections/opencode_http.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/connections/pi_rpc.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/connections/resident_backend.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/control_action.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/cost.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/cursor.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/errors.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/extractor.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/extractors/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/extractors/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/extractors/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/extractors/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/extractors/base.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/extractors/claude.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/extractors/codex.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/extractors/cursor.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/extractors/opencode.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/extractors/pi.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/launch_spec.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/launch_types.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/opencode.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/opencode_report.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/opencode_storage.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/opencode_transcript.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/passthrough/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/passthrough/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/passthrough/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/passthrough/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/passthrough/base.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/passthrough/claude.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/passthrough/codex.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/passthrough/opencode.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/passthrough/registry.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/permission_broker.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/pi.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/pi_failure.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/pi_lifecycle_events.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/pi_paths.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/pi_runtime_resolver.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/projections/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/projections/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/projections/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/projections/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/projections/_guards.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/projections/permission_flags.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/projections/pi_extension_projection.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/projections/project_claude.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/projections/project_codex_common.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/projections/project_codex_streaming.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/projections/project_codex_subprocess.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/projections/project_cursor.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/projections/project_opencode_streaming.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/projections/project_opencode_subprocess.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/projections/project_pi_native_tui.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/projections/project_pi_rpc.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/projections/projection_errors.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/registry.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/semantics.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/session_detection.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/harness/transcript.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/hooks/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/hooks/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/hooks/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/hooks/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/hooks/builtin/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/hooks/builtin/.context/FUTURE +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/hooks/builtin/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/hooks/builtin/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/hooks/builtin/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/hooks/builtin/autosync_store.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/hooks/builtin/base.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/hooks/builtin/git_autosync.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/hooks/builtin_registry.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/hooks/config.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/hooks/dispatch.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/hooks/interval.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/hooks/registry.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/hooks/runner.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/hooks/types.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ignores.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/kg/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/kg/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/kg/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/kg/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/kg/graph.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/kg/report.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/kg/serializer.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/kg/types.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/.context/FUTURE +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/artifact_io.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/bundle_adapter.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/claude_session_access.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/command.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/compiler.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/composition.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/composition_spawn.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/constants.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/context.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/continue_replay.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/cwd.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/env.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/errors.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/extract.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/fork.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/launch_types.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/materialize.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/permissions.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/plan.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/policies.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/policy_snapshot.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/process/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/process/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/process/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/process/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/process/ports.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/process/primary_attach.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/process/runner.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/process/session.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/process/subprocess_launcher.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/process/windows_launcher.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/prompt.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/prompt_context.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/reference.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/report.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/request.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/resolution.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/resolve.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/run_inputs.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/runner_helpers.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/session_scope.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/signals.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/spawn_guidance.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/streaming/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/streaming/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/streaming/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/streaming/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/streaming/heartbeat.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/streaming/terminal_arbitrator.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/text_utils.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/types.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/workspace.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/workspace_projection.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/launch/written_files.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/markdown/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/markdown/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/markdown/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/markdown/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/markdown/extract.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/markdown/types.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/mermaid/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/mermaid/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/mermaid/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/mermaid/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/mermaid/report.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/mermaid/scanner.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/mermaid/serializer.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/mermaid/style/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/mermaid/style/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/mermaid/style/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/mermaid/style/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/mermaid/style/bare_end.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/mermaid/style/fill_no_color.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/mermaid/style/line_map.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/mermaid/style/ox_edge.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/mermaid/style/preprocess.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/mermaid/style/suppression.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/mermaid/style/types.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/mermaid/validator.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/observability/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/observability/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/observability/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/observability/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/observability/debug_tracer.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/observability/trace_helpers.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/.context/FUTURE +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/catalog.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/commands.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/config.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/config_surface.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/context.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/diag.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/hooks.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/init_ops.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/mars.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/migration.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/pruning.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/qi.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/reference.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/reference_recovery.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/report.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/runtime.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/session_corpus.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/session_export.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/session_log.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/session_log_render.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/session_render.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/session_repair.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/session_repair_target.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/session_search.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/session_target.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/session_transcript.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/spawn/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/spawn/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/spawn/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/spawn/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/spawn/context_ref.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/spawn/execute.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/spawn/execute_bg.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/spawn/execute_init.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/spawn/execute_runner.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/spawn/execute_session.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/spawn/failure_policy.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/spawn/pre_init.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/spawn/prepare.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/spawn/query.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/spawn/task_dir.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/sync_conflicts.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/work_attachment.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/work_dashboard.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/work_lifecycle.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/work_sessions.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/ops/workspace.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/platform/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/platform/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/platform/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/platform/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/platform/atomic.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/platform/detached_process.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/platform/locking.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/platform/parent_watchdog.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/platform/process_scope/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/platform/process_scope/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/platform/process_scope/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/platform/process_scope/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/platform/process_scope/base.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/platform/process_scope/fallback.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/platform/process_scope/posix.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/platform/process_scope/windows_job.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/platform/terminate.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/platform/unix_modules.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/safety/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/safety/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/safety/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/safety/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/safety/budget.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/safety/guardrails.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/safety/permissions.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/service_context.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/spawn/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/spawn/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/spawn/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/spawn/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/spawn/archive.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/.context/FUTURE +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/.context/TODO +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/artifact_store.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/atomic.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/event_store.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/failure_sentinel.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/launch_boundary.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/lock_gc.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/managed_primary.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/paths.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/primary_meta.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/process_scope_projection.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/reaper.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/reaper_cleanup_claim.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/reconciliation.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/runtime_root.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/session_identity.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/spawn/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/spawn/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/spawn/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/spawn/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/spawn/legacy.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/spawn/model.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/spawn/repository.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/spawn/transitions.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/spawn_aggregate.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/spawn_report.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/spawn_scope.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/spawn_signals.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/spawn_store.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/spawn_tree.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/timestamps.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/user_paths.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/wordgen.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/wordlists.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/work_repository.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/work_scope.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/work_state.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/state/work_store.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/.context/FUTURE +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/.context/pi-drain.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/.context/signal-cancellation.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/completion_contracts.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/completion_coordinator.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/completion_nudge.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/control_socket.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/descendant_evidence.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/disk_watcher.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/drain_coordinator.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/drain_plan_factory.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/drain_policy.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/drain_teardown.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/drain_wait.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/event_observers.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/heartbeat.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/pi_completion_profile.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/pi_drain.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/pi_drain_teardown.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/pi_lifecycle_tracker.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/pi_quiescence.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/pi_work_ledger.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/resident_drain.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/signal_canceller.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/spawn_dispatch.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/spawn_drain_loop.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/spawn_manager.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/spawn_session.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/streaming/types.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/telemetry/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/telemetry/bootstrap.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/telemetry/correlation.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/telemetry/events.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/telemetry/init.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/telemetry/local_jsonl.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/telemetry/maintenance.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/telemetry/observer.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/telemetry/observers.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/telemetry/query.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/telemetry/reader.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/telemetry/retention.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/telemetry/router.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/telemetry/sinks.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/telemetry/status.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/tools.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/utils/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/lib/utils/time.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/README.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/dist/extensions/managed-bash/index.js +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/dist/extensions/meridian-spawn-watch/index.js +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/extensions/managed-bash/bundle.smoke.test.ts +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/extensions/managed-bash/src/bash_log_store.ts +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/extensions/managed-bash/src/bash_runtime.test.ts +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/extensions/managed-bash/src/bash_runtime.ts +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/extensions/managed-bash/src/index.ts +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/extensions/meridian-spawn-watch/bundle.smoke.test.ts +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/extensions/meridian-spawn-watch/src/index.test.ts +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/extensions/meridian-spawn-watch/src/index.ts +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/extensions/shared/ids.ts +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/extensions/shared/json_file.ts +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/extensions/shared/log_overlay.ts +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/extensions/shared/meridian_cli.ts +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/extensions/shared/meridian_spawn.test.ts +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/extensions/shared/meridian_spawn.ts +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/extensions/shared/pi_harness_profile.test.ts +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/extensions/shared/pi_harness_profile.ts +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/extensions/shared/pi_state_paths.ts +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/extensions/shared/schemas.ts +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/extensions/shared/selectable_panel.test.ts +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/extensions/shared/selectable_panel.ts +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/extensions/shared/spawn_origins.test.ts +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/extensions/shared/spawn_origins.ts +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/extensions/shared/ui.ts +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/package.json +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/pnpm-lock.yaml +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/pnpm-workspace.yaml +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/scripts/verify-extensions-loop.mjs +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/pi_runtime/vitest.config.ts +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/plugin_api/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/plugin_api/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/plugin_api/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/plugin_api/config.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/plugin_api/fs.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/plugin_api/git.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/plugin_api/state.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/plugin_api/types.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/py.typed +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/server/AGENTS.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/server/CLAUDE.md +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/src/meridian/server/__init__.py +0 -0
- {meridian_cli-0.3.52 → meridian_cli-0.3.53}/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.3.
|
|
3
|
+
Version: 0.3.53
|
|
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
|
|
@@ -993,10 +993,18 @@ def _spawn_stats(
|
|
|
993
993
|
def _spawn_cancel(
|
|
994
994
|
emit: Any,
|
|
995
995
|
spawn_id: str,
|
|
996
|
+
force: Annotated[
|
|
997
|
+
bool,
|
|
998
|
+
Parameter(
|
|
999
|
+
name="--force",
|
|
1000
|
+
help="Cancel even when the target is a live managed primary session.",
|
|
1001
|
+
),
|
|
1002
|
+
] = False,
|
|
996
1003
|
) -> None:
|
|
997
1004
|
result = spawn_cancel_sync(
|
|
998
1005
|
SpawnCancelInput(
|
|
999
1006
|
spawn_id=spawn_id,
|
|
1007
|
+
force=force,
|
|
1000
1008
|
),
|
|
1001
1009
|
sink=_current_output_sink(),
|
|
1002
1010
|
prepared=_prepare_spawn_runtime_write(),
|
|
@@ -18,6 +18,7 @@ from meridian.lib.platform.process_scope.base import (
|
|
|
18
18
|
ProcessScopeSnapshot,
|
|
19
19
|
birth_time_unverified,
|
|
20
20
|
)
|
|
21
|
+
from meridian.lib.state.liveness import is_process_alive, is_process_alive_with_birth
|
|
21
22
|
from meridian.lib.state.process_scope_projection import (
|
|
22
23
|
is_scope_released,
|
|
23
24
|
mark_scope_released,
|
|
@@ -28,6 +29,28 @@ from meridian.lib.state.spawn.model import SpawnRecord
|
|
|
28
29
|
logger = structlog.get_logger(__name__)
|
|
29
30
|
|
|
30
31
|
|
|
32
|
+
def _wait_for_scope_exit(scope: ProcessScopeSnapshot, *, timeout: float) -> None:
|
|
33
|
+
"""Wait only while a scope's recorded root process is still alive."""
|
|
34
|
+
|
|
35
|
+
import time
|
|
36
|
+
|
|
37
|
+
deadline = time.monotonic() + max(0.0, timeout)
|
|
38
|
+
while True:
|
|
39
|
+
if birth_time_unverified(scope.root_created_at_epoch):
|
|
40
|
+
alive = is_process_alive(scope.root_pid)
|
|
41
|
+
else:
|
|
42
|
+
alive = is_process_alive_with_birth(
|
|
43
|
+
scope.root_pid,
|
|
44
|
+
scope.root_created_at_epoch,
|
|
45
|
+
)
|
|
46
|
+
if not alive:
|
|
47
|
+
return
|
|
48
|
+
remaining = deadline - time.monotonic()
|
|
49
|
+
if remaining <= 0:
|
|
50
|
+
return
|
|
51
|
+
time.sleep(min(0.05, remaining))
|
|
52
|
+
|
|
53
|
+
|
|
31
54
|
def terminate_recorded_spawn_scopes(
|
|
32
55
|
runtime_root: Path,
|
|
33
56
|
spawn_record: SpawnRecord,
|
|
@@ -282,8 +305,6 @@ def cancel_managed_primary(
|
|
|
282
305
|
Idempotent — already-released scopes are skipped. Safe to call even when
|
|
283
306
|
primary_metadata is not available (falls back to scope records only).
|
|
284
307
|
"""
|
|
285
|
-
import time
|
|
286
|
-
|
|
287
308
|
scopes = read_scopes_from_disk(runtime_root, SpawnId(spawn_record.id))
|
|
288
309
|
results: list[CleanupResult] = []
|
|
289
310
|
spawn_id = SpawnId(spawn_record.id)
|
|
@@ -309,9 +330,11 @@ def cancel_managed_primary(
|
|
|
309
330
|
)
|
|
310
331
|
results.append(result)
|
|
311
332
|
|
|
312
|
-
# 2.
|
|
313
|
-
|
|
314
|
-
|
|
333
|
+
# 2. Let launcher-driven shutdown propagate, but stop waiting as soon as
|
|
334
|
+
# the launcher scope is actually gone.
|
|
335
|
+
launcher_scope = next((scope for scope in scopes if scope.scope_id == "launcher"), None)
|
|
336
|
+
if results and launcher_scope is not None:
|
|
337
|
+
_wait_for_scope_exit(launcher_scope, timeout=1.0)
|
|
315
338
|
|
|
316
339
|
# 3. Terminate backend and TUI if still unreleased.
|
|
317
340
|
for scope in scopes:
|
|
@@ -52,7 +52,7 @@ from meridian.lib.launch.resolve import (
|
|
|
52
52
|
)
|
|
53
53
|
from meridian.lib.launch.types import PrimarySessionMetadata
|
|
54
54
|
from meridian.lib.state import spawn_store
|
|
55
|
-
from meridian.lib.state.liveness import is_process_alive
|
|
55
|
+
from meridian.lib.state.liveness import is_process_alive, is_process_alive_with_birth
|
|
56
56
|
from meridian.lib.state.paths import RuntimePaths
|
|
57
57
|
from meridian.lib.state.spawn.model import APP_LAUNCH_MODE, LaunchMode, SpawnKind, SpawnOrigin
|
|
58
58
|
from meridian.lib.state.spawn.repository import Applied, Declined
|
|
@@ -71,6 +71,49 @@ if TYPE_CHECKING:
|
|
|
71
71
|
_WAIT_POLL_INTERVAL_SECS = 0.1
|
|
72
72
|
_MANAGED_CANCEL_GRACE_SECS = 5.0
|
|
73
73
|
_MANAGED_CANCEL_FALLBACK_WAIT_SECS = 1.0
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _is_live_managed_primary(runtime_root: Path, record: SpawnRecord) -> bool:
|
|
77
|
+
if record.kind != "primary" or record.chat_id is None:
|
|
78
|
+
return False
|
|
79
|
+
from meridian.lib.state.session_store import is_session_lease_owner_alive
|
|
80
|
+
|
|
81
|
+
if is_session_lease_owner_alive(runtime_root, str(record.chat_id)):
|
|
82
|
+
return True
|
|
83
|
+
|
|
84
|
+
from meridian.lib.state.primary_meta import read_primary_metadata
|
|
85
|
+
|
|
86
|
+
metadata = read_primary_metadata(runtime_root, record.id)
|
|
87
|
+
return bool(
|
|
88
|
+
metadata is not None
|
|
89
|
+
and metadata.managed_backend
|
|
90
|
+
and metadata.launcher_pid is not None
|
|
91
|
+
and is_process_alive_with_birth(
|
|
92
|
+
metadata.launcher_pid,
|
|
93
|
+
metadata.launcher_birth_epoch,
|
|
94
|
+
)
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _live_primary_cancel_refusal(record: SpawnRecord) -> str:
|
|
99
|
+
agent = (record.agent or "unknown").strip() or "unknown"
|
|
100
|
+
chat_id = str(record.chat_id) if record.chat_id is not None else "unknown"
|
|
101
|
+
uptime = "unknown"
|
|
102
|
+
if record.started_at is not None:
|
|
103
|
+
started_epoch = iso_timestamp_to_epoch(record.started_at)
|
|
104
|
+
if started_epoch is not None:
|
|
105
|
+
elapsed = max(0, int(time.time() - started_epoch))
|
|
106
|
+
hours, remainder = divmod(elapsed, 3600)
|
|
107
|
+
minutes, seconds = divmod(remainder, 60)
|
|
108
|
+
uptime = f"{hours}h {minutes}m" if hours else f"{minutes}m {seconds}s"
|
|
109
|
+
return (
|
|
110
|
+
f"Refusing to cancel live managed primary '{record.id}' "
|
|
111
|
+
f"(agent: {agent}, chat: {chat_id}, uptime: {uptime}). "
|
|
112
|
+
f"To end this interactive session anyway, pass --force: "
|
|
113
|
+
f"meridian spawn cancel {record.id} --force"
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
|
|
74
117
|
_MAX_REAP_PASSES = 4
|
|
75
118
|
logger = structlog.get_logger()
|
|
76
119
|
|
|
@@ -525,6 +568,7 @@ class SpawnApplicationService:
|
|
|
525
568
|
spawn_id: SpawnId,
|
|
526
569
|
*,
|
|
527
570
|
requested_by: Literal["user", "system"] = "user",
|
|
571
|
+
force: bool = False,
|
|
528
572
|
) -> CancelOutcome:
|
|
529
573
|
"""Cancel a spawn through the shared surface-neutral pipeline."""
|
|
530
574
|
lock = await self._locks.acquire(str(spawn_id))
|
|
@@ -533,6 +577,8 @@ class SpawnApplicationService:
|
|
|
533
577
|
if self.is_terminal(record.status):
|
|
534
578
|
self._cleanup_orphan_managed_primary(spawn_id, record)
|
|
535
579
|
return _cancel_outcome_from_record(str(spawn_id), record, already_terminal=True)
|
|
580
|
+
if not force and _is_live_managed_primary(self._runtime_root, record):
|
|
581
|
+
raise RuntimeError(_live_primary_cancel_refusal(record))
|
|
536
582
|
|
|
537
583
|
record = (
|
|
538
584
|
await asyncio.to_thread(
|
|
@@ -564,6 +610,18 @@ class SpawnApplicationService:
|
|
|
564
610
|
manager=self._spawn_manager,
|
|
565
611
|
).cancel(spawn_id)
|
|
566
612
|
|
|
613
|
+
latest_after_delivery = self.get_spawn(spawn_id) or record
|
|
614
|
+
if not _has_live_execution_owner(latest_after_delivery, primary_metadata):
|
|
615
|
+
lock = await self._locks.acquire(str(spawn_id))
|
|
616
|
+
async with lock:
|
|
617
|
+
latest_after_delivery = self.get_spawn(spawn_id) or latest_after_delivery
|
|
618
|
+
converged = await self._force_cancel_convergence(
|
|
619
|
+
spawn_id,
|
|
620
|
+
latest_after_delivery,
|
|
621
|
+
)
|
|
622
|
+
if converged is not None:
|
|
623
|
+
return _cancel_outcome_from_record(str(spawn_id), converged)
|
|
624
|
+
|
|
567
625
|
terminal = await self._wait_for_terminal(spawn_id, timeout=1.0)
|
|
568
626
|
if terminal is not None:
|
|
569
627
|
return _cancel_outcome_from_record(str(spawn_id), terminal, already_terminal=True)
|
|
@@ -606,7 +664,10 @@ class SpawnApplicationService:
|
|
|
606
664
|
if not descendants:
|
|
607
665
|
return reaped_ids
|
|
608
666
|
results = await asyncio.gather(
|
|
609
|
-
*(
|
|
667
|
+
*(
|
|
668
|
+
self.cancel(SpawnId(d.id), requested_by="system", force=False)
|
|
669
|
+
for d in descendants
|
|
670
|
+
),
|
|
610
671
|
return_exceptions=True,
|
|
611
672
|
)
|
|
612
673
|
for descendant, result in zip(descendants, results, strict=True):
|
|
@@ -736,28 +797,30 @@ class SpawnApplicationService:
|
|
|
736
797
|
launcher_pid, created_after_epoch=started_epoch
|
|
737
798
|
)
|
|
738
799
|
if launcher_alive:
|
|
800
|
+
assert launcher_pid is not None
|
|
739
801
|
terminate_managed_primary_processes(
|
|
740
802
|
primary_metadata,
|
|
741
803
|
include_launcher=True,
|
|
742
804
|
include_runtime_children=False,
|
|
743
805
|
)
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
806
|
+
latest = await self._wait_for_terminal_or_process_exit(
|
|
807
|
+
spawn_id,
|
|
808
|
+
pid=launcher_pid,
|
|
809
|
+
created_after_epoch=started_epoch,
|
|
810
|
+
timeout=_MANAGED_CANCEL_GRACE_SECS,
|
|
748
811
|
)
|
|
812
|
+
else:
|
|
813
|
+
latest = None
|
|
749
814
|
|
|
750
|
-
latest
|
|
751
|
-
spawn_id,
|
|
752
|
-
timeout=_MANAGED_CANCEL_GRACE_SECS,
|
|
753
|
-
)
|
|
754
|
-
if latest is None and launcher_alive:
|
|
815
|
+
if latest is None:
|
|
755
816
|
terminate_managed_primary_processes(
|
|
756
817
|
primary_metadata,
|
|
757
818
|
include_launcher=False,
|
|
758
819
|
)
|
|
759
|
-
latest = await self.
|
|
820
|
+
latest = await self._wait_for_terminal_or_execution_exit(
|
|
760
821
|
spawn_id,
|
|
822
|
+
record=record,
|
|
823
|
+
primary_metadata=primary_metadata,
|
|
761
824
|
timeout=_MANAGED_CANCEL_FALLBACK_WAIT_SECS,
|
|
762
825
|
)
|
|
763
826
|
|
|
@@ -803,6 +866,46 @@ class SpawnApplicationService:
|
|
|
803
866
|
finalizing=latest.status == "finalizing",
|
|
804
867
|
)
|
|
805
868
|
|
|
869
|
+
async def _wait_for_terminal_or_process_exit(
|
|
870
|
+
self,
|
|
871
|
+
spawn_id: SpawnId,
|
|
872
|
+
*,
|
|
873
|
+
pid: int,
|
|
874
|
+
created_after_epoch: float | None,
|
|
875
|
+
timeout: float,
|
|
876
|
+
) -> SpawnRecord | None:
|
|
877
|
+
deadline = time.monotonic() + max(0.0, timeout)
|
|
878
|
+
while True:
|
|
879
|
+
current = self.get_spawn(spawn_id)
|
|
880
|
+
if current is not None and self.is_terminal(current.status):
|
|
881
|
+
return current
|
|
882
|
+
if not is_process_alive(pid, created_after_epoch=created_after_epoch):
|
|
883
|
+
return None
|
|
884
|
+
remaining = deadline - time.monotonic()
|
|
885
|
+
if remaining <= 0:
|
|
886
|
+
return None
|
|
887
|
+
await asyncio.sleep(min(_WAIT_POLL_INTERVAL_SECS, remaining))
|
|
888
|
+
|
|
889
|
+
async def _wait_for_terminal_or_execution_exit(
|
|
890
|
+
self,
|
|
891
|
+
spawn_id: SpawnId,
|
|
892
|
+
*,
|
|
893
|
+
record: SpawnRecord,
|
|
894
|
+
primary_metadata: PrimaryMetadata,
|
|
895
|
+
timeout: float,
|
|
896
|
+
) -> SpawnRecord | None:
|
|
897
|
+
deadline = time.monotonic() + max(0.0, timeout)
|
|
898
|
+
while True:
|
|
899
|
+
current = self.get_spawn(spawn_id)
|
|
900
|
+
if current is not None and self.is_terminal(current.status):
|
|
901
|
+
return current
|
|
902
|
+
if not _has_live_execution_owner(current or record, primary_metadata):
|
|
903
|
+
return None
|
|
904
|
+
remaining = deadline - time.monotonic()
|
|
905
|
+
if remaining <= 0:
|
|
906
|
+
return None
|
|
907
|
+
await asyncio.sleep(min(_WAIT_POLL_INTERVAL_SECS, remaining))
|
|
908
|
+
|
|
806
909
|
async def complete_spawn(
|
|
807
910
|
self,
|
|
808
911
|
spawn_id: SpawnId,
|
|
@@ -16,6 +16,15 @@ from meridian.lib.platform import IS_WINDOWS, fcntl, pty, select, termios, tty
|
|
|
16
16
|
|
|
17
17
|
from .ports import LaunchedProcess, ProcessLauncher
|
|
18
18
|
|
|
19
|
+
_TERMINAL_RESTORE_SEQUENCE = (
|
|
20
|
+
b"\x1b[?1000l"
|
|
21
|
+
b"\x1b[?1002l"
|
|
22
|
+
b"\x1b[?1003l"
|
|
23
|
+
b"\x1b[?1006l"
|
|
24
|
+
b"\x1b[?1049l"
|
|
25
|
+
b"\x1b[?25h"
|
|
26
|
+
)
|
|
27
|
+
|
|
19
28
|
|
|
20
29
|
def can_use_pty() -> bool:
|
|
21
30
|
return not IS_WINDOWS and sys.stdin.isatty() and sys.stdout.isatty()
|
|
@@ -115,7 +124,10 @@ def _copy_primary_pty_output(
|
|
|
115
124
|
if output_handle is not None:
|
|
116
125
|
output_handle.write(chunk)
|
|
117
126
|
output_handle.flush()
|
|
118
|
-
|
|
127
|
+
try:
|
|
128
|
+
os.write(stdout_fd, chunk)
|
|
129
|
+
except BrokenPipeError:
|
|
130
|
+
break
|
|
119
131
|
|
|
120
132
|
if stdin_open and stdin_fd in ready:
|
|
121
133
|
data = os.read(stdin_fd, 1024)
|
|
@@ -127,6 +139,9 @@ def _copy_primary_pty_output(
|
|
|
127
139
|
restore_resize()
|
|
128
140
|
if saved_tty_attrs is not None:
|
|
129
141
|
termios.tcsetattr(stdin_fd, termios.TCSADRAIN, saved_tty_attrs)
|
|
142
|
+
if os.isatty(stdout_fd):
|
|
143
|
+
with suppress(OSError):
|
|
144
|
+
os.write(stdout_fd, _TERMINAL_RESTORE_SEQUENCE)
|
|
130
145
|
|
|
131
146
|
_, status = os.waitpid(child_pid, 0)
|
|
132
147
|
return os.waitstatus_to_exitcode(status)
|
|
@@ -396,7 +396,7 @@ def _persist_attempt_artifacts(
|
|
|
396
396
|
if not source.exists():
|
|
397
397
|
continue
|
|
398
398
|
payload = source.read_bytes()
|
|
399
|
-
if name in {HISTORY_FILENAME, STDERR_FILENAME}:
|
|
399
|
+
if secrets and name in {HISTORY_FILENAME, STDERR_FILENAME}:
|
|
400
400
|
payload = redact_secret_bytes(payload, secrets)
|
|
401
401
|
artifacts.put(make_artifact_key(spawn_id, name), payload)
|
|
402
402
|
|
|
@@ -1030,6 +1030,17 @@ async def spawn_subagents(
|
|
|
1030
1030
|
|
|
1031
1031
|
|
|
1032
1032
|
def _spawn_cancel_output_from_outcome(outcome: CancelOutcome) -> SpawnActionOutput:
|
|
1033
|
+
if outcome.status in {"queued", "running"} and not outcome.finalizing:
|
|
1034
|
+
return SpawnActionOutput(
|
|
1035
|
+
command="spawn.cancel",
|
|
1036
|
+
status="failed",
|
|
1037
|
+
spawn_id=outcome.spawn_id,
|
|
1038
|
+
message=f"Cancellation of spawn '{outcome.spawn_id}' did not converge.",
|
|
1039
|
+
error=f"Spawn remained {outcome.status} after cancellation.",
|
|
1040
|
+
model=outcome.model,
|
|
1041
|
+
harness_id=outcome.harness,
|
|
1042
|
+
exit_code=1,
|
|
1043
|
+
)
|
|
1033
1044
|
if outcome.already_terminal:
|
|
1034
1045
|
message = f"Spawn '{outcome.spawn_id}' is already {outcome.status}."
|
|
1035
1046
|
elif outcome.finalizing:
|
|
@@ -1242,7 +1253,7 @@ async def _spawn_cancel_impl(
|
|
|
1242
1253
|
setup_telemetry(runtime_root=runtime_root, logical_owner=cancel_owner)
|
|
1243
1254
|
register_spawn_telemetry_observer()
|
|
1244
1255
|
try:
|
|
1245
|
-
outcome = await spawn_service.cancel(SpawnId(spawn_id))
|
|
1256
|
+
outcome = await spawn_service.cancel(SpawnId(spawn_id), force=payload.force)
|
|
1246
1257
|
except RuntimeError as exc:
|
|
1247
1258
|
return SpawnActionOutput(
|
|
1248
1259
|
command="spawn.cancel",
|
|
@@ -1334,6 +1345,7 @@ def spawn_cancel_all_sync(
|
|
|
1334
1345
|
SpawnCancelInput(
|
|
1335
1346
|
spawn_id=row.id,
|
|
1336
1347
|
project_root=project_root.as_posix(),
|
|
1348
|
+
force=payload.include_primaries,
|
|
1337
1349
|
),
|
|
1338
1350
|
sink=sink,
|
|
1339
1351
|
prepared=prepared,
|
|
@@ -33,7 +33,12 @@ def redact_secrets(text: str, secrets: tuple[SecretSpec, ...]) -> str:
|
|
|
33
33
|
def redact_secret_bytes(data: bytes, secrets: tuple[SecretSpec, ...]) -> bytes:
|
|
34
34
|
"""Byte wrapper around redaction for streamed logs."""
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
encoded_secrets = tuple(
|
|
37
|
+
secret.value.encode("utf-8")
|
|
38
|
+
for secret in secrets
|
|
39
|
+
if secret.value
|
|
40
|
+
)
|
|
41
|
+
if not encoded_secrets or not any(secret in data for secret in encoded_secrets):
|
|
37
42
|
return data
|
|
38
43
|
decoded = data.decode("utf-8", errors="replace")
|
|
39
44
|
return redact_secrets(decoded, secrets).encode("utf-8")
|
|
@@ -19,6 +19,8 @@ from meridian.lib.state.spawn_aggregate import mutate_published_spawn_artifact
|
|
|
19
19
|
logger = logging.getLogger(__name__)
|
|
20
20
|
|
|
21
21
|
_LAST_OBSERVED_EVENT_CHECKPOINT_INTERVAL_SECONDS = 1.0
|
|
22
|
+
_RAW_UNPARSED_MAX_LENGTH = 4096
|
|
23
|
+
_RAW_UNPARSED_TRUNCATION_MARKER = "\n[truncated by Meridian]"
|
|
22
24
|
|
|
23
25
|
|
|
24
26
|
@dataclass(frozen=True)
|
|
@@ -74,20 +76,27 @@ class HarnessHistoryWriter:
|
|
|
74
76
|
|
|
75
77
|
causal = self._causal_tracker.derive(event)
|
|
76
78
|
timestamp = self.clock.utc_now_iso()
|
|
77
|
-
envelope = {
|
|
79
|
+
envelope: dict[str, object] = {
|
|
78
80
|
"seq": self._seq,
|
|
79
81
|
"byte_offset": self._byte_offset,
|
|
80
82
|
"timestamp": timestamp,
|
|
81
|
-
"turn_id": causal.turn_id,
|
|
82
|
-
"item_id": causal.item_id,
|
|
83
|
-
"request_id": causal.request_id,
|
|
84
83
|
"interrupt_epoch": causal.interrupt_epoch,
|
|
85
|
-
"stale_after_interrupt": causal.stale_after_interrupt,
|
|
86
84
|
"event_type": event.event_type,
|
|
87
85
|
"harness_id": event.harness_id,
|
|
88
86
|
"payload": event.payload,
|
|
89
|
-
"raw_text": event.raw_text,
|
|
90
87
|
}
|
|
88
|
+
for key, value in (
|
|
89
|
+
("turn_id", causal.turn_id),
|
|
90
|
+
("item_id", causal.item_id),
|
|
91
|
+
("request_id", causal.request_id),
|
|
92
|
+
):
|
|
93
|
+
if value is not None:
|
|
94
|
+
envelope[key] = value
|
|
95
|
+
if causal.stale_after_interrupt:
|
|
96
|
+
envelope["stale_after_interrupt"] = True
|
|
97
|
+
meta = _wire_envelope_meta(event)
|
|
98
|
+
if meta:
|
|
99
|
+
envelope["meta"] = meta
|
|
91
100
|
line = json.dumps(envelope, separators=(",", ":"), sort_keys=True) + "\n"
|
|
92
101
|
|
|
93
102
|
assigned_seq = self._seq
|
|
@@ -205,6 +214,38 @@ class HarnessHistoryWriter:
|
|
|
205
214
|
)
|
|
206
215
|
|
|
207
216
|
|
|
217
|
+
def _wire_envelope_meta(event: RawHarnessEvent) -> dict[str, object]:
|
|
218
|
+
"""Return wire fields not already represented by the normalized payload."""
|
|
219
|
+
|
|
220
|
+
if event.raw_text is None:
|
|
221
|
+
return {}
|
|
222
|
+
try:
|
|
223
|
+
parsed = json.loads(event.raw_text)
|
|
224
|
+
except (json.JSONDecodeError, TypeError):
|
|
225
|
+
return {"raw_unparsed": _bounded_unparsed_wire(event.raw_text)}
|
|
226
|
+
if not isinstance(parsed, dict):
|
|
227
|
+
return {"raw_unparsed": _bounded_unparsed_wire(event.raw_text)}
|
|
228
|
+
|
|
229
|
+
wire = cast("dict[str, object]", parsed)
|
|
230
|
+
for payload_key in ("payload", "params"):
|
|
231
|
+
if wire.get(payload_key) == event.payload:
|
|
232
|
+
return {key: value for key, value in wire.items() if key != payload_key}
|
|
233
|
+
if wire == event.payload:
|
|
234
|
+
return {}
|
|
235
|
+
return {
|
|
236
|
+
key: value
|
|
237
|
+
for key, value in wire.items()
|
|
238
|
+
if key not in event.payload or event.payload[key] != value
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
def _bounded_unparsed_wire(raw_text: str) -> str:
|
|
243
|
+
if len(raw_text) <= _RAW_UNPARSED_MAX_LENGTH:
|
|
244
|
+
return raw_text
|
|
245
|
+
prefix_length = _RAW_UNPARSED_MAX_LENGTH - len(_RAW_UNPARSED_TRUNCATION_MARKER)
|
|
246
|
+
return raw_text[:prefix_length] + _RAW_UNPARSED_TRUNCATION_MARKER
|
|
247
|
+
|
|
248
|
+
|
|
208
249
|
def iter_history_events(path: Path) -> Iterator[dict[str, Any]]:
|
|
209
250
|
"""Yield seq-enveloped event dictionaries from a history JSONL file."""
|
|
210
251
|
|
|
@@ -10,6 +10,12 @@ from meridian.lib.platform.process_scope.base import birth_time_unverified
|
|
|
10
10
|
_PID_REUSE_GUARD_SECS = 30.0
|
|
11
11
|
|
|
12
12
|
|
|
13
|
+
def _is_running_non_zombie(proc: psutil.Process) -> bool:
|
|
14
|
+
"""Return process liveness suitable for cancellation convergence."""
|
|
15
|
+
|
|
16
|
+
return proc.is_running() and proc.status() != psutil.STATUS_ZOMBIE
|
|
17
|
+
|
|
18
|
+
|
|
13
19
|
def is_process_alive(pid: int, created_after_epoch: float | None = None) -> bool:
|
|
14
20
|
"""Check if a PID is alive, with create_time guard for PID reuse."""
|
|
15
21
|
if not psutil.pid_exists(pid):
|
|
@@ -23,7 +29,7 @@ def is_process_alive(pid: int, created_after_epoch: float | None = None) -> bool
|
|
|
23
29
|
and proc.create_time() > created_after_epoch + _PID_REUSE_GUARD_SECS
|
|
24
30
|
):
|
|
25
31
|
return False
|
|
26
|
-
return proc
|
|
32
|
+
return _is_running_non_zombie(proc)
|
|
27
33
|
except psutil.NoSuchProcess:
|
|
28
34
|
return False
|
|
29
35
|
except psutil.AccessDenied:
|
|
@@ -42,7 +48,7 @@ def is_process_alive_with_birth(pid: int, birth_epoch: float | None) -> bool:
|
|
|
42
48
|
proc = psutil.Process(pid)
|
|
43
49
|
if abs(proc.create_time() - birth_epoch) > 1.0:
|
|
44
50
|
return False
|
|
45
|
-
return proc
|
|
51
|
+
return _is_running_non_zombie(proc)
|
|
46
52
|
except psutil.NoSuchProcess:
|
|
47
53
|
return False
|
|
48
54
|
except psutil.AccessDenied:
|
|
@@ -7,6 +7,7 @@ from contextlib import ExitStack
|
|
|
7
7
|
from pathlib import Path
|
|
8
8
|
from typing import IO, Any, Literal, NamedTuple, cast
|
|
9
9
|
|
|
10
|
+
import psutil
|
|
10
11
|
from pydantic import BaseModel, ConfigDict, ValidationError
|
|
11
12
|
|
|
12
13
|
from meridian.lib.core.types import (
|
|
@@ -25,7 +26,7 @@ from meridian.lib.platform.locking import (
|
|
|
25
26
|
)
|
|
26
27
|
from meridian.lib.state.atomic import atomic_write_text
|
|
27
28
|
from meridian.lib.state.event_store import append_event, read_events, utc_now_iso
|
|
28
|
-
from meridian.lib.state.liveness import
|
|
29
|
+
from meridian.lib.state.liveness import is_process_alive_with_birth
|
|
29
30
|
from meridian.lib.state.paths import RuntimePaths, normalize_path_for_write
|
|
30
31
|
|
|
31
32
|
|
|
@@ -175,36 +176,51 @@ def _generation_matches(expected: str, actual: str) -> bool:
|
|
|
175
176
|
return normalized_expected == normalized_actual
|
|
176
177
|
|
|
177
178
|
|
|
178
|
-
def _read_session_lease_data(
|
|
179
|
+
def _read_session_lease_data(
|
|
180
|
+
paths: RuntimePaths,
|
|
181
|
+
chat_id: str,
|
|
182
|
+
) -> tuple[bool, str, int | None, float | None]:
|
|
179
183
|
lease_path = _session_lease_path(paths, chat_id)
|
|
180
184
|
if not lease_path.is_file():
|
|
181
|
-
return (False, "", None)
|
|
185
|
+
return (False, "", None, None)
|
|
182
186
|
try:
|
|
183
187
|
payload = json.loads(lease_path.read_text(encoding="utf-8"))
|
|
184
188
|
except (json.JSONDecodeError, OSError):
|
|
185
|
-
return (False, "", None)
|
|
189
|
+
return (False, "", None, None)
|
|
186
190
|
if not isinstance(payload, dict):
|
|
187
|
-
return (False, "", None)
|
|
191
|
+
return (False, "", None, None)
|
|
188
192
|
payload_dict = cast("dict[str, Any]", payload)
|
|
189
193
|
generation = payload_dict.get("session_instance_id")
|
|
190
194
|
owner_pid = payload_dict.get("owner_pid")
|
|
195
|
+
owner_created_at_epoch = payload_dict.get("owner_created_at_epoch")
|
|
191
196
|
parsed_owner_pid = (
|
|
192
197
|
owner_pid if isinstance(owner_pid, int) and not isinstance(owner_pid, bool) else None
|
|
193
198
|
)
|
|
199
|
+
parsed_owner_created_at_epoch = (
|
|
200
|
+
float(owner_created_at_epoch)
|
|
201
|
+
if isinstance(owner_created_at_epoch, int | float)
|
|
202
|
+
and not isinstance(owner_created_at_epoch, bool)
|
|
203
|
+
else None
|
|
204
|
+
)
|
|
194
205
|
if isinstance(generation, str):
|
|
195
|
-
return (True, generation, parsed_owner_pid)
|
|
196
|
-
return (True, "", parsed_owner_pid)
|
|
206
|
+
return (True, generation, parsed_owner_pid, parsed_owner_created_at_epoch)
|
|
207
|
+
return (True, "", parsed_owner_pid, parsed_owner_created_at_epoch)
|
|
197
208
|
|
|
198
209
|
|
|
199
210
|
def _read_session_lease(paths: RuntimePaths, chat_id: str) -> tuple[bool, str]:
|
|
200
|
-
lease_exists, generation, _owner_pid = _read_session_lease_data(paths, chat_id)
|
|
211
|
+
lease_exists, generation, _owner_pid, _owner_birth = _read_session_lease_data(paths, chat_id)
|
|
201
212
|
return (lease_exists, generation)
|
|
202
213
|
|
|
203
214
|
|
|
204
215
|
def _write_session_lease(paths: RuntimePaths, chat_id: str, session_instance_id: str) -> None:
|
|
216
|
+
try:
|
|
217
|
+
owner_created_at_epoch: float | None = psutil.Process(os.getpid()).create_time()
|
|
218
|
+
except (psutil.NoSuchProcess, psutil.AccessDenied, OSError):
|
|
219
|
+
owner_created_at_epoch = None
|
|
205
220
|
payload = {
|
|
206
221
|
"chat_id": chat_id,
|
|
207
222
|
"owner_pid": os.getpid(),
|
|
223
|
+
"owner_created_at_epoch": owner_created_at_epoch,
|
|
208
224
|
"session_instance_id": session_instance_id,
|
|
209
225
|
}
|
|
210
226
|
atomic_write_text(
|
|
@@ -514,12 +530,20 @@ def has_live_session_leases(runtime_root: Path) -> bool:
|
|
|
514
530
|
return False
|
|
515
531
|
for lease_path in paths.sessions_dir.glob("*.lease.json"):
|
|
516
532
|
chat_id = lease_path.name.removesuffix(".lease.json")
|
|
517
|
-
_exists, _generation, owner_pid = _read_session_lease_data(paths, chat_id)
|
|
518
|
-
if owner_pid is not None and
|
|
533
|
+
_exists, _generation, owner_pid, owner_birth = _read_session_lease_data(paths, chat_id)
|
|
534
|
+
if owner_pid is not None and is_process_alive_with_birth(owner_pid, owner_birth):
|
|
519
535
|
return True
|
|
520
536
|
return False
|
|
521
537
|
|
|
522
538
|
|
|
539
|
+
def is_session_lease_owner_alive(runtime_root: Path, chat_id: str) -> bool:
|
|
540
|
+
"""Return whether one session's lease names a currently live owner process."""
|
|
541
|
+
|
|
542
|
+
paths = RuntimePaths.from_root_dir(runtime_root)
|
|
543
|
+
_exists, _generation, owner_pid, owner_birth = _read_session_lease_data(paths, chat_id)
|
|
544
|
+
return owner_pid is not None and is_process_alive_with_birth(owner_pid, owner_birth)
|
|
545
|
+
|
|
546
|
+
|
|
523
547
|
def list_active_session_records(runtime_root: Path) -> list[SessionRecord]:
|
|
524
548
|
"""Return materialized records for active sessions."""
|
|
525
549
|
|
|
@@ -705,15 +729,18 @@ def cleanup_stale_sessions(runtime_root: Path) -> StaleSessionCleanup:
|
|
|
705
729
|
stopped_at = utc_now_iso()
|
|
706
730
|
for chat_id, _lock_path, _ in stale:
|
|
707
731
|
existing = records.get(chat_id)
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
732
|
+
(
|
|
733
|
+
lease_exists,
|
|
734
|
+
lease_session_instance_id,
|
|
735
|
+
lease_owner_pid,
|
|
736
|
+
lease_owner_birth,
|
|
737
|
+
) = _read_session_lease_data(paths, chat_id)
|
|
711
738
|
if (
|
|
712
739
|
existing is not None
|
|
713
740
|
and existing.kind == "primary"
|
|
714
741
|
and lease_exists
|
|
715
742
|
and lease_owner_pid is not None
|
|
716
|
-
and
|
|
743
|
+
and is_process_alive_with_birth(lease_owner_pid, lease_owner_birth)
|
|
717
744
|
):
|
|
718
745
|
continue
|
|
719
746
|
stop_session_instance_id = lease_session_instance_id
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|