code-puppy 0.0.652__tar.gz → 0.0.653__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 (515) hide show
  1. {code_puppy-0.0.652 → code_puppy-0.0.653}/PKG-INFO +1 -1
  2. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/model_settings_menu.py +18 -0
  3. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/config.py +10 -0
  4. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/i18n/locales/en-US.json +13 -1
  5. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/model_factory.py +20 -0
  6. code_puppy-0.0.653/code_puppy/plugins/chatgpt_oauth/IMAGEGEN_SKILL.md +44 -0
  7. code_puppy-0.0.653/code_puppy/plugins/chatgpt_oauth/image_generation.py +161 -0
  8. code_puppy-0.0.653/code_puppy/plugins/chatgpt_oauth/image_tool.py +50 -0
  9. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/chatgpt_oauth/register_callbacks.py +82 -1
  10. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/chatgpt_oauth/test_plugin.py +184 -1
  11. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/chatgpt_oauth/utils.py +2 -0
  12. {code_puppy-0.0.652 → code_puppy-0.0.653}/pyproject.toml +1 -1
  13. {code_puppy-0.0.652 → code_puppy-0.0.653}/.gitignore +0 -0
  14. {code_puppy-0.0.652 → code_puppy-0.0.653}/LICENSE +0 -0
  15. {code_puppy-0.0.652 → code_puppy-0.0.653}/README.md +0 -0
  16. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/__init__.py +0 -0
  17. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/__main__.py +0 -0
  18. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/agents/__init__.py +0 -0
  19. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/agents/_builder.py +0 -0
  20. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/agents/_compaction.py +0 -0
  21. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/agents/_diagnostics.py +0 -0
  22. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/agents/_history.py +0 -0
  23. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/agents/_key_listeners.py +0 -0
  24. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/agents/_non_streaming_render.py +0 -0
  25. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/agents/_run_signals.py +0 -0
  26. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/agents/_runtime.py +0 -0
  27. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/agents/_steer_processor.py +0 -0
  28. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/agents/agent_code_puppy.py +0 -0
  29. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/agents/agent_creator_agent.py +0 -0
  30. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/agents/agent_helios.py +0 -0
  31. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/agents/agent_manager.py +0 -0
  32. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/agents/agent_planning.py +0 -0
  33. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/agents/agent_qa_kitten.py +0 -0
  34. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/agents/base_agent.py +0 -0
  35. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/agents/event_stream_handler.py +0 -0
  36. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/agents/json_agent.py +0 -0
  37. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/agents/retry_profiles.py +0 -0
  38. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/agents/run_stats.py +0 -0
  39. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/agents/smooth_stream.py +0 -0
  40. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/agents/subagent_stream_handler.py +0 -0
  41. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/callbacks.py +0 -0
  42. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/chatgpt_codex_client.py +0 -0
  43. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/claude_cache_client.py +0 -0
  44. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/cli_runner.py +0 -0
  45. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/__init__.py +0 -0
  46. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/add_model_menu.py +0 -0
  47. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/agent_menu.py +0 -0
  48. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/attachments.py +0 -0
  49. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/autosave_menu.py +0 -0
  50. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/autosave_search.py +0 -0
  51. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/clipboard.py +0 -0
  52. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/colors_menu.py +0 -0
  53. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/command_handler.py +0 -0
  54. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/command_registry.py +0 -0
  55. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/config_apply.py +0 -0
  56. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/config_commands.py +0 -0
  57. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/core_commands.py +0 -0
  58. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/diff_menu.py +0 -0
  59. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/file_index.py +0 -0
  60. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/file_path_completion.py +0 -0
  61. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/image_utils.py +0 -0
  62. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/judges_menu.py +0 -0
  63. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/load_context_completion.py +0 -0
  64. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/mcp/__init__.py +0 -0
  65. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/mcp/base.py +0 -0
  66. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/mcp/catalog_server_installer.py +0 -0
  67. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/mcp/custom_server_form.py +0 -0
  68. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/mcp/custom_server_installer.py +0 -0
  69. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/mcp/edit_command.py +0 -0
  70. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/mcp/handler.py +0 -0
  71. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/mcp/help_command.py +0 -0
  72. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/mcp/install_command.py +0 -0
  73. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/mcp/install_menu.py +0 -0
  74. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/mcp/list_command.py +0 -0
  75. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/mcp/logs_command.py +0 -0
  76. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/mcp/remove_command.py +0 -0
  77. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/mcp/restart_command.py +0 -0
  78. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/mcp/search_command.py +0 -0
  79. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/mcp/silence_warning_command.py +0 -0
  80. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/mcp/start_all_command.py +0 -0
  81. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/mcp/start_command.py +0 -0
  82. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/mcp/status_command.py +0 -0
  83. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/mcp/stop_all_command.py +0 -0
  84. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/mcp/stop_command.py +0 -0
  85. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/mcp/trust_command.py +0 -0
  86. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/mcp/utils.py +0 -0
  87. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/mcp/wizard_utils.py +0 -0
  88. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/mcp_binding_menu.py +0 -0
  89. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/mcp_completion.py +0 -0
  90. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/model_picker_completion.py +0 -0
  91. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/onboarding_slides.py +0 -0
  92. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/onboarding_wizard.py +0 -0
  93. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/pagination.py +0 -0
  94. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/pin_command_completion.py +0 -0
  95. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/prompt_toolkit_completion.py +0 -0
  96. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/session_commands.py +0 -0
  97. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/set_menu.py +0 -0
  98. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/set_menu_catalog.py +0 -0
  99. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/set_menu_render.py +0 -0
  100. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/set_menu_schema.py +0 -0
  101. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/set_menu_settings.py +0 -0
  102. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/set_menu_shims.py +0 -0
  103. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/set_menu_values.py +0 -0
  104. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/shell_passthrough.py +0 -0
  105. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/skills_completion.py +0 -0
  106. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/uc_menu.py +0 -0
  107. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/utils.py +0 -0
  108. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/command_line/wiggum_state.py +0 -0
  109. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/error_logging.py +0 -0
  110. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/gemini_code_assist.py +0 -0
  111. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/gemini_model.py +0 -0
  112. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/hook_engine/README.md +0 -0
  113. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/hook_engine/__init__.py +0 -0
  114. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/hook_engine/aliases.py +0 -0
  115. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/hook_engine/engine.py +0 -0
  116. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/hook_engine/executor.py +0 -0
  117. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/hook_engine/matcher.py +0 -0
  118. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/hook_engine/models.py +0 -0
  119. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/hook_engine/registry.py +0 -0
  120. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/hook_engine/validator.py +0 -0
  121. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/http_utils.py +0 -0
  122. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/i18n/__init__.py +0 -0
  123. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/i18n/audit.py +0 -0
  124. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/i18n/catalog.py +0 -0
  125. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/i18n/formats.py +0 -0
  126. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/i18n/locale.py +0 -0
  127. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/i18n/locales/es-AR.json +0 -0
  128. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/i18n/locales/es-CL.json +0 -0
  129. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/i18n/locales/es-CO.json +0 -0
  130. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/i18n/locales/es-MX.json +0 -0
  131. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/i18n/locales/es.json +0 -0
  132. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/i18n/locales/fr-CA.json +0 -0
  133. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/i18n/plurals.py +0 -0
  134. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/i18n/pseudo.py +0 -0
  135. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/i18n/translate.py +0 -0
  136. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/keymap.py +0 -0
  137. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/list_filtering.py +0 -0
  138. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/main.py +0 -0
  139. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/mcp_/__init__.py +0 -0
  140. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/mcp_/agent_bindings.py +0 -0
  141. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/mcp_/async_lifecycle.py +0 -0
  142. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/mcp_/blocking_startup.py +0 -0
  143. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/mcp_/captured_stdio_server.py +0 -0
  144. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/mcp_/circuit_breaker.py +0 -0
  145. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/mcp_/config_wizard.py +0 -0
  146. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/mcp_/dashboard.py +0 -0
  147. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/mcp_/error_isolation.py +0 -0
  148. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/mcp_/examples/retry_example.py +0 -0
  149. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/mcp_/health_monitor.py +0 -0
  150. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/mcp_/managed_server.py +0 -0
  151. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/mcp_/manager.py +0 -0
  152. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/mcp_/mcp_logs.py +0 -0
  153. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/mcp_/project_config.py +0 -0
  154. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/mcp_/registry.py +0 -0
  155. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/mcp_/retry_manager.py +0 -0
  156. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/mcp_/server_registry_catalog.py +0 -0
  157. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/mcp_/status_tracker.py +0 -0
  158. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/mcp_/system_tools.py +0 -0
  159. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/mcp_/tool_arg_coercion.py +0 -0
  160. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/mcp_prompts/__init__.py +0 -0
  161. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/mcp_prompts/hook_creator.py +0 -0
  162. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/__init__.py +0 -0
  163. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/bar_painters.py +0 -0
  164. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/bar_rendering.py +0 -0
  165. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/bottom_bar.py +0 -0
  166. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/bus.py +0 -0
  167. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/chords.py +0 -0
  168. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/commands.py +0 -0
  169. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/editor_actions.py +0 -0
  170. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/editor_completion.py +0 -0
  171. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/editor_display.py +0 -0
  172. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/editor_history.py +0 -0
  173. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/editor_keys.py +0 -0
  174. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/editor_paste.py +0 -0
  175. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/external_editor.py +0 -0
  176. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/inline_bar.py +0 -0
  177. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/line_editor.py +0 -0
  178. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/markdown_patches.py +0 -0
  179. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/message_queue.py +0 -0
  180. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/messages.py +0 -0
  181. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/pause_controller.py +0 -0
  182. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/prompt_prefix_style.py +0 -0
  183. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/queue_console.py +0 -0
  184. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/renderers.py +0 -0
  185. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/rich_renderer.py +0 -0
  186. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/run_ui.py +0 -0
  187. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/run_ui_wiring.py +0 -0
  188. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/spinner/__init__.py +0 -0
  189. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/subagent_console.py +0 -0
  190. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/messaging/transcript_guard.py +0 -0
  191. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/model_descriptions.py +0 -0
  192. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/model_switching.py +0 -0
  193. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/model_utils.py +0 -0
  194. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/models.json +0 -0
  195. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/models_dev_api.json +0 -0
  196. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/models_dev_parser.py +0 -0
  197. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/__init__.py +0 -0
  198. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/acp/README.md +0 -0
  199. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/acp/__init__.py +0 -0
  200. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/acp/agent.py +0 -0
  201. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/acp/bridge.py +0 -0
  202. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/acp/capabilities.py +0 -0
  203. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/acp/commands.py +0 -0
  204. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/acp/content.py +0 -0
  205. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/acp/io_delegation.py +0 -0
  206. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/acp/mcp_config.py +0 -0
  207. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/acp/permissions.py +0 -0
  208. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/acp/persistence.py +0 -0
  209. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/acp/register_callbacks.py +0 -0
  210. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/acp/replay.py +0 -0
  211. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/acp/session.py +0 -0
  212. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/acp/session_config.py +0 -0
  213. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/acp/state.py +0 -0
  214. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/agent_skills/__init__.py +0 -0
  215. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/agent_skills/config.py +0 -0
  216. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/agent_skills/discovery.py +0 -0
  217. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/agent_skills/downloader.py +0 -0
  218. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/agent_skills/enabled_skills.py +0 -0
  219. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/agent_skills/installer.py +0 -0
  220. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/agent_skills/metadata.py +0 -0
  221. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/agent_skills/prompt_builder.py +0 -0
  222. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/agent_skills/register_callbacks.py +0 -0
  223. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/agent_skills/remote_catalog.py +0 -0
  224. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/agent_skills/skill_catalog.py +0 -0
  225. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/agent_skills/skill_commands.py +0 -0
  226. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/agent_skills/skills_install_menu.py +0 -0
  227. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/agent_skills/skills_menu.py +0 -0
  228. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/aws_bedrock/__init__.py +0 -0
  229. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/aws_bedrock/config.py +0 -0
  230. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/aws_bedrock/register_callbacks.py +0 -0
  231. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/aws_bedrock/utils.py +0 -0
  232. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/azure_foundry/README.md +0 -0
  233. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/azure_foundry/__init__.py +0 -0
  234. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/azure_foundry/config.py +0 -0
  235. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/azure_foundry/discovery.py +0 -0
  236. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/azure_foundry/register_callbacks.py +0 -0
  237. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/azure_foundry/token.py +0 -0
  238. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/azure_foundry/utils.py +0 -0
  239. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/btw/__init__.py +0 -0
  240. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/btw/inline_view.py +0 -0
  241. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/btw/register_callbacks.py +0 -0
  242. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/btw/side_query.py +0 -0
  243. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/chatgpt_oauth/__init__.py +0 -0
  244. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/chatgpt_oauth/config.py +0 -0
  245. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/chatgpt_oauth/oauth_flow.py +0 -0
  246. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/chatgpt_oauth/usage.py +0 -0
  247. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/claude_code_hooks/__init__.py +0 -0
  248. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/claude_code_hooks/config.py +0 -0
  249. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/claude_code_hooks/register_callbacks.py +0 -0
  250. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/claude_code_oauth/README.md +0 -0
  251. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/claude_code_oauth/SETUP.md +0 -0
  252. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/claude_code_oauth/__init__.py +0 -0
  253. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/claude_code_oauth/config.py +0 -0
  254. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/claude_code_oauth/fast_mode.py +0 -0
  255. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/claude_code_oauth/prompt_handler.py +0 -0
  256. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/claude_code_oauth/register_callbacks.py +0 -0
  257. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/claude_code_oauth/test_fast_mode.py +0 -0
  258. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/claude_code_oauth/test_plugin.py +0 -0
  259. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
  260. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/claude_code_oauth/utils.py +0 -0
  261. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/code_puppy_agent/SKILL.md +0 -0
  262. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/code_puppy_agent/__init__.py +0 -0
  263. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/code_puppy_agent/register_callbacks.py +0 -0
  264. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/config.py +0 -0
  265. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/context_indicator/__init__.py +0 -0
  266. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/context_indicator/register_callbacks.py +0 -0
  267. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/context_indicator/usage.py +0 -0
  268. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/copilot_auth/__init__.py +0 -0
  269. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/copilot_auth/config.py +0 -0
  270. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/copilot_auth/reasoning_client.py +0 -0
  271. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/copilot_auth/register_callbacks.py +0 -0
  272. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/copilot_auth/utils.py +0 -0
  273. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/customizable_commands/__init__.py +0 -0
  274. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/customizable_commands/register_callbacks.py +0 -0
  275. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/dbos_durable_exec/__init__.py +0 -0
  276. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/dbos_durable_exec/cancel.py +0 -0
  277. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/dbos_durable_exec/commands.py +0 -0
  278. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/dbos_durable_exec/config.py +0 -0
  279. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/dbos_durable_exec/lifecycle.py +0 -0
  280. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/dbos_durable_exec/register_callbacks.py +0 -0
  281. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/dbos_durable_exec/runtime.py +0 -0
  282. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/dbos_durable_exec/startup_lock.py +0 -0
  283. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/dbos_durable_exec/workflow_ids.py +0 -0
  284. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/dbos_durable_exec/wrapper.py +0 -0
  285. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/destructive_command_guard/__init__.py +0 -0
  286. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/destructive_command_guard/detector.py +0 -0
  287. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/destructive_command_guard/register_callbacks.py +0 -0
  288. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/emoji_filter/__init__.py +0 -0
  289. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/emoji_filter/config.py +0 -0
  290. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/emoji_filter/register_callbacks.py +0 -0
  291. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/emoji_filter/stripper.py +0 -0
  292. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/empty_html_comment_filter/register_callbacks.py +0 -0
  293. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/example_custom_command/README.md +0 -0
  294. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/example_custom_command/register_callbacks.py +0 -0
  295. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/file_permission_handler/__init__.py +0 -0
  296. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/file_permission_handler/register_callbacks.py +0 -0
  297. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/__init__.py +0 -0
  298. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/_docs/README.md +0 -0
  299. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/_docs/cheatsheet.md +0 -0
  300. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/_docs/pipeline.md +0 -0
  301. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/_docs/synopsis.md +0 -0
  302. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/about.md +0 -0
  303. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/address-feedback.md +0 -0
  304. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/ask.md +0 -0
  305. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/aug.md +0 -0
  306. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/auto-pilot.md +0 -0
  307. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/cheatsheet.md +0 -0
  308. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/commit.md +0 -0
  309. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/config.md +0 -0
  310. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/create-pr.md +0 -0
  311. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/exec.md +0 -0
  312. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/new.md +0 -0
  313. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/qa.md +0 -0
  314. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/rebase.md +0 -0
  315. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/review.md +0 -0
  316. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/split.md +0 -0
  317. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/squash-commits.md +0 -0
  318. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/status.md +0 -0
  319. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/bundled/commands/flux/tests.md +0 -0
  320. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/bundled/scripts/flux_about.py +0 -0
  321. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/bundled/scripts/flux_cheatsheet.py +0 -0
  322. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/bundled/scripts/flux_status.py +0 -0
  323. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/installer.py +0 -0
  324. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/flux_bootstrap/register_callbacks.py +0 -0
  325. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/force_push_guard/__init__.py +0 -0
  326. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/force_push_guard/detector.py +0 -0
  327. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/force_push_guard/register_callbacks.py +0 -0
  328. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/force_push_guard/test_detector.py +0 -0
  329. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/fork/__init__.py +0 -0
  330. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/fork/register_callbacks.py +0 -0
  331. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/frontend_emitter/__init__.py +0 -0
  332. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/frontend_emitter/emitter.py +0 -0
  333. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/frontend_emitter/register_callbacks.py +0 -0
  334. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/frontend_emitter/session_context.py +0 -0
  335. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/grok_oauth/__init__.py +0 -0
  336. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/grok_oauth/config.py +0 -0
  337. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/grok_oauth/oauth_flow.py +0 -0
  338. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/grok_oauth/register_callbacks.py +0 -0
  339. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/grok_oauth/test_plugin.py +0 -0
  340. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/grok_oauth/utils.py +0 -0
  341. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/herdr/README.md +0 -0
  342. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/herdr/__init__.py +0 -0
  343. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/herdr/client.py +0 -0
  344. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/herdr/register_callbacks.py +0 -0
  345. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/herdr/reporter.py +0 -0
  346. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/hook_creator/__init__.py +0 -0
  347. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/hook_creator/register_callbacks.py +0 -0
  348. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/hook_manager/__init__.py +0 -0
  349. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/hook_manager/config.py +0 -0
  350. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/hook_manager/hooks_menu.py +0 -0
  351. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/hook_manager/register_callbacks.py +0 -0
  352. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/no_tools/__init__.py +0 -0
  353. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/no_tools/register_callbacks.py +0 -0
  354. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/oauth_pasteback.py +0 -0
  355. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/oauth_puppy_html.py +0 -0
  356. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/obsidian_agent/README.md +0 -0
  357. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/obsidian_agent/__init__.py +0 -0
  358. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/obsidian_agent/agent_obsidian.py +0 -0
  359. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/obsidian_agent/register_callbacks.py +0 -0
  360. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/ollama/__init__.py +0 -0
  361. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/ollama/register_callbacks.py +0 -0
  362. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/ollama_setup/__init__.py +0 -0
  363. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/ollama_setup/completer.py +0 -0
  364. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/ollama_setup/register_callbacks.py +0 -0
  365. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/plugin_list/__init__.py +0 -0
  366. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/plugin_list/plugin_contributions.py +0 -0
  367. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/plugin_list/plugin_meta.py +0 -0
  368. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/plugin_list/plugin_text_utils.py +0 -0
  369. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/plugin_list/plugins_menu.py +0 -0
  370. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/plugin_list/plugins_menu_layout.py +0 -0
  371. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/plugin_list/plugins_menu_render.py +0 -0
  372. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/plugin_list/project_trust_flow.py +0 -0
  373. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/plugin_list/register_callbacks.py +0 -0
  374. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/pop_command/__init__.py +0 -0
  375. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/pop_command/register_callbacks.py +0 -0
  376. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/prompt_newline/__init__.py +0 -0
  377. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/prompt_newline/config.py +0 -0
  378. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/prompt_newline/register_callbacks.py +0 -0
  379. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/prune/__init__.py +0 -0
  380. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/prune/prune_menu.py +0 -0
  381. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/prune/prune_model.py +0 -0
  382. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/prune/prune_render.py +0 -0
  383. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/prune/register_callbacks.py +0 -0
  384. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/puppy_kennel/README.md +0 -0
  385. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/puppy_kennel/__init__.py +0 -0
  386. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/puppy_kennel/commands.py +0 -0
  387. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/puppy_kennel/config.py +0 -0
  388. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/puppy_kennel/kennel.py +0 -0
  389. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/puppy_kennel/packer.py +0 -0
  390. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/puppy_kennel/recorder.py +0 -0
  391. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/puppy_kennel/register_callbacks.py +0 -0
  392. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/puppy_kennel/retriever.py +0 -0
  393. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/puppy_kennel/schema.py +0 -0
  394. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/puppy_kennel/state.py +0 -0
  395. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/puppy_kennel/tools.py +0 -0
  396. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/puppy_kennel/wings.py +0 -0
  397. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/puppy_spinner/README.md +0 -0
  398. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/puppy_spinner/__init__.py +0 -0
  399. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/puppy_spinner/builtin_frames.py +0 -0
  400. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/puppy_spinner/commands.py +0 -0
  401. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/puppy_spinner/picker.py +0 -0
  402. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/puppy_spinner/register_callbacks.py +0 -0
  403. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/puppy_spinner/spinners.py +0 -0
  404. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/quick_resume/__init__.py +0 -0
  405. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/quick_resume/register_callbacks.py +0 -0
  406. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/review_pr/__init__.py +0 -0
  407. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/review_pr/register_callbacks.py +0 -0
  408. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/shell_safety/__init__.py +0 -0
  409. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/shell_safety/agent_shell_safety.py +0 -0
  410. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/shell_safety/command_cache.py +0 -0
  411. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/shell_safety/register_callbacks.py +0 -0
  412. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/stack_dump/__init__.py +0 -0
  413. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/stack_dump/register_callbacks.py +0 -0
  414. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/statusline/__init__.py +0 -0
  415. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/statusline/config.py +0 -0
  416. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/statusline/payload.py +0 -0
  417. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/statusline/prompt_patch.py +0 -0
  418. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/statusline/register_callbacks.py +0 -0
  419. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/statusline/runner.py +0 -0
  420. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/statusline/statusline_command.py +0 -0
  421. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/steer_queue/__init__.py +0 -0
  422. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/steer_queue/queue_menu.py +0 -0
  423. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/steer_queue/register_callbacks.py +0 -0
  424. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/subagent_panel/README.md +0 -0
  425. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/subagent_panel/__init__.py +0 -0
  426. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/subagent_panel/coalesce_patch.py +0 -0
  427. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/subagent_panel/panel_render.py +0 -0
  428. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/subagent_panel/register_callbacks.py +0 -0
  429. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/subagent_panel/resume_repaint.py +0 -0
  430. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/subagent_panel/state.py +0 -0
  431. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/switch_agent_resume/__init__.py +0 -0
  432. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/switch_agent_resume/register_callbacks.py +0 -0
  433. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/theme/README.md +0 -0
  434. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/theme/__init__.py +0 -0
  435. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/theme/bundled_palettes.py +0 -0
  436. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/theme/content_styles.py +0 -0
  437. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/theme/osc_palette.py +0 -0
  438. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/theme/picker.py +0 -0
  439. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/theme/prompt_toolkit_theme.py +0 -0
  440. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/theme/register_callbacks.py +0 -0
  441. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/theme/rich_themes.py +0 -0
  442. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/theme/themes.py +0 -0
  443. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/token_ratio_learner/__init__.py +0 -0
  444. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/token_ratio_learner/ratios.py +0 -0
  445. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/token_ratio_learner/register_callbacks.py +0 -0
  446. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/trust.py +0 -0
  447. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/trust_notice.py +0 -0
  448. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/universal_constructor/__init__.py +0 -0
  449. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/universal_constructor/models.py +0 -0
  450. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/universal_constructor/register_callbacks.py +0 -0
  451. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/universal_constructor/registry.py +0 -0
  452. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/universal_constructor/sandbox.py +0 -0
  453. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/wide_completion_menu/__init__.py +0 -0
  454. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/wide_completion_menu/register_callbacks.py +0 -0
  455. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/wiggum/__init__.py +0 -0
  456. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/wiggum/judge.py +0 -0
  457. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/wiggum/judge_config.py +0 -0
  458. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/wiggum/register_callbacks.py +0 -0
  459. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/wiggum/state.py +0 -0
  460. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/yolo_cli/__init__.py +0 -0
  461. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/plugins/yolo_cli/register_callbacks.py +0 -0
  462. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/provider_credentials.py +0 -0
  463. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/provider_identity.py +0 -0
  464. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/pydantic_patches.py +0 -0
  465. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/reopenable_async_client.py +0 -0
  466. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/round_robin_model.py +0 -0
  467. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/secret_store.py +0 -0
  468. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/secret_store_backends.py +0 -0
  469. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/session_lifecycle.py +0 -0
  470. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/session_migration.py +0 -0
  471. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/session_storage.py +0 -0
  472. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/status_display.py +0 -0
  473. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/summarization_agent.py +0 -0
  474. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/terminal_utils.py +0 -0
  475. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/__init__.py +0 -0
  476. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/agent_tools.py +0 -0
  477. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/ask_user_question/__init__.py +0 -0
  478. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/ask_user_question/constants.py +0 -0
  479. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/ask_user_question/demo_tui.py +0 -0
  480. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/ask_user_question/handler.py +0 -0
  481. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/ask_user_question/models.py +0 -0
  482. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/ask_user_question/registration.py +0 -0
  483. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/ask_user_question/renderers.py +0 -0
  484. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/ask_user_question/terminal_ui.py +0 -0
  485. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/ask_user_question/theme.py +0 -0
  486. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/ask_user_question/tui_loop.py +0 -0
  487. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/browser/__init__.py +0 -0
  488. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/browser/browser_control.py +0 -0
  489. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/browser/browser_interactions.py +0 -0
  490. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/browser/browser_locator_resolver.py +0 -0
  491. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/browser/browser_locators.py +0 -0
  492. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/browser/browser_manager.py +0 -0
  493. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/browser/browser_navigation.py +0 -0
  494. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/browser/browser_page_snapshot.py +0 -0
  495. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/browser/browser_screenshot.py +0 -0
  496. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/browser/browser_scripts.py +0 -0
  497. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/browser/browser_semantic_interactions.py +0 -0
  498. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/browser/browser_workflows.py +0 -0
  499. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/command_runner.py +0 -0
  500. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/common.py +0 -0
  501. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/display.py +0 -0
  502. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/file_modifications.py +0 -0
  503. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/file_operations.py +0 -0
  504. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/fs_access.py +0 -0
  505. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/image_tools.py +0 -0
  506. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/io_backends.py +0 -0
  507. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/model_tools.py +0 -0
  508. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/shell_backgrounding.py +0 -0
  509. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/skills_tools.py +0 -0
  510. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/subagent_context.py +0 -0
  511. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/subagent_invocation.py +0 -0
  512. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/tools_content.py +0 -0
  513. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/tools/universal_constructor.py +0 -0
  514. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/undo_manager.py +0 -0
  515. {code_puppy-0.0.652 → code_puppy-0.0.653}/code_puppy/version_checker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-puppy
