machinaos 0.0.76 → 0.0.78

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 (393) hide show
  1. package/README.md +143 -107
  2. package/client/dist/assets/ActionBar-Du2MSFSz.js +1 -0
  3. package/client/dist/assets/ApiKeyInput-k2LBmBjb.js +1 -0
  4. package/client/dist/assets/ApiKeyPanel-C_bV9U0X.js +1 -0
  5. package/client/dist/assets/ApiUsageSection-CmVfwZzL.js +1 -0
  6. package/client/dist/assets/EmailPanel-CeKIMGu-.js +1 -0
  7. package/client/dist/assets/OAuthPanel-KA3t3Q2K.js +1 -0
  8. package/client/dist/assets/QrPairingPanel-NgNpJNuk.js +1 -0
  9. package/client/dist/assets/RateLimitSection-Du5YNVIA.js +1 -0
  10. package/client/dist/assets/StatusCard-DNLyayXc.js +1 -0
  11. package/client/dist/assets/index-DQ0nwhec.js +257 -0
  12. package/client/dist/assets/index-DxmbVskS.css +1 -0
  13. package/client/dist/assets/vendor-flow-CZmBvHRo.js +1 -0
  14. package/client/dist/assets/vendor-icons-CVrPjN2Q.js +22 -0
  15. package/client/dist/assets/vendor-markdown-CRou3yQ5.js +62 -0
  16. package/client/dist/assets/vendor-misc-C4VxKHs5.js +1 -0
  17. package/client/dist/assets/vendor-query-SzWcOU0G.js +1 -0
  18. package/client/dist/assets/vendor-radix-Dnos29jG.js +56 -0
  19. package/client/dist/assets/vendor-react-DvWIbVx0.js +1 -0
  20. package/client/dist/index.html +37 -3
  21. package/client/index.html +28 -1
  22. package/client/package.json +44 -40
  23. package/client/src/App.tsx +2 -0
  24. package/client/src/Dashboard.tsx +157 -45
  25. package/client/src/ParameterPanel.tsx +3 -5
  26. package/client/src/adapters/nodeSpecToDescription.ts +1 -0
  27. package/client/src/assets/icons/NodeIcon.tsx +32 -0
  28. package/client/src/assets/icons/index.ts +4 -0
  29. package/client/src/assets/icons/stripe.svg +1 -0
  30. package/client/src/assets/icons/themedGlyphs.ts +404 -0
  31. package/client/src/components/AIAgentNode.tsx +77 -53
  32. package/client/src/components/GenericNode.tsx +34 -52
  33. package/client/src/components/OutputPanel.tsx +64 -147
  34. package/client/src/components/ParameterRenderer.tsx +5 -3
  35. package/client/src/components/SkillEditorModal.tsx +9 -18
  36. package/client/src/components/SquareNode.tsx +97 -115
  37. package/client/src/components/StartNode.tsx +32 -42
  38. package/client/src/components/SvgFilterDefs.tsx +54 -0
  39. package/client/src/components/TeamMonitorNode.tsx +12 -14
  40. package/client/src/components/ToolkitNode.tsx +35 -60
  41. package/client/src/components/TriggerNode.tsx +43 -77
  42. package/client/src/components/__tests__/CredentialsModal.test.tsx +49 -45
  43. package/client/src/components/credentials/CredentialsModal.tsx +98 -30
  44. package/client/src/components/credentials/CredentialsPalette.tsx +73 -5
  45. package/client/src/components/credentials/catalogueAdapter.ts +17 -1
  46. package/client/src/components/credentials/panels/ApiKeyPanel.tsx +102 -37
  47. package/client/src/components/credentials/panels/EmailPanel.tsx +7 -19
  48. package/client/src/components/credentials/panels/OAuthPanel.tsx +5 -1
  49. package/client/src/components/credentials/panels/QrPairingPanel.tsx +1 -3
  50. package/client/src/components/credentials/primitives/ActionBar.tsx +7 -11
  51. package/client/src/components/credentials/primitives/OAuthConnect.tsx +19 -28
  52. package/client/src/components/credentials/sections/ProviderDefaultsSection.tsx +24 -3
  53. package/client/src/components/credentials/types.ts +12 -2
  54. package/client/src/components/credentials/useCredentialPanel.ts +43 -19
  55. package/client/src/components/icons/AIProviderIcons.tsx +16 -0
  56. package/client/src/components/onboarding/OnboardingWizard.tsx +23 -63
  57. package/client/src/components/onboarding/nodeRoleClasses.ts +23 -0
  58. package/client/src/components/onboarding/steps/CanvasStep.tsx +15 -21
  59. package/client/src/components/onboarding/steps/ConceptsStep.tsx +2 -11
  60. package/client/src/components/onboarding/steps/GetStartedStep.tsx +2 -10
  61. package/client/src/components/parameterPanel/InputSection.tsx +9 -7
  62. package/client/src/components/parameterPanel/MasterSkillEditor.tsx +84 -198
  63. package/client/src/components/parameterPanel/MiddleSection.tsx +57 -80
  64. package/client/src/components/parameterPanel/ToolSchemaEditor.tsx +31 -25
  65. package/client/src/components/parameterPanel/__tests__/InputSection.test.tsx +7 -2
  66. package/client/src/components/ui/AIResultModal.tsx +1 -1
  67. package/client/src/components/ui/CollapsibleSection.tsx +9 -5
  68. package/client/src/components/ui/CommandPalette.tsx +147 -0
  69. package/client/src/components/ui/CommandPaletteHost.tsx +189 -0
  70. package/client/src/components/ui/ComponentItem.tsx +13 -7
  71. package/client/src/components/ui/ComponentPalette.tsx +24 -13
  72. package/client/src/components/ui/ConsolePanel.tsx +19 -11
  73. package/client/src/components/ui/DropCap.tsx +28 -0
  74. package/client/src/components/ui/EditableNodeLabel.tsx +10 -2
  75. package/client/src/components/ui/InputNodesPanel.tsx +1 -1
  76. package/client/src/components/ui/Modal.tsx +38 -6
  77. package/client/src/components/ui/OutputDisplayPanel.tsx +1 -1
  78. package/client/src/components/ui/SettingsPanel.tsx +42 -13
  79. package/client/src/components/ui/StatusBar.tsx +108 -0
  80. package/client/src/components/ui/ThemeSwitcher.tsx +109 -0
  81. package/client/src/components/ui/TopToolbar.tsx +42 -25
  82. package/client/src/components/ui/WorkflowSidebar.tsx +32 -16
  83. package/client/src/components/ui/action-button.tsx +40 -15
  84. package/client/src/components/ui/button.tsx +24 -1
  85. package/client/src/components/ui/dropdown-menu.tsx +24 -2
  86. package/client/src/components/ui/input.tsx +19 -2
  87. package/client/src/components/ui/select.tsx +15 -0
  88. package/client/src/components/ui/textarea.tsx +15 -2
  89. package/client/src/contexts/AuthContext.tsx +148 -109
  90. package/client/src/contexts/ThemeContext.tsx +93 -17
  91. package/client/src/contexts/WebSocketContext.tsx +373 -206
  92. package/client/src/contexts/__tests__/AuthContext.test.tsx +221 -0
  93. package/client/src/hooks/__tests__/useDragVariable.test.ts +7 -1
  94. package/client/src/hooks/__tests__/useWorkflowOpsListener.test.ts +142 -0
  95. package/client/src/hooks/useAppTheme.ts +209 -7
  96. package/client/src/hooks/useAutoSkillEdges.ts +7 -2
  97. package/client/src/hooks/useCatalogueQuery.ts +67 -1
  98. package/client/src/hooks/useDragVariable.ts +1 -1
  99. package/client/src/hooks/useNodeAllowlist.ts +115 -8
  100. package/client/src/hooks/useOnboarding.ts +20 -8
  101. package/client/src/hooks/useParameterPanel.ts +2 -1
  102. package/client/src/hooks/useReactFlowNodes.ts +2 -1
  103. package/client/src/hooks/useSound.ts +185 -0
  104. package/client/src/hooks/useWorkflowManagement.ts +6 -8
  105. package/client/src/hooks/useWorkflowOpsListener.ts +90 -0
  106. package/client/src/index.css +65 -3
  107. package/client/src/lib/__tests__/connectionConfig.test.ts +91 -0
  108. package/client/src/lib/aiModelProviders.ts +8 -0
  109. package/client/src/lib/connectionConfig.ts +107 -0
  110. package/client/src/lib/queryPersist.ts +13 -5
  111. package/client/src/lib/sound.ts +393 -0
  112. package/client/src/main.tsx +20 -0
  113. package/client/src/store/useAppStore.ts +26 -0
  114. package/client/src/styles/canvasAnimations.ts +37 -36
  115. package/client/src/styles/theme.ts +36 -20
  116. package/client/src/test/setup.ts +1 -0
  117. package/client/src/themes/atomic.css +253 -0
  118. package/client/src/themes/base.css +373 -0
  119. package/client/src/themes/cyber.css +890 -0
  120. package/client/src/themes/dark.css +70 -0
  121. package/client/src/themes/edo.css +246 -0
  122. package/client/src/themes/greek.css +293 -0
  123. package/client/src/themes/light.css +78 -0
  124. package/client/src/themes/plague.css +253 -0
  125. package/client/src/themes/renaissance.css +727 -0
  126. package/client/src/themes/rot.css +249 -0
  127. package/client/src/themes/steampunk.css +272 -0
  128. package/client/src/themes/surveillance.css +289 -0
  129. package/client/src/themes/wasteland.css +250 -0
  130. package/client/src/types/INodeProperties.ts +5 -0
  131. package/client/src/types/NodeTypes.ts +11 -1
  132. package/client/src/types/__tests__/cloudEvents.test.ts +99 -0
  133. package/client/src/types/cloudEvents.ts +78 -0
  134. package/client/src/vite-env.d.ts +7 -0
  135. package/client/tsconfig.json +1 -1
  136. package/client/vite.config.js +62 -2
  137. package/install.ps1 +1 -1
  138. package/install.sh +1 -1
  139. package/machina/commands/build.py +51 -7
  140. package/machina/pyproject.toml +4 -0
  141. package/machina/supervisor.py +12 -2
  142. package/machina/tree.py +71 -21
  143. package/package.json +4 -4
  144. package/scripts/install.js +16 -1
  145. package/server/config/ai_cli_providers.json +54 -0
  146. package/server/config/credential_providers.json +109 -2
  147. package/server/config/llm_defaults.json +24 -0
  148. package/server/config/model_registry.json +338 -499
  149. package/server/config/node_allowlist.json +16 -1
  150. package/server/config/pricing.json +8 -0
  151. package/server/constants.py +38 -15
  152. package/server/core/container.py +2 -2
  153. package/server/core/credentials_database.py +35 -2
  154. package/server/core/logging.py +4 -3
  155. package/server/main.py +99 -13
  156. package/server/models/node_metadata.py +1 -0
  157. package/server/nodejs/package.json +8 -6
  158. package/server/nodejs/src/index.ts +22 -5
  159. package/server/nodes/README.md +31 -4
  160. package/server/nodes/agent/_inline.py +2 -0
  161. package/server/nodes/agent/_specialized.py +6 -3
  162. package/server/nodes/agent/ai_agent.py +13 -3
  163. package/server/nodes/agent/chat_agent.py +6 -3
  164. package/server/nodes/agent/claude_code_agent.py +287 -75
  165. package/server/nodes/agent/codex_agent.py +239 -0
  166. package/server/nodes/agent/deep_agent.py +3 -3
  167. package/server/nodes/agent/rlm_agent.py +3 -3
  168. package/server/nodes/android/__init__.py +31 -1
  169. package/server/nodes/android/_base.py +9 -5
  170. package/server/{services/android_service.py → nodes/android/_dispatcher.py} +2 -2
  171. package/server/nodes/android/_handlers.py +154 -0
  172. package/server/nodes/android/_option_loaders.py +44 -0
  173. package/server/nodes/android/_refresh.py +127 -0
  174. package/server/{services/android → nodes/android/_relay}/client.py +4 -4
  175. package/server/{routers/android.py → nodes/android/_router.py} +27 -8
  176. package/server/nodes/browser/browser.py +2 -2
  177. package/server/nodes/code/_base.py +6 -2
  178. package/server/nodes/code/_claude_code.py +134 -0
  179. package/server/nodes/document/embedding_generator.py +3 -3
  180. package/server/nodes/document/http_scraper.py +3 -3
  181. package/server/nodes/document/vector_store.py +5 -5
  182. package/server/nodes/email/__init__.py +11 -1
  183. package/server/nodes/email/_filters.py +21 -0
  184. package/server/{services/himalaya_service.py → nodes/email/_himalaya.py} +6 -10
  185. package/server/{services/email_service.py → nodes/email/_service.py} +9 -13
  186. package/server/nodes/email/email_read.py +1 -1
  187. package/server/nodes/email/email_receive.py +54 -5
  188. package/server/nodes/email/email_send.py +1 -1
  189. package/server/nodes/filesystem/shell.py +24 -1
  190. package/server/nodes/google/__init__.py +55 -1
  191. package/server/{services/handlers/google_auth.py → nodes/google/_auth_helper.py} +8 -5
  192. package/server/nodes/google/_base.py +2 -2
  193. package/server/nodes/google/_credentials.py +5 -5
  194. package/server/nodes/google/_filters.py +25 -0
  195. package/server/nodes/google/_handlers.py +57 -0
  196. package/server/{services/google_oauth.py → nodes/google/_oauth.py} +195 -162
  197. package/server/nodes/google/_option_loaders.py +107 -0
  198. package/server/nodes/google/_refresh.py +66 -0
  199. package/server/nodes/google/_router.py +131 -0
  200. package/server/nodes/google/gmail_receive.py +41 -4
  201. package/server/nodes/groups.py +1 -0
  202. package/server/nodes/location/_credentials.py +45 -1
  203. package/server/{services/maps.py → nodes/location/_service.py} +18 -3
  204. package/server/nodes/location/gmaps_create.py +4 -4
  205. package/server/nodes/location/gmaps_locations.py +4 -4
  206. package/server/nodes/location/gmaps_nearby_places.py +4 -4
  207. package/server/nodes/model/_base.py +8 -3
  208. package/server/nodes/model/_credentials.py +96 -8
  209. package/server/nodes/model/_local_validator.py +345 -0
  210. package/server/nodes/model/lmstudio_chat_model.py +23 -0
  211. package/server/nodes/model/ollama_chat_model.py +25 -0
  212. package/server/nodes/proxy/_usage.py +2 -2
  213. package/server/nodes/proxy/proxy_config.py +14 -14
  214. package/server/nodes/proxy/proxy_request.py +4 -4
  215. package/server/nodes/scraper/_credentials.py +29 -1
  216. package/server/nodes/scraper/apify_actor.py +9 -9
  217. package/server/nodes/scraper/crawlee_scraper.py +5 -5
  218. package/server/nodes/search/brave_search.py +4 -0
  219. package/server/nodes/search/perplexity_search.py +9 -0
  220. package/server/nodes/search/serper_search.py +3 -0
  221. package/server/nodes/skill/simple_memory.py +12 -0
  222. package/server/nodes/social/_base.py +2 -2
  223. package/server/nodes/stripe/__init__.py +46 -0
  224. package/server/nodes/stripe/_credentials.py +33 -0
  225. package/server/nodes/stripe/_handlers.py +270 -0
  226. package/server/nodes/stripe/_install.py +127 -0
  227. package/server/nodes/stripe/_source.py +174 -0
  228. package/server/nodes/stripe/stripe_action.py +81 -0
  229. package/server/nodes/stripe/stripe_receive.py +92 -0
  230. package/server/nodes/telegram/_credentials.py +52 -1
  231. package/server/nodes/telegram/_handlers.py +19 -18
  232. package/server/nodes/telegram/_service.py +134 -32
  233. package/server/nodes/telegram/telegram_send.py +5 -6
  234. package/server/nodes/text/file_handler.py +2 -2
  235. package/server/nodes/text/text_generator.py +2 -2
  236. package/server/nodes/tool/agent_builder.py +630 -0
  237. package/server/nodes/tool/task_manager.py +144 -2
  238. package/server/nodes/twitter/__init__.py +38 -1
  239. package/server/nodes/twitter/_base.py +7 -7
  240. package/server/nodes/twitter/_credentials.py +1 -1
  241. package/server/nodes/twitter/_filters.py +37 -0
  242. package/server/nodes/twitter/_handlers.py +77 -0
  243. package/server/nodes/twitter/_oauth.py +124 -0
  244. package/server/nodes/twitter/_refresh.py +78 -0
  245. package/server/nodes/twitter/_router.py +29 -0
  246. package/server/nodes/twitter/twitter_receive.py +4 -0
  247. package/server/nodes/visuals.json +64 -19
  248. package/server/nodes/whatsapp/__init__.py +45 -5
  249. package/server/nodes/whatsapp/_base.py +3 -3
  250. package/server/nodes/whatsapp/_filters.py +137 -0
  251. package/server/nodes/whatsapp/_handlers.py +167 -0
  252. package/server/nodes/whatsapp/_option_loaders.py +68 -0
  253. package/server/nodes/whatsapp/_refresh.py +62 -0
  254. package/server/nodes/whatsapp/_runtime.py +1 -1
  255. package/server/pyproject.toml +29 -7
  256. package/server/routers/schemas.py +2 -2
  257. package/server/routers/webhook.py +26 -9
  258. package/server/routers/websocket.py +149 -810
  259. package/server/services/ai.py +89 -8
  260. package/server/services/auth.py +220 -43
  261. package/server/services/claude_oauth.py +126 -100
  262. package/server/services/cli_agent/__init__.py +78 -0
  263. package/server/services/cli_agent/_handlers.py +237 -0
  264. package/server/services/cli_agent/config.py +112 -0
  265. package/server/services/cli_agent/factory.py +48 -0
  266. package/server/services/cli_agent/lockfile.py +141 -0
  267. package/server/services/cli_agent/mcp_server.py +482 -0
  268. package/server/services/cli_agent/protocol.py +173 -0
  269. package/server/services/cli_agent/providers/__init__.py +9 -0
  270. package/server/services/cli_agent/providers/anthropic_claude.py +419 -0
  271. package/server/services/cli_agent/providers/google_gemini.py +80 -0
  272. package/server/services/cli_agent/providers/openai_codex.py +310 -0
  273. package/server/services/cli_agent/service.py +607 -0
  274. package/server/services/cli_agent/session.py +618 -0
  275. package/server/services/cli_agent/types.py +227 -0
  276. package/server/services/cli_agent/workflow_tools.py +233 -0
  277. package/server/services/credential_registry.py +26 -1
  278. package/server/services/deployment/manager.py +26 -145
  279. package/server/services/deployment/poll_registry.py +59 -0
  280. package/server/services/event_waiter.py +76 -246
  281. package/server/services/events/__init__.py +54 -0
  282. package/server/services/events/cli.py +78 -0
  283. package/server/services/events/daemon.py +163 -0
  284. package/server/services/events/envelope.py +281 -0
  285. package/server/services/events/lifecycle.py +99 -0
  286. package/server/services/events/oauth_lifecycle.py +534 -0
  287. package/server/services/events/polling.py +60 -0
  288. package/server/services/events/push.py +36 -0
  289. package/server/services/events/source.py +63 -0
  290. package/server/services/events/triggers.py +118 -0
  291. package/server/services/events/verifiers/__init__.py +25 -0
  292. package/server/services/events/verifiers/base.py +28 -0
  293. package/server/services/events/verifiers/github.py +25 -0
  294. package/server/services/events/verifiers/hmac_basic.py +32 -0
  295. package/server/services/events/verifiers/standard_webhooks.py +47 -0
  296. package/server/services/events/verifiers/stripe.py +42 -0
  297. package/server/services/events/webhook.py +105 -0
  298. package/server/services/handlers/tools.py +28 -186
  299. package/server/services/llm/config.py +7 -0
  300. package/server/services/llm/factory.py +8 -2
  301. package/server/services/memory/__init__.py +52 -0
  302. package/server/services/memory/jsonl.py +80 -0
  303. package/server/services/memory/markdown.py +65 -0
  304. package/server/services/memory/state.py +112 -0
  305. package/server/services/memory/vector_store.py +40 -0
  306. package/server/services/model_registry.py +76 -0
  307. package/server/services/node_allowlist.py +71 -15
  308. package/server/services/node_executor.py +2 -2
  309. package/server/services/node_output_schemas.py +21 -10
  310. package/server/services/node_spec.py +1 -1
  311. package/server/services/oauth_utils.py +1 -1
  312. package/server/services/plugin/__init__.py +2 -0
  313. package/server/services/plugin/base.py +44 -2
  314. package/server/services/plugin/credential.py +288 -1
  315. package/server/services/plugin/deps.py +105 -0
  316. package/server/services/plugin/edge_walker.py +12 -4
  317. package/server/services/plugin/oauth.py +381 -0
  318. package/server/services/plugin/polling.py +247 -0
  319. package/server/services/plugin/registry.py +145 -0
  320. package/server/services/plugin/singleton.py +65 -0
  321. package/server/services/plugin/ws.py +81 -0
  322. package/server/services/process_service.py +31 -2
  323. package/server/services/status_broadcaster.py +155 -238
  324. package/server/services/temporal/workflow.py +7 -7
  325. package/server/services/workflow.py +21 -3
  326. package/server/services/ws_handler_registry.py +111 -28
  327. package/server/skills/GUIDE.md +16 -1
  328. package/server/skills/assistant/agent-builder-skill/SKILL.md +166 -0
  329. package/server/skills/payments_agent/stripe-skill/SKILL.md +306 -0
  330. package/server/tests/credentials/test_auth_service.py +16 -9
  331. package/server/tests/credentials/test_credential_broadcasts.py +219 -0
  332. package/server/tests/credentials/test_google_oauth.py +6 -6
  333. package/server/tests/credentials/test_oauth_utils.py +1 -1
  334. package/server/tests/credentials/test_twitter_oauth.py +2 -2
  335. package/server/tests/credentials/test_websocket_handlers.py +44 -20
  336. package/server/tests/llm/test_factory.py +1 -0
  337. package/server/tests/llm/test_wiring.py +5 -1
  338. package/server/tests/nodes/_compat.py +24 -24
  339. package/server/tests/nodes/test_agent_builder.py +439 -0
  340. package/server/tests/nodes/test_ai_tools.py +18 -14
  341. package/server/tests/nodes/test_code_fs_process.py +17 -8
  342. package/server/tests/nodes/test_email.py +10 -9
  343. package/server/tests/nodes/test_google_workspace.py +2 -2
  344. package/server/tests/nodes/test_specialized_agents.py +100 -53
  345. package/server/tests/nodes/test_stripe_plugin.py +293 -0
  346. package/server/tests/nodes/test_telegram_social.py +4 -4
  347. package/server/tests/nodes/test_twitter.py +1 -1
  348. package/server/tests/nodes/test_web_automation.py +2 -2
  349. package/server/tests/nodes/test_whatsapp.py +9 -9
  350. package/server/tests/services/cli_agent/__init__.py +0 -0
  351. package/server/tests/services/cli_agent/test_mcp_server.py +432 -0
  352. package/server/tests/services/cli_agent/test_providers.py +358 -0
  353. package/server/tests/services/cli_agent/test_service.py +298 -0
  354. package/server/tests/services/memory/__init__.py +0 -0
  355. package/server/tests/services/memory/test_jsonl.py +188 -0
  356. package/server/tests/services/test_events.py +333 -0
  357. package/server/tests/test_node_spec.py +56 -16
  358. package/server/tests/test_plugin_helpers.py +116 -0
  359. package/server/tests/test_plugin_self_containment.py +486 -0
  360. package/server/tests/test_status_broadcasts.py +425 -0
  361. package/workflows/{AI Assistant_workflow-1777421105154-0m4snkzjf.json → AI Assistant_workflow-1778504793388-ou1m1tz2x.json } +70 -266
  362. package/workflows/{AI Employee_workflow-1777720598005-u4cm858dv.json → AI Employee_example_workflow-1777720598005-u4cm858dv.json } +112 -112
  363. package/workflows/Claude Assistant_workflow-1778380124051-mdibn807c.json +709 -0
  364. package/client/dist/assets/ActionBar-vzPpSR77.js +0 -1
  365. package/client/dist/assets/ApiKeyInput-Ds7AKFe8.js +0 -1
  366. package/client/dist/assets/ApiKeyPanel-gfblELep.js +0 -1
  367. package/client/dist/assets/ApiUsageSection-BMNWTe2r.js +0 -1
  368. package/client/dist/assets/EmailPanel-B1Om64p5.js +0 -1
  369. package/client/dist/assets/OAuthPanel-CXyQYGBz.js +0 -1
  370. package/client/dist/assets/QrPairingPanel-BgNuI1we.js +0 -1
  371. package/client/dist/assets/RateLimitSection-YYK8sx1T.js +0 -1
  372. package/client/dist/assets/StatusCard-DuYA5hJR.js +0 -1
  373. package/client/dist/assets/index-D9tZfgvi.js +0 -363
  374. package/client/dist/assets/index-al7snTkG.css +0 -1
  375. package/client/src/components/credentials/providers.tsx +0 -177
  376. package/server/routers/google.py +0 -277
  377. package/server/routers/maps.py +0 -142
  378. package/server/routers/twitter.py +0 -365
  379. package/server/services/claude_code_service.py +0 -106
  380. package/server/services/memory.py +0 -159
  381. package/server/services/node_option_loaders/__init__.py +0 -77
  382. package/server/services/node_option_loaders/android_loaders.py +0 -55
  383. package/server/services/node_option_loaders/google_loaders.py +0 -97
  384. package/server/services/node_option_loaders/whatsapp_loaders.py +0 -69
  385. package/server/services/twitter_oauth.py +0 -411
  386. package/server/services/websocket_client.py +0 -29
  387. /package/server/{services/android → nodes/android/_relay}/__init__.py +0 -0
  388. /package/server/{services/android → nodes/android/_relay}/broadcaster.py +0 -0
  389. /package/server/{services/android → nodes/android/_relay}/manager.py +0 -0
  390. /package/server/{services/android → nodes/android/_relay}/protocol.py +0 -0
  391. /package/server/{services/browser_service.py → nodes/browser/_service.py} +0 -0
  392. /package/server/{services/whatsapp_service.py → nodes/whatsapp/_service.py} +0 -0
  393. /package/server/skills/{task_agent → assistant}/write-todos-skill/SKILL.md +0 -0
