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,1772 @@
1
+ /**
2
+ * Chat Tab Styling
3
+ *
4
+ * Chat-style interface for task agent WebView
5
+ */
6
+
7
+ /* Chat Tab Container */
8
+ #chat-tab {
9
+ flex: 1;
10
+ min-height: 0;
11
+ display: flex;
12
+ flex-direction: column;
13
+ background-color: var(--color-bg-terminal);
14
+ position: relative;
15
+ overflow: hidden;
16
+ box-sizing: border-box;
17
+ }
18
+
19
+ /* Chat terminal container - special layout for chat with input at bottom */
20
+ .chat-terminal {
21
+ flex: 1;
22
+ min-height: 0;
23
+ display: flex;
24
+ flex-direction: column;
25
+ padding: 0;
26
+ margin: 0;
27
+ border: none;
28
+ box-shadow: none;
29
+ overflow: hidden;
30
+ width: 100%;
31
+ box-sizing: border-box;
32
+ background-color: var(--color-bg-terminal);
33
+ align-items: stretch;
34
+ }
35
+
36
+ /* Ensure chat tab content only shows when tab is active */
37
+ #chat-tab:not(.active) {
38
+ display: none !important;
39
+ }
40
+
41
+ #chat-tab.active {
42
+ display: flex !important;
43
+ }
44
+
45
+ /* Chat Messages Container - IRC Style */
46
+ .chat-container {
47
+ flex: 1;
48
+ min-height: 0;
49
+ overflow-y: auto;
50
+ padding: var(--spacing-sm) var(--spacing-md);
51
+ display: flex;
52
+ flex-direction: column;
53
+ align-items: stretch;
54
+ justify-content: flex-start;
55
+ gap: 2px;
56
+ scroll-behavior: smooth;
57
+ font-family: var(--code-font);
58
+ font-size: var(--font-size-sm);
59
+ line-height: var(--line-height-relaxed);
60
+ width: 100%;
61
+ box-sizing: border-box;
62
+ }
63
+
64
+ /* IRC-style message wrapper - no boxes, just lines */
65
+ .chat-message {
66
+ width: 100%;
67
+ padding: 2px 0;
68
+ animation: none;
69
+ opacity: 1;
70
+ transition: none;
71
+ background: transparent;
72
+ align-self: stretch;
73
+ }
74
+
75
+ /* Empty State */
76
+ .chat-empty-state {
77
+ display: flex;
78
+ flex-direction: column;
79
+ align-items: center;
80
+ justify-content: center;
81
+ height: 100%;
82
+ color: var(--color-text-muted);
83
+ gap: var(--spacing-md);
84
+ }
85
+
86
+ .chat-empty-state-icon {
87
+ font-size: 48px;
88
+ opacity: 0.5;
89
+ }
90
+
91
+ .chat-empty-state-text {
92
+ font-size: var(--font-size-md);
93
+ }
94
+
95
+ @keyframes messageSlideIn {
96
+ from {
97
+ opacity: 0;
98
+ transform: translateY(10px);
99
+ }
100
+ to {
101
+ opacity: 1;
102
+ transform: translateY(0);
103
+ }
104
+ }
105
+
106
+ /* IRC-style messages - inline format like: [user] message text */
107
+ .user-message,
108
+ .agent-message,
109
+ .system-message {
110
+ padding: 0;
111
+ margin: 0;
112
+ background: transparent;
113
+ }
114
+
115
+ /* IRC prefix style - [time] <user> message */
116
+ .message-header {
117
+ display: inline;
118
+ margin: 0;
119
+ padding: 0;
120
+ font-size: var(--font-size-sm);
121
+ font-family: var(--code-font);
122
+ }
123
+
124
+ .message-time {
125
+ color: var(--color-text-muted);
126
+ opacity: 0.6;
127
+ font-size: var(--font-size-xs);
128
+ }
129
+
130
+ .message-author {
131
+ font-weight: 600;
132
+ text-transform: lowercase;
133
+ letter-spacing: 0;
134
+ margin: 0 6px;
135
+ }
136
+
137
+ .user-message .message-author {
138
+ color: var(--color-accent-blue);
139
+ }
140
+
141
+ .agent-message .message-author {
142
+ color: var(--color-accent-green);
143
+ }
144
+
145
+ .system-message .message-author {
146
+ color: var(--color-accent-yellow);
147
+ }
148
+
149
+ .system-message-content {
150
+ display: inline;
151
+ color: var(--color-accent-yellow);
152
+ font-family: var(--code-font);
153
+ background: transparent;
154
+ padding: 0;
155
+ }
156
+
157
+ /* Cancelled message state - shows message was interrupted */
158
+ .message-cancelled {
159
+ opacity: 0.7;
160
+ }
161
+
162
+ .message-cancelled .message-author::after {
163
+ content: " [cancelled]";
164
+ color: var(--color-accent-yellow);
165
+ font-weight: normal;
166
+ font-size: var(--font-size-xs);
167
+ }
168
+
169
+ .message-cancelled .thinking-dots,
170
+ .message-cancelled .step-thinking-dots {
171
+ display: none;
172
+ }
173
+
174
+ /* Message Content - IRC inline style */
175
+ .message-content {
176
+ display: inline;
177
+ font-size: var(--font-size-sm);
178
+ line-height: var(--line-height-relaxed);
179
+ color: var(--color-text-primary);
180
+ white-space: pre-wrap;
181
+ word-break: break-word;
182
+ font-family: var(--code-font);
183
+ margin-left: var(--spacing-xs);
184
+ }
185
+
186
+ /* Thinking Section - IRC inline style with prefix */
187
+ .message-thinking {
188
+ display: inline;
189
+ margin: 0;
190
+ padding: 0;
191
+ }
192
+
193
+ .thinking-header {
194
+ display: inline;
195
+ margin: 0;
196
+ padding: 0;
197
+ font-size: var(--font-size-xs);
198
+ color: var(--color-text-muted);
199
+ opacity: 0.7;
200
+ font-family: var(--code-font);
201
+ }
202
+
203
+ .thinking-icon {
204
+ display: none;
205
+ }
206
+
207
+ .thinking-cursor {
208
+ animation: blink 1s infinite;
209
+ color: var(--color-accent-green);
210
+ margin-left: 2px;
211
+ }
212
+
213
+ @keyframes blink {
214
+ 0%, 50% { opacity: 1; }
215
+ 51%, 100% { opacity: 0; }
216
+ }
217
+
218
+ /* Animated thinking text - shimmer effect */
219
+ .thinking-text {
220
+ display: inline-block;
221
+ color: var(--color-accent-green);
222
+ position: relative;
223
+ background: linear-gradient(
224
+ 90deg,
225
+ var(--color-accent-green) 0%,
226
+ var(--color-accent-green) 40%,
227
+ #fff 50%,
228
+ var(--color-accent-green) 60%,
229
+ var(--color-accent-green) 100%
230
+ );
231
+ background-size: 200% 100%;
232
+ -webkit-background-clip: text;
233
+ background-clip: text;
234
+ -webkit-text-fill-color: transparent;
235
+ animation: textShimmer 2.5s ease-in-out infinite;
236
+ text-shadow: none;
237
+ }
238
+
239
+ @keyframes textShimmer {
240
+ 0% { background-position: 100% 0; }
241
+ 100% { background-position: -100% 0; }
242
+ }
243
+
244
+ /* Animated thinking dots - enhanced with glow */
245
+ .thinking-dots {
246
+ display: inline-block;
247
+ margin-left: 4px;
248
+ position: relative;
249
+ }
250
+
251
+ .thinking-dots span {
252
+ display: inline-block;
253
+ color: var(--color-accent-green);
254
+ text-shadow: 0 0 8px rgba(86, 226, 194, 0.6), 0 0 16px rgba(86, 226, 194, 0.3);
255
+ animation: dotGlow 1.4s infinite ease-in-out;
256
+ }
257
+
258
+ .thinking-dots span:nth-child(1) { animation-delay: 0s; }
259
+ .thinking-dots span:nth-child(2) { animation-delay: 0.15s; }
260
+ .thinking-dots span:nth-child(3) { animation-delay: 0.3s; }
261
+
262
+ @keyframes dotGlow {
263
+ 0%, 100% {
264
+ opacity: 0.3;
265
+ text-shadow: 0 0 4px rgba(86, 226, 194, 0.3);
266
+ transform: translateY(0);
267
+ }
268
+ 50% {
269
+ opacity: 1;
270
+ text-shadow: 0 0 12px rgba(86, 226, 194, 0.9), 0 0 24px rgba(86, 226, 194, 0.5);
271
+ transform: translateY(-1px);
272
+ }
273
+ }
274
+
275
+ /* Simple thinking dots at bottom of steps - matches main thinking style */
276
+ .step-thinking-dots {
277
+ display: block;
278
+ color: var(--color-text-muted);
279
+ font-size: var(--font-size-sm);
280
+ margin-top: 8px;
281
+ margin-left: 12px;
282
+ opacity: 0.7;
283
+ }
284
+
285
+ .thinking-content {
286
+ display: inline;
287
+ font-size: var(--font-size-sm);
288
+ line-height: 1.6;
289
+ color: var(--color-text-secondary);
290
+ font-style: italic;
291
+ white-space: pre-wrap;
292
+ opacity: 0.9;
293
+ margin-left: 4px;
294
+ }
295
+
296
+ /* ESC hint - minimal */
297
+ .esc-hint {
298
+ font-size: 10px;
299
+ color: var(--color-text-muted);
300
+ opacity: 0.4;
301
+ margin-left: 6px;
302
+ font-style: italic;
303
+ }
304
+
305
+
306
+ /* Message Result */
307
+ .message-result {
308
+ margin-top: var(--spacing-md);
309
+ padding: var(--spacing-md);
310
+ background: rgba(86, 226, 194, 0.05);
311
+ border-radius: var(--border-radius-sm);
312
+ border-left: var(--border-width-accent) solid var(--color-accent-green);
313
+ font-size: var(--font-size-base);
314
+ line-height: var(--line-height-relaxed);
315
+ }
316
+
317
+ /* Message Errors */
318
+ .message-errors {
319
+ margin-top: var(--spacing-md);
320
+ padding: var(--spacing-md);
321
+ background: rgba(255, 94, 94, 0.05);
322
+ border-radius: var(--border-radius-sm);
323
+ border-left: var(--border-width-accent) solid var(--color-accent-red);
324
+ }
325
+
326
+ .error-item {
327
+ padding: 4px 0;
328
+ color: var(--color-accent-red);
329
+ font-size: var(--font-size-sm);
330
+ }
331
+
332
+ /* Chat Input - Minimal terminal style */
333
+ /* Base styles apply to all viewports */
334
+ #chat-tab .chat-input-container {
335
+ width: 100%;
336
+ border-top: 1px solid var(--color-border);
337
+ padding: 6px 8px;
338
+ background: var(--color-bg-terminal);
339
+ position: relative;
340
+ box-sizing: border-box;
341
+ flex-shrink: 0;
342
+ }
343
+
344
+ /* Readonly notice overlay for non-owners */
345
+ .readonly-notice {
346
+ position: absolute;
347
+ bottom: 0;
348
+ left: 0;
349
+ right: 0;
350
+ padding: var(--spacing-md);
351
+ background: rgba(26, 26, 26, 0.98);
352
+ border-top: 2px solid rgba(255, 193, 7, 0.5);
353
+ color: var(--color-accent-yellow);
354
+ font-size: var(--font-size-sm);
355
+ text-align: center;
356
+ z-index: 1000;
357
+ backdrop-filter: blur(4px);
358
+ }
359
+
360
+ #readonly-notice {
361
+ position: absolute !important;
362
+ bottom: 0 !important;
363
+ left: 0 !important;
364
+ right: 0 !important;
365
+ z-index: 1000 !important;
366
+ pointer-events: all !important;
367
+ }
368
+
369
+ #chat-tab:not(.active) .chat-input-container {
370
+ display: none !important;
371
+ }
372
+
373
+ #chat-tab .chat-input-wrapper {
374
+ width: 100%;
375
+ display: flex;
376
+ gap: 8px;
377
+ align-items: flex-end;
378
+ }
379
+
380
+ #chat-tab .upload-btn {
381
+ display: flex;
382
+ align-items: center;
383
+ justify-content: center;
384
+ min-width: 44px; /* Increased from 36px for mobile touch targets */
385
+ min-height: 44px; /* Increased from 28px for mobile touch targets */
386
+ background: transparent;
387
+ border: 1px solid var(--color-border);
388
+ border-radius: 4px;
389
+ color: var(--color-text-primary);
390
+ cursor: pointer;
391
+ transition: all 0.2s ease;
392
+ padding: 0;
393
+ position: relative;
394
+ flex-shrink: 0;
395
+ }
396
+
397
+ #chat-tab .upload-btn:hover:not(:disabled) {
398
+ background: transparent;
399
+ color: var(--color-accent-blue);
400
+ border-color: var(--color-accent-blue);
401
+ }
402
+
403
+ #chat-tab .upload-btn:active:not(:disabled) {
404
+ transform: scale(0.98);
405
+ }
406
+
407
+ #chat-tab .upload-btn:disabled {
408
+ border-color: var(--color-border);
409
+ color: var(--color-text-muted);
410
+ cursor: not-allowed;
411
+ opacity: 0.3;
412
+ }
413
+
414
+ #chat-tab .upload-btn svg {
415
+ width: 16px;
416
+ height: 16px;
417
+ }
418
+
419
+ /* File count badge */
420
+ #chat-tab .file-count-badge {
421
+ position: absolute;
422
+ top: -4px;
423
+ right: -4px;
424
+ background: var(--color-accent-blue);
425
+ color: white;
426
+ font-size: 9px;
427
+ font-weight: bold;
428
+ padding: 2px 5px;
429
+ border-radius: 10px;
430
+ min-width: 16px;
431
+ text-align: center;
432
+ line-height: 1;
433
+ }
434
+
435
+ /* File attachment chips container */
436
+ #chat-tab .attached-files-container {
437
+ padding: 8px 0;
438
+ margin-top: 8px;
439
+ border-top: 1px solid var(--color-border);
440
+ }
441
+
442
+ #chat-tab .attached-files-label {
443
+ font-size: 10px;
444
+ color: var(--color-text-muted);
445
+ margin-bottom: 6px;
446
+ text-transform: uppercase;
447
+ letter-spacing: 0.5px;
448
+ }
449
+
450
+ #chat-tab .attached-files-list {
451
+ display: flex;
452
+ flex-wrap: wrap;
453
+ gap: 6px;
454
+ }
455
+
456
+ /* Individual file chip */
457
+ .file-chip {
458
+ display: inline-flex;
459
+ align-items: center;
460
+ gap: 6px;
461
+ padding: 4px 8px 4px 6px;
462
+ background: var(--card-background);
463
+ border: 1px solid var(--color-border);
464
+ border-radius: 4px;
465
+ font-size: var(--font-size-xs);
466
+ max-width: 250px;
467
+ }
468
+
469
+ .file-chip.large-file {
470
+ border-color: var(--color-accent-orange);
471
+ }
472
+
473
+ .file-icon {
474
+ font-size: var(--font-size-base);
475
+ line-height: 1;
476
+ }
477
+
478
+ .file-info {
479
+ display: flex;
480
+ flex-direction: column;
481
+ gap: 2px;
482
+ min-width: 0;
483
+ flex: 1;
484
+ }
485
+
486
+ .file-name {
487
+ color: var(--color-text-primary);
488
+ font-weight: 500;
489
+ white-space: nowrap;
490
+ overflow: hidden;
491
+ text-overflow: ellipsis;
492
+ }
493
+
494
+ .file-size {
495
+ color: var(--color-text-muted);
496
+ font-size: 10px;
497
+ }
498
+
499
+ .file-remove {
500
+ background: none;
501
+ border: none;
502
+ color: var(--color-text-muted);
503
+ cursor: pointer;
504
+ padding: 0 2px;
505
+ font-size: 16px;
506
+ line-height: 1;
507
+ transition: color 0.2s;
508
+ }
509
+
510
+ .file-remove:hover {
511
+ color: var(--color-accent-red);
512
+ }
513
+
514
+ #chat-tab #chat-input {
515
+ flex: 1;
516
+ background: transparent;
517
+ border: none;
518
+ border-bottom: 1px solid var(--color-border);
519
+ border-radius: 0;
520
+ color: var(--color-text-primary);
521
+ font-family: var(--code-font);
522
+ font-size: var(--font-size-sm);
523
+ padding: 4px 8px;
524
+ resize: none;
525
+ min-height: 28px;
526
+ max-height: 200px;
527
+ height: 28px;
528
+ overflow-y: auto;
529
+ transition: border-color 0.15s;
530
+ line-height: 1.4;
531
+ }
532
+
533
+ #chat-tab #chat-input:focus {
534
+ outline: none;
535
+ border-bottom-color: var(--color-accent-blue);
536
+ }
537
+
538
+ #chat-tab #chat-input::placeholder {
539
+ color: var(--color-text-muted);
540
+ opacity: 0.4;
541
+ }
542
+
543
+ #chat-tab #chat-send-btn {
544
+ background: transparent;
545
+ border: 1px solid var(--color-border);
546
+ color: var(--color-text-primary);
547
+ padding: 8px 16px; /* Increased from 4px 12px for mobile touch targets */
548
+ font-size: var(--font-size-xs);
549
+ font-family: var(--code-font);
550
+ font-weight: 400;
551
+ cursor: pointer;
552
+ transition: all 0.15s;
553
+ text-transform: uppercase;
554
+ letter-spacing: 0.5px;
555
+ white-space: nowrap;
556
+ min-height: 44px; /* Increased from 28px for mobile touch targets */
557
+ flex-shrink: 0;
558
+ }
559
+
560
+ #chat-tab #chat-send-btn:hover:not(:disabled) {
561
+ border-color: var(--color-accent-green);
562
+ color: var(--color-accent-green);
563
+ }
564
+
565
+ #chat-tab #chat-send-btn:active:not(:disabled) {
566
+ transform: scale(0.98);
567
+ }
568
+
569
+ #chat-tab #chat-send-btn:disabled {
570
+ border-color: var(--color-border);
571
+ color: var(--color-text-muted);
572
+ cursor: not-allowed;
573
+ opacity: 0.3;
574
+ }
575
+
576
+ /* Agent Activity Status Bar - REMOVED (replaced by inline thinking message) */
577
+
578
+ /* Scroll to Bottom Button */
579
+ #chat-tab #scroll-to-bottom {
580
+ position: absolute;
581
+ bottom: 90px;
582
+ right: 30px;
583
+ padding: 10px 16px;
584
+ background: var(--color-accent-blue);
585
+ color: var(--primary-bg);
586
+ border-radius: 20px;
587
+ font-size: var(--font-size-sm);
588
+ cursor: pointer;
589
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
590
+ display: none;
591
+ transition: background 0.2s, transform 0.1s;
592
+ z-index: 10;
593
+ }
594
+
595
+ #chat-tab #scroll-to-bottom:hover {
596
+ background: var(--color-accent-green);
597
+ transform: scale(1.05);
598
+ }
599
+
600
+ /* Mobile Responsive */
601
+ @media (max-width: 768px) {
602
+ /* Chat tab - full width on mobile */
603
+ #chat-tab {
604
+ width: 100% !important;
605
+ max-width: 100% !important;
606
+ padding: 0 !important;
607
+ }
608
+
609
+ /* Chat terminal - full width */
610
+ #chat-tab .chat-terminal {
611
+ width: 100% !important;
612
+ max-width: 100% !important;
613
+ }
614
+
615
+ #chat-tab .chat-container {
616
+ /* Apply safe-area padding for content, not body */
617
+ padding: 8px max(6px, env(safe-area-inset-right)) 70px max(6px, env(safe-area-inset-left));
618
+ gap: 8px;
619
+ width: 100% !important;
620
+ max-width: 100% !important;
621
+ box-sizing: border-box;
622
+ }
623
+
624
+ #chat-tab .chat-message {
625
+ padding: 6px 0;
626
+ width: 100%;
627
+ max-width: 100%;
628
+ word-wrap: break-word;
629
+ overflow-wrap: break-word;
630
+ }
631
+
632
+ #chat-tab .message-header {
633
+ flex-wrap: wrap;
634
+ gap: 4px;
635
+ }
636
+
637
+ #chat-tab .message-content {
638
+ word-break: break-word;
639
+ overflow-wrap: break-word;
640
+ max-width: 100%;
641
+ }
642
+
643
+ #chat-tab .params-table {
644
+ font-size: var(--font-size-xs);
645
+ width: 100%;
646
+ max-width: 100%;
647
+ table-layout: fixed;
648
+ }
649
+
650
+ #chat-tab .param-name {
651
+ width: 35%;
652
+ }
653
+
654
+ #chat-tab .param-value {
655
+ word-break: break-word;
656
+ overflow-wrap: break-word;
657
+ }
658
+
659
+ #chat-tab .chat-input-container {
660
+ position: fixed !important;
661
+ bottom: 0 !important;
662
+ left: 0 !important;
663
+ right: 0 !important;
664
+ /* Let left:0 + right:0 determine width - cleaner than 100vw */
665
+ width: auto !important;
666
+ max-width: none !important;
667
+ margin: 0 !important;
668
+ /* Apply safe-area padding inside the container */
669
+ padding: 6px max(8px, env(safe-area-inset-right)) max(6px, env(safe-area-inset-bottom)) max(8px, env(safe-area-inset-left)) !important;
670
+ background: var(--color-bg-terminal);
671
+ border-top: 1px solid var(--color-border);
672
+ z-index: 200;
673
+ box-sizing: border-box;
674
+ /* Ensure no inherited transforms affect fixed positioning */
675
+ transform: none !important;
676
+ }
677
+
678
+ #chat-tab .chat-input-wrapper {
679
+ display: flex;
680
+ gap: 6px;
681
+ align-items: flex-end;
682
+ flex-wrap: nowrap;
683
+ width: 100%;
684
+ }
685
+
686
+ #chat-tab #chat-input {
687
+ flex: 1;
688
+ min-width: 0;
689
+ max-height: 120px;
690
+ overflow-y: auto;
691
+ font-size: 16px; /* Prevent iOS zoom on focus */
692
+ }
693
+
694
+ /* File attachment chips - proper wrapping */
695
+ #chat-tab .attached-files-list {
696
+ display: flex;
697
+ flex-wrap: wrap;
698
+ gap: 6px;
699
+ max-height: 150px;
700
+ overflow-y: auto;
701
+ }
702
+
703
+ /* Read-only notice - ensure proper layering */
704
+ #readonly-notice {
705
+ position: fixed !important;
706
+ bottom: 0 !important;
707
+ left: 0 !important;
708
+ right: 0 !important;
709
+ z-index: 1001 !important;
710
+ }
711
+
712
+ #chat-tab #scroll-to-bottom {
713
+ bottom: 60px; /* Just above input */
714
+ right: 12px;
715
+ width: 36px;
716
+ height: 36px;
717
+ border-radius: 50%;
718
+ padding: 0;
719
+ display: flex;
720
+ align-items: center;
721
+ justify-content: center;
722
+ font-size: 16px;
723
+ }
724
+
725
+ #chat-tab #scroll-to-bottom::before {
726
+ content: '↓';
727
+ font-size: 20px;
728
+ line-height: 1;
729
+ }
730
+
731
+ #chat-tab #scroll-to-bottom {
732
+ font-size: 0;
733
+ color: transparent;
734
+ }
735
+ }
736
+
737
+ /* Agent Message Styles */
738
+ .feed-content.agent-message {
739
+ background: rgba(59, 130, 246, 0.1);
740
+ border-left: 3px solid rgba(59, 130, 246, 0.6);
741
+ padding: 12px;
742
+ border-radius: 4px;
743
+ }
744
+
745
+ .feed-content.agent-message .message-text {
746
+ color: var(--color-text-primary);
747
+ line-height: 1.6;
748
+ white-space: pre-wrap;
749
+ word-wrap: break-word;
750
+ }
751
+
752
+ .feed-content.agent-message .message-waiting {
753
+ margin-top: 8px;
754
+ padding: 8px 12px;
755
+ background: rgba(251, 191, 36, 0.15);
756
+ border-radius: 4px;
757
+ color: rgba(251, 191, 36, 0.9);
758
+ font-size: var(--font-size-sm);
759
+ font-style: italic;
760
+ }
761
+
762
+ /* Task Complete Styles */
763
+ .feed-content.task-complete {
764
+ background: rgba(34, 197, 94, 0.1);
765
+ border-left: 3px solid rgba(34, 197, 94, 0.6);
766
+ padding: 12px;
767
+ border-radius: 4px;
768
+ }
769
+
770
+ .feed-content.task-complete .completion-message {
771
+ color: var(--color-text-primary);
772
+ line-height: 1.6;
773
+ white-space: pre-wrap;
774
+ word-wrap: break-word;
775
+ font-weight: 500;
776
+ }
777
+
778
+ /* Event type specific colors */
779
+ .event-agent-message {
780
+ border-left-color: rgba(59, 130, 246, 0.6) !important;
781
+ }
782
+
783
+ .event-task-complete {
784
+ border-left-color: rgba(34, 197, 94, 0.6) !important;
785
+ }
786
+
787
+ /* ========================================================================== */
788
+ /* NEW EVENT TYPE STYLES - Phase 1 Upgrade */
789
+ /* ========================================================================== */
790
+
791
+ /* LLM Request Messages */
792
+ .llm-request-message {
793
+ opacity: 0.7;
794
+ font-size: 0.9em;
795
+ color: var(--color-text-secondary);
796
+ }
797
+
798
+ .llm-request {
799
+ color: var(--color-accent-purple);
800
+ font-weight: bold;
801
+ }
802
+
803
+ .llm-request-content {
804
+ display: inline-flex;
805
+ align-items: center;
806
+ gap: 4px;
807
+ flex-wrap: nowrap;
808
+ }
809
+
810
+ .llm-icon {
811
+ font-weight: bold;
812
+ margin-right: 4px;
813
+ }
814
+
815
+ .llm-icon.success {
816
+ color: var(--color-accent-green);
817
+ }
818
+
819
+ .llm-icon.error {
820
+ color: var(--color-accent-red);
821
+ }
822
+
823
+ .llm-model {
824
+ font-family: 'Monaco', 'Menlo', monospace;
825
+ font-weight: 500;
826
+ }
827
+
828
+ .llm-separator {
829
+ color: var(--color-border);
830
+ margin: 0 2px;
831
+ }
832
+
833
+ .llm-tokens,
834
+ .llm-cost,
835
+ .llm-duration {
836
+ font-family: 'Monaco', 'Menlo', monospace;
837
+ font-size: 0.85em;
838
+ }
839
+
840
+ .llm-purpose {
841
+ color: var(--color-text-muted);
842
+ font-style: italic;
843
+ margin-left: 4px;
844
+ }
845
+
846
+ /* Hover effect for details */
847
+ .llm-request-message:hover {
848
+ opacity: 1;
849
+ background: rgba(213, 128, 255, 0.05);
850
+ }
851
+
852
+ /* Tool Execution Messages */
853
+ .tool-execution-message {
854
+ opacity: 0.8;
855
+ font-size: 0.9em;
856
+ }
857
+
858
+ .tool-execution {
859
+ color: var(--color-accent-blue);
860
+ }
861
+
862
+ .tool-execution-content {
863
+ display: inline-flex;
864
+ align-items: center;
865
+ gap: 4px;
866
+ flex-wrap: wrap;
867
+ }
868
+
869
+ .tool-execution-content.error {
870
+ color: var(--color-accent-red);
871
+ }
872
+
873
+ .tool-name {
874
+ font-weight: 500;
875
+ color: var(--color-accent-teal);
876
+ }
877
+
878
+ .tool-separator {
879
+ color: var(--color-border);
880
+ }
881
+
882
+ .tool-action {
883
+ font-family: 'Monaco', 'Menlo', monospace;
884
+ }
885
+
886
+ .tool-context {
887
+ color: var(--color-text-muted);
888
+ font-style: italic;
889
+ max-width: 200px;
890
+ overflow: hidden;
891
+ text-overflow: ellipsis;
892
+ white-space: nowrap;
893
+ }
894
+
895
+ .tool-duration {
896
+ color: var(--color-text-secondary);
897
+ font-size: 0.85em;
898
+ margin-left: 4px;
899
+ }
900
+
901
+ .tool-error {
902
+ color: var(--color-accent-red);
903
+ font-size: 0.85em;
904
+ margin-left: 24px;
905
+ margin-top: 2px;
906
+ padding: 4px 8px;
907
+ background: rgba(239, 68, 68, 0.1);
908
+ border-left: 2px solid var(--color-accent-red);
909
+ }
910
+
911
+ .tool-result {
912
+ color: var(--color-text-muted);
913
+ font-size: 0.85em;
914
+ font-family: 'Monaco', 'Menlo', monospace;
915
+ margin-left: 24px;
916
+ margin-top: 2px;
917
+ padding: 4px 8px;
918
+ background: rgba(59, 130, 246, 0.05);
919
+ border-left: 2px solid var(--color-accent-blue);
920
+ max-width: 600px;
921
+ overflow-x: auto;
922
+ }
923
+
924
+ /* Tool Execution Inline Display (FIX Dec 31, 2025) */
925
+ .tool-execution-inline {
926
+ display: flex;
927
+ flex-wrap: wrap;
928
+ align-items: flex-start;
929
+ gap: 6px;
930
+ padding: 8px 12px;
931
+ margin: 4px 0;
932
+ border-radius: 6px;
933
+ font-size: 0.9em;
934
+ background: rgba(59, 130, 246, 0.05);
935
+ border-left: 3px solid var(--color-accent-blue);
936
+ }
937
+
938
+ .tool-execution-inline.tool-success {
939
+ background: rgba(34, 197, 94, 0.05);
940
+ border-left-color: var(--color-accent-green, #22c55e);
941
+ }
942
+
943
+ .tool-execution-inline.tool-error {
944
+ background: rgba(239, 68, 68, 0.08);
945
+ border-left-color: var(--color-accent-red);
946
+ }
947
+
948
+ .tool-execution-inline .tool-indicator {
949
+ font-size: 1em;
950
+ }
951
+
952
+ .tool-execution-inline .tool-badge {
953
+ display: inline-block;
954
+ padding: 2px 8px;
955
+ background: rgba(33, 150, 243, 0.15);
956
+ border-radius: 4px;
957
+ font-weight: 600;
958
+ font-size: 0.85em;
959
+ color: var(--color-accent-blue);
960
+ }
961
+
962
+ .tool-execution-inline .tool-separator {
963
+ color: var(--color-text-muted);
964
+ opacity: 0.6;
965
+ }
966
+
967
+ .tool-execution-inline .tool-action {
968
+ font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
969
+ color: var(--color-accent-teal, #14b8a6);
970
+ }
971
+
972
+ .tool-execution-inline .tool-duration {
973
+ color: var(--color-text-secondary);
974
+ font-size: 0.85em;
975
+ opacity: 0.7;
976
+ }
977
+
978
+ .tool-execution-inline .tool-error-msg {
979
+ width: 100%;
980
+ margin-top: 4px;
981
+ padding: 6px 10px;
982
+ background: rgba(239, 68, 68, 0.1);
983
+ border-radius: 4px;
984
+ color: var(--color-accent-red);
985
+ font-size: 0.9em;
986
+ }
987
+
988
+ .tool-execution-inline .tool-result-preview {
989
+ width: 100%;
990
+ margin-top: 4px;
991
+ padding: 8px 10px;
992
+ background: rgba(0, 0, 0, 0.15);
993
+ border-radius: 4px;
994
+ font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
995
+ font-size: 0.85em;
996
+ color: var(--color-text-muted);
997
+ white-space: pre-wrap;
998
+ word-break: break-word;
999
+ max-height: 200px;
1000
+ overflow-y: auto;
1001
+ }
1002
+
1003
+ .tool-execution-inline .tool-truncated {
1004
+ color: var(--color-text-secondary);
1005
+ font-style: italic;
1006
+ font-size: 0.85em;
1007
+ opacity: 0.7;
1008
+ }
1009
+
1010
+ /* Error Messages - Chat specific styling */
1011
+ .error-message--chat {
1012
+ font-weight: 600;
1013
+ }
1014
+
1015
+ .error-content {
1016
+ display: inline-flex;
1017
+ align-items: baseline;
1018
+ gap: 4px;
1019
+ padding: 4px 8px;
1020
+ border-radius: 4px;
1021
+ }
1022
+
1023
+ .error-content.warning {
1024
+ background: rgba(251, 191, 36, 0.1);
1025
+ border-left: 3px solid var(--color-accent-yellow);
1026
+ }
1027
+
1028
+ .error-content.critical {
1029
+ background: rgba(239, 68, 68, 0.1);
1030
+ border-left: 3px solid var(--color-accent-red);
1031
+ }
1032
+
1033
+ .error-type {
1034
+ font-weight: 600;
1035
+ color: var(--color-accent-red);
1036
+ }
1037
+
1038
+ .error-text {
1039
+ color: var(--color-text-primary);
1040
+ }
1041
+
1042
+ .error-stack-container {
1043
+ margin-left: 24px;
1044
+ margin-top: 8px;
1045
+ }
1046
+
1047
+ .error-stack-toggle {
1048
+ background: none;
1049
+ color: var(--color-accent-blue);
1050
+ cursor: pointer;
1051
+ text-decoration: underline;
1052
+ font-size: 0.85em;
1053
+ padding: 2px 4px;
1054
+ }
1055
+
1056
+ .error-stack {
1057
+ display: none;
1058
+ font-family: 'Monaco', 'Menlo', monospace;
1059
+ font-size: 0.75em;
1060
+ color: var(--color-text-muted);
1061
+ background: rgba(0, 0, 0, 0.05);
1062
+ border: 1px solid var(--color-border);
1063
+ border-radius: 4px;
1064
+ padding: 8px;
1065
+ margin-top: 4px;
1066
+ overflow-x: auto;
1067
+ max-height: 200px;
1068
+ overflow-y: auto;
1069
+ }
1070
+
1071
+ .error-stack.expanded {
1072
+ display: block;
1073
+ }
1074
+
1075
+ /* Multi-Agent Relationship Messages */
1076
+ .relationship-icon {
1077
+ margin-right: 4px;
1078
+ }
1079
+
1080
+ .relationship-agents {
1081
+ font-family: 'Monaco', 'Menlo', monospace;
1082
+ color: var(--color-accent-teal);
1083
+ font-weight: 500;
1084
+ margin-left: 4px;
1085
+ }
1086
+
1087
+ /* IRC-Style Session Catalog */
1088
+ .irc-catalog {
1089
+ font-family: var(--code-font);
1090
+ font-size: var(--font-size-sm);
1091
+ line-height: 1.4;
1092
+ padding: 12px;
1093
+ color: var(--color-text-primary);
1094
+ }
1095
+
1096
+ .irc-session-line {
1097
+ padding: 4px 8px;
1098
+ margin: 2px 0;
1099
+ transition: background-color 0.15s ease;
1100
+ border-radius: 2px;
1101
+ cursor: pointer;
1102
+ }
1103
+
1104
+ .irc-session-line:hover {
1105
+ background-color: rgba(86, 226, 194, 0.08);
1106
+ }
1107
+
1108
+ .irc-timestamp {
1109
+ color: var(--color-text-muted);
1110
+ margin-right: 8px;
1111
+ font-size: var(--font-size-xs);
1112
+ }
1113
+
1114
+ .irc-model {
1115
+ color: var(--color-accent-blue);
1116
+ margin-right: 8px;
1117
+ font-size: var(--font-size-xs);
1118
+ }
1119
+
1120
+ .irc-user {
1121
+ color: var(--color-accent-green);
1122
+ margin-right: 8px;
1123
+ font-size: var(--font-size-xs);
1124
+ opacity: 0.85;
1125
+ }
1126
+
1127
+ .irc-runtime {
1128
+ color: var(--color-accent-blue);
1129
+ margin-right: 8px;
1130
+ font-size: var(--font-size-xs);
1131
+ font-weight: 600;
1132
+ }
1133
+
1134
+ .irc-runtime-agent {
1135
+ color: #ffa500;
1136
+ }
1137
+
1138
+ .irc-session-id {
1139
+ color: var(--color-accent-green);
1140
+ text-decoration: none;
1141
+ font-family: var(--code-font);
1142
+ margin-right: 8px;
1143
+ font-size: var(--font-size-sm);
1144
+ }
1145
+
1146
+ .irc-session-id:hover {
1147
+ color: var(--color-text-primary);
1148
+ text-decoration: underline;
1149
+ }
1150
+
1151
+ .irc-arrow {
1152
+ color: var(--color-text-muted);
1153
+ margin: 0 6px;
1154
+ }
1155
+
1156
+ .irc-task {
1157
+ color: var(--color-text-primary);
1158
+ font-size: var(--font-size-sm);
1159
+ }
1160
+
1161
+ .irc-steps {
1162
+ color: var(--color-text-muted);
1163
+ margin-left: 8px;
1164
+ font-size: var(--font-size-xs);
1165
+ }
1166
+
1167
+ .irc-feed-link {
1168
+ color: var(--color-accent-blue);
1169
+ text-decoration: underline dotted;
1170
+ font-size: var(--font-size-xs);
1171
+ margin-right: 8px;
1172
+ }
1173
+
1174
+ .irc-feed-link:hover {
1175
+ color: var(--color-text-primary);
1176
+ }
1177
+
1178
+ /* One-line orientation hint under the new-session config panel (P2-14) */
1179
+ .chat-empty-hint {
1180
+ color: var(--color-text-muted);
1181
+ font-size: var(--font-size-sm);
1182
+ text-align: center;
1183
+ padding: 14px 8px;
1184
+ }
1185
+
1186
+ .chat-empty-hint a {
1187
+ color: var(--color-accent-green);
1188
+ }
1189
+
1190
+
1191
+ /* ===== File Preview Styles (CHAT MESSAGES ONLY) ===== */
1192
+ .chat-message .file-preview {
1193
+ margin: 8px 0 8px 24px;
1194
+ border: 1px solid var(--color-border);
1195
+ border-radius: 4px;
1196
+ background: rgba(0, 0, 0, 0.2);
1197
+ overflow: hidden;
1198
+ max-width: 800px;
1199
+ }
1200
+
1201
+ .chat-message .file-preview-header {
1202
+ display: flex;
1203
+ align-items: center;
1204
+ gap: 8px;
1205
+ padding: 8px 12px;
1206
+ background: rgba(0, 0, 0, 0.3);
1207
+ border-bottom: 1px solid var(--color-border);
1208
+ font-family: var(--code-font);
1209
+ font-size: var(--font-size-xs);
1210
+ }
1211
+
1212
+ .chat-message .file-preview-icon {
1213
+ font-size: var(--font-size-md);
1214
+ }
1215
+
1216
+ .chat-message .file-preview-path {
1217
+ color: var(--color-accent-blue);
1218
+ font-weight: 500;
1219
+ }
1220
+
1221
+ .chat-message .file-preview-content {
1222
+ margin: 0;
1223
+ padding: 12px;
1224
+ font-family: var(--code-font);
1225
+ font-size: var(--font-size-xs);
1226
+ line-height: 1.5;
1227
+ color: var(--color-text-primary);
1228
+ overflow-x: auto;
1229
+ max-height: 400px;
1230
+ overflow-y: auto;
1231
+ background: rgba(0, 0, 0, 0.1);
1232
+ }
1233
+
1234
+ .chat-message .file-preview-content code {
1235
+ color: var(--color-text-primary);
1236
+ font-family: var(--code-font);
1237
+ }
1238
+
1239
+ /* ===== IRC-Style Steps Display ===== */
1240
+ /* Simple terminal-style thinking and actions */
1241
+
1242
+ .message-steps {
1243
+ display: block;
1244
+ font-family: var(--code-font);
1245
+ font-size: var(--font-size-sm);
1246
+ line-height: 1.6;
1247
+ margin-left: 12px;
1248
+ margin-top: 6px;
1249
+ margin-bottom: 6px;
1250
+ }
1251
+
1252
+ .message-step {
1253
+ display: block;
1254
+ margin: 6px 0;
1255
+ }
1256
+
1257
+ /* Final response (shown after steps) */
1258
+ .final-response {
1259
+ display: block;
1260
+ margin-top: 12px;
1261
+ padding-top: 8px;
1262
+ border-top: 1px solid rgba(86, 226, 194, 0.15);
1263
+ }
1264
+
1265
+ /* Thinking line - clean bullet alignment */
1266
+ .step-thinking-line {
1267
+ display: block;
1268
+ color: var(--color-text-secondary);
1269
+ opacity: 0.8;
1270
+ line-height: 1.6;
1271
+ padding-left: 0;
1272
+ margin-left: 0;
1273
+ margin-bottom: 5px;
1274
+ }
1275
+
1276
+ .step-thinking-line::before {
1277
+ content: "• ";
1278
+ color: var(--color-text-muted);
1279
+ opacity: 0.6;
1280
+ margin-right: 4px;
1281
+ }
1282
+
1283
+ /* Action lines - clean arrow alignment with clickable area */
1284
+ .step-action-line {
1285
+ display: block;
1286
+ color: var(--color-text-secondary);
1287
+ opacity: 0.85;
1288
+ line-height: 1.6;
1289
+ padding: 2px 0;
1290
+ margin-top: 2px;
1291
+ margin-left: 12px;
1292
+ cursor: pointer;
1293
+ transition: opacity 0.15s, background 0.15s;
1294
+ }
1295
+
1296
+ .step-action-line:hover {
1297
+ opacity: 1;
1298
+ background: rgba(86, 226, 194, 0.05);
1299
+ }
1300
+
1301
+ .step-action-line .action-service {
1302
+ color: var(--color-text-muted);
1303
+ opacity: 0.7;
1304
+ font-weight: 400;
1305
+ }
1306
+
1307
+ .step-action-line .action-separator {
1308
+ color: var(--color-text-muted);
1309
+ opacity: 0.6;
1310
+ margin: 0 6px;
1311
+ }
1312
+
1313
+ .step-action-line .action-name {
1314
+ color: var(--color-accent-blue);
1315
+ font-weight: 500;
1316
+ }
1317
+
1318
+ .step-action-line .action-params {
1319
+ color: var(--color-text-muted);
1320
+ opacity: 0.7;
1321
+ font-size: var(--font-size-xs);
1322
+ }
1323
+
1324
+ /* Expanded action details */
1325
+ .action-details {
1326
+ display: none;
1327
+ margin-top: 6px;
1328
+ margin-bottom: 8px;
1329
+ margin-left: 24px;
1330
+ padding: 0;
1331
+ background: transparent;
1332
+ font-size: var(--font-size-xs);
1333
+ line-height: 1.4;
1334
+ color: var(--color-text-secondary);
1335
+ }
1336
+
1337
+ .action-details.expanded {
1338
+ display: block;
1339
+ }
1340
+
1341
+ .action-details-header {
1342
+ color: var(--color-text-muted);
1343
+ font-weight: 400;
1344
+ margin-bottom: 2px;
1345
+ font-size: var(--font-size-xs);
1346
+ line-height: 1.3;
1347
+ opacity: 0.6;
1348
+ }
1349
+
1350
+ .action-param-line {
1351
+ padding: 0;
1352
+ padding-left: 10px;
1353
+ text-indent: -10px;
1354
+ line-height: 1.3;
1355
+ margin: 1px 0;
1356
+ }
1357
+
1358
+ .action-param-key {
1359
+ color: var(--color-accent-blue);
1360
+ font-weight: 500;
1361
+ }
1362
+
1363
+ .action-param-value {
1364
+ color: var(--color-text-primary);
1365
+ opacity: 0.9;
1366
+ word-break: break-all;
1367
+ white-space: pre-wrap;
1368
+ }
1369
+
1370
+ /* =============================================================================
1371
+ Iteration Display (v3 format) - Uses same styles as steps
1372
+ ============================================================================= */
1373
+
1374
+ /* Iterations container - same as message-steps */
1375
+ .message-iterations {
1376
+ display: block;
1377
+ font-family: var(--code-font);
1378
+ font-size: var(--font-size-sm);
1379
+ line-height: 1.6;
1380
+ margin-left: 12px;
1381
+ margin-top: 6px;
1382
+ margin-bottom: 6px;
1383
+ }
1384
+
1385
+ /* Single iteration - same as message-step */
1386
+ .message-iteration {
1387
+ display: block;
1388
+ margin: 6px 0;
1389
+ }
1390
+
1391
+ /* Reasoning uses step-thinking-line style */
1392
+ .iteration-reasoning {
1393
+ display: block;
1394
+ color: var(--color-text-secondary);
1395
+ opacity: 0.8;
1396
+ line-height: 1.6;
1397
+ margin-bottom: 5px;
1398
+ }
1399
+
1400
+ .iteration-reasoning::before {
1401
+ content: "• ";
1402
+ color: var(--color-text-muted);
1403
+ opacity: 0.6;
1404
+ margin-right: 4px;
1405
+ }
1406
+
1407
+ /* Error message */
1408
+ .iteration-error {
1409
+ margin-top: 4px;
1410
+ margin-left: var(--spacing-md);
1411
+ color: var(--color-accent-red);
1412
+ font-size: var(--font-size-xs);
1413
+ }
1414
+
1415
+ /* Thinking indicator - aligned with step-action-line content */
1416
+ .iteration-thinking {
1417
+ color: rgba(255, 255, 255, 0.6);
1418
+ margin-top: 4px;
1419
+ margin-left: 12px; /* Match step-action-line indentation */
1420
+ display: block;
1421
+ }
1422
+
1423
+ /* =============================================================================
1424
+ Iteration File Indicators - Simple inline file status indicators
1425
+ ============================================================================= */
1426
+
1427
+ .iteration-files {
1428
+ display: inline-flex;
1429
+ flex-wrap: wrap;
1430
+ gap: 4px;
1431
+ margin-left: 12px;
1432
+ margin-top: 4px;
1433
+ }
1434
+
1435
+ .iteration-file {
1436
+ display: inline-flex;
1437
+ align-items: center;
1438
+ gap: 2px;
1439
+ font-size: 11px;
1440
+ font-family: var(--code-font);
1441
+ cursor: pointer;
1442
+ opacity: 0.8;
1443
+ }
1444
+
1445
+ .iteration-file:hover {
1446
+ opacity: 1;
1447
+ }
1448
+
1449
+ .iteration-file.file-created { color: var(--color-accent-green); }
1450
+ .iteration-file.file-modified { color: var(--color-accent-yellow); }
1451
+ .iteration-file.file-read { color: var(--color-accent-blue); }
1452
+
1453
+ .iteration-file-name {
1454
+ max-width: 120px;
1455
+ overflow: hidden;
1456
+ text-overflow: ellipsis;
1457
+ white-space: nowrap;
1458
+ }
1459
+
1460
+ /* =============================================================================
1461
+ Queue Status Indicator
1462
+ Compact inline display above input, aligned with input styling
1463
+ ============================================================================= */
1464
+
1465
+ .queue-indicator {
1466
+ display: flex;
1467
+ align-items: center;
1468
+ gap: 6px;
1469
+ padding: 3px 0;
1470
+ margin: 0;
1471
+ font-family: var(--code-font);
1472
+ font-size: var(--font-size-xs);
1473
+ color: var(--color-text-muted);
1474
+ border-bottom: 1px solid var(--color-border);
1475
+ opacity: 0.9;
1476
+ }
1477
+
1478
+ .queue-indicator .queue-header {
1479
+ display: flex;
1480
+ align-items: center;
1481
+ flex-shrink: 0;
1482
+ }
1483
+
1484
+ .queue-indicator .queue-pending,
1485
+ .queue-indicator .queue-processing {
1486
+ font-size: var(--font-size-xs);
1487
+ font-weight: normal;
1488
+ }
1489
+
1490
+ .queue-indicator .queue-pending {
1491
+ color: var(--color-accent-yellow);
1492
+ }
1493
+
1494
+ .queue-indicator .queue-processing {
1495
+ color: var(--color-accent-green);
1496
+ }
1497
+
1498
+ .queue-indicator .queue-pending::before {
1499
+ content: '⏳ ';
1500
+ font-size: 10px;
1501
+ }
1502
+
1503
+ .queue-indicator .queue-processing::before {
1504
+ content: '⚡ ';
1505
+ font-size: 10px;
1506
+ }
1507
+
1508
+ .queue-indicator .queue-list {
1509
+ display: flex;
1510
+ flex-wrap: wrap;
1511
+ gap: 4px 8px;
1512
+ list-style: none;
1513
+ margin: 0;
1514
+ padding: 0;
1515
+ flex: 1;
1516
+ min-width: 0;
1517
+ }
1518
+
1519
+ .queue-indicator .queue-item {
1520
+ color: var(--text-secondary, #94a3b8);
1521
+ font-size: var(--font-size-xs);
1522
+ max-width: 200px;
1523
+ overflow: hidden;
1524
+ text-overflow: ellipsis;
1525
+ white-space: nowrap;
1526
+ }
1527
+
1528
+ .queue-indicator .queue-item::before {
1529
+ content: '→ ';
1530
+ color: var(--color-text-muted);
1531
+ }
1532
+
1533
+ /* User message state indicators */
1534
+ .msg-state {
1535
+ margin-left: 8px;
1536
+ font-size: var(--font-size-xs);
1537
+ padding: 1px 6px;
1538
+ border-radius: 3px;
1539
+ }
1540
+
1541
+ .msg-state.queued {
1542
+ background-color: rgba(245, 158, 11, 0.2);
1543
+ color: var(--color-accent-yellow);
1544
+ }
1545
+
1546
+ .msg-state.injected {
1547
+ background-color: rgba(59, 130, 246, 0.2);
1548
+ color: var(--color-accent-blue);
1549
+ }
1550
+
1551
+ .msg-state.processed {
1552
+ display: none;
1553
+ }
1554
+
1555
+ /* =============================================================================
1556
+ DESKTOP LAYOUT - Unified content zone (same as all other pages)
1557
+ ============================================================================= */
1558
+ @media (min-width: 769px) {
1559
+ /* Chat tab - inherits unified max-width from style.css .main-panel > * rule */
1560
+ #chat-tab {
1561
+ /* DO NOT set max-width here - let parent rule control it */
1562
+ flex: 1;
1563
+ min-height: 0;
1564
+ display: flex;
1565
+ flex-direction: column;
1566
+ }
1567
+
1568
+ /* Terminal wrapper - fills parent width */
1569
+ #chat-tab .chat-terminal {
1570
+ width: 100%;
1571
+ flex: 1;
1572
+ min-height: 0;
1573
+ display: flex;
1574
+ flex-direction: column;
1575
+ align-items: stretch;
1576
+ }
1577
+
1578
+ /* Chat container - fills parent (content zone already constrained at tab level) */
1579
+ #chat-tab .chat-container {
1580
+ width: 100%;
1581
+ flex: 1;
1582
+ min-height: 0;
1583
+ padding: var(--spacing-sm) 0;
1584
+ box-sizing: border-box;
1585
+ }
1586
+
1587
+ /* Input container - fills parent */
1588
+ #chat-tab .chat-input-container {
1589
+ width: 100%;
1590
+ padding: var(--spacing-sm) 0;
1591
+ background: var(--color-bg-terminal);
1592
+ box-sizing: border-box;
1593
+ }
1594
+
1595
+ #chat-tab .chat-input-wrapper {
1596
+ width: 100%;
1597
+ }
1598
+
1599
+ /* Chat messages fill container */
1600
+ #chat-tab .chat-message {
1601
+ width: 100%;
1602
+ }
1603
+
1604
+ /* Config panel centered within content zone */
1605
+ #chat-tab .chat-config-panel {
1606
+ width: 100%;
1607
+ max-width: 800px;
1608
+ margin: 0 auto;
1609
+ padding: var(--spacing-xl) var(--spacing-lg);
1610
+ }
1611
+ }
1612
+
1613
+ /* =============================================================================
1614
+ CHUNK MESSAGE STYLES - Discrete timestamped messages
1615
+ ============================================================================= */
1616
+
1617
+ /* Base chunk message - compact inline display */
1618
+ .agent_chunk-message {
1619
+ padding: 1px 0;
1620
+ margin: 0;
1621
+ transition: background-color 0.15s ease;
1622
+ }
1623
+
1624
+ /* Chunk content containers */
1625
+ .chunk-actions,
1626
+ .chunk-thinking,
1627
+ .chunk-response,
1628
+ .chunk-files,
1629
+ .chunk-error,
1630
+ .chunk-status,
1631
+ .chunk-generic {
1632
+ display: inline;
1633
+ }
1634
+
1635
+ /* Action chunks - reuse step-action-line styles */
1636
+ .chunk-actions .step-action-line {
1637
+ margin-left: 8px;
1638
+ }
1639
+
1640
+ /* Thinking chunks */
1641
+ .chunk-thinking .step-thinking-line {
1642
+ margin-left: 0;
1643
+ }
1644
+
1645
+ /* Response chunks (final message) */
1646
+ .chunk-response.final-response {
1647
+ display: block;
1648
+ margin-top: 8px;
1649
+ padding-top: 6px;
1650
+ border-top: 1px solid rgba(86, 226, 194, 0.15);
1651
+ }
1652
+
1653
+ /* Error chunks */
1654
+ .chunk-error {
1655
+ color: var(--color-accent-red);
1656
+ margin-left: 8px;
1657
+ }
1658
+
1659
+ /* Status chunks */
1660
+ .chunk-status {
1661
+ margin-left: 8px;
1662
+ }
1663
+
1664
+ .chunk-status .status-indicator {
1665
+ padding: 2px 8px;
1666
+ border-radius: 3px;
1667
+ font-size: var(--font-size-xs);
1668
+ text-transform: uppercase;
1669
+ letter-spacing: 0.5px;
1670
+ }
1671
+
1672
+ .chunk-status .status-completed,
1673
+ .chunk-status .status-done {
1674
+ background: rgba(34, 197, 94, 0.15);
1675
+ color: var(--color-accent-green);
1676
+ }
1677
+
1678
+ .chunk-status .status-paused {
1679
+ background: rgba(251, 191, 36, 0.15);
1680
+ color: var(--color-accent-yellow);
1681
+ }
1682
+
1683
+ .chunk-status .status-cancelled {
1684
+ background: rgba(239, 68, 68, 0.15);
1685
+ color: var(--color-accent-red);
1686
+ }
1687
+
1688
+ /* Generic chunks */
1689
+ .chunk-generic {
1690
+ color: var(--color-text-secondary);
1691
+ margin-left: 8px;
1692
+ }
1693
+
1694
+ /* Visual grouping for consecutive chunk messages */
1695
+ .agent_chunk-message.chunk-group-start {
1696
+ margin-top: 10px;
1697
+ padding-top: 6px;
1698
+ border-top: 1px solid rgba(86, 226, 194, 0.08);
1699
+ }
1700
+
1701
+ .agent_chunk-message.chunk-group-end {
1702
+ margin-bottom: 10px;
1703
+ padding-bottom: 6px;
1704
+ }
1705
+
1706
+ .agent_chunk-message.chunk-group-middle {
1707
+ padding: 0;
1708
+ }
1709
+
1710
+ /* Collapsed group summary */
1711
+ .chunk-group-collapsed {
1712
+ padding: 0;
1713
+ margin: 8px 0;
1714
+ }
1715
+
1716
+ .chunk-summary {
1717
+ display: flex;
1718
+ align-items: center;
1719
+ gap: 8px;
1720
+ padding: 8px 12px;
1721
+ background: rgba(86, 226, 194, 0.05);
1722
+ border-left: 3px solid var(--color-accent-green);
1723
+ border-radius: 0 4px 4px 0;
1724
+ cursor: pointer;
1725
+ transition: background-color 0.15s ease;
1726
+ font-family: var(--code-font);
1727
+ font-size: var(--font-size-sm);
1728
+ }
1729
+
1730
+ .chunk-summary:hover {
1731
+ background: rgba(86, 226, 194, 0.1);
1732
+ }
1733
+
1734
+ .chunk-summary-icon {
1735
+ color: var(--color-accent-green);
1736
+ font-size: 10px;
1737
+ transition: transform 0.2s ease;
1738
+ }
1739
+
1740
+ .chunk-group-collapsed.expanded .chunk-summary-icon {
1741
+ transform: rotate(90deg);
1742
+ }
1743
+
1744
+ .chunk-summary-text {
1745
+ color: var(--color-text-primary);
1746
+ flex: 1;
1747
+ }
1748
+
1749
+ .chunk-summary-time {
1750
+ color: var(--color-text-muted);
1751
+ font-size: var(--font-size-xs);
1752
+ }
1753
+
1754
+ .chunk-summary-expand {
1755
+ color: var(--color-text-muted);
1756
+ font-size: var(--font-size-xs);
1757
+ opacity: 0.7;
1758
+ }
1759
+
1760
+ /* Hidden chunks when collapsed */
1761
+ .chunk-collapsed-item {
1762
+ display: none !important;
1763
+ }
1764
+
1765
+ /* File chips in chunks */
1766
+ .chunk-files {
1767
+ margin-left: 8px;
1768
+ }
1769
+
1770
+ .chunk-files .file-chip {
1771
+ margin: 0 4px 0 0;
1772
+ }