3
- Version: 0.0.652
3
+ Version: 0.0.653
4
4
  Summary: Code generation agent
5
5
  Project-URL: repository, https://github.com/mpfaffenberger/code_puppy
6
6
  Project-URL: HomePage, https://github.com/mpfaffenberger/code_puppy
@@ -83,6 +83,20 @@ SETTING_DEFINITIONS: Dict[str, Dict] = {
83
83
  "choices": ["minimal", "low", "medium", "high", "xhigh", "ultra"],
84
84
  "default": "medium",
85
85
  },
86
+ "reasoning_context": {
87
+ "name": "Reasoning Context",
88
+ "description": "Controls which prior reasoning is retained for GPT-5.6 Responses models. All turns preserves reasoning across the conversation.",
89
+ "type": "choice",
90
+ "choices": ["all_turns", "current_turn", "auto"],
91
+ "default": "all_turns",
92
+ },
93
+ "reasoning_mode": {
94
+ "name": "Reasoning Mode",
95
+ "description": "Controls the GPT-5.6 reasoning mode. Standard is the default; Pro spends more compute and is only available on supported variants.",
96
+ "type": "choice",
97
+ "choices": ["standard", "pro"],
98
+ "default": "standard",
99
+ },
86
100
  "summary": {
87
101
  "name": "Reasoning Summary",
88
102
  "description": "Controls whether OpenAI Responses models return auto, concise, or detailed reasoning summaries.",
@@ -267,6 +281,10 @@ def _get_model_display_settings(model_name: str) -> Dict:
267
281
 
268
282
  if model_supports_setting(model_name, "reasoning_effort"):
269
283
  settings["reasoning_effort"] = get_openai_reasoning_effort()
284
+ if model_supports_setting(model_name, "reasoning_context"):
285
+ settings.setdefault("reasoning_context", "all_turns")
286
+ if model_supports_setting(model_name, "reasoning_mode"):
287
+ settings.setdefault("reasoning_mode", "standard")
270
288
  if model_supports_setting(model_name, "summary"):
271
289
  settings["summary"] = get_openai_reasoning_summary()
272
290
  if model_supports_setting(model_name, "verbosity"):
@@ -689,12 +689,22 @@ def model_supports_setting(model_name: str, setting: str) -> bool:
689
689
 
690
690
  if supports_glm_reasoning_effort(model_name):
691
691
  return True
692
+ if setting in ("reasoning_context", "reasoning_mode"):
693
+ # OpenAI added these Responses API controls with GPT-5.6. Capability
694
+ # detection belongs here so injected/custom 5.6 model definitions do
695
+ # not all need to duplicate the same supported_settings metadata.
696
+ if "gpt-5.6" in model_name.lower():
697
+ return True
692
698
 
693
699
  try:
694
700
  from code_puppy.model_factory import ModelFactory
695
701
 
696
702
  models_config = ModelFactory.load_config()
697
703
  model_config = models_config.get(model_name, {})
704
+ if setting in ("reasoning_context", "reasoning_mode"):
705
+ underlying_name = str(model_config.get("name", "")).lower()
706
+ if "gpt-5.6" in underlying_name:
707
+ return True
698
708
 
699
709
  # Get supported_settings list, default to supporting common settings
700
710
  supported_settings = model_config.get("supported_settings")
@@ -109,5 +109,17 @@
109
109
  "cfg.colors.all_available": "\ud83c\udfa8 All Available Rich Colors:",
110
110
  "cfg.colors.usage": "Usage: /diff {{color_type}} <color_name>",
111
111
  "cfg.colors.white_text_note": "All diffs use white text on your chosen background colors",
112
- "cfg.colors.hex_note": "You can also use hex colors like #ff0000 or rgb(255,0,0)"
112
+ "cfg.colors.hex_note": "You can also use hex colors like #ff0000 or rgb(255,0,0)",
113
+ "codex.imagegen.prompt_required": "A prompt is required.",
114
+ "codex.imagegen.auth_required": "Codex OAuth authentication is required. Run /codex-auth first.",
115
+ "codex.imagegen.request_failed": "Codex image generation request failed{detail}",
116
+ "codex.imagegen.invalid_json": "Codex image generation returned invalid JSON.",
117
+ "codex.imagegen.invalid_response": "Codex image generation returned an invalid response.",
118
+ "codex.imagegen.no_data": "Codex image generation returned no image data.",
119
+ "codex.imagegen.malformed_data": "Codex image generation returned malformed image data.",
120
+ "codex.imagegen.save_failed": "Could not save the generated image.",
121
+ "codex.imagegen.usage": "Usage: /codex-imagegen <prompt>",
122
+ "codex.imagegen.generating": "Generating image with Codex OAuth...",
123
+ "codex.imagegen.saved": "Generated image saved to {path}",
124
+ "codex.logout.reload_failed": "ChatGPT logout: agent reload failed: {error}"
113
125
  }
