code-puppy-core-plugins 0.0.12__tar.gz → 0.0.13__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 (336) hide show
  1. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/PKG-INFO +1 -1
  2. code_puppy_core_plugins-0.0.13/code_puppy_core_plugins/logfire_sessions/__init__.py +7 -0
  3. code_puppy_core_plugins-0.0.13/code_puppy_core_plugins/logfire_sessions/mirror.py +108 -0
  4. code_puppy_core_plugins-0.0.13/code_puppy_core_plugins/logfire_sessions/query.py +119 -0
  5. code_puppy_core_plugins-0.0.13/code_puppy_core_plugins/logfire_sessions/register_callbacks.py +138 -0
  6. code_puppy_core_plugins-0.0.13/code_puppy_core_plugins/logfire_sessions/sync.py +153 -0
  7. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/pyproject.toml +2 -1
  8. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/.gitignore +0 -0
  9. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/LICENSE +0 -0
  10. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/README.md +0 -0
  11. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/__init__.py +0 -0
  12. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/README.md +0 -0
  13. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/__init__.py +0 -0
  14. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/agent.py +0 -0
  15. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/bridge.py +0 -0
  16. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/capabilities.py +0 -0
  17. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/commands.py +0 -0
  18. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/content.py +0 -0
  19. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/io_delegation.py +0 -0
  20. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/mcp_config.py +0 -0
  21. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/permissions.py +0 -0
  22. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/persistence.py +0 -0
  23. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/register_callbacks.py +0 -0
  24. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/replay.py +0 -0
  25. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/session.py +0 -0
  26. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/session_config.py +0 -0
  27. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/acp/state.py +0 -0
  28. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_creator_skill/SKILL.md +0 -0
  29. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_creator_skill/__init__.py +0 -0
  30. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_creator_skill/register_callbacks.py +0 -0
  31. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/__init__.py +0 -0
  32. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/config.py +0 -0
  33. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/discovery.py +0 -0
  34. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/downloader.py +0 -0
  35. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/enabled_skills.py +0 -0
  36. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/installer.py +0 -0
  37. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/metadata.py +0 -0
  38. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/prompt_builder.py +0 -0
  39. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/provider.py +0 -0
  40. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/register_callbacks.py +0 -0
  41. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/remote_catalog.py +0 -0
  42. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/skill_catalog.py +0 -0
  43. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/skill_commands.py +0 -0
  44. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/skills_install_menu.py +0 -0
  45. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/agent_skills/skills_menu.py +0 -0
  46. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/aws_bedrock/__init__.py +0 -0
  47. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/aws_bedrock/config.py +0 -0
  48. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/aws_bedrock/register_callbacks.py +0 -0
  49. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/aws_bedrock/utils.py +0 -0
  50. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/azure_foundry/README.md +0 -0
  51. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/azure_foundry/__init__.py +0 -0
  52. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/azure_foundry/config.py +0 -0
  53. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/azure_foundry/discovery.py +0 -0
  54. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/azure_foundry/register_callbacks.py +0 -0
  55. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/azure_foundry/token.py +0 -0
  56. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/azure_foundry/utils.py +0 -0
  57. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/btw/__init__.py +0 -0
  58. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/btw/inline_view.py +0 -0
  59. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/btw/register_callbacks.py +0 -0
  60. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/btw/side_query.py +0 -0
  61. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/chatgpt_oauth/IMAGEGEN_SKILL.md +0 -0
  62. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/chatgpt_oauth/__init__.py +0 -0
  63. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/chatgpt_oauth/config.py +0 -0
  64. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/chatgpt_oauth/image_generation.py +0 -0
  65. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/chatgpt_oauth/image_tool.py +0 -0
  66. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/chatgpt_oauth/model_catalog.py +0 -0
  67. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/chatgpt_oauth/oauth_flow.py +0 -0
  68. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/chatgpt_oauth/register_callbacks.py +0 -0
  69. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/chatgpt_oauth/test_plugin.py +0 -0
  70. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/chatgpt_oauth/usage.py +0 -0
  71. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/chatgpt_oauth/utils.py +0 -0
  72. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/claude_code_hooks/__init__.py +0 -0
  73. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/claude_code_hooks/config.py +0 -0
  74. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/claude_code_hooks/register_callbacks.py +0 -0
  75. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/claude_code_oauth/README.md +0 -0
  76. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/claude_code_oauth/SETUP.md +0 -0
  77. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/claude_code_oauth/__init__.py +0 -0
  78. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/claude_code_oauth/config.py +0 -0
  79. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/claude_code_oauth/fast_mode.py +0 -0
  80. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/claude_code_oauth/prompt_handler.py +0 -0
  81. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/claude_code_oauth/register_callbacks.py +0 -0
  82. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/claude_code_oauth/test_plugin.py +0 -0
  83. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/claude_code_oauth/token_refresh_heartbeat.py +0 -0
  84. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/claude_code_oauth/utils.py +0 -0
  85. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/code_puppy_agent/AGENTS_AND_TOOLS.md +0 -0
  86. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/code_puppy_agent/MODELS_AND_MCP.md +0 -0
  87. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/code_puppy_agent/PLUGINS_AND_CALLBACKS.md +0 -0
  88. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/code_puppy_agent/SESSIONS_AND_HISTORY.md +0 -0
  89. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/code_puppy_agent/SKILL.md +0 -0
  90. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/code_puppy_agent/SKILLS_SYSTEM.md +0 -0
  91. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/code_puppy_agent/SYSTEM_PROMPT_CONFIG_AND_I18N.md +0 -0
  92. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/code_puppy_agent/__init__.py +0 -0
  93. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/code_puppy_agent/register_callbacks.py +0 -0
  94. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/NativeCapture.swift +0 -0
  95. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/README.md +0 -0
  96. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/__init__.py +0 -0
  97. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/accessibility.py +0 -0
  98. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/activation.py +0 -0
  99. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/backend.py +0 -0
  100. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/backend_types.py +0 -0
  101. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/capture.py +0 -0
  102. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/commands.py +0 -0
  103. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/geometry.py +0 -0
  104. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/inline_image.py +0 -0
  105. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/keycodes.py +0 -0
  106. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/policy.py +0 -0
  107. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/register_callbacks.py +0 -0
  108. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/safety.py +0 -0
  109. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/settle.py +0 -0
  110. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/state.py +0 -0
  111. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/computer_use/tools.py +0 -0
  112. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/context_indicator/__init__.py +0 -0
  113. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/context_indicator/register_callbacks.py +0 -0
  114. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/context_indicator/usage.py +0 -0
  115. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/copilot_auth/__init__.py +0 -0
  116. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/copilot_auth/config.py +0 -0
  117. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/copilot_auth/reasoning_client.py +0 -0
  118. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/copilot_auth/register_callbacks.py +0 -0
  119. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/copilot_auth/utils.py +0 -0
  120. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/customizable_commands/__init__.py +0 -0
  121. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/customizable_commands/register_callbacks.py +0 -0
  122. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/dbos_durable_exec/__init__.py +0 -0
  123. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/dbos_durable_exec/cancel.py +0 -0
  124. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/dbos_durable_exec/commands.py +0 -0
  125. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/dbos_durable_exec/config.py +0 -0
  126. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/dbos_durable_exec/lifecycle.py +0 -0
  127. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/dbos_durable_exec/register_callbacks.py +0 -0
  128. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/dbos_durable_exec/runtime.py +0 -0
  129. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/dbos_durable_exec/startup_lock.py +0 -0
  130. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/dbos_durable_exec/workflow_ids.py +0 -0
  131. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/dbos_durable_exec/wrapper.py +0 -0
  132. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/destructive_command_guard/AGENTS.md +0 -0
  133. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/destructive_command_guard/__init__.py +0 -0
  134. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/destructive_command_guard/detector.py +0 -0
  135. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/destructive_command_guard/register_callbacks.py +0 -0
  136. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/emoji_filter/__init__.py +0 -0
  137. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/emoji_filter/config.py +0 -0
  138. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/emoji_filter/register_callbacks.py +0 -0
  139. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/emoji_filter/stripper.py +0 -0
  140. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/empty_html_comment_filter/register_callbacks.py +0 -0
  141. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/example_custom_command/README.md +0 -0
  142. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/example_custom_command/register_callbacks.py +0 -0
  143. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/file_permission_handler/__init__.py +0 -0
  144. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/file_permission_handler/register_callbacks.py +0 -0
  145. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/__init__.py +0 -0
  146. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/README.md +0 -0
  147. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/cheatsheet.md +0 -0
  148. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/pipeline.md +0 -0
  149. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/synopsis.md +0 -0
  150. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/about.md +0 -0
  151. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/address-feedback.md +0 -0
  152. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/ask.md +0 -0
  153. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/aug.md +0 -0
  154. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/auto-pilot.md +0 -0
  155. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/cheatsheet.md +0 -0
  156. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/commit.md +0 -0
  157. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/config.md +0 -0
  158. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/create-pr.md +0 -0
  159. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/exec.md +0 -0
  160. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/new.md +0 -0
  161. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/qa.md +0 -0
  162. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/rebase.md +0 -0
  163. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/review.md +0 -0
  164. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/split.md +0 -0
  165. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/squash-commits.md +0 -0
  166. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/status.md +0 -0
  167. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/tests.md +0 -0
  168. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_about.py +0 -0
  169. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_cheatsheet.py +0 -0
  170. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_status.py +0 -0
  171. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/installer.py +0 -0
  172. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/flux_bootstrap/register_callbacks.py +0 -0
  173. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/force_push_guard/__init__.py +0 -0
  174. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/force_push_guard/detector.py +0 -0
  175. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/force_push_guard/register_callbacks.py +0 -0
  176. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/fork/__init__.py +0 -0
  177. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/fork/register_callbacks.py +0 -0
  178. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/frontend_emitter/__init__.py +0 -0
  179. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/frontend_emitter/emitter.py +0 -0
  180. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/frontend_emitter/register_callbacks.py +0 -0
  181. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/frontend_emitter/session_context.py +0 -0
  182. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/grok_oauth/__init__.py +0 -0
  183. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/grok_oauth/config.py +0 -0
  184. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/grok_oauth/oauth_flow.py +0 -0
  185. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/grok_oauth/register_callbacks.py +0 -0
  186. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/grok_oauth/utils.py +0 -0
  187. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/herdr/README.md +0 -0
  188. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/herdr/__init__.py +0 -0
  189. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/herdr/client.py +0 -0
  190. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/herdr/register_callbacks.py +0 -0
  191. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/herdr/reporter.py +0 -0
  192. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/herdr/smoke.py +0 -0
  193. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/herdr/sources.py +0 -0
  194. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/hook_creator/__init__.py +0 -0
  195. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/hook_creator/register_callbacks.py +0 -0
  196. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/hook_manager/__init__.py +0 -0
  197. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/hook_manager/config.py +0 -0
  198. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/hook_manager/hooks_menu.py +0 -0
  199. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/hook_manager/register_callbacks.py +0 -0
  200. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/logfire_oauth/__init__.py +0 -0
  201. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/logfire_oauth/oauth.py +0 -0
  202. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/logfire_oauth/query_tool.py +0 -0
  203. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/logfire_oauth/register_callbacks.py +0 -0
  204. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/meta_oauth/__init__.py +0 -0
  205. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/meta_oauth/config.py +0 -0
  206. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/meta_oauth/oauth_flow.py +0 -0
  207. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/meta_oauth/register_callbacks.py +0 -0
  208. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/meta_oauth/utils.py +0 -0
  209. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/namespace_skill_search/README.md +0 -0
  210. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/namespace_skill_search/__init__.py +0 -0
  211. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/namespace_skill_search/namespaces.py +0 -0
  212. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/namespace_skill_search/register_callbacks.py +0 -0
  213. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/namespace_skill_search/search_tool.py +0 -0
  214. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/no_tools/__init__.py +0 -0
  215. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/no_tools/register_callbacks.py +0 -0
  216. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/oauth_pasteback.py +0 -0
  217. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/oauth_puppy_html.py +0 -0
  218. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/obsidian_agent/README.md +0 -0
  219. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/obsidian_agent/__init__.py +0 -0
  220. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/obsidian_agent/agent_obsidian.py +0 -0
  221. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/obsidian_agent/register_callbacks.py +0 -0
  222. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/ollama/__init__.py +0 -0
  223. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/ollama/register_callbacks.py +0 -0
  224. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/ollama_setup/__init__.py +0 -0
  225. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/ollama_setup/completer.py +0 -0
  226. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/ollama_setup/register_callbacks.py +0 -0
  227. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/plugin_list/__init__.py +0 -0
  228. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/plugin_list/plugin_contributions.py +0 -0
  229. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/plugin_list/plugin_meta.py +0 -0
  230. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/plugin_list/plugin_text_utils.py +0 -0
  231. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/plugin_list/plugins_menu.py +0 -0
  232. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/plugin_list/plugins_menu_layout.py +0 -0
  233. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/plugin_list/plugins_menu_render.py +0 -0
  234. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/plugin_list/project_trust_flow.py +0 -0
  235. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/plugin_list/register_callbacks.py +0 -0
  236. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/pop_command/__init__.py +0 -0
  237. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/pop_command/register_callbacks.py +0 -0
  238. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/prompt_newline/__init__.py +0 -0
  239. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/prompt_newline/config.py +0 -0
  240. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/prompt_newline/register_callbacks.py +0 -0
  241. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/prune/__init__.py +0 -0
  242. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/prune/prune_menu.py +0 -0
  243. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/prune/prune_model.py +0 -0
  244. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/prune/prune_render.py +0 -0
  245. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/prune/register_callbacks.py +0 -0
  246. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_kennel/README.md +0 -0
  247. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_kennel/__init__.py +0 -0
  248. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_kennel/commands.py +0 -0
  249. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_kennel/config.py +0 -0
  250. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_kennel/kennel.py +0 -0
  251. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_kennel/packer.py +0 -0
  252. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_kennel/recorder.py +0 -0
  253. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_kennel/register_callbacks.py +0 -0
  254. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_kennel/retriever.py +0 -0
  255. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_kennel/schema.py +0 -0
  256. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_kennel/state.py +0 -0
  257. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_kennel/tools.py +0 -0
  258. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_kennel/wings.py +0 -0
  259. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_spinner/README.md +0 -0
  260. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_spinner/__init__.py +0 -0
  261. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_spinner/builtin_frames.py +0 -0
  262. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_spinner/commands.py +0 -0
  263. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_spinner/picker.py +0 -0
  264. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_spinner/register_callbacks.py +0 -0
  265. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/puppy_spinner/spinners.py +0 -0
  266. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/qa_kitten_skill/SKILL.md +0 -0
  267. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/qa_kitten_skill/__init__.py +0 -0
  268. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/qa_kitten_skill/register_callbacks.py +0 -0
  269. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/quick_resume/__init__.py +0 -0
  270. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/quick_resume/register_callbacks.py +0 -0
  271. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/review_pr/__init__.py +0 -0
  272. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/review_pr/register_callbacks.py +0 -0
  273. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/shell_safety/__init__.py +0 -0
  274. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/shell_safety/agent_shell_safety.py +0 -0
  275. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/shell_safety/command_cache.py +0 -0
  276. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/shell_safety/register_callbacks.py +0 -0
  277. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/spill/LICENSE.deepseek +0 -0
  278. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/spill/__init__.py +0 -0
  279. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/spill/register_callbacks.py +0 -0
  280. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/spill/store.py +0 -0
  281. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/stack_dump/__init__.py +0 -0
  282. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/stack_dump/register_callbacks.py +0 -0
  283. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/statusline/__init__.py +0 -0
  284. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/statusline/config.py +0 -0
  285. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/statusline/payload.py +0 -0
  286. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/statusline/prompt_patch.py +0 -0
  287. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/statusline/register_callbacks.py +0 -0
  288. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/statusline/runner.py +0 -0
  289. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/statusline/statusline_command.py +0 -0
  290. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/steer_queue/__init__.py +0 -0
  291. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/steer_queue/queue_menu.py +0 -0
  292. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/steer_queue/register_callbacks.py +0 -0
  293. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/subagent_panel/README.md +0 -0
  294. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/subagent_panel/__init__.py +0 -0
  295. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/subagent_panel/coalesce_patch.py +0 -0
  296. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/subagent_panel/panel_render.py +0 -0
  297. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/subagent_panel/register_callbacks.py +0 -0
  298. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/subagent_panel/resume_repaint.py +0 -0
  299. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/subagent_panel/state.py +0 -0
  300. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/switch_agent_resume/__init__.py +0 -0
  301. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/switch_agent_resume/register_callbacks.py +0 -0
  302. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/theme/README.md +0 -0
  303. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/theme/__init__.py +0 -0
  304. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/theme/bundled_palettes.py +0 -0
  305. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/theme/content_styles.py +0 -0
  306. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/theme/osc_palette.py +0 -0
  307. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/theme/picker.py +0 -0
  308. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/theme/prompt_toolkit_theme.py +0 -0
  309. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/theme/register_callbacks.py +0 -0
  310. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/theme/rich_themes.py +0 -0
  311. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/theme/themes.py +0 -0
  312. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/timestamp_heartbeat/__init__.py +0 -0
  313. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/timestamp_heartbeat/register_callbacks.py +0 -0
  314. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/token_ratio_learner/__init__.py +0 -0
  315. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/token_ratio_learner/ratios.py +0 -0
  316. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/token_ratio_learner/register_callbacks.py +0 -0
  317. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/universal_constructor/__init__.py +0 -0
  318. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/universal_constructor/models.py +0 -0
  319. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/universal_constructor/provider.py +0 -0
  320. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/universal_constructor/register_callbacks.py +0 -0
  321. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/universal_constructor/registry.py +0 -0
  322. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/universal_constructor/sandbox.py +0 -0
  323. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/web_retriever_skill/SKILL.md +0 -0
  324. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/web_retriever_skill/__init__.py +0 -0
  325. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/web_retriever_skill/register_callbacks.py +0 -0
  326. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/wide_completion_menu/__init__.py +0 -0
  327. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/wide_completion_menu/register_callbacks.py +0 -0
  328. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/wiggum/__init__.py +0 -0
  329. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/wiggum/goal_runs.py +0 -0
  330. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/wiggum/judge.py +0 -0
  331. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/wiggum/judge_config.py +0 -0
  332. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/wiggum/judges_menu.py +0 -0
  333. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/wiggum/register_callbacks.py +0 -0
  334. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/wiggum/state.py +0 -0
  335. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/code_puppy_core_plugins/yolo_cli/__init__.py +0 -0
  336. {code_puppy_core_plugins-0.0.12 → code_puppy_core_plugins-0.0.13}/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.12
