code-puppy 0.0.323__tar.gz → 0.0.361__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 (222) hide show
  1. {code_puppy-0.0.323 → code_puppy-0.0.361}/.gitignore +1 -0
  2. {code_puppy-0.0.323 → code_puppy-0.0.361}/PKG-INFO +37 -58
  3. {code_puppy-0.0.323 → code_puppy-0.0.361}/README.md +31 -55
  4. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/agents/__init__.py +2 -0
  5. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/agents/agent_manager.py +49 -0
  6. code_puppy-0.0.361/code_puppy/agents/agent_pack_leader.py +383 -0
  7. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/agents/agent_qa_kitten.py +12 -7
  8. code_puppy-0.0.361/code_puppy/agents/agent_terminal_qa.py +323 -0
  9. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/agents/base_agent.py +74 -263
  10. code_puppy-0.0.361/code_puppy/agents/event_stream_handler.py +350 -0
  11. code_puppy-0.0.361/code_puppy/agents/pack/__init__.py +34 -0
  12. code_puppy-0.0.361/code_puppy/agents/pack/bloodhound.py +304 -0
  13. code_puppy-0.0.361/code_puppy/agents/pack/husky.py +321 -0
  14. code_puppy-0.0.361/code_puppy/agents/pack/retriever.py +393 -0
  15. code_puppy-0.0.361/code_puppy/agents/pack/shepherd.py +348 -0
  16. code_puppy-0.0.361/code_puppy/agents/pack/terrier.py +287 -0
  17. code_puppy-0.0.361/code_puppy/agents/pack/watchdog.py +367 -0
  18. code_puppy-0.0.361/code_puppy/agents/subagent_stream_handler.py +276 -0
  19. code_puppy-0.0.361/code_puppy/api/__init__.py +13 -0
  20. code_puppy-0.0.361/code_puppy/api/app.py +169 -0
  21. code_puppy-0.0.361/code_puppy/api/main.py +21 -0
  22. code_puppy-0.0.361/code_puppy/api/pty_manager.py +446 -0
  23. code_puppy-0.0.361/code_puppy/api/routers/__init__.py +12 -0
  24. code_puppy-0.0.361/code_puppy/api/routers/agents.py +36 -0
  25. code_puppy-0.0.361/code_puppy/api/routers/commands.py +217 -0
  26. code_puppy-0.0.361/code_puppy/api/routers/config.py +74 -0
  27. code_puppy-0.0.361/code_puppy/api/routers/sessions.py +232 -0
  28. code_puppy-0.0.361/code_puppy/api/templates/terminal.html +361 -0
  29. code_puppy-0.0.361/code_puppy/api/websocket.py +154 -0
  30. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/callbacks.py +73 -0
  31. code_puppy-0.0.361/code_puppy/claude_cache_client.py +586 -0
  32. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/cli_runner.py +156 -35
  33. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/add_model_menu.py +23 -9
  34. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/autosave_menu.py +23 -24
  35. code_puppy-0.0.361/code_puppy/command_line/clipboard.py +527 -0
  36. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/colors_menu.py +5 -0
  37. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/config_commands.py +24 -1
  38. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/core_commands.py +170 -0
  39. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/diff_menu.py +5 -0
  40. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/mcp/catalog_server_installer.py +5 -6
  41. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/mcp/custom_server_form.py +58 -19
  42. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/mcp/custom_server_installer.py +8 -9
  43. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/mcp/handler.py +0 -2
  44. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/mcp/help_command.py +1 -5
  45. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/mcp/install_menu.py +5 -1
  46. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/mcp/start_command.py +36 -18
  47. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/model_settings_menu.py +5 -0
  48. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/motd.py +13 -7
  49. code_puppy-0.0.361/code_puppy/command_line/onboarding_slides.py +179 -0
  50. code_puppy-0.0.361/code_puppy/command_line/onboarding_wizard.py +340 -0
  51. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/prompt_toolkit_completion.py +124 -0
  52. code_puppy-0.0.361/code_puppy/command_line/utils.py +93 -0
  53. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/config.py +69 -64
  54. code_puppy-0.0.361/code_puppy/http_utils.py +338 -0
  55. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/keymap.py +10 -8
  56. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/mcp_/async_lifecycle.py +35 -4
  57. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/mcp_/managed_server.py +49 -24
  58. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/mcp_/manager.py +81 -52
  59. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/messaging/__init__.py +15 -0
  60. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/messaging/message_queue.py +11 -23
  61. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/messaging/messages.py +30 -0
  62. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/messaging/queue_console.py +1 -1
  63. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/messaging/rich_renderer.py +150 -23
  64. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/messaging/spinner/__init__.py +20 -2
  65. code_puppy-0.0.361/code_puppy/messaging/subagent_console.py +461 -0
  66. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/model_factory.py +102 -15
  67. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/model_utils.py +54 -0
  68. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/models.json +4 -4
  69. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/plugins/__init__.py +12 -0
  70. code_puppy-0.0.361/code_puppy/plugins/antigravity_oauth/__init__.py +10 -0
  71. code_puppy-0.0.361/code_puppy/plugins/antigravity_oauth/accounts.py +406 -0
  72. code_puppy-0.0.361/code_puppy/plugins/antigravity_oauth/antigravity_model.py +739 -0
  73. code_puppy-0.0.361/code_puppy/plugins/antigravity_oauth/config.py +42 -0
  74. code_puppy-0.0.361/code_puppy/plugins/antigravity_oauth/constants.py +136 -0
  75. code_puppy-0.0.361/code_puppy/plugins/antigravity_oauth/oauth.py +478 -0
  76. code_puppy-0.0.361/code_puppy/plugins/antigravity_oauth/register_callbacks.py +406 -0
  77. code_puppy-0.0.361/code_puppy/plugins/antigravity_oauth/storage.py +271 -0
  78. code_puppy-0.0.361/code_puppy/plugins/antigravity_oauth/test_plugin.py +319 -0
  79. code_puppy-0.0.361/code_puppy/plugins/antigravity_oauth/token.py +167 -0
  80. code_puppy-0.0.361/code_puppy/plugins/antigravity_oauth/transport.py +665 -0
  81. code_puppy-0.0.361/code_puppy/plugins/antigravity_oauth/utils.py +169 -0
  82. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/plugins/chatgpt_oauth/register_callbacks.py +2 -0
  83. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/plugins/claude_code_oauth/register_callbacks.py +2 -0
  84. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/plugins/claude_code_oauth/utils.py +126 -7
  85. code_puppy-0.0.361/code_puppy/plugins/frontend_emitter/__init__.py +25 -0
  86. code_puppy-0.0.361/code_puppy/plugins/frontend_emitter/emitter.py +121 -0
  87. code_puppy-0.0.361/code_puppy/plugins/frontend_emitter/register_callbacks.py +261 -0
  88. code_puppy-0.0.361/code_puppy/prompts/antigravity_system_prompt.md +1 -0
  89. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/reopenable_async_client.py +8 -8
  90. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/status_display.py +6 -2
  91. code_puppy-0.0.361/code_puppy/terminal_utils.py +418 -0
  92. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/tools/__init__.py +37 -1
  93. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/tools/agent_tools.py +139 -36
  94. code_puppy-0.0.361/code_puppy/tools/browser/__init__.py +37 -0
  95. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/tools/browser/browser_control.py +6 -6
  96. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/tools/browser/browser_interactions.py +21 -20
  97. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/tools/browser/browser_locators.py +9 -9
  98. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/tools/browser/browser_navigation.py +7 -7
  99. code_puppy-0.0.361/code_puppy/tools/browser/browser_screenshot.py +179 -0
  100. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/tools/browser/browser_scripts.py +15 -13
  101. code_puppy-0.0.361/code_puppy/tools/browser/camoufox_manager.py +397 -0
  102. code_puppy-0.0.361/code_puppy/tools/browser/chromium_terminal_manager.py +259 -0
  103. code_puppy-0.0.361/code_puppy/tools/browser/terminal_command_tools.py +521 -0
  104. code_puppy-0.0.361/code_puppy/tools/browser/terminal_screenshot_tools.py +556 -0
  105. code_puppy-0.0.361/code_puppy/tools/browser/terminal_tools.py +525 -0
  106. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/tools/command_runner.py +335 -155
  107. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/tools/common.py +179 -10
  108. code_puppy-0.0.361/code_puppy/tools/display.py +84 -0
  109. code_puppy-0.0.361/code_puppy/tools/subagent_context.py +158 -0
  110. code_puppy-0.0.361/code_puppy/uvx_detection.py +242 -0
  111. {code_puppy-0.0.323 → code_puppy-0.0.361}/pyproject.toml +6 -3
  112. code_puppy-0.0.323/code_puppy/claude_cache_client.py +0 -165
  113. code_puppy-0.0.323/code_puppy/command_line/mcp/add_command.py +0 -170
  114. code_puppy-0.0.323/code_puppy/command_line/utils.py +0 -39
  115. code_puppy-0.0.323/code_puppy/http_utils.py +0 -416
  116. code_puppy-0.0.323/code_puppy/terminal_utils.py +0 -126
  117. code_puppy-0.0.323/code_puppy/tools/browser/__init__.py +0 -0
  118. code_puppy-0.0.323/code_puppy/tools/browser/browser_screenshot.py +0 -241
  119. code_puppy-0.0.323/code_puppy/tools/browser/camoufox_manager.py +0 -235
  120. code_puppy-0.0.323/code_puppy/tools/browser/vqa_agent.py +0 -90
  121. {code_puppy-0.0.323 → code_puppy-0.0.361}/LICENSE +0 -0
  122. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/__init__.py +0 -0
  123. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/__main__.py +0 -0
  124. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/agents/agent_c_reviewer.py +0 -0
  125. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/agents/agent_code_puppy.py +0 -0
  126. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/agents/agent_code_reviewer.py +0 -0
  127. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/agents/agent_cpp_reviewer.py +0 -0
  128. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/agents/agent_creator_agent.py +0 -0
  129. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/agents/agent_golang_reviewer.py +0 -0
  130. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/agents/agent_javascript_reviewer.py +0 -0
  131. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/agents/agent_planning.py +0 -0
  132. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/agents/agent_python_programmer.py +0 -0
  133. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/agents/agent_python_reviewer.py +0 -0
  134. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/agents/agent_qa_expert.py +0 -0
  135. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/agents/agent_security_auditor.py +0 -0
  136. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/agents/agent_typescript_reviewer.py +0 -0
  137. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/agents/json_agent.py +0 -0
  138. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/agents/prompt_reviewer.py +0 -0
  139. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/chatgpt_codex_client.py +0 -0
  140. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/__init__.py +0 -0
  141. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/attachments.py +0 -0
  142. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/command_handler.py +0 -0
  143. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/command_registry.py +0 -0
  144. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/file_path_completion.py +0 -0
  145. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/load_context_completion.py +0 -0
  146. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/mcp/__init__.py +0 -0
  147. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/mcp/base.py +0 -0
  148. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/mcp/edit_command.py +0 -0
  149. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/mcp/install_command.py +0 -0
  150. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/mcp/list_command.py +0 -0
  151. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/mcp/logs_command.py +0 -0
  152. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/mcp/remove_command.py +0 -0
  153. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/mcp/restart_command.py +0 -0
  154. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/mcp/search_command.py +0 -0
  155. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/mcp/start_all_command.py +0 -0
  156. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/mcp/status_command.py +0 -0
  157. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/mcp/stop_all_command.py +0 -0
  158. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/mcp/stop_command.py +0 -0
  159. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/mcp/test_command.py +0 -0
  160. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/mcp/utils.py +0 -0
  161. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/mcp/wizard_utils.py +0 -0
  162. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/mcp_completion.py +0 -0
  163. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/model_picker_completion.py +0 -0
  164. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/pin_command_completion.py +0 -0
  165. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/command_line/session_commands.py +0 -0
  166. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/error_logging.py +0 -0
  167. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/gemini_code_assist.py +0 -0
  168. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/main.py +0 -0
  169. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/mcp_/__init__.py +0 -0
  170. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/mcp_/blocking_startup.py +0 -0
  171. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/mcp_/captured_stdio_server.py +0 -0
  172. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/mcp_/circuit_breaker.py +0 -0
  173. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/mcp_/config_wizard.py +0 -0
  174. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/mcp_/dashboard.py +0 -0
  175. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/mcp_/error_isolation.py +0 -0
  176. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/mcp_/examples/retry_example.py +0 -0
  177. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/mcp_/health_monitor.py +0 -0
  178. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/mcp_/mcp_logs.py +0 -0
  179. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/mcp_/registry.py +0 -0
  180. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/mcp_/retry_manager.py +0 -0
  181. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/mcp_/server_registry_catalog.py +0 -0
  182. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/mcp_/status_tracker.py +0 -0
  183. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/mcp_/system_tools.py +0 -0
  184. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/messaging/bus.py +0 -0
  185. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/messaging/commands.py +0 -0
  186. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/messaging/markdown_patches.py +0 -0
  187. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/messaging/renderers.py +0 -0
  188. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/messaging/spinner/console_spinner.py +0 -0
  189. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/messaging/spinner/spinner_base.py +0 -0
  190. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/models_dev_api.json +0 -0
  191. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/models_dev_parser.py +0 -0
  192. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/plugins/chatgpt_oauth/__init__.py +0 -0
  193. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/plugins/chatgpt_oauth/config.py +0 -0
  194. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/plugins/chatgpt_oauth/oauth_flow.py +0 -0
  195. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/plugins/chatgpt_oauth/test_plugin.py +0 -0
  196. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/plugins/chatgpt_oauth/utils.py +0 -0
  197. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/plugins/claude_code_oauth/README.md +0 -0
  198. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/plugins/claude_code_oauth/SETUP.md +0 -0
  199. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/plugins/claude_code_oauth/__init__.py +0 -0
  200. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/plugins/claude_code_oauth/config.py +0 -0
  201. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/plugins/claude_code_oauth/test_plugin.py +0 -0
  202. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/plugins/customizable_commands/__init__.py +0 -0
  203. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/plugins/customizable_commands/register_callbacks.py +0 -0
  204. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/plugins/example_custom_command/README.md +0 -0
  205. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/plugins/example_custom_command/register_callbacks.py +0 -0
  206. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/plugins/file_permission_handler/__init__.py +0 -0
  207. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/plugins/file_permission_handler/register_callbacks.py +0 -0
  208. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/plugins/oauth_puppy_html.py +0 -0
  209. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/plugins/shell_safety/__init__.py +0 -0
  210. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/plugins/shell_safety/agent_shell_safety.py +0 -0
  211. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/plugins/shell_safety/command_cache.py +0 -0
  212. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/plugins/shell_safety/register_callbacks.py +0 -0
  213. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/prompts/codex_system_prompt.md +0 -0
  214. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/pydantic_patches.py +0 -0
  215. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/round_robin_model.py +0 -0
  216. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/session_storage.py +0 -0
  217. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/summarization_agent.py +0 -0
  218. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/tools/browser/browser_workflows.py +0 -0
  219. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/tools/file_modifications.py +0 -0
  220. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/tools/file_operations.py +0 -0
  221. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/tools/tools_content.py +0 -0
  222. {code_puppy-0.0.323 → code_puppy-0.0.361}/code_puppy/version_checker.py +0 -0
