crewplane 0.3.2__tar.gz → 0.3.3__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 (564) hide show
  1. {crewplane-0.3.2 → crewplane-0.3.3}/PKG-INFO +14 -2
  2. {crewplane-0.3.2 → crewplane-0.3.3}/README.md +13 -1
  3. {crewplane-0.3.2 → crewplane-0.3.3}/pyproject.toml +1 -1
  4. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/capabilities.py +12 -1
  5. crewplane-0.3.3/src/crewplane/adapters/invokers/cli_invoker/providers/opencode.py +169 -0
  6. crewplane-0.3.3/src/crewplane/adapters/invokers/cli_invoker/providers/opencode_events.py +218 -0
  7. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/architecture/contracts/invocation.py +1 -0
  8. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/example_templates/config.yml +5 -0
  9. {crewplane-0.3.2 → crewplane-0.3.3}/.gitignore +0 -0
  10. {crewplane-0.3.2 → crewplane-0.3.3}/LICENSE +0 -0
  11. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/__init__.py +0 -0
  12. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/__init__.py +0 -0
  13. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/artifacts/__init__.py +0 -0
  14. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/artifacts/filesystem.py +0 -0
  15. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/artifacts/terminal_history.py +0 -0
  16. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/__init__.py +0 -0
  17. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli.py +0 -0
  18. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/__init__.py +0 -0
  19. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/capability.py +0 -0
  20. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/claude_json.py +0 -0
  21. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/claude_json_parser.py +0 -0
  22. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/commands.py +0 -0
  23. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/env_command.py +0 -0
  24. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/failures/__init__.py +0 -0
  25. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/failures/classifier.py +0 -0
  26. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/failures/evidence.py +0 -0
  27. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/failures/formatting.py +0 -0
  28. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/failures/patterns.py +0 -0
  29. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/failures/types.py +0 -0
  30. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/json_number.py +0 -0
  31. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/providers/__init__.py +0 -0
  32. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/providers/claude.py +0 -0
  33. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/providers/codex.py +0 -0
  34. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/providers/copilot.py +0 -0
  35. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/providers/deepseek.py +0 -0
  36. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/providers/gemini.py +0 -0
  37. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/providers/generic.py +0 -0
  38. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/providers/kilo.py +0 -0
  39. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/providers/pi.py +0 -0
  40. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/quota/__init__.py +0 -0
  41. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/quota/classifier.py +0 -0
  42. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/quota/evidence.py +0 -0
  43. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/quota/lexicons.py +0 -0
  44. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/quota/waits.py +0 -0
  45. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/streaming.py +0 -0
  46. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/usage_decoders.py +0 -0
  47. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/cli_invoker/validation.py +0 -0
  48. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/mock.py +0 -0
  49. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/mock_invoker/__init__.py +0 -0
  50. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/mock_invoker/context.py +0 -0
  51. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/mock_invoker/fixtures.py +0 -0
  52. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/mock_invoker/invoker.py +0 -0
  53. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/mock_invoker/logging.py +0 -0
  54. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/mock_invoker/mutations.py +0 -0
  55. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/mock_invoker/options.py +0 -0
  56. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/mock_invoker/outputs.py +0 -0
  57. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/invokers/mock_invoker/selectors.py +0 -0
  58. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/ui/__init__.py +0 -0
  59. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/ui/null.py +0 -0
  60. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/ui/tmux.py +0 -0
  61. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/adapters/ui/validation.py +0 -0
  62. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/architecture/__init__.py +0 -0
  63. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/architecture/contracts/__init__.py +0 -0
  64. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/architecture/contracts/artifacts.py +0 -0
  65. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/architecture/contracts/execution_event.py +0 -0
  66. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/architecture/contracts/execution_status.py +0 -0
  67. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/architecture/contracts/integration.py +0 -0
  68. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/architecture/contracts/integration_options.py +0 -0
  69. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/architecture/contracts/integration_secrets.py +0 -0
  70. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/architecture/contracts/invocation_failures.py +0 -0
  71. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/architecture/contracts/json.py +0 -0
  72. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/architecture/contracts/logging.py +0 -0
  73. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/architecture/contracts/observer.py +0 -0
  74. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/architecture/contracts/provider_log.py +0 -0
  75. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/architecture/contracts/run_summary.py +0 -0
  76. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/architecture/errors.py +0 -0
  77. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/architecture/loader.py +0 -0
  78. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/architecture/ports/__init__.py +0 -0
  79. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/architecture/ports/artifacts.py +0 -0
  80. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/architecture/ports/invoker.py +0 -0
  81. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/architecture/ports/options.py +0 -0
  82. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/architecture/ports/runtime.py +0 -0
  83. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/architecture/ports/ui.py +0 -0
  84. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/architecture/registry.py +0 -0
  85. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/architecture/safe_files.py +0 -0
  86. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/__init__.py +0 -0
  87. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/atomic.py +0 -0
  88. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/directory_manager.py +0 -0
  89. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/failure_artifacts.py +0 -0
  90. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/generated_files/__init__.py +0 -0
  91. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/generated_files/catalog.py +0 -0
  92. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/generated_files/detection.py +0 -0
  93. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/generated_files/paths.py +0 -0
  94. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/generated_files/snapshot_io.py +0 -0
  95. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/generated_files/snapshot_policy.py +0 -0
  96. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/locks/__init__.py +0 -0
  97. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/locks/manifest.py +0 -0
  98. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/locks/process_identity.py +0 -0
  99. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/locks/provider_processes.py +0 -0
  100. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/manager.py +0 -0
  101. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/naming.py +0 -0
  102. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/provider_process_publisher.py +0 -0
  103. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/results/__init__.py +0 -0
  104. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/results/aggregation.py +0 -0
  105. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/results/findings.py +0 -0
  106. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/results/review_loop_status.py +0 -0
  107. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/results/selection.py +0 -0
  108. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/results/stage_document.py +0 -0
  109. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/results/stage_outputs.py +0 -0
  110. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/results/writer.py +0 -0
  111. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/resume/__init__.py +0 -0
  112. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/resume/decision.py +0 -0
  113. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/resume/generated_files.py +0 -0
  114. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/resume/hydration.py +0 -0
  115. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/resume/validation.py +0 -0
  116. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/resume/verified_copy.py +0 -0
  117. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/run_history.py +0 -0
  118. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/verification.py +0 -0
  119. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/workspace/__init__.py +0 -0
  120. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/workspace/bundle_validation.py +0 -0
  121. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/workspace/chain_validation.py +0 -0
  122. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/workspace/git_blob_hash.py +0 -0
  123. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/workspace/node_state.py +0 -0
  124. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/workspace/persisted_chain.py +0 -0
  125. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/workspace/rendered_file_validation.py +0 -0
  126. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/workspace/source_validation.py +0 -0
  127. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/workspace/state/__init__.py +0 -0
  128. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/workspace/state/contracts.py +0 -0
  129. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/workspace/state/expected_set.py +0 -0
  130. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/workspace/state/fields.py +0 -0
  131. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/workspace/state/invocation.py +0 -0
  132. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/workspace/state/invocations.py +0 -0
  133. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/workspace/state/lineage.py +0 -0
  134. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/workspace/state/paths.py +0 -0
  135. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/workspace/state/ref_contracts.py +0 -0
  136. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/workspace/state/source_fields.py +0 -0
  137. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/artifacts/workspace/state/validation.py +0 -0
  138. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/bootstrap/__init__.py +0 -0
  139. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/bootstrap/container.py +0 -0
  140. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/bootstrap/runtime_config.py +0 -0
  141. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/__init__.py +0 -0
  142. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/app.py +0 -0
  143. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/cleanup.py +0 -0
  144. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/dry_run.py +0 -0
  145. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/onboarding/__init__.py +0 -0
  146. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/onboarding/constants.py +0 -0
  147. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/onboarding/detection.py +0 -0
  148. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/onboarding/history.py +0 -0
  149. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/onboarding/messages.py +0 -0
  150. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/onboarding/rendering.py +0 -0
  151. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/onboarding/rendering_config.py +0 -0
  152. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/onboarding/rendering_config_agents.py +0 -0
  153. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/onboarding/rendering_config_invoker.py +0 -0
  154. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/onboarding/rendering_config_validation.py +0 -0
  155. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/onboarding/rendering_defaults.py +0 -0
  156. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/onboarding/rendering_errors.py +0 -0
  157. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/onboarding/rendering_providers.py +0 -0
  158. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/onboarding/rendering_workflow.py +0 -0
  159. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/onboarding/rendering_yaml_blocks.py +0 -0
  160. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/onboarding/rendering_yaml_loading.py +0 -0
  161. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/onboarding/runner.py +0 -0
  162. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/paths.py +0 -0
  163. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/project_init.py +0 -0
  164. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/run/__init__.py +0 -0
  165. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/run/best_effort_thread.py +0 -0
  166. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/run/branch_export_output.py +0 -0
  167. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/run/components.py +0 -0
  168. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/run/context.py +0 -0
  169. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/run/execution.py +0 -0
  170. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/run/execution_helpers.py +0 -0
  171. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/run/historical_summary.py +0 -0
  172. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/run/manifest.py +0 -0
  173. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/run/observability.py +0 -0
  174. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/run/preflight.py +0 -0
  175. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/run/preflight_success.py +0 -0
  176. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/run/resume.py +0 -0
  177. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/run/terminalization.py +0 -0
  178. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/run/topology.py +0 -0
  179. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/run/workspace/__init__.py +0 -0
  180. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/run/workspace/cache_policy.py +0 -0
  181. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/run/workspace/disk_policy.py +0 -0
  182. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/run/workspace/filesystem_policy.py +0 -0
  183. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/run/workspace/git_attributes.py +0 -0
  184. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/run/workspace/git_index.py +0 -0
  185. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/run/workspace/git_source.py +0 -0
  186. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/run/workspace/preflight_diagnostics.py +0 -0
  187. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/run/workspace/repo_policy.py +0 -0
  188. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/run/workspace/source_policy.py +0 -0
  189. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/run/workspace/source_types.py +0 -0
  190. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/templates.py +0 -0
  191. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/update/__init__.py +0 -0
  192. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/update/detection.py +0 -0
  193. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/update/runner.py +0 -0
  194. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/update/types.py +0 -0
  195. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/workflow_runner.py +0 -0
  196. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/workspace_cleanup/__init__.py +0 -0
  197. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/workspace_cleanup/context.py +0 -0
  198. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/workspace_cleanup/eligibility.py +0 -0
  199. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/workspace_cleanup/evidence_claims.py +0 -0
  200. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/workspace_cleanup/evidence_discovery.py +0 -0
  201. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/workspace_cleanup/evidence_validation.py +0 -0
  202. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/workspace_cleanup/execution.py +0 -0
  203. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/workspace_cleanup/run_artifacts.py +0 -0
  204. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/cli/workspace_cleanup_evidence.py +0 -0
  205. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/__init__.py +0 -0
  206. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/config.py +0 -0
  207. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/execution_state.py +0 -0
  208. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/file_hashing.py +0 -0
  209. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/file_text.py +0 -0
  210. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/platform.py +0 -0
  211. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/__init__.py +0 -0
  212. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/compile_state.py +0 -0
  213. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/compiler.py +0 -0
  214. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/dependency_edges.py +0 -0
  215. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/diagnostics.py +0 -0
  216. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/execution_nodes.py +0 -0
  217. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/fragment_handlers.py +0 -0
  218. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/input_sources.py +0 -0
  219. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/models.py +0 -0
  220. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/plan_contract.py +0 -0
  221. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/plan_contract_artifacts.py +0 -0
  222. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/plan_contract_dependencies.py +0 -0
  223. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/plan_contract_nodes.py +0 -0
  224. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/plan_contract_records.py +0 -0
  225. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/plan_contract_shape.py +0 -0
  226. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/plan_contract_workspace_lineage.py +0 -0
  227. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/plan_contract_workspace_locators.py +0 -0
  228. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/plan_signatures.py +0 -0
  229. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/prompt_transport_warnings.py +0 -0
  230. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/references.py +0 -0
  231. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/render_plans.py +0 -0
  232. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/runner.py +0 -0
  233. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/runtime_config/__init__.py +0 -0
  234. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/runtime_config/redaction.py +0 -0
  235. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/runtime_config/workspace.py +0 -0
  236. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/secrets.py +0 -0
  237. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/serialization.py +0 -0
  238. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/signatures.py +0 -0
  239. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/source.py +0 -0
  240. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/static_resources.py +0 -0
  241. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/token_catalog.py +0 -0
  242. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/validation.py +0 -0
  243. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/value_fingerprints.py +0 -0
  244. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/variables.py +0 -0
  245. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/workspace/__init__.py +0 -0
  246. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/workspace/files/__init__.py +0 -0
  247. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/workspace/files/locators.py +0 -0
  248. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/workspace/files/paths.py +0 -0
  249. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/workspace/files/selection.py +0 -0
  250. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/workspace/models.py +0 -0
  251. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/workspace/observability.py +0 -0
  252. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/workspace/records.py +0 -0
  253. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/preflight/workspace/snapshot_guard.py +0 -0
  254. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/prompt_segments.py +0 -0
  255. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/provider_names.py +0 -0
  256. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/provider_process_state.py +0 -0
  257. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/review_contract.py +0 -0
  258. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/state_paths.py +0 -0
  259. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/token_budget.py +0 -0
  260. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/value_checks.py +0 -0
  261. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/__init__.py +0 -0
  262. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/composition/__init__.py +0 -0
  263. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/composition/imports.py +0 -0
  264. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/composition/models.py +0 -0
  265. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/composition/nodes.py +0 -0
  266. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/composition/parsing.py +0 -0
  267. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/composition/rewrites.py +0 -0
  268. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/composition/traversal.py +0 -0
  269. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/diagnostics.py +0 -0
  270. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/graph.py +0 -0
  271. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/keywords.py +0 -0
  272. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/loading.py +0 -0
  273. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/markdown/__init__.py +0 -0
  274. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/markdown/frontmatter.py +0 -0
  275. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/markdown/markers.py +0 -0
  276. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/markdown/models.py +0 -0
  277. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/markdown/payloads.py +0 -0
  278. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/markdown/sections.py +0 -0
  279. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/models.py +0 -0
  280. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/normalization.py +0 -0
  281. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/source_locations.py +0 -0
  282. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/syntax.py +0 -0
  283. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/validation/__init__.py +0 -0
  284. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/validation/api.py +0 -0
  285. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/validation/modes.py +0 -0
  286. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/validation/nodes.py +0 -0
  287. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/validation/policies.py +0 -0
  288. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/validation/templates.py +0 -0
  289. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/validation/workspace.py +0 -0
  290. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workflow/validation/workspace_diagnostics.py +0 -0
  291. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workspace/__init__.py +0 -0
  292. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workspace/cache.py +0 -0
  293. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workspace/checkout_size.py +0 -0
  294. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workspace/git_attributes.py +0 -0
  295. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workspace/git_policy.py +0 -0
  296. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workspace/git_reads.py +0 -0
  297. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workspace/invocation_identity.py +0 -0
  298. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workspace/naming.py +0 -0
  299. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workspace/policy.py +0 -0
  300. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workspace/repository_identity.py +0 -0
  301. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workspace/selection.py +0 -0
  302. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/workspace/settings.py +0 -0
  303. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/core/yaml_loader.py +0 -0
  304. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/example_templates/example-templates/code-review-example.task.md +0 -0
  305. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/example_templates/example-templates/composition/review-findings-producer-example.task.md +0 -0
  306. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/example_templates/example-templates/composition/review-fix-composed-example.task.md +0 -0
  307. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/example_templates/example-templates/composition/review-fix-consumer-example.task.md +0 -0
  308. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/example_templates/example-templates/design-review-example.task.md +0 -0
  309. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/example_templates/example-templates/feature-implement-example.task.md +0 -0
  310. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/example_templates/example-templates/multi-executor-review-chain-example.task.md +0 -0
  311. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/example_templates/example-templates/refactoring-example.task.md +0 -0
  312. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/example_templates/example-templates/sample-inputs/coding-standards.md +0 -0
  313. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/example_templates/example-templates/sample-inputs/feature-brief.md +0 -0
  314. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/example_templates/example-templates/sample-inputs/review-findings.md +0 -0
  315. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/example_templates/example-templates/test-generation-example.task.md +0 -0
  316. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/example_templates/example-templates/worktree/workspace-alternatives-example.task.md +0 -0
  317. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/example_templates/example-templates/worktree/workspace-inherited-worktree-example.task.md +0 -0
  318. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/example_templates/single-agent-review.task.md +0 -0
  319. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/__init__.py +0 -0
  320. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/dag_graph.py +0 -0
  321. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/dag_render.py +0 -0
  322. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/events/__init__.py +0 -0
  323. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/events/builders.py +0 -0
  324. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/events/dashboard_state.py +0 -0
  325. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/events/execution_event.py +0 -0
  326. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/events/log.py +0 -0
  327. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/events/payloads.py +0 -0
  328. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/events/reader.py +0 -0
  329. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/events/reducer.py +0 -0
  330. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/events/types.py +0 -0
  331. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/layout.py +0 -0
  332. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/log_presentation/__init__.py +0 -0
  333. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/log_presentation/follow.py +0 -0
  334. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/log_presentation/formatters.py +0 -0
  335. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/log_presentation/json_extract.py +0 -0
  336. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/log_presentation/limits.py +0 -0
  337. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/log_presentation/models.py +0 -0
  338. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/log_presentation/sanitize.py +0 -0
  339. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/log_presentation/tail.py +0 -0
  340. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/log_presentation/throttle.py +0 -0
  341. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/node_order.py +0 -0
  342. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/observer.py +0 -0
  343. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/observer_lifecycle.py +0 -0
  344. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/persistent.py +0 -0
  345. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/render/__init__.py +0 -0
  346. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/render/cells.py +0 -0
  347. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/render/header.py +0 -0
  348. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/render/text.py +0 -0
  349. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/render/timeline.py +0 -0
  350. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/render/viewport.py +0 -0
  351. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/run_summary/accumulator.py +0 -0
  352. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/run_summary/builder.py +0 -0
  353. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/run_summary/formatting.py +0 -0
  354. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/run_summary/issues.py +0 -0
  355. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/run_summary/logger.py +0 -0
  356. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/run_summary/markdown.py +0 -0
  357. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/run_summary/models.py +0 -0
  358. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/run_summary/spend.py +0 -0
  359. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/run_summary/terminal.py +0 -0
  360. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/run_summary/workspace.py +0 -0
  361. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/run_summary/workspace_readers.py +0 -0
  362. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/run_summary/workspace_state_paths.py +0 -0
  363. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/run_summary/workspace_values.py +0 -0
  364. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/runtime.py +0 -0
  365. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/status_icons.py +0 -0
  366. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/text_layout.py +0 -0
  367. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/timing.py +0 -0
  368. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/tmux/__init__.py +0 -0
  369. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/tmux/bindings.py +0 -0
  370. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/tmux/client.py +0 -0
  371. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/tmux/commands.py +0 -0
  372. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/tmux/compact.py +0 -0
  373. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/tmux/control_state.py +0 -0
  374. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/tmux/inspect_control.py +0 -0
  375. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/tmux/inspect_launcher.py +0 -0
  376. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/tmux/inspect_snapshot.py +0 -0
  377. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/tmux/labels.py +0 -0
  378. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/tmux/log_tail.py +0 -0
  379. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/tmux/refresh.py +0 -0
  380. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/tmux/rendering.py +0 -0
  381. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/tmux/runtime.py +0 -0
  382. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/tmux/runtime_files.py +0 -0
  383. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/tmux/selected_invocation.py +0 -0
  384. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/tmux/selection.py +0 -0
  385. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/tmux/selection_control.py +0 -0
  386. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/tmux/session.py +0 -0
  387. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/tmux/session_lifecycle.py +0 -0
  388. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/tmux/shell_commands.py +0 -0
  389. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/tmux/snapshot_types.py +0 -0
  390. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/tmux/viewport.py +0 -0
  391. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/tmux/warnings.py +0 -0
  392. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/tmux/window.py +0 -0
  393. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/observability/types.py +0 -0
  394. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/py.typed +0 -0
  395. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/__init__.py +0 -0
  396. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/agent/__init__.py +0 -0
  397. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/agent/failures/__init__.py +0 -0
  398. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/agent/failures/types.py +0 -0
  399. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/agent/invocation/attempt_decisions.py +0 -0
  400. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/agent/invocation/command.py +0 -0
  401. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/agent/invocation/loop.py +0 -0
  402. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/agent/invocation/output.py +0 -0
  403. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/agent/invocation/retry.py +0 -0
  404. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/agent/invocation/retry_reset.py +0 -0
  405. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/agent/invocation/state.py +0 -0
  406. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/agent/invocation/telemetry.py +0 -0
  407. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/agent/invocation/transitions.py +0 -0
  408. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/agent/invoker.py +0 -0
  409. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/agent/process/diagnostics.py +0 -0
  410. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/agent/process/drain.py +0 -0
  411. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/agent/process/log_rendering.py +0 -0
  412. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/agent/process/runner.py +0 -0
  413. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/agent/process/signals.py +0 -0
  414. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/agent/process/stream_capture.py +0 -0
  415. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/agent/process/streams.py +0 -0
  416. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/agent/retry_units.py +0 -0
  417. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/agent/usage.py +0 -0
  418. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/agent/usage_costs.py +0 -0
  419. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/agent/usage_types.py +0 -0
  420. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/agent/workspace_environment.py +0 -0
  421. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/__init__.py +0 -0
  422. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/activity/__init__.py +0 -0
  423. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/activity/console.py +0 -0
  424. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/activity/events.py +0 -0
  425. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/activity/telemetry.py +0 -0
  426. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/common.py +0 -0
  427. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/consensus.py +0 -0
  428. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/deferred_cleanup.py +0 -0
  429. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/errors.py +0 -0
  430. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/fragment_assembler.py +0 -0
  431. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/input.py +0 -0
  432. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/log_presentation.py +0 -0
  433. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/parallel.py +0 -0
  434. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/prompt_budgeting.py +0 -0
  435. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/provider_call/__init__.py +0 -0
  436. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/provider_call/artifact_capture.py +0 -0
  437. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/provider_call/cancellation.py +0 -0
  438. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/provider_call/display.py +0 -0
  439. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/provider_call/events.py +0 -0
  440. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/provider_call/generated_file_changes.py +0 -0
  441. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/provider_call/generated_file_snapshot_source.py +0 -0
  442. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/provider_call/generated_files.py +0 -0
  443. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/provider_call/lifecycle.py +0 -0
  444. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/provider_call/lifecycle_state.py +0 -0
  445. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/provider_call/provider_output.py +0 -0
  446. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/provider_call/types.py +0 -0
  447. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/provider_call/workspace.py +0 -0
  448. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/provider_call/workspace_worker_cancellation.py +0 -0
  449. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/publication_registry.py +0 -0
  450. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/resume.py +0 -0
  451. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/review_loop/__init__.py +0 -0
  452. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/review_loop/audit_round.py +0 -0
  453. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/review_loop/candidate_identity.py +0 -0
  454. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/review_loop/drift/__init__.py +0 -0
  455. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/review_loop/drift/capture.py +0 -0
  456. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/review_loop/drift/comparison.py +0 -0
  457. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/review_loop/drift/detection.py +0 -0
  458. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/review_loop/drift/events.py +0 -0
  459. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/review_loop/drift/guard.py +0 -0
  460. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/review_loop/drift/node.py +0 -0
  461. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/review_loop/drift/recovery.py +0 -0
  462. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/review_loop/drift/reserved.py +0 -0
  463. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/review_loop/drift/snapshots.py +0 -0
  464. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/review_loop/executor_round.py +0 -0
  465. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/review_loop/orchestration.py +0 -0
  466. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/review_loop/policy.py +0 -0
  467. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/review_loop/prompts.py +0 -0
  468. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/review_loop/reviewer_round.py +0 -0
  469. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/review_loop/rounds.py +0 -0
  470. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/review_loop/stall.py +0 -0
  471. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/review_loop/state.py +0 -0
  472. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/review_loop/types.py +0 -0
  473. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/review_loop/validation.py +0 -0
  474. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/review_loop/workspace_state_paths.py +0 -0
  475. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/reviews/__init__.py +0 -0
  476. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/reviews/consensus.py +0 -0
  477. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/reviews/fingerprints.py +0 -0
  478. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/reviews/markdown.py +0 -0
  479. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/reviews/plain_language.py +0 -0
  480. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/reviews/structured.py +0 -0
  481. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/reviews/types.py +0 -0
  482. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/runtime_context.py +0 -0
  483. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/sequential.py +0 -0
  484. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/stage_finalize_events.py +0 -0
  485. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/stage_tasks.py +0 -0
  486. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/workflow/__init__.py +0 -0
  487. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/workflow/cleanup.py +0 -0
  488. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/workflow/execution_session.py +0 -0
  489. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/workflow/node.py +0 -0
  490. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/workflow/orchestration.py +0 -0
  491. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/workflow/postconditions.py +0 -0
  492. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/workflow/scheduling.py +0 -0
  493. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/workflow/state.py +0 -0
  494. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/workspace_files/__init__.py +0 -0
  495. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/workspace_files/descriptors.py +0 -0
  496. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/workspace_files/generated.py +0 -0
  497. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/workspace_files/models.py +0 -0
  498. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/workspace_files/resolution.py +0 -0
  499. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/workspace_files/source_resolution.py +0 -0
  500. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/workspace_files/source_selection.py +0 -0
  501. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/execution/workspace_files/state_loading.py +0 -0
  502. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/__init__.py +0 -0
  503. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/branch_export/__init__.py +0 -0
  504. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/branch_export/attempts.py +0 -0
  505. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/branch_export/checkpoint.py +0 -0
  506. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/branch_export/fulfillment.py +0 -0
  507. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/branch_export/git.py +0 -0
  508. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/branch_export/orchestration.py +0 -0
  509. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/branch_export/reconciliation.py +0 -0
  510. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/branch_export/records.py +0 -0
  511. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/cleanup.py +0 -0
  512. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/cleanup_notes.py +0 -0
  513. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/filesystem.py +0 -0
  514. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/git.py +0 -0
  515. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/invocation.py +0 -0
  516. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/lineage_discard.py +0 -0
  517. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/locks.py +0 -0
  518. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/materialization.py +0 -0
  519. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/mutator_fence.py +0 -0
  520. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/plan_nodes.py +0 -0
  521. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/prepared_workspace.py +0 -0
  522. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/running_state_payload.py +0 -0
  523. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/service/__init__.py +0 -0
  524. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/service/common.py +0 -0
  525. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/service/retry_reset.py +0 -0
  526. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/service/snapshot.py +0 -0
  527. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/service/snapshot_failures.py +0 -0
  528. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/service/types.py +0 -0
  529. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/service/worktree.py +0 -0
  530. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/service/worktree_claims.py +0 -0
  531. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/service/worktree_failures.py +0 -0
  532. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/setup.py +0 -0
  533. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/snapshot.py +0 -0
  534. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/snapshot_reporting.py +0 -0
  535. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/state.py +0 -0
  536. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/state_evidence.py +0 -0
  537. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/state_selection.py +0 -0
  538. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/terminalization.py +0 -0
  539. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/worktree/__init__.py +0 -0
  540. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/worktree/attributes.py +0 -0
  541. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/worktree/cache.py +0 -0
  542. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/worktree/checkout_identity.py +0 -0
  543. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/worktree/checkout_placement.py +0 -0
  544. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/worktree/cleanup.py +0 -0
  545. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/worktree/commit.py +0 -0
  546. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/worktree/descriptors.py +0 -0
  547. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/worktree/head.py +0 -0
  548. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/worktree/inspection.py +0 -0
  549. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/worktree/lineage.py +0 -0
  550. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/worktree/materialization.py +0 -0
  551. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/worktree/orchestration.py +0 -0
  552. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/worktree/policy.py +0 -0
  553. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/worktree/protected_refs.py +0 -0
  554. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/worktree/ref_cleanup.py +0 -0
  555. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/worktree/ref_publication.py +0 -0
  556. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/worktree/refs.py +0 -0
  557. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/worktree/removal.py +0 -0
  558. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/worktree/reset.py +0 -0
  559. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/worktree/result_validation.py +0 -0
  560. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/worktree/reuse.py +0 -0
  561. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/worktree/source_refs.py +0 -0
  562. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/worktree/temporary_refs.py +0 -0
  563. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/runtime/workspace/worktree/types.py +0 -0
  564. {crewplane-0.3.2 → crewplane-0.3.3}/src/crewplane/version.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: crewplane
