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
agents/README.md ADDED
@@ -0,0 +1,453 @@
1
+ # Agents Package - AI Agent System
2
+
3
+ _Last reviewed: 2026-06-30. For the authoritative architecture see ../AGENTS.md; for env flags see ../docs/CONFIGURATION.md._
4
+
5
+ ## Overview
6
+
7
+ The `agents` package provides the POLYROB platform's agent system. As of the 2026 chat consolidation,
8
+ there is a **single** primary agent — the Task agent (`TaskAgent`, exported from `agents/__init__.py`)
9
+ — which handles both task automation and conversational chat (the former `ChatAgent` was removed and
10
+ its chat path folded into `TaskAgent.chat_once`). The package also provides the personality/character
11
+ system and the system-prompt support used by the Task agent.
12
+
13
+ ## Architecture Philosophy
14
+
15
+ - **Single front-door agent**: one Task agent core serves both task automation and chat
16
+ - **Mixin composition over god-files**: the four large classes (`Agent`, `SessionOrchestrator`,
17
+ `MessageManager`, `Controller`) each compose focused mixins rather than growing one file; new
18
+ behavior gets its own mixin/module (see ../AGENTS.md "Decomposition note")
19
+ - **Personality-driven**: a `Character` system feeds personality/style into the system prompt
20
+ - **Provider flexibility**: multiple LLM providers with intelligent fallback (native LLM layer)
21
+ - **Preserve LLM content, never synthesize**: brain state is extracted from preserved content
22
+ - **Single source of truth per concern**: e.g. `ToolCallTracker` for tool-call IDs
23
+
24
+ ## Package Structure
25
+
26
+ Only directories/files that exist are listed; the agent core is mixin-based, so the file count under
27
+ `task/agent/core/` is large — representative files are shown.
28
+
29
+ ```
30
+ agents/
31
+ ├── __init__.py # Lazy package exports (TaskAgent, BaseAgent, managers) + registry
32
+ ├── README.md # This documentation
33
+ ├── base_agent.py # Abstract base class (BaseAgent) for agents
34
+ ├── task_agent_lite.py # TaskAgent wrapper + SessionRequest (incl. chat_once)
35
+
36
+ ├── personality/ # Character and personality system
37
+ │ ├── character.py # Character (class Character(BaseComponent))
38
+ │ ├── character_manager.py # Character lifecycle management
39
+ │ ├── persona_render.py # Persona/style rendering helpers
40
+ │ └── characters/ # Character definition files
41
+ │ ├── rob.character.json # Default POLYROB character
42
+ │ └── trump.character.json # Example character
43
+
44
+ ├── prompt/ # System-prompt support
45
+ │ ├── __init__.py
46
+ │ ├── base_prompt.py # BasePromptManager (file-based prompt storage)
47
+ │ └── system.py # SystemPromptManager (prompt orchestration)
48
+
49
+ └── task/ # Task automation subsystem
50
+ ├── __init__.py
51
+ ├── config.py # Task configuration
52
+ ├── constants.py # Task constants + AutonomyConfig / local-mode flags
53
+ ├── logging_config.py # Task logging configuration
54
+ ├── path.py # Centralized path manager (pm())
55
+ ├── tool_defaults.py # Default tool_ids resolution
56
+ ├── templates.py # Agent/session templates
57
+ ├── surface_config.py # Per-surface config
58
+ ├── session_registry.py # In-process session→orchestrator map (SessionRegistry)
59
+ ├── sqlite_session_registry.py # SQLite-backed cross-process variant (opt-in)
60
+ ├── session_route.py # Session routing classification (LOCAL/REMOTE/MISSING)
61
+ ├── workspace_context.py # Workspace context
62
+ ├── runtime_safety.py # Safety controls
63
+ ├── utils.py / utils_json.py / utils_webview.py / robust_parse_config.py
64
+
65
+ ├── agent/ # Task agent implementation (mixin-based)
66
+ │ ├── __init__.py
67
+ │ ├── service.py # class Agent(... mixins ...) — step/run loop core
68
+ │ ├── orchestrator.py # class SessionOrchestrator(... mixins ...)
69
+ │ ├── session.py # SessionStatus enum + SessionManager
70
+ │ ├── agent_state.py # Agent state tracking
71
+ │ ├── views.py # View models (AgentHistoryList, AgentError, etc.)
72
+ │ ├── prompts.py # Task-specific prompt construction
73
+ │ ├── tool_call_tracker.py # ToolCallTracker — SINGLE source of truth for call IDs
74
+ │ ├── hitl_manager.py # Human-in-the-loop
75
+ │ ├── profile_manager.py / profile_registry.py / scenario_registry.py
76
+ │ ├── conversation.py # Conversation / Turn (chat plumbing)
77
+ │ ├── skill_manager.py # SkillManager(SkillWriterMixin) — skill match/load
78
+ │ ├── skill_writer.py # SkillWriterMixin — create/patch/delete/promote (writable skills)
79
+ │ ├── sub_agent_manager.py # SubAgentManager — delegation (run_subtask / parallel)
80
+ │ ├── async_delegation.py # AsyncDelegationRegistry — background delegation results
81
+ │ ├── log_sanitize.py
82
+ │ │
83
+ │ ├── core/ # Step loop, construction, and agent-intelligence concerns (mixins)
84
+ │ │ ├── construction.py # AgentConstructionMixin — wiring at session start
85
+ │ │ ├── run_loop.py # RunLoopMixin.run() — the multi-step run loop
86
+ │ │ ├── step.py # StepMixin — _prepare_step / _call_llm / _record_step / _finalize_step
87
+ │ │ ├── step_execution.py # StepExecutionMixin — _execute_actions
88
+ │ │ ├── result_processing.py# ResultProcessingMixin — _process_action_results
89
+ │ │ ├── step_telemetry.py # StepTelemetryMixin
90
+ │ │ ├── llm_runner.py # LLMRunnerMixin — LLM invocation + provider fallback
91
+ │ │ ├── llm_provisioning.py # LLMProvisioningMixin — main/aux/judge LLM provisioning
92
+ │ │ ├── memory_writer.py # MemoryWriterMixin — H-MEM writes + summaries
93
+ │ │ ├── memory_prefetch.py # MemoryPrefetchMixin — recall injection
94
+ │ │ ├── output_validation.py# OutputValidationMixin — _validate_output (judge)
95
+ │ │ ├── error_recovery.py # ErrorRecoveryMixin — _handle_step_error / billing failover
96
+ │ │ ├── loop_detection.py # LoopDetectionMixin
97
+ │ │ ├── conversational_exit.py # 2-reply-only-step turn end
98
+ │ │ ├── correspondent_gate.py # Capability gate for correspondent-tainted sessions
99
+ │ │ ├── untrusted_wrap.py # <untrusted_tool_result> framing
100
+ │ │ ├── background_review.py# BackgroundReviewMixin — post-turn aux reviewer fork
101
+ │ │ ├── self_wake.py # Self-wake re-entry rail
102
+ │ │ ├── curator.py # Skill curator (stale/archive/reactivate)
103
+ │ │ ├── secret_guard.py / safety_lifecycle.py / project_context.py
104
+ │ │ ├── history_io.py / logging_io.py / session_metadata.py / resources.py
105
+ │ │ ├── turn_input.py / user_ingress.py / next_action_internal.py
106
+ │ │ └── model_introspection.py
107
+ │ │
108
+ │ ├── messages/ # MessageManager concern mixins
109
+ │ │ ├── token_counter.py # TokenCounterMixin
110
+ │ │ ├── compactor.py # CompactorMixin — context compaction / LLM synthesis
111
+ │ │ ├── persistence.py # PersistenceMixin — checkpoint/disk (JSON source of truth)
112
+ │ │ ├── sqlite_persistence.py # SqlitePersistenceMixin — opt-in durable write-mirror
113
+ │ │ ├── filters.py # FiltersMixin — sensitive-data scrub, tool-sequence repair
114
+ │ │ ├── guidance.py # GuidanceMixin — injected guidance/control messages
115
+ │ │ ├── builders.py # MessageBuildersMixin
116
+ │ │ ├── retrieval.py # MessageRetrievalMixin — get_messages_for_llm
117
+ │ │ └── context_references.py # @-context references
118
+ │ │
119
+ │ └── message_manager/ # MessageManager façade + tool-call plumbing
120
+ │ ├── service.py # class MessageManager(... messages/ mixins ...)
121
+ │ ├── config.py / views.py
122
+ │ ├── tool_call_builder.py # ToolCallBuilder — format normalization only
123
+ │ └── tool_message_repair.py
124
+
125
+ ├── session/ # SessionOrchestrator concern mixins
126
+ │ ├── browser_pool.py # BrowserPoolMixin
127
+ │ ├── multi_agent.py # MultiAgentMixin
128
+ │ ├── feed.py # FeedMixin
129
+ │ ├── workspace.py # WorkspaceMixin
130
+ │ ├── execution.py # SessionExecutionMixin (run_session)
131
+ │ ├── cleanup.py # SessionCleanupMixin
132
+ │ ├── hitl_ingress.py # HITLIngressMixin
133
+ │ └── hooks.py # SessionHooksMixin — session/subagent lifecycle hooks
134
+
135
+ ├── goals/ # Durable goal board (autonomy W4)
136
+ │ ├── board.py # Goal + GoalBoard (data/goals.db, atomic CAS claim)
137
+ │ └── dispatcher.py # GoalDispatcher + GoalTicker
138
+
139
+ ├── runtime/ # Shared run-as-session entrypoint
140
+ │ └── run_as_session.py # run_task_as_session() (used by cron/goals)
141
+
142
+ └── telemetry/ # Task telemetry system
143
+ ├── service.py / manager.py / formatters.py / sequence.py / views.py
144
+ ```
145
+
146
+ ## Core Agent System
147
+
148
+ ### BaseAgent (`base_agent.py`)
149
+
150
+ Abstract base class (`class BaseAgent(BaseComponent)`) providing standardized agent lifecycle and
151
+ common LLM/character plumbing. `TaskAgent` subclasses it.
152
+
153
+ **Selected interface** (see the source for the full surface):
154
+ ```python
155
+ class BaseAgent(BaseComponent):
156
+ def __init__(self, *, config: BotConfig, container: DependencyContainer, name: str): ...
157
+ async def process_input(self, input_text: str, context_id: str, **kwargs) -> str: ...
158
+ async def start_conversation(self, user_id: str, **kwargs) -> bool: ...
159
+ async def set_character(self, character: "Character") -> None: ...
160
+ async def set_llm_client(self, client_name: str) -> bool: ...
161
+ async def generate_response(self, messages, **kwargs) -> str: ...
162
+ ```
163
+
164
+ **Lifecycle states** (inherited from `BaseComponent`): uninitialized → initializing → ready →
165
+ processing → error / cleaning-up. These are the *component* lifecycle states, distinct from a
166
+ running task session's `SessionStatus` (below).
167
+
168
+ ### Conversational chat
169
+
170
+ There is no longer a separate `ChatAgent` class. Conversational chat is served by the Task agent
171
+ via `TaskAgent.chat_once(...)` (`task_agent_lite.py`) — a single-turn entry point used by the
172
+ OpenAI-compatible `/v1/chat/completions` surface and other chat front-doors. This collapsed the
173
+ previously separate chat code path into one agent core.
174
+
175
+ ### TaskAgent (`task_agent_lite.py`)
176
+
177
+ The platform's single primary agent: a session manager that creates `SessionOrchestrator`s and
178
+ handles both complex multi-step task automation and conversational chat. Active orchestrators are
179
+ held behind **SessionRegistry** (`task/session_registry.py`) — use
180
+ `get_orchestrator`/`register_orchestrator`/`remove_orchestrator`, never the dict directly.
181
+
182
+ **Features**:
183
+ - Session management for long-running tasks (`create_session` / `run_session`)
184
+ - Browser automation via Playwright (opt-in tool)
185
+ - Service integration (email, social media, documents)
186
+ - Task decomposition and planning
187
+ - Conversational chat via `chat_once`
188
+ - Human-in-the-loop controls
189
+
190
+ ## Task Automation Subsystem (`task/`)
191
+
192
+ ### SessionRequest (`task_agent_lite.py`)
193
+
194
+ The request shape passed to `TaskAgent.create_session(...)` (defined alongside `TaskAgent`, **not**
195
+ in `orchestrator.py`):
196
+ ```python
197
+ @dataclass
198
+ class SessionRequest:
199
+ task: str # Task description
200
+ model: str = "gpt-5" # LLM model (overridden by env/key resolution)
201
+ provider: str = "openai" # LLM provider
202
+ tools: List[str] = None # → ["browser", "filesystem", "task"] if None
203
+ max_steps: int = 50 # Maximum automation steps
204
+ use_vision: bool = True # Enable vision capabilities
205
+ ```
206
+ Note: actual provider/model are resolved at chat/session time from whichever API key is present
207
+ (see `_resolve_chat_provider_model` and the shared runtime resolver), so the `gpt-5`/`openai`
208
+ defaults rarely win in practice.
209
+
210
+ ### SessionStatus (`task/agent/session.py`)
211
+
212
+ Session lifecycle is tracked by `SessionStatus` (an `Enum`). The valid states are:
213
+ - `CREATED` — initial state after creation
214
+ - `RUNNING` — currently executing
215
+ - `COMPLETED` — finished successfully (waiting for a possible follow-up)
216
+ - `RESUMED` — continuous-chat resume (transitional)
217
+ - `SUSPENDED` — evicted from memory, persisted to disk
218
+ - `FAILED` — execution failed
219
+ - `CANCELLED` — user cancelled (terminal)
220
+
221
+ There is **no** `PENDING` or `PAUSED` state. `PAUSED` was removed in favor of `CANCELLED` for user
222
+ interruption; follow-up messages use the `COMPLETED → RESUMED` flow. Transitions are enforced by
223
+ `SessionManager` (`session.py`).
224
+
225
+ ### Agent (`task/agent/service.py`)
226
+
227
+ The task-execution core is `class Agent`, composed from many focused mixins (run loop, step phases,
228
+ LLM runner, memory, error recovery, output validation, loop detection, etc.) via MRO:
229
+
230
+ ```python
231
+ class Agent(AgentConstructionMixin, RunLoopMixin, StepMixin, StepExecutionMixin,
232
+ StepTelemetryMixin, ResultProcessingMixin, LLMRunnerMixin,
233
+ NextActionInternalMixin, ErrorRecoveryMixin, OutputValidationMixin,
234
+ MemoryWriterMixin, MemoryPrefetchMixin, BackgroundReviewMixin,
235
+ HistoryIOMixin, LoggingIOMixin, SafetyLifecycleMixin, UserIngressMixin,
236
+ TurnInputMixin, LLMProvisioningMixin, ModelIntrospectionMixin,
237
+ LoopDetectionMixin, ResourceMixin, SessionMetadataMixin):
238
+ ...
239
+ ```
240
+
241
+ Construction uses two dataclasses — `Agent.__init__(self, config: AgentConfig, deps: AgentDeps)`
242
+ (use `Agent.from_params(**kwargs)` for the legacy kwarg form). There are **no** `run_task()` /
243
+ `pause()` / `resume()` / `cancel()` methods on `Agent`; execution is the run loop plus per-step
244
+ phases.
245
+
246
+ **Run loop** — `RunLoopMixin.run(max_steps=100, _continue_session=False)` (`core/run_loop.py`)
247
+ drives the session, returning an `AgentHistoryList`. It calls `step()` repeatedly until the agent is
248
+ done, an error halts it, or a guard (conversational-exit, loop-detection, max-steps) fires.
249
+
250
+ **Step phases** — a single step (`StepMixin._step_impl`, `core/step.py`) is split into phases:
251
+ `_prepare_step` → `_call_llm` → `_validate_and_intervene` → `_execute_actions` →
252
+ `_process_action_results` → `_record_step` → `_finalize_step`. `_execute_actions` lives in
253
+ `StepExecutionMixin` (`core/step_execution.py`); `_process_action_results` in `ResultProcessingMixin`
254
+ (`core/result_processing.py`).
255
+
256
+ **Tool-call flow** (native tools): LLM returns `tool_calls` → `ToolCallBuilder.normalize_tool_call()`
257
+ (format only) → `ToolCallTracker.register_tool_calls()` (ID tracking, single source of truth) →
258
+ `Registry.tool_calls_to_actions()` (Pydantic validation) → `Controller.multi_act()` (execution) →
259
+ `MessageManager.add_tool_response()` → `ToolCallTracker.complete_step()`.
260
+
261
+ ### SessionOrchestrator (`task/agent/orchestrator.py`)
262
+
263
+ Coordinates a session's agents, services and browser contexts across the lifecycle. Like `Agent`,
264
+ it composes its concerns from mixins under `task/session/`:
265
+
266
+ ```python
267
+ class SessionOrchestrator(WorkspaceMixin, FeedMixin, MultiAgentMixin, BrowserPoolMixin,
268
+ HITLIngressMixin, SessionCleanupMixin, SessionExecutionMixin,
269
+ SessionHooksMixin):
270
+ ...
271
+ ```
272
+
273
+ `SessionExecutionMixin.run_session` runs the agent loop for a session; `SessionHooksMixin` provides
274
+ fail-open session + sub-agent start/end lifecycle hooks.
275
+
276
+ ### MessageManager (`task/agent/message_manager/service.py`)
277
+
278
+ Message storage + retrieval, composed from the `task/agent/messages/` mixins:
279
+
280
+ ```python
281
+ class MessageManager(TokenCounterMixin, CompactorMixin, PersistenceMixin, FiltersMixin,
282
+ GuidanceMixin, MessageBuildersMixin, MessageRetrievalMixin):
283
+ ...
284
+ ```
285
+
286
+ Token math, compaction (synthesis), persistence and filters live in the mixins, not inline. JSON
287
+ (`message_history.json`) is the source of truth; `MESSAGE_STORE_BACKEND=sqlite` adds a write-only
288
+ durable mirror.
289
+
290
+ ### Telemetry System (`task/telemetry/`)
291
+
292
+ Per-step telemetry: step tracking, token usage, cost calculation, performance metrics and session
293
+ analytics (`service.py`, `manager.py`, `formatters.py`, `sequence.py`, `views.py`).
294
+
295
+ ### Autonomy: goals & runtime
296
+
297
+ - `task/goals/board.py` — `Goal` + `GoalBoard`: a durable cross-session backlog (`data/goals.db`,
298
+ WAL + jitter) with atomic CAS `claim` (safe under `workers>1`), a circuit breaker, and tenant
299
+ scoping. `task/goals/dispatcher.py` — `GoalDispatcher` / `GoalTicker` run claimed goals via
300
+ `create_session` + `run_session`.
301
+ - `task/runtime/run_as_session.py` — `run_task_as_session()`, the shared entrypoint used by the
302
+ cron and goal executors to run a one-off task as a full session.
303
+
304
+ These tickers are wired by the shared autonomy runtime (`core/autonomy_runtime.py`), not directly by
305
+ this package; see ../AGENTS.md "Shared autonomy runtime".
306
+
307
+ ## Personality System (`personality/`)
308
+
309
+ ### Character Model (`character.py`)
310
+
311
+ Rich character/personality definition. It is a `BaseComponent` subclass (**not** a `@dataclass`):
312
+
313
+ ```python
314
+ class Character(BaseComponent):
315
+ def __init__(self, name: str, config: BotConfig, container=None): ...
316
+ # attributes initialized in _initialize_attributes():
317
+ # name, modelProvider ("anthropic"), settings, bio, lore,
318
+ # knowledge, topics, adjectives, style
319
+ ```
320
+
321
+ Loaded from `personality/characters/*.character.json`; the attributes drive the personality/style
322
+ injected into the agent's system prompt.
323
+
324
+ ### CharacterManager (`character_manager.py`)
325
+
326
+ Central orchestrator for character lifecycle (load from file, role/default resolution, hot-reload).
327
+
328
+ ### Character Configuration Example
329
+
330
+ ```json
331
+ {
332
+ "name": "POLYROB",
333
+ "bio": "An advanced AI assistant with expertise in automation and problem-solving.",
334
+ "modelProvider": "anthropic",
335
+ "settings": { "temperature": 0.7, "maxTokens": 4096 },
336
+ "adjectives": ["helpful", "knowledgeable", "patient", "efficient"],
337
+ "style": { "speaking": ["clear", "concise", "professional"], "tone": "friendly yet focused" },
338
+ "topics": ["automation", "productivity", "technology", "problem-solving"],
339
+ "knowledge": [
340
+ "Web automation and browser control",
341
+ "Document processing and analysis",
342
+ "API integration and data handling"
343
+ ]
344
+ }
345
+ ```
346
+
347
+ ## Prompt Engineering System (`prompt/`)
348
+
349
+ ### SystemPromptManager (`prompt/system.py`)
350
+
351
+ Orchestrates system-prompt generation with character integration. (Note: the *Task* agent builds its
352
+ own session system prompt via `task/agent/prompts.py`; the `prompt/` package provides the shared
353
+ prompt-manager components registered as services.)
354
+
355
+ ### BasePromptManager (`prompt/base_prompt.py`)
356
+
357
+ Base class for prompt management with file-based prompt storage.
358
+
359
+ ## Agent Registry
360
+
361
+ Exports in `agents/__init__.py` are **lazy** (PEP 562 `__getattr__`) so importing the package is
362
+ cheap; `TaskAgent` is only imported when actually resolved.
363
+
364
+ ```python
365
+ # AGENT_METADATA (built lazily)
366
+ {
367
+ 'task_agent': {
368
+ 'class': TaskAgent,
369
+ 'description': 'Task agent',
370
+ 'is_core': False,
371
+ 'optional': True,
372
+ 'required_services': ['llm'],
373
+ 'optional_services': [
374
+ 'filesystem', 'perplexity', 'websearch',
375
+ 'twitter', 'email', 'cache_manager',
376
+ ],
377
+ }
378
+ }
379
+
380
+ # AGENT_COMPONENTS (built lazily): [('task_agent', TaskAgent, 'Task agent', True, {...})]
381
+ ```
382
+
383
+ ## Initialization
384
+
385
+ ```python
386
+ async def initialize_shared_components(container: DependencyContainer):
387
+ """Initialize shared components used by agents (system prompt + character managers)."""
388
+ # registers 'system_prompt_manager' and 'character_manager' if absent,
389
+ # then marks the 'shared_components' group initialized
390
+ ```
391
+
392
+ ## Usage Examples
393
+
394
+ ### Conversational chat
395
+ ```python
396
+ task_agent = container.get_service('task_agent')
397
+ response = await task_agent.chat_once(text="Help me with productivity", user_id="user123")
398
+ ```
399
+
400
+ ### Task agent session
401
+ ```python
402
+ session = await task_agent.create_session(SessionRequest(
403
+ task="Research AI trends and create a summary report",
404
+ tools=["browser", "filesystem"],
405
+ max_steps=30,
406
+ ))
407
+ result = await task_agent.run_session(session.session_id)
408
+ ```
409
+
410
+ ### Character loading
411
+ ```python
412
+ character = await character_manager.load_character("researcher")
413
+ # Characters drive the personality/style injected into the agent's system prompt
414
+ ```
415
+
416
+ ## Best Practices
417
+
418
+ ### Agent / core development
419
+ 1. **Add a mixin, don't grow a god-file**: new `Agent` / `SessionOrchestrator` / `MessageManager` /
420
+ `Controller` behavior gets its own mixin module (see ../AGENTS.md "Decomposition note").
421
+ 2. **Preserve LLM content**: extract brain state from preserved content; never synthesize it.
422
+ 3. **Single source of truth**: tool-call IDs go through `ToolCallTracker`, sessions through
423
+ `SessionRegistry`.
424
+ 4. **Registry-closure landmine**: action-registration modules deliberately do **not** use
425
+ `from __future__ import annotations` (it stringizes closure param annotations the Registry
426
+ introspects).
427
+ 5. **Fail fast with clear errors** — don't paper over problems with cascades of fallbacks.
428
+
429
+ ### Task automation
430
+ 1. **Step limits**: set an appropriate `max_steps`.
431
+ 2. **Tool selection**: only enable necessary tools (MCP/browser/coding are opt-in, not defaults).
432
+ 3. **Session cleanup**: clean up completed/failed sessions.
433
+ 4. **Human-in-the-loop**: support HITL for critical actions.
434
+
435
+ ### Character design
436
+ 1. **Consistent personality** across interactions; **domain expertise** aligned with use cases.
437
+ 2. **Clear style guidelines** and testing across scenarios.
438
+
439
+ ## Exports
440
+
441
+ ```python
442
+ __all__ = [
443
+ 'BaseAgent',
444
+ 'TaskAgent',
445
+ 'SystemPromptManager',
446
+ 'BasePromptManager',
447
+ 'CharacterManager',
448
+ 'initialize_shared_components',
449
+ 'AGENT_COMPONENTS',
450
+ 'AGENT_METADATA',
451
+ 'TASK_PACKAGE_AVAILABLE',
452
+ ]
453
+ ```
agents/__init__.py ADDED
@@ -0,0 +1,164 @@
1
+ """Agents package for bot components.
2
+
3
+ Lazy package (PEP 562): importing `agents` (or any `agents.*` submodule) must NOT eager-load
4
+ the agent/LLM/Telegram stack. Heavy re-exports (BaseAgent, the prompt managers, CharacterManager,
5
+ TaskAgent) and the agent-metadata tables load on first attribute access. This keeps leaf imports
6
+ like `agents.task.constants` import-light for the CLI and server worker boot.
7
+ See docs/plans/2026-06-26-runtime-architecture-finalization-FUSION.md (P0b).
8
+ """
9
+
10
+ import logging
11
+ from typing import TYPE_CHECKING, Optional, Dict, Any
12
+
13
+ from core.container import DependencyContainer
14
+ from core.exceptions import ComponentInitializationError
15
+
16
+ logger = logging.getLogger(__name__)
17
+
18
+ # name -> (relative module, attribute) resolved lazily by __getattr__
19
+ _LAZY_ATTRS = {
20
+ "BaseAgent": (".base_agent", "BaseAgent"),
21
+ "SystemPromptManager": (".prompt", "SystemPromptManager"),
22
+ "BasePromptManager": (".prompt", "BasePromptManager"),
23
+ "CharacterManager": (".personality.character_manager", "CharacterManager"),
24
+ "TaskAgent": (".task_agent_lite", "TaskAgent"),
25
+ }
26
+
27
+ if TYPE_CHECKING: # static analysis / IDEs only — no runtime import
28
+ from .base_agent import BaseAgent
29
+ from .prompt import SystemPromptManager, BasePromptManager
30
+ from .personality.character_manager import CharacterManager
31
+ from .task_agent_lite import TaskAgent
32
+
33
+
34
+ def _task_package_available() -> bool:
35
+ """True if the task agent subpackage is importable. Pays the import only when called."""
36
+ try:
37
+ from .task.agent.orchestrator import SessionOrchestrator # noqa: F401
38
+ return True
39
+ except ImportError:
40
+ return False
41
+
42
+
43
+ _AGENT_OPTIONAL_SERVICES = [
44
+ 'filesystem', 'perplexity', 'websearch', 'twitter', 'email', 'cache_manager',
45
+ ]
46
+
47
+
48
+ def _build_agent_components():
49
+ """Agent init order with deps. Lazily imports TaskAgent (captures the class object)."""
50
+ from .task_agent_lite import TaskAgent
51
+ return [
52
+ ('task_agent', TaskAgent, 'Task agent', True, {
53
+ 'required_services': ['llm'],
54
+ 'optional_services': list(_AGENT_OPTIONAL_SERVICES),
55
+ })
56
+ ]
57
+
58
+
59
+ def _build_agent_metadata():
60
+ """Agent metadata for consistent naming. Lazily imports TaskAgent."""
61
+ from .task_agent_lite import TaskAgent
62
+ return {
63
+ 'task_agent': {
64
+ 'class': TaskAgent,
65
+ 'description': 'Task agent',
66
+ 'is_core': False,
67
+ 'optional': True,
68
+ 'required_services': ['llm'],
69
+ 'optional_services': list(_AGENT_OPTIONAL_SERVICES),
70
+ }
71
+ }
72
+
73
+
74
+ async def initialize_shared_components(container: DependencyContainer) -> None:
75
+ """Initialize shared components used by agents."""
76
+ from .prompt import SystemPromptManager
77
+ from .personality.character_manager import CharacterManager
78
+ try:
79
+ # Initialize required shared components first
80
+ if not container.has_service('system_prompt_manager'):
81
+ logger.debug("Creating system prompt manager")
82
+ system_prompt_manager = SystemPromptManager(
83
+ name='system_prompt_manager',
84
+ config=container.config,
85
+ container=container
86
+ )
87
+ await system_prompt_manager.initialize()
88
+ container.register_service('system_prompt_manager', system_prompt_manager)
89
+ logger.info("✓ System prompt manager initialized")
90
+
91
+ # Initialize character manager
92
+ if not container.has_service('character_manager'):
93
+ logger.debug("Creating character manager")
94
+ character_manager = CharacterManager(
95
+ name='character_manager',
96
+ config=container.config,
97
+ container=container
98
+ )
99
+ await character_manager.initialize()
100
+ container.register_service('character_manager', character_manager)
101
+ logger.info("✓ Character manager initialized")
102
+
103
+ # Mark shared components as initialized
104
+ container.mark_component_group_initialized('shared_components')
105
+
106
+ except Exception as e:
107
+ logger.error(f"Shared component initialization failed: {e}")
108
+ raise
109
+
110
+
111
+ # Names computed lazily (cached into globals() on first access).
112
+ _LAZY_COMPUTED = {
113
+ "TASK_PACKAGE_AVAILABLE": _task_package_available,
114
+ "AGENT_COMPONENTS": _build_agent_components,
115
+ "AGENT_METADATA": _build_agent_metadata,
116
+ }
117
+
118
+
119
+ def __getattr__(name: str):
120
+ """PEP 562 lazy attribute resolution; caches into globals() so it fires once per name."""
121
+ if name in _LAZY_ATTRS:
122
+ import importlib
123
+ module_path, attr = _LAZY_ATTRS[name]
124
+ value = getattr(importlib.import_module(module_path, __name__), attr)
125
+ globals()[name] = value
126
+ return value
127
+ if name in _LAZY_COMPUTED:
128
+ value = _LAZY_COMPUTED[name]()
129
+ globals()[name] = value
130
+ return value
131
+ if name == "__package_info__":
132
+ return {"task_package_available": _task_package_available()}
133
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
134
+
135
+
136
+ def __dir__():
137
+ return sorted(set(globals()) | set(_LAZY_ATTRS) | set(_LAZY_COMPUTED) | {"__package_info__"})
138
+
139
+
140
+ __all__ = [
141
+ # Base components
142
+ 'BaseAgent',
143
+
144
+ # Main agents
145
+ 'TaskAgent',
146
+
147
+ # Prompt system
148
+ 'SystemPromptManager',
149
+ 'BasePromptManager',
150
+
151
+ # Character system
152
+ 'CharacterManager',
153
+
154
+ # Utility functions
155
+ 'initialize_shared_components',
156
+
157
+ # Metadata
158
+ 'AGENT_COMPONENTS',
159
+ 'AGENT_METADATA',
160
+ 'TASK_PACKAGE_AVAILABLE',
161
+ ]
162
+
163
+ # Package metadata
164
+ from core.version import __version__ # noqa: F401 (project version SSOT)