3
+ Version: 0.0.13
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,7 @@
1
+ """Mirror Code Puppy chat sessions into Logfire as structured log records.
2
+
3
+ The record schema lives under the ``cp.hist.*`` namespace -- deliberately NOT
4
+ ``cp.session.*``. Logfire's hosted MCP query path scrubs keys and values that
5
+ contain sensitive keywords, and "session" is on that list, which would render
6
+ every listing useless and corrupt restored payloads.
7
+ """
@@ -0,0 +1,108 @@
1
+ """Write path: mirror a saved session envelope into Logfire records.
2
+
3
+ Called from the ``post_autosave`` hook. Local JSON stays canonical; Logfire is
4
+ a roaming/backup layer. Everything here raises on failure -- the hook wrapper
5
+ owns the fail-soft policy.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import subprocess
11
+ from functools import lru_cache
12
+ from pathlib import Path
13
+ from typing import Any
14
+
15
+ from . import sync
16
+
17
+ _CONFIGURED = False
18
+
19
+
20
+ def _configure_once() -> None:
21
+ """Point the logfire SDK at the onboarded project's write token."""
22
+ global _CONFIGURED
23
+ if _CONFIGURED:
24
+ return
25
+ import logfire
26
+
27
+ from ..logfire_oauth.oauth import load_project_credentials
28
+
29
+ credentials = load_project_credentials()
30
+ if credentials is None:
31
+ raise RuntimeError("no Logfire project credentials; run /logfire onboard")
32
+ logfire.configure(
33
+ service_name="code-puppy",
34
+ token=credentials.token,
35
+ send_to_logfire="always",
36
+ console=False,
37
+ )
38
+ _CONFIGURED = True
39
+
40
+
41
+ @lru_cache(maxsize=8)
42
+ def _git(args: tuple[str, ...], cwd: str) -> str | None:
43
+ try:
44
+ result = subprocess.run(
45
+ ("git", *args),
46
+ capture_output=True,
47
+ text=True,
48
+ cwd=cwd,
49
+ timeout=5,
50
+ check=False,
51
+ )
52
+ except (OSError, subprocess.TimeoutExpired):
53
+ return None
54
+ return result.stdout.strip() or None
55
+
56
+
57
+ def workspace_metadata() -> dict[str, str | None]:
58
+ """Best-effort workspace identity: resolved cwd, git remote, branch.
59
+
60
+ ``remote`` is the cross-machine join key (paths differ between machines);
61
+ ``scope_key`` is the machine-local grouping used by session resume.
62
+ """
63
+ cwd = str(Path.cwd())
64
+ return {
65
+ "scope_key": cwd,
66
+ "project_name": Path(cwd).name or None,
67
+ "remote": _git(("remote", "get-url", "origin"), cwd),
68
+ "branch": _git(("rev-parse", "--abbrev-ref", "HEAD"), cwd),
69
+ }
70
+
71
+
72
+ def mirror_session(metadata: Any) -> tuple[int, int]:
73
+ """Emit not-yet-synced messages of a saved session. Returns (emitted, total)."""
74
+ from code_puppy.session_storage import read_envelope_file
75
+
76
+ envelope = read_envelope_file(Path(metadata.json_path))
77
+ messages = envelope.get("messages") or []
78
+ fps = [sync.fingerprint(message) for message in messages]
79
+
80
+ key = f"{metadata.scope_key or ''}/{metadata.session_name}"
81
+ state = sync.load_state()
82
+ previous = (state["sessions"].get(key) or {}).get("fingerprints")
83
+ start = sync.plan_sync(previous, fps)
84
+ if start >= len(messages):
85
+ return 0, len(messages)
86
+
87
+ meta = workspace_metadata()
88
+ _configure_once()
89
+ import logfire
90
+
91
+ emitted = 0
92
+ for seq in range(start, len(messages)):
93
+ for attrs in sync.encode_message_records(
94
+ name=metadata.session_name,
95
+ seq=seq,
96
+ message=messages[seq],
97
+ scope_key=meta["scope_key"],
98
+ project_name=meta["project_name"],
99
+ remote=meta["remote"],
100
+ branch=meta["branch"],
101
+ ):
102
+ logfire.info("cp.hist.message", **attrs)
103
+ emitted += 1
104
+ logfire.force_flush()
105
+
106
+ state["sessions"][key] = sync.synced_entry(fps)
107
+ sync.save_state(state)
108
+ return emitted, len(messages)
@@ -0,0 +1,119 @@
1
+ """Read path: list sessions that have been mirrored into Logfire.
2
+
3
+ Listing goes through Logfire's hosted MCP ``query_run`` tool -- the exact same
4
+ path as the agent-facing ``logfire_query`` tool. Two consequences:
5
+
6
+ * The MCP layer scrubs keys/values containing sensitive keywords. The
7
+ ``cp.hist.*`` namespace dodges key-based scrubbing; occasional value-level
8
+ scrubbing in previews is cosmetic for a list view.
9
+ * Machine restore must NOT use this path (payloads would silently corrupt).
10
+ Restore belongs behind a minted read token + ``/v2/query`` once the OAuth
11
+ scope question is settled.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import dataclasses
17
+ import time
18
+ from typing import Any
19
+
20
+ import httpx
21
+
22
+ LIST_SESSIONS_SQL = """
23
+ SELECT
24
+ attributes->>'cp.hist.name' AS name,
25
+ attributes->>'cp.project.name' AS project,
26
+ attributes->>'cp.project.remote' AS remote,
27
+ count(DISTINCT attributes->>'cp.hist.seq') AS messages,
28
+ max(start_timestamp) AS last_active
29
+ FROM records
30
+ WHERE attributes->>'cp.hist.name' IS NOT NULL
31
+ GROUP BY 1, 2, 3
32
+ ORDER BY max(start_timestamp) DESC
33
+ LIMIT {limit}
34
+ """
35
+
36
+
37
+ class SessionsQueryError(RuntimeError):
38
+ """Raised when sessions cannot be listed from Logfire."""
39
+
40
+
41
+ def fresh_tokens() -> Any:
42
+ """Return usable OAuth tokens, refreshing them when expired.
43
+
44
+ Mirrors RFC 6749's refresh grant against the token endpoint discovered via
45
+ RFC 8414 -- the same discovery the device flow uses. Refreshed tokens are
46
+ persisted so other consumers stay warm.
47
+ """
48
+ from ..logfire_oauth.oauth import load_tokens, save_tokens
49
+
50
+ tokens = load_tokens()
51
+ if tokens is None:
52
+ raise SessionsQueryError(
53
+ "Logfire is not authenticated. Run /logfire auth first."
54
+ )
55
+ if tokens.expires_at > time.time() + 30:
56
+ return tokens
57
+ if not tokens.refresh_token:
58
+ raise SessionsQueryError(
59
+ "The Logfire OAuth access token expired and cannot be refreshed. "
60
+ "Run /logfire auth again."
61
+ )
62
+ try:
63
+ with httpx.Client(timeout=30) as client:
64
+ metadata = client.get(
65
+ f"{tokens.base_url}/.well-known/oauth-authorization-server"
66
+ )
67
+ metadata.raise_for_status()
68
+ token_endpoint = metadata.json()["token_endpoint"]
69
+ response = client.post(
70
+ token_endpoint,
71
+ data={
72
+ "grant_type": "refresh_token",
73
+ "client_id": tokens.client_id,
74
+ "refresh_token": tokens.refresh_token,
75
+ },
76
+ )
77
+ response.raise_for_status()
78
+ payload = response.json()
79
+ except (httpx.HTTPError, KeyError, ValueError) as exc:
80
+ raise SessionsQueryError(
81
+ f"Could not refresh the Logfire access token: {type(exc).__name__}"
82
+ ) from exc
83
+
84
+ tokens = dataclasses.replace(
85
+ tokens,
86
+ access_token=payload["access_token"],
87
+ expires_at=time.time() + float(payload.get("expires_in", 300)),
88
+ refresh_token=payload.get("refresh_token") or tokens.refresh_token,
89
+ )
90
+ save_tokens(tokens)
91
+ return tokens
92
+
93
+
94
+ def list_sessions(limit: int = 25) -> list[dict[str, Any]]:
95
+ """Return mirrored sessions ordered by most recent activity."""
96
+ from ..logfire_oauth.oauth import load_project_credentials
97
+ from ..logfire_oauth.query_tool import _query_mcp
98
+
99
+ credentials = load_project_credentials()
100
+ if credentials is None:
101
+ raise SessionsQueryError(
102
+ "No Logfire project is configured. Run /logfire onboard first."
103
+ )
104
+
105
+ tokens = fresh_tokens()
106
+ result = _query_mcp(
107
+ base_url=tokens.base_url,
108
+ access_token=tokens.access_token,
109
+ query=LIST_SESSIONS_SQL.format(limit=limit),
110
+ project=credentials.project_name,
111
+ start=None,
112
+ end=None,
113
+ )
114
+ if isinstance(result, dict) and result.get("error"):
115
+ raise SessionsQueryError(str(result["error"]))
116
+ rows = result.get("rows") if isinstance(result, dict) else None
117
+ if rows is None:
118
+ raise SessionsQueryError("Unexpected response from the Logfire query API.")
119
+ return rows
@@ -0,0 +1,138 @@
1
+ """Register the Logfire session-mirroring plugin.
2
+
3
+ Opt-in by design: mirroring ships full chat histories to the user's own
4
+ Logfire project, so it stays off until ``enable_logfire_sessions`` is set
5
+ (via ``/set`` or ``/logfire-sessions on``) AND a project write token exists
6
+ (from ``/logfire onboard``).
7
+
8
+ ``post_autosave`` is a decorative hook surface: a misbehaving mirror must
9
+ never poison the save path, so every failure is swallowed here.
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import traceback
15
+ from typing import Any
16
+
17
+ from code_puppy.callbacks import register_callback
18
+ from code_puppy.messaging import emit_error, emit_info, emit_success, emit_warning
19
+
20
+ COMMAND_NAMES = {"logfire-sessions"}
21
+
22
+ _PULL_STUB = (
23
+ "Restoring sessions from Logfire is not implemented yet. It needs a "
24
+ "read token (the hosted MCP query path scrubs values containing words "
25
+ "like 'session', which would corrupt restored payloads). Prerequisite: "
26
+ "extend ONBOARD_SCOPES with read-token minting permission, then pull via "
27
+ "POST /v2/query and rebuild the envelope locally."
28
+ )
29
+
30
+
31
+ def _enabled() -> bool:
32
+ from code_puppy.config import get_value
33
+
34
+ return str(get_value("enable_logfire_sessions") or "").strip().lower() in {
35
+ "1",
36
+ "true",
37
+ "yes",
38
+ "on",
39
+ }
40
+
41
+
42
+ def _on_post_autosave(metadata: Any) -> None:
43
+ """Mirror the just-saved session into Logfire. Never raises."""
44
+ try:
45
+ if not _enabled():
46
+ return
47
+ from .mirror import mirror_session
48
+
49
+ emitted, total = mirror_session(metadata)
50
+ if emitted:
51
+ emit_info(
52
+ f"Mirrored {emitted} new message(s) of '{metadata.session_name}' "
53
+ f"to Logfire ({total} total)."
54
+ )
55
+ except Exception:
56
+ traceback.print_exc() # forensics only; the save path must not care
57
+
58
+
59
+ def _status() -> None:
60
+ from ..logfire_oauth.oauth import load_project_credentials
61
+
62
+ if not _enabled():
63
+ emit_warning("Session mirroring is disabled (/logfire-sessions on).")
64
+ else:
65
+ emit_info("Session mirroring: enabled")
66
+ credentials = load_project_credentials()
67
+ if credentials is None:
68
+ emit_warning("No Logfire write token (/logfire onboard first).")
69
+ else:
70
+ emit_info(f"Write-token project: {credentials.project_name}")
71
+ from . import sync
72
+
73
+ state = sync.load_state()
74
+ sessions = state.get("sessions", {})
75
+ emit_info(f"Locally synced sessions: {len(sessions)}")
76
+
77
+
78
+ def _list(limit: int) -> None:
79
+ from .query import SessionsQueryError, list_sessions
80
+
81
+ try:
82
+ rows = list_sessions(limit=limit)
83
+ except SessionsQueryError as exc:
84
+ emit_error(str(exc))
85
+ return
86
+ if not rows:
87
+ emit_info("No mirrored sessions found in Logfire.")
88
+ return
89
+ emit_info(f"Mirrored sessions ({len(rows)}):")
90
+ for row in rows:
91
+ project = row.get("project") or "?"
92
+ remote = row.get("remote") or "-"
93
+ name = row.get("name") or "?"
94
+ messages = row.get("messages", "?")
95
+ last_active = str(row.get("last_active", ""))[:19]
96
+ emit_info(f" {name} [{project}] {messages} msgs {last_active} {remote}")
97
+
98
+
99
+ def _handle(command: str, name: str) -> bool | None:
100
+ if name not in COMMAND_NAMES:
101
+ return None
102
+
103
+ from code_puppy.config import set_value
104
+
105
+ parts = command.split()[1:]
106
+ action = parts[0].lower() if parts else "status"
107
+ args = parts[1:]
108
+
109
+ if action == "on":
110
+ set_value("enable_logfire_sessions", "true")
111
+ emit_success("Logfire session mirroring enabled.")
112
+ elif action == "off":
113
+ set_value("enable_logfire_sessions", "false")
114
+ emit_success("Logfire session mirroring disabled.")
115
+ elif action == "list":
116
+ limit = int(args[0]) if args and args[0].isdigit() else 25
117
+ _list(min(limit, 100))
118
+ elif action == "pull":
119
+ emit_warning(_PULL_STUB)
120
+ elif action == "status":
121
+ _status()
122
+ else:
123
+ emit_info("Usage: /logfire-sessions [status|on|off|list [limit]|pull]")
124
+ return True
125
+
126
+
127
+ def _help() -> list[tuple[str, str]]:
128
+ return [
129
+ (
130
+ "logfire-sessions",
131
+ "Mirror chat sessions to Logfire; status/on/off/list/pull",
132
+ )
133
+ ]
134
+
135
+
136
+ register_callback("post_autosave", _on_post_autosave)
137
+ register_callback("custom_command_help", _help)
138
+ register_callback("custom_command", _handle)
@@ -0,0 +1,153 @@
1
+ """Pure encode/decode/state logic for mirroring sessions into Logfire.
2
+
3
+ No I/O beyond the sync-state JSON file, so everything here is unit-testable
4
+ without a Logfire project or network.
5
+
6
+ Record shape (one log record per message chunk)::
7
+
8
+ cp.hist.name session file stem
9
+ cp.hist.seq message index within the history
10
+ cp.hist.chunk "i/n" -- gzipped base64 payload chunk i of n
11
+ cp.hist.payload one base64(gzip(json(message))) chunk
12
+ cp.hist.scope_key resolved cwd of the session (compute_scope_key)
13
+ cp.project.name / remote / branch best-effort workspace metadata
14
+
15
+ Restore-side note: histories can be re-synced after compaction, so Logfire may
16
+ hold multiple versions of the same seq. :func:`decode_message_rows` therefore
17
+ deduplicates by ``seq``, keeping the *latest* row.
18
+ """
19
+
20
+ from __future__ import annotations
21
+
22
+ import base64
23
+ import gzip
24
+ import hashlib
25
+ import json
26
+ import time
27
+ from pathlib import Path
28
+ from typing import Any, Iterable
29
+
30
+ CHUNK_CHARS = 16_000 # conservative attribute-size budget per record
31
+ STATE_VERSION = 1
32
+
33
+
34
+ def fingerprint(message: Any) -> str:
35
+ """Stable sha256 for one jsonable pydantic-ai message."""
36
+ canonical = json.dumps(message, sort_keys=True, separators=(",", ":"))
37
+ return hashlib.sha256(canonical.encode()).hexdigest()
38
+
39
+
40
+ def plan_sync(previous: list[str] | None, current: list[str]) -> int:
41
+ """Return the index in ``current`` to start emitting from.
42
+
43
+ Append-only growth continues where the last sync stopped. Anything else
44
+ (divergence from compaction/branching, or a shrunken history) triggers a
45
+ full re-emit; Logfire keeps both generations and restore dedupes by seq.
46
+ """
47
+ if not previous:
48
+ return 0
49
+ overlap = min(len(previous), len(current))
50
+ if previous[:overlap] == current[:overlap]:
51
+ return max(overlap, 0) if len(current) >= len(previous) else 0
52
+ return 0
53
+
54
+
55
+ def _chunk_b64(payload: bytes) -> list[str]:
56
+ blob = base64.b64encode(gzip.compress(payload)).decode()
57
+ return [blob[i : i + CHUNK_CHARS] for i in range(0, len(blob), CHUNK_CHARS)]
58
+
59
+
60
+ def encode_message_records(
61
+ *,
62
+ name: str,
63
+ seq: int,
64
+ message: Any,
65
+ scope_key: str | None,
66
+ project_name: str | None,
67
+ remote: str | None,
68
+ branch: str | None,
69
+ ) -> list[dict[str, Any]]:
70
+ """Encode one jsonable message as the Logfire records that carry it."""
71
+ body = json.dumps(message, separators=(",", ":")).encode()
72
+ chunks = _chunk_b64(body)
73
+ total = len(chunks)
74
+ records = []
75
+ for index, chunk in enumerate(chunks):
76
+ attrs: dict[str, Any] = {
77
+ "cp.hist.name": name,
78
+ "cp.hist.seq": seq,
79
+ "cp.hist.chunk": f"{index}/{total}",
80
+ "cp.hist.payload": chunk,
81
+ }
82
+ if scope_key:
83
+ attrs["cp.hist.scope_key"] = scope_key
84
+ if project_name:
85
+ attrs["cp.project.name"] = project_name
86
+ if remote:
87
+ attrs["cp.project.remote"] = remote
88
+ if branch:
89
+ attrs["cp.project.branch"] = branch
90
+ records.append(attrs)
91
+ return records
92
+
93
+
94
+ def decode_message_rows(rows: Iterable[dict[str, Any]]) -> list[Any]:
95
+ """Rebuild the messages list from normalized rows.
96
+
97
+ Each row is ``{"attributes": {...}, "timestamp": float | None}``. Rows
98
+ sharing a ``seq`` are joined along their chunk index; when a seq appears
99
+ more than once (re-synced history), the latest timestamp wins.
100
+ """
101
+ by_seq: dict[int, tuple[float, dict[int, str]]] = {}
102
+ for row in rows:
103
+ attrs = row.get("attributes") or {}
104
+ name = attrs.get("cp.hist.name")
105
+ if name is None or "cp.hist.seq" not in attrs:
106
+ continue
107
+ seq = int(attrs["cp.hist.seq"])
108
+ chunk_index, _, _ = str(attrs.get("cp.hist.chunk", "0/1")).partition("/")
109
+ timestamp = float(row.get("timestamp") or 0.0)
110
+ seen_ts, chunks = by_seq.get(seq, (-1.0, {}))
111
+ if timestamp >= seen_ts:
112
+ # Later generations of a re-synced seq win, regardless of row order.
113
+ chunks[int(chunk_index)] = attrs.get("cp.hist.payload", "")
114
+ by_seq[seq] = (max(seen_ts, timestamp), chunks)
115
+
116
+ messages: list[Any] = []
117
+ for seq in sorted(by_seq):
118
+ chunks = by_seq[seq][1]
119
+ blob = "".join(chunks[i] for i in range(len(chunks)))
120
+ raw = gzip.decompress(base64.b64decode(blob))
121
+ messages.append(json.loads(raw))
122
+ return messages
123
+
124
+
125
+ def state_path() -> Path:
126
+ """Sync bookkeeping lives user-side, never next to plugin code (the trust
127
+ hash covers the plugin directory; writing runtime state there would
128
+ self-tamper and demand re-acceptance on every boot)."""
129
+ return Path.home() / ".code_puppy" / "logfire_session_sync.json"
130
+
131
+
132
+ def load_state() -> dict[str, Any]:
133
+ try:
134
+ state = json.loads(state_path().read_text(encoding="utf-8"))
135
+ except (FileNotFoundError, OSError, json.JSONDecodeError):
136
+ return {"version": STATE_VERSION, "sessions": {}}
137
+ if not isinstance(state.get("sessions"), dict):
138
+ return {"version": STATE_VERSION, "sessions": {}}
139
+ return state
140
+
141
+
142
+ def save_state(state: dict[str, Any]) -> None:
143
+ path = state_path()
144
+ path.parent.mkdir(parents=True, exist_ok=True)
145
+ path.write_text(json.dumps(state, indent=2), encoding="utf-8")
146
+
147
+
148
+ def synced_entry(fingerprints: list[str]) -> dict[str, Any]:
149
+ return {
150
+ "fingerprints": fingerprints,
151
+ "message_count": len(fingerprints),
152
+ "synced_at": time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime()),
153
+ }
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "code-puppy-core-plugins"
7
- version = "0.0.12"
7
+ version = "0.0.13"
8
8
  description = "Official plugin bundle for Code Puppy"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11,<3.15"
@@ -57,6 +57,7 @@ herdr = "code_puppy_core_plugins.herdr.register_callbacks"
57
57
  hook_creator = "code_puppy_core_plugins.hook_creator.register_callbacks"
58
58
  hook_manager = "code_puppy_core_plugins.hook_manager.register_callbacks"
59
59
  logfire_oauth = "code_puppy_core_plugins.logfire_oauth.register_callbacks"
60
+ logfire_sessions = "code_puppy_core_plugins.logfire_sessions.register_callbacks"
60
61
  meta_oauth = "code_puppy_core_plugins.meta_oauth.register_callbacks"
61
62
  namespace_skill_search = "code_puppy_core_plugins.namespace_skill_search.register_callbacks"
62
63
  no_tools = "code_puppy_core_plugins.no_tools.register_callbacks"