meridian-cli 0.3.30__tar.gz → 0.3.32__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.30 → meridian_cli-0.3.32}/PKG-INFO +1 -1
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/AGENTS.md +1 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/__init__.py +1 -1
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/app_tree.py +4 -0
- meridian_cli-0.3.32/src/meridian/cli/artifact_cmd.py +193 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/command_groups.py +15 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/main.py +6 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/startup/catalog.py +4 -0
- meridian_cli-0.3.32/src/meridian/lib/artifact/AGENTS.md +67 -0
- meridian_cli-0.3.32/src/meridian/lib/artifact/CLAUDE.md +1 -0
- meridian_cli-0.3.32/src/meridian/lib/artifact/__init__.py +19 -0
- meridian_cli-0.3.32/src/meridian/lib/artifact/_serve_dir.py +45 -0
- meridian_cli-0.3.32/src/meridian/lib/artifact/service.py +469 -0
- meridian_cli-0.3.32/src/meridian/lib/artifact/store.py +143 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/bootstrap/.context/CONTEXT.md +4 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/bootstrap/AGENTS.md +4 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/bootstrap/runtime_state.py +4 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/.context/CONTEXT.md +12 -108
- meridian_cli-0.3.32/src/meridian/lib/harness/.context/pi-integration.md +56 -0
- meridian_cli-0.3.32/src/meridian/lib/harness/.context/session-transcripts.md +58 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/AGENTS.md +3 -1
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/.context/CONTEXT.md +4 -2
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/extractors/pi.py +3 -3
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/pi_lifecycle_events.py +27 -2
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/streaming_runner.py +6 -0
- meridian_cli-0.3.32/src/meridian/lib/ops/.context/FUTURE +2 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/pruning.py +19 -2
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/.context/CONTEXT.md +11 -3
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/AGENTS.md +6 -2
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/atomic.py +9 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/spawn_store.py +86 -31
- meridian_cli-0.3.32/src/meridian/lib/streaming/.context/CONTEXT.md +202 -0
- meridian_cli-0.3.32/src/meridian/lib/streaming/.context/FUTURE +35 -0
- meridian_cli-0.3.32/src/meridian/lib/streaming/.context/pi-drain.md +146 -0
- meridian_cli-0.3.32/src/meridian/lib/streaming/.context/signal-cancellation.md +56 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/AGENTS.md +40 -15
- meridian_cli-0.3.32/src/meridian/lib/streaming/completion_contracts.py +274 -0
- meridian_cli-0.3.32/src/meridian/lib/streaming/completion_coordinator.py +501 -0
- meridian_cli-0.3.32/src/meridian/lib/streaming/descendant_evidence.py +92 -0
- meridian_cli-0.3.32/src/meridian/lib/streaming/disk_watcher.py +183 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/drain_coordinator.py +13 -0
- meridian_cli-0.3.32/src/meridian/lib/streaming/drain_plan_factory.py +157 -0
- meridian_cli-0.3.32/src/meridian/lib/streaming/drain_teardown.py +117 -0
- meridian_cli-0.3.32/src/meridian/lib/streaming/pi_completion_profile.py +683 -0
- meridian_cli-0.3.32/src/meridian/lib/streaming/pi_drain.py +618 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/pi_process_cleanup.py +12 -3
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/pi_quiescence.py +30 -27
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/pi_subspawn_tracker.py +49 -104
- meridian_cli-0.3.32/src/meridian/lib/streaming/pi_work_ledger.py +308 -0
- meridian_cli-0.3.32/src/meridian/lib/streaming/resident_drain.py +505 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/spawn_drain_loop.py +27 -3
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/spawn_manager.py +36 -171
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/spawn_session.py +2 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/.context/CONTEXT.md +13 -5
- meridian_cli-0.3.32/src/meridian/pi_runtime/AGENTS.md +39 -0
- meridian_cli-0.3.32/src/meridian/server/CLAUDE.md +1 -0
- meridian_cli-0.3.30/src/meridian/lib/streaming/.context/CONTEXT.md +0 -339
- meridian_cli-0.3.30/src/meridian/lib/streaming/disk_watcher.py +0 -274
- meridian_cli-0.3.30/src/meridian/lib/streaming/pi_drain.py +0 -771
- meridian_cli-0.3.30/src/meridian/lib/streaming/resident_drain.py +0 -320
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/.gitignore +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/LICENSE +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/README.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/pyproject.toml +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/ag_ui/__init__.pyi +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/ag_ui/core.pyi +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/__main__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/_cmd_utils.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/agent_help.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/argv_normalization.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/bootstrap.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/bootstrap_cmd.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/config_cmd.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/doctor_cmd.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/entrypoint.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/ext_cmd.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/ext_registration.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/help_content.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/help_tiers.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/hooks_authority.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/hooks_commands.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/kg_cmd.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/mars_passthrough.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/mermaid_cmd.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/migrate_cmd.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/misc_commands.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/mode.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/models_cmd.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/output.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/primary_launch.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/qi_cmd.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/report_cmd.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/session_cmd.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/spawn.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/spawn_inject.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/startup/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/startup/classify.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/startup/cyclopts_app.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/startup/help.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/startup/lazy_dispatch.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/startup/policy.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/streaming_serve.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/sync_cmd.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/task_dir_cmd.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/telemetry_cmd.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/utils.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/work_cmd.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/workspace_cmd.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/dev/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/dev/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/dev/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/dev/pytests.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/bootstrap/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/bootstrap/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/bootstrap/config.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/bootstrap/project_state.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/bootstrap/services.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/catalog/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/catalog/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/catalog/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/catalog/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/catalog/agent.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/catalog/bootstrap.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/catalog/catalog_session.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/catalog/model_aliases.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/catalog/models.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/catalog/skill.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/config/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/config/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/config/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/config/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/config/catalog.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/config/context_config.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/config/preserving_edit.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/config/project_config_state.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/config/project_paths.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/config/project_root.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/config/schema.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/config/settings.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/config/workspace.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/context/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/context/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/context/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/context/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/context/resolver.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/child_env.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/clock.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/codec.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/command_strings.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/context.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/conversation.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/depth.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/domain.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/execution_policy.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/formatting.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/launch_policy_snapshot.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/lifecycle.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/logging.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/overrides.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/process_cleanup.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/resolved_context.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/sink.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/spawn_lifecycle.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/spawn_service.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/spawn_start.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/telemetry.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/types.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/util.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/diagnostics.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/commands/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/commands/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/commands/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/commands/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/commands/biomed.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/commands/mermaid.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/commands/sessions.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/commands/workbench.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/context.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/descriptors.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/dispatcher.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/first_party.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/observability.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/registry.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/types.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/adapter.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/bundle.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/claude.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/claude_preflight.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/claude_sessions.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/claude_utils.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/codex.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/codex_rollout.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/common.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/base.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/claude_ws.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/codex_ws.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/cursor_subprocess.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/errors.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/liveness.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/managed_backend.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/opencode_http.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/pi_rpc.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/resident_backend.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/control_action.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/cost.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/cursor.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/errors.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/extractor.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/extractors/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/extractors/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/extractors/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/extractors/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/extractors/base.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/extractors/claude.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/extractors/codex.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/extractors/cursor.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/extractors/opencode.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/launch_spec.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/launch_types.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/opencode.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/opencode_report.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/opencode_storage.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/opencode_transcript.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/passthrough/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/passthrough/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/passthrough/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/passthrough/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/passthrough/base.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/passthrough/claude.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/passthrough/codex.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/passthrough/opencode.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/passthrough/registry.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/permission_broker.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/pi.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/pi_paths.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/pi_runtime_resolver.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/_guards.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/permission_flags.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/pi_extension_projection.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/project_claude.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/project_codex_common.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/project_codex_streaming.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/project_codex_subprocess.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/project_cursor.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/project_opencode_streaming.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/project_opencode_subprocess.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/project_pi_native_tui.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/project_pi_rpc.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/projection_errors.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/registry.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/semantics.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/session_detection.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/transcript.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/builtin/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/builtin/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/builtin/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/builtin/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/builtin/autosync_store.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/builtin/base.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/builtin/git_autosync.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/builtin_registry.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/config.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/dispatch.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/interval.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/registry.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/runner.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/types.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ignores.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/kg/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/kg/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/kg/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/kg/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/kg/graph.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/kg/report.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/kg/serializer.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/kg/types.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/artifact_io.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/bundle_adapter.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/claude_session_access.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/command.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/compiler.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/composition.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/composition_spawn.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/constants.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/context.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/continue_replay.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/cwd.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/env.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/errors.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/extract.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/fork.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/launch_types.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/materialize.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/permissions.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/plan.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/policies.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/policy_snapshot.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/process/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/process/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/process/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/process/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/process/ports.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/process/primary_attach.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/process/pty_launcher.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/process/runner.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/process/session.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/process/subprocess_launcher.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/process/windows_launcher.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/prompt.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/prompt_context.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/reference.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/report.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/request.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/resolution.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/resolve.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/run_inputs.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/runner_helpers.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/session_scope.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/signals.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/spawn_guidance.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/streaming/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/streaming/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/streaming/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/streaming/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/streaming/heartbeat.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/streaming/terminal_arbitrator.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/text_utils.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/types.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/workspace.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/workspace_projection.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/written_files.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/markdown/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/markdown/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/markdown/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/markdown/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/markdown/extract.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/markdown/types.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/report.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/scanner.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/serializer.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/style/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/style/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/style/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/style/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/style/bare_end.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/style/fill_no_color.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/style/line_map.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/style/ox_edge.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/style/preprocess.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/style/suppression.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/style/types.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/validator.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/observability/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/observability/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/observability/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/observability/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/observability/debug_tracer.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/observability/trace_helpers.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/catalog.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/commands.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/config.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/config_surface.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/context.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/diag.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/hooks.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/init_ops.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/mars.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/migration.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/qi.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/reference.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/reference_recovery.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/report.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/runtime.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/session_corpus.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/session_export.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/session_log.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/session_log_render.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/session_render.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/session_repair.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/session_repair_target.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/session_search.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/session_target.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/session_transcript.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/api.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/context_ref.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/execute.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/execute_bg.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/execute_init.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/execute_runner.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/execute_session.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/failure_policy.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/models.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/pre_init.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/prepare.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/query.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/task_dir.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/sync_conflicts.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/work_attachment.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/work_dashboard.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/work_lifecycle.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/work_sessions.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/workspace.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/detached_process.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/locking.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/parent_watchdog.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/process_scope/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/process_scope/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/process_scope/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/process_scope/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/process_scope/base.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/process_scope/fallback.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/process_scope/posix.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/process_scope/windows_job.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/terminate.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/unix_modules.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/safety/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/safety/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/safety/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/safety/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/safety/budget.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/safety/guardrails.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/safety/permissions.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/safety/redaction.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/service_context.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/spawn/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/spawn/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/spawn/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/spawn/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/spawn/archive.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/artifact_store.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/event_store.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/history.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/launch_boundary.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/liveness.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/managed_primary.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/paths.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/primary_meta.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/process_scope_projection.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/reaper.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/runtime_root.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/session_identity.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/session_store.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/spawn/.context/CONTEXT.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/spawn/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/spawn/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/spawn/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/spawn/model.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/spawn/repository.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/spawn/terminal_policy.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/spawn/transitions.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/spawn_report.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/spawn_scope.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/spawn_signals.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/spawn_tree.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/timestamps.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/user_paths.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/wordgen.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/wordlists.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/work_scope.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/work_store.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/completion_nudge.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/control_socket.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/drain_policy.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/drain_wait.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/event_observers.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/heartbeat.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/signal_canceller.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/spawn_dispatch.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/types.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/bootstrap.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/correlation.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/events.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/init.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/local_jsonl.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/maintenance.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/observer.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/observers.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/query.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/reader.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/retention.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/router.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/sinks.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/status.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/tools.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/utils/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/utils/time.py +0 -0
- {meridian_cli-0.3.30/src/meridian/plugin_api → meridian_cli-0.3.32/src/meridian/pi_runtime}/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/README.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/dist/extensions/managed-bash/index.js +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/dist/extensions/meridian-spawn-watch/index.js +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/managed-bash/bundle.smoke.test.ts +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/managed-bash/src/bash_log_store.ts +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/managed-bash/src/bash_runtime.test.ts +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/managed-bash/src/bash_runtime.ts +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/managed-bash/src/index.ts +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/meridian-spawn-watch/bundle.smoke.test.ts +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/meridian-spawn-watch/src/index.test.ts +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/meridian-spawn-watch/src/index.ts +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/ids.ts +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/json_file.ts +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/log_overlay.ts +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/meridian_cli.ts +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/meridian_spawn.test.ts +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/meridian_spawn.ts +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/pi_harness_profile.ts +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/pi_state_paths.ts +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/schemas.ts +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/selectable_panel.test.ts +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/selectable_panel.ts +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/spawn_origins.test.ts +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/spawn_origins.ts +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/ui.ts +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/package.json +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/pnpm-lock.yaml +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/pnpm-workspace.yaml +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/scripts/verify-extensions-loop.mjs +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/vitest.config.ts +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/plugin_api/AGENTS.md +0 -0
- {meridian_cli-0.3.30/src/meridian/server → meridian_cli-0.3.32/src/meridian/plugin_api}/CLAUDE.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/plugin_api/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/plugin_api/config.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/plugin_api/fs.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/plugin_api/git.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/plugin_api/state.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/plugin_api/types.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/py.typed +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/server/AGENTS.md +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/server/__init__.py +0 -0
- {meridian_cli-0.3.30 → meridian_cli-0.3.32}/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.32
|
|
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
|
|
@@ -61,6 +61,7 @@ config entry. If adding a feature requires editing 10 files, the abstraction is
|
|
|
61
61
|
| `lib/context/` | Context resolution (KB, strategy, work directories) |
|
|
62
62
|
| `lib/hooks/` | Hook dispatch, config layering, built-in hooks |
|
|
63
63
|
| `lib/extensions/` | Extension command registry |
|
|
64
|
+
| `lib/artifact/` | Detached static-artifact serving over Tailscale (`artifact serve/list/stop/gc`); no daemon — file is authority |
|
|
64
65
|
|
|
65
66
|
| `lib/observability/` | Spawn-scoped JSONL tracing |
|
|
66
67
|
| `lib/mermaid/` | Mermaid diagram validation |
|
|
@@ -50,6 +50,7 @@ config_app = _group_app("config")
|
|
|
50
50
|
workspace_app = _group_app("workspace")
|
|
51
51
|
kg_app = _group_app("kg")
|
|
52
52
|
mermaid_app = _group_app("mermaid")
|
|
53
|
+
artifact_app = _group_app("artifact")
|
|
53
54
|
qi_app = _group_app("qi")
|
|
54
55
|
telemetry_app = _group_app("telemetry")
|
|
55
56
|
completion_app = _group_app("completion")
|
|
@@ -69,6 +70,7 @@ app.command(config_app, name="config")
|
|
|
69
70
|
app.command(workspace_app, name="workspace")
|
|
70
71
|
app.command(kg_app, name="kg")
|
|
71
72
|
app.command(mermaid_app, name="mermaid")
|
|
73
|
+
app.command(artifact_app, name="artifact")
|
|
72
74
|
app.command(qi_app, name="qi")
|
|
73
75
|
app.command(telemetry_app, name="telemetry")
|
|
74
76
|
app.command(completion_app, name="completion")
|
|
@@ -88,6 +90,7 @@ for _group_name, _group_app_obj in {
|
|
|
88
90
|
"workspace": workspace_app,
|
|
89
91
|
"kg": kg_app,
|
|
90
92
|
"mermaid": mermaid_app,
|
|
93
|
+
"artifact": artifact_app,
|
|
91
94
|
"qi": qi_app,
|
|
92
95
|
"telemetry": telemetry_app,
|
|
93
96
|
"completion": completion_app,
|
|
@@ -97,6 +100,7 @@ for _group_name, _group_app_obj in {
|
|
|
97
100
|
|
|
98
101
|
__all__ = [
|
|
99
102
|
"app",
|
|
103
|
+
"artifact_app",
|
|
100
104
|
"completion_app",
|
|
101
105
|
"config_app",
|
|
102
106
|
"context_app",
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"""CLI handlers for ``meridian artifact``."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import sys
|
|
7
|
+
from dataclasses import asdict
|
|
8
|
+
from datetime import UTC, datetime
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Annotated, Never
|
|
11
|
+
|
|
12
|
+
from cyclopts import Parameter
|
|
13
|
+
|
|
14
|
+
from meridian.cli.app_tree import artifact_app
|
|
15
|
+
from meridian.lib.artifact import service
|
|
16
|
+
from meridian.lib.artifact.store import Serve, load_serves
|
|
17
|
+
|
|
18
|
+
_DEFAULT_TTL = f"{service.DEFAULT_TTL_SECONDS // 3600}h"
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@artifact_app.default
|
|
22
|
+
def cmd_artifact_root() -> None:
|
|
23
|
+
"""Show artifact serving help."""
|
|
24
|
+
print(
|
|
25
|
+
"""Serve static artifacts over Tailscale.
|
|
26
|
+
|
|
27
|
+
Commands:
|
|
28
|
+
meridian artifact serve [dir] Serve a directory (default TTL: 2h)
|
|
29
|
+
meridian artifact list List recorded artifact serves
|
|
30
|
+
meridian artifact stop <slug> Stop one artifact serve
|
|
31
|
+
meridian artifact gc Stop expired artifact serves"""
|
|
32
|
+
)
|
|
33
|
+
raise SystemExit(0)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _fail(message: str, code: int = 1) -> Never:
|
|
37
|
+
print(f"Error: {message}", file=sys.stderr)
|
|
38
|
+
raise SystemExit(code)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _duration(seconds: float) -> str:
|
|
42
|
+
seconds = max(0, int(seconds))
|
|
43
|
+
if seconds >= 86400:
|
|
44
|
+
return f"{seconds / 86400:.1f}d"
|
|
45
|
+
if seconds >= 3600:
|
|
46
|
+
return f"{seconds / 3600:.1f}h"
|
|
47
|
+
if seconds >= 60:
|
|
48
|
+
return f"{seconds / 60:.1f}m"
|
|
49
|
+
return f"{seconds}s"
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _created_at(serve: Serve) -> datetime:
|
|
53
|
+
try:
|
|
54
|
+
return datetime.fromisoformat(serve.created.removesuffix("Z") + "+00:00")
|
|
55
|
+
except ValueError:
|
|
56
|
+
return datetime.now(UTC)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
@artifact_app.command(name="serve")
|
|
60
|
+
def cmd_artifact_serve(
|
|
61
|
+
directory: Annotated[Path, Parameter(help="Directory to serve.")] = Path("."),
|
|
62
|
+
*,
|
|
63
|
+
ttl: Annotated[
|
|
64
|
+
str, Parameter(name="--ttl", help="Lifetime: 30m, 2h, 90s, or 1d.")
|
|
65
|
+
] = _DEFAULT_TTL,
|
|
66
|
+
persistent: Annotated[
|
|
67
|
+
bool, Parameter(name="--persistent", help="Never expire automatically.")
|
|
68
|
+
] = False,
|
|
69
|
+
funnel: Annotated[
|
|
70
|
+
bool, Parameter(name="--funnel", help="Expose publicly with Tailscale Funnel.")
|
|
71
|
+
] = False,
|
|
72
|
+
slug: Annotated[
|
|
73
|
+
str | None, Parameter(name="--slug", help="URL path name (default: directory name).")
|
|
74
|
+
] = None,
|
|
75
|
+
port: Annotated[
|
|
76
|
+
int | None,
|
|
77
|
+
Parameter(name="--port", help="Serve on this port instead of a random one."),
|
|
78
|
+
] = None,
|
|
79
|
+
) -> None:
|
|
80
|
+
"""Serve a directory over Tailscale."""
|
|
81
|
+
resolved = directory.expanduser().resolve()
|
|
82
|
+
if not resolved.exists():
|
|
83
|
+
_fail(f"directory not found: {directory}", 2)
|
|
84
|
+
if not resolved.is_dir():
|
|
85
|
+
_fail(f"not a directory: {directory}", 2)
|
|
86
|
+
if port is not None:
|
|
87
|
+
if port < 1 or port > 65535:
|
|
88
|
+
_fail("--port must be between 1 and 65535", 2)
|
|
89
|
+
if port < 1024:
|
|
90
|
+
_fail("--port must be >= 1024 (do not claim well-known ports)", 2)
|
|
91
|
+
try:
|
|
92
|
+
ttl_seconds = None if persistent else service.parse_ttl(ttl)
|
|
93
|
+
serve, url = service.start_serve(
|
|
94
|
+
resolved, ttl_seconds=ttl_seconds, funnel=funnel, slug=slug, port=port
|
|
95
|
+
)
|
|
96
|
+
except service.PortInUseError as exc:
|
|
97
|
+
_fail(str(exc), 2)
|
|
98
|
+
except (service.ArtifactError, OSError) as exc:
|
|
99
|
+
_fail(str(exc))
|
|
100
|
+
ttl_hint = "persistent" if serve.ttl_seconds is None else _duration(serve.ttl_seconds)
|
|
101
|
+
print(url)
|
|
102
|
+
print(
|
|
103
|
+
f"pid {serve.pid} · TTL {ttl_hint} · stop with: meridian artifact stop {serve.slug}"
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
@artifact_app.command(name="list")
|
|
108
|
+
def cmd_artifact_list(
|
|
109
|
+
*,
|
|
110
|
+
fmt: Annotated[
|
|
111
|
+
str, Parameter(name="--format", help="Output format: text or json.")
|
|
112
|
+
] = "text",
|
|
113
|
+
) -> None:
|
|
114
|
+
"""List recorded artifact serves without changing state."""
|
|
115
|
+
from meridian.cli.main import get_global_options
|
|
116
|
+
|
|
117
|
+
serves = load_serves()
|
|
118
|
+
effective_fmt = "json" if get_global_options().output.format == "json" else fmt
|
|
119
|
+
if effective_fmt == "json":
|
|
120
|
+
print(json.dumps([asdict(serve) for serve in serves], indent=2))
|
|
121
|
+
return
|
|
122
|
+
if effective_fmt != "text":
|
|
123
|
+
_fail("--format must be text or json", 2)
|
|
124
|
+
if not serves:
|
|
125
|
+
print("No active artifact serves.")
|
|
126
|
+
return
|
|
127
|
+
now = datetime.now(UTC)
|
|
128
|
+
try:
|
|
129
|
+
dns_name = service.tailscale_dns_name()
|
|
130
|
+
except (service.ArtifactError, OSError) as exc:
|
|
131
|
+
dns_name = None
|
|
132
|
+
print(f"Warning: artifact URLs unavailable: {exc}", file=sys.stderr)
|
|
133
|
+
print(f"{'SLUG':<22} {'LOCAL':<7} {'ALIVE':<6} {'AGE':<8} {'TTL':<11} {'DIRECTORY':<30} URL")
|
|
134
|
+
for serve in serves:
|
|
135
|
+
created = _created_at(serve)
|
|
136
|
+
age = _duration((now - created).total_seconds())
|
|
137
|
+
ttl = (
|
|
138
|
+
"persistent"
|
|
139
|
+
if serve.ttl_seconds is None
|
|
140
|
+
else _duration(serve.ttl_seconds - (now - created).total_seconds())
|
|
141
|
+
)
|
|
142
|
+
public_port = service.tailnet_port(serve.local_port, funnel=serve.funnel)
|
|
143
|
+
url = (
|
|
144
|
+
f"https://{dns_name}:{public_port}/{serve.slug}/"
|
|
145
|
+
if dns_name
|
|
146
|
+
else "unavailable"
|
|
147
|
+
)
|
|
148
|
+
alive = (
|
|
149
|
+
"yes"
|
|
150
|
+
if service.pid_alive(serve.pid, serve.process_created_at)
|
|
151
|
+
else "no"
|
|
152
|
+
)
|
|
153
|
+
print(
|
|
154
|
+
f"{serve.slug:<22} {serve.local_port:<7} {alive:<6} {age:<8} "
|
|
155
|
+
f"{ttl:<11} {serve.dir:<30} {url}"
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
@artifact_app.command(name="stop")
|
|
160
|
+
def cmd_artifact_stop(
|
|
161
|
+
slug: Annotated[str, Parameter(help="Slug (or local port) of the serve to stop.")],
|
|
162
|
+
) -> None:
|
|
163
|
+
"""Stop one artifact serve."""
|
|
164
|
+
try:
|
|
165
|
+
stopped = service.stop_serve(slug)
|
|
166
|
+
except (service.ArtifactError, OSError) as exc:
|
|
167
|
+
_fail(str(exc))
|
|
168
|
+
if stopped:
|
|
169
|
+
print(f"Stopped artifact serve {slug}.")
|
|
170
|
+
else:
|
|
171
|
+
print(f"No artifact serve recorded as {slug}.")
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
@artifact_app.command(name="gc")
|
|
175
|
+
def cmd_artifact_gc() -> None:
|
|
176
|
+
"""Stop and remove expired artifact serves."""
|
|
177
|
+
try:
|
|
178
|
+
expired, failed = service.sweep_expired()
|
|
179
|
+
except (service.ArtifactError, OSError) as exc:
|
|
180
|
+
_fail(str(exc))
|
|
181
|
+
print(f"Garbage-collected {len(expired)} expired artifact serve(s).")
|
|
182
|
+
if failed:
|
|
183
|
+
print(f"Failed to remove: {', '.join(failed)}", file=sys.stderr)
|
|
184
|
+
raise SystemExit(1)
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
__all__ = [
|
|
188
|
+
"cmd_artifact_gc",
|
|
189
|
+
"cmd_artifact_list",
|
|
190
|
+
"cmd_artifact_root",
|
|
191
|
+
"cmd_artifact_serve",
|
|
192
|
+
"cmd_artifact_stop",
|
|
193
|
+
]
|
|
@@ -132,6 +132,13 @@ _GROUP_HELP: dict[str, GroupHelp] = {
|
|
|
132
132
|
long_help='Mermaid diagram validation: extract and check diagram syntax in\nmarkdown files and standalone .mmd/.mermaid files.',
|
|
133
133
|
examples=(('meridian mermaid check', ''), ('meridian mermaid check docs/', ''), ('meridian mermaid check diagram.mmd', '')),
|
|
134
134
|
),
|
|
135
|
+
"artifact": GroupHelp(
|
|
136
|
+
summary='Share static artifacts over Tailscale.',
|
|
137
|
+
long_help='Serve a local directory over Tailscale as a temporary, tailnet-scoped URL.',
|
|
138
|
+
examples=(('meridian artifact serve .', ''), ('meridian artifact list', '')),
|
|
139
|
+
agent_notes='URLs are tailnet-only — the recipient must be on your tailnet; use --funnel for a public URL (rare). Serves expire after 2h by default; --persistent keeps one, stop/gc remove them. Point it at a built structured-artifact directory to share with a human or another agent.',
|
|
140
|
+
agent_subcommands=('serve', 'list', 'stop', 'gc'),
|
|
141
|
+
),
|
|
135
142
|
"telemetry": GroupHelp(
|
|
136
143
|
summary='Telemetry inspection: tail, query, and status over local segments.',
|
|
137
144
|
long_help='Telemetry inspection: tail, query, and status over local segments.\n\nNote: Rootless MCP stdio server processes write telemetry to stderr only and are not visible in local segment readers.',
|
|
@@ -274,6 +281,14 @@ COMMAND_GROUP_SPECS: dict[str, CommandGroupSpec] = {
|
|
|
274
281
|
registration_bucket='mermaid',
|
|
275
282
|
has_group_app=True,
|
|
276
283
|
),
|
|
284
|
+
"artifact": CommandGroupSpec(
|
|
285
|
+
help=_GROUP_HELP["artifact"],
|
|
286
|
+
agent_root_description='Share a directory as a temporary Tailscale URL for humans or other agents.',
|
|
287
|
+
agent_root=True,
|
|
288
|
+
human_root_order=17,
|
|
289
|
+
registration_bucket='artifact',
|
|
290
|
+
has_group_app=True,
|
|
291
|
+
),
|
|
277
292
|
"telemetry": CommandGroupSpec(
|
|
278
293
|
help=_GROUP_HELP["telemetry"],
|
|
279
294
|
human_root_order=12,
|
|
@@ -748,6 +748,11 @@ def _register_commands_for_invocation(argv: Sequence[str]) -> None:
|
|
|
748
748
|
|
|
749
749
|
_ = _mermaid_cmd
|
|
750
750
|
|
|
751
|
+
def _register_artifact() -> None:
|
|
752
|
+
import meridian.cli.artifact_cmd as _artifact_cmd
|
|
753
|
+
|
|
754
|
+
_ = _artifact_cmd
|
|
755
|
+
|
|
751
756
|
def _register_qi() -> None:
|
|
752
757
|
import meridian.cli.qi_cmd as _qi_cmd
|
|
753
758
|
|
|
@@ -780,6 +785,7 @@ def _register_commands_for_invocation(argv: Sequence[str]) -> None:
|
|
|
780
785
|
"sync": _register_sync,
|
|
781
786
|
"kg": _register_kg,
|
|
782
787
|
"mermaid": _register_mermaid,
|
|
788
|
+
"artifact": _register_artifact,
|
|
783
789
|
"qi": _register_qi,
|
|
784
790
|
"report": _register_report,
|
|
785
791
|
"migrate": _register_migrate,
|
|
@@ -496,6 +496,10 @@ _COMMAND_DESCRIPTORS: tuple[CommandDescriptor, ...] = (
|
|
|
496
496
|
_read_rootless(("kg", "graph"), "Render knowledge graph."),
|
|
497
497
|
_read_rootless(("kg", "check"), "Check knowledge graph links."),
|
|
498
498
|
_read_rootless(("mermaid", "check"), "Check Mermaid diagrams."),
|
|
499
|
+
_write_rootless(("artifact", "serve"), "Serve a directory over tailscale."),
|
|
500
|
+
_read_rootless(("artifact", "list"), "List active artifact serves."),
|
|
501
|
+
_write_rootless(("artifact", "stop"), "Stop an artifact serve."),
|
|
502
|
+
_write_rootless(("artifact", "gc"), "Garbage-collect expired artifact serves."),
|
|
499
503
|
_read_rootless(("qi",), "Show inline knowledge for current path."),
|
|
500
504
|
_read_rootless(("qi", "list"), "List all inline knowledge locations."),
|
|
501
505
|
_read_rootless(("qi", "check"), "Check inline knowledge health."),
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# lib/artifact/ — Detached Artifact Serving
|
|
2
|
+
|
|
3
|
+
Thin wrapper that serves a static artifact directory over Tailscale. No daemon:
|
|
4
|
+
`meridian artifact serve` launches a detached stdlib HTTP server, registers a
|
|
5
|
+
Tailscale serve path, records state, and exits. `list`/`stop`/`gc` read and prune
|
|
6
|
+
that state. The CLI is the only entry point; nothing else imports this package.
|
|
7
|
+
|
|
8
|
+
## Mental model
|
|
9
|
+
|
|
10
|
+
```
|
|
11
|
+
artifact serve <dir>
|
|
12
|
+
→ launch_http_server(): _serve_dir on 127.0.0.1:<port> (setsid, detached)
|
|
13
|
+
→ _tailscale_register(): tailscale serve --https=<port> --set-path /<slug> → 127.0.0.1:<port>
|
|
14
|
+
→ record Serve in ~/.meridian/serves.json, print URL, exit
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
The server outlives the CLI by design ("share and walk away"). Cleanup is TTL +
|
|
18
|
+
lazy GC on every `serve`/`gc`, and explicit `stop`. State is the file; there is no
|
|
19
|
+
in-memory handle between commands.
|
|
20
|
+
|
|
21
|
+
## Key invariants
|
|
22
|
+
|
|
23
|
+
- **Never serve on 443 or well-known ports.** The CLI rejects ports < 1024 and
|
|
24
|
+
defaults to random 49152–65535; `_tailscale_register` always passes an explicit
|
|
25
|
+
`--https=<port>`. Portless 443 does not route to local serve handlers on some
|
|
26
|
+
nodes, and claiming well-known ports clobbers unrelated serves. See KB
|
|
27
|
+
`research/tailscale-serve-semantics.md`.
|
|
28
|
+
- **Teardown is per-path only.** `tailscale_off` runs
|
|
29
|
+
`tailscale serve --https=<port> --set-path=/<slug> off` — removes ONE slug.
|
|
30
|
+
Never bare `--https=<port> off` (drops all slugs on the port) or `serve reset`
|
|
31
|
+
(wipes the whole node). Only remove slugs recorded in serves.json.
|
|
32
|
+
- **`tailscale serve --set-path` forwards the full path.** `_serve_dir.py` strips
|
|
33
|
+
the `/<slug>` prefix in `translate_path` so root-serving backends resolve. Strip
|
|
34
|
+
in path translation, not URL rewriting, so directory redirects keep the prefix.
|
|
35
|
+
- **No parent-death linkage.** `launch_http_server` uses `start_new_session=True`
|
|
36
|
+
(POSIX) / `DETACHED_PROCESS` (Windows) with no `pdeathsig`. Adding linkage breaks
|
|
37
|
+
the feature: TTL + lazy GC *is* the cleanup mechanism.
|
|
38
|
+
- **Validate the slug at every trust boundary** before any Tailscale subprocess.
|
|
39
|
+
A malformed/empty slug would produce `--set-path=/ off` and clobber a root
|
|
40
|
+
handler. `is_valid_slug` runs at registration, teardown, URL build, and load.
|
|
41
|
+
- **State is atomic and locked.** `serves.json` writes go through
|
|
42
|
+
`atomic_write_text`; reads tolerate truncation/missing; `start_serve`,
|
|
43
|
+
`stop_serve`, and `sweep_expired` hold `serves.json.lock` across
|
|
44
|
+
read-modify-save. `Serve.process_created_at` (birth epoch) guards PID-reuse
|
|
45
|
+
from terminating an unrelated process tree.
|
|
46
|
+
|
|
47
|
+
## Anti-patterns
|
|
48
|
+
|
|
49
|
+
- Don't add a daemon or keep an in-memory handle between commands — the file is
|
|
50
|
+
the authority and `list`/`stop`/`gc` run in fresh processes.
|
|
51
|
+
- Don't pick the local bind port independently of the Tailscale `--https` port;
|
|
52
|
+
they are the same number, and it must avoid serves.json, live
|
|
53
|
+
`tailscale serve status --json`, and an EADDRINUSE probe.
|
|
54
|
+
- `--funnel` exposes publicly on the fixed Funnel port **10000** (Funnel allows
|
|
55
|
+
only 443/8443/10000; 443 is portless-broken and 8443 is commonly taken). The
|
|
56
|
+
local backend keeps its own random/`--port` high port; `tailnet_port()` derives
|
|
57
|
+
the public port from the funnel flag. If Funnel isn't enabled on the tailnet the
|
|
58
|
+
register call fails loudly (ArtifactError) and rolls back — no orphan state.
|
|
59
|
+
- Don't reset/abort a GC sweep on a single terminate failure — each serve is
|
|
60
|
+
independent; a failed teardown must preserve its entry, not stop the loop.
|
|
61
|
+
|
|
62
|
+
## Related
|
|
63
|
+
|
|
64
|
+
- [../../AGENTS.md](../../AGENTS.md) — package layers; this package is a leaf,
|
|
65
|
+
not part of the ops/launch/state spine
|
|
66
|
+
- KB `research/tailscale-serve-semantics.md` — Tailscale routing/teardown facts
|
|
67
|
+
behind the invariants above
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@AGENTS.md
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""Static artifact serving over Tailscale."""
|
|
2
|
+
|
|
3
|
+
from meridian.lib.artifact.store import (
|
|
4
|
+
Serve,
|
|
5
|
+
is_valid_slug,
|
|
6
|
+
load_serves,
|
|
7
|
+
save_serves,
|
|
8
|
+
serves_lock_path,
|
|
9
|
+
serves_path,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
__all__ = [
|
|
13
|
+
"Serve",
|
|
14
|
+
"is_valid_slug",
|
|
15
|
+
"load_serves",
|
|
16
|
+
"save_serves",
|
|
17
|
+
"serves_lock_path",
|
|
18
|
+
"serves_path",
|
|
19
|
+
]
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"""Prefix-aware static server used by detached artifact serves."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import sys
|
|
6
|
+
from functools import partial
|
|
7
|
+
from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
from meridian.lib.artifact.store import is_valid_slug
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def main() -> None:
|
|
14
|
+
"""Serve a directory under one URL path prefix."""
|
|
15
|
+
if len(sys.argv) != 4:
|
|
16
|
+
raise SystemExit("usage: _serve_dir DIRECTORY PORT SLUG")
|
|
17
|
+
directory = Path(sys.argv[1])
|
|
18
|
+
try:
|
|
19
|
+
port = int(sys.argv[2])
|
|
20
|
+
except ValueError as exc:
|
|
21
|
+
raise SystemExit("port must be an integer") from exc
|
|
22
|
+
slug = sys.argv[3]
|
|
23
|
+
if not directory.is_dir():
|
|
24
|
+
raise SystemExit(f"not a directory: {directory}")
|
|
25
|
+
if not 1 <= port <= 65535:
|
|
26
|
+
raise SystemExit("port must be between 1 and 65535")
|
|
27
|
+
if not is_valid_slug(slug):
|
|
28
|
+
raise SystemExit("invalid slug")
|
|
29
|
+
|
|
30
|
+
prefix = f"/{slug}"
|
|
31
|
+
|
|
32
|
+
class PrefixHandler(SimpleHTTPRequestHandler):
|
|
33
|
+
def translate_path(self, path: str) -> str:
|
|
34
|
+
if path == prefix:
|
|
35
|
+
path = "/"
|
|
36
|
+
elif path.startswith(f"{prefix}/"):
|
|
37
|
+
path = path[len(prefix) :]
|
|
38
|
+
return super().translate_path(path)
|
|
39
|
+
|
|
40
|
+
handler = partial(PrefixHandler, directory=str(directory))
|
|
41
|
+
ThreadingHTTPServer(("127.0.0.1", port), handler).serve_forever()
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
if __name__ == "__main__":
|
|
45
|
+
main()
|