meridian-cli 0.3.34__tar.gz → 0.3.35__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (585) hide show
  1. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/PKG-INFO +1 -1
  2. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/__init__.py +1 -1
  3. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/spawn_inject.py +19 -11
  4. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/clock.py +1 -1
  5. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/.context/CONTEXT.md +7 -0
  6. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/pi_rpc.py +68 -3
  7. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/semantics.py +2 -1
  8. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/report.py +2 -1
  9. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/streaming_runner.py +1 -2
  10. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/history.py +4 -0
  11. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/spawn/model.py +1 -0
  12. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/spawn/repository.py +3 -0
  13. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/spawn/transitions.py +2 -0
  14. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/spawn_store.py +3 -1
  15. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/.context/CONTEXT.md +33 -8
  16. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/AGENTS.md +5 -1
  17. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/drain_wait.py +48 -9
  18. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/pi_completion_profile.py +21 -4
  19. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/spawn_drain_loop.py +46 -65
  20. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/spawn_manager.py +132 -20
  21. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/spawn_session.py +5 -0
  22. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/.gitignore +0 -0
  23. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/LICENSE +0 -0
  24. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/README.md +0 -0
  25. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/pyproject.toml +0 -0
  26. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/ag_ui/__init__.pyi +0 -0
  27. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/ag_ui/core.pyi +0 -0
  28. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/AGENTS.md +0 -0
  29. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/CLAUDE.md +0 -0
  30. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/__main__.py +0 -0
  31. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/.context/CONTEXT.md +0 -0
  32. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/AGENTS.md +0 -0
  33. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/CLAUDE.md +0 -0
  34. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/__init__.py +0 -0
  35. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/_cmd_utils.py +0 -0
  36. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/agent_help.py +0 -0
  37. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/app_tree.py +0 -0
  38. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/argv_normalization.py +0 -0
  39. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/artifact_cmd.py +0 -0
  40. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/bootstrap.py +0 -0
  41. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/bootstrap_cmd.py +0 -0
  42. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/command_groups.py +0 -0
  43. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/config_cmd.py +0 -0
  44. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/doctor_cmd.py +0 -0
  45. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/entrypoint.py +0 -0
  46. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/ext_cmd.py +0 -0
  47. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/ext_registration.py +0 -0
  48. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/help_content.py +0 -0
  49. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/help_tiers.py +0 -0
  50. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/hooks_authority.py +0 -0
  51. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/hooks_commands.py +0 -0
  52. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/kg_cmd.py +0 -0
  53. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/main.py +0 -0
  54. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/mars_passthrough.py +0 -0
  55. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/mermaid_cmd.py +0 -0
  56. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/migrate_cmd.py +0 -0
  57. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/misc_commands.py +0 -0
  58. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/mode.py +0 -0
  59. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/models_cmd.py +0 -0
  60. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/output.py +0 -0
  61. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/primary_launch.py +0 -0
  62. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/qi_cmd.py +0 -0
  63. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/report_cmd.py +0 -0
  64. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/session_cmd.py +0 -0
  65. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/spawn.py +0 -0
  66. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/startup/__init__.py +0 -0
  67. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/startup/catalog.py +0 -0
  68. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/startup/classify.py +0 -0
  69. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/startup/cyclopts_app.py +0 -0
  70. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/startup/help.py +0 -0
  71. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/startup/lazy_dispatch.py +0 -0
  72. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/startup/policy.py +0 -0
  73. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/streaming_serve.py +0 -0
  74. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/sync_cmd.py +0 -0
  75. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/task_dir_cmd.py +0 -0
  76. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/telemetry_cmd.py +0 -0
  77. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/utils.py +0 -0
  78. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/work_cmd.py +0 -0
  79. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/cli/workspace_cmd.py +0 -0
  80. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/dev/AGENTS.md +0 -0
  81. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/dev/CLAUDE.md +0 -0
  82. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/dev/__init__.py +0 -0
  83. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/dev/pytests.py +0 -0
  84. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/__init__.py +0 -0
  85. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/artifact/AGENTS.md +0 -0
  86. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/artifact/CLAUDE.md +0 -0
  87. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/artifact/__init__.py +0 -0
  88. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/artifact/_serve_dir.py +0 -0
  89. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/artifact/service.py +0 -0
  90. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/artifact/store.py +0 -0
  91. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/bootstrap/.context/CONTEXT.md +0 -0
  92. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/bootstrap/AGENTS.md +0 -0
  93. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/bootstrap/CLAUDE.md +0 -0
  94. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/bootstrap/__init__.py +0 -0
  95. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/bootstrap/config.py +0 -0
  96. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/bootstrap/project_state.py +0 -0
  97. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/bootstrap/runtime_state.py +0 -0
  98. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/bootstrap/services.py +0 -0
  99. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/catalog/.context/CONTEXT.md +0 -0
  100. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/catalog/AGENTS.md +0 -0
  101. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/catalog/CLAUDE.md +0 -0
  102. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/catalog/__init__.py +0 -0
  103. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/catalog/agent.py +0 -0
  104. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/catalog/bootstrap.py +0 -0
  105. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/catalog/catalog_session.py +0 -0
  106. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/catalog/model_aliases.py +0 -0
  107. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/catalog/models.py +0 -0
  108. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/catalog/skill.py +0 -0
  109. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/config/.context/CONTEXT.md +0 -0
  110. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/config/AGENTS.md +0 -0
  111. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/config/CLAUDE.md +0 -0
  112. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/config/__init__.py +0 -0
  113. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/config/catalog.py +0 -0
  114. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/config/context_config.py +0 -0
  115. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/config/preserving_edit.py +0 -0
  116. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/config/project_config_state.py +0 -0
  117. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/config/project_paths.py +0 -0
  118. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/config/project_root.py +0 -0
  119. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/config/schema.py +0 -0
  120. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/config/settings.py +0 -0
  121. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/config/workspace.py +0 -0
  122. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/context/.context/CONTEXT.md +0 -0
  123. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/context/AGENTS.md +0 -0
  124. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/context/CLAUDE.md +0 -0
  125. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/context/__init__.py +0 -0
  126. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/context/resolver.py +0 -0
  127. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/.context/CONTEXT.md +0 -0
  128. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/AGENTS.md +0 -0
  129. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/CLAUDE.md +0 -0
  130. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/__init__.py +0 -0
  131. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/child_env.py +0 -0
  132. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/codec.py +0 -0
  133. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/command_strings.py +0 -0
  134. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/context.py +0 -0
  135. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/conversation.py +0 -0
  136. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/depth.py +0 -0
  137. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/domain.py +0 -0
  138. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/execution_policy.py +0 -0
  139. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/formatting.py +0 -0
  140. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/launch_policy_snapshot.py +0 -0
  141. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/lifecycle.py +0 -0
  142. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/logging.py +0 -0
  143. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/overrides.py +0 -0
  144. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/process_cleanup.py +0 -0
  145. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/resolved_context.py +0 -0
  146. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/sink.py +0 -0
  147. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/spawn_lifecycle.py +0 -0
  148. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/spawn_service.py +0 -0
  149. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/spawn_start.py +0 -0
  150. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/telemetry.py +0 -0
  151. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/types.py +0 -0
  152. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/core/util.py +0 -0
  153. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/diagnostics.py +0 -0
  154. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/.context/CONTEXT.md +0 -0
  155. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/AGENTS.md +0 -0
  156. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/CLAUDE.md +0 -0
  157. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/__init__.py +0 -0
  158. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/commands/.context/CONTEXT.md +0 -0
  159. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/commands/AGENTS.md +0 -0
  160. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/commands/CLAUDE.md +0 -0
  161. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/commands/__init__.py +0 -0
  162. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/commands/biomed.py +0 -0
  163. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/commands/mermaid.py +0 -0
  164. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/commands/sessions.py +0 -0
  165. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/commands/workbench.py +0 -0
  166. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/context.py +0 -0
  167. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/descriptors.py +0 -0
  168. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/dispatcher.py +0 -0
  169. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/first_party.py +0 -0
  170. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/observability.py +0 -0
  171. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/registry.py +0 -0
  172. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/extensions/types.py +0 -0
  173. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/.context/CONTEXT.md +0 -0
  174. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/.context/pi-integration.md +0 -0
  175. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/.context/session-transcripts.md +0 -0
  176. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/AGENTS.md +0 -0
  177. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/CLAUDE.md +0 -0
  178. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/__init__.py +0 -0
  179. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/adapter.py +0 -0
  180. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/bundle.py +0 -0
  181. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/claude.py +0 -0
  182. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/claude_preflight.py +0 -0
  183. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/claude_sessions.py +0 -0
  184. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/claude_utils.py +0 -0
  185. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/codex.py +0 -0
  186. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/codex_rollout.py +0 -0
  187. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/common.py +0 -0
  188. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/AGENTS.md +0 -0
  189. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/CLAUDE.md +0 -0
  190. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/__init__.py +0 -0
  191. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/base.py +0 -0
  192. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/claude_ws.py +0 -0
  193. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/codex_ws.py +0 -0
  194. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/cursor_subprocess.py +0 -0
  195. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/errors.py +0 -0
  196. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/liveness.py +0 -0
  197. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/managed_backend.py +0 -0
  198. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/opencode_http.py +0 -0
  199. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/connections/resident_backend.py +0 -0
  200. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/control_action.py +0 -0
  201. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/cost.py +0 -0
  202. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/cursor.py +0 -0
  203. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/errors.py +0 -0
  204. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/extractor.py +0 -0
  205. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/extractors/.context/CONTEXT.md +0 -0
  206. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/extractors/AGENTS.md +0 -0
  207. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/extractors/CLAUDE.md +0 -0
  208. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/extractors/__init__.py +0 -0
  209. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/extractors/base.py +0 -0
  210. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/extractors/claude.py +0 -0
  211. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/extractors/codex.py +0 -0
  212. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/extractors/cursor.py +0 -0
  213. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/extractors/opencode.py +0 -0
  214. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/extractors/pi.py +0 -0
  215. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/launch_spec.py +0 -0
  216. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/launch_types.py +0 -0
  217. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/opencode.py +0 -0
  218. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/opencode_report.py +0 -0
  219. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/opencode_storage.py +0 -0
  220. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/opencode_transcript.py +0 -0
  221. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/passthrough/.context/CONTEXT.md +0 -0
  222. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/passthrough/AGENTS.md +0 -0
  223. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/passthrough/CLAUDE.md +0 -0
  224. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/passthrough/__init__.py +0 -0
  225. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/passthrough/base.py +0 -0
  226. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/passthrough/claude.py +0 -0
  227. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/passthrough/codex.py +0 -0
  228. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/passthrough/opencode.py +0 -0
  229. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/passthrough/registry.py +0 -0
  230. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/permission_broker.py +0 -0
  231. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/pi.py +0 -0
  232. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/pi_lifecycle_events.py +0 -0
  233. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/pi_paths.py +0 -0
  234. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/pi_runtime_resolver.py +0 -0
  235. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/.context/CONTEXT.md +0 -0
  236. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/AGENTS.md +0 -0
  237. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/CLAUDE.md +0 -0
  238. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/__init__.py +0 -0
  239. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/_guards.py +0 -0
  240. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/permission_flags.py +0 -0
  241. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/pi_extension_projection.py +0 -0
  242. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/project_claude.py +0 -0
  243. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/project_codex_common.py +0 -0
  244. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/project_codex_streaming.py +0 -0
  245. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/project_codex_subprocess.py +0 -0
  246. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/project_cursor.py +0 -0
  247. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/project_opencode_streaming.py +0 -0
  248. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/project_opencode_subprocess.py +0 -0
  249. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/project_pi_native_tui.py +0 -0
  250. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/project_pi_rpc.py +0 -0
  251. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/projections/projection_errors.py +0 -0
  252. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/registry.py +0 -0
  253. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/session_detection.py +0 -0
  254. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/harness/transcript.py +0 -0
  255. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/.context/CONTEXT.md +0 -0
  256. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/AGENTS.md +0 -0
  257. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/CLAUDE.md +0 -0
  258. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/__init__.py +0 -0
  259. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/builtin/.context/CONTEXT.md +0 -0
  260. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/builtin/.context/FUTURE +0 -0
  261. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/builtin/AGENTS.md +0 -0
  262. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/builtin/CLAUDE.md +0 -0
  263. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/builtin/__init__.py +0 -0
  264. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/builtin/autosync_store.py +0 -0
  265. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/builtin/base.py +0 -0
  266. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/builtin/git_autosync.py +0 -0
  267. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/builtin_registry.py +0 -0
  268. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/config.py +0 -0
  269. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/dispatch.py +0 -0
  270. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/interval.py +0 -0
  271. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/registry.py +0 -0
  272. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/runner.py +0 -0
  273. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/hooks/types.py +0 -0
  274. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ignores.py +0 -0
  275. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/kg/.context/CONTEXT.md +0 -0
  276. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/kg/AGENTS.md +0 -0
  277. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/kg/CLAUDE.md +0 -0
  278. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/kg/__init__.py +0 -0
  279. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/kg/graph.py +0 -0
  280. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/kg/report.py +0 -0
  281. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/kg/serializer.py +0 -0
  282. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/kg/types.py +0 -0
  283. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/.context/CONTEXT.md +0 -0
  284. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/AGENTS.md +0 -0
  285. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/CLAUDE.md +0 -0
  286. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/__init__.py +0 -0
  287. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/artifact_io.py +0 -0
  288. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/bundle_adapter.py +0 -0
  289. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/claude_session_access.py +0 -0
  290. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/command.py +0 -0
  291. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/compiler.py +0 -0
  292. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/composition.py +0 -0
  293. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/composition_spawn.py +0 -0
  294. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/constants.py +0 -0
  295. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/context.py +0 -0
  296. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/continue_replay.py +0 -0
  297. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/cwd.py +0 -0
  298. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/env.py +0 -0
  299. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/errors.py +0 -0
  300. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/extract.py +0 -0
  301. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/fork.py +0 -0
  302. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/launch_types.py +0 -0
  303. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/materialize.py +0 -0
  304. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/permissions.py +0 -0
  305. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/plan.py +0 -0
  306. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/policies.py +0 -0
  307. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/policy_snapshot.py +0 -0
  308. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/process/.context/CONTEXT.md +0 -0
  309. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/process/AGENTS.md +0 -0
  310. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/process/CLAUDE.md +0 -0
  311. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/process/__init__.py +0 -0
  312. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/process/ports.py +0 -0
  313. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/process/primary_attach.py +0 -0
  314. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/process/pty_launcher.py +0 -0
  315. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/process/runner.py +0 -0
  316. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/process/session.py +0 -0
  317. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/process/subprocess_launcher.py +0 -0
  318. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/process/windows_launcher.py +0 -0
  319. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/prompt.py +0 -0
  320. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/prompt_context.py +0 -0
  321. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/reference.py +0 -0
  322. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/request.py +0 -0
  323. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/resolution.py +0 -0
  324. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/resolve.py +0 -0
  325. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/run_inputs.py +0 -0
  326. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/runner_helpers.py +0 -0
  327. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/session_scope.py +0 -0
  328. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/signals.py +0 -0
  329. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/spawn_guidance.py +0 -0
  330. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/streaming/.context/CONTEXT.md +0 -0
  331. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/streaming/AGENTS.md +0 -0
  332. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/streaming/CLAUDE.md +0 -0
  333. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/streaming/__init__.py +0 -0
  334. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/streaming/heartbeat.py +0 -0
  335. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/streaming/terminal_arbitrator.py +0 -0
  336. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/text_utils.py +0 -0
  337. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/types.py +0 -0
  338. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/workspace.py +0 -0
  339. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/workspace_projection.py +0 -0
  340. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/launch/written_files.py +0 -0
  341. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/markdown/.context/CONTEXT.md +0 -0
  342. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/markdown/AGENTS.md +0 -0
  343. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/markdown/CLAUDE.md +0 -0
  344. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/markdown/__init__.py +0 -0
  345. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/markdown/extract.py +0 -0
  346. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/markdown/types.py +0 -0
  347. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/.context/CONTEXT.md +0 -0
  348. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/AGENTS.md +0 -0
  349. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/CLAUDE.md +0 -0
  350. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/__init__.py +0 -0
  351. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/report.py +0 -0
  352. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/scanner.py +0 -0
  353. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/serializer.py +0 -0
  354. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/style/.context/CONTEXT.md +0 -0
  355. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/style/AGENTS.md +0 -0
  356. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/style/CLAUDE.md +0 -0
  357. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/style/__init__.py +0 -0
  358. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/style/bare_end.py +0 -0
  359. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/style/fill_no_color.py +0 -0
  360. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/style/line_map.py +0 -0
  361. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/style/ox_edge.py +0 -0
  362. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/style/preprocess.py +0 -0
  363. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/style/suppression.py +0 -0
  364. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/style/types.py +0 -0
  365. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/mermaid/validator.py +0 -0
  366. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/observability/.context/CONTEXT.md +0 -0
  367. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/observability/AGENTS.md +0 -0
  368. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/observability/CLAUDE.md +0 -0
  369. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/observability/__init__.py +0 -0
  370. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/observability/debug_tracer.py +0 -0
  371. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/observability/trace_helpers.py +0 -0
  372. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/.context/CONTEXT.md +0 -0
  373. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/.context/FUTURE +0 -0
  374. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/AGENTS.md +0 -0
  375. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/CLAUDE.md +0 -0
  376. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/__init__.py +0 -0
  377. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/catalog.py +0 -0
  378. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/commands.py +0 -0
  379. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/config.py +0 -0
  380. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/config_surface.py +0 -0
  381. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/context.py +0 -0
  382. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/diag.py +0 -0
  383. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/hooks.py +0 -0
  384. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/init_ops.py +0 -0
  385. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/mars.py +0 -0
  386. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/migration.py +0 -0
  387. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/pruning.py +0 -0
  388. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/qi.py +0 -0
  389. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/reference.py +0 -0
  390. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/reference_recovery.py +0 -0
  391. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/report.py +0 -0
  392. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/runtime.py +0 -0
  393. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/session_corpus.py +0 -0
  394. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/session_export.py +0 -0
  395. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/session_log.py +0 -0
  396. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/session_log_render.py +0 -0
  397. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/session_render.py +0 -0
  398. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/session_repair.py +0 -0
  399. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/session_repair_target.py +0 -0
  400. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/session_search.py +0 -0
  401. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/session_target.py +0 -0
  402. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/session_transcript.py +0 -0
  403. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/.context/CONTEXT.md +0 -0
  404. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/AGENTS.md +0 -0
  405. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/CLAUDE.md +0 -0
  406. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/__init__.py +0 -0
  407. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/api.py +0 -0
  408. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/context_ref.py +0 -0
  409. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/execute.py +0 -0
  410. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/execute_bg.py +0 -0
  411. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/execute_init.py +0 -0
  412. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/execute_runner.py +0 -0
  413. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/execute_session.py +0 -0
  414. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/failure_policy.py +0 -0
  415. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/models.py +0 -0
  416. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/pre_init.py +0 -0
  417. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/prepare.py +0 -0
  418. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/query.py +0 -0
  419. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/spawn/task_dir.py +0 -0
  420. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/sync_conflicts.py +0 -0
  421. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/work_attachment.py +0 -0
  422. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/work_dashboard.py +0 -0
  423. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/work_lifecycle.py +0 -0
  424. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/work_sessions.py +0 -0
  425. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/ops/workspace.py +0 -0
  426. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/.context/CONTEXT.md +0 -0
  427. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/AGENTS.md +0 -0
  428. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/CLAUDE.md +0 -0
  429. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/__init__.py +0 -0
  430. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/atomic.py +0 -0
  431. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/detached_process.py +0 -0
  432. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/locking.py +0 -0
  433. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/parent_watchdog.py +0 -0
  434. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/process_scope/.context/CONTEXT.md +0 -0
  435. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/process_scope/AGENTS.md +0 -0
  436. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/process_scope/CLAUDE.md +0 -0
  437. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/process_scope/__init__.py +0 -0
  438. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/process_scope/base.py +0 -0
  439. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/process_scope/fallback.py +0 -0
  440. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/process_scope/posix.py +0 -0
  441. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/process_scope/windows_job.py +0 -0
  442. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/terminate.py +0 -0
  443. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/platform/unix_modules.py +0 -0
  444. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/safety/.context/CONTEXT.md +0 -0
  445. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/safety/AGENTS.md +0 -0
  446. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/safety/CLAUDE.md +0 -0
  447. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/safety/__init__.py +0 -0
  448. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/safety/budget.py +0 -0
  449. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/safety/guardrails.py +0 -0
  450. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/safety/permissions.py +0 -0
  451. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/safety/redaction.py +0 -0
  452. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/service_context.py +0 -0
  453. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/spawn/.context/CONTEXT.md +0 -0
  454. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/spawn/AGENTS.md +0 -0
  455. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/spawn/CLAUDE.md +0 -0
  456. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/spawn/__init__.py +0 -0
  457. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/spawn/archive.py +0 -0
  458. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/.context/CONTEXT.md +0 -0
  459. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/.context/TODO +0 -0
  460. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/AGENTS.md +0 -0
  461. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/CLAUDE.md +0 -0
  462. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/__init__.py +0 -0
  463. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/artifact_store.py +0 -0
  464. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/atomic.py +0 -0
  465. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/event_store.py +0 -0
  466. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/failure_sentinel.py +0 -0
  467. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/launch_boundary.py +0 -0
  468. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/liveness.py +0 -0
  469. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/managed_primary.py +0 -0
  470. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/paths.py +0 -0
  471. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/primary_meta.py +0 -0
  472. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/process_scope_projection.py +0 -0
  473. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/reaper.py +0 -0
  474. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/reaper_cleanup_claim.py +0 -0
  475. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/reconciliation.py +0 -0
  476. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/runtime_root.py +0 -0
  477. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/session_identity.py +0 -0
  478. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/session_store.py +0 -0
  479. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/spawn/.context/CONTEXT.md +0 -0
  480. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/spawn/AGENTS.md +0 -0
  481. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/spawn/CLAUDE.md +0 -0
  482. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/spawn/__init__.py +0 -0
  483. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/spawn/terminal_policy.py +0 -0
  484. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/spawn_report.py +0 -0
  485. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/spawn_scope.py +0 -0
  486. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/spawn_signals.py +0 -0
  487. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/spawn_tree.py +0 -0
  488. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/timestamps.py +0 -0
  489. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/user_paths.py +0 -0
  490. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/wordgen.py +0 -0
  491. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/wordlists.py +0 -0
  492. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/work_repository.py +0 -0
  493. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/work_scope.py +0 -0
  494. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/state/work_store.py +0 -0
  495. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/.context/pi-drain.md +0 -0
  496. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/.context/signal-cancellation.md +0 -0
  497. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/CLAUDE.md +0 -0
  498. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/__init__.py +0 -0
  499. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/completion_contracts.py +0 -0
  500. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/completion_coordinator.py +0 -0
  501. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/completion_nudge.py +0 -0
  502. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/control_socket.py +0 -0
  503. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/descendant_evidence.py +0 -0
  504. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/disk_watcher.py +0 -0
  505. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/drain_coordinator.py +0 -0
  506. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/drain_plan_factory.py +0 -0
  507. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/drain_policy.py +0 -0
  508. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/drain_teardown.py +0 -0
  509. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/event_observers.py +0 -0
  510. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/heartbeat.py +0 -0
  511. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/pi_drain.py +0 -0
  512. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/pi_drain_teardown.py +0 -0
  513. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/pi_process_cleanup.py +0 -0
  514. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/pi_quiescence.py +0 -0
  515. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/pi_subspawn_tracker.py +0 -0
  516. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/pi_work_ledger.py +0 -0
  517. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/resident_drain.py +0 -0
  518. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/signal_canceller.py +0 -0
  519. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/spawn_dispatch.py +0 -0
  520. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/streaming/types.py +0 -0
  521. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/__init__.py +0 -0
  522. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/bootstrap.py +0 -0
  523. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/correlation.py +0 -0
  524. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/events.py +0 -0
  525. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/init.py +0 -0
  526. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/local_jsonl.py +0 -0
  527. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/maintenance.py +0 -0
  528. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/observer.py +0 -0
  529. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/observers.py +0 -0
  530. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/query.py +0 -0
  531. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/reader.py +0 -0
  532. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/retention.py +0 -0
  533. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/router.py +0 -0
  534. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/sinks.py +0 -0
  535. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/telemetry/status.py +0 -0
  536. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/tools.py +0 -0
  537. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/utils/__init__.py +0 -0
  538. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/lib/utils/time.py +0 -0
  539. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/.context/CONTEXT.md +0 -0
  540. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/AGENTS.md +0 -0
  541. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/CLAUDE.md +0 -0
  542. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/README.md +0 -0
  543. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/__init__.py +0 -0
  544. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/dist/extensions/managed-bash/index.js +0 -0
  545. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/dist/extensions/meridian-spawn-watch/index.js +0 -0
  546. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/managed-bash/bundle.smoke.test.ts +0 -0
  547. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/managed-bash/src/bash_log_store.ts +0 -0
  548. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/managed-bash/src/bash_runtime.test.ts +0 -0
  549. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/managed-bash/src/bash_runtime.ts +0 -0
  550. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/managed-bash/src/index.ts +0 -0
  551. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/meridian-spawn-watch/bundle.smoke.test.ts +0 -0
  552. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/meridian-spawn-watch/src/index.test.ts +0 -0
  553. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/meridian-spawn-watch/src/index.ts +0 -0
  554. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/ids.ts +0 -0
  555. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/json_file.ts +0 -0
  556. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/log_overlay.ts +0 -0
  557. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/meridian_cli.ts +0 -0
  558. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/meridian_spawn.test.ts +0 -0
  559. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/meridian_spawn.ts +0 -0
  560. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/pi_harness_profile.ts +0 -0
  561. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/pi_state_paths.ts +0 -0
  562. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/schemas.ts +0 -0
  563. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/selectable_panel.test.ts +0 -0
  564. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/selectable_panel.ts +0 -0
  565. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/spawn_origins.test.ts +0 -0
  566. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/spawn_origins.ts +0 -0
  567. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/extensions/shared/ui.ts +0 -0
  568. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/package.json +0 -0
  569. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/pnpm-lock.yaml +0 -0
  570. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/pnpm-workspace.yaml +0 -0
  571. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/scripts/verify-extensions-loop.mjs +0 -0
  572. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/pi_runtime/vitest.config.ts +0 -0
  573. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/plugin_api/AGENTS.md +0 -0
  574. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/plugin_api/CLAUDE.md +0 -0
  575. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/plugin_api/__init__.py +0 -0
  576. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/plugin_api/config.py +0 -0
  577. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/plugin_api/fs.py +0 -0
  578. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/plugin_api/git.py +0 -0
  579. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/plugin_api/state.py +0 -0
  580. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/plugin_api/types.py +0 -0
  581. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/py.typed +0 -0
  582. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/server/AGENTS.md +0 -0
  583. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/server/CLAUDE.md +0 -0
  584. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/server/__init__.py +0 -0
  585. {meridian_cli-0.3.34 → meridian_cli-0.3.35}/src/meridian/server/main.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meridian-cli