3
- Version: 0.3.2
3
+ Version: 0.3.3
4
4
  Summary: A provider-neutral CLI-first control plane for human-designed coding-agent workflows
5
5
  Project-URL: Homepage, https://github.com/crewplaneai/crewplane
6
6
  Project-URL: Repository, https://github.com/crewplaneai/crewplane
@@ -37,10 +37,22 @@ Description-Content-Type: text/markdown
37
37
  Crewplane is an open-source workflow runner for reviewable, resumable
38
38
  coding-agent workflows. Define the whole process in Markdown — the prompts,
39
39
  stages, agents, handoffs, and rules for what happens next.
40
- Crewplane runs Claude Code, Codex, Copilot CLI, Gemini, Kilo, or another CLI.
40
+ Crewplane runs your coding-agent CLIs.
41
41
  Review becomes a gate, completed work survives failure, and every handoff
42
42
  stays on disk.
43
43
  </p>
44
+ <p>
45
+ Works with:
46
+ <a href="https://code.claude.com/docs/en/overview" title="Claude Code documentation"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-svg/icons/claudecode-color.svg" width="20" height="20" align="top" alt="Claude Code"></a>&nbsp;
47
+ <a href="https://learn.chatgpt.com/docs/codex/cli" title="Codex CLI documentation"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-svg/icons/codex-color.svg" width="20" height="20" align="top" alt="Codex"></a>&nbsp;
48
+ <a href="https://docs.github.com/en/copilot/concepts/agents/copilot-cli/about-copilot-cli" title="GitHub Copilot CLI documentation"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/dark/githubcopilot.png"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/githubcopilot.png"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/githubcopilot.png" width="20" height="20" align="top" alt="GitHub Copilot CLI"></picture></a>&nbsp;
49
+ <a href="https://geminicli.com/docs/" title="Gemini CLI documentation"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-svg/icons/geminicli-color.svg" width="20" height="20" align="top" alt="Gemini CLI"></a>&nbsp;
50
+ <a href="https://kilo.ai/docs/code-with-ai/platforms/cli" title="Kilo Code CLI documentation"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/dark/kilocode.png"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/kilocode.png"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/kilocode.png" width="20" height="20" align="top" alt="Kilo Code"></picture></a>&nbsp;
51
+ <a href="https://pi.dev/docs/latest" title="Pi documentation"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/dark/pi.png"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/pi.png"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/pi.png" width="20" height="20" align="top" alt="Pi"></picture></a>&nbsp;
52
+ <a href="https://deepseek-harness.github.io/deepseek-harness/" title="DeepSeek Harness documentation"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-svg/icons/deepseek-color.svg" width="20" height="20" align="top" alt="DeepSeek"></a>&nbsp;
53
+ <a href="https://opencode.ai/docs/cli/" title="OpenCode CLI documentation"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/dark/opencode.png"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/opencode.png"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/opencode.png" width="20" height="20" align="top" alt="OpenCode"></picture></a>&nbsp;·&nbsp;
54
+ <a href="docs/getting-started/provider-setup.md">Provider&nbsp;setup&nbsp;→</a>
55
+ </p>
44
56
  <p>
