code-puppy-core-plugins 0.0.37__tar.gz → 0.0.38__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 (347) hide show
  1. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/PKG-INFO +1 -1
  2. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_oauth/config.py +5 -0
  3. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_oauth/register_callbacks.py +11 -2
  4. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_oauth/utils.py +13 -2
  5. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/pyproject.toml +1 -2
  6. code_puppy_core_plugins-0.0.37/code_puppy_core_plugins/shell_safety/__init__.py +0 -6
  7. code_puppy_core_plugins-0.0.37/code_puppy_core_plugins/shell_safety/classifier.py +0 -48
  8. code_puppy_core_plugins-0.0.37/code_puppy_core_plugins/shell_safety/command_cache.py +0 -156
  9. code_puppy_core_plugins-0.0.37/code_puppy_core_plugins/shell_safety/register_callbacks.py +0 -209
  10. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/.gitignore +0 -0
  11. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/LICENSE +0 -0
  12. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/README.md +0 -0
  13. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/__init__.py +0 -0
  14. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/README.md +0 -0
  15. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/__init__.py +0 -0
  16. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/agent.py +0 -0
  17. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/bridge.py +0 -0
  18. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/capabilities.py +0 -0
  19. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/commands.py +0 -0
  20. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/content.py +0 -0
  21. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/io_delegation.py +0 -0
  22. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/mcp_config.py +0 -0
  23. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/permissions.py +0 -0
  24. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/persistence.py +0 -0
  25. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/register_callbacks.py +0 -0
  26. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/replay.py +0 -0
  27. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/session.py +0 -0
  28. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/session_config.py +0 -0
  29. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/state.py +0 -0
  30. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_creator_skill/SKILL.md +0 -0
  31. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_creator_skill/__init__.py +0 -0
  32. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_creator_skill/register_callbacks.py +0 -0
  33. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/__init__.py +0 -0
  34. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/config.py +0 -0
  35. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/discovery.py +0 -0
  36. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/downloader.py +0 -0
  37. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/enabled_skills.py +0 -0
  38. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/installer.py +0 -0
  39. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/metadata.py +0 -0
  40. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/prompt_builder.py +0 -0
  41. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/provider.py +0 -0
  42. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/register_callbacks.py +0 -0
  43. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/remote_catalog.py +0 -0
  44. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/skill_catalog.py +0 -0
  45. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/skill_commands.py +0 -0
  46. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/skills_install_menu.py +0 -0
  47. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/skills_menu.py +0 -0
  48. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/auto_continue/__init__.py +0 -0
  49. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/auto_continue/classifier.py +0 -0
  50. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/auto_continue/register_callbacks.py +0 -0
  51. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/aws_bedrock/__init__.py +0 -0
  52. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/aws_bedrock/config.py +0 -0
  53. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/aws_bedrock/register_callbacks.py +0 -0
  54. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/aws_bedrock/utils.py +0 -0
  55. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/azure_foundry/README.md +0 -0
  56. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/azure_foundry/__init__.py +0 -0
  57. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/azure_foundry/config.py +0 -0
  58. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/azure_foundry/discovery.py +0 -0
  59. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/azure_foundry/register_callbacks.py +0 -0
  60. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/azure_foundry/token.py +0 -0
  61. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/azure_foundry/utils.py +0 -0
  62. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/btw/__init__.py +0 -0
  63. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/btw/inline_view.py +0 -0
  64. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/btw/register_callbacks.py +0 -0
  65. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/btw/side_query.py +0 -0
  66. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/chatgpt_oauth/IMAGEGEN_SKILL.md +0 -0
  67. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/chatgpt_oauth/__init__.py +0 -0
  68. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/chatgpt_oauth/config.py +0 -0
  69. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/chatgpt_oauth/image_generation.py +0 -0
  70. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/chatgpt_oauth/image_tool.py +0 -0
  71. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/chatgpt_oauth/model_catalog.py +0 -0
  72. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/chatgpt_oauth/oauth_flow.py +0 -0
  73. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/chatgpt_oauth/register_callbacks.py +0 -0
  74. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/chatgpt_oauth/test_plugin.py +0 -0
  75. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/chatgpt_oauth/usage.py +0 -0
  76. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/chatgpt_oauth/utils.py +0 -0
  77. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_hooks/__init__.py +0 -0
  78. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_hooks/config.py +0 -0
  79. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_hooks/register_callbacks.py +0 -0
  80. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_hooks/trust.py +0 -0
  81. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_oauth/README.md +0 -0
  82. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_oauth/SETUP.md +0 -0
  83. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_oauth/__init__.py +0 -0
  84. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_oauth/fast_mode.py +0 -0
  85. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_oauth/prompt_handler.py +0 -0
  86. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_oauth/test_plugin.py +0 -0
  87. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
  88. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/code_puppy_agent/AGENTS_AND_TOOLS.md +0 -0
  89. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/code_puppy_agent/MODELS_AND_MCP.md +0 -0
  90. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/code_puppy_agent/PLUGINS_AND_CALLBACKS.md +0 -0
  91. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/code_puppy_agent/SESSIONS_AND_HISTORY.md +0 -0
  92. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/code_puppy_agent/SKILL.md +0 -0
  93. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/code_puppy_agent/SKILLS_SYSTEM.md +0 -0
  94. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/code_puppy_agent/SYSTEM_PROMPT_CONFIG_AND_I18N.md +0 -0
  95. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/code_puppy_agent/__init__.py +0 -0
  96. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/code_puppy_agent/register_callbacks.py +0 -0
  97. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/NativeCapture.swift +0 -0
  98. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/README.md +0 -0
  99. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/__init__.py +0 -0
  100. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/accessibility.py +0 -0
  101. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/activation.py +0 -0
  102. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/backend.py +0 -0
  103. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/backend_types.py +0 -0
  104. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/capture.py +0 -0
  105. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/commands.py +0 -0
  106. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/geometry.py +0 -0
  107. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/inline_image.py +0 -0
  108. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/keycodes.py +0 -0
  109. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/policy.py +0 -0
  110. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/register_callbacks.py +0 -0
  111. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/safety.py +0 -0
  112. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/settle.py +0 -0
  113. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/state.py +0 -0
  114. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/tools.py +0 -0
  115. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/context_indicator/__init__.py +0 -0
  116. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/context_indicator/register_callbacks.py +0 -0
  117. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/context_indicator/usage.py +0 -0
  118. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/copilot_auth/__init__.py +0 -0
  119. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/copilot_auth/config.py +0 -0
  120. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/copilot_auth/reasoning_client.py +0 -0
  121. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/copilot_auth/register_callbacks.py +0 -0
  122. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/copilot_auth/utils.py +0 -0
  123. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/customizable_commands/__init__.py +0 -0
  124. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/customizable_commands/register_callbacks.py +0 -0
  125. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/dbos_durable_exec/__init__.py +0 -0
  126. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/dbos_durable_exec/cancel.py +0 -0
  127. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/dbos_durable_exec/commands.py +0 -0
  128. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/dbos_durable_exec/config.py +0 -0
  129. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/dbos_durable_exec/lifecycle.py +0 -0
  130. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/dbos_durable_exec/register_callbacks.py +0 -0
  131. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/dbos_durable_exec/runtime.py +0 -0
  132. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/dbos_durable_exec/startup_lock.py +0 -0
  133. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/dbos_durable_exec/workflow_ids.py +0 -0
  134. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/dbos_durable_exec/wrapper.py +0 -0
  135. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/destructive_command_guard/AGENTS.md +0 -0
  136. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/destructive_command_guard/__init__.py +0 -0
  137. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/destructive_command_guard/detector.py +0 -0
  138. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/destructive_command_guard/register_callbacks.py +0 -0
  139. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/emoji_filter/__init__.py +0 -0
  140. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/emoji_filter/config.py +0 -0
  141. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/emoji_filter/register_callbacks.py +0 -0
  142. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/emoji_filter/stripper.py +0 -0
  143. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/empty_html_comment_filter/register_callbacks.py +0 -0
  144. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/example_custom_command/README.md +0 -0
  145. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/example_custom_command/register_callbacks.py +0 -0
  146. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/file_permission_handler/__init__.py +0 -0
  147. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/file_permission_handler/register_callbacks.py +0 -0
  148. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/__init__.py +0 -0
  149. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/README.md +0 -0
  150. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/cheatsheet.md +0 -0
  151. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/pipeline.md +0 -0
  152. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/synopsis.md +0 -0
  153. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/about.md +0 -0
  154. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/address-feedback.md +0 -0
  155. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/ask.md +0 -0
  156. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/aug.md +0 -0
  157. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/auto-pilot.md +0 -0
  158. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/cheatsheet.md +0 -0
  159. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/commit.md +0 -0
  160. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/config.md +0 -0
  161. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/create-pr.md +0 -0
  162. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/exec.md +0 -0
  163. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/new.md +0 -0
  164. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/qa.md +0 -0
  165. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/rebase.md +0 -0
  166. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/review.md +0 -0
  167. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/split.md +0 -0
  168. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/squash-commits.md +0 -0
  169. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/status.md +0 -0
  170. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/tests.md +0 -0
  171. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_about.py +0 -0
  172. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_cheatsheet.py +0 -0
  173. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_status.py +0 -0
  174. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/installer.py +0 -0
  175. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/register_callbacks.py +0 -0
  176. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/force_push_guard/__init__.py +0 -0
  177. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/force_push_guard/detector.py +0 -0
  178. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/force_push_guard/register_callbacks.py +0 -0
  179. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/fork/__init__.py +0 -0
  180. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/fork/register_callbacks.py +0 -0
  181. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/frontend_emitter/__init__.py +0 -0
  182. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/frontend_emitter/emitter.py +0 -0
  183. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/frontend_emitter/register_callbacks.py +0 -0
  184. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/frontend_emitter/session_context.py +0 -0
  185. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/grok_oauth/__init__.py +0 -0
  186. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/grok_oauth/config.py +0 -0
  187. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/grok_oauth/oauth_flow.py +0 -0
  188. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/grok_oauth/register_callbacks.py +0 -0
  189. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/grok_oauth/utils.py +0 -0
  190. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/herdr/README.md +0 -0
  191. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/herdr/__init__.py +0 -0
  192. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/herdr/client.py +0 -0
  193. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/herdr/register_callbacks.py +0 -0
  194. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/herdr/reporter.py +0 -0
  195. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/herdr/smoke.py +0 -0
  196. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/herdr/sources.py +0 -0
  197. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/hook_creator/__init__.py +0 -0
  198. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/hook_creator/register_callbacks.py +0 -0
  199. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/hook_manager/__init__.py +0 -0
  200. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/hook_manager/config.py +0 -0
  201. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/hook_manager/hooks_menu.py +0 -0
  202. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/hook_manager/register_callbacks.py +0 -0
  203. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/hook_manager/trust_handler.py +0 -0
  204. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/logfire_oauth/__init__.py +0 -0
  205. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/logfire_oauth/oauth.py +0 -0
  206. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/logfire_oauth/query_tool.py +0 -0
  207. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/logfire_oauth/register_callbacks.py +0 -0
  208. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/logfire_sessions/__init__.py +0 -0
  209. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/logfire_sessions/mirror.py +0 -0
  210. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/logfire_sessions/query.py +0 -0
  211. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/logfire_sessions/register_callbacks.py +0 -0
  212. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/logfire_sessions/sync.py +0 -0
  213. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/meta_oauth/__init__.py +0 -0
  214. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/meta_oauth/config.py +0 -0
  215. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/meta_oauth/oauth_flow.py +0 -0
  216. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/meta_oauth/register_callbacks.py +0 -0
  217. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/meta_oauth/utils.py +0 -0
  218. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/namespace_skill_search/README.md +0 -0
  219. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/namespace_skill_search/__init__.py +0 -0
  220. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/namespace_skill_search/namespaces.py +0 -0
  221. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/namespace_skill_search/register_callbacks.py +0 -0
  222. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/namespace_skill_search/search_tool.py +0 -0
  223. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/no_tools/__init__.py +0 -0
  224. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/no_tools/register_callbacks.py +0 -0
  225. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/oauth_pasteback.py +0 -0
  226. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/oauth_puppy_html.py +0 -0
  227. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/obsidian_agent/README.md +0 -0
  228. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/obsidian_agent/__init__.py +0 -0
  229. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/obsidian_agent/agent_obsidian.py +0 -0
  230. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/obsidian_agent/register_callbacks.py +0 -0
  231. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/ollama/__init__.py +0 -0
  232. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/ollama/register_callbacks.py +0 -0
  233. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/ollama_setup/__init__.py +0 -0
  234. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/ollama_setup/completer.py +0 -0
  235. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/ollama_setup/register_callbacks.py +0 -0
  236. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/openrouter_oauth/__init__.py +0 -0
  237. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/openrouter_oauth/config.py +0 -0
  238. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/openrouter_oauth/oauth_flow.py +0 -0
  239. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/openrouter_oauth/register_callbacks.py +0 -0
  240. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/openrouter_oauth/test_plugin.py +0 -0
  241. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/plugin_list/__init__.py +0 -0
  242. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/plugin_list/plugin_contributions.py +0 -0
  243. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/plugin_list/plugin_meta.py +0 -0
  244. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/plugin_list/plugin_text_utils.py +0 -0
  245. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/plugin_list/plugins_menu.py +0 -0
  246. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/plugin_list/plugins_menu_render.py +0 -0
  247. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/plugin_list/project_trust_flow.py +0 -0
  248. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/plugin_list/register_callbacks.py +0 -0
  249. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/pop_command/__init__.py +0 -0
  250. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/pop_command/register_callbacks.py +0 -0
  251. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/prompt_newline/__init__.py +0 -0
  252. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/prompt_newline/config.py +0 -0
  253. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/prompt_newline/register_callbacks.py +0 -0
  254. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/prune/__init__.py +0 -0
  255. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/prune/prune_menu.py +0 -0
  256. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/prune/prune_model.py +0 -0
  257. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/prune/prune_render.py +0 -0
  258. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/prune/register_callbacks.py +0 -0
  259. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/README.md +0 -0
  260. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/__init__.py +0 -0
  261. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/commands.py +0 -0
  262. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/config.py +0 -0
  263. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/kennel.py +0 -0
  264. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/packer.py +0 -0
  265. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/recorder.py +0 -0
  266. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/register_callbacks.py +0 -0
  267. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/retriever.py +0 -0
  268. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/schema.py +0 -0
  269. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/state.py +0 -0
  270. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/tools.py +0 -0
  271. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/wings.py +0 -0
  272. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_spinner/README.md +0 -0
  273. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_spinner/__init__.py +0 -0
  274. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_spinner/builtin_frames.py +0 -0
  275. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_spinner/commands.py +0 -0
  276. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_spinner/picker.py +0 -0
  277. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_spinner/register_callbacks.py +0 -0
  278. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_spinner/spinners.py +0 -0
  279. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/qa_kitten_skill/SKILL.md +0 -0
  280. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/qa_kitten_skill/__init__.py +0 -0
  281. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/qa_kitten_skill/register_callbacks.py +0 -0
  282. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/quick_resume/__init__.py +0 -0
  283. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/quick_resume/register_callbacks.py +0 -0
  284. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/review_pr/__init__.py +0 -0
  285. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/review_pr/register_callbacks.py +0 -0
  286. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/session_namer/__init__.py +0 -0
  287. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/session_namer/namer.py +0 -0
  288. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/session_namer/register_callbacks.py +0 -0
  289. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/spill/LICENSE.deepseek +0 -0
  290. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/spill/__init__.py +0 -0
  291. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/spill/register_callbacks.py +0 -0
  292. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/spill/store.py +0 -0
  293. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/stack_dump/__init__.py +0 -0
  294. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/stack_dump/register_callbacks.py +0 -0
  295. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/statusline/__init__.py +0 -0
  296. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/statusline/config.py +0 -0
  297. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/statusline/payload.py +0 -0
  298. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/statusline/prompt_patch.py +0 -0
  299. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/statusline/register_callbacks.py +0 -0
  300. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/statusline/runner.py +0 -0
  301. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/statusline/statusline_command.py +0 -0
  302. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/steer_queue/__init__.py +0 -0
  303. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/steer_queue/queue_menu.py +0 -0
  304. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/steer_queue/register_callbacks.py +0 -0
  305. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/subagent_panel/README.md +0 -0
  306. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/subagent_panel/__init__.py +0 -0
  307. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/subagent_panel/coalesce_patch.py +0 -0
  308. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/subagent_panel/panel_render.py +0 -0
  309. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/subagent_panel/register_callbacks.py +0 -0
  310. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/subagent_panel/resume_repaint.py +0 -0
  311. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/subagent_panel/state.py +0 -0
  312. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/switch_agent_resume/__init__.py +0 -0
  313. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/switch_agent_resume/register_callbacks.py +0 -0
  314. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/termflow_tui.py +0 -0
  315. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/README.md +0 -0
  316. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/__init__.py +0 -0
  317. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/bundled_palettes.py +0 -0
  318. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/content_styles.py +0 -0
  319. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/osc_palette.py +0 -0
  320. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/picker.py +0 -0
  321. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/prompt_toolkit_theme.py +0 -0
  322. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/register_callbacks.py +0 -0
  323. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/rich_themes.py +0 -0
  324. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/themes.py +0 -0
  325. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/timestamp_heartbeat/__init__.py +0 -0
  326. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/timestamp_heartbeat/register_callbacks.py +0 -0
  327. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/token_ratio_learner/__init__.py +0 -0
  328. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/token_ratio_learner/ratios.py +0 -0
  329. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/token_ratio_learner/register_callbacks.py +0 -0
  330. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/universal_constructor/__init__.py +0 -0
  331. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/universal_constructor/models.py +0 -0
  332. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/universal_constructor/provider.py +0 -0
  333. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/universal_constructor/register_callbacks.py +0 -0
  334. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/universal_constructor/registry.py +0 -0
  335. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/universal_constructor/sandbox.py +0 -0
  336. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/web_retriever_skill/SKILL.md +0 -0
  337. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/web_retriever_skill/__init__.py +0 -0
  338. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/web_retriever_skill/register_callbacks.py +0 -0
  339. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/wiggum/__init__.py +0 -0
  340. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/wiggum/goal_runs.py +0 -0
  341. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/wiggum/judge.py +0 -0
  342. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/wiggum/judge_config.py +0 -0
  343. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/wiggum/judges_menu.py +0 -0
  344. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/wiggum/register_callbacks.py +0 -0
  345. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/wiggum/state.py +0 -0
  346. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/yolo_cli/__init__.py +0 -0
  347. {code_puppy_core_plugins-0.0.37 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/yolo_cli/register_callbacks.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: code-puppy-core-plugins
3
- Version: 0.0.37
3
+ Version: 0.0.38
4
4
  Summary: Official plugin bundle for Code Puppy
5
5
  Project-URL: Repository, https://github.com/mpfaffenberger/code_puppy_core_plugins
6
6
  Project-URL: Homepage, https://github.com/mpfaffenberger/code_puppy_core_plugins
@@ -32,9 +32,14 @@ CLAUDE_CODE_OAUTH_CONFIG: Dict[str, Any] = {
32
32
  "claude-opus-5",
33
33
  "claude-sonnet-5",
34
34
  "claude-fable-5",
35
+ "claude-fable-5-1",
35
36
  ],
36
37
  "api_key_env_var": "CLAUDE_CODE_ACCESS_TOKEN",
37
38
  "anthropic_version": "2023-06-01",
39
+ # Per-family caps applied by filter_latest_claude_models. Shared by the
40
+ # save path (add_models_to_extra_config) and the load path
41
+ # (load_claude_models_filtered) so the two can never drift apart.
42
+ "model_family_limits": {"default": 1, "opus": 3, "fable": 3},
38
43
  }
