meridian-cli 0.2.23__tar.gz → 0.2.24__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/PKG-INFO +2 -2
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/pyproject.toml +1 -1
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/__init__.py +1 -1
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/config/.context/CONTEXT.md +6 -4
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/config/AGENTS.md +6 -3
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/.context/CONTEXT.md +30 -22
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/AGENTS.md +8 -7
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/claude.py +3 -1
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/projections/project_claude.py +42 -2
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/projections/project_codex_streaming.py +1 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/projections/project_codex_subprocess.py +1 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/projections/project_cursor.py +1 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/projections/project_opencode_streaming.py +1 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/projections/project_opencode_subprocess.py +1 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/projections/project_pi_native_tui.py +1 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/projections/project_pi_rpc.py +1 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/context.py +41 -11
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/launch_types.py +1 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/permissions.py +95 -1
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/prompt.py +51 -2
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/.context/CONTEXT.md +14 -2
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/dist/extensions/managed-bash/index.js +44 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/dist/extensions/meridian-spawn-watch/index.js +224 -151
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/extensions/managed-bash/src/bash_runtime.test.ts +4 -2
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/extensions/managed-bash/src/bash_runtime.ts +2 -0
- meridian_cli-0.2.24/src/meridian/pi_runtime/extensions/meridian-spawn-watch/src/index.test.ts +384 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/extensions/meridian-spawn-watch/src/index.ts +213 -161
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/extensions/shared/pi_state_paths.ts +4 -0
- meridian_cli-0.2.24/src/meridian/pi_runtime/extensions/shared/spawn_origins.test.ts +42 -0
- meridian_cli-0.2.24/src/meridian/pi_runtime/extensions/shared/spawn_origins.ts +46 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/.gitignore +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/LICENSE +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/README.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/ag_ui/__init__.pyi +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/ag_ui/core.pyi +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/__main__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/_cmd_utils.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/agent_help.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/app_tree.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/argv_normalization.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/bootstrap.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/bootstrap_cmd.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/chat_cmd.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/config_cmd.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/doctor_cmd.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/entrypoint.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/ext_cmd.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/ext_registration.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/hooks_authority.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/hooks_commands.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/kg_cmd.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/main.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/mars_passthrough.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/mermaid_cmd.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/migrate_cmd.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/misc_commands.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/models_cmd.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/output.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/primary_launch.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/qi_cmd.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/report_cmd.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/session_cmd.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/spawn.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/spawn_inject.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/startup/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/startup/catalog.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/startup/classify.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/startup/cyclopts_app.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/startup/help.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/startup/lazy_dispatch.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/startup/policy.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/streaming_serve.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/sync_cmd.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/telemetry_cmd.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/utils.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/work_cmd.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/cli/workspace_cmd.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/dev/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/dev/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/dev/pytests.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/bootstrap/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/bootstrap/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/bootstrap/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/bootstrap/config.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/bootstrap/project_state.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/bootstrap/runtime_state.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/bootstrap/services.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/catalog/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/catalog/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/catalog/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/catalog/agent.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/catalog/bootstrap.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/catalog/catalog_session.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/catalog/model_aliases.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/catalog/models.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/catalog/skill.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/backend_acquisition.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/backend_handle.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/checkpoint.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/command_handler.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/command_invariants.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/commands.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/dev_frontend/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/dev_frontend/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/dev_frontend/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/dev_frontend/discovery.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/dev_frontend/launcher.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/dev_frontend/policy.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/dev_frontend/portless.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/dev_frontend/raw_vite.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/dev_frontend/supervisor.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/event_index.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/event_log.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/event_observer.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/event_pipeline.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/frontend.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/normalization/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/normalization/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/normalization/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/normalization/base.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/normalization/claude.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/normalization/codex.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/normalization/common.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/normalization/opencode.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/normalization/registry.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/normalization/synthetic.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/policy.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/protocol.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/recovery.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/replay.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/runtime.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/server.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/session_service.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/chat/ws_fanout.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/config/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/config/catalog.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/config/context_config.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/config/preserving_edit.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/config/project_config_state.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/config/project_paths.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/config/project_root.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/config/schema.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/config/settings.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/config/workspace.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/context/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/context/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/context/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/context/resolver.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/core/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/core/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/core/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/core/child_env.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/core/clock.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/core/codec.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/core/command_strings.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/core/context.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/core/conversation.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/core/depth.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/core/domain.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/core/execution_policy.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/core/formatting.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/core/launch_policy_snapshot.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/core/lifecycle.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/core/logging.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/core/overrides.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/core/process_cleanup.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/core/resolved_context.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/core/sink.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/core/spawn_lifecycle.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/core/spawn_service.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/core/spawn_start.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/core/telemetry.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/core/types.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/core/util.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/diagnostics.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/extensions/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/extensions/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/extensions/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/extensions/commands/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/extensions/commands/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/extensions/commands/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/extensions/commands/biomed.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/extensions/commands/mermaid.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/extensions/commands/sessions.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/extensions/commands/workbench.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/extensions/context.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/extensions/descriptors.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/extensions/dispatcher.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/extensions/first_party.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/extensions/observability.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/extensions/registry.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/extensions/types.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/adapter.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/bundle.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/claude_preflight.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/claude_utils.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/codex.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/codex_rollout.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/common.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/connections/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/connections/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/connections/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/connections/base.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/connections/claude_ws.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/connections/codex_ws.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/connections/cursor_subprocess.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/connections/errors.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/connections/opencode_http.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/connections/pi_rpc.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/control_action.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/cost.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/cursor.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/errors.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/extractor.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/extractors/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/extractors/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/extractors/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/extractors/base.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/extractors/claude.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/extractors/codex.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/extractors/cursor.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/extractors/opencode.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/extractors/pi.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/launch_spec.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/launch_types.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/opencode.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/opencode_storage.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/opencode_transcript.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/passthrough/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/passthrough/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/passthrough/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/passthrough/base.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/passthrough/claude.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/passthrough/codex.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/passthrough/opencode.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/passthrough/registry.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/permission_broker.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/pi.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/pi_lifecycle_events.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/pi_paths.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/pi_runtime_resolver.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/projections/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/projections/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/projections/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/projections/_guards.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/projections/permission_flags.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/projections/pi_extension_projection.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/projections/project_codex_common.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/projections/projection_errors.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/registry.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/semantics.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/session_detection.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/transcript.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/hooks/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/hooks/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/hooks/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/hooks/builtin/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/hooks/builtin/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/hooks/builtin/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/hooks/builtin/autosync_store.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/hooks/builtin/base.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/hooks/builtin/git_autosync.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/hooks/builtin_registry.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/hooks/config.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/hooks/dispatch.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/hooks/interval.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/hooks/registry.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/hooks/runner.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/hooks/types.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ignores.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/kg/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/kg/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/kg/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/kg/graph.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/kg/report.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/kg/serializer.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/kg/types.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/artifact_io.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/bundle_adapter.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/claude_session_access.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/command.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/compiler.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/composition.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/composition_spawn.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/constants.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/cwd.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/env.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/errors.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/extract.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/fork.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/materialize.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/plan.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/policies.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/policy_snapshot.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/process/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/process/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/process/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/process/ports.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/process/primary_attach.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/process/pty_launcher.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/process/runner.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/process/session.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/process/subprocess_launcher.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/process/windows_launcher.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/reference.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/report.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/request.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/resolution.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/resolve.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/run_inputs.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/runner_helpers.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/session_scope.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/signals.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/streaming/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/streaming/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/streaming/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/streaming/heartbeat.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/streaming/terminal_arbitrator.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/streaming_runner.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/text_utils.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/types.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/workspace.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/workspace_projection.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/launch/written_files.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/markdown/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/markdown/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/markdown/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/markdown/extract.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/markdown/types.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/mermaid/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/mermaid/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/mermaid/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/mermaid/report.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/mermaid/scanner.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/mermaid/serializer.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/mermaid/style/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/mermaid/style/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/mermaid/style/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/mermaid/style/bare_end.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/mermaid/style/fill_no_color.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/mermaid/style/line_map.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/mermaid/style/ox_edge.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/mermaid/style/preprocess.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/mermaid/style/suppression.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/mermaid/style/types.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/mermaid/validator.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/observability/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/observability/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/observability/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/observability/debug_tracer.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/observability/trace_helpers.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/catalog.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/commands.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/config.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/config_surface.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/context.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/diag.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/hooks.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/init_ops.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/mars.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/migration.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/pruning.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/qi.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/reference.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/reference_recovery.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/report.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/runtime.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/session_corpus.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/session_export.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/session_log.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/session_log_render.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/session_render.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/session_repair.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/session_search.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/session_target.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/session_transcript.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/spawn/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/spawn/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/spawn/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/spawn/api.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/spawn/context_ref.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/spawn/execute.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/spawn/execute_bg.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/spawn/execute_init.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/spawn/execute_runner.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/spawn/execute_session.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/spawn/failure_policy.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/spawn/models.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/spawn/prepare.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/spawn/query.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/sync_conflicts.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/work_attachment.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/work_dashboard.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/work_lifecycle.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/work_sessions.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/ops/workspace.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/platform/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/platform/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/platform/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/platform/locking.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/platform/process_scope/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/platform/process_scope/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/platform/process_scope/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/platform/process_scope/base.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/platform/process_scope/fallback.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/platform/process_scope/posix.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/platform/process_scope/windows_job.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/platform/terminate.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/platform/unix_modules.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/platform/windows_job.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/safety/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/safety/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/safety/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/safety/budget.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/safety/guardrails.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/safety/permissions.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/safety/redaction.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/service_context.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/spawn/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/spawn/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/spawn/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/spawn/archive.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/artifact_store.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/atomic.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/event_store.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/history.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/launch_boundary.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/liveness.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/managed_primary.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/paths.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/primary_meta.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/process_scope_projection.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/reaper.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/runtime_root.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/session_store.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/spawn/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/spawn/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/spawn/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/spawn/model.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/spawn/repository.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/spawn/terminal_policy.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/spawn/transitions.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/spawn_store.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/user_paths.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/wordgen.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/wordlists.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/state/work_store.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/streaming/.context/CONTEXT.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/streaming/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/streaming/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/streaming/control_socket.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/streaming/disk_watcher.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/streaming/drain_policy.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/streaming/drain_wait.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/streaming/event_observers.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/streaming/heartbeat.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/streaming/pi_drain.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/streaming/pi_process_cleanup.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/streaming/pi_quiescence.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/streaming/pi_subspawn_tracker.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/streaming/signal_canceller.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/streaming/spawn_dispatch.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/streaming/spawn_drain_loop.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/streaming/spawn_manager.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/streaming/spawn_session.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/streaming/types.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/telemetry/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/telemetry/bootstrap.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/telemetry/correlation.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/telemetry/events.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/telemetry/init.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/telemetry/local_jsonl.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/telemetry/maintenance.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/telemetry/observer.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/telemetry/observers.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/telemetry/query.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/telemetry/reader.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/telemetry/retention.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/telemetry/router.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/telemetry/sinks.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/telemetry/status.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/tools.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/utils/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/utils/time.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/README.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/extensions/managed-bash/bundle.smoke.test.ts +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/extensions/managed-bash/src/bash_log_store.ts +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/extensions/managed-bash/src/index.ts +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/extensions/meridian-spawn-watch/bundle.smoke.test.ts +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/extensions/shared/ids.ts +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/extensions/shared/json_file.ts +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/extensions/shared/log_overlay.ts +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/extensions/shared/meridian_cli.ts +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/extensions/shared/meridian_spawn.test.ts +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/extensions/shared/meridian_spawn.ts +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/extensions/shared/pi_harness_profile.ts +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/extensions/shared/schemas.ts +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/extensions/shared/selectable_panel.test.ts +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/extensions/shared/selectable_panel.ts +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/extensions/shared/ui.ts +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/package.json +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/pnpm-lock.yaml +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/pnpm-workspace.yaml +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/scripts/verify-extensions-loop.mjs +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/pi_runtime/vitest.config.ts +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/plugin_api/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/plugin_api/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/plugin_api/config.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/plugin_api/fs.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/plugin_api/git.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/plugin_api/state.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/plugin_api/types.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/py.typed +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/server/AGENTS.md +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/server/__init__.py +0 -0
- {meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/server/main.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: meridian-cli
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.24
|
|
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
|
|
@@ -24,7 +24,7 @@ Requires-Dist: coolname>=4.0.0
|
|
|
24
24
|
Requires-Dist: cyclopts>=3.0
|
|
25
25
|
Requires-Dist: fastapi>=0.115
|
|
26
26
|
Requires-Dist: markdown-it-py>=4.0
|
|
27
|
-
Requires-Dist: mars-agents==0.7.
|
|
27
|
+
Requires-Dist: mars-agents==0.7.12
|
|
28
28
|
Requires-Dist: mcp>=1.0
|
|
29
29
|
Requires-Dist: pathspec>=1.1.0
|
|
30
30
|
Requires-Dist: psutil>=7.2.2
|
|
@@ -111,13 +111,15 @@ time. These follow the same pattern: ambient config snapshot → launch-time env
|
|
|
111
111
|
|
|
112
112
|
- `resolve_pi_harness_profile_for_launch()` — resolves `[harness.pi]` (managed bash,
|
|
113
113
|
load_all_extensions, background_tasks, spawn_watch)
|
|
114
|
-
- `resolve_claude_allow_builtin_agents_for_launch()` — resolves
|
|
115
|
-
`[harness.claude] allow_builtin_agents` from the launch config snapshot, falling
|
|
116
|
-
back to `load_config()` if the snapshot is absent or invalid
|
|
117
114
|
|
|
118
|
-
|
|
115
|
+
Called from `bind_launch_context()` in `lib/launch/context.py` and threaded
|
|
119
116
|
into the harness adapter's `resolve_launch_spec()`.
|
|
120
117
|
|
|
118
|
+
Claude native Agent routing does not use a `meridian.toml` harness option.
|
|
119
|
+
Built-in Claude agents stay denied unconditionally; generic `Agent` permission
|
|
120
|
+
follows Mars `[settings.agent_copy]` via `project_has_claude_agent_copy()` in
|
|
121
|
+
`lib/launch/permissions.py`.
|
|
122
|
+
|
|
121
123
|
## Schema Metadata (`schema.py`)
|
|
122
124
|
|
|
123
125
|
`config_field(canonical_key, value_kind=..., file_aliases=..., env_vars=...)` attaches
|
|
@@ -70,9 +70,12 @@ Claude profile includes:
|
|
|
70
70
|
- `[harness.claude] model` — default model (string, env: `MERIDIAN_HARNESS_MODEL_CLAUDE`)
|
|
71
71
|
- `[harness.claude] wait_yield_seconds` — polling interval (float, env:
|
|
72
72
|
`MERIDIAN_HARNESS_WAIT_YIELD_SECONDS_CLAUDE`)
|
|
73
|
-
- `[harness.claude] allow_builtin_agents` —
|
|
74
|
-
|
|
75
|
-
|
|
73
|
+
- `[harness.claude] allow_builtin_agents` — parsed Claude harness field from
|
|
74
|
+
config release plumbing; Claude native Agent routing is still enforced by the
|
|
75
|
+
harness projection.
|
|
76
|
+
- Claude native Agent routing is not a `meridian.toml` harness policy. Built-in
|
|
77
|
+
Claude agents stay denied; generic `Agent` follows Mars `[settings.agent_copy]`
|
|
78
|
+
with `.claude` target materialization.
|
|
76
79
|
|
|
77
80
|
## Depth
|
|
78
81
|
|
|
@@ -39,9 +39,12 @@ Per-harness mapping:
|
|
|
39
39
|
- Claude subprocess: `claude -p --output-format stream-json --verbose -`
|
|
40
40
|
- Claude connection: `claude -p --input-format stream-json --output-format stream-json --verbose` (stdin/stdout NDJSON, not WebSocket despite `claude_ws.py` name)
|
|
41
41
|
- **Claude built-in agent denial**: Meridian injects `--disallowedTools
|
|
42
|
-
Agent(Explore),Agent(Plan),Agent(general-purpose)`
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
Agent(Explore),Agent(Plan),Agent(General-purpose),Agent(general-purpose)`
|
|
43
|
+
unconditionally. The denials merge into permission-derived `--disallowedTools` via
|
|
44
|
+
`dedupe_nonempty()`. Generic
|
|
45
|
+
`Agent` is gated by Mars `[settings.agent_copy]`: allowed only when
|
|
46
|
+
`harnesses = ["claude"]` and `.claude` is a target. Parent/passthrough allowed-tool
|
|
47
|
+
tails are merged into the managed projection; Meridian's Agent denies stay authoritative.
|
|
45
48
|
- Codex subprocess: `codex exec --json`; connection: `codex app-server` (real WebSocket, JSON-RPC 2.0)
|
|
46
49
|
- OpenCode subprocess: `opencode run`; connection: `opencode serve` (HTTP+SSE)
|
|
47
50
|
- Cursor subprocess: `cursor agent <prompt>` (stdout NDJSON, no connection path — subprocess-only)
|
|
@@ -188,25 +191,30 @@ it's captured. This is the minimum-intrusive mechanism for an otherwise unobserv
|
|
|
188
191
|
value. Windows does not support PTY — Claude primary uses a fallback detection path
|
|
189
192
|
(`session_detection.py`) on Windows.
|
|
190
193
|
|
|
191
|
-
### Claude:
|
|
192
|
-
|
|
193
|
-
Claude Code ships with three built-in subagents
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
`
|
|
201
|
-
`
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
`
|
|
209
|
-
|
|
194
|
+
### Claude: Native Agent Routing Boundary
|
|
195
|
+
|
|
196
|
+
Claude Code ships with three built-in subagents (Explore, Plan, General-purpose) plus
|
|
197
|
+
a generic `Agent` tool. Meridian's policy distinguishes between these:
|
|
198
|
+
|
|
199
|
+
- **Built-in agents are always denied.** Meridian injects
|
|
200
|
+
`--disallowedTools Agent(Explore),Agent(Plan),Agent(General-purpose),Agent(general-purpose)`.
|
|
201
|
+
There is no config toggle — built-ins are a Meridian platform policy.
|
|
202
|
+
|
|
203
|
+
- **Generic `Agent` follows the Mars agent-copy boundary.** Meridian reads
|
|
204
|
+
`mars.toml` to check whether `[settings.agent_copy] harnesses = ["claude"]` AND
|
|
205
|
+
`.claude` is in `targets`. If both hold, generic `Agent` is allowed (Claude's
|
|
206
|
+
native agent surface is Meridian-owned through agent copy). Otherwise, generic
|
|
207
|
+
`Agent` is denied by default and delegation routes through `meridian spawn`.
|
|
208
|
+
|
|
209
|
+
The detection runs in `bind_launch_context()` via `project_has_claude_agent_copy()` in
|
|
210
|
+
`permissions.py`, which reads `mars.toml` and `mars.local.toml`. The result flows into
|
|
211
|
+
`ResolvedLaunchSpec.claude_native_agents_enabled` and is projected by
|
|
212
|
+
`project_claude.py`. The projection strips `Agent` and `Agent(...)` from allowed-tools
|
|
213
|
+
when `claude_native_agents_enabled=False`, including parent-inherited allowed-tool tails.
|
|
214
|
+
|
|
215
|
+
This is implemented as a Meridian platform policy (harness adapter injection), not as
|
|
216
|
+
a per-agent `tools:` field. Agent profiles do not need to carry `agent: deny` entries —
|
|
217
|
+
the denial is inherited from the harness adapter when agent copy is absent.
|
|
210
218
|
|
|
211
219
|
### Claude: System-Prompt File Channel
|
|
212
220
|
|
|
@@ -38,11 +38,12 @@ Per-harness commands:
|
|
|
38
38
|
- Claude subprocess: `claude -p --output-format stream-json --verbose -`
|
|
39
39
|
- Claude connection: stdin/stdout NDJSON (not WebSocket despite `claude_ws.py` name)
|
|
40
40
|
- **Claude built-in agent denial**: Meridian injects
|
|
41
|
-
`--disallowedTools Agent(Explore),Agent(Plan),Agent(general-purpose)`
|
|
42
|
-
so sessions use
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
41
|
+
`--disallowedTools Agent(Explore),Agent(Plan),Agent(General-purpose),Agent(general-purpose)`
|
|
42
|
+
unconditionally so sessions use Meridian delegation instead of Claude's built-in
|
|
43
|
+
subagents. Generic `Agent` is allowed only when Mars effective config has
|
|
44
|
+
`[settings.agent_copy] harnesses = ["claude"]` and `.claude` is a target.
|
|
45
|
+
Parent/passthrough allowed-tool tails are merged into the managed projection;
|
|
46
|
+
Meridian's Agent denies stay authoritative.
|
|
46
47
|
- Codex subprocess: `codex exec --json`; connection: `codex app-server` (real WebSocket, JSON-RPC 2.0)
|
|
47
48
|
- OpenCode subprocess: `opencode run`; connection: `opencode serve` (HTTP+SSE)
|
|
48
49
|
- Cursor subprocess: `cursor agent <prompt>` (stdout NDJSON, no connection path — subprocess-only)
|
|
@@ -83,8 +84,8 @@ unique — always check `event.harness_id`. `turn/completed` is Codex; OpenCode
|
|
|
83
84
|
Source of truth for what every adapter must implement.
|
|
84
85
|
- `registry.py` — `HarnessRegistry`, `with_defaults()`. The global singleton.
|
|
85
86
|
- `claude.py` / `codex.py` / `opencode.py` / `cursor.py` — concrete adapter implementations.
|
|
86
|
-
Claude adapter
|
|
87
|
-
`
|
|
87
|
+
Claude adapter threads `ResolvedLaunchSpec.claude_native_agents_enabled` into projection so
|
|
88
|
+
parent inherited `Agent` grants cannot bypass the Mars `agent_copy` boundary.
|
|
88
89
|
- `__init__.py` — `HARNESS_EXTENSION_TOUCHPOINTS` and `ensure_bootstrap()`.
|
|
89
90
|
Read before adding a harness — lists every file that must be touched.
|
|
90
91
|
- `semantics.py` — `terminal_outcome()`, `activity_transition()`, `clears_signal()`.
|
|
@@ -377,7 +377,9 @@ class ClaudeAdapter(BaseHarnessAdapter[ResolvedLaunchSpec]):
|
|
|
377
377
|
user_turn_content = getattr(run, "user_turn_content", None)
|
|
378
378
|
disallowed_tools: tuple[str, ...] = ()
|
|
379
379
|
if not run.claude_allow_builtin_agents:
|
|
380
|
-
disallowed_tools = (
|
|
380
|
+
disallowed_tools = (
|
|
381
|
+
"Agent(Explore),Agent(Plan),Agent(General-purpose),Agent(general-purpose)",
|
|
382
|
+
)
|
|
381
383
|
return ResolvedLaunchSpec(
|
|
382
384
|
harness=HarnessId.CLAUDE,
|
|
383
385
|
model=str(run.model).strip() if run.model else None,
|
{meridian_cli-0.2.23 → meridian_cli-0.2.24}/src/meridian/lib/harness/projections/project_claude.py
RENAMED
|
@@ -16,6 +16,13 @@ from meridian.lib.launch.text_utils import dedupe_nonempty, split_csv_entries
|
|
|
16
16
|
|
|
17
17
|
logger = logging.getLogger(__name__)
|
|
18
18
|
|
|
19
|
+
_CLAUDE_BUILTIN_AGENT_DENY_TOOLS: tuple[str, ...] = (
|
|
20
|
+
"Agent(Explore)",
|
|
21
|
+
"Agent(Plan)",
|
|
22
|
+
"Agent(General-purpose)",
|
|
23
|
+
"Agent(general-purpose)",
|
|
24
|
+
)
|
|
25
|
+
|
|
19
26
|
_PROJECTED_FIELDS: frozenset[str] = frozenset(
|
|
20
27
|
{
|
|
21
28
|
"agent_name",
|
|
@@ -32,6 +39,7 @@ _PROJECTED_FIELDS: frozenset[str] = frozenset(
|
|
|
32
39
|
"permission_resolver",
|
|
33
40
|
"prompt",
|
|
34
41
|
"prompt_file_path",
|
|
42
|
+
"claude_native_agents_enabled",
|
|
35
43
|
"user_turn_content",
|
|
36
44
|
"disallowed_tools",
|
|
37
45
|
}
|
|
@@ -129,6 +137,14 @@ def _has_flag(args: Sequence[str], flag: str) -> bool:
|
|
|
129
137
|
return any(token == flag or token.startswith(f"{flag}=") for token in args)
|
|
130
138
|
|
|
131
139
|
|
|
140
|
+
def _is_claude_agent_tool(tool: str) -> bool:
|
|
141
|
+
return tool == "Agent" or tool.startswith("Agent(")
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def _is_denied_tool(tool: str, denied_tools: set[str]) -> bool:
|
|
145
|
+
return tool in denied_tools or ("Agent" in denied_tools and _is_claude_agent_tool(tool))
|
|
146
|
+
|
|
147
|
+
|
|
132
148
|
def _log_collision_if_needed(
|
|
133
149
|
*,
|
|
134
150
|
managed_flag: str,
|
|
@@ -177,14 +193,38 @@ def project_claude_spec_to_cli_args(
|
|
|
177
193
|
command.extend(("--agent", str(spec.agent_name)))
|
|
178
194
|
|
|
179
195
|
passthrough_tail, parent_allowed_tools = _split_internal_parent_allowed_tools(spec.extra_args)
|
|
196
|
+
projected_passthrough_tail, passthrough_allowed_tools, passthrough_disallowed_tools = (
|
|
197
|
+
_extract_claude_tool_flags(passthrough_tail)
|
|
198
|
+
)
|
|
199
|
+
passthrough_tail = tuple(projected_passthrough_tail)
|
|
180
200
|
|
|
181
201
|
permission_flags = resolve_permission_flags(spec.permission_resolver, HarnessId.CLAUDE)
|
|
182
202
|
permission_tail, allowed_tools, disallowed_tools = _extract_claude_tool_flags(permission_flags)
|
|
183
203
|
spec_disallowed: list[str] = []
|
|
184
204
|
for entry in spec.disallowed_tools:
|
|
185
205
|
spec_disallowed.extend(split_csv_entries(entry))
|
|
186
|
-
|
|
187
|
-
|
|
206
|
+
if not spec.claude_native_agents_enabled:
|
|
207
|
+
allowed_tools = [tool for tool in allowed_tools if not _is_claude_agent_tool(tool)]
|
|
208
|
+
parent_allowed_tools = [
|
|
209
|
+
tool for tool in parent_allowed_tools if not _is_claude_agent_tool(tool)
|
|
210
|
+
]
|
|
211
|
+
passthrough_allowed_tools = [
|
|
212
|
+
tool for tool in passthrough_allowed_tools if not _is_claude_agent_tool(tool)
|
|
213
|
+
]
|
|
214
|
+
allowed_tools = dedupe_nonempty(
|
|
215
|
+
(*allowed_tools, *parent_allowed_tools, *passthrough_allowed_tools)
|
|
216
|
+
)
|
|
217
|
+
disallowed_tools = dedupe_nonempty(
|
|
218
|
+
(
|
|
219
|
+
*disallowed_tools,
|
|
220
|
+
*spec_disallowed,
|
|
221
|
+
*passthrough_disallowed_tools,
|
|
222
|
+
*_CLAUDE_BUILTIN_AGENT_DENY_TOOLS,
|
|
223
|
+
)
|
|
224
|
+
)
|
|
225
|
+
if disallowed_tools:
|
|
226
|
+
denied_tools = set(disallowed_tools)
|
|
227
|
+
allowed_tools = [tool for tool in allowed_tools if not _is_denied_tool(tool, denied_tools)]
|
|
188
228
|
command.extend(permission_tail)
|
|
189
229
|
if allowed_tools:
|
|
190
230
|
command.extend(("--allowedTools", ",".join(allowed_tools)))
|
|
@@ -82,6 +82,8 @@ from .env import build_env_plan
|
|
|
82
82
|
from .env import merge_env_overrides as _merge_env_overrides
|
|
83
83
|
from .permissions import (
|
|
84
84
|
CLAUDE_NATIVE_DELEGATION_TOOLS,
|
|
85
|
+
project_has_claude_agent_copy,
|
|
86
|
+
resolve_claude_native_agent_permission_request,
|
|
85
87
|
resolve_nested_claude_permission_request,
|
|
86
88
|
resolve_permission_pipeline,
|
|
87
89
|
)
|
|
@@ -103,6 +105,7 @@ from .prompt import (
|
|
|
103
105
|
compose_skill_prompt_documents,
|
|
104
106
|
sanitize_prior_output,
|
|
105
107
|
strip_stale_report_paths,
|
|
108
|
+
with_agent_inventory_guidance,
|
|
106
109
|
)
|
|
107
110
|
from .reference import (
|
|
108
111
|
ReferenceItem,
|
|
@@ -556,6 +559,7 @@ def materialize_launch_artifacts(
|
|
|
556
559
|
approval: str | None = None,
|
|
557
560
|
unsafe_no_permissions: bool = False,
|
|
558
561
|
pi_harness_profile: PiHarnessProfileConfig | None = None,
|
|
562
|
+
claude_native_agents_enabled: bool = False,
|
|
559
563
|
claude_allow_builtin_agents: bool = False,
|
|
560
564
|
) -> MaterializedLaunchArtifacts:
|
|
561
565
|
"""Build shared run/spec/permission launch artifacts."""
|
|
@@ -606,6 +610,10 @@ def materialize_launch_artifacts(
|
|
|
606
610
|
unsafe_no_permissions=unsafe_no_permissions,
|
|
607
611
|
)
|
|
608
612
|
spec = resolve_launch_spec_stage(adapter=harness, run_inputs=run_params, perms=perms)
|
|
613
|
+
if harness.id == HarnessId.CLAUDE:
|
|
614
|
+
spec = spec.model_copy(
|
|
615
|
+
update={"claude_native_agents_enabled": claude_native_agents_enabled}
|
|
616
|
+
)
|
|
609
617
|
return MaterializedLaunchArtifacts(
|
|
610
618
|
run_params=run_params,
|
|
611
619
|
permission_config=permission_config,
|
|
@@ -643,8 +651,11 @@ def _inject_claude_delegation_guidance(
|
|
|
643
651
|
prompt_payload: PreparedPromptPayload,
|
|
644
652
|
*,
|
|
645
653
|
project_root: Path,
|
|
654
|
+
claude_native_agents_enabled: bool,
|
|
646
655
|
) -> PreparedPromptPayload:
|
|
647
656
|
"""Append delegation guidance when Claude has native agents available."""
|
|
657
|
+
if not claude_native_agents_enabled:
|
|
658
|
+
return prompt_payload
|
|
648
659
|
claude_agents_dir = project_root / ".claude" / "agents"
|
|
649
660
|
try:
|
|
650
661
|
has_claude_agents = claude_agents_dir.is_dir() and any(claude_agents_dir.iterdir())
|
|
@@ -1035,7 +1046,9 @@ def _resolve_spawn_prepare_projection(
|
|
|
1035
1046
|
|
|
1036
1047
|
# Prefer the pre-built, pre-filtered inventory prompt from the bundle.
|
|
1037
1048
|
if policy.bundle_inventory_prompt:
|
|
1038
|
-
agent_inventory_prompt: str | None =
|
|
1049
|
+
agent_inventory_prompt: str | None = with_agent_inventory_guidance(
|
|
1050
|
+
policy.bundle_inventory_prompt
|
|
1051
|
+
)
|
|
1039
1052
|
_, context_prompt = build_launch_context_documents(
|
|
1040
1053
|
project_root=project_paths.project_root,
|
|
1041
1054
|
alias_catalog=policy.alias_catalog,
|
|
@@ -1111,7 +1124,7 @@ def _resolve_primary_projection(
|
|
|
1111
1124
|
if session_mode != "resume":
|
|
1112
1125
|
# Prefer the pre-built, pre-filtered inventory prompt from the bundle.
|
|
1113
1126
|
if policy.bundle_inventory_prompt:
|
|
1114
|
-
agent_inventory_prompt = policy.bundle_inventory_prompt
|
|
1127
|
+
agent_inventory_prompt = with_agent_inventory_guidance(policy.bundle_inventory_prompt)
|
|
1115
1128
|
_, context_prompt = build_launch_context_documents(
|
|
1116
1129
|
project_root=project_paths.project_root,
|
|
1117
1130
|
alias_catalog=policy.alias_catalog,
|
|
@@ -1714,6 +1727,19 @@ def bind_launch_context(
|
|
|
1714
1727
|
if model_selection is not None and model_selection.harness_model_id is not None:
|
|
1715
1728
|
effective_model = model_selection.harness_model_id
|
|
1716
1729
|
|
|
1730
|
+
claude_native_agents_enabled = (
|
|
1731
|
+
harness.id == HarnessId.CLAUDE
|
|
1732
|
+
and project_has_claude_agent_copy(project_paths.project_root)
|
|
1733
|
+
)
|
|
1734
|
+
claude_allow_builtin_agents = (
|
|
1735
|
+
resolve_claude_allow_builtin_agents_for_launch(
|
|
1736
|
+
config_snapshot=runtime.config_snapshot,
|
|
1737
|
+
project_root=project_paths.project_root,
|
|
1738
|
+
)
|
|
1739
|
+
if harness.id == HarnessId.CLAUDE
|
|
1740
|
+
else False
|
|
1741
|
+
)
|
|
1742
|
+
|
|
1717
1743
|
if (
|
|
1718
1744
|
runtime.composition_surface == LaunchCompositionSurface.SPAWN_PREPARE
|
|
1719
1745
|
and harness.id == HarnessId.CLAUDE
|
|
@@ -1723,6 +1749,7 @@ def bind_launch_context(
|
|
|
1723
1749
|
tools=resolved_request.tools,
|
|
1724
1750
|
profile_tools=profile_tools_for_nested_deny,
|
|
1725
1751
|
has_profile=has_profile_for_nested_deny,
|
|
1752
|
+
allow_native_agent_tool=claude_native_agents_enabled,
|
|
1726
1753
|
)
|
|
1727
1754
|
if tools != resolved_request.tools:
|
|
1728
1755
|
resolved_request = resolved_request.model_copy(
|
|
@@ -1731,6 +1758,14 @@ def bind_launch_context(
|
|
|
1731
1758
|
}
|
|
1732
1759
|
)
|
|
1733
1760
|
|
|
1761
|
+
if harness.id == HarnessId.CLAUDE:
|
|
1762
|
+
tools = resolve_claude_native_agent_permission_request(
|
|
1763
|
+
tools=resolved_request.tools,
|
|
1764
|
+
has_claude_agent_copy=claude_native_agents_enabled,
|
|
1765
|
+
)
|
|
1766
|
+
if tools != resolved_request.tools:
|
|
1767
|
+
resolved_request = resolved_request.model_copy(update={"tools": tools})
|
|
1768
|
+
|
|
1734
1769
|
if (
|
|
1735
1770
|
runtime.composition_surface == LaunchCompositionSurface.SPAWN_PREPARE
|
|
1736
1771
|
and harness.id.value in _resolve_deny_headless_harnesses(runtime, project_paths)
|
|
@@ -1754,20 +1789,14 @@ def bind_launch_context(
|
|
|
1754
1789
|
if harness.id == HarnessId.PI
|
|
1755
1790
|
else None
|
|
1756
1791
|
)
|
|
1757
|
-
claude_allow_builtin_agents = (
|
|
1758
|
-
resolve_claude_allow_builtin_agents_for_launch(
|
|
1759
|
-
config_snapshot=runtime.config_snapshot,
|
|
1760
|
-
project_root=project_paths.project_root,
|
|
1761
|
-
)
|
|
1762
|
-
if harness.id == HarnessId.CLAUDE
|
|
1763
|
-
else False
|
|
1764
|
-
)
|
|
1765
1792
|
if (
|
|
1766
1793
|
harness.id == HarnessId.CLAUDE
|
|
1767
1794
|
and runtime.composition_surface == LaunchCompositionSurface.PRIMARY
|
|
1768
1795
|
):
|
|
1769
1796
|
prompt_payload = _inject_claude_delegation_guidance(
|
|
1770
|
-
prompt_payload,
|
|
1797
|
+
prompt_payload,
|
|
1798
|
+
project_root=project_root,
|
|
1799
|
+
claude_native_agents_enabled=claude_native_agents_enabled,
|
|
1771
1800
|
)
|
|
1772
1801
|
materialized = materialize_launch_artifacts(
|
|
1773
1802
|
harness=harness,
|
|
@@ -1798,6 +1827,7 @@ def bind_launch_context(
|
|
|
1798
1827
|
approval=resolved_request.execution_policy.approval,
|
|
1799
1828
|
unsafe_no_permissions=runtime.unsafe_no_permissions,
|
|
1800
1829
|
pi_harness_profile=pi_harness_profile,
|
|
1830
|
+
claude_native_agents_enabled=claude_native_agents_enabled,
|
|
1801
1831
|
claude_allow_builtin_agents=claude_allow_builtin_agents,
|
|
1802
1832
|
)
|
|
1803
1833
|
run_params = materialized.run_params
|
|
@@ -2,6 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import tomllib
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from typing import cast
|
|
8
|
+
|
|
5
9
|
from meridian.lib.safety.permissions import (
|
|
6
10
|
PermissionConfig,
|
|
7
11
|
TieredPermissionResolver,
|
|
@@ -12,7 +16,14 @@ from meridian.lib.safety.permissions import (
|
|
|
12
16
|
compile_tools_to_opencode_permission,
|
|
13
17
|
infer_codex_sandbox_from_tools,
|
|
14
18
|
)
|
|
15
|
-
from meridian.lib.tools import
|
|
19
|
+
from meridian.lib.tools import (
|
|
20
|
+
ToolAction,
|
|
21
|
+
ToolsField,
|
|
22
|
+
normalize_tool_action,
|
|
23
|
+
normalize_tool_key,
|
|
24
|
+
resolve_tool_action,
|
|
25
|
+
tools_field_to_map,
|
|
26
|
+
)
|
|
16
27
|
|
|
17
28
|
PermissionResolverImpl = (
|
|
18
29
|
TieredPermissionResolver
|
|
@@ -39,6 +50,12 @@ and policy enforcement. Profiles can opt out per tool via `tools:`.
|
|
|
39
50
|
|
|
40
51
|
|
|
41
52
|
_NESTED_CLAUDE_DELEGATION_CAPABILITIES: frozenset[str] = frozenset({"agent", "task"})
|
|
53
|
+
_CLAUDE_BUILTIN_AGENT_DENY_RULES: tuple[str, ...] = (
|
|
54
|
+
"agent(Explore)",
|
|
55
|
+
"agent(Plan)",
|
|
56
|
+
"agent(General-purpose)",
|
|
57
|
+
"agent(general-purpose)",
|
|
58
|
+
)
|
|
42
59
|
|
|
43
60
|
|
|
44
61
|
def _resolve_opencode_override(*, tools: ToolsField | None) -> str | None:
|
|
@@ -47,6 +64,76 @@ def _resolve_opencode_override(*, tools: ToolsField | None) -> str | None:
|
|
|
47
64
|
return compile_tools_to_opencode_permission(tools)
|
|
48
65
|
|
|
49
66
|
|
|
67
|
+
def project_has_claude_agent_copy(project_root: Path) -> bool:
|
|
68
|
+
"""Return whether effective Mars config enables Claude native agent copies."""
|
|
69
|
+
|
|
70
|
+
targets: tuple[str, ...] = ()
|
|
71
|
+
agent_copy_harnesses: tuple[str, ...] = ()
|
|
72
|
+
for config_name in ("mars.toml", "mars.local.toml"):
|
|
73
|
+
config_path = project_root / config_name
|
|
74
|
+
if not config_path.is_file():
|
|
75
|
+
continue
|
|
76
|
+
with config_path.open("rb") as handle:
|
|
77
|
+
payload = tomllib.load(handle)
|
|
78
|
+
settings = cast("object", payload.get("settings"))
|
|
79
|
+
if not isinstance(settings, dict):
|
|
80
|
+
continue
|
|
81
|
+
typed_settings = cast("dict[str, object]", settings)
|
|
82
|
+
raw_targets = typed_settings.get("targets")
|
|
83
|
+
if isinstance(raw_targets, list):
|
|
84
|
+
targets = tuple(
|
|
85
|
+
str(target).strip().lower()
|
|
86
|
+
for target in cast("list[object]", raw_targets)
|
|
87
|
+
)
|
|
88
|
+
raw_managed_root = typed_settings.get("managed_root")
|
|
89
|
+
if not targets and isinstance(raw_managed_root, str):
|
|
90
|
+
normalized_root = raw_managed_root.strip().lower()
|
|
91
|
+
if normalized_root:
|
|
92
|
+
targets = (normalized_root,)
|
|
93
|
+
agent_copy = typed_settings.get("agent_copy")
|
|
94
|
+
if not isinstance(agent_copy, dict) or "harnesses" not in agent_copy:
|
|
95
|
+
continue
|
|
96
|
+
typed_agent_copy = cast("dict[str, object]", agent_copy)
|
|
97
|
+
harnesses = typed_agent_copy.get("harnesses")
|
|
98
|
+
if isinstance(harnesses, list):
|
|
99
|
+
agent_copy_harnesses = tuple(
|
|
100
|
+
str(harness).strip().lower()
|
|
101
|
+
for harness in cast("list[object]", harnesses)
|
|
102
|
+
)
|
|
103
|
+
return "claude" in agent_copy_harnesses and ".claude" in targets
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def _normalized_tools_map(tools: ToolsField | None) -> dict[str, ToolAction]:
|
|
107
|
+
return {
|
|
108
|
+
normalize_tool_key(key, source="tools"): normalize_tool_action(
|
|
109
|
+
action,
|
|
110
|
+
source=f"tools.{key}",
|
|
111
|
+
)
|
|
112
|
+
for key, action in tools_field_to_map(tools).items()
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def resolve_claude_native_agent_permission_request(
|
|
117
|
+
*,
|
|
118
|
+
tools: ToolsField | None,
|
|
119
|
+
has_claude_agent_copy: bool,
|
|
120
|
+
) -> ToolsField | None:
|
|
121
|
+
"""Apply Claude native Agent defaults from the Mars agent-copy boundary."""
|
|
122
|
+
|
|
123
|
+
rules = _normalized_tools_map(tools)
|
|
124
|
+
if not has_claude_agent_copy:
|
|
125
|
+
for key in tuple(rules):
|
|
126
|
+
capability, _separator, _scope = key.partition("(")
|
|
127
|
+
if capability == "agent":
|
|
128
|
+
rules[key] = "deny"
|
|
129
|
+
rules["agent"] = "deny"
|
|
130
|
+
for key in _CLAUDE_BUILTIN_AGENT_DENY_RULES:
|
|
131
|
+
rules[key] = "deny"
|
|
132
|
+
if not rules:
|
|
133
|
+
return tools
|
|
134
|
+
return rules
|
|
135
|
+
|
|
136
|
+
|
|
50
137
|
def compute_nested_claude_deny_additions(
|
|
51
138
|
*,
|
|
52
139
|
profile_tools: ToolsField | None,
|
|
@@ -102,6 +189,7 @@ def resolve_nested_claude_permission_request(
|
|
|
102
189
|
tools: ToolsField | None,
|
|
103
190
|
profile_tools: ToolsField | None,
|
|
104
191
|
has_profile: bool,
|
|
192
|
+
allow_native_agent_tool: bool = False,
|
|
105
193
|
) -> ToolsField | None:
|
|
106
194
|
"""Apply Meridian's managed-spawn boundary for nested Claude launches."""
|
|
107
195
|
|
|
@@ -110,6 +198,10 @@ def resolve_nested_claude_permission_request(
|
|
|
110
198
|
profile_tools=profile_tools,
|
|
111
199
|
existing_tools=tools,
|
|
112
200
|
)
|
|
201
|
+
if allow_native_agent_tool:
|
|
202
|
+
deny_additions = tuple(
|
|
203
|
+
capability for capability in deny_additions if capability != "agent"
|
|
204
|
+
)
|
|
113
205
|
resolved_tools = _apply_nested_claude_denies(tools=tools, denied_capabilities=deny_additions)
|
|
114
206
|
return resolved_tools
|
|
115
207
|
|
|
@@ -146,6 +238,8 @@ __all__ = [
|
|
|
146
238
|
"CLAUDE_NATIVE_DELEGATION_TOOLS",
|
|
147
239
|
"PermissionResolverImpl",
|
|
148
240
|
"compute_nested_claude_deny_additions",
|
|
241
|
+
"project_has_claude_agent_copy",
|
|
242
|
+
"resolve_claude_native_agent_permission_request",
|
|
149
243
|
"resolve_nested_claude_permission_request",
|
|
150
244
|
"resolve_permission_pipeline",
|
|
151
245
|
]
|