calvyn-code 0.14.0

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 (1718) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +217 -0
  3. package/README.zh-CN.md +180 -0
  4. package/acp_adapter/__init__.py +1 -0
  5. package/acp_adapter/__main__.py +5 -0
  6. package/acp_adapter/auth.py +68 -0
  7. package/acp_adapter/bootstrap/__init__.py +0 -0
  8. package/acp_adapter/bootstrap/bootstrap_browser_tools.ps1 +288 -0
  9. package/acp_adapter/bootstrap/bootstrap_browser_tools.sh +399 -0
  10. package/acp_adapter/entry.py +292 -0
  11. package/acp_adapter/events.py +265 -0
  12. package/acp_adapter/permissions.py +148 -0
  13. package/acp_adapter/server.py +1713 -0
  14. package/acp_adapter/session.py +629 -0
  15. package/acp_adapter/tools.py +1180 -0
  16. package/agent/__init__.py +6 -0
  17. package/agent/__pycache__/__init__.cpython-312.pyc +0 -0
  18. package/agent/__pycache__/account_usage.cpython-312.pyc +0 -0
  19. package/agent/__pycache__/anthropic_adapter.cpython-312.pyc +0 -0
  20. package/agent/__pycache__/async_utils.cpython-312.pyc +0 -0
  21. package/agent/__pycache__/auxiliary_client.cpython-312.pyc +0 -0
  22. package/agent/__pycache__/codex_responses_adapter.cpython-312.pyc +0 -0
  23. package/agent/__pycache__/context_compressor.cpython-312.pyc +0 -0
  24. package/agent/__pycache__/context_engine.cpython-312.pyc +0 -0
  25. package/agent/__pycache__/context_references.cpython-312.pyc +0 -0
  26. package/agent/__pycache__/credential_pool.cpython-312.pyc +0 -0
  27. package/agent/__pycache__/curator.cpython-312.pyc +0 -0
  28. package/agent/__pycache__/display.cpython-312.pyc +0 -0
  29. package/agent/__pycache__/error_classifier.cpython-312.pyc +0 -0
  30. package/agent/__pycache__/file_safety.cpython-312.pyc +0 -0
  31. package/agent/__pycache__/google_code_assist.cpython-312.pyc +0 -0
  32. package/agent/__pycache__/google_oauth.cpython-312.pyc +0 -0
  33. package/agent/__pycache__/i18n.cpython-312.pyc +0 -0
  34. package/agent/__pycache__/image_gen_provider.cpython-312.pyc +0 -0
  35. package/agent/__pycache__/image_gen_registry.cpython-312.pyc +0 -0
  36. package/agent/__pycache__/insights.cpython-312.pyc +0 -0
  37. package/agent/__pycache__/lmstudio_reasoning.cpython-312.pyc +0 -0
  38. package/agent/__pycache__/manual_compression_feedback.cpython-312.pyc +0 -0
  39. package/agent/__pycache__/markdown_tables.cpython-312.pyc +0 -0
  40. package/agent/__pycache__/memory_manager.cpython-312.pyc +0 -0
  41. package/agent/__pycache__/memory_provider.cpython-312.pyc +0 -0
  42. package/agent/__pycache__/model_metadata.cpython-312.pyc +0 -0
  43. package/agent/__pycache__/models_dev.cpython-312.pyc +0 -0
  44. package/agent/__pycache__/moonshot_schema.cpython-312.pyc +0 -0
  45. package/agent/__pycache__/onboarding.cpython-312.pyc +0 -0
  46. package/agent/__pycache__/portal_tags.cpython-312.pyc +0 -0
  47. package/agent/__pycache__/prompt_builder.cpython-312.pyc +0 -0
  48. package/agent/__pycache__/prompt_caching.cpython-312.pyc +0 -0
  49. package/agent/__pycache__/redact.cpython-312.pyc +0 -0
  50. package/agent/__pycache__/retry_utils.cpython-312.pyc +0 -0
  51. package/agent/__pycache__/shell_hooks.cpython-312.pyc +0 -0
  52. package/agent/__pycache__/skill_commands.cpython-312.pyc +0 -0
  53. package/agent/__pycache__/skill_preprocessing.cpython-312.pyc +0 -0
  54. package/agent/__pycache__/skill_utils.cpython-312.pyc +0 -0
  55. package/agent/__pycache__/subdirectory_hints.cpython-312.pyc +0 -0
  56. package/agent/__pycache__/think_scrubber.cpython-312.pyc +0 -0
  57. package/agent/__pycache__/title_generator.cpython-312.pyc +0 -0
  58. package/agent/__pycache__/tool_guardrails.cpython-312.pyc +0 -0
  59. package/agent/__pycache__/tool_result_classification.cpython-312.pyc +0 -0
  60. package/agent/__pycache__/trajectory.cpython-312.pyc +0 -0
  61. package/agent/__pycache__/usage_pricing.cpython-312.pyc +0 -0
  62. package/agent/__pycache__/video_gen_provider.cpython-312.pyc +0 -0
  63. package/agent/__pycache__/video_gen_registry.cpython-312.pyc +0 -0
  64. package/agent/__pycache__/web_search_provider.cpython-312.pyc +0 -0
  65. package/agent/__pycache__/web_search_registry.cpython-312.pyc +0 -0
  66. package/agent/account_usage.py +326 -0
  67. package/agent/anthropic_adapter.py +2087 -0
  68. package/agent/async_utils.py +68 -0
  69. package/agent/auxiliary_client.py +4893 -0
  70. package/agent/bedrock_adapter.py +1276 -0
  71. package/agent/codex_responses_adapter.py +1084 -0
  72. package/agent/context_compressor.py +1583 -0
  73. package/agent/context_engine.py +211 -0
  74. package/agent/context_references.py +519 -0
  75. package/agent/copilot_acp_client.py +684 -0
  76. package/agent/credential_pool.py +1780 -0
  77. package/agent/credential_sources.py +449 -0
  78. package/agent/curator.py +1782 -0
  79. package/agent/curator_backup.py +694 -0
  80. package/agent/display.py +987 -0
  81. package/agent/error_classifier.py +1058 -0
  82. package/agent/file_safety.py +112 -0
  83. package/agent/gemini_cloudcode_adapter.py +909 -0
  84. package/agent/gemini_native_adapter.py +971 -0
  85. package/agent/gemini_schema.py +99 -0
  86. package/agent/google_code_assist.py +452 -0
  87. package/agent/google_oauth.py +1062 -0
  88. package/agent/i18n.py +258 -0
  89. package/agent/image_gen_provider.py +243 -0
  90. package/agent/image_gen_registry.py +145 -0
  91. package/agent/image_routing.py +301 -0
  92. package/agent/insights.py +931 -0
  93. package/agent/lmstudio_reasoning.py +48 -0
  94. package/agent/lsp/__init__.py +106 -0
  95. package/agent/lsp/__pycache__/__init__.cpython-312.pyc +0 -0
  96. package/agent/lsp/__pycache__/cli.cpython-312.pyc +0 -0
  97. package/agent/lsp/__pycache__/client.cpython-312.pyc +0 -0
  98. package/agent/lsp/__pycache__/eventlog.cpython-312.pyc +0 -0
  99. package/agent/lsp/__pycache__/manager.cpython-312.pyc +0 -0
  100. package/agent/lsp/__pycache__/protocol.cpython-312.pyc +0 -0
  101. package/agent/lsp/__pycache__/servers.cpython-312.pyc +0 -0
  102. package/agent/lsp/__pycache__/workspace.cpython-312.pyc +0 -0
  103. package/agent/lsp/cli.py +308 -0
  104. package/agent/lsp/client.py +930 -0
  105. package/agent/lsp/eventlog.py +213 -0
  106. package/agent/lsp/install.py +376 -0
  107. package/agent/lsp/manager.py +644 -0
  108. package/agent/lsp/protocol.py +196 -0
  109. package/agent/lsp/range_shift.py +149 -0
  110. package/agent/lsp/reporter.py +78 -0
  111. package/agent/lsp/servers.py +1040 -0
  112. package/agent/lsp/workspace.py +223 -0
  113. package/agent/manual_compression_feedback.py +49 -0
  114. package/agent/markdown_tables.py +309 -0
  115. package/agent/memory_manager.py +556 -0
  116. package/agent/memory_provider.py +279 -0
  117. package/agent/model_metadata.py +1827 -0
  118. package/agent/models_dev.py +724 -0
  119. package/agent/moonshot_schema.py +231 -0
  120. package/agent/nous_rate_guard.py +326 -0
  121. package/agent/onboarding.py +193 -0
  122. package/agent/plugin_llm.py +1046 -0
  123. package/agent/portal_tags.py +64 -0
  124. package/agent/prompt_builder.py +1457 -0
  125. package/agent/prompt_caching.py +79 -0
  126. package/agent/rate_limit_tracker.py +246 -0
  127. package/agent/redact.py +403 -0
  128. package/agent/retry_utils.py +57 -0
  129. package/agent/shell_hooks.py +837 -0
  130. package/agent/skill_commands.py +502 -0
  131. package/agent/skill_preprocessing.py +131 -0
  132. package/agent/skill_utils.py +512 -0
  133. package/agent/subdirectory_hints.py +224 -0
  134. package/agent/think_scrubber.py +386 -0
  135. package/agent/title_generator.py +171 -0
  136. package/agent/tool_guardrails.py +458 -0
  137. package/agent/tool_result_classification.py +26 -0
  138. package/agent/trajectory.py +56 -0
  139. package/agent/transports/__init__.py +68 -0
  140. package/agent/transports/__pycache__/__init__.cpython-312.pyc +0 -0
  141. package/agent/transports/__pycache__/anthropic.cpython-312.pyc +0 -0
  142. package/agent/transports/__pycache__/base.cpython-312.pyc +0 -0
  143. package/agent/transports/__pycache__/bedrock.cpython-312.pyc +0 -0
  144. package/agent/transports/__pycache__/chat_completions.cpython-312.pyc +0 -0
  145. package/agent/transports/__pycache__/codex.cpython-312.pyc +0 -0
  146. package/agent/transports/__pycache__/types.cpython-312.pyc +0 -0
  147. package/agent/transports/anthropic.py +179 -0
  148. package/agent/transports/base.py +89 -0
  149. package/agent/transports/bedrock.py +154 -0
  150. package/agent/transports/chat_completions.py +614 -0
  151. package/agent/transports/codex.py +283 -0
  152. package/agent/transports/codex_app_server.py +368 -0
  153. package/agent/transports/codex_app_server_session.py +810 -0
  154. package/agent/transports/codex_event_projector.py +312 -0
  155. package/agent/transports/hermes_tools_mcp_server.py +233 -0
  156. package/agent/transports/types.py +162 -0
  157. package/agent/usage_pricing.py +877 -0
  158. package/agent/video_gen_provider.py +300 -0
  159. package/agent/video_gen_registry.py +117 -0
  160. package/agent/web_search_provider.py +221 -0
  161. package/agent/web_search_registry.py +262 -0
  162. package/assets/banner.png +0 -0
  163. package/batch_runner.py +1303 -0
  164. package/bin/calvyn.js +67 -0
  165. package/calvyn_bootstrap.py +130 -0
  166. package/calvyn_constants.py +346 -0
  167. package/calvyn_logging.py +390 -0
  168. package/calvyn_state.py +2967 -0
  169. package/calvyn_time.py +105 -0
  170. package/cli.py +14160 -0
  171. package/cron/__init__.py +42 -0
  172. package/cron/__pycache__/__init__.cpython-312.pyc +0 -0
  173. package/cron/__pycache__/jobs.cpython-312.pyc +0 -0
  174. package/cron/__pycache__/scheduler.cpython-312.pyc +0 -0
  175. package/cron/jobs.py +1160 -0
  176. package/cron/scheduler.py +1832 -0
  177. package/gateway/__init__.py +35 -0
  178. package/gateway/__pycache__/__init__.cpython-312.pyc +0 -0
  179. package/gateway/__pycache__/channel_directory.cpython-312.pyc +0 -0
  180. package/gateway/__pycache__/config.cpython-312.pyc +0 -0
  181. package/gateway/__pycache__/delivery.cpython-312.pyc +0 -0
  182. package/gateway/__pycache__/display_config.cpython-312.pyc +0 -0
  183. package/gateway/__pycache__/hooks.cpython-312.pyc +0 -0
  184. package/gateway/__pycache__/pairing.cpython-312.pyc +0 -0
  185. package/gateway/__pycache__/platform_registry.cpython-312.pyc +0 -0
  186. package/gateway/__pycache__/restart.cpython-312.pyc +0 -0
  187. package/gateway/__pycache__/run.cpython-312.pyc +0 -0
  188. package/gateway/__pycache__/runtime_footer.cpython-312.pyc +0 -0
  189. package/gateway/__pycache__/session.cpython-312.pyc +0 -0
  190. package/gateway/__pycache__/session_context.cpython-312.pyc +0 -0
  191. package/gateway/__pycache__/shutdown_forensics.cpython-312.pyc +0 -0
  192. package/gateway/__pycache__/slash_access.cpython-312.pyc +0 -0
  193. package/gateway/__pycache__/status.cpython-312.pyc +0 -0
  194. package/gateway/__pycache__/stream_consumer.cpython-312.pyc +0 -0
  195. package/gateway/__pycache__/whatsapp_identity.cpython-312.pyc +0 -0
  196. package/gateway/assets/telegram-botfather-threads-settings.jpg +0 -0
  197. package/gateway/builtin_hooks/__init__.py +1 -0
  198. package/gateway/channel_directory.py +357 -0
  199. package/gateway/config.py +1873 -0
  200. package/gateway/delivery.py +258 -0
  201. package/gateway/display_config.py +206 -0
  202. package/gateway/hooks.py +210 -0
  203. package/gateway/mirror.py +179 -0
  204. package/gateway/pairing.py +322 -0
  205. package/gateway/platform_registry.py +260 -0
  206. package/gateway/platforms/ADDING_A_PLATFORM.md +374 -0
  207. package/gateway/platforms/__init__.py +45 -0
  208. package/gateway/platforms/__pycache__/__init__.cpython-312.pyc +0 -0
  209. package/gateway/platforms/__pycache__/base.cpython-312.pyc +0 -0
  210. package/gateway/platforms/__pycache__/helpers.cpython-312.pyc +0 -0
  211. package/gateway/platforms/__pycache__/telegram.cpython-312.pyc +0 -0
  212. package/gateway/platforms/__pycache__/telegram_network.cpython-312.pyc +0 -0
  213. package/gateway/platforms/__pycache__/yuanbao.cpython-312.pyc +0 -0
  214. package/gateway/platforms/__pycache__/yuanbao_media.cpython-312.pyc +0 -0
  215. package/gateway/platforms/__pycache__/yuanbao_proto.cpython-312.pyc +0 -0
  216. package/gateway/platforms/_http_client_limits.py +84 -0
  217. package/gateway/platforms/api_server.py +3488 -0
  218. package/gateway/platforms/base.py +3747 -0
  219. package/gateway/platforms/bluebubbles.py +937 -0
  220. package/gateway/platforms/dingtalk.py +1473 -0
  221. package/gateway/platforms/discord.py +5584 -0
  222. package/gateway/platforms/email.py +773 -0
  223. package/gateway/platforms/feishu.py +5059 -0
  224. package/gateway/platforms/feishu_comment.py +1382 -0
  225. package/gateway/platforms/feishu_comment_rules.py +430 -0
  226. package/gateway/platforms/helpers.py +279 -0
  227. package/gateway/platforms/homeassistant.py +449 -0
  228. package/gateway/platforms/matrix.py +2777 -0
  229. package/gateway/platforms/mattermost.py +852 -0
  230. package/gateway/platforms/msgraph_webhook.py +397 -0
  231. package/gateway/platforms/qqbot/__init__.py +91 -0
  232. package/gateway/platforms/qqbot/adapter.py +3072 -0
  233. package/gateway/platforms/qqbot/chunked_upload.py +602 -0
  234. package/gateway/platforms/qqbot/constants.py +74 -0
  235. package/gateway/platforms/qqbot/crypto.py +45 -0
  236. package/gateway/platforms/qqbot/keyboards.py +473 -0
  237. package/gateway/platforms/qqbot/onboard.py +220 -0
  238. package/gateway/platforms/qqbot/utils.py +71 -0
  239. package/gateway/platforms/signal.py +1518 -0
  240. package/gateway/platforms/signal_rate_limit.py +369 -0
  241. package/gateway/platforms/slack.py +3028 -0
  242. package/gateway/platforms/sms.py +377 -0
  243. package/gateway/platforms/telegram.py +4836 -0
  244. package/gateway/platforms/telegram_network.py +249 -0
  245. package/gateway/platforms/webhook.py +806 -0
  246. package/gateway/platforms/wecom.py +1610 -0
  247. package/gateway/platforms/wecom_callback.py +403 -0
  248. package/gateway/platforms/wecom_crypto.py +142 -0
  249. package/gateway/platforms/weixin.py +2170 -0
  250. package/gateway/platforms/whatsapp.py +1283 -0
  251. package/gateway/platforms/yuanbao.py +4873 -0
  252. package/gateway/platforms/yuanbao_media.py +645 -0
  253. package/gateway/platforms/yuanbao_proto.py +1209 -0
  254. package/gateway/platforms/yuanbao_sticker.py +558 -0
  255. package/gateway/restart.py +20 -0
  256. package/gateway/run.py +17074 -0
  257. package/gateway/runtime_footer.py +150 -0
  258. package/gateway/session.py +1399 -0
  259. package/gateway/session_context.py +156 -0
  260. package/gateway/shutdown_forensics.py +462 -0
  261. package/gateway/slash_access.py +229 -0
  262. package/gateway/status.py +972 -0
  263. package/gateway/sticker_cache.py +111 -0
  264. package/gateway/stream_consumer.py +1286 -0
  265. package/gateway/whatsapp_identity.py +156 -0
  266. package/hermes_cli/__init__.py +47 -0
  267. package/hermes_cli/__pycache__/__init__.cpython-312.pyc +0 -0
  268. package/hermes_cli/__pycache__/_parser.cpython-312.pyc +0 -0
  269. package/hermes_cli/__pycache__/auth.cpython-312.pyc +0 -0
  270. package/hermes_cli/__pycache__/banner.cpython-312.pyc +0 -0
  271. package/hermes_cli/__pycache__/browser_connect.cpython-312.pyc +0 -0
  272. package/hermes_cli/__pycache__/callbacks.cpython-312.pyc +0 -0
  273. package/hermes_cli/__pycache__/checkpoints.cpython-312.pyc +0 -0
  274. package/hermes_cli/__pycache__/cli_output.cpython-312.pyc +0 -0
  275. package/hermes_cli/__pycache__/codex_models.cpython-312.pyc +0 -0
  276. package/hermes_cli/__pycache__/codex_runtime_switch.cpython-312.pyc +0 -0
  277. package/hermes_cli/__pycache__/colors.cpython-312.pyc +0 -0
  278. package/hermes_cli/__pycache__/commands.cpython-312.pyc +0 -0
  279. package/hermes_cli/__pycache__/config.cpython-312.pyc +0 -0
  280. package/hermes_cli/__pycache__/copilot_auth.cpython-312.pyc +0 -0
  281. package/hermes_cli/__pycache__/curator.cpython-312.pyc +0 -0
  282. package/hermes_cli/__pycache__/curses_ui.cpython-312.pyc +0 -0
  283. package/hermes_cli/__pycache__/debug.cpython-312.pyc +0 -0
  284. package/hermes_cli/__pycache__/default_soul.cpython-312.pyc +0 -0
  285. package/hermes_cli/__pycache__/env_loader.cpython-312.pyc +0 -0
  286. package/hermes_cli/__pycache__/fallback_cmd.cpython-312.pyc +0 -0
  287. package/hermes_cli/__pycache__/gateway.cpython-312.pyc +0 -0
  288. package/hermes_cli/__pycache__/gateway_windows.cpython-312.pyc +0 -0
  289. package/hermes_cli/__pycache__/goals.cpython-312.pyc +0 -0
  290. package/hermes_cli/__pycache__/inventory.cpython-312.pyc +0 -0
  291. package/hermes_cli/__pycache__/kanban.cpython-312.pyc +0 -0
  292. package/hermes_cli/__pycache__/kanban_db.cpython-312.pyc +0 -0
  293. package/hermes_cli/__pycache__/main.cpython-312.pyc +0 -0
  294. package/hermes_cli/__pycache__/model_catalog.cpython-312.pyc +0 -0
  295. package/hermes_cli/__pycache__/model_normalize.cpython-312.pyc +0 -0
  296. package/hermes_cli/__pycache__/model_switch.cpython-312.pyc +0 -0
  297. package/hermes_cli/__pycache__/models.cpython-312.pyc +0 -0
  298. package/hermes_cli/__pycache__/nous_subscription.cpython-312.pyc +0 -0
  299. package/hermes_cli/__pycache__/pairing.cpython-312.pyc +0 -0
  300. package/hermes_cli/__pycache__/platforms.cpython-312.pyc +0 -0
  301. package/hermes_cli/__pycache__/plugins.cpython-312.pyc +0 -0
  302. package/hermes_cli/__pycache__/profiles.cpython-312.pyc +0 -0
  303. package/hermes_cli/__pycache__/providers.cpython-312.pyc +0 -0
  304. package/hermes_cli/__pycache__/pt_input_extras.cpython-312.pyc +0 -0
  305. package/hermes_cli/__pycache__/runtime_provider.cpython-312.pyc +0 -0
  306. package/hermes_cli/__pycache__/security_advisories.cpython-312.pyc +0 -0
  307. package/hermes_cli/__pycache__/setup.cpython-312.pyc +0 -0
  308. package/hermes_cli/__pycache__/skills_hub.cpython-312.pyc +0 -0
  309. package/hermes_cli/__pycache__/skin_engine.cpython-312.pyc +0 -0
  310. package/hermes_cli/__pycache__/stdio.cpython-312.pyc +0 -0
  311. package/hermes_cli/__pycache__/timeouts.cpython-312.pyc +0 -0
  312. package/hermes_cli/__pycache__/tips.cpython-312.pyc +0 -0
  313. package/hermes_cli/__pycache__/tools_config.cpython-312.pyc +0 -0
  314. package/hermes_cli/__pycache__/voice.cpython-312.pyc +0 -0
  315. package/hermes_cli/_parser.py +365 -0
  316. package/hermes_cli/_subprocess_compat.py +175 -0
  317. package/hermes_cli/auth.py +6299 -0
  318. package/hermes_cli/auth_commands.py +749 -0
  319. package/hermes_cli/azure_detect.py +300 -0
  320. package/hermes_cli/backup.py +938 -0
  321. package/hermes_cli/banner.py +703 -0
  322. package/hermes_cli/browser_connect.py +139 -0
  323. package/hermes_cli/callbacks.py +243 -0
  324. package/hermes_cli/checkpoints.py +244 -0
  325. package/hermes_cli/claw.py +810 -0
  326. package/hermes_cli/cli_output.py +78 -0
  327. package/hermes_cli/clipboard.py +495 -0
  328. package/hermes_cli/codex_models.py +198 -0
  329. package/hermes_cli/codex_runtime_plugin_migration.py +757 -0
  330. package/hermes_cli/codex_runtime_switch.py +266 -0
  331. package/hermes_cli/colors.py +38 -0
  332. package/hermes_cli/commands.py +1728 -0
  333. package/hermes_cli/completion.py +315 -0
  334. package/hermes_cli/config.py +5382 -0
  335. package/hermes_cli/copilot_auth.py +392 -0
  336. package/hermes_cli/cron.py +313 -0
  337. package/hermes_cli/curator.py +598 -0
  338. package/hermes_cli/curses_ui.py +472 -0
  339. package/hermes_cli/debug.py +747 -0
  340. package/hermes_cli/default_soul.py +11 -0
  341. package/hermes_cli/dep_ensure.py +107 -0
  342. package/hermes_cli/dingtalk_auth.py +293 -0
  343. package/hermes_cli/doctor.py +1863 -0
  344. package/hermes_cli/dump.py +326 -0
  345. package/hermes_cli/env_loader.py +175 -0
  346. package/hermes_cli/fallback_cmd.py +361 -0
  347. package/hermes_cli/gateway.py +5422 -0
  348. package/hermes_cli/gateway_windows.py +692 -0
  349. package/hermes_cli/goals.py +757 -0
  350. package/hermes_cli/hooks.py +385 -0
  351. package/hermes_cli/inventory.py +240 -0
  352. package/hermes_cli/kanban.py +2252 -0
  353. package/hermes_cli/kanban_db.py +4840 -0
  354. package/hermes_cli/kanban_diagnostics.py +776 -0
  355. package/hermes_cli/kanban_specify.py +266 -0
  356. package/hermes_cli/logs.py +391 -0
  357. package/hermes_cli/main.py +12396 -0
  358. package/hermes_cli/mcp_config.py +781 -0
  359. package/hermes_cli/memory_setup.py +465 -0
  360. package/hermes_cli/model_catalog.py +330 -0
  361. package/hermes_cli/model_normalize.py +473 -0
  362. package/hermes_cli/model_switch.py +1777 -0
  363. package/hermes_cli/models.py +3789 -0
  364. package/hermes_cli/nous_subscription.py +799 -0
  365. package/hermes_cli/oneshot.py +351 -0
  366. package/hermes_cli/pairing.py +115 -0
  367. package/hermes_cli/platforms.py +83 -0
  368. package/hermes_cli/plugins.py +1562 -0
  369. package/hermes_cli/plugins_cmd.py +1587 -0
  370. package/hermes_cli/profile_distribution.py +703 -0
  371. package/hermes_cli/profiles.py +1319 -0
  372. package/hermes_cli/providers.py +720 -0
  373. package/hermes_cli/proxy/__init__.py +20 -0
  374. package/hermes_cli/proxy/adapters/__init__.py +35 -0
  375. package/hermes_cli/proxy/adapters/base.py +94 -0
  376. package/hermes_cli/proxy/adapters/nous_portal.py +137 -0
  377. package/hermes_cli/proxy/cli.py +141 -0
  378. package/hermes_cli/proxy/server.py +265 -0
  379. package/hermes_cli/pt_input_extras.py +83 -0
  380. package/hermes_cli/pty_bridge.py +237 -0
  381. package/hermes_cli/relaunch.py +205 -0
  382. package/hermes_cli/runtime_provider.py +1428 -0
  383. package/hermes_cli/security_advisories.py +452 -0
  384. package/hermes_cli/setup.py +3559 -0
  385. package/hermes_cli/skills_config.py +177 -0
  386. package/hermes_cli/skills_hub.py +1595 -0
  387. package/hermes_cli/skin_engine.py +929 -0
  388. package/hermes_cli/slack_cli.py +160 -0
  389. package/hermes_cli/status.py +550 -0
  390. package/hermes_cli/stdio.py +252 -0
  391. package/hermes_cli/timeouts.py +82 -0
  392. package/hermes_cli/tips.py +487 -0
  393. package/hermes_cli/tools_config.py +3151 -0
  394. package/hermes_cli/uninstall.py +681 -0
  395. package/hermes_cli/vercel_auth.py +70 -0
  396. package/hermes_cli/voice.py +846 -0
  397. package/hermes_cli/web_server.py +4438 -0
  398. package/hermes_cli/webhook.py +275 -0
  399. package/locales/af.yaml +350 -0
  400. package/locales/de.yaml +350 -0
  401. package/locales/en.yaml +365 -0
  402. package/locales/es.yaml +350 -0
  403. package/locales/fr.yaml +350 -0
  404. package/locales/ga.yaml +354 -0
  405. package/locales/hu.yaml +350 -0
  406. package/locales/it.yaml +350 -0
  407. package/locales/ja.yaml +350 -0
  408. package/locales/ko.yaml +350 -0
  409. package/locales/pt.yaml +350 -0
  410. package/locales/ru.yaml +350 -0
  411. package/locales/tr.yaml +350 -0
  412. package/locales/uk.yaml +350 -0
  413. package/locales/zh-hant.yaml +350 -0
  414. package/locales/zh.yaml +350 -0
  415. package/mcp_serve.py +898 -0
  416. package/model_tools.py +899 -0
  417. package/optional-skills/DESCRIPTION.md +24 -0
  418. package/optional-skills/autonomous-ai-agents/DESCRIPTION.md +2 -0
  419. package/optional-skills/autonomous-ai-agents/blackbox/SKILL.md +144 -0
  420. package/optional-skills/autonomous-ai-agents/honcho/SKILL.md +431 -0
  421. package/optional-skills/blockchain/evm/SKILL.md +211 -0
  422. package/optional-skills/blockchain/evm/scripts/evm_client.py +1508 -0
  423. package/optional-skills/blockchain/hyperliquid/SKILL.md +211 -0
  424. package/optional-skills/blockchain/hyperliquid/scripts/hyperliquid_client.py +1660 -0
  425. package/optional-skills/blockchain/solana/SKILL.md +208 -0
  426. package/optional-skills/blockchain/solana/scripts/solana_client.py +698 -0
  427. package/optional-skills/communication/DESCRIPTION.md +1 -0
  428. package/optional-skills/communication/one-three-one-rule/SKILL.md +104 -0
  429. package/optional-skills/creative/blender-mcp/SKILL.md +117 -0
  430. package/optional-skills/creative/concept-diagrams/SKILL.md +362 -0
  431. package/optional-skills/creative/concept-diagrams/examples/apartment-floor-plan-conversion.md +244 -0
  432. package/optional-skills/creative/concept-diagrams/examples/automated-password-reset-flow.md +276 -0
  433. package/optional-skills/creative/concept-diagrams/examples/autonomous-llm-research-agent-flow.md +240 -0
  434. package/optional-skills/creative/concept-diagrams/examples/banana-journey-tree-to-smoothie.md +161 -0
  435. package/optional-skills/creative/concept-diagrams/examples/commercial-aircraft-structure.md +209 -0
  436. package/optional-skills/creative/concept-diagrams/examples/cpu-ooo-microarchitecture.md +236 -0
  437. package/optional-skills/creative/concept-diagrams/examples/electricity-grid-flow.md +182 -0
  438. package/optional-skills/creative/concept-diagrams/examples/feature-film-production-pipeline.md +172 -0
  439. package/optional-skills/creative/concept-diagrams/examples/hospital-emergency-department-flow.md +165 -0
  440. package/optional-skills/creative/concept-diagrams/examples/ml-benchmark-grouped-bar-chart.md +114 -0
  441. package/optional-skills/creative/concept-diagrams/examples/place-order-uml-sequence.md +325 -0
  442. package/optional-skills/creative/concept-diagrams/examples/smart-city-infrastructure.md +173 -0
  443. package/optional-skills/creative/concept-diagrams/examples/smartphone-layer-anatomy.md +154 -0
  444. package/optional-skills/creative/concept-diagrams/examples/sn2-reaction-mechanism.md +247 -0
  445. package/optional-skills/creative/concept-diagrams/examples/wind-turbine-structure.md +338 -0
  446. package/optional-skills/creative/concept-diagrams/references/dashboard-patterns.md +43 -0
  447. package/optional-skills/creative/concept-diagrams/references/infrastructure-patterns.md +144 -0
  448. package/optional-skills/creative/concept-diagrams/references/physical-shape-cookbook.md +42 -0
  449. package/optional-skills/creative/concept-diagrams/templates/template.html +174 -0
  450. package/optional-skills/creative/hyperframes/SKILL.md +191 -0
  451. package/optional-skills/creative/hyperframes/references/cli.md +185 -0
  452. package/optional-skills/creative/hyperframes/references/composition.md +129 -0
  453. package/optional-skills/creative/hyperframes/references/features.md +289 -0
  454. package/optional-skills/creative/hyperframes/references/gsap.md +136 -0
  455. package/optional-skills/creative/hyperframes/references/troubleshooting.md +137 -0
  456. package/optional-skills/creative/hyperframes/references/website-to-video.md +145 -0
  457. package/optional-skills/creative/hyperframes/scripts/setup.sh +135 -0
  458. package/optional-skills/creative/kanban-video-orchestrator/SKILL.md +207 -0
  459. package/optional-skills/creative/kanban-video-orchestrator/assets/brief.md.tmpl +79 -0
  460. package/optional-skills/creative/kanban-video-orchestrator/assets/setup.sh.tmpl +185 -0
  461. package/optional-skills/creative/kanban-video-orchestrator/assets/soul.md.tmpl +38 -0
  462. package/optional-skills/creative/kanban-video-orchestrator/references/examples.md +227 -0
  463. package/optional-skills/creative/kanban-video-orchestrator/references/intake.md +166 -0
  464. package/optional-skills/creative/kanban-video-orchestrator/references/kanban-setup.md +276 -0
  465. package/optional-skills/creative/kanban-video-orchestrator/references/monitoring.md +180 -0
  466. package/optional-skills/creative/kanban-video-orchestrator/references/role-archetypes.md +298 -0
  467. package/optional-skills/creative/kanban-video-orchestrator/references/tool-matrix.md +317 -0
  468. package/optional-skills/creative/kanban-video-orchestrator/scripts/bootstrap_pipeline.py +501 -0
  469. package/optional-skills/creative/kanban-video-orchestrator/scripts/monitor.py +195 -0
  470. package/optional-skills/creative/meme-generation/EXAMPLES.md +46 -0
  471. package/optional-skills/creative/meme-generation/SKILL.md +130 -0
  472. package/optional-skills/creative/meme-generation/scripts/generate_meme.py +471 -0
  473. package/optional-skills/creative/meme-generation/scripts/templates.json +97 -0
  474. package/optional-skills/devops/cli/SKILL.md +156 -0
  475. package/optional-skills/devops/cli/references/app-discovery.md +112 -0
  476. package/optional-skills/devops/cli/references/authentication.md +59 -0
  477. package/optional-skills/devops/cli/references/cli-reference.md +104 -0
  478. package/optional-skills/devops/cli/references/running-apps.md +171 -0
  479. package/optional-skills/devops/docker-management/SKILL.md +281 -0
  480. package/optional-skills/devops/pinggy-tunnel/SKILL.md +309 -0
  481. package/optional-skills/devops/watchers/SKILL.md +112 -0
  482. package/optional-skills/devops/watchers/scripts/_watermark.py +148 -0
  483. package/optional-skills/devops/watchers/scripts/watch_github.py +168 -0
  484. package/optional-skills/devops/watchers/scripts/watch_http_json.py +131 -0
  485. package/optional-skills/devops/watchers/scripts/watch_rss.py +121 -0
  486. package/optional-skills/dogfood/DESCRIPTION.md +3 -0
  487. package/optional-skills/dogfood/adversarial-ux-test/SKILL.md +191 -0
  488. package/optional-skills/email/agentmail/SKILL.md +126 -0
  489. package/optional-skills/finance/3-statement-model/SKILL.md +433 -0
  490. package/optional-skills/finance/3-statement-model/references/formatting.md +118 -0
  491. package/optional-skills/finance/3-statement-model/references/formulas.md +292 -0
  492. package/optional-skills/finance/3-statement-model/references/sec-filings.md +125 -0
  493. package/optional-skills/finance/comps-analysis/SKILL.md +662 -0
  494. package/optional-skills/finance/dcf-model/SKILL.md +1270 -0
  495. package/optional-skills/finance/dcf-model/TROUBLESHOOTING.md +40 -0
  496. package/optional-skills/finance/dcf-model/requirements.txt +7 -0
  497. package/optional-skills/finance/dcf-model/scripts/validate_dcf.py +292 -0
  498. package/optional-skills/finance/excel-author/SKILL.md +244 -0
  499. package/optional-skills/finance/excel-author/scripts/recalc.py +88 -0
  500. package/optional-skills/finance/lbo-model/SKILL.md +291 -0
  501. package/optional-skills/finance/merger-model/SKILL.md +144 -0
  502. package/optional-skills/finance/pptx-author/SKILL.md +173 -0
  503. package/optional-skills/finance/stocks/SKILL.md +95 -0
  504. package/optional-skills/finance/stocks/scripts/stocks_client.py +755 -0
  505. package/optional-skills/health/DESCRIPTION.md +1 -0
  506. package/optional-skills/health/fitness-nutrition/SKILL.md +256 -0
  507. package/optional-skills/health/fitness-nutrition/references/FORMULAS.md +100 -0
  508. package/optional-skills/health/fitness-nutrition/scripts/body_calc.py +210 -0
  509. package/optional-skills/health/fitness-nutrition/scripts/nutrition_search.py +86 -0
  510. package/optional-skills/health/neuroskill-bci/SKILL.md +459 -0
  511. package/optional-skills/health/neuroskill-bci/references/api.md +286 -0
  512. package/optional-skills/health/neuroskill-bci/references/metrics.md +220 -0
  513. package/optional-skills/health/neuroskill-bci/references/protocols.md +452 -0
  514. package/optional-skills/mcp/DESCRIPTION.md +3 -0
  515. package/optional-skills/mcp/fastmcp/SKILL.md +300 -0
  516. package/optional-skills/mcp/fastmcp/references/fastmcp-cli.md +110 -0
  517. package/optional-skills/mcp/fastmcp/scripts/scaffold_fastmcp.py +56 -0
  518. package/optional-skills/mcp/fastmcp/templates/api_wrapper.py +54 -0
  519. package/optional-skills/mcp/fastmcp/templates/database_server.py +77 -0
  520. package/optional-skills/mcp/fastmcp/templates/file_processor.py +55 -0
  521. package/optional-skills/mcp/mcporter/SKILL.md +123 -0
  522. package/optional-skills/migration/DESCRIPTION.md +2 -0
  523. package/optional-skills/migration/openclaw-migration/SKILL.md +298 -0
  524. package/optional-skills/migration/openclaw-migration/scripts/openclaw_to_hermes.py +3136 -0
  525. package/optional-skills/mlops/accelerate/SKILL.md +336 -0
  526. package/optional-skills/mlops/accelerate/references/custom-plugins.md +453 -0
  527. package/optional-skills/mlops/accelerate/references/megatron-integration.md +489 -0
  528. package/optional-skills/mlops/accelerate/references/performance.md +525 -0
  529. package/optional-skills/mlops/chroma/SKILL.md +410 -0
  530. package/optional-skills/mlops/chroma/references/integration.md +38 -0
  531. package/optional-skills/mlops/clip/SKILL.md +257 -0
  532. package/optional-skills/mlops/clip/references/applications.md +207 -0
  533. package/optional-skills/mlops/faiss/SKILL.md +225 -0
  534. package/optional-skills/mlops/faiss/references/index_types.md +280 -0
  535. package/optional-skills/mlops/flash-attention/SKILL.md +367 -0
  536. package/optional-skills/mlops/flash-attention/references/benchmarks.md +215 -0
  537. package/optional-skills/mlops/flash-attention/references/transformers-integration.md +293 -0
  538. package/optional-skills/mlops/guidance/SKILL.md +576 -0
  539. package/optional-skills/mlops/guidance/references/backends.md +554 -0
  540. package/optional-skills/mlops/guidance/references/constraints.md +674 -0
  541. package/optional-skills/mlops/guidance/references/examples.md +767 -0
  542. package/optional-skills/mlops/huggingface-tokenizers/SKILL.md +520 -0
  543. package/optional-skills/mlops/huggingface-tokenizers/references/algorithms.md +653 -0
  544. package/optional-skills/mlops/huggingface-tokenizers/references/integration.md +637 -0
  545. package/optional-skills/mlops/huggingface-tokenizers/references/pipeline.md +723 -0
  546. package/optional-skills/mlops/huggingface-tokenizers/references/training.md +565 -0
  547. package/optional-skills/mlops/inference/outlines/SKILL.md +656 -0
  548. package/optional-skills/mlops/inference/outlines/references/backends.md +615 -0
  549. package/optional-skills/mlops/inference/outlines/references/examples.md +773 -0
  550. package/optional-skills/mlops/inference/outlines/references/json_generation.md +652 -0
  551. package/optional-skills/mlops/instructor/SKILL.md +744 -0
  552. package/optional-skills/mlops/instructor/references/examples.md +107 -0
  553. package/optional-skills/mlops/instructor/references/providers.md +70 -0
  554. package/optional-skills/mlops/instructor/references/validation.md +606 -0
  555. package/optional-skills/mlops/lambda-labs/SKILL.md +549 -0
  556. package/optional-skills/mlops/lambda-labs/references/advanced-usage.md +611 -0
  557. package/optional-skills/mlops/lambda-labs/references/troubleshooting.md +530 -0
  558. package/optional-skills/mlops/llava/SKILL.md +308 -0
  559. package/optional-skills/mlops/llava/references/training.md +197 -0
  560. package/optional-skills/mlops/modal/SKILL.md +345 -0
  561. package/optional-skills/mlops/modal/references/advanced-usage.md +503 -0
  562. package/optional-skills/mlops/modal/references/troubleshooting.md +494 -0
  563. package/optional-skills/mlops/nemo-curator/SKILL.md +387 -0
  564. package/optional-skills/mlops/nemo-curator/references/deduplication.md +87 -0
  565. package/optional-skills/mlops/nemo-curator/references/filtering.md +102 -0
  566. package/optional-skills/mlops/peft/SKILL.md +435 -0
  567. package/optional-skills/mlops/peft/references/advanced-usage.md +514 -0
  568. package/optional-skills/mlops/peft/references/troubleshooting.md +480 -0
  569. package/optional-skills/mlops/pinecone/SKILL.md +362 -0
  570. package/optional-skills/mlops/pinecone/references/deployment.md +181 -0
  571. package/optional-skills/mlops/pytorch-fsdp/SKILL.md +130 -0
  572. package/optional-skills/mlops/pytorch-fsdp/references/index.md +7 -0
  573. package/optional-skills/mlops/pytorch-fsdp/references/other.md +4261 -0
  574. package/optional-skills/mlops/pytorch-lightning/SKILL.md +350 -0
  575. package/optional-skills/mlops/pytorch-lightning/references/callbacks.md +436 -0
  576. package/optional-skills/mlops/pytorch-lightning/references/distributed.md +490 -0
  577. package/optional-skills/mlops/pytorch-lightning/references/hyperparameter-tuning.md +556 -0
  578. package/optional-skills/mlops/qdrant/SKILL.md +497 -0
  579. package/optional-skills/mlops/qdrant/references/advanced-usage.md +648 -0
  580. package/optional-skills/mlops/qdrant/references/troubleshooting.md +631 -0
  581. package/optional-skills/mlops/saelens/SKILL.md +390 -0
  582. package/optional-skills/mlops/saelens/references/README.md +69 -0
  583. package/optional-skills/mlops/saelens/references/api.md +333 -0
  584. package/optional-skills/mlops/saelens/references/tutorials.md +318 -0
  585. package/optional-skills/mlops/simpo/SKILL.md +223 -0
  586. package/optional-skills/mlops/simpo/references/datasets.md +478 -0
  587. package/optional-skills/mlops/simpo/references/hyperparameters.md +452 -0
  588. package/optional-skills/mlops/simpo/references/loss-functions.md +350 -0
  589. package/optional-skills/mlops/slime/SKILL.md +468 -0
  590. package/optional-skills/mlops/slime/references/api-reference.md +392 -0
  591. package/optional-skills/mlops/slime/references/troubleshooting.md +386 -0
  592. package/optional-skills/mlops/stable-diffusion/SKILL.md +523 -0
  593. package/optional-skills/mlops/stable-diffusion/references/advanced-usage.md +716 -0
  594. package/optional-skills/mlops/stable-diffusion/references/troubleshooting.md +555 -0
  595. package/optional-skills/mlops/tensorrt-llm/SKILL.md +191 -0
  596. package/optional-skills/mlops/tensorrt-llm/references/multi-gpu.md +298 -0
  597. package/optional-skills/mlops/tensorrt-llm/references/optimization.md +242 -0
  598. package/optional-skills/mlops/tensorrt-llm/references/serving.md +470 -0
  599. package/optional-skills/mlops/torchtitan/SKILL.md +362 -0
  600. package/optional-skills/mlops/torchtitan/references/checkpoint.md +181 -0
  601. package/optional-skills/mlops/torchtitan/references/custom-models.md +258 -0
  602. package/optional-skills/mlops/torchtitan/references/float8.md +133 -0
  603. package/optional-skills/mlops/torchtitan/references/fsdp.md +126 -0
  604. package/optional-skills/mlops/training/axolotl/SKILL.md +166 -0
  605. package/optional-skills/mlops/training/axolotl/references/api.md +5548 -0
  606. package/optional-skills/mlops/training/axolotl/references/dataset-formats.md +1029 -0
  607. package/optional-skills/mlops/training/axolotl/references/index.md +15 -0
  608. package/optional-skills/mlops/training/axolotl/references/other.md +3563 -0
  609. package/optional-skills/mlops/training/trl-fine-tuning/SKILL.md +463 -0
  610. package/optional-skills/mlops/training/trl-fine-tuning/references/dpo-variants.md +227 -0
  611. package/optional-skills/mlops/training/trl-fine-tuning/references/grpo-training.md +504 -0
  612. package/optional-skills/mlops/training/trl-fine-tuning/references/online-rl.md +82 -0
  613. package/optional-skills/mlops/training/trl-fine-tuning/references/reward-modeling.md +122 -0
  614. package/optional-skills/mlops/training/trl-fine-tuning/references/sft-training.md +168 -0
  615. package/optional-skills/mlops/training/trl-fine-tuning/templates/basic_grpo_training.py +228 -0
  616. package/optional-skills/mlops/training/unsloth/SKILL.md +84 -0
  617. package/optional-skills/mlops/training/unsloth/references/index.md +7 -0
  618. package/optional-skills/mlops/training/unsloth/references/llms-full.md +16799 -0
  619. package/optional-skills/mlops/training/unsloth/references/llms-txt.md +12044 -0
  620. package/optional-skills/mlops/training/unsloth/references/llms.md +82 -0
  621. package/optional-skills/mlops/whisper/SKILL.md +321 -0
  622. package/optional-skills/mlops/whisper/references/languages.md +189 -0
  623. package/optional-skills/productivity/canvas/SKILL.md +98 -0
  624. package/optional-skills/productivity/canvas/scripts/canvas_api.py +157 -0
  625. package/optional-skills/productivity/here-now/SKILL.md +217 -0
  626. package/optional-skills/productivity/here-now/scripts/drive.sh +406 -0
  627. package/optional-skills/productivity/here-now/scripts/publish.sh +445 -0
  628. package/optional-skills/productivity/memento-flashcards/SKILL.md +324 -0
  629. package/optional-skills/productivity/memento-flashcards/scripts/memento_cards.py +353 -0
  630. package/optional-skills/productivity/memento-flashcards/scripts/youtube_quiz.py +88 -0
  631. package/optional-skills/productivity/shop-app/SKILL.md +340 -0
  632. package/optional-skills/productivity/shopify/SKILL.md +373 -0
  633. package/optional-skills/productivity/siyuan/SKILL.md +298 -0
  634. package/optional-skills/productivity/telephony/SKILL.md +418 -0
  635. package/optional-skills/productivity/telephony/scripts/telephony.py +1343 -0
  636. package/optional-skills/research/bioinformatics/SKILL.md +235 -0
  637. package/optional-skills/research/darwinian-evolver/SKILL.md +199 -0
  638. package/optional-skills/research/darwinian-evolver/scripts/parrot_openrouter.py +218 -0
  639. package/optional-skills/research/darwinian-evolver/scripts/show_snapshot.py +69 -0
  640. package/optional-skills/research/darwinian-evolver/templates/custom_problem_template.py +240 -0
  641. package/optional-skills/research/domain-intel/SKILL.md +97 -0
  642. package/optional-skills/research/domain-intel/scripts/domain_intel.py +397 -0
  643. package/optional-skills/research/drug-discovery/SKILL.md +227 -0
  644. package/optional-skills/research/drug-discovery/references/ADMET_REFERENCE.md +66 -0
  645. package/optional-skills/research/drug-discovery/scripts/chembl_target.py +53 -0
  646. package/optional-skills/research/drug-discovery/scripts/ro5_screen.py +44 -0
  647. package/optional-skills/research/duckduckgo-search/SKILL.md +238 -0
  648. package/optional-skills/research/duckduckgo-search/scripts/duckduckgo.sh +28 -0
  649. package/optional-skills/research/gitnexus-explorer/SKILL.md +214 -0
  650. package/optional-skills/research/gitnexus-explorer/scripts/proxy.mjs +92 -0
  651. package/optional-skills/research/osint-investigation/SKILL.md +277 -0
  652. package/optional-skills/research/osint-investigation/references/sources/courtlistener.md +98 -0
  653. package/optional-skills/research/osint-investigation/references/sources/gdelt.md +104 -0
  654. package/optional-skills/research/osint-investigation/references/sources/icij-offshore.md +104 -0
  655. package/optional-skills/research/osint-investigation/references/sources/nyc-acris.md +90 -0
  656. package/optional-skills/research/osint-investigation/references/sources/ofac-sdn.md +92 -0
  657. package/optional-skills/research/osint-investigation/references/sources/opencorporates.md +103 -0
  658. package/optional-skills/research/osint-investigation/references/sources/sec-edgar.md +83 -0
  659. package/optional-skills/research/osint-investigation/references/sources/senate-ld.md +89 -0
  660. package/optional-skills/research/osint-investigation/references/sources/usaspending.md +97 -0
  661. package/optional-skills/research/osint-investigation/references/sources/wayback.md +93 -0
  662. package/optional-skills/research/osint-investigation/references/sources/wikipedia.md +107 -0
  663. package/optional-skills/research/osint-investigation/scripts/_http.py +82 -0
  664. package/optional-skills/research/osint-investigation/scripts/_normalize.py +67 -0
  665. package/optional-skills/research/osint-investigation/scripts/build_findings.py +221 -0
  666. package/optional-skills/research/osint-investigation/scripts/entity_resolution.py +228 -0
  667. package/optional-skills/research/osint-investigation/scripts/fetch_courtlistener.py +149 -0
  668. package/optional-skills/research/osint-investigation/scripts/fetch_gdelt.py +162 -0
  669. package/optional-skills/research/osint-investigation/scripts/fetch_icij_offshore.py +234 -0
  670. package/optional-skills/research/osint-investigation/scripts/fetch_nyc_acris.py +203 -0
  671. package/optional-skills/research/osint-investigation/scripts/fetch_ofac_sdn.py +175 -0
  672. package/optional-skills/research/osint-investigation/scripts/fetch_opencorporates.py +192 -0
  673. package/optional-skills/research/osint-investigation/scripts/fetch_sec_edgar.py +184 -0
  674. package/optional-skills/research/osint-investigation/scripts/fetch_senate_ld.py +146 -0
  675. package/optional-skills/research/osint-investigation/scripts/fetch_usaspending.py +170 -0
  676. package/optional-skills/research/osint-investigation/scripts/fetch_wayback.py +142 -0
  677. package/optional-skills/research/osint-investigation/scripts/fetch_wikipedia.py +267 -0
  678. package/optional-skills/research/osint-investigation/scripts/timing_analysis.py +253 -0
  679. package/optional-skills/research/osint-investigation/templates/source-template.md +59 -0
  680. package/optional-skills/research/parallel-cli/SKILL.md +391 -0
  681. package/optional-skills/research/qmd/SKILL.md +441 -0
  682. package/optional-skills/research/scrapling/SKILL.md +336 -0
  683. package/optional-skills/research/searxng-search/SKILL.md +212 -0
  684. package/optional-skills/research/searxng-search/scripts/searxng.sh +22 -0
  685. package/optional-skills/security/1password/SKILL.md +163 -0
  686. package/optional-skills/security/1password/references/cli-examples.md +31 -0
  687. package/optional-skills/security/1password/references/get-started.md +21 -0
  688. package/optional-skills/security/DESCRIPTION.md +3 -0
  689. package/optional-skills/security/oss-forensics/SKILL.md +423 -0
  690. package/optional-skills/security/oss-forensics/references/evidence-types.md +89 -0
  691. package/optional-skills/security/oss-forensics/references/github-archive-guide.md +184 -0
  692. package/optional-skills/security/oss-forensics/references/investigation-templates.md +131 -0
  693. package/optional-skills/security/oss-forensics/references/recovery-techniques.md +164 -0
  694. package/optional-skills/security/oss-forensics/scripts/evidence-store.py +313 -0
  695. package/optional-skills/security/oss-forensics/templates/forensic-report.md +151 -0
  696. package/optional-skills/security/oss-forensics/templates/malicious-package-report.md +43 -0
  697. package/optional-skills/security/sherlock/SKILL.md +193 -0
  698. package/optional-skills/software-development/rest-graphql-debug/SKILL.md +514 -0
  699. package/optional-skills/web-development/DESCRIPTION.md +5 -0
  700. package/optional-skills/web-development/page-agent/SKILL.md +190 -0
  701. package/package.json +78 -0
  702. package/plugins/__init__.py +1 -0
  703. package/plugins/__pycache__/__init__.cpython-312.pyc +0 -0
  704. package/plugins/context_engine/__init__.py +219 -0
  705. package/plugins/disk-cleanup/README.md +51 -0
  706. package/plugins/disk-cleanup/__init__.py +316 -0
  707. package/plugins/disk-cleanup/disk_cleanup.py +497 -0
  708. package/plugins/disk-cleanup/plugin.yaml +7 -0
  709. package/plugins/example-dashboard/dashboard/manifest.json +14 -0
  710. package/plugins/example-dashboard/dashboard/plugin_api.py +17 -0
  711. package/plugins/google_meet/README.md +131 -0
  712. package/plugins/google_meet/SKILL.md +148 -0
  713. package/plugins/google_meet/__init__.py +103 -0
  714. package/plugins/google_meet/audio_bridge.py +244 -0
  715. package/plugins/google_meet/cli.py +479 -0
  716. package/plugins/google_meet/meet_bot.py +852 -0
  717. package/plugins/google_meet/node/__init__.py +54 -0
  718. package/plugins/google_meet/node/cli.py +125 -0
  719. package/plugins/google_meet/node/client.py +107 -0
  720. package/plugins/google_meet/node/protocol.py +124 -0
  721. package/plugins/google_meet/node/registry.py +113 -0
  722. package/plugins/google_meet/node/server.py +201 -0
  723. package/plugins/google_meet/plugin.yaml +16 -0
  724. package/plugins/google_meet/process_manager.py +324 -0
  725. package/plugins/google_meet/realtime/__init__.py +10 -0
  726. package/plugins/google_meet/realtime/openai_client.py +332 -0
  727. package/plugins/google_meet/tools.py +348 -0
  728. package/plugins/hermes-achievements/LICENSE +21 -0
  729. package/plugins/hermes-achievements/README.md +150 -0
  730. package/plugins/hermes-achievements/dashboard/dist/index.js +732 -0
  731. package/plugins/hermes-achievements/dashboard/dist/style.css +146 -0
  732. package/plugins/hermes-achievements/dashboard/manifest.json +11 -0
  733. package/plugins/hermes-achievements/dashboard/plugin_api.py +1062 -0
  734. package/plugins/hermes-achievements/docs/achievements-performance-implementation-plan.md +157 -0
  735. package/plugins/hermes-achievements/docs/achievements-performance-implementation-spec.md +219 -0
  736. package/plugins/hermes-achievements/docs/achievements-performance-spec.md +174 -0
  737. package/plugins/hermes-achievements/docs/assets/achievements-dashboard-hd.png +0 -0
  738. package/plugins/hermes-achievements/docs/assets/achievements-tier-showcase-hd.png +0 -0
  739. package/plugins/hermes-achievements/tests/test_achievement_engine.py +156 -0
  740. package/plugins/image_gen/openai/__init__.py +303 -0
  741. package/plugins/image_gen/openai/__pycache__/__init__.cpython-312.pyc +0 -0
  742. package/plugins/image_gen/openai/plugin.yaml +7 -0
  743. package/plugins/image_gen/openai-codex/__init__.py +378 -0
  744. package/plugins/image_gen/openai-codex/__pycache__/__init__.cpython-312.pyc +0 -0
  745. package/plugins/image_gen/openai-codex/plugin.yaml +5 -0
  746. package/plugins/image_gen/xai/__init__.py +316 -0
  747. package/plugins/image_gen/xai/__pycache__/__init__.cpython-312.pyc +0 -0
  748. package/plugins/image_gen/xai/plugin.yaml +7 -0
  749. package/plugins/kanban/dashboard/dist/index.js +3143 -0
  750. package/plugins/kanban/dashboard/dist/style.css +1500 -0
  751. package/plugins/kanban/dashboard/manifest.json +14 -0
  752. package/plugins/kanban/dashboard/plugin_api.py +1612 -0
  753. package/plugins/kanban/systemd/hermes-kanban-dispatcher.service +32 -0
  754. package/plugins/memory/__init__.py +408 -0
  755. package/plugins/memory/byterover/README.md +41 -0
  756. package/plugins/memory/byterover/__init__.py +384 -0
  757. package/plugins/memory/byterover/plugin.yaml +9 -0
  758. package/plugins/memory/hindsight/README.md +138 -0
  759. package/plugins/memory/hindsight/__init__.py +1758 -0
  760. package/plugins/memory/hindsight/plugin.yaml +8 -0
  761. package/plugins/memory/holographic/README.md +36 -0
  762. package/plugins/memory/holographic/__init__.py +409 -0
  763. package/plugins/memory/holographic/holographic.py +203 -0
  764. package/plugins/memory/holographic/plugin.yaml +5 -0
  765. package/plugins/memory/holographic/retrieval.py +593 -0
  766. package/plugins/memory/holographic/store.py +579 -0
  767. package/plugins/memory/honcho/README.md +328 -0
  768. package/plugins/memory/honcho/__init__.py +1329 -0
  769. package/plugins/memory/honcho/cli.py +1452 -0
  770. package/plugins/memory/honcho/client.py +784 -0
  771. package/plugins/memory/honcho/plugin.yaml +7 -0
  772. package/plugins/memory/honcho/session.py +1255 -0
  773. package/plugins/memory/mem0/README.md +38 -0
  774. package/plugins/memory/mem0/__init__.py +374 -0
  775. package/plugins/memory/mem0/plugin.yaml +5 -0
  776. package/plugins/memory/openviking/README.md +40 -0
  777. package/plugins/memory/openviking/__init__.py +945 -0
  778. package/plugins/memory/openviking/plugin.yaml +9 -0
  779. package/plugins/memory/retaindb/README.md +40 -0
  780. package/plugins/memory/retaindb/__init__.py +767 -0
  781. package/plugins/memory/retaindb/plugin.yaml +7 -0
  782. package/plugins/memory/supermemory/README.md +99 -0
  783. package/plugins/memory/supermemory/__init__.py +792 -0
  784. package/plugins/memory/supermemory/plugin.yaml +5 -0
  785. package/plugins/model-providers/README.md +70 -0
  786. package/plugins/model-providers/ai-gateway/__init__.py +43 -0
  787. package/plugins/model-providers/ai-gateway/__pycache__/__init__.cpython-312.pyc +0 -0
  788. package/plugins/model-providers/ai-gateway/plugin.yaml +5 -0
  789. package/plugins/model-providers/alibaba/__init__.py +13 -0
  790. package/plugins/model-providers/alibaba/__pycache__/__init__.cpython-312.pyc +0 -0
  791. package/plugins/model-providers/alibaba/plugin.yaml +5 -0
  792. package/plugins/model-providers/alibaba-coding-plan/__init__.py +21 -0
  793. package/plugins/model-providers/alibaba-coding-plan/__pycache__/__init__.cpython-312.pyc +0 -0
  794. package/plugins/model-providers/alibaba-coding-plan/plugin.yaml +5 -0
  795. package/plugins/model-providers/anthropic/__init__.py +52 -0
  796. package/plugins/model-providers/anthropic/__pycache__/__init__.cpython-312.pyc +0 -0
  797. package/plugins/model-providers/anthropic/plugin.yaml +5 -0
  798. package/plugins/model-providers/arcee/__init__.py +13 -0
  799. package/plugins/model-providers/arcee/__pycache__/__init__.cpython-312.pyc +0 -0
  800. package/plugins/model-providers/arcee/plugin.yaml +5 -0
  801. package/plugins/model-providers/azure-foundry/__init__.py +21 -0
  802. package/plugins/model-providers/azure-foundry/__pycache__/__init__.cpython-312.pyc +0 -0
  803. package/plugins/model-providers/azure-foundry/plugin.yaml +5 -0
  804. package/plugins/model-providers/bedrock/__init__.py +29 -0
  805. package/plugins/model-providers/bedrock/__pycache__/__init__.cpython-312.pyc +0 -0
  806. package/plugins/model-providers/bedrock/plugin.yaml +5 -0
  807. package/plugins/model-providers/copilot/__init__.py +58 -0
  808. package/plugins/model-providers/copilot/__pycache__/__init__.cpython-312.pyc +0 -0
  809. package/plugins/model-providers/copilot/plugin.yaml +5 -0
  810. package/plugins/model-providers/copilot-acp/__init__.py +34 -0
  811. package/plugins/model-providers/copilot-acp/__pycache__/__init__.cpython-312.pyc +0 -0
  812. package/plugins/model-providers/copilot-acp/plugin.yaml +5 -0
  813. package/plugins/model-providers/custom/__init__.py +68 -0
  814. package/plugins/model-providers/custom/__pycache__/__init__.cpython-312.pyc +0 -0
  815. package/plugins/model-providers/custom/plugin.yaml +5 -0
  816. package/plugins/model-providers/deepseek/__init__.py +99 -0
  817. package/plugins/model-providers/deepseek/__pycache__/__init__.cpython-312.pyc +0 -0
  818. package/plugins/model-providers/deepseek/plugin.yaml +5 -0
  819. package/plugins/model-providers/gemini/__init__.py +72 -0
  820. package/plugins/model-providers/gemini/__pycache__/__init__.cpython-312.pyc +0 -0
  821. package/plugins/model-providers/gemini/plugin.yaml +5 -0
  822. package/plugins/model-providers/gmi/__init__.py +31 -0
  823. package/plugins/model-providers/gmi/__pycache__/__init__.cpython-312.pyc +0 -0
  824. package/plugins/model-providers/gmi/plugin.yaml +5 -0
  825. package/plugins/model-providers/huggingface/__init__.py +20 -0
  826. package/plugins/model-providers/huggingface/__pycache__/__init__.cpython-312.pyc +0 -0
  827. package/plugins/model-providers/huggingface/plugin.yaml +5 -0
  828. package/plugins/model-providers/kilocode/__init__.py +14 -0
  829. package/plugins/model-providers/kilocode/__pycache__/__init__.cpython-312.pyc +0 -0
  830. package/plugins/model-providers/kilocode/plugin.yaml +5 -0
  831. package/plugins/model-providers/kimi-coding/__init__.py +71 -0
  832. package/plugins/model-providers/kimi-coding/__pycache__/__init__.cpython-312.pyc +0 -0
  833. package/plugins/model-providers/kimi-coding/plugin.yaml +5 -0
  834. package/plugins/model-providers/minimax/__init__.py +45 -0
  835. package/plugins/model-providers/minimax/__pycache__/__init__.cpython-312.pyc +0 -0
  836. package/plugins/model-providers/minimax/plugin.yaml +5 -0
  837. package/plugins/model-providers/nous/__init__.py +54 -0
  838. package/plugins/model-providers/nous/__pycache__/__init__.cpython-312.pyc +0 -0
  839. package/plugins/model-providers/nous/plugin.yaml +5 -0
  840. package/plugins/model-providers/novita/__init__.py +27 -0
  841. package/plugins/model-providers/novita/__pycache__/__init__.cpython-312.pyc +0 -0
  842. package/plugins/model-providers/novita/plugin.yaml +5 -0
  843. package/plugins/model-providers/nvidia/__init__.py +21 -0
  844. package/plugins/model-providers/nvidia/__pycache__/__init__.cpython-312.pyc +0 -0
  845. package/plugins/model-providers/nvidia/plugin.yaml +5 -0
  846. package/plugins/model-providers/ollama-cloud/__init__.py +14 -0
  847. package/plugins/model-providers/ollama-cloud/__pycache__/__init__.cpython-312.pyc +0 -0
  848. package/plugins/model-providers/ollama-cloud/plugin.yaml +5 -0
  849. package/plugins/model-providers/openai-codex/__init__.py +15 -0
  850. package/plugins/model-providers/openai-codex/__pycache__/__init__.cpython-312.pyc +0 -0
  851. package/plugins/model-providers/openai-codex/plugin.yaml +5 -0
  852. package/plugins/model-providers/opencode-zen/__init__.py +30 -0
  853. package/plugins/model-providers/opencode-zen/__pycache__/__init__.cpython-312.pyc +0 -0
  854. package/plugins/model-providers/opencode-zen/plugin.yaml +5 -0
  855. package/plugins/model-providers/openrouter/__init__.py +115 -0
  856. package/plugins/model-providers/openrouter/__pycache__/__init__.cpython-312.pyc +0 -0
  857. package/plugins/model-providers/openrouter/plugin.yaml +5 -0
  858. package/plugins/model-providers/qwen-oauth/__init__.py +82 -0
  859. package/plugins/model-providers/qwen-oauth/__pycache__/__init__.cpython-312.pyc +0 -0
  860. package/plugins/model-providers/qwen-oauth/plugin.yaml +5 -0
  861. package/plugins/model-providers/stepfun/__init__.py +14 -0
  862. package/plugins/model-providers/stepfun/__pycache__/__init__.cpython-312.pyc +0 -0
  863. package/plugins/model-providers/stepfun/plugin.yaml +5 -0
  864. package/plugins/model-providers/xai/__init__.py +15 -0
  865. package/plugins/model-providers/xai/__pycache__/__init__.cpython-312.pyc +0 -0
  866. package/plugins/model-providers/xai/plugin.yaml +5 -0
  867. package/plugins/model-providers/xiaomi/__init__.py +14 -0
  868. package/plugins/model-providers/xiaomi/__pycache__/__init__.cpython-312.pyc +0 -0
  869. package/plugins/model-providers/xiaomi/plugin.yaml +5 -0
  870. package/plugins/model-providers/zai/__init__.py +21 -0
  871. package/plugins/model-providers/zai/__pycache__/__init__.cpython-312.pyc +0 -0
  872. package/plugins/model-providers/zai/plugin.yaml +5 -0
  873. package/plugins/observability/langfuse/README.md +53 -0
  874. package/plugins/observability/langfuse/__init__.py +1004 -0
  875. package/plugins/observability/langfuse/plugin.yaml +14 -0
  876. package/plugins/platforms/google_chat/__init__.py +3 -0
  877. package/plugins/platforms/google_chat/__pycache__/__init__.cpython-312.pyc +0 -0
  878. package/plugins/platforms/google_chat/__pycache__/adapter.cpython-312.pyc +0 -0
  879. package/plugins/platforms/google_chat/adapter.py +3343 -0
  880. package/plugins/platforms/google_chat/oauth.py +639 -0
  881. package/plugins/platforms/google_chat/plugin.yaml +39 -0
  882. package/plugins/platforms/irc/__init__.py +3 -0
  883. package/plugins/platforms/irc/__pycache__/__init__.cpython-312.pyc +0 -0
  884. package/plugins/platforms/irc/__pycache__/adapter.cpython-312.pyc +0 -0
  885. package/plugins/platforms/irc/adapter.py +969 -0
  886. package/plugins/platforms/irc/plugin.yaml +54 -0
  887. package/plugins/platforms/line/__init__.py +3 -0
  888. package/plugins/platforms/line/__pycache__/__init__.cpython-312.pyc +0 -0
  889. package/plugins/platforms/line/__pycache__/adapter.cpython-312.pyc +0 -0
  890. package/plugins/platforms/line/adapter.py +1639 -0
  891. package/plugins/platforms/line/plugin.yaml +65 -0
  892. package/plugins/platforms/simplex/__init__.py +3 -0
  893. package/plugins/platforms/simplex/__pycache__/__init__.cpython-312.pyc +0 -0
  894. package/plugins/platforms/simplex/__pycache__/adapter.cpython-312.pyc +0 -0
  895. package/plugins/platforms/simplex/adapter.py +746 -0
  896. package/plugins/platforms/simplex/plugin.yaml +37 -0
  897. package/plugins/platforms/teams/__init__.py +3 -0
  898. package/plugins/platforms/teams/__pycache__/__init__.cpython-312.pyc +0 -0
  899. package/plugins/platforms/teams/__pycache__/adapter.cpython-312.pyc +0 -0
  900. package/plugins/platforms/teams/adapter.py +1188 -0
  901. package/plugins/platforms/teams/plugin.yaml +48 -0
  902. package/plugins/spotify/__init__.py +66 -0
  903. package/plugins/spotify/__pycache__/__init__.cpython-312.pyc +0 -0
  904. package/plugins/spotify/__pycache__/client.cpython-312.pyc +0 -0
  905. package/plugins/spotify/__pycache__/tools.cpython-312.pyc +0 -0
  906. package/plugins/spotify/client.py +435 -0
  907. package/plugins/spotify/plugin.yaml +13 -0
  908. package/plugins/spotify/tools.py +454 -0
  909. package/plugins/teams_pipeline/__init__.py +23 -0
  910. package/plugins/teams_pipeline/cli.py +463 -0
  911. package/plugins/teams_pipeline/meetings.py +333 -0
  912. package/plugins/teams_pipeline/models.py +350 -0
  913. package/plugins/teams_pipeline/pipeline.py +692 -0
  914. package/plugins/teams_pipeline/plugin.yaml +9 -0
  915. package/plugins/teams_pipeline/runtime.py +135 -0
  916. package/plugins/teams_pipeline/store.py +194 -0
  917. package/plugins/teams_pipeline/subscriptions.py +249 -0
  918. package/plugins/video_gen/fal/__init__.py +523 -0
  919. package/plugins/video_gen/fal/__pycache__/__init__.cpython-312.pyc +0 -0
  920. package/plugins/video_gen/fal/plugin.yaml +7 -0
  921. package/plugins/video_gen/xai/__init__.py +441 -0
  922. package/plugins/video_gen/xai/__pycache__/__init__.cpython-312.pyc +0 -0
  923. package/plugins/video_gen/xai/plugin.yaml +7 -0
  924. package/plugins/web/__init__.py +7 -0
  925. package/plugins/web/__pycache__/__init__.cpython-312.pyc +0 -0
  926. package/plugins/web/brave_free/__init__.py +14 -0
  927. package/plugins/web/brave_free/__pycache__/__init__.cpython-312.pyc +0 -0
  928. package/plugins/web/brave_free/__pycache__/provider.cpython-312.pyc +0 -0
  929. package/plugins/web/brave_free/plugin.yaml +7 -0
  930. package/plugins/web/brave_free/provider.py +137 -0
  931. package/plugins/web/ddgs/__init__.py +15 -0
  932. package/plugins/web/ddgs/__pycache__/__init__.cpython-312.pyc +0 -0
  933. package/plugins/web/ddgs/__pycache__/provider.cpython-312.pyc +0 -0
  934. package/plugins/web/ddgs/plugin.yaml +7 -0
  935. package/plugins/web/ddgs/provider.py +104 -0
  936. package/plugins/web/exa/__init__.py +15 -0
  937. package/plugins/web/exa/__pycache__/__init__.cpython-312.pyc +0 -0
  938. package/plugins/web/exa/__pycache__/provider.cpython-312.pyc +0 -0
  939. package/plugins/web/exa/plugin.yaml +7 -0
  940. package/plugins/web/exa/provider.py +212 -0
  941. package/plugins/web/firecrawl/__init__.py +28 -0
  942. package/plugins/web/firecrawl/__pycache__/__init__.cpython-312.pyc +0 -0
  943. package/plugins/web/firecrawl/__pycache__/provider.cpython-312.pyc +0 -0
  944. package/plugins/web/firecrawl/plugin.yaml +7 -0
  945. package/plugins/web/firecrawl/provider.py +773 -0
  946. package/plugins/web/parallel/__init__.py +16 -0
  947. package/plugins/web/parallel/__pycache__/__init__.cpython-312.pyc +0 -0
  948. package/plugins/web/parallel/__pycache__/provider.cpython-312.pyc +0 -0
  949. package/plugins/web/parallel/plugin.yaml +7 -0
  950. package/plugins/web/parallel/provider.py +291 -0
  951. package/plugins/web/searxng/__init__.py +15 -0
  952. package/plugins/web/searxng/__pycache__/__init__.cpython-312.pyc +0 -0
  953. package/plugins/web/searxng/__pycache__/provider.cpython-312.pyc +0 -0
  954. package/plugins/web/searxng/plugin.yaml +7 -0
  955. package/plugins/web/searxng/provider.py +140 -0
  956. package/plugins/web/tavily/__init__.py +15 -0
  957. package/plugins/web/tavily/__pycache__/__init__.cpython-312.pyc +0 -0
  958. package/plugins/web/tavily/__pycache__/provider.cpython-312.pyc +0 -0
  959. package/plugins/web/tavily/plugin.yaml +7 -0
  960. package/plugins/web/tavily/provider.py +285 -0
  961. package/providers/README.md +78 -0
  962. package/providers/__init__.py +192 -0
  963. package/providers/__pycache__/__init__.cpython-312.pyc +0 -0
  964. package/providers/__pycache__/base.cpython-312.pyc +0 -0
  965. package/providers/base.py +184 -0
  966. package/pyproject.toml +255 -0
  967. package/run_agent.py +16409 -0
  968. package/scripts/benchmark_browser_eval.py +138 -0
  969. package/scripts/build_model_catalog.py +95 -0
  970. package/scripts/build_skills_index.py +325 -0
  971. package/scripts/check-windows-footguns.py +624 -0
  972. package/scripts/contributor_audit.py +473 -0
  973. package/scripts/discord-voice-doctor.py +396 -0
  974. package/scripts/hermes-gateway +416 -0
  975. package/scripts/install.cmd +28 -0
  976. package/scripts/install.ps1 +1611 -0
  977. package/scripts/install.sh +2007 -0
  978. package/scripts/install_psutil_android.py +117 -0
  979. package/scripts/keystroke_diagnostic.py +81 -0
  980. package/scripts/kill_modal.sh +34 -0
  981. package/scripts/lib/node-bootstrap.sh +238 -0
  982. package/scripts/lint_diff.py +207 -0
  983. package/scripts/postinstall.js +150 -0
  984. package/scripts/profile-tui.py +626 -0
  985. package/scripts/release.py +1680 -0
  986. package/scripts/run_tests.sh +129 -0
  987. package/scripts/sample_and_compress.py +409 -0
  988. package/scripts/setup_open_webui.sh +349 -0
  989. package/scripts/whatsapp-bridge/allowlist.js +88 -0
  990. package/scripts/whatsapp-bridge/allowlist.test.mjs +80 -0
  991. package/scripts/whatsapp-bridge/bridge.js +729 -0
  992. package/scripts/whatsapp-bridge/package-lock.json +2141 -0
  993. package/scripts/whatsapp-bridge/package.json +19 -0
  994. package/skills/apple/DESCRIPTION.md +2 -0
  995. package/skills/apple/apple-notes/SKILL.md +90 -0
  996. package/skills/apple/apple-reminders/SKILL.md +98 -0
  997. package/skills/apple/findmy/SKILL.md +131 -0
  998. package/skills/apple/imessage/SKILL.md +102 -0
  999. package/skills/apple/macos-computer-use/SKILL.md +201 -0
  1000. package/skills/autonomous-ai-agents/DESCRIPTION.md +3 -0
  1001. package/skills/autonomous-ai-agents/claude-code/SKILL.md +745 -0
  1002. package/skills/autonomous-ai-agents/codex/SKILL.md +130 -0
  1003. package/skills/autonomous-ai-agents/hermes-agent/SKILL.md +1014 -0
  1004. package/skills/autonomous-ai-agents/opencode/SKILL.md +219 -0
  1005. package/skills/creative/DESCRIPTION.md +3 -0
  1006. package/skills/creative/architecture-diagram/SKILL.md +148 -0
  1007. package/skills/creative/architecture-diagram/templates/template.html +319 -0
  1008. package/skills/creative/ascii-art/SKILL.md +322 -0
  1009. package/skills/creative/ascii-video/README.md +290 -0
  1010. package/skills/creative/ascii-video/SKILL.md +241 -0
  1011. package/skills/creative/ascii-video/references/architecture.md +802 -0
  1012. package/skills/creative/ascii-video/references/composition.md +892 -0
  1013. package/skills/creative/ascii-video/references/effects.md +1865 -0
  1014. package/skills/creative/ascii-video/references/inputs.md +685 -0
  1015. package/skills/creative/ascii-video/references/optimization.md +688 -0
  1016. package/skills/creative/ascii-video/references/scenes.md +1011 -0
  1017. package/skills/creative/ascii-video/references/shaders.md +1385 -0
  1018. package/skills/creative/ascii-video/references/troubleshooting.md +367 -0
  1019. package/skills/creative/baoyu-comic/PORT_NOTES.md +77 -0
  1020. package/skills/creative/baoyu-comic/SKILL.md +247 -0
  1021. package/skills/creative/baoyu-comic/references/analysis-framework.md +176 -0
  1022. package/skills/creative/baoyu-comic/references/art-styles/chalk.md +101 -0
  1023. package/skills/creative/baoyu-comic/references/art-styles/ink-brush.md +97 -0
  1024. package/skills/creative/baoyu-comic/references/art-styles/ligne-claire.md +75 -0
  1025. package/skills/creative/baoyu-comic/references/art-styles/manga.md +93 -0
  1026. package/skills/creative/baoyu-comic/references/art-styles/minimalist.md +84 -0
  1027. package/skills/creative/baoyu-comic/references/art-styles/realistic.md +89 -0
  1028. package/skills/creative/baoyu-comic/references/auto-selection.md +71 -0
  1029. package/skills/creative/baoyu-comic/references/base-prompt.md +98 -0
  1030. package/skills/creative/baoyu-comic/references/character-template.md +180 -0
  1031. package/skills/creative/baoyu-comic/references/layouts/cinematic.md +23 -0
  1032. package/skills/creative/baoyu-comic/references/layouts/dense.md +23 -0
  1033. package/skills/creative/baoyu-comic/references/layouts/four-panel.md +40 -0
  1034. package/skills/creative/baoyu-comic/references/layouts/mixed.md +23 -0
  1035. package/skills/creative/baoyu-comic/references/layouts/splash.md +23 -0
  1036. package/skills/creative/baoyu-comic/references/layouts/standard.md +23 -0
  1037. package/skills/creative/baoyu-comic/references/layouts/webtoon.md +30 -0
  1038. package/skills/creative/baoyu-comic/references/ohmsha-guide.md +85 -0
  1039. package/skills/creative/baoyu-comic/references/partial-workflows.md +106 -0
  1040. package/skills/creative/baoyu-comic/references/presets/concept-story.md +121 -0
  1041. package/skills/creative/baoyu-comic/references/presets/four-panel.md +107 -0
  1042. package/skills/creative/baoyu-comic/references/presets/ohmsha.md +114 -0
  1043. package/skills/creative/baoyu-comic/references/presets/shoujo.md +116 -0
  1044. package/skills/creative/baoyu-comic/references/presets/wuxia.md +110 -0
  1045. package/skills/creative/baoyu-comic/references/storyboard-template.md +143 -0
  1046. package/skills/creative/baoyu-comic/references/tones/action.md +110 -0
  1047. package/skills/creative/baoyu-comic/references/tones/dramatic.md +95 -0
  1048. package/skills/creative/baoyu-comic/references/tones/energetic.md +105 -0
  1049. package/skills/creative/baoyu-comic/references/tones/neutral.md +63 -0
  1050. package/skills/creative/baoyu-comic/references/tones/romantic.md +100 -0
  1051. package/skills/creative/baoyu-comic/references/tones/vintage.md +104 -0
  1052. package/skills/creative/baoyu-comic/references/tones/warm.md +94 -0
  1053. package/skills/creative/baoyu-comic/references/workflow.md +401 -0
  1054. package/skills/creative/baoyu-infographic/PORT_NOTES.md +43 -0
  1055. package/skills/creative/baoyu-infographic/SKILL.md +237 -0
  1056. package/skills/creative/baoyu-infographic/references/analysis-framework.md +182 -0
  1057. package/skills/creative/baoyu-infographic/references/base-prompt.md +43 -0
  1058. package/skills/creative/baoyu-infographic/references/layouts/bento-grid.md +41 -0
  1059. package/skills/creative/baoyu-infographic/references/layouts/binary-comparison.md +48 -0
  1060. package/skills/creative/baoyu-infographic/references/layouts/bridge.md +41 -0
  1061. package/skills/creative/baoyu-infographic/references/layouts/circular-flow.md +41 -0
  1062. package/skills/creative/baoyu-infographic/references/layouts/comic-strip.md +41 -0
  1063. package/skills/creative/baoyu-infographic/references/layouts/comparison-matrix.md +41 -0
  1064. package/skills/creative/baoyu-infographic/references/layouts/dashboard.md +41 -0
  1065. package/skills/creative/baoyu-infographic/references/layouts/dense-modules.md +72 -0
  1066. package/skills/creative/baoyu-infographic/references/layouts/funnel.md +41 -0
  1067. package/skills/creative/baoyu-infographic/references/layouts/hierarchical-layers.md +48 -0
  1068. package/skills/creative/baoyu-infographic/references/layouts/hub-spoke.md +41 -0
  1069. package/skills/creative/baoyu-infographic/references/layouts/iceberg.md +41 -0
  1070. package/skills/creative/baoyu-infographic/references/layouts/isometric-map.md +41 -0
  1071. package/skills/creative/baoyu-infographic/references/layouts/jigsaw.md +41 -0
  1072. package/skills/creative/baoyu-infographic/references/layouts/linear-progression.md +48 -0
  1073. package/skills/creative/baoyu-infographic/references/layouts/periodic-table.md +41 -0
  1074. package/skills/creative/baoyu-infographic/references/layouts/story-mountain.md +41 -0
  1075. package/skills/creative/baoyu-infographic/references/layouts/structural-breakdown.md +48 -0
  1076. package/skills/creative/baoyu-infographic/references/layouts/tree-branching.md +41 -0
  1077. package/skills/creative/baoyu-infographic/references/layouts/venn-diagram.md +41 -0
  1078. package/skills/creative/baoyu-infographic/references/layouts/winding-roadmap.md +41 -0
  1079. package/skills/creative/baoyu-infographic/references/structured-content-template.md +244 -0
  1080. package/skills/creative/baoyu-infographic/references/styles/aged-academia.md +36 -0
  1081. package/skills/creative/baoyu-infographic/references/styles/bold-graphic.md +36 -0
  1082. package/skills/creative/baoyu-infographic/references/styles/chalkboard.md +61 -0
  1083. package/skills/creative/baoyu-infographic/references/styles/claymation.md +29 -0
  1084. package/skills/creative/baoyu-infographic/references/styles/corporate-memphis.md +29 -0
  1085. package/skills/creative/baoyu-infographic/references/styles/craft-handmade.md +44 -0
  1086. package/skills/creative/baoyu-infographic/references/styles/cyberpunk-neon.md +29 -0
  1087. package/skills/creative/baoyu-infographic/references/styles/hand-drawn-edu.md +63 -0
  1088. package/skills/creative/baoyu-infographic/references/styles/ikea-manual.md +29 -0
  1089. package/skills/creative/baoyu-infographic/references/styles/kawaii.md +29 -0
  1090. package/skills/creative/baoyu-infographic/references/styles/knolling.md +29 -0
  1091. package/skills/creative/baoyu-infographic/references/styles/lego-brick.md +29 -0
  1092. package/skills/creative/baoyu-infographic/references/styles/morandi-journal.md +60 -0
  1093. package/skills/creative/baoyu-infographic/references/styles/origami.md +29 -0
  1094. package/skills/creative/baoyu-infographic/references/styles/pixel-art.md +29 -0
  1095. package/skills/creative/baoyu-infographic/references/styles/pop-laboratory.md +48 -0
  1096. package/skills/creative/baoyu-infographic/references/styles/retro-pop-grid.md +47 -0
  1097. package/skills/creative/baoyu-infographic/references/styles/storybook-watercolor.md +29 -0
  1098. package/skills/creative/baoyu-infographic/references/styles/subway-map.md +29 -0
  1099. package/skills/creative/baoyu-infographic/references/styles/technical-schematic.md +36 -0
  1100. package/skills/creative/baoyu-infographic/references/styles/ui-wireframe.md +29 -0
  1101. package/skills/creative/claude-design/SKILL.md +591 -0
  1102. package/skills/creative/comfyui/SKILL.md +612 -0
  1103. package/skills/creative/comfyui/references/official-cli.md +255 -0
  1104. package/skills/creative/comfyui/references/rest-api.md +312 -0
  1105. package/skills/creative/comfyui/references/template-integrity.md +243 -0
  1106. package/skills/creative/comfyui/references/workflow-format.md +226 -0
  1107. package/skills/creative/comfyui/scripts/_common.py +835 -0
  1108. package/skills/creative/comfyui/scripts/auto_fix_deps.py +225 -0
  1109. package/skills/creative/comfyui/scripts/check_deps.py +437 -0
  1110. package/skills/creative/comfyui/scripts/comfyui_setup.sh +286 -0
  1111. package/skills/creative/comfyui/scripts/extract_schema.py +315 -0
  1112. package/skills/creative/comfyui/scripts/fetch_logs.py +158 -0
  1113. package/skills/creative/comfyui/scripts/hardware_check.py +497 -0
  1114. package/skills/creative/comfyui/scripts/health_check.py +223 -0
  1115. package/skills/creative/comfyui/scripts/run_batch.py +243 -0
  1116. package/skills/creative/comfyui/scripts/run_workflow.py +796 -0
  1117. package/skills/creative/comfyui/scripts/ws_monitor.py +267 -0
  1118. package/skills/creative/comfyui/tests/README.md +50 -0
  1119. package/skills/creative/comfyui/tests/conftest.py +64 -0
  1120. package/skills/creative/comfyui/tests/pytest.ini +5 -0
  1121. package/skills/creative/comfyui/tests/test_check_deps.py +68 -0
  1122. package/skills/creative/comfyui/tests/test_cloud_integration.py +95 -0
  1123. package/skills/creative/comfyui/tests/test_common.py +447 -0
  1124. package/skills/creative/comfyui/tests/test_extract_schema.py +185 -0
  1125. package/skills/creative/comfyui/tests/test_run_workflow.py +213 -0
  1126. package/skills/creative/comfyui/workflows/README.md +86 -0
  1127. package/skills/creative/comfyui/workflows/animatediff_video.json +64 -0
  1128. package/skills/creative/comfyui/workflows/flux_dev_txt2img.json +78 -0
  1129. package/skills/creative/comfyui/workflows/sd15_txt2img.json +49 -0
  1130. package/skills/creative/comfyui/workflows/sdxl_img2img.json +54 -0
  1131. package/skills/creative/comfyui/workflows/sdxl_inpaint.json +59 -0
  1132. package/skills/creative/comfyui/workflows/sdxl_txt2img.json +49 -0
  1133. package/skills/creative/comfyui/workflows/upscale_4x.json +27 -0
  1134. package/skills/creative/comfyui/workflows/wan_video_t2v.json +69 -0
  1135. package/skills/creative/creative-ideation/SKILL.md +152 -0
  1136. package/skills/creative/creative-ideation/references/full-prompt-library.md +110 -0
  1137. package/skills/creative/design-md/SKILL.md +199 -0
  1138. package/skills/creative/design-md/templates/starter.md +99 -0
  1139. package/skills/creative/excalidraw/SKILL.md +199 -0
  1140. package/skills/creative/excalidraw/references/colors.md +44 -0
  1141. package/skills/creative/excalidraw/references/dark-mode.md +68 -0
  1142. package/skills/creative/excalidraw/references/examples.md +141 -0
  1143. package/skills/creative/excalidraw/scripts/upload.py +133 -0
  1144. package/skills/creative/humanizer/LICENSE +21 -0
  1145. package/skills/creative/humanizer/SKILL.md +578 -0
  1146. package/skills/creative/manim-video/README.md +23 -0
  1147. package/skills/creative/manim-video/SKILL.md +269 -0
  1148. package/skills/creative/manim-video/references/animation-design-thinking.md +161 -0
  1149. package/skills/creative/manim-video/references/animations.md +282 -0
  1150. package/skills/creative/manim-video/references/camera-and-3d.md +135 -0
  1151. package/skills/creative/manim-video/references/decorations.md +202 -0
  1152. package/skills/creative/manim-video/references/equations.md +216 -0
  1153. package/skills/creative/manim-video/references/graphs-and-data.md +163 -0
  1154. package/skills/creative/manim-video/references/mobjects.md +333 -0
  1155. package/skills/creative/manim-video/references/paper-explainer.md +255 -0
  1156. package/skills/creative/manim-video/references/production-quality.md +190 -0
  1157. package/skills/creative/manim-video/references/rendering.md +185 -0
  1158. package/skills/creative/manim-video/references/scene-planning.md +118 -0
  1159. package/skills/creative/manim-video/references/troubleshooting.md +135 -0
  1160. package/skills/creative/manim-video/references/updaters-and-trackers.md +260 -0
  1161. package/skills/creative/manim-video/references/visual-design.md +124 -0
  1162. package/skills/creative/manim-video/scripts/setup.sh +14 -0
  1163. package/skills/creative/p5js/README.md +64 -0
  1164. package/skills/creative/p5js/SKILL.md +556 -0
  1165. package/skills/creative/p5js/references/animation.md +439 -0
  1166. package/skills/creative/p5js/references/color-systems.md +352 -0
  1167. package/skills/creative/p5js/references/core-api.md +410 -0
  1168. package/skills/creative/p5js/references/export-pipeline.md +566 -0
  1169. package/skills/creative/p5js/references/interaction.md +398 -0
  1170. package/skills/creative/p5js/references/shapes-and-geometry.md +300 -0
  1171. package/skills/creative/p5js/references/troubleshooting.md +532 -0
  1172. package/skills/creative/p5js/references/typography.md +302 -0
  1173. package/skills/creative/p5js/references/visual-effects.md +895 -0
  1174. package/skills/creative/p5js/references/webgl-and-3d.md +423 -0
  1175. package/skills/creative/p5js/scripts/export-frames.js +179 -0
  1176. package/skills/creative/p5js/scripts/render.sh +108 -0
  1177. package/skills/creative/p5js/scripts/serve.sh +28 -0
  1178. package/skills/creative/p5js/scripts/setup.sh +87 -0
  1179. package/skills/creative/p5js/templates/viewer.html +395 -0
  1180. package/skills/creative/pixel-art/ATTRIBUTION.md +54 -0
  1181. package/skills/creative/pixel-art/SKILL.md +218 -0
  1182. package/skills/creative/pixel-art/references/palettes.md +49 -0
  1183. package/skills/creative/pixel-art/scripts/__init__.py +0 -0
  1184. package/skills/creative/pixel-art/scripts/palettes.py +167 -0
  1185. package/skills/creative/pixel-art/scripts/pixel_art.py +162 -0
  1186. package/skills/creative/pixel-art/scripts/pixel_art_video.py +345 -0
  1187. package/skills/creative/popular-web-designs/SKILL.md +214 -0
  1188. package/skills/creative/popular-web-designs/templates/airbnb.md +259 -0
  1189. package/skills/creative/popular-web-designs/templates/airtable.md +102 -0
  1190. package/skills/creative/popular-web-designs/templates/apple.md +326 -0
  1191. package/skills/creative/popular-web-designs/templates/bmw.md +193 -0
  1192. package/skills/creative/popular-web-designs/templates/cal.md +272 -0
  1193. package/skills/creative/popular-web-designs/templates/claude.md +325 -0
  1194. package/skills/creative/popular-web-designs/templates/clay.md +317 -0
  1195. package/skills/creative/popular-web-designs/templates/clickhouse.md +294 -0
  1196. package/skills/creative/popular-web-designs/templates/cohere.md +279 -0
  1197. package/skills/creative/popular-web-designs/templates/coinbase.md +142 -0
  1198. package/skills/creative/popular-web-designs/templates/composio.md +320 -0
  1199. package/skills/creative/popular-web-designs/templates/cursor.md +322 -0
  1200. package/skills/creative/popular-web-designs/templates/elevenlabs.md +278 -0
  1201. package/skills/creative/popular-web-designs/templates/expo.md +294 -0
  1202. package/skills/creative/popular-web-designs/templates/figma.md +233 -0
  1203. package/skills/creative/popular-web-designs/templates/framer.md +259 -0
  1204. package/skills/creative/popular-web-designs/templates/hashicorp.md +291 -0
  1205. package/skills/creative/popular-web-designs/templates/ibm.md +345 -0
  1206. package/skills/creative/popular-web-designs/templates/intercom.md +159 -0
  1207. package/skills/creative/popular-web-designs/templates/kraken.md +138 -0
  1208. package/skills/creative/popular-web-designs/templates/linear.app.md +380 -0
  1209. package/skills/creative/popular-web-designs/templates/lovable.md +311 -0
  1210. package/skills/creative/popular-web-designs/templates/minimax.md +270 -0
  1211. package/skills/creative/popular-web-designs/templates/mintlify.md +339 -0
  1212. package/skills/creative/popular-web-designs/templates/miro.md +121 -0
  1213. package/skills/creative/popular-web-designs/templates/mistral.ai.md +274 -0
  1214. package/skills/creative/popular-web-designs/templates/mongodb.md +279 -0
  1215. package/skills/creative/popular-web-designs/templates/notion.md +322 -0
  1216. package/skills/creative/popular-web-designs/templates/nvidia.md +306 -0
  1217. package/skills/creative/popular-web-designs/templates/ollama.md +280 -0
  1218. package/skills/creative/popular-web-designs/templates/opencode.ai.md +294 -0
  1219. package/skills/creative/popular-web-designs/templates/pinterest.md +243 -0
  1220. package/skills/creative/popular-web-designs/templates/posthog.md +269 -0
  1221. package/skills/creative/popular-web-designs/templates/raycast.md +281 -0
  1222. package/skills/creative/popular-web-designs/templates/replicate.md +274 -0
  1223. package/skills/creative/popular-web-designs/templates/resend.md +316 -0
  1224. package/skills/creative/popular-web-designs/templates/revolut.md +198 -0
  1225. package/skills/creative/popular-web-designs/templates/runwayml.md +257 -0
  1226. package/skills/creative/popular-web-designs/templates/sanity.md +370 -0
  1227. package/skills/creative/popular-web-designs/templates/sentry.md +275 -0
  1228. package/skills/creative/popular-web-designs/templates/spacex.md +207 -0
  1229. package/skills/creative/popular-web-designs/templates/spotify.md +259 -0
  1230. package/skills/creative/popular-web-designs/templates/stripe.md +335 -0
  1231. package/skills/creative/popular-web-designs/templates/supabase.md +268 -0
  1232. package/skills/creative/popular-web-designs/templates/superhuman.md +265 -0
  1233. package/skills/creative/popular-web-designs/templates/together.ai.md +276 -0
  1234. package/skills/creative/popular-web-designs/templates/uber.md +308 -0
  1235. package/skills/creative/popular-web-designs/templates/vercel.md +323 -0
  1236. package/skills/creative/popular-web-designs/templates/voltagent.md +336 -0
  1237. package/skills/creative/popular-web-designs/templates/warp.md +266 -0
  1238. package/skills/creative/popular-web-designs/templates/webflow.md +105 -0
  1239. package/skills/creative/popular-web-designs/templates/wise.md +186 -0
  1240. package/skills/creative/popular-web-designs/templates/x.ai.md +270 -0
  1241. package/skills/creative/popular-web-designs/templates/zapier.md +341 -0
  1242. package/skills/creative/pretext/SKILL.md +220 -0
  1243. package/skills/creative/pretext/references/patterns.md +258 -0
  1244. package/skills/creative/pretext/templates/donut-orbit.html +1468 -0
  1245. package/skills/creative/pretext/templates/hello-orb-flow.html +95 -0
  1246. package/skills/creative/sketch/SKILL.md +218 -0
  1247. package/skills/creative/songwriting-and-ai-music/SKILL.md +287 -0
  1248. package/skills/creative/touchdesigner-mcp/SKILL.md +356 -0
  1249. package/skills/creative/touchdesigner-mcp/references/3d-scene.md +275 -0
  1250. package/skills/creative/touchdesigner-mcp/references/animation.md +221 -0
  1251. package/skills/creative/touchdesigner-mcp/references/audio-reactive.md +175 -0
  1252. package/skills/creative/touchdesigner-mcp/references/dat-scripting.md +352 -0
  1253. package/skills/creative/touchdesigner-mcp/references/external-data.md +322 -0
  1254. package/skills/creative/touchdesigner-mcp/references/geometry-comp.md +121 -0
  1255. package/skills/creative/touchdesigner-mcp/references/glsl.md +151 -0
  1256. package/skills/creative/touchdesigner-mcp/references/layout-compositor.md +131 -0
  1257. package/skills/creative/touchdesigner-mcp/references/mcp-tools.md +382 -0
  1258. package/skills/creative/touchdesigner-mcp/references/midi-osc.md +211 -0
  1259. package/skills/creative/touchdesigner-mcp/references/network-patterns.md +966 -0
  1260. package/skills/creative/touchdesigner-mcp/references/operator-tips.md +106 -0
  1261. package/skills/creative/touchdesigner-mcp/references/operators.md +239 -0
  1262. package/skills/creative/touchdesigner-mcp/references/panel-ui.md +281 -0
  1263. package/skills/creative/touchdesigner-mcp/references/particles.md +245 -0
  1264. package/skills/creative/touchdesigner-mcp/references/pitfalls.md +704 -0
  1265. package/skills/creative/touchdesigner-mcp/references/postfx.md +183 -0
  1266. package/skills/creative/touchdesigner-mcp/references/projection-mapping.md +211 -0
  1267. package/skills/creative/touchdesigner-mcp/references/python-api.md +463 -0
  1268. package/skills/creative/touchdesigner-mcp/references/replicator.md +198 -0
  1269. package/skills/creative/touchdesigner-mcp/references/troubleshooting.md +244 -0
  1270. package/skills/creative/touchdesigner-mcp/scripts/setup.sh +115 -0
  1271. package/skills/data-science/DESCRIPTION.md +3 -0
  1272. package/skills/data-science/jupyter-live-kernel/SKILL.md +167 -0
  1273. package/skills/devops/kanban-orchestrator/SKILL.md +189 -0
  1274. package/skills/devops/kanban-worker/SKILL.md +184 -0
  1275. package/skills/devops/webhook-subscriptions/SKILL.md +204 -0
  1276. package/skills/diagramming/DESCRIPTION.md +3 -0
  1277. package/skills/dogfood/SKILL.md +162 -0
  1278. package/skills/dogfood/references/issue-taxonomy.md +109 -0
  1279. package/skills/dogfood/templates/dogfood-report-template.md +86 -0
  1280. package/skills/domain/DESCRIPTION.md +24 -0
  1281. package/skills/email/DESCRIPTION.md +3 -0
  1282. package/skills/email/himalaya/SKILL.md +299 -0
  1283. package/skills/email/himalaya/references/configuration.md +227 -0
  1284. package/skills/email/himalaya/references/message-composition.md +199 -0
  1285. package/skills/gaming/DESCRIPTION.md +3 -0
  1286. package/skills/gaming/minecraft-modpack-server/SKILL.md +187 -0
  1287. package/skills/gaming/pokemon-player/SKILL.md +216 -0
  1288. package/skills/gifs/DESCRIPTION.md +3 -0
  1289. package/skills/github/DESCRIPTION.md +3 -0
  1290. package/skills/github/codebase-inspection/SKILL.md +116 -0
  1291. package/skills/github/github-auth/SKILL.md +247 -0
  1292. package/skills/github/github-auth/scripts/gh-env.sh +66 -0
  1293. package/skills/github/github-code-review/SKILL.md +481 -0
  1294. package/skills/github/github-code-review/references/review-output-template.md +74 -0
  1295. package/skills/github/github-issues/SKILL.md +370 -0
  1296. package/skills/github/github-issues/templates/bug-report.md +35 -0
  1297. package/skills/github/github-issues/templates/feature-request.md +31 -0
  1298. package/skills/github/github-pr-workflow/SKILL.md +367 -0
  1299. package/skills/github/github-pr-workflow/references/ci-troubleshooting.md +183 -0
  1300. package/skills/github/github-pr-workflow/references/conventional-commits.md +71 -0
  1301. package/skills/github/github-pr-workflow/templates/pr-body-bugfix.md +35 -0
  1302. package/skills/github/github-pr-workflow/templates/pr-body-feature.md +33 -0
  1303. package/skills/github/github-repo-management/SKILL.md +516 -0
  1304. package/skills/github/github-repo-management/references/github-api-cheatsheet.md +161 -0
  1305. package/skills/index-cache/anthropics_skills_skills_.json +1 -0
  1306. package/skills/index-cache/claude_marketplace_anthropics_skills.json +1 -0
  1307. package/skills/index-cache/lobehub_index.json +1 -0
  1308. package/skills/index-cache/openai_skills_skills_.json +1 -0
  1309. package/skills/inference-sh/DESCRIPTION.md +19 -0
  1310. package/skills/mcp/DESCRIPTION.md +3 -0
  1311. package/skills/mcp/native-mcp/SKILL.md +357 -0
  1312. package/skills/media/DESCRIPTION.md +3 -0
  1313. package/skills/media/gif-search/SKILL.md +91 -0
  1314. package/skills/media/heartmula/SKILL.md +171 -0
  1315. package/skills/media/songsee/SKILL.md +83 -0
  1316. package/skills/media/spotify/SKILL.md +135 -0
  1317. package/skills/media/youtube-content/SKILL.md +73 -0
  1318. package/skills/media/youtube-content/references/output-formats.md +56 -0
  1319. package/skills/media/youtube-content/scripts/fetch_transcript.py +124 -0
  1320. package/skills/mlops/DESCRIPTION.md +3 -0
  1321. package/skills/mlops/evaluation/DESCRIPTION.md +3 -0
  1322. package/skills/mlops/evaluation/lm-evaluation-harness/SKILL.md +498 -0
  1323. package/skills/mlops/evaluation/lm-evaluation-harness/references/api-evaluation.md +490 -0
  1324. package/skills/mlops/evaluation/lm-evaluation-harness/references/benchmark-guide.md +488 -0
  1325. package/skills/mlops/evaluation/lm-evaluation-harness/references/custom-tasks.md +602 -0
  1326. package/skills/mlops/evaluation/lm-evaluation-harness/references/distributed-eval.md +519 -0
  1327. package/skills/mlops/evaluation/weights-and-biases/SKILL.md +594 -0
  1328. package/skills/mlops/evaluation/weights-and-biases/references/artifacts.md +584 -0
  1329. package/skills/mlops/evaluation/weights-and-biases/references/integrations.md +700 -0
  1330. package/skills/mlops/evaluation/weights-and-biases/references/sweeps.md +847 -0
  1331. package/skills/mlops/huggingface-hub/SKILL.md +81 -0
  1332. package/skills/mlops/inference/DESCRIPTION.md +3 -0
  1333. package/skills/mlops/inference/llama-cpp/SKILL.md +249 -0
  1334. package/skills/mlops/inference/llama-cpp/references/advanced-usage.md +504 -0
  1335. package/skills/mlops/inference/llama-cpp/references/hub-discovery.md +168 -0
  1336. package/skills/mlops/inference/llama-cpp/references/optimization.md +89 -0
  1337. package/skills/mlops/inference/llama-cpp/references/quantization.md +243 -0
  1338. package/skills/mlops/inference/llama-cpp/references/server.md +150 -0
  1339. package/skills/mlops/inference/llama-cpp/references/troubleshooting.md +442 -0
  1340. package/skills/mlops/inference/obliteratus/SKILL.md +342 -0
  1341. package/skills/mlops/inference/obliteratus/references/analysis-modules.md +166 -0
  1342. package/skills/mlops/inference/obliteratus/references/methods-guide.md +141 -0
  1343. package/skills/mlops/inference/obliteratus/templates/abliteration-config.yaml +33 -0
  1344. package/skills/mlops/inference/obliteratus/templates/analysis-study.yaml +40 -0
  1345. package/skills/mlops/inference/obliteratus/templates/batch-abliteration.yaml +41 -0
  1346. package/skills/mlops/inference/vllm/SKILL.md +372 -0
  1347. package/skills/mlops/inference/vllm/references/optimization.md +226 -0
  1348. package/skills/mlops/inference/vllm/references/quantization.md +284 -0
  1349. package/skills/mlops/inference/vllm/references/server-deployment.md +255 -0
  1350. package/skills/mlops/inference/vllm/references/troubleshooting.md +447 -0
  1351. package/skills/mlops/models/DESCRIPTION.md +3 -0
  1352. package/skills/mlops/models/audiocraft/SKILL.md +568 -0
  1353. package/skills/mlops/models/audiocraft/references/advanced-usage.md +666 -0
  1354. package/skills/mlops/models/audiocraft/references/troubleshooting.md +504 -0
  1355. package/skills/mlops/models/segment-anything/SKILL.md +506 -0
  1356. package/skills/mlops/models/segment-anything/references/advanced-usage.md +589 -0
  1357. package/skills/mlops/models/segment-anything/references/troubleshooting.md +484 -0
  1358. package/skills/mlops/research/DESCRIPTION.md +3 -0
  1359. package/skills/mlops/research/dspy/SKILL.md +594 -0
  1360. package/skills/mlops/research/dspy/references/examples.md +663 -0
  1361. package/skills/mlops/research/dspy/references/modules.md +475 -0
  1362. package/skills/mlops/research/dspy/references/optimizers.md +566 -0
  1363. package/skills/mlops/training/DESCRIPTION.md +3 -0
  1364. package/skills/mlops/vector-databases/DESCRIPTION.md +3 -0
  1365. package/skills/note-taking/DESCRIPTION.md +3 -0
  1366. package/skills/note-taking/obsidian/SKILL.md +61 -0
  1367. package/skills/productivity/DESCRIPTION.md +3 -0
  1368. package/skills/productivity/airtable/SKILL.md +229 -0
  1369. package/skills/productivity/google-workspace/SKILL.md +335 -0
  1370. package/skills/productivity/google-workspace/references/gmail-search-syntax.md +63 -0
  1371. package/skills/productivity/google-workspace/scripts/_hermes_home.py +43 -0
  1372. package/skills/productivity/google-workspace/scripts/google_api.py +1221 -0
  1373. package/skills/productivity/google-workspace/scripts/gws_bridge.py +108 -0
  1374. package/skills/productivity/google-workspace/scripts/setup.py +454 -0
  1375. package/skills/productivity/linear/SKILL.md +380 -0
  1376. package/skills/productivity/linear/scripts/linear_api.py +445 -0
  1377. package/skills/productivity/maps/SKILL.md +195 -0
  1378. package/skills/productivity/maps/scripts/maps_client.py +1298 -0
  1379. package/skills/productivity/nano-pdf/SKILL.md +52 -0
  1380. package/skills/productivity/notion/SKILL.md +448 -0
  1381. package/skills/productivity/notion/references/block-types.md +112 -0
  1382. package/skills/productivity/ocr-and-documents/DESCRIPTION.md +3 -0
  1383. package/skills/productivity/ocr-and-documents/SKILL.md +172 -0
  1384. package/skills/productivity/ocr-and-documents/scripts/extract_marker.py +87 -0
  1385. package/skills/productivity/ocr-and-documents/scripts/extract_pymupdf.py +98 -0
  1386. package/skills/productivity/powerpoint/LICENSE.txt +30 -0
  1387. package/skills/productivity/powerpoint/SKILL.md +237 -0
  1388. package/skills/productivity/powerpoint/editing.md +205 -0
  1389. package/skills/productivity/powerpoint/pptxgenjs.md +420 -0
  1390. package/skills/productivity/powerpoint/scripts/__init__.py +0 -0
  1391. package/skills/productivity/powerpoint/scripts/add_slide.py +195 -0
  1392. package/skills/productivity/powerpoint/scripts/clean.py +286 -0
  1393. package/skills/productivity/powerpoint/scripts/office/helpers/__init__.py +0 -0
  1394. package/skills/productivity/powerpoint/scripts/office/helpers/merge_runs.py +199 -0
  1395. package/skills/productivity/powerpoint/scripts/office/helpers/simplify_redlines.py +197 -0
  1396. package/skills/productivity/powerpoint/scripts/office/pack.py +159 -0
  1397. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  1398. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  1399. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  1400. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  1401. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  1402. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  1403. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  1404. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  1405. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  1406. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  1407. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  1408. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  1409. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  1410. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  1411. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  1412. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  1413. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  1414. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  1415. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  1416. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  1417. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  1418. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  1419. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  1420. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  1421. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  1422. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  1423. package/skills/productivity/powerpoint/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  1424. package/skills/productivity/powerpoint/scripts/office/schemas/ecma/fourth-edition/opc-contentTypes.xsd +42 -0
  1425. package/skills/productivity/powerpoint/scripts/office/schemas/ecma/fourth-edition/opc-coreProperties.xsd +50 -0
  1426. package/skills/productivity/powerpoint/scripts/office/schemas/ecma/fourth-edition/opc-digSig.xsd +49 -0
  1427. package/skills/productivity/powerpoint/scripts/office/schemas/ecma/fourth-edition/opc-relationships.xsd +33 -0
  1428. package/skills/productivity/powerpoint/scripts/office/schemas/mce/mc.xsd +75 -0
  1429. package/skills/productivity/powerpoint/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  1430. package/skills/productivity/powerpoint/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  1431. package/skills/productivity/powerpoint/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  1432. package/skills/productivity/powerpoint/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  1433. package/skills/productivity/powerpoint/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  1434. package/skills/productivity/powerpoint/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  1435. package/skills/productivity/powerpoint/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  1436. package/skills/productivity/teams-meeting-pipeline/SKILL.md +116 -0
  1437. package/skills/red-teaming/godmode/SKILL.md +404 -0
  1438. package/skills/red-teaming/godmode/references/jailbreak-templates.md +128 -0
  1439. package/skills/red-teaming/godmode/references/refusal-detection.md +142 -0
  1440. package/skills/red-teaming/godmode/scripts/auto_jailbreak.py +769 -0
  1441. package/skills/red-teaming/godmode/scripts/godmode_race.py +530 -0
  1442. package/skills/red-teaming/godmode/scripts/load_godmode.py +45 -0
  1443. package/skills/red-teaming/godmode/scripts/parseltongue.py +550 -0
  1444. package/skills/red-teaming/godmode/templates/prefill-subtle.json +10 -0
  1445. package/skills/red-teaming/godmode/templates/prefill.json +18 -0
  1446. package/skills/research/DESCRIPTION.md +3 -0
  1447. package/skills/research/arxiv/SKILL.md +282 -0
  1448. package/skills/research/arxiv/scripts/search_arxiv.py +114 -0
  1449. package/skills/research/blogwatcher/SKILL.md +137 -0
  1450. package/skills/research/llm-wiki/SKILL.md +507 -0
  1451. package/skills/research/polymarket/SKILL.md +77 -0
  1452. package/skills/research/polymarket/references/api-endpoints.md +220 -0
  1453. package/skills/research/polymarket/scripts/polymarket.py +284 -0
  1454. package/skills/research/research-paper-writing/SKILL.md +2377 -0
  1455. package/skills/research/research-paper-writing/references/autoreason-methodology.md +394 -0
  1456. package/skills/research/research-paper-writing/references/checklists.md +434 -0
  1457. package/skills/research/research-paper-writing/references/citation-workflow.md +564 -0
  1458. package/skills/research/research-paper-writing/references/experiment-patterns.md +728 -0
  1459. package/skills/research/research-paper-writing/references/human-evaluation.md +476 -0
  1460. package/skills/research/research-paper-writing/references/paper-types.md +481 -0
  1461. package/skills/research/research-paper-writing/references/reviewer-guidelines.md +433 -0
  1462. package/skills/research/research-paper-writing/references/sources.md +191 -0
  1463. package/skills/research/research-paper-writing/references/writing-guide.md +474 -0
  1464. package/skills/research/research-paper-writing/templates/README.md +251 -0
  1465. package/skills/research/research-paper-writing/templates/aaai2026/README.md +534 -0
  1466. package/skills/research/research-paper-writing/templates/aaai2026/aaai2026-unified-supp.tex +144 -0
  1467. package/skills/research/research-paper-writing/templates/aaai2026/aaai2026-unified-template.tex +952 -0
  1468. package/skills/research/research-paper-writing/templates/aaai2026/aaai2026.bib +111 -0
  1469. package/skills/research/research-paper-writing/templates/aaai2026/aaai2026.bst +1493 -0
  1470. package/skills/research/research-paper-writing/templates/aaai2026/aaai2026.sty +315 -0
  1471. package/skills/research/research-paper-writing/templates/acl/README.md +50 -0
  1472. package/skills/research/research-paper-writing/templates/acl/acl.sty +312 -0
  1473. package/skills/research/research-paper-writing/templates/acl/acl_latex.tex +377 -0
  1474. package/skills/research/research-paper-writing/templates/acl/acl_lualatex.tex +101 -0
  1475. package/skills/research/research-paper-writing/templates/acl/acl_natbib.bst +1940 -0
  1476. package/skills/research/research-paper-writing/templates/acl/anthology.bib.txt +26 -0
  1477. package/skills/research/research-paper-writing/templates/acl/custom.bib +70 -0
  1478. package/skills/research/research-paper-writing/templates/acl/formatting.md +326 -0
  1479. package/skills/research/research-paper-writing/templates/colm2025/README.md +3 -0
  1480. package/skills/research/research-paper-writing/templates/colm2025/colm2025_conference.bib +11 -0
  1481. package/skills/research/research-paper-writing/templates/colm2025/colm2025_conference.bst +1440 -0
  1482. package/skills/research/research-paper-writing/templates/colm2025/colm2025_conference.pdf +0 -0
  1483. package/skills/research/research-paper-writing/templates/colm2025/colm2025_conference.sty +218 -0
  1484. package/skills/research/research-paper-writing/templates/colm2025/colm2025_conference.tex +305 -0
  1485. package/skills/research/research-paper-writing/templates/colm2025/fancyhdr.sty +485 -0
  1486. package/skills/research/research-paper-writing/templates/colm2025/math_commands.tex +508 -0
  1487. package/skills/research/research-paper-writing/templates/colm2025/natbib.sty +1246 -0
  1488. package/skills/research/research-paper-writing/templates/iclr2026/fancyhdr.sty +485 -0
  1489. package/skills/research/research-paper-writing/templates/iclr2026/iclr2026_conference.bib +24 -0
  1490. package/skills/research/research-paper-writing/templates/iclr2026/iclr2026_conference.bst +1440 -0
  1491. package/skills/research/research-paper-writing/templates/iclr2026/iclr2026_conference.pdf +0 -0
  1492. package/skills/research/research-paper-writing/templates/iclr2026/iclr2026_conference.sty +246 -0
  1493. package/skills/research/research-paper-writing/templates/iclr2026/iclr2026_conference.tex +414 -0
  1494. package/skills/research/research-paper-writing/templates/iclr2026/math_commands.tex +508 -0
  1495. package/skills/research/research-paper-writing/templates/iclr2026/natbib.sty +1246 -0
  1496. package/skills/research/research-paper-writing/templates/icml2026/algorithm.sty +79 -0
  1497. package/skills/research/research-paper-writing/templates/icml2026/algorithmic.sty +201 -0
  1498. package/skills/research/research-paper-writing/templates/icml2026/example_paper.bib +75 -0
  1499. package/skills/research/research-paper-writing/templates/icml2026/example_paper.pdf +0 -0
  1500. package/skills/research/research-paper-writing/templates/icml2026/example_paper.tex +662 -0
  1501. package/skills/research/research-paper-writing/templates/icml2026/fancyhdr.sty +864 -0
  1502. package/skills/research/research-paper-writing/templates/icml2026/icml2026.bst +1443 -0
  1503. package/skills/research/research-paper-writing/templates/icml2026/icml2026.sty +767 -0
  1504. package/skills/research/research-paper-writing/templates/icml2026/icml_numpapers.pdf +0 -0
  1505. package/skills/research/research-paper-writing/templates/neurips2025/Makefile +36 -0
  1506. package/skills/research/research-paper-writing/templates/neurips2025/extra_pkgs.tex +53 -0
  1507. package/skills/research/research-paper-writing/templates/neurips2025/main.tex +38 -0
  1508. package/skills/research/research-paper-writing/templates/neurips2025/neurips.sty +382 -0
  1509. package/skills/smart-home/DESCRIPTION.md +3 -0
  1510. package/skills/smart-home/openhue/SKILL.md +109 -0
  1511. package/skills/social-media/DESCRIPTION.md +3 -0
  1512. package/skills/social-media/xurl/SKILL.md +414 -0
  1513. package/skills/software-development/debugging-hermes-tui-commands/SKILL.md +152 -0
  1514. package/skills/software-development/hermes-agent-skill-authoring/SKILL.md +165 -0
  1515. package/skills/software-development/node-inspect-debugger/SKILL.md +319 -0
  1516. package/skills/software-development/plan/SKILL.md +58 -0
  1517. package/skills/software-development/python-debugpy/SKILL.md +375 -0
  1518. package/skills/software-development/requesting-code-review/SKILL.md +280 -0
  1519. package/skills/software-development/spike/SKILL.md +197 -0
  1520. package/skills/software-development/subagent-driven-development/SKILL.md +352 -0
  1521. package/skills/software-development/subagent-driven-development/references/context-budget-discipline.md +53 -0
  1522. package/skills/software-development/subagent-driven-development/references/gates-taxonomy.md +93 -0
  1523. package/skills/software-development/systematic-debugging/SKILL.md +367 -0
  1524. package/skills/software-development/test-driven-development/SKILL.md +343 -0
  1525. package/skills/software-development/writing-plans/SKILL.md +297 -0
  1526. package/skills/yuanbao/SKILL.md +108 -0
  1527. package/tools/__init__.py +25 -0
  1528. package/tools/__pycache__/__init__.cpython-312.pyc +0 -0
  1529. package/tools/__pycache__/approval.cpython-312.pyc +0 -0
  1530. package/tools/__pycache__/binary_extensions.cpython-312.pyc +0 -0
  1531. package/tools/__pycache__/browser_camofox.cpython-312.pyc +0 -0
  1532. package/tools/__pycache__/browser_camofox_state.cpython-312.pyc +0 -0
  1533. package/tools/__pycache__/browser_cdp_tool.cpython-312.pyc +0 -0
  1534. package/tools/__pycache__/browser_dialog_tool.cpython-312.pyc +0 -0
  1535. package/tools/__pycache__/browser_supervisor.cpython-312.pyc +0 -0
  1536. package/tools/__pycache__/browser_tool.cpython-312.pyc +0 -0
  1537. package/tools/__pycache__/budget_config.cpython-312.pyc +0 -0
  1538. package/tools/__pycache__/checkpoint_manager.cpython-312.pyc +0 -0
  1539. package/tools/__pycache__/clarify_gateway.cpython-312.pyc +0 -0
  1540. package/tools/__pycache__/clarify_tool.cpython-312.pyc +0 -0
  1541. package/tools/__pycache__/code_execution_tool.cpython-312.pyc +0 -0
  1542. package/tools/__pycache__/computer_use_tool.cpython-312.pyc +0 -0
  1543. package/tools/__pycache__/cronjob_tools.cpython-312.pyc +0 -0
  1544. package/tools/__pycache__/debug_helpers.cpython-312.pyc +0 -0
  1545. package/tools/__pycache__/delegate_tool.cpython-312.pyc +0 -0
  1546. package/tools/__pycache__/discord_tool.cpython-312.pyc +0 -0
  1547. package/tools/__pycache__/feishu_doc_tool.cpython-312.pyc +0 -0
  1548. package/tools/__pycache__/feishu_drive_tool.cpython-312.pyc +0 -0
  1549. package/tools/__pycache__/file_operations.cpython-312.pyc +0 -0
  1550. package/tools/__pycache__/file_state.cpython-312.pyc +0 -0
  1551. package/tools/__pycache__/file_tools.cpython-312.pyc +0 -0
  1552. package/tools/__pycache__/homeassistant_tool.cpython-312.pyc +0 -0
  1553. package/tools/__pycache__/image_generation_tool.cpython-312.pyc +0 -0
  1554. package/tools/__pycache__/interrupt.cpython-312.pyc +0 -0
  1555. package/tools/__pycache__/kanban_tools.cpython-312.pyc +0 -0
  1556. package/tools/__pycache__/lazy_deps.cpython-312.pyc +0 -0
  1557. package/tools/__pycache__/managed_tool_gateway.cpython-312.pyc +0 -0
  1558. package/tools/__pycache__/mcp_tool.cpython-312.pyc +0 -0
  1559. package/tools/__pycache__/memory_tool.cpython-312.pyc +0 -0
  1560. package/tools/__pycache__/mixture_of_agents_tool.cpython-312.pyc +0 -0
  1561. package/tools/__pycache__/openrouter_client.cpython-312.pyc +0 -0
  1562. package/tools/__pycache__/process_registry.cpython-312.pyc +0 -0
  1563. package/tools/__pycache__/registry.cpython-312.pyc +0 -0
  1564. package/tools/__pycache__/schema_sanitizer.cpython-312.pyc +0 -0
  1565. package/tools/__pycache__/send_message_tool.cpython-312.pyc +0 -0
  1566. package/tools/__pycache__/session_search_tool.cpython-312.pyc +0 -0
  1567. package/tools/__pycache__/skill_manager_tool.cpython-312.pyc +0 -0
  1568. package/tools/__pycache__/skill_provenance.cpython-312.pyc +0 -0
  1569. package/tools/__pycache__/skill_usage.cpython-312.pyc +0 -0
  1570. package/tools/__pycache__/skills_guard.cpython-312.pyc +0 -0
  1571. package/tools/__pycache__/skills_sync.cpython-312.pyc +0 -0
  1572. package/tools/__pycache__/skills_tool.cpython-312.pyc +0 -0
  1573. package/tools/__pycache__/slash_confirm.cpython-312.pyc +0 -0
  1574. package/tools/__pycache__/terminal_tool.cpython-312.pyc +0 -0
  1575. package/tools/__pycache__/tirith_security.cpython-312.pyc +0 -0
  1576. package/tools/__pycache__/todo_tool.cpython-312.pyc +0 -0
  1577. package/tools/__pycache__/tool_backend_helpers.cpython-312.pyc +0 -0
  1578. package/tools/__pycache__/tool_result_storage.cpython-312.pyc +0 -0
  1579. package/tools/__pycache__/tts_tool.cpython-312.pyc +0 -0
  1580. package/tools/__pycache__/url_safety.cpython-312.pyc +0 -0
  1581. package/tools/__pycache__/video_generation_tool.cpython-312.pyc +0 -0
  1582. package/tools/__pycache__/vision_tools.cpython-312.pyc +0 -0
  1583. package/tools/__pycache__/voice_mode.cpython-312.pyc +0 -0
  1584. package/tools/__pycache__/web_tools.cpython-312.pyc +0 -0
  1585. package/tools/__pycache__/website_policy.cpython-312.pyc +0 -0
  1586. package/tools/__pycache__/x_search_tool.cpython-312.pyc +0 -0
  1587. package/tools/__pycache__/xai_http.cpython-312.pyc +0 -0
  1588. package/tools/__pycache__/yuanbao_tools.cpython-312.pyc +0 -0
  1589. package/tools/ansi_strip.py +44 -0
  1590. package/tools/approval.py +1392 -0
  1591. package/tools/binary_extensions.py +42 -0
  1592. package/tools/browser_camofox.py +700 -0
  1593. package/tools/browser_camofox_state.py +48 -0
  1594. package/tools/browser_cdp_tool.py +569 -0
  1595. package/tools/browser_dialog_tool.py +148 -0
  1596. package/tools/browser_providers/__init__.py +10 -0
  1597. package/tools/browser_providers/__pycache__/__init__.cpython-312.pyc +0 -0
  1598. package/tools/browser_providers/__pycache__/base.cpython-312.pyc +0 -0
  1599. package/tools/browser_providers/__pycache__/browser_use.cpython-312.pyc +0 -0
  1600. package/tools/browser_providers/__pycache__/browserbase.cpython-312.pyc +0 -0
  1601. package/tools/browser_providers/__pycache__/firecrawl.cpython-312.pyc +0 -0
  1602. package/tools/browser_providers/base.py +59 -0
  1603. package/tools/browser_providers/browser_use.py +225 -0
  1604. package/tools/browser_providers/browserbase.py +222 -0
  1605. package/tools/browser_providers/firecrawl.py +112 -0
  1606. package/tools/browser_supervisor.py +1457 -0
  1607. package/tools/browser_tool.py +3676 -0
  1608. package/tools/budget_config.py +51 -0
  1609. package/tools/checkpoint_manager.py +1639 -0
  1610. package/tools/clarify_gateway.py +278 -0
  1611. package/tools/clarify_tool.py +141 -0
  1612. package/tools/code_execution_tool.py +1782 -0
  1613. package/tools/computer_use/__init__.py +43 -0
  1614. package/tools/computer_use/__pycache__/__init__.cpython-312.pyc +0 -0
  1615. package/tools/computer_use/__pycache__/backend.cpython-312.pyc +0 -0
  1616. package/tools/computer_use/__pycache__/schema.cpython-312.pyc +0 -0
  1617. package/tools/computer_use/__pycache__/tool.cpython-312.pyc +0 -0
  1618. package/tools/computer_use/backend.py +150 -0
  1619. package/tools/computer_use/cua_backend.py +682 -0
  1620. package/tools/computer_use/schema.py +191 -0
  1621. package/tools/computer_use/tool.py +521 -0
  1622. package/tools/computer_use_tool.py +39 -0
  1623. package/tools/credential_files.py +437 -0
  1624. package/tools/cronjob_tools.py +719 -0
  1625. package/tools/debug_helpers.py +106 -0
  1626. package/tools/delegate_tool.py +2797 -0
  1627. package/tools/discord_tool.py +959 -0
  1628. package/tools/env_passthrough.py +145 -0
  1629. package/tools/environments/__init__.py +14 -0
  1630. package/tools/environments/__pycache__/__init__.cpython-312.pyc +0 -0
  1631. package/tools/environments/__pycache__/base.cpython-312.pyc +0 -0
  1632. package/tools/environments/__pycache__/docker.cpython-312.pyc +0 -0
  1633. package/tools/environments/__pycache__/file_sync.cpython-312.pyc +0 -0
  1634. package/tools/environments/__pycache__/local.cpython-312.pyc +0 -0
  1635. package/tools/environments/__pycache__/managed_modal.cpython-312.pyc +0 -0
  1636. package/tools/environments/__pycache__/modal.cpython-312.pyc +0 -0
  1637. package/tools/environments/__pycache__/modal_utils.cpython-312.pyc +0 -0
  1638. package/tools/environments/__pycache__/singularity.cpython-312.pyc +0 -0
  1639. package/tools/environments/__pycache__/ssh.cpython-312.pyc +0 -0
  1640. package/tools/environments/base.py +844 -0
  1641. package/tools/environments/daytona.py +270 -0
  1642. package/tools/environments/docker.py +656 -0
  1643. package/tools/environments/file_sync.py +400 -0
  1644. package/tools/environments/local.py +658 -0
  1645. package/tools/environments/managed_modal.py +282 -0
  1646. package/tools/environments/modal.py +479 -0
  1647. package/tools/environments/modal_utils.py +199 -0
  1648. package/tools/environments/singularity.py +263 -0
  1649. package/tools/environments/ssh.py +295 -0
  1650. package/tools/environments/vercel_sandbox.py +655 -0
  1651. package/tools/feishu_doc_tool.py +138 -0
  1652. package/tools/feishu_drive_tool.py +431 -0
  1653. package/tools/file_operations.py +1825 -0
  1654. package/tools/file_state.py +332 -0
  1655. package/tools/file_tools.py +1172 -0
  1656. package/tools/fuzzy_match.py +703 -0
  1657. package/tools/homeassistant_tool.py +513 -0
  1658. package/tools/image_generation_tool.py +1098 -0
  1659. package/tools/interrupt.py +98 -0
  1660. package/tools/kanban_tools.py +1139 -0
  1661. package/tools/lazy_deps.py +608 -0
  1662. package/tools/managed_tool_gateway.py +168 -0
  1663. package/tools/mcp_oauth.py +633 -0
  1664. package/tools/mcp_oauth_manager.py +607 -0
  1665. package/tools/mcp_tool.py +3483 -0
  1666. package/tools/memory_tool.py +584 -0
  1667. package/tools/microsoft_graph_auth.py +245 -0
  1668. package/tools/microsoft_graph_client.py +408 -0
  1669. package/tools/mixture_of_agents_tool.py +542 -0
  1670. package/tools/neutts_samples/jo.txt +1 -0
  1671. package/tools/neutts_samples/jo.wav +0 -0
  1672. package/tools/neutts_synth.py +104 -0
  1673. package/tools/openrouter_client.py +33 -0
  1674. package/tools/osv_check.py +155 -0
  1675. package/tools/patch_parser.py +592 -0
  1676. package/tools/path_security.py +43 -0
  1677. package/tools/process_registry.py +1534 -0
  1678. package/tools/registry.py +589 -0
  1679. package/tools/schema_sanitizer.py +370 -0
  1680. package/tools/send_message_tool.py +1900 -0
  1681. package/tools/session_search_tool.py +613 -0
  1682. package/tools/skill_manager_tool.py +932 -0
  1683. package/tools/skill_provenance.py +78 -0
  1684. package/tools/skill_usage.py +610 -0
  1685. package/tools/skills_guard.py +932 -0
  1686. package/tools/skills_hub.py +3263 -0
  1687. package/tools/skills_sync.py +432 -0
  1688. package/tools/skills_tool.py +1569 -0
  1689. package/tools/slash_confirm.py +167 -0
  1690. package/tools/terminal_tool.py +2376 -0
  1691. package/tools/tirith_security.py +775 -0
  1692. package/tools/todo_tool.py +277 -0
  1693. package/tools/tool_backend_helpers.py +144 -0
  1694. package/tools/tool_output_limits.py +92 -0
  1695. package/tools/tool_result_storage.py +232 -0
  1696. package/tools/transcription_tools.py +936 -0
  1697. package/tools/tts_tool.py +2285 -0
  1698. package/tools/url_safety.py +330 -0
  1699. package/tools/video_generation_tool.py +561 -0
  1700. package/tools/vision_tools.py +1422 -0
  1701. package/tools/voice_mode.py +1019 -0
  1702. package/tools/web_tools.py +1551 -0
  1703. package/tools/website_policy.py +283 -0
  1704. package/tools/x_search_tool.py +424 -0
  1705. package/tools/xai_http.py +83 -0
  1706. package/tools/yuanbao_tools.py +736 -0
  1707. package/toolset_distributions.py +364 -0
  1708. package/toolsets.py +866 -0
  1709. package/trajectory_compressor.py +1509 -0
  1710. package/tui_gateway/__init__.py +0 -0
  1711. package/tui_gateway/entry.py +251 -0
  1712. package/tui_gateway/event_publisher.py +126 -0
  1713. package/tui_gateway/render.py +49 -0
  1714. package/tui_gateway/server.py +6623 -0
  1715. package/tui_gateway/slash_worker.py +76 -0
  1716. package/tui_gateway/transport.py +219 -0
  1717. package/tui_gateway/ws.py +178 -0
  1718. package/utils.py +361 -0
