meridian-cli 0.3.30__tar.gz → 0.3.32__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (582) hide show
  1. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/PKG-INFO +1 -1
  2. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/AGENTS.md +1 -0
  3. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/__init__.py +1 -1
  4. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/app_tree.py +4 -0
  5. meridian_cli-0.3.32/src/meridian/cli/artifact_cmd.py +193 -0
  6. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/command_groups.py +15 -0
  7. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/main.py +6 -0
  8. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/startup/catalog.py +4 -0
  9. meridian_cli-0.3.32/src/meridian/lib/artifact/AGENTS.md +67 -0
  10. meridian_cli-0.3.32/src/meridian/lib/artifact/CLAUDE.md +1 -0
  11. meridian_cli-0.3.32/src/meridian/lib/artifact/__init__.py +19 -0
  12. meridian_cli-0.3.32/src/meridian/lib/artifact/_serve_dir.py +45 -0
  13. meridian_cli-0.3.32/src/meridian/lib/artifact/service.py +469 -0
  14. meridian_cli-0.3.32/src/meridian/lib/artifact/store.py +143 -0
  15. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/bootstrap/.context/CONTEXT.md +4 -0
  16. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/bootstrap/AGENTS.md +4 -0
  17. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/bootstrap/runtime_state.py +4 -0
  18. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/.context/CONTEXT.md +12 -108
  19. meridian_cli-0.3.32/src/meridian/lib/harness/.context/pi-integration.md +56 -0
  20. meridian_cli-0.3.32/src/meridian/lib/harness/.context/session-transcripts.md +58 -0
  21. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/AGENTS.md +3 -1
  22. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/.context/CONTEXT.md +4 -2
  23. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/extractors/pi.py +3 -3
  24. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/pi_lifecycle_events.py +27 -2
  25. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/streaming_runner.py +6 -0
  26. meridian_cli-0.3.32/src/meridian/lib/ops/.context/FUTURE +2 -0
  27. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/pruning.py +19 -2
  28. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/.context/CONTEXT.md +11 -3
  29. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/AGENTS.md +6 -2
  30. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/atomic.py +9 -0
  31. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/spawn_store.py +86 -31
  32. meridian_cli-0.3.32/src/meridian/lib/streaming/.context/CONTEXT.md +202 -0
  33. meridian_cli-0.3.32/src/meridian/lib/streaming/.context/FUTURE +35 -0
  34. meridian_cli-0.3.32/src/meridian/lib/streaming/.context/pi-drain.md +146 -0
  35. meridian_cli-0.3.32/src/meridian/lib/streaming/.context/signal-cancellation.md +56 -0
  36. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/AGENTS.md +40 -15
  37. meridian_cli-0.3.32/src/meridian/lib/streaming/completion_contracts.py +274 -0
  38. meridian_cli-0.3.32/src/meridian/lib/streaming/completion_coordinator.py +501 -0
  39. meridian_cli-0.3.32/src/meridian/lib/streaming/descendant_evidence.py +92 -0
  40. meridian_cli-0.3.32/src/meridian/lib/streaming/disk_watcher.py +183 -0
  41. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/drain_coordinator.py +13 -0
  42. meridian_cli-0.3.32/src/meridian/lib/streaming/drain_plan_factory.py +157 -0
  43. meridian_cli-0.3.32/src/meridian/lib/streaming/drain_teardown.py +117 -0
  44. meridian_cli-0.3.32/src/meridian/lib/streaming/pi_completion_profile.py +683 -0
  45. meridian_cli-0.3.32/src/meridian/lib/streaming/pi_drain.py +618 -0
  46. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/pi_process_cleanup.py +12 -3
  47. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/pi_quiescence.py +30 -27
  48. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/pi_subspawn_tracker.py +49 -104
  49. meridian_cli-0.3.32/src/meridian/lib/streaming/pi_work_ledger.py +308 -0
  50. meridian_cli-0.3.32/src/meridian/lib/streaming/resident_drain.py +505 -0
  51. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/spawn_drain_loop.py +27 -3
  52. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/spawn_manager.py +36 -171
  53. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/spawn_session.py +2 -0
  54. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/.context/CONTEXT.md +13 -5
  55. meridian_cli-0.3.32/src/meridian/pi_runtime/AGENTS.md +39 -0
  56. meridian_cli-0.3.32/src/meridian/server/CLAUDE.md +1 -0
  57. meridian_cli-0.3.30/src/meridian/lib/streaming/.context/CONTEXT.md +0 -339
  58. meridian_cli-0.3.30/src/meridian/lib/streaming/disk_watcher.py +0 -274
  59. meridian_cli-0.3.30/src/meridian/lib/streaming/pi_drain.py +0 -771
  60. meridian_cli-0.3.30/src/meridian/lib/streaming/resident_drain.py +0 -320
  61. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/.gitignore +0 -0
  62. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/LICENSE +0 -0
  63. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/README.md +0 -0
  64. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/pyproject.toml +0 -0
  65. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/ag_ui/__init__.pyi +0 -0
  66. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/ag_ui/core.pyi +0 -0
  67. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/CLAUDE.md +0 -0
  68. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/__main__.py +0 -0
  69. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/.context/CONTEXT.md +0 -0
  70. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/AGENTS.md +0 -0
  71. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/CLAUDE.md +0 -0
  72. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/__init__.py +0 -0
  73. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/_cmd_utils.py +0 -0
  74. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/agent_help.py +0 -0
  75. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/argv_normalization.py +0 -0
  76. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/bootstrap.py +0 -0
  77. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/bootstrap_cmd.py +0 -0
  78. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/config_cmd.py +0 -0
  79. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/doctor_cmd.py +0 -0
  80. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/entrypoint.py +0 -0
  81. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/ext_cmd.py +0 -0
  82. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/ext_registration.py +0 -0
  83. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/help_content.py +0 -0
  84. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/help_tiers.py +0 -0
  85. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/hooks_authority.py +0 -0
  86. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/hooks_commands.py +0 -0
  87. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/kg_cmd.py +0 -0
  88. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/mars_passthrough.py +0 -0
  89. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/mermaid_cmd.py +0 -0
  90. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/migrate_cmd.py +0 -0
  91. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/misc_commands.py +0 -0
  92. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/mode.py +0 -0
  93. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/models_cmd.py +0 -0
  94. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/output.py +0 -0
  95. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/primary_launch.py +0 -0
  96. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/qi_cmd.py +0 -0
  97. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/report_cmd.py +0 -0
  98. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/session_cmd.py +0 -0
  99. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/spawn.py +0 -0
  100. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/spawn_inject.py +0 -0
  101. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/startup/__init__.py +0 -0
  102. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/startup/classify.py +0 -0
  103. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/startup/cyclopts_app.py +0 -0
  104. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/startup/help.py +0 -0
  105. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/startup/lazy_dispatch.py +0 -0
  106. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/startup/policy.py +0 -0
  107. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/streaming_serve.py +0 -0
  108. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/sync_cmd.py +0 -0
  109. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/task_dir_cmd.py +0 -0
  110. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/telemetry_cmd.py +0 -0
  111. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/utils.py +0 -0
  112. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/work_cmd.py +0 -0
  113. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/cli/workspace_cmd.py +0 -0
  114. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/dev/AGENTS.md +0 -0
  115. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/dev/CLAUDE.md +0 -0
  116. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/dev/__init__.py +0 -0
  117. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/dev/pytests.py +0 -0
  118. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/__init__.py +0 -0
  119. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/bootstrap/CLAUDE.md +0 -0
  120. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/bootstrap/__init__.py +0 -0
  121. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/bootstrap/config.py +0 -0
  122. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/bootstrap/project_state.py +0 -0
  123. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/bootstrap/services.py +0 -0
  124. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/catalog/.context/CONTEXT.md +0 -0
  125. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/catalog/AGENTS.md +0 -0
  126. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/catalog/CLAUDE.md +0 -0
  127. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/catalog/__init__.py +0 -0
  128. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/catalog/agent.py +0 -0
  129. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/catalog/bootstrap.py +0 -0
  130. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/catalog/catalog_session.py +0 -0
  131. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/catalog/model_aliases.py +0 -0
  132. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/catalog/models.py +0 -0
  133. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/catalog/skill.py +0 -0
  134. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/config/.context/CONTEXT.md +0 -0
  135. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/config/AGENTS.md +0 -0
  136. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/config/CLAUDE.md +0 -0
  137. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/config/__init__.py +0 -0
  138. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/config/catalog.py +0 -0
  139. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/config/context_config.py +0 -0
  140. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/config/preserving_edit.py +0 -0
  141. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/config/project_config_state.py +0 -0
  142. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/config/project_paths.py +0 -0
  143. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/config/project_root.py +0 -0
  144. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/config/schema.py +0 -0
  145. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/config/settings.py +0 -0
  146. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/config/workspace.py +0 -0
  147. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/context/.context/CONTEXT.md +0 -0
  148. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/context/AGENTS.md +0 -0
  149. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/context/CLAUDE.md +0 -0
  150. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/context/__init__.py +0 -0
  151. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/context/resolver.py +0 -0
  152. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/.context/CONTEXT.md +0 -0
  153. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/AGENTS.md +0 -0
  154. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/CLAUDE.md +0 -0
  155. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/__init__.py +0 -0
  156. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/child_env.py +0 -0
  157. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/clock.py +0 -0
  158. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/codec.py +0 -0
  159. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/command_strings.py +0 -0
  160. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/context.py +0 -0
  161. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/conversation.py +0 -0
  162. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/depth.py +0 -0
  163. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/domain.py +0 -0
  164. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/execution_policy.py +0 -0
  165. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/formatting.py +0 -0
  166. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/launch_policy_snapshot.py +0 -0
  167. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/lifecycle.py +0 -0
  168. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/logging.py +0 -0
  169. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/overrides.py +0 -0
  170. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/process_cleanup.py +0 -0
  171. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/resolved_context.py +0 -0
  172. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/sink.py +0 -0
  173. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/spawn_lifecycle.py +0 -0
  174. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/spawn_service.py +0 -0
  175. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/spawn_start.py +0 -0
  176. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/telemetry.py +0 -0
  177. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/types.py +0 -0
  178. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/core/util.py +0 -0
  179. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/diagnostics.py +0 -0
  180. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/.context/CONTEXT.md +0 -0
  181. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/AGENTS.md +0 -0
  182. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/CLAUDE.md +0 -0
  183. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/__init__.py +0 -0
  184. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/commands/.context/CONTEXT.md +0 -0
  185. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/commands/AGENTS.md +0 -0
  186. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/commands/CLAUDE.md +0 -0
  187. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/commands/__init__.py +0 -0
  188. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/commands/biomed.py +0 -0
  189. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/commands/mermaid.py +0 -0
  190. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/commands/sessions.py +0 -0
  191. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/commands/workbench.py +0 -0
  192. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/context.py +0 -0
  193. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/descriptors.py +0 -0
  194. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/dispatcher.py +0 -0
  195. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/first_party.py +0 -0
  196. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/observability.py +0 -0
  197. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/registry.py +0 -0
  198. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/extensions/types.py +0 -0
  199. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/CLAUDE.md +0 -0
  200. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/__init__.py +0 -0
  201. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/adapter.py +0 -0
  202. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/bundle.py +0 -0
  203. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/claude.py +0 -0
  204. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/claude_preflight.py +0 -0
  205. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/claude_sessions.py +0 -0
  206. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/claude_utils.py +0 -0
  207. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/codex.py +0 -0
  208. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/codex_rollout.py +0 -0
  209. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/common.py +0 -0
  210. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/AGENTS.md +0 -0
  211. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/CLAUDE.md +0 -0
  212. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/__init__.py +0 -0
  213. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/base.py +0 -0
  214. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/claude_ws.py +0 -0
  215. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/codex_ws.py +0 -0
  216. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/cursor_subprocess.py +0 -0
  217. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/errors.py +0 -0
  218. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/liveness.py +0 -0
  219. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/managed_backend.py +0 -0
  220. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/opencode_http.py +0 -0
  221. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/pi_rpc.py +0 -0
  222. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/connections/resident_backend.py +0 -0
  223. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/control_action.py +0 -0
  224. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/cost.py +0 -0
  225. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/cursor.py +0 -0
  226. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/errors.py +0 -0
  227. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/extractor.py +0 -0
  228. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/extractors/.context/CONTEXT.md +0 -0
  229. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/extractors/AGENTS.md +0 -0
  230. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/extractors/CLAUDE.md +0 -0
  231. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/extractors/__init__.py +0 -0
  232. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/extractors/base.py +0 -0
  233. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/extractors/claude.py +0 -0
  234. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/extractors/codex.py +0 -0
  235. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/extractors/cursor.py +0 -0
  236. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/extractors/opencode.py +0 -0
  237. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/launch_spec.py +0 -0
  238. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/launch_types.py +0 -0
  239. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/opencode.py +0 -0
  240. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/opencode_report.py +0 -0
  241. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/opencode_storage.py +0 -0
  242. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/opencode_transcript.py +0 -0
  243. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/passthrough/.context/CONTEXT.md +0 -0
  244. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/passthrough/AGENTS.md +0 -0
  245. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/passthrough/CLAUDE.md +0 -0
  246. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/passthrough/__init__.py +0 -0
  247. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/passthrough/base.py +0 -0
  248. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/passthrough/claude.py +0 -0
  249. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/passthrough/codex.py +0 -0
  250. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/passthrough/opencode.py +0 -0
  251. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/passthrough/registry.py +0 -0
  252. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/permission_broker.py +0 -0
  253. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/pi.py +0 -0
  254. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/pi_paths.py +0 -0
  255. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/pi_runtime_resolver.py +0 -0
  256. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/.context/CONTEXT.md +0 -0
  257. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/AGENTS.md +0 -0
  258. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/CLAUDE.md +0 -0
  259. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/__init__.py +0 -0
  260. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/_guards.py +0 -0
  261. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/permission_flags.py +0 -0
  262. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/pi_extension_projection.py +0 -0
  263. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/project_claude.py +0 -0
  264. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/project_codex_common.py +0 -0
  265. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/project_codex_streaming.py +0 -0
  266. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/project_codex_subprocess.py +0 -0
  267. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/project_cursor.py +0 -0
  268. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/project_opencode_streaming.py +0 -0
  269. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/project_opencode_subprocess.py +0 -0
  270. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/project_pi_native_tui.py +0 -0
  271. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/project_pi_rpc.py +0 -0
  272. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/projections/projection_errors.py +0 -0
  273. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/registry.py +0 -0
  274. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/semantics.py +0 -0
  275. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/session_detection.py +0 -0
  276. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/harness/transcript.py +0 -0
  277. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/.context/CONTEXT.md +0 -0
  278. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/AGENTS.md +0 -0
  279. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/CLAUDE.md +0 -0
  280. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/__init__.py +0 -0
  281. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/builtin/.context/CONTEXT.md +0 -0
  282. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/builtin/AGENTS.md +0 -0
  283. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/builtin/CLAUDE.md +0 -0
  284. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/builtin/__init__.py +0 -0
  285. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/builtin/autosync_store.py +0 -0
  286. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/builtin/base.py +0 -0
  287. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/builtin/git_autosync.py +0 -0
  288. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/builtin_registry.py +0 -0
  289. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/config.py +0 -0
  290. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/dispatch.py +0 -0
  291. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/interval.py +0 -0
  292. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/registry.py +0 -0
  293. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/runner.py +0 -0
  294. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/hooks/types.py +0 -0
  295. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ignores.py +0 -0
  296. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/kg/.context/CONTEXT.md +0 -0
  297. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/kg/AGENTS.md +0 -0
  298. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/kg/CLAUDE.md +0 -0
  299. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/kg/__init__.py +0 -0
  300. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/kg/graph.py +0 -0
  301. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/kg/report.py +0 -0
  302. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/kg/serializer.py +0 -0
  303. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/kg/types.py +0 -0
  304. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/.context/CONTEXT.md +0 -0
  305. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/AGENTS.md +0 -0
  306. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/CLAUDE.md +0 -0
  307. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/__init__.py +0 -0
  308. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/artifact_io.py +0 -0
  309. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/bundle_adapter.py +0 -0
  310. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/claude_session_access.py +0 -0
  311. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/command.py +0 -0
  312. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/compiler.py +0 -0
  313. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/composition.py +0 -0
  314. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/composition_spawn.py +0 -0
  315. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/constants.py +0 -0
  316. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/context.py +0 -0
  317. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/continue_replay.py +0 -0
  318. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/cwd.py +0 -0
  319. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/env.py +0 -0
  320. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/errors.py +0 -0
  321. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/extract.py +0 -0
  322. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/fork.py +0 -0
  323. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/launch_types.py +0 -0
  324. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/materialize.py +0 -0
  325. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/permissions.py +0 -0
  326. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/plan.py +0 -0
  327. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/policies.py +0 -0
  328. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/policy_snapshot.py +0 -0
  329. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/process/.context/CONTEXT.md +0 -0
  330. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/process/AGENTS.md +0 -0
  331. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/process/CLAUDE.md +0 -0
  332. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/process/__init__.py +0 -0
  333. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/process/ports.py +0 -0
  334. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/process/primary_attach.py +0 -0
  335. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/process/pty_launcher.py +0 -0
  336. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/process/runner.py +0 -0
  337. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/process/session.py +0 -0
  338. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/process/subprocess_launcher.py +0 -0
  339. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/process/windows_launcher.py +0 -0
  340. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/prompt.py +0 -0
  341. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/prompt_context.py +0 -0
  342. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/reference.py +0 -0
  343. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/report.py +0 -0
  344. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/request.py +0 -0
  345. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/resolution.py +0 -0
  346. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/resolve.py +0 -0
  347. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/run_inputs.py +0 -0
  348. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/runner_helpers.py +0 -0
  349. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/session_scope.py +0 -0
  350. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/signals.py +0 -0
  351. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/spawn_guidance.py +0 -0
  352. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/streaming/.context/CONTEXT.md +0 -0
  353. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/streaming/AGENTS.md +0 -0
  354. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/streaming/CLAUDE.md +0 -0
  355. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/streaming/__init__.py +0 -0
  356. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/streaming/heartbeat.py +0 -0
  357. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/streaming/terminal_arbitrator.py +0 -0
  358. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/text_utils.py +0 -0
  359. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/types.py +0 -0
  360. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/workspace.py +0 -0
  361. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/workspace_projection.py +0 -0
  362. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/launch/written_files.py +0 -0
  363. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/markdown/.context/CONTEXT.md +0 -0
  364. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/markdown/AGENTS.md +0 -0
  365. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/markdown/CLAUDE.md +0 -0
  366. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/markdown/__init__.py +0 -0
  367. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/markdown/extract.py +0 -0
  368. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/markdown/types.py +0 -0
  369. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/.context/CONTEXT.md +0 -0
  370. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/AGENTS.md +0 -0
  371. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/CLAUDE.md +0 -0
  372. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/__init__.py +0 -0
  373. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/report.py +0 -0
  374. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/scanner.py +0 -0
  375. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/serializer.py +0 -0
  376. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/style/.context/CONTEXT.md +0 -0
  377. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/style/AGENTS.md +0 -0
  378. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/style/CLAUDE.md +0 -0
  379. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/style/__init__.py +0 -0
  380. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/style/bare_end.py +0 -0
  381. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/style/fill_no_color.py +0 -0
  382. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/style/line_map.py +0 -0
  383. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/style/ox_edge.py +0 -0
  384. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/style/preprocess.py +0 -0
  385. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/style/suppression.py +0 -0
  386. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/style/types.py +0 -0
  387. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/mermaid/validator.py +0 -0
  388. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/observability/.context/CONTEXT.md +0 -0
  389. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/observability/AGENTS.md +0 -0
  390. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/observability/CLAUDE.md +0 -0
  391. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/observability/__init__.py +0 -0
  392. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/observability/debug_tracer.py +0 -0
  393. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/observability/trace_helpers.py +0 -0
  394. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/.context/CONTEXT.md +0 -0
  395. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/AGENTS.md +0 -0
  396. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/CLAUDE.md +0 -0
  397. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/__init__.py +0 -0
  398. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/catalog.py +0 -0
  399. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/commands.py +0 -0
  400. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/config.py +0 -0
  401. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/config_surface.py +0 -0
  402. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/context.py +0 -0
  403. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/diag.py +0 -0
  404. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/hooks.py +0 -0
  405. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/init_ops.py +0 -0
  406. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/mars.py +0 -0
  407. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/migration.py +0 -0
  408. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/qi.py +0 -0
  409. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/reference.py +0 -0
  410. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/reference_recovery.py +0 -0
  411. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/report.py +0 -0
  412. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/runtime.py +0 -0
  413. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/session_corpus.py +0 -0
  414. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/session_export.py +0 -0
  415. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/session_log.py +0 -0
  416. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/session_log_render.py +0 -0
  417. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/session_render.py +0 -0
  418. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/session_repair.py +0 -0
  419. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/session_repair_target.py +0 -0
  420. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/session_search.py +0 -0
  421. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/session_target.py +0 -0
  422. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/session_transcript.py +0 -0
  423. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/.context/CONTEXT.md +0 -0
  424. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/AGENTS.md +0 -0
  425. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/CLAUDE.md +0 -0
  426. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/__init__.py +0 -0
  427. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/api.py +0 -0
  428. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/context_ref.py +0 -0
  429. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/execute.py +0 -0
  430. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/execute_bg.py +0 -0
  431. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/execute_init.py +0 -0
  432. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/execute_runner.py +0 -0
  433. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/execute_session.py +0 -0
  434. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/failure_policy.py +0 -0
  435. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/models.py +0 -0
  436. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/pre_init.py +0 -0
  437. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/prepare.py +0 -0
  438. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/query.py +0 -0
  439. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/spawn/task_dir.py +0 -0
  440. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/sync_conflicts.py +0 -0
  441. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/work_attachment.py +0 -0
  442. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/work_dashboard.py +0 -0
  443. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/work_lifecycle.py +0 -0
  444. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/work_sessions.py +0 -0
  445. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/ops/workspace.py +0 -0
  446. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/.context/CONTEXT.md +0 -0
  447. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/AGENTS.md +0 -0
  448. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/CLAUDE.md +0 -0
  449. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/__init__.py +0 -0
  450. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/detached_process.py +0 -0
  451. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/locking.py +0 -0
  452. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/parent_watchdog.py +0 -0
  453. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/process_scope/.context/CONTEXT.md +0 -0
  454. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/process_scope/AGENTS.md +0 -0
  455. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/process_scope/CLAUDE.md +0 -0
  456. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/process_scope/__init__.py +0 -0
  457. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/process_scope/base.py +0 -0
  458. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/process_scope/fallback.py +0 -0
  459. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/process_scope/posix.py +0 -0
  460. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/process_scope/windows_job.py +0 -0
  461. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/terminate.py +0 -0
  462. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/platform/unix_modules.py +0 -0
  463. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/safety/.context/CONTEXT.md +0 -0
  464. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/safety/AGENTS.md +0 -0
  465. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/safety/CLAUDE.md +0 -0
  466. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/safety/__init__.py +0 -0
  467. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/safety/budget.py +0 -0
  468. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/safety/guardrails.py +0 -0
  469. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/safety/permissions.py +0 -0
  470. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/safety/redaction.py +0 -0
  471. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/service_context.py +0 -0
  472. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/spawn/.context/CONTEXT.md +0 -0
  473. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/spawn/AGENTS.md +0 -0
  474. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/spawn/CLAUDE.md +0 -0
  475. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/spawn/__init__.py +0 -0
  476. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/spawn/archive.py +0 -0
  477. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/CLAUDE.md +0 -0
  478. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/__init__.py +0 -0
  479. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/artifact_store.py +0 -0
  480. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/event_store.py +0 -0
  481. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/history.py +0 -0
  482. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/launch_boundary.py +0 -0
  483. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/liveness.py +0 -0
  484. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/managed_primary.py +0 -0
  485. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/paths.py +0 -0
  486. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/primary_meta.py +0 -0
  487. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/process_scope_projection.py +0 -0
  488. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/reaper.py +0 -0
  489. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/runtime_root.py +0 -0
  490. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/session_identity.py +0 -0
  491. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/session_store.py +0 -0
  492. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/spawn/.context/CONTEXT.md +0 -0
  493. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/spawn/AGENTS.md +0 -0
  494. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/spawn/CLAUDE.md +0 -0
  495. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/spawn/__init__.py +0 -0
  496. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/spawn/model.py +0 -0
  497. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/spawn/repository.py +0 -0
  498. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/spawn/terminal_policy.py +0 -0
  499. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/spawn/transitions.py +0 -0
  500. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/spawn_report.py +0 -0
  501. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/spawn_scope.py +0 -0
  502. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/spawn_signals.py +0 -0
  503. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/spawn_tree.py +0 -0
  504. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/timestamps.py +0 -0
  505. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/user_paths.py +0 -0
  506. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/wordgen.py +0 -0
  507. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/wordlists.py +0 -0
  508. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/work_scope.py +0 -0
  509. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/state/work_store.py +0 -0
  510. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/CLAUDE.md +0 -0
  511. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/__init__.py +0 -0
  512. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/completion_nudge.py +0 -0
  513. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/control_socket.py +0 -0
  514. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/drain_policy.py +0 -0
  515. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/drain_wait.py +0 -0
  516. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/event_observers.py +0 -0
  517. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/heartbeat.py +0 -0
  518. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/signal_canceller.py +0 -0
  519. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/spawn_dispatch.py +0 -0
  520. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/streaming/types.py +0 -0
  521. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/__init__.py +0 -0
  522. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/bootstrap.py +0 -0
  523. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/correlation.py +0 -0
  524. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/events.py +0 -0
  525. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/init.py +0 -0
  526. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/local_jsonl.py +0 -0
  527. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/maintenance.py +0 -0
  528. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/observer.py +0 -0
  529. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/observers.py +0 -0
  530. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/query.py +0 -0
  531. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/reader.py +0 -0
  532. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/retention.py +0 -0
  533. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/router.py +0 -0
  534. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/sinks.py +0 -0
  535. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/telemetry/status.py +0 -0
  536. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/tools.py +0 -0
  537. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/utils/__init__.py +0 -0
  538. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/lib/utils/time.py +0 -0
  539. {meridian_cli-0.3.30/src/meridian/plugin_api → meridian_cli-0.3.32/src/meridian/pi_runtime}/CLAUDE.md +0 -0
  540. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/README.md +0 -0
  541. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/__init__.py +0 -0
  542. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/dist/extensions/managed-bash/index.js +0 -0
  543. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/dist/extensions/meridian-spawn-watch/index.js +0 -0
  544. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/managed-bash/bundle.smoke.test.ts +0 -0
  545. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/managed-bash/src/bash_log_store.ts +0 -0
  546. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/managed-bash/src/bash_runtime.test.ts +0 -0
  547. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/managed-bash/src/bash_runtime.ts +0 -0
  548. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/managed-bash/src/index.ts +0 -0
  549. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/meridian-spawn-watch/bundle.smoke.test.ts +0 -0
  550. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/meridian-spawn-watch/src/index.test.ts +0 -0
  551. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/meridian-spawn-watch/src/index.ts +0 -0
  552. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/ids.ts +0 -0
  553. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/json_file.ts +0 -0
  554. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/log_overlay.ts +0 -0
  555. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/meridian_cli.ts +0 -0
  556. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/meridian_spawn.test.ts +0 -0
  557. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/meridian_spawn.ts +0 -0
  558. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/pi_harness_profile.ts +0 -0
  559. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/pi_state_paths.ts +0 -0
  560. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/schemas.ts +0 -0
  561. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/selectable_panel.test.ts +0 -0
  562. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/selectable_panel.ts +0 -0
  563. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/spawn_origins.test.ts +0 -0
  564. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/spawn_origins.ts +0 -0
  565. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/extensions/shared/ui.ts +0 -0
  566. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/package.json +0 -0
  567. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/pnpm-lock.yaml +0 -0
  568. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/pnpm-workspace.yaml +0 -0
  569. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/scripts/verify-extensions-loop.mjs +0 -0
  570. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/pi_runtime/vitest.config.ts +0 -0
  571. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/plugin_api/AGENTS.md +0 -0
  572. {meridian_cli-0.3.30/src/meridian/server → meridian_cli-0.3.32/src/meridian/plugin_api}/CLAUDE.md +0 -0
  573. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/plugin_api/__init__.py +0 -0
  574. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/plugin_api/config.py +0 -0
  575. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/plugin_api/fs.py +0 -0
  576. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/plugin_api/git.py +0 -0
  577. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/plugin_api/state.py +0 -0
  578. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/plugin_api/types.py +0 -0
  579. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/py.typed +0 -0
  580. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/server/AGENTS.md +0 -0
  581. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/server/__init__.py +0 -0
  582. {meridian_cli-0.3.30 → meridian_cli-0.3.32}/src/meridian/server/main.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: meridian-cli
