code-puppy-core-plugins 0.0.43__tar.gz → 0.0.45__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 (360) hide show
  1. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/PKG-INFO +1 -1
  2. code_puppy_core_plugins-0.0.45/code_puppy_core_plugins/claude_code_oauth/model_filter.py +98 -0
  3. code_puppy_core_plugins-0.0.45/code_puppy_core_plugins/claude_code_oauth/model_provider.py +164 -0
  4. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/claude_code_oauth/register_callbacks.py +24 -164
  5. code_puppy_core_plugins-0.0.45/code_puppy_core_plugins/claude_code_oauth/runtime_credentials.py +15 -0
  6. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/claude_code_oauth/token_refresh_heartbeat.py +1 -1
  7. code_puppy_core_plugins-0.0.45/code_puppy_core_plugins/claude_code_oauth/token_store.py +179 -0
  8. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/claude_code_oauth/utils.py +17 -166
  9. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/pyproject.toml +1 -1
  10. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/.gitignore +0 -0
  11. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/LICENSE +0 -0
  12. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/README.md +0 -0
  13. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/__init__.py +0 -0
  14. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/acp/README.md +0 -0
  15. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/acp/__init__.py +0 -0
  16. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/acp/agent.py +0 -0
  17. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/acp/bridge.py +0 -0
  18. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/acp/capabilities.py +0 -0
  19. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/acp/commands.py +0 -0
  20. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/acp/content.py +0 -0
  21. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/acp/io_delegation.py +0 -0
  22. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/acp/mcp_config.py +0 -0
  23. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/acp/permissions.py +0 -0
  24. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/acp/persistence.py +0 -0
  25. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/acp/register_callbacks.py +0 -0
  26. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/acp/replay.py +0 -0
  27. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/acp/session.py +0 -0
  28. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/acp/session_config.py +0 -0
  29. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/acp/state.py +0 -0
  30. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/agent_creator_skill/SKILL.md +0 -0
  31. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/agent_creator_skill/__init__.py +0 -0
  32. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/agent_creator_skill/register_callbacks.py +0 -0
  33. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/agent_skills/__init__.py +0 -0
  34. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/agent_skills/config.py +0 -0
  35. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/agent_skills/discovery.py +0 -0
  36. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/agent_skills/downloader.py +0 -0
  37. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/agent_skills/enabled_skills.py +0 -0
  38. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/agent_skills/installer.py +0 -0
  39. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/agent_skills/metadata.py +0 -0
  40. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/agent_skills/prompt_builder.py +0 -0
  41. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/agent_skills/provider.py +0 -0
  42. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/agent_skills/register_callbacks.py +0 -0
  43. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/agent_skills/remote_catalog.py +0 -0
  44. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/agent_skills/skill_catalog.py +0 -0
  45. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/agent_skills/skill_commands.py +0 -0
  46. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/agent_skills/skills_install_menu.py +0 -0
  47. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/agent_skills/skills_menu.py +0 -0
  48. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/auto_continue/__init__.py +0 -0
  49. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/auto_continue/classifier.py +0 -0
  50. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/auto_continue/register_callbacks.py +0 -0
  51. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/aws_bedrock/__init__.py +0 -0
  52. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/aws_bedrock/config.py +0 -0
  53. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/aws_bedrock/register_callbacks.py +0 -0
  54. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/aws_bedrock/utils.py +0 -0
  55. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/azure_foundry/README.md +0 -0
  56. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/azure_foundry/__init__.py +0 -0
  57. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/azure_foundry/config.py +0 -0
  58. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/azure_foundry/discovery.py +0 -0
  59. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/azure_foundry/register_callbacks.py +0 -0
  60. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/azure_foundry/token.py +0 -0
  61. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/azure_foundry/utils.py +0 -0
  62. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/btw/__init__.py +0 -0
  63. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/btw/inline_view.py +0 -0
  64. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/btw/register_callbacks.py +0 -0
  65. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/btw/side_query.py +0 -0
  66. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/chatgpt_oauth/IMAGEGEN_SKILL.md +0 -0
  67. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/chatgpt_oauth/__init__.py +0 -0
  68. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/chatgpt_oauth/config.py +0 -0
  69. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/chatgpt_oauth/image_generation.py +0 -0
  70. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/chatgpt_oauth/image_tool.py +0 -0
  71. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/chatgpt_oauth/model_catalog.py +0 -0
  72. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/chatgpt_oauth/oauth_flow.py +0 -0
  73. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/chatgpt_oauth/register_callbacks.py +0 -0
  74. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/chatgpt_oauth/test_plugin.py +0 -0
  75. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/chatgpt_oauth/usage.py +0 -0
  76. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/chatgpt_oauth/utils.py +0 -0
  77. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/claude_code_hooks/__init__.py +0 -0
  78. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/claude_code_hooks/config.py +0 -0
  79. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/claude_code_hooks/register_callbacks.py +0 -0
  80. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/claude_code_hooks/trust.py +0 -0
  81. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/claude_code_oauth/README.md +0 -0
  82. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/claude_code_oauth/SETUP.md +0 -0
  83. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/claude_code_oauth/__init__.py +0 -0
  84. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/claude_code_oauth/config.py +0 -0
  85. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/claude_code_oauth/fast_mode.py +0 -0
  86. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/claude_code_oauth/prompt_handler.py +0 -0
  87. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/claude_code_oauth/test_plugin.py +0 -0
  88. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/code_puppy_agent/AGENTS_AND_TOOLS.md +0 -0
  89. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/code_puppy_agent/MODELS_AND_MCP.md +0 -0
  90. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/code_puppy_agent/PLUGINS_AND_CALLBACKS.md +0 -0
  91. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/code_puppy_agent/SESSIONS_AND_HISTORY.md +0 -0
  92. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/code_puppy_agent/SKILL.md +0 -0
  93. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/code_puppy_agent/SKILLS_SYSTEM.md +0 -0
  94. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/code_puppy_agent/SYSTEM_PROMPT_CONFIG_AND_I18N.md +0 -0
  95. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/code_puppy_agent/__init__.py +0 -0
  96. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/code_puppy_agent/register_callbacks.py +0 -0
  97. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/completion_notification/__init__.py +0 -0
  98. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/completion_notification/config.py +0 -0
  99. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/completion_notification/locales/en-US.json +0 -0
  100. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/completion_notification/locales/es.json +0 -0
  101. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/completion_notification/locales/fr-CA.json +0 -0
  102. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/completion_notification/notifier.py +0 -0
  103. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/completion_notification/register_callbacks.py +0 -0
  104. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/computer_use/NativeCapture.swift +0 -0
  105. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/computer_use/README.md +0 -0
  106. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/computer_use/__init__.py +0 -0
  107. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/computer_use/accessibility.py +0 -0
  108. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/computer_use/activation.py +0 -0
  109. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/computer_use/backend.py +0 -0
  110. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/computer_use/backend_types.py +0 -0
  111. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/computer_use/capture.py +0 -0
  112. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/computer_use/commands.py +0 -0
  113. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/computer_use/geometry.py +0 -0
  114. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/computer_use/inline_image.py +0 -0
  115. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/computer_use/keycodes.py +0 -0
  116. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/computer_use/policy.py +0 -0
  117. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/computer_use/register_callbacks.py +0 -0
  118. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/computer_use/safety.py +0 -0
  119. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/computer_use/settle.py +0 -0
  120. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/computer_use/state.py +0 -0
  121. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/computer_use/tools.py +0 -0
  122. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/context_indicator/__init__.py +0 -0
  123. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/context_indicator/register_callbacks.py +0 -0
  124. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/context_indicator/usage.py +0 -0
  125. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/copilot_auth/__init__.py +0 -0
  126. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/copilot_auth/config.py +0 -0
  127. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/copilot_auth/reasoning_client.py +0 -0
  128. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/copilot_auth/register_callbacks.py +0 -0
  129. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/copilot_auth/utils.py +0 -0
  130. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/customizable_commands/__init__.py +0 -0
  131. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/customizable_commands/register_callbacks.py +0 -0
  132. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/dbos_durable_exec/__init__.py +0 -0
  133. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/dbos_durable_exec/cancel.py +0 -0
  134. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/dbos_durable_exec/commands.py +0 -0
  135. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/dbos_durable_exec/config.py +0 -0
  136. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/dbos_durable_exec/lifecycle.py +0 -0
  137. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/dbos_durable_exec/register_callbacks.py +0 -0
  138. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/dbos_durable_exec/runtime.py +0 -0
  139. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/dbos_durable_exec/startup_lock.py +0 -0
  140. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/dbos_durable_exec/workflow_ids.py +0 -0
  141. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/dbos_durable_exec/wrapper.py +0 -0
  142. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/destructive_command_guard/AGENTS.md +0 -0
  143. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/destructive_command_guard/__init__.py +0 -0
  144. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/destructive_command_guard/detector.py +0 -0
  145. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/destructive_command_guard/register_callbacks.py +0 -0
  146. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/emoji_filter/__init__.py +0 -0
  147. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/emoji_filter/config.py +0 -0
  148. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/emoji_filter/register_callbacks.py +0 -0
  149. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/emoji_filter/stripper.py +0 -0
  150. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/empty_html_comment_filter/register_callbacks.py +0 -0
  151. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/example_custom_command/README.md +0 -0
  152. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/example_custom_command/register_callbacks.py +0 -0
  153. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/file_permission_handler/__init__.py +0 -0
  154. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/file_permission_handler/register_callbacks.py +0 -0
  155. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/__init__.py +0 -0
  156. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/README.md +0 -0
  157. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/cheatsheet.md +0 -0
  158. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/pipeline.md +0 -0
  159. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/synopsis.md +0 -0
  160. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/about.md +0 -0
  161. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/address-feedback.md +0 -0
  162. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/ask.md +0 -0
  163. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/aug.md +0 -0
  164. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/auto-pilot.md +0 -0
  165. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/cheatsheet.md +0 -0
  166. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/commit.md +0 -0
  167. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/config.md +0 -0
  168. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/create-pr.md +0 -0
  169. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/exec.md +0 -0
  170. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/new.md +0 -0
  171. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/qa.md +0 -0
  172. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/rebase.md +0 -0
  173. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/review.md +0 -0
  174. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/split.md +0 -0
  175. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/squash-commits.md +0 -0
  176. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/status.md +0 -0
  177. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/tests.md +0 -0
  178. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_about.py +0 -0
  179. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_cheatsheet.py +0 -0
  180. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_status.py +0 -0
  181. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/installer.py +0 -0
  182. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/flux_bootstrap/register_callbacks.py +0 -0
  183. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/force_push_guard/__init__.py +0 -0
  184. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/force_push_guard/detector.py +0 -0
  185. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/force_push_guard/register_callbacks.py +0 -0
  186. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/fork/__init__.py +0 -0
  187. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/fork/register_callbacks.py +0 -0
  188. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/frontend_emitter/__init__.py +0 -0
  189. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/frontend_emitter/emitter.py +0 -0
  190. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/frontend_emitter/register_callbacks.py +0 -0
  191. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/frontend_emitter/session_context.py +0 -0
  192. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/grok_oauth/__init__.py +0 -0
  193. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/grok_oauth/config.py +0 -0
  194. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/grok_oauth/oauth_flow.py +0 -0
  195. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/grok_oauth/register_callbacks.py +0 -0
  196. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/grok_oauth/utils.py +0 -0
  197. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/herdr/README.md +0 -0
  198. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/herdr/__init__.py +0 -0
  199. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/herdr/client.py +0 -0
  200. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/herdr/register_callbacks.py +0 -0
  201. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/herdr/reporter.py +0 -0
  202. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/herdr/smoke.py +0 -0
  203. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/herdr/sources.py +0 -0
  204. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/hook_creator/__init__.py +0 -0
  205. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/hook_creator/register_callbacks.py +0 -0
  206. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/hook_manager/__init__.py +0 -0
  207. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/hook_manager/config.py +0 -0
  208. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/hook_manager/hooks_menu.py +0 -0
  209. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/hook_manager/register_callbacks.py +0 -0
  210. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/hook_manager/trust_handler.py +0 -0
  211. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/logfire_oauth/__init__.py +0 -0
  212. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/logfire_oauth/oauth.py +0 -0
  213. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/logfire_oauth/query_tool.py +0 -0
  214. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/logfire_oauth/register_callbacks.py +0 -0
  215. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/logfire_sessions/__init__.py +0 -0
  216. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/logfire_sessions/mirror.py +0 -0
  217. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/logfire_sessions/query.py +0 -0
  218. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/logfire_sessions/register_callbacks.py +0 -0
  219. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/logfire_sessions/sync.py +0 -0
  220. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/meta_oauth/__init__.py +0 -0
  221. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/meta_oauth/config.py +0 -0
  222. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/meta_oauth/oauth_flow.py +0 -0
  223. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/meta_oauth/register_callbacks.py +0 -0
  224. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/meta_oauth/utils.py +0 -0
  225. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/namespace_skill_search/README.md +0 -0
  226. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/namespace_skill_search/__init__.py +0 -0
  227. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/namespace_skill_search/namespaces.py +0 -0
  228. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/namespace_skill_search/register_callbacks.py +0 -0
  229. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/namespace_skill_search/search_tool.py +0 -0
  230. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/no_tools/__init__.py +0 -0
  231. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/no_tools/register_callbacks.py +0 -0
  232. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/oauth_pasteback.py +0 -0
  233. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/oauth_puppy_html.py +0 -0
  234. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/obsidian_agent/README.md +0 -0
  235. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/obsidian_agent/__init__.py +0 -0
  236. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/obsidian_agent/agent_obsidian.py +0 -0
  237. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/obsidian_agent/register_callbacks.py +0 -0
  238. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/ollama/__init__.py +0 -0
  239. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/ollama/register_callbacks.py +0 -0
  240. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/ollama_setup/__init__.py +0 -0
  241. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/ollama_setup/completer.py +0 -0
  242. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/ollama_setup/register_callbacks.py +0 -0
  243. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/openrouter_oauth/__init__.py +0 -0
  244. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/openrouter_oauth/config.py +0 -0
  245. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/openrouter_oauth/oauth_flow.py +0 -0
  246. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/openrouter_oauth/register_callbacks.py +0 -0
  247. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/openrouter_oauth/test_plugin.py +0 -0
  248. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/plugin_list/__init__.py +0 -0
  249. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/plugin_list/plugin_contributions.py +0 -0
  250. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/plugin_list/plugin_meta.py +0 -0
  251. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/plugin_list/plugin_text_utils.py +0 -0
  252. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/plugin_list/plugins_menu.py +0 -0
  253. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/plugin_list/plugins_menu_render.py +0 -0
  254. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/plugin_list/project_trust_flow.py +0 -0
  255. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/plugin_list/register_callbacks.py +0 -0
  256. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/pop_command/__init__.py +0 -0
  257. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/pop_command/register_callbacks.py +0 -0
  258. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/profiles/README.md +0 -0
  259. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/profiles/__init__.py +0 -0
  260. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/profiles/config.py +0 -0
  261. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/profiles/locales/en-US.json +0 -0
  262. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/profiles/menu.py +0 -0
  263. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/profiles/register_callbacks.py +0 -0
  264. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/prompt_newline/__init__.py +0 -0
  265. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/prompt_newline/config.py +0 -0
  266. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/prompt_newline/register_callbacks.py +0 -0
  267. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/prune/__init__.py +0 -0
  268. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/prune/prune_menu.py +0 -0
  269. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/prune/prune_model.py +0 -0
  270. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/prune/prune_render.py +0 -0
  271. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/prune/register_callbacks.py +0 -0
  272. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/puppy_kennel/README.md +0 -0
  273. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/puppy_kennel/__init__.py +0 -0
  274. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/puppy_kennel/commands.py +0 -0
  275. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/puppy_kennel/config.py +0 -0
  276. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/puppy_kennel/kennel.py +0 -0
  277. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/puppy_kennel/packer.py +0 -0
  278. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/puppy_kennel/recorder.py +0 -0
  279. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/puppy_kennel/register_callbacks.py +0 -0
  280. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/puppy_kennel/retriever.py +0 -0
  281. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/puppy_kennel/schema.py +0 -0
  282. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/puppy_kennel/state.py +0 -0
  283. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/puppy_kennel/tools.py +0 -0
  284. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/puppy_kennel/wings.py +0 -0
  285. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/puppy_spinner/README.md +0 -0
  286. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/puppy_spinner/__init__.py +0 -0
  287. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/puppy_spinner/builtin_frames.py +0 -0
  288. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/puppy_spinner/commands.py +0 -0
  289. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/puppy_spinner/picker.py +0 -0
  290. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/puppy_spinner/register_callbacks.py +0 -0
  291. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/puppy_spinner/spinners.py +0 -0
  292. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/qa_kitten_skill/SKILL.md +0 -0
  293. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/qa_kitten_skill/__init__.py +0 -0
  294. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/qa_kitten_skill/register_callbacks.py +0 -0
  295. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/quick_resume/__init__.py +0 -0
  296. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/quick_resume/register_callbacks.py +0 -0
  297. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/review_pr/__init__.py +0 -0
  298. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/review_pr/register_callbacks.py +0 -0
  299. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/session_namer/__init__.py +0 -0
  300. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/session_namer/namer.py +0 -0
  301. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/session_namer/register_callbacks.py +0 -0
  302. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/spill/LICENSE.deepseek +0 -0
  303. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/spill/__init__.py +0 -0
  304. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/spill/register_callbacks.py +0 -0
  305. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/spill/store.py +0 -0
  306. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/stack_dump/__init__.py +0 -0
  307. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/stack_dump/register_callbacks.py +0 -0
  308. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/statusline/__init__.py +0 -0
  309. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/statusline/config.py +0 -0
  310. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/statusline/payload.py +0 -0
  311. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/statusline/prompt_patch.py +0 -0
  312. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/statusline/register_callbacks.py +0 -0
  313. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/statusline/runner.py +0 -0
  314. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/statusline/statusline_command.py +0 -0
  315. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/steer_queue/__init__.py +0 -0
  316. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/steer_queue/queue_menu.py +0 -0
  317. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/steer_queue/register_callbacks.py +0 -0
  318. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/subagent_panel/README.md +0 -0
  319. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/subagent_panel/__init__.py +0 -0
  320. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/subagent_panel/coalesce_patch.py +0 -0
  321. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/subagent_panel/panel_render.py +0 -0
  322. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/subagent_panel/register_callbacks.py +0 -0
  323. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/subagent_panel/resume_repaint.py +0 -0
  324. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/subagent_panel/state.py +0 -0
  325. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/switch_agent_resume/__init__.py +0 -0
  326. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/switch_agent_resume/register_callbacks.py +0 -0
  327. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/termflow_tui.py +0 -0
  328. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/theme/README.md +0 -0
  329. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/theme/__init__.py +0 -0
  330. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/theme/bundled_palettes.py +0 -0
  331. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/theme/content_styles.py +0 -0
  332. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/theme/osc_palette.py +0 -0
  333. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/theme/picker.py +0 -0
  334. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/theme/prompt_toolkit_theme.py +0 -0
  335. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/theme/register_callbacks.py +0 -0
  336. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/theme/rich_themes.py +0 -0
  337. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/theme/themes.py +0 -0
  338. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/timestamp_heartbeat/__init__.py +0 -0
  339. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/timestamp_heartbeat/register_callbacks.py +0 -0
  340. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/token_ratio_learner/__init__.py +0 -0
  341. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/token_ratio_learner/ratios.py +0 -0
  342. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/token_ratio_learner/register_callbacks.py +0 -0
  343. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/universal_constructor/__init__.py +0 -0
  344. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/universal_constructor/models.py +0 -0
  345. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/universal_constructor/provider.py +0 -0
  346. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/universal_constructor/register_callbacks.py +0 -0
  347. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/universal_constructor/registry.py +0 -0
  348. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/universal_constructor/sandbox.py +0 -0
  349. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/web_retriever_skill/SKILL.md +0 -0
  350. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/web_retriever_skill/__init__.py +0 -0
  351. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/web_retriever_skill/register_callbacks.py +0 -0
  352. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/wiggum/__init__.py +0 -0
  353. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/wiggum/goal_runs.py +0 -0
  354. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/wiggum/judge.py +0 -0
  355. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/wiggum/judge_config.py +0 -0
  356. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/wiggum/judges_menu.py +0 -0
  357. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/wiggum/register_callbacks.py +0 -0
  358. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/wiggum/state.py +0 -0
  359. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/code_puppy_core_plugins/yolo_cli/__init__.py +0 -0
  360. {code_puppy_core_plugins-0.0.43 → code_puppy_core_plugins-0.0.45}/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.43
