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,1509 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Trajectory Compressor
4
+
5
+ Post-processes completed agent trajectories to compress them within a target
6
+ token budget while preserving training signal quality.
7
+
8
+ Compression Strategy:
9
+ 1. Protect first turns (system, human, first gpt, first tool)
10
+ 2. Protect last N turns (final actions and conclusions)
11
+ 3. Compress MIDDLE turns only, starting from 2nd tool response
12
+ 4. Compress only as much as needed to fit under target
13
+ 5. Replace compressed region with a single human summary message
14
+ 6. Keep remaining tool calls intact (model continues working after summary)
15
+
16
+ Usage:
17
+ # Compress a directory of JSONL files
18
+ python trajectory_compressor.py --input=data/my_run
19
+
20
+ # Compress a single JSONL file
21
+ python trajectory_compressor.py --input=data/trajectories.jsonl
22
+
23
+ # Compress 15% sample of a file
24
+ python trajectory_compressor.py --input=data/trajectories.jsonl --sample_percent=15
25
+
26
+ # Compress with custom output and token target
27
+ python trajectory_compressor.py --input=data/trajectories.jsonl --output=compressed.jsonl --target_max_tokens=16000
28
+
29
+ # Compress 10% sample from a directory
30
+ python trajectory_compressor.py --input=data/my_run --sample_percent=10
31
+ """
32
+
33
+ import json
34
+ import os
35
+ import time
36
+ import yaml
37
+ import logging
38
+ import asyncio
39
+ from pathlib import Path
40
+ from typing import List, Dict, Any, Optional, Tuple
41
+ from dataclasses import dataclass, field
42
+ from datetime import datetime
43
+
44
+ from utils import base_url_host_matches, base_url_hostname
45
+ import fire
46
+ from rich.progress import Progress, SpinnerColumn, TextColumn, BarColumn, TaskProgressColumn, TimeElapsedColumn, TimeRemainingColumn
47
+ from rich.console import Console
48
+ from calvyn_constants import OPENROUTER_BASE_URL, get_hermes_home
49
+ from agent.retry_utils import jittered_backoff
50
+
51
+ # Load .env from HERMES_HOME first, then project root as a dev fallback.
52
+ from hermes_cli.env_loader import load_hermes_dotenv
53
+
54
+ _hermes_home = get_hermes_home()
55
+ _project_env = Path(__file__).parent / ".env"
56
+ load_hermes_dotenv(hermes_home=_hermes_home, project_env=_project_env)
57
+
58
+
59
+ def _effective_temperature_for_model(
60
+ model: str,
61
+ requested_temperature: float,
62
+ base_url: Optional[str] = None,
63
+ ) -> Optional[float]:
64
+ """Apply fixed model temperature contracts to direct client calls.
65
+
66
+ Returns ``None`` when the model manages temperature server-side (Kimi);
67
+ callers must omit the ``temperature`` kwarg entirely in that case.
68
+ """
69
+ try:
70
+ from agent.auxiliary_client import _fixed_temperature_for_model, OMIT_TEMPERATURE
71
+ except Exception:
72
+ return requested_temperature
73
+
74
+ fixed_temperature = _fixed_temperature_for_model(model, base_url)
75
+ if fixed_temperature is OMIT_TEMPERATURE:
76
+ return None # caller must omit temperature
77
+ if fixed_temperature is not None:
78
+ return fixed_temperature
79
+ return requested_temperature
80
+
81
+
82
+ @dataclass
83
+ class CompressionConfig:
84
+ """Configuration for trajectory compression."""
85
+ # Tokenizer
86
+ tokenizer_name: str = "moonshotai/Kimi-K2-Thinking"
87
+ trust_remote_code: bool = True
88
+
89
+ # Compression targets
90
+ target_max_tokens: int = 15250
91
+ summary_target_tokens: int = 750
92
+
93
+ # Protected turns
94
+ protect_first_system: bool = True
95
+ protect_first_human: bool = True
96
+ protect_first_gpt: bool = True
97
+ protect_first_tool: bool = True
98
+ protect_last_n_turns: int = 4
99
+
100
+ # Summarization (OpenRouter)
101
+ summarization_model: str = "google/gemini-3-flash-preview"
102
+ base_url: str = OPENROUTER_BASE_URL
103
+ api_key_env: str = "OPENROUTER_API_KEY"
104
+ temperature: float = 0.3
105
+ max_retries: int = 3
106
+ retry_delay: int = 2
107
+
108
+ # Output
109
+ add_summary_notice: bool = True
110
+ summary_notice_text: str = "\n\nSome of your previous tool responses may be summarized to preserve context."
111
+ output_suffix: str = "_compressed"
112
+
113
+ # Processing
114
+ num_workers: int = 4
115
+ max_concurrent_requests: int = 50 # Max concurrent API calls for summarization
116
+ skip_under_target: bool = True
117
+ save_over_limit: bool = True
118
+ per_trajectory_timeout: int = 300 # Timeout per trajectory in seconds (default: 5 min)
119
+
120
+ # Metrics
121
+ metrics_enabled: bool = True
122
+ metrics_per_trajectory: bool = True
123
+ metrics_output_file: str = "compression_metrics.json"
124
+
125
+ @classmethod
126
+ def from_yaml(cls, yaml_path: str) -> "CompressionConfig":
127
+ """Load configuration from YAML file."""
128
+ with open(yaml_path, 'r', encoding="utf-8") as f:
129
+ data = yaml.safe_load(f)
130
+
131
+ config = cls()
132
+
133
+ # Tokenizer
134
+ if 'tokenizer' in data:
135
+ config.tokenizer_name = data['tokenizer'].get('name', config.tokenizer_name)
136
+ config.trust_remote_code = data['tokenizer'].get('trust_remote_code', config.trust_remote_code)
137
+
138
+ # Compression
139
+ if 'compression' in data:
140
+ config.target_max_tokens = data['compression'].get('target_max_tokens', config.target_max_tokens)
141
+ config.summary_target_tokens = data['compression'].get('summary_target_tokens', config.summary_target_tokens)
142
+
143
+ # Protected turns
144
+ if 'protected_turns' in data:
145
+ config.protect_first_system = data['protected_turns'].get('first_system', config.protect_first_system)
146
+ config.protect_first_human = data['protected_turns'].get('first_human', config.protect_first_human)
147
+ config.protect_first_gpt = data['protected_turns'].get('first_gpt', config.protect_first_gpt)
148
+ config.protect_first_tool = data['protected_turns'].get('first_tool', config.protect_first_tool)
149
+ config.protect_last_n_turns = data['protected_turns'].get('last_n_turns', config.protect_last_n_turns)
150
+
151
+ # Summarization
152
+ if 'summarization' in data:
153
+ config.summarization_model = data['summarization'].get('model', config.summarization_model)
154
+ config.base_url = data['summarization'].get('base_url') or config.base_url
155
+ config.api_key_env = data['summarization'].get('api_key_env', config.api_key_env)
156
+ config.temperature = data['summarization'].get('temperature', config.temperature)
157
+ config.max_retries = data['summarization'].get('max_retries', config.max_retries)
158
+ config.retry_delay = data['summarization'].get('retry_delay', config.retry_delay)
159
+
160
+ # Output
161
+ if 'output' in data:
162
+ config.add_summary_notice = data['output'].get('add_summary_notice', config.add_summary_notice)
163
+ config.summary_notice_text = data['output'].get('summary_notice_text', config.summary_notice_text)
164
+ config.output_suffix = data['output'].get('output_suffix', config.output_suffix)
165
+
166
+ # Processing
167
+ if 'processing' in data:
168
+ config.num_workers = data['processing'].get('num_workers', config.num_workers)
169
+ config.max_concurrent_requests = data['processing'].get('max_concurrent_requests', config.max_concurrent_requests)
170
+ config.skip_under_target = data['processing'].get('skip_under_target', config.skip_under_target)
171
+ config.save_over_limit = data['processing'].get('save_over_limit', config.save_over_limit)
172
+
173
+ # Metrics
174
+ if 'metrics' in data:
175
+ config.metrics_enabled = data['metrics'].get('enabled', config.metrics_enabled)
176
+ config.metrics_per_trajectory = data['metrics'].get('per_trajectory', config.metrics_per_trajectory)
177
+ config.metrics_output_file = data['metrics'].get('output_file', config.metrics_output_file)
178
+
179
+ return config
180
+
181
+
182
+ @dataclass
183
+ class TrajectoryMetrics:
184
+ """Metrics for a single trajectory compression."""
185
+ original_tokens: int = 0
186
+ compressed_tokens: int = 0
187
+ tokens_saved: int = 0
188
+ compression_ratio: float = 1.0
189
+
190
+ original_turns: int = 0
191
+ compressed_turns: int = 0
192
+ turns_removed: int = 0
193
+
194
+ turns_compressed_start_idx: int = -1
195
+ turns_compressed_end_idx: int = -1
196
+ turns_in_compressed_region: int = 0
197
+
198
+ was_compressed: bool = False
199
+ still_over_limit: bool = False
200
+ skipped_under_target: bool = False
201
+
202
+ summarization_api_calls: int = 0
203
+ summarization_errors: int = 0
204
+
205
+ def to_dict(self) -> Dict[str, Any]:
206
+ return {
207
+ "original_tokens": self.original_tokens,
208
+ "compressed_tokens": self.compressed_tokens,
209
+ "tokens_saved": self.tokens_saved,
210
+ "compression_ratio": round(self.compression_ratio, 4),
211
+ "original_turns": self.original_turns,
212
+ "compressed_turns": self.compressed_turns,
213
+ "turns_removed": self.turns_removed,
214
+ "compression_region": {
215
+ "start_idx": self.turns_compressed_start_idx,
216
+ "end_idx": self.turns_compressed_end_idx,
217
+ "turns_count": self.turns_in_compressed_region,
218
+ },
219
+ "was_compressed": self.was_compressed,
220
+ "still_over_limit": self.still_over_limit,
221
+ "skipped_under_target": self.skipped_under_target,
222
+ "summarization_api_calls": self.summarization_api_calls,
223
+ "summarization_errors": self.summarization_errors,
224
+ }
225
+
226
+
227
+ @dataclass
228
+ class AggregateMetrics:
229
+ """Aggregate metrics across all trajectories."""
230
+ total_trajectories: int = 0
231
+ trajectories_compressed: int = 0
232
+ trajectories_skipped_under_target: int = 0
233
+ trajectories_still_over_limit: int = 0
234
+ trajectories_failed: int = 0
235
+
236
+ total_tokens_before: int = 0
237
+ total_tokens_after: int = 0
238
+ total_tokens_saved: int = 0
239
+
240
+ total_turns_before: int = 0
241
+ total_turns_after: int = 0
242
+ total_turns_removed: int = 0
243
+
244
+ total_summarization_calls: int = 0
245
+ total_summarization_errors: int = 0
246
+
247
+ # Distribution stats
248
+ compression_ratios: List[float] = field(default_factory=list)
249
+ tokens_saved_list: List[int] = field(default_factory=list)
250
+ turns_removed_list: List[int] = field(default_factory=list)
251
+
252
+ processing_start_time: str = ""
253
+ processing_end_time: str = ""
254
+ processing_duration_seconds: float = 0.0
255
+
256
+ def add_trajectory_metrics(self, metrics: TrajectoryMetrics):
257
+ """Add a trajectory's metrics to the aggregate."""
258
+ self.total_trajectories += 1
259
+ self.total_tokens_before += metrics.original_tokens
260
+ self.total_tokens_after += metrics.compressed_tokens
261
+ self.total_tokens_saved += metrics.tokens_saved
262
+ self.total_turns_before += metrics.original_turns
263
+ self.total_turns_after += metrics.compressed_turns
264
+ self.total_turns_removed += metrics.turns_removed
265
+ self.total_summarization_calls += metrics.summarization_api_calls
266
+ self.total_summarization_errors += metrics.summarization_errors
267
+
268
+ if metrics.was_compressed:
269
+ self.trajectories_compressed += 1
270
+ self.compression_ratios.append(metrics.compression_ratio)
271
+ self.tokens_saved_list.append(metrics.tokens_saved)
272
+ self.turns_removed_list.append(metrics.turns_removed)
273
+
274
+ if metrics.skipped_under_target:
275
+ self.trajectories_skipped_under_target += 1
276
+
277
+ if metrics.still_over_limit:
278
+ self.trajectories_still_over_limit += 1
279
+
280
+ def to_dict(self) -> Dict[str, Any]:
281
+ avg_compression_ratio = (
282
+ sum(self.compression_ratios) / len(self.compression_ratios)
283
+ if self.compression_ratios else 1.0
284
+ )
285
+ avg_tokens_saved = (
286
+ sum(self.tokens_saved_list) / len(self.tokens_saved_list)
287
+ if self.tokens_saved_list else 0
288
+ )
289
+ avg_turns_removed = (
290
+ sum(self.turns_removed_list) / len(self.turns_removed_list)
291
+ if self.turns_removed_list else 0
292
+ )
293
+
294
+ return {
295
+ "summary": {
296
+ "total_trajectories": self.total_trajectories,
297
+ "trajectories_compressed": self.trajectories_compressed,
298
+ "trajectories_skipped_under_target": self.trajectories_skipped_under_target,
299
+ "trajectories_still_over_limit": self.trajectories_still_over_limit,
300
+ "trajectories_failed": self.trajectories_failed,
301
+ "compression_rate": round(self.trajectories_compressed / max(self.total_trajectories, 1), 4),
302
+ },
303
+ "tokens": {
304
+ "total_before": self.total_tokens_before,
305
+ "total_after": self.total_tokens_after,
306
+ "total_saved": self.total_tokens_saved,
307
+ "overall_compression_ratio": round(self.total_tokens_after / max(self.total_tokens_before, 1), 4),
308
+ },
309
+ "turns": {
310
+ "total_before": self.total_turns_before,
311
+ "total_after": self.total_turns_after,
312
+ "total_removed": self.total_turns_removed,
313
+ },
314
+ "averages": {
315
+ "avg_compression_ratio": round(avg_compression_ratio, 4),
316
+ "avg_tokens_saved_per_compressed": round(avg_tokens_saved, 1),
317
+ "avg_turns_removed_per_compressed": round(avg_turns_removed, 2),
318
+ },
319
+ "summarization": {
320
+ "total_api_calls": self.total_summarization_calls,
321
+ "total_errors": self.total_summarization_errors,
322
+ "success_rate": round(1 - (self.total_summarization_errors / max(self.total_summarization_calls, 1)), 4),
323
+ },
324
+ "processing": {
325
+ "start_time": self.processing_start_time,
326
+ "end_time": self.processing_end_time,
327
+ "duration_seconds": round(self.processing_duration_seconds, 2),
328
+ },
329
+ }
330
+
331
+
332
+ class TrajectoryCompressor:
333
+ """
334
+ Compresses agent trajectories to fit within a target token budget.
335
+
336
+ Compression strategy:
337
+ 1. Keep protected head turns (system, human, first gpt+tool)
338
+ 2. Keep protected tail turns (last N turns)
339
+ 3. From the compressible middle region, compress only as much as needed
340
+ 4. Replace compressed turns with a single human summary message
341
+ 5. Keep remaining middle turns intact (model continues with tools)
342
+ """
343
+
344
+ def __init__(self, config: CompressionConfig):
345
+ """Initialize the compressor."""
346
+ self.config = config
347
+ self.aggregate_metrics = AggregateMetrics()
348
+
349
+ # Initialize tokenizer
350
+ self._init_tokenizer()
351
+
352
+ # Initialize OpenRouter client
353
+ self._init_summarizer()
354
+
355
+ logging.basicConfig(
356
+ level=logging.INFO,
357
+ format='%(asctime)s - %(levelname)s - %(message)s',
358
+ datefmt='%H:%M:%S'
359
+ )
360
+ self.logger = logging.getLogger(__name__)
361
+
362
+ def _init_tokenizer(self):
363
+ """Initialize HuggingFace tokenizer for token counting."""
364
+ try:
365
+ from transformers import AutoTokenizer
366
+ self.tokenizer = AutoTokenizer.from_pretrained(
367
+ self.config.tokenizer_name,
368
+ trust_remote_code=self.config.trust_remote_code
369
+ )
370
+ print(f"āœ… Loaded tokenizer: {self.config.tokenizer_name}")
371
+ except Exception as e:
372
+ raise RuntimeError(f"Failed to load tokenizer '{self.config.tokenizer_name}': {e}")
373
+
374
+ def _init_summarizer(self):
375
+ """Initialize LLM routing for summarization (sync and async).
376
+
377
+ Uses call_llm/async_call_llm from the centralized provider router
378
+ which handles auth, headers, and provider detection internally.
379
+ For custom endpoints, falls back to raw client construction.
380
+ """
381
+
382
+ provider = self._detect_provider()
383
+ if provider:
384
+ # Store provider for use in _generate_summary calls
385
+ self._llm_provider = provider
386
+ self._use_call_llm = True
387
+ # Verify the provider is available
388
+ from agent.auxiliary_client import resolve_provider_client
389
+ client, _ = resolve_provider_client(
390
+ provider, model=self.config.summarization_model)
391
+ if client is None:
392
+ raise RuntimeError(
393
+ f"Provider '{provider}' is not configured. "
394
+ f"Check your API key or run: hermes setup")
395
+ self.client = None # Not used directly
396
+ self.async_client = None # Not used directly
397
+ else:
398
+ # Custom endpoint — use config's raw base_url + api_key_env
399
+ self._use_call_llm = False
400
+ api_key = os.getenv(self.config.api_key_env)
401
+ if not api_key:
402
+ raise RuntimeError(
403
+ f"Missing API key. Set {self.config.api_key_env} "
404
+ f"environment variable.")
405
+ from openai import OpenAI
406
+ from agent.auxiliary_client import _to_openai_base_url
407
+ self.client = OpenAI(
408
+ api_key=api_key, base_url=_to_openai_base_url(self.config.base_url))
409
+ # AsyncOpenAI is created lazily in _get_async_client() so it
410
+ # binds to the current event loop — avoids "Event loop is closed"
411
+ # when process_directory() is called multiple times (each call
412
+ # creates a new loop via asyncio.run()).
413
+ self.async_client = None
414
+ self._async_client_api_key = api_key
415
+
416
+ print(f"āœ… Initialized summarizer client: {self.config.summarization_model}")
417
+ print(f" Max concurrent requests: {self.config.max_concurrent_requests}")
418
+
419
+ def _get_async_client(self):
420
+ """Return an AsyncOpenAI client bound to the current event loop.
421
+
422
+ Created lazily so that each ``asyncio.run()`` call in
423
+ ``process_directory()`` gets a client tied to its own loop,
424
+ avoiding "Event loop is closed" errors on repeated calls.
425
+ """
426
+ from openai import AsyncOpenAI
427
+ from agent.auxiliary_client import _to_openai_base_url
428
+ # Always create a fresh client so it binds to the running loop.
429
+ self.async_client = AsyncOpenAI(
430
+ api_key=self._async_client_api_key,
431
+ base_url=_to_openai_base_url(self.config.base_url),
432
+ )
433
+ return self.async_client
434
+
435
+ def _detect_provider(self) -> str:
436
+ """Detect the provider name from the configured base_url."""
437
+ url = self.config.base_url or ""
438
+ if base_url_host_matches(url, "openrouter.ai"):
439
+ return "openrouter"
440
+ if base_url_host_matches(url, "nousresearch.com"):
441
+ return "nous"
442
+ if (
443
+ base_url_hostname(url) == "chatgpt.com"
444
+ and "/backend-api/codex" in url.lower()
445
+ ):
446
+ return "codex"
447
+ if base_url_host_matches(url, "z.ai"):
448
+ return "zai"
449
+ if (
450
+ base_url_host_matches(url, "moonshot.ai")
451
+ or base_url_host_matches(url, "moonshot.cn")
452
+ or base_url_host_matches(url, "api.kimi.com")
453
+ ):
454
+ return "kimi-coding"
455
+ if base_url_host_matches(url, "arcee.ai"):
456
+ return "arcee"
457
+ if base_url_host_matches(url, "minimaxi.com"):
458
+ return "minimax-cn"
459
+ if base_url_host_matches(url, "minimax.io"):
460
+ return "minimax"
461
+ # Unknown base_url — not a known provider
462
+ return ""
463
+
464
+ def count_tokens(self, text: str) -> int:
465
+ """Count tokens in text using the configured tokenizer."""
466
+ if not text:
467
+ return 0
468
+ try:
469
+ return len(self.tokenizer.encode(text))
470
+ except Exception:
471
+ # Fallback to character estimate
472
+ return len(text) // 4
473
+
474
+ def count_trajectory_tokens(self, trajectory: List[Dict[str, str]]) -> int:
475
+ """Count total tokens in a trajectory."""
476
+ return sum(self.count_tokens(turn.get("value", "")) for turn in trajectory)
477
+
478
+ def count_turn_tokens(self, trajectory: List[Dict[str, str]]) -> List[int]:
479
+ """Count tokens for each turn in a trajectory."""
480
+ return [self.count_tokens(turn.get("value", "")) for turn in trajectory]
481
+
482
+ def _find_protected_indices(self, trajectory: List[Dict[str, str]]) -> Tuple[set, int, int]:
483
+ """
484
+ Find indices of protected turns.
485
+
486
+ Returns:
487
+ Tuple of (protected_set, compressible_start, compressible_end)
488
+ """
489
+ n = len(trajectory)
490
+ protected = set()
491
+
492
+ # Track first occurrences
493
+ first_system = first_human = first_gpt = first_tool = None
494
+
495
+ for i, turn in enumerate(trajectory):
496
+ role = turn.get("from", "")
497
+ if role == "system" and first_system is None:
498
+ first_system = i
499
+ elif role == "human" and first_human is None:
500
+ first_human = i
501
+ elif role == "gpt" and first_gpt is None:
502
+ first_gpt = i
503
+ elif role == "tool" and first_tool is None:
504
+ first_tool = i
505
+
506
+ # Protect first turns
507
+ if self.config.protect_first_system and first_system is not None:
508
+ protected.add(first_system)
509
+ if self.config.protect_first_human and first_human is not None:
510
+ protected.add(first_human)
511
+ if self.config.protect_first_gpt and first_gpt is not None:
512
+ protected.add(first_gpt)
513
+ if self.config.protect_first_tool and first_tool is not None:
514
+ protected.add(first_tool)
515
+
516
+ # Protect last N turns
517
+ for i in range(max(0, n - self.config.protect_last_n_turns), n):
518
+ protected.add(i)
519
+
520
+ # Determine compressible region
521
+ # Start after the last protected head turn
522
+ head_protected = [i for i in protected if i < n // 2]
523
+ tail_protected = [i for i in protected if i >= n // 2]
524
+
525
+ compressible_start = max(head_protected) + 1 if head_protected else 0
526
+ compressible_end = min(tail_protected) if tail_protected else n
527
+
528
+ return protected, compressible_start, compressible_end
529
+
530
+ def _extract_turn_content_for_summary(self, trajectory: List[Dict[str, str]], start: int, end: int) -> str:
531
+ """
532
+ Extract content from turns to be summarized.
533
+
534
+ Args:
535
+ trajectory: Full trajectory
536
+ start: Start index (inclusive)
537
+ end: End index (exclusive)
538
+
539
+ Returns:
540
+ Formatted string of turn contents for summarization
541
+ """
542
+ parts = []
543
+ for i in range(start, end):
544
+ turn = trajectory[i]
545
+ role = turn.get("from", "unknown")
546
+ value = turn.get("value", "")
547
+
548
+ # Truncate very long values for the summary prompt
549
+ if len(value) > 3000:
550
+ value = value[:1500] + "\n...[truncated]...\n" + value[-500:]
551
+
552
+ parts.append(f"[Turn {i} - {role.upper()}]:\n{value}")
553
+
554
+ return "\n\n".join(parts)
555
+
556
+ @staticmethod
557
+ def _coerce_summary_content(content: Any) -> str:
558
+ """Normalize summary-model output to a safe string."""
559
+ if not isinstance(content, str):
560
+ content = str(content) if content else ""
561
+ return content.strip()
562
+
563
+ @staticmethod
564
+ def _ensure_summary_prefix(summary: str) -> str:
565
+ """Normalize summary text to include the expected prefix exactly once."""
566
+ text = (summary or "").strip()
567
+ if text.startswith("[CONTEXT SUMMARY]:"):
568
+ return text
569
+ return "[CONTEXT SUMMARY]:" if not text else f"[CONTEXT SUMMARY]: {text}"
570
+
571
+ def _generate_summary(self, content: str, metrics: TrajectoryMetrics) -> str:
572
+ """
573
+ Generate a summary of the compressed turns using OpenRouter.
574
+
575
+ Args:
576
+ content: The content to summarize
577
+ metrics: Metrics object to update
578
+
579
+ Returns:
580
+ Summary string
581
+ """
582
+ prompt = f"""Summarize the following agent conversation turns concisely. This summary will replace these turns in the conversation history.
583
+
584
+ Write the summary from a neutral perspective describing what the assistant did and learned. Include:
585
+ 1. What actions the assistant took (tool calls, searches, file operations)
586
+ 2. Key information or results obtained
587
+ 3. Any important decisions or findings
588
+ 4. Relevant data, file names, values, or outputs
589
+
590
+ Keep the summary factual and informative. Target approximately {self.config.summary_target_tokens} tokens.
591
+
592
+ ---
593
+ TURNS TO SUMMARIZE:
594
+ {content}
595
+ ---
596
+
597
+ Write only the summary, starting with "[CONTEXT SUMMARY]:" prefix."""
598
+
599
+ for attempt in range(self.config.max_retries):
600
+ try:
601
+ metrics.summarization_api_calls += 1
602
+ summary_temperature = _effective_temperature_for_model(
603
+ self.config.summarization_model,
604
+ self.config.temperature,
605
+ self.config.base_url,
606
+ )
607
+
608
+ if getattr(self, '_use_call_llm', False):
609
+ from agent.auxiliary_client import call_llm
610
+ response = call_llm(
611
+ provider=self._llm_provider,
612
+ model=self.config.summarization_model,
613
+ messages=[{"role": "user", "content": prompt}],
614
+ temperature=summary_temperature,
615
+ max_tokens=self.config.summary_target_tokens * 2,
616
+ )
617
+ else:
618
+ _create_kwargs = {
619
+ "model": self.config.summarization_model,
620
+ "messages": [{"role": "user", "content": prompt}],
621
+ "max_tokens": self.config.summary_target_tokens * 2,
622
+ }
623
+ if summary_temperature is not None:
624
+ _create_kwargs["temperature"] = summary_temperature
625
+ response = self.client.chat.completions.create(**_create_kwargs)
626
+
627
+ summary = self._coerce_summary_content(response.choices[0].message.content)
628
+ return self._ensure_summary_prefix(summary)
629
+
630
+ except Exception as e:
631
+ metrics.summarization_errors += 1
632
+ self.logger.warning(f"Summarization attempt {attempt + 1} failed: {e}")
633
+
634
+ if attempt < self.config.max_retries - 1:
635
+ time.sleep(jittered_backoff(attempt + 1, base_delay=self.config.retry_delay, max_delay=30.0))
636
+ else:
637
+ # Fallback: create a basic summary
638
+ return "[CONTEXT SUMMARY]: [Summary generation failed - previous turns contained tool calls and responses that have been compressed to save context space.]"
639
+
640
+ async def _generate_summary_async(self, content: str, metrics: TrajectoryMetrics) -> str:
641
+ """
642
+ Generate a summary of the compressed turns using OpenRouter (async version).
643
+
644
+ Args:
645
+ content: The content to summarize
646
+ metrics: Metrics object to update
647
+
648
+ Returns:
649
+ Summary string
650
+ """
651
+ prompt = f"""Summarize the following agent conversation turns concisely. This summary will replace these turns in the conversation history.
652
+
653
+ Write the summary from a neutral perspective describing what the assistant did and learned. Include:
654
+ 1. What actions the assistant took (tool calls, searches, file operations)
655
+ 2. Key information or results obtained
656
+ 3. Any important decisions or findings
657
+ 4. Relevant data, file names, values, or outputs
658
+
659
+ Keep the summary factual and informative. Target approximately {self.config.summary_target_tokens} tokens.
660
+
661
+ ---
662
+ TURNS TO SUMMARIZE:
663
+ {content}
664
+ ---
665
+
666
+ Write only the summary, starting with "[CONTEXT SUMMARY]:" prefix."""
667
+
668
+ for attempt in range(self.config.max_retries):
669
+ try:
670
+ metrics.summarization_api_calls += 1
671
+ summary_temperature = _effective_temperature_for_model(
672
+ self.config.summarization_model,
673
+ self.config.temperature,
674
+ self.config.base_url,
675
+ )
676
+
677
+ if getattr(self, '_use_call_llm', False):
678
+ from agent.auxiliary_client import async_call_llm
679
+ response = await async_call_llm(
680
+ provider=self._llm_provider,
681
+ model=self.config.summarization_model,
682
+ messages=[{"role": "user", "content": prompt}],
683
+ temperature=summary_temperature,
684
+ max_tokens=self.config.summary_target_tokens * 2,
685
+ )
686
+ else:
687
+ _create_kwargs = {
688
+ "model": self.config.summarization_model,
689
+ "messages": [{"role": "user", "content": prompt}],
690
+ "max_tokens": self.config.summary_target_tokens * 2,
691
+ }
692
+ if summary_temperature is not None:
693
+ _create_kwargs["temperature"] = summary_temperature
694
+ response = await self._get_async_client().chat.completions.create(**_create_kwargs)
695
+
696
+ summary = self._coerce_summary_content(response.choices[0].message.content)
697
+ return self._ensure_summary_prefix(summary)
698
+
699
+ except Exception as e:
700
+ metrics.summarization_errors += 1
701
+ self.logger.warning(f"Summarization attempt {attempt + 1} failed: {e}")
702
+
703
+ if attempt < self.config.max_retries - 1:
704
+ await asyncio.sleep(jittered_backoff(attempt + 1, base_delay=self.config.retry_delay, max_delay=30.0))
705
+ else:
706
+ # Fallback: create a basic summary
707
+ return "[CONTEXT SUMMARY]: [Summary generation failed - previous turns contained tool calls and responses that have been compressed to save context space.]"
708
+
709
+ def compress_trajectory(
710
+ self,
711
+ trajectory: List[Dict[str, str]]
712
+ ) -> Tuple[List[Dict[str, str]], TrajectoryMetrics]:
713
+ """
714
+ Compress a single trajectory to fit within target token budget.
715
+
716
+ Algorithm:
717
+ 1. Count total tokens
718
+ 2. If under target, skip
719
+ 3. Find compressible region (between protected head and tail)
720
+ 4. Calculate how many tokens need to be saved
721
+ 5. Accumulate turns from start of compressible region until savings met
722
+ 6. Replace accumulated turns with single human summary
723
+ 7. Keep remaining turns intact
724
+
725
+ Args:
726
+ trajectory: List of conversation turns
727
+
728
+ Returns:
729
+ Tuple of (compressed_trajectory, metrics)
730
+ """
731
+ metrics = TrajectoryMetrics()
732
+ metrics.original_turns = len(trajectory)
733
+
734
+ # Count tokens per turn
735
+ turn_tokens = self.count_turn_tokens(trajectory)
736
+ total_tokens = sum(turn_tokens)
737
+ metrics.original_tokens = total_tokens
738
+
739
+ # Check if compression needed
740
+ if total_tokens <= self.config.target_max_tokens:
741
+ metrics.skipped_under_target = True
742
+ metrics.compressed_tokens = total_tokens
743
+ metrics.compressed_turns = len(trajectory)
744
+ metrics.compression_ratio = 1.0
745
+ return trajectory, metrics
746
+
747
+ # Find protected regions
748
+ protected, compress_start, compress_end = self._find_protected_indices(trajectory)
749
+
750
+ # Check if there's anything to compress
751
+ if compress_start >= compress_end:
752
+ # Nothing to compress, return as-is
753
+ metrics.compressed_tokens = total_tokens
754
+ metrics.compressed_turns = len(trajectory)
755
+ metrics.still_over_limit = total_tokens > self.config.target_max_tokens
756
+ return trajectory, metrics
757
+
758
+ # Calculate how much we need to save
759
+ tokens_to_save = total_tokens - self.config.target_max_tokens
760
+
761
+ # We'll replace N turns with 1 summary turn
762
+ # Net savings = (sum of N turns' tokens) - summary_target_tokens
763
+ # We need: net_savings >= tokens_to_save
764
+ # So: sum of turns >= tokens_to_save + summary_target_tokens
765
+ target_tokens_to_compress = tokens_to_save + self.config.summary_target_tokens
766
+
767
+ # Accumulate turns from compress_start until we have enough savings
768
+ accumulated_tokens = 0
769
+ compress_until = compress_start
770
+
771
+ for i in range(compress_start, compress_end):
772
+ accumulated_tokens += turn_tokens[i]
773
+ compress_until = i + 1 # Exclusive end
774
+
775
+ # Check if we have enough savings
776
+ if accumulated_tokens >= target_tokens_to_compress:
777
+ break
778
+
779
+ # If we still don't have enough savings, compress the entire compressible region
780
+ if accumulated_tokens < target_tokens_to_compress and compress_until < compress_end:
781
+ compress_until = compress_end
782
+ accumulated_tokens = sum(turn_tokens[compress_start:compress_end])
783
+
784
+ # Record compression region
785
+ metrics.turns_compressed_start_idx = compress_start
786
+ metrics.turns_compressed_end_idx = compress_until
787
+ metrics.turns_in_compressed_region = compress_until - compress_start
788
+
789
+ # Extract content for summary
790
+ content_to_summarize = self._extract_turn_content_for_summary(
791
+ trajectory, compress_start, compress_until
792
+ )
793
+
794
+ # Generate summary
795
+ summary = self._generate_summary(content_to_summarize, metrics)
796
+
797
+ # Build compressed trajectory
798
+ compressed = []
799
+
800
+ # Add head (turns before compression region)
801
+ for i in range(compress_start):
802
+ turn = trajectory[i].copy()
803
+ # Add notice to system message
804
+ if turn.get("from") == "system" and self.config.add_summary_notice:
805
+ turn["value"] = turn["value"] + self.config.summary_notice_text
806
+ compressed.append(turn)
807
+
808
+ # Add summary as human message
809
+ compressed.append({
810
+ "from": "human",
811
+ "value": summary
812
+ })
813
+
814
+ # Add tail (turns after compression region)
815
+ for i in range(compress_until, len(trajectory)):
816
+ compressed.append(trajectory[i].copy())
817
+
818
+ # Calculate final metrics
819
+ metrics.compressed_turns = len(compressed)
820
+ metrics.compressed_tokens = self.count_trajectory_tokens(compressed)
821
+ metrics.turns_removed = metrics.original_turns - metrics.compressed_turns
822
+ metrics.tokens_saved = metrics.original_tokens - metrics.compressed_tokens
823
+ metrics.compression_ratio = metrics.compressed_tokens / max(metrics.original_tokens, 1)
824
+ metrics.was_compressed = True
825
+ metrics.still_over_limit = metrics.compressed_tokens > self.config.target_max_tokens
826
+
827
+ return compressed, metrics
828
+
829
+ async def compress_trajectory_async(
830
+ self,
831
+ trajectory: List[Dict[str, str]]
832
+ ) -> Tuple[List[Dict[str, str]], TrajectoryMetrics]:
833
+ """
834
+ Compress a single trajectory to fit within target token budget (async version).
835
+
836
+ Same algorithm as compress_trajectory but uses async API calls for summarization.
837
+ """
838
+ metrics = TrajectoryMetrics()
839
+ metrics.original_turns = len(trajectory)
840
+
841
+ # Count tokens per turn
842
+ turn_tokens = self.count_turn_tokens(trajectory)
843
+ total_tokens = sum(turn_tokens)
844
+ metrics.original_tokens = total_tokens
845
+
846
+ # Check if compression needed
847
+ if total_tokens <= self.config.target_max_tokens:
848
+ metrics.skipped_under_target = True
849
+ metrics.compressed_tokens = total_tokens
850
+ metrics.compressed_turns = len(trajectory)
851
+ metrics.compression_ratio = 1.0
852
+ return trajectory, metrics
853
+
854
+ # Find protected regions
855
+ protected, compress_start, compress_end = self._find_protected_indices(trajectory)
856
+
857
+ # Check if there's anything to compress
858
+ if compress_start >= compress_end:
859
+ metrics.compressed_tokens = total_tokens
860
+ metrics.compressed_turns = len(trajectory)
861
+ metrics.still_over_limit = total_tokens > self.config.target_max_tokens
862
+ return trajectory, metrics
863
+
864
+ # Calculate how much we need to save
865
+ tokens_to_save = total_tokens - self.config.target_max_tokens
866
+ target_tokens_to_compress = tokens_to_save + self.config.summary_target_tokens
867
+
868
+ # Accumulate turns from compress_start until we have enough savings
869
+ accumulated_tokens = 0
870
+ compress_until = compress_start
871
+
872
+ for i in range(compress_start, compress_end):
873
+ accumulated_tokens += turn_tokens[i]
874
+ compress_until = i + 1
875
+ if accumulated_tokens >= target_tokens_to_compress:
876
+ break
877
+
878
+ # If we still don't have enough savings, compress the entire compressible region
879
+ if accumulated_tokens < target_tokens_to_compress and compress_until < compress_end:
880
+ compress_until = compress_end
881
+ accumulated_tokens = sum(turn_tokens[compress_start:compress_end])
882
+
883
+ # Record compression region
884
+ metrics.turns_compressed_start_idx = compress_start
885
+ metrics.turns_compressed_end_idx = compress_until
886
+ metrics.turns_in_compressed_region = compress_until - compress_start
887
+
888
+ # Extract content for summary
889
+ content_to_summarize = self._extract_turn_content_for_summary(
890
+ trajectory, compress_start, compress_until
891
+ )
892
+
893
+ # Generate summary (ASYNC)
894
+ summary = await self._generate_summary_async(content_to_summarize, metrics)
895
+
896
+ # Build compressed trajectory
897
+ compressed = []
898
+
899
+ # Add head (turns before compression region)
900
+ for i in range(compress_start):
901
+ turn = trajectory[i].copy()
902
+ if turn.get("from") == "system" and self.config.add_summary_notice:
903
+ turn["value"] = turn["value"] + self.config.summary_notice_text
904
+ compressed.append(turn)
905
+
906
+ # Add summary as human message
907
+ compressed.append({
908
+ "from": "human",
909
+ "value": summary
910
+ })
911
+
912
+ # Add tail (turns after compression region)
913
+ for i in range(compress_until, len(trajectory)):
914
+ compressed.append(trajectory[i].copy())
915
+
916
+ # Calculate final metrics
917
+ metrics.compressed_turns = len(compressed)
918
+ metrics.compressed_tokens = self.count_trajectory_tokens(compressed)
919
+ metrics.turns_removed = metrics.original_turns - metrics.compressed_turns
920
+ metrics.tokens_saved = metrics.original_tokens - metrics.compressed_tokens
921
+ metrics.compression_ratio = metrics.compressed_tokens / max(metrics.original_tokens, 1)
922
+ metrics.was_compressed = True
923
+ metrics.still_over_limit = metrics.compressed_tokens > self.config.target_max_tokens
924
+
925
+ return compressed, metrics
926
+
927
+ async def process_entry_async(self, entry: Dict[str, Any]) -> Tuple[Dict[str, Any], TrajectoryMetrics]:
928
+ """
929
+ Process a single JSONL entry (async version).
930
+ """
931
+ if "conversations" not in entry:
932
+ metrics = TrajectoryMetrics()
933
+ return entry, metrics
934
+
935
+ trajectory = entry["conversations"]
936
+ compressed_trajectory, metrics = await self.compress_trajectory_async(trajectory)
937
+
938
+ # Create new entry with compressed trajectory
939
+ result = entry.copy()
940
+ result["conversations"] = compressed_trajectory
941
+
942
+ # Add compression metadata if enabled
943
+ if self.config.metrics_per_trajectory and metrics.was_compressed:
944
+ result["compression_metrics"] = metrics.to_dict()
945
+
946
+ return result, metrics
947
+
948
+ def process_entry(self, entry: Dict[str, Any]) -> Tuple[Dict[str, Any], TrajectoryMetrics]:
949
+ """
950
+ Process a single JSONL entry.
951
+
952
+ Args:
953
+ entry: JSONL entry containing 'conversations' field
954
+
955
+ Returns:
956
+ Tuple of (processed_entry, metrics)
957
+ """
958
+ if "conversations" not in entry:
959
+ metrics = TrajectoryMetrics()
960
+ return entry, metrics
961
+
962
+ trajectory = entry["conversations"]
963
+ compressed_trajectory, metrics = self.compress_trajectory(trajectory)
964
+
965
+ # Create new entry with compressed trajectory
966
+ result = entry.copy()
967
+ result["conversations"] = compressed_trajectory
968
+
969
+ # Add compression metadata if enabled
970
+ if self.config.metrics_per_trajectory and metrics.was_compressed:
971
+ result["compression_metrics"] = metrics.to_dict()
972
+
973
+ return result, metrics
974
+
975
+ def process_directory(self, input_dir: Path, output_dir: Path):
976
+ """
977
+ Process all JSONL files in a directory using async parallel processing.
978
+
979
+ Args:
980
+ input_dir: Input directory containing JSONL files
981
+ output_dir: Output directory for compressed files
982
+ """
983
+ # Run the async version
984
+ asyncio.run(self._process_directory_async(input_dir, output_dir))
985
+
986
+ async def _process_directory_async(self, input_dir: Path, output_dir: Path):
987
+ """
988
+ Async implementation of directory processing with parallel API calls.
989
+ """
990
+ console = Console()
991
+
992
+ # Record start time
993
+ self.aggregate_metrics.processing_start_time = datetime.now().isoformat()
994
+ start_time = time.time()
995
+
996
+ # Find all JSONL files
997
+ jsonl_files = sorted(input_dir.glob("*.jsonl"))
998
+
999
+ if not jsonl_files:
1000
+ self.logger.warning(f"No JSONL files found in {input_dir}")
1001
+ return
1002
+
1003
+ # Load ALL entries from all files
1004
+ console.print("\n[dim]Loading all entries...[/dim]")
1005
+ all_entries = [] # List of (file_path, entry_idx, entry)
1006
+
1007
+ for file_path in jsonl_files:
1008
+ with open(file_path, 'r', encoding='utf-8') as f:
1009
+ for line_num, line in enumerate(f):
1010
+ line = line.strip()
1011
+ if line:
1012
+ try:
1013
+ entry = json.loads(line)
1014
+ all_entries.append((file_path, line_num, entry))
1015
+ except json.JSONDecodeError as e:
1016
+ self.logger.warning(f"Skipping invalid JSON at {file_path}:{line_num}: {e}")
1017
+
1018
+ total_entries = len(all_entries)
1019
+
1020
+ console.print(f"\n{'='*60}")
1021
+ console.print(f"šŸ“‚ Input: {input_dir}")
1022
+ console.print(f"šŸ“‚ Output: {output_dir}")
1023
+ console.print(f"šŸ“„ Files to process: {len(jsonl_files)}")
1024
+ console.print(f"šŸ“Š Total trajectories: {total_entries:,}")
1025
+ console.print(f"šŸŽÆ Target max tokens: {self.config.target_max_tokens:,}")
1026
+ console.print(f"šŸ“ Summary target tokens: {self.config.summary_target_tokens}")
1027
+ console.print(f"⚔ Max concurrent API calls: {self.config.max_concurrent_requests}")
1028
+ console.print(f"{'='*60}\n")
1029
+
1030
+ # Create semaphore for rate limiting
1031
+ semaphore = asyncio.Semaphore(self.config.max_concurrent_requests)
1032
+
1033
+ # Tracking for progress display (thread-safe with lock)
1034
+ progress_lock = asyncio.Lock()
1035
+ compressed_count = 0
1036
+ skipped_count = 0
1037
+ api_calls = 0
1038
+ in_flight = 0
1039
+
1040
+ # Results storage: {file_path: {entry_idx: (processed_entry, metrics)}}
1041
+ results = {f: {} for f in jsonl_files}
1042
+
1043
+ # Track timeouts separately
1044
+ timeout_count = 0
1045
+
1046
+ async def process_single(file_path: Path, entry_idx: int, entry: Dict,
1047
+ progress, main_task, status_task):
1048
+ """Process a single entry with semaphore rate limiting and timeout."""
1049
+ nonlocal compressed_count, skipped_count, api_calls, in_flight, timeout_count
1050
+
1051
+ async with semaphore:
1052
+ # Track in-flight
1053
+ async with progress_lock:
1054
+ in_flight += 1
1055
+
1056
+ try:
1057
+ # Apply per-trajectory timeout
1058
+ processed_entry, metrics = await asyncio.wait_for(
1059
+ self.process_entry_async(entry),
1060
+ timeout=self.config.per_trajectory_timeout
1061
+ )
1062
+ results[file_path][entry_idx] = (processed_entry, metrics)
1063
+
1064
+ # Update aggregate metrics (with lock for thread safety)
1065
+ async with progress_lock:
1066
+ self.aggregate_metrics.add_trajectory_metrics(metrics)
1067
+
1068
+ # Update counters
1069
+ if metrics.was_compressed:
1070
+ compressed_count += 1
1071
+ api_calls += metrics.summarization_api_calls
1072
+ if metrics.skipped_under_target:
1073
+ skipped_count += 1
1074
+
1075
+ in_flight -= 1
1076
+
1077
+ # Update progress
1078
+ progress.advance(main_task)
1079
+ progress.update(
1080
+ status_task,
1081
+ description=f"[dim]āœ… {compressed_count} compressed | ā­ļø {skipped_count} skipped | ā±ļø {timeout_count} timeout | šŸ”„ {api_calls} API calls | ⚔ {in_flight} in-flight[/dim]"
1082
+ )
1083
+
1084
+ except asyncio.TimeoutError:
1085
+ self.logger.warning(f"Timeout processing entry from {file_path}:{entry_idx} (>{self.config.per_trajectory_timeout}s)")
1086
+
1087
+ async with progress_lock:
1088
+ self.aggregate_metrics.trajectories_failed += 1
1089
+ timeout_count += 1
1090
+ in_flight -= 1
1091
+ progress.advance(main_task)
1092
+ progress.update(
1093
+ status_task,
1094
+ description=f"[dim]āœ… {compressed_count} compressed | ā­ļø {skipped_count} skipped | ā±ļø {timeout_count} timeout | šŸ”„ {api_calls} API calls | ⚔ {in_flight} in-flight[/dim]"
1095
+ )
1096
+
1097
+ # Skip this entry entirely (don't include in output)
1098
+ results[file_path][entry_idx] = None
1099
+
1100
+ except Exception as e:
1101
+ self.logger.error(f"Error processing entry from {file_path}:{entry_idx}: {e}")
1102
+
1103
+ async with progress_lock:
1104
+ self.aggregate_metrics.trajectories_failed += 1
1105
+ in_flight -= 1
1106
+ progress.advance(main_task)
1107
+
1108
+ # Keep original entry on error
1109
+ results[file_path][entry_idx] = (entry, TrajectoryMetrics())
1110
+
1111
+ # Create progress bar
1112
+ with Progress(
1113
+ SpinnerColumn(),
1114
+ TextColumn("[progress.description]{task.description}"),
1115
+ BarColumn(),
1116
+ TaskProgressColumn(),
1117
+ TextColumn("•"),
1118
+ TimeElapsedColumn(),
1119
+ TextColumn("•"),
1120
+ TimeRemainingColumn(),
1121
+ console=console,
1122
+ refresh_per_second=10 # Higher refresh for async
1123
+ ) as progress:
1124
+ # Main task for overall progress
1125
+ main_task = progress.add_task(
1126
+ f"[cyan]Compressing {total_entries:,} trajectories",
1127
+ total=total_entries
1128
+ )
1129
+
1130
+ # Status line task
1131
+ status_task = progress.add_task(
1132
+ "[dim]Starting...[/dim]",
1133
+ total=None
1134
+ )
1135
+
1136
+ # Create all tasks
1137
+ tasks = [
1138
+ process_single(file_path, entry_idx, entry, progress, main_task, status_task)
1139
+ for file_path, entry_idx, entry in all_entries
1140
+ ]
1141
+
1142
+ # Run all tasks concurrently (semaphore limits actual concurrency)
1143
+ await asyncio.gather(*tasks)
1144
+
1145
+ # Remove status task
1146
+ progress.remove_task(status_task)
1147
+
1148
+ # Write results to output files (preserving original order)
1149
+ console.print("\n[dim]Writing output files...[/dim]")
1150
+ output_dir.mkdir(parents=True, exist_ok=True)
1151
+
1152
+ for file_path in jsonl_files:
1153
+ output_path = output_dir / file_path.name
1154
+ file_results = results[file_path]
1155
+
1156
+ # Sort by original entry index to preserve order, skip None (timed out) entries
1157
+ sorted_entries = [
1158
+ file_results[idx][0]
1159
+ for idx in sorted(file_results.keys())
1160
+ if file_results[idx] is not None
1161
+ ]
1162
+
1163
+ with open(output_path, 'w', encoding='utf-8') as f:
1164
+ for entry in sorted_entries:
1165
+ f.write(json.dumps(entry, ensure_ascii=False) + '\n')
1166
+
1167
+ # Record end time
1168
+ self.aggregate_metrics.processing_end_time = datetime.now().isoformat()
1169
+ self.aggregate_metrics.processing_duration_seconds = time.time() - start_time
1170
+
1171
+ # Print summary
1172
+ self._print_summary()
1173
+
1174
+ # Save metrics
1175
+ if self.config.metrics_enabled:
1176
+ metrics_path = output_dir / self.config.metrics_output_file
1177
+ with open(metrics_path, 'w', encoding="utf-8") as f:
1178
+ json.dump(self.aggregate_metrics.to_dict(), f, indent=2)
1179
+ console.print(f"\nšŸ’¾ Metrics saved to {metrics_path}")
1180
+
1181
+ def _print_summary(self):
1182
+ """Print comprehensive compression summary statistics."""
1183
+ m = self.aggregate_metrics.to_dict()
1184
+
1185
+ # Calculate some additional stats
1186
+ total = m['summary']['total_trajectories']
1187
+ compressed = m['summary']['trajectories_compressed']
1188
+ skipped = m['summary']['trajectories_skipped_under_target']
1189
+ over_limit = m['summary']['trajectories_still_over_limit']
1190
+ failed = m['summary']['trajectories_failed']
1191
+
1192
+ # Token stats
1193
+ tokens_before = m['tokens']['total_before']
1194
+ tokens_after = m['tokens']['total_after']
1195
+ tokens_saved = m['tokens']['total_saved']
1196
+
1197
+ # Calculate percentages
1198
+ compressed_pct = (compressed / max(total, 1)) * 100
1199
+ skipped_pct = (skipped / max(total, 1)) * 100
1200
+ over_limit_pct = (over_limit / max(total, 1)) * 100
1201
+
1202
+ print(f"\n")
1203
+ print(f"ā•”{'═'*70}ā•—")
1204
+ print(f"ā•‘{'TRAJECTORY COMPRESSION REPORT':^70}ā•‘")
1205
+ print(f"ā• {'═'*70}ā•£")
1206
+
1207
+ # Trajectories section
1208
+ print(f"ā•‘{'':2}šŸ“ TRAJECTORIES{' '*54}ā•‘")
1209
+ print(f"ā•‘{'─'*70}ā•‘")
1210
+ print(f"ā•‘{'':4}Total Processed: {total:>10,}{' '*32}ā•‘")
1211
+ print(f"ā•‘{'':4}ā”œā”€ Compressed: {compressed:>10,} ({compressed_pct:>5.1f}%){' '*18}ā•‘")
1212
+ print(f"ā•‘{'':4}ā”œā”€ Skipped (under limit):{skipped:>9,} ({skipped_pct:>5.1f}%){' '*18}ā•‘")
1213
+ print(f"ā•‘{'':4}ā”œā”€ Still over limit: {over_limit:>10,} ({over_limit_pct:>5.1f}%){' '*18}ā•‘")
1214
+ print(f"ā•‘{'':4}└─ Failed: {failed:>10,}{' '*32}ā•‘")
1215
+
1216
+ print(f"ā• {'═'*70}ā•£")
1217
+
1218
+ # Tokens section
1219
+ print(f"ā•‘{'':2}šŸ”¢ TOKENS{' '*60}ā•‘")
1220
+ print(f"ā•‘{'─'*70}ā•‘")
1221
+ print(f"ā•‘{'':4}Before Compression: {tokens_before:>15,} tokens{' '*21}ā•‘")
1222
+ print(f"ā•‘{'':4}After Compression: {tokens_after:>15,} tokens{' '*21}ā•‘")
1223
+ print(f"ā•‘{'':4}Total Saved: {tokens_saved:>15,} tokens{' '*21}ā•‘")
1224
+ print(f"ā•‘{'':4}Overall Compression: {m['tokens']['overall_compression_ratio']:>14.1%}{' '*28}ā•‘")
1225
+
1226
+ if tokens_before > 0:
1227
+ savings_pct = (tokens_saved / tokens_before) * 100
1228
+ print(f"ā•‘{'':4}Space Savings: {savings_pct:>14.1f}%{' '*28}ā•‘")
1229
+
1230
+ print(f"ā• {'═'*70}ā•£")
1231
+
1232
+ # Turns section
1233
+ print(f"ā•‘{'':2}šŸ’¬ CONVERSATION TURNS{' '*48}ā•‘")
1234
+ print(f"ā•‘{'─'*70}ā•‘")
1235
+ print(f"ā•‘{'':4}Before Compression: {m['turns']['total_before']:>15,} turns{' '*22}ā•‘")
1236
+ print(f"ā•‘{'':4}After Compression: {m['turns']['total_after']:>15,} turns{' '*22}ā•‘")
1237
+ print(f"ā•‘{'':4}Total Removed: {m['turns']['total_removed']:>15,} turns{' '*22}ā•‘")
1238
+
1239
+ print(f"ā• {'═'*70}ā•£")
1240
+
1241
+ # Averages section (for compressed trajectories only)
1242
+ print(f"ā•‘{'':2}šŸ“ˆ AVERAGES (Compressed Trajectories Only){' '*27}ā•‘")
1243
+ print(f"ā•‘{'─'*70}ā•‘")
1244
+ if compressed > 0:
1245
+ print(f"ā•‘{'':4}Avg Compression Ratio: {m['averages']['avg_compression_ratio']:>14.1%}{' '*28}ā•‘")
1246
+ print(f"ā•‘{'':4}Avg Tokens Saved: {m['averages']['avg_tokens_saved_per_compressed']:>14,.0f}{' '*28}ā•‘")
1247
+ print(f"ā•‘{'':4}Avg Turns Removed: {m['averages']['avg_turns_removed_per_compressed']:>14.1f}{' '*28}ā•‘")
1248
+ else:
1249
+ print(f"ā•‘{'':4}No trajectories were compressed{' '*38}ā•‘")
1250
+
1251
+ print(f"ā• {'═'*70}ā•£")
1252
+
1253
+ # Summarization API section
1254
+ print(f"ā•‘{'':2}šŸ¤– SUMMARIZATION API{' '*49}ā•‘")
1255
+ print(f"ā•‘{'─'*70}ā•‘")
1256
+ print(f"ā•‘{'':4}API Calls Made: {m['summarization']['total_api_calls']:>15,}{' '*27}ā•‘")
1257
+ print(f"ā•‘{'':4}Errors: {m['summarization']['total_errors']:>15,}{' '*27}ā•‘")
1258
+ print(f"ā•‘{'':4}Success Rate: {m['summarization']['success_rate']:>14.1%}{' '*28}ā•‘")
1259
+
1260
+ print(f"ā• {'═'*70}ā•£")
1261
+
1262
+ # Processing time section
1263
+ duration = m['processing']['duration_seconds']
1264
+ if duration > 60:
1265
+ time_str = f"{duration/60:.1f} minutes"
1266
+ else:
1267
+ time_str = f"{duration:.1f} seconds"
1268
+
1269
+ throughput = total / max(duration, 0.001)
1270
+
1271
+ print(f"ā•‘{'':2}ā±ļø PROCESSING TIME{' '*51}ā•‘")
1272
+ print(f"ā•‘{'─'*70}ā•‘")
1273
+ print(f"ā•‘{'':4}Duration: {time_str:>20}{' '*22}ā•‘")
1274
+ print(f"ā•‘{'':4}Throughput: {throughput:>15.1f} traj/sec{' '*18}ā•‘")
1275
+ print(f"ā•‘{'':4}Started: {m['processing']['start_time'][:19]:>20}{' '*22}ā•‘")
1276
+ print(f"ā•‘{'':4}Finished: {m['processing']['end_time'][:19]:>20}{' '*22}ā•‘")
1277
+
1278
+ print(f"ā•š{'═'*70}ā•")
1279
+
1280
+ # Distribution summary if we have data
1281
+ if self.aggregate_metrics.compression_ratios:
1282
+ ratios = self.aggregate_metrics.compression_ratios
1283
+ tokens_saved_list = self.aggregate_metrics.tokens_saved_list
1284
+
1285
+ print(f"\nšŸ“Š Distribution Summary:")
1286
+ print(f" Compression ratios: min={min(ratios):.2%}, max={max(ratios):.2%}, median={sorted(ratios)[len(ratios)//2]:.2%}")
1287
+ print(f" Tokens saved: min={min(tokens_saved_list):,}, max={max(tokens_saved_list):,}, median={sorted(tokens_saved_list)[len(tokens_saved_list)//2]:,}")
1288
+
1289
+
1290
+ def main(
1291
+ input: str,
1292
+ output: str = None,
1293
+ config: str = "configs/trajectory_compression.yaml",
1294
+ target_max_tokens: int = None,
1295
+ tokenizer: str = None,
1296
+ sample_percent: float = None,
1297
+ seed: int = 42,
1298
+ dry_run: bool = False,
1299
+ ):
1300
+ """
1301
+ Compress agent trajectories to fit within a target token budget.
1302
+
1303
+ Supports both single JSONL files and directories containing multiple JSONL files.
1304
+ Optionally sample a percentage of trajectories before compression.
1305
+
1306
+ Args:
1307
+ input: Path to JSONL file or directory containing JSONL files
1308
+ output: Output path (file for file input, directory for dir input)
1309
+ Default: adds "_compressed" suffix to input name
1310
+ config: Path to YAML configuration file
1311
+ target_max_tokens: Override target token count from config
1312
+ tokenizer: Override tokenizer name from config
1313
+ sample_percent: Sample this percentage of trajectories (1-100) before compression
1314
+ seed: Random seed for sampling reproducibility (default: 42)
1315
+ dry_run: Analyze without compressing (just show what would happen)
1316
+
1317
+ Examples:
1318
+ # Compress a directory (original behavior)
1319
+ python trajectory_compressor.py --input=data/my_run
1320
+
1321
+ # Compress a single file
1322
+ python trajectory_compressor.py --input=data/trajectories.jsonl
1323
+
1324
+ # Compress 15% sample of a file
1325
+ python trajectory_compressor.py --input=data/trajectories.jsonl --sample_percent=15
1326
+
1327
+ # Compress 10% sample with custom output
1328
+ python trajectory_compressor.py --input=data/trajectories.jsonl --sample_percent=10 --output=data/sampled_compressed.jsonl
1329
+ """
1330
+ import random
1331
+ import tempfile
1332
+ import shutil
1333
+
1334
+ print("šŸ—œļø Trajectory Compressor")
1335
+ print("=" * 60)
1336
+
1337
+ # Load configuration
1338
+ config_path = Path(config)
1339
+ if config_path.exists():
1340
+ print(f"šŸ“‹ Loading config from {config}")
1341
+ compression_config = CompressionConfig.from_yaml(config)
1342
+ else:
1343
+ print(f"āš ļø Config not found at {config}, using defaults")
1344
+ compression_config = CompressionConfig()
1345
+
1346
+ # Apply CLI overrides
1347
+ if target_max_tokens:
1348
+ compression_config.target_max_tokens = target_max_tokens
1349
+ if tokenizer:
1350
+ compression_config.tokenizer_name = tokenizer
1351
+
1352
+ # Validate sample_percent
1353
+ if sample_percent is not None:
1354
+ if sample_percent <= 0 or sample_percent > 100:
1355
+ print(f"āŒ sample_percent must be between 1 and 100, got {sample_percent}")
1356
+ return
1357
+ print(f"šŸŽ² Will sample {sample_percent}% of trajectories (seed={seed})")
1358
+
1359
+ # Setup paths and determine input type
1360
+ input_path = Path(input)
1361
+ if not input_path.exists():
1362
+ print(f"āŒ Input not found: {input}")
1363
+ return
1364
+
1365
+ is_file_input = input_path.is_file()
1366
+
1367
+ if is_file_input:
1368
+ print(f"šŸ“„ Input mode: Single JSONL file")
1369
+
1370
+ # For file input, default output is file with _compressed suffix
1371
+ if output:
1372
+ output_path = Path(output)
1373
+ else:
1374
+ output_path = input_path.parent / (input_path.stem + compression_config.output_suffix + ".jsonl")
1375
+
1376
+ # Load entries from the single file
1377
+ entries = []
1378
+ with open(input_path, 'r', encoding='utf-8') as f:
1379
+ for line_num, line in enumerate(f, 1):
1380
+ line = line.strip()
1381
+ if line:
1382
+ try:
1383
+ entries.append(json.loads(line))
1384
+ except json.JSONDecodeError as e:
1385
+ print(f"āš ļø Skipping invalid JSON at line {line_num}: {e}")
1386
+
1387
+ total_entries = len(entries)
1388
+ print(f" Loaded {total_entries:,} trajectories from {input_path.name}")
1389
+
1390
+ # Sample if requested
1391
+ if sample_percent is not None:
1392
+ random.seed(seed)
1393
+ sample_size = max(1, int(total_entries * sample_percent / 100))
1394
+ entries = random.sample(entries, sample_size)
1395
+ print(f" Sampled {len(entries):,} trajectories ({sample_percent}% of {total_entries:,})")
1396
+
1397
+ if dry_run:
1398
+ print(f"\nšŸ” DRY RUN MODE - analyzing without writing")
1399
+ print(f"šŸ“„ Would process: {len(entries):,} trajectories")
1400
+ print(f"šŸ“„ Would output to: {output_path}")
1401
+ return
1402
+
1403
+ # Create a temporary directory for processing
1404
+ with tempfile.TemporaryDirectory() as temp_dir:
1405
+ temp_input_dir = Path(temp_dir) / "input"
1406
+ temp_output_dir = Path(temp_dir) / "output"
1407
+ temp_input_dir.mkdir()
1408
+
1409
+ # Write entries to temp file
1410
+ temp_input_file = temp_input_dir / "trajectories.jsonl"
1411
+ with open(temp_input_file, 'w', encoding='utf-8') as f:
1412
+ for entry in entries:
1413
+ f.write(json.dumps(entry, ensure_ascii=False) + '\n')
1414
+
1415
+ # Initialize compressor and process
1416
+ compressor = TrajectoryCompressor(compression_config)
1417
+ compressor.process_directory(temp_input_dir, temp_output_dir)
1418
+
1419
+ # Copy result to output path (merge all files in temp_output_dir)
1420
+ output_path.parent.mkdir(parents=True, exist_ok=True)
1421
+ with open(output_path, 'w', encoding='utf-8') as out_f:
1422
+ for jsonl_file in sorted(temp_output_dir.glob("*.jsonl")):
1423
+ with open(jsonl_file, 'r', encoding='utf-8') as in_f:
1424
+ for line in in_f:
1425
+ out_f.write(line)
1426
+
1427
+ # Copy metrics file if it exists
1428
+ metrics_file = temp_output_dir / compression_config.metrics_output_file
1429
+ if metrics_file.exists():
1430
+ metrics_output = output_path.parent / (output_path.stem + "_metrics.json")
1431
+ shutil.copy(metrics_file, metrics_output)
1432
+ print(f"šŸ’¾ Metrics saved to {metrics_output}")
1433
+
1434
+ print(f"\nāœ… Compression complete!")
1435
+ print(f"šŸ“„ Output: {output_path}")
1436
+
1437
+ else:
1438
+ # Directory input - original behavior
1439
+ print(f"šŸ“ Input mode: Directory of JSONL files")
1440
+
1441
+ if output:
1442
+ output_path = Path(output)
1443
+ else:
1444
+ output_path = input_path.parent / (input_path.name + compression_config.output_suffix)
1445
+
1446
+ # If sampling is requested for directory mode, we need to handle it differently
1447
+ if sample_percent is not None:
1448
+ print(f"\nāš ļø Sampling from directory: will sample {sample_percent}% from each file")
1449
+
1450
+ # Create a temp directory with sampled files
1451
+ with tempfile.TemporaryDirectory() as temp_dir:
1452
+ temp_input_dir = Path(temp_dir) / "input"
1453
+ temp_input_dir.mkdir()
1454
+
1455
+ random.seed(seed)
1456
+ total_original = 0
1457
+ total_sampled = 0
1458
+
1459
+ # Sample from each JSONL file
1460
+ for jsonl_file in sorted(input_path.glob("*.jsonl")):
1461
+ entries = []
1462
+ with open(jsonl_file, 'r', encoding='utf-8') as f:
1463
+ for line in f:
1464
+ line = line.strip()
1465
+ if line:
1466
+ try:
1467
+ entries.append(json.loads(line))
1468
+ except json.JSONDecodeError:
1469
+ pass
1470
+
1471
+ total_original += len(entries)
1472
+ sample_size = max(1, int(len(entries) * sample_percent / 100))
1473
+ sampled_entries = random.sample(entries, min(sample_size, len(entries)))
1474
+ total_sampled += len(sampled_entries)
1475
+
1476
+ # Write sampled entries
1477
+ temp_file = temp_input_dir / jsonl_file.name
1478
+ with open(temp_file, 'w', encoding='utf-8') as f:
1479
+ for entry in sampled_entries:
1480
+ f.write(json.dumps(entry, ensure_ascii=False) + '\n')
1481
+
1482
+ print(f" Sampled {total_sampled:,} from {total_original:,} total trajectories")
1483
+
1484
+ if dry_run:
1485
+ print(f"\nšŸ” DRY RUN MODE - analyzing without writing")
1486
+ print(f"šŸ“ Would process: {temp_input_dir}")
1487
+ print(f"šŸ“ Would output to: {output_path}")
1488
+ return
1489
+
1490
+ # Initialize compressor and process the sampled data
1491
+ compressor = TrajectoryCompressor(compression_config)
1492
+ compressor.process_directory(temp_input_dir, output_path)
1493
+ else:
1494
+ if dry_run:
1495
+ print(f"\nšŸ” DRY RUN MODE - analyzing without writing")
1496
+ print(f"šŸ“ Would process: {input_path}")
1497
+ print(f"šŸ“ Would output to: {output_path}")
1498
+ return
1499
+
1500
+ # Initialize compressor and process directly
1501
+ compressor = TrajectoryCompressor(compression_config)
1502
+ compressor.process_directory(input_path, output_path)
1503
+
1504
+ print("\nāœ… Compression complete!")
1505
+
1506
+
1507
+ if __name__ == "__main__":
1508
+ fire.Fire(main)
1509
+