3
- Version: 0.3.34
3
+ Version: 0.3.35
4
4
  Summary: Orchestrate CLI + MCP server for multi-model agent workflows
5
5
  Project-URL: Homepage, https://github.com/haowjy/meridian-cli
6
6
  Project-URL: Repository, https://github.com/haowjy/meridian-cli
@@ -2,4 +2,4 @@
2
2
 
3
3
  __all__ = ["__version__"]
4
4
 
5
- __version__ = "0.3.34"
5
+ __version__ = "0.3.35"
@@ -6,13 +6,20 @@ import asyncio
6
6
  import errno
7
7
  import json
8
8
  import sys
9
+ import time
9
10
  from typing import cast
10
11
 
12
+ from meridian.lib.core.spawn_lifecycle import ACTIVE_SPAWN_STATUSES
11
13
  from meridian.lib.ops.runtime import (
12
14
  resolve_runtime_root,
13
15
  resolve_runtime_root_and_config,
14
16
  )
15
17
  from meridian.lib.platform import IS_WINDOWS
18
+ from meridian.lib.state import spawn_store
19
+
20
+ _INJECT_RESPONSE_TIMEOUT_SECONDS = 30.0
21
+ _ENDPOINT_DISCOVERY_TIMEOUT_SECONDS = 30.0
22
+ _ENDPOINT_DISCOVERY_POLL_SECONDS = 0.1
16
23
 