3
+ Version: 0.0.45
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
@@ -0,0 +1,98 @@
1
+ """Claude model generation filtering."""
2
+
3
+ import logging
4
+ import re
5
+ from typing import Dict, List, Tuple, Union
6
+
7
+
8
+ logger = logging.getLogger(__name__)
9
+
10
+
11
+ def filter_latest_claude_models(
12
+ models: List[str], max_per_family: Union[int, Dict[str, int]] = 2
13
+ ) -> List[str]:
14
+ """Filter models to keep the top N latest haiku, sonnet, and opus.
15
+
16
+ Parses model names in the format claude-{family}-{major}-{minor}-{date}
17
+ and returns the top ``max_per_family`` versions of each family
18
+ (haiku, sonnet, opus), sorted newest-first.
19
+
20
+ Args:
21
+ models: List of model name strings to filter.
22
+ max_per_family: Either a single int applied to all families, or a dict
23
+ mapping family name to its limit (e.g. ``{"opus": 3}``). Families
24
+ not present in the dict fall back to ``"default"`` key, or ``2``.
25
+ """
26
+ # Dedupe while preserving order: base and "-long" config entries share the
27
+ # same underlying model name, and a duplicate must not consume a slot of
28
+ # the per-family limit (e.g. [opus-5, opus-5, opus-4-8] silently dropping
29
+ # opus-4-7 at limit 3).
30
+ models = list(dict.fromkeys(models))
31
+
32
+ # Collect all parsed models per family
33
+ # family -> list of (model_name, major, minor, date)
34
+ family_models: Dict[str, List[Tuple[str, int, int, int]]] = {}
35
+
36
+ for model_name in models:
37
+ if model_name == "claude-opus-5":
38
+ family_models.setdefault("opus", []).append((model_name, 5, 0, 0))
39
+ continue
40
+ if model_name == "claude-opus-4-8":
41
+ family_models.setdefault("opus", []).append((model_name, 4, 8, 20250301))
42
+ continue
43
+ if model_name == "claude-opus-4-7":
44
+ family_models.setdefault("opus", []).append((model_name, 4, 7, 20250219))
45
+ continue
46
+ if model_name == "claude-opus-4-6":
47
+ family_models.setdefault("opus", []).append((model_name, 4, 6, 20260205))
48
+ continue
49
+ if model_name == "claude-sonnet-4-6":
50
+ family_models.setdefault("sonnet", []).append((model_name, 4, 6, 20250610))
51
+ continue
52
+ if model_name == "claude-sonnet-5":
53
+ family_models.setdefault("sonnet", []).append((model_name, 5, 0, 0))
54
+ continue
55
+ if model_name == "claude-fable-5":
56
+ family_models.setdefault("fable", []).append((model_name, 5, 0, 0))
57
+ continue
58
+ if model_name == "claude-fable-5-1":
59
+ family_models.setdefault("fable", []).append((model_name, 5, 1, 0))
60
+ continue
61
+ # Match pattern: claude-{family}-{major}-{minor}-{date}
62
+ # Examples: claude-haiku-3-5-20241022, claude-sonnet-4-5-20250929
63
+ match = re.match(r"claude-(haiku|sonnet|opus)-(\d+)-(\d+)-(\d+)", model_name)
64
+ if not match:
65
+ # Also try pattern with dots: claude-{family}-{major}.{minor}-{date}
66
+ match = re.match(
67
+ r"claude-(haiku|sonnet|opus)-(\d+)\.(\d+)-(\d+)", model_name
68
+ )
69
+
70
+ if not match:
71
+ continue
72
+
73
+ family = match.group(1)
74
+ major = int(match.group(2))
75
+ minor = int(match.group(3))
76
+ date = int(match.group(4))
77
+
78
+ family_models.setdefault(family, []).append((model_name, major, minor, date))
79
+
80
+ # Sort each family descending and keep the top N
81
+ filtered: List[str] = []
82
+ for family, family_entries in family_models.items():
83
+ if isinstance(max_per_family, dict):
84
+ limit = max_per_family.get(family, max_per_family.get("default", 2))
85
+ else:
86
+ limit = max_per_family
87
+ family_entries.sort(key=lambda e: (e[1], e[2], e[3]), reverse=True)
88
+ for entry in family_entries[:limit]:
89
+ filtered.append(entry[0])
90
+
91
+ logger.info(
92
+ "Filtered %d models to %d latest models (max_per_family=%s): %s",
93
+ len(models),
94
+ len(filtered),
95
+ max_per_family,
96
+ filtered,
97
+ )
98
+ return filtered
@@ -0,0 +1,164 @@
1
+ """Claude OAuth model construction; registration lives in register_callbacks."""
2
+
3
+ from typing import Any, Dict
4
+
5
+ from code_puppy.i18n import t
6
+ from code_puppy.messaging import emit_warning
7
+ from code_puppy.provider_identity import (
8
+ make_anthropic_provider,
9
+ resolve_provider_identity,
10
+ )
11
+
12
+ from .fast_mode import (
13
+ FAST_SETTING_KEY,
14
+ ensure_fast_beta_header,
15
+ patch_anthropic_client_fast_mode,
16
+ )
17
+
18
+
19
+ def create_claude_code_model(model_name: str, model_config: Dict, config: Dict) -> Any:
20
+ """Create a Claude Code model instance.
21
+
22
+ This handler is registered via the 'register_model_type' callback to handle
23
+ models with type='claude_code'.
24
+ """
25
+ from anthropic import AsyncAnthropic
26
+ from pydantic_ai.models.anthropic import AnthropicModel
27
+
28
+ from code_puppy.claude_cache_client import ClaudeCacheAsyncClient
29
+ from code_puppy.http_utils import get_cert_bundle_path
30
+ from code_puppy.model_factory import (
31
+ CONTEXT_1M_BETA,
32
+ get_custom_config,
33
+ make_model_settings,
34
+ )
35
+
36
+ from . import register_callbacks as callbacks
37
+
38
+ get_valid_access_token = callbacks.get_valid_access_token
39
+ _reauthenticate_after_expired_oauth = callbacks._reauthenticate_after_expired_oauth
40
+ url, headers, verify, api_key, timeout = get_custom_config(model_config)
41
+
42
+ # Refresh token if this is from the plugin
43
+ if model_config.get("oauth_source") == "claude-code-plugin":
44
+ refreshed_token = get_valid_access_token()
45
+ api_key = refreshed_token
46
+ if refreshed_token:
47
+ custom_endpoint = model_config.get("custom_endpoint")
48
+ if isinstance(custom_endpoint, dict):
49
+ custom_endpoint["api_key"] = refreshed_token
50
+
51
+ if not api_key:
52
+ emit_warning(
53
+ t(
54
+ "oauth.claude.model.no_api_key",
55
+ model=model_config.get("name") or "(unknown)",
56
+ )
57
+ )
58
+ return None
59
+
60
+ # Interleaved thinking (defaults True for OAuth models). NOTE: read via
61
+ # get_all_model_settings — these plugin-owned settings aren't in core's
62
+ # supported_settings allowlist (see fast_mode.FAST_SETTING_KEY).
63
+ from code_puppy.config import get_all_model_settings
64
+
65
+ per_model_settings = get_all_model_settings(model_name)
66
+ interleaved_thinking = per_model_settings.get("interleaved_thinking", True)
67
+ fast_enabled = bool(per_model_settings.get(FAST_SETTING_KEY, False))
68
+
69
+ # Handle anthropic-beta header based on interleaved_thinking setting
70
+ if "anthropic-beta" in headers:
71
+ beta_parts = [p.strip() for p in headers["anthropic-beta"].split(",")]
72
+ if interleaved_thinking:
73
+ if "interleaved-thinking-2025-05-14" not in beta_parts:
74
+ beta_parts.append("interleaved-thinking-2025-05-14")
75
+ else:
76
+ beta_parts = [p for p in beta_parts if "interleaved-thinking" not in p]
77
+ headers["anthropic-beta"] = ",".join(beta_parts) if beta_parts else None
78
+ if headers.get("anthropic-beta") is None:
79
+ del headers["anthropic-beta"]
80
+ elif interleaved_thinking:
81
+ headers["anthropic-beta"] = "interleaved-thinking-2025-05-14"
82
+
83
+ # Add 1M context beta header for long-context models
84
+ if model_config.get("context_length", 0) >= 1_000_000:
85
+ if "anthropic-beta" in headers:
86
+ beta_parts = [p.strip() for p in headers["anthropic-beta"].split(",")]
87
+ if CONTEXT_1M_BETA not in beta_parts:
88
+ beta_parts.append(CONTEXT_1M_BETA)
89
+ headers["anthropic-beta"] = ",".join(beta_parts)
90
+ else:
91
+ headers["anthropic-beta"] = CONTEXT_1M_BETA
92
+
93
+ # Fast mode: append fast-mode-2026-02-01 beta marker when enabled
94
+ ensure_fast_beta_header(headers, fast_enabled)
95
+
96
+ # Use a dedicated client wrapper for OAuth refresh and tool-name transport
97
+ # transformations; prompt-cache markers are owned by model settings.
98
+ if verify is None:
99
+ verify = get_cert_bundle_path()
100
+
101
+ # No HTTP/2 for OAuth: the UnprefixingStream tool-name rewrite breaks under
102
+ # HTTP/2's compression handling, causing zlib decompression errors.
103
+ kwargs = {}
104
+ # Plugin releases land before core. Old transports keep their legacy path.
105
+ import inspect
106
+ from .runtime_credentials import current_token, refresh_token
107
+
108
+ if "oauth_token_provider" in inspect.signature(ClaudeCacheAsyncClient).parameters:
109
+ kwargs.update(
110
+ oauth_token_provider=current_token, oauth_refresh_callback=refresh_token
111
+ )
112
+ client = ClaudeCacheAsyncClient(
113
+ **kwargs,
114
+ headers=headers,
115
+ verify=verify,
116
+ timeout=180,
117
+ http2=False,
118
+ # Claude Code OAuth requires the ``cp_`` tool-name prefix; the wire
119
+ # format Anthropic's CLI uses won't accept un-prefixed tools.
120
+ apply_claude_code_prefix=True,
121
+ oauth_reauthentication_callback=lambda: _reauthenticate_after_expired_oauth(
122
+ model_name
123
+ ),
124
+ )
125
+
126
+ anthropic_client = AsyncAnthropic(
127
+ base_url=url,
128
+ http_client=client,
129
+ auth_token=api_key,
130
+ )
131
+
132
+ def _update_runtime_token(access_token: str) -> None:
133
+ anthropic_client.auth_token = access_token
134
+ custom_endpoint = model_config.get("custom_endpoint")
135
+ if isinstance(custom_endpoint, dict):
136
+ custom_endpoint["api_key"] = access_token
137
+
138
+ client.set_token_update_callback(_update_runtime_token)
139
+ # Fast mode wrapper re-reads the setting on every call so
140
+ # /claude-code-fast takes effect live.
141
+
142
+ patch_anthropic_client_fast_mode(anthropic_client, model_name)
143
+ anthropic_client.api_key = None
144
+ anthropic_client.auth_token = api_key
145
+ provider = make_anthropic_provider(
146
+ resolve_provider_identity(model_name, model_config),
147
+ anthropic_client=anthropic_client,
148
+ )
149
+ # Prompt caching belongs to pydantic-ai's native Anthropic settings, not
150
+ # the transport shim. OAuth subscription models receive the free one-hour
151
+ # TTL at all three cache breakpoints.
152
+ model_settings = make_model_settings(model_name)
153
+ model_settings.update(
154
+ {
155
+ "anthropic_cache_instructions": "1h",
156
+ "anthropic_cache_tool_definitions": "1h",
157
+ "anthropic_cache_messages": "1h",
158
+ }
159
+ )
160
+ return AnthropicModel(
161
+ model_name=model_config["name"],
162
+ provider=provider,
163
+ settings=model_settings,
164
+ )
@@ -18,19 +18,13 @@ from code_puppy.callbacks import register_callback
18
18
  from code_puppy.i18n import t