@@ -0,0 +1,404 @@
1
+ /**
2
+ * themedGlyphs — per-theme SVG glyph set ported from
3
+ * `design_handoff_machinaos_themes/app/icons.js`.
4
+ *
5
+ * Ten themes (renaissance, cyber, greek, edo, steampunk, atomic,
6
+ * wasteland, rot, plague, surveillance) declare their own glyph
7
+ * language for the same 29 conceptual keys (agent, trigger, tool,
8
+ * memory, output, send, file, folder, settings, credentials, run,
9
+ * save, stop, plus, close, search, chevron, check, warning, error,
10
+ * info, sidebar, upload, download, copy, moon, deploy, grid, shield).
11
+ *
12
+ * Each value is a complete `<svg>` string (the upstream `_wrap`
13
+ * function has been baked in per theme). The renaissance wrap adds
14
+ * a heraldic shield cartouche behind the inner glyph; the cyber
15
+ * wrap adds a `drop-shadow` filter for the neon glow; the rest use
16
+ * a plain 32x32 viewBox.
17
+ *
18
+ * `width="100%" height="100%"` lets the SVG fill the wrapper that
19
+ * `<NodeIcon>` puts around it, so Tailwind sizing classes on the
20
+ * wrapper (`h-6 w-6`, etc.) stay authoritative.
21
+ *
22
+ * Themes that omit a key (`Partial<Record<IconKey, string>>`) fall
23
+ * through to the existing `<NodeIcon>` dispatch (lucide / lobehub /
24
+ * asset / emoji).
25
+ *
26
+ * SECURITY: every value here is author-trusted markup committed to
27
+ * the repo, never user input. `<NodeIcon>` injects via
28
+ * `dangerouslySetInnerHTML`; that's safe for this constant set
29
+ * because nothing in this file is reachable from network or user
30
+ * state. Do NOT extend `THEMED_GLYPHS` with values built from
31
+ * runtime input.
32
+ */
33
+
34
+ import type { ThemeName } from '../../contexts/ThemeContext';
35
+
36
+ /** The 29 conceptual icon keys. Any of these may be passed as the
37
+ * `icon` prop to `<NodeIcon>` to opt into per-theme glyph dispatch. */
38
+ export type IconKey =
39
+ | 'agent' | 'trigger' | 'tool' | 'memory' | 'output' | 'send'
40
+ | 'file' | 'folder' | 'settings' | 'credentials'
41
+ | 'run' | 'save' | 'stop'
42
+ | 'plus' | 'close' | 'search' | 'chevron' | 'check'
43
+ | 'warning' | 'error' | 'info'
44
+ | 'sidebar' | 'upload' | 'download' | 'copy'
45
+ | 'moon' | 'deploy' | 'grid' | 'shield';
46
+
47
+ /** Set of all valid `IconKey` strings, exposed for fast `.has()`
48
+ * membership checks at the resolver call site. */
49
+ export const ICON_KEYS: ReadonlySet<IconKey> = new Set<IconKey>([
50
+ 'agent', 'trigger', 'tool', 'memory', 'output', 'send',
51
+ 'file', 'folder', 'settings', 'credentials',
52
+ 'run', 'save', 'stop',
53
+ 'plus', 'close', 'search', 'chevron', 'check',
54
+ 'warning', 'error', 'info',
55
+ 'sidebar', 'upload', 'download', 'copy',
56
+ 'moon', 'deploy', 'grid', 'shield',
57
+ ]);
58
+
59
+ /** Outer wrappers, baked into each entry below. Kept here as a
60
+ * reference for future theme additions:
61
+ * - renaissance: viewBox + heraldic shield cartouche behind the glyph.
62
+ * - cyber: viewBox + `drop-shadow(currentColor)` filter (neon glow).
63
+ * - all others: plain `viewBox="0 0 32 32" fill="none"`.
64
+ */
65
+
66
+ const SVG_OPEN = '<svg viewBox="0 0 32 32" fill="none" width="100%" height="100%" xmlns="http://www.w3.org/2000/svg">';
67
+ const SVG_OPEN_CYBER = '<svg viewBox="0 0 32 32" fill="none" width="100%" height="100%" xmlns="http://www.w3.org/2000/svg" style="filter:drop-shadow(0 0 3px currentColor)">';
68
+ const RENAISSANCE_CARTOUCHE = '<path d="M4 4 H28 V22 Q28 28, 16 30 Q4 28, 4 22 Z" fill="#fbf3dc" stroke="#5a3a14" stroke-width="1.5"/><path d="M5 5 H27 V22 Q27 27, 16 29 Q5 27, 5 22 Z" fill="none" stroke="#d4a030" stroke-width="0.8"/>';
69
+
70
+ const wrap = (inner: string): string => `${SVG_OPEN}${inner}</svg>`;
71
+ const wrapCyber = (inner: string): string => `${SVG_OPEN_CYBER}${inner}</svg>`;
72
+ const wrapRenaissance = (inner: string): string => `${SVG_OPEN}${RENAISSANCE_CARTOUCHE}${inner}</svg>`;
73
+
74
+ export const THEMED_GLYPHS: Partial<Record<ThemeName, Partial<Record<IconKey, string>>>> = {
75
+ // ─────────── Renaissance — illuminated heraldic ───────────
76
+ renaissance: {
77
+ agent: wrapRenaissance(`<g stroke="#5a3a14" stroke-width="1.4" fill="#d4a030" stroke-linejoin="round"><circle cx="16" cy="13" r="4"/><path d="M9 22 Q16 17, 23 22 L23 25 Q16 27, 9 25 Z"/><path d="M14 12 L13 9 M18 12 L19 9" stroke-width="1"/></g>`),
78
+ trigger: wrapRenaissance(`<g stroke="#5a3a14" stroke-width="1.4" fill="#d4a030"><path d="M16 8 L12 18 L16 18 L14 24 L20 14 L16 14 Z"/></g>`),
79
+ tool: wrapRenaissance(`<g stroke="#5a3a14" stroke-width="1.4" fill="#d4a030"><path d="M10 22 L18 14 M22 12 L24 14 M22 12 L20 10 M22 12 Q26 8, 20 8 L18 10 Z"/><circle cx="11" cy="22" r="1.5" fill="#5a3a14"/></g>`),
80
+ memory: wrapRenaissance(`<g stroke="#5a3a14" stroke-width="1.4" fill="#fbf3dc"><rect x="9" y="10" width="14" height="14"/><path d="M9 14 L23 14 M9 18 L23 18 M13 10 L13 24 M19 10 L19 24" stroke-width="0.8"/></g>`),
81
+ output: wrapRenaissance(`<g stroke="#5a3a14" stroke-width="1.4" fill="#d4a030"><path d="M9 16 L21 16 M17 12 L21 16 L17 20"/></g>`),
82
+ send: wrapRenaissance(`<g stroke="#5a3a14" stroke-width="1.4" fill="#d4a030"><path d="M9 22 L24 14 L11 13 L13 17 L9 22 Z"/></g>`),
83
+ file: wrapRenaissance(`<g stroke="#5a3a14" stroke-width="1.4" fill="#fbf3dc"><path d="M11 9 L19 9 L23 13 L23 24 L11 24 Z"/><path d="M19 9 L19 13 L23 13" fill="#d4a030"/></g>`),
84
+ folder: wrapRenaissance(`<g stroke="#5a3a14" stroke-width="1.4" fill="#d4a030"><path d="M9 12 L13 12 L15 14 L23 14 L23 23 L9 23 Z"/></g>`),
85
+ settings: wrapRenaissance(`<g stroke="#5a3a14" stroke-width="1.4" fill="#d4a030"><circle cx="16" cy="16" r="3"/><path d="M16 9 L16 12 M16 20 L16 23 M9 16 L12 16 M20 16 L23 16 M11 11 L13 13 M19 19 L21 21 M11 21 L13 19 M19 13 L21 11"/></g>`),
86
+ credentials: wrapRenaissance(`<g stroke="#5a3a14" stroke-width="1.4" fill="#d4a030"><circle cx="14" cy="16" r="4"/><path d="M18 16 L24 16 L24 18 M22 16 L22 19"/></g>`),
87
+ run: wrapRenaissance(`<g stroke="#2a5a18" stroke-width="1.4" fill="#4a8230"><path d="M12 10 L22 16 L12 22 Z"/></g>`),
88
+ save: wrapRenaissance(`<g stroke="#5a0a08" stroke-width="1.2" fill="#8a1410"><circle cx="16" cy="16" r="6"/><path d="M14 14 L18 18 M18 14 L14 18" stroke="#fbf3dc" stroke-width="1"/></g>`),
89
+ stop: wrapRenaissance(`<g stroke="#5a1a08" stroke-width="1.4" fill="#8a3a14"><rect x="11" y="11" width="10" height="10"/></g>`),
90
+ plus: wrapRenaissance(`<g stroke="#5a3a14" stroke-width="2"><path d="M16 10 L16 22 M10 16 L22 16"/></g>`),
91
+ close: wrapRenaissance(`<g stroke="#5a3a14" stroke-width="2"><path d="M11 11 L21 21 M21 11 L11 21"/></g>`),
92
+ search: wrapRenaissance(`<g stroke="#5a3a14" stroke-width="1.4" fill="none"><circle cx="14" cy="14" r="4"/><path d="M17 17 L22 22"/></g>`),
93
+ chevron: wrapRenaissance(`<g stroke="#5a3a14" stroke-width="1.6" fill="none"><path d="M13 12 L19 16 L13 20"/></g>`),
94
+ check: wrapRenaissance(`<g stroke="#2a5a18" stroke-width="2" fill="none"><path d="M10 16 L14 20 L22 12"/></g>`),
95
+ warning: wrapRenaissance(`<g stroke="#5a3a14" stroke-width="1.4" fill="#d4a030"><path d="M16 9 L24 22 L8 22 Z"/><path d="M16 14 L16 18 M16 20 L16 20.5" stroke="#5a0a08" stroke-width="1.6"/></g>`),
96
+ error: wrapRenaissance(`<g stroke="#5a0a08" stroke-width="1.4" fill="#8a1410"><circle cx="16" cy="16" r="6"/><path d="M13 13 L19 19 M19 13 L13 19" stroke="#fbf3dc" stroke-width="1.4"/></g>`),
97
+ info: wrapRenaissance(`<g stroke="#1a3a5a" stroke-width="1.4" fill="#fbf3dc"><circle cx="16" cy="16" r="6"/><path d="M16 14 L16 19 M16 12 L16 12.5" stroke="#1a3a5a" stroke-width="1.6"/></g>`),
98
+ sidebar: wrapRenaissance(`<g stroke="#5a3a14" stroke-width="1.4" fill="#fbf3dc"><rect x="7" y="8" width="18" height="16"/><path d="M13 8 L13 24" stroke-width="1.4"/><rect x="8" y="9" width="4" height="14" fill="#d4a030" stroke="none"/></g>`),
99
+ upload: wrapRenaissance(`<g stroke="#5a3a14" stroke-width="1.4" fill="#d4a030"><path d="M16 22 L16 10 M11 15 L16 10 L21 15"/><path d="M9 22 L23 22"/></g>`),
100
+ download: wrapRenaissance(`<g stroke="#5a3a14" stroke-width="1.4" fill="#d4a030"><path d="M16 10 L16 22 M11 17 L16 22 L21 17"/><path d="M9 10 L23 10"/></g>`),
101
+ copy: wrapRenaissance(`<g stroke="#5a3a14" stroke-width="1.4" fill="#fbf3dc"><rect x="11" y="11" width="11" height="13"/><path d="M14 11 L14 8 L25 8 L25 21 L22 21" fill="#d4a030"/></g>`),
102
+ moon: wrapRenaissance(`<g stroke="#5a3a14" stroke-width="1.4" fill="#d4a030"><path d="M22 18 Q22 23, 17 23 Q11 23, 11 16 Q11 10, 17 10 Q14 13, 14 16 Q14 20, 18 20 Q21 20, 22 18 Z"/><circle cx="22" cy="11" r="0.8" fill="#5a3a14"/><circle cx="24" cy="14" r="0.6" fill="#5a3a14"/></g>`),
103
+ deploy: wrapRenaissance(`<g stroke="#2a5a18" stroke-width="1.4" fill="#4a8230"><path d="M16 8 L20 14 L20 20 L18 22 L18 25 L14 25 L14 22 L12 20 L12 14 Z"/><circle cx="16" cy="14" r="1.5" fill="#fbf3dc" stroke="none"/><path d="M12 22 L8 26 M20 22 L24 26" stroke-width="1"/></g>`),
104
+ grid: wrapRenaissance(`<g stroke="#5a3a14" stroke-width="1.4" fill="#d4a030"><rect x="9" y="9" width="6" height="6"/><rect x="17" y="9" width="6" height="6"/><rect x="9" y="17" width="6" height="6"/><rect x="17" y="17" width="6" height="6"/></g>`),
105
+ shield: wrapRenaissance(`<g stroke="#5a3a14" stroke-width="1.4" fill="#d4a030"><path d="M16 8 L23 11 L23 17 Q23 22, 16 25 Q9 22, 9 17 L9 11 Z"/><path d="M13 16 L15 18 L19 14" stroke="#5a0a08" stroke-width="1.6" fill="none"/></g>`),
106
+ },
107
+
108
+ // ─────────── Cyber — wireframe / glitch ───────────
109
+ cyber: {
110
+ agent: wrapCyber(`<g stroke="currentColor" stroke-width="1.2" fill="none"><rect x="9" y="6" width="14" height="20"/><rect x="12" y="11" width="2" height="2" fill="currentColor"/><rect x="18" y="11" width="2" height="2" fill="currentColor"/><path d="M12 18 L20 18 M14 22 L18 22"/><path d="M16 6 L16 4 M16 26 L16 28" stroke-dasharray="1 1"/></g>`),
111
+ trigger: wrapCyber(`<g stroke="currentColor" stroke-width="1.2" fill="none"><path d="M16 4 L11 16 L16 16 L13 28 L21 14 L16 14 Z" fill="currentColor" fill-opacity="0.3"/></g>`),
112
+ tool: wrapCyber(`<g stroke="currentColor" stroke-width="1.2" fill="none"><rect x="6" y="14" width="20" height="4"/><path d="M10 14 L10 12 L14 12 L14 14 M18 18 L18 20 L22 20 L22 18"/></g>`),
113
+ memory: wrapCyber(`<g stroke="currentColor" stroke-width="1.2" fill="none"><rect x="7" y="9" width="18" height="14"/><path d="M7 13 L25 13 M7 17 L25 17 M7 21 L25 21 M11 9 L11 23 M16 9 L16 23 M21 9 L21 23"/></g>`),
114
+ output: wrapCyber(`<g stroke="currentColor" stroke-width="1.4" fill="none"><path d="M6 16 L24 16 M18 10 L24 16 L18 22"/></g>`),
115
+ send: wrapCyber(`<g stroke="currentColor" stroke-width="1.2" fill="none"><path d="M5 16 L27 6 L20 27 L17 18 L8 16 Z" fill="currentColor" fill-opacity="0.2"/></g>`),
116
+ file: wrapCyber(`<g stroke="currentColor" stroke-width="1.2" fill="none"><path d="M9 4 L19 4 L24 9 L24 28 L9 28 Z"/><path d="M19 4 L19 9 L24 9"/><path d="M12 14 L21 14 M12 18 L21 18 M12 22 L17 22"/></g>`),
117
+ folder: wrapCyber(`<g stroke="currentColor" stroke-width="1.2" fill="none"><path d="M5 10 L13 10 L15 12 L27 12 L27 24 L5 24 Z"/></g>`),
118
+ settings: wrapCyber(`<g stroke="currentColor" stroke-width="1.2" fill="none"><circle cx="16" cy="16" r="3"/><circle cx="16" cy="16" r="8"/><path d="M16 4 L16 8 M16 24 L16 28 M4 16 L8 16 M24 16 L28 16"/></g>`),
119
+ credentials: wrapCyber(`<g stroke="currentColor" stroke-width="1.2" fill="none"><circle cx="12" cy="16" r="4"/><path d="M16 16 L28 16 L28 19 M24 16 L24 20 M20 16 L20 18"/></g>`),
120
+ run: wrapCyber(`<g stroke="currentColor" stroke-width="1.4" fill="currentColor" fill-opacity="0.4"><path d="M10 6 L26 16 L10 26 Z"/></g>`),
121
+ save: wrapCyber(`<g stroke="currentColor" stroke-width="1.2" fill="none"><rect x="6" y="6" width="20" height="20"/><rect x="10" y="6" width="12" height="6" fill="currentColor" fill-opacity="0.3"/><rect x="11" y="18" width="10" height="8"/></g>`),
122
+ stop: wrapCyber(`<g stroke="currentColor" stroke-width="1.4" fill="currentColor" fill-opacity="0.4"><rect x="9" y="9" width="14" height="14"/></g>`),
123
+ plus: wrapCyber(`<g stroke="currentColor" stroke-width="1.6"><path d="M16 6 L16 26 M6 16 L26 16"/></g>`),
124
+ close: wrapCyber(`<g stroke="currentColor" stroke-width="1.6"><path d="M7 7 L25 25 M25 7 L7 25"/></g>`),
125
+ search: wrapCyber(`<g stroke="currentColor" stroke-width="1.4" fill="none"><circle cx="14" cy="14" r="6"/><path d="M19 19 L26 26"/></g>`),
126
+ chevron: wrapCyber(`<g stroke="currentColor" stroke-width="1.6" fill="none"><path d="M11 8 L21 16 L11 24"/></g>`),
127
+ check: wrapCyber(`<g stroke="currentColor" stroke-width="1.8" fill="none"><path d="M6 16 L13 23 L26 8"/></g>`),
128
+ warning: wrapCyber(`<g stroke="currentColor" stroke-width="1.4" fill="none"><path d="M16 4 L28 26 L4 26 Z"/><path d="M16 12 L16 20 M16 23 L16 24" stroke-width="1.8"/></g>`),
129
+ error: wrapCyber(`<g stroke="currentColor" stroke-width="1.4" fill="none"><circle cx="16" cy="16" r="10"/><path d="M11 11 L21 21 M21 11 L11 21" stroke-width="1.8"/></g>`),
130
+ info: wrapCyber(`<g stroke="currentColor" stroke-width="1.4" fill="none"><circle cx="16" cy="16" r="10"/><path d="M16 14 L16 22 M16 10 L16 11" stroke-width="1.8"/></g>`),
131
+ sidebar: wrapCyber(`<g stroke="currentColor" stroke-width="1.2" fill="none"><rect x="5" y="6" width="22" height="20"/><path d="M12 6 L12 26"/><rect x="6" y="7" width="5" height="18" fill="currentColor" fill-opacity="0.25"/></g>`),
132
+ upload: wrapCyber(`<g stroke="currentColor" stroke-width="1.4" fill="none"><path d="M16 24 L16 8 M9 15 L16 8 L23 15"/><path d="M6 26 L26 26"/></g>`),
133
+ download: wrapCyber(`<g stroke="currentColor" stroke-width="1.4" fill="none"><path d="M16 8 L16 24 M9 17 L16 24 L23 17"/><path d="M6 6 L26 6"/></g>`),
134
+ copy: wrapCyber(`<g stroke="currentColor" stroke-width="1.2" fill="none"><rect x="8" y="8" width="13" height="16"/><path d="M12 4 L25 4 L25 20 L21 20"/></g>`),
135
+ moon: wrapCyber(`<g stroke="currentColor" stroke-width="1.2" fill="none"><path d="M24 18 Q24 25, 16 25 Q8 25, 8 16 Q8 8, 16 8 Q12 12, 12 16 Q12 22, 18 22 Q22 22, 24 18 Z"/></g>`),
136
+ deploy: wrapCyber(`<g stroke="currentColor" stroke-width="1.2" fill="none"><path d="M16 4 L22 12 L22 22 L18 26 L14 26 L10 22 L10 12 Z"/><circle cx="16" cy="13" r="2.5" fill="currentColor" fill-opacity="0.4"/><path d="M10 22 L4 28 M22 22 L28 28" stroke-dasharray="2 1"/></g>`),
137
+ grid: wrapCyber(`<g stroke="currentColor" stroke-width="1.2" fill="none"><rect x="6" y="6" width="8" height="8"/><rect x="18" y="6" width="8" height="8"/><rect x="6" y="18" width="8" height="8"/><rect x="18" y="18" width="8" height="8"/></g>`),
138
+ shield: wrapCyber(`<g stroke="currentColor" stroke-width="1.2" fill="none"><path d="M16 4 L26 8 L26 16 Q26 23, 16 28 Q6 23, 6 16 L6 8 Z"/><path d="M11 16 L14 19 L21 12" stroke-width="1.6"/></g>`),
139
+ },
140
+
141
+ // ─────────── Greek — engraved on marble, lapis-blue glyphs ───────────
142
+ greek: {
143
+ agent: wrap(`<g stroke="#284b82" stroke-width="1.4" fill="#284b82"><circle cx="16" cy="11" r="3.5" fill="none"/><path d="M9 23 Q9 17, 16 17 Q23 17, 23 23 Z" fill="none"/><path d="M14 9 L13 7 L19 7 L18 9" stroke-width="1"/></g>`),
144
+ trigger: wrap(`<g stroke="#284b82" stroke-width="1.4" fill="#c8a040"><path d="M16 5 L8 17 L14 17 L12 27 L24 13 L18 13 L20 5 Z"/></g>`),
145
+ tool: wrap(`<g stroke="#284b82" stroke-width="1.4" fill="none"><path d="M6 22 L18 10 M22 6 L26 10 M24 8 Q28 4, 22 4 L18 8 Z" fill="#c8a040"/><circle cx="7" cy="22" r="1.5" fill="#284b82"/></g>`),
146
+ memory: wrap(`<g stroke="#284b82" stroke-width="1.4" fill="none"><rect x="6" y="8" width="20" height="16"/><path d="M6 13 L26 13 M6 18 L26 18 M11 8 L11 24 M21 8 L21 24"/></g>`),
147
+ output: wrap(`<g stroke="#284b82" stroke-width="1.6" fill="none"><path d="M6 16 L24 16 L20 12 M24 16 L20 20"/></g>`),
148
+ send: wrap(`<g stroke="#284b82" stroke-width="1.4" fill="#c8a040"><path d="M5 27 L27 5 L19 13 L13 11 L11 19 L5 27 Z"/></g>`),
149
+ file: wrap(`<g stroke="#284b82" stroke-width="1.4" fill="#faf6e9"><path d="M9 5 L19 5 L23 9 L23 27 L9 27 Z"/><path d="M19 5 L19 9 L23 9" fill="#c8a040"/><path d="M12 14 L20 14 M12 18 L20 18 M12 22 L17 22"/></g>`),
150
+ folder: wrap(`<g stroke="#284b82" stroke-width="1.4" fill="#c8a040"><path d="M5 10 L13 10 L15 12 L27 12 L27 24 L5 24 Z"/><path d="M5 14 L27 14"/></g>`),
151
+ settings: wrap(`<g stroke="#284b82" stroke-width="1.4" fill="none"><circle cx="16" cy="16" r="3"/><circle cx="16" cy="16" r="8"/><path d="M16 4 L16 8 M16 24 L16 28 M4 16 L8 16 M24 16 L28 16 M8 8 L11 11 M21 21 L24 24 M8 24 L11 21 M21 11 L24 8"/></g>`),
152
+ credentials: wrap(`<g stroke="#284b82" stroke-width="1.4" fill="#c8a040"><circle cx="12" cy="16" r="4" fill="none"/><path d="M16 16 L28 16 L28 19 M24 16 L24 20 M20 16 L20 18"/></g>`),
153
+ run: wrap(`<g stroke="#6a7a32" stroke-width="1.4" fill="#6a7a32"><path d="M9 7 L25 16 L9 25 Z"/></g>`),
154
+ save: wrap(`<g stroke="#7a1a18" stroke-width="1.4" fill="#7a1a18"><path d="M16 5 L19 13 L27 13 L21 18 L23 26 L16 22 L9 26 L11 18 L5 13 L13 13 Z"/></g>`),
155
+ stop: wrap(`<g stroke="#7a1a18" stroke-width="1.4" fill="#7a1a18"><rect x="8" y="8" width="16" height="16"/></g>`),
156
+ plus: wrap(`<g stroke="#284b82" stroke-width="2.4"><path d="M16 6 L16 26 M6 16 L26 16"/></g>`),
157
+ close: wrap(`<g stroke="#284b82" stroke-width="2.4"><path d="M7 7 L25 25 M25 7 L7 25"/></g>`),
158
+ search: wrap(`<g stroke="#284b82" stroke-width="1.6" fill="none"><circle cx="13" cy="13" r="6"/><path d="M18 18 L26 26"/></g>`),
159
+ chevron: wrap(`<g stroke="#284b82" stroke-width="2" fill="none"><path d="M11 8 L21 16 L11 24"/></g>`),
160
+ check: wrap(`<g stroke="#6a7a32" stroke-width="2.4" fill="none"><path d="M6 16 L13 23 L26 8"/></g>`),
161
+ warning: wrap(`<g stroke="#284b82" stroke-width="1.4" fill="#c8a040"><path d="M16 5 L28 26 L4 26 Z"/><path d="M16 13 L16 20 M16 23 L16 23.5" stroke="#7a1a18" stroke-width="2"/></g>`),
162
+ error: wrap(`<g stroke="#7a1a18" stroke-width="1.4" fill="#7a1a18"><circle cx="16" cy="16" r="9"/><path d="M11 11 L21 21 M21 11 L11 21" stroke="#faf6e9" stroke-width="2"/></g>`),
163
+ info: wrap(`<g stroke="#284b82" stroke-width="1.4" fill="#284b82"><circle cx="16" cy="16" r="9"/><path d="M16 14 L16 22 M16 10 L16 11" stroke="#faf6e9" stroke-width="2"/></g>`),
164
+ sidebar: wrap(`<g stroke="#284b82" stroke-width="1.4" fill="#faf6e9"><rect x="5" y="6" width="22" height="20"/><path d="M12 6 L12 26"/><rect x="6" y="7" width="5" height="18" fill="#c8a040" stroke="none"/></g>`),
165
+ upload: wrap(`<g stroke="#284b82" stroke-width="1.6" fill="none"><path d="M16 24 L16 8 M9 15 L16 8 L23 15"/><path d="M6 27 L26 27"/></g>`),
166
+ download: wrap(`<g stroke="#284b82" stroke-width="1.6" fill="none"><path d="M16 8 L16 24 M9 17 L16 24 L23 17"/><path d="M6 5 L26 5"/></g>`),
167
+ copy: wrap(`<g stroke="#284b82" stroke-width="1.4" fill="#faf6e9"><rect x="8" y="8" width="13" height="16"/><path d="M12 4 L25 4 L25 20 L21 20" fill="#c8a040"/></g>`),
168
+ moon: wrap(`<g stroke="#284b82" stroke-width="1.4" fill="#c8a040"><path d="M24 18 Q24 25, 16 25 Q8 25, 8 16 Q8 8, 16 8 Q12 12, 12 16 Q12 22, 18 22 Q22 22, 24 18 Z"/></g>`),
169
+ deploy: wrap(`<g stroke="#284b82" stroke-width="1.4" fill="#c8a040"><path d="M16 4 L23 9 L23 18 L19 24 L13 24 L9 18 L9 9 Z"/><circle cx="16" cy="13" r="2.5" fill="#284b82" stroke="none"/></g>`),
170
+ grid: wrap(`<g stroke="#284b82" stroke-width="1.4" fill="#c8a040"><rect x="6" y="6" width="8" height="8"/><rect x="18" y="6" width="8" height="8"/><rect x="6" y="18" width="8" height="8"/><rect x="18" y="18" width="8" height="8"/></g>`),
171
+ shield: wrap(`<g stroke="#284b82" stroke-width="1.4" fill="#c8a040"><path d="M16 4 L26 8 L26 16 Q26 23, 16 28 Q6 23, 6 16 L6 8 Z"/><path d="M11 16 L14 19 L21 12" stroke="#7a1a18" stroke-width="1.8" fill="none"/></g>`),
172
+ },
173
+
174
+ // ─────────── Edo — single ink-brush stroke, vermillion seal ───────────
175
+ edo: {
176
+ agent: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="none" stroke-linecap="round"><circle cx="16" cy="11" r="3.5"/><path d="M9 24 Q9 18, 16 18 Q23 18, 23 24"/></g>`),
177
+ trigger: wrap(`<g stroke="#1a1410" stroke-width="2" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M17 4 L10 17 L15 17 L13 28 L22 14 L17 14 Z" fill="#b41e1e" fill-opacity="0.15"/></g>`),
178
+ tool: wrap(`<g stroke="#1a1410" stroke-width="1.8" fill="none" stroke-linecap="round"><path d="M6 24 L20 10 M22 8 L24 10 M22 8 Q26 4, 22 4 L20 6"/></g>`),
179
+ memory: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="none"><rect x="6" y="9" width="20" height="14"/><path d="M6 13 L26 13 M6 18 L26 18 M13 9 L13 23 M19 9 L19 23"/></g>`),
180
+ output: wrap(`<g stroke="#1a1410" stroke-width="1.8" fill="none" stroke-linecap="round"><path d="M5 16 L25 16 L20 11 M25 16 L20 21"/></g>`),
181
+ send: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="#b41e1e" stroke-linejoin="round"><path d="M5 27 L27 5 L17 13 L13 11 L13 17 L5 27 Z"/></g>`),
182
+ file: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="none"><path d="M9 5 L19 5 L24 10 L24 27 L9 27 Z"/><path d="M19 5 L19 10 L24 10"/></g>`),
183
+ folder: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="none"><path d="M5 11 L13 11 L15 13 L27 13 L27 24 L5 24 Z"/></g>`),
184
+ settings: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="none"><circle cx="16" cy="16" r="3"/><path d="M16 5 L16 9 M16 23 L16 27 M5 16 L9 16 M23 16 L27 16 M8 8 L11 11 M21 21 L24 24 M8 24 L11 21 M21 11 L24 8"/></g>`),
185
+ credentials: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="none"><circle cx="12" cy="16" r="4"/><path d="M16 16 L27 16 L27 19 M24 16 L24 20 M20 16 L20 18"/></g>`),
186
+ run: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="#4a6a3a" stroke-linejoin="round"><path d="M10 6 L26 16 L10 26 Z"/></g>`),
187
+ save: wrap(`<g fill="#b41e1e"><rect x="9" y="9" width="14" height="14" transform="rotate(6 16 16)"/></g>`),
188
+ stop: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="#1a1410"><rect x="9" y="9" width="14" height="14"/></g>`),
189
+ plus: wrap(`<g stroke="#1a1410" stroke-width="2" stroke-linecap="round"><path d="M16 7 L16 25 M7 16 L25 16"/></g>`),
190
+ close: wrap(`<g stroke="#1a1410" stroke-width="2" stroke-linecap="round"><path d="M8 8 L24 24 M24 8 L8 24"/></g>`),
191
+ search: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="none" stroke-linecap="round"><circle cx="13" cy="13" r="6"/><path d="M18 18 L25 25"/></g>`),
192
+ chevron: wrap(`<g stroke="#1a1410" stroke-width="2" fill="none" stroke-linecap="round"><path d="M11 9 L20 16 L11 23"/></g>`),
193
+ check: wrap(`<g stroke="#4a6a3a" stroke-width="2.4" fill="none" stroke-linecap="round"><path d="M6 16 L13 23 L26 8"/></g>`),
194
+ warning: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="#c89832" stroke-linejoin="round"><path d="M16 5 L27 25 L5 25 Z"/><path d="M16 13 L16 20 M16 22.5 L16 23" stroke="#1a1410" stroke-width="2"/></g>`),
195
+ error: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="#b41e1e"><circle cx="16" cy="16" r="9"/><path d="M11 11 L21 21 M21 11 L11 21" stroke="#fdf8ea" stroke-width="2"/></g>`),
196
+ info: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="none"><circle cx="16" cy="16" r="9"/><path d="M16 14 L16 22 M16 10 L16 11" stroke-width="2"/></g>`),
197
+ sidebar: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="none"><rect x="5" y="6" width="22" height="20"/><path d="M12 6 L12 26"/></g>`),
198
+ upload: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="none" stroke-linecap="round"><path d="M16 24 L16 8 M9 15 L16 8 L23 15"/></g>`),
199
+ download: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="none" stroke-linecap="round"><path d="M16 8 L16 24 M9 17 L16 24 L23 17"/></g>`),
200
+ copy: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="none"><rect x="8" y="8" width="13" height="16"/><path d="M12 4 L25 4 L25 20 L21 20"/></g>`),
201
+ moon: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="none" stroke-linecap="round"><path d="M24 18 Q24 25, 16 25 Q8 25, 8 16 Q8 8, 16 8 Q12 12, 12 16 Q12 22, 18 22 Q22 22, 24 18 Z"/></g>`),
202
+ deploy: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="none"><path d="M16 5 L22 11 L22 22 L18 26 L14 26 L10 22 L10 11 Z"/><circle cx="16" cy="13" r="2"/></g>`),
203
+ grid: wrap(`<g stroke="#1a1410" stroke-width="1.4" fill="none"><rect x="6" y="6" width="8" height="8"/><rect x="18" y="6" width="8" height="8"/><rect x="6" y="18" width="8" height="8"/><rect x="18" y="18" width="8" height="8"/></g>`),
204
+ shield: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="none"><path d="M16 4 L26 8 L26 16 Q26 23, 16 28 Q6 23, 6 16 L6 8 Z"/></g>`),
205
+ },
206
+
207
+ // ─────────── Steampunk — riveted brass plates with bolts ───────────
208
+ steampunk: {
209
+ agent: wrap(`<g stroke="#4a2818" stroke-width="1.3" fill="#d8a848"><circle cx="16" cy="11" r="3.5"/><path d="M9 24 Q9 18, 16 18 Q23 18, 23 24 Z"/><circle cx="16" cy="11" r="1" fill="#4a2818"/></g>`),
210
+ trigger: wrap(`<g stroke="#4a2818" stroke-width="1.3" fill="#d8a848"><circle cx="16" cy="16" r="9"/><path d="M16 8 L16 16 L20 19" stroke-width="1.6"/><circle cx="16" cy="16" r="1.5" fill="#4a2818"/></g>`),
211
+ tool: wrap(`<g stroke="#4a2818" stroke-width="1.3" fill="#d8a848"><circle cx="16" cy="16" r="6"/><path d="M16 8 L16 12 M16 20 L16 24 M8 16 L12 16 M20 16 L24 16 M11 11 L13 13 M19 19 L21 21 M11 21 L13 19 M19 13 L21 11"/><circle cx="16" cy="16" r="2" fill="#b8602a"/></g>`),
212
+ memory: wrap(`<g stroke="#4a2818" stroke-width="1.3" fill="#b8602a"><rect x="6" y="9" width="20" height="14"/><path d="M6 14 L26 14 M6 19 L26 19" stroke="#d8a848"/><circle cx="9" cy="11" r="0.8" fill="#4a2818"/><circle cx="23" cy="11" r="0.8" fill="#4a2818"/><circle cx="9" cy="21" r="0.8" fill="#4a2818"/><circle cx="23" cy="21" r="0.8" fill="#4a2818"/></g>`),
213
+ output: wrap(`<g stroke="#4a2818" stroke-width="1.6" fill="#d8a848"><path d="M5 16 L23 16 L19 12 L19 20 Z"/></g>`),
214
+ send: wrap(`<g stroke="#4a2818" stroke-width="1.3" fill="#d8a848"><path d="M5 27 L27 5 L19 13 L13 11 L13 19 L5 27 Z"/></g>`),
215
+ file: wrap(`<g stroke="#4a2818" stroke-width="1.3" fill="#d8a848"><path d="M9 5 L19 5 L24 10 L24 27 L9 27 Z"/><circle cx="11" cy="7" r="0.8" fill="#4a2818"/><circle cx="22" cy="25" r="0.8" fill="#4a2818"/></g>`),
216
+ folder: wrap(`<g stroke="#4a2818" stroke-width="1.3" fill="#b8602a"><path d="M5 11 L13 11 L15 13 L27 13 L27 24 L5 24 Z"/><circle cx="7" cy="22" r="0.8" fill="#4a2818"/><circle cx="25" cy="22" r="0.8" fill="#4a2818"/></g>`),
217
+ settings: wrap(`<g stroke="#4a2818" stroke-width="1.3" fill="#d8a848"><path d="M16 4 L18 8 L22 6 L22 11 L26 13 L24 16 L26 19 L22 21 L22 26 L18 24 L16 28 L14 24 L10 26 L10 21 L6 19 L8 16 L6 13 L10 11 L10 6 L14 8 Z"/><circle cx="16" cy="16" r="3" fill="#b8602a"/></g>`),
218
+ credentials: wrap(`<g stroke="#4a2818" stroke-width="1.3" fill="#d8a848"><circle cx="12" cy="16" r="4"/><circle cx="12" cy="16" r="1.5" fill="#4a2818"/><path d="M16 16 L27 16 L27 20 M23 16 L23 20 M19 16 L19 18"/></g>`),
219
+ run: wrap(`<g stroke="#4a2818" stroke-width="1.3" fill="#6a8a3a"><path d="M10 6 L26 16 L10 26 Z"/></g>`),
220
+ save: wrap(`<g stroke="#4a2818" stroke-width="1.3" fill="#d8a848"><circle cx="16" cy="16" r="9"/><path d="M16 7 L16 25 M7 16 L25 16" stroke-width="1"/><circle cx="16" cy="16" r="3" fill="#b8602a"/></g>`),
221
+ stop: wrap(`<g stroke="#4a2818" stroke-width="1.3" fill="#8a3a1a"><rect x="8" y="8" width="16" height="16"/><circle cx="10" cy="10" r="0.8" fill="#4a2818"/><circle cx="22" cy="10" r="0.8" fill="#4a2818"/><circle cx="10" cy="22" r="0.8" fill="#4a2818"/><circle cx="22" cy="22" r="0.8" fill="#4a2818"/></g>`),
222
+ plus: wrap(`<g stroke="#4a2818" stroke-width="2.4"><path d="M16 7 L16 25 M7 16 L25 16"/></g>`),
223
+ close: wrap(`<g stroke="#4a2818" stroke-width="2.4"><path d="M8 8 L24 24 M24 8 L8 24"/></g>`),
224
+ search: wrap(`<g stroke="#4a2818" stroke-width="1.5" fill="none"><circle cx="13" cy="13" r="6"/><path d="M18 18 L25 25" stroke-width="2"/></g>`),
225
+ chevron: wrap(`<g stroke="#4a2818" stroke-width="2" fill="none"><path d="M11 9 L20 16 L11 23"/></g>`),
226
+ check: wrap(`<g stroke="#6a8a3a" stroke-width="2.4" fill="none"><path d="M6 16 L13 23 L26 8"/></g>`),
227
+ warning: wrap(`<g stroke="#4a2818" stroke-width="1.3" fill="#d8a848"><path d="M16 5 L27 25 L5 25 Z"/><path d="M16 13 L16 20" stroke-width="2"/><circle cx="16" cy="22.5" r="0.8" fill="#4a2818"/></g>`),
228
+ error: wrap(`<g stroke="#4a2818" stroke-width="1.3" fill="#8a3a1a"><circle cx="16" cy="16" r="9"/><path d="M11 11 L21 21 M21 11 L11 21" stroke="#d8a848" stroke-width="2"/></g>`),
229
+ info: wrap(`<g stroke="#4a2818" stroke-width="1.3" fill="#4a8aa8"><circle cx="16" cy="16" r="9"/><path d="M16 14 L16 22 M16 10 L16 11" stroke="#d8a848" stroke-width="2"/></g>`),
230
+ sidebar: wrap(`<g stroke="#4a2818" stroke-width="1.3" fill="#d8a848"><rect x="5" y="6" width="22" height="20"/><path d="M12 6 L12 26"/><circle cx="7" cy="8" r="0.6" fill="#4a2818"/><circle cx="25" cy="24" r="0.6" fill="#4a2818"/></g>`),
231
+ upload: wrap(`<g stroke="#4a2818" stroke-width="1.6" fill="#d8a848"><path d="M16 23 L16 8 L11 13 M16 8 L21 13"/></g>`),
232
+ download: wrap(`<g stroke="#4a2818" stroke-width="1.6" fill="#d8a848"><path d="M16 8 L16 23 L11 18 M16 23 L21 18"/></g>`),
233
+ copy: wrap(`<g stroke="#4a2818" stroke-width="1.3" fill="#d8a848"><rect x="8" y="8" width="13" height="16"/><path d="M12 4 L25 4 L25 20 L21 20"/></g>`),
234
+ moon: wrap(`<g stroke="#4a2818" stroke-width="1.3" fill="#d8a848"><path d="M24 18 Q24 25, 16 25 Q8 25, 8 16 Q8 8, 16 8 Q12 12, 12 16 Q12 22, 18 22 Q22 22, 24 18 Z"/></g>`),
235
+ deploy: wrap(`<g stroke="#4a2818" stroke-width="1.3" fill="#d8a848"><path d="M16 4 L23 11 L23 22 L18 27 L14 27 L9 22 L9 11 Z"/><circle cx="16" cy="14" r="3" fill="#b8602a"/></g>`),
236
+ grid: wrap(`<g stroke="#4a2818" stroke-width="1.3" fill="#d8a848"><rect x="6" y="6" width="8" height="8"/><rect x="18" y="6" width="8" height="8"/><rect x="6" y="18" width="8" height="8"/><rect x="18" y="18" width="8" height="8"/></g>`),
237
+ shield: wrap(`<g stroke="#4a2818" stroke-width="1.3" fill="#d8a848"><path d="M16 4 L26 8 L26 16 Q26 23, 16 28 Q6 23, 6 16 L6 8 Z"/><path d="M11 16 L14 19 L21 12" stroke="#8a3a1a" stroke-width="2"/></g>`),
238
+ },
239
+
240
+ // ─────────── Atomic Modern — boomerang & starburst, Eames cartoon ───────────
241
+ atomic: {
242
+ agent: wrap(`<g stroke="#2a3a4a" stroke-width="2" fill="#e85a26" stroke-linejoin="round"><circle cx="16" cy="11" r="4"/><path d="M8 25 Q8 18, 16 18 Q24 18, 24 25"/></g>`),
243
+ trigger: wrap(`<g stroke="#2a3a4a" stroke-width="2" fill="#d8a838" stroke-linejoin="round"><path d="M16 3 L11 16 L16 16 L13 29 L23 13 L17 13 L21 3 Z"/></g>`),
244
+ tool: wrap(`<g stroke="#2a3a4a" stroke-width="2" fill="#3a9aa0" stroke-linejoin="round"><path d="M5 25 L18 12 M22 8 L26 12 M22 8 Q28 2, 22 4 L18 8 Z"/></g>`),
245
+ memory: wrap(`<g stroke="#2a3a4a" stroke-width="2" fill="#3a9aa0"><rect x="5" y="9" width="22" height="14" rx="3"/><path d="M5 14 L27 14 M5 19 L27 19" stroke="#2a3a4a"/></g>`),
246
+ output: wrap(`<g stroke="#2a3a4a" stroke-width="2.4" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M5 16 L23 16 L18 11 M23 16 L18 21"/></g>`),
247
+ send: wrap(`<g stroke="#2a3a4a" stroke-width="2" fill="#e85a26" stroke-linejoin="round"><path d="M4 28 L28 4 L18 14 L12 11 L11 19 Z"/></g>`),
248
+ file: wrap(`<g stroke="#2a3a4a" stroke-width="2" fill="#ffffff" stroke-linejoin="round"><path d="M9 4 L20 4 L24 8 L24 28 L9 28 Z"/><path d="M20 4 L20 8 L24 8" fill="#d8a838"/></g>`),
249
+ folder: wrap(`<g stroke="#2a3a4a" stroke-width="2" fill="#d8a838" stroke-linejoin="round"><path d="M4 11 L13 11 L15 13 L28 13 L28 25 L4 25 Z"/></g>`),
250
+ settings: wrap(`<g stroke="#2a3a4a" stroke-width="2" fill="#3a9aa0"><circle cx="16" cy="16" r="4"/><path d="M16 3 L16 8 M16 24 L16 29 M3 16 L8 16 M24 16 L29 16" stroke-linecap="round"/></g>`),
251
+ credentials: wrap(`<g stroke="#2a3a4a" stroke-width="2" fill="#d8a838"><circle cx="12" cy="16" r="4"/><path d="M16 16 L28 16 L28 20 M23 16 L23 21 M19 16 L19 19"/></g>`),
252
+ run: wrap(`<g stroke="#2a3a4a" stroke-width="2" fill="#5a8a5a" stroke-linejoin="round"><path d="M9 5 L26 16 L9 27 Z"/></g>`),
253
+ save: wrap(`<g stroke="#2a3a4a" stroke-width="2" fill="#e85a26" stroke-linejoin="round"><path d="M16 4 L20 13 L29 14 L22 20 L24 29 L16 25 L8 29 L10 20 L3 14 L12 13 Z"/></g>`),
254
+ stop: wrap(`<g stroke="#2a3a4a" stroke-width="2" fill="#e85a26"><rect x="7" y="7" width="18" height="18" rx="2"/></g>`),
255
+ plus: wrap(`<g stroke="#2a3a4a" stroke-width="3" stroke-linecap="round"><path d="M16 6 L16 26 M6 16 L26 16"/></g>`),
256
+ close: wrap(`<g stroke="#2a3a4a" stroke-width="3" stroke-linecap="round"><path d="M8 8 L24 24 M24 8 L8 24"/></g>`),
257
+ search: wrap(`<g stroke="#2a3a4a" stroke-width="2.4" fill="#d8a838" stroke-linecap="round"><circle cx="13" cy="13" r="6"/><path d="M18 18 L26 26"/></g>`),
258
+ chevron: wrap(`<g stroke="#2a3a4a" stroke-width="2.4" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M11 9 L20 16 L11 23"/></g>`),
259
+ check: wrap(`<g stroke="#5a8a5a" stroke-width="3" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M6 16 L13 23 L26 8"/></g>`),
260
+ warning: wrap(`<g stroke="#2a3a4a" stroke-width="2" fill="#d8a838" stroke-linejoin="round"><path d="M16 4 L28 26 L4 26 Z"/><path d="M16 13 L16 20" stroke-linecap="round"/></g>`),
261
+ error: wrap(`<g stroke="#2a3a4a" stroke-width="2" fill="#e85a26"><circle cx="16" cy="16" r="10"/><path d="M11 11 L21 21 M21 11 L11 21" stroke="#ffffff" stroke-linecap="round"/></g>`),
262
+ info: wrap(`<g stroke="#2a3a4a" stroke-width="2" fill="#3a9aa0"><circle cx="16" cy="16" r="10"/><path d="M16 14 L16 22 M16 10 L16 11" stroke="#ffffff" stroke-linecap="round"/></g>`),
263
+ sidebar: wrap(`<g stroke="#2a3a4a" stroke-width="2" fill="#3a9aa0"><rect x="5" y="6" width="22" height="20" rx="2"/><path d="M12 6 L12 26"/></g>`),
264
+ upload: wrap(`<g stroke="#2a3a4a" stroke-width="2.4" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M16 24 L16 7 M9 14 L16 7 L23 14"/></g>`),
265
+ download: wrap(`<g stroke="#2a3a4a" stroke-width="2.4" fill="none" stroke-linecap="round" stroke-linejoin="round"><path d="M16 8 L16 25 M9 18 L16 25 L23 18"/></g>`),
266
+ copy: wrap(`<g stroke="#2a3a4a" stroke-width="2" fill="#d8a838" stroke-linejoin="round"><rect x="8" y="8" width="13" height="16" rx="1"/><path d="M12 4 L25 4 L25 20 L21 20"/></g>`),
267
+ moon: wrap(`<g stroke="#2a3a4a" stroke-width="2" fill="#d8a838" stroke-linejoin="round"><path d="M24 18 Q24 25, 16 25 Q8 25, 8 16 Q8 8, 16 8 Q12 12, 12 16 Q12 22, 18 22 Q22 22, 24 18 Z"/></g>`),
268
+ deploy: wrap(`<g stroke="#2a3a4a" stroke-width="2" fill="#e85a26" stroke-linejoin="round"><path d="M16 3 L23 11 L23 23 L18 28 L14 28 L9 23 L9 11 Z"/><circle cx="16" cy="13" r="2.5" fill="#ffffff"/></g>`),
269
+ grid: wrap(`<g stroke="#2a3a4a" stroke-width="2" fill="#d8a838"><rect x="6" y="6" width="8" height="8" rx="1"/><rect x="18" y="6" width="8" height="8" rx="1"/><rect x="6" y="18" width="8" height="8" rx="1"/><rect x="18" y="18" width="8" height="8" rx="1"/></g>`),
270
+ shield: wrap(`<g stroke="#2a3a4a" stroke-width="2" fill="#3a9aa0" stroke-linejoin="round"><path d="M16 3 L26 7 L26 16 Q26 24, 16 29 Q6 24, 6 16 L6 7 Z"/><path d="M11 16 L14 19 L21 12" stroke="#ffffff" stroke-linecap="round"/></g>`),
271
+ },
272
+
273
+ // ─────────── Wasteland — stenciled / spray-painted, jagged ───────────
274
+ wasteland: {
275
+ agent: wrap(`<g stroke="#e88a28" stroke-width="2" fill="none" stroke-linejoin="round"><path d="M12 7 L20 7 L20 14 L23 14 L23 24 L9 24 L9 14 L12 14 Z"/><rect x="13" y="10" width="2" height="2" fill="#e88a28"/><rect x="17" y="10" width="2" height="2" fill="#e88a28"/></g>`),
276
+ trigger: wrap(`<g stroke="#c8d038" stroke-width="2" fill="#c8d038" fill-opacity="0.3" stroke-linejoin="round"><path d="M16 4 L9 18 L15 18 L12 28 L23 13 L17 13 L19 4 Z"/></g>`),
277
+ tool: wrap(`<g stroke="#e88a28" stroke-width="2" fill="none" stroke-linejoin="round"><path d="M5 25 L17 13 M19 11 L21 13 M19 11 Q25 5, 21 7 L17 11 Z"/><path d="M5 25 L7 27"/></g>`),
278
+ memory: wrap(`<g stroke="#e88a28" stroke-width="2" fill="none"><rect x="6" y="9" width="20" height="14"/><path d="M6 13 L26 13 M6 18 L26 18 M11 9 L11 23 M21 9 L21 23"/></g>`),
279
+ output: wrap(`<g stroke="#e88a28" stroke-width="2.4" fill="none" stroke-linecap="square"><path d="M5 16 L24 16 L19 11 M24 16 L19 21"/></g>`),
280
+ send: wrap(`<g stroke="#e88a28" stroke-width="2" fill="#e88a28" fill-opacity="0.3" stroke-linejoin="round"><path d="M5 27 L27 5 L19 13 L13 11 L13 19 L5 27 Z"/></g>`),
281
+ file: wrap(`<g stroke="#e88a28" stroke-width="2" fill="none" stroke-linejoin="round"><path d="M9 5 L19 5 L24 10 L24 27 L9 27 Z"/><path d="M19 5 L19 10 L24 10"/><path d="M12 14 L20 14 M12 18 L20 18 M12 22 L17 22"/></g>`),
282
+ folder: wrap(`<g stroke="#e88a28" stroke-width="2" fill="none" stroke-linejoin="round"><path d="M5 11 L13 11 L15 13 L27 13 L27 24 L5 24 Z"/></g>`),
283
+ settings: wrap(`<g stroke="#e88a28" stroke-width="2" fill="none"><circle cx="16" cy="16" r="3"/><path d="M16 4 L16 9 M16 23 L16 28 M4 16 L9 16 M23 16 L28 16 M8 8 L11 11 M21 21 L24 24 M8 24 L11 21 M21 11 L24 8"/></g>`),
284
+ credentials: wrap(`<g stroke="#e88a28" stroke-width="2" fill="none"><circle cx="12" cy="16" r="4"/><path d="M16 16 L27 16 L27 20 M23 16 L23 20"/></g>`),
285
+ run: wrap(`<g stroke="#8a9028" stroke-width="2" fill="#8a9028" fill-opacity="0.4" stroke-linejoin="round"><path d="M10 6 L26 16 L10 26 Z"/></g>`),
286
+ save: wrap(`<g stroke="#c8d038" stroke-width="2" fill="none"><circle cx="16" cy="16" r="9"/><path d="M16 11 L16 16 L19 18" stroke-linecap="square"/></g>`),
287
+ stop: wrap(`<g stroke="#b8281a" stroke-width="2" fill="#b8281a" fill-opacity="0.4"><rect x="8" y="8" width="16" height="16"/></g>`),
288
+ plus: wrap(`<g stroke="#e88a28" stroke-width="3" stroke-linecap="square"><path d="M16 6 L16 26 M6 16 L26 16"/></g>`),
289
+ close: wrap(`<g stroke="#e88a28" stroke-width="3" stroke-linecap="square"><path d="M8 8 L24 24 M24 8 L8 24"/></g>`),
290
+ search: wrap(`<g stroke="#e88a28" stroke-width="2" fill="none" stroke-linecap="square"><circle cx="13" cy="13" r="6"/><path d="M18 18 L25 25"/></g>`),
291
+ chevron: wrap(`<g stroke="#e88a28" stroke-width="2.4" fill="none" stroke-linecap="square"><path d="M11 9 L20 16 L11 23"/></g>`),
292
+ check: wrap(`<g stroke="#8a9028" stroke-width="3" fill="none" stroke-linecap="square"><path d="M6 16 L13 23 L26 8"/></g>`),
293
+ warning: wrap(`<g stroke="#c8d038" stroke-width="2" fill="#c8d038" fill-opacity="0.3"><path d="M16 4 L28 26 L4 26 Z"/><path d="M16 13 L16 20" stroke-linecap="square"/></g>`),
294
+ error: wrap(`<g stroke="#b8281a" stroke-width="2" fill="#b8281a" fill-opacity="0.4"><circle cx="16" cy="16" r="9"/><path d="M11 11 L21 21 M21 11 L11 21" stroke-linecap="square"/></g>`),
295
+ info: wrap(`<g stroke="#e88a28" stroke-width="2" fill="none"><circle cx="16" cy="16" r="9"/><path d="M16 14 L16 22 M16 10 L16 11" stroke-linecap="square"/></g>`),
296
+ sidebar: wrap(`<g stroke="#e88a28" stroke-width="2" fill="none"><rect x="5" y="6" width="22" height="20"/><path d="M12 6 L12 26"/></g>`),
297
+ upload: wrap(`<g stroke="#e88a28" stroke-width="2.4" fill="none" stroke-linecap="square"><path d="M16 24 L16 8 M9 15 L16 8 L23 15"/></g>`),
298
+ download: wrap(`<g stroke="#e88a28" stroke-width="2.4" fill="none" stroke-linecap="square"><path d="M16 8 L16 24 M9 17 L16 24 L23 17"/></g>`),
299
+ copy: wrap(`<g stroke="#e88a28" stroke-width="2" fill="none"><rect x="8" y="8" width="13" height="16"/><path d="M12 4 L25 4 L25 20 L21 20"/></g>`),
300
+ moon: wrap(`<g stroke="#e88a28" stroke-width="2" fill="none"><path d="M24 18 Q24 25, 16 25 Q8 25, 8 16 Q8 8, 16 8 Q12 12, 12 16 Q12 22, 18 22 Q22 22, 24 18 Z"/></g>`),
301
+ deploy: wrap(`<g stroke="#e88a28" stroke-width="2" fill="none" stroke-linejoin="round"><path d="M16 5 L22 11 L22 22 L18 26 L14 26 L10 22 L10 11 Z"/><circle cx="16" cy="14" r="2.5" fill="#e88a28" fill-opacity="0.4"/></g>`),
302
+ grid: wrap(`<g stroke="#e88a28" stroke-width="2" fill="none"><rect x="6" y="6" width="8" height="8"/><rect x="18" y="6" width="8" height="8"/><rect x="6" y="18" width="8" height="8"/><rect x="18" y="18" width="8" height="8"/></g>`),
303
+ shield: wrap(`<g stroke="#c8d038" stroke-width="2" fill="none"><path d="M16 4 L26 8 L26 16 Q26 23, 16 28 Q6 23, 6 16 L6 8 Z"/><path d="M11 16 L14 19 L21 12" stroke-width="2.4" stroke-linecap="square"/></g>`),
304
+ },
305
+
306
+ // ─────────── Rot — bone-pale fragile lines, drips ───────────
307
+ rot: {
308
+ agent: wrap(`<g stroke="#d8d0b8" stroke-width="1.4" fill="none"><circle cx="16" cy="11" r="3.5"/><path d="M9 24 Q9 18, 16 18 Q23 18, 23 24"/><path d="M14 13 L14 16 M18 13 L18 16" stroke="#78c878" stroke-width="0.8"/></g>`),
309
+ trigger: wrap(`<g stroke="#78c878" stroke-width="1.6" fill="none" stroke-linecap="round"><path d="M16 5 L11 17 L16 17 L13 27 L21 14 L16 14 Z" fill="#78c878" fill-opacity="0.2"/></g>`),
310
+ tool: wrap(`<g stroke="#d8d0b8" stroke-width="1.4" fill="none"><path d="M6 25 L18 13 M22 9 L24 11 M22 9 Q26 5, 22 5 L18 9 Z" fill="#78c878" fill-opacity="0.3"/></g>`),
311
+ memory: wrap(`<g stroke="#d8d0b8" stroke-width="1.4" fill="none"><rect x="6" y="9" width="20" height="14"/><path d="M6 13 L26 13 M6 18 L26 18 M11 9 L11 23 M21 9 L21 23"/></g>`),
312
+ output: wrap(`<g stroke="#78c878" stroke-width="1.6" fill="none" stroke-linecap="round"><path d="M5 16 L23 16 L18 11 M23 16 L18 21"/></g>`),
313
+ send: wrap(`<g stroke="#d8d0b8" stroke-width="1.4" fill="#78c878" fill-opacity="0.2" stroke-linejoin="round"><path d="M5 27 L27 5 L19 13 L13 11 L13 19 L5 27 Z"/></g>`),
314
+ file: wrap(`<g stroke="#d8d0b8" stroke-width="1.4" fill="none"><path d="M9 5 L19 5 L24 10 L24 27 L9 27 Z"/><path d="M19 5 L19 10 L24 10"/><path d="M12 14 L20 14 M12 18 L20 18 M12 22 L17 22"/></g>`),
315
+ folder: wrap(`<g stroke="#d8d0b8" stroke-width="1.4" fill="none"><path d="M5 11 L13 11 L15 13 L27 13 L27 24 L5 24 Z"/></g>`),
316
+ settings: wrap(`<g stroke="#d8d0b8" stroke-width="1.4" fill="none"><circle cx="16" cy="16" r="3"/><path d="M16 4 L16 9 M16 23 L16 28 M4 16 L9 16 M23 16 L28 16 M8 8 L11 11 M21 21 L24 24 M8 24 L11 21 M21 11 L24 8"/></g>`),
317
+ credentials: wrap(`<g stroke="#d8d0b8" stroke-width="1.4" fill="none"><circle cx="12" cy="16" r="4"/><path d="M16 16 L27 16 L27 20 M23 16 L23 20"/></g>`),
318
+ run: wrap(`<g stroke="#78c878" stroke-width="1.4" fill="#78c878" fill-opacity="0.4" stroke-linejoin="round"><path d="M10 6 L26 16 L10 26 Z"/></g>`),
319
+ save: wrap(`<g stroke="#e8a838" stroke-width="1.4" fill="#e8a838" fill-opacity="0.3"><path d="M16 5 L18 11 L25 11 L19 15 L22 22 L16 18 L10 22 L13 15 L7 11 L14 11 Z"/></g>`),
320
+ stop: wrap(`<g stroke="#a83838" stroke-width="1.4" fill="#a83838" fill-opacity="0.4"><rect x="9" y="9" width="14" height="14"/></g>`),
321
+ plus: wrap(`<g stroke="#d8d0b8" stroke-width="2"><path d="M16 7 L16 25 M7 16 L25 16"/></g>`),
322
+ close: wrap(`<g stroke="#d8d0b8" stroke-width="2"><path d="M8 8 L24 24 M24 8 L8 24"/></g>`),
323
+ search: wrap(`<g stroke="#d8d0b8" stroke-width="1.4" fill="none"><circle cx="13" cy="13" r="6"/><path d="M18 18 L25 25"/></g>`),
324
+ chevron: wrap(`<g stroke="#d8d0b8" stroke-width="1.8" fill="none"><path d="M11 9 L20 16 L11 23"/></g>`),
325
+ check: wrap(`<g stroke="#78c878" stroke-width="2" fill="none"><path d="M6 16 L13 23 L26 8"/></g>`),
326
+ warning: wrap(`<g stroke="#e8a838" stroke-width="1.4" fill="#e8a838" fill-opacity="0.3"><path d="M16 5 L27 25 L5 25 Z"/><path d="M16 13 L16 20"/></g>`),
327
+ error: wrap(`<g stroke="#a83838" stroke-width="1.4" fill="#a83838" fill-opacity="0.4"><circle cx="16" cy="16" r="9"/><path d="M11 11 L21 21 M21 11 L11 21"/></g>`),
328
+ info: wrap(`<g stroke="#5898b8" stroke-width="1.4" fill="none"><circle cx="16" cy="16" r="9"/><path d="M16 14 L16 22 M16 10 L16 11"/></g>`),
329
+ sidebar: wrap(`<g stroke="#d8d0b8" stroke-width="1.4" fill="none"><rect x="5" y="6" width="22" height="20"/><path d="M12 6 L12 26"/></g>`),
330
+ upload: wrap(`<g stroke="#d8d0b8" stroke-width="1.6" fill="none"><path d="M16 24 L16 8 M9 15 L16 8 L23 15"/></g>`),
331
+ download: wrap(`<g stroke="#d8d0b8" stroke-width="1.6" fill="none"><path d="M16 8 L16 24 M9 17 L16 24 L23 17"/></g>`),
332
+ copy: wrap(`<g stroke="#d8d0b8" stroke-width="1.4" fill="none"><rect x="8" y="8" width="13" height="16"/><path d="M12 4 L25 4 L25 20 L21 20"/></g>`),
333
+ moon: wrap(`<g stroke="#e8a838" stroke-width="1.4" fill="#e8a838" fill-opacity="0.2"><path d="M24 18 Q24 25, 16 25 Q8 25, 8 16 Q8 8, 16 8 Q12 12, 12 16 Q12 22, 18 22 Q22 22, 24 18 Z"/></g>`),
334
+ deploy: wrap(`<g stroke="#78c878" stroke-width="1.4" fill="none"><path d="M16 5 L22 11 L22 22 L18 26 L14 26 L10 22 L10 11 Z"/><circle cx="16" cy="14" r="2.5" fill="#78c878" fill-opacity="0.3"/></g>`),
335
+ grid: wrap(`<g stroke="#d8d0b8" stroke-width="1.4" fill="none"><rect x="6" y="6" width="8" height="8"/><rect x="18" y="6" width="8" height="8"/><rect x="6" y="18" width="8" height="8"/><rect x="18" y="18" width="8" height="8"/></g>`),
336
+ shield: wrap(`<g stroke="#d8d0b8" stroke-width="1.4" fill="none"><path d="M16 4 L26 8 L26 16 Q26 23, 16 28 Q6 23, 6 16 L6 8 Z"/><path d="M11 16 L14 19 L21 12" stroke="#78c878" stroke-width="1.8"/></g>`),
337
+ },
338
+
339
+ // ─────────── Plague — woodcut, hatched shadows ───────────
340
+ plague: {
341
+ agent: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="#efeacf"><circle cx="16" cy="11" r="3.5"/><path d="M9 24 Q9 18, 16 18 Q23 18, 23 24 Z"/><path d="M14 22 L14 24 M16 22 L16 24 M18 22 L18 24" stroke-width="0.8"/></g>`),
342
+ trigger: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="#783c28"><path d="M16 4 L10 16 L15 16 L12 28 L22 13 L17 13 L20 4 Z"/></g>`),
343
+ tool: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="#efeacf"><path d="M6 25 L18 13 M22 9 L24 11 M22 9 Q26 5, 22 5 L18 9 Z"/></g>`),
344
+ memory: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="#efeacf"><rect x="6" y="9" width="20" height="14"/><path d="M6 13 L26 13 M6 18 L26 18" stroke-width="1"/></g>`),
345
+ output: wrap(`<g stroke="#1a1410" stroke-width="2" fill="none"><path d="M5 16 L23 16 L18 11 M23 16 L18 21"/></g>`),
346
+ send: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="#783c28"><path d="M5 27 L27 5 L19 13 L13 11 L13 19 L5 27 Z"/></g>`),
347
+ file: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="#efeacf"><path d="M9 5 L19 5 L24 10 L24 27 L9 27 Z"/><path d="M19 5 L19 10 L24 10"/><path d="M12 14 L20 14 M12 18 L20 18 M12 22 L16 22"/></g>`),
348
+ folder: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="#efeacf"><path d="M5 11 L13 11 L15 13 L27 13 L27 24 L5 24 Z"/></g>`),
349
+ settings: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="#efeacf"><circle cx="16" cy="16" r="3"/><circle cx="16" cy="16" r="8"/><path d="M16 4 L16 8 M16 24 L16 28 M4 16 L8 16 M24 16 L28 16"/></g>`),
350
+ credentials: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="#783c28"><circle cx="12" cy="16" r="4" fill="#efeacf"/><path d="M16 16 L27 16 L27 20 M23 16 L23 20"/></g>`),
351
+ run: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="#5a7028"><path d="M10 6 L26 16 L10 26 Z"/></g>`),
352
+ save: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="#783c28"><circle cx="16" cy="16" r="8"/><path d="M14 14 L18 14 L18 18 L14 18 Z M12 12 L20 20 M20 12 L12 20" stroke="#efeacf" stroke-width="1.2"/></g>`),
353
+ stop: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="#783c28"><rect x="8" y="8" width="16" height="16"/></g>`),
354
+ plus: wrap(`<g stroke="#1a1410" stroke-width="2.4"><path d="M16 6 L16 26 M6 16 L26 16"/></g>`),
355
+ close: wrap(`<g stroke="#1a1410" stroke-width="2.4"><path d="M8 8 L24 24 M24 8 L8 24"/></g>`),
356
+ search: wrap(`<g stroke="#1a1410" stroke-width="1.8" fill="none"><circle cx="13" cy="13" r="6"/><path d="M18 18 L25 25"/></g>`),
357
+ chevron: wrap(`<g stroke="#1a1410" stroke-width="2" fill="none"><path d="M11 9 L20 16 L11 23"/></g>`),
358
+ check: wrap(`<g stroke="#5a7028" stroke-width="2.4" fill="none"><path d="M6 16 L13 23 L26 8"/></g>`),
359
+ warning: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="#98a838"><path d="M16 4 L28 26 L4 26 Z"/><path d="M16 13 L16 20" stroke-width="2"/><circle cx="16" cy="23" r="0.8" fill="#1a1410"/></g>`),
360
+ error: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="#783c28"><circle cx="16" cy="16" r="9"/><path d="M11 11 L21 21 M21 11 L11 21" stroke="#efeacf" stroke-width="2"/></g>`),
361
+ info: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="#efeacf"><circle cx="16" cy="16" r="9"/><path d="M16 14 L16 22 M16 10 L16 11" stroke-width="2"/></g>`),
362
+ sidebar: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="#efeacf"><rect x="5" y="6" width="22" height="20"/><path d="M12 6 L12 26"/></g>`),
363
+ upload: wrap(`<g stroke="#1a1410" stroke-width="2" fill="none"><path d="M16 24 L16 8 M9 15 L16 8 L23 15"/></g>`),
364
+ download: wrap(`<g stroke="#1a1410" stroke-width="2" fill="none"><path d="M16 8 L16 24 M9 17 L16 24 L23 17"/></g>`),
365
+ copy: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="#efeacf"><rect x="8" y="8" width="13" height="16"/><path d="M12 4 L25 4 L25 20 L21 20"/></g>`),
366
+ moon: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="#efeacf"><path d="M24 18 Q24 25, 16 25 Q8 25, 8 16 Q8 8, 16 8 Q12 12, 12 16 Q12 22, 18 22 Q22 22, 24 18 Z"/></g>`),
367
+ deploy: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="#783c28"><path d="M16 5 L22 11 L22 22 L18 26 L14 26 L10 22 L10 11 Z"/><circle cx="16" cy="14" r="2.5" fill="#efeacf"/></g>`),
368
+ grid: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="#efeacf"><rect x="6" y="6" width="8" height="8"/><rect x="18" y="6" width="8" height="8"/><rect x="6" y="18" width="8" height="8"/><rect x="18" y="18" width="8" height="8"/></g>`),
369
+ shield: wrap(`<g stroke="#1a1410" stroke-width="1.6" fill="#783c28"><path d="M16 4 L26 8 L26 16 Q26 23, 16 28 Q6 23, 6 16 L6 8 Z"/><path d="M11 16 L14 19 L21 12" stroke="#efeacf" stroke-width="2"/></g>`),
370
+ },
371
+
372
+ // ─────────── Surveillance — terminal monospace, corner brackets ───────────
373
+ surveillance: {
374
+ agent: wrap(`<g stroke="#c8ccd0" stroke-width="1.2" fill="none"><rect x="9" y="6" width="14" height="20"/><circle cx="13" cy="12" r="1" fill="#e82626"/><circle cx="19" cy="12" r="1" fill="#c8ccd0"/><path d="M12 18 L20 18 M12 21 L20 21" stroke-width="0.8"/></g>`),
375
+ trigger: wrap(`<g stroke="#e82626" stroke-width="1.4" fill="#e82626" fill-opacity="0.3"><path d="M16 4 L10 16 L15 16 L12 28 L22 13 L17 13 L20 4 Z"/></g>`),
376
+ tool: wrap(`<g stroke="#c8ccd0" stroke-width="1.2" fill="none"><rect x="6" y="14" width="20" height="4"/><path d="M10 14 L10 12 L14 12 L14 14 M18 18 L18 20 L22 20 L22 18"/></g>`),
377
+ memory: wrap(`<g stroke="#c8ccd0" stroke-width="1.2" fill="none"><rect x="6" y="9" width="20" height="14"/><path d="M6 13 L26 13 M6 17 L26 17 M6 21 L26 21 M11 9 L11 23 M21 9 L21 23"/></g>`),
378
+ output: wrap(`<g stroke="#6acc6a" stroke-width="1.4" fill="none"><path d="M5 16 L24 16 M19 11 L24 16 L19 21"/></g>`),
379
+ send: wrap(`<g stroke="#e82626" stroke-width="1.2" fill="#e82626" fill-opacity="0.3"><path d="M5 27 L27 5 L19 13 L13 11 L13 19 L5 27 Z"/></g>`),
380
+ file: wrap(`<g stroke="#c8ccd0" stroke-width="1.2" fill="none"><path d="M9 5 L19 5 L24 10 L24 27 L9 27 Z"/><path d="M19 5 L19 10 L24 10"/><path d="M12 14 L20 14 M12 18 L20 18 M12 22 L17 22" stroke="#6acc6a"/></g>`),
381
+ folder: wrap(`<g stroke="#c8ccd0" stroke-width="1.2" fill="none"><path d="M5 11 L13 11 L15 13 L27 13 L27 24 L5 24 Z"/></g>`),
382
+ settings: wrap(`<g stroke="#c8ccd0" stroke-width="1.2" fill="none"><rect x="13" y="13" width="6" height="6"/><path d="M16 4 L16 9 M16 23 L16 28 M4 16 L9 16 M23 16 L28 16 M8 8 L12 12 M20 20 L24 24 M8 24 L12 20 M20 12 L24 8"/></g>`),
383
+ credentials: wrap(`<g stroke="#c8ccd0" stroke-width="1.2" fill="none"><circle cx="12" cy="16" r="4"/><path d="M16 16 L27 16 L27 20 M23 16 L23 20 M19 16 L19 18"/></g>`),
384
+ run: wrap(`<g stroke="#6acc6a" stroke-width="1.4" fill="#6acc6a" fill-opacity="0.4"><path d="M10 6 L26 16 L10 26 Z"/></g>`),
385
+ save: wrap(`<g stroke="#d8a020" stroke-width="1.2" fill="none"><rect x="6" y="6" width="20" height="20"/><rect x="10" y="6" width="12" height="6" fill="#d8a020" fill-opacity="0.3"/><rect x="11" y="18" width="10" height="8"/></g>`),
386
+ stop: wrap(`<g stroke="#e82626" stroke-width="1.4" fill="#e82626" fill-opacity="0.5"><rect x="9" y="9" width="14" height="14"/></g>`),
387
+ plus: wrap(`<g stroke="#c8ccd0" stroke-width="1.6" stroke-linecap="square"><path d="M16 6 L16 26 M6 16 L26 16"/></g>`),
388
+ close: wrap(`<g stroke="#e82626" stroke-width="1.6" stroke-linecap="square"><path d="M8 8 L24 24 M24 8 L8 24"/></g>`),
389
+ search: wrap(`<g stroke="#c8ccd0" stroke-width="1.4" fill="none"><circle cx="13" cy="13" r="6"/><path d="M18 18 L26 26"/></g>`),
390
+ chevron: wrap(`<g stroke="#c8ccd0" stroke-width="1.6" fill="none"><path d="M11 9 L20 16 L11 23"/></g>`),
391
+ check: wrap(`<g stroke="#6acc6a" stroke-width="1.8" fill="none"><path d="M6 16 L13 23 L26 8"/></g>`),
392
+ warning: wrap(`<g stroke="#d8a020" stroke-width="1.4" fill="none"><path d="M16 4 L28 26 L4 26 Z"/><path d="M16 13 L16 20 M16 23 L16 23.5" stroke-width="1.8"/></g>`),
393
+ error: wrap(`<g stroke="#e82626" stroke-width="1.4" fill="#e82626" fill-opacity="0.3"><circle cx="16" cy="16" r="9"/><path d="M11 11 L21 21 M21 11 L11 21" stroke-width="1.8"/></g>`),
394
+ info: wrap(`<g stroke="#5a8cc8" stroke-width="1.4" fill="none"><circle cx="16" cy="16" r="9"/><path d="M16 14 L16 22 M16 10 L16 11" stroke-width="1.8"/></g>`),
395
+ sidebar: wrap(`<g stroke="#c8ccd0" stroke-width="1.2" fill="none"><rect x="5" y="6" width="22" height="20"/><path d="M12 6 L12 26"/><rect x="6" y="7" width="5" height="18" fill="#e82626" fill-opacity="0.3" stroke="none"/></g>`),
396
+ upload: wrap(`<g stroke="#c8ccd0" stroke-width="1.4" fill="none" stroke-linecap="square"><path d="M16 24 L16 8 M9 15 L16 8 L23 15"/></g>`),
397
+ download: wrap(`<g stroke="#c8ccd0" stroke-width="1.4" fill="none" stroke-linecap="square"><path d="M16 8 L16 24 M9 17 L16 24 L23 17"/></g>`),
398
+ copy: wrap(`<g stroke="#c8ccd0" stroke-width="1.2" fill="none"><rect x="8" y="8" width="13" height="16"/><path d="M12 4 L25 4 L25 20 L21 20"/></g>`),
399
+ moon: wrap(`<g stroke="#c8ccd0" stroke-width="1.2" fill="none"><path d="M24 18 Q24 25, 16 25 Q8 25, 8 16 Q8 8, 16 8 Q12 12, 12 16 Q12 22, 18 22 Q22 22, 24 18 Z"/></g>`),
400
+ deploy: wrap(`<g stroke="#e82626" stroke-width="1.2" fill="none"><path d="M16 4 L22 11 L22 22 L18 26 L14 26 L10 22 L10 11 Z"/><circle cx="16" cy="13" r="2.5" fill="#e82626" fill-opacity="0.4"/></g>`),
401
+ grid: wrap(`<g stroke="#c8ccd0" stroke-width="1.2" fill="none"><rect x="6" y="6" width="8" height="8"/><rect x="18" y="6" width="8" height="8"/><rect x="6" y="18" width="8" height="8"/><rect x="18" y="18" width="8" height="8"/></g>`),
402
+ shield: wrap(`<g stroke="#e82626" stroke-width="1.2" fill="none"><path d="M16 4 L26 8 L26 16 Q26 23, 16 28 Q6 23, 6 16 L6 8 Z"/><path d="M11 16 L14 19 L21 12" stroke-width="1.6"/></g>`),
403
+ },
404
+ };