crewplane 0.3.2__tar.gz → 0.3.4__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 (567) hide show
  1. {crewplane-0.3.2 → crewplane-0.3.4}/PKG-INFO +14 -2
  2. {crewplane-0.3.2 → crewplane-0.3.4}/README.md +13 -1
  3. {crewplane-0.3.2 → crewplane-0.3.4}/pyproject.toml +2 -2
  4. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/capabilities.py +12 -1
  5. crewplane-0.3.4/src/crewplane/adapters/invokers/cli_invoker/providers/opencode.py +169 -0
  6. crewplane-0.3.4/src/crewplane/adapters/invokers/cli_invoker/providers/opencode_events.py +218 -0
  7. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/mock_invoker/invoker.py +1 -3
  8. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/execution_status.py +11 -1
  9. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/integration_secrets.py +3 -8
  10. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/invocation.py +1 -0
  11. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/invocation_failures.py +17 -0
  12. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/atomic.py +21 -4
  13. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/directory_manager.py +10 -4
  14. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/locks/manifest.py +14 -4
  15. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/locks/provider_processes.py +3 -12
  16. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/manager.py +9 -2
  17. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/naming.py +20 -0
  18. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/node_state.py +2 -4
  19. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/persisted_chain.py +3 -1
  20. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/rendered_file_validation.py +5 -9
  21. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/state/contracts.py +5 -4
  22. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/state/fields.py +4 -2
  23. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/app.py +59 -146
  24. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/historical_summary.py +7 -3
  25. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/manifest.py +8 -3
  26. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/preflight_success.py +8 -2
  27. crewplane-0.3.4/src/crewplane/cli/workflow_context.py +138 -0
  28. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/workspace_cleanup/eligibility.py +4 -1
  29. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/workspace_cleanup/evidence_claims.py +6 -3
  30. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/workspace_cleanup/evidence_validation.py +4 -3
  31. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/workspace_cleanup/execution.py +2 -16
  32. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/fragment_handlers.py +2 -9
  33. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/plan_contract_workspace_lineage.py +7 -20
  34. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/plan_signatures.py +2 -0
  35. crewplane-0.3.4/src/crewplane/core/preflight/runner.py +6 -0
  36. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/runtime_config/redaction.py +2 -5
  37. crewplane-0.3.4/src/crewplane/core/sensitive_names.py +14 -0
  38. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/composition/models.py +1 -0
  39. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/composition/parsing.py +1 -0
  40. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/composition/traversal.py +4 -0
  41. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/markdown/models.py +8 -0
  42. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/markdown/payloads.py +2 -0
  43. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/models.py +11 -0
  44. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/validation/workspace.py +16 -2
  45. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/validation/workspace_diagnostics.py +15 -0
  46. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/config.yml +5 -0
  47. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/run_summary/spend.py +14 -19
  48. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/run_summary/workspace_readers.py +5 -2
  49. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/failures/__init__.py +1 -2
  50. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/activity/events.py +1 -1
  51. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/errors.py +1 -1
  52. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/parallel.py +1 -1
  53. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/display.py +1 -1
  54. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/generated_files.py +20 -35
  55. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/workspace_worker_cancellation.py +15 -1
  56. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/audit_round.py +1 -1
  57. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/reviewer_round.py +1 -1
  58. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/branch_export/fulfillment.py +2 -6
  59. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/branch_export/records.py +20 -24
  60. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/cleanup.py +11 -6
  61. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/prepared_workspace.py +5 -5
  62. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/service/common.py +2 -2
  63. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/service/worktree_failures.py +12 -5
  64. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/state.py +18 -11
  65. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/terminalization.py +2 -1
  66. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/lineage.py +1 -18
  67. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/materialization.py +3 -2
  68. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/orchestration.py +2 -2
  69. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/ref_cleanup.py +3 -2
  70. crewplane-0.3.2/src/crewplane/core/preflight/runner.py +0 -19
  71. crewplane-0.3.2/src/crewplane/runtime/agent/failures/types.py +0 -24
  72. {crewplane-0.3.2 → crewplane-0.3.4}/.gitignore +0 -0
  73. {crewplane-0.3.2 → crewplane-0.3.4}/LICENSE +0 -0
  74. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/__init__.py +0 -0
  75. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/__init__.py +0 -0
  76. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/artifacts/__init__.py +0 -0
  77. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/artifacts/filesystem.py +0 -0
  78. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/artifacts/terminal_history.py +0 -0
  79. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/__init__.py +0 -0
  80. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli.py +0 -0
  81. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/__init__.py +0 -0
  82. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/capability.py +0 -0
  83. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/claude_json.py +0 -0
  84. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/claude_json_parser.py +0 -0
  85. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/commands.py +0 -0
  86. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/env_command.py +0 -0
  87. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/failures/__init__.py +0 -0
  88. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/failures/classifier.py +0 -0
  89. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/failures/evidence.py +0 -0
  90. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/failures/formatting.py +0 -0
  91. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/failures/patterns.py +0 -0
  92. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/failures/types.py +0 -0
  93. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/json_number.py +0 -0
  94. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/providers/__init__.py +0 -0
  95. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/providers/claude.py +0 -0
  96. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/providers/codex.py +0 -0
  97. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/providers/copilot.py +0 -0
  98. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/providers/deepseek.py +0 -0
  99. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/providers/gemini.py +0 -0
  100. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/providers/generic.py +0 -0
  101. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/providers/kilo.py +0 -0
  102. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/providers/pi.py +0 -0
  103. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/quota/__init__.py +0 -0
  104. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/quota/classifier.py +0 -0
  105. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/quota/evidence.py +0 -0
  106. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/quota/lexicons.py +0 -0
  107. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/quota/waits.py +0 -0
  108. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/streaming.py +0 -0
  109. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/usage_decoders.py +0 -0
  110. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/cli_invoker/validation.py +0 -0
  111. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/mock.py +0 -0
  112. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/mock_invoker/__init__.py +0 -0
  113. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/mock_invoker/context.py +0 -0
  114. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/mock_invoker/fixtures.py +0 -0
  115. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/mock_invoker/logging.py +0 -0
  116. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/mock_invoker/mutations.py +0 -0
  117. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/mock_invoker/options.py +0 -0
  118. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/mock_invoker/outputs.py +0 -0
  119. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/invokers/mock_invoker/selectors.py +0 -0
  120. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/ui/__init__.py +0 -0
  121. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/ui/null.py +0 -0
  122. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/ui/tmux.py +0 -0
  123. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/adapters/ui/validation.py +0 -0
  124. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/__init__.py +0 -0
  125. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/__init__.py +0 -0
  126. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/artifacts.py +0 -0
  127. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/execution_event.py +0 -0
  128. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/integration.py +0 -0
  129. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/integration_options.py +0 -0
  130. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/json.py +0 -0
  131. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/logging.py +0 -0
  132. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/observer.py +0 -0
  133. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/provider_log.py +0 -0
  134. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/contracts/run_summary.py +0 -0
  135. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/errors.py +0 -0
  136. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/loader.py +0 -0
  137. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/ports/__init__.py +0 -0
  138. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/ports/artifacts.py +0 -0
  139. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/ports/invoker.py +0 -0
  140. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/ports/options.py +0 -0
  141. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/ports/runtime.py +0 -0
  142. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/ports/ui.py +0 -0
  143. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/registry.py +0 -0
  144. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/architecture/safe_files.py +0 -0
  145. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/__init__.py +0 -0
  146. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/failure_artifacts.py +0 -0
  147. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/generated_files/__init__.py +0 -0
  148. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/generated_files/catalog.py +0 -0
  149. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/generated_files/detection.py +0 -0
  150. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/generated_files/paths.py +0 -0
  151. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/generated_files/snapshot_io.py +0 -0
  152. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/generated_files/snapshot_policy.py +0 -0
  153. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/locks/__init__.py +0 -0
  154. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/locks/process_identity.py +0 -0
  155. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/provider_process_publisher.py +0 -0
  156. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/results/__init__.py +0 -0
  157. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/results/aggregation.py +0 -0
  158. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/results/findings.py +0 -0
  159. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/results/review_loop_status.py +0 -0
  160. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/results/selection.py +0 -0
  161. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/results/stage_document.py +0 -0
  162. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/results/stage_outputs.py +0 -0
  163. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/results/writer.py +0 -0
  164. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/resume/__init__.py +0 -0
  165. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/resume/decision.py +0 -0
  166. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/resume/generated_files.py +0 -0
  167. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/resume/hydration.py +0 -0
  168. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/resume/validation.py +0 -0
  169. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/resume/verified_copy.py +0 -0
  170. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/run_history.py +0 -0
  171. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/verification.py +0 -0
  172. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/__init__.py +0 -0
  173. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/bundle_validation.py +0 -0
  174. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/chain_validation.py +0 -0
  175. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/git_blob_hash.py +0 -0
  176. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/source_validation.py +0 -0
  177. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/state/__init__.py +0 -0
  178. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/state/expected_set.py +0 -0
  179. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/state/invocation.py +0 -0
  180. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/state/invocations.py +0 -0
  181. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/state/lineage.py +0 -0
  182. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/state/paths.py +0 -0
  183. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/state/ref_contracts.py +0 -0
  184. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/state/source_fields.py +0 -0
  185. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/artifacts/workspace/state/validation.py +0 -0
  186. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/bootstrap/__init__.py +0 -0
  187. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/bootstrap/container.py +0 -0
  188. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/bootstrap/runtime_config.py +0 -0
  189. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/__init__.py +0 -0
  190. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/cleanup.py +0 -0
  191. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/dry_run.py +0 -0
  192. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/__init__.py +0 -0
  193. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/constants.py +0 -0
  194. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/detection.py +0 -0
  195. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/history.py +0 -0
  196. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/messages.py +0 -0
  197. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/rendering.py +0 -0
  198. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/rendering_config.py +0 -0
  199. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/rendering_config_agents.py +0 -0
  200. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/rendering_config_invoker.py +0 -0
  201. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/rendering_config_validation.py +0 -0
  202. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/rendering_defaults.py +0 -0
  203. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/rendering_errors.py +0 -0
  204. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/rendering_providers.py +0 -0
  205. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/rendering_workflow.py +0 -0
  206. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/rendering_yaml_blocks.py +0 -0
  207. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/rendering_yaml_loading.py +0 -0
  208. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/onboarding/runner.py +0 -0
  209. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/paths.py +0 -0
  210. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/project_init.py +0 -0
  211. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/__init__.py +0 -0
  212. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/best_effort_thread.py +0 -0
  213. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/branch_export_output.py +0 -0
  214. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/components.py +0 -0
  215. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/context.py +0 -0
  216. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/execution.py +0 -0
  217. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/execution_helpers.py +0 -0
  218. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/observability.py +0 -0
  219. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/preflight.py +0 -0
  220. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/resume.py +0 -0
  221. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/terminalization.py +0 -0
  222. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/topology.py +0 -0
  223. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/workspace/__init__.py +0 -0
  224. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/workspace/cache_policy.py +0 -0
  225. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/workspace/disk_policy.py +0 -0
  226. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/workspace/filesystem_policy.py +0 -0
  227. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/workspace/git_attributes.py +0 -0
  228. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/workspace/git_index.py +0 -0
  229. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/workspace/git_source.py +0 -0
  230. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/workspace/preflight_diagnostics.py +0 -0
  231. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/workspace/repo_policy.py +0 -0
  232. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/workspace/source_policy.py +0 -0
  233. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/run/workspace/source_types.py +0 -0
  234. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/templates.py +0 -0
  235. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/update/__init__.py +0 -0
  236. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/update/detection.py +0 -0
  237. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/update/runner.py +0 -0
  238. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/update/types.py +0 -0
  239. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/workflow_runner.py +0 -0
  240. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/workspace_cleanup/__init__.py +0 -0
  241. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/workspace_cleanup/context.py +0 -0
  242. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/workspace_cleanup/evidence_discovery.py +0 -0
  243. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/workspace_cleanup/run_artifacts.py +0 -0
  244. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/cli/workspace_cleanup_evidence.py +0 -0
  245. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/__init__.py +0 -0
  246. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/config.py +0 -0
  247. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/execution_state.py +0 -0
  248. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/file_hashing.py +0 -0
  249. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/file_text.py +0 -0
  250. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/platform.py +0 -0
  251. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/__init__.py +0 -0
  252. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/compile_state.py +0 -0
  253. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/compiler.py +0 -0
  254. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/dependency_edges.py +0 -0
  255. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/diagnostics.py +0 -0
  256. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/execution_nodes.py +0 -0
  257. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/input_sources.py +0 -0
  258. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/models.py +0 -0
  259. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/plan_contract.py +0 -0
  260. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/plan_contract_artifacts.py +0 -0
  261. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/plan_contract_dependencies.py +0 -0
  262. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/plan_contract_nodes.py +0 -0
  263. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/plan_contract_records.py +0 -0
  264. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/plan_contract_shape.py +0 -0
  265. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/plan_contract_workspace_locators.py +0 -0
  266. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/prompt_transport_warnings.py +0 -0
  267. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/references.py +0 -0
  268. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/render_plans.py +0 -0
  269. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/runtime_config/__init__.py +0 -0
  270. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/runtime_config/workspace.py +0 -0
  271. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/secrets.py +0 -0
  272. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/serialization.py +0 -0
  273. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/signatures.py +0 -0
  274. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/source.py +0 -0
  275. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/static_resources.py +0 -0
  276. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/token_catalog.py +0 -0
  277. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/validation.py +0 -0
  278. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/value_fingerprints.py +0 -0
  279. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/variables.py +0 -0
  280. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/workspace/__init__.py +0 -0
  281. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/workspace/files/__init__.py +0 -0
  282. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/workspace/files/locators.py +0 -0
  283. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/workspace/files/paths.py +0 -0
  284. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/workspace/files/selection.py +0 -0
  285. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/workspace/models.py +0 -0
  286. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/workspace/observability.py +0 -0
  287. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/workspace/records.py +0 -0
  288. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/preflight/workspace/snapshot_guard.py +0 -0
  289. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/prompt_segments.py +0 -0
  290. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/provider_names.py +0 -0
  291. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/provider_process_state.py +0 -0
  292. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/review_contract.py +0 -0
  293. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/state_paths.py +0 -0
  294. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/token_budget.py +0 -0
  295. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/value_checks.py +0 -0
  296. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/__init__.py +0 -0
  297. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/composition/__init__.py +0 -0
  298. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/composition/imports.py +0 -0
  299. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/composition/nodes.py +0 -0
  300. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/composition/rewrites.py +0 -0
  301. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/diagnostics.py +0 -0
  302. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/graph.py +0 -0
  303. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/keywords.py +0 -0
  304. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/loading.py +0 -0
  305. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/markdown/__init__.py +0 -0
  306. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/markdown/frontmatter.py +0 -0
  307. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/markdown/markers.py +0 -0
  308. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/markdown/sections.py +0 -0
  309. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/normalization.py +0 -0
  310. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/source_locations.py +0 -0
  311. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/syntax.py +0 -0
  312. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/validation/__init__.py +0 -0
  313. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/validation/api.py +0 -0
  314. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/validation/modes.py +0 -0
  315. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/validation/nodes.py +0 -0
  316. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/validation/policies.py +0 -0
  317. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workflow/validation/templates.py +0 -0
  318. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workspace/__init__.py +0 -0
  319. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workspace/cache.py +0 -0
  320. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workspace/checkout_size.py +0 -0
  321. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workspace/git_attributes.py +0 -0
  322. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workspace/git_policy.py +0 -0
  323. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workspace/git_reads.py +0 -0
  324. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workspace/invocation_identity.py +0 -0
  325. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workspace/naming.py +0 -0
  326. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workspace/policy.py +0 -0
  327. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workspace/repository_identity.py +0 -0
  328. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workspace/selection.py +0 -0
  329. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/workspace/settings.py +0 -0
  330. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/core/yaml_loader.py +0 -0
  331. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/code-review-example.task.md +0 -0
  332. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/composition/review-findings-producer-example.task.md +0 -0
  333. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/composition/review-fix-composed-example.task.md +0 -0
  334. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/composition/review-fix-consumer-example.task.md +0 -0
  335. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/design-review-example.task.md +0 -0
  336. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/feature-implement-example.task.md +0 -0
  337. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/multi-executor-review-chain-example.task.md +0 -0
  338. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/refactoring-example.task.md +0 -0
  339. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/sample-inputs/coding-standards.md +0 -0
  340. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/sample-inputs/feature-brief.md +0 -0
  341. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/sample-inputs/review-findings.md +0 -0
  342. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/test-generation-example.task.md +0 -0
  343. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/worktree/workspace-alternatives-example.task.md +0 -0
  344. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/example-templates/worktree/workspace-inherited-worktree-example.task.md +0 -0
  345. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/example_templates/single-agent-review.task.md +0 -0
  346. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/__init__.py +0 -0
  347. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/dag_graph.py +0 -0
  348. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/dag_render.py +0 -0
  349. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/events/__init__.py +0 -0
  350. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/events/builders.py +0 -0
  351. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/events/dashboard_state.py +0 -0
  352. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/events/execution_event.py +0 -0
  353. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/events/log.py +0 -0
  354. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/events/payloads.py +0 -0
  355. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/events/reader.py +0 -0
  356. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/events/reducer.py +0 -0
  357. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/events/types.py +0 -0
  358. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/layout.py +0 -0
  359. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/log_presentation/__init__.py +0 -0
  360. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/log_presentation/follow.py +0 -0
  361. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/log_presentation/formatters.py +0 -0
  362. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/log_presentation/json_extract.py +0 -0
  363. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/log_presentation/limits.py +0 -0
  364. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/log_presentation/models.py +0 -0
  365. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/log_presentation/sanitize.py +0 -0
  366. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/log_presentation/tail.py +0 -0
  367. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/log_presentation/throttle.py +0 -0
  368. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/node_order.py +0 -0
  369. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/observer.py +0 -0
  370. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/observer_lifecycle.py +0 -0
  371. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/persistent.py +0 -0
  372. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/render/__init__.py +0 -0
  373. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/render/cells.py +0 -0
  374. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/render/header.py +0 -0
  375. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/render/text.py +0 -0
  376. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/render/timeline.py +0 -0
  377. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/render/viewport.py +0 -0
  378. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/run_summary/accumulator.py +0 -0
  379. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/run_summary/builder.py +0 -0
  380. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/run_summary/formatting.py +0 -0
  381. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/run_summary/issues.py +0 -0
  382. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/run_summary/logger.py +0 -0
  383. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/run_summary/markdown.py +0 -0
  384. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/run_summary/models.py +0 -0
  385. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/run_summary/terminal.py +0 -0
  386. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/run_summary/workspace.py +0 -0
  387. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/run_summary/workspace_state_paths.py +0 -0
  388. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/run_summary/workspace_values.py +0 -0
  389. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/runtime.py +0 -0
  390. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/status_icons.py +0 -0
  391. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/text_layout.py +0 -0
  392. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/timing.py +0 -0
  393. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/__init__.py +0 -0
  394. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/bindings.py +0 -0
  395. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/client.py +0 -0
  396. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/commands.py +0 -0
  397. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/compact.py +0 -0
  398. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/control_state.py +0 -0
  399. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/inspect_control.py +0 -0
  400. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/inspect_launcher.py +0 -0
  401. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/inspect_snapshot.py +0 -0
  402. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/labels.py +0 -0
  403. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/log_tail.py +0 -0
  404. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/refresh.py +0 -0
  405. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/rendering.py +0 -0
  406. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/runtime.py +0 -0
  407. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/runtime_files.py +0 -0
  408. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/selected_invocation.py +0 -0
  409. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/selection.py +0 -0
  410. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/selection_control.py +0 -0
  411. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/session.py +0 -0
  412. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/session_lifecycle.py +0 -0
  413. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/shell_commands.py +0 -0
  414. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/snapshot_types.py +0 -0
  415. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/viewport.py +0 -0
  416. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/warnings.py +0 -0
  417. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/tmux/window.py +0 -0
  418. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/observability/types.py +0 -0
  419. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/py.typed +0 -0
  420. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/__init__.py +0 -0
  421. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/__init__.py +0 -0
  422. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/invocation/attempt_decisions.py +0 -0
  423. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/invocation/command.py +0 -0
  424. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/invocation/loop.py +0 -0
  425. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/invocation/output.py +0 -0
  426. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/invocation/retry.py +0 -0
  427. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/invocation/retry_reset.py +0 -0
  428. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/invocation/state.py +0 -0
  429. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/invocation/telemetry.py +0 -0
  430. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/invocation/transitions.py +0 -0
  431. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/invoker.py +0 -0
  432. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/process/diagnostics.py +0 -0
  433. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/process/drain.py +0 -0
  434. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/process/log_rendering.py +0 -0
  435. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/process/runner.py +0 -0
  436. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/process/signals.py +0 -0
  437. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/process/stream_capture.py +0 -0
  438. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/process/streams.py +0 -0
  439. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/retry_units.py +0 -0
  440. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/usage.py +0 -0
  441. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/usage_costs.py +0 -0
  442. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/usage_types.py +0 -0
  443. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/agent/workspace_environment.py +0 -0
  444. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/__init__.py +0 -0
  445. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/activity/__init__.py +0 -0
  446. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/activity/console.py +0 -0
  447. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/activity/telemetry.py +0 -0
  448. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/common.py +0 -0
  449. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/consensus.py +0 -0
  450. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/deferred_cleanup.py +0 -0
  451. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/fragment_assembler.py +0 -0
  452. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/input.py +0 -0
  453. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/log_presentation.py +0 -0
  454. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/prompt_budgeting.py +0 -0
  455. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/__init__.py +0 -0
  456. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/artifact_capture.py +0 -0
  457. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/cancellation.py +0 -0
  458. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/events.py +0 -0
  459. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/generated_file_changes.py +0 -0
  460. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/generated_file_snapshot_source.py +0 -0
  461. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/lifecycle.py +0 -0
  462. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/lifecycle_state.py +0 -0
  463. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/provider_output.py +0 -0
  464. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/types.py +0 -0
  465. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/provider_call/workspace.py +0 -0
  466. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/publication_registry.py +0 -0
  467. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/resume.py +0 -0
  468. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/__init__.py +0 -0
  469. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/candidate_identity.py +0 -0
  470. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/drift/__init__.py +0 -0
  471. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/drift/capture.py +0 -0
  472. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/drift/comparison.py +0 -0
  473. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/drift/detection.py +0 -0
  474. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/drift/events.py +0 -0
  475. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/drift/guard.py +0 -0
  476. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/drift/node.py +0 -0
  477. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/drift/recovery.py +0 -0
  478. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/drift/reserved.py +0 -0
  479. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/drift/snapshots.py +0 -0
  480. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/executor_round.py +0 -0
  481. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/orchestration.py +0 -0
  482. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/policy.py +0 -0
  483. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/prompts.py +0 -0
  484. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/rounds.py +0 -0
  485. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/stall.py +0 -0
  486. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/state.py +0 -0
  487. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/types.py +0 -0
  488. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/validation.py +0 -0
  489. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/review_loop/workspace_state_paths.py +0 -0
  490. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/reviews/__init__.py +0 -0
  491. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/reviews/consensus.py +0 -0
  492. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/reviews/fingerprints.py +0 -0
  493. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/reviews/markdown.py +0 -0
  494. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/reviews/plain_language.py +0 -0
  495. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/reviews/structured.py +0 -0
  496. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/reviews/types.py +0 -0
  497. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/runtime_context.py +0 -0
  498. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/sequential.py +0 -0
  499. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/stage_finalize_events.py +0 -0
  500. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/stage_tasks.py +0 -0
  501. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workflow/__init__.py +0 -0
  502. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workflow/cleanup.py +0 -0
  503. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workflow/execution_session.py +0 -0
  504. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workflow/node.py +0 -0
  505. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workflow/orchestration.py +0 -0
  506. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workflow/postconditions.py +0 -0
  507. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workflow/scheduling.py +0 -0
  508. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workflow/state.py +0 -0
  509. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workspace_files/__init__.py +0 -0
  510. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workspace_files/descriptors.py +0 -0
  511. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workspace_files/generated.py +0 -0
  512. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workspace_files/models.py +0 -0
  513. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workspace_files/resolution.py +0 -0
  514. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workspace_files/source_resolution.py +0 -0
  515. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workspace_files/source_selection.py +0 -0
  516. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/execution/workspace_files/state_loading.py +0 -0
  517. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/__init__.py +0 -0
  518. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/branch_export/__init__.py +0 -0
  519. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/branch_export/attempts.py +0 -0
  520. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/branch_export/checkpoint.py +0 -0
  521. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/branch_export/git.py +0 -0
  522. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/branch_export/orchestration.py +0 -0
  523. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/branch_export/reconciliation.py +0 -0
  524. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/cleanup_notes.py +0 -0
  525. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/filesystem.py +0 -0
  526. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/git.py +0 -0
  527. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/invocation.py +0 -0
  528. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/lineage_discard.py +0 -0
  529. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/locks.py +0 -0
  530. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/materialization.py +0 -0
  531. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/mutator_fence.py +0 -0
  532. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/plan_nodes.py +0 -0
  533. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/running_state_payload.py +0 -0
  534. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/service/__init__.py +0 -0
  535. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/service/retry_reset.py +0 -0
  536. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/service/snapshot.py +0 -0
  537. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/service/snapshot_failures.py +0 -0
  538. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/service/types.py +0 -0
  539. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/service/worktree.py +0 -0
  540. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/service/worktree_claims.py +0 -0
  541. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/setup.py +0 -0
  542. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/snapshot.py +0 -0
  543. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/snapshot_reporting.py +0 -0
  544. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/state_evidence.py +0 -0
  545. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/state_selection.py +0 -0
  546. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/__init__.py +0 -0
  547. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/attributes.py +0 -0
  548. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/cache.py +0 -0
  549. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/checkout_identity.py +0 -0
  550. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/checkout_placement.py +0 -0
  551. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/cleanup.py +0 -0
  552. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/commit.py +0 -0
  553. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/descriptors.py +0 -0
  554. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/head.py +0 -0
  555. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/inspection.py +0 -0
  556. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/policy.py +0 -0
  557. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/protected_refs.py +0 -0
  558. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/ref_publication.py +0 -0
  559. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/refs.py +0 -0
  560. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/removal.py +0 -0
  561. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/reset.py +0 -0
  562. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/result_validation.py +0 -0
  563. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/reuse.py +0 -0
  564. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/source_refs.py +0 -0
  565. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/temporary_refs.py +0 -0
  566. {crewplane-0.3.2 → crewplane-0.3.4}/src/crewplane/runtime/workspace/worktree/types.py +0 -0
  567. {crewplane-0.3.2 → crewplane-0.3.4}/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.4
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.4"
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"
@@ -41,7 +41,7 @@ Issues = "https://github.com/crewplaneai/crewplane/issues"
41
41
  Documentation = "https://github.com/crewplaneai/crewplane/blob/master/docs/index.md"
