polyrob 0.5.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (745) hide show
  1. agents/README.md +453 -0
  2. agents/__init__.py +164 -0
  3. agents/base_agent.py +743 -0
  4. agents/personality/character.py +119 -0
  5. agents/personality/character_manager.py +309 -0
  6. agents/personality/characters/rob.character.json +56 -0
  7. agents/personality/characters/trump.character.json +63 -0
  8. agents/personality/persona_render.py +78 -0
  9. agents/personality/persona_resolver.py +115 -0
  10. agents/prompt/__init__.py +58 -0
  11. agents/prompt/base_prompt.py +92 -0
  12. agents/prompt/system.py +417 -0
  13. agents/task/README_PATH_MANAGEMENT.md +141 -0
  14. agents/task/__init__.py +162 -0
  15. agents/task/agent/__init__.py +70 -0
  16. agents/task/agent/agent_state.py +408 -0
  17. agents/task/agent/async_delegation.py +274 -0
  18. agents/task/agent/autonomy_state.py +275 -0
  19. agents/task/agent/conversation.py +75 -0
  20. agents/task/agent/core/__init__.py +6 -0
  21. agents/task/agent/core/aux_metering.py +61 -0
  22. agents/task/agent/core/background_review.py +157 -0
  23. agents/task/agent/core/construction.py +1179 -0
  24. agents/task/agent/core/conversational_exit.py +49 -0
  25. agents/task/agent/core/correspondent_gate.py +227 -0
  26. agents/task/agent/core/curator.py +246 -0
  27. agents/task/agent/core/episodic_digest.py +103 -0
  28. agents/task/agent/core/error_recovery.py +480 -0
  29. agents/task/agent/core/history_io.py +257 -0
  30. agents/task/agent/core/llm_provisioning.py +287 -0
  31. agents/task/agent/core/llm_runner.py +547 -0
  32. agents/task/agent/core/logging_io.py +276 -0
  33. agents/task/agent/core/loop_detection.py +262 -0
  34. agents/task/agent/core/memory_prefetch.py +325 -0
  35. agents/task/agent/core/memory_writer.py +667 -0
  36. agents/task/agent/core/model_introspection.py +82 -0
  37. agents/task/agent/core/model_swap.py +177 -0
  38. agents/task/agent/core/next_action_internal.py +1331 -0
  39. agents/task/agent/core/output_validation.py +303 -0
  40. agents/task/agent/core/project_context.py +272 -0
  41. agents/task/agent/core/resources.py +93 -0
  42. agents/task/agent/core/result_processing.py +389 -0
  43. agents/task/agent/core/run_loop.py +661 -0
  44. agents/task/agent/core/safety_lifecycle.py +228 -0
  45. agents/task/agent/core/secret_guard.py +293 -0
  46. agents/task/agent/core/self_wake.py +280 -0
  47. agents/task/agent/core/session_metadata.py +104 -0
  48. agents/task/agent/core/step.py +781 -0
  49. agents/task/agent/core/step_execution.py +398 -0
  50. agents/task/agent/core/step_telemetry.py +222 -0
  51. agents/task/agent/core/test_aux_metering.py +50 -0
  52. agents/task/agent/core/test_billing_failover.py +68 -0
  53. agents/task/agent/core/test_fatal_error_classifier.py +38 -0
  54. agents/task/agent/core/test_judge_validation.py +275 -0
  55. agents/task/agent/core/test_model_swap.py +190 -0
  56. agents/task/agent/core/test_reflection_offload.py +54 -0
  57. agents/task/agent/core/turn_input.py +8 -0
  58. agents/task/agent/core/untrusted_wrap.py +103 -0
  59. agents/task/agent/core/user_ingress.py +228 -0
  60. agents/task/agent/hitl_manager.py +396 -0
  61. agents/task/agent/log_sanitize.py +36 -0
  62. agents/task/agent/message_manager/config.py +97 -0
  63. agents/task/agent/message_manager/service.py +758 -0
  64. agents/task/agent/message_manager/tests.py +305 -0
  65. agents/task/agent/message_manager/tool_call_builder.py +539 -0
  66. agents/task/agent/message_manager/tool_message_repair.py +364 -0
  67. agents/task/agent/message_manager/views.py +143 -0
  68. agents/task/agent/messages/__init__.py +8 -0
  69. agents/task/agent/messages/builders.py +309 -0
  70. agents/task/agent/messages/compactor.py +611 -0
  71. agents/task/agent/messages/context_references.py +271 -0
  72. agents/task/agent/messages/filters.py +333 -0
  73. agents/task/agent/messages/guidance.py +328 -0
  74. agents/task/agent/messages/persistence.py +448 -0
  75. agents/task/agent/messages/retrieval.py +506 -0
  76. agents/task/agent/messages/sqlite_persistence.py +85 -0
  77. agents/task/agent/messages/test_compaction_upgrade.py +349 -0
  78. agents/task/agent/messages/test_persistence_subdir_fix.py +28 -0
  79. agents/task/agent/messages/test_sqlite_persistence.py +54 -0
  80. agents/task/agent/messages/token_counter.py +532 -0
  81. agents/task/agent/orchestrator.py +776 -0
  82. agents/task/agent/profile_manager.py +105 -0
  83. agents/task/agent/profile_registry.py +173 -0
  84. agents/task/agent/prompts.py +1090 -0
  85. agents/task/agent/scenario_registry.py +226 -0
  86. agents/task/agent/service.py +509 -0
  87. agents/task/agent/session.py +984 -0
  88. agents/task/agent/skill_discovery.py +110 -0
  89. agents/task/agent/skill_frontmatter.py +94 -0
  90. agents/task/agent/skill_manager.py +1201 -0
  91. agents/task/agent/skill_store.py +627 -0
  92. agents/task/agent/skill_validation.py +56 -0
  93. agents/task/agent/skill_writer.py +492 -0
  94. agents/task/agent/sub_agent_manager.py +1137 -0
  95. agents/task/agent/test_session_disk_recovery.py +34 -0
  96. agents/task/agent/tests.py +513 -0
  97. agents/task/agent/tool_call_tracker.py +511 -0
  98. agents/task/agent/views.py +469 -0
  99. agents/task/config.py +432 -0
  100. agents/task/constants.py +1384 -0
  101. agents/task/flag_defaults.py +63 -0
  102. agents/task/goals/__init__.py +1 -0
  103. agents/task/goals/autonomy_marker.py +28 -0
  104. agents/task/goals/board.py +690 -0
  105. agents/task/goals/completion_judge.py +247 -0
  106. agents/task/goals/context.py +62 -0
  107. agents/task/goals/dispatcher.py +848 -0
  108. agents/task/goals/escalation.py +102 -0
  109. agents/task/goals/planner.py +114 -0
  110. agents/task/logging_config.py +155 -0
  111. agents/task/path.py +991 -0
  112. agents/task/robust_parse_config.py +400 -0
  113. agents/task/runtime/__init__.py +0 -0
  114. agents/task/runtime/run_as_session.py +130 -0
  115. agents/task/runtime_safety.py +308 -0
  116. agents/task/session/__init__.py +5 -0
  117. agents/task/session/browser_pool.py +130 -0
  118. agents/task/session/cleanup.py +612 -0
  119. agents/task/session/execution.py +397 -0
  120. agents/task/session/feed.py +200 -0
  121. agents/task/session/hitl_ingress.py +201 -0
  122. agents/task/session/hooks.py +83 -0
  123. agents/task/session/multi_agent.py +243 -0
  124. agents/task/session/workspace.py +91 -0
  125. agents/task/session_registry.py +91 -0
  126. agents/task/session_route.py +35 -0
  127. agents/task/sqlite_session_registry.py +261 -0
  128. agents/task/surface_config.py +185 -0
  129. agents/task/telemetry/__init__.py +58 -0
  130. agents/task/telemetry/event_log.py +180 -0
  131. agents/task/telemetry/formatters.py +642 -0
  132. agents/task/telemetry/manager.py +571 -0
  133. agents/task/telemetry/memory_events.py +66 -0
  134. agents/task/telemetry/self_events.py +53 -0
  135. agents/task/telemetry/sequence.py +160 -0
  136. agents/task/telemetry/service.py +1265 -0
  137. agents/task/telemetry/views.py +882 -0
  138. agents/task/templates.py +98 -0
  139. agents/task/test_aux_chain.py +151 -0
  140. agents/task/test_aux_router.py +41 -0
  141. agents/task/tests/test_parse_robustness.py +170 -0
  142. agents/task/tool_defaults.py +110 -0
  143. agents/task/utils.py +762 -0
  144. agents/task/utils_json.py +768 -0
  145. agents/task/utils_webview.py +86 -0
  146. agents/task/workspace_context.py +229 -0
  147. agents/task_agent_lite.py +2398 -0
  148. api/README.md +683 -0
  149. api/TASK_API_DOCS.md +151 -0
  150. api/__init__.py +0 -0
  151. api/a2a/__init__.py +37 -0
  152. api/a2a/agent_card.py +337 -0
  153. api/a2a/client.py +657 -0
  154. api/a2a/endpoints.py +375 -0
  155. api/a2a/models.py +268 -0
  156. api/a2a/streaming.py +419 -0
  157. api/a2a/task_handler.py +929 -0
  158. api/admin_endpoints.py +1584 -0
  159. api/app.py +923 -0
  160. api/auth_constants.py +28 -0
  161. api/auth_endpoints.py +402 -0
  162. api/auth_state.py +36 -0
  163. api/chat_via_task.py +42 -0
  164. api/conversation_manager.py +231 -0
  165. api/dependencies.py +186 -0
  166. api/eip8004_endpoints.py +452 -0
  167. api/hyperliquid_models.py +174 -0
  168. api/hyperliquid_routes.py +450 -0
  169. api/interfaces.py +207 -0
  170. api/jwt_middleware.py +83 -0
  171. api/kb/__init__.py +1 -0
  172. api/kb/endpoints.py +314 -0
  173. api/mcp_models.py +279 -0
  174. api/mcp_routes.py +438 -0
  175. api/middleware.py +526 -0
  176. api/models.py +176 -0
  177. api/openai_compat/__init__.py +0 -0
  178. api/openai_compat/model_map.py +25 -0
  179. api/openai_compat/models.py +59 -0
  180. api/openai_compat/router.py +140 -0
  181. api/payment_endpoints.py +444 -0
  182. api/payment_verification.py +138 -0
  183. api/polymarket_models.py +155 -0
  184. api/polymarket_routes.py +501 -0
  185. api/pricing_endpoints.py +89 -0
  186. api/session_routing.py +54 -0
  187. api/skill_endpoints.py +453 -0
  188. api/task_http_api.py +1856 -0
  189. api/webhooks.py +52 -0
  190. api/x402_endpoints.py +280 -0
  191. avatar/README.md +44 -0
  192. avatar/__init__.py +1 -0
  193. avatar/config/rob.json +7 -0
  194. avatar/mindprint.js +395 -0
  195. avatar/renders/rob.meta.json +20 -0
  196. avatar/renders/rob.png +0 -0
  197. avatar/studio.html +373 -0
  198. avatar/webview/avatar-live.js +44 -0
  199. cli/README.md +89 -0
  200. cli/__init__.py +0 -0
  201. cli/cli_surface.py +67 -0
  202. cli/commands/__init__.py +0 -0
  203. cli/commands/_bootstrap.py +49 -0
  204. cli/commands/_errors.py +53 -0
  205. cli/commands/chat.py +973 -0
  206. cli/commands/config.py +100 -0
  207. cli/commands/dashboard.py +103 -0
  208. cli/commands/doctor.py +222 -0
  209. cli/commands/email.py +174 -0
  210. cli/commands/gateway.py +346 -0
  211. cli/commands/goals.py +509 -0
  212. cli/commands/init.py +276 -0
  213. cli/commands/journey.py +30 -0
  214. cli/commands/kb.py +280 -0
  215. cli/commands/model.py +107 -0
  216. cli/commands/owner.py +431 -0
  217. cli/commands/pfp.py +232 -0
  218. cli/commands/run.py +414 -0
  219. cli/commands/serve.py +41 -0
  220. cli/commands/session.py +684 -0
  221. cli/commands/skill_install.py +786 -0
  222. cli/commands/skills.py +128 -0
  223. cli/commands/subagents.py +100 -0
  224. cli/commands/surface.py +81 -0
  225. cli/commands/telegram.py +185 -0
  226. cli/commands/todos.py +209 -0
  227. cli/commands/tools.py +102 -0
  228. cli/commands/update.py +316 -0
  229. cli/commands/whatsapp.py +175 -0
  230. cli/config_store.py +276 -0
  231. cli/gitignore.py +43 -0
  232. cli/inventory.py +46 -0
  233. cli/keys.py +101 -0
  234. cli/persona.py +17 -0
  235. cli/polyrob.py +137 -0
  236. cli/ui/__init__.py +64 -0
  237. cli/ui/activity.py +141 -0
  238. cli/ui/app.py +538 -0
  239. cli/ui/banner.py +233 -0
  240. cli/ui/blocks.py +534 -0
  241. cli/ui/bootstrap_notice.py +47 -0
  242. cli/ui/commands/__init__.py +41 -0
  243. cli/ui/commands/h_cron.py +64 -0
  244. cli/ui/commands/h_journey.py +164 -0
  245. cli/ui/commands/h_kb.py +121 -0
  246. cli/ui/commands/h_learn.py +100 -0
  247. cli/ui/commands/h_mcp.py +215 -0
  248. cli/ui/commands/h_self.py +113 -0
  249. cli/ui/commands/h_skills.py +314 -0
  250. cli/ui/commands/handlers.py +1672 -0
  251. cli/ui/commands/registry.py +426 -0
  252. cli/ui/dialog.py +425 -0
  253. cli/ui/event_registry.py +110 -0
  254. cli/ui/event_specs.py +45 -0
  255. cli/ui/events.py +433 -0
  256. cli/ui/identity.py +15 -0
  257. cli/ui/lifecycle.py +159 -0
  258. cli/ui/live_hooks.py +43 -0
  259. cli/ui/model_selector.py +532 -0
  260. cli/ui/persistent_loop.py +181 -0
  261. cli/ui/pick.py +113 -0
  262. cli/ui/plain_renderer.py +351 -0
  263. cli/ui/renderer.py +384 -0
  264. cli/ui/rich_renderer.py +533 -0
  265. cli/ui/secrets.py +115 -0
  266. cli/ui/state.py +376 -0
  267. cli/ui/statusbar.py +231 -0
  268. cli/ui/streaming.py +254 -0
  269. cli/ui/terminal_render.py +105 -0
  270. cli/ui/theme.py +132 -0
  271. cli/update/__init__.py +6 -0
  272. cli/update/context.py +121 -0
  273. cli/update/detect.py +176 -0
  274. cli/update/engine.py +95 -0
  275. cli/update/migrate_guarded.py +55 -0
  276. cli/update/process_guard.py +215 -0
  277. cli/update/runners.py +78 -0
  278. cli/update/snapshot.py +270 -0
  279. cli/update/versions.py +205 -0
  280. core/README.md +377 -0
  281. core/__init__.py +174 -0
  282. core/assets.py +87 -0
  283. core/async_bridge.py +76 -0
  284. core/autonomy_runtime.py +259 -0
  285. core/base_component.py +302 -0
  286. core/bootstrap.py +681 -0
  287. core/bot.py +310 -0
  288. core/config.py +833 -0
  289. core/constants.py +126 -0
  290. core/container.py +462 -0
  291. core/db_manifest.py +101 -0
  292. core/embedding.py +57 -0
  293. core/env.py +39 -0
  294. core/exceptions.py +287 -0
  295. core/flags.py +144 -0
  296. core/flags_catalog.py +345 -0
  297. core/home_migration.py +62 -0
  298. core/identity.py +118 -0
  299. core/initialization.py +1004 -0
  300. core/instance.py +537 -0
  301. core/interactive_gate.py +96 -0
  302. core/logging.py +436 -0
  303. core/owner_doc_writer.py +176 -0
  304. core/pairing.py +193 -0
  305. core/path_safety.py +20 -0
  306. core/paths.py +27 -0
  307. core/payment_config.py +21 -0
  308. core/permissions.py +322 -0
  309. core/runtime_config.py +96 -0
  310. core/runtime_paths.py +135 -0
  311. core/seams.py +35 -0
  312. core/secret_scan.py +25 -0
  313. core/secret_scrub.py +71 -0
  314. core/secrets.py +35 -0
  315. core/security_logging_filter.py +148 -0
  316. core/self_context_writer.py +333 -0
  317. core/self_evolution.py +294 -0
  318. core/session_context.py +47 -0
  319. core/sqlite_util.py +59 -0
  320. core/surfaces/__init__.py +16 -0
  321. core/surfaces/access.py +118 -0
  322. core/surfaces/binding.py +88 -0
  323. core/surfaces/bootstrap.py +78 -0
  324. core/surfaces/circuit.py +168 -0
  325. core/surfaces/continuity.py +77 -0
  326. core/surfaces/correspondents.py +228 -0
  327. core/surfaces/dispatcher.py +216 -0
  328. core/surfaces/envelopes.py +75 -0
  329. core/surfaces/gc.py +30 -0
  330. core/surfaces/idempotency.py +57 -0
  331. core/surfaces/inbound_webhook.py +124 -0
  332. core/surfaces/media.py +32 -0
  333. core/surfaces/message_router.py +91 -0
  334. core/surfaces/outbound_allowlist.py +80 -0
  335. core/surfaces/outbound_dispatcher.py +110 -0
  336. core/surfaces/outbound_mirror.py +37 -0
  337. core/surfaces/outbound_queue.py +107 -0
  338. core/surfaces/outbound_target.py +12 -0
  339. core/surfaces/owner_admin.py +29 -0
  340. core/surfaces/proactive.py +78 -0
  341. core/surfaces/progress.py +108 -0
  342. core/surfaces/rate_bucket.py +21 -0
  343. core/surfaces/registry.py +51 -0
  344. core/surfaces/rendering.py +53 -0
  345. core/surfaces/send_policy.py +14 -0
  346. core/surfaces/serialize.py +24 -0
  347. core/surfaces/session_chat_registry.py +112 -0
  348. core/surfaces/session_policy.py +60 -0
  349. core/surfaces/surface.py +288 -0
  350. core/surfaces/transcription.py +88 -0
  351. core/surfaces/voice_echo.py +26 -0
  352. core/surfaces/voice_guard.py +23 -0
  353. core/tickers.py +174 -0
  354. core/tool_catalog.py +192 -0
  355. core/version.py +75 -0
  356. core/wallet/__init__.py +5 -0
  357. core/wallet/agent_wallet.py +59 -0
  358. core/wallet/audit_sink.py +61 -0
  359. core/wallet/config.py +70 -0
  360. core/wallet/factory.py +87 -0
  361. core/wallet/policy.py +104 -0
  362. core/wallet/signer.py +51 -0
  363. cron/README.md +65 -0
  364. cron/__init__.py +0 -0
  365. cron/delivery.py +277 -0
  366. cron/digest.py +124 -0
  367. cron/jobs.py +207 -0
  368. cron/runner.py +297 -0
  369. cron/schedule.py +194 -0
  370. cron/scheduler.py +201 -0
  371. cron/service.py +57 -0
  372. cron/wake_gate.py +223 -0
  373. data/__init__.py +1 -0
  374. data/prompts/autov2_prompts.json +87 -0
  375. data/prompts/skills/browser-automation/SKILL.md +43 -0
  376. data/prompts/skills/coding-workflow/SKILL.md +36 -0
  377. data/prompts/skills/crypto-trading-safety/SKILL.md +53 -0
  378. data/prompts/skills/document-writing/SKILL.md +33 -0
  379. data/prompts/skills/email-comms/SKILL.md +33 -0
  380. data/prompts/skills/file-data-ops/SKILL.md +35 -0
  381. data/prompts/skills/hyperliquid-account-review/SKILL.md +48 -0
  382. data/prompts/skills/hyperliquid-market-data/SKILL.md +52 -0
  383. data/prompts/skills/hyperliquid-trading/SKILL.md +59 -0
  384. data/prompts/skills/lead-research/SKILL.md +86 -0
  385. data/prompts/skills/market-research-brief/SKILL.md +104 -0
  386. data/prompts/skills/person-analyzer/SKILL.md +124 -0
  387. data/prompts/skills/polymarket-market-research/SKILL.md +54 -0
  388. data/prompts/skills/polymarket-portfolio-review/SKILL.md +50 -0
  389. data/prompts/skills/polymarket-trading/SKILL.md +55 -0
  390. data/prompts/skills/presentation-creator/SKILL.md +36 -0
  391. data/prompts/skills/project-analyzer/SKILL.md +169 -0
  392. data/prompts/skills/rules.json +268 -0
  393. data/prompts/skills/secret-handling/SKILL.md +20 -0
  394. data/prompts/skills/skill-authoring/SKILL.md +31 -0
  395. data/prompts/skills/skill-security-review/SKILL.md +27 -0
  396. data/prompts/skills/social-discovery/SKILL.md +57 -0
  397. data/prompts/skills/task-planning/SKILL.md +33 -0
  398. data/prompts/skills/web-research/SKILL.md +39 -0
  399. data/prompts/skills/web-scraping/SKILL.md +73 -0
  400. data/prompts/skills/x-engagement/SKILL.md +69 -0
  401. data/prompts/system_prompts.json +4 -0
  402. data/subscription_channels.json +5 -0
  403. modules/README.md +503 -0
  404. modules/__init__.py +124 -0
  405. modules/auth/__init__.py +13 -0
  406. modules/auth/api_key_manager.py +157 -0
  407. modules/auth/identity_mapper.py +380 -0
  408. modules/auth/siwe_auth.py +273 -0
  409. modules/auth/tier_manager.py +173 -0
  410. modules/base_module.py +190 -0
  411. modules/credits/__init__.py +29 -0
  412. modules/credits/balance_manager.py +237 -0
  413. modules/credits/cost_utils.py +129 -0
  414. modules/credits/pricing.py +139 -0
  415. modules/credits/unified_ledger.py +148 -0
  416. modules/credits/usage_meter.py +310 -0
  417. modules/credits/usage_tracker.py +674 -0
  418. modules/database/__init__.py +33 -0
  419. modules/database/audit_log.py +322 -0
  420. modules/database/auth_tables.py +276 -0
  421. modules/database/connection.py +644 -0
  422. modules/database/connection_pool.py +305 -0
  423. modules/database/conversation_contexts.py +446 -0
  424. modules/database/database_manager.py +237 -0
  425. modules/database/hyperliquid.py +375 -0
  426. modules/database/polymarket.py +574 -0
  427. modules/database/user_mcp_servers.py +728 -0
  428. modules/database/user_profiles.py +562 -0
  429. modules/database/utils.py +107 -0
  430. modules/database/x402_tables.py +92 -0
  431. modules/eip8004/README.md +1069 -0
  432. modules/eip8004/__init__.py +65 -0
  433. modules/eip8004/contracts.py +498 -0
  434. modules/eip8004/models.py +271 -0
  435. modules/eip8004/registration.py +148 -0
  436. modules/eip8004/reputation.py +367 -0
  437. modules/eip8004/validation.py +277 -0
  438. modules/llm/__init__.py +97 -0
  439. modules/llm/adapters.py +963 -0
  440. modules/llm/anthropic_client.py +831 -0
  441. modules/llm/available_models.py +106 -0
  442. modules/llm/brain_scrubber.py +137 -0
  443. modules/llm/cache_hints.py +162 -0
  444. modules/llm/deepseek_client.py +562 -0
  445. modules/llm/gemini_client.py +1367 -0
  446. modules/llm/llm_client.py +1139 -0
  447. modules/llm/llm_client_registry.py +188 -0
  448. modules/llm/llm_factory.py +237 -0
  449. modules/llm/llm_manager.py +1036 -0
  450. modules/llm/messages.py +374 -0
  451. modules/llm/model_registry.py +1935 -0
  452. modules/llm/nvidia_client.py +125 -0
  453. modules/llm/openai_client.py +800 -0
  454. modules/llm/openrouter_client.py +969 -0
  455. modules/llm/profiles.py +178 -0
  456. modules/llm/test_anthropic_cache_capture.py +35 -0
  457. modules/llm/test_cached_pricing_derivation.py +24 -0
  458. modules/llm/think_scrubber.py +444 -0
  459. modules/llm/token_counter.py +268 -0
  460. modules/memory/__init__.py +35 -0
  461. modules/memory/backend_factory.py +83 -0
  462. modules/memory/cache_manager.py +186 -0
  463. modules/memory/episodic.py +108 -0
  464. modules/memory/local_vector_memory_provider.py +552 -0
  465. modules/memory/memory_manager.py +225 -0
  466. modules/memory/models.py +312 -0
  467. modules/memory/provider.py +210 -0
  468. modules/memory/registry.py +205 -0
  469. modules/memory/sqlite_memory_provider.py +767 -0
  470. modules/memory/task/__init__.py +52 -0
  471. modules/memory/task/compaction_manager.py +157 -0
  472. modules/memory/task/context_retriever.py +809 -0
  473. modules/memory/task/hierarchical_memory.py +1002 -0
  474. modules/memory/task/lexical_retriever.py +71 -0
  475. modules/memory/task/null_context_manager.py +213 -0
  476. modules/memory/task/phase_manager.py +625 -0
  477. modules/memory/task/reflection_service.py +157 -0
  478. modules/memory/task/semantic_retriever.py +218 -0
  479. modules/memory/task/task_context_manager.py +1165 -0
  480. modules/memory/task/test_forgetting_engages.py +24 -0
  481. modules/memory/task/test_reflection_llm.py +39 -0
  482. modules/memory/task/test_threat_scan.py +53 -0
  483. modules/memory/task/threat_scan.py +90 -0
  484. modules/memory/test_sqlite_memory_provider.py +106 -0
  485. modules/memory/user_profile_manager.py +527 -0
  486. modules/payments/__init__.py +11 -0
  487. modules/payments/deposit_monitor.py +478 -0
  488. modules/payments/price_oracle.py +70 -0
  489. modules/payments/treasury_sweeper.py +401 -0
  490. modules/payments/wallet_generator.py +145 -0
  491. modules/pfp/__init__.py +1 -0
  492. modules/pfp/config.py +92 -0
  493. modules/pfp/mesh.py +565 -0
  494. modules/pfp/push.py +69 -0
  495. modules/pfp/renderer.py +85 -0
  496. modules/pfp/store.py +82 -0
  497. modules/skills/__init__.py +1 -0
  498. modules/skills/skill_usage.py +248 -0
  499. modules/transcription/__init__.py +24 -0
  500. modules/transcription/base.py +20 -0
  501. modules/transcription/faster_whisper_transcriber.py +55 -0
  502. modules/x402/README.md +249 -0
  503. modules/x402/__init__.py +22 -0
  504. modules/x402/invoicing.py +416 -0
  505. modules/x402/middleware.py +364 -0
  506. modules/x402/settlement_watcher.py +145 -0
  507. modules/x402/x402_integration.py +344 -0
  508. polyrob-0.5.0.dist-info/METADATA +482 -0
  509. polyrob-0.5.0.dist-info/RECORD +745 -0
  510. polyrob-0.5.0.dist-info/WHEEL +5 -0
  511. polyrob-0.5.0.dist-info/entry_points.txt +2 -0
  512. polyrob-0.5.0.dist-info/licenses/LICENSE +21 -0
  513. polyrob-0.5.0.dist-info/top_level.txt +12 -0
  514. surfaces/README.md +70 -0
  515. surfaces/__init__.py +0 -0
  516. surfaces/email/__init__.py +0 -0
  517. surfaces/email/dedup.py +44 -0
  518. surfaces/email/harness.py +187 -0
  519. surfaces/email/inbound.py +159 -0
  520. surfaces/email/seed.py +60 -0
  521. surfaces/email/surface.py +105 -0
  522. surfaces/telegram/__init__.py +0 -0
  523. surfaces/telegram/dedup.py +83 -0
  524. surfaces/telegram/harness.py +886 -0
  525. surfaces/telegram/inbound.py +145 -0
  526. surfaces/telegram/interactive_tools.py +49 -0
  527. surfaces/telegram/markdown.py +347 -0
  528. surfaces/telegram/rate_limit.py +167 -0
  529. surfaces/telegram/surface.py +187 -0
  530. surfaces/telegram/voice.py +52 -0
  531. surfaces/whatsapp/__init__.py +0 -0
  532. surfaces/whatsapp/client.py +51 -0
  533. surfaces/whatsapp/harness.py +62 -0
  534. surfaces/whatsapp/inbound.py +132 -0
  535. surfaces/whatsapp/surface.py +64 -0
  536. surfaces/whatsapp/window.py +34 -0
  537. tools/README.md +578 -0
  538. tools/__init__.py +424 -0
  539. tools/alchemy/__init__.py +5 -0
  540. tools/alchemy/alchemy_tool.py +389 -0
  541. tools/anysite/__init__.py +17 -0
  542. tools/anysite/client.py +88 -0
  543. tools/anysite/tool.py +89 -0
  544. tools/base_tool.py +468 -0
  545. tools/browser/__init__.py +22 -0
  546. tools/browser/actions.py +118 -0
  547. tools/browser/browser.py +1457 -0
  548. tools/browser/browser_manager.py +690 -0
  549. tools/browser/context.py +1748 -0
  550. tools/browser/playwright_utils.py +137 -0
  551. tools/browser/views.py +56 -0
  552. tools/code_exec/SANDBOX_SECURITY.md +144 -0
  553. tools/code_exec/__init__.py +178 -0
  554. tools/code_exec/backend.py +73 -0
  555. tools/code_exec/backends/__init__.py +1 -0
  556. tools/code_exec/backends/docker.py +779 -0
  557. tools/code_exec/backends/local_subprocess.py +154 -0
  558. tools/code_exec/env_policy.py +45 -0
  559. tools/code_exec/result.py +42 -0
  560. tools/code_exec/sandbox_guard.py +59 -0
  561. tools/code_exec/tool.py +227 -0
  562. tools/coding/__init__.py +50 -0
  563. tools/coding/edit.py +107 -0
  564. tools/coding/search.py +113 -0
  565. tools/coding/tool.py +353 -0
  566. tools/collabland/__init__.py +5 -0
  567. tools/collabland/collabland_tool.py +471 -0
  568. tools/controller/__init__.py +0 -0
  569. tools/controller/_helpers.py +165 -0
  570. tools/controller/action_registration.py +1765 -0
  571. tools/controller/approval.py +244 -0
  572. tools/controller/approval_interactive.py +90 -0
  573. tools/controller/delegation.py +195 -0
  574. tools/controller/execution.py +797 -0
  575. tools/controller/execution_context.py +141 -0
  576. tools/controller/hooks.py +135 -0
  577. tools/controller/introspection.py +344 -0
  578. tools/controller/mcp_registrar.py +190 -0
  579. tools/controller/message_send.py +31 -0
  580. tools/controller/registry/__init__.py +4 -0
  581. tools/controller/registry/schema_generators.py +395 -0
  582. tools/controller/registry/schema_sanitizer.py +406 -0
  583. tools/controller/registry/service.py +1266 -0
  584. tools/controller/registry/views.py +151 -0
  585. tools/controller/service.py +409 -0
  586. tools/controller/tool_management.py +334 -0
  587. tools/controller/types.py +28 -0
  588. tools/controller/views.py +450 -0
  589. tools/cronjob_tools.py +166 -0
  590. tools/crypto_trade_gate.py +59 -0
  591. tools/descriptors.py +452 -0
  592. tools/dom/__init__.py +0 -0
  593. tools/dom/history_tree_processor/service.py +244 -0
  594. tools/dom/history_tree_processor/view.py +99 -0
  595. tools/dom/service.py +471 -0
  596. tools/dom/views.py +346 -0
  597. tools/email_tool.py +403 -0
  598. tools/exceptions.py +169 -0
  599. tools/filesystem.py +1038 -0
  600. tools/filesystem_docproc.py +331 -0
  601. tools/filesystem_pdf.py +755 -0
  602. tools/git/__init__.py +42 -0
  603. tools/git/tool.py +258 -0
  604. tools/github/__init__.py +33 -0
  605. tools/github/client.py +94 -0
  606. tools/github/tool.py +237 -0
  607. tools/goal_tools.py +309 -0
  608. tools/hyperliquid/__init__.py +56 -0
  609. tools/hyperliquid/models.py +233 -0
  610. tools/hyperliquid/service.py +1680 -0
  611. tools/knowledge_ingest.py +950 -0
  612. tools/mcp/README.md +535 -0
  613. tools/mcp/__init__.py +52 -0
  614. tools/mcp/catalog.py +115 -0
  615. tools/mcp/config.py +337 -0
  616. tools/mcp/mcp_tool.py +1415 -0
  617. tools/mcp/param_coercion.py +289 -0
  618. tools/mcp/protocol.py +1520 -0
  619. tools/mcp/rate_limit.py +50 -0
  620. tools/mcp/security.py +424 -0
  621. tools/mcp/self_install.py +111 -0
  622. tools/mcp/server_manager.py +829 -0
  623. tools/mcp/subscriptions.py +72 -0
  624. tools/mcp/user_mcp_service.py +899 -0
  625. tools/mcp/validation_tracker.py +89 -0
  626. tools/mcp/views.py +346 -0
  627. tools/oauth/__init__.py +17 -0
  628. tools/oauth/manager.py +75 -0
  629. tools/oauth/provider.py +69 -0
  630. tools/oauth/providers/__init__.py +1 -0
  631. tools/oauth/providers/generic_oauth2.py +96 -0
  632. tools/perplexity_tool.py +280 -0
  633. tools/polymarket/__init__.py +41 -0
  634. tools/polymarket/clob_adapter.py +76 -0
  635. tools/polymarket/models.py +182 -0
  636. tools/polymarket/service.py +2082 -0
  637. tools/self_env/__init__.py +61 -0
  638. tools/self_env/tool.py +274 -0
  639. tools/shell/__init__.py +80 -0
  640. tools/shell/backend_pool.py +118 -0
  641. tools/shell/discipline.py +62 -0
  642. tools/shell/executor.py +157 -0
  643. tools/shell/loopback_allow.py +87 -0
  644. tools/shell/process_registry.py +113 -0
  645. tools/shell/process_tool.py +131 -0
  646. tools/shell/state.py +129 -0
  647. tools/shell/tool.py +151 -0
  648. tools/task_tool.py +637 -0
  649. tools/twitter_tool.py +2086 -0
  650. tools/user_directory.py +179 -0
  651. tools/web_fetch/__init__.py +3 -0
  652. tools/web_fetch/fetcher.py +144 -0
  653. tools/web_fetch/render.py +44 -0
  654. tools/web_fetch/tool.py +60 -0
  655. tools/x402/__init__.py +60 -0
  656. tools/x402/client.py +47 -0
  657. tools/x402/invoice_tool.py +143 -0
  658. tools/x402/real_client.py +250 -0
  659. tools/x402/service.py +131 -0
  660. utils/README.md +498 -0
  661. utils/__init__.py +46 -0
  662. utils/auth_utils.py +114 -0
  663. utils/bounded_collections.py +162 -0
  664. utils/circuit_breaker.py +389 -0
  665. utils/gif_utils.py +435 -0
  666. utils/markdown_utils.py +291 -0
  667. utils/message_utils.py +147 -0
  668. utils/metrics.py +36 -0
  669. utils/path_validator.py +227 -0
  670. utils/rate_limit_manager.py +399 -0
  671. utils/result_size.py +296 -0
  672. utils/time_utils.py +206 -0
  673. utils/user_utils.py +188 -0
  674. webview/README.md +111 -0
  675. webview/RENAME_AND_ALIGN_HANDOFF.md +200 -0
  676. webview/__init__.py +8 -0
  677. webview/activity.py +636 -0
  678. webview/owner_auth.py +108 -0
  679. webview/pages.py +448 -0
  680. webview/repair_sessions.py +399 -0
  681. webview/server.py +4323 -0
  682. webview/server_launcher.py +112 -0
  683. webview/static/css/activity.css +89 -0
  684. webview/static/css/chat.css +1772 -0
  685. webview/static/css/components.css +1190 -0
  686. webview/static/css/config-panel.css +651 -0
  687. webview/static/css/pages/admin.css +766 -0
  688. webview/static/css/pages/profile.css +231 -0
  689. webview/static/css/pages/settings.css +297 -0
  690. webview/static/css/pages/signin.css +316 -0
  691. webview/static/css/style.css +4250 -0
  692. webview/static/css/variables.css +147 -0
  693. webview/static/css/workspace-fullwidth-fix.css +109 -0
  694. webview/static/img/favicon.ico +0 -0
  695. webview/static/js/activity.js +394 -0
  696. webview/static/js/admin/activity.js +186 -0
  697. webview/static/js/admin/dashboard.js +163 -0
  698. webview/static/js/admin/user_detail.js +400 -0
  699. webview/static/js/admin/users.js +174 -0
  700. webview/static/js/admin/utils.js +214 -0
  701. webview/static/js/chat.js +3178 -0
  702. webview/static/js/config-panel.js +522 -0
  703. webview/static/js/constants.js +20 -0
  704. webview/static/js/error-handler.js +226 -0
  705. webview/static/js/ethers.min.js +1 -0
  706. webview/static/js/event-filter.js +137 -0
  707. webview/static/js/event-store.js +351 -0
  708. webview/static/js/file-attachments.js +374 -0
  709. webview/static/js/file-loader.js +163 -0
  710. webview/static/js/index.js +103 -0
  711. webview/static/js/performance-utils.js +196 -0
  712. webview/static/js/profile.js +396 -0
  713. webview/static/js/screenshot.js +386 -0
  714. webview/static/js/session.js +1527 -0
  715. webview/static/js/settings.js +1288 -0
  716. webview/static/js/sidebar-data.js +766 -0
  717. webview/static/js/sidebar-toggle.js +296 -0
  718. webview/static/js/socket.io.min.js +7 -0
  719. webview/static/js/stats.js +355 -0
  720. webview/static/js/ui-utils.js +420 -0
  721. webview/static/js/workspace.js +966 -0
  722. webview/stats_service.py +613 -0
  723. webview/templates/__init__.py +1 -0
  724. webview/templates/__pycache__/__init__.cpython-311.pyc +0 -0
  725. webview/templates/activity.html +36 -0
  726. webview/templates/admin/activity.html +122 -0
  727. webview/templates/admin/dashboard.html +112 -0
  728. webview/templates/admin/user_detail.html +228 -0
  729. webview/templates/admin/users.html +105 -0
  730. webview/templates/autonomy.html +60 -0
  731. webview/templates/error.html +133 -0
  732. webview/templates/finance.html +90 -0
  733. webview/templates/identity.html +73 -0
  734. webview/templates/index.html +42 -0
  735. webview/templates/layout.html +125 -0
  736. webview/templates/memory.html +59 -0
  737. webview/templates/owner_login.html +15 -0
  738. webview/templates/profile.html +121 -0
  739. webview/templates/session.html +312 -0
  740. webview/templates/settings.html +534 -0
  741. webview/templates/sidebar.html +112 -0
  742. webview/templates/signin.html +213 -0
  743. webview/templates/status.html +14 -0
  744. webview/templates/system.html +45 -0
  745. webview/webgate.py +196 -0
