teddy-cli 0.1.17.dev1397__tar.gz → 0.1.17.dev1399__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 (164) hide show
  1. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/PKG-INFO +1 -1
  2. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/pyproject.toml +1 -1
  3. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/planning_service.py +32 -14
  4. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/utils/interrupt_guard.py +12 -3
  5. teddy_cli-0.1.17.dev1399/src/teddy_executor/core/utils/interruptible_call.py +35 -0
  6. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/.gitignore +0 -0
  7. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/LICENSE +0 -0
  8. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/README.md +0 -0
  9. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/__init__.py +0 -0
  10. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/__main__.py +0 -0
  11. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/__init__.py +0 -0
  12. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/inbound/__init__.py +0 -0
  13. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/inbound/cli_formatter.py +0 -0
  14. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/inbound/cli_helpers.py +0 -0
  15. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/inbound/session_cli_handlers.py +0 -0
  16. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/inbound/textual_plan_reviewer.py +0 -0
  17. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_app.py +0 -0
  18. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_editor.py +0 -0
  19. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_execution.py +0 -0
  20. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_helpers.py +0 -0
  21. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_logic.py +0 -0
  22. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_previews.py +0 -0
  23. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/inbound/textual_plan_reviewer_widgets.py +0 -0
  24. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/outbound/__init__.py +0 -0
  25. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/outbound/console_interactor.py +0 -0
  26. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/outbound/console_interactor_ask_loop.py +0 -0
  27. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/outbound/console_interactor_helpers.py +0 -0
  28. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/outbound/console_tooling.py +0 -0
  29. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/outbound/filesystem_helpers.py +0 -0
  30. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/outbound/litellm_adapter.py +0 -0
  31. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/outbound/local_file_system_adapter.py +0 -0
  32. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/outbound/local_repo_tree_generator.py +0 -0
  33. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/outbound/openrouter_hydrator.py +0 -0
  34. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/outbound/shell_adapter.py +0 -0
  35. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/outbound/shell_command_builder.py +0 -0
  36. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/outbound/suppressed_logging.py +0 -0
  37. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/outbound/system_environment_adapter.py +0 -0
  38. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/outbound/system_environment_inspector.py +0 -0
  39. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/outbound/system_time_adapter.py +0 -0
  40. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/outbound/terminal_quit_key_listener.py +0 -0
  41. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/outbound/web_scraper_adapter.py +0 -0
  42. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/outbound/web_searcher_adapter.py +0 -0
  43. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/adapters/outbound/yaml_config_adapter.py +0 -0
  44. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/container.py +0 -0
  45. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/__init__.py +0 -0
  46. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/domain/__init__.py +0 -0
  47. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/domain/models/__init__.py +0 -0
  48. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/domain/models/action_ports.py +0 -0
  49. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/domain/models/change_set.py +0 -0
  50. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/domain/models/drift_report.py +0 -0
  51. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/domain/models/exceptions.py +0 -0
  52. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/domain/models/execution_report.py +0 -0
  53. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/domain/models/orchestrator_ports.py +0 -0
  54. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/domain/models/plan.py +0 -0
  55. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/domain/models/planning_ports.py +0 -0
  56. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/domain/models/project_context.py +0 -0
  57. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/domain/models/report_assembly_data.py +0 -0
  58. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/domain/models/session.py +0 -0
  59. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/domain/models/shell_output.py +0 -0
  60. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/domain/models/web_search_results.py +0 -0
  61. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/__init__.py +0 -0
  62. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/inbound/__init__.py +0 -0
  63. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/inbound/edit_simulator.py +0 -0
  64. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/inbound/get_context_use_case.py +0 -0
  65. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/inbound/init.py +0 -0
  66. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/inbound/plan_parser.py +0 -0
  67. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/inbound/plan_reviewer.py +0 -0
  68. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/inbound/plan_validator.py +0 -0
  69. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/inbound/planning_use_case.py +0 -0
  70. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/inbound/run_plan_use_case.py +0 -0
  71. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/outbound/__init__.py +0 -0
  72. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/outbound/config_service.py +0 -0
  73. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/outbound/environment_inspector.py +0 -0
  74. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/outbound/execution_report_assembler.py +0 -0
  75. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/outbound/file_system_manager.py +0 -0
  76. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/outbound/llm_client.py +0 -0
  77. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/outbound/markdown_report_formatter.py +0 -0
  78. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/outbound/prompt_manager.py +0 -0
  79. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/outbound/quit_key_listener.py +0 -0
  80. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/outbound/repo_tree_generator.py +0 -0
  81. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/outbound/session_loop_guard.py +0 -0
  82. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/outbound/session_manager.py +0 -0
  83. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/outbound/session_repository.py +0 -0
  84. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/outbound/shell_executor.py +0 -0
  85. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/outbound/system_environment.py +0 -0
  86. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/outbound/time_service.py +0 -0
  87. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/outbound/user_interactor.py +0 -0
  88. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/outbound/web_scraper.py +0 -0
  89. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/ports/outbound/web_searcher.py +0 -0
  90. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/__init__.py +0 -0
  91. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/action_changeset_builder.py +0 -0
  92. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/action_diff_manager.py +0 -0
  93. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/action_dispatcher.py +0 -0
  94. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/action_executor.py +0 -0
  95. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/action_factory.py +0 -0
  96. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/action_parser_complex.py +0 -0
  97. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/action_parser_strategies.py +0 -0
  98. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/context_service.py +0 -0
  99. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/edit_simulator.py +0 -0
  100. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/execution_orchestrator.py +0 -0
  101. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/execution_report_assembler.py +0 -0
  102. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/init_service.py +0 -0
  103. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/markdown_plan_parser.py +0 -0
  104. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/markdown_report_formatter.py +0 -0
  105. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/parser_infrastructure.py +0 -0
  106. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/parser_metadata.py +0 -0
  107. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/parser_reporting.py +0 -0
  108. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/plan_validator.py +0 -0
  109. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/prompt_manager.py +0 -0
  110. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/session_lifecycle_manager.py +0 -0
  111. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/session_loop_guard.py +0 -0
  112. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/session_orchestrator.py +0 -0
  113. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/session_planner.py +0 -0
  114. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/session_pruning_service.py +0 -0
  115. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/session_replanner.py +0 -0
  116. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/session_repository.py +0 -0
  117. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/session_service.py +0 -0
  118. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/templates/execution_report.md.j2 +0 -0
  119. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/update_checker.py +0 -0
  120. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/validation_rules/__init__.py +0 -0
  121. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/validation_rules/edit.py +0 -0
  122. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/validation_rules/edit_matcher.py +0 -0
  123. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/validation_rules/edit_matcher_heuristics.py +0 -0
  124. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/validation_rules/execute.py +0 -0
  125. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/validation_rules/filesystem.py +0 -0
  126. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/validation_rules/helpers.py +0 -0
  127. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/services/validation_rules/message.py +0 -0
  128. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/utils/__init__.py +0 -0
  129. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/utils/diff.py +0 -0
  130. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/utils/editor_names.py +0 -0
  131. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/utils/io.py +0 -0
  132. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/utils/markdown.py +0 -0
  133. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/utils/paths.py +0 -0
  134. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/utils/serialization.py +0 -0
  135. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/utils/session_notices.py +0 -0
  136. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/utils/stdin_ownership.py +0 -0
  137. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/utils/string.py +0 -0
  138. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/core/utils/terminal.py +0 -0
  139. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/prompts.py +0 -0
  140. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/registries/__init__.py +0 -0
  141. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/registries/infrastructure.py +0 -0
  142. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/registries/reviewer.py +0 -0
  143. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/registries/validators.py +0 -0
  144. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/resources/MRP.md +0 -0
  145. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/resources/__init__.py +0 -0
  146. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/resources/config/__init__.py +0 -0
  147. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/resources/config/config.yaml +0 -0
  148. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/resources/config/init.context +0 -0
  149. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/resources/config/prompts/architect.md +0 -0
  150. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/resources/config/prompts/assistant.md +0 -0
  151. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/resources/config/prompts/debugger.md +0 -0
  152. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/resources/config/prompts/developer.md +0 -0
  153. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/resources/config/prompts/pathfinder.md +0 -0
  154. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/resources/config/prompts/prototyper.md +0 -0
  155. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/resources/templates/ARCHITECTURE.md +0 -0
  156. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/resources/templates/PROJECT.md +0 -0
  157. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/resources/templates/case-file.md +0 -0
  158. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/resources/templates/ci.md +0 -0
  159. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/resources/templates/component-design.md +0 -0
  160. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/resources/templates/makefile.md +0 -0
  161. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/resources/templates/milestone.md +0 -0
  162. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/resources/templates/pre-commit.md +0 -0
  163. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/resources/templates/specification-document.md +0 -0
  164. {teddy_cli-0.1.17.dev1397 → teddy_cli-0.1.17.dev1399}/src/teddy_executor/resources/templates/vertical-slice.md +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: teddy-cli