@@ -24,3 +24,4 @@ dummy_path
24
24
  .DS_Store
25
25
  .env
26
26
  .serena/
27
+ .beads/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: code-puppy
3
- Version: 0.0.323
3
+ Version: 0.0.361
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
@@ -17,11 +17,12 @@ Classifier: Topic :: Software Development :: Code Generators
17
17
  Requires-Python: <3.14,>=3.11
18
18
  Requires-Dist: camoufox>=0.4.11
19
19
  Requires-Dist: dbos>=2.5.0
20
- Requires-Dist: fastapi>=0.111.0
20
+ Requires-Dist: fastapi>=0.109.0
21
21
  Requires-Dist: httpx[http2]>=0.24.1
22
22
  Requires-Dist: json-repair>=0.46.2
23
23
  Requires-Dist: logfire>=0.7.1
24
24
  Requires-Dist: openai>=1.99.1
25
+ Requires-Dist: pillow>=10.0.0
25
26
  Requires-Dist: playwright>=1.40.0
26
27
  Requires-Dist: prompt-toolkit>=3.0.52
27
28
  Requires-Dist: pydantic-ai==1.25.0
@@ -34,7 +35,9 @@ Requires-Dist: rich>=13.4.2
34
35
  Requires-Dist: ripgrep==14.1.0