19
19
  from code_puppy.messaging import emit_error, emit_info, emit_success, emit_warning
20
20
  from code_puppy.model_switching import set_model_and_reload_agent
21
- from code_puppy.provider_identity import (
22
- make_anthropic_provider,
23
- resolve_provider_identity,
24
- )
25
21
 
26
22
  from ..oauth_pasteback import parse_oauth_callback_input, read_available_stdin_line
27
23
  from ..oauth_puppy_html import oauth_failure_html, oauth_success_html
28
24
  from .config import CLAUDE_CODE_OAUTH_CONFIG, get_token_storage_path
29
25
  from .fast_mode import (
30
26
  FAST_SETTING_KEY,
31
- ensure_fast_beta_header,
32
27
  is_fast_mode_enabled,
33
- patch_anthropic_client_fast_mode,
34
28
  )
35
29
  from .prompt_handler import prepare_claude_code_prompt
36
30
  from .utils import (
@@ -462,7 +456,9 @@ def _handle_custom_command(command: str, name: str) -> Optional[bool]:
462
456
  if name == "claude-code-logout":
463
457
  token_path = get_token_storage_path()
464
458
  if token_path.exists():
465
- token_path.unlink()
459
+ from .token_store import remove_tokens
460
+
461
+ remove_tokens()
466
462
  emit_info(t("oauth.claude.cmd.logout.tokens_removed"))
467
463
 
468
464
  removed = remove_claude_code_models()
@@ -475,138 +471,10 @@ def _handle_custom_command(command: str, name: str) -> Optional[bool]:
475
471
  return None
476
472
 
477
473
 
478
- def _create_claude_code_model(model_name: str, model_config: Dict, config: Dict) -> Any:
479
- """Create a Claude Code model instance.
480
-
481
- This handler is registered via the 'register_model_type' callback to handle
482
- models with type='claude_code'.
483
- """
484
- from anthropic import AsyncAnthropic
485
- from pydantic_ai.models.anthropic import AnthropicModel
486
-
487
- from code_puppy.claude_cache_client import ClaudeCacheAsyncClient
488
- from code_puppy.http_utils import get_cert_bundle_path
489
- from code_puppy.model_factory import (
490
- CONTEXT_1M_BETA,
491
- get_custom_config,
492
- make_model_settings,
493
- )
494
-
495
- url, headers, verify, api_key, timeout = get_custom_config(model_config)
496
-
497
- # Refresh token if this is from the plugin
498
- if model_config.get("oauth_source") == "claude-code-plugin":
499
- refreshed_token = get_valid_access_token()
500
- if refreshed_token:
501
- api_key = refreshed_token
502
- custom_endpoint = model_config.get("custom_endpoint")
503
- if isinstance(custom_endpoint, dict):
504
- custom_endpoint["api_key"] = refreshed_token
505
-
506
- if not api_key:
507
- emit_warning(
508
- t(
509
- "oauth.claude.model.no_api_key",
510
- model=model_config.get("name") or "(unknown)",
511
- )
512
- )
513
- return None
474
+ def _create_claude_code_model(model_name, model_config, config):
475
+ from .model_provider import create_claude_code_model
514
476
 
515
- # Interleaved thinking (defaults True for OAuth models). NOTE: read via
516
- # get_all_model_settings — these plugin-owned settings aren't in core's
517
- # supported_settings allowlist (see fast_mode.FAST_SETTING_KEY).
518
- from code_puppy.config import get_all_model_settings
519
-
520
- per_model_settings = get_all_model_settings(model_name)
521
- interleaved_thinking = per_model_settings.get("interleaved_thinking", True)
522
- fast_enabled = bool(per_model_settings.get(FAST_SETTING_KEY, False))
523
-
524
- # Handle anthropic-beta header based on interleaved_thinking setting
525
- if "anthropic-beta" in headers:
526
- beta_parts = [p.strip() for p in headers["anthropic-beta"].split(",")]
527
- if interleaved_thinking:
528
- if "interleaved-thinking-2025-05-14" not in beta_parts:
529
- beta_parts.append("interleaved-thinking-2025-05-14")
530
- else:
531
- beta_parts = [p for p in beta_parts if "interleaved-thinking" not in p]
532
- headers["anthropic-beta"] = ",".join(beta_parts) if beta_parts else None
533
- if headers.get("anthropic-beta") is None:
534
- del headers["anthropic-beta"]
535
- elif interleaved_thinking:
536
- headers["anthropic-beta"] = "interleaved-thinking-2025-05-14"
537
-
538
- # Add 1M context beta header for long-context models
539
- if model_config.get("context_length", 0) >= 1_000_000:
540
- if "anthropic-beta" in headers:
541
- beta_parts = [p.strip() for p in headers["anthropic-beta"].split(",")]
542
- if CONTEXT_1M_BETA not in beta_parts:
543
- beta_parts.append(CONTEXT_1M_BETA)
544
- headers["anthropic-beta"] = ",".join(beta_parts)
545
- else:
546
- headers["anthropic-beta"] = CONTEXT_1M_BETA
547
-
548
- # Fast mode: append fast-mode-2026-02-01 beta marker when enabled
549
- ensure_fast_beta_header(headers, fast_enabled)
550
-
551
- # Use a dedicated client wrapper for OAuth refresh and tool-name transport
552
- # transformations; prompt-cache markers are owned by model settings.
553
- if verify is None:
554
- verify = get_cert_bundle_path()
555
-
556
- # No HTTP/2 for OAuth: the UnprefixingStream tool-name rewrite breaks under
557
- # HTTP/2's compression handling, causing zlib decompression errors.
558
- client = ClaudeCacheAsyncClient(
559
- headers=headers,
560
- verify=verify,
561
- timeout=180,
562
- http2=False,
563
- # Claude Code OAuth requires the ``cp_`` tool-name prefix; the wire
564
- # format Anthropic's CLI uses won't accept un-prefixed tools.
565
- apply_claude_code_prefix=True,
566
- oauth_reauthentication_callback=lambda: _reauthenticate_after_expired_oauth(
567
- model_name
568
- ),
569
- )
570
-
571
- anthropic_client = AsyncAnthropic(
572
- base_url=url,
573
- http_client=client,
574
- auth_token=api_key,
575
- )
576
-
577
- def _update_runtime_token(access_token: str) -> None:
578
- anthropic_client.auth_token = access_token
579
- custom_endpoint = model_config.get("custom_endpoint")
580
- if isinstance(custom_endpoint, dict):
581
- custom_endpoint["api_key"] = access_token
582
-
583
- client.set_token_update_callback(_update_runtime_token)
584
- # Fast mode wrapper re-reads the setting on every call so
585
- # /claude-code-fast takes effect live.
586
-
587
- patch_anthropic_client_fast_mode(anthropic_client, model_name)
588
- anthropic_client.api_key = None
589
- anthropic_client.auth_token = api_key
590
- provider = make_anthropic_provider(
591
- resolve_provider_identity(model_name, model_config),
592
- anthropic_client=anthropic_client,
593
- )
594
- # Prompt caching belongs to pydantic-ai's native Anthropic settings, not
595
- # the transport shim. OAuth subscription models receive the free one-hour
596
- # TTL at all three cache breakpoints.
597
- model_settings = make_model_settings(model_name)
598
- model_settings.update(
599
- {
600
- "anthropic_cache_instructions": "1h",
601
- "anthropic_cache_tool_definitions": "1h",
602
- "anthropic_cache_messages": "1h",
603
- }
604
- )
605
- return AnthropicModel(
606
- model_name=model_config["name"],
607
- provider=provider,
608
- settings=model_settings,
609
- )
477
+ return create_claude_code_model(model_name, model_config, config)
610
478
 
611
479
 
612
480
  def _register_model_types() -> List[Dict[str, Any]]:
@@ -624,12 +492,7 @@ async def _on_agent_run_start(
624
492
  model_name: str,
625
493
  session_id: Optional[str] = None,
626
494
  ) -> None:
627
- """Start token refresh heartbeat for Claude Code OAuth models.
628
-
629
- This callback is triggered when an agent run starts. If the model is a
630
- Claude Code OAuth model, we start a background heartbeat to keep the
631
- token fresh during long-running operations.
632
- """
495
+ """Start token refresh heartbeat for Claude Code OAuth models."""
633
496
  # Only start heartbeat for Claude Code models
634
497
  if not model_name.startswith("claude-code"):
635
498
  return
@@ -637,12 +500,14 @@ async def _on_agent_run_start(
637
500
  try:
638
501
  from .token_refresh_heartbeat import TokenRefreshHeartbeat
639
502
 
503
+ key = (agent_name, model_name, session_id)
504
+ existing = _active_heartbeats.get(key)
505
+ if existing:
506
+ existing[1] += 1
507
+ return
640
508
  heartbeat = TokenRefreshHeartbeat()
509
+ _active_heartbeats[key] = [heartbeat, 1]
641
510
  await heartbeat.start()
642
-
643
- # Store heartbeat for cleanup, keyed by session_id
644
- key = session_id or "default"
645
- _active_heartbeats[key] = heartbeat
646
511
  logger.debug(
647
512
  "Started token refresh heartbeat for session %s (model: %s)",
648
513
  key,
@@ -663,14 +528,16 @@ async def _on_agent_run_end(
663
528
  response_text: Optional[str] = None,
664
529
  metadata: Optional[Dict[str, Any]] = None,
665
530
  ) -> None:
666
- """Stop token refresh heartbeat when agent run ends.
667
-
668
- This callback is triggered when an agent run completes (success or failure).
669
- We stop any heartbeat that was started for this session.
670
- """
531
+ """Stop token refresh heartbeat when agent run ends."""
671
532
  # We don't use response_text or metadata, just cleanup the heartbeat
672
- key = session_id or "default"
673
- heartbeat = _active_heartbeats.pop(key, None)
533
+ key = (agent_name, model_name, session_id)
534
+ entry = _active_heartbeats.get(key)
535
+ if entry is None:
536
+ return
537
+ entry[1] -= 1
538
+ if entry[1]:
539
+ return
540
+ heartbeat = _active_heartbeats.pop(key)[0]
674
541
 
675
542
  if heartbeat is not None:
676
543
  try:
@@ -685,11 +552,7 @@ async def _on_agent_run_end(
685
552
 
686
553
 
687
554
  def _hook_check_token_expiry() -> bool:
688
- """Hook: is the stored Claude Code OAuth token inside its refresh window?
689
-
690
- Consumed by core's ``ClaudeCacheAsyncClient._check_stored_token_expiry``
691
- (replacing a direct core->plugin import).
692
- """
555
+ """Hook: is the stored Claude Code OAuth token inside its refresh window?"""
693
556
  tokens = load_stored_tokens()
694
557
  if not tokens:
695
558
  return False
@@ -697,10 +560,7 @@ def _hook_check_token_expiry() -> bool:
697
560
 
698
561
 
699
562
  def _hook_refresh_token() -> Optional[str]:
700
- """Hook: force a refresh-token exchange, returning the new access token.
701
-
702
- Consumed by core's ``ClaudeCacheAsyncClient._refresh_claude_oauth_token``.
703
- """
563
+ """Hook: force a refresh-token exchange, returning the new access token."""
704
564
  return refresh_access_token(force=True)
705
565
 
706
566
 
@@ -0,0 +1,15 @@
1
+ """Async credential providers for core's request-time OAuth lifecycle."""
2
+
3
+ import asyncio
4
+
5
+ from . import utils
6
+
7
+
8
+ async def current_token():
9
+ return await asyncio.to_thread(utils.get_valid_access_token)
10
+
11
+
12
+ async def refresh_token(*, rejected_token=None):
13
+ return await asyncio.to_thread(
14
+ utils.refresh_access_token, force=True, rejected_token=rejected_token
15
+ )
@@ -225,7 +225,7 @@ async def force_token_refresh() -> bool:
225
225
  from .utils import refresh_access_token
226
226
 
227
227
  logger.info("Forcing token refresh")
228
- refreshed_token = refresh_access_token(force=True)
228
+ refreshed_token = await asyncio.to_thread(refresh_access_token, force=True)
229
229
 
230
230
  if refreshed_token:
231
231
  _last_refresh_time = time.time()