3
- Version: 0.1.17.dev1397
3
+ Version: 0.1.17.dev1399
4
4
  Summary: The local-first, test-driven agentic engineering harness. Because you should own the means of development.
5
5
  Author: Raphael Atteritano
6
6
  License: AGPL-3.0-only
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "teddy-cli"
3
- version = "0.1.17.dev1397"
3
+ version = "0.1.17.dev1399"
4
4
  description = "The local-first, test-driven agentic engineering harness. Because you should own the means of development."
5
5
  readme = "README.md"
6
6
  keywords = [
@@ -2,6 +2,7 @@ from pathlib import Path
2
2
  from typing import Any, Dict, Optional, Sequence
3
3
  from teddy_executor.core.domain.models import ProjectContext
4
4
  from teddy_executor.core.ports.inbound.planning_use_case import IPlanningUseCase
5
+ from teddy_executor.core.utils.interruptible_call import run_interruptible
5
6
 
6
7
 
7
8
  class PlanningService(IPlanningUseCase):
@@ -93,6 +94,36 @@ class PlanningService(IPlanningUseCase):
93
94
  (turn_path / "input.md").as_posix(), full_context
94
95
  )
95
96
 
97
+ response, token_count, plan_content, turn_cost = run_interruptible(
98
+ lambda: self._run_planning_phase(messages, model, meta)
99
+ )
100
+
101
+ cost_val = self._prompt_manager.log_telemetry(token_count, turn_cost)
102
+ plan_path = (turn_path / "plan.md").as_posix()
103
+ self._file_system_manager.write_file(plan_path, plan_content)
104
+ # Pre-populate meta["model"] before update_meta to ensure the user-configured
105
+ # model (with routing prefix like openrouter/) is preserved.
106
+ # This prevents the bug where meta["model"] was missing on first turn (no --model flag)
107
+ # and update_meta overwrote it with the bare actual model.
108
+ meta.setdefault("model", model)
109
+ self._prompt_manager.update_meta(
110
+ meta, response, token_count, turn_cost, meta_file_path
111
+ )
112
+
113
+ return plan_path, cost_val, context
114
+
115
+ def _run_planning_phase(
116
+ self,
117
+ messages: list[Dict[str, str]],
118
+ model: str,
119
+ meta: Dict[str, Any],
120
+ ) -> tuple[Any, int, str, float]:
121
+ """Perform every blocking planning call on the interruptible worker.
122
+
123
+ Hydration, the token count, telemetry, the budget check, and the
124
+ completion all touch the network. The main thread waits on this worker's
125
+ future, so a quit interrupts the wait instead of the raw socket read.
126
+ """
96
127
  # Pre-emptive Hydration: Trigger hydration via get_context_window BEFORE counting tokens.
