code-puppy-core-plugins 0.0.2__tar.gz → 0.0.5__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 (317) hide show
  1. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/PKG-INFO +2 -1
  2. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/remote_catalog.py +5 -5
  3. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/skill_catalog.py +58 -38
  4. code_puppy_core_plugins-0.0.5/code_puppy_core_plugins/spill/LICENSE.deepseek +28 -0
  5. code_puppy_core_plugins-0.0.5/code_puppy_core_plugins/spill/__init__.py +1 -0
  6. code_puppy_core_plugins-0.0.5/code_puppy_core_plugins/spill/register_callbacks.py +235 -0
  7. code_puppy_core_plugins-0.0.5/code_puppy_core_plugins/spill/store.py +97 -0
  8. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/pyproject.toml +5 -1
  9. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/.gitignore +0 -0
  10. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/LICENSE +0 -0
  11. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/README.md +0 -0
  12. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/__init__.py +0 -0
  13. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/README.md +0 -0
  14. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/__init__.py +0 -0
  15. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/agent.py +0 -0
  16. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/bridge.py +0 -0
  17. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/capabilities.py +0 -0
  18. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/commands.py +0 -0
  19. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/content.py +0 -0
  20. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/io_delegation.py +0 -0
  21. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/mcp_config.py +0 -0
  22. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/permissions.py +0 -0
  23. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/persistence.py +0 -0
  24. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/register_callbacks.py +0 -0
  25. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/replay.py +0 -0
  26. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/session.py +0 -0
  27. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/session_config.py +0 -0
  28. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/acp/state.py +0 -0
  29. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/__init__.py +0 -0
  30. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/config.py +0 -0
  31. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/discovery.py +0 -0
  32. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/downloader.py +0 -0
  33. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/enabled_skills.py +0 -0
  34. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/installer.py +0 -0
  35. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/metadata.py +0 -0
  36. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/prompt_builder.py +0 -0
  37. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/provider.py +0 -0
  38. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/register_callbacks.py +0 -0
  39. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/skill_commands.py +0 -0
  40. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/skills_install_menu.py +0 -0
  41. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/agent_skills/skills_menu.py +0 -0
  42. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/aws_bedrock/__init__.py +0 -0
  43. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/aws_bedrock/config.py +0 -0
  44. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/aws_bedrock/register_callbacks.py +0 -0
  45. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/aws_bedrock/utils.py +0 -0
  46. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/azure_foundry/README.md +0 -0
  47. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/azure_foundry/__init__.py +0 -0
  48. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/azure_foundry/config.py +0 -0
  49. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/azure_foundry/discovery.py +0 -0
  50. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/azure_foundry/register_callbacks.py +0 -0
  51. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/azure_foundry/token.py +0 -0
  52. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/azure_foundry/utils.py +0 -0
  53. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/btw/__init__.py +0 -0
  54. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/btw/inline_view.py +0 -0
  55. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/btw/register_callbacks.py +0 -0
  56. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/btw/side_query.py +0 -0
  57. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/chatgpt_oauth/IMAGEGEN_SKILL.md +0 -0
  58. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/chatgpt_oauth/__init__.py +0 -0
  59. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/chatgpt_oauth/config.py +0 -0
  60. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/chatgpt_oauth/image_generation.py +0 -0
  61. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/chatgpt_oauth/image_tool.py +0 -0
  62. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/chatgpt_oauth/oauth_flow.py +0 -0
  63. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/chatgpt_oauth/register_callbacks.py +0 -0
  64. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/chatgpt_oauth/test_plugin.py +0 -0
  65. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/chatgpt_oauth/usage.py +0 -0
  66. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/chatgpt_oauth/utils.py +0 -0
  67. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/claude_code_hooks/__init__.py +0 -0
  68. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/claude_code_hooks/config.py +0 -0
  69. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/claude_code_hooks/register_callbacks.py +0 -0
  70. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/claude_code_oauth/README.md +0 -0
  71. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/claude_code_oauth/SETUP.md +0 -0
  72. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/claude_code_oauth/__init__.py +0 -0
  73. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/claude_code_oauth/config.py +0 -0
  74. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/claude_code_oauth/fast_mode.py +0 -0
  75. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/claude_code_oauth/prompt_handler.py +0 -0
  76. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/claude_code_oauth/register_callbacks.py +0 -0
  77. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/claude_code_oauth/test_plugin.py +0 -0
  78. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
  79. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/claude_code_oauth/utils.py +0 -0
  80. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/code_puppy_agent/AGENTS_AND_TOOLS.md +0 -0
  81. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/code_puppy_agent/MODELS_AND_MCP.md +0 -0
  82. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/code_puppy_agent/PLUGINS_AND_CALLBACKS.md +0 -0
  83. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/code_puppy_agent/SESSIONS_AND_HISTORY.md +0 -0
  84. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/code_puppy_agent/SKILL.md +0 -0
  85. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/code_puppy_agent/SKILLS_SYSTEM.md +0 -0
  86. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/code_puppy_agent/SYSTEM_PROMPT_CONFIG_AND_I18N.md +0 -0
  87. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/code_puppy_agent/__init__.py +0 -0
  88. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/code_puppy_agent/register_callbacks.py +0 -0
  89. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/NativeCapture.swift +0 -0
  90. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/README.md +0 -0
  91. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/__init__.py +0 -0
  92. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/accessibility.py +0 -0
  93. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/activation.py +0 -0
  94. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/backend.py +0 -0
  95. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/backend_types.py +0 -0
  96. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/capture.py +0 -0
  97. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/commands.py +0 -0
  98. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/geometry.py +0 -0
  99. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/inline_image.py +0 -0
  100. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/keycodes.py +0 -0
  101. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/policy.py +0 -0
  102. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/register_callbacks.py +0 -0
  103. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/safety.py +0 -0
  104. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/settle.py +0 -0
  105. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/state.py +0 -0
  106. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/computer_use/tools.py +0 -0
  107. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/context_indicator/__init__.py +0 -0
  108. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/context_indicator/register_callbacks.py +0 -0
  109. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/context_indicator/usage.py +0 -0
  110. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/copilot_auth/__init__.py +0 -0
  111. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/copilot_auth/config.py +0 -0
  112. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/copilot_auth/reasoning_client.py +0 -0
  113. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/copilot_auth/register_callbacks.py +0 -0
  114. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/copilot_auth/utils.py +0 -0
  115. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/customizable_commands/__init__.py +0 -0
  116. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/customizable_commands/register_callbacks.py +0 -0
  117. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/dbos_durable_exec/__init__.py +0 -0
  118. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/dbos_durable_exec/cancel.py +0 -0
  119. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/dbos_durable_exec/commands.py +0 -0
  120. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/dbos_durable_exec/config.py +0 -0
  121. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/dbos_durable_exec/lifecycle.py +0 -0
  122. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/dbos_durable_exec/register_callbacks.py +0 -0
  123. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/dbos_durable_exec/runtime.py +0 -0
  124. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/dbos_durable_exec/startup_lock.py +0 -0
  125. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/dbos_durable_exec/workflow_ids.py +0 -0
  126. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/dbos_durable_exec/wrapper.py +0 -0
  127. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/destructive_command_guard/AGENTS.md +0 -0
  128. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/destructive_command_guard/__init__.py +0 -0
  129. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/destructive_command_guard/detector.py +0 -0
  130. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/destructive_command_guard/register_callbacks.py +0 -0
  131. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/emoji_filter/__init__.py +0 -0
  132. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/emoji_filter/config.py +0 -0
  133. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/emoji_filter/register_callbacks.py +0 -0
  134. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/emoji_filter/stripper.py +0 -0
  135. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/empty_html_comment_filter/register_callbacks.py +0 -0
  136. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/example_custom_command/README.md +0 -0
  137. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/example_custom_command/register_callbacks.py +0 -0
  138. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/file_permission_handler/__init__.py +0 -0
  139. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/file_permission_handler/register_callbacks.py +0 -0
  140. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/__init__.py +0 -0
  141. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/README.md +0 -0
  142. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/cheatsheet.md +0 -0
  143. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/pipeline.md +0 -0
  144. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/synopsis.md +0 -0
  145. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/about.md +0 -0
  146. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/address-feedback.md +0 -0
  147. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/ask.md +0 -0
  148. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/aug.md +0 -0
  149. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/auto-pilot.md +0 -0
  150. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/cheatsheet.md +0 -0
  151. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/commit.md +0 -0
  152. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/config.md +0 -0
  153. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/create-pr.md +0 -0
  154. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/exec.md +0 -0
  155. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/new.md +0 -0
  156. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/qa.md +0 -0
  157. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/rebase.md +0 -0
  158. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/review.md +0 -0
  159. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/split.md +0 -0
  160. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/squash-commits.md +0 -0
  161. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/status.md +0 -0
  162. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/tests.md +0 -0
  163. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_about.py +0 -0
  164. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_cheatsheet.py +0 -0
  165. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_status.py +0 -0
  166. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/installer.py +0 -0
  167. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/flux_bootstrap/register_callbacks.py +0 -0
  168. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/force_push_guard/__init__.py +0 -0
  169. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/force_push_guard/detector.py +0 -0
  170. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/force_push_guard/register_callbacks.py +0 -0
  171. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/fork/__init__.py +0 -0
  172. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/fork/register_callbacks.py +0 -0
  173. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/frontend_emitter/__init__.py +0 -0
  174. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/frontend_emitter/emitter.py +0 -0
  175. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/frontend_emitter/register_callbacks.py +0 -0
  176. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/frontend_emitter/session_context.py +0 -0
  177. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/grok_oauth/__init__.py +0 -0
  178. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/grok_oauth/config.py +0 -0
  179. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/grok_oauth/oauth_flow.py +0 -0
  180. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/grok_oauth/register_callbacks.py +0 -0
  181. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/grok_oauth/utils.py +0 -0
  182. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/herdr/README.md +0 -0
  183. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/herdr/__init__.py +0 -0
  184. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/herdr/client.py +0 -0
  185. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/herdr/register_callbacks.py +0 -0
  186. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/herdr/reporter.py +0 -0
  187. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/herdr/smoke.py +0 -0
  188. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/herdr/sources.py +0 -0
  189. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/hook_creator/__init__.py +0 -0
  190. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/hook_creator/register_callbacks.py +0 -0
  191. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/hook_manager/__init__.py +0 -0
  192. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/hook_manager/config.py +0 -0
  193. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/hook_manager/hooks_menu.py +0 -0
  194. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/hook_manager/register_callbacks.py +0 -0
  195. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/meta_oauth/__init__.py +0 -0
  196. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/meta_oauth/config.py +0 -0
  197. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/meta_oauth/oauth_flow.py +0 -0
  198. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/meta_oauth/register_callbacks.py +0 -0
  199. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/meta_oauth/utils.py +0 -0
  200. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/namespace_skill_search/README.md +0 -0
  201. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/namespace_skill_search/__init__.py +0 -0
  202. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/namespace_skill_search/namespaces.py +0 -0
  203. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/namespace_skill_search/register_callbacks.py +0 -0
  204. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/namespace_skill_search/search_tool.py +0 -0
  205. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/no_tools/__init__.py +0 -0
  206. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/no_tools/register_callbacks.py +0 -0
  207. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/oauth_pasteback.py +0 -0
  208. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/oauth_puppy_html.py +0 -0
  209. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/obsidian_agent/README.md +0 -0
  210. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/obsidian_agent/__init__.py +0 -0
  211. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/obsidian_agent/agent_obsidian.py +0 -0
  212. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/obsidian_agent/register_callbacks.py +0 -0
  213. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/ollama/__init__.py +0 -0
  214. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/ollama/register_callbacks.py +0 -0
  215. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/ollama_setup/__init__.py +0 -0
  216. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/ollama_setup/completer.py +0 -0
  217. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/ollama_setup/register_callbacks.py +0 -0
  218. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/plugin_list/__init__.py +0 -0
  219. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/plugin_list/plugin_contributions.py +0 -0
  220. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/plugin_list/plugin_meta.py +0 -0
  221. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/plugin_list/plugin_text_utils.py +0 -0
  222. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/plugin_list/plugins_menu.py +0 -0
  223. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/plugin_list/plugins_menu_layout.py +0 -0
  224. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/plugin_list/plugins_menu_render.py +0 -0
  225. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/plugin_list/project_trust_flow.py +0 -0
  226. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/plugin_list/register_callbacks.py +0 -0
  227. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/pop_command/__init__.py +0 -0
  228. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/pop_command/register_callbacks.py +0 -0
  229. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/prompt_newline/__init__.py +0 -0
  230. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/prompt_newline/config.py +0 -0
  231. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/prompt_newline/register_callbacks.py +0 -0
  232. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/prune/__init__.py +0 -0
  233. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/prune/prune_menu.py +0 -0
  234. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/prune/prune_model.py +0 -0
  235. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/prune/prune_render.py +0 -0
  236. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/prune/register_callbacks.py +0 -0
  237. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_kennel/README.md +0 -0
  238. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_kennel/__init__.py +0 -0
  239. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_kennel/commands.py +0 -0
  240. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_kennel/config.py +0 -0
  241. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_kennel/kennel.py +0 -0
  242. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_kennel/packer.py +0 -0
  243. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_kennel/recorder.py +0 -0
  244. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_kennel/register_callbacks.py +0 -0
  245. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_kennel/retriever.py +0 -0
  246. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_kennel/schema.py +0 -0
  247. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_kennel/state.py +0 -0
  248. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_kennel/tools.py +0 -0
  249. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_kennel/wings.py +0 -0
  250. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_spinner/README.md +0 -0
  251. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_spinner/__init__.py +0 -0
  252. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_spinner/builtin_frames.py +0 -0
  253. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_spinner/commands.py +0 -0
  254. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_spinner/picker.py +0 -0
  255. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_spinner/register_callbacks.py +0 -0
  256. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/puppy_spinner/spinners.py +0 -0
  257. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/quick_resume/__init__.py +0 -0
  258. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/quick_resume/register_callbacks.py +0 -0
  259. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/review_pr/__init__.py +0 -0
  260. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/review_pr/register_callbacks.py +0 -0
  261. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/shell_safety/__init__.py +0 -0
  262. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/shell_safety/agent_shell_safety.py +0 -0
  263. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/shell_safety/command_cache.py +0 -0
  264. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/shell_safety/register_callbacks.py +0 -0
  265. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/stack_dump/__init__.py +0 -0
  266. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/stack_dump/register_callbacks.py +0 -0
  267. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/statusline/__init__.py +0 -0
  268. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/statusline/config.py +0 -0
  269. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/statusline/payload.py +0 -0
  270. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/statusline/prompt_patch.py +0 -0
  271. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/statusline/register_callbacks.py +0 -0
  272. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/statusline/runner.py +0 -0
  273. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/statusline/statusline_command.py +0 -0
  274. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/steer_queue/__init__.py +0 -0
  275. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/steer_queue/queue_menu.py +0 -0
  276. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/steer_queue/register_callbacks.py +0 -0
  277. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/subagent_panel/README.md +0 -0
  278. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/subagent_panel/__init__.py +0 -0
  279. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/subagent_panel/coalesce_patch.py +0 -0
  280. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/subagent_panel/panel_render.py +0 -0
  281. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/subagent_panel/register_callbacks.py +0 -0
  282. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/subagent_panel/resume_repaint.py +0 -0
  283. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/subagent_panel/state.py +0 -0
  284. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/switch_agent_resume/__init__.py +0 -0
  285. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/switch_agent_resume/register_callbacks.py +0 -0
  286. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/theme/README.md +0 -0
  287. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/theme/__init__.py +0 -0
  288. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/theme/bundled_palettes.py +0 -0
  289. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/theme/content_styles.py +0 -0
  290. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/theme/osc_palette.py +0 -0
  291. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/theme/picker.py +0 -0
  292. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/theme/prompt_toolkit_theme.py +0 -0
  293. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/theme/register_callbacks.py +0 -0
  294. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/theme/rich_themes.py +0 -0
  295. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/theme/themes.py +0 -0
  296. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/timestamp_heartbeat/__init__.py +0 -0
  297. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/timestamp_heartbeat/register_callbacks.py +0 -0
  298. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/token_ratio_learner/__init__.py +0 -0
  299. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/token_ratio_learner/ratios.py +0 -0
  300. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/token_ratio_learner/register_callbacks.py +0 -0
  301. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/universal_constructor/__init__.py +0 -0
  302. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/universal_constructor/models.py +0 -0
  303. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/universal_constructor/provider.py +0 -0
  304. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/universal_constructor/register_callbacks.py +0 -0
  305. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/universal_constructor/registry.py +0 -0
  306. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/universal_constructor/sandbox.py +0 -0
  307. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/wide_completion_menu/__init__.py +0 -0
  308. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/wide_completion_menu/register_callbacks.py +0 -0
  309. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/wiggum/__init__.py +0 -0
  310. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/wiggum/goal_runs.py +0 -0
  311. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/wiggum/judge.py +0 -0
  312. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/wiggum/judge_config.py +0 -0
  313. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/wiggum/judges_menu.py +0 -0
  314. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/wiggum/register_callbacks.py +0 -0
  315. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/wiggum/state.py +0 -0
  316. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/code_puppy_core_plugins/yolo_cli/__init__.py +0 -0
  317. {code_puppy_core_plugins-0.0.2 → code_puppy_core_plugins-0.0.5}/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.2