42
42
 
43
43
  [build-system]
44
- requires = ["hatchling==1.32.0"]
44
+ requires = ["hatchling==1.32.3"]
45
45
  build-backend = "hatchling.build"
46
46
 
47
47
  [tool.hatch.build.targets.wheel]
@@ -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
+ )
@@ -9,12 +9,10 @@ from crewplane.architecture.contracts import (
9
9
  MockInvokerOptions,
10
10
  )
11
11
  from crewplane.architecture.contracts.invocation_failures import (
12
+ InvocationFailureError,
12
13
  InvocationFailureSummary,
13
14
  )
14
15
  from crewplane.core.config import AgentConfig
15
- from crewplane.runtime.agent.failures import (
16
- InvocationFailureError,
17
- )
18
16
 
19
17
  from .context import is_reviewer_context
20
18
  from .fixtures import fixture_candidates
@@ -1,7 +1,7 @@
1
1
  """Execution states and the subsets supported by each lifecycle."""
2
2
 
3
3
  from enum import StrEnum, unique
4
- from typing import Literal
4
+ from typing import Literal, get_args
5
5
 
6
6
 
7
7
  @unique
@@ -16,6 +16,16 @@ class ExecutionStatus(StrEnum):
16
16
  BLOCKED = "blocked"
17
17
 