97
128
  # This ensures the model is known to the registry so token counting and telemetry work.
98
129
  if self._user_interactor:
@@ -112,20 +143,7 @@ class PlanningService(IPlanningUseCase):
112
143
  messages,
113
144
  model=model,
114
145
  )
115
-
116
- cost_val = self._prompt_manager.log_telemetry(token_count, turn_cost)
117
- plan_path = (turn_path / "plan.md").as_posix()
118
- self._file_system_manager.write_file(plan_path, plan_content)
119
- # Pre-populate meta["model"] before update_meta to ensure the user-configured
120
- # model (with routing prefix like openrouter/) is preserved.
121
- # This prevents the bug where meta["model"] was missing on first turn (no --model flag)
122
- # and update_meta overwrote it with the bare actual model.
123
- meta.setdefault("model", model)
124
- self._prompt_manager.update_meta(
125
- meta, response, token_count, turn_cost, meta_file_path
126
- )
127
-
128
- return plan_path, cost_val, context
146
+ return response, token_count, plan_content, turn_cost
129
147
 
130
148
  def _perform_generation_with_retry(
131
149
  self,
@@ -18,6 +18,7 @@ import-free of DI frameworks (hexagonal core boundary).
18
18
  """
19
19
 
20
20
  import signal
21
+ import sys
21
22
  import threading
22
23
  from collections.abc import Callable
23
24
  from contextlib import contextmanager
@@ -128,8 +129,16 @@ def raise_interrupt() -> None:
128
129
 
129
130
  ``os.kill(os.getpid(), signal.SIGINT)`` terminates the process on Windows
130
131
  through ``TerminateProcess`` instead of invoking the Python SIGINT handler,
131
- which suppresses the interrupt notice. ``signal.raise_signal`` uses the
132
- process-level CRT raise path and reaches the handler from the main thread
133
- and from a reader thread on every platform.
132
+ which suppresses the interrupt notice. On POSIX the signal targets the main
133
+ thread through ``signal.pthread_kill``, so delivery wakes a blocked main
134
+ thread at its next checkpoint instead of waiting for the calling thread to
135
+ return. Windows and any platform without ``pthread_kill`` use
136
+ ``signal.raise_signal``, which keeps the CRT raise path so the installed
137
+ handler still runs there.
134
138
  """
139
+ if sys.platform != "win32" and hasattr(signal, "pthread_kill"):
140
+ main_ident = threading.main_thread().ident
141
+ if main_ident is not None:
142
+ signal.pthread_kill(main_ident, signal.SIGINT)
143
+ return
135
144
  signal.raise_signal(signal.SIGINT)
@@ -0,0 +1,35 @@
1
+ """Run a blocking callable on a daemon worker so a quit can wake the waiter.
2
+
3
+ The planning completion blocks the main thread inside a raw socket read. A
4
+ POSIX signal reaches that call only through a main-thread target, and the
5
+ Windows CRT raise cannot wake it at all. Running the call on a daemon worker
6
+ keeps the main thread in a condition wait, which every SIGINT delivery
7
+ primitive wakes immediately.
8
+
9
+ The worker is a daemon so a pending completion cannot block process exit after
10
+ a quit. Every worker failure is forwarded to the waiter unchanged.
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import threading
16
+ from collections.abc import Callable
17
+ from concurrent.futures import Future
18
+ from typing import TypeVar
19
+
20
+ T = TypeVar("T")
21
+
22
+
23
+ def run_interruptible(func: Callable[[], T]) -> T:
24
+ """Run ``func`` on a daemon worker and return its result or raise its error."""
25
+ future: Future[T] = Future()
26
+
27
+ def _work() -> None:
28
+ try:
29
+ future.set_result(func())
30
+ except BaseException as exc: # forward every failure to the waiter
31
+ future.set_exception(exc)
32
+
33
+ worker = threading.Thread(target=_work, name="interruptible-call", daemon=True)
34
+ worker.start()
35
+ return future.result()