@@ -311,6 +311,26 @@ def make_model_settings(
311
311
  )
312
312
  if "codex" not in model_name:
313
313
  model_settings_dict["openai_text_verbosity"] = get_openai_verbosity()
314
+
315
+ underlying_name = str(model_config.get("name", "")).lower()
316
+ is_gpt_5_6 = "gpt-5.6" in model_name.lower() or "gpt-5.6" in underlying_name
317
+ if is_gpt_5_6:
318
+ # pydantic-ai 1.56 does not expose context/mode settings yet,
319
+ # although the OpenAI SDK does. Supply the complete reasoning
320
+ # object through extra_body; a partial object would overwrite
321
+ # pydantic-ai's generated effort/summary payload.
322
+ reasoning = {
323
+ "effort": model_settings_dict.pop("openai_reasoning_effort"),
324
+ "summary": model_settings_dict.pop("openai_reasoning_summary"),
325
+ "context": effective_settings.get("reasoning_context", "all_turns"),
326
+ "mode": effective_settings.get("reasoning_mode", "standard"),
327
+ }
328
+ extra_body = dict(model_settings_dict.get("extra_body") or {})
329
+ extra_body["reasoning"] = reasoning
330
+ model_settings_dict["extra_body"] = extra_body
331
+ model_settings_dict.pop("reasoning_context", None)
332
+ model_settings_dict.pop("reasoning_mode", None)
333
+
314
334
  model_settings = OpenAIResponsesModelSettings(**model_settings_dict)