3
- Version: 0.3.30
3
+ Version: 0.3.32
4
4
  Summary: Orchestrate CLI + MCP server for multi-model agent workflows
5
5
  Project-URL: Homepage, https://github.com/haowjy/meridian-cli
6
6
  Project-URL: Repository, https://github.com/haowjy/meridian-cli
@@ -61,6 +61,7 @@ config entry. If adding a feature requires editing 10 files, the abstraction is
61
61
  | `lib/context/` | Context resolution (KB, strategy, work directories) |
62
62
  | `lib/hooks/` | Hook dispatch, config layering, built-in hooks |
63
63
  | `lib/extensions/` | Extension command registry |
64
+ | `lib/artifact/` | Detached static-artifact serving over Tailscale (`artifact serve/list/stop/gc`); no daemon — file is authority |
64
65
 
65
66
  | `lib/observability/` | Spawn-scoped JSONL tracing |
66
67
  | `lib/mermaid/` | Mermaid diagram validation |
@@ -2,4 +2,4 @@
2
2
 
3
3
  __all__ = ["__version__"]
4
4
 
5
- __version__ = "0.3.30"
5
+ __version__ = "0.3.32"
@@ -50,6 +50,7 @@ config_app = _group_app("config")
50
50
  workspace_app = _group_app("workspace")