39
44
 
40
45
 
@@ -52,6 +52,10 @@ from .utils import (
52
52
 
53
53
  logger = logging.getLogger(__name__)
54
54
 
55
+ # Model switched to after a successful /claude-code-auth run. Only applied
56
+ # when authentication succeeded AND discovery actually minted this entry.
57
+ POST_AUTH_MODEL = f"{CLAUDE_CODE_OAUTH_CONFIG['prefix']}claude-fable-5-1-long"
58
+
55
59
 
56
60
  class _OAuthResult:
57
61
  def __init__(self) -> None:
@@ -393,8 +397,13 @@ def _handle_custom_command(command: str, name: str) -> Optional[bool]:
393
397
  tokens = load_stored_tokens()
394
398
  if tokens and tokens.get("access_token"):
395
399
  emit_warning(t("oauth.claude.cmd.auth.overwrite_warning"))
396
- _perform_authentication()
397
- set_model_and_reload_agent("claude-code-claude-opus-4-8-long")
400
+ authenticated = _perform_authentication()
401
+ if authenticated and POST_AUTH_MODEL in load_claude_models_filtered():
402
+ set_model_and_reload_agent(POST_AUTH_MODEL)
403
+ else:
404
+ emit_warning(
405
+ t("oauth.claude.cmd.auth.model_switch_skipped", model=POST_AUTH_MODEL)
406
+ )
398
407
  return True
399
408
 
400
409
  if name == "claude-code-status":
@@ -340,7 +340,8 @@ def load_claude_models_filtered() -> Dict[str, Any]:
340
340
  # Filter to only latest models
341
341
  latest_names = set(
342
342
  filter_latest_claude_models(
343
- model_names, max_per_family={"default": 1, "opus": 3}
343
+ model_names,
344
+ max_per_family=CLAUDE_CODE_OAUTH_CONFIG["model_family_limits"],
344
345
  )
345
346
  )
346
347
 
@@ -450,6 +451,12 @@ def filter_latest_claude_models(
450
451
  mapping family name to its limit (e.g. ``{"opus": 3}``). Families
451
452
  not present in the dict fall back to ``"default"`` key, or ``2``.
452
453
  """
454
+ # Dedupe while preserving order: base and "-long" config entries share the
455
+ # same underlying model name, and a duplicate must not consume a slot of
456
+ # the per-family limit (e.g. [opus-5, opus-5, opus-4-8] silently dropping
457
+ # opus-4-7 at limit 3).
458
+ models = list(dict.fromkeys(models))
459
+
453
460
  # Collect all parsed models per family
454
461
  # family -> list of (model_name, major, minor, date)
455
462
  family_models: Dict[str, List[Tuple[str, int, int, int]]] = {}
@@ -476,6 +483,9 @@ def filter_latest_claude_models(
476
483
  if model_name == "claude-fable-5":
477
484
  family_models.setdefault("fable", []).append((model_name, 5, 0, 0))
478
485
  continue
486
+ if model_name == "claude-fable-5-1":
487
+ family_models.setdefault("fable", []).append((model_name, 5, 1, 0))
488
+ continue
479
489
  # Match pattern: claude-{family}-{major}-{minor}-{date}
480
490
  # Examples: claude-haiku-3-5-20241022, claude-sonnet-4-5-20250929
481
491
  match = re.match(r"claude-(haiku|sonnet|opus)-(\d+)-(\d+)-(\d+)", model_name)
@@ -609,7 +619,8 @@ def add_models_to_extra_config(models: List[str]) -> bool:
609
619
  try:
610
620
  # Filter to only latest haiku, sonnet, and opus models
611
621
  filtered_models = filter_latest_claude_models(
612
- models, max_per_family={"default": 1, "opus": 3, "fable": 3}
622
+ models,
623
+ max_per_family=CLAUDE_CODE_OAUTH_CONFIG["model_family_limits"],
613
624
  )
614
625
 
615
626
  # Start fresh - overwrite the file on every auth instead of loading existing
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "code-puppy-core-plugins"
7
- version = "0.0.37"
7
+ version = "0.0.38"
8
8
  description = "Official plugin bundle for Code Puppy"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11,<3.15"
@@ -76,7 +76,6 @@ qa_kitten_skill = "code_puppy_core_plugins.qa_kitten_skill.register_callbacks"
76
76
  quick_resume = "code_puppy_core_plugins.quick_resume.register_callbacks"
77
77
  review_pr = "code_puppy_core_plugins.review_pr.register_callbacks"
78
78
  session_namer = "code_puppy_core_plugins.session_namer.register_callbacks"
79
- shell_safety = "code_puppy_core_plugins.shell_safety.register_callbacks"
80
79
  spill = "code_puppy_core_plugins.spill.register_callbacks"
81
80
  stack_dump = "code_puppy_core_plugins.stack_dump.register_callbacks"
82
81
  statusline = "code_puppy_core_plugins.statusline.register_callbacks"
@@ -1,6 +0,0 @@
1
- """Shell command safety checking plugin.
2
-
3
- This plugin provides AI-powered safety assessment for shell commands
4
- executed in yolo_mode. It helps prevent accidental execution of
5
- dangerous commands that could cause data loss or system damage.
6
- """
@@ -1,48 +0,0 @@
1
- """Private shell-command risk classifier."""
2
-
3
- from code_puppy.config import get_global_model_name
4
- from code_puppy.private_inference import run_private_prompt
5
- from code_puppy.tools.command_runner import ShellSafetyAssessment
6
-
7
- _INSTRUCTIONS = """You are a shell command safety analyzer. Assess risk levels concisely.
8
-
9
- Risk levels:
10
- - none: Completely safe (ls, pwd, echo, cat readonly files)
11
- - low: Minimal risk (mkdir, touch, git status, read-only queries)
12
- - medium: Moderate risk (file edits, package installs, service restarts)
13
- - high: Significant risk (rm files, unfiltered UPDATE/DELETE, TRUNCATE, dangerous chmod)
14
- - critical: Severe/destructive (rm -rf, DROP, dd, format, mkfs, mass deletes)
15
-
16
- Evaluate scope, reversibility, data-loss potential, privileges, and database
17
- destruction patterns. Return the risk level and at most one sentence of reasoning."""
18
-
19
- _NON_THINKING_OVERRIDES = {
20
- "reasoning_effort": "none",
21
- "extended_thinking": "off",
22
- "interleaved_thinking": False,
23
- "thinking_type": "disabled",
24
- "thinking_enabled": False,
25
- }
26
-
27
-
28
- async def classify(command: str, cwd: str | None = None) -> ShellSafetyAssessment:
29
- """Assess one command without entering Code Puppy's agent runtime."""
30
- model_name = get_global_model_name()
31
- if not model_name:
32
- raise RuntimeError("No model configured for shell-safety assessment")
33
-
34
- prompt = f"Assess this shell command:\n\nCommand: {command}"
35
- if cwd:
36
- prompt += f"\nWorking directory: {cwd}"
37
-
38
- return await run_private_prompt(
39
- model_name=model_name,
40
- instructions=_INSTRUCTIONS,
41
- prompt=prompt,
42
- output_type=ShellSafetyAssessment,
43
- model_settings_overrides=_NON_THINKING_OVERRIDES,
44
- max_tokens=128,
45
- )
46
-
47
-
48
- __all__ = ["classify"]
@@ -1,156 +0,0 @@
1
- """Caching layer for shell command safety assessments.
2
-
3
- This module provides an LRU cache for recently assessed commands to avoid redundant API calls.
4
-
5
- The approach is simple and secure: let the LLM assess ALL commands and cache
6
- those assessments. This eliminates the security risks of pre-defined whitelists
7
- while providing the performance benefits of caching.
8
- """
9
-
10
- from collections import OrderedDict
11
- from dataclasses import dataclass
12
- from typing import Optional, Tuple
13
-
14
- # Maximum number of cached assessments (LRU eviction after this)
15
- MAX_CACHE_SIZE = 200
16
-
17
-
18
- @dataclass
19
- class CachedAssessment:
20
- """A cached safety assessment result."""
21
-
22
- risk: str
23
- reasoning: str
24
-
25
-
26
- class CommandSafetyCache:
27
- """LRU cache for shell command safety assessments.
28
-
29
- This cache stores previous LLM assessments to avoid redundant API calls.
30
- It uses an OrderedDict for O(1) LRU eviction.
31
- """
32
-
33
- def __init__(self, max_size: int = MAX_CACHE_SIZE):
34
- self._cache: OrderedDict[Tuple[str, Optional[str]], CachedAssessment] = (
35
- OrderedDict()
36
- )
37
- self._max_size = max_size
38
- self._hits = 0
39
- self._misses = 0
40
-
41
- def _make_key(self, command: str, cwd: Optional[str]) -> Tuple[str, Optional[str]]:
42
- """Create a cache key from command and cwd."""
43
- # Normalize command (strip whitespace)
44
- return (command.strip(), cwd)
45
-
46
- def get(
47
- self, command: str, cwd: Optional[str] = None
48
- ) -> Optional[CachedAssessment]:
49
- """Get a cached assessment if it exists.
50
-
51
- Args:
52
- command: The shell command
53
- cwd: Optional working directory
54
-
55
- Returns:
56
- CachedAssessment if found, None otherwise
57
- """
58
- key = self._make_key(command, cwd)
59
- if key in self._cache:
60
- # Move to end (most recently used)
61
- self._cache.move_to_end(key)
62
- self._hits += 1
63
- return self._cache[key]
64
- self._misses += 1
65
- return None
66
-
67
- def put(
68
- self, command: str, cwd: Optional[str], assessment: CachedAssessment
69
- ) -> None:
70
- """Store an assessment in the cache.
71
-
72
- Args:
73
- command: The shell command
74
- cwd: Optional working directory
75
- assessment: The assessment result to cache
76
- """
77
- key = self._make_key(command, cwd)
78
-
79
- # If already exists, update and move to end
80
- if key in self._cache:
81
- self._cache.move_to_end(key)
82
- self._cache[key] = assessment
83
- return
84
-
85
- # Evict oldest if at capacity
86
- while len(self._cache) >= self._max_size:
87
- self._cache.popitem(last=False)
88
-
89
- self._cache[key] = assessment
90
-
91
- def clear(self) -> None:
92
- """Clear all cached assessments."""
93
- self._cache.clear()
94
- self._hits = 0
95
- self._misses = 0
96
-
97
- @property
98
- def stats(self) -> dict:
99
- """Get cache statistics."""
100
- total = self._hits + self._misses
101
- hit_rate = (self._hits / total * 100) if total > 0 else 0
102
- return {
103
- "size": len(self._cache),
104
- "max_size": self._max_size,
105
- "hits": self._hits,
106
- "misses": self._misses,
107
- "hit_rate": f"{hit_rate:.1f}%",
108
- }
109
-
110
-
111
- # Global cache instance (singleton for the session)
112
- _cache = CommandSafetyCache()
113
-
114
-
115
- def get_cache_stats() -> dict:
116
- """Get statistics about the cache performance."""
117
- return _cache.stats
118
-
119
-
120
- def get_cached_assessment(
121
- command: str, cwd: Optional[str] = None
122
- ) -> Optional[CachedAssessment]:
123
- """Get a cached command safety assessment.
124
-
125
- Cache-only approach: use the LLM cache for speed, but let the LLM
126
- determine safety for all commands. No pre-defined whitelists.
127
-
128
- Args:
129
- command: The shell command to check
130
- cwd: Optional working directory
131
-
132
- Returns:
133
- CachedAssessment if found in cache, None if needs LLM assessment
134
- """
135
- return _cache.get(command, cwd)
136
-
137
-
138
- def cache_assessment(
139
- command: str, cwd: Optional[str], risk: str, reasoning: str
140
- ) -> None:
141
- """Cache an LLM assessment result.
142
-
143
- Cache all LLM assessments since the same command should get
144
- the same assessment, providing both security and performance.
145
-
146
- Args:
147
- command: The shell command
148
- cwd: Optional working directory
149
- risk: The assessed risk level
150
- reasoning: The assessment reasoning
151
- """
152
- assessment = CachedAssessment(
153
- risk=risk,
154
- reasoning=reasoning,
155
- )
156
- _cache.put(command, cwd, assessment)
@@ -1,209 +0,0 @@
1
- """Callback registration for shell command safety checking.
2
-
3
- This module registers a callback that intercepts shell commands in yolo_mode
4
- and assesses their safety risk before execution.
5
- """
6
-
7
- import inspect
8
- import logging
9
- from typing import Any, Dict, Optional
10
-
11
- from code_puppy.callbacks import register_callback
12
- from code_puppy.config import (
13
- get_global_model_name,
14
- get_safety_permission_level,
15
- get_yolo_mode,
16
- )
17
- from code_puppy_core_plugins.shell_safety.command_cache import (
18
- cache_assessment,
19
- get_cached_assessment,
20
- )
21
-
22
- logger = logging.getLogger(__name__)
23
-
24
- # OAuth model prefixes - these models have their own safety mechanisms
25
- OAUTH_MODEL_PREFIXES = (
26
- "claude-code-", # Anthropic OAuth
27
- "codex-", # OpenAI OAuth
28
- "chatgpt-", # Legacy OpenAI OAuth
29
- "gemini-oauth", # Google OAuth
30
- )
31
-
32
-
33
- def is_oauth_model(model_name: str | None) -> bool:
34
- """Check if the model is an OAuth model that should skip safety checks.
35
-
36
- OAuth models have their own built-in safety mechanisms, so we skip
37
- the shell safety callback to avoid redundant checks and potential bugs.
38
-
39
- Args:
40
- model_name: The name of the current model
41
-
42
- Returns:
43
- True if the model is an OAuth model, False otherwise
44
- """
45
- if not model_name:
46
- return False
47
- return model_name.startswith(OAUTH_MODEL_PREFIXES)
48
-
49
-
50
- # Numeric risk hierarchy: lower values are safer.
51
- RISK_LEVELS: Dict[str, int] = {
52
- "none": 0,
53
- "low": 1,
54
- "medium": 2,
55
- "high": 3,
56
- "critical": 4,
57
- }
58
-
59
-
60
- def compare_risk_levels(assessed_risk: Optional[str], threshold: str) -> bool:
61
- """Compare assessed risk against threshold.
62
-
63
- Args:
64
- assessed_risk: The risk level from the agent (can be None)
65
- threshold: The configured risk threshold
66
-
67
- Returns:
68
- True if the command should be blocked (risk exceeds threshold)
69
- False if the command is acceptable
70
- """
71
- # If assessment failed (None), treat as high risk (fail-safe behavior)
72
- if assessed_risk is None:
73
- assessed_risk = "high"
74
-
75
- # Map risk names to numeric values; unknown defaults are conservative.
76
- assessed_level = RISK_LEVELS.get(assessed_risk, 4) # Default to critical if unknown
77
- threshold_level = RISK_LEVELS.get(threshold, 2) # Default to medium if unknown
78
-
79
- # Block if assessed risk is GREATER than threshold
80
- # Note: Commands AT the threshold level are allowed (>, not >=)
81
- return assessed_level > threshold_level
82
-
83
-
84
- async def shell_safety_callback(
85
- context: Any, command: str, cwd: Optional[str] = None, timeout: int = 60
86
- ) -> Optional[Dict[str, Any]]:
87
- """Callback to assess shell command safety before execution.
88
-
89
- This callback is only active when yolo_mode is True. When yolo_mode is False,
90
- the user manually reviews every command, so we don't need the agent.
91
-
92
- Args:
93
- context: The execution context
94
- command: The shell command to execute
95
- cwd: Optional working directory
96
- timeout: Command timeout (unused here)
97
-
98
- Returns:
99
- None if command is safe to proceed
100
- Dict with rejection info if command should be blocked
101
- """
102
- try:
103
- # Only check safety in yolo_mode - otherwise the user reviews manually.
104
- # A failure to read this setting must block rather than become approval,
105
- # including for OAuth models checked below.
106
- if not get_yolo_mode():
107
- return None
108
-
109
- # Skip safety checks for OAuth models - they have their own mechanisms.
110
- if is_oauth_model(get_global_model_name()):
111
- return None
112
-
113
- threshold = get_safety_permission_level()
114
-
115
- # Check cache first (fast path - no LLM call)
116
- cached = get_cached_assessment(command, cwd)
117
-
118
- if cached:
119
- # Got a cached result - check against threshold
120
- if compare_risk_levels(cached.risk, threshold):
121
- # Cached result says it's too risky
122
- risk_display = cached.risk or "unknown"
123
- concise_reason = cached.reasoning or "No reasoning provided"
124
- error_msg = (
125
- f"🛑 Command blocked (risk {risk_display.upper()} > permission {threshold.upper()}).\n"
126
- f"Reason: {concise_reason}\n"
127
- f"Override: /set safety_permission_level {risk_display}"
128
- )
129
- return {
130
- "blocked": True,
131
- "risk": cached.risk,
132
- "reasoning": cached.reasoning,
133
- "error_message": error_msg,
134
- }
135
- # Cached result is within threshold - allow silently
136
- return None
137
-
138
- # Cache miss - need LLM assessment
139
- from code_puppy_core_plugins.shell_safety.classifier import classify
140
-
141
- assessment = await classify(command, cwd)
142
-
143
- # Cache the result for future use, but only if it's not a fallback assessment
144
- if not getattr(assessment, "is_fallback", False):
145
- cache_assessment(command, cwd, assessment.risk, assessment.reasoning)
146
-
147
- # Check if risk exceeds threshold (commands at threshold are allowed)
148
- if compare_risk_levels(assessment.risk, threshold):
149
- risk_display = assessment.risk or "unknown"
150
- concise_reason = assessment.reasoning or "No reasoning provided"
151
- error_msg = (
152
- f"🛑 Command blocked (risk {risk_display.upper()} > permission {threshold.upper()}).\n"
153
- f"Reason: {concise_reason}\n"
154
- f"Override: /set safety_permission_level {risk_display}"
155
- )
156
- # Return rejection info for the command runner
157
- return {
158
- "blocked": True,
159
- "risk": assessment.risk,
160
- "reasoning": assessment.reasoning,
161
- "error_message": error_msg,
162
- }
163
-
164
- # Command is within acceptable risk threshold - remain silent
165
- return None # Allow command to proceed
166
-
167
- except Exception as exc:
168
- # On any error, fail safe by blocking the command. This includes config
169
- # and model reads above the assessment-specific logic.
170
- try:
171
- logger.warning(
172
- "Shell-safety assessment unavailable (%s)", type(exc).__name__
173
- )
174
- except Exception:
175
- pass
176
- error_msg = (
177
- "\U0001f6d1 Command blocked because shell-safety configuration or model "
178
- "was unavailable.\n"
179
- "Reason: Safety assessment was unavailable.\n"
180
- "Next step: check the logs and retry the command."
181
- )
182
- return {
183
- "blocked": True,
184
- "risk": "high",
185
- "reasoning": "Safety assessment was unavailable.",
186
- "error_message": error_msg,
187
- }
188
-
189
-
190
- def register():
191
- """Register the shell safety callback."""
192
- try:
193
- parameters = inspect.signature(register_callback).parameters
194
- except (TypeError, ValueError):
195
- parameters = {}
196
-
197
- fail_closed_parameter = parameters.get("fail_closed")
198
-
199
- if fail_closed_parameter is not None:
200
- # An explicit parameter is the host's compatibility contract; signature
201
- # inspection cannot verify how a wrapper implements it.
202
- register_callback("run_shell_command", shell_safety_callback, fail_closed=True)
203
- else:
204
- # A **kwargs adapter does not prove the host implements fail_closed.
205
- register_callback("run_shell_command", shell_safety_callback)
206
-
207
-
208
- # Auto-register the callback when this module is imported
209
- register()