meridian-cli 0.3.52__tar.gz → 0.3.53__tar.gz

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