17
24
 
18
25
  def _fail(message: str) -> None:
@@ -55,7 +62,9 @@ async def _send_and_receive(
55
62
  try:
56
63
  writer.write((json.dumps(request, separators=(",", ":")) + "\n").encode("utf-8"))
57
64
  await writer.drain()
58
- return await asyncio.wait_for(reader.readline(), timeout=10.0)
65
+ return await asyncio.wait_for(
66
+ reader.readline(), timeout=_INJECT_RESPONSE_TIMEOUT_SECONDS
67
+ )
59
68
  finally:
60
69
  writer.close()
61
70
  await writer.wait_closed()
@@ -87,19 +96,18 @@ async def inject_message(
87
96
  if not normalized_message:
88
97
  _fail("message is required")
89
98
 
90
- # The control socket/port may not be visible immediately after spawn start.
91
- # Retry briefly to tolerate the startup race.
92
- _SOCKET_WAIT_ATTEMPTS = 3
93
- _SOCKET_WAIT_INTERVAL = 1.0
94
-
95
99
  discovery_path = port_file if IS_WINDOWS else socket_path
96
- for _attempt in range(_SOCKET_WAIT_ATTEMPTS):
100
+ discovery_deadline = time.monotonic() + _ENDPOINT_DISCOVERY_TIMEOUT_SECONDS
101
+ while True:
102
+ record = spawn_store.get_spawn(runtime_root, normalized_spawn_id)
103
+ if record is None or record.status not in ACTIVE_SPAWN_STATUSES:
104
+ _fail(f"spawn not running: {normalized_spawn_id} has no control endpoint")
97
105
  if discovery_path.exists():
98
106
  break
99
- if _attempt < _SOCKET_WAIT_ATTEMPTS - 1:
100
- await asyncio.sleep(_SOCKET_WAIT_INTERVAL)
101
- else:
102
- _fail(f"spawn not running: {normalized_spawn_id} has no control endpoint")
107
+ remaining = discovery_deadline - time.monotonic()
108
+ if remaining <= 0:
109
+ _fail(f"spawn not running: {normalized_spawn_id} has no control endpoint")
110
+ await asyncio.sleep(min(_ENDPOINT_DISCOVERY_POLL_SECONDS, remaining))
103
111
 
104
112
  request: dict[str, str] = {"type": "user_message", "text": normalized_message}
105
113
 
@@ -19,4 +19,4 @@ class RealClock:
19
19
  return time.time()
20
20
 
21
21
  def utc_now_iso(self) -> str:
22
- return datetime.now(UTC).replace(microsecond=0).isoformat().replace("+00:00", "Z")
22
+ return datetime.now(UTC).isoformat(timespec="milliseconds").replace("+00:00", "Z")
@@ -31,6 +31,13 @@ connection validates this (`_validate_initial_prompt_requirement()`) and enforce
31
31
  30-second timeout for the first stdout event after the prompt
32
32
  (`_FIRST_STDOUT_AFTER_INITIAL_PROMPT_TIMEOUT_SECONDS`).
33
33
 
34
+ **Pi injected prompts are acknowledged commands.** Every prompt carries an RPC `id`
35
+ and `streamingBehavior: "followUp"`; the field is valid whether Pi is busy or idle.
36
+ Injected prompts wait for the matching `response` before `send_user_message()` returns.
37
+ A rejected inject is annotated as control-action response evidence, persisted, and
38
+ reported to the injector without becoming a terminal event for the running spawn.
39
+ Initial-prompt rejection remains spawn-fatal.
40
+
34
41
  **`opencode_http.py` imports `OPENCODE_CONFIG_CONTENT_ENV` from
35
42
  `meridian.lib.launch.workspace_projection`** to preserve the required bootstrap
36
43
  dependency direction; see [launch context](../../../launch/.context/CONTEXT.md).
@@ -68,6 +68,7 @@ _PI_SPAWNED_PROMPT_REQUIRED_REASON: Final[str] = "pi_rpc_spawned_prompt_required
68
68
  _FIRST_STDOUT_AFTER_INITIAL_PROMPT_TIMEOUT_SECONDS: Final[float] = 30.0
69
69
  _BLOCKED_CHILD_ENV_VARS: Final[frozenset[str]] = BLOCKED_CHILD_ENV_VARS
70
70
  _PI_SESSION_DIR_FLAG: Final[str] = "--session-dir"
71
+ PI_SUBPROCESS_EXIT_ERROR_PREFIX: Final[str] = "Pi subprocess exited with code "
71
72
  _PI_CHILD_WAVE_TIMEOUT_MS_ENV: Final[str] = "MERIDIAN_PI_CHILD_WAVE_TIMEOUT_MS"
72
73
  _PI_TASK_PING_INTERVAL_MS_ENV: Final[str] = "MERIDIAN_PI_TASK_PING_INTERVAL_MS"
73
74
  _PI_TASK_PING_RESET_ON_ACTIVITY_ENV: Final[str] = "MERIDIAN_PI_TASK_PING_RESET_ON_ACTIVITY"
@@ -76,6 +77,16 @@ _STREAM_EOF_KIND: Final[Literal["eof"]] = "eof"
76
77
  _STREAM_ERROR_KIND: Final[Literal["error"]] = "error"
77
78
 
78
79
 
80
+ def pi_subprocess_exit_error(return_code: int) -> str:
81
+ """Return the canonical failure emitted for a non-zero Pi process exit."""
82
+ return f"{PI_SUBPROCESS_EXIT_ERROR_PREFIX}{return_code}."
83
+
84
+
85
+ def is_pi_subprocess_exit_error(error: str | None) -> bool:
86
+ """Whether an error originated from the canonical Pi process-exit failure."""
87
+ return error is not None and error.startswith(PI_SUBPROCESS_EXIT_ERROR_PREFIX)
88
+
89
+
79
90
  class PiRpcConnection(HarnessConnection[ResolvedLaunchSpec]):
80
91
  """Full-duplex Pi RPC connection over JSONL stdio."""
81
92
 
@@ -126,6 +137,8 @@ class PiRpcConnection(HarnessConnection[ResolvedLaunchSpec]):
126
137
  self._launch_cwd: str | None = None
127
138
  self._launch_session_role: str | None = None
128
139
  self._events_stream_active = False
140
+ self._prompt_command_seq = 0
141
+ self._pending_prompt_acks: dict[str, asyncio.Future[None]] = {}
129
142
 
130
143
  @property
131
144
  def state(self) -> ConnectionState:
@@ -250,11 +263,28 @@ class PiRpcConnection(HarnessConnection[ResolvedLaunchSpec]):
250
263
  return self._state == "connected"
251
264
 
252
265
  async def send_user_message(self, text: str) -> None:
266
+ await self._send_prompt(text, wait_for_ack=True)
267
+
268
+ async def _send_prompt(self, text: str, *, wait_for_ack: bool) -> None:
269
+ command_id = f"meridian-prompt-{self._prompt_command_seq}"
270
+ self._prompt_command_seq += 1
253
271
  payload: dict[str, object] = {
272
+ "id": command_id,
254
273
  "type": "prompt",
255
274
  "message": text,
275
+ "streamingBehavior": "followUp",
256
276
  }
257
- await self._send_rpc_message(payload, event="prompt")
277
+ if not wait_for_ack:
278
+ await self._send_rpc_message(payload, event="prompt")
279
+ return
280
+
281
+ ack = asyncio.get_running_loop().create_future()
282
+ self._pending_prompt_acks[command_id] = ack
283
+ try:
284
+ await self._send_rpc_message(payload, event="prompt")
285
+ await ack
286
+ finally:
287
+ self._pending_prompt_acks.pop(command_id, None)
258
288
 
259
289
  async def send_steer(self, text: str) -> None:
260
290
  payload: dict[str, object] = {
@@ -381,7 +411,7 @@ class PiRpcConnection(HarnessConnection[ResolvedLaunchSpec]):
381
411
  break
382
412
  if return_code != 0 and self._state not in {"stopping", "stopped"}:
383
413
  detail = self._failure_detail_with_stderr(
384
- f"Pi subprocess exited with code {return_code}."
414
+ pi_subprocess_exit_error(return_code)
385
415
  )
386
416
  self._mark_failed(detail)
387
417
  yield self._error_event(detail)
@@ -622,6 +652,10 @@ class PiRpcConnection(HarnessConnection[ResolvedLaunchSpec]):
622
652
  raw_line=payload_text,
623
653
  )
624
654
 
655
+ if normalized_type == "response" and self._resolve_prompt_ack(payload):
656
+ payload = dict(payload)
657
+ payload["meridian_control_action"] = "inject"
658
+
625
659
  return HarnessEvent(
626
660
  event_type=normalized_type,
627
661
  payload=payload,
@@ -629,6 +663,27 @@ class PiRpcConnection(HarnessConnection[ResolvedLaunchSpec]):
629
663
  raw_text=line,
630
664
  )
631
665
 
666
+ def _resolve_prompt_ack(self, payload: dict[str, object]) -> bool:
667
+ if str(payload.get("command", "")).strip().lower() != "prompt":
668
+ return False
669
+ command_id = payload.get("id")
670
+ if not isinstance(command_id, str):
671
+ return False
672
+ pending = self._pending_prompt_acks.get(command_id)
673
+ if pending is None or pending.done():
674
+ return False
675
+ if payload.get("success") is True:
676
+ pending.set_result(None)
677
+ else:
678
+ error = payload.get("error")
679
+ detail = (
680
+ error.strip()
681
+ if isinstance(error, str) and error.strip()
682
+ else "pi_prompt_rejected"
683
+ )
684
+ pending.set_exception(RuntimeError(detail))
685
+ return True
686
+
632
687
  def _has_unsupported_lifecycle_schema_version(
633
688
  self,
634
689
  *,
@@ -713,7 +768,7 @@ class PiRpcConnection(HarnessConnection[ResolvedLaunchSpec]):
713
768
  if not prompt.strip():
714
769
  self._initial_prompt_sent = True
715
770
  return False
716
- await self.send_user_message(prompt)
771
+ await self._send_prompt(prompt, wait_for_ack=False)
717
772
  self._initial_prompt_sent = True
718
773
  return True
719
774
 
@@ -785,6 +840,7 @@ class PiRpcConnection(HarnessConnection[ResolvedLaunchSpec]):
785
840
  )
786
841
 
787
842
  async def _cleanup_resources(self, *, terminate_process: bool) -> bool:
843
+ self._fail_pending_prompt_acks()
788
844
  stop_escalated = False
789
845
  if terminate_process:
790
846
  stop_escalated = await self._terminate_process()
@@ -792,6 +848,15 @@ class PiRpcConnection(HarnessConnection[ResolvedLaunchSpec]):
792
848
  self._close_log_handles()
793
849
  return stop_escalated
794
850
 
851
+ def _fail_pending_prompt_acks(self) -> None:
852
+ for pending in self._pending_prompt_acks.values():
853
+ if not pending.done():
854
+ pending.set_exception(
855
+ ConnectionNotReady(
856
+ "Pi RPC connection closed before prompt acknowledgement."
857
+ )
858
+ )
859
+
795
860
  async def _terminate_process(self) -> bool:
796
861
  process = self._process
797
862
  if process is None:
@@ -218,7 +218,8 @@ def terminal_outcome(
218
218
 
219
219
  if event.harness_id == HarnessId.PI.value and event.event_type == "response":
220
220
  command = str(event.payload.get("command", "")).strip().lower()
221
- if command == "prompt" and event.payload.get("success") is False:
221
+ is_inject_response = event.payload.get("meridian_control_action") == "inject"
222
+ if command == "prompt" and event.payload.get("success") is False and not is_inject_response:
222
223
  error = _stringify_terminal_error(event.payload.get("error")) or "pi_prompt_rejected"
223
224
  return TerminalEventOutcome(status="failed", exit_code=1, error=error)
224
225
 
@@ -203,7 +203,8 @@ def _pi_failure_from_payload(payload: dict[str, object]) -> str | None:
203
203
  event_type = _event_name(payload)
204
204
  if event_type == "response":
205
205
  command = str(payload.get("command", "")).strip().lower()
206
- if command == "prompt" and payload.get("success") is False:
206
+ is_inject_response = payload.get("meridian_control_action") == "inject"
207
+ if command == "prompt" and payload.get("success") is False and not is_inject_response:
207
208
  error = _text_from_value(payload.get("error"))
208
209
  return error or "pi_prompt_rejected"
209
210
  if event_type == _PI_LIFECYCLE_PHASE_EVENT:
@@ -780,10 +780,9 @@ async def _run_streaming_attempt(
780
780
  timed_out = True
781
781
  await manager.stop_spawn(
782
782
  run.spawn_id,
783
- status="failed",
783
+ status="timed_out",
784
784
  exit_code=3,
785
785
  error="timeout",
786
- prefer_drain_outcome=True,
787
786
  )
788
787
  drain_exit_code = 3
789
788
  elif decision.trigger == TriggerKind.WATCHDOG:
@@ -8,6 +8,7 @@ from dataclasses import dataclass, field
8
8
  from pathlib import Path
9
9
  from typing import Any, cast
10
10
 
11
+ from meridian.lib.core.clock import Clock, RealClock
11
12
  from meridian.lib.harness.connections.base import HarnessEvent
12
13
  from meridian.lib.state.atomic import append_text_line
13
14
  from meridian.lib.state.managed_primary import ManagedPrimaryCausalTracker
@@ -27,6 +28,7 @@ class HarnessHistoryWriter:
27
28
  """Append-only writer for seq-enveloped raw harness events."""
28
29
 
29
30
  history_path: Path
31
+ clock: Clock = field(default_factory=RealClock)
30
32
  _seq: int = field(default=0, init=False)
31
33
  _byte_offset: int = field(default=0, init=False)
32
34
  _causal_tracker: ManagedPrimaryCausalTracker = field(
@@ -60,6 +62,7 @@ class HarnessHistoryWriter:
60
62
  envelope = {
61
63
  "seq": self._seq,
62
64
  "byte_offset": self._byte_offset,
65
+ "timestamp": self.clock.utc_now_iso(),
63
66
  "turn_id": causal.turn_id,
64
67
  "item_id": causal.item_id,
65
68
  "request_id": causal.request_id,
@@ -211,6 +214,7 @@ def strip_seq_envelope(envelope: dict[str, Any]) -> dict[str, Any]:
211
214
  not in (
212
215
  "seq",
213
216
  "byte_offset",
217
+ "timestamp",
214
218
  "turn_id",
215
219
  "item_id",
216
220
  "request_id",
@@ -99,6 +99,7 @@ class SpawnRecord(BaseModel):
99
99
  error: str | None
100
100
  terminal_origin: SpawnOrigin | None
101
101
  launch_policy_snapshot: LaunchPolicySnapshot | None = None
102
+ published_at: str | None = None
102
103
 
103
104
 
104
105
  __all__ = [
@@ -75,6 +75,7 @@ class StoredSpawnState(BaseModel):
75
75
  runner_exit_at: str | None = None
76
76
  cancel_intent: CancelIntent | None = None
77
77
  finished_at: str | None = None
78
+ published_at: str | None = None
78
79
  exit_code: int | None = None
79
80
  duration_secs: float | None = None
80
81
  total_cost_usd: float | None = None
@@ -150,6 +151,7 @@ def record_to_stored_state(
150
151
  runner_exit_at=record.runner_exit_at,
151
152
  cancel_intent=record.cancel_intent,
152
153
  finished_at=record.finished_at,
154
+ published_at=record.published_at,
153
155
  exit_code=record.exit_code,
154
156
  duration_secs=record.duration_secs,
155
157
  total_cost_usd=record.total_cost_usd,
@@ -210,6 +212,7 @@ def stored_state_to_record(
210
212
  runner_exit_at=stored.runner_exit_at,
211
213
  cancel_intent=stored.cancel_intent,
212
214
  finished_at=stored.finished_at,
215
+ published_at=stored.published_at,
213
216
  exit_code=stored.exit_code,
214
217
  duration_secs=stored.duration_secs,
215
218
  total_cost_usd=stored.total_cost_usd,
@@ -116,6 +116,7 @@ def apply_finalize(
116
116
  *,
117
117
  origin: SpawnOrigin,
118
118
  finished_at: str,
119
+ published_at: str,
119
120
  duration_secs: float | None = None,
120
121
  usage: TokenUsage | None = None,
121
122
  error: str | None = None,
@@ -135,6 +136,7 @@ def apply_finalize(
135
136
  "status": status,
136
137
  "exit_code": exit_code,
137
138
  "finished_at": finished_at,
139
+ "published_at": published_at,
138
140
  "duration_secs": duration_secs,
139
141
  "total_cost_usd": usage.total_cost_usd if usage is not None else None,
140
142
  "input_tokens": usage.input_tokens if usage is not None else None,
@@ -691,12 +691,14 @@ def finalize_spawn(
691
691
  )
692
692
  raise _FinalizeRejected(current)
693
693
  was_active = is_active_spawn_status(current.status)
694
+ published_at = resolved_clock.utc_now_iso()
694
695
  return apply_finalize(
695
696
  current,
696
697
  status,
697
698
  exit_code,
698
699
  origin=origin,
699
- finished_at=finished_at or resolved_clock.utc_now_iso(),
700
+ finished_at=finished_at or published_at,
701
+ published_at=published_at,
700
702
  duration_secs=duration_secs,
701
703
  usage=usage,
702
704
  error=error,
@@ -29,8 +29,12 @@ SpawnSession
29
29
  ├─ control_server: ControlSocketServer
30
30
  ├─ completion_future: Future[DrainOutcome]
31
31
  ├─ teardown: DrainSessionTeardown
32
+ ├─ drain_plan: DrainPlan ← full plan for terminal publication
32
33
  ├─ cancel_sent: bool ← double-cancel guard
33
- └─ control_actions: ControlActionCoordinator
34
+ ├─ control_actions: ControlActionCoordinator
35
+ ├─ authoritative_stop_outcome: DrainOutcome | None ← explicit stop intent
36
+ ├─ terminal_published: bool ← idempotent publication guard
37
+ └─ cleanup_task: Task | None ← per-spawn post-publication teardown
34
38
  ```
35
39
 
36
40
  The implementation is split by responsibility:
@@ -98,15 +102,24 @@ so resident and plain drain paths never see it as a parent completion candidate.
98
102
  `PrimaryEventScope` is the only scope contract passed through the drain stack; do
99
103
  not preserve or add compatibility side channels such as a Codex-only thread-id path.
100
104
 
101
- ### DrainOutcome Priority
105
+ ### DrainOutcome Classification
102
106
 
103
- When the drain loop exits, the outcome is determined in this order:
107
+ The drain loop classifies its outcome, but does not own publication.
108
+ Classification order:
104
109
 
105
- 1. `asyncio.CancelledError` raised → `cancelled`
106
- 2. Unhandled exception `failed`
107
- 3. `session.cancel_sent` is True → `cancelled` (exit code 143)
108
- 4. `recorded_terminal_outcome` from harness use its status/exit_code/error
109
- 5. Connection closed without a terminal event → `failed` with `connection_closed_without_terminal_event`
110
+ 1. `recorded_terminal_outcome` with `status == "succeeded"` → `succeeded`
111
+ (success takes priority over cancellation)
112
+ 2. `asyncio.CancelledError` raised → `cancelled`
113
+ 3. Unhandled exception`failed`
114
+ 4. `session.cancel_sent` is True → `cancelled` (exit code 143)
115
+ 5. Non-success `recorded_terminal_outcome` from harness → use its status/exit_code/error
116
+ 6. Connection closed without a terminal event → `failed` with `connection_closed_without_terminal_event`
117
+
118
+ After classification, `SpawnManager._publish_terminal()` applies
119
+ `resolve_terminal_outcome()` which resolves competing sources: success wins;
120
+ otherwise an authoritative stop outcome (from `stop_spawn()`) wins; otherwise the
121
+ drain classification stands. Publication is idempotent — `terminal_published` on
122
+ `SpawnSession` guards against double publication.
110
123
 
111
124
  ### Subscriber Queue Backpressure
112
125
 
@@ -122,6 +135,18 @@ concurrent `start_spawn` calls from different event loops.
122
135
 
123
136
  ### Terminal Publication and Recovery
124
137
 
138
+ `SpawnManager._publish_terminal()` is the idempotent barrier that owns terminal
139
+ lifecycle publication. It resolves competing terminal sources via
140
+ `resolve_terminal_outcome()` (success > authoritative stop > drain classification),
141
+ runs the plan finalizer, resolves the completion future, notifies observers, and
142
+ starts one per-spawn cleanup task. Both the drain loop's natural exit path and
143
+ `stop_spawn()` call it; the `terminal_published` guard ensures exactly one publication.
144
+
145
+ Cleanup tasks are keyed per spawn (`_cleanup_tasks: dict[SpawnId, Task]`).
146
+ `stop_spawn()` awaits only its own spawn's cleanup. `shutdown()` drains all
147
+ remaining cleanup tasks. This prevents cross-spawn coupling where stopping one
148
+ spawn would block on another's unrelated cleanup.
149
+
125
150
  Terminal outcomes publish before plan-owned teardown runs asynchronously and best-effort;
126
151
  startup reaper reconciliation recovers incomplete cleanup. Completion deadlines use
127
152
  process-local monotonic time and are not persisted or crash-stable.
@@ -68,6 +68,10 @@ fail, or clear signals for the parent.
68
68
  inject, interrupt, permission reply, and user-input-reply actions. Calling the
69
69
  connection directly breaks this serialization.
70
70
 
71
+ **Terminal publication belongs to `SpawnManager`.** The drain loop supplies its
72
+ classification, but `stop_spawn()` must still publish the finalized lifecycle row,
73
+ resolve completion, and start that spawn's cleanup when a bounded drain is cancelled.
74
+
71
75
  **Drain loop ordering is not negotiable: persist → observe → fan-out.** A failed
72
76
  write — including the tenth consecutive failure that aborts the loop with a
73
77
  `failed` outcome — is never delivered to the coordinator, observers, or the
@@ -110,7 +114,7 @@ means the manager died or the spawn is orphaned.
110
114
 
111
115
  - `spawn_manager.py` — `SpawnManager`: public live-spawn registry/control API
112
116
  - `spawn_dispatch.py` — connection creation/start dispatch
113
- - `spawn_drain_loop.py` — event drain, persistence/observer/fan-out ordering, outcome priority
117
+ - `spawn_drain_loop.py` — event drain, persistence/observer/fan-out ordering, outcome classification, `resolve_terminal_outcome` priority resolver
114
118
  - `drain_coordinator.py` — `DrainCoordinator` protocol seam for harness-specific completion policy
115
119
  - `drain_plan_factory.py` — plain/resident/Pi plan selection and capability wiring
116
120
  - `drain_teardown.py` — harness-neutral plan-owned connection-stop contract and default
@@ -3,14 +3,16 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import asyncio
6
+ import logging
6
7
  from collections.abc import AsyncIterator
7
- from contextlib import suppress
8
8
  from dataclasses import dataclass
9
9
  from typing import Any
10
10
 
11
11
  from meridian.lib.harness.connections.base import HarnessEvent
12
12
  from meridian.lib.streaming.drain_coordinator import AuxWakeCoordinator
13
13
 
14
+ logger = logging.getLogger(__name__)
15
+
14
16
 
15
17
  @dataclass(frozen=True)
16
18
  class DrainEventWake:
@@ -43,9 +45,12 @@ class DrainInputWaiter:
43
45
  self,
44
46
  events_iter: AsyncIterator[HarnessEvent],
45
47
  aux_wake: AuxWakeCoordinator,
48
+ *,
49
+ task_context: str = "drain input",
46
50
  ) -> None:
47
51
  self._events_iter = events_iter
48
52
  self._aux_wake = aux_wake
53
+ self._task_context = task_context
49
54
  self._pending_event_task: asyncio.Future[HarnessEvent] | None = None
50
55
  self._pending_disk_task: asyncio.Task[None] | None = None
51
56
 
@@ -98,7 +103,7 @@ class DrainInputWaiter:
98
103
  self._pending_event_task = None
99
104
  return DrainClosedWake()
100
105
  finally:
101
- await _cancel_task(timeout_task)
106
+ await _cancel_task(timeout_task, task_context=f"{self._task_context} timeout")
102
107
 
103
108
  def _consume_ready_disk_change(self) -> bool:
104
109
  if self._pending_disk_task is None or not self._pending_disk_task.done():
@@ -108,13 +113,47 @@ class DrainInputWaiter:
108
113
  return True
109
114
 
110
115
  async def close(self) -> None:
111
- await _cancel_task(self._pending_event_task)
112
- await _cancel_task(self._pending_disk_task)
113
-
114
-
115
- async def _cancel_task(task: asyncio.Future[Any] | None) -> None:
116
- if task is None or task.done():
116
+ await _cancel_task(
117
+ self._pending_event_task,
118
+ task_context=f"{self._task_context} event source",
119
+ )
120
+ await _cancel_task(
121
+ self._pending_disk_task,
122
+ task_context=f"{self._task_context} auxiliary wake",
123
+ )
124
+
125
+
126
+ async def _cancel_task(
127
+ task: asyncio.Future[Any] | None,
128
+ *,
129
+ task_context: str = "drain task",
130
+ ) -> None:
131
+ if task is None:
132
+ return
133
+ if task.done():
134
+ if task.cancelled():
135
+ return
136
+ try:
137
+ task.result()
138
+ except (StopAsyncIteration, asyncio.CancelledError):
139
+ pass
140
+ except Exception as exc:
141
+ logger.warning(
142
+ "Unexpected %s failure while closing: %s",
143
+ task_context,
144
+ exc,
145
+ exc_info=True,
146
+ )
117
147
  return
118
148
  task.cancel()
119
- with suppress(asyncio.CancelledError):
149
+ try:
120
150
  await task
151
+ except (StopAsyncIteration, asyncio.CancelledError):
152
+ pass
153
+ except Exception as exc:
154
+ logger.warning(
155
+ "Unexpected %s failure while closing: %s",
156
+ task_context,
157
+ exc,
158
+ exc_info=True,
159
+ )
@@ -9,6 +9,7 @@ from typing import TYPE_CHECKING, Protocol
9
9
 
10
10
  from meridian.lib.core.domain import SpawnStatus
11
11
  from meridian.lib.core.types import SpawnId
12
+ from meridian.lib.harness.connections.pi_rpc import is_pi_subprocess_exit_error
12
13
  from meridian.lib.harness.pi_lifecycle_events import pi_notification_id
13
14
  from meridian.lib.state.spawn_signals import consume_resident_signals
14
15
  from meridian.lib.streaming.completion_contracts import (
@@ -266,8 +267,15 @@ class PiCompletionProfile:
266
267
  recorded_outcome: TerminalEventOutcome | None,
267
268
  ) -> ProfileExitDecision:
268
269
  del state
269
- pending_children = self.pending_children_at_exit()
270
- if pending_children and recorded_outcome is None:
270
+ pending_tracked_work = self.pending_children_at_exit()
271
+ if pending_tracked_work and (
272
+ recorded_outcome is None
273
+ or (
274
+ recorded_outcome.status == "failed"
275
+ and recorded_outcome.exit_code == 1
276
+ and is_pi_subprocess_exit_error(recorded_outcome.error)
277
+ )
278
+ ):
271
279
  recorded_outcome = _terminal_outcome(
272
280
  status="failed",
273
281
  exit_code=1,
@@ -277,7 +285,9 @@ class PiCompletionProfile:
277
285
  recorded_outcome=recorded_outcome,
278
286
  fallback_error=self.fallback_error_without_recorded_outcome(),
279
287
  cleanup_reason=(
280
- "pi_process_exit_with_tracked_children" if pending_children else None
288
+ "pi_process_exit_with_tracked_children"
289
+ if pending_tracked_work
290
+ else None
281
291
  ),
282
292
  )
283
293
 
@@ -344,7 +354,14 @@ class PiCompletionProfile:
344
354
  return None
345
355
 
346
356
  def pending_children_at_exit(self) -> bool:
347
- return self.quiescence_enabled and self.evidence.has_pending_children()
357
+ if not self.quiescence_enabled:
358
+ return False
359
+ work = self.evidence.classify_outstanding_work()
360
+ return (
361
+ work.spawn_children
362
+ or work.unknown_spawn_children
363
+ or work.non_spawn_processes
364
+ )
348
365
 
349
366
  def fallback_error_without_recorded_outcome(self) -> str | None:
350
367
  return self.tracker.notification_failure_error