meridian-cli 0.3.34__tar.gz → 0.3.35__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.34 → meridian_cli-0.3.35}/PKG-INFO +1 -1
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/__init__.py +1 -1
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/spawn_inject.py +19 -11
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/clock.py +1 -1
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/.context/CONTEXT.md +7 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/pi_rpc.py +68 -3
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/semantics.py +2 -1
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/report.py +2 -1
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/streaming_runner.py +1 -2
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/history.py +4 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/spawn/model.py +1 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/spawn/repository.py +3 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/spawn/transitions.py +2 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/spawn_store.py +3 -1
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/.context/CONTEXT.md +33 -8
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/AGENTS.md +5 -1
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/drain_wait.py +48 -9
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/pi_completion_profile.py +21 -4
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/spawn_drain_loop.py +46 -65
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/spawn_manager.py +132 -20
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/spawn_session.py +5 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/.gitignore +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/LICENSE +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/README.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/pyproject.toml +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/ag_ui/__init__.pyi +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/ag_ui/core.pyi +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/__main__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/_cmd_utils.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/agent_help.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/app_tree.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/argv_normalization.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/artifact_cmd.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/bootstrap.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/bootstrap_cmd.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/command_groups.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/config_cmd.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/doctor_cmd.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/entrypoint.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/ext_cmd.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/ext_registration.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/help_content.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/help_tiers.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/hooks_authority.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/hooks_commands.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/kg_cmd.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/main.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/mars_passthrough.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/mermaid_cmd.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/migrate_cmd.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/misc_commands.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/mode.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/models_cmd.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/output.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/primary_launch.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/qi_cmd.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/report_cmd.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/session_cmd.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/spawn.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/startup/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/startup/catalog.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/startup/classify.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/startup/cyclopts_app.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/startup/help.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/startup/lazy_dispatch.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/startup/policy.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/streaming_serve.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/sync_cmd.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/task_dir_cmd.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/telemetry_cmd.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/utils.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/work_cmd.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/workspace_cmd.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/dev/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/dev/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/dev/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/dev/pytests.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/artifact/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/artifact/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/artifact/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/artifact/_serve_dir.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/artifact/service.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/artifact/store.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/bootstrap/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/bootstrap/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/bootstrap/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/bootstrap/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/bootstrap/config.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/bootstrap/project_state.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/bootstrap/runtime_state.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/bootstrap/services.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/catalog/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/catalog/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/catalog/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/catalog/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/catalog/agent.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/catalog/bootstrap.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/catalog/catalog_session.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/catalog/model_aliases.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/catalog/models.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/catalog/skill.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/config/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/config/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/config/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/config/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/config/catalog.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/config/context_config.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/config/preserving_edit.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/config/project_config_state.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/config/project_paths.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/config/project_root.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/config/schema.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/config/settings.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/config/workspace.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/context/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/context/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/context/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/context/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/context/resolver.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/child_env.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/codec.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/command_strings.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/context.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/conversation.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/depth.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/domain.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/execution_policy.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/formatting.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/launch_policy_snapshot.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/lifecycle.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/logging.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/overrides.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/process_cleanup.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/resolved_context.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/sink.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/spawn_lifecycle.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/spawn_service.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/spawn_start.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/telemetry.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/types.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/util.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/diagnostics.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/commands/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/commands/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/commands/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/commands/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/commands/biomed.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/commands/mermaid.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/commands/sessions.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/commands/workbench.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/context.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/descriptors.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/dispatcher.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/first_party.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/observability.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/registry.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/types.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/.context/pi-integration.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/.context/session-transcripts.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/adapter.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/bundle.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/claude.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/claude_preflight.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/claude_sessions.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/claude_utils.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/codex.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/codex_rollout.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/common.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/base.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/claude_ws.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/codex_ws.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/cursor_subprocess.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/errors.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/liveness.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/managed_backend.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/opencode_http.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/resident_backend.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/control_action.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/cost.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/cursor.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/errors.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/extractor.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/extractors/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/extractors/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/extractors/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/extractors/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/extractors/base.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/extractors/claude.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/extractors/codex.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/extractors/cursor.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/extractors/opencode.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/extractors/pi.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/launch_spec.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/launch_types.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/opencode.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/opencode_report.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/opencode_storage.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/opencode_transcript.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/passthrough/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/passthrough/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/passthrough/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/passthrough/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/passthrough/base.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/passthrough/claude.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/passthrough/codex.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/passthrough/opencode.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/passthrough/registry.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/permission_broker.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/pi.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/pi_lifecycle_events.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/pi_paths.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/pi_runtime_resolver.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/_guards.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/permission_flags.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/pi_extension_projection.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/project_claude.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/project_codex_common.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/project_codex_streaming.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/project_codex_subprocess.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/project_cursor.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/project_opencode_streaming.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/project_opencode_subprocess.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/project_pi_native_tui.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/project_pi_rpc.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/projection_errors.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/registry.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/session_detection.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/transcript.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/builtin/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/builtin/.context/FUTURE +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/builtin/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/builtin/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/builtin/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/builtin/autosync_store.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/builtin/base.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/builtin/git_autosync.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/builtin_registry.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/config.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/dispatch.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/interval.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/registry.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/runner.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/types.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ignores.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/kg/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/kg/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/kg/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/kg/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/kg/graph.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/kg/report.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/kg/serializer.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/kg/types.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/artifact_io.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/bundle_adapter.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/claude_session_access.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/command.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/compiler.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/composition.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/composition_spawn.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/constants.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/context.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/continue_replay.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/cwd.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/env.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/errors.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/extract.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/fork.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/launch_types.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/materialize.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/permissions.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/plan.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/policies.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/policy_snapshot.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/process/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/process/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/process/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/process/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/process/ports.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/process/primary_attach.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/process/pty_launcher.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/process/runner.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/process/session.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/process/subprocess_launcher.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/process/windows_launcher.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/prompt.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/prompt_context.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/reference.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/request.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/resolution.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/resolve.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/run_inputs.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/runner_helpers.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/session_scope.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/signals.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/spawn_guidance.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/streaming/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/streaming/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/streaming/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/streaming/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/streaming/heartbeat.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/streaming/terminal_arbitrator.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/text_utils.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/types.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/workspace.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/workspace_projection.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/written_files.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/markdown/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/markdown/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/markdown/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/markdown/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/markdown/extract.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/markdown/types.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/report.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/scanner.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/serializer.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/style/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/style/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/style/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/style/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/style/bare_end.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/style/fill_no_color.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/style/line_map.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/style/ox_edge.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/style/preprocess.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/style/suppression.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/style/types.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/validator.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/observability/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/observability/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/observability/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/observability/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/observability/debug_tracer.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/observability/trace_helpers.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/.context/FUTURE +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/catalog.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/commands.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/config.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/config_surface.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/context.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/diag.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/hooks.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/init_ops.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/mars.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/migration.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/pruning.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/qi.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/reference.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/reference_recovery.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/report.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/runtime.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/session_corpus.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/session_export.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/session_log.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/session_log_render.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/session_render.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/session_repair.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/session_repair_target.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/session_search.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/session_target.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/session_transcript.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/api.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/context_ref.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/execute.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/execute_bg.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/execute_init.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/execute_runner.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/execute_session.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/failure_policy.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/models.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/pre_init.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/prepare.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/query.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/task_dir.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/sync_conflicts.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/work_attachment.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/work_dashboard.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/work_lifecycle.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/work_sessions.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/workspace.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/atomic.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/detached_process.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/locking.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/parent_watchdog.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/process_scope/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/process_scope/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/process_scope/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/process_scope/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/process_scope/base.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/process_scope/fallback.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/process_scope/posix.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/process_scope/windows_job.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/terminate.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/unix_modules.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/safety/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/safety/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/safety/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/safety/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/safety/budget.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/safety/guardrails.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/safety/permissions.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/safety/redaction.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/service_context.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/spawn/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/spawn/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/spawn/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/spawn/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/spawn/archive.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/.context/TODO +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/artifact_store.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/atomic.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/event_store.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/failure_sentinel.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/launch_boundary.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/liveness.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/managed_primary.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/paths.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/primary_meta.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/process_scope_projection.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/reaper.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/reaper_cleanup_claim.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/reconciliation.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/runtime_root.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/session_identity.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/session_store.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/spawn/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/spawn/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/spawn/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/spawn/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/spawn/terminal_policy.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/spawn_report.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/spawn_scope.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/spawn_signals.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/spawn_tree.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/timestamps.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/user_paths.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/wordgen.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/wordlists.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/work_repository.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/work_scope.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/work_store.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/.context/pi-drain.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/.context/signal-cancellation.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/completion_contracts.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/completion_coordinator.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/completion_nudge.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/control_socket.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/descendant_evidence.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/disk_watcher.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/drain_coordinator.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/drain_plan_factory.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/drain_policy.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/drain_teardown.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/event_observers.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/heartbeat.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/pi_drain.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/pi_drain_teardown.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/pi_process_cleanup.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/pi_quiescence.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/pi_subspawn_tracker.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/pi_work_ledger.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/resident_drain.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/signal_canceller.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/spawn_dispatch.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/types.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/bootstrap.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/correlation.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/events.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/init.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/local_jsonl.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/maintenance.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/observer.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/observers.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/query.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/reader.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/retention.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/router.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/sinks.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/status.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/tools.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/utils/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/utils/time.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/README.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/dist/extensions/managed-bash/index.js +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/dist/extensions/meridian-spawn-watch/index.js +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/managed-bash/bundle.smoke.test.ts +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/managed-bash/src/bash_log_store.ts +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/managed-bash/src/bash_runtime.test.ts +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/managed-bash/src/bash_runtime.ts +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/managed-bash/src/index.ts +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/meridian-spawn-watch/bundle.smoke.test.ts +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/meridian-spawn-watch/src/index.test.ts +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/meridian-spawn-watch/src/index.ts +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/ids.ts +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/json_file.ts +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/log_overlay.ts +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/meridian_cli.ts +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/meridian_spawn.test.ts +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/meridian_spawn.ts +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/pi_harness_profile.ts +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/pi_state_paths.ts +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/schemas.ts +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/selectable_panel.test.ts +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/selectable_panel.ts +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/spawn_origins.test.ts +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/spawn_origins.ts +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/ui.ts +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/package.json +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/pnpm-lock.yaml +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/pnpm-workspace.yaml +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/scripts/verify-extensions-loop.mjs +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/vitest.config.ts +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/plugin_api/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/plugin_api/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/plugin_api/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/plugin_api/config.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/plugin_api/fs.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/plugin_api/git.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/plugin_api/state.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/plugin_api/types.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/py.typed +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/server/AGENTS.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/server/CLAUDE.md +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/server/__init__.py +0 -0
- {meridian_cli-0.3.34 → meridian_cli-0.3.35}/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.35
|
|
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
|
|
@@ -6,13 +6,20 @@ import asyncio
|
|
|
6
6
|
import errno
|
|
7
7
|
import json
|
|
8
8
|
import sys
|
|
9
|
+
import time
|
|
9
10
|
from typing import cast
|
|
10
11
|
|
|
12
|
+
from meridian.lib.core.spawn_lifecycle import ACTIVE_SPAWN_STATUSES
|
|
11
13
|
from meridian.lib.ops.runtime import (
|
|
12
14
|
resolve_runtime_root,
|
|
13
15
|
resolve_runtime_root_and_config,
|
|
14
16
|
)
|
|
15
17
|
from meridian.lib.platform import IS_WINDOWS
|
|
18
|
+
from meridian.lib.state import spawn_store
|
|
19
|
+
|
|
20
|
+
_INJECT_RESPONSE_TIMEOUT_SECONDS = 30.0
|
|
21
|
+
_ENDPOINT_DISCOVERY_TIMEOUT_SECONDS = 30.0
|
|
22
|
+
_ENDPOINT_DISCOVERY_POLL_SECONDS = 0.1
|
|
16
23
|
|
|
17
24
|
|
|
18
25
|
def _fail(message: str) -> None:
|
|
@@ -55,7 +62,9 @@ async def _send_and_receive(
|
|
|
55
62
|
try:
|
|
56
63
|
writer.write((json.dumps(request, separators=(",", ":")) + "\n").encode("utf-8"))
|
|
57
64
|
await writer.drain()
|
|
58
|
-
return await asyncio.wait_for(
|
|
65
|
+
return await asyncio.wait_for(
|
|
66
|
+
reader.readline(), timeout=_INJECT_RESPONSE_TIMEOUT_SECONDS
|
|
67
|
+
)
|
|
59
68
|
finally:
|
|
60
69
|
writer.close()
|
|
61
70
|
await writer.wait_closed()
|
|
@@ -87,19 +96,18 @@ async def inject_message(
|
|
|
87
96
|
if not normalized_message:
|
|
88
97
|
_fail("message is required")
|
|
89
98
|
|
|
90
|
-
# The control socket/port may not be visible immediately after spawn start.
|
|
91
|
-
# Retry briefly to tolerate the startup race.
|
|
92
|
-
_SOCKET_WAIT_ATTEMPTS = 3
|
|
93
|
-
_SOCKET_WAIT_INTERVAL = 1.0
|
|
94
|
-
|
|
95
99
|
discovery_path = port_file if IS_WINDOWS else socket_path
|
|
96
|
-
|
|
100
|
+
discovery_deadline = time.monotonic() + _ENDPOINT_DISCOVERY_TIMEOUT_SECONDS
|
|
101
|
+
while True:
|
|
102
|
+
record = spawn_store.get_spawn(runtime_root, normalized_spawn_id)
|
|
103
|
+
if record is None or record.status not in ACTIVE_SPAWN_STATUSES:
|
|
104
|
+
_fail(f"spawn not running: {normalized_spawn_id} has no control endpoint")
|
|
97
105
|
if discovery_path.exists():
|
|
98
106
|
break
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
107
|
+
remaining = discovery_deadline - time.monotonic()
|
|
108
|
+
if remaining <= 0:
|
|
109
|
+
_fail(f"spawn not running: {normalized_spawn_id} has no control endpoint")
|
|
110
|
+
await asyncio.sleep(min(_ENDPOINT_DISCOVERY_POLL_SECONDS, remaining))
|
|
103
111
|
|
|
104
112
|
request: dict[str, str] = {"type": "user_message", "text": normalized_message}
|
|
105
113
|
|
{meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/.context/CONTEXT.md
RENAMED
|
@@ -31,6 +31,13 @@ connection validates this (`_validate_initial_prompt_requirement()`) and enforce
|
|
|
31
31
|
30-second timeout for the first stdout event after the prompt
|
|
32
32
|
(`_FIRST_STDOUT_AFTER_INITIAL_PROMPT_TIMEOUT_SECONDS`).
|
|
33
33
|
|
|
34
|
+
**Pi injected prompts are acknowledged commands.** Every prompt carries an RPC `id`
|
|
35
|
+
and `streamingBehavior: "followUp"`; the field is valid whether Pi is busy or idle.
|
|
36
|
+
Injected prompts wait for the matching `response` before `send_user_message()` returns.
|
|
37
|
+
A rejected inject is annotated as control-action response evidence, persisted, and
|
|
38
|
+
reported to the injector without becoming a terminal event for the running spawn.
|
|
39
|
+
Initial-prompt rejection remains spawn-fatal.
|
|
40
|
+
|
|
34
41
|
**`opencode_http.py` imports `OPENCODE_CONFIG_CONTENT_ENV` from
|
|
35
42
|
`meridian.lib.launch.workspace_projection`** to preserve the required bootstrap
|
|
36
43
|
dependency direction; see [launch context](../../../launch/.context/CONTEXT.md).
|
|
@@ -68,6 +68,7 @@ _PI_SPAWNED_PROMPT_REQUIRED_REASON: Final[str] = "pi_rpc_spawned_prompt_required
|
|
|
68
68
|
_FIRST_STDOUT_AFTER_INITIAL_PROMPT_TIMEOUT_SECONDS: Final[float] = 30.0
|
|
69
69
|
_BLOCKED_CHILD_ENV_VARS: Final[frozenset[str]] = BLOCKED_CHILD_ENV_VARS
|
|
70
70
|
_PI_SESSION_DIR_FLAG: Final[str] = "--session-dir"
|
|
71
|
+
PI_SUBPROCESS_EXIT_ERROR_PREFIX: Final[str] = "Pi subprocess exited with code "
|
|
71
72
|
_PI_CHILD_WAVE_TIMEOUT_MS_ENV: Final[str] = "MERIDIAN_PI_CHILD_WAVE_TIMEOUT_MS"
|
|
72
73
|
_PI_TASK_PING_INTERVAL_MS_ENV: Final[str] = "MERIDIAN_PI_TASK_PING_INTERVAL_MS"
|
|
73
74
|
_PI_TASK_PING_RESET_ON_ACTIVITY_ENV: Final[str] = "MERIDIAN_PI_TASK_PING_RESET_ON_ACTIVITY"
|
|
@@ -76,6 +77,16 @@ _STREAM_EOF_KIND: Final[Literal["eof"]] = "eof"
|
|
|
76
77
|
_STREAM_ERROR_KIND: Final[Literal["error"]] = "error"
|
|
77
78
|
|
|
78
79
|
|
|
80
|
+
def pi_subprocess_exit_error(return_code: int) -> str:
|
|
81
|
+
"""Return the canonical failure emitted for a non-zero Pi process exit."""
|
|
82
|
+
return f"{PI_SUBPROCESS_EXIT_ERROR_PREFIX}{return_code}."
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def is_pi_subprocess_exit_error(error: str | None) -> bool:
|
|
86
|
+
"""Whether an error originated from the canonical Pi process-exit failure."""
|
|
87
|
+
return error is not None and error.startswith(PI_SUBPROCESS_EXIT_ERROR_PREFIX)
|
|
88
|
+
|
|
89
|
+
|
|
79
90
|
class PiRpcConnection(HarnessConnection[ResolvedLaunchSpec]):
|
|
80
91
|
"""Full-duplex Pi RPC connection over JSONL stdio."""
|
|
81
92
|
|
|
@@ -126,6 +137,8 @@ class PiRpcConnection(HarnessConnection[ResolvedLaunchSpec]):
|
|
|
126
137
|
self._launch_cwd: str | None = None
|
|
127
138
|
self._launch_session_role: str | None = None
|
|
128
139
|
self._events_stream_active = False
|
|
140
|
+
self._prompt_command_seq = 0
|
|
141
|
+
self._pending_prompt_acks: dict[str, asyncio.Future[None]] = {}
|
|
129
142
|
|
|
130
143
|
@property
|
|
131
144
|
def state(self) -> ConnectionState:
|
|
@@ -250,11 +263,28 @@ class PiRpcConnection(HarnessConnection[ResolvedLaunchSpec]):
|
|
|
250
263
|
return self._state == "connected"
|
|
251
264
|
|
|
252
265
|
async def send_user_message(self, text: str) -> None:
|
|
266
|
+
await self._send_prompt(text, wait_for_ack=True)
|
|
267
|
+
|
|
268
|
+
async def _send_prompt(self, text: str, *, wait_for_ack: bool) -> None:
|
|
269
|
+
command_id = f"meridian-prompt-{self._prompt_command_seq}"
|
|
270
|
+
self._prompt_command_seq += 1
|
|
253
271
|
payload: dict[str, object] = {
|
|
272
|
+
"id": command_id,
|
|
254
273
|
"type": "prompt",
|
|
255
274
|
"message": text,
|
|
275
|
+
"streamingBehavior": "followUp",
|
|
256
276
|
}
|
|
257
|
-
|
|
277
|
+
if not wait_for_ack:
|
|
278
|
+
await self._send_rpc_message(payload, event="prompt")
|
|
279
|
+
return
|
|
280
|
+
|
|
281
|
+
ack = asyncio.get_running_loop().create_future()
|
|
282
|
+
self._pending_prompt_acks[command_id] = ack
|
|
283
|
+
try:
|
|
284
|
+
await self._send_rpc_message(payload, event="prompt")
|
|
285
|
+
await ack
|
|
286
|
+
finally:
|
|
287
|
+
self._pending_prompt_acks.pop(command_id, None)
|
|
258
288
|
|
|
259
289
|
async def send_steer(self, text: str) -> None:
|
|
260
290
|
payload: dict[str, object] = {
|
|
@@ -381,7 +411,7 @@ class PiRpcConnection(HarnessConnection[ResolvedLaunchSpec]):
|
|
|
381
411
|
break
|
|
382
412
|
if return_code != 0 and self._state not in {"stopping", "stopped"}:
|
|
383
413
|
detail = self._failure_detail_with_stderr(
|
|
384
|
-
|
|
414
|
+
pi_subprocess_exit_error(return_code)
|
|
385
415
|
)
|
|
386
416
|
self._mark_failed(detail)
|
|
387
417
|
yield self._error_event(detail)
|
|
@@ -622,6 +652,10 @@ class PiRpcConnection(HarnessConnection[ResolvedLaunchSpec]):
|
|
|
622
652
|
raw_line=payload_text,
|
|
623
653
|
)
|
|
624
654
|
|
|
655
|
+
if normalized_type == "response" and self._resolve_prompt_ack(payload):
|
|
656
|
+
payload = dict(payload)
|
|
657
|
+
payload["meridian_control_action"] = "inject"
|
|
658
|
+
|
|
625
659
|
return HarnessEvent(
|
|
626
660
|
event_type=normalized_type,
|
|
627
661
|
payload=payload,
|
|
@@ -629,6 +663,27 @@ class PiRpcConnection(HarnessConnection[ResolvedLaunchSpec]):
|
|
|
629
663
|
raw_text=line,
|
|
630
664
|
)
|
|
631
665
|
|
|
666
|
+
def _resolve_prompt_ack(self, payload: dict[str, object]) -> bool:
|
|
667
|
+
if str(payload.get("command", "")).strip().lower() != "prompt":
|
|
668
|
+
return False
|
|
669
|
+
command_id = payload.get("id")
|
|
670
|
+
if not isinstance(command_id, str):
|
|
671
|
+
return False
|
|
672
|
+
pending = self._pending_prompt_acks.get(command_id)
|
|
673
|
+
if pending is None or pending.done():
|
|
674
|
+
return False
|
|
675
|
+
if payload.get("success") is True:
|
|
676
|
+
pending.set_result(None)
|
|
677
|
+
else:
|
|
678
|
+
error = payload.get("error")
|
|
679
|
+
detail = (
|
|
680
|
+
error.strip()
|
|
681
|
+
if isinstance(error, str) and error.strip()
|
|
682
|
+
else "pi_prompt_rejected"
|
|
683
|
+
)
|
|
684
|
+
pending.set_exception(RuntimeError(detail))
|
|
685
|
+
return True
|
|
686
|
+
|
|
632
687
|
def _has_unsupported_lifecycle_schema_version(
|
|
633
688
|
self,
|
|
634
689
|
*,
|
|
@@ -713,7 +768,7 @@ class PiRpcConnection(HarnessConnection[ResolvedLaunchSpec]):
|
|
|
713
768
|
if not prompt.strip():
|
|
714
769
|
self._initial_prompt_sent = True
|
|
715
770
|
return False
|
|
716
|
-
await self.
|
|
771
|
+
await self._send_prompt(prompt, wait_for_ack=False)
|
|
717
772
|
self._initial_prompt_sent = True
|
|
718
773
|
return True
|
|
719
774
|
|
|
@@ -785,6 +840,7 @@ class PiRpcConnection(HarnessConnection[ResolvedLaunchSpec]):
|
|
|
785
840
|
)
|
|
786
841
|
|
|
787
842
|
async def _cleanup_resources(self, *, terminate_process: bool) -> bool:
|
|
843
|
+
self._fail_pending_prompt_acks()
|
|
788
844
|
stop_escalated = False
|
|
789
845
|
if terminate_process:
|
|
790
846
|
stop_escalated = await self._terminate_process()
|
|
@@ -792,6 +848,15 @@ class PiRpcConnection(HarnessConnection[ResolvedLaunchSpec]):
|
|
|
792
848
|
self._close_log_handles()
|
|
793
849
|
return stop_escalated
|
|
794
850
|
|
|
851
|
+
def _fail_pending_prompt_acks(self) -> None:
|
|
852
|
+
for pending in self._pending_prompt_acks.values():
|
|
853
|
+
if not pending.done():
|
|
854
|
+
pending.set_exception(
|
|
855
|
+
ConnectionNotReady(
|
|
856
|
+
"Pi RPC connection closed before prompt acknowledgement."
|
|
857
|
+
)
|
|
858
|
+
)
|
|
859
|
+
|
|
795
860
|
async def _terminate_process(self) -> bool:
|
|
796
861
|
process = self._process
|
|
797
862
|
if process is None:
|
|
@@ -218,7 +218,8 @@ def terminal_outcome(
|
|
|
218
218
|
|
|
219
219
|
if event.harness_id == HarnessId.PI.value and event.event_type == "response":
|
|
220
220
|
command = str(event.payload.get("command", "")).strip().lower()
|
|
221
|
-
|
|
221
|
+
is_inject_response = event.payload.get("meridian_control_action") == "inject"
|
|
222
|
+
if command == "prompt" and event.payload.get("success") is False and not is_inject_response:
|
|
222
223
|
error = _stringify_terminal_error(event.payload.get("error")) or "pi_prompt_rejected"
|
|
223
224
|
return TerminalEventOutcome(status="failed", exit_code=1, error=error)
|
|
224
225
|
|
|
@@ -203,7 +203,8 @@ def _pi_failure_from_payload(payload: dict[str, object]) -> str | None:
|
|
|
203
203
|
event_type = _event_name(payload)
|
|
204
204
|
if event_type == "response":
|
|
205
205
|
command = str(payload.get("command", "")).strip().lower()
|
|
206
|
-
|
|
206
|
+
is_inject_response = payload.get("meridian_control_action") == "inject"
|
|
207
|
+
if command == "prompt" and payload.get("success") is False and not is_inject_response:
|
|
207
208
|
error = _text_from_value(payload.get("error"))
|
|
208
209
|
return error or "pi_prompt_rejected"
|
|
209
210
|
if event_type == _PI_LIFECYCLE_PHASE_EVENT:
|
|
@@ -780,10 +780,9 @@ async def _run_streaming_attempt(
|
|
|
780
780
|
timed_out = True
|
|
781
781
|
await manager.stop_spawn(
|
|
782
782
|
run.spawn_id,
|
|
783
|
-
status="
|
|
783
|
+
status="timed_out",
|
|
784
784
|
exit_code=3,
|
|
785
785
|
error="timeout",
|
|
786
|
-
prefer_drain_outcome=True,
|
|
787
786
|
)
|
|
788
787
|
drain_exit_code = 3
|
|
789
788
|
elif decision.trigger == TriggerKind.WATCHDOG:
|
|
@@ -8,6 +8,7 @@ from dataclasses import dataclass, field
|
|
|
8
8
|
from pathlib import Path
|
|
9
9
|
from typing import Any, cast
|
|
10
10
|
|
|
11
|
+
from meridian.lib.core.clock import Clock, RealClock
|
|
11
12
|
from meridian.lib.harness.connections.base import HarnessEvent
|
|
12
13
|
from meridian.lib.state.atomic import append_text_line
|
|
13
14
|
from meridian.lib.state.managed_primary import ManagedPrimaryCausalTracker
|
|
@@ -27,6 +28,7 @@ class HarnessHistoryWriter:
|
|
|
27
28
|
"""Append-only writer for seq-enveloped raw harness events."""
|
|
28
29
|
|
|
29
30
|
history_path: Path
|
|
31
|
+
clock: Clock = field(default_factory=RealClock)
|
|
30
32
|
_seq: int = field(default=0, init=False)
|
|
31
33
|
_byte_offset: int = field(default=0, init=False)
|
|
32
34
|
_causal_tracker: ManagedPrimaryCausalTracker = field(
|
|
@@ -60,6 +62,7 @@ class HarnessHistoryWriter:
|
|
|
60
62
|
envelope = {
|
|
61
63
|
"seq": self._seq,
|
|
62
64
|
"byte_offset": self._byte_offset,
|
|
65
|
+
"timestamp": self.clock.utc_now_iso(),
|
|
63
66
|
"turn_id": causal.turn_id,
|
|
64
67
|
"item_id": causal.item_id,
|
|
65
68
|
"request_id": causal.request_id,
|
|
@@ -211,6 +214,7 @@ def strip_seq_envelope(envelope: dict[str, Any]) -> dict[str, Any]:
|
|
|
211
214
|
not in (
|
|
212
215
|
"seq",
|
|
213
216
|
"byte_offset",
|
|
217
|
+
"timestamp",
|
|
214
218
|
"turn_id",
|
|
215
219
|
"item_id",
|
|
216
220
|
"request_id",
|
|
@@ -75,6 +75,7 @@ class StoredSpawnState(BaseModel):
|
|
|
75
75
|
runner_exit_at: str | None = None
|
|
76
76
|
cancel_intent: CancelIntent | None = None
|
|
77
77
|
finished_at: str | None = None
|
|
78
|
+
published_at: str | None = None
|
|
78
79
|
exit_code: int | None = None
|
|
79
80
|
duration_secs: float | None = None
|
|
80
81
|
total_cost_usd: float | None = None
|
|
@@ -150,6 +151,7 @@ def record_to_stored_state(
|
|
|
150
151
|
runner_exit_at=record.runner_exit_at,
|
|
151
152
|
cancel_intent=record.cancel_intent,
|
|
152
153
|
finished_at=record.finished_at,
|
|
154
|
+
published_at=record.published_at,
|
|
153
155
|
exit_code=record.exit_code,
|
|
154
156
|
duration_secs=record.duration_secs,
|
|
155
157
|
total_cost_usd=record.total_cost_usd,
|
|
@@ -210,6 +212,7 @@ def stored_state_to_record(
|
|
|
210
212
|
runner_exit_at=stored.runner_exit_at,
|
|
211
213
|
cancel_intent=stored.cancel_intent,
|
|
212
214
|
finished_at=stored.finished_at,
|
|
215
|
+
published_at=stored.published_at,
|
|
213
216
|
exit_code=stored.exit_code,
|
|
214
217
|
duration_secs=stored.duration_secs,
|
|
215
218
|
total_cost_usd=stored.total_cost_usd,
|
|
@@ -116,6 +116,7 @@ def apply_finalize(
|
|
|
116
116
|
*,
|
|
117
117
|
origin: SpawnOrigin,
|
|
118
118
|
finished_at: str,
|
|
119
|
+
published_at: str,
|
|
119
120
|
duration_secs: float | None = None,
|
|
120
121
|
usage: TokenUsage | None = None,
|
|
121
122
|
error: str | None = None,
|
|
@@ -135,6 +136,7 @@ def apply_finalize(
|
|
|
135
136
|
"status": status,
|
|
136
137
|
"exit_code": exit_code,
|
|
137
138
|
"finished_at": finished_at,
|
|
139
|
+
"published_at": published_at,
|
|
138
140
|
"duration_secs": duration_secs,
|
|
139
141
|
"total_cost_usd": usage.total_cost_usd if usage is not None else None,
|
|
140
142
|
"input_tokens": usage.input_tokens if usage is not None else None,
|
|
@@ -691,12 +691,14 @@ def finalize_spawn(
|
|
|
691
691
|
)
|
|
692
692
|
raise _FinalizeRejected(current)
|
|
693
693
|
was_active = is_active_spawn_status(current.status)
|
|
694
|
+
published_at = resolved_clock.utc_now_iso()
|
|
694
695
|
return apply_finalize(
|
|
695
696
|
current,
|
|
696
697
|
status,
|
|
697
698
|
exit_code,
|
|
698
699
|
origin=origin,
|
|
699
|
-
finished_at=finished_at or
|
|
700
|
+
finished_at=finished_at or published_at,
|
|
701
|
+
published_at=published_at,
|
|
700
702
|
duration_secs=duration_secs,
|
|
701
703
|
usage=usage,
|
|
702
704
|
error=error,
|
|
@@ -29,8 +29,12 @@ SpawnSession
|
|
|
29
29
|
├─ control_server: ControlSocketServer
|
|
30
30
|
├─ completion_future: Future[DrainOutcome]
|
|
31
31
|
├─ teardown: DrainSessionTeardown
|
|
32
|
+
├─ drain_plan: DrainPlan ← full plan for terminal publication
|
|
32
33
|
├─ cancel_sent: bool ← double-cancel guard
|
|
33
|
-
|
|
34
|
+
├─ control_actions: ControlActionCoordinator
|
|
35
|
+
├─ authoritative_stop_outcome: DrainOutcome | None ← explicit stop intent
|
|
36
|
+
├─ terminal_published: bool ← idempotent publication guard
|
|
37
|
+
└─ cleanup_task: Task | None ← per-spawn post-publication teardown
|
|
34
38
|
```
|
|
35
39
|
|
|
36
40
|
The implementation is split by responsibility:
|
|
@@ -98,15 +102,24 @@ so resident and plain drain paths never see it as a parent completion candidate.
|
|
|
98
102
|
`PrimaryEventScope` is the only scope contract passed through the drain stack; do
|
|
99
103
|
not preserve or add compatibility side channels such as a Codex-only thread-id path.
|
|
100
104
|
|
|
101
|
-
### DrainOutcome
|
|
105
|
+
### DrainOutcome Classification
|
|
102
106
|
|
|
103
|
-
|
|
107
|
+
The drain loop classifies its outcome, but does not own publication.
|
|
108
|
+
Classification order:
|
|
104
109
|
|
|
105
|
-
1. `
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
+
1. `recorded_terminal_outcome` with `status == "succeeded"` → `succeeded`
|
|
111
|
+
(success takes priority over cancellation)
|
|
112
|
+
2. `asyncio.CancelledError` raised → `cancelled`
|
|
113
|
+
3. Unhandled exception → `failed`
|
|
114
|
+
4. `session.cancel_sent` is True → `cancelled` (exit code 143)
|
|
115
|
+
5. Non-success `recorded_terminal_outcome` from harness → use its status/exit_code/error
|
|
116
|
+
6. Connection closed without a terminal event → `failed` with `connection_closed_without_terminal_event`
|
|
117
|
+
|
|
118
|
+
After classification, `SpawnManager._publish_terminal()` applies
|
|
119
|
+
`resolve_terminal_outcome()` which resolves competing sources: success wins;
|
|
120
|
+
otherwise an authoritative stop outcome (from `stop_spawn()`) wins; otherwise the
|
|
121
|
+
drain classification stands. Publication is idempotent — `terminal_published` on
|
|
122
|
+
`SpawnSession` guards against double publication.
|
|
110
123
|
|
|
111
124
|
### Subscriber Queue Backpressure
|
|
112
125
|
|
|
@@ -122,6 +135,18 @@ concurrent `start_spawn` calls from different event loops.
|
|
|
122
135
|
|
|
123
136
|
### Terminal Publication and Recovery
|
|
124
137
|
|
|
138
|
+
`SpawnManager._publish_terminal()` is the idempotent barrier that owns terminal
|
|
139
|
+
lifecycle publication. It resolves competing terminal sources via
|
|
140
|
+
`resolve_terminal_outcome()` (success > authoritative stop > drain classification),
|
|
141
|
+
runs the plan finalizer, resolves the completion future, notifies observers, and
|
|
142
|
+
starts one per-spawn cleanup task. Both the drain loop's natural exit path and
|
|
143
|
+
`stop_spawn()` call it; the `terminal_published` guard ensures exactly one publication.
|
|
144
|
+
|
|
145
|
+
Cleanup tasks are keyed per spawn (`_cleanup_tasks: dict[SpawnId, Task]`).
|
|
146
|
+
`stop_spawn()` awaits only its own spawn's cleanup. `shutdown()` drains all
|
|
147
|
+
remaining cleanup tasks. This prevents cross-spawn coupling where stopping one
|
|
148
|
+
spawn would block on another's unrelated cleanup.
|
|
149
|
+
|
|
125
150
|
Terminal outcomes publish before plan-owned teardown runs asynchronously and best-effort;
|
|
126
151
|
startup reaper reconciliation recovers incomplete cleanup. Completion deadlines use
|
|
127
152
|
process-local monotonic time and are not persisted or crash-stable.
|
|
@@ -68,6 +68,10 @@ fail, or clear signals for the parent.
|
|
|
68
68
|
inject, interrupt, permission reply, and user-input-reply actions. Calling the
|
|
69
69
|
connection directly breaks this serialization.
|
|
70
70
|
|
|
71
|
+
**Terminal publication belongs to `SpawnManager`.** The drain loop supplies its
|
|
72
|
+
classification, but `stop_spawn()` must still publish the finalized lifecycle row,
|
|
73
|
+
resolve completion, and start that spawn's cleanup when a bounded drain is cancelled.
|
|
74
|
+
|
|
71
75
|
**Drain loop ordering is not negotiable: persist → observe → fan-out.** A failed
|
|
72
76
|
write — including the tenth consecutive failure that aborts the loop with a
|
|
73
77
|
`failed` outcome — is never delivered to the coordinator, observers, or the
|
|
@@ -110,7 +114,7 @@ means the manager died or the spawn is orphaned.
|
|
|
110
114
|
|
|
111
115
|
- `spawn_manager.py` — `SpawnManager`: public live-spawn registry/control API
|
|
112
116
|
- `spawn_dispatch.py` — connection creation/start dispatch
|
|
113
|
-
- `spawn_drain_loop.py` — event drain, persistence/observer/fan-out ordering, outcome priority
|
|
117
|
+
- `spawn_drain_loop.py` — event drain, persistence/observer/fan-out ordering, outcome classification, `resolve_terminal_outcome` priority resolver
|
|
114
118
|
- `drain_coordinator.py` — `DrainCoordinator` protocol seam for harness-specific completion policy
|
|
115
119
|
- `drain_plan_factory.py` — plain/resident/Pi plan selection and capability wiring
|
|
116
120
|
- `drain_teardown.py` — harness-neutral plan-owned connection-stop contract and default
|
|
@@ -3,14 +3,16 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import asyncio
|
|
6
|
+
import logging
|
|
6
7
|
from collections.abc import AsyncIterator
|
|
7
|
-
from contextlib import suppress
|
|
8
8
|
from dataclasses import dataclass
|
|
9
9
|
from typing import Any
|
|
10
10
|
|
|
11
11
|
from meridian.lib.harness.connections.base import HarnessEvent
|
|
12
12
|
from meridian.lib.streaming.drain_coordinator import AuxWakeCoordinator
|
|
13
13
|
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
14
16
|
|
|
15
17
|
@dataclass(frozen=True)
|
|
16
18
|
class DrainEventWake:
|
|
@@ -43,9 +45,12 @@ class DrainInputWaiter:
|
|
|
43
45
|
self,
|
|
44
46
|
events_iter: AsyncIterator[HarnessEvent],
|
|
45
47
|
aux_wake: AuxWakeCoordinator,
|
|
48
|
+
*,
|
|
49
|
+
task_context: str = "drain input",
|
|
46
50
|
) -> None:
|
|
47
51
|
self._events_iter = events_iter
|
|
48
52
|
self._aux_wake = aux_wake
|
|
53
|
+
self._task_context = task_context
|
|
49
54
|
self._pending_event_task: asyncio.Future[HarnessEvent] | None = None
|
|
50
55
|
self._pending_disk_task: asyncio.Task[None] | None = None
|
|
51
56
|
|
|
@@ -98,7 +103,7 @@ class DrainInputWaiter:
|
|
|
98
103
|
self._pending_event_task = None
|
|
99
104
|
return DrainClosedWake()
|
|
100
105
|
finally:
|
|
101
|
-
await _cancel_task(timeout_task)
|
|
106
|
+
await _cancel_task(timeout_task, task_context=f"{self._task_context} timeout")
|
|
102
107
|
|
|
103
108
|
def _consume_ready_disk_change(self) -> bool:
|
|
104
109
|
if self._pending_disk_task is None or not self._pending_disk_task.done():
|
|
@@ -108,13 +113,47 @@ class DrainInputWaiter:
|
|
|
108
113
|
return True
|
|
109
114
|
|
|
110
115
|
async def close(self) -> None:
|
|
111
|
-
await _cancel_task(
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
116
|
+
await _cancel_task(
|
|
117
|
+
self._pending_event_task,
|
|
118
|
+
task_context=f"{self._task_context} event source",
|
|
119
|
+
)
|
|
120
|
+
await _cancel_task(
|
|
121
|
+
self._pending_disk_task,
|
|
122
|
+
task_context=f"{self._task_context} auxiliary wake",
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
async def _cancel_task(
|
|
127
|
+
task: asyncio.Future[Any] | None,
|
|
128
|
+
*,
|
|
129
|
+
task_context: str = "drain task",
|
|
130
|
+
) -> None:
|
|
131
|
+
if task is None:
|
|
132
|
+
return
|
|
133
|
+
if task.done():
|
|
134
|
+
if task.cancelled():
|
|
135
|
+
return
|
|
136
|
+
try:
|
|
137
|
+
task.result()
|
|
138
|
+
except (StopAsyncIteration, asyncio.CancelledError):
|
|
139
|
+
pass
|
|
140
|
+
except Exception as exc:
|
|
141
|
+
logger.warning(
|
|
142
|
+
"Unexpected %s failure while closing: %s",
|
|
143
|
+
task_context,
|
|
144
|
+
exc,
|
|
145
|
+
exc_info=True,
|
|
146
|
+
)
|
|
117
147
|
return
|
|
118
148
|
task.cancel()
|
|
119
|
-
|
|
149
|
+
try:
|
|
120
150
|
await task
|
|
151
|
+
except (StopAsyncIteration, asyncio.CancelledError):
|
|
152
|
+
pass
|
|
153
|
+
except Exception as exc:
|
|
154
|
+
logger.warning(
|
|
155
|
+
"Unexpected %s failure while closing: %s",
|
|
156
|
+
task_context,
|
|
157
|
+
exc,
|
|
158
|
+
exc_info=True,
|
|
159
|
+
)
|
{meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/pi_completion_profile.py
RENAMED
|
@@ -9,6 +9,7 @@ from typing import TYPE_CHECKING, Protocol
|
|
|
9
9
|
|
|
10
10
|
from meridian.lib.core.domain import SpawnStatus
|
|
11
11
|
from meridian.lib.core.types import SpawnId
|
|
12
|
+
from meridian.lib.harness.connections.pi_rpc import is_pi_subprocess_exit_error
|
|
12
13
|
from meridian.lib.harness.pi_lifecycle_events import pi_notification_id
|
|
13
14
|
from meridian.lib.state.spawn_signals import consume_resident_signals
|
|
14
15
|
from meridian.lib.streaming.completion_contracts import (
|
|
@@ -266,8 +267,15 @@ class PiCompletionProfile:
|
|
|
266
267
|
recorded_outcome: TerminalEventOutcome | None,
|
|
267
268
|
) -> ProfileExitDecision:
|
|
268
269
|
del state
|
|
269
|
-
|
|
270
|
-
if
|
|
270
|
+
pending_tracked_work = self.pending_children_at_exit()
|
|
271
|
+
if pending_tracked_work and (
|
|
272
|
+
recorded_outcome is None
|
|
273
|
+
or (
|
|
274
|
+
recorded_outcome.status == "failed"
|
|
275
|
+
and recorded_outcome.exit_code == 1
|
|
276
|
+
and is_pi_subprocess_exit_error(recorded_outcome.error)
|
|
277
|
+
)
|
|
278
|
+
):
|
|
271
279
|
recorded_outcome = _terminal_outcome(
|
|
272
280
|
status="failed",
|
|
273
281
|
exit_code=1,
|
|
@@ -277,7 +285,9 @@ class PiCompletionProfile:
|
|
|
277
285
|
recorded_outcome=recorded_outcome,
|
|
278
286
|
fallback_error=self.fallback_error_without_recorded_outcome(),
|
|
279
287
|
cleanup_reason=(
|
|
280
|
-
"pi_process_exit_with_tracked_children"
|
|
288
|
+
"pi_process_exit_with_tracked_children"
|
|
289
|
+
if pending_tracked_work
|
|
290
|
+
else None
|
|
281
291
|
),
|
|
282
292
|
)
|
|
283
293
|
|
|
@@ -344,7 +354,14 @@ class PiCompletionProfile:
|
|
|
344
354
|
return None
|
|
345
355
|
|
|
346
356
|
def pending_children_at_exit(self) -> bool:
|
|
347
|
-
|
|
357
|
+
if not self.quiescence_enabled:
|
|
358
|
+
return False
|
|
359
|
+
work = self.evidence.classify_outstanding_work()
|
|
360
|
+
return (
|
|
361
|
+
work.spawn_children
|
|
362
|
+
or work.unknown_spawn_children
|
|
363
|
+
or work.non_spawn_processes
|
|
364
|
+
)
|
|
348
365
|
|
|
349
366
|
def fallback_error_without_recorded_outcome(self) -> str | None:
|
|
350
367
|
return self.tracker.notification_failure_error
|