3
+ Version: 0.0.5
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
@@ -14,6 +14,7 @@ Classifier: Programming Language :: Python :: 3.11
14
14
  Classifier: Programming Language :: Python :: 3.12
15
15
  Classifier: Programming Language :: Python :: 3.13
16
16
  Requires-Python: <3.15,>=3.11
17
+ Requires-Dist: httpx<1,>=0.24.1
17
18
  Description-Content-Type: text/markdown
18
19
 
19
20
  # Code Puppy Core Plugins
@@ -156,8 +156,8 @@ def _fetch_remote_json(url: str) -> Optional[dict[str, Any]]:
156
156
  f"{e.response.status_code} {e.response.reason_phrase}"
157
157
  )
158
158
  return None
159
- except (httpx.ConnectError, httpx.TimeoutException, httpx.NetworkError) as e:
160
- logger.warning(f"Remote catalog network failure: {e}")
159
+ except httpx.TransportError as e:
160
+ logger.debug(f"Remote catalog network failure: {e}")
161
161
  return None
162
162
  except json.JSONDecodeError as e:
163
163
  logger.warning(f"Remote catalog returned invalid JSON: {e}")
@@ -296,7 +296,7 @@ def fetch_remote_catalog(force_refresh: bool = False) -> Optional[RemoteCatalogD
296
296
  f"(cache_path={_CACHE_PATH}, fresh={cache_fresh})"
297
297
  )