45
57
  <a href="https://github.com/crewplaneai/crewplane/actions/workflows/ci.yml"><img alt="CI" src="https://github.com/crewplaneai/crewplane/actions/workflows/ci.yml/badge.svg?branch=master"></a>
46
58
  <a href="https://www.bestpractices.dev/projects/13966"><img src="https://www.bestpractices.dev/projects/13966/badge"></a>
@@ -5,10 +5,22 @@
5
5
  Crewplane is an open-source workflow runner for reviewable, resumable
6
6
  coding-agent workflows. Define the whole process in Markdown — the prompts,
7
7
  stages, agents, handoffs, and rules for what happens next.
8
- Crewplane runs Claude Code, Codex, Copilot CLI, Gemini, Kilo, or another CLI.
8
+ Crewplane runs your coding-agent CLIs.
9
9
  Review becomes a gate, completed work survives failure, and every handoff
10
10
  stays on disk.
11
11
  </p>
12
+ <p>
13
+ Works with:
14
+ <a href="https://code.claude.com/docs/en/overview" title="Claude Code documentation"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-svg/icons/claudecode-color.svg" width="20" height="20" align="top" alt="Claude Code"></a>&nbsp;
15
+ <a href="https://learn.chatgpt.com/docs/codex/cli" title="Codex CLI documentation"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-svg/icons/codex-color.svg" width="20" height="20" align="top" alt="Codex"></a>&nbsp;
16
+ <a href="https://docs.github.com/en/copilot/concepts/agents/copilot-cli/about-copilot-cli" title="GitHub Copilot CLI documentation"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/dark/githubcopilot.png"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/githubcopilot.png"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/githubcopilot.png" width="20" height="20" align="top" alt="GitHub Copilot CLI"></picture></a>&nbsp;
17
+ <a href="https://geminicli.com/docs/" title="Gemini CLI documentation"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-svg/icons/geminicli-color.svg" width="20" height="20" align="top" alt="Gemini CLI"></a>&nbsp;
18
+ <a href="https://kilo.ai/docs/code-with-ai/platforms/cli" title="Kilo Code CLI documentation"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/dark/kilocode.png"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/kilocode.png"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/kilocode.png" width="20" height="20" align="top" alt="Kilo Code"></picture></a>&nbsp;
19
+ <a href="https://pi.dev/docs/latest" title="Pi documentation"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/dark/pi.png"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/pi.png"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/pi.png" width="20" height="20" align="top" alt="Pi"></picture></a>&nbsp;
20
+ <a href="https://deepseek-harness.github.io/deepseek-harness/" title="DeepSeek Harness documentation"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-svg/icons/deepseek-color.svg" width="20" height="20" align="top" alt="DeepSeek"></a>&nbsp;
21
+ <a href="https://opencode.ai/docs/cli/" title="OpenCode CLI documentation"><picture><source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/dark/opencode.png"><source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/opencode.png"><img src="https://raw.githubusercontent.com/lobehub/lobe-icons/a94750e3f5f8fc33757b839d85030e742284e43a/packages/static-png/light/opencode.png" width="20" height="20" align="top" alt="OpenCode"></picture></a>&nbsp;·&nbsp;
22
+ <a href="docs/getting-started/provider-setup.md">Provider&nbsp;setup&nbsp;→</a>
23
+ </p>
12
24
  <p>
