code-puppy 0.0.169__py3-none-any.whl → 0.0.366__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.
Files changed (243) hide show
  1. code_puppy/__init__.py +7 -1
  2. code_puppy/agents/__init__.py +8 -8
  3. code_puppy/agents/agent_c_reviewer.py +155 -0
  4. code_puppy/agents/agent_code_puppy.py +9 -2
  5. code_puppy/agents/agent_code_reviewer.py +90 -0
  6. code_puppy/agents/agent_cpp_reviewer.py +132 -0
  7. code_puppy/agents/agent_creator_agent.py +48 -9
  8. code_puppy/agents/agent_golang_reviewer.py +151 -0
  9. code_puppy/agents/agent_javascript_reviewer.py +160 -0
  10. code_puppy/agents/agent_manager.py +146 -199
  11. code_puppy/agents/agent_pack_leader.py +383 -0
  12. code_puppy/agents/agent_planning.py +163 -0
  13. code_puppy/agents/agent_python_programmer.py +165 -0
  14. code_puppy/agents/agent_python_reviewer.py +90 -0
  15. code_puppy/agents/agent_qa_expert.py +163 -0
  16. code_puppy/agents/agent_qa_kitten.py +208 -0
  17. code_puppy/agents/agent_security_auditor.py +181 -0
  18. code_puppy/agents/agent_terminal_qa.py +323 -0
  19. code_puppy/agents/agent_typescript_reviewer.py +166 -0
  20. code_puppy/agents/base_agent.py +1713 -1
  21. code_puppy/agents/event_stream_handler.py +350 -0
  22. code_puppy/agents/json_agent.py +12 -1
  23. code_puppy/agents/pack/__init__.py +34 -0
  24. code_puppy/agents/pack/bloodhound.py +304 -0
  25. code_puppy/agents/pack/husky.py +321 -0
  26. code_puppy/agents/pack/retriever.py +393 -0
  27. code_puppy/agents/pack/shepherd.py +348 -0
  28. code_puppy/agents/pack/terrier.py +287 -0
  29. code_puppy/agents/pack/watchdog.py +367 -0
  30. code_puppy/agents/prompt_reviewer.py +145 -0
  31. code_puppy/agents/subagent_stream_handler.py +276 -0
  32. code_puppy/api/__init__.py +13 -0
  33. code_puppy/api/app.py +169 -0
  34. code_puppy/api/main.py +21 -0
  35. code_puppy/api/pty_manager.py +446 -0
  36. code_puppy/api/routers/__init__.py +12 -0
  37. code_puppy/api/routers/agents.py +36 -0
  38. code_puppy/api/routers/commands.py +217 -0
  39. code_puppy/api/routers/config.py +74 -0
  40. code_puppy/api/routers/sessions.py +232 -0
  41. code_puppy/api/templates/terminal.html +361 -0
  42. code_puppy/api/websocket.py +154 -0
  43. code_puppy/callbacks.py +174 -4
  44. code_puppy/chatgpt_codex_client.py +283 -0
  45. code_puppy/claude_cache_client.py +586 -0
  46. code_puppy/cli_runner.py +916 -0
  47. code_puppy/command_line/add_model_menu.py +1079 -0
  48. code_puppy/command_line/agent_menu.py +395 -0
  49. code_puppy/command_line/attachments.py +395 -0
  50. code_puppy/command_line/autosave_menu.py +605 -0
  51. code_puppy/command_line/clipboard.py +527 -0
  52. code_puppy/command_line/colors_menu.py +520 -0
  53. code_puppy/command_line/command_handler.py +233 -627
  54. code_puppy/command_line/command_registry.py +150 -0
  55. code_puppy/command_line/config_commands.py +715 -0
  56. code_puppy/command_line/core_commands.py +792 -0
  57. code_puppy/command_line/diff_menu.py +863 -0
  58. code_puppy/command_line/load_context_completion.py +15 -22
  59. code_puppy/command_line/mcp/base.py +1 -4
  60. code_puppy/command_line/mcp/catalog_server_installer.py +175 -0
  61. code_puppy/command_line/mcp/custom_server_form.py +688 -0
  62. code_puppy/command_line/mcp/custom_server_installer.py +195 -0
  63. code_puppy/command_line/mcp/edit_command.py +148 -0
  64. code_puppy/command_line/mcp/handler.py +9 -4
  65. code_puppy/command_line/mcp/help_command.py +6 -5
  66. code_puppy/command_line/mcp/install_command.py +16 -27
  67. code_puppy/command_line/mcp/install_menu.py +685 -0
  68. code_puppy/command_line/mcp/list_command.py +3 -3
  69. code_puppy/command_line/mcp/logs_command.py +174 -65
  70. code_puppy/command_line/mcp/remove_command.py +2 -2
  71. code_puppy/command_line/mcp/restart_command.py +12 -4
  72. code_puppy/command_line/mcp/search_command.py +17 -11
  73. code_puppy/command_line/mcp/start_all_command.py +22 -13
  74. code_puppy/command_line/mcp/start_command.py +50 -31
  75. code_puppy/command_line/mcp/status_command.py +6 -7
  76. code_puppy/command_line/mcp/stop_all_command.py +11 -8
  77. code_puppy/command_line/mcp/stop_command.py +11 -10
  78. code_puppy/command_line/mcp/test_command.py +2 -2
  79. code_puppy/command_line/mcp/utils.py +1 -1
  80. code_puppy/command_line/mcp/wizard_utils.py +22 -18
  81. code_puppy/command_line/mcp_completion.py +174 -0
  82. code_puppy/command_line/model_picker_completion.py +89 -30
  83. code_puppy/command_line/model_settings_menu.py +884 -0
  84. code_puppy/command_line/motd.py +14 -8
  85. code_puppy/command_line/onboarding_slides.py +179 -0
  86. code_puppy/command_line/onboarding_wizard.py +340 -0
  87. code_puppy/command_line/pin_command_completion.py +329 -0
  88. code_puppy/command_line/prompt_toolkit_completion.py +626 -75
  89. code_puppy/command_line/session_commands.py +296 -0
  90. code_puppy/command_line/utils.py +54 -0
  91. code_puppy/config.py +1181 -51
  92. code_puppy/error_logging.py +118 -0
  93. code_puppy/gemini_code_assist.py +385 -0
  94. code_puppy/gemini_model.py +602 -0
  95. code_puppy/http_utils.py +220 -104
  96. code_puppy/keymap.py +128 -0
  97. code_puppy/main.py +5 -594
  98. code_puppy/{mcp → mcp_}/__init__.py +17 -0
  99. code_puppy/{mcp → mcp_}/async_lifecycle.py +35 -4
  100. code_puppy/{mcp → mcp_}/blocking_startup.py +70 -43
  101. code_puppy/{mcp → mcp_}/captured_stdio_server.py +2 -2
  102. code_puppy/{mcp → mcp_}/config_wizard.py +5 -5
  103. code_puppy/{mcp → mcp_}/dashboard.py +15 -6
  104. code_puppy/{mcp → mcp_}/examples/retry_example.py +4 -1
  105. code_puppy/{mcp → mcp_}/managed_server.py +66 -39
  106. code_puppy/{mcp → mcp_}/manager.py +146 -52
  107. code_puppy/mcp_/mcp_logs.py +224 -0
  108. code_puppy/{mcp → mcp_}/registry.py +6 -6
  109. code_puppy/{mcp → mcp_}/server_registry_catalog.py +25 -8
  110. code_puppy/messaging/__init__.py +199 -2
  111. code_puppy/messaging/bus.py +610 -0
  112. code_puppy/messaging/commands.py +167 -0
  113. code_puppy/messaging/markdown_patches.py +57 -0
  114. code_puppy/messaging/message_queue.py +17 -48
  115. code_puppy/messaging/messages.py +500 -0
  116. code_puppy/messaging/queue_console.py +1 -24
  117. code_puppy/messaging/renderers.py +43 -146
  118. code_puppy/messaging/rich_renderer.py +1027 -0
  119. code_puppy/messaging/spinner/__init__.py +33 -5
  120. code_puppy/messaging/spinner/console_spinner.py +92 -52
  121. code_puppy/messaging/spinner/spinner_base.py +29 -0
  122. code_puppy/messaging/subagent_console.py +461 -0
  123. code_puppy/model_factory.py +686 -80
  124. code_puppy/model_utils.py +167 -0
  125. code_puppy/models.json +86 -104
  126. code_puppy/models_dev_api.json +1 -0
  127. code_puppy/models_dev_parser.py +592 -0
  128. code_puppy/plugins/__init__.py +164 -10
  129. code_puppy/plugins/antigravity_oauth/__init__.py +10 -0
  130. code_puppy/plugins/antigravity_oauth/accounts.py +406 -0
  131. code_puppy/plugins/antigravity_oauth/antigravity_model.py +704 -0
  132. code_puppy/plugins/antigravity_oauth/config.py +42 -0
  133. code_puppy/plugins/antigravity_oauth/constants.py +136 -0
  134. code_puppy/plugins/antigravity_oauth/oauth.py +478 -0
  135. code_puppy/plugins/antigravity_oauth/register_callbacks.py +406 -0
  136. code_puppy/plugins/antigravity_oauth/storage.py +271 -0
  137. code_puppy/plugins/antigravity_oauth/test_plugin.py +319 -0
  138. code_puppy/plugins/antigravity_oauth/token.py +167 -0
  139. code_puppy/plugins/antigravity_oauth/transport.py +767 -0
  140. code_puppy/plugins/antigravity_oauth/utils.py +169 -0
  141. code_puppy/plugins/chatgpt_oauth/__init__.py +8 -0
  142. code_puppy/plugins/chatgpt_oauth/config.py +52 -0
  143. code_puppy/plugins/chatgpt_oauth/oauth_flow.py +328 -0
  144. code_puppy/plugins/chatgpt_oauth/register_callbacks.py +94 -0
  145. code_puppy/plugins/chatgpt_oauth/test_plugin.py +293 -0
  146. code_puppy/plugins/chatgpt_oauth/utils.py +489 -0
  147. code_puppy/plugins/claude_code_oauth/README.md +167 -0
  148. code_puppy/plugins/claude_code_oauth/SETUP.md +93 -0
  149. code_puppy/plugins/claude_code_oauth/__init__.py +6 -0
  150. code_puppy/plugins/claude_code_oauth/config.py +50 -0
  151. code_puppy/plugins/claude_code_oauth/register_callbacks.py +308 -0
  152. code_puppy/plugins/claude_code_oauth/test_plugin.py +283 -0
  153. code_puppy/plugins/claude_code_oauth/utils.py +518 -0
  154. code_puppy/plugins/customizable_commands/__init__.py +0 -0
  155. code_puppy/plugins/customizable_commands/register_callbacks.py +169 -0
  156. code_puppy/plugins/example_custom_command/README.md +280 -0
  157. code_puppy/plugins/example_custom_command/register_callbacks.py +51 -0
  158. code_puppy/plugins/file_permission_handler/__init__.py +4 -0
  159. code_puppy/plugins/file_permission_handler/register_callbacks.py +523 -0
  160. code_puppy/plugins/frontend_emitter/__init__.py +25 -0
  161. code_puppy/plugins/frontend_emitter/emitter.py +121 -0
  162. code_puppy/plugins/frontend_emitter/register_callbacks.py +261 -0
  163. code_puppy/plugins/oauth_puppy_html.py +228 -0
  164. code_puppy/plugins/shell_safety/__init__.py +6 -0
  165. code_puppy/plugins/shell_safety/agent_shell_safety.py +69 -0
  166. code_puppy/plugins/shell_safety/command_cache.py +156 -0
  167. code_puppy/plugins/shell_safety/register_callbacks.py +202 -0
  168. code_puppy/prompts/antigravity_system_prompt.md +1 -0
  169. code_puppy/prompts/codex_system_prompt.md +310 -0
  170. code_puppy/pydantic_patches.py +131 -0
  171. code_puppy/reopenable_async_client.py +8 -8
  172. code_puppy/round_robin_model.py +10 -15
  173. code_puppy/session_storage.py +294 -0
  174. code_puppy/status_display.py +21 -4
  175. code_puppy/summarization_agent.py +52 -14
  176. code_puppy/terminal_utils.py +418 -0
  177. code_puppy/tools/__init__.py +139 -6
  178. code_puppy/tools/agent_tools.py +548 -49
  179. code_puppy/tools/browser/__init__.py +37 -0
  180. code_puppy/tools/browser/browser_control.py +289 -0
  181. code_puppy/tools/browser/browser_interactions.py +545 -0
  182. code_puppy/tools/browser/browser_locators.py +640 -0
  183. code_puppy/tools/browser/browser_manager.py +316 -0
  184. code_puppy/tools/browser/browser_navigation.py +251 -0
  185. code_puppy/tools/browser/browser_screenshot.py +179 -0
  186. code_puppy/tools/browser/browser_scripts.py +462 -0
  187. code_puppy/tools/browser/browser_workflows.py +221 -0
  188. code_puppy/tools/browser/chromium_terminal_manager.py +259 -0
  189. code_puppy/tools/browser/terminal_command_tools.py +521 -0
  190. code_puppy/tools/browser/terminal_screenshot_tools.py +556 -0
  191. code_puppy/tools/browser/terminal_tools.py +525 -0
  192. code_puppy/tools/command_runner.py +941 -153
  193. code_puppy/tools/common.py +1146 -6
  194. code_puppy/tools/display.py +84 -0
  195. code_puppy/tools/file_modifications.py +288 -89
  196. code_puppy/tools/file_operations.py +352 -266
  197. code_puppy/tools/subagent_context.py +158 -0
  198. code_puppy/uvx_detection.py +242 -0
  199. code_puppy/version_checker.py +30 -11
  200. code_puppy-0.0.366.data/data/code_puppy/models.json +110 -0
  201. code_puppy-0.0.366.data/data/code_puppy/models_dev_api.json +1 -0
  202. {code_puppy-0.0.169.dist-info → code_puppy-0.0.366.dist-info}/METADATA +184 -67
  203. code_puppy-0.0.366.dist-info/RECORD +217 -0
  204. {code_puppy-0.0.169.dist-info → code_puppy-0.0.366.dist-info}/WHEEL +1 -1
  205. {code_puppy-0.0.169.dist-info → code_puppy-0.0.366.dist-info}/entry_points.txt +1 -0
  206. code_puppy/agent.py +0 -231
  207. code_puppy/agents/agent_orchestrator.json +0 -26
  208. code_puppy/agents/runtime_manager.py +0 -272
  209. code_puppy/command_line/mcp/add_command.py +0 -183
  210. code_puppy/command_line/meta_command_handler.py +0 -153
  211. code_puppy/message_history_processor.py +0 -490
  212. code_puppy/messaging/spinner/textual_spinner.py +0 -101
  213. code_puppy/state_management.py +0 -200
  214. code_puppy/tui/__init__.py +0 -10
  215. code_puppy/tui/app.py +0 -986
  216. code_puppy/tui/components/__init__.py +0 -21
  217. code_puppy/tui/components/chat_view.py +0 -550
  218. code_puppy/tui/components/command_history_modal.py +0 -218
  219. code_puppy/tui/components/copy_button.py +0 -139
  220. code_puppy/tui/components/custom_widgets.py +0 -63
  221. code_puppy/tui/components/human_input_modal.py +0 -175
  222. code_puppy/tui/components/input_area.py +0 -167
  223. code_puppy/tui/components/sidebar.py +0 -309
  224. code_puppy/tui/components/status_bar.py +0 -182
  225. code_puppy/tui/messages.py +0 -27
  226. code_puppy/tui/models/__init__.py +0 -8
  227. code_puppy/tui/models/chat_message.py +0 -25
  228. code_puppy/tui/models/command_history.py +0 -89
  229. code_puppy/tui/models/enums.py +0 -24
  230. code_puppy/tui/screens/__init__.py +0 -15
  231. code_puppy/tui/screens/help.py +0 -130
  232. code_puppy/tui/screens/mcp_install_wizard.py +0 -803
  233. code_puppy/tui/screens/settings.py +0 -290
  234. code_puppy/tui/screens/tools.py +0 -74
  235. code_puppy-0.0.169.data/data/code_puppy/models.json +0 -128
  236. code_puppy-0.0.169.dist-info/RECORD +0 -112
  237. /code_puppy/{mcp → mcp_}/circuit_breaker.py +0 -0
  238. /code_puppy/{mcp → mcp_}/error_isolation.py +0 -0
  239. /code_puppy/{mcp → mcp_}/health_monitor.py +0 -0
  240. /code_puppy/{mcp → mcp_}/retry_manager.py +0 -0
  241. /code_puppy/{mcp → mcp_}/status_tracker.py +0 -0
  242. /code_puppy/{mcp → mcp_}/system_tools.py +0 -0
  243. {code_puppy-0.0.169.dist-info → code_puppy-0.0.366.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,37 @@
1
+ """Browser tools for terminal automation.
2
+
3
+ This module provides browser-based terminal automation tools.
4
+ """
5
+
6
+ from code_puppy.config import get_banner_color
7
+
8
+ from .browser_manager import (
9
+ cleanup_all_browsers,
10
+ get_browser_session,
11
+ get_session_browser_manager,
12
+ set_browser_session,
13
+ )
14
+
15
+
16
+ def format_terminal_banner(text: str) -> str:
17
+ """Format a terminal tool banner with the configured terminal_tool color.
18
+
19
+ Returns Rich markup string that can be used with Text.from_markup().
20
+
21
+ Args:
22
+ text: The banner text (e.g., "TERMINAL OPEN 🖥️ localhost:8765")
23
+
24
+ Returns:
25
+ Rich markup formatted string
26
+ """
27
+ color = get_banner_color("terminal_tool")
28
+ return f"[bold white on {color}] {text} [/bold white on {color}]"
29
+
30
+
31
+ __all__ = [
32
+ "format_terminal_banner",
33
+ "cleanup_all_browsers",
34
+ "get_browser_session",
35
+ "get_session_browser_manager",
36
+ "set_browser_session",
37
+ ]
@@ -0,0 +1,289 @@
1
+ """Browser initialization and control tools."""
2
+
3
+ from typing import Any, Dict, Optional
4
+
5
+ from pydantic_ai import RunContext
6
+
7
+ from code_puppy.messaging import emit_error, emit_info, emit_success, emit_warning
8
+ from code_puppy.tools.common import generate_group_id
9
+
10
+ from .browser_manager import get_session_browser_manager
11
+
12
+
13
+ async def initialize_browser(
14
+ headless: bool = False,
15
+ browser_type: str = "chromium",
16
+ homepage: str = "https://www.google.com",
17
+ ) -> Dict[str, Any]:
18
+ """Initialize the browser with specified settings."""
19
+ group_id = generate_group_id("browser_initialize", f"{browser_type}_{homepage}")
20
+ emit_info(
21
+ f"BROWSER INITIALIZE 🌐 {browser_type} → {homepage}",
22
+ message_group=group_id,
23
+ )
24
+ try:
25
+ browser_manager = get_session_browser_manager()
26
+
27
+ # Configure browser settings
28
+ browser_manager.headless = headless
29
+ browser_manager.browser_type = browser_type
30
+ browser_manager.homepage = homepage
31
+
32
+ # Initialize browser
33
+ await browser_manager.async_initialize()
34
+
35
+ # Get page info
36
+ page = await browser_manager.get_current_page()
37
+ if page:
38
+ url = page.url
39
+ title = await page.title()
40
+ else:
41
+ url = "Unknown"
42
+ title = "Unknown"
43
+
44
+ # emit_info(
45
+ # "[green]Browser initialized successfully[/green]", message_group=group_id
46
+ # ) # Removed to reduce console spam
47
+
48
+ return {
49
+ "success": True,
50
+ "browser_type": browser_type,
51
+ "headless": headless,
52
+ "homepage": homepage,
53
+ "current_url": url,
54
+ "current_title": title,
55
+ }
56
+
57
+ except Exception as e:
58
+ emit_error(
59
+ f"Browser initialization failed: {str(e)}",
60
+ message_group=group_id,
61
+ )
62
+ return {
63
+ "success": False,
64
+ "error": str(e),
65
+ "browser_type": browser_type,
66
+ "headless": headless,
67
+ }
68
+
69
+
70
+ async def close_browser() -> Dict[str, Any]:
71
+ """Close the browser and clean up resources."""
72
+ group_id = generate_group_id("browser_close")
73
+ emit_info(
74
+ "BROWSER CLOSE 🔒",
75
+ message_group=group_id,
76
+ )
77
+ try:
78
+ browser_manager = get_session_browser_manager()
79
+ await browser_manager.close()
80
+
81
+ emit_warning("Browser closed successfully", message_group=group_id)
82
+
83
+ return {"success": True, "message": "Browser closed"}
84
+
85
+ except Exception as e:
86
+ return {"success": False, "error": str(e)}
87
+
88
+
89
+ async def get_browser_status() -> Dict[str, Any]:
90
+ """Get current browser status and information."""
91
+ group_id = generate_group_id("browser_status")
92
+ emit_info(
93
+ "BROWSER STATUS 📊",
94
+ message_group=group_id,
95
+ )
96
+ try:
97
+ browser_manager = get_session_browser_manager()
98
+
99
+ if not browser_manager._initialized:
100
+ return {
101
+ "success": True,
102
+ "status": "not_initialized",
103
+ "browser_type": browser_manager.browser_type,
104
+ "headless": browser_manager.headless,
105
+ }
106
+
107
+ page = await browser_manager.get_current_page()
108
+ if page:
109
+ url = page.url
110
+ title = await page.title()
111
+
112
+ # Get all pages
113
+ all_pages = await browser_manager.get_all_pages()
114
+ page_count = len(all_pages)
115
+ else:
116
+ url = None
117
+ title = None
118
+ page_count = 0
119
+
120
+ return {
121
+ "success": True,
122
+ "status": "initialized",
123
+ "browser_type": browser_manager.browser_type,
124
+ "headless": browser_manager.headless,
125
+ "current_url": url,
126
+ "current_title": title,
127
+ "page_count": page_count,
128
+ }
129
+
130
+ except Exception as e:
131
+ return {"success": False, "error": str(e)}
132
+
133
+
134
+ async def create_new_page(url: Optional[str] = None) -> Dict[str, Any]:
135
+ """Create a new browser page/tab."""
136
+ group_id = generate_group_id("browser_new_page", url or "blank")
137
+ emit_info(
138
+ f"BROWSER NEW PAGE 📄 {url or 'blank page'}",
139
+ message_group=group_id,
140
+ )
141
+ try:
142
+ browser_manager = get_session_browser_manager()
143
+
144
+ if not browser_manager._initialized:
145
+ return {
146
+ "success": False,
147
+ "error": "Browser not initialized. Use browser_initialize first.",
148
+ }
149
+
150
+ page = await browser_manager.new_page(url)
151
+
152
+ final_url = page.url
153
+ title = await page.title()
154
+
155
+ emit_success(f"Created new page: {final_url}", message_group=group_id)
156
+
157
+ return {"success": True, "url": final_url, "title": title, "requested_url": url}
158
+
159
+ except Exception as e:
160
+ return {"success": False, "error": str(e), "url": url}
161
+
162
+
163
+ async def list_pages() -> Dict[str, Any]:
164
+ """List all open browser pages/tabs."""
165
+ group_id = generate_group_id("browser_list_pages")
166
+ emit_info(
167
+ "BROWSER LIST PAGES 📋",
168
+ message_group=group_id,
169
+ )
170
+ try:
171
+ browser_manager = get_session_browser_manager()
172
+
173
+ if not browser_manager._initialized:
174
+ return {"success": False, "error": "Browser not initialized"}
175
+
176
+ all_pages = await browser_manager.get_all_pages()
177
+
178
+ pages_info = []
179
+ for i, page in enumerate(all_pages):
180
+ try:
181
+ url = page.url
182
+ title = await page.title()
183
+ is_closed = page.is_closed()
184
+
185
+ pages_info.append(
186
+ {"index": i, "url": url, "title": title, "closed": is_closed}
187
+ )
188
+ except Exception as e:
189
+ pages_info.append(
190
+ {
191
+ "index": i,
192
+ "url": "Error",
193
+ "title": "Error",
194
+ "error": str(e),
195
+ "closed": True,
196
+ }
197
+ )
198
+
199
+ return {"success": True, "page_count": len(all_pages), "pages": pages_info}
200
+
201
+ except Exception as e:
202
+ return {"success": False, "error": str(e)}
203
+
204
+
205
+ # Tool registration functions
206
+ def register_initialize_browser(agent):
207
+ """Register the browser initialization tool."""
208
+
209
+ @agent.tool
210
+ async def browser_initialize(
211
+ context: RunContext,
212
+ headless: bool = False,
213
+ browser_type: str = "chromium",
214
+ homepage: str = "https://www.google.com",
215
+ ) -> Dict[str, Any]:
216
+ """
217
+ Initialize the browser with specified settings. Must be called before using other browser tools.
218
+
219
+ Args:
220
+ headless: Run browser in headless mode (no GUI)
221
+ browser_type: Browser engine (chromium, firefox, webkit)
222
+ homepage: Initial page to load
223
+
224
+ Returns:
225
+ Dict with initialization results
226
+ """
227
+ return await initialize_browser(headless, browser_type, homepage)
228
+
229
+
230
+ def register_close_browser(agent):
231
+ """Register the browser close tool."""
232
+
233
+ @agent.tool
234
+ async def browser_close(context: RunContext) -> Dict[str, Any]:
235
+ """
236
+ Close the browser and clean up all resources.
237
+
238
+ Returns:
239
+ Dict with close results
240
+ """
241
+ return await close_browser()
242
+
243
+
244
+ def register_get_browser_status(agent):
245
+ """Register the browser status tool."""
246
+
247
+ @agent.tool
248
+ async def browser_status(context: RunContext) -> Dict[str, Any]:
249
+ """
250
+ Get current browser status and information.
251
+
252
+ Returns:
253
+ Dict with browser status and metadata
254
+ """
255
+ return await get_browser_status()
256
+
257
+
258
+ def register_create_new_page(agent):
259
+ """Register the new page creation tool."""
260
+
261
+ @agent.tool
262
+ async def browser_new_page(
263
+ context: RunContext,
264
+ url: Optional[str] = None,
265
+ ) -> Dict[str, Any]:
266
+ """
267
+ Create a new browser page/tab.
268
+
269
+ Args:
270
+ url: Optional URL to navigate to in the new page
271
+
272
+ Returns:
273
+ Dict with new page results
274
+ """
275
+ return await create_new_page(url)
276
+
277
+
278
+ def register_list_pages(agent):
279
+ """Register the list pages tool."""
280
+
281
+ @agent.tool
282
+ async def browser_list_pages(context: RunContext) -> Dict[str, Any]:
283
+ """
284
+ List all open browser pages/tabs.
285
+
286
+ Returns:
287
+ Dict with information about all open pages
288
+ """
289
+ return await list_pages()