298
298
  else:
299
- logger.info("No cache present; fetching remote skills catalog")
299
+ logger.debug("No cache present; fetching remote skills catalog")
300
300
 
301
301
  remote_raw = _fetch_remote_json(SKILLS_JSON_URL)
302
302
  if remote_raw is not None:
@@ -309,7 +309,7 @@ def fetch_remote_catalog(force_refresh: bool = False) -> Optional[RemoteCatalogD
309
309
 
310
310
  # Offline fallback: use cache even if expired.
311
311
  if _CACHE_PATH.exists():
312
- logger.warning(
312
+ logger.debug(
313
313
  "Remote fetch failed; falling back to cached skills catalog "
314
314
  f"(even if expired): {_CACHE_PATH}"
315
315
  )
@@ -318,5 +318,5 @@ def fetch_remote_catalog(force_refresh: bool = False) -> Optional[RemoteCatalogD
318
318
  return None
319
319
  return _parse_catalog(cached)
320
320
 
321
- logger.error("Remote fetch failed and no cache is available")
321
+ logger.debug("Remote fetch failed and no cache is available")
322
322
  return None
@@ -13,12 +13,14 @@ Public API:
13
13
  )
14
14
 
15
15
  If the remote catalog can't be fetched (and there's no cache), the catalog is
16
- empty by default (and we log a warning).
16
+ empty by default. Loading is deferred until a catalog-backed operation needs it.
17
17
  """
18
18
 
19
19
  from __future__ import annotations
20
20
 
21
21
  import logging
22
+ import threading
23
+ import time
22
24
  from dataclasses import dataclass, field
23
25
  from pathlib import Path
24
26
  from typing import List, Optional
@@ -26,6 +28,7 @@ from typing import List, Optional
26
28
  from code_puppy_core_plugins.agent_skills.remote_catalog import fetch_remote_catalog
27
29
 
28
30
  logger = logging.getLogger(__name__)
31
+ _RETRY_DELAY_SECONDS = 60
29
32
 
30
33
 
31
34
  _ACRONYMS = {
@@ -133,47 +136,59 @@ class SkillCatalog:
133
136
  self._entries: list[SkillCatalogEntry] = []
134
137
  self._by_id: dict[str, SkillCatalogEntry] = {}
135
138
  self._by_category: dict[str, list[SkillCatalogEntry]] = {}
139
+ self._loaded = False
140
+ self._next_retry_at = 0.0
141
+ self._load_lock = threading.Lock()
136
142
 
137
- try:
138
- remote = fetch_remote_catalog()
139
- except Exception as e:
140
- # fetch_remote_catalog should already be defensive, but let's be extra safe.
141
- logger.warning(f"Failed to fetch remote catalog: {e}")
142
- remote = None
143
-
144
- if remote is None:
145
- logger.warning(
146
- "Remote skill catalog unavailable (no network and no cache). "
147
- "Catalog will be empty."
148
- )
143
+ def _load(self) -> None:
144
+ """Load the optional remote catalog, retrying after bounded failures."""
145
+
146
+ if self._loaded or time.monotonic() < self._next_retry_at:
149
147
  return
150
148
 
151
- entries: list[SkillCatalogEntry] = []
152
-
153
- for remote_entry in remote.entries:
154
- skill_id = remote_entry.name
155
- entry = SkillCatalogEntry(
156
- id=skill_id,
157
- name=remote_entry.name,
158
- display_name=_format_display_name(remote_entry.name),
159
- description=remote_entry.description,
160
- category=remote_entry.group,
161
- tags=[],
162
- source_path=None,
163
- has_scripts=remote_entry.has_scripts,
164
- has_references=remote_entry.has_references,
165
- file_count=remote_entry.file_count,
166
- download_url=remote_entry.download_url,
167
- zip_size_bytes=remote_entry.zip_size_bytes,
149
+ with self._load_lock:
150
+ if self._loaded or time.monotonic() < self._next_retry_at:
151
+ return
152
+
153
+ try:
154
+ remote = fetch_remote_catalog()
155
+ except Exception as e:
156
+ logger.debug(f"Failed to fetch remote catalog: {e}")
157
+ self._next_retry_at = time.monotonic() + _RETRY_DELAY_SECONDS
158
+ return
159
+
160
+ if remote is None:
161
+ logger.debug("Remote skill catalog unavailable; catalog will be empty.")
162
+ self._next_retry_at = time.monotonic() + _RETRY_DELAY_SECONDS
163
+ return
164
+
165
+ entries: list[SkillCatalogEntry] = []
166
+
167
+ for remote_entry in remote.entries:
168
+ skill_id = remote_entry.name
169
+ entry = SkillCatalogEntry(
170
+ id=skill_id,
171
+ name=remote_entry.name,
172
+ display_name=_format_display_name(remote_entry.name),
173
+ description=remote_entry.description,
174
+ category=remote_entry.group,
175
+ tags=[],
176
+ source_path=None,
177
+ has_scripts=remote_entry.has_scripts,
178
+ has_references=remote_entry.has_references,
179
+ file_count=remote_entry.file_count,
180
+ download_url=remote_entry.download_url,
181
+ zip_size_bytes=remote_entry.zip_size_bytes,
182
+ )
183
+ entries.append(entry)
184
+
185
+ self._rebuild_indices(entries)
186
+ self._loaded = True
187
+
188
+ logger.info(
189
+ f"Loaded remote skill catalog: {len(self._entries)} skills in "
190
+ f"{len(self._by_category)} categories"
168
191
  )
169
- entries.append(entry)
170
-
171
- self._rebuild_indices(entries)
172
-
173
- logger.info(
174
- f"Loaded remote skill catalog: {len(self._entries)} skills in "
175
- f"{len(self._by_category)} categories"
176
- )
177
192
 
178
193
  def _rebuild_indices(self, entries: list[SkillCatalogEntry]) -> None:
179
194
  """Rebuild internal lookup indices from the loaded entries."""
@@ -198,12 +213,14 @@ class SkillCatalog:
198
213
  def list_categories(self) -> List[str]:
199
214
  """List all categories."""
200
215
 
216
+ self._load()
201
217
  categories = {e.category for e in self._entries if e.category}
202
218
  return sorted(categories, key=lambda c: c.casefold())
203
219
 
204
220
  def get_by_category(self, category: str) -> List[SkillCatalogEntry]:
205
221
  """Return all entries in a category (case-insensitive)."""
206
222
 
223
+ self._load()
207
224
  if not category:
208
225
  return []
209
226
  return list(self._by_category.get(category.casefold(), []))
@@ -211,6 +228,7 @@ class SkillCatalog:
211
228
  def search(self, query: str) -> List[SkillCatalogEntry]:
212
229
  """Search by substring over id/name/display_name/description/tags/category."""
213
230
 
231
+ self._load()
214
232
  q = (query or "").strip().casefold()
215
233
  if not q:
216
234
  return self.get_all()
@@ -234,6 +252,7 @@ class SkillCatalog:
234
252
  def get_by_id(self, skill_id: str) -> Optional[SkillCatalogEntry]:
235
253
  """Get a skill entry by id (case-sensitive exact match)."""
236
254
 
255
+ self._load()
237
256
  if not skill_id:
238
257
  return None
239
258
  return self._by_id.get(skill_id)
@@ -241,6 +260,7 @@ class SkillCatalog:
241
260
  def get_all(self) -> List[SkillCatalogEntry]:
242
261
  """Return all entries."""
243
262
 
263
+ self._load()
244
264
  return list(self._entries)
245
265
 
246
266
 
@@ -0,0 +1,28 @@
1
+ DeepSeek Harness spill attribution
2
+
3
+ The spill functionality in this package is based on the spill packages from
4
+ DeepSeek Harness:
5
+
6
+ https://github.com/deepseek-ai/DeepSeek-Harness
7
+
8
+ MIT License
9
+
10
+ Copyright (c) 2026 DeepSeek
11
+
12
+ Permission is hereby granted, free of charge, to any person obtaining a copy
13
+ of this software and associated documentation files (the "Software"), to deal
14
+ in the Software without restriction, including without limitation the rights
15
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16
+ copies of the Software, and to permit persons to whom the Software is
17
+ furnished to do so, subject to the following conditions:
18
+
19
+ The above copyright notice and this permission notice shall be included in all
20
+ copies or substantial portions of the Software.
21
+
22
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28
+ SOFTWARE.
@@ -0,0 +1 @@
1
+ """Keep oversized dict-shaped tool results out of model context."""
@@ -0,0 +1,235 @@
1
+ """Plugin: spill oversized dict-shaped tool results to private files.
2
+
3
+ Ported from DeepSeek Harness's MIT-licensed spill design. See
4
+ ``LICENSE.deepseek`` in this package for its copyright and license notice.
5
+
6
+ The post-tool hook receives the same dict reference that Code Puppy later
7
+ serializes for the model, so this plugin can replace top-level string fields
8
+ in place. Non-dict results (notably plain strings) cannot be replaced through
9
+ this hook and are deliberately left untouched.
10
+
11
+ When the combined UTF-8 size of top-level string values exceeds the configured
12
+ cap, fields are considered largest-first. Their full text is saved verbatim,
13
+ then replaced by a bounded byte-sliced head/tail preview and a retrieval notice.
14
+ ``read_file`` is skipped by default to avoid a read -> spill -> read loop.
15
+ Every failure is best-effort: the successful tool result stays available inline.
16
+
17
+ Config (puppy.cfg, also settable with ``/set``):
18
+ spill_max_inline_bytes = 32768 # 0 or negative disables
19
+ spill_preview_bytes = 4096 # source bytes retained per field
20
+ spill_root = # unset uses a private OS temp directory
21
+ spill_skip_tools = read_file # comma-separated tool names
22
+ """
23
+
24
+ from __future__ import annotations
25
+
26
+ import logging
27
+ import math
28
+ from pathlib import Path
29
+ from typing import Any
30
+
31
+ from code_puppy.callbacks import register_callback
32
+
33
+ from . import store
34
+
35
+ logger = logging.getLogger(__name__)
36
+
37
+ MAX_INLINE_KEY = "spill_max_inline_bytes"
38
+ PREVIEW_KEY = "spill_preview_bytes"
39
+ ROOT_KEY = "spill_root"
40
+ SKIP_TOOLS_KEY = "spill_skip_tools"
41
+ DEFAULT_MAX_INLINE_BYTES = 32768
42
+ DEFAULT_PREVIEW_BYTES = 4096
43
+ DEFAULT_SKIP_TOOLS = frozenset({"read_file"})
44
+ OMISSION_MARKER = "\n\n[...]\n\n"
45
+
46
+
47
+ def _get_value(key: str) -> Any:
48
+ try:
49
+ from code_puppy.config import get_value
50
+
51
+ return get_value(key)
52
+ except Exception:
53
+ return None
54
+
55
+
56
+ def _get_int(key: str, default: int) -> int:
57
+ raw = _get_value(key)
58
+ if raw is None or str(raw).strip() == "":
59
+ return default
60
+ try:
61
+ return int(str(raw).strip())
62
+ except (TypeError, ValueError):
63
+ logger.warning("Invalid %s value; falling back to %d", key, default)
64
+ return default
65
+
66
+
67
+ def _get_root() -> str | None:
68
+ raw = _get_value(ROOT_KEY)
69
+ if raw is None or not str(raw).strip():
70
+ return None
71
+ return str(raw).strip()
72
+
73
+
74
+ def _get_skip_tools() -> frozenset[str]:
75
+ raw = _get_value(SKIP_TOOLS_KEY)
76
+ if raw is None or not str(raw).strip():
77
+ return DEFAULT_SKIP_TOOLS
78
+ return frozenset(name.strip() for name in str(raw).split(",") if name.strip())
79
+
80
+
81
+ def _byte_size(text: str) -> int:
82
+ return len(text.encode("utf-8"))
83
+
84
+
85
+ def _preview(text: str, budget: int) -> tuple[str, int]:
86
+ """Return a byte-sliced preview and the count of omitted source bytes."""
87
+ encoded = text.encode("utf-8")
88
+ kept_bytes = min(max(0, budget), len(encoded))
89
+ if kept_bytes == 0:
90
+ return "", len(encoded)
91
+ head_bytes = math.ceil(kept_bytes / 2)
92
+ tail_bytes = math.floor(kept_bytes / 2)
93
+ head = encoded[:head_bytes].decode("utf-8", errors="replace")
94
+ tail = encoded[-tail_bytes:].decode("utf-8", errors="replace") if tail_bytes else ""
95
+ return f"{head}{OMISSION_MARKER}{tail}", len(encoded) - kept_bytes
96
+
97
+
98
+ def _notice(omitted: int, path: Path) -> str:
99
+ return (
100
+ f"(~{omitted} bytes omitted. Full output stored at: {path}. "
101
+ "Retrieve it with read_file using start_line/num_lines, or grep this path.)"
102
+ )
103
+
104
+
105
+ def _build_replacement(
106
+ text: str,
107
+ path: Path,
108
+ preview_bytes: int,
109
+ max_bytes: int | None,
110
+ ) -> str | None:
111
+ """Build a strictly smaller replacement, optionally fitting ``max_bytes``."""
112
+ original_bytes = _byte_size(text)
113
+ budget = min(max(0, preview_bytes), original_bytes)
114
+ limit = original_bytes - 1
115
+ if max_bytes is not None:
116
+ limit = min(limit, max_bytes)
117
+ if limit < 0:
118
+ return None
119
+
120
+ while True:
121
+ preview, omitted = _preview(text, budget)
122
+ notice = _notice(omitted, path)
123
+ replacement = f"{preview}\n\n{notice}" if preview else notice
124
+ replacement_bytes = _byte_size(replacement)
125
+ if replacement_bytes <= limit:
126
+ return replacement
127
+ if budget == 0:
128
+ return None
129
+ budget = max(0, budget - max(1, replacement_bytes - limit))
130
+
131
+
132
+ def _spill_result(tool_name: str, result: dict[Any, Any]) -> None:
133
+ cap = _get_int(MAX_INLINE_KEY, DEFAULT_MAX_INLINE_BYTES)
134
+ if cap <= 0 or tool_name in _get_skip_tools():
135
+ return
136
+ preview_bytes = _get_int(PREVIEW_KEY, DEFAULT_PREVIEW_BYTES)
137
+ if preview_bytes < 0:
138
+ logger.warning(
139
+ "Invalid %s value; falling back to %d",
140
+ PREVIEW_KEY,
141
+ DEFAULT_PREVIEW_BYTES,
142
+ )
143
+ preview_bytes = DEFAULT_PREVIEW_BYTES
144
+
145
+ fields = [
146
+ (key, value, _byte_size(value))
147
+ for key, value in result.items()
148
+ if isinstance(value, str)
149
+ ]
150
+ total = sum(size for _, _, size in fields)
151
+ if total <= cap:
152
+ return
153
+
154
+ replacements: dict[Any, str] = {}
155
+ for key, original, original_bytes in sorted(
156
+ fields, key=lambda item: item[2], reverse=True
157
+ ):
158
+ if total <= cap:
159
+ break
160
+ try:
161
+ path = store.save_text(original, tool_name, _get_root())
162
+ except Exception:
163
+ logger.warning(
164
+ "Failed to spill %s result field %r; keeping it inline",
165
+ tool_name,
166
+ key,
167
+ exc_info=True,
168
+ )
169
+ continue
170
+
171
+ other_bytes = total - original_bytes
172
+ field_limit = cap - other_bytes if other_bytes < cap else None
173
+ replacement = _build_replacement(
174
+ original,
175
+ path,
176
+ preview_bytes,
177
+ field_limit,
178
+ )
179
+ if replacement is None:
180
+ logger.warning(
181
+ "Spill notice for %s result field %r cannot fit; keeping it inline",
182
+ tool_name,
183
+ key,
184
+ )
185
+ continue
186
+ replacements[key] = replacement
187
+ total = other_bytes + _byte_size(replacement)
188
+
189
+ # Commit atomically. A partial preview set that still exceeds the cap is
190
+ # neither bounded nor graceful; keep every original inline in that case.
191
+ if total <= cap:
192
+ result.update(replacements)
193
+
194
+
195
+ def _on_post_tool_call(
196
+ tool_name: str,
197
+ tool_args: dict,
198
+ result: Any,
199
+ duration_ms: float,
200
+ context: Any = None,
201
+ ) -> None:
202
+ """Spill oversized top-level string fields without breaking tool calls."""
203
+ _ = tool_args, duration_ms, context
204
+ try:
205
+ if not isinstance(result, dict) or set(result) == {"error"}:
206
+ return
207
+ _spill_result(tool_name, result)
208
+ except Exception:
209
+ logger.debug(
210
+ "spill plugin failed; keeping the tool result inline", exc_info=True
211
+ )
212
+
213
+
214
+ def _reset_state() -> None:
215
+ """Reset lazy process storage state for tests and defensive re-init."""
216
+ store._reset_state()
217
+
218
+
219
+ register_callback("post_tool_call", _on_post_tool_call)
220
+
221
+
222
+ __all__ = [
223
+ "DEFAULT_MAX_INLINE_BYTES",
224
+ "DEFAULT_PREVIEW_BYTES",
225
+ "DEFAULT_SKIP_TOOLS",
226
+ "MAX_INLINE_KEY",
227
+ "PREVIEW_KEY",
228
+ "ROOT_KEY",
229
+ "SKIP_TOOLS_KEY",
230
+ "_build_replacement",
231
+ "_get_int",
232
+ "_on_post_tool_call",
233
+ "_reset_state",
234
+ "_spill_result",
235
+ ]
@@ -0,0 +1,97 @@
1
+ """Private local storage for spilled tool-result text."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import hashlib
6
+ import os
7
+ import re
8
+ import secrets
9
+ import tempfile
10
+ import uuid
11
+ from pathlib import Path
12
+
13
+ _default_root: Path | None = None
14
+ _process_session_id: str | None = None
15
+ _UNSAFE_NAME = re.compile(r"[^A-Za-z0-9._-]+")
16
+
17
+
18
+ def private_root(configured_root: str | None = None) -> Path:
19
+ """Return the configured root or a lazy private per-process temp root."""
20
+ global _default_root
21
+ if configured_root:
22
+ root = Path(configured_root).expanduser().resolve()
23
+ root.mkdir(mode=0o700, parents=True, exist_ok=True)
24
+ return root
25
+ if _default_root is None:
26
+ _default_root = Path(tempfile.mkdtemp(prefix="code-puppy-spill-"))
27
+ return _default_root
28
+
29
+
30
+ def current_session_id() -> str:
31
+ """Return the active agent session id, with a stable process fallback."""
32
+ global _process_session_id
33
+ try:
34
+ from code_puppy.messaging import get_session_context
35
+
36
+ session_id = get_session_context()
37
+ if session_id:
38
+ return str(session_id)
39
+ except Exception:
40
+ pass
41
+ if _process_session_id is None:
42
+ _process_session_id = uuid.uuid4().hex
43
+ return _process_session_id
44
+
45
+
46
+ def session_dir(root: Path, session_id: str) -> Path:
47
+ """Create and return a private, hashed session directory under ``root``."""
48
+ digest = hashlib.sha256(session_id.encode("utf-8")).hexdigest()[:12]
49
+ directory = root / f"session-{digest}"
50
+ directory.mkdir(mode=0o700, parents=True, exist_ok=True)
51
+ os.chmod(directory, 0o700)
52
+ return directory
53
+
54
+
55
+ def safe_filename(tool_name: str) -> str:
56
+ """Convert an untrusted tool name into one harmless filename segment."""
57
+ raw = f"{tool_name}.txt".replace("\x00", "_")
58
+ safe = _UNSAFE_NAME.sub("_", raw.replace("/", "_").replace("\\", "_"))
59
+ while ".." in safe:
60
+ safe = safe.replace("..", "_")
61
+ safe = safe.strip(".")
62
+ return safe or "tool.txt"
63
+
64
+
65
+ def save_text(content: str, tool_name: str, configured_root: str | None = None) -> Path:
66
+ """Persist ``content`` verbatim with exclusive owner-only creation."""
67
+ root = private_root(configured_root)
68
+ directory = session_dir(root, current_session_id())
69
+ path = directory / f"{secrets.token_hex(6)}-{safe_filename(tool_name)}"
70
+ flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL
71
+ descriptor = os.open(path, flags, 0o600)
72
+ try:
73
+ with os.fdopen(descriptor, "w", encoding="utf-8", newline="") as spill_file:
74
+ descriptor = -1
75
+ spill_file.write(content)
76
+ os.chmod(path, 0o600)
77
+ finally:
78
+ if descriptor >= 0:
79
+ os.close(descriptor)
80
+ return path
81
+
82
+
83
+ def _reset_state() -> None:
84
+ """Forget lazy process state; test cleanup remains the caller's job."""
85
+ global _default_root, _process_session_id
86
+ _default_root = None
87
+ _process_session_id = None
88
+
89
+
90
+ __all__ = [
91
+ "_reset_state",
92
+ "current_session_id",
93
+ "private_root",
94
+ "safe_filename",
95
+ "save_text",
96
+ "session_dir",
97
+ ]
@@ -4,10 +4,13 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "code-puppy-core-plugins"
7
- version = "0.0.2"
7
+ version = "0.0.5"
8
8
  description = "Official plugin bundle for Code Puppy"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11,<3.15"
11
+ dependencies = [
12
+ "httpx>=0.24.1,<1",
13
+ ]
11
14
  license = {text = "MIT"}
12
15
  authors = [{name = "Michael Pfaffenberger"}]
13
16
  classifiers = [
@@ -66,6 +69,7 @@ puppy_spinner = "code_puppy_core_plugins.puppy_spinner.register_callbacks"
66
69
  quick_resume = "code_puppy_core_plugins.quick_resume.register_callbacks"
67
70
  review_pr = "code_puppy_core_plugins.review_pr.register_callbacks"
68
71
  shell_safety = "code_puppy_core_plugins.shell_safety.register_callbacks"
72
+ spill = "code_puppy_core_plugins.spill.register_callbacks"
69
73
  stack_dump = "code_puppy_core_plugins.stack_dump.register_callbacks"
70
74
  statusline = "code_puppy_core_plugins.statusline.register_callbacks"
71
75
  steer_queue = "code_puppy_core_plugins.steer_queue.register_callbacks"