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,288 @@
|
|
|
1
|
+
"""ChatGPT OAuth plugin callbacks aligned with ChatMock flow.
|
|
2
|
+
|
|
3
|
+
Provides OAuth authentication for ChatGPT models and registers
|
|
4
|
+
the 'chatgpt_oauth' model type handler.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import os
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Any, Dict, List, Optional, Tuple
|
|
12
|
+
|
|
13
|
+
from code_puppy.callbacks import register_callback
|
|
14
|
+
from code_puppy.i18n import t
|
|
15
|
+
from code_puppy.messaging import emit_error, emit_info, emit_success, emit_warning
|
|
16
|
+
from code_puppy.model_switching import set_model_and_reload_agent
|
|
17
|
+
from code_puppy_core_plugins.agent_skills.discovery import refresh_skill_cache
|
|
18
|
+
|
|
19
|
+
from .config import CHATGPT_OAUTH_CONFIG, get_token_storage_path
|
|
20
|
+
from .oauth_flow import run_oauth_flow
|
|
21
|
+
from .usage import get_usage_status, refresh_usage_in_background
|
|
22
|
+
from .utils import (
|
|
23
|
+
get_valid_access_token,
|
|
24
|
+
load_chatgpt_models,
|
|
25
|
+
load_stored_tokens,
|
|
26
|
+
remove_chatgpt_models,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _custom_help() -> List[Tuple[str, str]]:
|
|
31
|
+
return [
|
|
32
|
+
(
|
|
33
|
+
"chatgpt-auth",
|
|
34
|
+
"Authenticate with ChatGPT via OAuth and import available models",
|
|
35
|
+
),
|
|
36
|
+
("codex-auth", "Alias for /chatgpt-auth"),
|
|
37
|
+
(
|
|
38
|
+
"chatgpt-status",
|
|
39
|
+
"Check ChatGPT OAuth authentication status and configured models",
|
|
40
|
+
),
|
|
41
|
+
("codex-status", "Alias for /chatgpt-status"),
|
|
42
|
+
("chatgpt-logout", "Remove ChatGPT OAuth tokens and imported models"),
|
|
43
|
+
("codex-logout", "Alias for /chatgpt-logout"),
|
|
44
|
+
("codex-imagegen <prompt>", "Generate an image with Codex OAuth"),
|
|
45
|
+
]
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _handle_chatgpt_status() -> None:
|
|
49
|
+
tokens = load_stored_tokens()
|
|
50
|
+
if tokens and tokens.get("access_token"):
|
|
51
|
+
emit_success("🔐 ChatGPT OAuth: Authenticated")
|
|
52
|
+
|
|
53
|
+
api_key = tokens.get("api_key")
|
|
54
|
+
if api_key:
|
|
55
|
+
os.environ[CHATGPT_OAUTH_CONFIG["api_key_env_var"]] = api_key
|
|
56
|
+
emit_info("✅ OAuth access token available for API requests")
|
|
57
|
+
else:
|
|
58
|
+
emit_warning("⚠️ No access token obtained. Authentication may have failed.")
|
|
59
|
+
|
|
60
|
+
chatgpt_models = [
|
|
61
|
+
name
|
|
62
|
+
for name, cfg in load_chatgpt_models().items()
|
|
63
|
+
if cfg.get("oauth_source") == "chatgpt-oauth-plugin"
|
|
64
|
+
]
|
|
65
|
+
if chatgpt_models:
|
|
66
|
+
emit_info(f"🎯 Configured ChatGPT models: {', '.join(chatgpt_models)}")
|
|
67
|
+
else:
|
|
68
|
+
emit_warning("⚠️ No ChatGPT models configured yet.")
|
|
69
|
+
else:
|
|
70
|
+
emit_warning("🔓 ChatGPT OAuth: Not authenticated")
|
|
71
|
+
emit_info("🌐 Run /chatgpt-auth to launch the browser sign-in flow.")
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _handle_chatgpt_logout() -> None:
|
|
75
|
+
was_authenticated = _is_codex_oauth_authenticated()
|
|
76
|
+
|
|
77
|
+
token_path = get_token_storage_path()
|
|
78
|
+
if token_path.exists():
|
|
79
|
+
token_path.unlink()
|
|
80
|
+
emit_info("Removed ChatGPT OAuth tokens")
|
|
81
|
+
|
|
82
|
+
if CHATGPT_OAUTH_CONFIG["api_key_env_var"] in os.environ:
|
|
83
|
+
del os.environ[CHATGPT_OAUTH_CONFIG["api_key_env_var"]]
|
|
84
|
+
|
|
85
|
+
removed = remove_chatgpt_models()
|
|
86
|
+
if removed:
|
|
87
|
+
emit_info(f"Removed {removed} ChatGPT models from configuration")
|
|
88
|
+
|
|
89
|
+
emit_success("ChatGPT logout complete")
|
|
90
|
+
|
|
91
|
+
if was_authenticated:
|
|
92
|
+
_reload_active_agent()
|
|
93
|
+
# Mirror the tool-unbinding reload above: the codex-imagegen skill is auth-gated
|
|
94
|
+
# too, so drop it from the skill cache instead of leaving it visible until restart.
|
|
95
|
+
refresh_skill_cache()
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _is_codex_oauth_authenticated() -> bool:
|
|
99
|
+
"""Whether Codex OAuth tokens are present on disk."""
|
|
100
|
+
tokens = load_stored_tokens()
|
|
101
|
+
return bool(tokens and tokens.get("access_token") and tokens.get("account_id"))
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def _reload_active_agent() -> None:
|
|
105
|
+
"""Reload the active agent so tool advertisement changes take effect."""
|
|
106
|
+
from code_puppy.agents import get_current_agent
|
|
107
|
+
|
|
108
|
+
try:
|
|
109
|
+
current_agent = get_current_agent()
|
|
110
|
+
except Exception:
|
|
111
|
+
return
|
|
112
|
+
if current_agent is None:
|
|
113
|
+
return
|
|
114
|
+
try:
|
|
115
|
+
if hasattr(current_agent, "refresh_config"):
|
|
116
|
+
try:
|
|
117
|
+
current_agent.refresh_config()
|
|
118
|
+
except Exception:
|
|
119
|
+
pass
|
|
120
|
+
current_agent.reload_code_generation_agent()
|
|
121
|
+
except Exception as exc:
|
|
122
|
+
emit_warning(t("codex.logout.reload_failed", error=str(exc)))
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def _handle_custom_command(command: str, name: str) -> Optional[bool]:
|
|
126
|
+
if not name:
|
|
127
|
+
return None
|
|
128
|
+
|
|
129
|
+
if name in {"chatgpt-auth", "codex-auth"}:
|
|
130
|
+
run_oauth_flow()
|
|
131
|
+
set_model_and_reload_agent("codex-gpt-5.6-sol")
|
|
132
|
+
# Auth just succeeded: re-discover the auth-gated codex-imagegen skill now
|
|
133
|
+
# rather than waiting for the next process restart.
|
|
134
|
+
refresh_skill_cache()
|
|
135
|
+
return True
|
|
136
|
+
|
|
137
|
+
if name in {"chatgpt-status", "codex-status"}:
|
|
138
|
+
_handle_chatgpt_status()
|
|
139
|
+
return True
|
|
140
|
+
|
|
141
|
+
if name in {"chatgpt-logout", "codex-logout"}:
|
|
142
|
+
_handle_chatgpt_logout()
|
|
143
|
+
return True
|
|
144
|
+
|
|
145
|
+
if name == "codex-imagegen":
|
|
146
|
+
from .image_generation import (
|
|
147
|
+
CodexImageGenerationError,
|
|
148
|
+
emit_iterm_image,
|
|
149
|
+
generate_image,
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
_, _, prompt = command.partition(" ")
|
|
153
|
+
if not prompt.strip():
|
|
154
|
+
emit_warning(t("codex.imagegen.usage"))
|
|
155
|
+
return True
|
|
156
|
+
emit_info(t("codex.imagegen.generating"))
|
|
157
|
+
try:
|
|
158
|
+
output_path = generate_image(prompt)
|
|
159
|
+
except CodexImageGenerationError as exc:
|
|
160
|
+
emit_error(str(exc))
|
|
161
|
+
else:
|
|
162
|
+
emit_success(t("codex.imagegen.saved", path=str(output_path)))
|
|
163
|
+
emit_iterm_image(output_path)
|
|
164
|
+
return True
|
|
165
|
+
|
|
166
|
+
return None
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def _create_chatgpt_oauth_model(
|
|
170
|
+
model_name: str, model_config: Dict, config: Dict
|
|
171
|
+
) -> Any:
|
|
172
|
+
"""Create a ChatGPT OAuth model instance.
|
|
173
|
+
|
|
174
|
+
This handler is registered via the 'register_model_type' callback to handle
|
|
175
|
+
models with type='chatgpt_oauth'.
|
|
176
|
+
"""
|
|
177
|
+
from pydantic_ai.models.openai import OpenAIResponsesModel
|
|
178
|
+
from pydantic_ai.providers.openai import OpenAIProvider
|
|
179
|
+
|
|
180
|
+
from code_puppy.chatgpt_codex_client import create_codex_async_client
|
|
181
|
+
from code_puppy.http_utils import get_cert_bundle_path
|
|
182
|
+
|
|
183
|
+
# Get a valid access token (refreshing if needed)
|
|
184
|
+
access_token = get_valid_access_token()
|
|
185
|
+
if not access_token:
|
|
186
|
+
emit_warning(
|
|
187
|
+
f"Failed to get valid ChatGPT OAuth token; skipping model '{model_config.get('name')}'. "
|
|
188
|
+
"Run /chatgpt-auth to authenticate."
|
|
189
|
+
)
|
|
190
|
+
return None
|
|
191
|
+
|
|
192
|
+
# Get account_id from stored tokens (required for ChatGPT-Account-Id header)
|
|
193
|
+
tokens = load_stored_tokens()
|
|
194
|
+
account_id = tokens.get("account_id", "") if tokens else ""
|
|
195
|
+
if not account_id:
|
|
196
|
+
emit_warning(
|
|
197
|
+
f"No account_id found in ChatGPT OAuth tokens; skipping model '{model_config.get('name')}'. "
|
|
198
|
+
"Run /chatgpt-auth to re-authenticate."
|
|
199
|
+
)
|
|
200
|
+
return None
|
|
201
|
+
|
|
202
|
+
# Refresh plan limits without delaying model creation or terminal rendering.
|
|
203
|
+
refresh_usage_in_background(access_token, account_id)
|
|
204
|
+
|
|
205
|
+
# Build headers for ChatGPT Codex API
|
|
206
|
+
originator = CHATGPT_OAUTH_CONFIG.get("originator", "codex_cli_rs")
|
|
207
|
+
client_version = CHATGPT_OAUTH_CONFIG.get("client_version", "0.144.1")
|
|
208
|
+
|
|
209
|
+
headers = {
|
|
210
|
+
"ChatGPT-Account-Id": account_id,
|
|
211
|
+
"originator": originator,
|
|
212
|
+
"User-Agent": f"{originator}/{client_version}",
|
|
213
|
+
}
|
|
214
|
+
# Merge with any headers from model config
|
|
215
|
+
config_headers = model_config.get("custom_endpoint", {}).get("headers", {})
|
|
216
|
+
headers.update(config_headers)
|
|
217
|
+
|
|
218
|
+
# Get base URL - Codex API uses chatgpt.com, not api.openai.com
|
|
219
|
+
base_url = model_config.get("custom_endpoint", {}).get(
|
|
220
|
+
"url", CHATGPT_OAUTH_CONFIG["api_base_url"]
|
|
221
|
+
)
|
|
222
|
+
|
|
223
|
+
# Create HTTP client with Codex interceptor for store=false injection
|
|
224
|
+
verify = get_cert_bundle_path()
|
|
225
|
+
client = create_codex_async_client(headers=headers, verify=verify)
|
|
226
|
+
|
|
227
|
+
provider = OpenAIProvider(
|
|
228
|
+
api_key=access_token,
|
|
229
|
+
base_url=base_url,
|
|
230
|
+
http_client=client,
|
|
231
|
+
)
|
|
232
|
+
|
|
233
|
+
# ChatGPT Codex API only supports Responses format
|
|
234
|
+
return OpenAIResponsesModel(model_name=model_config["name"], provider=provider)
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
def _register_imagegen_skill() -> list[dict[str, str]]:
|
|
238
|
+
# Same auth gate as _advertise_imagegen_tool: hide the skill so a model can't
|
|
239
|
+
# activate it, attempt codex_imagegen(...), and only then discover it's unavailable.
|
|
240
|
+
if not _is_codex_oauth_authenticated():
|
|
241
|
+
return []
|
|
242
|
+
return [
|
|
243
|
+
{
|
|
244
|
+
"name": "codex-imagegen",
|
|
245
|
+
"skill_md_path": str(Path(__file__).with_name("IMAGEGEN_SKILL.md")),
|
|
246
|
+
}
|
|
247
|
+
]
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def _register_imagegen_tools() -> list[dict[str, Any]]:
|
|
251
|
+
from .image_tool import register_tools_callback
|
|
252
|
+
|
|
253
|
+
return register_tools_callback()
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
def _advertise_imagegen_tool(agent_name: str | None = None) -> list[str]:
|
|
257
|
+
del agent_name
|
|
258
|
+
if not _is_codex_oauth_authenticated():
|
|
259
|
+
return []
|
|
260
|
+
return ["codex_imagegen"]
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
def _register_model_types() -> List[Dict[str, Any]]:
|
|
264
|
+
"""Register the chatgpt_oauth model type handler."""
|
|
265
|
+
return [{"type": "chatgpt_oauth", "handler": _create_chatgpt_oauth_model}]
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def _refresh_usage_on_agent_run(
|
|
269
|
+
agent_name: str, model_name: str, session_id: str | None = None
|
|
270
|
+
) -> None:
|
|
271
|
+
"""Keep limits fresh for Codex runs; the actual HTTP request is asynchronous."""
|
|
272
|
+
del agent_name, session_id
|
|
273
|
+
if not model_name.startswith("codex-"):
|
|
274
|
+
return
|
|
275
|
+
tokens = load_stored_tokens() or {}
|
|
276
|
+
refresh_usage_in_background(
|
|
277
|
+
tokens.get("access_token", ""), tokens.get("account_id", "")
|
|
278
|
+
)
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
register_callback("custom_command_help", _custom_help)
|
|
282
|
+
register_callback("custom_command", _handle_custom_command)
|
|
283
|
+
register_callback("usage_status", get_usage_status)
|
|
284
|
+
register_callback("register_model_type", _register_model_types)
|
|
285
|
+
register_callback("register_skills", _register_imagegen_skill)
|
|
286
|
+
register_callback("register_tools", _register_imagegen_tools)
|
|
287
|
+
register_callback("register_agent_tools", _advertise_imagegen_tool)
|
|
288
|
+
register_callback("agent_run_start", _refresh_usage_on_agent_run)
|