315
335
  else:
316
336
  # Chat Completions models don't support configurable reasoning summaries.
@@ -0,0 +1,44 @@
1
+ ---
2
+ name: codex-imagegen
3
+ description: Generate raster images with gpt-image-2 through Codex OAuth. Activate when the user asks to create a photo, illustration, icon, sprite, texture, product image, banner, or other raster artwork.
4
+ version: "1.0"
5
+ author: code-puppy
6
+ ---
7
+
8
+ # Codex Image Generation
9
+
10
+ Use the `codex_imagegen` tool when the user asks you to create raster artwork.
11
+ The tool uses `gpt-image-2` through the user's existing Codex OAuth session,
12
+ saves the resulting PNG, and displays it inline when iTerm2 supports doing so.
13
+
14
+ ## Decision rules
15
+
16
+ 1. Generate an image when creation of a photo, illustration, icon, sprite,
17
+ texture, product image, banner, concept art, or similar raster asset is an
18
+ explicit part of the user's request.
19
+ 2. Do not generate an image merely because one might decorate an otherwise
20
+ unrelated answer.
21
+ 3. Prefer ordinary code tools for diagrams that should remain editable as
22
+ source, such as Mermaid, SVG, charts, or HTML/CSS layouts.
23
+ 4. Before calling the tool, turn the user's request into a complete standalone
24
+ visual prompt. Include subject, composition, style, lighting, colors,
25
+ perspective, mood, and important exclusions when those details are known.
26
+ 5. Do not claim that generation succeeded until the tool returns `success: true`.
27
+ 6. Report the saved path after success. The image may already be visible inline,
28
+ so do not redundantly embed it unless the user asks.
29
+ 7. If authentication is missing, tell the user to run `/codex-auth`.
30
+
31
+ ## Tool
32
+
33
+ Call:
34
+
35
+ ```text
36
+ codex_imagegen(prompt="A complete standalone image prompt")
37
+ ```
38
+
39
+ The result contains:
40
+
41
+ - `success`: whether generation completed
42
+ - `path`: saved PNG path on success
43
+ - `displayed_inline`: whether iTerm2 inline display was attempted successfully
44
+ - `error`: safe failure text when generation fails
@@ -0,0 +1,161 @@
1
+ """Image generation through the ChatGPT Codex OAuth backend."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import base64
6
+ import binascii
7
+ import os
8
+ import sys
9
+ import uuid
10
+ from pathlib import Path
11
+ from typing import Any
12
+
13
+ import requests
14
+
15
+ from code_puppy import config
16
+ from code_puppy.i18n import t
17
+
18
+ from .config import CHATGPT_OAUTH_CONFIG
19
+ from .utils import get_valid_access_token, load_stored_tokens
20
+
21
+ _IMAGE_MODEL = "gpt-image-2"
22
+ _REQUEST_TIMEOUT_SECONDS = 180
23
+
24
+
25
+ class CodexImageGenerationError(RuntimeError):
26
+ """A safe, user-displayable image generation failure."""
27
+
28
+
29
+ def generate_image(prompt: str) -> Path:
30
+ """Generate one image with Codex OAuth and save it under Code Puppy data."""
31
+ normalized_prompt = prompt.strip()
32
+ if not normalized_prompt:
33
+ raise CodexImageGenerationError(t("codex.imagegen.prompt_required"))
34
+
35
+ access_token = get_valid_access_token()
36
+ tokens = load_stored_tokens() or {}
37
+ account_id = str(tokens.get("account_id", "")).strip()
38
+ if not access_token or not account_id:
39
+ raise CodexImageGenerationError(t("codex.imagegen.auth_required"))
40
+
41
+ response = _post_generation_request(access_token, account_id, normalized_prompt)
42
+ image_bytes = _decode_first_image(response)
43
+ return _save_image(image_bytes)
44
+
45
+
46
+ def _post_generation_request(
47
+ access_token: str, account_id: str, prompt: str
48
+ ) -> dict[str, Any]:
49
+ base_url = str(CHATGPT_OAUTH_CONFIG["api_base_url"]).rstrip("/")
50
+ headers = {
51
+ "Authorization": f"Bearer {access_token}",
52
+ "ChatGPT-Account-Id": account_id,
53
+ "Accept": "application/json",
54
+ "Content-Type": "application/json",
55
+ "originator": CHATGPT_OAUTH_CONFIG.get("originator", "codex_cli_rs"),
56
+ "User-Agent": (
57
+ f"{CHATGPT_OAUTH_CONFIG.get('originator', 'codex_cli_rs')}/"
58
+ f"{CHATGPT_OAUTH_CONFIG.get('client_version', 'unknown')}"
59
+ ),
60
+ }
61
+ payload = {
62
+ "prompt": prompt,
63
+ "background": "auto",
64
+ "model": _IMAGE_MODEL,
65
+ "quality": "auto",
66
+ "size": "auto",
67
+ }
68
+
69
+ try:
70
+ response = requests.post(
71
+ f"{base_url}/images/generations",
72
+ headers=headers,
73
+ json=payload,
74
+ timeout=_REQUEST_TIMEOUT_SECONDS,
75
+ )
76
+ response.raise_for_status()
77
+ body = response.json()
78
+ except requests.RequestException as exc:
79
+ detail = _response_error_detail(getattr(exc, "response", None))
80
+ suffix = f": {detail}" if detail else ""
81
+ raise CodexImageGenerationError(
82
+ t("codex.imagegen.request_failed", detail=suffix)
83
+ ) from exc
84
+ except ValueError as exc:
85
+ raise CodexImageGenerationError(t("codex.imagegen.invalid_json")) from exc
86
+
87
+ if not isinstance(body, dict):
88
+ raise CodexImageGenerationError(t("codex.imagegen.invalid_response"))
89
+ return body
90
+
91
+
92
+ def _response_error_detail(response: requests.Response | None) -> str:
93
+ if response is None:
94
+ return ""
95
+ try:
96
+ body = response.json()
97
+ except ValueError:
98
+ return response.text.strip()[:300]
99
+ if not isinstance(body, dict):
100
+ return ""
101
+ error = body.get("error")
102
+ if isinstance(error, dict):
103
+ return str(error.get("message", ""))[:300]
104
+ return str(error or body.get("detail", ""))[:300]
105
+
106
+
107
+ def _decode_first_image(body: dict[str, Any]) -> bytes:
108
+ data = body.get("data")
109
+ encoded = data[0].get("b64_json") if isinstance(data, list) and data else None
110
+ if not isinstance(encoded, str) or not encoded:
111
+ raise CodexImageGenerationError(t("codex.imagegen.no_data"))
112
+ try:
113
+ return base64.b64decode(encoded, validate=True)
114
+ except (binascii.Error, ValueError) as exc:
115
+ raise CodexImageGenerationError(t("codex.imagegen.malformed_data")) from exc
116
+
117
+
118
+ def emit_iterm_image(output_path: Path) -> bool:
119
+ """Display a saved image with iTerm2's OSC 1337 inline-image protocol."""
120
+ if not _is_iterm2() or not sys.stdout.isatty():
121
+ return False
122
+
123
+ try:
124
+ image_data = base64.b64encode(output_path.read_bytes()).decode("ascii")
125
+ encoded_name = base64.b64encode(output_path.name.encode()).decode("ascii")
126
+ sequence = (
127
+ f"\033]1337;File=name={encoded_name};inline=1;"
128
+ f"preserveAspectRatio=1:{image_data}\a\n"
129
+ )
130
+ from code_puppy.messaging.run_ui import suspended_run_ui
131
+
132
+ with suspended_run_ui():
133
+ sys.stdout.write(sequence)
134
+ sys.stdout.flush()
135
+ except Exception:
136
+ # Inline display is best-effort; the image remains safely saved even if
137
+ # terminal detection lied or the active UI cannot be suspended.
138
+ return False
139
+ return True
140
+
141
+
142
+ def _is_iterm2() -> bool:
143
+ return bool(
144
+ os.environ.get("ITERM_SESSION_ID")
145
+ or os.environ.get("TERM_PROGRAM", "").lower() == "iterm.app"
146
+ )
147
+
148
+
149
+ def _save_image(image_bytes: bytes) -> Path:
150
+ output_dir = Path(config.DATA_DIR) / "generated_images"
151
+ output_dir.mkdir(parents=True, exist_ok=True, mode=0o700)
152
+ output_path = output_dir / f"codex-{uuid.uuid4().hex}.png"
153
+ temporary_path = output_path.with_suffix(".tmp")
154
+ try:
155
+ temporary_path.write_bytes(image_bytes)
156
+ os.chmod(temporary_path, 0o600)
157
+ temporary_path.replace(output_path)
158
+ except OSError as exc:
159
+ temporary_path.unlink(missing_ok=True)
160
+ raise CodexImageGenerationError(t("codex.imagegen.save_failed")) from exc
161
+ return output_path
@@ -0,0 +1,50 @@
1
+ """Agent-facing Codex OAuth image-generation tool."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ from typing import Any
7
+
8
+ from pydantic_ai import RunContext
9
+
10
+ from .image_generation import (
11
+ CodexImageGenerationError,
12
+ emit_iterm_image,
13
+ generate_image,
14
+ )
15
+
16
+ TOOL_NAME = "codex_imagegen"
17
+
18
+
19
+ def register_codex_imagegen(agent: Any) -> None:
20
+ """Register image generation on a pydantic-ai agent."""
21
+
22
+ @agent.tool
23
+ async def codex_imagegen(context: RunContext, prompt: str) -> dict[str, Any]:
24
+ """Generate a raster image using gpt-image-2 and Codex OAuth.
25
+
26
+ Use this when the user asks you to create a photo, illustration, icon,
27
+ sprite, texture, product image, banner, or other raster artwork. Write a
28
+ complete standalone visual prompt because the image model does not see
29
+ the conversation. The PNG is saved automatically and displayed inline
30
+ in iTerm2 when supported.
31
+
32
+ Args:
33
+ prompt: Detailed standalone description of the image to generate.
34
+ """
35
+ del context
36
+ try:
37
+ output_path = await asyncio.to_thread(generate_image, prompt)
38
+ except CodexImageGenerationError as exc:
39
+ return {"success": False, "error": str(exc)}
40
+
41
+ displayed_inline = emit_iterm_image(output_path)
42
+ return {
43
+ "success": True,
44
+ "path": str(output_path),
45
+ "displayed_inline": displayed_inline,
46
+ }
47
+
48
+
49
+ def register_tools_callback() -> list[dict[str, Any]]:
50
+ return [{"name": TOOL_NAME, "register_func": register_codex_imagegen}]
@@ -7,10 +7,12 @@ the 'chatgpt_oauth' model type handler.
7
7
  from __future__ import annotations
8
8
 
9
9
  import os
10
+ from pathlib import Path
10
11
  from typing import Any, Dict, List, Optional, Tuple
11
12
 
12
13
  from code_puppy.callbacks import register_callback
13
- from code_puppy.messaging import emit_info, emit_success, emit_warning
14
+ from code_puppy.i18n import t
15
+ from code_puppy.messaging import emit_error, emit_info, emit_success, emit_warning
14
16
  from code_puppy.model_switching import set_model_and_reload_agent
15
17
 
16
18
  from .config import CHATGPT_OAUTH_CONFIG, get_token_storage_path
@@ -38,6 +40,7 @@ def _custom_help() -> List[Tuple[str, str]]:
38
40
  ("codex-status", "Alias for /chatgpt-status"),
39
41
  ("chatgpt-logout", "Remove ChatGPT OAuth tokens and imported models"),
40
42
  ("codex-logout", "Alias for /chatgpt-logout"),
43
+ ("codex-imagegen <prompt>", "Generate an image with Codex OAuth"),
41
44
  ]
42
45
 
43
46
 
@@ -68,6 +71,8 @@ def _handle_chatgpt_status() -> None:
68
71
 
69
72
 
70
73
  def _handle_chatgpt_logout() -> None:
74
+ was_authenticated = _is_codex_oauth_authenticated()
75
+
71
76
  token_path = get_token_storage_path()
72
77
  if token_path.exists():
73
78
  token_path.unlink()
@@ -82,6 +87,36 @@ def _handle_chatgpt_logout() -> None:
82
87
 
83
88
  emit_success("ChatGPT logout complete")
84
89
 
90
+ if was_authenticated:
91
+ _reload_active_agent()
92
+
93
+
94
+ def _is_codex_oauth_authenticated() -> bool:
95
+ """Whether Codex OAuth tokens are present on disk."""
96
+ tokens = load_stored_tokens()
97
+ return bool(tokens and tokens.get("access_token") and tokens.get("account_id"))
98
+
99
+
100
+ def _reload_active_agent() -> None:
101
+ """Reload the active agent so tool advertisement changes take effect."""
102
+ from code_puppy.agents import get_current_agent
103
+
104
+ try:
105
+ current_agent = get_current_agent()
106
+ except Exception:
107
+ return
108
+ if current_agent is None:
109
+ return
110
+ try:
111
+ if hasattr(current_agent, "refresh_config"):
112
+ try:
113
+ current_agent.refresh_config()
114
+ except Exception:
115
+ pass
116
+ current_agent.reload_code_generation_agent()
117
+ except Exception as exc:
118
+ emit_warning(t("codex.logout.reload_failed", error=str(exc)))
119
+
85
120
 
86
121
  def _handle_custom_command(command: str, name: str) -> Optional[bool]:
87
122
  if not name:
@@ -100,6 +135,27 @@ def _handle_custom_command(command: str, name: str) -> Optional[bool]:
100
135
  _handle_chatgpt_logout()
101
136
  return True
102
137
 
138
+ if name == "codex-imagegen":
139
+ from .image_generation import (
140
+ CodexImageGenerationError,
141
+ emit_iterm_image,
142
+ generate_image,
143
+ )
144
+
145
+ _, _, prompt = command.partition(" ")
146
+ if not prompt.strip():
147
+ emit_warning(t("codex.imagegen.usage"))
148
+ return True
149
+ emit_info(t("codex.imagegen.generating"))
150
+ try:
151
+ output_path = generate_image(prompt)
152
+ except CodexImageGenerationError as exc:
153
+ emit_error(str(exc))
154
+ else:
155
+ emit_success(t("codex.imagegen.saved", path=str(output_path)))
156
+ emit_iterm_image(output_path)
157
+ return True
158
+
103
159
  return None
104
160
 
105
161
 
@@ -171,6 +227,28 @@ def _create_chatgpt_oauth_model(
171
227
  return OpenAIResponsesModel(model_name=model_config["name"], provider=provider)
172
228
 
173
229
 
230
+ def _register_imagegen_skill() -> list[dict[str, str]]:
231
+ return [
232
+ {
233
+ "name": "codex-imagegen",
234
+ "skill_md_path": str(Path(__file__).with_name("IMAGEGEN_SKILL.md")),
235
+ }
236
+ ]
237
+
238
+
239
+ def _register_imagegen_tools() -> list[dict[str, Any]]:
240
+ from .image_tool import register_tools_callback
241
+
242
+ return register_tools_callback()
243
+
244
+
245
+ def _advertise_imagegen_tool(agent_name: str | None = None) -> list[str]:
246
+ del agent_name
247
+ if not _is_codex_oauth_authenticated():
248
+ return []
249
+ return ["codex_imagegen"]
250
+
251
+
174
252
  def _register_model_types() -> List[Dict[str, Any]]:
175
253
  """Register the chatgpt_oauth model type handler."""
176
254
  return [{"type": "chatgpt_oauth", "handler": _create_chatgpt_oauth_model}]
@@ -192,4 +270,7 @@ def _refresh_usage_on_agent_run(
192
270
  register_callback("custom_command_help", _custom_help)
193
271
  register_callback("custom_command", _handle_custom_command)
194
272
  register_callback("register_model_type", _register_model_types)
273
+ register_callback("register_skills", _register_imagegen_skill)
274
+ register_callback("register_tools", _register_imagegen_tools)
275
+ register_callback("register_agent_tools", _advertise_imagegen_tool)
195
276
  register_callback("agent_run_start", _refresh_usage_on_agent_run)