code-puppy-core-plugins 0.0.2__py3-none-any.whl
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.
- code_puppy_core_plugins/__init__.py +5 -0
- code_puppy_core_plugins/acp/README.md +266 -0
- code_puppy_core_plugins/acp/__init__.py +8 -0
- code_puppy_core_plugins/acp/agent.py +494 -0
- code_puppy_core_plugins/acp/bridge.py +309 -0
- code_puppy_core_plugins/acp/capabilities.py +73 -0
- code_puppy_core_plugins/acp/commands.py +116 -0
- code_puppy_core_plugins/acp/content.py +115 -0
- code_puppy_core_plugins/acp/io_delegation.py +231 -0
- code_puppy_core_plugins/acp/mcp_config.py +66 -0
- code_puppy_core_plugins/acp/permissions.py +159 -0
- code_puppy_core_plugins/acp/persistence.py +197 -0
- code_puppy_core_plugins/acp/register_callbacks.py +110 -0
- code_puppy_core_plugins/acp/replay.py +114 -0
- code_puppy_core_plugins/acp/session.py +329 -0
- code_puppy_core_plugins/acp/session_config.py +179 -0
- code_puppy_core_plugins/acp/state.py +135 -0
- code_puppy_core_plugins/agent_skills/__init__.py +22 -0
- code_puppy_core_plugins/agent_skills/config.py +208 -0
- code_puppy_core_plugins/agent_skills/discovery.py +337 -0
- code_puppy_core_plugins/agent_skills/downloader.py +392 -0
- code_puppy_core_plugins/agent_skills/enabled_skills.py +82 -0
- code_puppy_core_plugins/agent_skills/installer.py +22 -0
- code_puppy_core_plugins/agent_skills/metadata.py +219 -0
- code_puppy_core_plugins/agent_skills/prompt_builder.py +49 -0
- code_puppy_core_plugins/agent_skills/provider.py +52 -0
- code_puppy_core_plugins/agent_skills/register_callbacks.py +309 -0
- code_puppy_core_plugins/agent_skills/remote_catalog.py +322 -0
- code_puppy_core_plugins/agent_skills/skill_catalog.py +257 -0
- code_puppy_core_plugins/agent_skills/skill_commands.py +102 -0
- code_puppy_core_plugins/agent_skills/skills_install_menu.py +698 -0
- code_puppy_core_plugins/agent_skills/skills_menu.py +794 -0
- code_puppy_core_plugins/aws_bedrock/__init__.py +14 -0
- code_puppy_core_plugins/aws_bedrock/config.py +101 -0
- code_puppy_core_plugins/aws_bedrock/register_callbacks.py +243 -0
- code_puppy_core_plugins/aws_bedrock/utils.py +186 -0
- code_puppy_core_plugins/azure_foundry/README.md +238 -0
- code_puppy_core_plugins/azure_foundry/__init__.py +15 -0
- code_puppy_core_plugins/azure_foundry/config.py +126 -0
- code_puppy_core_plugins/azure_foundry/discovery.py +189 -0
- code_puppy_core_plugins/azure_foundry/register_callbacks.py +506 -0
- code_puppy_core_plugins/azure_foundry/token.py +182 -0
- code_puppy_core_plugins/azure_foundry/utils.py +375 -0
- code_puppy_core_plugins/btw/__init__.py +1 -0
- code_puppy_core_plugins/btw/inline_view.py +135 -0
- code_puppy_core_plugins/btw/register_callbacks.py +106 -0
- code_puppy_core_plugins/btw/side_query.py +91 -0
- code_puppy_core_plugins/chatgpt_oauth/IMAGEGEN_SKILL.md +83 -0
- code_puppy_core_plugins/chatgpt_oauth/__init__.py +8 -0
- code_puppy_core_plugins/chatgpt_oauth/config.py +52 -0
- code_puppy_core_plugins/chatgpt_oauth/image_generation.py +253 -0
- code_puppy_core_plugins/chatgpt_oauth/image_tool.py +70 -0
- code_puppy_core_plugins/chatgpt_oauth/oauth_flow.py +461 -0
- code_puppy_core_plugins/chatgpt_oauth/register_callbacks.py +288 -0
- code_puppy_core_plugins/chatgpt_oauth/test_plugin.py +663 -0
- code_puppy_core_plugins/chatgpt_oauth/usage.py +113 -0
- code_puppy_core_plugins/chatgpt_oauth/utils.py +534 -0
- code_puppy_core_plugins/claude_code_hooks/__init__.py +1 -0
- code_puppy_core_plugins/claude_code_hooks/config.py +137 -0
- code_puppy_core_plugins/claude_code_hooks/register_callbacks.py +383 -0
- code_puppy_core_plugins/claude_code_oauth/README.md +167 -0
- code_puppy_core_plugins/claude_code_oauth/SETUP.md +93 -0
- code_puppy_core_plugins/claude_code_oauth/__init__.py +25 -0
- code_puppy_core_plugins/claude_code_oauth/config.py +59 -0
- code_puppy_core_plugins/claude_code_oauth/fast_mode.py +122 -0
- code_puppy_core_plugins/claude_code_oauth/prompt_handler.py +64 -0
- code_puppy_core_plugins/claude_code_oauth/register_callbacks.py +719 -0
- code_puppy_core_plugins/claude_code_oauth/test_plugin.py +285 -0
- code_puppy_core_plugins/claude_code_oauth/token_refresh_heartbeat.py +240 -0
- code_puppy_core_plugins/claude_code_oauth/utils.py +663 -0
- code_puppy_core_plugins/code_puppy_agent/AGENTS_AND_TOOLS.md +155 -0
- code_puppy_core_plugins/code_puppy_agent/MODELS_AND_MCP.md +104 -0
- code_puppy_core_plugins/code_puppy_agent/PLUGINS_AND_CALLBACKS.md +147 -0
- code_puppy_core_plugins/code_puppy_agent/SESSIONS_AND_HISTORY.md +39 -0
- code_puppy_core_plugins/code_puppy_agent/SKILL.md +180 -0
- code_puppy_core_plugins/code_puppy_agent/SKILLS_SYSTEM.md +136 -0
- code_puppy_core_plugins/code_puppy_agent/SYSTEM_PROMPT_CONFIG_AND_I18N.md +160 -0
- code_puppy_core_plugins/code_puppy_agent/__init__.py +5 -0
- code_puppy_core_plugins/code_puppy_agent/register_callbacks.py +46 -0
- code_puppy_core_plugins/computer_use/NativeCapture.swift +123 -0
- code_puppy_core_plugins/computer_use/README.md +109 -0
- code_puppy_core_plugins/computer_use/__init__.py +1 -0
- code_puppy_core_plugins/computer_use/accessibility.py +163 -0
- code_puppy_core_plugins/computer_use/activation.py +75 -0
- code_puppy_core_plugins/computer_use/backend.py +584 -0
- code_puppy_core_plugins/computer_use/backend_types.py +5 -0
- code_puppy_core_plugins/computer_use/capture.py +110 -0
- code_puppy_core_plugins/computer_use/commands.py +62 -0
- code_puppy_core_plugins/computer_use/geometry.py +81 -0
- code_puppy_core_plugins/computer_use/inline_image.py +56 -0
- code_puppy_core_plugins/computer_use/keycodes.py +47 -0
- code_puppy_core_plugins/computer_use/policy.py +144 -0
- code_puppy_core_plugins/computer_use/register_callbacks.py +96 -0
- code_puppy_core_plugins/computer_use/safety.py +18 -0
- code_puppy_core_plugins/computer_use/settle.py +64 -0
- code_puppy_core_plugins/computer_use/state.py +86 -0
- code_puppy_core_plugins/computer_use/tools.py +469 -0
- code_puppy_core_plugins/context_indicator/__init__.py +14 -0
- code_puppy_core_plugins/context_indicator/register_callbacks.py +249 -0
- code_puppy_core_plugins/context_indicator/usage.py +40 -0
- code_puppy_core_plugins/copilot_auth/__init__.py +11 -0
- code_puppy_core_plugins/copilot_auth/config.py +93 -0
- code_puppy_core_plugins/copilot_auth/reasoning_client.py +409 -0
- code_puppy_core_plugins/copilot_auth/register_callbacks.py +460 -0
- code_puppy_core_plugins/copilot_auth/utils.py +587 -0
- code_puppy_core_plugins/customizable_commands/__init__.py +0 -0
- code_puppy_core_plugins/customizable_commands/register_callbacks.py +464 -0
- code_puppy_core_plugins/dbos_durable_exec/__init__.py +1 -0
- code_puppy_core_plugins/dbos_durable_exec/cancel.py +15 -0
- code_puppy_core_plugins/dbos_durable_exec/commands.py +31 -0
- code_puppy_core_plugins/dbos_durable_exec/config.py +31 -0
- code_puppy_core_plugins/dbos_durable_exec/lifecycle.py +83 -0
- code_puppy_core_plugins/dbos_durable_exec/register_callbacks.py +45 -0
- code_puppy_core_plugins/dbos_durable_exec/runtime.py +65 -0
- code_puppy_core_plugins/dbos_durable_exec/startup_lock.py +155 -0
- code_puppy_core_plugins/dbos_durable_exec/workflow_ids.py +16 -0
- code_puppy_core_plugins/dbos_durable_exec/wrapper.py +58 -0
- code_puppy_core_plugins/destructive_command_guard/AGENTS.md +79 -0
- code_puppy_core_plugins/destructive_command_guard/__init__.py +14 -0
- code_puppy_core_plugins/destructive_command_guard/detector.py +374 -0
- code_puppy_core_plugins/destructive_command_guard/register_callbacks.py +165 -0
- code_puppy_core_plugins/emoji_filter/__init__.py +12 -0
- code_puppy_core_plugins/emoji_filter/config.py +26 -0
- code_puppy_core_plugins/emoji_filter/register_callbacks.py +238 -0
- code_puppy_core_plugins/emoji_filter/stripper.py +45 -0
- code_puppy_core_plugins/empty_html_comment_filter/register_callbacks.py +116 -0
- code_puppy_core_plugins/example_custom_command/README.md +328 -0
- code_puppy_core_plugins/example_custom_command/register_callbacks.py +66 -0
- code_puppy_core_plugins/file_permission_handler/__init__.py +4 -0
- code_puppy_core_plugins/file_permission_handler/register_callbacks.py +575 -0
- code_puppy_core_plugins/flux_bootstrap/__init__.py +5 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/README.md +173 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/cheatsheet.md +86 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/pipeline.md +167 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/_docs/synopsis.md +392 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/about.md +51 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/address-feedback.md +129 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/ask.md +211 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/aug.md +181 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/auto-pilot.md +71 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/cheatsheet.md +16 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/commit.md +103 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/config.md +108 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/create-pr.md +195 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/exec.md +221 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/new.md +151 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/qa.md +208 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/rebase.md +180 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/review.md +304 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/split.md +120 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/squash-commits.md +179 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/status.md +46 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/commands/flux/tests.md +155 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_about.py +154 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_cheatsheet.py +248 -0
- code_puppy_core_plugins/flux_bootstrap/bundled/scripts/flux_status.py +345 -0
- code_puppy_core_plugins/flux_bootstrap/installer.py +256 -0
- code_puppy_core_plugins/flux_bootstrap/register_callbacks.py +71 -0
- code_puppy_core_plugins/force_push_guard/__init__.py +5 -0
- code_puppy_core_plugins/force_push_guard/detector.py +96 -0
- code_puppy_core_plugins/force_push_guard/register_callbacks.py +161 -0
- code_puppy_core_plugins/fork/__init__.py +7 -0
- code_puppy_core_plugins/fork/register_callbacks.py +445 -0
- code_puppy_core_plugins/frontend_emitter/__init__.py +25 -0
- code_puppy_core_plugins/frontend_emitter/emitter.py +249 -0
- code_puppy_core_plugins/frontend_emitter/register_callbacks.py +412 -0
- code_puppy_core_plugins/frontend_emitter/session_context.py +50 -0
- code_puppy_core_plugins/grok_oauth/__init__.py +6 -0
- code_puppy_core_plugins/grok_oauth/config.py +49 -0
- code_puppy_core_plugins/grok_oauth/oauth_flow.py +213 -0
- code_puppy_core_plugins/grok_oauth/register_callbacks.py +132 -0
- code_puppy_core_plugins/grok_oauth/utils.py +195 -0
- code_puppy_core_plugins/herdr/README.md +168 -0
- code_puppy_core_plugins/herdr/__init__.py +9 -0
- code_puppy_core_plugins/herdr/client.py +339 -0
- code_puppy_core_plugins/herdr/register_callbacks.py +140 -0
- code_puppy_core_plugins/herdr/reporter.py +212 -0
- code_puppy_core_plugins/herdr/smoke.py +143 -0
- code_puppy_core_plugins/herdr/sources.py +133 -0
- code_puppy_core_plugins/hook_creator/__init__.py +1 -0
- code_puppy_core_plugins/hook_creator/register_callbacks.py +33 -0
- code_puppy_core_plugins/hook_manager/__init__.py +1 -0
- code_puppy_core_plugins/hook_manager/config.py +290 -0
- code_puppy_core_plugins/hook_manager/hooks_menu.py +571 -0
- code_puppy_core_plugins/hook_manager/register_callbacks.py +227 -0
- code_puppy_core_plugins/meta_oauth/__init__.py +1 -0
- code_puppy_core_plugins/meta_oauth/config.py +55 -0
- code_puppy_core_plugins/meta_oauth/oauth_flow.py +109 -0
- code_puppy_core_plugins/meta_oauth/register_callbacks.py +154 -0
- code_puppy_core_plugins/meta_oauth/utils.py +252 -0
- code_puppy_core_plugins/namespace_skill_search/README.md +118 -0
- code_puppy_core_plugins/namespace_skill_search/__init__.py +15 -0
- code_puppy_core_plugins/namespace_skill_search/namespaces.py +125 -0
- code_puppy_core_plugins/namespace_skill_search/register_callbacks.py +99 -0
- code_puppy_core_plugins/namespace_skill_search/search_tool.py +158 -0
- code_puppy_core_plugins/no_tools/__init__.py +0 -0
- code_puppy_core_plugins/no_tools/register_callbacks.py +42 -0
- code_puppy_core_plugins/oauth_pasteback.py +110 -0
- code_puppy_core_plugins/oauth_puppy_html.py +194 -0
- code_puppy_core_plugins/obsidian_agent/README.md +52 -0
- code_puppy_core_plugins/obsidian_agent/__init__.py +8 -0
- code_puppy_core_plugins/obsidian_agent/agent_obsidian.py +147 -0
- code_puppy_core_plugins/obsidian_agent/register_callbacks.py +13 -0
- code_puppy_core_plugins/ollama/__init__.py +1 -0
- code_puppy_core_plugins/ollama/register_callbacks.py +127 -0
- code_puppy_core_plugins/ollama_setup/__init__.py +5 -0
- code_puppy_core_plugins/ollama_setup/completer.py +38 -0
- code_puppy_core_plugins/ollama_setup/register_callbacks.py +419 -0
- code_puppy_core_plugins/plugin_list/__init__.py +0 -0
- code_puppy_core_plugins/plugin_list/plugin_contributions.py +348 -0
- code_puppy_core_plugins/plugin_list/plugin_meta.py +67 -0
- code_puppy_core_plugins/plugin_list/plugin_text_utils.py +173 -0
- code_puppy_core_plugins/plugin_list/plugins_menu.py +455 -0
- code_puppy_core_plugins/plugin_list/plugins_menu_layout.py +194 -0
- code_puppy_core_plugins/plugin_list/plugins_menu_render.py +431 -0
- code_puppy_core_plugins/plugin_list/project_trust_flow.py +162 -0
- code_puppy_core_plugins/plugin_list/register_callbacks.py +281 -0
- code_puppy_core_plugins/pop_command/__init__.py +1 -0
- code_puppy_core_plugins/pop_command/register_callbacks.py +191 -0
- code_puppy_core_plugins/prompt_newline/__init__.py +13 -0
- code_puppy_core_plugins/prompt_newline/config.py +21 -0
- code_puppy_core_plugins/prompt_newline/register_callbacks.py +163 -0
- code_puppy_core_plugins/prune/__init__.py +1 -0
- code_puppy_core_plugins/prune/prune_menu.py +308 -0
- code_puppy_core_plugins/prune/prune_model.py +517 -0
- code_puppy_core_plugins/prune/prune_render.py +354 -0
- code_puppy_core_plugins/prune/register_callbacks.py +388 -0
- code_puppy_core_plugins/puppy_kennel/README.md +203 -0
- code_puppy_core_plugins/puppy_kennel/__init__.py +6 -0
- code_puppy_core_plugins/puppy_kennel/commands.py +206 -0
- code_puppy_core_plugins/puppy_kennel/config.py +36 -0
- code_puppy_core_plugins/puppy_kennel/kennel.py +368 -0
- code_puppy_core_plugins/puppy_kennel/packer.py +152 -0
- code_puppy_core_plugins/puppy_kennel/recorder.py +83 -0
- code_puppy_core_plugins/puppy_kennel/register_callbacks.py +109 -0
- code_puppy_core_plugins/puppy_kennel/retriever.py +28 -0
- code_puppy_core_plugins/puppy_kennel/schema.py +78 -0
- code_puppy_core_plugins/puppy_kennel/state.py +68 -0
- code_puppy_core_plugins/puppy_kennel/tools.py +449 -0
- code_puppy_core_plugins/puppy_kennel/wings.py +110 -0
- code_puppy_core_plugins/puppy_spinner/README.md +93 -0
- code_puppy_core_plugins/puppy_spinner/__init__.py +11 -0
- code_puppy_core_plugins/puppy_spinner/builtin_frames.py +172 -0
- code_puppy_core_plugins/puppy_spinner/commands.py +116 -0
- code_puppy_core_plugins/puppy_spinner/picker.py +379 -0
- code_puppy_core_plugins/puppy_spinner/register_callbacks.py +193 -0
- code_puppy_core_plugins/puppy_spinner/spinners.py +444 -0
- code_puppy_core_plugins/quick_resume/__init__.py +0 -0
- code_puppy_core_plugins/quick_resume/register_callbacks.py +77 -0
- code_puppy_core_plugins/review_pr/__init__.py +1 -0
- code_puppy_core_plugins/review_pr/register_callbacks.py +162 -0
- code_puppy_core_plugins/shell_safety/__init__.py +6 -0
- code_puppy_core_plugins/shell_safety/agent_shell_safety.py +69 -0
- code_puppy_core_plugins/shell_safety/command_cache.py +156 -0
- code_puppy_core_plugins/shell_safety/register_callbacks.py +203 -0
- code_puppy_core_plugins/stack_dump/__init__.py +1 -0
- code_puppy_core_plugins/stack_dump/register_callbacks.py +79 -0
- code_puppy_core_plugins/statusline/__init__.py +14 -0
- code_puppy_core_plugins/statusline/config.py +68 -0
- code_puppy_core_plugins/statusline/payload.py +138 -0
- code_puppy_core_plugins/statusline/prompt_patch.py +76 -0
- code_puppy_core_plugins/statusline/register_callbacks.py +45 -0
- code_puppy_core_plugins/statusline/runner.py +122 -0
- code_puppy_core_plugins/statusline/statusline_command.py +197 -0
- code_puppy_core_plugins/steer_queue/__init__.py +10 -0
- code_puppy_core_plugins/steer_queue/queue_menu.py +444 -0
- code_puppy_core_plugins/steer_queue/register_callbacks.py +138 -0
- code_puppy_core_plugins/subagent_panel/README.md +102 -0
- code_puppy_core_plugins/subagent_panel/__init__.py +24 -0
- code_puppy_core_plugins/subagent_panel/coalesce_patch.py +242 -0
- code_puppy_core_plugins/subagent_panel/panel_render.py +145 -0
- code_puppy_core_plugins/subagent_panel/register_callbacks.py +535 -0
- code_puppy_core_plugins/subagent_panel/resume_repaint.py +112 -0
- code_puppy_core_plugins/subagent_panel/state.py +231 -0
- code_puppy_core_plugins/switch_agent_resume/__init__.py +5 -0
- code_puppy_core_plugins/switch_agent_resume/register_callbacks.py +314 -0
- code_puppy_core_plugins/theme/README.md +86 -0
- code_puppy_core_plugins/theme/__init__.py +14 -0
- code_puppy_core_plugins/theme/bundled_palettes.py +346 -0
- code_puppy_core_plugins/theme/content_styles.py +146 -0
- code_puppy_core_plugins/theme/osc_palette.py +178 -0
- code_puppy_core_plugins/theme/picker.py +358 -0
- code_puppy_core_plugins/theme/prompt_toolkit_theme.py +113 -0
- code_puppy_core_plugins/theme/register_callbacks.py +348 -0
- code_puppy_core_plugins/theme/rich_themes.py +202 -0
- code_puppy_core_plugins/theme/themes.py +720 -0
- code_puppy_core_plugins/timestamp_heartbeat/__init__.py +1 -0
- code_puppy_core_plugins/timestamp_heartbeat/register_callbacks.py +114 -0
- code_puppy_core_plugins/token_ratio_learner/__init__.py +5 -0
- code_puppy_core_plugins/token_ratio_learner/ratios.py +208 -0
- code_puppy_core_plugins/token_ratio_learner/register_callbacks.py +213 -0
- code_puppy_core_plugins/universal_constructor/__init__.py +13 -0
- code_puppy_core_plugins/universal_constructor/models.py +138 -0
- code_puppy_core_plugins/universal_constructor/provider.py +62 -0
- code_puppy_core_plugins/universal_constructor/register_callbacks.py +75 -0
- code_puppy_core_plugins/universal_constructor/registry.py +302 -0
- code_puppy_core_plugins/universal_constructor/sandbox.py +584 -0
- code_puppy_core_plugins/wide_completion_menu/__init__.py +6 -0
- code_puppy_core_plugins/wide_completion_menu/register_callbacks.py +165 -0
- code_puppy_core_plugins/wiggum/__init__.py +1 -0
- code_puppy_core_plugins/wiggum/goal_runs.py +91 -0
- code_puppy_core_plugins/wiggum/judge.py +299 -0
- code_puppy_core_plugins/wiggum/judge_config.py +249 -0
- code_puppy_core_plugins/wiggum/judges_menu.py +814 -0
- code_puppy_core_plugins/wiggum/register_callbacks.py +569 -0
- code_puppy_core_plugins/wiggum/state.py +89 -0
- code_puppy_core_plugins/yolo_cli/__init__.py +1 -0
- code_puppy_core_plugins/yolo_cli/register_callbacks.py +41 -0
- code_puppy_core_plugins-0.0.2.dist-info/METADATA +64 -0
- code_puppy_core_plugins-0.0.2.dist-info/RECORD +313 -0
- code_puppy_core_plugins-0.0.2.dist-info/WHEEL +4 -0
- code_puppy_core_plugins-0.0.2.dist-info/entry_points.txt +55 -0
- code_puppy_core_plugins-0.0.2.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
"""Interactive TUI for /prune — multi-select history pruner.
|
|
2
|
+
|
|
3
|
+
Renders conversation history as a flat checkable list:
|
|
4
|
+
|
|
5
|
+
[ ] 001 asst ✎ "I've updated the auth module..."
|
|
6
|
+
[ ] 002 user "now make it idempotent"
|
|
7
|
+
[ ] 003 asst "Let me think through..."
|
|
8
|
+
|
|
9
|
+
Selection rules:
|
|
10
|
+
* Only whole messages are selectable. Their tool calls go with them.
|
|
11
|
+
* Tool returns (ModelRequest with ToolReturnPart) are not directly
|
|
12
|
+
selectable — they tag along with whatever message owns the
|
|
13
|
+
matching ToolCallPart.
|
|
14
|
+
* Locked rows (role=system, i.e. messages carrying a
|
|
15
|
+
SystemPromptPart) cannot be toggled.
|
|
16
|
+
|
|
17
|
+
Returns a PruneSelection describing which messages to remove. The
|
|
18
|
+
caller owns the actual mutation.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
import shutil
|
|
24
|
+
import sys
|
|
25
|
+
import time
|
|
26
|
+
from typing import List, Optional, Set, Tuple
|
|
27
|
+
|
|
28
|
+
from prompt_toolkit.application import Application
|
|
29
|
+
from prompt_toolkit.key_binding import KeyBindings
|
|
30
|
+
from prompt_toolkit.layout import Dimension, Layout, VSplit, Window
|
|
31
|
+
from prompt_toolkit.layout.controls import FormattedTextControl
|
|
32
|
+
from prompt_toolkit.widgets import Frame
|
|
33
|
+
|
|
34
|
+
from code_puppy_core_plugins.prune.prune_model import (
|
|
35
|
+
SIDE_EFFECT_ICONS,
|
|
36
|
+
ContextBudget,
|
|
37
|
+
MessageEntry,
|
|
38
|
+
PruneSelection,
|
|
39
|
+
Row,
|
|
40
|
+
)
|
|
41
|
+
from code_puppy_core_plugins.prune.prune_render import render_detail, render_list
|
|
42
|
+
from code_puppy.callbacks import on_prompt_toolkit_style
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class PruneMenu:
|
|
46
|
+
"""prompt_toolkit split-panel TUI for /prune."""
|
|
47
|
+
|
|
48
|
+
def __init__(
|
|
49
|
+
self,
|
|
50
|
+
entries: List[MessageEntry],
|
|
51
|
+
*,
|
|
52
|
+
budget: Optional[ContextBudget] = None,
|
|
53
|
+
) -> None:
|
|
54
|
+
if not entries:
|
|
55
|
+
raise ValueError("PruneMenu requires at least one entry")
|
|
56
|
+
|
|
57
|
+
self.entries = entries
|
|
58
|
+
self.budget = budget or ContextBudget()
|
|
59
|
+
|
|
60
|
+
# Build newest-first rows; pure tool returns hide under their owning
|
|
61
|
+
# assistant tool call instead of appearing as top-level entries.
|
|
62
|
+
self.rows: List[Row] = [
|
|
63
|
+
Row(message_idx=msg_idx)
|
|
64
|
+
for msg_idx in range(len(entries) - 1, -1, -1)
|
|
65
|
+
if not entries[msg_idx].is_pure_tool_return
|
|
66
|
+
]
|
|
67
|
+
|
|
68
|
+
if not self.rows:
|
|
69
|
+
raise ValueError("PruneMenu has no visible rows")
|
|
70
|
+
|
|
71
|
+
self.cursor: int = 0
|
|
72
|
+
self.selected_messages: Set[int] = set() # message_idx values
|
|
73
|
+
|
|
74
|
+
# Seed viewport dimensions for tests; run() replaces them with terminal
|
|
75
|
+
# size.
|
|
76
|
+
self.viewport_top: int = 0
|
|
77
|
+
self._visible_rows: int = 20
|
|
78
|
+
|
|
79
|
+
self.list_control: Optional[FormattedTextControl] = None
|
|
80
|
+
self.detail_control: Optional[FormattedTextControl] = None
|
|
81
|
+
self.detail_window: Optional[Window] = None
|
|
82
|
+
|
|
83
|
+
self._result: Optional[PruneSelection] = None
|
|
84
|
+
|
|
85
|
+
# ── selection logic ───────────────────────────────────────────────────
|
|
86
|
+
|
|
87
|
+
def _toggle_current(self) -> None:
|
|
88
|
+
row = self.rows[self.cursor]
|
|
89
|
+
# Locked rows carry a SystemPromptPart and are non-toggleable.
|
|
90
|
+
if self.entries[row.message_idx].is_locked:
|
|
91
|
+
return
|
|
92
|
+
if row.message_idx in self.selected_messages:
|
|
93
|
+
self.selected_messages.discard(row.message_idx)
|
|
94
|
+
else:
|
|
95
|
+
self.selected_messages.add(row.message_idx)
|
|
96
|
+
|
|
97
|
+
def _select_all(self) -> None:
|
|
98
|
+
for msg_idx, entry in enumerate(self.entries):
|
|
99
|
+
if entry.is_pure_tool_return or entry.is_locked:
|
|
100
|
+
continue
|
|
101
|
+
self.selected_messages.add(msg_idx)
|
|
102
|
+
|
|
103
|
+
def _clear_all(self) -> None:
|
|
104
|
+
self.selected_messages.clear()
|
|
105
|
+
|
|
106
|
+
def _row_is_checked(self, row: Row) -> bool:
|
|
107
|
+
return row.message_idx in self.selected_messages
|
|
108
|
+
|
|
109
|
+
# ── viewport / pagination ──────────────────────────────────────────────────
|
|
110
|
+
|
|
111
|
+
def _page_size(self) -> int:
|
|
112
|
+
"""Number of row lines that fit in the list pane right now."""
|
|
113
|
+
# Always keep the page size at least 1 so we never divide by zero.
|
|
114
|
+
return max(1, self._visible_rows)
|
|
115
|
+
|
|
116
|
+
def _scroll_into_view(self) -> None:
|
|
117
|
+
"""Adjust viewport_top so cursor stays visible. Idempotent."""
|
|
118
|
+
page = self._page_size()
|
|
119
|
+
if self.cursor < self.viewport_top:
|
|
120
|
+
self.viewport_top = self.cursor
|
|
121
|
+
elif self.cursor >= self.viewport_top + page:
|
|
122
|
+
self.viewport_top = self.cursor - page + 1
|
|
123
|
+
# Clamp so we don't show empty space past the end
|
|
124
|
+
max_top = max(0, len(self.rows) - page)
|
|
125
|
+
if self.viewport_top > max_top:
|
|
126
|
+
self.viewport_top = max_top
|
|
127
|
+
if self.viewport_top < 0:
|
|
128
|
+
self.viewport_top = 0
|
|
129
|
+
|
|
130
|
+
# ── rendering (delegated to prune_render) ───────────────────────────────
|
|
131
|
+
|
|
132
|
+
def _selection_has_side_effects(self) -> bool:
|
|
133
|
+
for msg_idx in self.selected_messages:
|
|
134
|
+
for tc in self.entries[msg_idx].tool_calls:
|
|
135
|
+
if tc.icon in SIDE_EFFECT_ICONS:
|
|
136
|
+
return True
|
|
137
|
+
return False
|
|
138
|
+
|
|
139
|
+
def _update_display(self) -> None:
|
|
140
|
+
self._scroll_into_view()
|
|
141
|
+
if self.list_control:
|
|
142
|
+
self.list_control.text = render_list(self)
|
|
143
|
+
if self.detail_control:
|
|
144
|
+
self.detail_control.text = render_detail(self)
|
|
145
|
+
|
|
146
|
+
# ── main entry ────────────────────────────────────────────────────────
|
|
147
|
+
|
|
148
|
+
def _build_selection(self) -> PruneSelection:
|
|
149
|
+
sel = PruneSelection()
|
|
150
|
+
for msg_idx in self.selected_messages:
|
|
151
|
+
sel.history_indices_to_drop.add(self.entries[msg_idx].history_index)
|
|
152
|
+
return sel
|
|
153
|
+
|
|
154
|
+
def _build_keybindings(self) -> KeyBindings:
|
|
155
|
+
kb = KeyBindings()
|
|
156
|
+
|
|
157
|
+
@kb.add("up")
|
|
158
|
+
@kb.add("c-p")
|
|
159
|
+
@kb.add("k")
|
|
160
|
+
def _up(event):
|
|
161
|
+
if self.cursor > 0:
|
|
162
|
+
self.cursor -= 1
|
|
163
|
+
self._update_display()
|
|
164
|
+
|
|
165
|
+
@kb.add("down")
|
|
166
|
+
@kb.add("c-n")
|
|
167
|
+
@kb.add("j")
|
|
168
|
+
def _down(event):
|
|
169
|
+
if self.cursor < len(self.rows) - 1:
|
|
170
|
+
self.cursor += 1
|
|
171
|
+
self._update_display()
|
|
172
|
+
|
|
173
|
+
@kb.add("pageup")
|
|
174
|
+
def _pageup(event):
|
|
175
|
+
self.cursor = max(0, self.cursor - self._page_size())
|
|
176
|
+
self._update_display()
|
|
177
|
+
|
|
178
|
+
@kb.add("pagedown")
|
|
179
|
+
def _pagedown(event):
|
|
180
|
+
self.cursor = min(len(self.rows) - 1, self.cursor + self._page_size())
|
|
181
|
+
self._update_display()
|
|
182
|
+
|
|
183
|
+
@kb.add("home")
|
|
184
|
+
def _home(event):
|
|
185
|
+
self.cursor = 0
|
|
186
|
+
self._update_display()
|
|
187
|
+
|
|
188
|
+
@kb.add("end")
|
|
189
|
+
def _end(event):
|
|
190
|
+
self.cursor = len(self.rows) - 1
|
|
191
|
+
self._update_display()
|
|
192
|
+
|
|
193
|
+
@kb.add("space")
|
|
194
|
+
def _toggle(event):
|
|
195
|
+
self._toggle_current()
|
|
196
|
+
self._update_display()
|
|
197
|
+
|
|
198
|
+
@kb.add("a")
|
|
199
|
+
def _all(event):
|
|
200
|
+
self._select_all()
|
|
201
|
+
self._update_display()
|
|
202
|
+
|
|
203
|
+
@kb.add("c")
|
|
204
|
+
def _clear(event):
|
|
205
|
+
self._clear_all()
|
|
206
|
+
self._update_display()
|
|
207
|
+
|
|
208
|
+
@kb.add("enter")
|
|
209
|
+
def _confirm(event):
|
|
210
|
+
self._result = self._build_selection()
|
|
211
|
+
event.app.exit()
|
|
212
|
+
|
|
213
|
+
@kb.add("q")
|
|
214
|
+
@kb.add("escape")
|
|
215
|
+
@kb.add("c-c")
|
|
216
|
+
def _quit(event):
|
|
217
|
+
self._result = None
|
|
218
|
+
event.app.exit()
|
|
219
|
+
|
|
220
|
+
return kb
|
|
221
|
+
|
|
222
|
+
def _measure_terminal(self) -> Tuple[int, int]:
|
|
223
|
+
"""Return (cols, rows) of the current terminal, with sane fallbacks."""
|
|
224
|
+
try:
|
|
225
|
+
size = shutil.get_terminal_size(fallback=(120, 40))
|
|
226
|
+
return max(60, size.columns), max(15, size.lines)
|
|
227
|
+
except Exception:
|
|
228
|
+
return 120, 40
|
|
229
|
+
|
|
230
|
+
def run(self) -> Optional[PruneSelection]:
|
|
231
|
+
self.list_control = FormattedTextControl(text="")
|
|
232
|
+
self.detail_control = FormattedTextControl(text="")
|
|
233
|
+
|
|
234
|
+
# Fix pane widths to terminal halves to prevent content-driven divider
|
|
235
|
+
# jitter; allow shrinking for tight terminals.
|
|
236
|
+
cols, rows = self._measure_terminal()
|
|
237
|
+
# Reserve generous border/padding chrome to avoid "Window too small" errors.
|
|
238
|
+
usable_cols = max(40, cols - 8)
|
|
239
|
+
left_cols = usable_cols // 2
|
|
240
|
+
right_cols = usable_cols - left_cols
|
|
241
|
+
# Reserve title, budget, legend, indicators, footer, and frame lines;
|
|
242
|
+
# floor at 5 so tiny terminals still work.
|
|
243
|
+
self._visible_rows = max(5, rows - 12)
|
|
244
|
+
|
|
245
|
+
list_width = Dimension(min=20, max=left_cols, preferred=left_cols)
|
|
246
|
+
detail_width = Dimension(min=20, max=right_cols, preferred=right_cols)
|
|
247
|
+
|
|
248
|
+
list_window = Window(
|
|
249
|
+
content=self.list_control, wrap_lines=False, width=list_width
|
|
250
|
+
)
|
|
251
|
+
detail_window = Window(
|
|
252
|
+
content=self.detail_control,
|
|
253
|
+
wrap_lines=True,
|
|
254
|
+
width=detail_width,
|
|
255
|
+
)
|
|
256
|
+
self.detail_window = detail_window
|
|
257
|
+
|
|
258
|
+
list_frame = Frame(list_window, title="history")
|
|
259
|
+
detail_frame = Frame(detail_window, title="detail")
|
|
260
|
+
root = VSplit([list_frame, detail_frame])
|
|
261
|
+
|
|
262
|
+
layout = Layout(root)
|
|
263
|
+
app = Application(
|
|
264
|
+
layout=layout,
|
|
265
|
+
key_bindings=self._build_keybindings(),
|
|
266
|
+
full_screen=False,
|
|
267
|
+
mouse_support=False,
|
|
268
|
+
style=on_prompt_toolkit_style(),
|
|
269
|
+
)
|
|
270
|
+
|
|
271
|
+
try:
|
|
272
|
+
from code_puppy.tools.command_runner import set_awaiting_user_input
|
|
273
|
+
|
|
274
|
+
set_awaiting_user_input(True)
|
|
275
|
+
except Exception:
|
|
276
|
+
pass
|
|
277
|
+
|
|
278
|
+
sys.stdout.write("\033[?1049h")
|
|
279
|
+
sys.stdout.write("\033[2J\033[H")
|
|
280
|
+
sys.stdout.flush()
|
|
281
|
+
time.sleep(0.05)
|
|
282
|
+
|
|
283
|
+
try:
|
|
284
|
+
self._update_display()
|
|
285
|
+
sys.stdout.write("\033[2J\033[H")
|
|
286
|
+
sys.stdout.flush()
|
|
287
|
+
app.run(in_thread=True)
|
|
288
|
+
finally:
|
|
289
|
+
sys.stdout.write("\033[?1049l")
|
|
290
|
+
sys.stdout.flush()
|
|
291
|
+
try:
|
|
292
|
+
import termios
|
|
293
|
+
|
|
294
|
+
termios.tcflush(sys.stdin.fileno(), termios.TCIFLUSH)
|
|
295
|
+
except Exception:
|
|
296
|
+
pass
|
|
297
|
+
time.sleep(0.1)
|
|
298
|
+
try:
|
|
299
|
+
from code_puppy.tools.command_runner import set_awaiting_user_input
|
|
300
|
+
|
|
301
|
+
set_awaiting_user_input(False)
|
|
302
|
+
except Exception:
|
|
303
|
+
pass
|
|
304
|
+
|
|
305
|
+
return self._result
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
__all__ = ["PruneMenu"]
|