code-puppy-core-plugins 0.0.36__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.36 → code_puppy_core_plugins-0.0.38}/PKG-INFO +1 -1
  2. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/auto_continue/classifier.py +8 -31
  3. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_oauth/config.py +5 -0
  4. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_oauth/register_callbacks.py +11 -2
  5. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/claude_code_oauth/utils.py +13 -2
  6. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/pyproject.toml +1 -2
  7. code_puppy_core_plugins-0.0.36/code_puppy_core_plugins/shell_safety/__init__.py +0 -6
  8. code_puppy_core_plugins-0.0.36/code_puppy_core_plugins/shell_safety/agent_shell_safety.py +0 -81
  9. code_puppy_core_plugins-0.0.36/code_puppy_core_plugins/shell_safety/command_cache.py +0 -156
  10. code_puppy_core_plugins-0.0.36/code_puppy_core_plugins/shell_safety/register_callbacks.py +0 -227
  11. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/.gitignore +0 -0
  12. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/LICENSE +0 -0
  13. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/README.md +0 -0
  14. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/__init__.py +0 -0
  15. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/README.md +0 -0
  16. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/__init__.py +0 -0
  17. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/agent.py +0 -0
  18. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/bridge.py +0 -0
  19. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/capabilities.py +0 -0
  20. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/commands.py +0 -0
  21. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/content.py +0 -0
  22. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/io_delegation.py +0 -0
  23. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/mcp_config.py +0 -0
  24. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/permissions.py +0 -0
  25. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/persistence.py +0 -0
  26. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/register_callbacks.py +0 -0
  27. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/replay.py +0 -0
  28. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/session.py +0 -0
  29. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/session_config.py +0 -0
  30. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/acp/state.py +0 -0
  31. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_creator_skill/SKILL.md +0 -0
  32. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_creator_skill/__init__.py +0 -0
  33. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_creator_skill/register_callbacks.py +0 -0
  34. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/__init__.py +0 -0
  35. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/config.py +0 -0
  36. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/discovery.py +0 -0
  37. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/downloader.py +0 -0
  38. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/enabled_skills.py +0 -0
  39. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/installer.py +0 -0
  40. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/metadata.py +0 -0
  41. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/prompt_builder.py +0 -0
  42. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/provider.py +0 -0
  43. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/register_callbacks.py +0 -0
  44. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/remote_catalog.py +0 -0
  45. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/skill_catalog.py +0 -0
  46. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/skill_commands.py +0 -0
  47. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/skills_install_menu.py +0 -0
  48. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/agent_skills/skills_menu.py +0 -0
  49. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/auto_continue/__init__.py +0 -0
  50. {code_puppy_core_plugins-0.0.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/aws_bedrock/__init__.py +0 -0
  52. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/aws_bedrock/config.py +0 -0
  53. {code_puppy_core_plugins-0.0.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/aws_bedrock/utils.py +0 -0
  55. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/azure_foundry/README.md +0 -0
  56. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/azure_foundry/__init__.py +0 -0
  57. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/azure_foundry/config.py +0 -0
  58. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/azure_foundry/discovery.py +0 -0
  59. {code_puppy_core_plugins-0.0.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/azure_foundry/token.py +0 -0
  61. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/azure_foundry/utils.py +0 -0
  62. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/btw/__init__.py +0 -0
  63. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/btw/inline_view.py +0 -0
  64. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/btw/register_callbacks.py +0 -0
  65. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/btw/side_query.py +0 -0
  66. {code_puppy_core_plugins-0.0.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/chatgpt_oauth/__init__.py +0 -0
  68. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/chatgpt_oauth/config.py +0 -0
  69. {code_puppy_core_plugins-0.0.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/chatgpt_oauth/usage.py +0 -0
  76. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/chatgpt_oauth/utils.py +0 -0
  77. {code_puppy_core_plugins-0.0.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/NativeCapture.swift +0 -0
  98. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/README.md +0 -0
  99. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/__init__.py +0 -0
  100. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/accessibility.py +0 -0
  101. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/activation.py +0 -0
  102. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/backend.py +0 -0
  103. {code_puppy_core_plugins-0.0.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/capture.py +0 -0
  105. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/commands.py +0 -0
  106. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/geometry.py +0 -0
  107. {code_puppy_core_plugins-0.0.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/keycodes.py +0 -0
  109. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/policy.py +0 -0
  110. {code_puppy_core_plugins-0.0.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/safety.py +0 -0
  112. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/settle.py +0 -0
  113. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/state.py +0 -0
  114. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/computer_use/tools.py +0 -0
  115. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/context_indicator/__init__.py +0 -0
  116. {code_puppy_core_plugins-0.0.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/context_indicator/usage.py +0 -0
  118. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/copilot_auth/__init__.py +0 -0
  119. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/copilot_auth/config.py +0 -0
  120. {code_puppy_core_plugins-0.0.36 → 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.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/copilot_auth/utils.py +0 -0
  123. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/customizable_commands/__init__.py +0 -0
  124. {code_puppy_core_plugins-0.0.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/emoji_filter/__init__.py +0 -0
  140. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/emoji_filter/config.py +0 -0
  141. {code_puppy_core_plugins-0.0.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/emoji_filter/stripper.py +0 -0
  143. {code_puppy_core_plugins-0.0.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/__init__.py +0 -0
  149. {code_puppy_core_plugins-0.0.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/flux_bootstrap/installer.py +0 -0
  175. {code_puppy_core_plugins-0.0.36 → 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.36 → 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.36 → 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.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/fork/__init__.py +0 -0
  180. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/fork/register_callbacks.py +0 -0
  181. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/frontend_emitter/__init__.py +0 -0
  182. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/frontend_emitter/emitter.py +0 -0
  183. {code_puppy_core_plugins-0.0.36 → 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.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/grok_oauth/__init__.py +0 -0
  186. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/grok_oauth/config.py +0 -0
  187. {code_puppy_core_plugins-0.0.36 → 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.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/grok_oauth/utils.py +0 -0
  190. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/herdr/README.md +0 -0
  191. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/herdr/__init__.py +0 -0
  192. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/herdr/client.py +0 -0
  193. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/herdr/register_callbacks.py +0 -0
  194. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/herdr/reporter.py +0 -0
  195. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/herdr/smoke.py +0 -0
  196. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/herdr/sources.py +0 -0
  197. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/hook_creator/__init__.py +0 -0
  198. {code_puppy_core_plugins-0.0.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/hook_manager/__init__.py +0 -0
  200. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/hook_manager/config.py +0 -0
  201. {code_puppy_core_plugins-0.0.36 → 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.36 → 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.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/logfire_oauth/__init__.py +0 -0
  205. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/logfire_oauth/oauth.py +0 -0
  206. {code_puppy_core_plugins-0.0.36 → 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.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/logfire_sessions/__init__.py +0 -0
  209. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/logfire_sessions/mirror.py +0 -0
  210. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/logfire_sessions/query.py +0 -0
  211. {code_puppy_core_plugins-0.0.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/logfire_sessions/sync.py +0 -0
  213. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/meta_oauth/__init__.py +0 -0
  214. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/meta_oauth/config.py +0 -0
  215. {code_puppy_core_plugins-0.0.36 → 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.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/meta_oauth/utils.py +0 -0
  218. {code_puppy_core_plugins-0.0.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/no_tools/__init__.py +0 -0
  224. {code_puppy_core_plugins-0.0.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/oauth_pasteback.py +0 -0
  226. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/oauth_puppy_html.py +0 -0
  227. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/obsidian_agent/README.md +0 -0
  228. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/obsidian_agent/__init__.py +0 -0
  229. {code_puppy_core_plugins-0.0.36 → 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.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/ollama/__init__.py +0 -0
  232. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/ollama/register_callbacks.py +0 -0
  233. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/ollama_setup/__init__.py +0 -0
  234. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/ollama_setup/completer.py +0 -0
  235. {code_puppy_core_plugins-0.0.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/openrouter_oauth/__init__.py +0 -0
  237. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/openrouter_oauth/config.py +0 -0
  238. {code_puppy_core_plugins-0.0.36 → 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.36 → 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.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/plugin_list/__init__.py +0 -0
  242. {code_puppy_core_plugins-0.0.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/pop_command/__init__.py +0 -0
  250. {code_puppy_core_plugins-0.0.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/prompt_newline/__init__.py +0 -0
  252. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/prompt_newline/config.py +0 -0
  253. {code_puppy_core_plugins-0.0.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/prune/__init__.py +0 -0
  255. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/prune/prune_menu.py +0 -0
  256. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/prune/prune_model.py +0 -0
  257. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/prune/prune_render.py +0 -0
  258. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/prune/register_callbacks.py +0 -0
  259. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/README.md +0 -0
  260. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/__init__.py +0 -0
  261. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/commands.py +0 -0
  262. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/config.py +0 -0
  263. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/kennel.py +0 -0
  264. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/packer.py +0 -0
  265. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/recorder.py +0 -0
  266. {code_puppy_core_plugins-0.0.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/retriever.py +0 -0
  268. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/schema.py +0 -0
  269. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/state.py +0 -0
  270. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/tools.py +0 -0
  271. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_kennel/wings.py +0 -0
  272. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_spinner/README.md +0 -0
  273. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_spinner/__init__.py +0 -0
  274. {code_puppy_core_plugins-0.0.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_spinner/commands.py +0 -0
  276. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_spinner/picker.py +0 -0
  277. {code_puppy_core_plugins-0.0.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/puppy_spinner/spinners.py +0 -0
  279. {code_puppy_core_plugins-0.0.36 → 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.36 → 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.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/quick_resume/__init__.py +0 -0
  283. {code_puppy_core_plugins-0.0.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/review_pr/__init__.py +0 -0
  285. {code_puppy_core_plugins-0.0.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/session_namer/__init__.py +0 -0
  287. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/session_namer/namer.py +0 -0
  288. {code_puppy_core_plugins-0.0.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/spill/LICENSE.deepseek +0 -0
  290. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/spill/__init__.py +0 -0
  291. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/spill/register_callbacks.py +0 -0
  292. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/spill/store.py +0 -0
  293. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/stack_dump/__init__.py +0 -0
  294. {code_puppy_core_plugins-0.0.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/statusline/__init__.py +0 -0
  296. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/statusline/config.py +0 -0
  297. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/statusline/payload.py +0 -0
  298. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/statusline/prompt_patch.py +0 -0
  299. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/statusline/register_callbacks.py +0 -0
  300. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/statusline/runner.py +0 -0
  301. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/statusline/statusline_command.py +0 -0
  302. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/steer_queue/__init__.py +0 -0
  303. {code_puppy_core_plugins-0.0.36 → 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.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/subagent_panel/README.md +0 -0
  306. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/subagent_panel/__init__.py +0 -0
  307. {code_puppy_core_plugins-0.0.36 → 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.36 → 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.36 → 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.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/subagent_panel/state.py +0 -0
  312. {code_puppy_core_plugins-0.0.36 → 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.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/termflow_tui.py +0 -0
  315. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/README.md +0 -0
  316. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/__init__.py +0 -0
  317. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/bundled_palettes.py +0 -0
  318. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/content_styles.py +0 -0
  319. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/osc_palette.py +0 -0
  320. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/picker.py +0 -0
  321. {code_puppy_core_plugins-0.0.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/register_callbacks.py +0 -0
  323. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/rich_themes.py +0 -0
  324. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/theme/themes.py +0 -0
  325. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/timestamp_heartbeat/__init__.py +0 -0
  326. {code_puppy_core_plugins-0.0.36 → 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.36 → 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.36 → 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.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/universal_constructor/__init__.py +0 -0
  331. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/universal_constructor/models.py +0 -0
  332. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/universal_constructor/provider.py +0 -0
  333. {code_puppy_core_plugins-0.0.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/universal_constructor/registry.py +0 -0
  335. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/universal_constructor/sandbox.py +0 -0
  336. {code_puppy_core_plugins-0.0.36 → 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.36 → 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.36 → 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.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/wiggum/__init__.py +0 -0
  340. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/wiggum/goal_runs.py +0 -0
  341. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/wiggum/judge.py +0 -0
  342. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/wiggum/judge_config.py +0 -0
  343. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/wiggum/judges_menu.py +0 -0
  344. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/wiggum/register_callbacks.py +0 -0
  345. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/wiggum/state.py +0 -0
  346. {code_puppy_core_plugins-0.0.36 → code_puppy_core_plugins-0.0.38}/code_puppy_core_plugins/yolo_cli/__init__.py +0 -0
  347. {code_puppy_core_plugins-0.0.36 → 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.36
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
@@ -2,7 +2,6 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- import asyncio
6
5
  from typing import Literal
7
6
 
8
7
  from pydantic import BaseModel
@@ -48,44 +47,22 @@ def _model_name() -> str | None:
48
47
  async def classify(response: str) -> Approval | None:
49
48
  """Classify one response without entering Code Puppy's sub-agent runtime."""
50
49
  try:
51
- from pydantic_ai import Agent, UsageLimits
52
-
53
- from code_puppy.model_factory import ModelFactory, make_model_settings
54
- from code_puppy.model_utils import prepare_prompt_for_model
50
+ from code_puppy.private_inference import run_private_prompt
55
51
 
56
52
  model_name = _model_name()
57
53
  if not model_name:
58
54
  return None
59
- models_config = ModelFactory.load_config()
60
- if model_name not in models_config:
61
- return None
62
-
63
- model = ModelFactory.get_model(model_name, models_config)
64
- prepared = prepare_prompt_for_model(
65
- model_name,
66
- _INSTRUCTIONS,
67
- f"Classify this assistant response:\n\n{response}",
68
- prepend_system_to_user=True,
69
- )
70
- agent = Agent(
71
- model=model,
72
- instructions=prepared.instructions,
55
+ decision = await run_private_prompt(
56
+ model_name=model_name,
57
+ instructions=_INSTRUCTIONS,
58
+ prompt=f"Classify this assistant response:\n\n{response}",
73
59
  output_type=ContinuationDecision,
74
- retries=0,
75
- model_settings=make_model_settings(
76
- model_name,
77
- max_tokens=64,
78
- overrides=_NON_THINKING_OVERRIDES,
79
- ),
60
+ model_settings_overrides=_NON_THINKING_OVERRIDES,
61
+ max_tokens=64,
80
62
  )
81
- async with asyncio.timeout(30):
82
- result = await agent.run(
83
- prepared.user_prompt,
84
- usage_limits=UsageLimits(request_limit=1),
85
- )
86
63
  except Exception:
87
64
  return None
88
- return result.output.approval
65
+ return decision.approval
89
66
 
90
67
 
91
68
  __all__ = ["Approval", "ContinuationDecision", "classify"]
@@ -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.36"
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,81 +0,0 @@
1
- """Shell command safety assessment agent.
2
-
3
- This agent provides rapid risk assessment of shell commands before execution.
4
- It's designed to be ultra-lightweight with a concise prompt (<200 tokens) and
5
- uses structured output for reliable parsing.
6
- """
7
-
8
- from typing import TYPE_CHECKING, List
9
-
10
- from code_puppy.agents.base_agent import BaseAgent
11
-
12
- if TYPE_CHECKING:
13
- pass
14
-
15
- _NON_THINKING_OVERRIDES = {
16
- "reasoning_effort": "none",
17
- "extended_thinking": "off",
18
- "interleaved_thinking": False,
19
- "thinking_type": "disabled",
20
- "thinking_enabled": False,
21
- }
22
-
23
-
24
- class ShellSafetyAgent(BaseAgent):
25
- """Lightweight agent for assessing shell command safety risks.
26
-
27
- This agent evaluates shell commands for potential risks including:
28
- - File system destruction (rm -rf, dd, format, mkfs)
29
- - Database operations (DROP, TRUNCATE, unfiltered UPDATE/DELETE)
30
- - Privilege escalation (sudo, su, chmod 777)
31
- - Network operations (wget/curl to unknown hosts)
32
- - Data exfiltration patterns
33
-
34
- The agent returns structured output with a risk level and brief reasoning.
35
- """
36
-
37
- @property
38
- def name(self) -> str:
39
- """Agent name for internal use."""
40
- return "shell_safety_checker"
41
-
42
- @property
43
- def display_name(self) -> str:
44
- """User-facing display name."""
45
- return "Shell Safety Checker 🛡️"
46
-
47
- @property
48
- def description(self) -> str:
49
- """Agent description."""
50
- return "Lightweight agent that assesses shell command safety risks"
51
-
52
- def get_system_prompt(self) -> str:
53
- """Get the ultra-concise system prompt for shell safety assessment.
54
-
55
- This prompt is kept under 200 tokens for fast inference and low cost.
56
- """
57
- return """You are a shell command safety analyzer. Assess risk levels concisely.
58
-
59
- **Risk Levels:**
60
- - none: Completely safe (ls, pwd, echo, cat readonly files)
61
- - low: Minimal risk (mkdir, touch, git status, read-only queries)
62
- - medium: Moderate risk (file edits, package installs, service restarts)
63
- - high: Significant risk (rm files, UPDATE/DELETE without WHERE, TRUNCATE, chmod dangerous permissions)
64
- - critical: Severe/destructive (rm -rf, DROP TABLE/DATABASE, dd, format, mkfs, bq delete dataset, unfiltered mass deletes)
65
-
66
- **Evaluate:**
67
- - Scope (single file vs. entire system)
68
- - Reversibility (can it be undone?)
69
- - Data loss potential
70
- - Privilege requirements
71
- - Database destruction patterns
72
-
73
- **Output:** Risk level + reasoning (max 1 sentence)."""
74
-
75
- def get_available_tools(self) -> List[str]:
76
- """This agent uses no tools."""
77
- return []
78
-
79
- def get_model_settings_overrides(self) -> dict[str, object]:
80
- """Disable provider-specific thinking for this latency-sensitive check."""
81
- return dict(_NON_THINKING_OVERRIDES)
@@ -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,227 +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.messaging import emit_info
18
- from code_puppy_core_plugins.shell_safety.command_cache import (
19
- cache_assessment,
20
- get_cached_assessment,
21
- )
22
- from code_puppy.tools.command_runner import ShellSafetyAssessment
23
-
24
- logger = logging.getLogger(__name__)
25
-
26
- # OAuth model prefixes - these models have their own safety mechanisms
27
- OAUTH_MODEL_PREFIXES = (
28
- "claude-code-", # Anthropic OAuth
29
- "codex-", # OpenAI OAuth
30
- "chatgpt-", # Legacy OpenAI OAuth
31
- "gemini-oauth", # Google OAuth
32
- )
33
-
34
-
35
- def is_oauth_model(model_name: str | None) -> bool:
36
- """Check if the model is an OAuth model that should skip safety checks.
37
-
38
- OAuth models have their own built-in safety mechanisms, so we skip
39
- the shell safety callback to avoid redundant checks and potential bugs.
40
-
41
- Args:
42
- model_name: The name of the current model
43
-
44
- Returns:
45
- True if the model is an OAuth model, False otherwise
46
- """
47
- if not model_name:
48
- return False
49
- return model_name.startswith(OAUTH_MODEL_PREFIXES)
50
-
51
-
52
- # Numeric risk hierarchy: lower values are safer.
53
- RISK_LEVELS: Dict[str, int] = {
54
- "none": 0,
55
- "low": 1,
56
- "medium": 2,
57
- "high": 3,
58
- "critical": 4,
59
- }
60
-
61
-
62
- def compare_risk_levels(assessed_risk: Optional[str], threshold: str) -> bool:
63
- """Compare assessed risk against threshold.
64
-
65
- Args:
66
- assessed_risk: The risk level from the agent (can be None)
67
- threshold: The configured risk threshold
68
-
69
- Returns:
70
- True if the command should be blocked (risk exceeds threshold)
71
- False if the command is acceptable
72
- """
73
- # If assessment failed (None), treat as high risk (fail-safe behavior)
74
- if assessed_risk is None:
75
- assessed_risk = "high"
76
-
77
- # Map risk names to numeric values; unknown defaults are conservative.
78
- assessed_level = RISK_LEVELS.get(assessed_risk, 4) # Default to critical if unknown
79
- threshold_level = RISK_LEVELS.get(threshold, 2) # Default to medium if unknown
80
-
81
- # Block if assessed risk is GREATER than threshold
82
- # Note: Commands AT the threshold level are allowed (>, not >=)
83
- return assessed_level > threshold_level
84
-
85
-
86
- async def shell_safety_callback(
87
- context: Any, command: str, cwd: Optional[str] = None, timeout: int = 60
88
- ) -> Optional[Dict[str, Any]]:
89
- """Callback to assess shell command safety before execution.
90
-
91
- This callback is only active when yolo_mode is True. When yolo_mode is False,
92
- the user manually reviews every command, so we don't need the agent.
93
-
94
- Args:
95
- context: The execution context
96
- command: The shell command to execute
97
- cwd: Optional working directory
98
- timeout: Command timeout (unused here)
99
-
100
- Returns:
101
- None if command is safe to proceed
102
- Dict with rejection info if command should be blocked
103
- """
104
- try:
105
- # Only check safety in yolo_mode - otherwise the user reviews manually.
106
- # A failure to read this setting must block rather than become approval,
107
- # including for OAuth models checked below.
108
- if not get_yolo_mode():
109
- return None
110
-
111
- # Skip safety checks for OAuth models - they have their own mechanisms.
112
- if is_oauth_model(get_global_model_name()):
113
- return None
114
-
115
- threshold = get_safety_permission_level()
116
-
117
- # Check cache first (fast path - no LLM call)
118
- cached = get_cached_assessment(command, cwd)
119
-
120
- if cached:
121
- # Got a cached result - check against threshold
122
- if compare_risk_levels(cached.risk, threshold):
123
- # Cached result says it's too risky
124
- risk_display = cached.risk or "unknown"
125
- concise_reason = cached.reasoning or "No reasoning provided"
126
- error_msg = (
127
- f"🛑 Command blocked (risk {risk_display.upper()} > permission {threshold.upper()}).\n"
128
- f"Reason: {concise_reason}\n"
129
- f"Override: /set safety_permission_level {risk_display}"
130
- )
131
- emit_info(error_msg)
132
- return {
133
- "blocked": True,
134
- "risk": cached.risk,
135
- "reasoning": cached.reasoning,
136
- "error_message": error_msg,
137
- }
138
- # Cached result is within threshold - allow silently
139
- return None
140
-
141
- # Cache miss - need LLM assessment
142
- # Import here to avoid circular imports
143
- from code_puppy_core_plugins.shell_safety.agent_shell_safety import (
144
- ShellSafetyAgent,
145
- )
146
-
147
- # Create agent and assess command
148
- agent = ShellSafetyAgent()
149
-
150
- # Build the assessment prompt with optional cwd context
151
- prompt = f"Assess this shell command:\n\nCommand: {command}"
152
- if cwd:
153
- prompt += f"\nWorking directory: {cwd}"
154
-
155
- # Run async assessment with structured output type
156
- result = await agent.run_with_mcp(prompt, output_type=ShellSafetyAssessment)
157
- assessment = result.output
158
-
159
- # Cache the result for future use, but only if it's not a fallback assessment
160
- if not getattr(assessment, "is_fallback", False):
161
- cache_assessment(command, cwd, assessment.risk, assessment.reasoning)
162
-
163
- # Check if risk exceeds threshold (commands at threshold are allowed)
164
- if compare_risk_levels(assessment.risk, threshold):
165
- risk_display = assessment.risk or "unknown"
166
- concise_reason = assessment.reasoning or "No reasoning provided"
167
- error_msg = (
168
- f"🛑 Command blocked (risk {risk_display.upper()} > permission {threshold.upper()}).\n"
169
- f"Reason: {concise_reason}\n"
170
- f"Override: /set safety_permission_level {risk_display}"
171
- )
172
- emit_info(error_msg)
173
-
174
- # Return rejection info for the command runner
175
- return {
176
- "blocked": True,
177
- "risk": assessment.risk,
178
- "reasoning": assessment.reasoning,
179
- "error_message": error_msg,
180
- }
181
-
182
- # Command is within acceptable risk threshold - remain silent
183
- return None # Allow command to proceed
184
-
185
- except Exception as exc:
186
- # On any error, fail safe by blocking the command. This includes config
187
- # and model reads above the assessment-specific logic.
188
- try:
189
- logger.warning(
190
- "Shell-safety assessment unavailable (%s)", type(exc).__name__
191
- )
192
- except Exception:
193
- pass
194
- error_msg = (
195
- "\U0001f6d1 Command blocked because shell-safety configuration or model "
196
- "was unavailable.\n"
197
- "Reason: Safety assessment was unavailable.\n"
198
- "Next step: check the logs and retry the command."
199
- )
200
- return {
201
- "blocked": True,
202
- "risk": "high",
203
- "reasoning": "Safety assessment was unavailable.",
204
- "error_message": error_msg,
205
- }
206
-
207
-
208
- def register():
209
- """Register the shell safety callback."""
210
- try:
211
- parameters = inspect.signature(register_callback).parameters
212
- except (TypeError, ValueError):
213
- parameters = {}
214
-
215
- fail_closed_parameter = parameters.get("fail_closed")
216
-
217
- if fail_closed_parameter is not None:
218
- # An explicit parameter is the host's compatibility contract; signature
219
- # inspection cannot verify how a wrapper implements it.
220
- register_callback("run_shell_command", shell_safety_callback, fail_closed=True)
221
- else:
222
- # A **kwargs adapter does not prove the host implements fail_closed.
223
- register_callback("run_shell_command", shell_safety_callback)
224
-
225
-
226
- # Auto-register the callback when this module is imported
227
- register()