35
36
  Requires-Dist: ruff>=0.11.11
36
37
  Requires-Dist: tenacity>=8.2.0
37
- Requires-Dist: uvicorn>=0.30.0
38
+ Requires-Dist: termflow-md>=0.1.8
39
+ Requires-Dist: uvicorn[standard]>=0.27.0
40
+ Requires-Dist: websockets>=12.0
38
41
  Description-Content-Type: text/markdown
39
42
 
40
43
  <div align="center">
@@ -44,20 +47,18 @@ Description-Content-Type: text/markdown
44
47
  **🐶✨The sassy AI code agent that makes IDEs look outdated** ✨🐶
45
48
 
46
49
  [![Version](https://img.shields.io/pypi/v/code-puppy?style=for-the-badge&logo=python&label=Version&color=purple)](https://pypi.org/project/code-puppy/)
47
- [![Downloads](https://img.shields.io/badge/Downloads-100k%2B-brightgreen?style=for-the-badge&logo=download)](https://pypi.org/project/code-puppy/)
50
+ [![Downloads](https://img.shields.io/badge/Downloads-170k%2B-brightgreen?style=for-the-badge&logo=download)](https://pypi.org/project/code-puppy/)
48
51
  [![Python](https://img.shields.io/badge/Python-3.11%2B-blue?style=for-the-badge&logo=python&logoColor=white)](https://python.org)
49
52
  [![License](https://img.shields.io/badge/License-MIT-green?style=for-the-badge)](LICENSE)
50
53
  [![Build Status](https://img.shields.io/badge/Build-Passing-brightgreen?style=for-the-badge&logo=github)](https://github.com/mpfaffenberger/code_puppy/actions)
51
- [![Coverage](https://img.shields.io/badge/Coverage-95%25-brightgreen?style=for-the-badge)](https://github.com/mpfaffenberger/code_puppy)
52
- [![Code Style](https://img.shields.io/badge/Code%20Style-Black-black?style=for-the-badge)](https://github.com/psf/black)
53
54
  [![Tests](https://img.shields.io/badge/Tests-Passing-success?style=for-the-badge&logo=pytest)](https://github.com/mpfaffenberger/code_puppy/tests)
54
55
 
55
- [![OpenAI](https://img.shields.io/badge/OpenAI-GPT--5-orange?style=flat-square&logo=openai)](https://openai.com)
56
+ [![OpenAI](https://img.shields.io/badge/OpenAI-GPT--5.2--Codex-orange?style=flat-square&logo=openai)](https://openai.com)
56
57
  [![Gemini](https://img.shields.io/badge/Google-Gemini-blue?style=flat-square&logo=google)](https://ai.google.dev/)
57
58
  [![Anthropic](https://img.shields.io/badge/Anthropic-Claude-orange?style=flat-square&logo=anthropic)](https://anthropic.com)
58
- [![Cerebras](https://img.shields.io/badge/Cerebras-GLM%204.6-red?style=flat-square)](https://cerebras.ai)
59
- [![Z.AI](https://img.shields.io/badge/Z.AI-GLM%204.6-purple?style=flat-square)](https://z.ai/)
60
- [![Synthetic](https://img.shields.io/badge/Synthetic-MINIMAX_M2-green?style=flat-square)](https://synthetic.new)
59
+ [![Cerebras](https://img.shields.io/badge/Cerebras-GLM%204.7-red?style=flat-square)](https://cerebras.ai)
60
+ [![Z.AI](https://img.shields.io/badge/Z.AI-GLM%204.7-purple?style=flat-square)](https://z.ai/)
61
+ [![Synthetic](https://img.shields.io/badge/Synthetic-MINIMAX_M2.1-green?style=flat-square)](https://synthetic.new)
61
62
 
62
63
  [![100% Open Source](https://img.shields.io/badge/100%25-Open%20Source-blue?style=for-the-badge)](https://github.com/mpfaffenberger/code_puppy)
63
64
  [![Pydantic AI](https://img.shields.io/badge/Pydantic-AI-success?style=for-the-badge)](https://github.com/pydantic/pydantic-ai)
@@ -67,6 +68,9 @@ Description-Content-Type: text/markdown
67
68
  [![GitHub stars](https://img.shields.io/github/stars/mpfaffenberger/code_puppy?style=for-the-badge&logo=github)](https://github.com/mpfaffenberger/code_puppy/stargazers)
68
69
  [![GitHub forks](https://img.shields.io/github/forks/mpfaffenberger/code_puppy?style=for-the-badge&logo=github)](https://github.com/mpfaffenberger/code_puppy/network)
69
70
 
71
+ [![Discord](https://img.shields.io/badge/Discord-Community-purple?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/SqYAaXVy)
72
+ [![Docs](https://img.shields.io/badge/Read-The%20Docs-blue?style=for-the-badge&logo=readthedocs)](https://code-puppy.dev)
73
+
70
74
  **[⭐ Star this repo if you hate expensive IDEs! ⭐](#quick-start)**
71
75
 
72
76
  *"Who needs an IDE when you have 1024 angry puppies?"* - Someone, probably.
@@ -100,66 +104,32 @@ uvx code-puppy -i
100
104
 
101
105
  ### UV (Recommended)
102
106
 
107
+ #### macOS / Linux
108
+
103
109
  ```bash
104
110
  # Install UV if you don't have it
105
111
  curl -LsSf https://astral.sh/uv/install.sh | sh
106
112
 
107
- # Set UV to always use managed Python (one-time setup)
108
- echo 'export UV_MANAGED_PYTHON=1' >> ~/.zshrc # or ~/.bashrc
109
- source ~/.zshrc # or ~/.bashrc
110
-
111
- # Install and run code-puppy
112
- uvx code-puppy -i
113
+ uvx code-puppy
113
114
  ```
114
115
 
115
- UV will automatically download the latest compatible Python version (3.11+) if your system doesn't have one.
116
+ #### Windows
116
117
 
117
- ### pip (Alternative)
118
+ On Windows, we recommend installing code-puppy as a global tool for the best experience with keyboard shortcuts (Ctrl+C/Ctrl+X cancellation):
118
119
 
119
- ```bash
120
- pip install code-puppy
121
- ```
122
-
123
- *Note: pip installation requires your system Python to be 3.11 or newer.*
124
-
125
- ### Permanent Python Management
126
-
127
- To make UV always use managed Python versions (recommended):
128
-
129
- ```bash
130
- # Set environment variable permanently
131
- echo 'export UV_MANAGED_PYTHON=1' >> ~/.zshrc # or ~/.bashrc
132
- source ~/.zshrc # or ~/.bashrc
120
+ ```powershell
121
+ # Install UV if you don't have it (run in PowerShell as Admin)
122
+ powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
133
123
 
134
- # Now all UV commands will prefer managed Python installations
135
- uvx code-puppy # No need for --managed-python flag anymore
124
+ uvx code-puppy
136
125
  ```
137
126
 
138
- ### Verifying Python Version
127
+ ## Changelog (By Kittylog!)
139
128
 
140
- ```bash
141
- # Check which Python UV will use
142
- uv python find
143
-
144
- # Or check the current project's Python
145
- uv run python --version
146
- ```
129
+ [📋 View the full changelog on Kittylog](https://kittylog.app/c/mpfaffenberger/code_puppy)
147
130
 
148
131
  ## Usage
149
132
 
150
- ### Custom Commands
151
- Create markdown files in `.claude/commands/`, `.github/prompts/`, or `.agents/commands/` to define custom slash commands. The filename becomes the command name and the content runs as a prompt.
152
-
153
- ```bash
154
- # Create a custom command
155
- echo "# Code Review
156
-
157
- Please review this code for security issues." > .claude/commands/review.md
158
-
159
- # Use it in Code Puppy
160
- /review with focus on authentication
161
- ```
162
-
163
133
  ### Adding Models from models.dev 🆕
164
134
 
165
135
  While there are several models configured right out of the box from providers like Synthetic, Cerebras, OpenAI, Google, and Anthropic, Code Puppy integrates with [models.dev](https://models.dev) to let you browse and add models from **65+ providers** with a single command:
@@ -227,6 +197,18 @@ The following environment variables control DBOS behavior:
227
197
  - `DBOS_SYSTEM_DATABASE_URL`: Database URL used by DBOS. Can point to a local SQLite file or a Postgres instance. Example: `postgresql://postgres:dbos@localhost:5432/postgres`. Default: `dbos_store.sqlite` file in the config directory.
228
198
  - `DBOS_APP_VERSION`: If set, Code Puppy uses it as the [DBOS application version](https://docs.dbos.dev/architecture#application-and-workflow-versions) and automatically tries to recover pending workflows for this version. Default: Code Puppy version + Unix timestamp in millisecond (disable automatic recovery).
229
199
 
200
+ ### Custom Commands
201
+ Create markdown files in `.claude/commands/`, `.github/prompts/`, or `.agents/commands/` to define custom slash commands. The filename becomes the command name and the content runs as a prompt.
202
+
203
+ ```bash
204
+ # Create a custom command
205
+ echo "# Code Review
206
+
207
+ Please review this code for security issues." > .claude/commands/review.md
208
+
209
+ # Use it in Code Puppy
210
+ /review with focus on authentication
211
+ ```
230
212
 
231
213
  ## Requirements
232
214
 
@@ -246,9 +228,6 @@ For examples and more information about agent rules, visit [https://agent.md](ht
246
228
 
247
229
  Use the `/mcp` command to manage MCP (list, start, stop, status, etc.)
248
230
 
249
- Watch this video for examples! https://www.youtube.com/watch?v=1t1zEetOqlo
250
-
251
-
252
231
  ## Round Robin Model Distribution
253
232
 
254
233
  Code Puppy supports **Round Robin model distribution** to help you overcome rate limits and distribute load across multiple AI models. This feature automatically cycles through configured models with each request, maximizing your API usage while staying within rate limits.
@@ -5,20 +5,18 @@
5
5
  **🐶✨The sassy AI code agent that makes IDEs look outdated** ✨🐶
6
6
 
7
7
  [![Version](https://img.shields.io/pypi/v/code-puppy?style=for-the-badge&logo=python&label=Version&color=purple)](https://pypi.org/project/code-puppy/)
8
- [![Downloads](https://img.shields.io/badge/Downloads-100k%2B-brightgreen?style=for-the-badge&logo=download)](https://pypi.org/project/code-puppy/)
8
+ [![Downloads](https://img.shields.io/badge/Downloads-170k%2B-brightgreen?style=for-the-badge&logo=download)](https://pypi.org/project/code-puppy/)
9
9
  [![Python](https://img.shields.io/badge/Python-3.11%2B-blue?style=for-the-badge&logo=python&logoColor=white)](https://python.org)
10
10
  [![License](https://img.shields.io/badge/License-MIT-green?style=for-the-badge)](LICENSE)
11
11
  [![Build Status](https://img.shields.io/badge/Build-Passing-brightgreen?style=for-the-badge&logo=github)](https://github.com/mpfaffenberger/code_puppy/actions)
12
- [![Coverage](https://img.shields.io/badge/Coverage-95%25-brightgreen?style=for-the-badge)](https://github.com/mpfaffenberger/code_puppy)
13
- [![Code Style](https://img.shields.io/badge/Code%20Style-Black-black?style=for-the-badge)](https://github.com/psf/black)
14
12
  [![Tests](https://img.shields.io/badge/Tests-Passing-success?style=for-the-badge&logo=pytest)](https://github.com/mpfaffenberger/code_puppy/tests)
15
13
 
16
- [![OpenAI](https://img.shields.io/badge/OpenAI-GPT--5-orange?style=flat-square&logo=openai)](https://openai.com)
14
+ [![OpenAI](https://img.shields.io/badge/OpenAI-GPT--5.2--Codex-orange?style=flat-square&logo=openai)](https://openai.com)
17
15
  [![Gemini](https://img.shields.io/badge/Google-Gemini-blue?style=flat-square&logo=google)](https://ai.google.dev/)
18
16
  [![Anthropic](https://img.shields.io/badge/Anthropic-Claude-orange?style=flat-square&logo=anthropic)](https://anthropic.com)
19
- [![Cerebras](https://img.shields.io/badge/Cerebras-GLM%204.6-red?style=flat-square)](https://cerebras.ai)
20
- [![Z.AI](https://img.shields.io/badge/Z.AI-GLM%204.6-purple?style=flat-square)](https://z.ai/)
21
- [![Synthetic](https://img.shields.io/badge/Synthetic-MINIMAX_M2-green?style=flat-square)](https://synthetic.new)
17
+ [![Cerebras](https://img.shields.io/badge/Cerebras-GLM%204.7-red?style=flat-square)](https://cerebras.ai)
18
+ [![Z.AI](https://img.shields.io/badge/Z.AI-GLM%204.7-purple?style=flat-square)](https://z.ai/)
19
+ [![Synthetic](https://img.shields.io/badge/Synthetic-MINIMAX_M2.1-green?style=flat-square)](https://synthetic.new)
22
20
 
23
21
  [![100% Open Source](https://img.shields.io/badge/100%25-Open%20Source-blue?style=for-the-badge)](https://github.com/mpfaffenberger/code_puppy)
24
22
  [![Pydantic AI](https://img.shields.io/badge/Pydantic-AI-success?style=for-the-badge)](https://github.com/pydantic/pydantic-ai)
@@ -28,6 +26,9 @@
28
26
  [![GitHub stars](https://img.shields.io/github/stars/mpfaffenberger/code_puppy?style=for-the-badge&logo=github)](https://github.com/mpfaffenberger/code_puppy/stargazers)
29
27
  [![GitHub forks](https://img.shields.io/github/forks/mpfaffenberger/code_puppy?style=for-the-badge&logo=github)](https://github.com/mpfaffenberger/code_puppy/network)
30
28
 
29
+ [![Discord](https://img.shields.io/badge/Discord-Community-purple?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/SqYAaXVy)
30
+ [![Docs](https://img.shields.io/badge/Read-The%20Docs-blue?style=for-the-badge&logo=readthedocs)](https://code-puppy.dev)
31
+
31
32
  **[⭐ Star this repo if you hate expensive IDEs! ⭐](#quick-start)**
32
33
 
33
34
  *"Who needs an IDE when you have 1024 angry puppies?"* - Someone, probably.
@@ -61,66 +62,32 @@ uvx code-puppy -i
61
62
 
62
63
  ### UV (Recommended)
63
64
 
65
+ #### macOS / Linux
66
+
64
67
  ```bash
65
68
  # Install UV if you don't have it
66
69
  curl -LsSf https://astral.sh/uv/install.sh | sh
67
70
 
68
- # Set UV to always use managed Python (one-time setup)
69
- echo 'export UV_MANAGED_PYTHON=1' >> ~/.zshrc # or ~/.bashrc
70
- source ~/.zshrc # or ~/.bashrc
71
-
72
- # Install and run code-puppy
73
- uvx code-puppy -i
71
+ uvx code-puppy
74
72
  ```
75
73
 
76
- UV will automatically download the latest compatible Python version (3.11+) if your system doesn't have one.
74
+ #### Windows
77
75
 
78
- ### pip (Alternative)
76
+ On Windows, we recommend installing code-puppy as a global tool for the best experience with keyboard shortcuts (Ctrl+C/Ctrl+X cancellation):
79
77
 
80
- ```bash
81
- pip install code-puppy
82
- ```
83
-
84
- *Note: pip installation requires your system Python to be 3.11 or newer.*
85
-
86
- ### Permanent Python Management
87
-
88
- To make UV always use managed Python versions (recommended):
89
-
90
- ```bash
91
- # Set environment variable permanently
92
- echo 'export UV_MANAGED_PYTHON=1' >> ~/.zshrc # or ~/.bashrc
93
- source ~/.zshrc # or ~/.bashrc
78
+ ```powershell
79
+ # Install UV if you don't have it (run in PowerShell as Admin)
80
+ powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
94
81
 
95
- # Now all UV commands will prefer managed Python installations
96
- uvx code-puppy # No need for --managed-python flag anymore
82
+ uvx code-puppy
97
83
  ```
98
84
 
99
- ### Verifying Python Version
85
+ ## Changelog (By Kittylog!)
100
86
 
101
- ```bash
102
- # Check which Python UV will use
103
- uv python find
104
-
105
- # Or check the current project's Python
106
- uv run python --version
107
- ```
87
+ [📋 View the full changelog on Kittylog](https://kittylog.app/c/mpfaffenberger/code_puppy)
108
88
 
109
89
  ## Usage
110
90
 
111
- ### Custom Commands
112
- Create markdown files in `.claude/commands/`, `.github/prompts/`, or `.agents/commands/` to define custom slash commands. The filename becomes the command name and the content runs as a prompt.
113
-
114
- ```bash
115
- # Create a custom command
116
- echo "# Code Review
117
-
118
- Please review this code for security issues." > .claude/commands/review.md
119
-
120
- # Use it in Code Puppy
121
- /review with focus on authentication
122
- ```
123
-
124
91
  ### Adding Models from models.dev 🆕
125
92
 
126
93
  While there are several models configured right out of the box from providers like Synthetic, Cerebras, OpenAI, Google, and Anthropic, Code Puppy integrates with [models.dev](https://models.dev) to let you browse and add models from **65+ providers** with a single command:
@@ -188,6 +155,18 @@ The following environment variables control DBOS behavior:
188
155
  - `DBOS_SYSTEM_DATABASE_URL`: Database URL used by DBOS. Can point to a local SQLite file or a Postgres instance. Example: `postgresql://postgres:dbos@localhost:5432/postgres`. Default: `dbos_store.sqlite` file in the config directory.
189
156
  - `DBOS_APP_VERSION`: If set, Code Puppy uses it as the [DBOS application version](https://docs.dbos.dev/architecture#application-and-workflow-versions) and automatically tries to recover pending workflows for this version. Default: Code Puppy version + Unix timestamp in millisecond (disable automatic recovery).
190
157
 
158
+ ### Custom Commands
159
+ Create markdown files in `.claude/commands/`, `.github/prompts/`, or `.agents/commands/` to define custom slash commands. The filename becomes the command name and the content runs as a prompt.
160
+
161
+ ```bash
162
+ # Create a custom command
163
+ echo "# Code Review
164
+
165
+ Please review this code for security issues." > .claude/commands/review.md
166
+
167
+ # Use it in Code Puppy
168
+ /review with focus on authentication
169
+ ```
191
170
 
192
171
  ## Requirements
193
172
 
@@ -207,9 +186,6 @@ For examples and more information about agent rules, visit [https://agent.md](ht
207
186
 
208
187
  Use the `/mcp` command to manage MCP (list, start, stop, status, etc.)
209
188
 
210
- Watch this video for examples! https://www.youtube.com/watch?v=1t1zEetOqlo
211
-
212
-
213
189
  ## Round Robin Model Distribution
214
190
 
215
191
  Code Puppy supports **Round Robin model distribution** to help you overcome rate limits and distribute load across multiple AI models. This feature automatically cycles through configured models with each request, maximizing your API usage while staying within rate limits.
@@ -12,6 +12,7 @@ from .agent_manager import (
12
12
  refresh_agents,
13
13
  set_current_agent,
14
14
  )
15
+ from .subagent_stream_handler import subagent_stream_handler
15
16
 
16
17
  __all__ = [
17
18
  "get_available_agents",
@@ -20,4 +21,5 @@ __all__ = [
20
21
  "load_agent",
21
22
  "get_agent_descriptions",
22
23
  "refresh_agents",
24
+ "subagent_stream_handler",
23
25
  ]
@@ -225,6 +225,55 @@ def _discover_agents(message_group_id: Optional[str] = None):
225
225
  )
226
226
  continue
227
227
 
228
+ # 1b. Discover agents in sub-packages (like 'pack')
229
+ for _, subpkg_name, ispkg in pkgutil.iter_modules(agents_package.__path__):
230
+ if not ispkg or subpkg_name.startswith("_"):
231
+ continue
232
+
233
+ try:
234
+ # Import the sub-package
235
+ subpkg = importlib.import_module(f"code_puppy.agents.{subpkg_name}")
236
+
237
+ # Iterate through modules in the sub-package
238
+ if not hasattr(subpkg, "__path__"):
239
+ continue
240
+
241
+ for _, modname, _ in pkgutil.iter_modules(subpkg.__path__):
242
+ if modname.startswith("_"):
243
+ continue
244
+
245
+ try:
246
+ # Import the submodule
247
+ module = importlib.import_module(
248
+ f"code_puppy.agents.{subpkg_name}.{modname}"
249
+ )
250
+
251
+ # Look for BaseAgent subclasses
252
+ for attr_name in dir(module):
253
+ attr = getattr(module, attr_name)
254
+ if (
255
+ isinstance(attr, type)
256
+ and issubclass(attr, BaseAgent)
257
+ and attr not in [BaseAgent, JSONAgent]
258
+ ):
259
+ # Create an instance to get the name
260
+ agent_instance = attr()
261
+ _AGENT_REGISTRY[agent_instance.name] = attr
262
+
263
+ except Exception as e:
264
+ emit_warning(
265
+ f"Warning: Could not load agent {subpkg_name}.{modname}: {e}",
266
+ message_group=message_group_id,
267
+ )
268
+ continue
269
+
270
+ except Exception as e:
271
+ emit_warning(
272
+ f"Warning: Could not load agent sub-package {subpkg_name}: {e}",
273
+ message_group=message_group_id,
274
+ )
275
+ continue
276
+
228
277
  # 2. Discover JSON agents in user directory
229
278
  try:
230
279
  json_agents = discover_json_agents()