13
25
  <a href="https://github.com/crewplaneai/crewplane/actions/workflows/ci.yml"><img alt="CI" src="https://github.com/crewplaneai/crewplane/actions/workflows/ci.yml/badge.svg?branch=master"></a>
14
26
  <a href="https://www.bestpractices.dev/projects/13966"><img src="https://www.bestpractices.dev/projects/13966/badge"></a>
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "crewplane"
3
- version = "0.3.2"
3
+ version = "0.3.3"
4
4
  description = "A provider-neutral CLI-first control plane for human-designed coding-agent workflows"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.13"
@@ -13,7 +13,17 @@ from crewplane.architecture.contracts.provider_log import build_provider_log_hea
13
13
  from crewplane.core.config import AgentConfig
14
14
 
15
15
  from .capability import CliInvocationRequest, CliProviderCapability
16
- from .providers import claude, codex, copilot, deepseek, gemini, generic, kilo, pi
16
+ from .providers import (
17
+ claude,
18
+ codex,
19
+ copilot,
20
+ deepseek,
21
+ gemini,
22
+ generic,
23
+ kilo,
24
+ opencode,
25
+ pi,
26
+ )
17
27
 
18
28
  CAPABILITIES: dict[ProviderKind, CliProviderCapability] = {
19
29
  ProviderKind.CLAUDE: claude.CLAUDE,
@@ -23,6 +33,7 @@ CAPABILITIES: dict[ProviderKind, CliProviderCapability] = {
23
33
  ProviderKind.KILO: kilo.KILO,
24
34
  ProviderKind.PI: pi.PI,
25
35
  ProviderKind.DEEPSEEK: deepseek.DEEPSEEK,
36
+ ProviderKind.OPENCODE: opencode.OPENCODE,
26
37
  ProviderKind.GENERIC: generic.GENERIC,
27
38
  }
28
39
 
@@ -0,0 +1,169 @@
1
+ from __future__ import annotations
2
+
3
+ from pathlib import Path
4
+
5
+ from crewplane.architecture.contracts import ProviderKind
6
+
7
+ from ..capability import CliCommand, CliInvocationRequest, CliProviderCapability
8
+ from ..commands import build_standard_command
9
+ from ..env_command import parse_env_command_context
10
+ from ..validation import reject_unsupported_reasoning
11
+ from .opencode_events import decode_opencode_usage, extract_opencode_output
12
+
13
+ _VALUE_OPTIONS = frozenset(
14
+ {"--model", "-m", "--agent", "--variant", "--title", "--log-level"}
15
+ )
16
+ _BOOLEAN_OPTIONS = frozenset({"--thinking", "--auto", "--print-logs"})
17
+ _CONFLICTING_OPTIONS = frozenset(
18
+ {
19
+ "--format",
20
+ "--continue",
21
+ "-c",
22
+ "--session",
23
+ "-s",
24
+ "--fork",
25
+ "--attach",
26
+ "--password",
27
+ "-p",
28
+ "--username",
29
+ "-u",
30
+ "--port",
31
+ "--hostname",
32
+ "--dir",
33
+ "--file",
34
+ "-f",
35
+ "--command",
36
+ "--interactive",
37
+ "-i",
38
+ "--mini",
39
+ "--share",
40
+ "--help",
41
+ "-h",
42
+ "--version",
43
+ "-v",
44
+ "--replay",
45
+ "--replay-limit",
46
+ "--no-replay",
47
+ "--yolo",
48
+ "--dangerously-skip-permissions",
49
+ "--demo",
50
+ "--",
51
+ }
52
+ )
53
+
54
+
55
+ def validate_opencode_request(request: CliInvocationRequest) -> None:
56
+ """Validate a fresh local run before command construction or allocation."""
57
+ try:
58
+ reject_unsupported_reasoning(request)
59
+ except ValueError as exc:
60
+ raise ValueError(f"OpenCode: {exc}") from exc
61
+ config = request.config
62
+ if config.prompt_transport != "stdin" or config.prompt_transport_arg is not None:
63
+ raise ValueError(
64
+ "OpenCode requires stdin transport without prompt_transport_arg."
65
+ )
66
+ arguments = _run_arguments(request)
67
+ seen_options: set[str] = set()
68
+ command_models = _validate_arguments(arguments, "cli_cmd", seen_options)
69
+ extra_models = _validate_arguments(
70
+ tuple(config.extra_args), "extra_args", seen_options
71
+ )
72
+ _validate_model_selection(command_models + extra_models, request.model)
73
+
74
+
75
+ def _run_arguments(request: CliInvocationRequest) -> tuple[str, ...]:
76
+ try:
77
+ context = parse_env_command_context(request.config.cli_cmd, None, "")
78
+ except ValueError as exc:
79
+ raise ValueError(f"OpenCode env wrapper validation failed: {exc}") from exc
80
+ if context.command_working_directory_option is not None:
81
+ raise ValueError(
82
+ f"OpenCode option {context.command_working_directory_option!r} "
83
+ "conflicts with the runtime-owned working directory."
84
+ )
85
+ if context.command_executable is None:
86
+ raise ValueError("OpenCode requires an executable after the env wrapper.")
87
+ arguments = context.command_arguments
88
+ if not arguments or arguments[0] != "run":
89
+ raise ValueError("OpenCode requires run immediately after the executable.")
90
+ return arguments[1:]
91
+
92
+
93
+ def _validate_arguments(
94
+ arguments: tuple[str, ...], location: str, seen_options: set[str]
95
+ ) -> tuple[str, ...]:
96
+ model_options: list[str] = []
97
+ tokens = iter(enumerate(arguments, start=1))
98
+ for position, token in tokens:
99
+ option, separator, inline_value = token.partition("=")
100
+ if option in _BOOLEAN_OPTIONS:
101
+ _validate_boolean(option, inline_value if separator else None)
102
+ continue
103
+ if option not in _VALUE_OPTIONS:
104
+ _reject_argument(option, location, position)
105
+ value = inline_value if separator else next(tokens, (0, None))[1]
106
+ _validate_value(option, value)
107
+ if option in {"--model", "-m"}:
108
+ model_options.append(option)
109
+ continue
110
+ if option in seen_options:
111
+ raise ValueError(
112
+ f"OpenCode option {option!r} may appear at most once "
113
+ "across cli_cmd and extra_args."
114
+ )
115
+ seen_options.add(option)
116
+ return tuple(model_options)
117
+
118
+
119
+ def _validate_boolean(option: str, value: str | None) -> None:
120
+ if value is not None and value not in {"true", "false"}:
121
+ raise ValueError(
122
+ f"OpenCode option {option!r} requires a bare flag or =true/=false."
123
+ )
124
+
125
+
126
+ def _validate_value(option: str, value: str | None) -> None:
127
+ if value is None or not value.strip() or (value.startswith("-") and value != "-"):
128
+ raise ValueError(f"OpenCode option {option!r} requires a nonblank value.")
129
+
130
+
131
+ def _reject_argument(option: str, location: str, position: int) -> None:
132
+ if option in _CONFLICTING_OPTIONS:
133
+ raise ValueError(
134
+ f"OpenCode option {option!r} conflicts with managed fresh local runs."
135
+ )
136
+ raise ValueError(
137
+ f"OpenCode {location} argument at position {position} is outside the "
138
+ "supported option grammar; positional prompts are not supported."
139
+ )
140
+
141
+
142
+ def _validate_model_selection(options: tuple[str, ...], model: str | None) -> None:
143
+ if model is not None:
144
+ _validate_value("--model", model)
145
+ if len(options) > 1:
146
+ raise ValueError("OpenCode accepts at most one raw --model/-m selector.")
147
+ if options and model is not None:
148
+ raise ValueError(
149
+ f"OpenCode option {options[0]!r} conflicts with the resolved Crewplane model."
150
+ )
151
+
152
+
153
+ def build_opencode_command(request: CliInvocationRequest, prompt: str) -> CliCommand:
154
+ """Bind native directory selection to runtime cwd instead of inherited PWD."""
155
+ directory = (request.working_directory or Path.cwd()).resolve()
156
+ return build_standard_command(
157
+ request, prompt, structured_args=("--format", "json", "--dir", str(directory))
158
+ )
159
+
160
+
161
+ OPENCODE = CliProviderCapability(
162
+ provider_kind=ProviderKind.OPENCODE,
163
+ validate_request=validate_opencode_request,
164
+ build_command=build_opencode_command,
165
+ output_extractor=extract_opencode_output,
166
+ usage_decoder=decode_opencode_usage,
167
+ log_presentation_format="json_lines",
168
+ log_presentation_profile="generic",
169
+ )
@@ -0,0 +1,218 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ import math
5
+ from collections.abc import Mapping
6
+ from dataclasses import dataclass, field
7
+ from pathlib import Path
8
+
9
+ from crewplane.architecture.contracts import (
10
+ CommandResult,
11
+ OutputExtractionResult,
12
+ ProviderTokenUsage,
13
+ UsageDecodeResult,
14
+ )
15
+
16
+ from ..usage_decoders import CounterReader, UsageAccumulator, complete_sum
17
+
18
+ _ANSWER_EVENTS = frozenset({"step_start", "text", "tool_use", "step_finish"})
19
+ type _Identity = tuple[str, str, str]
20
+ type _Counters = tuple[int | None, ...]
21
+
22
+
23
+ def extract_opencode_output(
24
+ result: CommandResult,
25
+ structured_output_file: Path | None, # noqa: ARG001 - OutputExtractor contract.
26
+ ) -> OutputExtractionResult:
27
+ """Select only completed text from the terminal stopped message."""
28
+ state = _AnswerState()
29
+ try:
30
+ for line in result.iter_stdout_lines():
31
+ event = _read_event(line)
32
+ if event is not None:
33
+ state.consume(event)
34
+ except ValueError:
35
+ return OutputExtractionResult("", "malformed")
36
+ return state.result()
37
+
38
+
39
+ @dataclass(frozen=True)
40
+ class _AnswerPart:
41
+ kind: str
42
+ message_id: str
43
+ text: str = ""
44
+ end: int | float | None = None
45
+ reason: str = ""
46
+
47
+
48
+ @dataclass
49
+ class _AnswerState:
50
+ session_id: str | None = None
51
+ last_message: str | None = None
52
+ parts: dict[str, _AnswerPart] = field(default_factory=dict)
53
+ finish_reasons: dict[str, str] = field(default_factory=dict)
54
+
55
+ def consume(self, event: Mapping[str, object]) -> None:
56
+ kind = event.get("type")
57
+ if kind == "error":
58
+ raise ValueError("OpenCode session error.")
59
+ if not isinstance(kind, str) or kind not in _ANSWER_EVENTS:
60
+ return
61
+ identity, part = _identified_part(event)
62
+ session_id, message_id, part_id = identity
63
+ if self.session_id is not None and self.session_id != session_id:
64
+ raise ValueError("Inconsistent OpenCode session identity.")
65
+ self.session_id = session_id
66
+ snapshot = _answer_part(kind, message_id, part)
67
+ if part_id in self.parts:
68
+ if self.parts[part_id] != snapshot:
69
+ raise ValueError("Contradictory OpenCode part snapshot.")
70
+ return
71
+ self.parts[part_id] = snapshot
72
+ self.last_message = message_id
73
+ if kind == "step_finish":
74
+ self.finish_reasons[message_id] = snapshot.reason
75
+ else:
76
+ self.finish_reasons.pop(message_id, None)
77
+
78
+ def result(self) -> OutputExtractionResult:
79
+ if (
80
+ self.last_message is None
81
+ or self.finish_reasons.get(self.last_message) != "stop"
82
+ ):
83
+ return OutputExtractionResult("", "missing")
84
+ texts = [
85
+ part.text
86
+ for part in self.parts.values()
87
+ if part.message_id == self.last_message and part.text.strip()
88
+ ]
89
+ if not texts:
90
+ return OutputExtractionResult("", "missing")
91
+ text = "\n".join(texts)
92
+ if not text.endswith("\n"):
93
+ text += "\n"
94
+ return OutputExtractionResult(text, "success", output_char_count=len(text))
95
+
96
+
97
+ def _answer_part(kind: str, message_id: str, part: Mapping[str, object]) -> _AnswerPart:
98
+ if kind == "text":
99
+ text = part.get("text")
100
+ if not isinstance(text, str):
101
+ raise ValueError("Malformed OpenCode text.")
102
+ return _AnswerPart(kind, message_id, text=text, end=_completed_time(part))
103
+ if kind == "step_finish":
104
+ reason = part.get("reason")
105
+ if not isinstance(reason, str):
106
+ raise ValueError("Malformed OpenCode finish reason.")
107
+ return _AnswerPart(kind, message_id, reason=reason)
108
+ return _AnswerPart(kind, message_id)
109
+
110
+
111
+ def _completed_time(part: Mapping[str, object]) -> int | float:
112
+ time = part.get("time")
113
+ end = time.get("end") if isinstance(time, dict) else None
114
+ if (
115
+ isinstance(end, bool)
116
+ or not isinstance(end, (int, float))
117
+ or end <= 0
118
+ or (isinstance(end, float) and not math.isfinite(end))
119
+ ):
120
+ raise ValueError("OpenCode text requires a completed time.end.")
121
+ return end
122
+
123
+
124
+ def _read_event(line: str) -> Mapping[str, object] | None:
125
+ if not line.strip():
126
+ return None
127
+ try:
128
+ event = json.loads(line)
129
+ except json.JSONDecodeError as exc:
130
+ raise ValueError("Malformed OpenCode JSON output.") from exc
131
+ if not isinstance(event, dict):
132
+ raise ValueError("OpenCode events must be JSON objects.")
133
+ return event
134
+
135
+
136
+ def _identified_part(
137
+ event: Mapping[str, object],
138
+ ) -> tuple[_Identity, Mapping[str, object]]:
139
+ part = event.get("part")
140
+ if not isinstance(part, dict):
141
+ raise ValueError("Malformed OpenCode event part.")
142
+ session_id = _identity_field(event, "sessionID")
143
+ if session_id != _identity_field(part, "sessionID"):
144
+ raise ValueError("Inconsistent OpenCode envelope/part session identity.")
145
+ return (
146
+ (session_id, _identity_field(part, "messageID"), _identity_field(part, "id")),
147
+ part,
148
+ )
149
+
150
+
151
+ def _identity_field(payload: Mapping[str, object], key: str) -> str:
152
+ value = payload.get(key)
153
+ if not isinstance(value, str) or not value.strip():
154
+ raise ValueError(f"OpenCode {key} must be a nonblank string.")
155
+ return value
156
+
157
+
158
+ def decode_opencode_usage(result: CommandResult) -> UsageDecodeResult:
159
+ """Aggregate distinct native steps independently of answer extraction."""
160
+ accumulator = UsageAccumulator()
161
+ reports: dict[_Identity, _Counters] = {}
162
+ for line in result.iter_stdout_lines():
163
+ try:
164
+ event = _read_event(line)
165
+ if event is None or event.get("type") != "step_finish":
166
+ continue
167
+ report = _usage_report(event)
168
+ if report is None:
169
+ continue
170
+ identity, counters = report
171
+ if identity in reports:
172
+ if reports[identity] != counters:
173
+ raise ValueError("Contradictory OpenCode step usage report.")
174
+ continue
175
+ reports[identity] = counters
176
+ accumulator.record_usage(_normalized_usage(counters))
177
+ except ValueError as exc:
178
+ accumulator.record_error(str(exc))
179
+ return accumulator.result()
180
+
181
+
182
+ def _usage_report(
183
+ event: Mapping[str, object],
184
+ ) -> tuple[_Identity, _Counters] | None:
185
+ part = event.get("part")
186
+ if not isinstance(part, dict) or "tokens" not in part:
187
+ return None
188
+ identity, part = _identified_part(event)
189
+ tokens = part["tokens"]
190
+ if not isinstance(tokens, dict):
191
+ raise ValueError("Malformed OpenCode token payload.")
192
+ cache = tokens.get("cache")
193
+ if cache is None:
194
+ cache = {}
195
+ if not isinstance(cache, dict):
196
+ raise ValueError("Malformed OpenCode cache payload.")
197
+ counters = CounterReader("OpenCode", tokens)
198
+ cached = CounterReader("OpenCode", cache)
199
+ return identity, (
200
+ counters.optional("input"),
201
+ counters.optional("output"),
202
+ counters.optional("reasoning"),
203
+ cached.optional("read"),
204
+ cached.optional("write"),
205
+ counters.optional("total"),
206
+ )
207
+
208
+
209
+ def _normalized_usage(counters: _Counters) -> ProviderTokenUsage:
210
+ input_tokens, output, reasoning, cache_read, cache_write, total = counters
211
+ return ProviderTokenUsage(
212
+ input=complete_sum(input_tokens, cache_read, cache_write),
213
+ cached_input=cache_read,
214
+ cache_write=cache_write,
215
+ output=complete_sum(output, reasoning),
216
+ reasoning=reasoning,
217
+ total=total if total is not None else complete_sum(*counters[:5]),
218
+ )
@@ -32,6 +32,7 @@ class ProviderKind(StrEnum):
32
32
  KILO = "kilo"
33
33
  PI = "pi"
34
34
  DEEPSEEK = "deepseek"
35
+ OPENCODE = "opencode"
35
36
  GENERIC = "generic"
36
37
 
37
38
 
@@ -166,6 +166,11 @@ agents:
166
166
  # invocation_timeout_seconds: null
167
167
  # invocation_idle_timeout_seconds: 1800
168
168
 
169
+ # opencode:
170
+ # cli_cmd: [opencode, run]
171
+ # provider_kind: opencode
172
+ # prompt_transport: stdin
173
+
169
174
  settings:
170
175
  # Core-owned authorization for {{file:...}} references outside this project.
171
176
  file_access:
File without changes
File without changes