@@ -0,0 +1,1457 @@
1
+ """Persistent CDP supervisor for browser dialog + frame detection.
2
+
3
+ One ``CDPSupervisor`` runs per Hermes ``task_id`` that has a reachable CDP
4
+ endpoint. It holds a single persistent WebSocket to the backend, subscribes
5
+ to ``Page`` / ``Runtime`` / ``Target`` events on every attached session
6
+ (top-level page and every OOPIF / worker target that auto-attaches), and
7
+ surfaces observable state — pending dialogs and frame tree — through a
8
+ thread-safe snapshot object that tool handlers consume synchronously.
9
+
10
+ The supervisor is NOT in the agent's tool schema. Its output reaches the
11
+ agent via two channels:
12
+
13
+ 1. ``browser_snapshot`` merges supervisor state into its return payload
14
+ (see ``tools/browser_tool.py``).
15
+ 2. ``browser_dialog`` tool responds to a pending dialog by calling
16
+ ``respond_to_dialog()`` on the active supervisor.
17
+
18
+ Design spec: ``website/docs/developer-guide/browser-supervisor.md``.
19
+ """
20
+
21
+ from __future__ import annotations
22
+
23
+ import asyncio
24
+ import json
25
+ import logging
26
+ import threading
27
+ import time
28
+ from dataclasses import dataclass
29
+ from typing import Any, Dict, List, Optional, Tuple
30
+
31
+ import websockets
32
+ from websockets.asyncio.client import ClientConnection
33
+
34
+ logger = logging.getLogger(__name__)
35
+
36
+
37
+ # ── Config defaults ───────────────────────────────────────────────────────────
38
+
39
+ DIALOG_POLICY_MUST_RESPOND = "must_respond"
40
+ DIALOG_POLICY_AUTO_DISMISS = "auto_dismiss"
41
+ DIALOG_POLICY_AUTO_ACCEPT = "auto_accept"
42
+
43
+ _VALID_POLICIES = frozenset(
44
+ {DIALOG_POLICY_MUST_RESPOND, DIALOG_POLICY_AUTO_DISMISS, DIALOG_POLICY_AUTO_ACCEPT}
45
+ )
46
+
47
+ DEFAULT_DIALOG_POLICY = DIALOG_POLICY_MUST_RESPOND
48
+ DEFAULT_DIALOG_TIMEOUT_S = 300.0
49
+
50
+ # Snapshot caps for frame_tree — keep payloads bounded on ad-heavy pages.
51
+ FRAME_TREE_MAX_ENTRIES = 30
52
+ FRAME_TREE_MAX_OOPIF_DEPTH = 2
53
+
54
+ # Ring buffer of recent console-level events (used later by PR 2 diagnostics).
55
+ CONSOLE_HISTORY_MAX = 50
56
+
57
+ # Keep the last N closed dialogs in ``recent_dialogs`` so agents on backends
58
+ # that auto-dismiss server-side (e.g. Browserbase) can still observe that a
59
+ # dialog fired, even if they couldn't respond to it in time.
60
+ RECENT_DIALOGS_MAX = 20
61
+
62
+ # Magic host the injected dialog bridge XHRs to. Intercepted via the CDP
63
+ # Fetch domain before any network resolution happens, so the hostname never
64
+ # has to exist. Keep this ASCII + URL-safe; we also gate Fetch patterns on it.
65
+ DIALOG_BRIDGE_HOST = "hermes-dialog-bridge.invalid"
66
+ DIALOG_BRIDGE_URL_PATTERN = f"http://{DIALOG_BRIDGE_HOST}/*"
67
+
68
+ # Script injected into every frame via Page.addScriptToEvaluateOnNewDocument.
69
+ # Overrides alert/confirm/prompt to round-trip through a sync XHR that we
70
+ # intercept via Fetch.requestPaused. Works on Browserbase (whose CDP proxy
71
+ # auto-dismisses REAL native dialogs) because the native dialogs never fire
72
+ # in the first place — the overrides take precedence.
73
+ _DIALOG_BRIDGE_SCRIPT = r"""
74
+ (() => {
75
+ if (window.__hermesDialogBridgeInstalled) return;
76
+ window.__hermesDialogBridgeInstalled = true;
77
+ const ENDPOINT = "http://hermes-dialog-bridge.invalid/";
78
+ function ask(kind, message, defaultPrompt) {
79
+ try {
80
+ const xhr = new XMLHttpRequest();
81
+ // Use GET with query params so we don't need to worry about request
82
+ // body encoding in the Fetch interceptor.
83
+ const params = new URLSearchParams({
84
+ kind: String(kind || ""),
85
+ message: String(message == null ? "" : message),
86
+ default_prompt: String(defaultPrompt == null ? "" : defaultPrompt),
87
+ });
88
+ xhr.open("GET", ENDPOINT + "?" + params.toString(), false); // sync
89
+ xhr.send(null);
90
+ if (xhr.status !== 200) return null;
91
+ const body = xhr.responseText || "";
92
+ let parsed;
93
+ try { parsed = JSON.parse(body); } catch (e) { return null; }
94
+ if (kind === "alert") return undefined;
95
+ if (kind === "confirm") return Boolean(parsed && parsed.accept);
96
+ if (kind === "prompt") {
97
+ if (!parsed || !parsed.accept) return null;
98
+ return parsed.prompt_text == null ? "" : String(parsed.prompt_text);
99
+ }
100
+ return null;
101
+ } catch (e) {
102
+ // If the bridge is unreachable, fall back to the native call so the
103
+ // page still sees *some* behavior (the backend will auto-dismiss).
104
+ return null;
105
+ }
106
+ }
107
+ const realAlert = window.alert;
108
+ const realConfirm = window.confirm;
109
+ const realPrompt = window.prompt;
110
+ window.alert = function(message) { ask("alert", message, ""); };
111
+ window.confirm = function(message) {
112
+ const r = ask("confirm", message, "");
113
+ return r === null ? false : Boolean(r);
114
+ };
115
+ window.prompt = function(message, def) {
116
+ const r = ask("prompt", message, def == null ? "" : def);
117
+ return r === null ? null : String(r);
118
+ };
119
+ // onbeforeunload — we can't really synchronously prompt the user from this
120
+ // event without racing navigation. Leave native behavior for now; the
121
+ // supervisor's native-dialog fallback path still surfaces them in
122
+ // recent_dialogs.
123
+ })();
124
+ """
125
+
126
+
127
+ # ── Data model ────────────────────────────────────────────────────────────────
128
+
129
+
130
+ @dataclass
131
+ class PendingDialog:
132
+ """A JS dialog currently open on some frame's session."""
133
+
134
+ id: str
135
+ type: str # "alert" | "confirm" | "prompt" | "beforeunload"
136
+ message: str
137
+ default_prompt: str
138
+ opened_at: float
139
+ cdp_session_id: str # which attached CDP session the dialog fired in
140
+ frame_id: Optional[str] = None
141
+ # When set, the dialog was captured via the bridge XHR path (Fetch domain).
142
+ # Response must be delivered via Fetch.fulfillRequest, NOT
143
+ # Page.handleJavaScriptDialog — the native dialog never fired.
144
+ bridge_request_id: Optional[str] = None
145
+
146
+ def to_dict(self) -> Dict[str, Any]:
147
+ return {
148
+ "id": self.id,
149
+ "type": self.type,
150
+ "message": self.message,
151
+ "default_prompt": self.default_prompt,
152
+ "opened_at": self.opened_at,
153
+ "frame_id": self.frame_id,
154
+ }
155
+
156
+
157
+ @dataclass
158
+ class DialogRecord:
159
+ """A historical record of a dialog that was opened and then handled.
160
+
161
+ Retained in ``recent_dialogs`` for a short window so agents on backends
162
+ that auto-dismiss dialogs server-side (Browserbase) can still observe
163
+ that a dialog fired, even though they couldn't respond to it.
164
+ """
165
+
166
+ id: str
167
+ type: str
168
+ message: str
169
+ opened_at: float
170
+ closed_at: float
171
+ closed_by: str # "agent" | "auto_policy" | "remote" | "watchdog"
172
+ frame_id: Optional[str] = None
173
+
174
+ def to_dict(self) -> Dict[str, Any]:
175
+ return {
176
+ "id": self.id,
177
+ "type": self.type,
178
+ "message": self.message,
179
+ "opened_at": self.opened_at,
180
+ "closed_at": self.closed_at,
181
+ "closed_by": self.closed_by,
182
+ "frame_id": self.frame_id,
183
+ }
184
+
185
+
186
+ @dataclass
187
+ class FrameInfo:
188
+ """One frame in the page's frame tree.
189
+
190
+ ``is_oopif`` means the frame has its own CDP target (separate process,
191
+ reachable via ``cdp_session_id``). Same-origin / srcdoc iframes share
192
+ the parent process and have ``is_oopif=False`` + ``cdp_session_id=None``.
193
+ """
194
+
195
+ frame_id: str
196
+ url: str
197
+ origin: str
198
+ parent_frame_id: Optional[str]
199
+ is_oopif: bool
200
+ cdp_session_id: Optional[str] = None
201
+ name: str = ""
202
+
203
+ def to_dict(self) -> Dict[str, Any]:
204
+ d = {
205
+ "frame_id": self.frame_id,
206
+ "url": self.url,
207
+ "origin": self.origin,
208
+ "is_oopif": self.is_oopif,
209
+ }
210
+ if self.cdp_session_id:
211
+ d["session_id"] = self.cdp_session_id
212
+ if self.parent_frame_id:
213
+ d["parent_frame_id"] = self.parent_frame_id
214
+ if self.name:
215
+ d["name"] = self.name
216
+ return d
217
+
218
+
219
+ @dataclass
220
+ class ConsoleEvent:
221
+ """Ring buffer entry for console + exception traffic."""
222
+
223
+ ts: float
224
+ level: str # "log" | "error" | "warning" | "exception"
225
+ text: str
226
+ url: Optional[str] = None
227
+
228
+
229
+ @dataclass(frozen=True)
230
+ class SupervisorSnapshot:
231
+ """Read-only snapshot of supervisor state.
232
+
233
+ Frozen dataclass so tool handlers can freely dereference without
234
+ worrying about mutation under their feet.
235
+ """
236
+
237
+ pending_dialogs: Tuple[PendingDialog, ...]
238
+ recent_dialogs: Tuple[DialogRecord, ...]
239
+ frame_tree: Dict[str, Any]
240
+ console_errors: Tuple[ConsoleEvent, ...]
241
+ active: bool # False if supervisor is detached/stopped
242
+ cdp_url: str
243
+ task_id: str
244
+
245
+ def to_dict(self) -> Dict[str, Any]:
246
+ """Serialize for inclusion in ``browser_snapshot`` output."""
247
+ out: Dict[str, Any] = {
248
+ "pending_dialogs": [d.to_dict() for d in self.pending_dialogs],
249
+ "frame_tree": self.frame_tree,
250
+ }
251
+ if self.recent_dialogs:
252
+ out["recent_dialogs"] = [d.to_dict() for d in self.recent_dialogs]
253
+ return out
254
+
255
+
256
+ # ── Supervisor core ───────────────────────────────────────────────────────────
257
+
258
+
259
+ class CDPSupervisor:
260
+ """One supervisor per (task_id, cdp_url) pair.
261
+
262
+ Lifecycle:
263
+ * ``start()`` — kicked off by ``SupervisorRegistry.get_or_start``; spawns
264
+ a daemon thread running its own asyncio loop, connects the WebSocket,
265
+ attaches to the first page target, enables domains, starts
266
+ auto-attaching to child targets.
267
+ * ``snapshot()`` — sync, thread-safe, called from tool handlers.
268
+ * ``respond_to_dialog(action, ...)`` — sync bridge; schedules a coroutine
269
+ on the supervisor's loop and waits (with timeout) for the CDP ack.
270
+ * ``stop()`` — cancels task, closes WebSocket, joins thread.
271
+
272
+ All CDP I/O lives on the supervisor's own loop. External callers never
273
+ touch the loop directly; they go through the sync API above.
274
+ """
275
+
276
+ def __init__(
277
+ self,
278
+ task_id: str,
279
+ cdp_url: str,
280
+ *,
281
+ dialog_policy: str = DEFAULT_DIALOG_POLICY,
282
+ dialog_timeout_s: float = DEFAULT_DIALOG_TIMEOUT_S,
283
+ ) -> None:
284
+ if dialog_policy not in _VALID_POLICIES:
285
+ raise ValueError(
286
+ f"Invalid dialog_policy {dialog_policy!r}; "
287
+ f"must be one of {sorted(_VALID_POLICIES)}"
288
+ )
289
+ self.task_id = task_id
290
+ self.cdp_url = cdp_url
291
+ self.dialog_policy = dialog_policy
292
+ self.dialog_timeout_s = float(dialog_timeout_s)
293
+
294
+ # State protected by ``_state_lock`` for cross-thread reads.
295
+ self._state_lock = threading.Lock()
296
+ self._pending_dialogs: Dict[str, PendingDialog] = {}
297
+ self._recent_dialogs: List[DialogRecord] = []
298
+ self._frames: Dict[str, FrameInfo] = {}
299
+ self._console_events: List[ConsoleEvent] = []
300
+ self._active = False
301
+
302
+ # Supervisor loop machinery — populated in start().
303
+ self._loop: Optional[asyncio.AbstractEventLoop] = None
304
+ self._thread: Optional[threading.Thread] = None
305
+ self._ready_event = threading.Event()
306
+ self._start_error: Optional[BaseException] = None
307
+ self._stop_requested = False
308
+
309
+ # CDP call tracking (runs on supervisor loop only).
310
+ self._next_call_id = 1
311
+ self._pending_calls: Dict[int, asyncio.Future] = {}
312
+ self._ws: Optional[ClientConnection] = None
313
+ self._page_session_id: Optional[str] = None
314
+ self._child_sessions: Dict[str, Dict[str, Any]] = {} # session_id -> info
315
+
316
+ # Dialog auto-dismiss watchdog handles (per dialog id).
317
+ self._dialog_watchdogs: Dict[str, asyncio.TimerHandle] = {}
318
+ # Monotonic id generator for dialogs (human-readable in snapshots).
319
+ self._dialog_seq = 0
320
+
321
+ # ── Public sync API ──────────────────────────────────────────────────────
322
+
323
+ def start(self, timeout: float = 15.0) -> None:
324
+ """Launch the background loop and wait until attachment is complete.
325
+
326
+ Raises whatever exception attach failed with (connect error, bad
327
+ WebSocket URL, CDP domain enable failure, etc.). On success, the
328
+ supervisor is fully wired up — pending-dialog events will be captured
329
+ as of the moment ``start()`` returns.
330
+ """
331
+ if self._thread and self._thread.is_alive():
332
+ return
333
+ self._ready_event.clear()
334
+ self._start_error = None
335
+ self._stop_requested = False
336
+ self._thread = threading.Thread(
337
+ target=self._thread_main,
338
+ name=f"cdp-supervisor-{self.task_id}",
339
+ daemon=True,
340
+ )
341
+ self._thread.start()
342
+ if not self._ready_event.wait(timeout=timeout):
343
+ self.stop()
344
+ raise TimeoutError(
345
+ f"CDP supervisor did not attach within {timeout}s "
346
+ f"(cdp_url={self.cdp_url[:80]}...)"
347
+ )
348
+ if self._start_error is not None:
349
+ err = self._start_error
350
+ self.stop()
351
+ raise err
352
+
353
+ def stop(self, timeout: float = 5.0) -> None:
354
+ """Cancel the supervisor task and join the thread."""
355
+ self._stop_requested = True
356
+ loop = self._loop
357
+ if loop is not None and loop.is_running():
358
+ # Close the WebSocket from inside the loop — this makes ``async for
359
+ # raw in self._ws`` return cleanly, ``_run`` hits its ``finally``,
360
+ # pending tasks get cancelled in order, THEN the thread exits.
361
+ async def _close_ws():
362
+ ws = self._ws
363
+ self._ws = None
364
+ if ws is not None:
365
+ try:
366
+ await ws.close()
367
+ except Exception:
368
+ pass
369
+
370
+ try:
371
+ from agent.async_utils import safe_schedule_threadsafe
372
+ fut = safe_schedule_threadsafe(_close_ws(), loop)
373
+ if fut is not None:
374
+ try:
375
+ fut.result(timeout=2.0)
376
+ except Exception:
377
+ pass
378
+ except RuntimeError:
379
+ pass # loop already shutting down
380
+ if self._thread is not None:
381
+ self._thread.join(timeout=timeout)
382
+ with self._state_lock:
383
+ self._active = False
384
+
385
+ def snapshot(self) -> SupervisorSnapshot:
386
+ """Return an immutable snapshot of current state."""
387
+ with self._state_lock:
388
+ dialogs = tuple(self._pending_dialogs.values())
389
+ recent = tuple(self._recent_dialogs[-RECENT_DIALOGS_MAX:])
390
+ frames_tree = self._build_frame_tree_locked()
391
+ console = tuple(self._console_events[-CONSOLE_HISTORY_MAX:])
392
+ active = self._active
393
+ return SupervisorSnapshot(
394
+ pending_dialogs=dialogs,
395
+ recent_dialogs=recent,
396
+ frame_tree=frames_tree,
397
+ console_errors=console,
398
+ active=active,
399
+ cdp_url=self.cdp_url,
400
+ task_id=self.task_id,
401
+ )
402
+
403
+ def respond_to_dialog(
404
+ self,
405
+ action: str,
406
+ *,
407
+ prompt_text: Optional[str] = None,
408
+ dialog_id: Optional[str] = None,
409
+ timeout: float = 10.0,
410
+ ) -> Dict[str, Any]:
411
+ """Accept/dismiss a pending dialog. Sync bridge onto the supervisor loop.
412
+
413
+ Returns ``{"ok": True, "dialog": {...}}`` on success,
414
+ ``{"ok": False, "error": "..."}`` on a recoverable error (no dialog,
415
+ ambiguous dialog_id, supervisor inactive).
416
+ """
417
+ if action not in {"accept", "dismiss"}:
418
+ return {"ok": False, "error": f"action must be 'accept' or 'dismiss', got {action!r}"}
419
+
420
+ with self._state_lock:
421
+ if not self._active:
422
+ return {"ok": False, "error": "supervisor is not active"}
423
+ pending = list(self._pending_dialogs.values())
424
+ if not pending:
425
+ return {"ok": False, "error": "no dialog is currently open"}
426
+ if dialog_id:
427
+ dialog = self._pending_dialogs.get(dialog_id)
428
+ if dialog is None:
429
+ return {
430
+ "ok": False,
431
+ "error": f"dialog_id {dialog_id!r} not found "
432
+ f"(known: {sorted(self._pending_dialogs)})",
433
+ }
434
+ elif len(pending) > 1:
435
+ return {
436
+ "ok": False,
437
+ "error": (
438
+ f"{len(pending)} pending dialogs; specify dialog_id. "
439
+ f"Candidates: {[d.id for d in pending]}"
440
+ ),
441
+ }
442
+ else:
443
+ dialog = pending[0]
444
+ snapshot_copy = dialog
445
+
446
+ loop = self._loop
447
+ if loop is None:
448
+ return {"ok": False, "error": "supervisor loop is not running"}
449
+
450
+ async def _do_respond():
451
+ return await self._handle_dialog_cdp(
452
+ snapshot_copy, accept=(action == "accept"), prompt_text=prompt_text or ""
453
+ )
454
+
455
+ try:
456
+ from agent.async_utils import safe_schedule_threadsafe
457
+ fut = safe_schedule_threadsafe(_do_respond(), loop)
458
+ if fut is None:
459
+ return {"ok": False, "error": "Browser supervisor loop unavailable"}
460
+ fut.result(timeout=timeout)
461
+ except Exception as e:
462
+ return {"ok": False, "error": f"{type(e).__name__}: {e}"}
463
+ return {"ok": True, "dialog": snapshot_copy.to_dict()}
464
+
465
+ def evaluate_runtime(
466
+ self,
467
+ expression: str,
468
+ *,
469
+ return_by_value: bool = True,
470
+ await_promise: bool = True,
471
+ timeout: float = 10.0,
472
+ ) -> Dict[str, Any]:
473
+ """Evaluate ``expression`` in the page's Runtime context over the live WS.
474
+
475
+ Reuses the supervisor's already-connected WebSocket — zero subprocess
476
+ startup cost vs the agent-browser CLI ``eval`` command (which does
477
+ fork+exec+Node-startup+CDP-setup on every call).
478
+
479
+ Returns a dict shaped like ``{"ok": True, "result": <value>, "result_type": "..."}``
480
+ on success, or ``{"ok": False, "error": "..."}`` on failure.
481
+
482
+ ``return_by_value=True`` asks the browser to JSON-serialize the result
483
+ before sending it back, matching DevTools-console semantics for
484
+ primitive / plain-object expressions. For DOM nodes or non-serializable
485
+ objects, the browser returns a description string in ``result_type``.
486
+ """
487
+ loop = self._loop
488
+ if loop is None or not loop.is_running():
489
+ return {"ok": False, "error": "supervisor loop is not running"}
490
+
491
+ with self._state_lock:
492
+ if not self._active:
493
+ return {"ok": False, "error": "supervisor is not active"}
494
+ session_id = self._page_session_id
495
+
496
+ if not session_id:
497
+ return {"ok": False, "error": "supervisor has no attached page session"}
498
+
499
+ async def _do_eval() -> Dict[str, Any]:
500
+ return await self._cdp(
501
+ "Runtime.evaluate",
502
+ {
503
+ "expression": expression,
504
+ "returnByValue": return_by_value,
505
+ "awaitPromise": await_promise,
506
+ # userGesture matters for things like clipboard / fullscreen
507
+ # APIs that require a user-activation context.
508
+ "userGesture": True,
509
+ },
510
+ session_id=session_id,
511
+ timeout=timeout,
512
+ )
513
+
514
+ try:
515
+ from agent.async_utils import safe_schedule_threadsafe
516
+ fut = safe_schedule_threadsafe(_do_eval(), loop)
517
+ if fut is None:
518
+ return {"ok": False, "error": "Browser supervisor loop unavailable"}
519
+ response = fut.result(timeout=timeout + 1)
520
+ except Exception as exc:
521
+ return {"ok": False, "error": f"{type(exc).__name__}: {exc}"}
522
+
523
+ # Runtime.evaluate response shape:
524
+ # {"id": N, "result": {"result": {"type": "...", "value": ..., ...},
525
+ # "exceptionDetails": {...} (only on error)}}
526
+ result_payload = response.get("result", {}) if isinstance(response, dict) else {}
527
+ exception_details = result_payload.get("exceptionDetails")
528
+ if exception_details:
529
+ # Surface the JS-side exception with a clean message.
530
+ exc_text = exception_details.get("text") or "JavaScript exception"
531
+ exc_obj = exception_details.get("exception") or {}
532
+ description = exc_obj.get("description")
533
+ if description:
534
+ exc_text = f"{exc_text}: {description}"
535
+ return {"ok": False, "error": exc_text}
536
+
537
+ result_obj = result_payload.get("result", {})
538
+ result_type = result_obj.get("type", "undefined")
539
+
540
+ if "value" in result_obj:
541
+ value = result_obj["value"]
542
+ elif result_type == "undefined":
543
+ value = None
544
+ else:
545
+ # Non-serializable (functions, DOM nodes, etc.) — return the
546
+ # browser's string description so the model gets *something*.
547
+ value = result_obj.get("description") or result_obj.get("unserializableValue")
548
+
549
+ return {"ok": True, "result": value, "result_type": result_type}
550
+
551
+ # ── Supervisor loop internals ────────────────────────────────────────────
552
+
553
+ def _thread_main(self) -> None:
554
+ """Entry point for the supervisor's dedicated thread."""
555
+ loop = asyncio.new_event_loop()
556
+ self._loop = loop
557
+ try:
558
+ asyncio.set_event_loop(loop)
559
+ loop.run_until_complete(self._run())
560
+ except BaseException as e: # noqa: BLE001 — propagate via _start_error
561
+ if not self._ready_event.is_set():
562
+ self._start_error = e
563
+ self._ready_event.set()
564
+ else:
565
+ logger.warning("CDP supervisor %s crashed: %s", self.task_id, e)
566
+ finally:
567
+ # Flush any remaining tasks before closing the loop so we don't
568
+ # emit "Task was destroyed but it is pending" warnings.
569
+ try:
570
+ pending = [t for t in asyncio.all_tasks(loop) if not t.done()]
571
+ for t in pending:
572
+ t.cancel()
573
+ if pending:
574
+ loop.run_until_complete(asyncio.gather(*pending, return_exceptions=True))
575
+ except Exception:
576
+ pass
577
+ try:
578
+ loop.close()
579
+ except Exception:
580
+ pass
581
+ with self._state_lock:
582
+ self._active = False
583
+
584
+ async def _run(self) -> None:
585
+ """Top-level supervisor coroutine.
586
+
587
+ Holds a reconnecting loop so we survive the remote closing the
588
+ WebSocket — Browserbase in particular tears down the CDP socket
589
+ every time a short-lived client (e.g. agent-browser's per-command
590
+ CDP client) disconnects. We drop our state snapshot keys that
591
+ depend on specific CDP session ids, re-attach, and keep going.
592
+ """
593
+ attempt = 0
594
+ last_success_at = 0.0
595
+ backoff = 0.5
596
+ while not self._stop_requested:
597
+ try:
598
+ self._ws = await asyncio.wait_for(
599
+ websockets.connect(self.cdp_url, max_size=50 * 1024 * 1024),
600
+ timeout=10.0,
601
+ )
602
+ except Exception as e:
603
+ attempt += 1
604
+ if not self._ready_event.is_set():
605
+ # Never connected once — fatal for start().
606
+ self._start_error = e
607
+ self._ready_event.set()
608
+ return
609
+ logger.warning(
610
+ "CDP supervisor %s: connect failed (attempt %s): %s",
611
+ self.task_id, attempt, e,
612
+ )
613
+ await asyncio.sleep(min(backoff, 10.0))
614
+ backoff = min(backoff * 2, 10.0)
615
+ continue
616
+
617
+ reader_task = asyncio.create_task(self._read_loop(), name="cdp-reader")
618
+ try:
619
+ # Reset per-connection session state so stale ids don't hang
620
+ # around after a reconnect.
621
+ self._page_session_id = None
622
+ self._child_sessions.clear()
623
+ # We deliberately keep `_pending_dialogs` and `_frames` —
624
+ # they're reconciled as the supervisor resubscribes and
625
+ # receives fresh events. Worst case: an agent sees a stale
626
+ # dialog entry that the new session's handleJavaScriptDialog
627
+ # call rejects with "no dialog is showing" (logged, not
628
+ # surfaced).
629
+ await self._attach_initial_page()
630
+ with self._state_lock:
631
+ self._active = True
632
+ last_success_at = time.time()
633
+ backoff = 0.5 # reset after a successful attach
634
+ if not self._ready_event.is_set():
635
+ self._ready_event.set()
636
+ # Run until the reader returns.
637
+ await reader_task
638
+ except BaseException as e:
639
+ if not self._ready_event.is_set():
640
+ # Never got to ready — propagate to start().
641
+ self._start_error = e
642
+ self._ready_event.set()
643
+ raise
644
+ logger.warning(
645
+ "CDP supervisor %s: session dropped after %.1fs: %s",
646
+ self.task_id,
647
+ time.time() - last_success_at,
648
+ e,
649
+ )
650
+ finally:
651
+ with self._state_lock:
652
+ self._active = False
653
+ if not reader_task.done():
654
+ reader_task.cancel()
655
+ try:
656
+ await reader_task
657
+ except (asyncio.CancelledError, Exception):
658
+ pass
659
+ for handle in list(self._dialog_watchdogs.values()):
660
+ handle.cancel()
661
+ self._dialog_watchdogs.clear()
662
+ ws = self._ws
663
+ self._ws = None
664
+ if ws is not None:
665
+ try:
666
+ await ws.close()
667
+ except Exception:
668
+ pass
669
+
670
+ if self._stop_requested:
671
+ return
672
+
673
+ # Reconnect: brief backoff, then reattach.
674
+ logger.debug(
675
+ "CDP supervisor %s: reconnecting in %.1fs...", self.task_id, backoff,
676
+ )
677
+ await asyncio.sleep(backoff)
678
+ backoff = min(backoff * 2, 10.0)
679
+
680
+ async def _attach_initial_page(self) -> None:
681
+ """Find a page target, attach flattened session, enable domains, install dialog bridge."""
682
+ resp = await self._cdp("Target.getTargets")
683
+ targets = resp.get("result", {}).get("targetInfos", [])
684
+ page_target = next((t for t in targets if t.get("type") == "page"), None)
685
+ if page_target is None:
686
+ created = await self._cdp("Target.createTarget", {"url": "about:blank"})
687
+ target_id = created["result"]["targetId"]
688
+ else:
689
+ target_id = page_target["targetId"]
690
+
691
+ attach = await self._cdp(
692
+ "Target.attachToTarget",
693
+ {"targetId": target_id, "flatten": True},
694
+ )
695
+ self._page_session_id = attach["result"]["sessionId"]
696
+ await self._cdp("Page.enable", session_id=self._page_session_id)
697
+ await self._cdp("Runtime.enable", session_id=self._page_session_id)
698
+ await self._cdp(
699
+ "Target.setAutoAttach",
700
+ {"autoAttach": True, "waitForDebuggerOnStart": False, "flatten": True},
701
+ session_id=self._page_session_id,
702
+ )
703
+ # Install the dialog bridge — overrides native alert/confirm/prompt with
704
+ # a synchronous XHR we intercept via Fetch domain. This is how we make
705
+ # dialog response work on Browserbase (whose CDP proxy auto-dismisses
706
+ # real native dialogs before we can call handleJavaScriptDialog).
707
+ await self._install_dialog_bridge(self._page_session_id)
708
+
709
+ async def _install_dialog_bridge(self, session_id: str) -> None:
710
+ """Install the dialog-bridge init script + Fetch interceptor on a session.
711
+
712
+ Two CDP calls:
713
+ 1. ``Page.addScriptToEvaluateOnNewDocument`` — the JS override runs
714
+ in every frame before any page script. Replaces alert/confirm/
715
+ prompt with a sync XHR to our bridge URL.
716
+ 2. ``Fetch.enable`` scoped to the bridge URL — we catch those XHRs,
717
+ surface them as pending dialogs, then fulfill once the agent
718
+ responds.
719
+
720
+ Idempotent at the CDP level: Chromium de-duplicates identical
721
+ add-script calls by source, and Fetch.enable replaces prior patterns.
722
+ """
723
+ try:
724
+ await self._cdp(
725
+ "Page.addScriptToEvaluateOnNewDocument",
726
+ {"source": _DIALOG_BRIDGE_SCRIPT, "runImmediately": True},
727
+ session_id=session_id,
728
+ timeout=5.0,
729
+ )
730
+ except Exception as e:
731
+ logger.debug(
732
+ "dialog bridge: addScriptToEvaluateOnNewDocument failed on sid=%s: %s",
733
+ (session_id or "")[:16], e,
734
+ )
735
+ try:
736
+ await self._cdp(
737
+ "Fetch.enable",
738
+ {
739
+ "patterns": [
740
+ {
741
+ "urlPattern": DIALOG_BRIDGE_URL_PATTERN,
742
+ "requestStage": "Request",
743
+ }
744
+ ],
745
+ "handleAuthRequests": False,
746
+ },
747
+ session_id=session_id,
748
+ timeout=5.0,
749
+ )
750
+ except Exception as e:
751
+ logger.debug(
752
+ "dialog bridge: Fetch.enable failed on sid=%s: %s",
753
+ (session_id or "")[:16], e,
754
+ )
755
+ # Also try to inject into the already-loaded document so existing
756
+ # pages pick up the override on reconnect. Best-effort.
757
+ try:
758
+ await self._cdp(
759
+ "Runtime.evaluate",
760
+ {"expression": _DIALOG_BRIDGE_SCRIPT, "returnByValue": True},
761
+ session_id=session_id,
762
+ timeout=3.0,
763
+ )
764
+ except Exception:
765
+ pass
766
+
767
+ async def _cdp(
768
+ self,
769
+ method: str,
770
+ params: Optional[Dict[str, Any]] = None,
771
+ *,
772
+ session_id: Optional[str] = None,
773
+ timeout: float = 10.0,
774
+ ) -> Dict[str, Any]:
775
+ """Send a CDP command and await its response."""
776
+ if self._ws is None:
777
+ raise RuntimeError("supervisor WebSocket is not connected")
778
+ call_id = self._next_call_id
779
+ self._next_call_id += 1
780
+ payload: Dict[str, Any] = {"id": call_id, "method": method}
781
+ if params:
782
+ payload["params"] = params
783
+ if session_id:
784
+ payload["sessionId"] = session_id
785
+ fut: asyncio.Future = asyncio.get_running_loop().create_future()
786
+ self._pending_calls[call_id] = fut
787
+ await self._ws.send(json.dumps(payload))
788
+ try:
789
+ return await asyncio.wait_for(fut, timeout=timeout)
790
+ finally:
791
+ self._pending_calls.pop(call_id, None)
792
+
793
+ async def _read_loop(self) -> None:
794
+ """Continuously dispatch incoming CDP frames."""
795
+ assert self._ws is not None
796
+ try:
797
+ async for raw in self._ws:
798
+ if self._stop_requested:
799
+ break
800
+ try:
801
+ msg = json.loads(raw)
802
+ except Exception:
803
+ logger.debug("CDP supervisor: non-JSON frame dropped")
804
+ continue
805
+ if "id" in msg:
806
+ fut = self._pending_calls.pop(msg["id"], None)
807
+ if fut is not None and not fut.done():
808
+ if "error" in msg:
809
+ fut.set_exception(
810
+ RuntimeError(f"CDP error on id={msg['id']}: {msg['error']}")
811
+ )
812
+ else:
813
+ fut.set_result(msg)
814
+ elif "method" in msg:
815
+ await self._on_event(msg["method"], msg.get("params", {}), msg.get("sessionId"))
816
+ except Exception as e:
817
+ logger.debug("CDP read loop exited: %s", e)
818
+
819
+ # ── Event dispatch ──────────────────────────────────────────────────────
820
+
821
+ async def _on_event(
822
+ self, method: str, params: Dict[str, Any], session_id: Optional[str]
823
+ ) -> None:
824
+ if method == "Page.javascriptDialogOpening":
825
+ await self._on_dialog_opening(params, session_id)
826
+ elif method == "Page.javascriptDialogClosed":
827
+ await self._on_dialog_closed(params, session_id)
828
+ elif method == "Fetch.requestPaused":
829
+ await self._on_fetch_paused(params, session_id)
830
+ elif method == "Page.frameAttached":
831
+ self._on_frame_attached(params, session_id)
832
+ elif method == "Page.frameNavigated":
833
+ self._on_frame_navigated(params, session_id)
834
+ elif method == "Page.frameDetached":
835
+ self._on_frame_detached(params, session_id)
836
+ elif method == "Target.attachedToTarget":
837
+ await self._on_target_attached(params)
838
+ elif method == "Target.detachedFromTarget":
839
+ self._on_target_detached(params)
840
+ elif method == "Runtime.consoleAPICalled":
841
+ self._on_console(params, level_from="api")
842
+ elif method == "Runtime.exceptionThrown":
843
+ self._on_console(params, level_from="exception")
844
+
845
+ async def _on_dialog_opening(
846
+ self, params: Dict[str, Any], session_id: Optional[str]
847
+ ) -> None:
848
+ self._dialog_seq += 1
849
+ dialog = PendingDialog(
850
+ id=f"d-{self._dialog_seq}",
851
+ type=str(params.get("type") or ""),
852
+ message=str(params.get("message") or ""),
853
+ default_prompt=str(params.get("defaultPrompt") or ""),
854
+ opened_at=time.time(),
855
+ cdp_session_id=session_id or self._page_session_id or "",
856
+ frame_id=params.get("frameId"),
857
+ )
858
+
859
+ if self.dialog_policy == DIALOG_POLICY_AUTO_DISMISS:
860
+ # Archive immediately with the policy tag so the ``closed`` event
861
+ # arriving right after our handleJavaScriptDialog call doesn't
862
+ # re-archive it as "remote".
863
+ with self._state_lock:
864
+ self._archive_dialog_locked(dialog, "auto_policy")
865
+ asyncio.create_task(
866
+ self._auto_handle_dialog(dialog, accept=False, prompt_text="")
867
+ )
868
+ elif self.dialog_policy == DIALOG_POLICY_AUTO_ACCEPT:
869
+ with self._state_lock:
870
+ self._archive_dialog_locked(dialog, "auto_policy")
871
+ asyncio.create_task(
872
+ self._auto_handle_dialog(
873
+ dialog, accept=True, prompt_text=dialog.default_prompt
874
+ )
875
+ )
876
+ else:
877
+ # must_respond → add to pending and arm watchdog.
878
+ with self._state_lock:
879
+ self._pending_dialogs[dialog.id] = dialog
880
+ loop = asyncio.get_running_loop()
881
+ handle = loop.call_later(
882
+ self.dialog_timeout_s,
883
+ lambda: asyncio.create_task(self._dialog_timeout_expired(dialog.id)),
884
+ )
885
+ self._dialog_watchdogs[dialog.id] = handle
886
+
887
+ async def _auto_handle_dialog(
888
+ self, dialog: PendingDialog, *, accept: bool, prompt_text: str
889
+ ) -> None:
890
+ """Send handleJavaScriptDialog for auto_dismiss/auto_accept.
891
+
892
+ Dialog has already been archived by the caller (``_on_dialog_opening``);
893
+ this just fires the CDP call so the page unblocks.
894
+ """
895
+ params: Dict[str, Any] = {"accept": accept}
896
+ if dialog.type == "prompt":
897
+ params["promptText"] = prompt_text
898
+ try:
899
+ await self._cdp(
900
+ "Page.handleJavaScriptDialog",
901
+ params,
902
+ session_id=dialog.cdp_session_id or None,
903
+ timeout=5.0,
904
+ )
905
+ except Exception as e:
906
+ logger.debug("auto-handle CDP call failed for %s: %s", dialog.id, e)
907
+
908
+ async def _dialog_timeout_expired(self, dialog_id: str) -> None:
909
+ with self._state_lock:
910
+ dialog = self._pending_dialogs.get(dialog_id)
911
+ if dialog is None:
912
+ return
913
+ logger.warning(
914
+ "CDP supervisor %s: dialog %s (%s) auto-dismissed after %ss timeout",
915
+ self.task_id,
916
+ dialog_id,
917
+ dialog.type,
918
+ self.dialog_timeout_s,
919
+ )
920
+ try:
921
+ # Archive with watchdog tag BEFORE fulfilling / dismissing.
922
+ with self._state_lock:
923
+ if dialog_id in self._pending_dialogs:
924
+ self._pending_dialogs.pop(dialog_id, None)
925
+ self._archive_dialog_locked(dialog, "watchdog")
926
+ # Unblock the page — via bridge Fetch fulfill for bridge dialogs,
927
+ # else native Page.handleJavaScriptDialog for real dialogs.
928
+ if dialog.bridge_request_id:
929
+ await self._fulfill_bridge_request(dialog, accept=False, prompt_text="")
930
+ else:
931
+ await self._cdp(
932
+ "Page.handleJavaScriptDialog",
933
+ {"accept": False},
934
+ session_id=dialog.cdp_session_id or None,
935
+ timeout=5.0,
936
+ )
937
+ except Exception as e:
938
+ logger.debug("auto-dismiss failed for %s: %s", dialog_id, e)
939
+
940
+ def _archive_dialog_locked(self, dialog: PendingDialog, closed_by: str) -> None:
941
+ """Move a pending dialog to the recent_dialogs ring buffer. Must hold state_lock."""
942
+ record = DialogRecord(
943
+ id=dialog.id,
944
+ type=dialog.type,
945
+ message=dialog.message,
946
+ opened_at=dialog.opened_at,
947
+ closed_at=time.time(),
948
+ closed_by=closed_by,
949
+ frame_id=dialog.frame_id,
950
+ )
951
+ self._recent_dialogs.append(record)
952
+ if len(self._recent_dialogs) > RECENT_DIALOGS_MAX * 2:
953
+ self._recent_dialogs = self._recent_dialogs[-RECENT_DIALOGS_MAX:]
954
+
955
+ async def _handle_dialog_cdp(
956
+ self, dialog: PendingDialog, *, accept: bool, prompt_text: str
957
+ ) -> None:
958
+ """Send the Page.handleJavaScriptDialog CDP command (agent path only).
959
+
960
+ Routes to the bridge-fulfill path when the dialog was captured via
961
+ the injected XHR override (see ``_on_fetch_paused``).
962
+ """
963
+ if dialog.bridge_request_id:
964
+ try:
965
+ await self._fulfill_bridge_request(
966
+ dialog, accept=accept, prompt_text=prompt_text
967
+ )
968
+ finally:
969
+ with self._state_lock:
970
+ if dialog.id in self._pending_dialogs:
971
+ self._pending_dialogs.pop(dialog.id, None)
972
+ self._archive_dialog_locked(dialog, "agent")
973
+ handle = self._dialog_watchdogs.pop(dialog.id, None)
974
+ if handle is not None:
975
+ handle.cancel()
976
+ return
977
+
978
+ params: Dict[str, Any] = {"accept": accept}
979
+ if dialog.type == "prompt":
980
+ params["promptText"] = prompt_text
981
+ try:
982
+ await self._cdp(
983
+ "Page.handleJavaScriptDialog",
984
+ params,
985
+ session_id=dialog.cdp_session_id or None,
986
+ timeout=5.0,
987
+ )
988
+ finally:
989
+ # Clear regardless — the CDP error path usually means the dialog
990
+ # already closed (browser auto-dismissed after navigation, etc.).
991
+ with self._state_lock:
992
+ if dialog.id in self._pending_dialogs:
993
+ self._pending_dialogs.pop(dialog.id, None)
994
+ self._archive_dialog_locked(dialog, "agent")
995
+ handle = self._dialog_watchdogs.pop(dialog.id, None)
996
+ if handle is not None:
997
+ handle.cancel()
998
+
999
+ async def _on_dialog_closed(
1000
+ self, params: Dict[str, Any], session_id: Optional[str]
1001
+ ) -> None:
1002
+ # ``Page.javascriptDialogClosed`` spec has only ``result`` (bool) and
1003
+ # ``userInput`` (string), not the original ``message``. Match by
1004
+ # session id and clear the oldest dialog on that session — if Chrome
1005
+ # closed one on us (e.g. our disconnect auto-dismissed it, or the
1006
+ # browser navigated, or Browserbase's CDP proxy auto-dismissed), there
1007
+ # shouldn't be more than one in flight per session anyway because the
1008
+ # JS thread is blocked while a dialog is up.
1009
+ with self._state_lock:
1010
+ candidate_ids = [
1011
+ d.id
1012
+ for d in self._pending_dialogs.values()
1013
+ if d.cdp_session_id == session_id
1014
+ # Bridge-captured dialogs aren't cleared by native close events;
1015
+ # they're resolved via Fetch.fulfillRequest instead. Only the
1016
+ # real-native-dialog path uses Page.javascriptDialogClosed.
1017
+ and d.bridge_request_id is None
1018
+ ]
1019
+ if candidate_ids:
1020
+ did = candidate_ids[0]
1021
+ dialog = self._pending_dialogs.pop(did, None)
1022
+ if dialog is not None:
1023
+ self._archive_dialog_locked(dialog, "remote")
1024
+ handle = self._dialog_watchdogs.pop(did, None)
1025
+ if handle is not None:
1026
+ handle.cancel()
1027
+
1028
+ async def _on_fetch_paused(
1029
+ self, params: Dict[str, Any], session_id: Optional[str]
1030
+ ) -> None:
1031
+ """Bridge XHR captured mid-flight — materialize as a pending dialog.
1032
+
1033
+ The injected script (``_DIALOG_BRIDGE_SCRIPT``) fires a synchronous
1034
+ XHR to ``DIALOG_BRIDGE_HOST`` whenever page code calls alert/confirm/
1035
+ prompt. We catch it via Fetch.enable pattern; the page's JS thread
1036
+ is blocked on the XHR's response until we call Fetch.fulfillRequest
1037
+ (which happens from ``respond_to_dialog``) or until the watchdog
1038
+ fires (at which point we fulfill with a cancel response).
1039
+ """
1040
+ url = str(params.get("request", {}).get("url") or "")
1041
+ request_id = params.get("requestId")
1042
+ if not request_id:
1043
+ return
1044
+ # Only care about our bridge URLs. Fetch can still deliver other
1045
+ # intercepted requests if patterns were ever broadened.
1046
+ if DIALOG_BRIDGE_HOST not in url:
1047
+ # Not ours — forward unchanged so the page sees its own request.
1048
+ try:
1049
+ await self._cdp(
1050
+ "Fetch.continueRequest", {"requestId": request_id},
1051
+ session_id=session_id, timeout=3.0,
1052
+ )
1053
+ except Exception:
1054
+ pass
1055
+ return
1056
+
1057
+ # Parse query string for dialog metadata. Use urllib to be robust.
1058
+ from urllib.parse import urlparse, parse_qs
1059
+ q = parse_qs(urlparse(url).query)
1060
+
1061
+ def _q(name: str) -> str:
1062
+ v = q.get(name, [""])
1063
+ return v[0] if v else ""
1064
+
1065
+ kind = _q("kind") or "alert"
1066
+ message = _q("message")
1067
+ default_prompt = _q("default_prompt")
1068
+
1069
+ self._dialog_seq += 1
1070
+ dialog = PendingDialog(
1071
+ id=f"d-{self._dialog_seq}",
1072
+ type=kind,
1073
+ message=message,
1074
+ default_prompt=default_prompt,
1075
+ opened_at=time.time(),
1076
+ cdp_session_id=session_id or self._page_session_id or "",
1077
+ frame_id=params.get("frameId"),
1078
+ bridge_request_id=str(request_id),
1079
+ )
1080
+
1081
+ # Apply policy exactly as for native dialogs.
1082
+ if self.dialog_policy == DIALOG_POLICY_AUTO_DISMISS:
1083
+ with self._state_lock:
1084
+ self._archive_dialog_locked(dialog, "auto_policy")
1085
+ asyncio.create_task(
1086
+ self._fulfill_bridge_request(dialog, accept=False, prompt_text="")
1087
+ )
1088
+ elif self.dialog_policy == DIALOG_POLICY_AUTO_ACCEPT:
1089
+ with self._state_lock:
1090
+ self._archive_dialog_locked(dialog, "auto_policy")
1091
+ asyncio.create_task(
1092
+ self._fulfill_bridge_request(
1093
+ dialog, accept=True, prompt_text=default_prompt
1094
+ )
1095
+ )
1096
+ else:
1097
+ # must_respond — add to pending + arm watchdog.
1098
+ with self._state_lock:
1099
+ self._pending_dialogs[dialog.id] = dialog
1100
+ loop = asyncio.get_running_loop()
1101
+ handle = loop.call_later(
1102
+ self.dialog_timeout_s,
1103
+ lambda: asyncio.create_task(self._dialog_timeout_expired(dialog.id)),
1104
+ )
1105
+ self._dialog_watchdogs[dialog.id] = handle
1106
+
1107
+ async def _fulfill_bridge_request(
1108
+ self, dialog: PendingDialog, *, accept: bool, prompt_text: str
1109
+ ) -> None:
1110
+ """Resolve a bridge XHR via Fetch.fulfillRequest so the page unblocks."""
1111
+ if not dialog.bridge_request_id:
1112
+ return
1113
+ payload = {
1114
+ "accept": bool(accept),
1115
+ "prompt_text": prompt_text if dialog.type == "prompt" else "",
1116
+ "dialog_id": dialog.id,
1117
+ }
1118
+ body = json.dumps(payload).encode()
1119
+ try:
1120
+ import base64 as _b64
1121
+ await self._cdp(
1122
+ "Fetch.fulfillRequest",
1123
+ {
1124
+ "requestId": dialog.bridge_request_id,
1125
+ "responseCode": 200,
1126
+ "responseHeaders": [
1127
+ {"name": "Content-Type", "value": "application/json"},
1128
+ {"name": "Access-Control-Allow-Origin", "value": "*"},
1129
+ ],
1130
+ "body": _b64.b64encode(body).decode(),
1131
+ },
1132
+ session_id=dialog.cdp_session_id or None,
1133
+ timeout=5.0,
1134
+ )
1135
+ except Exception as e:
1136
+ logger.debug("bridge fulfill failed for %s: %s", dialog.id, e)
1137
+
1138
+ # ── Frame / target tracking ─────────────────────────────────────────────
1139
+
1140
+ def _on_frame_attached(
1141
+ self, params: Dict[str, Any], session_id: Optional[str]
1142
+ ) -> None:
1143
+ frame_id = params.get("frameId")
1144
+ if not frame_id:
1145
+ return
1146
+ with self._state_lock:
1147
+ self._frames[frame_id] = FrameInfo(
1148
+ frame_id=frame_id,
1149
+ url="",
1150
+ origin="",
1151
+ parent_frame_id=params.get("parentFrameId"),
1152
+ is_oopif=False,
1153
+ cdp_session_id=session_id,
1154
+ )
1155
+
1156
+ def _on_frame_navigated(
1157
+ self, params: Dict[str, Any], session_id: Optional[str]
1158
+ ) -> None:
1159
+ frame = params.get("frame") or {}
1160
+ frame_id = frame.get("id")
1161
+ if not frame_id:
1162
+ return
1163
+ with self._state_lock:
1164
+ existing = self._frames.get(frame_id)
1165
+ info = FrameInfo(
1166
+ frame_id=frame_id,
1167
+ url=str(frame.get("url") or ""),
1168
+ origin=str(frame.get("securityOrigin") or frame.get("origin") or ""),
1169
+ parent_frame_id=frame.get("parentId") or (existing.parent_frame_id if existing else None),
1170
+ is_oopif=bool(existing.is_oopif if existing else False),
1171
+ cdp_session_id=existing.cdp_session_id if existing else session_id,
1172
+ name=str(frame.get("name") or (existing.name if existing else "")),
1173
+ )
1174
+ self._frames[frame_id] = info
1175
+
1176
+ def _on_frame_detached(
1177
+ self, params: Dict[str, Any], session_id: Optional[str]
1178
+ ) -> None:
1179
+ """Remove a frame from our state only when it's truly gone.
1180
+
1181
+ CDP emits ``Page.frameDetached`` with a ``reason`` of either
1182
+ ``"remove"`` (the frame is actually gone from the DOM) or ``"swap"``
1183
+ (the frame is migrating to a new process — typical when a
1184
+ same-process iframe becomes an OOPIF, or when history navigates).
1185
+ Dropping on ``swap`` would hide OOPIFs from the agent the moment
1186
+ Chromium promotes them to their own process, so treat swap as a
1187
+ no-op.
1188
+
1189
+ Even with ``reason=remove``, the parent page's perspective is
1190
+ "the child frame left MY process tree" — which is what happens
1191
+ when a same-origin iframe gets promoted to an OOPIF. If we
1192
+ already have a live child CDP session attached for that frame_id,
1193
+ the frame is still very much alive; only drop it when we have
1194
+ no session record.
1195
+ """
1196
+ frame_id = params.get("frameId")
1197
+ if not frame_id:
1198
+ return
1199
+ reason = str(params.get("reason") or "remove").lower()
1200
+ if reason == "swap":
1201
+ return
1202
+ with self._state_lock:
1203
+ existing = self._frames.get(frame_id)
1204
+ # Keep OOPIF records even when the parent says the frame was
1205
+ # "removed" — the iframe is still visible, just in a different
1206
+ # process. If the frame truly goes away later, Target.detached
1207
+ # + the next Page.frameDetached without a live session will
1208
+ # clear it.
1209
+ if existing and existing.is_oopif and existing.cdp_session_id:
1210
+ return
1211
+ self._frames.pop(frame_id, None)
1212
+
1213
+ async def _on_target_attached(self, params: Dict[str, Any]) -> None:
1214
+ info = params.get("targetInfo") or {}
1215
+ sid = params.get("sessionId")
1216
+ target_type = info.get("type")
1217
+ if not sid or target_type not in {"iframe", "worker"}:
1218
+ return
1219
+ self._child_sessions[sid] = {"info": info, "type": target_type}
1220
+
1221
+ # Record the frame with its OOPIF session id for interaction routing.
1222
+ if target_type == "iframe":
1223
+ target_id = info.get("targetId")
1224
+ with self._state_lock:
1225
+ existing = self._frames.get(target_id)
1226
+ self._frames[target_id] = FrameInfo(
1227
+ frame_id=target_id,
1228
+ url=str(info.get("url") or ""),
1229
+ origin="", # filled by frameNavigated on the child session
1230
+ parent_frame_id=(existing.parent_frame_id if existing else None),
1231
+ is_oopif=True,
1232
+ cdp_session_id=sid,
1233
+ name=str(info.get("title") or (existing.name if existing else "")),
1234
+ )
1235
+
1236
+ # Enable domains on the child off-loop so the reader keeps pumping.
1237
+ # Awaiting the CDP replies here would deadlock because only the
1238
+ # reader can resolve those replies' Futures.
1239
+ asyncio.create_task(self._enable_child_domains(sid))
1240
+
1241
+ async def _enable_child_domains(self, sid: str) -> None:
1242
+ """Enable Page+Runtime (+nested setAutoAttach) on a child CDP session.
1243
+
1244
+ Also installs the dialog bridge so iframe-scoped alert/confirm/prompt
1245
+ calls round-trip through Fetch too.
1246
+ """
1247
+ try:
1248
+ await self._cdp("Page.enable", session_id=sid, timeout=3.0)
1249
+ await self._cdp("Runtime.enable", session_id=sid, timeout=3.0)
1250
+ await self._cdp(
1251
+ "Target.setAutoAttach",
1252
+ {"autoAttach": True, "waitForDebuggerOnStart": False, "flatten": True},
1253
+ session_id=sid,
1254
+ timeout=3.0,
1255
+ )
1256
+ except Exception as e:
1257
+ logger.debug("child session %s setup failed: %s", sid[:16], e)
1258
+ # Install the dialog bridge on the child so iframe dialogs are captured.
1259
+ await self._install_dialog_bridge(sid)
1260
+
1261
+ def _on_target_detached(self, params: Dict[str, Any]) -> None:
1262
+ """Handle a child CDP session detaching.
1263
+
1264
+ We deliberately DO NOT drop frames from ``_frames`` here — Browserbase
1265
+ fires transient detach events during page transitions even while the
1266
+ iframe is still visible to the user, and dropping the record hides
1267
+ OOPIFs from the agent between the detach and the next
1268
+ ``Target.attachedToTarget``. Instead, we just clear the session
1269
+ binding so stale ``cdp_session_id`` values aren't used for routing.
1270
+ If the iframe truly goes away, ``Page.frameDetached`` will clean up.
1271
+ """
1272
+ sid = params.get("sessionId")
1273
+ if not sid:
1274
+ return
1275
+ self._child_sessions.pop(sid, None)
1276
+ with self._state_lock:
1277
+ for fid, frame in list(self._frames.items()):
1278
+ if frame.cdp_session_id == sid:
1279
+ # Replace with a copy that has cdp_session_id cleared so
1280
+ # routing falls back to top-level page session if retried.
1281
+ self._frames[fid] = FrameInfo(
1282
+ frame_id=frame.frame_id,
1283
+ url=frame.url,
1284
+ origin=frame.origin,
1285
+ parent_frame_id=frame.parent_frame_id,
1286
+ is_oopif=frame.is_oopif,
1287
+ cdp_session_id=None,
1288
+ name=frame.name,
1289
+ )
1290
+
1291
+ # ── Console / exception ring buffer ─────────────────────────────────────
1292
+
1293
+ def _on_console(self, params: Dict[str, Any], *, level_from: str) -> None:
1294
+ if level_from == "exception":
1295
+ details = params.get("exceptionDetails") or {}
1296
+ text = str(details.get("text") or "")
1297
+ url = details.get("url")
1298
+ event = ConsoleEvent(ts=time.time(), level="exception", text=text, url=url)
1299
+ else:
1300
+ raw_level = str(params.get("type") or "log")
1301
+ level = "error" if raw_level in {"error", "assert"} else (
1302
+ "warning" if raw_level == "warning" else "log"
1303
+ )
1304
+ args = params.get("args") or []
1305
+ parts: List[str] = []
1306
+ for a in args[:4]:
1307
+ if isinstance(a, dict):
1308
+ parts.append(str(a.get("value") or a.get("description") or ""))
1309
+ event = ConsoleEvent(ts=time.time(), level=level, text=" ".join(parts))
1310
+ with self._state_lock:
1311
+ self._console_events.append(event)
1312
+ if len(self._console_events) > CONSOLE_HISTORY_MAX * 2:
1313
+ # Keep last CONSOLE_HISTORY_MAX; allow 2x slack to reduce churn.
1314
+ self._console_events = self._console_events[-CONSOLE_HISTORY_MAX:]
1315
+
1316
+ # ── Frame tree building (bounded) ───────────────────────────────────────
1317
+
1318
+ def _build_frame_tree_locked(self) -> Dict[str, Any]:
1319
+ """Build the capped frame_tree payload. Must be called under state lock."""
1320
+ frames = self._frames
1321
+ if not frames:
1322
+ return {"top": None, "children": [], "truncated": False}
1323
+
1324
+ # Identify a top frame — one with no parent, preferring oopif=False.
1325
+ tops = [f for f in frames.values() if not f.parent_frame_id]
1326
+ top = next((f for f in tops if not f.is_oopif), tops[0] if tops else None)
1327
+
1328
+ # BFS from top, capped by FRAME_TREE_MAX_ENTRIES and
1329
+ # FRAME_TREE_MAX_OOPIF_DEPTH for OOPIF branches.
1330
+ children: List[Dict[str, Any]] = []
1331
+ truncated = False
1332
+ if top is None:
1333
+ return {"top": None, "children": [], "truncated": False}
1334
+
1335
+ queue: List[Tuple[FrameInfo, int]] = [
1336
+ (f, 1) for f in frames.values() if f.parent_frame_id == top.frame_id
1337
+ ]
1338
+ visited: set[str] = {top.frame_id}
1339
+ while queue and len(children) < FRAME_TREE_MAX_ENTRIES:
1340
+ frame, depth = queue.pop(0)
1341
+ if frame.frame_id in visited:
1342
+ continue
1343
+ visited.add(frame.frame_id)
1344
+ if frame.is_oopif and depth > FRAME_TREE_MAX_OOPIF_DEPTH:
1345
+ truncated = True
1346
+ continue
1347
+ children.append(frame.to_dict())
1348
+ for f in frames.values():
1349
+ if f.parent_frame_id == frame.frame_id and f.frame_id not in visited:
1350
+ queue.append((f, depth + 1))
1351
+ if queue:
1352
+ truncated = True
1353
+
1354
+ return {
1355
+ "top": top.to_dict(),
1356
+ "children": children,
1357
+ "truncated": truncated,
1358
+ }
1359
+
1360
+
1361
+ # ── Registry ─────────────────────────────────────────────────────────────────
1362
+
1363
+
1364
+ class _SupervisorRegistry:
1365
+ """Process-global (task_id → supervisor) map with idempotent start/stop.
1366
+
1367
+ One instance, exposed as ``SUPERVISOR_REGISTRY``. Safe to call from any
1368
+ thread — mutations go through ``_lock``.
1369
+ """
1370
+
1371
+ def __init__(self) -> None:
1372
+ self._lock = threading.Lock()
1373
+ self._by_task: Dict[str, CDPSupervisor] = {}
1374
+
1375
+ def get(self, task_id: str) -> Optional[CDPSupervisor]:
1376
+ """Return the supervisor for ``task_id`` if running, else ``None``."""
1377
+ with self._lock:
1378
+ return self._by_task.get(task_id)
1379
+
1380
+ def get_or_start(
1381
+ self,
1382
+ task_id: str,
1383
+ cdp_url: str,
1384
+ *,
1385
+ dialog_policy: str = DEFAULT_DIALOG_POLICY,
1386
+ dialog_timeout_s: float = DEFAULT_DIALOG_TIMEOUT_S,
1387
+ start_timeout: float = 15.0,
1388
+ ) -> CDPSupervisor:
1389
+ """Idempotently ensure a supervisor is running for ``(task_id, cdp_url)``.
1390
+
1391
+ If a supervisor exists for this task but was bound to a different
1392
+ ``cdp_url``, the old one is stopped and a fresh one is started.
1393
+ """
1394
+ with self._lock:
1395
+ existing = self._by_task.get(task_id)
1396
+ if existing is not None:
1397
+ if existing.cdp_url == cdp_url:
1398
+ thread_ok = existing._thread is not None and existing._thread.is_alive()
1399
+ loop_ok = existing._loop is not None and existing._loop.is_running()
1400
+ if thread_ok and loop_ok:
1401
+ return existing
1402
+ # Unhealthy — tear down and recreate.
1403
+ # URL changed or unhealthy — tear down, fall through to re-create.
1404
+ self._by_task.pop(task_id, None)
1405
+ if existing is not None:
1406
+ existing.stop()
1407
+
1408
+ supervisor = CDPSupervisor(
1409
+ task_id=task_id,
1410
+ cdp_url=cdp_url,
1411
+ dialog_policy=dialog_policy,
1412
+ dialog_timeout_s=dialog_timeout_s,
1413
+ )
1414
+ supervisor.start(timeout=start_timeout)
1415
+ with self._lock:
1416
+ # Guard against a concurrent get_or_start from another thread.
1417
+ already = self._by_task.get(task_id)
1418
+ if already is not None and already.cdp_url == cdp_url:
1419
+ supervisor.stop()
1420
+ return already
1421
+ self._by_task[task_id] = supervisor
1422
+ return supervisor
1423
+
1424
+ def stop(self, task_id: str) -> None:
1425
+ """Stop and discard the supervisor for ``task_id`` if it exists."""
1426
+ with self._lock:
1427
+ supervisor = self._by_task.pop(task_id, None)
1428
+ if supervisor is not None:
1429
+ supervisor.stop()
1430
+
1431
+ def stop_all(self) -> None:
1432
+ """Stop every running supervisor. For shutdown / test teardown."""
1433
+ with self._lock:
1434
+ items = list(self._by_task.items())
1435
+ self._by_task.clear()
1436
+ for _, supervisor in items:
1437
+ supervisor.stop()
1438
+
1439
+
1440
+ SUPERVISOR_REGISTRY = _SupervisorRegistry()
1441
+
1442
+
1443
+ __all__ = [
1444
+ "CDPSupervisor",
1445
+ "ConsoleEvent",
1446
+ "DEFAULT_DIALOG_POLICY",
1447
+ "DEFAULT_DIALOG_TIMEOUT_S",
1448
+ "DIALOG_POLICY_AUTO_ACCEPT",
1449
+ "DIALOG_POLICY_AUTO_DISMISS",
1450
+ "DIALOG_POLICY_MUST_RESPOND",
1451
+ "DialogRecord",
1452
+ "FrameInfo",
1453
+ "PendingDialog",
1454
+ "SUPERVISOR_REGISTRY",
1455
+ "SupervisorSnapshot",
1456
+ "_SupervisorRegistry",
1457
+ ]