51
51
  kg_app = _group_app("kg")
52
52
  mermaid_app = _group_app("mermaid")
53
+ artifact_app = _group_app("artifact")
53
54
  qi_app = _group_app("qi")
54
55
  telemetry_app = _group_app("telemetry")
55
56
  completion_app = _group_app("completion")
@@ -69,6 +70,7 @@ app.command(config_app, name="config")
69
70
  app.command(workspace_app, name="workspace")
70
71
  app.command(kg_app, name="kg")
71
72
  app.command(mermaid_app, name="mermaid")
73
+ app.command(artifact_app, name="artifact")
72
74
  app.command(qi_app, name="qi")
73
75
  app.command(telemetry_app, name="telemetry")
74
76
  app.command(completion_app, name="completion")
@@ -88,6 +90,7 @@ for _group_name, _group_app_obj in {
88
90
  "workspace": workspace_app,
89
91
  "kg": kg_app,
90
92
  "mermaid": mermaid_app,
93
+ "artifact": artifact_app,
91
94
  "qi": qi_app,
92
95
  "telemetry": telemetry_app,
93
96
  "completion": completion_app,
@@ -97,6 +100,7 @@ for _group_name, _group_app_obj in {
97
100
 
98
101
  __all__ = [
99
102
  "app",
103
+ "artifact_app",
100
104
  "completion_app",
101
105
  "config_app",
102
106
  "context_app",
@@ -0,0 +1,193 @@
1
+ """CLI handlers for ``meridian artifact``."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ import sys
7
+ from dataclasses import asdict
8
+ from datetime import UTC, datetime
9
+ from pathlib import Path
10
+ from typing import Annotated, Never
11
+
12
+ from cyclopts import Parameter
13
+
14
+ from meridian.cli.app_tree import artifact_app
15
+ from meridian.lib.artifact import service
16
+ from meridian.lib.artifact.store import Serve, load_serves
17
+
18
+ _DEFAULT_TTL = f"{service.DEFAULT_TTL_SECONDS // 3600}h"
19
+
20
+
21
+ @artifact_app.default
22
+ def cmd_artifact_root() -> None:
23
+ """Show artifact serving help."""
24
+ print(
25
+ """Serve static artifacts over Tailscale.
26
+
27
+ Commands:
28
+ meridian artifact serve [dir] Serve a directory (default TTL: 2h)
29
+ meridian artifact list List recorded artifact serves
30
+ meridian artifact stop <slug> Stop one artifact serve
31
+ meridian artifact gc Stop expired artifact serves"""
32
+ )
33
+ raise SystemExit(0)
34
+
35
+
36
+ def _fail(message: str, code: int = 1) -> Never:
37
+ print(f"Error: {message}", file=sys.stderr)
38
+ raise SystemExit(code)
39
+
40
+
41
+ def _duration(seconds: float) -> str:
42
+ seconds = max(0, int(seconds))
43
+ if seconds >= 86400:
44
+ return f"{seconds / 86400:.1f}d"
45
+ if seconds >= 3600:
46
+ return f"{seconds / 3600:.1f}h"
47
+ if seconds >= 60:
48
+ return f"{seconds / 60:.1f}m"
49
+ return f"{seconds}s"
50
+
51
+
52
+ def _created_at(serve: Serve) -> datetime:
53
+ try:
54
+ return datetime.fromisoformat(serve.created.removesuffix("Z") + "+00:00")
55
+ except ValueError:
56
+ return datetime.now(UTC)
57
+
58
+
59
+ @artifact_app.command(name="serve")
60
+ def cmd_artifact_serve(
61
+ directory: Annotated[Path, Parameter(help="Directory to serve.")] = Path("."),
62
+ *,
63
+ ttl: Annotated[
64
+ str, Parameter(name="--ttl", help="Lifetime: 30m, 2h, 90s, or 1d.")
65
+ ] = _DEFAULT_TTL,
66
+ persistent: Annotated[
67
+ bool, Parameter(name="--persistent", help="Never expire automatically.")
68
+ ] = False,
69
+ funnel: Annotated[
70
+ bool, Parameter(name="--funnel", help="Expose publicly with Tailscale Funnel.")
71
+ ] = False,
72
+ slug: Annotated[
73
+ str | None, Parameter(name="--slug", help="URL path name (default: directory name).")
74
+ ] = None,
75
+ port: Annotated[
76
+ int | None,
77
+ Parameter(name="--port", help="Serve on this port instead of a random one."),
78
+ ] = None,
79
+ ) -> None:
80
+ """Serve a directory over Tailscale."""
81
+ resolved = directory.expanduser().resolve()
82
+ if not resolved.exists():
83
+ _fail(f"directory not found: {directory}", 2)
84
+ if not resolved.is_dir():
85
+ _fail(f"not a directory: {directory}", 2)
86
+ if port is not None:
87
+ if port < 1 or port > 65535:
88
+ _fail("--port must be between 1 and 65535", 2)
89
+ if port < 1024:
90
+ _fail("--port must be >= 1024 (do not claim well-known ports)", 2)
91
+ try:
92
+ ttl_seconds = None if persistent else service.parse_ttl(ttl)
93
+ serve, url = service.start_serve(
94
+ resolved, ttl_seconds=ttl_seconds, funnel=funnel, slug=slug, port=port
95
+ )
96
+ except service.PortInUseError as exc:
97
+ _fail(str(exc), 2)
98
+ except (service.ArtifactError, OSError) as exc:
99
+ _fail(str(exc))
100
+ ttl_hint = "persistent" if serve.ttl_seconds is None else _duration(serve.ttl_seconds)
101
+ print(url)
102
+ print(
103
+ f"pid {serve.pid} · TTL {ttl_hint} · stop with: meridian artifact stop {serve.slug}"
104
+ )
105
+
106
+
107
+ @artifact_app.command(name="list")
108
+ def cmd_artifact_list(
109
+ *,
110
+ fmt: Annotated[
111
+ str, Parameter(name="--format", help="Output format: text or json.")
112
+ ] = "text",
113
+ ) -> None:
114
+ """List recorded artifact serves without changing state."""
115
+ from meridian.cli.main import get_global_options
116
+
117
+ serves = load_serves()
118
+ effective_fmt = "json" if get_global_options().output.format == "json" else fmt
119
+ if effective_fmt == "json":
120
+ print(json.dumps([asdict(serve) for serve in serves], indent=2))
121
+ return
122
+ if effective_fmt != "text":
123
+ _fail("--format must be text or json", 2)
124
+ if not serves:
125
+ print("No active artifact serves.")
126
+ return
127
+ now = datetime.now(UTC)
128
+ try:
129
+ dns_name = service.tailscale_dns_name()
130
+ except (service.ArtifactError, OSError) as exc:
131
+ dns_name = None
132
+ print(f"Warning: artifact URLs unavailable: {exc}", file=sys.stderr)
133
+ print(f"{'SLUG':<22} {'LOCAL':<7} {'ALIVE':<6} {'AGE':<8} {'TTL':<11} {'DIRECTORY':<30} URL")
134
+ for serve in serves:
135
+ created = _created_at(serve)
136
+ age = _duration((now - created).total_seconds())
137
+ ttl = (
138
+ "persistent"
139
+ if serve.ttl_seconds is None
140
+ else _duration(serve.ttl_seconds - (now - created).total_seconds())
141
+ )
142
+ public_port = service.tailnet_port(serve.local_port, funnel=serve.funnel)
143
+ url = (
144
+ f"https://{dns_name}:{public_port}/{serve.slug}/"
145
+ if dns_name
146
+ else "unavailable"
147
+ )
148
+ alive = (
149
+ "yes"
150
+ if service.pid_alive(serve.pid, serve.process_created_at)
151
+ else "no"
152
+ )
153
+ print(
154
+ f"{serve.slug:<22} {serve.local_port:<7} {alive:<6} {age:<8} "
155
+ f"{ttl:<11} {serve.dir:<30} {url}"
156
+ )
157
+
158
+
159
+ @artifact_app.command(name="stop")
160
+ def cmd_artifact_stop(
161
+ slug: Annotated[str, Parameter(help="Slug (or local port) of the serve to stop.")],
162
+ ) -> None:
163
+ """Stop one artifact serve."""
164
+ try:
165
+ stopped = service.stop_serve(slug)
166
+ except (service.ArtifactError, OSError) as exc:
167
+ _fail(str(exc))
168
+ if stopped:
169
+ print(f"Stopped artifact serve {slug}.")
170
+ else:
171
+ print(f"No artifact serve recorded as {slug}.")
172
+
173
+
174
+ @artifact_app.command(name="gc")
175
+ def cmd_artifact_gc() -> None:
176
+ """Stop and remove expired artifact serves."""
177
+ try:
178
+ expired, failed = service.sweep_expired()
179
+ except (service.ArtifactError, OSError) as exc:
180
+ _fail(str(exc))
181
+ print(f"Garbage-collected {len(expired)} expired artifact serve(s).")
182
+ if failed:
183
+ print(f"Failed to remove: {', '.join(failed)}", file=sys.stderr)
184
+ raise SystemExit(1)
185
+
186
+
187
+ __all__ = [
188
+ "cmd_artifact_gc",
189
+ "cmd_artifact_list",
190
+ "cmd_artifact_root",
191
+ "cmd_artifact_serve",
192
+ "cmd_artifact_stop",
193
+ ]
@@ -132,6 +132,13 @@ _GROUP_HELP: dict[str, GroupHelp] = {
132
132
  long_help='Mermaid diagram validation: extract and check diagram syntax in\nmarkdown files and standalone .mmd/.mermaid files.',
133
133
  examples=(('meridian mermaid check', ''), ('meridian mermaid check docs/', ''), ('meridian mermaid check diagram.mmd', '')),
134
134
  ),
135
+ "artifact": GroupHelp(
136
+ summary='Share static artifacts over Tailscale.',
137
+ long_help='Serve a local directory over Tailscale as a temporary, tailnet-scoped URL.',
138
+ examples=(('meridian artifact serve .', ''), ('meridian artifact list', '')),
139
+ agent_notes='URLs are tailnet-only — the recipient must be on your tailnet; use --funnel for a public URL (rare). Serves expire after 2h by default; --persistent keeps one, stop/gc remove them. Point it at a built structured-artifact directory to share with a human or another agent.',
140
+ agent_subcommands=('serve', 'list', 'stop', 'gc'),
141
+ ),
135
142
  "telemetry": GroupHelp(
136
143
  summary='Telemetry inspection: tail, query, and status over local segments.',
137
144
  long_help='Telemetry inspection: tail, query, and status over local segments.\n\nNote: Rootless MCP stdio server processes write telemetry to stderr only and are not visible in local segment readers.',
@@ -274,6 +281,14 @@ COMMAND_GROUP_SPECS: dict[str, CommandGroupSpec] = {
274
281
  registration_bucket='mermaid',
275
282
  has_group_app=True,
276
283
  ),
284
+ "artifact": CommandGroupSpec(
285
+ help=_GROUP_HELP["artifact"],
286
+ agent_root_description='Share a directory as a temporary Tailscale URL for humans or other agents.',
287
+ agent_root=True,
288
+ human_root_order=17,
289
+ registration_bucket='artifact',
290
+ has_group_app=True,
291
+ ),
277
292
  "telemetry": CommandGroupSpec(
278
293
  help=_GROUP_HELP["telemetry"],
279
294
  human_root_order=12,
@@ -748,6 +748,11 @@ def _register_commands_for_invocation(argv: Sequence[str]) -> None:
748
748
 
749
749
  _ = _mermaid_cmd
750
750
 
751
+ def _register_artifact() -> None:
752
+ import meridian.cli.artifact_cmd as _artifact_cmd
753
+
754
+ _ = _artifact_cmd
755
+
751
756
  def _register_qi() -> None:
752
757
  import meridian.cli.qi_cmd as _qi_cmd
753
758
 
@@ -780,6 +785,7 @@ def _register_commands_for_invocation(argv: Sequence[str]) -> None:
780
785
  "sync": _register_sync,
781
786
  "kg": _register_kg,
782
787
  "mermaid": _register_mermaid,
788
+ "artifact": _register_artifact,
783
789
  "qi": _register_qi,
784
790
  "report": _register_report,
785
791
  "migrate": _register_migrate,
@@ -496,6 +496,10 @@ _COMMAND_DESCRIPTORS: tuple[CommandDescriptor, ...] = (
496
496
  _read_rootless(("kg", "graph"), "Render knowledge graph."),
497
497
  _read_rootless(("kg", "check"), "Check knowledge graph links."),
498
498
  _read_rootless(("mermaid", "check"), "Check Mermaid diagrams."),
499
+ _write_rootless(("artifact", "serve"), "Serve a directory over tailscale."),
500
+ _read_rootless(("artifact", "list"), "List active artifact serves."),
501
+ _write_rootless(("artifact", "stop"), "Stop an artifact serve."),
502
+ _write_rootless(("artifact", "gc"), "Garbage-collect expired artifact serves."),
499
503
  _read_rootless(("qi",), "Show inline knowledge for current path."),
500
504
  _read_rootless(("qi", "list"), "List all inline knowledge locations."),
501
505
  _read_rootless(("qi", "check"), "Check inline knowledge health."),
@@ -0,0 +1,67 @@
1
+ # lib/artifact/ — Detached Artifact Serving
2
+
3
+ Thin wrapper that serves a static artifact directory over Tailscale. No daemon:
4
+ `meridian artifact serve` launches a detached stdlib HTTP server, registers a
5
+ Tailscale serve path, records state, and exits. `list`/`stop`/`gc` read and prune
6
+ that state. The CLI is the only entry point; nothing else imports this package.
7
+
8
+ ## Mental model
9
+
10
+ ```
11
+ artifact serve <dir>
12
+ → launch_http_server(): _serve_dir on 127.0.0.1:<port> (setsid, detached)
13
+ → _tailscale_register(): tailscale serve --https=<port> --set-path /<slug> → 127.0.0.1:<port>
14
+ → record Serve in ~/.meridian/serves.json, print URL, exit
15
+ ```
16
+
17
+ The server outlives the CLI by design ("share and walk away"). Cleanup is TTL +
18
+ lazy GC on every `serve`/`gc`, and explicit `stop`. State is the file; there is no
19
+ in-memory handle between commands.
20
+
21
+ ## Key invariants
22
+
23
+ - **Never serve on 443 or well-known ports.** The CLI rejects ports < 1024 and
24
+ defaults to random 49152–65535; `_tailscale_register` always passes an explicit
25
+ `--https=<port>`. Portless 443 does not route to local serve handlers on some
26
+ nodes, and claiming well-known ports clobbers unrelated serves. See KB
27
+ `research/tailscale-serve-semantics.md`.
28
+ - **Teardown is per-path only.** `tailscale_off` runs
29
+ `tailscale serve --https=<port> --set-path=/<slug> off` — removes ONE slug.
30
+ Never bare `--https=<port> off` (drops all slugs on the port) or `serve reset`
31
+ (wipes the whole node). Only remove slugs recorded in serves.json.
32
+ - **`tailscale serve --set-path` forwards the full path.** `_serve_dir.py` strips
33
+ the `/<slug>` prefix in `translate_path` so root-serving backends resolve. Strip
34
+ in path translation, not URL rewriting, so directory redirects keep the prefix.
35
+ - **No parent-death linkage.** `launch_http_server` uses `start_new_session=True`
36
+ (POSIX) / `DETACHED_PROCESS` (Windows) with no `pdeathsig`. Adding linkage breaks
37
+ the feature: TTL + lazy GC *is* the cleanup mechanism.
38
+ - **Validate the slug at every trust boundary** before any Tailscale subprocess.
39
+ A malformed/empty slug would produce `--set-path=/ off` and clobber a root
40
+ handler. `is_valid_slug` runs at registration, teardown, URL build, and load.
41
+ - **State is atomic and locked.** `serves.json` writes go through
42
+ `atomic_write_text`; reads tolerate truncation/missing; `start_serve`,
43
+ `stop_serve`, and `sweep_expired` hold `serves.json.lock` across
44
+ read-modify-save. `Serve.process_created_at` (birth epoch) guards PID-reuse
45
+ from terminating an unrelated process tree.
46
+
47
+ ## Anti-patterns
48
+
49
+ - Don't add a daemon or keep an in-memory handle between commands — the file is
50
+ the authority and `list`/`stop`/`gc` run in fresh processes.
51
+ - Don't pick the local bind port independently of the Tailscale `--https` port;
52
+ they are the same number, and it must avoid serves.json, live
53
+ `tailscale serve status --json`, and an EADDRINUSE probe.
54
+ - `--funnel` exposes publicly on the fixed Funnel port **10000** (Funnel allows
55
+ only 443/8443/10000; 443 is portless-broken and 8443 is commonly taken). The
56
+ local backend keeps its own random/`--port` high port; `tailnet_port()` derives
57
+ the public port from the funnel flag. If Funnel isn't enabled on the tailnet the
58
+ register call fails loudly (ArtifactError) and rolls back — no orphan state.
59
+ - Don't reset/abort a GC sweep on a single terminate failure — each serve is
60
+ independent; a failed teardown must preserve its entry, not stop the loop.
61
+
62
+ ## Related
63
+
64
+ - [../../AGENTS.md](../../AGENTS.md) — package layers; this package is a leaf,
65
+ not part of the ops/launch/state spine
66
+ - KB `research/tailscale-serve-semantics.md` — Tailscale routing/teardown facts
67
+ behind the invariants above
@@ -0,0 +1 @@
1
+ @AGENTS.md
@@ -0,0 +1,19 @@
1
+ """Static artifact serving over Tailscale."""
2
+
3
+ from meridian.lib.artifact.store import (
4
+ Serve,
5
+ is_valid_slug,
6
+ load_serves,
7
+ save_serves,
8
+ serves_lock_path,
9
+ serves_path,
10
+ )
11
+
12
+ __all__ = [
13
+ "Serve",
14
+ "is_valid_slug",
15
+ "load_serves",
16
+ "save_serves",
17
+ "serves_lock_path",
18
+ "serves_path",
19
+ ]
@@ -0,0 +1,45 @@
1
+ """Prefix-aware static server used by detached artifact serves."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import sys
6
+ from functools import partial
7
+ from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer
8
+ from pathlib import Path
9
+
10
+ from meridian.lib.artifact.store import is_valid_slug
11
+
12
+
13
+ def main() -> None:
14
+ """Serve a directory under one URL path prefix."""
15
+ if len(sys.argv) != 4:
16
+ raise SystemExit("usage: _serve_dir DIRECTORY PORT SLUG")
17
+ directory = Path(sys.argv[1])
18
+ try:
19
+ port = int(sys.argv[2])
20
+ except ValueError as exc:
21
+ raise SystemExit("port must be an integer") from exc
22
+ slug = sys.argv[3]
23
+ if not directory.is_dir():
24
+ raise SystemExit(f"not a directory: {directory}")
25
+ if not 1 <= port <= 65535:
26
+ raise SystemExit("port must be between 1 and 65535")
27
+ if not is_valid_slug(slug):
28
+ raise SystemExit("invalid slug")
29
+
30
+ prefix = f"/{slug}"
31
+
32
+ class PrefixHandler(SimpleHTTPRequestHandler):
33
+ def translate_path(self, path: str) -> str:
34
+ if path == prefix:
35
+ path = "/"
36
+ elif path.startswith(f"{prefix}/"):
37
+ path = path[len(prefix) :]
38
+ return super().translate_path(path)
39
+
40
+ handler = partial(PrefixHandler, directory=str(directory))
41
+ ThreadingHTTPServer(("127.0.0.1", port), handler).serve_forever()
42
+
43
+
44
+ if __name__ == "__main__":
45
+ main()