@@ -0,0 +1,1190 @@
1
+ /**
2
+ * POLYROB Design System - Reusable Components
3
+ *
4
+ * Created: 2024-12-05
5
+ * Version: 1.0.0
6
+ *
7
+ * This file provides unified component styles that should be used
8
+ * across all pages for consistency.
9
+ */
10
+
11
+ /* =============================================================================
12
+ BUTTONS
13
+ ============================================================================= */
14
+
15
+ /* Base button reset */
16
+ .btn {
17
+ display: inline-flex;
18
+ align-items: center;
19
+ justify-content: center;
20
+ gap: var(--spacing-sm);
21
+
22
+ padding: 0 var(--spacing-md);
23
+ height: var(--button-height);
24
+ min-height: var(--button-height);
25
+
26
+ font-family: var(--font-family-mono);
27
+ font-size: var(--font-size-xs);
28
+ font-weight: var(--font-weight-normal);
29
+ text-transform: uppercase;
30
+ letter-spacing: 0.5px;
31
+ white-space: nowrap;
32
+ text-decoration: none;
33
+
34
+ background: transparent;
35
+ border: var(--border-width) solid var(--color-border);
36
+ border-radius: var(--border-radius);
37
+ color: var(--color-text-primary);
38
+
39
+ cursor: pointer;
40
+ transition: all var(--transition-fast);
41
+ }
42
+
43
+ .btn:hover:not(:disabled) {
44
+ border-color: var(--color-accent-blue);
45
+ color: var(--color-accent-blue);
46
+ }
47
+
48
+ .btn:active:not(:disabled) {
49
+ transform: scale(0.98);
50
+ }
51
+
52
+ .btn:disabled {
53
+ opacity: 0.4;
54
+ cursor: not-allowed;
55
+ }
56
+
57
+ /* Button variants */
58
+ .btn-primary {
59
+ border-color: var(--color-accent-blue);
60
+ color: var(--color-accent-blue);
61
+ }
62
+
63
+ .btn-primary:hover:not(:disabled) {
64
+ background: rgba(86, 194, 255, 0.1);
65
+ }
66
+
67
+ .btn-success {
68
+ border-color: var(--color-accent-green);
69
+ color: var(--color-accent-green);
70
+ }
71
+
72
+ .btn-success:hover:not(:disabled) {
73
+ background: rgba(86, 226, 194, 0.1);
74
+ }
75
+
76
+ .btn-danger {
77
+ border-color: var(--color-accent-red);
78
+ color: var(--color-accent-red);
79
+ }
80
+
81
+ .btn-danger:hover:not(:disabled) {
82
+ background: rgba(255, 94, 94, 0.1);
83
+ }
84
+
85
+ .btn-warning {
86
+ border-color: var(--color-accent-yellow);
87
+ color: var(--color-accent-yellow);
88
+ }
89
+
90
+ .btn-warning:hover:not(:disabled) {
91
+ background: rgba(226, 192, 112, 0.1);
92
+ }
93
+
94
+ /* Button sizes */
95
+ .btn-sm {
96
+ height: 24px;
97
+ padding: 0 var(--spacing-sm);
98
+ font-size: 10px;
99
+ }
100
+
101
+ .btn-lg {
102
+ height: var(--button-height-lg);
103
+ padding: 0 var(--spacing-lg);
104
+ font-size: var(--font-size-sm);
105
+ }
106
+
107
+ /* Icon button */
108
+ .btn-icon {
109
+ width: var(--button-height);
110
+ padding: 0;
111
+ }
112
+
113
+ .btn-icon.btn-lg {
114
+ width: var(--button-height-lg);
115
+ }
116
+
117
+ /* Legacy button aliases - for backwards compatibility */
118
+ .btn-search {
119
+ border-color: var(--color-accent-blue);
120
+ color: var(--color-accent-blue);
121
+ }
122
+
123
+ .btn-search:hover:not(:disabled) {
124
+ background: rgba(86, 194, 255, 0.1);
125
+ }
126
+
127
+ .btn-page {
128
+ display: inline-flex;
129
+ align-items: center;
130
+ justify-content: center;
131
+ padding: 0 var(--spacing-md);
132
+ height: var(--button-height);
133
+ font-family: var(--font-family-mono);
134
+ font-size: var(--font-size-xs);
135
+ background: transparent;
136
+ border: 1px solid var(--color-border);
137
+ color: var(--color-text-primary);
138
+ cursor: pointer;
139
+ transition: all var(--transition-fast);
140
+ }
141
+
142
+ .btn-page:hover:not(:disabled) {
143
+ border-color: var(--color-accent-blue);
144
+ color: var(--color-accent-blue);
145
+ }
146
+
147
+ .btn-page:disabled {
148
+ opacity: 0.4;
149
+ cursor: not-allowed;
150
+ }
151
+
152
+ /* Filter/Action buttons */
153
+ .btn-filter {
154
+ display: inline-flex;
155
+ align-items: center;
156
+ justify-content: center;
157
+ padding: 0 var(--spacing-md);
158
+ height: var(--button-height);
159
+ font-family: var(--font-family-mono);
160
+ font-size: var(--font-size-xs);
161
+ text-transform: uppercase;
162
+ background: transparent;
163
+ border: 1px solid var(--color-accent-blue);
164
+ color: var(--color-accent-blue);
165
+ cursor: pointer;
166
+ transition: all var(--transition-fast);
167
+ }
168
+
169
+ .btn-filter:hover:not(:disabled) {
170
+ background: rgba(86, 194, 255, 0.1);
171
+ }
172
+
173
+ .btn-clear {
174
+ display: inline-flex;
175
+ align-items: center;
176
+ justify-content: center;
177
+ padding: 0 var(--spacing-md);
178
+ height: var(--button-height);
179
+ font-family: var(--font-family-mono);
180
+ font-size: var(--font-size-xs);
181
+ text-transform: uppercase;
182
+ background: transparent;
183
+ border: 1px solid var(--color-border);
184
+ color: var(--color-text-secondary);
185
+ cursor: pointer;
186
+ transition: all var(--transition-fast);
187
+ }
188
+
189
+ .btn-clear:hover:not(:disabled) {
190
+ border-color: var(--color-accent-red);
191
+ color: var(--color-accent-red);
192
+ }
193
+
194
+ /* Note: .filter-input now consolidated with .form-input above */
195
+
196
+ /* =============================================================================
197
+ TABS / NAVIGATION
198
+ ============================================================================= */
199
+
200
+ .tabs {
201
+ display: flex;
202
+ gap: 0;
203
+ border-bottom: var(--border-width) solid var(--color-border);
204
+ overflow-x: auto;
205
+ -webkit-overflow-scrolling: touch;
206
+ }
207
+
208
+ .tab {
209
+ display: flex;
210
+ align-items: center;
211
+ gap: var(--spacing-xs);
212
+
213
+ padding: var(--spacing-md) var(--spacing-xl);
214
+ min-height: var(--touch-target-min);
215
+
216
+ font-family: var(--font-family-mono);
217
+ font-size: var(--font-size-sm);
218
+ text-transform: uppercase;
219
+ text-decoration: none;
220
+ white-space: nowrap;
221
+
222
+ background: transparent;
223
+ border: none;
224
+ border-bottom: var(--border-width-thick) solid transparent;
225
+ color: var(--color-text-secondary);
226
+
227
+ cursor: pointer;
228
+ transition: all var(--transition-fast);
229
+ }
230
+
231
+ .tab:hover {
232
+ color: var(--color-text-primary);
233
+ }
234
+
235
+ .tab.active {
236
+ color: var(--color-accent-green);
237
+ border-bottom-color: var(--color-accent-green);
238
+ }
239
+
240
+ /* Tab variant - blue accent (for settings, admin, secondary pages) */
241
+ .tabs--blue .tab.active {
242
+ color: var(--color-accent-blue);
243
+ border-bottom-color: var(--color-accent-blue);
244
+ }
245
+
246
+ /* Admin Navigation - specific styling */
247
+ .admin-nav {
248
+ display: flex;
249
+ gap: var(--spacing-xs);
250
+ border-bottom: 1px solid var(--color-border);
251
+ margin-bottom: var(--spacing-xl);
252
+ overflow-x: auto;
253
+ padding: 0 var(--spacing-xl);
254
+ }
255
+
256
+ .admin-nav-item {
257
+ display: flex;
258
+ align-items: center;
259
+ padding: var(--spacing-md) var(--spacing-xl);
260
+ min-height: var(--touch-target-min);
261
+ background: transparent;
262
+ border: none;
263
+ color: var(--color-text-muted);
264
+ font-family: var(--font-family-mono);
265
+ font-size: var(--font-size-sm);
266
+ text-transform: uppercase;
267
+ letter-spacing: 1px;
268
+ text-decoration: none;
269
+ border-bottom: 2px solid transparent;
270
+ white-space: nowrap;
271
+ cursor: pointer;
272
+ transition: all var(--transition-normal);
273
+ }
274
+
275
+ .admin-nav-item:hover {
276
+ color: var(--color-text-primary);
277
+ }
278
+
279
+ .admin-nav-item.active {
280
+ color: var(--color-accent-blue);
281
+ border-bottom-color: var(--color-accent-blue);
282
+ }
283
+
284
+ /* =============================================================================
285
+ FORM CONTROLS
286
+ ============================================================================= */
287
+
288
+ .form-group {
289
+ margin-bottom: var(--spacing-lg);
290
+ }
291
+
292
+ .form-label {
293
+ display: block;
294
+ margin-bottom: var(--spacing-xs);
295
+
296
+ font-size: var(--font-size-sm);
297
+ color: var(--color-text-secondary);
298
+ text-transform: uppercase;
299
+ letter-spacing: 1px;
300
+ }
301
+
302
+ .form-hint {
303
+ margin-top: var(--spacing-xs);
304
+ font-size: var(--font-size-xs);
305
+ color: var(--color-text-muted);
306
+ font-style: italic;
307
+ }
308
+
309
+ .form-error {
310
+ margin-top: var(--spacing-xs);
311
+ font-size: var(--font-size-xs);
312
+ color: var(--color-error);
313
+ }
314
+
315
+ /* Text inputs, textareas, selects */
316
+ .form-control {
317
+ display: block;
318
+ width: 100%;
319
+ height: var(--input-height);
320
+ padding: var(--spacing-sm) var(--spacing-md);
321
+
322
+ font-family: var(--font-family-mono);
323
+ font-size: var(--font-size-sm);
324
+ color: var(--color-text-primary);
325
+
326
+ background: var(--color-bg-primary);
327
+ border: var(--border-width) solid var(--color-border);
328
+ border-radius: var(--border-radius);
329
+
330
+ transition: border-color var(--transition-fast);
331
+
332
+ -webkit-appearance: none;
333
+ -moz-appearance: none;
334
+ appearance: none;
335
+ }
336
+
337
+ .form-control:focus {
338
+ outline: none;
339
+ border-color: var(--color-accent-blue);
340
+ }
341
+
342
+ .form-control::placeholder {
343
+ color: var(--color-text-muted);
344
+ }
345
+
346
+ .form-control:disabled {
347
+ opacity: 0.5;
348
+ cursor: not-allowed;
349
+ }
350
+
351
+ /* Textarea specific */
352
+ textarea.form-control {
353
+ height: auto;
354
+ min-height: 80px;
355
+ resize: vertical;
356
+ }
357
+
358
+ /* Select specific */
359
+ select.form-control {
360
+ padding-right: 32px;
361
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23909090' d='M6 8L1 3h10z'/%3E%3C/svg%3E");
362
+ background-repeat: no-repeat;
363
+ background-position: right 10px center;
364
+ cursor: pointer;
365
+ }
366
+
367
+ /* Checkbox/Toggle */
368
+ .form-check {
369
+ display: flex;
370
+ align-items: center;
371
+ gap: var(--spacing-sm);
372
+ cursor: pointer;
373
+ }
374
+
375
+ .form-check input[type="checkbox"] {
376
+ width: 14px;
377
+ height: 14px;
378
+ accent-color: var(--color-accent-green);
379
+ cursor: pointer;
380
+ }
381
+
382
+ /* Legacy form input aliases - mapped to .form-control */
383
+ .form-input,
384
+ .search-input,
385
+ .filter-input {
386
+ display: block;
387
+ width: 100%;
388
+ height: var(--input-height);
389
+ padding: var(--spacing-sm) var(--spacing-md);
390
+ font-family: var(--font-family-mono);
391
+ font-size: var(--font-size-sm);
392
+ color: var(--color-text-primary);
393
+ background: var(--color-bg-primary);
394
+ border: var(--border-width) solid var(--color-border);
395
+ border-radius: var(--border-radius);
396
+ transition: border-color var(--transition-fast);
397
+ box-sizing: border-box;
398
+ }
399
+
400
+ .form-input:focus,
401
+ .search-input:focus,
402
+ .filter-input:focus {
403
+ outline: none;
404
+ border-color: var(--color-accent-blue);
405
+ }
406
+
407
+ /* Legacy select aliases - mapped to select.form-control */
408
+ .filter-select,
409
+ .form-select {
410
+ display: block;
411
+ height: var(--input-height);
412
+ padding: var(--spacing-sm) var(--spacing-md);
413
+ padding-right: 32px;
414
+ font-family: var(--font-family-mono);
415
+ font-size: var(--font-size-sm);
416
+ color: var(--color-text-primary);
417
+ background: var(--color-bg-primary);
418
+ border: var(--border-width) solid var(--color-border);
419
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23909090' d='M6 8L1 3h10z'/%3E%3C/svg%3E");
420
+ background-repeat: no-repeat;
421
+ background-position: right 10px center;
422
+ cursor: pointer;
423
+ -webkit-appearance: none;
424
+ -moz-appearance: none;
425
+ appearance: none;
426
+ }
427
+
428
+ .filter-select:focus,
429
+ .form-select:focus {
430
+ outline: none;
431
+ border-color: var(--color-accent-blue);
432
+ }
433
+
434
+ /* =============================================================================
435
+ CARDS
436
+ ============================================================================= */
437
+
438
+ .card {
439
+ background: var(--color-bg-terminal);
440
+ border: var(--border-width) solid var(--color-border);
441
+ padding: var(--spacing-lg);
442
+ transition: border-color var(--transition-fast);
443
+ }
444
+
445
+ .card:hover {
446
+ border-color: var(--color-accent-blue);
447
+ }
448
+
449
+ /* Card with left accent */
450
+ .card--accent {
451
+ border-left-width: var(--border-width-accent);
452
+ border-left-color: var(--color-accent-blue);
453
+ }
454
+
455
+ .card--accent-green {
456
+ border-left-color: var(--color-accent-green);
457
+ }
458
+
459
+ .card--accent-yellow {
460
+ border-left-color: var(--color-accent-yellow);
461
+ }
462
+
463
+ .card--accent-red {
464
+ border-left-color: var(--color-accent-red);
465
+ }
466
+
467
+ /* Stat card */
468
+ .card--stat {
469
+ text-align: center;
470
+ padding: var(--spacing-xl);
471
+ }
472
+
473
+ .card--stat .stat-value {
474
+ font-size: 2.5rem;
475
+ font-weight: bold;
476
+ color: var(--color-accent-green);
477
+ font-family: var(--font-family-mono);
478
+ }
479
+
480
+ .card--stat .stat-label {
481
+ font-size: var(--font-size-sm);
482
+ color: var(--color-text-muted);
483
+ text-transform: uppercase;
484
+ letter-spacing: 1px;
485
+ margin-top: var(--spacing-sm);
486
+ }
487
+
488
+ /* =============================================================================
489
+ SECTION HEADERS
490
+ ============================================================================= */
491
+
492
+ .section-header {
493
+ font-size: var(--font-size-lg);
494
+ color: var(--color-accent-blue);
495
+ text-transform: uppercase;
496
+ letter-spacing: 2px;
497
+ margin-top: var(--spacing-xl);
498
+ margin-bottom: var(--spacing-lg);
499
+ padding-bottom: var(--spacing-sm);
500
+ border-bottom: var(--border-width) solid var(--color-border);
501
+ font-weight: var(--font-weight-normal);
502
+ }
503
+
504
+ .section-header a {
505
+ font-size: var(--font-size-xs);
506
+ text-transform: none;
507
+ letter-spacing: normal;
508
+ float: right;
509
+ }
510
+
511
+ .section-header--flex {
512
+ display: flex;
513
+ justify-content: space-between;
514
+ align-items: center;
515
+ }
516
+
517
+ /* Profile section header - extends .section-header with flex layout */
518
+ .profile-section-header {
519
+ font-size: var(--font-size-lg);
520
+ color: var(--color-accent-blue);
521
+ text-transform: uppercase;
522
+ letter-spacing: 2px;
523
+ margin-top: var(--spacing-xl);
524
+ margin-bottom: var(--spacing-lg);
525
+ padding-bottom: var(--spacing-sm);
526
+ border-bottom: var(--border-width) solid var(--color-border);
527
+ font-weight: var(--font-weight-normal);
528
+ display: flex;
529
+ justify-content: space-between;
530
+ align-items: center;
531
+ }
532
+
533
+ /* =============================================================================
534
+ TABLES
535
+ ============================================================================= */
536
+
537
+ .table {
538
+ width: 100%;
539
+ border-collapse: collapse;
540
+ font-size: var(--font-size-sm);
541
+ }
542
+
543
+ .table th,
544
+ .table td {
545
+ padding: var(--spacing-md);
546
+ text-align: left;
547
+ border-bottom: var(--border-width) solid var(--color-border);
548
+ }
549
+
550
+ .table th {
551
+ background: var(--color-bg-primary);
552
+ color: var(--color-text-muted);
553
+ font-size: var(--font-size-xs);
554
+ font-weight: var(--font-weight-medium);
555
+ text-transform: uppercase;
556
+ letter-spacing: 1px;
557
+ }
558
+
559
+ .table tbody tr:hover {
560
+ background: var(--color-bg-primary);
561
+ }
562
+
563
+ /* =============================================================================
564
+ MODALS
565
+ ============================================================================= */
566
+
567
+ .modal-overlay {
568
+ position: fixed;
569
+ top: 0;
570
+ left: 0;
571
+ right: 0;
572
+ bottom: 0;
573
+ background: rgba(0, 0, 0, 0.8);
574
+ display: flex;
575
+ align-items: center;
576
+ justify-content: center;
577
+ z-index: var(--z-modal);
578
+ padding: var(--spacing-xl);
579
+ }
580
+
581
+ .modal-overlay.hidden {
582
+ display: none;
583
+ }
584
+
585
+ .modal {
586
+ background: var(--color-bg-secondary);
587
+ border: var(--border-width) solid var(--color-border);
588
+ max-width: 500px;
589
+ width: 100%;
590
+ max-height: 90vh;
591
+ overflow-y: auto;
592
+ }
593
+
594
+ .modal-header {
595
+ padding: var(--spacing-lg) var(--spacing-xl);
596
+ border-bottom: var(--border-width) solid var(--color-border);
597
+ display: flex;
598
+ justify-content: space-between;
599
+ align-items: center;
600
+ }
601
+
602
+ .modal-title {
603
+ font-size: var(--font-size-lg);
604
+ color: var(--color-accent-blue);
605
+ text-transform: uppercase;
606
+ letter-spacing: 2px;
607
+ }
608
+
609
+ .modal-close {
610
+ background: none;
611
+ border: none;
612
+ color: var(--color-text-muted);
613
+ font-size: 24px;
614
+ cursor: pointer;
615
+ padding: 0;
616
+ line-height: 1;
617
+ }
618
+
619
+ .modal-close:hover {
620
+ color: var(--color-accent-red);
621
+ }
622
+
623
+ .modal-body {
624
+ padding: var(--spacing-xl);
625
+ }
626
+
627
+ .modal-footer {
628
+ padding: var(--spacing-lg) var(--spacing-xl);
629
+ border-top: var(--border-width) solid var(--color-border);
630
+ display: flex;
631
+ justify-content: flex-end;
632
+ gap: var(--spacing-md);
633
+ }
634
+
635
+ /* =============================================================================
636
+ LOADING STATES
637
+ ============================================================================= */
638
+
639
+ .loading {
640
+ display: flex;
641
+ flex-direction: column;
642
+ align-items: center;
643
+ justify-content: center;
644
+ gap: var(--spacing-md);
645
+ padding: var(--spacing-xl);
646
+ color: var(--color-text-secondary);
647
+ font-size: var(--font-size-sm);
648
+ }
649
+
650
+ .loading-spinner {
651
+ width: 24px;
652
+ height: 24px;
653
+ border: 2px solid var(--color-border);
654
+ border-top-color: var(--color-accent-blue);
655
+ border-radius: 50%;
656
+ animation: spin 1s linear infinite;
657
+ }
658
+
659
+ @keyframes spin {
660
+ to { transform: rotate(360deg); }
661
+ }
662
+
663
+ /* Inline loading (for buttons, etc) */
664
+ .loading-inline {
665
+ display: inline-flex;
666
+ align-items: center;
667
+ gap: var(--spacing-sm);
668
+ }
669
+
670
+ .loading-inline .loading-spinner {
671
+ width: 16px;
672
+ height: 16px;
673
+ border-width: 2px;
674
+ }
675
+
676
+ /* =============================================================================
677
+ EMPTY STATES
678
+ ============================================================================= */
679
+
680
+ .empty-state {
681
+ text-align: center;
682
+ padding: 60px var(--spacing-xl);
683
+ color: var(--color-text-secondary);
684
+ display: flex;
685
+ flex-direction: column;
686
+ align-items: center;
687
+ justify-content: center;
688
+ width: 100%;
689
+ box-sizing: border-box;
690
+ }
691
+
692
+ .empty-state-icon {
693
+ font-size: 48px;
694
+ margin-bottom: var(--spacing-lg);
695
+ opacity: 0.5;
696
+ }
697
+
698
+ .empty-state-title {
699
+ font-size: var(--font-size-md);
700
+ color: var(--color-text-primary);
701
+ margin-bottom: var(--spacing-sm);
702
+ }
703
+
704
+ .empty-state-text {
705
+ font-size: var(--font-size-sm);
706
+ color: var(--color-text-muted);
707
+ }
708
+
709
+ /* Mobile empty state */
710
+ @media (max-width: 768px) {
711
+ .empty-state {
712
+ padding: 40px 16px;
713
+ }
714
+
715
+ .empty-state-icon {
716
+ font-size: 40px;
717
+ }
718
+
719
+ .empty-state-title {
720
+ font-size: var(--font-size-base);
721
+ }
722
+ }
723
+
724
+ /* =============================================================================
725
+ ALERTS / INFO BOXES
726
+ ============================================================================= */
727
+
728
+ .alert {
729
+ padding: var(--spacing-md) var(--spacing-lg);
730
+ border-left: var(--border-width-accent) solid var(--color-accent-blue);
731
+ background: var(--color-bg-primary);
732
+ font-size: var(--font-size-sm);
733
+ margin-bottom: var(--spacing-lg);
734
+ }
735
+
736
+ .alert--success {
737
+ border-left-color: var(--color-accent-green);
738
+ }
739
+
740
+ .alert--warning {
741
+ border-left-color: var(--color-accent-yellow);
742
+ }
743
+
744
+ .alert--error {
745
+ border-left-color: var(--color-accent-red);
746
+ }
747
+
748
+ /* =============================================================================
749
+ BADGES
750
+ ============================================================================= */
751
+
752
+ .badge {
753
+ display: inline-block;
754
+ padding: 2px 8px;
755
+ font-size: var(--font-size-xs);
756
+ font-weight: var(--font-weight-medium);
757
+ text-transform: uppercase;
758
+ }
759
+
760
+ .badge-primary {
761
+ background: var(--color-accent-blue);
762
+ color: var(--color-bg-primary);
763
+ }
764
+
765
+ .badge-success {
766
+ background: var(--color-accent-green);
767
+ color: var(--color-bg-primary);
768
+ }
769
+
770
+ .badge-warning {
771
+ background: var(--color-accent-yellow);
772
+ color: var(--color-bg-primary);
773
+ }
774
+
775
+ .badge-danger {
776
+ background: var(--color-accent-red);
777
+ color: var(--color-bg-primary);
778
+ }
779
+
780
+ .badge-muted {
781
+ background: var(--color-text-muted);
782
+ color: var(--color-bg-primary);
783
+ }
784
+
785
+ /* =============================================================================
786
+ PAGINATION
787
+ ============================================================================= */
788
+
789
+ .pagination {
790
+ display: flex;
791
+ justify-content: space-between;
792
+ align-items: center;
793
+ padding: var(--spacing-lg) 0;
794
+ font-size: var(--font-size-sm);
795
+ }
796
+
797
+ .pagination-info {
798
+ color: var(--color-text-muted);
799
+ }
800
+
801
+ .pagination-controls {
802
+ display: flex;
803
+ gap: var(--spacing-sm);
804
+ }
805
+
806
+ /* =============================================================================
807
+ UTILITY CLASSES
808
+ ============================================================================= */
809
+
810
+ /* Text utilities */
811
+ .text-muted { color: var(--color-text-muted); }
812
+ .text-success { color: var(--color-accent-green); }
813
+ .text-error { color: var(--color-accent-red); }
814
+ .text-warning { color: var(--color-accent-yellow); }
815
+ .text-info { color: var(--color-accent-blue); }
816
+ .text-center { text-align: center; }
817
+ .text-right { text-align: right; }
818
+
819
+ .font-mono { font-family: var(--font-family-mono); }
820
+ .font-bold { font-weight: var(--font-weight-bold); }
821
+
822
+ /* Display utilities */
823
+ .hidden { display: none !important; }
824
+ .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0,0,0,0); border: 0; }
825
+
826
+ /* Flex utilities */
827
+ .flex { display: flex; }
828
+ .flex-1 { flex: 1; }
829
+ .flex-col { flex-direction: column; }
830
+ .flex-wrap { flex-wrap: wrap; }
831
+ .items-center { align-items: center; }
832
+ .items-start { align-items: flex-start; }
833
+ .justify-between { justify-content: space-between; }
834
+ .justify-center { justify-content: center; }
835
+ .gap-xs { gap: var(--spacing-xs); }
836
+ .gap-sm { gap: var(--spacing-sm); }
837
+ .gap-md { gap: var(--spacing-md); }
838
+ .gap-lg { gap: var(--spacing-lg); }
839
+
840
+ /* Spacing utilities */
841
+ .mt-xs { margin-top: var(--spacing-xs); }
842
+ .mt-sm { margin-top: var(--spacing-sm); }
843
+ .mt-md { margin-top: var(--spacing-md); }
844
+ .mt-lg { margin-top: var(--spacing-lg); }
845
+ .mb-xs { margin-bottom: var(--spacing-xs); }
846
+ .mb-sm { margin-bottom: var(--spacing-sm); }
847
+ .mb-md { margin-bottom: var(--spacing-md); }
848
+ .mb-lg { margin-bottom: var(--spacing-lg); }
849
+ .mr-sm { margin-right: var(--spacing-sm); }
850
+ .mr-md { margin-right: var(--spacing-md); }
851
+ .ml-auto { margin-left: auto; }
852
+ .mr-auto { margin-right: auto; }
853
+
854
+ /* Overflow utilities */
855
+ .overflow-x-auto { overflow-x: auto; }
856
+ .overflow-y-auto { overflow-y: auto; }
857
+ .overflow-hidden { overflow: hidden; }
858
+
859
+ /* Cursor utilities */
860
+ .cursor-pointer { cursor: pointer; }
861
+ .select-none { user-select: none; }
862
+
863
+ /* Border utilities */
864
+ .border-none { border: none; }
865
+ .p-0 { padding: 0; }
866
+ .pt-md { padding-top: var(--spacing-md); }
867
+
868
+ /* =============================================================================
869
+ LAYOUT CONTAINERS - UNIFIED WIDTH SYSTEM
870
+ All pages use the same content zone width for consistency
871
+ ============================================================================= */
872
+
873
+ .container {
874
+ /* ALL containers are full-width - content width is controlled inside */
875
+ max-width: none;
876
+ width: 100%;
877
+ margin: 0;
878
+ padding: 0;
879
+ flex: 1;
880
+ display: flex;
881
+ flex-direction: column;
882
+ min-height: 0;
883
+ }
884
+
885
+ /* Legacy class - now behaves same as default */
886
+ .container--fullwidth {
887
+ max-width: none;
888
+ padding: 0;
889
+ }
890
+
891
+ /* Mobile: Consistent full-width behavior */
892
+ @media (max-width: 768px) {
893
+ .container {
894
+ padding: 0;
895
+ max-width: 100%;
896
+ }
897
+ }
898
+
899
+ .main-content {
900
+ flex: 1;
901
+ display: flex;
902
+ flex-direction: column;
903
+ min-height: 0;
904
+ }
905
+
906
+ /* =============================================================================
907
+ ERROR PAGE STYLES
908
+ ============================================================================= */
909
+
910
+ .error-screen {
911
+ min-height: 100vh;
912
+ display: flex;
913
+ align-items: center;
914
+ justify-content: center;
915
+ padding: var(--spacing-xl);
916
+ background: var(--color-bg-primary);
917
+ }
918
+
919
+ .error-box {
920
+ background: var(--color-bg-terminal);
921
+ border: 1px solid var(--color-accent-red);
922
+ max-width: 800px;
923
+ width: 100%;
924
+ }
925
+
926
+ .error-header {
927
+ background: var(--color-accent-red);
928
+ color: var(--color-bg-primary);
929
+ padding: var(--spacing-md) var(--spacing-lg);
930
+ font-family: var(--font-family-mono);
931
+ font-size: var(--font-size-lg);
932
+ font-weight: bold;
933
+ text-transform: uppercase;
934
+ letter-spacing: 2px;
935
+ }
936
+
937
+ .error-body {
938
+ padding: var(--spacing-xl);
939
+ }
940
+
941
+ /* Base error message - used across all pages */
942
+ .error-message {
943
+ display: flex;
944
+ align-items: flex-start;
945
+ gap: var(--spacing-sm);
946
+ font-size: var(--font-size-sm);
947
+ color: var(--color-accent-red);
948
+ font-family: var(--font-family-mono);
949
+ white-space: pre-wrap;
950
+ word-break: break-word;
951
+ line-height: var(--line-height-normal);
952
+ }
953
+
954
+ /* Block-style error with background */
955
+ .error-message--block {
956
+ margin-bottom: var(--spacing-lg);
957
+ padding: var(--spacing-md);
958
+ background: var(--error-bg);
959
+ border-left: var(--border-width-accent) solid var(--color-accent-red);
960
+ }
961
+
962
+ /* Inline error for form fields */
963
+ .error-message--inline {
964
+ font-size: var(--font-size-xs);
965
+ margin-top: var(--spacing-xs);
966
+ }
967
+
968
+ .error-details {
969
+ font-size: var(--font-size-sm);
970
+ color: var(--color-text-secondary);
971
+ margin-bottom: var(--spacing-lg);
972
+ font-family: var(--font-family-mono);
973
+ }
974
+
975
+ .error-prefix {
976
+ color: var(--color-accent-red);
977
+ margin-right: var(--spacing-sm);
978
+ }
979
+
980
+ .error-section {
981
+ margin-bottom: var(--spacing-lg);
982
+ padding: var(--spacing-md);
983
+ background: var(--color-bg-primary);
984
+ border: 1px solid var(--color-border);
985
+ }
986
+
987
+ .error-section .section-title {
988
+ color: var(--color-accent-blue);
989
+ font-size: var(--font-size-xs);
990
+ text-transform: uppercase;
991
+ letter-spacing: 1px;
992
+ margin-bottom: var(--spacing-sm);
993
+ }
994
+
995
+ .error-section .section-content {
996
+ font-family: var(--font-family-mono);
997
+ font-size: var(--font-size-sm);
998
+ color: var(--color-text-secondary);
999
+ white-space: pre-wrap;
1000
+ }
1001
+
1002
+ .error-actions {
1003
+ margin-top: var(--spacing-xl);
1004
+ display: flex;
1005
+ gap: var(--spacing-md);
1006
+ flex-wrap: wrap;
1007
+ }
1008
+
1009
+ .action-btn {
1010
+ display: inline-flex;
1011
+ align-items: center;
1012
+ padding: var(--spacing-sm) var(--spacing-lg);
1013
+ background: transparent;
1014
+ border: 1px solid var(--color-border);
1015
+ color: var(--color-text-primary);
1016
+ font-family: var(--font-family-mono);
1017
+ font-size: var(--font-size-sm);
1018
+ cursor: pointer;
1019
+ transition: all var(--transition-fast);
1020
+ }
1021
+
1022
+ .action-btn:hover {
1023
+ border-color: var(--color-accent-blue);
1024
+ color: var(--color-accent-blue);
1025
+ }
1026
+
1027
+ .action-btn:disabled {
1028
+ opacity: 0.5;
1029
+ cursor: not-allowed;
1030
+ }
1031
+
1032
+ .action-link {
1033
+ display: inline-flex;
1034
+ align-items: center;
1035
+ padding: var(--spacing-sm) var(--spacing-lg);
1036
+ border: 1px solid var(--color-accent-green);
1037
+ color: var(--color-accent-green);
1038
+ text-decoration: none;
1039
+ font-family: var(--font-family-mono);
1040
+ font-size: var(--font-size-sm);
1041
+ transition: all var(--transition-fast);
1042
+ }
1043
+
1044
+ .action-link:hover {
1045
+ background: rgba(86, 226, 194, 0.1);
1046
+ }
1047
+
1048
+ .action-prefix {
1049
+ color: var(--color-accent-green);
1050
+ margin-right: var(--spacing-sm);
1051
+ }
1052
+
1053
+ .troubleshooting-hints {
1054
+ display: flex;
1055
+ flex-direction: column;
1056
+ gap: var(--spacing-sm);
1057
+ }
1058
+
1059
+ .troubleshooting-hint {
1060
+ padding: var(--spacing-sm);
1061
+ background: var(--color-bg-secondary);
1062
+ font-size: var(--font-size-sm);
1063
+ color: var(--color-text-secondary);
1064
+ }
1065
+
1066
+ /* =============================================================================
1067
+ PROGRESS BAR
1068
+ ============================================================================= */
1069
+
1070
+ .upload-progress {
1071
+ padding: var(--spacing-sm) var(--spacing-md);
1072
+ background: var(--color-bg-primary);
1073
+ border-top: 1px solid var(--color-border);
1074
+ }
1075
+
1076
+ .progress-bar-container {
1077
+ height: 4px;
1078
+ background: var(--color-border);
1079
+ margin-bottom: var(--spacing-xs);
1080
+ }
1081
+
1082
+ .progress-bar {
1083
+ height: 100%;
1084
+ background: var(--color-accent-blue);
1085
+ transition: width var(--transition-fast);
1086
+ }
1087
+
1088
+ .progress-text {
1089
+ font-size: var(--font-size-xs);
1090
+ color: var(--color-text-muted);
1091
+ }
1092
+
1093
+ /* =============================================================================
1094
+ SPINNER (Legacy alias for .loading-spinner)
1095
+ ============================================================================= */
1096
+
1097
+ .spinner {
1098
+ display: inline-block;
1099
+ width: 14px;
1100
+ height: 14px;
1101
+ border: 2px solid var(--color-border);
1102
+ border-top-color: var(--color-accent-blue);
1103
+ border-radius: 50%;
1104
+ animation: spin 1s linear infinite;
1105
+ margin-right: var(--spacing-sm);
1106
+ vertical-align: middle;
1107
+ }
1108
+
1109
+ /* Loading state container (for session list, etc) */
1110
+ .loading-state {
1111
+ display: flex;
1112
+ flex-direction: column;
1113
+ align-items: center;
1114
+ justify-content: center;
1115
+ padding: var(--spacing-2xl);
1116
+ color: var(--color-text-secondary);
1117
+ gap: var(--spacing-md);
1118
+ }
1119
+
1120
+ /* =============================================================================
1121
+ MISC CONTAINERS
1122
+ ============================================================================= */
1123
+
1124
+ /* Vision controls in sidebar */
1125
+ .vision-controls {
1126
+ display: flex;
1127
+ gap: var(--spacing-sm);
1128
+ align-items: center;
1129
+ }
1130
+
1131
+ /* Feed items container */
1132
+ .feed-items-container {
1133
+ display: flex;
1134
+ flex-direction: column;
1135
+ gap: var(--spacing-sm);
1136
+ }
1137
+
1138
+ /* Button add modifier */
1139
+ .btn-add {
1140
+ font-size: var(--font-size-sm);
1141
+ padding: 6px 12px;
1142
+ text-transform: none;
1143
+ letter-spacing: normal;
1144
+ }
1145
+
1146
+ /* Action button (admin forms) */
1147
+ .btn-action {
1148
+ display: inline-flex;
1149
+ align-items: center;
1150
+ justify-content: center;
1151
+ gap: var(--spacing-sm);
1152
+ padding: var(--spacing-sm) var(--spacing-md);
1153
+ height: var(--button-height);
1154
+ font-family: var(--font-family-mono);
1155
+ font-size: var(--font-size-xs);
1156
+ text-transform: uppercase;
1157
+ background: transparent;
1158
+ border: 1px solid var(--color-border);
1159
+ color: var(--color-text-primary);
1160
+ cursor: pointer;
1161
+ transition: all var(--transition-fast);
1162
+ }
1163
+
1164
+ .btn-action:hover:not(:disabled) {
1165
+ border-color: var(--color-accent-blue);
1166
+ color: var(--color-accent-blue);
1167
+ }
1168
+
1169
+ .btn-action:disabled {
1170
+ opacity: 0.4;
1171
+ cursor: not-allowed;
1172
+ }
1173
+
1174
+ .btn-action.btn-success {
1175
+ border-color: var(--color-accent-green);
1176
+ color: var(--color-accent-green);
1177
+ }
1178
+
1179
+ .btn-action.btn-success:hover:not(:disabled) {
1180
+ background: rgba(86, 226, 194, 0.1);
1181
+ }
1182
+
1183
+ .btn-action.btn-danger {
1184
+ border-color: var(--color-accent-red);
1185
+ color: var(--color-accent-red);
1186
+ }
1187
+
1188
+ .btn-action.btn-danger:hover:not(:disabled) {
1189
+ background: rgba(255, 94, 94, 0.1);
1190
+ }