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,1865 @@
1
+ # Effect Catalog
2
+
3
+ Effect building blocks that produce visual patterns. In v2, these are used **inside scene functions** that return a pixel canvas directly. The building blocks below operate on grid coordinate arrays and produce `(chars, colors)` or value/hue fields that the scene function renders to canvas via `_render_vf()`.
4
+
5
+ > **See also:** architecture.md · composition.md · scenes.md · shaders.md · troubleshooting.md
6
+
7
+ ## Design Philosophy
8
+
9
+ Effects are the creative core. Don't copy these verbatim for every project -- use them as **building blocks** and **combine, modify, and invent** new ones. Every project should feel distinct.
10
+
11
+ Key principles:
12
+ - **Layer multiple effects** rather than using a single monolithic function
13
+ - **Parameterize everything** -- hue, speed, density, amplitude should all be arguments
14
+ - **React to features** -- audio/video features should modulate at least 2-3 parameters per effect
15
+ - **Vary per section** -- never use the same effect config for the entire video
16
+ - **Invent project-specific effects** -- the catalog below is a starting vocabulary, not a fixed set
17
+
18
+ ---
19
+
20
+ ## Background Fills
21
+
22
+ Every effect should start with a background. Never leave flat black.
23
+
24
+ ### Animated Sine Field (General Purpose)
25
+ ```python
26
+ def bg_sinefield(g, f, t, hue=0.6, bri=0.5, pal=PAL_DEFAULT,
27
+ freq=(0.13, 0.17, 0.07, 0.09), speed=(0.5, -0.4, -0.3, 0.2)):
28
+ """Layered sine field. Adjust freq/speed tuples for different textures."""
29
+ v1 = np.sin(g.cc*freq[0] + t*speed[0]) * np.sin(g.rr*freq[1] - t*speed[1]) * 0.5 + 0.5
30
+ v2 = np.sin(g.cc*freq[2] - t*speed[2] + g.rr*freq[3]) * 0.4 + 0.5
31
+ v3 = np.sin(g.dist_n*5 + t*0.2) * 0.3 + 0.4
32
+ v4 = np.cos(g.angle*3 - t*0.6) * 0.15 + 0.5
33
+ val = np.clip((v1*0.3 + v2*0.25 + v3*0.25 + v4*0.2) * bri * (0.6 + f["rms"]*0.6), 0.06, 1)
34
+ mask = val > 0.03
35
+ ch = val2char(val, mask, pal)
36
+ h = np.full_like(val, hue) + f.get("cent", 0.5)*0.1 + val*0.08
37
+ R, G, B = hsv2rgb(h, np.clip(0.35+f.get("flat",0.4)*0.4, 0, 1) * np.ones_like(val), val)
38
+ return ch, mkc(R, G, B, g.rows, g.cols)
39
+ ```
40
+
41
+ ### Video-Source Background
42
+ ```python
43
+ def bg_video(g, frame_rgb, pal=PAL_DEFAULT, brightness=0.5):
44
+ small = np.array(Image.fromarray(frame_rgb).resize((g.cols, g.rows)))
45
+ lum = np.mean(small, axis=2) / 255.0 * brightness
46
+ mask = lum > 0.02
47
+ ch = val2char(lum, mask, pal)
48
+ co = np.clip(small * np.clip(lum[:,:,None]*1.5+0.3, 0.3, 1), 0, 255).astype(np.uint8)
49
+ return ch, co
50
+ ```
51
+
52
+ ### Noise / Static Field
53
+ ```python
54
+ def bg_noise(g, f, t, pal=PAL_BLOCKS, density=0.3, hue_drift=0.02):
55
+ val = np.random.random((g.rows, g.cols)).astype(np.float32) * density * (0.5 + f["rms"]*0.5)
56
+ val = np.clip(val, 0, 1); mask = val > 0.02
57
+ ch = val2char(val, mask, pal)
58
+ R, G, B = hsv2rgb(np.full_like(val, t*hue_drift % 1), np.full_like(val, 0.3), val)
59
+ return ch, mkc(R, G, B, g.rows, g.cols)
60
+ ```
61
+
62
+ ### Perlin-Like Smooth Noise
63
+ ```python
64
+ def bg_smooth_noise(g, f, t, hue=0.5, bri=0.5, pal=PAL_DOTS, octaves=3):
65
+ """Layered sine approximation of Perlin noise. Cheap, smooth, organic."""
66
+ val = np.zeros((g.rows, g.cols), dtype=np.float32)
67
+ for i in range(octaves):
68
+ freq = 0.05 * (2 ** i)
69
+ amp = 0.5 / (i + 1)
70
+ phase = t * (0.3 + i * 0.2)
71
+ val += np.sin(g.cc * freq + phase) * np.cos(g.rr * freq * 0.7 - phase * 0.5) * amp
72
+ val = np.clip(val * 0.5 + 0.5, 0, 1) * bri
73
+ mask = val > 0.03
74
+ ch = val2char(val, mask, pal)
75
+ h = np.full_like(val, hue) + val * 0.1
76
+ R, G, B = hsv2rgb(h, np.full_like(val, 0.5), val)
77
+ return ch, mkc(R, G, B, g.rows, g.cols)
78
+ ```
79
+
80
+ ### Cellular / Voronoi Approximation
81
+ ```python
82
+ def bg_cellular(g, f, t, n_centers=12, hue=0.5, bri=0.6, pal=PAL_BLOCKS):
83
+ """Voronoi-like cells using distance to nearest of N moving centers."""
84
+ rng = np.random.RandomState(42) # deterministic centers
85
+ cx = (rng.rand(n_centers) * g.cols).astype(np.float32)
86
+ cy = (rng.rand(n_centers) * g.rows).astype(np.float32)
87
+ # Animate centers
88
+ cx_t = cx + np.sin(t * 0.5 + np.arange(n_centers) * 0.7) * 5
89
+ cy_t = cy + np.cos(t * 0.4 + np.arange(n_centers) * 0.9) * 3
90
+ # Min distance to any center
91
+ min_d = np.full((g.rows, g.cols), 999.0, dtype=np.float32)
92
+ for i in range(n_centers):
93
+ d = np.sqrt((g.cc - cx_t[i])**2 + (g.rr - cy_t[i])**2)
94
+ min_d = np.minimum(min_d, d)
95
+ val = np.clip(1.0 - min_d / (g.cols * 0.3), 0, 1) * bri
96
+ # Cell edges (where distance is near-equal between two centers)
97
+ # ... second-nearest trick for edge highlighting
98
+ mask = val > 0.03
99
+ ch = val2char(val, mask, pal)
100
+ R, G, B = hsv2rgb(np.full_like(val, hue) + min_d * 0.005, np.full_like(val, 0.5), val)
101
+ return ch, mkc(R, G, B, g.rows, g.cols)
102
+ ```
103
+
104
+ ---
105
+
106
+ > **Note:** The v1 `eff_rings`, `eff_rays`, `eff_spiral`, `eff_glow`, `eff_tunnel`, `eff_vortex`, `eff_freq_waves`, `eff_interference`, `eff_aurora`, and `eff_ripple` functions are superseded by the `vf_*` value field generators below (used via `_render_vf()`). The `vf_*` versions integrate with the multi-grid composition pipeline and are preferred for all new scenes.
107
+
108
+ ---
109
+
110
+ ## Particle Systems
111
+
112
+ ### General Pattern
113
+ All particle systems use persistent state via the `S` dict parameter:
114
+ ```python
115
+ # S is the persistent state dict (same as r.S, passed explicitly)
116
+ if "px" not in S:
117
+ S["px"]=[]; S["py"]=[]; S["vx"]=[]; S["vy"]=[]; S["life"]=[]; S["char"]=[]
118
+
119
+ # Emit new particles (on beat, continuously, or on trigger)
120
+ # Update: position += velocity, apply forces, decay life
121
+ # Draw: map to grid, set char/color based on life
122
+ # Cull: remove dead, cap total count
123
+ ```
124
+
125
+ ### Particle Character Sets
126
+
127
+ Don't hardcode particle chars. Choose per project/mood:
128
+
129
+ ```python
130
+ # Energy / explosive
131
+ PART_ENERGY = list("*+#@\u26a1\u2726\u2605\u2588\u2593")
132
+ PART_SPARK = list("\u00b7\u2022\u25cf\u2605\u2736*+")
133
+ # Organic / natural
134
+ PART_LEAF = list("\u2740\u2741\u2742\u2743\u273f\u2618\u2022")
135
+ PART_SNOW = list("\u2744\u2745\u2746\u00b7\u2022*\u25cb")
136
+ PART_RAIN = list("|\u2502\u2503\u2551/\\")
137
+ PART_BUBBLE = list("\u25cb\u25ce\u25c9\u25cf\u2218\u2219\u00b0")
138
+ # Data / tech
139
+ PART_DATA = list("01{}[]<>|/\\")
140
+ PART_HEX = list("0123456789ABCDEF")
141
+ PART_BINARY = list("01")
142
+ # Mystical
143
+ PART_RUNE = list("\u16a0\u16a2\u16a6\u16b1\u16b7\u16c1\u16c7\u16d2\u16d6\u16da\u16de\u16df\u2726\u2605")
144
+ PART_ZODIAC = list("\u2648\u2649\u264a\u264b\u264c\u264d\u264e\u264f\u2650\u2651\u2652\u2653")
145
+ # Minimal
146
+ PART_DOT = list("\u00b7\u2022\u25cf")
147
+ PART_DASH = list("-=~\u2500\u2550")
148
+ ```
149
+
150
+ ### Explosion (Beat-Triggered)
151
+ ```python
152
+ def emit_explosion(S, f, center_r, center_c, char_set=PART_ENERGY, count_base=80):
153
+ if f.get("beat", 0) > 0:
154
+ for _ in range(int(count_base + f["rms"]*150)):
155
+ ang = random.uniform(0, 2*math.pi)
156
+ sp = random.uniform(1, 9) * (0.5 + f.get("sub_r", 0.3)*2)
157
+ S["px"].append(float(center_c))
158
+ S["py"].append(float(center_r))
159
+ S["vx"].append(math.cos(ang)*sp*2.5)
160
+ S["vy"].append(math.sin(ang)*sp)
161
+ S["life"].append(1.0)
162
+ S["char"].append(random.choice(char_set))
163
+ # Update: gravity on vy += 0.03, life -= 0.015
164
+ # Color: life * 255 for brightness, hue fade controlled by caller
165
+ ```
166
+
167
+ ### Rising Embers
168
+ ```python
169
+ # Emit: sy = rows-1, vy = -random.uniform(1,5), vx = random.uniform(-1.5,1.5)
170
+ # Update: vx += random jitter * 0.3, life -= 0.01
171
+ # Cap at ~1500 particles
172
+ ```
173
+
174
+ ### Dissolving Cloud
175
+ ```python
176
+ # Init: N=600 particles spread across screen
177
+ # Update: slow upward drift, fade life progressively
178
+ # life -= 0.002 * (1 + elapsed * 0.05) # accelerating fade
179
+ ```
180
+
181
+ ### Starfield (3D Projection)
182
+ ```python
183
+ # N stars with (sx, sy, sz) in normalized coords
184
+ # Move: sz -= speed (stars approach camera)
185
+ # Project: px = cx + sx/sz * cx, py = cy + sy/sz * cy
186
+ # Reset stars that pass camera (sz <= 0.01)
187
+ # Brightness = (1 - sz), draw streaks behind bright stars
188
+ ```
189
+
190
+ ### Orbit (Circular/Elliptical Motion)
191
+ ```python
192
+ def emit_orbit(S, n=20, radius=15, speed=1.0, char_set=PART_DOT):
193
+ """Particles orbiting a center point."""
194
+ for i in range(n):
195
+ angle = i * 2 * math.pi / n
196
+ S["px"].append(0.0); S["py"].append(0.0) # will be computed from angle
197
+ S["vx"].append(angle) # store angle as "vx" for orbit
198
+ S["vy"].append(radius + random.uniform(-2, 2)) # store radius
199
+ S["life"].append(1.0)
200
+ S["char"].append(random.choice(char_set))
201
+ # Update: angle += speed * dt, px = cx + radius * cos(angle), py = cy + radius * sin(angle)
202
+ ```
203
+
204
+ ### Gravity Well
205
+ ```python
206
+ # Particles attracted toward one or more gravity points
207
+ # Update: compute force vector toward each well, apply as acceleration
208
+ # Particles that reach well center respawn at edges
209
+ ```
210
+
211
+ ### Flocking / Boids
212
+
213
+ Emergent swarm behavior from three simple rules: separation, alignment, cohesion.
214
+
215
+ ```python
216
+ def update_boids(S, g, f, n_boids=200, perception=8.0, max_speed=2.0,
217
+ sep_weight=1.5, ali_weight=1.0, coh_weight=1.0,
218
+ char_set=None):
219
+ """Boids flocking simulation. Particles self-organize into organic groups.
220
+
221
+ perception: how far each boid can see (grid cells)
222
+ sep_weight: separation (avoid crowding) strength
223
+ ali_weight: alignment (match neighbor velocity) strength
224
+ coh_weight: cohesion (steer toward group center) strength
225
+ """
226
+ if char_set is None:
227
+ char_set = list("·•●◦∘⬤")
228
+ if "boid_x" not in S:
229
+ rng = np.random.RandomState(42)
230
+ S["boid_x"] = rng.uniform(0, g.cols, n_boids).astype(np.float32)
231
+ S["boid_y"] = rng.uniform(0, g.rows, n_boids).astype(np.float32)
232
+ S["boid_vx"] = (rng.random(n_boids).astype(np.float32) - 0.5) * max_speed
233
+ S["boid_vy"] = (rng.random(n_boids).astype(np.float32) - 0.5) * max_speed
234
+ S["boid_ch"] = [random.choice(char_set) for _ in range(n_boids)]
235
+
236
+ bx = S["boid_x"]; by = S["boid_y"]
237
+ bvx = S["boid_vx"]; bvy = S["boid_vy"]
238
+ n = len(bx)
239
+
240
+ # For each boid, compute steering forces
241
+ ax = np.zeros(n, dtype=np.float32)
242
+ ay = np.zeros(n, dtype=np.float32)
243
+
244
+ # Spatial hash for efficient neighbor lookup
245
+ cell_size = perception
246
+ cells = {}
247
+ for i in range(n):
248
+ cx_i = int(bx[i] / cell_size)
249
+ cy_i = int(by[i] / cell_size)
250
+ key = (cx_i, cy_i)
251
+ if key not in cells:
252
+ cells[key] = []
253
+ cells[key].append(i)
254
+
255
+ for i in range(n):
256
+ cx_i = int(bx[i] / cell_size)
257
+ cy_i = int(by[i] / cell_size)
258
+ sep_x, sep_y = 0.0, 0.0
259
+ ali_x, ali_y = 0.0, 0.0
260
+ coh_x, coh_y = 0.0, 0.0
261
+ count = 0
262
+
263
+ # Check neighboring cells
264
+ for dcx in range(-1, 2):
265
+ for dcy in range(-1, 2):
266
+ for j in cells.get((cx_i + dcx, cy_i + dcy), []):
267
+ if j == i:
268
+ continue
269
+ dx = bx[j] - bx[i]
270
+ dy = by[j] - by[i]
271
+ dist = np.sqrt(dx * dx + dy * dy)
272
+ if dist < perception and dist > 0.01:
273
+ count += 1
274
+ # Separation: steer away from close neighbors
275
+ if dist < perception * 0.4:
276
+ sep_x -= dx / (dist * dist)
277
+ sep_y -= dy / (dist * dist)
278
+ # Alignment: match velocity
279
+ ali_x += bvx[j]
280
+ ali_y += bvy[j]
281
+ # Cohesion: steer toward center of group
282
+ coh_x += bx[j]
283
+ coh_y += by[j]
284
+
285
+ if count > 0:
286
+ # Normalize and weight
287
+ ax[i] += sep_x * sep_weight
288
+ ay[i] += sep_y * sep_weight
289
+ ax[i] += (ali_x / count - bvx[i]) * ali_weight * 0.1
290
+ ay[i] += (ali_y / count - bvy[i]) * ali_weight * 0.1
291
+ ax[i] += (coh_x / count - bx[i]) * coh_weight * 0.01
292
+ ay[i] += (coh_y / count - by[i]) * coh_weight * 0.01
293
+
294
+ # Audio reactivity: bass pushes boids outward from center
295
+ if f.get("bass", 0) > 0.5:
296
+ cx_g, cy_g = g.cols / 2, g.rows / 2
297
+ dx = bx - cx_g; dy = by - cy_g
298
+ dist = np.sqrt(dx**2 + dy**2) + 1
299
+ ax += (dx / dist) * f["bass"] * 2
300
+ ay += (dy / dist) * f["bass"] * 2
301
+
302
+ # Update velocity and position
303
+ bvx += ax; bvy += ay
304
+ # Clamp speed
305
+ speed = np.sqrt(bvx**2 + bvy**2) + 1e-10
306
+ over = speed > max_speed
307
+ bvx[over] *= max_speed / speed[over]
308
+ bvy[over] *= max_speed / speed[over]
309
+ bx += bvx; by += bvy
310
+
311
+ # Wrap at edges
312
+ bx %= g.cols; by %= g.rows
313
+
314
+ S["boid_x"] = bx; S["boid_y"] = by
315
+ S["boid_vx"] = bvx; S["boid_vy"] = bvy
316
+
317
+ # Draw
318
+ ch = np.full((g.rows, g.cols), " ", dtype="U1")
319
+ co = np.zeros((g.rows, g.cols, 3), dtype=np.uint8)
320
+ for i in range(n):
321
+ r, c = int(by[i]) % g.rows, int(bx[i]) % g.cols
322
+ ch[r, c] = S["boid_ch"][i]
323
+ spd = min(1.0, speed[i] / max_speed)
324
+ R, G, B = hsv2rgb_scalar(spd * 0.3, 0.8, 0.5 + spd * 0.5)
325
+ co[r, c] = (R, G, B)
326
+ return ch, co
327
+ ```
328
+
329
+ ### Flow Field Particles
330
+
331
+ Particles that follow the gradient of a value field. Any `vf_*` function becomes a "river" that carries particles:
332
+
333
+ ```python
334
+ def update_flow_particles(S, g, f, flow_field, n=500, speed=1.0,
335
+ life_drain=0.005, emit_rate=10,
336
+ char_set=None):
337
+ """Particles steered by a value field gradient.
338
+
339
+ flow_field: float32 (rows, cols) — the field particles follow.
340
+ Particles flow from low to high values (uphill) or along
341
+ the gradient direction.
342
+ """
343
+ if char_set is None:
344
+ char_set = list("·•∘◦°⋅")
345
+ if "fp_x" not in S:
346
+ S["fp_x"] = []; S["fp_y"] = []; S["fp_vx"] = []; S["fp_vy"] = []
347
+ S["fp_life"] = []; S["fp_ch"] = []
348
+
349
+ # Emit new particles at random positions
350
+ for _ in range(emit_rate):
351
+ if len(S["fp_x"]) < n:
352
+ S["fp_x"].append(random.uniform(0, g.cols - 1))
353
+ S["fp_y"].append(random.uniform(0, g.rows - 1))
354
+ S["fp_vx"].append(0.0); S["fp_vy"].append(0.0)
355
+ S["fp_life"].append(1.0)
356
+ S["fp_ch"].append(random.choice(char_set))
357
+
358
+ # Compute gradient of flow field (central differences)
359
+ pad = np.pad(flow_field, 1, mode="wrap")
360
+ grad_x = (pad[1:-1, 2:] - pad[1:-1, :-2]) * 0.5
361
+ grad_y = (pad[2:, 1:-1] - pad[:-2, 1:-1]) * 0.5
362
+
363
+ # Update particles
364
+ i = 0
365
+ while i < len(S["fp_x"]):
366
+ px, py = S["fp_x"][i], S["fp_y"][i]
367
+ # Sample gradient at particle position
368
+ gc = int(px) % g.cols; gr = int(py) % g.rows
369
+ gx = grad_x[gr, gc]; gy = grad_y[gr, gc]
370
+ # Steer velocity toward gradient direction
371
+ S["fp_vx"][i] = S["fp_vx"][i] * 0.9 + gx * speed * 10
372
+ S["fp_vy"][i] = S["fp_vy"][i] * 0.9 + gy * speed * 10
373
+ S["fp_x"][i] += S["fp_vx"][i]
374
+ S["fp_y"][i] += S["fp_vy"][i]
375
+ S["fp_life"][i] -= life_drain
376
+
377
+ if S["fp_life"][i] <= 0:
378
+ for k in ("fp_x", "fp_y", "fp_vx", "fp_vy", "fp_life", "fp_ch"):
379
+ S[k].pop(i)
380
+ else:
381
+ i += 1
382
+
383
+ # Draw
384
+ ch = np.full((g.rows, g.cols), " ", dtype="U1")
385
+ co = np.zeros((g.rows, g.cols, 3), dtype=np.uint8)
386
+ for i in range(len(S["fp_x"])):
387
+ r = int(S["fp_y"][i]) % g.rows
388
+ c = int(S["fp_x"][i]) % g.cols
389
+ ch[r, c] = S["fp_ch"][i]
390
+ v = S["fp_life"][i]
391
+ co[r, c] = (int(v * 200), int(v * 180), int(v * 255))
392
+ return ch, co
393
+ ```
394
+
395
+ ### Particle Trails
396
+
397
+ Draw fading lines between current and previous positions:
398
+
399
+ ```python
400
+ def draw_particle_trails(S, g, trail_key="trails", max_trail=8, fade=0.7):
401
+ """Add trails to any particle system. Call after updating positions.
402
+ Stores previous positions in S[trail_key] and draws fading lines.
403
+
404
+ Expects S to have 'px', 'py' lists (standard particle keys).
405
+ max_trail: number of previous positions to remember
406
+ fade: brightness multiplier per trail step (0.7 = 70% each step back)
407
+ """
408
+ if trail_key not in S:
409
+ S[trail_key] = []
410
+
411
+ # Store current positions
412
+ current = list(zip(
413
+ [int(y) for y in S.get("py", [])],
414
+ [int(x) for x in S.get("px", [])]
415
+ ))
416
+ S[trail_key].append(current)
417
+ if len(S[trail_key]) > max_trail:
418
+ S[trail_key] = S[trail_key][-max_trail:]
419
+
420
+ # Draw trails onto char/color arrays
421
+ ch = np.full((g.rows, g.cols), " ", dtype="U1")
422
+ co = np.zeros((g.rows, g.cols, 3), dtype=np.uint8)
423
+ trail_chars = list("·∘◦°⋅.,'`")
424
+
425
+ for age, positions in enumerate(reversed(S[trail_key])):
426
+ bri = fade ** age
427
+ if bri < 0.05:
428
+ break
429
+ ci = min(age, len(trail_chars) - 1)
430
+ for r, c in positions:
431
+ if 0 <= r < g.rows and 0 <= c < g.cols and ch[r, c] == " ":
432
+ ch[r, c] = trail_chars[ci]
433
+ v = int(bri * 180)
434
+ co[r, c] = (v, v, int(v * 0.8))
435
+ return ch, co
436
+ ```
437
+
438
+ ---
439
+
440
+ ## Rain / Matrix Effects
441
+
442
+ ### Column Rain (Vectorized)
443
+ ```python
444
+ def eff_matrix_rain(g, f, t, S, hue=0.33, bri=0.6, pal=PAL_KATA,
445
+ speed_base=0.5, speed_beat=3.0):
446
+ """Vectorized matrix rain. S dict persists column positions."""
447
+ if "ry" not in S or len(S["ry"]) != g.cols:
448
+ S["ry"] = np.random.uniform(-g.rows, g.rows, g.cols).astype(np.float32)
449
+ S["rsp"] = np.random.uniform(0.3, 2.0, g.cols).astype(np.float32)
450
+ S["rln"] = np.random.randint(8, 40, g.cols)
451
+ S["rch"] = np.random.randint(0, len(pal), (g.rows, g.cols)) # pre-assign chars
452
+
453
+ speed_mult = speed_base + f.get("bass", 0.3)*speed_beat + f.get("sub_r", 0.3)*3
454
+ if f.get("beat", 0) > 0: speed_mult *= 2.5
455
+ S["ry"] += S["rsp"] * speed_mult
456
+
457
+ # Reset columns that fall past bottom
458
+ rst = (S["ry"] - S["rln"]) > g.rows
459
+ S["ry"][rst] = np.random.uniform(-25, -2, rst.sum())
460
+
461
+ # Vectorized draw using fancy indexing
462
+ ch = np.full((g.rows, g.cols), " ", dtype="U1")
463
+ co = np.zeros((g.rows, g.cols, 3), dtype=np.uint8)
464
+ heads = S["ry"].astype(int)
465
+ for c in range(g.cols):
466
+ head = heads[c]
467
+ trail_len = S["rln"][c]
468
+ for i in range(trail_len):
469
+ row = head - i
470
+ if 0 <= row < g.rows:
471
+ fade = 1.0 - i / trail_len
472
+ ci = S["rch"][row, c] % len(pal)
473
+ ch[row, c] = pal[ci]
474
+ v = fade * bri * 255
475
+ if i == 0: # head is bright white-ish
476
+ co[row, c] = (int(v*0.9), int(min(255, v*1.1)), int(v*0.9))
477
+ else:
478
+ R, G, B = hsv2rgb_single(hue, 0.7, fade * bri)
479
+ co[row, c] = (R, G, B)
480
+ return ch, co, S
481
+ ```
482
+
483
+ ---
484
+
485
+ ## Glitch / Data Effects
486
+
487
+ ### Horizontal Band Displacement
488
+ ```python
489
+ def eff_glitch_displace(ch, co, f, intensity=1.0):
490
+ n_bands = int(8 + f.get("flux", 0.3)*25 + f.get("bdecay", 0)*15) * intensity
491
+ for _ in range(int(n_bands)):
492
+ y = random.randint(0, ch.shape[0]-1)
493
+ h = random.randint(1, int(3 + f.get("sub", 0.3)*8))
494
+ shift = int((random.random()-0.5) * f.get("rms", 0.3)*40 + f.get("bdecay", 0)*20*(random.random()-0.5))
495
+ if shift != 0:
496
+ for row in range(h):
497
+ rr = y + row
498
+ if 0 <= rr < ch.shape[0]:
499
+ ch[rr] = np.roll(ch[rr], shift)
500
+ co[rr] = np.roll(co[rr], shift, axis=0)
501
+ return ch, co
502
+ ```
503
+
504
+ ### Block Corruption
505
+ ```python
506
+ def eff_block_corrupt(ch, co, f, char_pool=None, count_base=20):
507
+ if char_pool is None:
508
+ char_pool = list(PAL_BLOCKS[4:] + PAL_KATA[2:8])
509
+ for _ in range(int(count_base + f.get("flux", 0.3)*60 + f.get("bdecay", 0)*40)):
510
+ bx = random.randint(0, max(1, ch.shape[1]-6))
511
+ by = random.randint(0, max(1, ch.shape[0]-4))
512
+ bw, bh = random.randint(2,6), random.randint(1,4)
513
+ block_char = random.choice(char_pool)
514
+ # Fill rectangle with single char and random color
515
+ for r in range(bh):
516
+ for c in range(bw):
517
+ rr, cc = by+r, bx+c
518
+ if 0 <= rr < ch.shape[0] and 0 <= cc < ch.shape[1]:
519
+ ch[rr, cc] = block_char
520
+ co[rr, cc] = (random.randint(100,255), random.randint(0,100), random.randint(0,80))
521
+ return ch, co
522
+ ```
523
+
524
+ ### Scan Bars (Vertical)
525
+ ```python
526
+ def eff_scanbars(ch, co, f, t, n_base=4, chars="|\u2551|!1l"):
527
+ for bi in range(int(n_base + f.get("himid_r", 0.3)*12)):
528
+ sx = int((t*50*(1+bi*0.3) + bi*37) % ch.shape[1])
529
+ for rr in range(ch.shape[0]):
530
+ if random.random() < 0.7:
531
+ ch[rr, sx] = random.choice(chars)
532
+ return ch, co
533
+ ```
534
+
535
+ ### Error Messages
536
+ ```python
537
+ # Parameterize the error vocabulary per project:
538
+ ERRORS_TECH = ["SEGFAULT","0xDEADBEEF","BUFFER_OVERRUN","PANIC!","NULL_PTR",
539
+ "CORRUPT","SIGSEGV","ERR_OVERFLOW","STACK_SMASH","BAD_ALLOC"]
540
+ ERRORS_COSMIC = ["VOID_BREACH","ENTROPY_MAX","SINGULARITY","DIMENSION_FAULT",
541
+ "REALITY_ERR","TIME_PARADOX","DARK_MATTER_LEAK","QUANTUM_DECOHERE"]
542
+ ERRORS_ORGANIC = ["CELL_DIVISION_ERR","DNA_MISMATCH","MUTATION_OVERFLOW",
543
+ "NEURAL_DEADLOCK","SYNAPSE_TIMEOUT","MEMBRANE_BREACH"]
544
+ ```
545
+
546
+ ### Hex Data Stream
547
+ ```python
548
+ hex_str = "".join(random.choice("0123456789ABCDEF") for _ in range(random.randint(8,20)))
549
+ stamp(ch, co, hex_str, rand_row, rand_col, (0, 160, 80))
550
+ ```
551
+
552
+ ---
553
+
554
+ ## Spectrum / Visualization
555
+
556
+ ### Mirrored Spectrum Bars
557
+ ```python
558
+ def eff_spectrum(g, f, t, n_bars=64, pal=PAL_BLOCKS, mirror=True):
559
+ bar_w = max(1, g.cols // n_bars); mid = g.rows // 2
560
+ band_vals = np.array([f.get("sub",0.3), f.get("bass",0.3), f.get("lomid",0.3),
561
+ f.get("mid",0.3), f.get("himid",0.3), f.get("hi",0.3)])
562
+ ch = np.full((g.rows, g.cols), " ", dtype="U1")
563
+ co = np.zeros((g.rows, g.cols, 3), dtype=np.uint8)
564
+ for b in range(n_bars):
565
+ frac = b / n_bars
566
+ fi = frac * 5; lo_i = int(fi); hi_i = min(lo_i+1, 5)
567
+ bval = min(1, (band_vals[lo_i]*(1-fi%1) + band_vals[hi_i]*(fi%1)) * 1.8)
568
+ height = int(bval * (g.rows//2 - 2))
569
+ for dy in range(height):
570
+ hue = (f.get("cent",0.5)*0.3 + frac*0.3 + dy/max(height,1)*0.15) % 1.0
571
+ ci = pal[min(int(dy/max(height,1)*len(pal)*0.7+len(pal)*0.2), len(pal)-1)]
572
+ for dc in range(bar_w - (1 if bar_w > 2 else 0)):
573
+ cc = b*bar_w + dc
574
+ if 0 <= cc < g.cols:
575
+ rows_to_draw = [mid - dy, mid + dy] if mirror else [g.rows - 1 - dy]
576
+ for row in rows_to_draw:
577
+ if 0 <= row < g.rows:
578
+ ch[row, cc] = ci
579
+ co[row, cc] = hsv_to_rgb_single(hue, 0.85, 0.5+dy/max(height,1)*0.5)
580
+ return ch, co
581
+ ```
582
+
583
+ ### Waveform
584
+ ```python
585
+ def eff_waveform(g, f, t, row_offset=-5, hue=0.1):
586
+ ch = np.full((g.rows, g.cols), " ", dtype="U1")
587
+ co = np.zeros((g.rows, g.cols, 3), dtype=np.uint8)
588
+ for c in range(g.cols):
589
+ wv = (math.sin(c*0.15+t*5)*f.get("bass",0.3)*0.5
590
+ + math.sin(c*0.3+t*8)*f.get("mid",0.3)*0.3
591
+ + math.sin(c*0.6+t*12)*f.get("hi",0.3)*0.15)
592
+ wr = g.rows + row_offset + int(wv * 4)
593
+ if 0 <= wr < g.rows:
594
+ ch[wr, c] = "~"
595
+ v = int(120 + f.get("rms",0.3)*135)
596
+ co[wr, c] = [v, int(v*0.7), int(v*0.4)]
597
+ return ch, co
598
+ ```
599
+
600
+ ---
601
+
602
+ ## Fire / Lava
603
+
604
+ ### Fire Columns
605
+ ```python
606
+ def eff_fire(g, f, t, n_base=20, hue_base=0.02, hue_range=0.12, pal=PAL_BLOCKS):
607
+ n_cols = int(n_base + f.get("bass",0.3)*30 + f.get("sub_r",0.3)*20)
608
+ ch = np.full((g.rows, g.cols), " ", dtype="U1")
609
+ co = np.zeros((g.rows, g.cols, 3), dtype=np.uint8)
610
+ for fi in range(n_cols):
611
+ fx_c = int((fi*g.cols/n_cols + np.sin(t*2+fi*0.7)*3) % g.cols)
612
+ height = int((f.get("bass",0.3)*0.4 + f.get("sub_r",0.3)*0.3 + f.get("rms",0.3)*0.3) * g.rows * 0.7)
613
+ for dy in range(min(height, g.rows)):
614
+ fr = g.rows - 1 - dy
615
+ frac = dy / max(height, 1)
616
+ bri = max(0.1, (1 - frac*0.6) * (0.5 + f.get("rms",0.3)*0.5))
617
+ hue = hue_base + frac * hue_range
618
+ ci = "\u2588" if frac<0.2 else ("\u2593" if frac<0.4 else ("\u2592" if frac<0.6 else "\u2591"))
619
+ ch[fr, fx_c] = ci
620
+ R, G, B = hsv2rgb_single(hue, 0.9, bri)
621
+ co[fr, fx_c] = (R, G, B)
622
+ return ch, co
623
+ ```
624
+
625
+ ### Ice / Cold Fire (same structure, different hue range)
626
+ ```python
627
+ # hue_base=0.55, hue_range=0.15 -- blue to cyan
628
+ # Lower intensity, slower movement
629
+ ```
630
+
631
+ ---
632
+
633
+ ## Text Overlays
634
+
635
+ ### Scrolling Ticker
636
+ ```python
637
+ def eff_ticker(ch, co, t, text, row, speed=15, color=(80, 100, 140)):
638
+ off = int(t * speed) % max(len(text), 1)
639
+ doubled = text + " " + text
640
+ stamp(ch, co, doubled[off:off+ch.shape[1]], row, 0, color)
641
+ ```
642
+
643
+ ### Beat-Triggered Words
644
+ ```python
645
+ def eff_beat_words(ch, co, f, words, row_center=None, color=(255,240,220)):
646
+ if f.get("beat", 0) > 0:
647
+ w = random.choice(words)
648
+ r = (row_center or ch.shape[0]//2) + random.randint(-5,5)
649
+ stamp(ch, co, w, r, (ch.shape[1]-len(w))//2, color)
650
+ ```
651
+
652
+ ### Fading Message Sequence
653
+ ```python
654
+ def eff_fading_messages(ch, co, t, elapsed, messages, period=4.0, color_base=(220,220,220)):
655
+ msg_idx = int(elapsed / period) % len(messages)
656
+ phase = elapsed % period
657
+ fade = max(0, min(1.0, phase) * min(1.0, period - phase))
658
+ if fade > 0.05:
659
+ v = fade
660
+ msg = messages[msg_idx]
661
+ cr, cg, cb = [int(c * v) for c in color_base]
662
+ stamp(ch, co, msg, ch.shape[0]//2, (ch.shape[1]-len(msg))//2, (cr, cg, cb))
663
+ ```
664
+
665
+ ---
666
+
667
+ ## Screen Shake
668
+ Shift entire char/color arrays on beat:
669
+ ```python
670
+ def eff_shake(ch, co, f, x_amp=6, y_amp=3):
671
+ shake_x = int(f.get("sub",0.3)*x_amp*(random.random()-0.5)*2 + f.get("bdecay",0)*4*(random.random()-0.5)*2)
672
+ shake_y = int(f.get("bass",0.3)*y_amp*(random.random()-0.5)*2)
673
+ if abs(shake_x) > 0:
674
+ ch = np.roll(ch, shake_x, axis=1)
675
+ co = np.roll(co, shake_x, axis=1)
676
+ if abs(shake_y) > 0:
677
+ ch = np.roll(ch, shake_y, axis=0)
678
+ co = np.roll(co, shake_y, axis=0)
679
+ return ch, co
680
+ ```
681
+
682
+ ---
683
+
684
+ ## Composable Effect System
685
+
686
+ The real creative power comes from **composition**. There are three levels:
687
+
688
+ ### Level 1: Character-Level Layering
689
+
690
+ Stack multiple effects as `(chars, colors)` layers:
691
+
692
+ ```python
693
+ class LayerStack(EffectNode):
694
+ """Render effects bottom-to-top with character-level compositing."""
695
+ def add(self, effect, alpha=1.0):
696
+ """alpha < 1.0 = probabilistic override (sparse overlay)."""
697
+ self.layers.append((effect, alpha))
698
+
699
+ # Usage:
700
+ stack = LayerStack()
701
+ stack.add(bg_effect) # base — fills screen
702
+ stack.add(main_effect) # overlay on top (space chars = transparent)
703
+ stack.add(particle_effect) # sparse overlay on top of that
704
+ ch, co = stack.render(g, f, t, S)
705
+ ```
706
+
707
+ ### Level 2: Pixel-Level Blending
708
+
709
+ After rendering to canvases, blend with Photoshop-style modes:
710
+
711
+ ```python
712
+ class PixelBlendStack:
713
+ """Stack canvases with blend modes for complex compositing."""
714
+ def add(self, canvas, mode="normal", opacity=1.0)
715
+ def composite(self) -> canvas
716
+
717
+ # Usage:
718
+ pbs = PixelBlendStack()
719
+ pbs.add(canvas_a) # base
720
+ pbs.add(canvas_b, "screen", 0.7) # additive glow
721
+ pbs.add(canvas_c, "difference", 0.5) # psychedelic interference
722
+ result = pbs.composite()
723
+ ```
724
+
725
+ ### Level 3: Temporal Feedback
726
+
727
+ Feed previous frame back into current frame for recursive effects:
728
+
729
+ ```python
730
+ fb = FeedbackBuffer()
731
+ for each frame:
732
+ canvas = render_current()
733
+ canvas = fb.apply(canvas, decay=0.8, blend="screen",
734
+ transform="zoom", transform_amt=0.015, hue_shift=0.02)
735
+ ```
736
+
737
+ ### Effect Nodes — Uniform Interface
738
+
739
+ In the v2 protocol, effect nodes are used **inside** scene functions. The scene function itself returns a canvas. Effect nodes produce intermediate `(chars, colors)` that are rendered to canvas via the grid's `.render()` method or `_render_vf()`.
740
+
741
+ ```python
742
+ class EffectNode:
743
+ def render(self, g, f, t, S) -> (chars, colors)
744
+
745
+ # Concrete implementations:
746
+ class ValueFieldEffect(EffectNode):
747
+ """Wraps a value field function + hue field function + palette."""
748
+ def __init__(self, val_fn, hue_fn, pal=PAL_DEFAULT, sat=0.7)
749
+
750
+ class LambdaEffect(EffectNode):
751
+ """Wrap any (g,f,t,S) -> (ch,co) function."""
752
+ def __init__(self, fn)
753
+
754
+ class ConditionalEffect(EffectNode):
755
+ """Switch effects based on audio features."""
756
+ def __init__(self, condition, if_true, if_false=None)
757
+ ```
758
+
759
+ ### Value Field Generators (Atomic Building Blocks)
760
+
761
+ These produce float32 arrays `(rows, cols)` in range [0,1]. They are the raw visual patterns. All have signature `(g, f, t, S, **params) -> float32 array`.
762
+
763
+ #### Trigonometric Fields (sine/cosine-based)
764
+
765
+ ```python
766
+ def vf_sinefield(g, f, t, S, bri=0.5,
767
+ freq=(0.13, 0.17, 0.07, 0.09), speed=(0.5, -0.4, -0.3, 0.2)):
768
+ """Layered sine field. General purpose background/texture."""
769
+ v1 = np.sin(g.cc*freq[0] + t*speed[0]) * np.sin(g.rr*freq[1] - t*speed[1]) * 0.5 + 0.5
770
+ v2 = np.sin(g.cc*freq[2] - t*speed[2] + g.rr*freq[3]) * 0.4 + 0.5
771
+ v3 = np.sin(g.dist_n*5 + t*0.2) * 0.3 + 0.4
772
+ return np.clip((v1*0.35 + v2*0.35 + v3*0.3) * bri * (0.6 + f.get("rms",0.3)*0.6), 0, 1)
773
+
774
+ def vf_smooth_noise(g, f, t, S, octaves=3, bri=0.5):
775
+ """Multi-octave sine approximation of Perlin noise."""
776
+ val = np.zeros((g.rows, g.cols), dtype=np.float32)
777
+ for i in range(octaves):
778
+ freq = 0.05 * (2 ** i); amp = 0.5 / (i + 1)
779
+ phase = t * (0.3 + i * 0.2)
780
+ val = val + np.sin(g.cc*freq + phase) * np.cos(g.rr*freq*0.7 - phase*0.5) * amp
781
+ return np.clip(val * 0.5 + 0.5, 0, 1) * bri
782
+
783
+ def vf_rings(g, f, t, S, n_base=6, spacing_base=4):
784
+ """Concentric rings, bass-driven count and wobble."""
785
+ n = int(n_base + f.get("sub_r",0.3)*25 + f.get("bass",0.3)*10)
786
+ sp = spacing_base + f.get("bass_r",0.3)*7 + f.get("rms",0.3)*3
787
+ val = np.zeros((g.rows, g.cols), dtype=np.float32)
788
+ for ri in range(n):
789
+ rad = (ri+1)*sp + f.get("bdecay",0)*15
790
+ wobble = f.get("mid_r",0.3)*5*np.sin(g.angle*3+t*4)
791
+ rd = np.abs(g.dist - rad - wobble)
792
+ th = 1 + f.get("sub",0.3)*3
793
+ val = np.maximum(val, np.clip((1 - rd/th) * (0.4 + f.get("bass",0.3)*0.8), 0, 1))
794
+ return val
795
+
796
+ def vf_spiral(g, f, t, S, n_arms=3, tightness=2.5):
797
+ """Logarithmic spiral arms."""
798
+ val = np.zeros((g.rows, g.cols), dtype=np.float32)
799
+ for ai in range(n_arms):
800
+ offset = ai * 2*np.pi / n_arms
801
+ log_r = np.log(g.dist + 1) * tightness
802
+ arm_phase = g.angle + offset - log_r + t * 0.8
803
+ arm_val = np.clip(np.cos(arm_phase * n_arms) * 0.6 + 0.2, 0, 1)
804
+ arm_val *= (0.4 + f.get("rms",0.3)*0.6) * np.clip(1 - g.dist_n*0.5, 0.2, 1)
805
+ val = np.maximum(val, arm_val)
806
+ return val
807
+
808
+ def vf_tunnel(g, f, t, S, speed=3.0, complexity=6):
809
+ """Tunnel depth effect — infinite zoom feeling."""
810
+ tunnel_d = 1.0 / (g.dist_n + 0.1)
811
+ v1 = np.sin(tunnel_d*2 - t*speed) * 0.45 + 0.55
812
+ v2 = np.sin(g.angle*complexity + tunnel_d*1.5 - t*2) * 0.35 + 0.55
813
+ return np.clip(v1*0.5 + v2*0.5, 0, 1)
814
+
815
+ def vf_vortex(g, f, t, S, twist=3.0):
816
+ """Twisting radial pattern — distance modulates angle."""
817
+ twisted = g.angle + g.dist_n * twist * np.sin(t * 0.5)
818
+ val = np.sin(twisted * 4 - t * 2) * 0.5 + 0.5
819
+ return np.clip(val * (0.5 + f.get("bass",0.3)*0.8), 0, 1)
820
+
821
+ def vf_interference(g, f, t, S, n_waves=6):
822
+ """Overlapping sine waves creating moire patterns."""
823
+ drivers = ["mid_r", "himid_r", "bass_r", "lomid_r", "hi_r", "sub_r"]
824
+ vals = np.zeros((g.rows, g.cols), dtype=np.float32)
825
+ for i in range(min(n_waves, len(drivers))):
826
+ angle = i * np.pi / n_waves
827
+ freq = 0.06 + i * 0.03; sp = 0.5 + i * 0.3
828
+ proj = g.cc * np.cos(angle) + g.rr * np.sin(angle)
829
+ vals = vals + np.sin(proj*freq + t*sp) * f.get(drivers[i], 0.3) * 2.5
830
+ return np.clip(vals * 0.12 + 0.45, 0.1, 1)
831
+
832
+ def vf_aurora(g, f, t, S, n_bands=3):
833
+ """Horizontal aurora bands."""
834
+ val = np.zeros((g.rows, g.cols), dtype=np.float32)
835
+ for i in range(n_bands):
836
+ fr = 0.08 + i*0.04; fc = 0.012 + i*0.008
837
+ sr = 0.7 + i*0.3; sc = 0.18 + i*0.12
838
+ val = val + np.sin(g.rr*fr + t*sr) * np.sin(g.cc*fc + t*sc) * (0.6/n_bands)
839
+ return np.clip(val * (f.get("lomid_r",0.3)*3 + 0.2), 0, 0.7)
840
+
841
+ def vf_ripple(g, f, t, S, sources=None, freq=0.3, damping=0.02):
842
+ """Concentric ripples from point sources."""
843
+ if sources is None: sources = [(0.5, 0.5)]
844
+ val = np.zeros((g.rows, g.cols), dtype=np.float32)
845
+ for ry, rx in sources:
846
+ dy = g.rr - g.rows*ry; dx = g.cc - g.cols*rx
847
+ d = np.sqrt(dy**2 + dx**2)
848
+ val = val + np.sin(d*freq - t*4) * np.exp(-d*damping) * 0.5
849
+ return np.clip(val + 0.5, 0, 1)
850
+
851
+ def vf_plasma(g, f, t, S):
852
+ """Classic plasma: sum of sines at different orientations and speeds."""
853
+ v = np.sin(g.cc * 0.03 + t * 0.7) * 0.5
854
+ v = v + np.sin(g.rr * 0.04 - t * 0.5) * 0.4
855
+ v = v + np.sin((g.cc * 0.02 + g.rr * 0.03) + t * 0.3) * 0.3
856
+ v = v + np.sin(g.dist_n * 4 - t * 0.8) * 0.3
857
+ return np.clip(v * 0.5 + 0.5, 0, 1)
858
+
859
+ def vf_diamond(g, f, t, S, freq=0.15):
860
+ """Diamond/checkerboard pattern."""
861
+ val = np.abs(np.sin(g.cc * freq + t * 0.5)) * np.abs(np.sin(g.rr * freq * 1.2 - t * 0.3))
862
+ return np.clip(val * (0.6 + f.get("rms",0.3)*0.8), 0, 1)
863
+
864
+ def vf_noise_static(g, f, t, S, density=0.4):
865
+ """Random noise — different each frame. Non-deterministic."""
866
+ return np.random.random((g.rows, g.cols)).astype(np.float32) * density * (0.5 + f.get("rms",0.3)*0.5)
867
+ ```
868
+
869
+ #### Noise-Based Fields (organic, non-periodic)
870
+
871
+ These produce qualitatively different textures from sine-based fields — organic, non-repeating, without visible axis alignment. They're the foundation of high-end generative art.
872
+
873
+ ```python
874
+ def _hash2d(ix, iy):
875
+ """Integer-coordinate hash for gradient noise. Returns float32 in [0,1]."""
876
+ # Good-quality hash via large prime mixing
877
+ n = ix * 374761393 + iy * 668265263
878
+ n = (n ^ (n >> 13)) * 1274126177
879
+ return ((n ^ (n >> 16)) & 0x7fffffff).astype(np.float32) / 0x7fffffff
880
+
881
+ def _smoothstep(t):
882
+ """Hermite smoothstep: 3t^2 - 2t^3. Smooth interpolation in [0,1]."""
883
+ t = np.clip(t, 0, 1)
884
+ return t * t * (3 - 2 * t)
885
+
886
+ def _smootherstep(t):
887
+ """Perlin's improved smoothstep: 6t^5 - 15t^4 + 10t^3. C2-continuous."""
888
+ t = np.clip(t, 0, 1)
889
+ return t * t * t * (t * (t * 6 - 15) + 10)
890
+
891
+ def _value_noise_2d(x, y):
892
+ """2D value noise at arbitrary float coordinates. Returns float32 in [0,1].
893
+ x, y: float32 arrays of same shape."""
894
+ ix = np.floor(x).astype(np.int64)
895
+ iy = np.floor(y).astype(np.int64)
896
+ fx = _smootherstep(x - ix)
897
+ fy = _smootherstep(y - iy)
898
+ # 4-corner hashes
899
+ n00 = _hash2d(ix, iy)
900
+ n10 = _hash2d(ix + 1, iy)
901
+ n01 = _hash2d(ix, iy + 1)
902
+ n11 = _hash2d(ix + 1, iy + 1)
903
+ # Bilinear interpolation
904
+ nx0 = n00 * (1 - fx) + n10 * fx
905
+ nx1 = n01 * (1 - fx) + n11 * fx
906
+ return nx0 * (1 - fy) + nx1 * fy
907
+
908
+ def vf_noise(g, f, t, S, freq=0.08, speed=0.3, bri=0.7):
909
+ """Value noise. Smooth, organic, no axis alignment artifacts.
910
+ freq: spatial frequency (higher = finer detail).
911
+ speed: temporal scroll rate."""
912
+ x = g.cc * freq + t * speed
913
+ y = g.rr * freq * 0.8 - t * speed * 0.4
914
+ return np.clip(_value_noise_2d(x, y) * bri, 0, 1)
915
+
916
+ def vf_fbm(g, f, t, S, octaves=5, freq=0.06, lacunarity=2.0, gain=0.5,
917
+ speed=0.2, bri=0.8):
918
+ """Fractal Brownian Motion — octaved noise with lacunarity/gain control.
919
+ The standard building block for clouds, terrain, smoke, organic textures.
920
+
921
+ octaves: number of noise layers (more = finer detail, more cost)
922
+ freq: base spatial frequency
923
+ lacunarity: frequency multiplier per octave (2.0 = standard)
924
+ gain: amplitude multiplier per octave (0.5 = standard, <0.5 = smoother)
925
+ speed: temporal evolution rate
926
+ """
927
+ val = np.zeros((g.rows, g.cols), dtype=np.float32)
928
+ amplitude = 1.0
929
+ f_x = freq
930
+ f_y = freq * 0.85 # slight anisotropy avoids grid artifacts
931
+ for i in range(octaves):
932
+ phase = t * speed * (1 + i * 0.3)
933
+ x = g.cc * f_x + phase + i * 17.3 # offset per octave
934
+ y = g.rr * f_y - phase * 0.6 + i * 31.7
935
+ val = val + _value_noise_2d(x, y) * amplitude
936
+ amplitude *= gain
937
+ f_x *= lacunarity
938
+ f_y *= lacunarity
939
+ # Normalize to [0,1]
940
+ max_amp = (1 - gain ** octaves) / (1 - gain) if gain != 1 else octaves
941
+ return np.clip(val / max_amp * bri * (0.6 + f.get("rms", 0.3) * 0.6), 0, 1)
942
+
943
+ def vf_domain_warp(g, f, t, S, base_fn=None, warp_fn=None,
944
+ warp_strength=15.0, freq=0.06, speed=0.2):
945
+ """Domain warping — feed one noise field's output as coordinate offsets
946
+ into another noise field. Produces flowing, melting organic distortion.
947
+ Signature technique of high-end generative art (Inigo Quilez).
948
+
949
+ base_fn: value field to distort (default: fbm)
950
+ warp_fn: value field for displacement (default: noise at different freq)
951
+ warp_strength: how many grid cells to displace (higher = more warped)
952
+ """
953
+ # Warp field: displacement in x and y
954
+ wx = _value_noise_2d(g.cc * freq * 1.3 + t * speed, g.rr * freq + 7.1)
955
+ wy = _value_noise_2d(g.cc * freq + t * speed * 0.7 + 3.2, g.rr * freq * 1.1 - 11.8)
956
+ # Center warp around 0 (noise returns [0,1], shift to [-0.5, 0.5])
957
+ wx = (wx - 0.5) * warp_strength * (0.5 + f.get("rms", 0.3) * 1.0)
958
+ wy = (wy - 0.5) * warp_strength * (0.5 + f.get("bass", 0.3) * 0.8)
959
+ # Sample base field at warped coordinates
960
+ warped_cc = g.cc + wx
961
+ warped_rr = g.rr + wy
962
+ if base_fn is not None:
963
+ # Create a temporary grid-like object with warped coords
964
+ # Simplification: evaluate base_fn with modified coordinates
965
+ val = _value_noise_2d(warped_cc * freq * 0.8 + t * speed * 0.5,
966
+ warped_rr * freq * 0.7 - t * speed * 0.3)
967
+ else:
968
+ # Default: fbm at warped coordinates
969
+ val = np.zeros((g.rows, g.cols), dtype=np.float32)
970
+ amp = 1.0
971
+ fx, fy = freq * 0.8, freq * 0.7
972
+ for i in range(4):
973
+ val = val + _value_noise_2d(warped_cc * fx + t * speed * 0.5 + i * 13.7,
974
+ warped_rr * fy - t * speed * 0.3 + i * 27.3) * amp
975
+ amp *= 0.5; fx *= 2.0; fy *= 2.0
976
+ val = val / 1.875 # normalize 4-octave sum
977
+ return np.clip(val * 0.8, 0, 1)
978
+
979
+ def vf_voronoi(g, f, t, S, n_cells=20, speed=0.3, edge_width=1.5,
980
+ mode="distance", seed=42):
981
+ """Voronoi diagram as value field. Proper implementation with
982
+ nearest/second-nearest distance for cell interiors and edges.
983
+
984
+ mode: "distance" (bright at center, dark at edges),
985
+ "edge" (bright at cell boundaries),
986
+ "cell_id" (flat color per cell — use with discrete palette)
987
+ edge_width: thickness of edge highlight (for "edge" mode)
988
+ """
989
+ rng = np.random.RandomState(seed)
990
+ # Animated cell centers
991
+ cx = rng.rand(n_cells).astype(np.float32) * g.cols
992
+ cy = rng.rand(n_cells).astype(np.float32) * g.rows
993
+ vx = (rng.rand(n_cells).astype(np.float32) - 0.5) * speed * 10
994
+ vy = (rng.rand(n_cells).astype(np.float32) - 0.5) * speed * 10
995
+ cx_t = (cx + vx * np.sin(t * 0.5 + np.arange(n_cells) * 0.8)) % g.cols
996
+ cy_t = (cy + vy * np.cos(t * 0.4 + np.arange(n_cells) * 1.1)) % g.rows
997
+
998
+ # Compute nearest and second-nearest distance
999
+ d1 = np.full((g.rows, g.cols), 1e9, dtype=np.float32)
1000
+ d2 = np.full((g.rows, g.cols), 1e9, dtype=np.float32)
1001
+ id1 = np.zeros((g.rows, g.cols), dtype=np.int32)
1002
+ for i in range(n_cells):
1003
+ d = np.sqrt((g.cc - cx_t[i]) ** 2 + (g.rr - cy_t[i]) ** 2)
1004
+ mask = d < d1
1005
+ d2 = np.where(mask, d1, np.minimum(d2, d))
1006
+ id1 = np.where(mask, i, id1)
1007
+ d1 = np.minimum(d1, d)
1008
+
1009
+ if mode == "edge":
1010
+ # Edges: where d2 - d1 is small
1011
+ edge_val = np.clip(1.0 - (d2 - d1) / edge_width, 0, 1)
1012
+ return edge_val * (0.5 + f.get("rms", 0.3) * 0.8)
1013
+ elif mode == "cell_id":
1014
+ # Flat per-cell value
1015
+ return (id1.astype(np.float32) / n_cells) % 1.0
1016
+ else:
1017
+ # Distance: bright near center, dark at edges
1018
+ max_d = g.cols * 0.15
1019
+ return np.clip(1.0 - d1 / max_d, 0, 1) * (0.5 + f.get("rms", 0.3) * 0.7)
1020
+ ```
1021
+
1022
+ #### Simulation-Based Fields (emergent, evolving)
1023
+
1024
+ These use persistent state `S` to evolve patterns frame-by-frame. They produce complexity that can't be achieved with stateless math.
1025
+
1026
+ ```python
1027
+ def vf_reaction_diffusion(g, f, t, S, feed=0.055, kill=0.062,
1028
+ da=1.0, db=0.5, dt=1.0, steps_per_frame=8,
1029
+ init_mode="spots"):
1030
+ """Gray-Scott reaction-diffusion model. Produces coral, leopard spots,
1031
+ mitosis, worm-like, and labyrinthine patterns depending on feed/kill.
1032
+
1033
+ The two chemicals A and B interact:
1034
+ A + 2B → 3B (autocatalytic)
1035
+ B → P (decay)
1036
+ feed: rate A is replenished, kill: rate B decays
1037
+ Different feed/kill ratios produce radically different patterns.
1038
+
1039
+ Presets (feed, kill):
1040
+ Spots/dots: (0.055, 0.062)
1041
+ Worms/stripes: (0.046, 0.063)
1042
+ Coral/branching: (0.037, 0.060)
1043
+ Mitosis/splitting: (0.028, 0.062)
1044
+ Labyrinth/maze: (0.029, 0.057)
1045
+ Holes/negative: (0.039, 0.058)
1046
+ Chaos/unstable: (0.026, 0.051)
1047
+
1048
+ steps_per_frame: simulation steps per video frame (more = faster evolution)
1049
+ """
1050
+ key = "rd_" + str(id(g)) # unique per grid
1051
+ if key + "_a" not in S:
1052
+ # Initialize chemical fields
1053
+ A = np.ones((g.rows, g.cols), dtype=np.float32)
1054
+ B = np.zeros((g.rows, g.cols), dtype=np.float32)
1055
+ if init_mode == "spots":
1056
+ # Random seed spots
1057
+ rng = np.random.RandomState(42)
1058
+ for _ in range(max(3, g.rows * g.cols // 200)):
1059
+ r, c = rng.randint(2, g.rows - 2), rng.randint(2, g.cols - 2)
1060
+ B[r - 1:r + 2, c - 1:c + 2] = 1.0
1061
+ elif init_mode == "center":
1062
+ cr, cc = g.rows // 2, g.cols // 2
1063
+ B[cr - 3:cr + 3, cc - 3:cc + 3] = 1.0
1064
+ elif init_mode == "ring":
1065
+ mask = (g.dist_n > 0.2) & (g.dist_n < 0.3)
1066
+ B[mask] = 1.0
1067
+ S[key + "_a"] = A
1068
+ S[key + "_b"] = B
1069
+
1070
+ A = S[key + "_a"]
1071
+ B = S[key + "_b"]
1072
+
1073
+ # Audio modulation: feed/kill shift subtly with audio
1074
+ f_mod = feed + f.get("bass", 0.3) * 0.003
1075
+ k_mod = kill + f.get("hi_r", 0.3) * 0.002
1076
+
1077
+ for _ in range(steps_per_frame):
1078
+ # Laplacian via 3x3 convolution kernel
1079
+ # [0.05, 0.2, 0.05]
1080
+ # [0.2, -1.0, 0.2]
1081
+ # [0.05, 0.2, 0.05]
1082
+ pA = np.pad(A, 1, mode="wrap")
1083
+ pB = np.pad(B, 1, mode="wrap")
1084
+ lapA = (pA[:-2, 1:-1] + pA[2:, 1:-1] + pA[1:-1, :-2] + pA[1:-1, 2:]) * 0.2 \
1085
+ + (pA[:-2, :-2] + pA[:-2, 2:] + pA[2:, :-2] + pA[2:, 2:]) * 0.05 \
1086
+ - A * 1.0
1087
+ lapB = (pB[:-2, 1:-1] + pB[2:, 1:-1] + pB[1:-1, :-2] + pB[1:-1, 2:]) * 0.2 \
1088
+ + (pB[:-2, :-2] + pB[:-2, 2:] + pB[2:, :-2] + pB[2:, 2:]) * 0.05 \
1089
+ - B * 1.0
1090
+ ABB = A * B * B
1091
+ A = A + (da * lapA - ABB + f_mod * (1 - A)) * dt
1092
+ B = B + (db * lapB + ABB - (f_mod + k_mod) * B) * dt
1093
+ A = np.clip(A, 0, 1)
1094
+ B = np.clip(B, 0, 1)
1095
+
1096
+ S[key + "_a"] = A
1097
+ S[key + "_b"] = B
1098
+ # Output B chemical as value (the visible pattern)
1099
+ return np.clip(B * 2.0, 0, 1)
1100
+
1101
+ def vf_game_of_life(g, f, t, S, rule="life", birth=None, survive=None,
1102
+ steps_per_frame=1, density=0.3, fade=0.92, seed=42):
1103
+ """Cellular automaton as value field with analog fade trails.
1104
+ Grid cells are born/die by neighbor count rules. Dead cells fade
1105
+ gradually instead of snapping to black, producing ghost trails.
1106
+
1107
+ rule presets:
1108
+ "life": B3/S23 (Conway's Game of Life)
1109
+ "coral": B3/S45678 (slow crystalline growth)
1110
+ "maze": B3/S12345 (fills to labyrinth)
1111
+ "anneal": B4678/S35678 (smooth blobs)
1112
+ "day_night": B3678/S34678 (balanced growth/decay)
1113
+ Or specify birth/survive directly as sets: birth={3}, survive={2,3}
1114
+
1115
+ fade: how fast dead cells dim (0.9 = slow trails, 0.5 = fast)
1116
+ """
1117
+ presets = {
1118
+ "life": ({3}, {2, 3}),
1119
+ "coral": ({3}, {4, 5, 6, 7, 8}),
1120
+ "maze": ({3}, {1, 2, 3, 4, 5}),
1121
+ "anneal": ({4, 6, 7, 8}, {3, 5, 6, 7, 8}),
1122
+ "day_night": ({3, 6, 7, 8}, {3, 4, 6, 7, 8}),
1123
+ }
1124
+ if birth is None or survive is None:
1125
+ birth, survive = presets.get(rule, presets["life"])
1126
+
1127
+ key = "gol_" + str(id(g))
1128
+ if key + "_grid" not in S:
1129
+ rng = np.random.RandomState(seed)
1130
+ S[key + "_grid"] = (rng.random((g.rows, g.cols)) < density).astype(np.float32)
1131
+ S[key + "_display"] = S[key + "_grid"].copy()
1132
+
1133
+ grid = S[key + "_grid"]
1134
+ display = S[key + "_display"]
1135
+
1136
+ # Beat can inject random noise
1137
+ if f.get("beat", 0) > 0.5:
1138
+ inject = np.random.random((g.rows, g.cols)) < 0.02
1139
+ grid = np.clip(grid + inject.astype(np.float32), 0, 1)
1140
+
1141
+ for _ in range(steps_per_frame):
1142
+ # Count neighbors (toroidal wrap)
1143
+ padded = np.pad(grid > 0.5, 1, mode="wrap").astype(np.int8)
1144
+ neighbors = (padded[:-2, :-2] + padded[:-2, 1:-1] + padded[:-2, 2:] +
1145
+ padded[1:-1, :-2] + padded[1:-1, 2:] +
1146
+ padded[2:, :-2] + padded[2:, 1:-1] + padded[2:, 2:])
1147
+ alive = grid > 0.5
1148
+ new_alive = np.zeros_like(grid, dtype=bool)
1149
+ for b in birth:
1150
+ new_alive |= (~alive) & (neighbors == b)
1151
+ for s in survive:
1152
+ new_alive |= alive & (neighbors == s)
1153
+ grid = new_alive.astype(np.float32)
1154
+
1155
+ # Analog display: alive cells = 1.0, dead cells fade
1156
+ display = np.where(grid > 0.5, 1.0, display * fade)
1157
+ S[key + "_grid"] = grid
1158
+ S[key + "_display"] = display
1159
+ return np.clip(display, 0, 1)
1160
+
1161
+ def vf_strange_attractor(g, f, t, S, attractor="clifford",
1162
+ n_points=50000, warmup=500, bri=0.8, seed=42,
1163
+ params=None):
1164
+ """Strange attractor projected to 2D density field.
1165
+ Iterates N points through attractor equations, bins to grid,
1166
+ produces a density map. Elegant, non-repeating curves.
1167
+
1168
+ attractor presets:
1169
+ "clifford": sin(a*y) + c*cos(a*x), sin(b*x) + d*cos(b*y)
1170
+ "de_jong": sin(a*y) - cos(b*x), sin(c*x) - cos(d*y)
1171
+ "bedhead": sin(x*y/b) + cos(a*x - y), x*sin(a*y) + cos(b*x - y)
1172
+
1173
+ params: (a, b, c, d) floats — each attractor has different sweet spots.
1174
+ If None, uses time-varying defaults for animation.
1175
+ """
1176
+ key = "attr_" + attractor
1177
+ if params is None:
1178
+ # Time-varying parameters for slow morphing
1179
+ a = -1.4 + np.sin(t * 0.05) * 0.3
1180
+ b = 1.6 + np.cos(t * 0.07) * 0.2
1181
+ c = 1.0 + np.sin(t * 0.03 + 1) * 0.3
1182
+ d = 0.7 + np.cos(t * 0.04 + 2) * 0.2
1183
+ else:
1184
+ a, b, c, d = params
1185
+
1186
+ # Iterate attractor
1187
+ rng = np.random.RandomState(seed)
1188
+ x = rng.uniform(-0.1, 0.1, n_points).astype(np.float64)
1189
+ y = rng.uniform(-0.1, 0.1, n_points).astype(np.float64)
1190
+
1191
+ # Warmup iterations (reach the attractor)
1192
+ for _ in range(warmup):
1193
+ if attractor == "clifford":
1194
+ xn = np.sin(a * y) + c * np.cos(a * x)
1195
+ yn = np.sin(b * x) + d * np.cos(b * y)
1196
+ elif attractor == "de_jong":
1197
+ xn = np.sin(a * y) - np.cos(b * x)
1198
+ yn = np.sin(c * x) - np.cos(d * y)
1199
+ elif attractor == "bedhead":
1200
+ xn = np.sin(x * y / b) + np.cos(a * x - y)
1201
+ yn = x * np.sin(a * y) + np.cos(b * x - y)
1202
+ else:
1203
+ xn = np.sin(a * y) + c * np.cos(a * x)
1204
+ yn = np.sin(b * x) + d * np.cos(b * y)
1205
+ x, y = xn, yn
1206
+
1207
+ # Bin to grid
1208
+ # Find bounds
1209
+ margin = 0.1
1210
+ x_min, x_max = x.min() - margin, x.max() + margin
1211
+ y_min, y_max = y.min() - margin, y.max() + margin
1212
+
1213
+ # Map to grid coordinates
1214
+ gx = ((x - x_min) / (x_max - x_min) * (g.cols - 1)).astype(np.int32)
1215
+ gy = ((y - y_min) / (y_max - y_min) * (g.rows - 1)).astype(np.int32)
1216
+ valid = (gx >= 0) & (gx < g.cols) & (gy >= 0) & (gy < g.rows)
1217
+ gx, gy = gx[valid], gy[valid]
1218
+
1219
+ # Accumulate density
1220
+ density = np.zeros((g.rows, g.cols), dtype=np.float32)
1221
+ np.add.at(density, (gy, gx), 1.0)
1222
+
1223
+ # Log-scale density for visibility (most bins have few hits)
1224
+ density = np.log1p(density)
1225
+ mx = density.max()
1226
+ if mx > 0:
1227
+ density = density / mx
1228
+ return np.clip(density * bri * (0.5 + f.get("rms", 0.3) * 0.8), 0, 1)
1229
+ ```
1230
+
1231
+ #### SDF-Based Fields (geometric precision)
1232
+
1233
+ Signed Distance Fields produce mathematically precise shapes. Unlike sine fields (organic, blurry), SDFs give hard geometric boundaries with controllable edge softness. Combined with domain warping, they create "melting geometry" effects.
1234
+
1235
+ All SDF primitives return a **signed distance** (negative inside, positive outside). Convert to a value field with `sdf_render()`.
1236
+
1237
+ ```python
1238
+ def sdf_render(dist, edge_width=1.5, invert=False):
1239
+ """Convert signed distance to value field [0,1].
1240
+ edge_width: controls anti-aliasing / softness of the boundary.
1241
+ invert: True = bright inside shape, False = bright outside."""
1242
+ val = 1.0 - np.clip(dist / edge_width, 0, 1) if not invert else np.clip(dist / edge_width, 0, 1)
1243
+ return np.clip(val, 0, 1)
1244
+
1245
+ def sdf_glow(dist, falloff=0.05):
1246
+ """Render SDF as glowing outline — bright at boundary, fading both directions."""
1247
+ return np.clip(np.exp(-np.abs(dist) * falloff), 0, 1)
1248
+
1249
+ # --- Primitives ---
1250
+
1251
+ def sdf_circle(g, cx_frac=0.5, cy_frac=0.5, radius=0.3):
1252
+ """Circle SDF. cx/cy/radius in normalized [0,1] coordinates."""
1253
+ dx = (g.cc / g.cols - cx_frac) * (g.cols / g.rows) # aspect correction
1254
+ dy = g.rr / g.rows - cy_frac
1255
+ return np.sqrt(dx**2 + dy**2) - radius
1256
+
1257
+ def sdf_box(g, cx_frac=0.5, cy_frac=0.5, w=0.3, h=0.2, round_r=0.0):
1258
+ """Rounded rectangle SDF."""
1259
+ dx = np.abs(g.cc / g.cols - cx_frac) * (g.cols / g.rows) - w + round_r
1260
+ dy = np.abs(g.rr / g.rows - cy_frac) - h + round_r
1261
+ outside = np.sqrt(np.maximum(dx, 0)**2 + np.maximum(dy, 0)**2)
1262
+ inside = np.minimum(np.maximum(dx, dy), 0)
1263
+ return outside + inside - round_r
1264
+
1265
+ def sdf_ring(g, cx_frac=0.5, cy_frac=0.5, radius=0.3, thickness=0.03):
1266
+ """Ring (annulus) SDF."""
1267
+ d = sdf_circle(g, cx_frac, cy_frac, radius)
1268
+ return np.abs(d) - thickness
1269
+
1270
+ def sdf_line(g, x0=0.2, y0=0.5, x1=0.8, y1=0.5, thickness=0.01):
1271
+ """Line segment SDF between two points (normalized coords)."""
1272
+ ax = g.cc / g.cols * (g.cols / g.rows) - x0 * (g.cols / g.rows)
1273
+ ay = g.rr / g.rows - y0
1274
+ bx = (x1 - x0) * (g.cols / g.rows)
1275
+ by = y1 - y0
1276
+ h = np.clip((ax * bx + ay * by) / (bx * bx + by * by + 1e-10), 0, 1)
1277
+ dx = ax - bx * h
1278
+ dy = ay - by * h
1279
+ return np.sqrt(dx**2 + dy**2) - thickness
1280
+
1281
+ def sdf_triangle(g, cx=0.5, cy=0.5, size=0.25):
1282
+ """Equilateral triangle SDF centered at (cx, cy)."""
1283
+ px = (g.cc / g.cols - cx) * (g.cols / g.rows) / size
1284
+ py = (g.rr / g.rows - cy) / size
1285
+ # Equilateral triangle math
1286
+ k = np.sqrt(3.0)
1287
+ px = np.abs(px) - 1.0
1288
+ py = py + 1.0 / k
1289
+ cond = px + k * py > 0
1290
+ px2 = np.where(cond, (px - k * py) / 2.0, px)
1291
+ py2 = np.where(cond, (-k * px - py) / 2.0, py)
1292
+ px2 = np.clip(px2, -2.0, 0.0)
1293
+ return -np.sqrt(px2**2 + py2**2) * np.sign(py2) * size
1294
+
1295
+ def sdf_star(g, cx=0.5, cy=0.5, n_points=5, outer_r=0.25, inner_r=0.12):
1296
+ """Star polygon SDF — n-pointed star."""
1297
+ px = (g.cc / g.cols - cx) * (g.cols / g.rows)
1298
+ py = g.rr / g.rows - cy
1299
+ angle = np.arctan2(py, px)
1300
+ dist = np.sqrt(px**2 + py**2)
1301
+ # Modular angle for star symmetry
1302
+ wedge = 2 * np.pi / n_points
1303
+ a = np.abs((angle % wedge) - wedge / 2)
1304
+ # Interpolate radius between inner and outer
1305
+ r_at_angle = inner_r + (outer_r - inner_r) * np.clip(np.cos(a * n_points) * 0.5 + 0.5, 0, 1)
1306
+ return dist - r_at_angle
1307
+
1308
+ def sdf_heart(g, cx=0.5, cy=0.45, size=0.25):
1309
+ """Heart shape SDF."""
1310
+ px = (g.cc / g.cols - cx) * (g.cols / g.rows) / size
1311
+ py = -(g.rr / g.rows - cy) / size + 0.3 # flip y, offset
1312
+ px = np.abs(px)
1313
+ cond = (px + py) > 1.0
1314
+ d1 = np.sqrt((px - 0.25)**2 + (py - 0.75)**2) - np.sqrt(2.0) / 4.0
1315
+ d2 = np.sqrt((px + py - 1.0)**2) / np.sqrt(2.0)
1316
+ return np.where(cond, d1, d2) * size
1317
+
1318
+ # --- Combinators ---
1319
+
1320
+ def sdf_union(d1, d2):
1321
+ """Boolean union — shape is wherever either SDF is inside."""
1322
+ return np.minimum(d1, d2)
1323
+
1324
+ def sdf_intersect(d1, d2):
1325
+ """Boolean intersection — shape is where both SDFs overlap."""
1326
+ return np.maximum(d1, d2)
1327
+
1328
+ def sdf_subtract(d1, d2):
1329
+ """Boolean subtraction — d1 minus d2."""
1330
+ return np.maximum(d1, -d2)
1331
+
1332
+ def sdf_smooth_union(d1, d2, k=0.1):
1333
+ """Smooth minimum (polynomial) — blends shapes with rounded join.
1334
+ k: smoothing radius. Higher = more rounding."""
1335
+ h = np.clip(0.5 + 0.5 * (d2 - d1) / k, 0, 1)
1336
+ return d2 * (1 - h) + d1 * h - k * h * (1 - h)
1337
+
1338
+ def sdf_smooth_subtract(d1, d2, k=0.1):
1339
+ """Smooth subtraction — d1 minus d2 with rounded edge."""
1340
+ return sdf_smooth_union(d1, -d2, k)
1341
+
1342
+ def sdf_repeat(g, sdf_fn, spacing_x=0.25, spacing_y=0.25, **sdf_kwargs):
1343
+ """Tile an SDF primitive infinitely. spacing in normalized coords."""
1344
+ # Modular coordinates
1345
+ mod_cc = (g.cc / g.cols) % spacing_x - spacing_x / 2
1346
+ mod_rr = (g.rr / g.rows) % spacing_y - spacing_y / 2
1347
+ # Create modified grid-like arrays for the SDF
1348
+ # This is a simplified approach — build a temporary namespace
1349
+ class ModGrid:
1350
+ pass
1351
+ mg = ModGrid()
1352
+ mg.cc = mod_cc * g.cols; mg.rr = mod_rr * g.rows
1353
+ mg.cols = g.cols; mg.rows = g.rows
1354
+ return sdf_fn(mg, **sdf_kwargs)
1355
+
1356
+ # --- SDF as Value Field ---
1357
+
1358
+ def vf_sdf(g, f, t, S, sdf_fn=sdf_circle, edge_width=1.5, glow=False,
1359
+ glow_falloff=0.03, animate=True, **sdf_kwargs):
1360
+ """Wrap any SDF primitive as a standard vf_* value field.
1361
+ If animate=True, applies slow rotation and breathing to the shape."""
1362
+ if animate:
1363
+ sdf_kwargs.setdefault("cx_frac", 0.5)
1364
+ sdf_kwargs.setdefault("cy_frac", 0.5)
1365
+ d = sdf_fn(g, **sdf_kwargs)
1366
+ if glow:
1367
+ return sdf_glow(d, glow_falloff) * (0.5 + f.get("rms", 0.3) * 0.8)
1368
+ return sdf_render(d, edge_width) * (0.5 + f.get("rms", 0.3) * 0.8)
1369
+ ```
1370
+
1371
+ ### Hue Field Generators (Color Mapping)
1372
+
1373
+ These produce float32 hue arrays [0,1]. Independently combinable with any value field. Each is a factory returning a closure with signature `(g, f, t, S) -> float32 array`. Can also be a plain float for fixed hue.
1374
+
1375
+ ```python
1376
+ def hf_fixed(hue):
1377
+ """Single hue everywhere."""
1378
+ def fn(g, f, t, S):
1379
+ return np.full((g.rows, g.cols), hue, dtype=np.float32)
1380
+ return fn
1381
+
1382
+ def hf_angle(offset=0.0):
1383
+ """Hue mapped to angle from center — rainbow wheel."""
1384
+ def fn(g, f, t, S):
1385
+ return (g.angle / (2 * np.pi) + offset + t * 0.05) % 1.0
1386
+ return fn
1387
+
1388
+ def hf_distance(base=0.5, scale=0.02):
1389
+ """Hue mapped to distance from center."""
1390
+ def fn(g, f, t, S):
1391
+ return (base + g.dist * scale + t * 0.03) % 1.0
1392
+ return fn
1393
+
1394
+ def hf_time_cycle(speed=0.1):
1395
+ """Hue cycles uniformly over time."""
1396
+ def fn(g, f, t, S):
1397
+ return np.full((g.rows, g.cols), (t * speed) % 1.0, dtype=np.float32)
1398
+ return fn
1399
+
1400
+ def hf_audio_cent():
1401
+ """Hue follows spectral centroid — timbral color shifting."""
1402
+ def fn(g, f, t, S):
1403
+ return np.full((g.rows, g.cols), f.get("cent", 0.5) * 0.3, dtype=np.float32)
1404
+ return fn
1405
+
1406
+ def hf_gradient_h(start=0.0, end=1.0):
1407
+ """Left-to-right hue gradient."""
1408
+ def fn(g, f, t, S):
1409
+ h = np.broadcast_to(
1410
+ start + (g.cc / g.cols) * (end - start),
1411
+ (g.rows, g.cols)
1412
+ ).copy() # .copy() is CRITICAL — see troubleshooting.md
1413
+ return h % 1.0
1414
+ return fn
1415
+
1416
+ def hf_gradient_v(start=0.0, end=1.0):
1417
+ """Top-to-bottom hue gradient."""
1418
+ def fn(g, f, t, S):
1419
+ h = np.broadcast_to(
1420
+ start + (g.rr / g.rows) * (end - start),
1421
+ (g.rows, g.cols)
1422
+ ).copy()
1423
+ return h % 1.0
1424
+ return fn
1425
+
1426
+ def hf_plasma(speed=0.3):
1427
+ """Plasma-style hue field — organic color variation."""
1428
+ def fn(g, f, t, S):
1429
+ return (np.sin(g.cc*0.02 + t*speed)*0.5 + np.sin(g.rr*0.015 + t*speed*0.7)*0.5) % 1.0
1430
+ return fn
1431
+ ```
1432
+
1433
+ ---
1434
+
1435
+ ## Coordinate Transforms
1436
+
1437
+ UV-space transforms applied **before** effect evaluation. Any `vf_*` function can be rotated, zoomed, tiled, or distorted by transforming the grid coordinates it sees.
1438
+
1439
+ ### Transform Helpers
1440
+
1441
+ ```python
1442
+ def uv_rotate(g, angle):
1443
+ """Rotate UV coordinates around grid center.
1444
+ Returns (rotated_cc, rotated_rr) arrays — use in place of g.cc, g.rr."""
1445
+ cx, cy = g.cols / 2.0, g.rows / 2.0
1446
+ cos_a, sin_a = np.cos(angle), np.sin(angle)
1447
+ dx = g.cc - cx
1448
+ dy = g.rr - cy
1449
+ return cx + dx * cos_a - dy * sin_a, cy + dx * sin_a + dy * cos_a
1450
+
1451
+ def uv_scale(g, sx=1.0, sy=1.0, cx_frac=0.5, cy_frac=0.5):
1452
+ """Scale UV coordinates around a center point.
1453
+ sx, sy > 1 = zoom in (fewer repeats), < 1 = zoom out (more repeats)."""
1454
+ cx = g.cols * cx_frac; cy = g.rows * cy_frac
1455
+ return cx + (g.cc - cx) / sx, cy + (g.rr - cy) / sy
1456
+
1457
+ def uv_skew(g, kx=0.0, ky=0.0):
1458
+ """Skew UV coordinates. kx shears horizontally, ky vertically."""
1459
+ return g.cc + g.rr * kx, g.rr + g.cc * ky
1460
+
1461
+ def uv_tile(g, nx=3.0, ny=3.0, mirror=False):
1462
+ """Tile UV coordinates. nx, ny = number of repeats.
1463
+ mirror=True: alternating tiles are flipped (seamless)."""
1464
+ u = (g.cc / g.cols * nx) % 1.0
1465
+ v = (g.rr / g.rows * ny) % 1.0
1466
+ if mirror:
1467
+ flip_u = ((g.cc / g.cols * nx).astype(int) % 2) == 1
1468
+ flip_v = ((g.rr / g.rows * ny).astype(int) % 2) == 1
1469
+ u = np.where(flip_u, 1.0 - u, u)
1470
+ v = np.where(flip_v, 1.0 - v, v)
1471
+ return u * g.cols, v * g.rows
1472
+
1473
+ def uv_polar(g):
1474
+ """Convert Cartesian to polar UV. Returns (angle_as_cc, dist_as_rr).
1475
+ Use to make any linear effect radial."""
1476
+ # Angle wraps [0, cols), distance wraps [0, rows)
1477
+ return g.angle / (2 * np.pi) * g.cols, g.dist_n * g.rows
1478
+
1479
+ def uv_cartesian_from_polar(g):
1480
+ """Convert polar-addressed effects back to Cartesian.
1481
+ Treats g.cc as angle and g.rr as radius."""
1482
+ angle = g.cc / g.cols * 2 * np.pi
1483
+ radius = g.rr / g.rows
1484
+ cx, cy = g.cols / 2.0, g.rows / 2.0
1485
+ return cx + radius * np.cos(angle) * cx, cy + radius * np.sin(angle) * cy
1486
+
1487
+ def uv_twist(g, amount=2.0):
1488
+ """Twist: rotation increases with distance from center. Creates spiral distortion."""
1489
+ twist_angle = g.dist_n * amount
1490
+ return uv_rotate_raw(g.cc, g.rr, g.cols / 2, g.rows / 2, twist_angle)
1491
+
1492
+ def uv_rotate_raw(cc, rr, cx, cy, angle):
1493
+ """Raw rotation on arbitrary coordinate arrays."""
1494
+ cos_a, sin_a = np.cos(angle), np.sin(angle)
1495
+ dx = cc - cx; dy = rr - cy
1496
+ return cx + dx * cos_a - dy * sin_a, cy + dx * sin_a + dy * cos_a
1497
+
1498
+ def uv_fisheye(g, strength=1.5):
1499
+ """Fisheye / barrel distortion on UV coordinates."""
1500
+ cx, cy = g.cols / 2.0, g.rows / 2.0
1501
+ dx = (g.cc - cx) / cx
1502
+ dy = (g.rr - cy) / cy
1503
+ r = np.sqrt(dx**2 + dy**2)
1504
+ r_distort = np.power(r, strength)
1505
+ scale = np.where(r > 0, r_distort / (r + 1e-10), 1.0)
1506
+ return cx + dx * scale * cx, cy + dy * scale * cy
1507
+
1508
+ def uv_wave(g, t, freq=0.1, amp=3.0, axis="x"):
1509
+ """Sinusoidal coordinate displacement. Wobbles the UV space."""
1510
+ if axis == "x":
1511
+ return g.cc + np.sin(g.rr * freq + t * 3) * amp, g.rr
1512
+ else:
1513
+ return g.cc, g.rr + np.sin(g.cc * freq + t * 3) * amp
1514
+
1515
+ def uv_mobius(g, a=1.0, b=0.0, c=0.0, d=1.0):
1516
+ """Möbius transformation (conformal map): f(z) = (az + b) / (cz + d).
1517
+ Operates on complex plane. Produces mathematically precise, visually
1518
+ striking inversions and circular transforms."""
1519
+ cx, cy = g.cols / 2.0, g.rows / 2.0
1520
+ # Map grid to complex plane [-1, 1]
1521
+ zr = (g.cc - cx) / cx
1522
+ zi = (g.rr - cy) / cy
1523
+ # Complex division: (a*z + b) / (c*z + d)
1524
+ num_r = a * zr - 0 * zi + b # imaginary parts of a,b,c,d = 0 for real params
1525
+ num_i = a * zi + 0 * zr + 0
1526
+ den_r = c * zr - 0 * zi + d
1527
+ den_i = c * zi + 0 * zr + 0
1528
+ denom = den_r**2 + den_i**2 + 1e-10
1529
+ wr = (num_r * den_r + num_i * den_i) / denom
1530
+ wi = (num_i * den_r - num_r * den_i) / denom
1531
+ return cx + wr * cx, cy + wi * cy
1532
+ ```
1533
+
1534
+ ### Using Transforms with Value Fields
1535
+
1536
+ Transforms modify what coordinates a value field sees. Wrap the transform around the `vf_*` call:
1537
+
1538
+ ```python
1539
+ # Rotate a plasma field 45 degrees
1540
+ def vf_rotated_plasma(g, f, t, S):
1541
+ rc, rr = uv_rotate(g, np.pi / 4 + t * 0.1)
1542
+ class TG: # transformed grid
1543
+ pass
1544
+ tg = TG(); tg.cc = rc; tg.rr = rr
1545
+ tg.rows = g.rows; tg.cols = g.cols
1546
+ tg.dist_n = g.dist_n; tg.angle = g.angle; tg.dist = g.dist
1547
+ return vf_plasma(tg, f, t, S)
1548
+
1549
+ # Tile a vortex 3x3 with mirror
1550
+ def vf_tiled_vortex(g, f, t, S):
1551
+ tc, tr = uv_tile(g, 3, 3, mirror=True)
1552
+ class TG:
1553
+ pass
1554
+ tg = TG(); tg.cc = tc; tg.rr = tr
1555
+ tg.rows = g.rows; tg.cols = g.cols
1556
+ tg.dist = np.sqrt((tc - g.cols/2)**2 + (tr - g.rows/2)**2)
1557
+ tg.dist_n = tg.dist / (tg.dist.max() + 1e-10)
1558
+ tg.angle = np.arctan2(tr - g.rows/2, tc - g.cols/2)
1559
+ return vf_vortex(tg, f, t, S)
1560
+
1561
+ # Helper: create transformed grid from coordinate arrays
1562
+ def make_tgrid(g, new_cc, new_rr):
1563
+ """Build a grid-like object with transformed coordinates.
1564
+ Preserves rows/cols for sizing, recomputes polar coords."""
1565
+ class TG:
1566
+ pass
1567
+ tg = TG()
1568
+ tg.cc = new_cc; tg.rr = new_rr
1569
+ tg.rows = g.rows; tg.cols = g.cols
1570
+ cx, cy = g.cols / 2.0, g.rows / 2.0
1571
+ dx = new_cc - cx; dy = new_rr - cy
1572
+ tg.dist = np.sqrt(dx**2 + dy**2)
1573
+ tg.dist_n = tg.dist / (max(cx, cy) + 1e-10)
1574
+ tg.angle = np.arctan2(dy, dx)
1575
+ tg.dx = dx; tg.dy = dy
1576
+ tg.dx_n = dx / max(g.cols, 1)
1577
+ tg.dy_n = dy / max(g.rows, 1)
1578
+ return tg
1579
+ ```
1580
+
1581
+ ---
1582
+
1583
+ ## Temporal Coherence
1584
+
1585
+ Tools for smooth, intentional parameter evolution over time. Replaces the default pattern of either static parameters or raw audio reactivity.
1586
+
1587
+ ### Easing Functions
1588
+
1589
+ Standard animation easing curves. All take `t` in [0,1] and return [0,1]:
1590
+
1591
+ ```python
1592
+ def ease_linear(t): return t
1593
+ def ease_in_quad(t): return t * t
1594
+ def ease_out_quad(t): return t * (2 - t)
1595
+ def ease_in_out_quad(t): return np.where(t < 0.5, 2*t*t, -1 + (4-2*t)*t)
1596
+ def ease_in_cubic(t): return t**3
1597
+ def ease_out_cubic(t): return (t - 1)**3 + 1
1598
+ def ease_in_out_cubic(t):
1599
+ return np.where(t < 0.5, 4*t**3, 1 - (-2*t + 2)**3 / 2)
1600
+ def ease_in_expo(t): return np.where(t == 0, 0, 2**(10*(t-1)))
1601
+ def ease_out_expo(t): return np.where(t == 1, 1, 1 - 2**(-10*t))
1602
+ def ease_elastic(t):
1603
+ """Elastic ease-out — overshoots then settles."""
1604
+ return np.where(t == 0, 0, np.where(t == 1, 1,
1605
+ 2**(-10*t) * np.sin((t*10 - 0.75) * (2*np.pi) / 3) + 1))
1606
+ def ease_bounce(t):
1607
+ """Bounce ease-out — bounces at the end."""
1608
+ t = np.asarray(t, dtype=np.float64)
1609
+ result = np.empty_like(t)
1610
+ m1 = t < 1/2.75
1611
+ m2 = (~m1) & (t < 2/2.75)
1612
+ m3 = (~m1) & (~m2) & (t < 2.5/2.75)
1613
+ m4 = ~(m1 | m2 | m3)
1614
+ result[m1] = 7.5625 * t[m1]**2
1615
+ t2 = t[m2] - 1.5/2.75; result[m2] = 7.5625 * t2**2 + 0.75
1616
+ t3 = t[m3] - 2.25/2.75; result[m3] = 7.5625 * t3**2 + 0.9375
1617
+ t4 = t[m4] - 2.625/2.75; result[m4] = 7.5625 * t4**2 + 0.984375
1618
+ return result
1619
+ ```
1620
+
1621
+ ### Keyframe Interpolation
1622
+
1623
+ Define parameter values at specific times. Interpolates between them with easing:
1624
+
1625
+ ```python
1626
+ def keyframe(t, points, ease_fn=ease_in_out_cubic, loop=False):
1627
+ """Interpolate between keyframed values.
1628
+
1629
+ Args:
1630
+ t: current time (float, seconds)
1631
+ points: list of (time, value) tuples, sorted by time
1632
+ ease_fn: easing function for interpolation
1633
+ loop: if True, wraps around after last keyframe
1634
+
1635
+ Returns:
1636
+ interpolated value at time t
1637
+
1638
+ Example:
1639
+ twist = keyframe(t, [(0, 1.0), (5, 6.0), (10, 2.0)], ease_out_cubic)
1640
+ """
1641
+ if not points:
1642
+ return 0.0
1643
+ if loop:
1644
+ period = points[-1][0] - points[0][0]
1645
+ if period > 0:
1646
+ t = points[0][0] + (t - points[0][0]) % period
1647
+
1648
+ # Clamp to range
1649
+ if t <= points[0][0]:
1650
+ return points[0][1]
1651
+ if t >= points[-1][0]:
1652
+ return points[-1][1]
1653
+
1654
+ # Find surrounding keyframes
1655
+ for i in range(len(points) - 1):
1656
+ t0, v0 = points[i]
1657
+ t1, v1 = points[i + 1]
1658
+ if t0 <= t <= t1:
1659
+ progress = (t - t0) / (t1 - t0)
1660
+ eased = ease_fn(progress)
1661
+ return v0 + (v1 - v0) * eased
1662
+
1663
+ return points[-1][1]
1664
+
1665
+ def keyframe_array(t, points, ease_fn=ease_in_out_cubic):
1666
+ """Keyframe interpolation that works with numpy arrays as values.
1667
+ points: list of (time, np.array) tuples."""
1668
+ if t <= points[0][0]: return points[0][1].copy()
1669
+ if t >= points[-1][0]: return points[-1][1].copy()
1670
+ for i in range(len(points) - 1):
1671
+ t0, v0 = points[i]
1672
+ t1, v1 = points[i + 1]
1673
+ if t0 <= t <= t1:
1674
+ progress = ease_fn((t - t0) / (t1 - t0))
1675
+ return v0 * (1 - progress) + v1 * progress
1676
+ return points[-1][1].copy()
1677
+ ```
1678
+
1679
+ ### Value Field Morphing
1680
+
1681
+ Smooth transition between two different value fields:
1682
+
1683
+ ```python
1684
+ def vf_morph(g, f, t, S, vf_a, vf_b, t_start, t_end,
1685
+ ease_fn=ease_in_out_cubic):
1686
+ """Morph between two value fields over a time range.
1687
+
1688
+ Usage:
1689
+ val = vf_morph(g, f, t, S,
1690
+ lambda g,f,t,S: vf_plasma(g,f,t,S),
1691
+ lambda g,f,t,S: vf_vortex(g,f,t,S, twist=5),
1692
+ t_start=10.0, t_end=15.0)
1693
+ """
1694
+ if t <= t_start:
1695
+ return vf_a(g, f, t, S)
1696
+ if t >= t_end:
1697
+ return vf_b(g, f, t, S)
1698
+ progress = ease_fn((t - t_start) / (t_end - t_start))
1699
+ a = vf_a(g, f, t, S)
1700
+ b = vf_b(g, f, t, S)
1701
+ return a * (1 - progress) + b * progress
1702
+
1703
+ def vf_sequence(g, f, t, S, fields, durations, crossfade=1.0,
1704
+ ease_fn=ease_in_out_cubic):
1705
+ """Cycle through a sequence of value fields with crossfades.
1706
+
1707
+ fields: list of vf_* callables
1708
+ durations: list of float seconds per field
1709
+ crossfade: seconds of overlap between adjacent fields
1710
+ """
1711
+ total = sum(durations)
1712
+ t_local = t % total # loop
1713
+ elapsed = 0
1714
+ for i, dur in enumerate(durations):
1715
+ if t_local < elapsed + dur:
1716
+ # Current field
1717
+ base = fields[i](g, f, t, S)
1718
+ # Check if we're in a crossfade zone
1719
+ time_in = t_local - elapsed
1720
+ time_left = dur - time_in
1721
+ if time_in < crossfade and i > 0:
1722
+ # Fading in from previous
1723
+ prev = fields[(i - 1) % len(fields)](g, f, t, S)
1724
+ blend = ease_fn(time_in / crossfade)
1725
+ return prev * (1 - blend) + base * blend
1726
+ if time_left < crossfade and i < len(fields) - 1:
1727
+ # Fading out to next
1728
+ nxt = fields[(i + 1) % len(fields)](g, f, t, S)
1729
+ blend = ease_fn(1 - time_left / crossfade)
1730
+ return base * (1 - blend) + nxt * blend
1731
+ return base
1732
+ elapsed += dur
1733
+ return fields[-1](g, f, t, S)
1734
+ ```
1735
+
1736
+ ### Temporal Noise
1737
+
1738
+ 3D noise sampled at `(x, y, t)` — patterns evolve smoothly in time without per-frame discontinuities:
1739
+
1740
+ ```python
1741
+ def vf_temporal_noise(g, f, t, S, freq=0.06, t_freq=0.3, octaves=4,
1742
+ bri=0.8):
1743
+ """Noise field that evolves smoothly in time. Uses 3D noise via
1744
+ two 2D noise lookups combined with temporal interpolation.
1745
+
1746
+ Unlike vf_fbm which scrolls noise (creating directional motion),
1747
+ this morphs the pattern in-place — cells brighten and dim without
1748
+ the field moving in any direction."""
1749
+ # Two noise samples at floor/ceil of temporal coordinate
1750
+ t_scaled = t * t_freq
1751
+ t_lo = np.floor(t_scaled)
1752
+ t_frac = _smootherstep(np.full((g.rows, g.cols), t_scaled - t_lo, dtype=np.float32))
1753
+
1754
+ val_lo = np.zeros((g.rows, g.cols), dtype=np.float32)
1755
+ val_hi = np.zeros((g.rows, g.cols), dtype=np.float32)
1756
+ amp = 1.0; fx = freq
1757
+ for i in range(octaves):
1758
+ val_lo = val_lo + _value_noise_2d(
1759
+ g.cc * fx + t_lo * 7.3 + i * 13, g.rr * fx + t_lo * 3.1 + i * 29) * amp
1760
+ val_hi = val_hi + _value_noise_2d(
1761
+ g.cc * fx + (t_lo + 1) * 7.3 + i * 13, g.rr * fx + (t_lo + 1) * 3.1 + i * 29) * amp
1762
+ amp *= 0.5; fx *= 2.0
1763
+ max_amp = (1 - 0.5 ** octaves) / 0.5
1764
+ val = (val_lo * (1 - t_frac) + val_hi * t_frac) / max_amp
1765
+ return np.clip(val * bri * (0.6 + f.get("rms", 0.3) * 0.6), 0, 1)
1766
+ ```
1767
+
1768
+ ---
1769
+
1770
+ ### Combining Value Fields
1771
+
1772
+ The combinatorial explosion comes from mixing value fields with math:
1773
+
1774
+ ```python
1775
+ # Multiplication = intersection (only shows where both have brightness)
1776
+ combined = vf_plasma(g,f,t,S) * vf_vortex(g,f,t,S)
1777
+
1778
+ # Addition = union (shows both, clips at 1.0)
1779
+ combined = np.clip(vf_rings(g,f,t,S) + vf_spiral(g,f,t,S), 0, 1)
1780
+
1781
+ # Interference = beat pattern (shows XOR-like patterns)
1782
+ combined = np.abs(vf_plasma(g,f,t,S) - vf_tunnel(g,f,t,S))
1783
+
1784
+ # Modulation = one effect shapes the other
1785
+ combined = vf_rings(g,f,t,S) * (0.3 + 0.7 * vf_plasma(g,f,t,S))
1786
+
1787
+ # Maximum = shows the brightest of two effects
1788
+ combined = np.maximum(vf_spiral(g,f,t,S), vf_aurora(g,f,t,S))
1789
+ ```
1790
+
1791
+ ### Full Scene Example (v2 — Canvas Return)
1792
+
1793
+ A v2 scene function composes effects internally and returns a pixel canvas:
1794
+
1795
+ ```python
1796
+ def scene_complex(r, f, t, S):
1797
+ """v2 scene function: returns canvas (uint8 H,W,3).
1798
+ r = Renderer, f = audio features, t = time, S = persistent state dict."""
1799
+ g = r.grids["md"]
1800
+ rows, cols = g.rows, g.cols
1801
+
1802
+ # 1. Value field composition
1803
+ plasma = vf_plasma(g, f, t, S)
1804
+ vortex = vf_vortex(g, f, t, S, twist=4.0)
1805
+ combined = np.clip(plasma * 0.6 + vortex * 0.5 + plasma * vortex * 0.4, 0, 1)
1806
+
1807
+ # 2. Color from hue field
1808
+ h = (hf_angle(0.3)(g,f,t,S) * 0.5 + hf_time_cycle(0.08)(g,f,t,S) * 0.5) % 1.0
1809
+
1810
+ # 3. Render to canvas via _render_vf helper
1811
+ canvas = _render_vf(g, combined, h, sat=0.75, pal=PAL_DENSE)
1812
+
1813
+ # 4. Optional: blend a second layer
1814
+ overlay = _render_vf(r.grids["sm"], vf_rings(r.grids["sm"],f,t,S),
1815
+ hf_fixed(0.6)(r.grids["sm"],f,t,S), pal=PAL_BLOCK)
1816
+ canvas = blend_canvas(canvas, overlay, "screen", 0.4)
1817
+
1818
+ return canvas
1819
+
1820
+ # In the render_clip() loop (handled by the framework):
1821
+ # canvas = scene_fn(r, f, t, S)
1822
+ # canvas = tonemap(canvas, gamma=scene_gamma)
1823
+ # canvas = feedback.apply(canvas, ...)
1824
+ # canvas = shader_chain.apply(canvas, f=f, t=t)
1825
+ # pipe.stdin.write(canvas.tobytes())
1826
+ ```
1827
+
1828
+ Vary the **value field combo**, **hue field**, **palette**, **blend modes**, **feedback config**, and **shader chain** per section for maximum visual variety. With 12 value fields × 8 hue fields × 14 palettes × 20 blend modes × 7 feedback transforms × 38 shaders, the combinations are effectively infinite.
1829
+
1830
+ ---
1831
+
1832
+ ## Combining Effects — Creative Guide
1833
+
1834
+ The catalog above is vocabulary. Here's how to compose it into something that looks intentional.
1835
+
1836
+ ### Layering for Depth
1837
+ Every scene should have at least two layers at different grid densities:
1838
+ - **Background** (sm or xs): dense, dim texture that prevents flat black. fBM, smooth noise, or domain warp at low brightness (bri=0.15-0.25).
1839
+ - **Content** (md): the main visual — rings, voronoi, spirals, tunnel. Full brightness.
1840
+ - **Accent** (lg or xl): sparse highlights — particles, text stencil, glow pulse. Screen-blended on top.
1841
+
1842
+ ### Interesting Effect Pairs
1843
+ | Pair | Blend | Why it works |
1844
+ |------|-------|-------------|
1845
+ | fBM + voronoi edges | `screen` | Organic fills the cells, edges add structure |
1846
+ | Domain warp + plasma | `difference` | Psychedelic organic interference |
1847
+ | Tunnel + vortex | `screen` | Depth perspective + rotational energy |
1848
+ | Spiral + interference | `exclusion` | Moire patterns from different spatial frequencies |
1849
+ | Reaction-diffusion + fire | `add` | Living organic base + dynamic foreground |
1850
+ | SDF geometry + domain warp | `screen` | Clean shapes floating in organic texture |
1851
+
1852
+ ### Effects as Masks
1853
+ Any value field can be used as a mask for another effect via `mask_from_vf()`:
1854
+ - Voronoi cells masking fire (fire visible only inside cells)
1855
+ - fBM masking a solid color layer (organic color clouds)
1856
+ - SDF shapes masking a reaction-diffusion field
1857
+ - Animated iris/wipe revealing one effect over another
1858
+
1859
+ ### Inventing New Effects
1860
+ For every project, create at least one effect that isn't in the catalog:
1861
+ - **Combine two vf_* functions** with math: `np.clip(vf_fbm(...) * vf_rings(...), 0, 1)`
1862
+ - **Apply coordinate transforms** before evaluation: `vf_plasma(twisted_grid, ...)`
1863
+ - **Use one field to modulate another's parameters**: `vf_spiral(..., tightness=2 + vf_fbm(...) * 5)`
1864
+ - **Stack time offsets**: render the same field at `t` and `t - 0.5`, difference-blend for motion trails
1865
+ - **Mirror a value field** through an SDF boundary for kaleidoscopic geometry