18
18
 
19
+ type TerminalWorkspaceStatus = Literal[
20
+ ExecutionStatus.SUCCEEDED,
21
+ ExecutionStatus.FAILED,
22
+ ExecutionStatus.CANCELLED,
23
+ ]
24
+ TERMINAL_WORKSPACE_STATUSES: frozenset[TerminalWorkspaceStatus] = frozenset(
25
+ get_args(TerminalWorkspaceStatus.__value__)
26
+ )
27
+
28
+
19
29
  type LifecycleStatus = Literal[
20
30
  ExecutionStatus.PENDING,
21
31
  ExecutionStatus.RUNNING,
@@ -4,15 +4,13 @@ import re
4
4
  from collections.abc import Callable, Collection, Sequence
5
5
  from dataclasses import dataclass, field
6
6
 
7
+ from crewplane.core.sensitive_names import is_sensitive_name
8
+
7
9
  from .json import JsonObject, JsonValue
8
10
 
9
11
  type JsonPathSegment = str | int
10
12
  type SensitiveOptionTransform = Callable[[str, JsonValue], JsonValue]
11
13
 
12
- _SENSITIVE_OPTION_PATTERN = re.compile(
13
- r"(secret|token|password|passwd|api[_-]?key|credential|private)",
14
- re.IGNORECASE,
15
- )
16
14
  _INVALID_JSON_POINTER_ESCAPE = re.compile(r"~(?:[^01]|$)")
17
15
  _JSON_ARRAY_INDEX = re.compile(r"0|[1-9][0-9]*")
18
16
 
@@ -117,10 +115,7 @@ class _SensitiveOptionWalker:
117
115
  @staticmethod
118
116
  def _is_sensitive_name(path: tuple[JsonPathSegment, ...]) -> bool:
119
117
  segment = path[-1]
120
- return (
121
- isinstance(segment, str)
122
- and _SENSITIVE_OPTION_PATTERN.search(segment) is not None
123
- )
118
+ return isinstance(segment, str) and is_sensitive_name(segment)
124
119
 
125
120
  def _has_explicit_descendant(self, pointer: str) -> bool:
126
121
  prefix = f"{pointer}/"
@@ -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
 
@@ -54,6 +54,23 @@ class InvocationFailureSummary:
54
54
  return self.message
55
55
 
56
56
 
57
+ class InvocationFailureError(RuntimeError):
58
+ def __init__(
59
+ self,
60
+ prefix: str,
61
+ summary: InvocationFailureSummary,
62
+ log_file: Path | None,
63
+ ) -> None:
64
+ self.summary = summary
65
+ self.kind = summary.kind
66
+ self.phase = summary.phase
67
+ self.source = summary.source
68
+ self.advice = summary.advice
69
+ self.log_file = log_file
70
+ self.last_non_quota_failure: InvocationFailureSummary | None = None
71
+ super().__init__(f"{prefix}: {summary.format_for_error(log_file)}")
72
+
73
+
57
74
  ADVICE_BY_KIND: dict[FailureKind, str] = {
58
75
  "provider_session_context_exhausted": (
59
76
  "Provider context filled during tool or file exploration. Split the "
@@ -8,6 +8,23 @@ from contextlib import suppress
8
8
  from pathlib import Path
9
9
  from typing import Any
10
10
 
11
+ _TEMPORARY_SUFFIX = ".tmp"
12
+
13
+
14
+ def _temporary_name_prefix(target_name: str) -> str:
15
+ return f".{target_name}."
16
+
17
+
18
+ def atomic_temporary_target_name(name: str) -> str | None:
19
+ """Decode a temporary basename without imposing target-file eligibility."""
20
+ if not name.startswith(".") or not name.endswith(_TEMPORARY_SUFFIX):
21
+ return None
22
+ target_and_token = name[1 : -len(_TEMPORARY_SUFFIX)]
23
+ target_name, separator, token = target_and_token.rpartition(".")
24
+ if not separator or not token or not target_name:
25
+ return None
26
+ return target_name
27
+
11
28
 
12
29
  def json_bytes(payload: Any) -> bytes:
13
30
  return (
@@ -32,8 +49,8 @@ def atomic_write_bytes(path: Path, payload: bytes, ensure_parent: bool = True) -
32
49
  with tempfile.NamedTemporaryFile(
33
50
  mode="wb",
34
51
  dir=path.parent,
35
- prefix=f".{path.name}.",
36
- suffix=".tmp",
52
+ prefix=_temporary_name_prefix(path.name),
53
+ suffix=_TEMPORARY_SUFFIX,
37
54
  delete=False,
38
55
  ) as handle:
39
56
  publication_phase = "write temporary file"
@@ -75,8 +92,8 @@ def atomic_write_bytes_if_absent(
75
92
  with tempfile.NamedTemporaryFile(
76
93
  mode="wb",
77
94
  dir=path.parent,
78
- prefix=f".{path.name}.",
79
- suffix=".tmp",
95
+ prefix=_temporary_name_prefix(path.name),
96
+ suffix=_TEMPORARY_SUFFIX,
80
97
  delete=False,
81
98
  ) as handle:
82
99
  publication_phase = "write temporary file"