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,571 @@
1
+ """
2
+ TelemetryManager - Facade for telemetry operations
3
+
4
+ This manager provides a simplified interface for Agent and Orchestrator to capture
5
+ telemetry events without needing to understand ProductTelemetry's complexity.
6
+
7
+ Key responsibilities:
8
+ - Build telemetry events from agent state
9
+ - Hide ProductTelemetry implementation details
10
+ - Provide mockable interface for testing
11
+ - Single source of truth for event construction
12
+ """
13
+
14
+ import logging
15
+ from typing import List, Dict, Any, Optional
16
+ from pathlib import Path
17
+
18
+ from agents.task.telemetry.service import ProductTelemetry
19
+ from agents.task.telemetry.views import (
20
+ AgentStepTelemetryEvent,
21
+ SessionStartTelemetryEvent,
22
+ AgentRegistrationEvent,
23
+ SessionCompletionTelemetryEvent,
24
+ MultiAgentRelationshipEvent
25
+ )
26
+ from agents.task.path import pm
27
+
28
+ # Import logger
29
+ from agents.task.logging_config import get_task_logger
30
+ logger = get_task_logger('telemetry.manager')
31
+
32
+
33
+ class TelemetryManager:
34
+ """
35
+ Facade for all telemetry operations.
36
+
37
+ Hides ProductTelemetry complexity and provides a clean interface for
38
+ Agent and Orchestrator to capture telemetry without building events.
39
+ """
40
+
41
+ def __init__(self, session_id: str, agent_id: Optional[str] = None):
42
+ """Initialize telemetry manager.
43
+
44
+ Args:
45
+ session_id: The session identifier (already cleaned by caller)
46
+ agent_id: Optional agent identifier (format: name_session_id)
47
+ """
48
+ # Session ID is already cleaned by Orchestrator - do NOT re-clean
49
+ self._session_id = session_id
50
+ self._agent_id = agent_id
51
+ self._service = ProductTelemetry()
52
+ self.logger = logger
53
+
54
+ def capture_step(
55
+ self,
56
+ step: int,
57
+ actions: List[Dict[str, Any]],
58
+ errors: List[str],
59
+ brain_state: Any,
60
+ consecutive_failures: int = 0,
61
+ agent_name: Optional[str] = None,
62
+ agent_type: Optional[str] = None,
63
+ current_task: Optional[str] = None,
64
+ inputs: Optional[Dict[str, Any]] = None,
65
+ outputs: Optional[Dict[str, Any]] = None,
66
+ metrics: Optional[Dict[str, Any]] = None,
67
+ # New iteration fields for enhanced UI rendering
68
+ iteration: Optional[int] = None,
69
+ iteration_type: str = "mixed",
70
+ iteration_status: str = "active",
71
+ files_created: Optional[List[str]] = None,
72
+ files_modified: Optional[List[str]] = None,
73
+ files_read: Optional[List[str]] = None,
74
+ files_deleted: Optional[List[str]] = None,
75
+ error_message: Optional[str] = None,
76
+ loop_warning: Optional[str] = None,
77
+ is_done: bool = False,
78
+ reasoning_synthesized: bool = False
79
+ ) -> None:
80
+ """Capture an agent step event.
81
+
82
+ Agent calls this single method instead of building AgentStepTelemetryEvent.
83
+
84
+ Args:
85
+ step: Current step number
86
+ actions: List of actions taken
87
+ errors: List of error messages
88
+ brain_state: Agent's brain state (AgentBrain or similar)
89
+ consecutive_failures: Number of consecutive failures
90
+ agent_name: Optional agent name (extracted from agent_id if not provided)
91
+ agent_type: Optional agent type
92
+ current_task: Optional current task description
93
+ inputs: Optional input context
94
+ outputs: Optional output context
95
+ metrics: Optional metrics
96
+ iteration: Logical iteration number (defaults to step)
97
+ iteration_type: Type classification (thinking, browser, filesystem, mcp, mixed, done)
98
+ iteration_status: Status (active, completed, partial, failed, thinking, paused, timeout, done)
99
+ files_created: List of files created in this iteration
100
+ files_modified: List of files modified in this iteration
101
+ files_read: List of files read in this iteration
102
+ files_deleted: List of files deleted in this iteration
103
+ error_message: Error message if iteration failed
104
+ loop_warning: Warning about detected loops
105
+ is_done: Whether this iteration completed the task
106
+ reasoning_synthesized: Whether reasoning was synthesized from results
107
+ """
108
+ try:
109
+ # Extract task progress from brain state
110
+ task_progress = ""
111
+ if brain_state and hasattr(brain_state, 'next_goal'):
112
+ task_progress = brain_state.next_goal
113
+
114
+ # Extract reasoning from brain state or outputs
115
+ reasoning = ""
116
+ if brain_state and hasattr(brain_state, 'reasoning'):
117
+ reasoning = brain_state.reasoning
118
+ elif outputs and isinstance(outputs, dict):
119
+ reasoning = outputs.get('reasoning', '')
120
+
121
+ # Build context data
122
+ context_data = {}
123
+ if inputs or outputs or metrics:
124
+ context_data = {
125
+ 'inputs': inputs or {},
126
+ 'outputs': outputs or {},
127
+ 'metrics': metrics or {}
128
+ }
129
+
130
+ # Extract agent name if not provided
131
+ if not agent_name and self._agent_id and '_' in self._agent_id:
132
+ prefix = self._agent_id.split('_')[0]
133
+ agent_name = prefix.capitalize()
134
+
135
+ # Build the event with new iteration fields
136
+ event = AgentStepTelemetryEvent(
137
+ agent_id=self._agent_id or f"unknown_{self._session_id}",
138
+ step=step,
139
+ actions=actions,
140
+ step_error=errors or [],
141
+ consecutive_failures=consecutive_failures,
142
+ agent_name=agent_name or 'Unknown',
143
+ agent_type=agent_type or 'Agent',
144
+ task_progress=task_progress,
145
+ current_task=current_task or '',
146
+ reasoning=reasoning,
147
+ context_data=context_data,
148
+ # New iteration fields
149
+ iteration=iteration or step,
150
+ iteration_type=iteration_type,
151
+ iteration_status=iteration_status,
152
+ files_created=files_created or [],
153
+ files_modified=files_modified or [],
154
+ files_read=files_read or [],
155
+ files_deleted=files_deleted or [],
156
+ error_message=error_message,
157
+ loop_warning=loop_warning,
158
+ is_done=is_done,
159
+ reasoning_synthesized=reasoning_synthesized
160
+ )
161
+
162
+ # Capture to service
163
+ self._service.capture(event, session_id=self._session_id)
164
+
165
+ except Exception as e:
166
+ self.logger.error(f"Failed to capture step telemetry: {e}", exc_info=True)
167
+
168
+ def capture_iteration_complete(
169
+ self,
170
+ iteration: int,
171
+ step: int,
172
+ iteration_type: str,
173
+ iteration_status: str,
174
+ reasoning_summary: str,
175
+ actions_executed: List[Dict[str, Any]],
176
+ action_results: List[Dict[str, Any]],
177
+ files_created: List[str],
178
+ files_modified: List[str],
179
+ files_read: List[str],
180
+ files_deleted: List[str],
181
+ success: bool,
182
+ error: Optional[str] = None,
183
+ is_done: bool = False,
184
+ duration_seconds: float = 0.0
185
+ ) -> None:
186
+ """Capture an iteration complete event.
187
+
188
+ Marks the end of an iteration with a full summary for UI rendering.
189
+
190
+ Args:
191
+ iteration: Logical iteration number
192
+ step: Step number
193
+ iteration_type: Type (thinking, browser, filesystem, mcp, mixed, done)
194
+ iteration_status: Final status (completed, partial, failed, timeout, done)
195
+ reasoning_summary: Summary of reasoning for this iteration
196
+ actions_executed: List of actions that were executed
197
+ action_results: Results for each action
198
+ files_created: Files created in this iteration
199
+ files_modified: Files modified in this iteration
200
+ files_read: Files read in this iteration
201
+ files_deleted: Files deleted in this iteration
202
+ success: Whether the iteration succeeded
203
+ error: Error message if failed
204
+ is_done: Whether this iteration completed the task
205
+ duration_seconds: Duration of the iteration
206
+ """
207
+ try:
208
+ from agents.task.telemetry.views import IterationCompleteEvent
209
+
210
+ event = IterationCompleteEvent(
211
+ agent_id=self._agent_id or f"unknown_{self._session_id}",
212
+ iteration=iteration,
213
+ step=step,
214
+ iteration_type=iteration_type,
215
+ iteration_status=iteration_status,
216
+ reasoning_summary=reasoning_summary,
217
+ actions_executed=actions_executed,
218
+ action_results=action_results,
219
+ files_created=files_created,
220
+ files_modified=files_modified,
221
+ files_read=files_read,
222
+ files_deleted=files_deleted,
223
+ success=success,
224
+ error=error,
225
+ is_done=is_done,
226
+ duration_seconds=duration_seconds
227
+ )
228
+
229
+ # Capture to service
230
+ self._service.capture(event, session_id=self._session_id)
231
+
232
+ except Exception as e:
233
+ self.logger.error(f"Failed to capture iteration complete telemetry: {e}", exc_info=True)
234
+
235
+ def capture_llm_call(
236
+ self,
237
+ component: str,
238
+ purpose: str,
239
+ model: str,
240
+ duration: float,
241
+ success: bool,
242
+ token_count: Optional[int] = None,
243
+ prompt_tokens: Optional[int] = None,
244
+ completion_tokens: Optional[int] = None,
245
+ parameters: Optional[Dict[str, Any]] = None,
246
+ error: Optional[str] = None
247
+ ) -> str:
248
+ """Capture an LLM call event.
249
+
250
+ Args:
251
+ component: Component making the call (e.g., 'agent', 'planner')
252
+ purpose: Purpose of the call (e.g., 'planning', 'execution')
253
+ model: Model name
254
+ duration: Duration in seconds
255
+ success: Whether the call succeeded
256
+ token_count: Total token count
257
+ prompt_tokens: Prompt token count
258
+ completion_tokens: Completion token count
259
+ parameters: Additional parameters
260
+ error: Error message if failed
261
+
262
+ Returns:
263
+ Request ID for deduplication
264
+ """
265
+ try:
266
+ return self._service.capture_llm_usage(
267
+ component=component,
268
+ purpose=purpose,
269
+ model_name=model,
270
+ duration_seconds=duration,
271
+ success=success,
272
+ token_count=token_count,
273
+ session_id=self._session_id,
274
+ prompt_tokens=prompt_tokens,
275
+ completion_tokens=completion_tokens,
276
+ parameters=parameters,
277
+ agent_id=self._agent_id
278
+ )
279
+ except Exception as e:
280
+ self.logger.error(f"Failed to capture LLM telemetry: {e}", exc_info=True)
281
+ return ""
282
+
283
+ def capture_llm_usage(
284
+ self,
285
+ component: str,
286
+ purpose: str,
287
+ model_name: str,
288
+ duration_seconds: float,
289
+ success: bool,
290
+ token_count: Optional[int] = None,
291
+ prompt_tokens: Optional[int] = None,
292
+ completion_tokens: Optional[int] = None,
293
+ cached_tokens: Optional[int] = None,
294
+ parameters: Optional[Dict[str, Any]] = None,
295
+ agent_id: Optional[str] = None
296
+ ) -> str:
297
+ """Capture LLM usage event (alias for capture_llm_call with additional cached_tokens support).
298
+
299
+ This method provides direct interface compatibility with ProductTelemetry.capture_llm_usage().
300
+
301
+ Args:
302
+ component: Component making the call (e.g., 'agent', 'planner')
303
+ purpose: Purpose of the call (e.g., 'planning', 'execution')
304
+ model_name: Model name
305
+ duration_seconds: Duration in seconds
306
+ success: Whether the call succeeded
307
+ token_count: Total token count
308
+ prompt_tokens: Prompt token count
309
+ completion_tokens: Completion token count
310
+ cached_tokens: Cached token count (for prompt caching)
311
+ parameters: Additional parameters
312
+ agent_id: Optional agent ID override
313
+
314
+ Returns:
315
+ Request ID for deduplication
316
+ """
317
+ try:
318
+ return self._service.capture_llm_usage(
319
+ component=component,
320
+ purpose=purpose,
321
+ model_name=model_name,
322
+ duration_seconds=duration_seconds,
323
+ success=success,
324
+ token_count=token_count,
325
+ session_id=self._session_id,
326
+ prompt_tokens=prompt_tokens,
327
+ completion_tokens=completion_tokens,
328
+ cached_tokens=cached_tokens,
329
+ parameters=parameters,
330
+ agent_id=agent_id or self._agent_id
331
+ )
332
+ except Exception as e:
333
+ self.logger.error(f"Failed to capture LLM usage telemetry: {e}", exc_info=True)
334
+ return ""
335
+
336
+ def capture_session_start(
337
+ self,
338
+ task: str,
339
+ model: str,
340
+ agent_type: Optional[str] = None,
341
+ use_vision: bool = False,
342
+ internal_planning: bool = True
343
+ ) -> None:
344
+ """Capture session start event.
345
+
346
+ Args:
347
+ task: The task description
348
+ model: Model name
349
+ agent_type: Optional agent type
350
+ use_vision: Whether vision is enabled
351
+ internal_planning: Whether internal planning is enabled
352
+ """
353
+ try:
354
+ event = SessionStartTelemetryEvent(
355
+ session_id=self._session_id,
356
+ task=task,
357
+ model_name=model,
358
+ agent_id=self._agent_id or '',
359
+ agent_type=agent_type or '',
360
+ use_vision=use_vision,
361
+ internal_planning=internal_planning
362
+ )
363
+ self._service.capture(event, session_id=self._session_id)
364
+ except Exception as e:
365
+ self.logger.error(f"Failed to capture session start: {e}", exc_info=True)
366
+
367
+ def capture_session_end(
368
+ self,
369
+ success: bool,
370
+ steps: int,
371
+ duration: float,
372
+ error_message: Optional[str] = None,
373
+ metrics: Optional[Dict[str, Any]] = None
374
+ ) -> None:
375
+ """Capture session completion event.
376
+
377
+ Args:
378
+ success: Whether the session succeeded
379
+ steps: Total number of steps
380
+ duration: Session duration in seconds
381
+ error_message: Optional error message
382
+ metrics: Optional metrics
383
+ """
384
+ try:
385
+ event = SessionCompletionTelemetryEvent(
386
+ session_id=self._session_id,
387
+ success=success,
388
+ total_steps=steps,
389
+ duration_seconds=duration,
390
+ error_message=error_message,
391
+ metrics=metrics
392
+ )
393
+ self._service.capture(event, session_id=self._session_id)
394
+ except Exception as e:
395
+ self.logger.error(f"Failed to capture session end: {e}", exc_info=True)
396
+
397
+ def capture_agent_registration(
398
+ self,
399
+ agent_id: str,
400
+ agent_name: str,
401
+ agent_type: str,
402
+ model_name: str,
403
+ task: str
404
+ ) -> None:
405
+ """Capture agent registration event.
406
+
407
+ Args:
408
+ agent_id: Agent identifier
409
+ agent_name: Agent name
410
+ agent_type: Agent type
411
+ model_name: Model name
412
+ task: Task description
413
+ """
414
+ try:
415
+ event = AgentRegistrationEvent(
416
+ agent_id=agent_id,
417
+ agent_name=agent_name,
418
+ agent_type=agent_type,
419
+ model_name=model_name,
420
+ task=task,
421
+ session_id=self._session_id
422
+ )
423
+ self._service.capture(event, session_id=self._session_id)
424
+ except Exception as e:
425
+ self.logger.error(f"Failed to capture agent registration: {e}", exc_info=True)
426
+
427
+ def capture_multi_agent_relationship(
428
+ self,
429
+ agent_ids: List[str],
430
+ agent_types: Dict[str, str],
431
+ execution_sequence: List[str],
432
+ agent_models: Optional[Dict[str, str]] = None,
433
+ agent_details: Optional[List[Dict]] = None
434
+ ) -> None:
435
+ """Capture multi-agent relationship event.
436
+
437
+ Args:
438
+ agent_ids: List of agent IDs
439
+ agent_types: Mapping of agent_id to agent_type
440
+ execution_sequence: Order of execution
441
+ agent_models: Optional mapping of agent_id to model
442
+ agent_details: Optional detailed agent information
443
+ """
444
+ try:
445
+ event = MultiAgentRelationshipEvent(
446
+ agent_ids=agent_ids,
447
+ agent_types=agent_types,
448
+ execution_sequence=execution_sequence,
449
+ agent_models=agent_models or {},
450
+ agent_details=agent_details or [],
451
+ session_id=self._session_id
452
+ )
453
+ self._service.capture(event, session_id=self._session_id)
454
+ except Exception as e:
455
+ self.logger.error(f"Failed to capture multi-agent relationship: {e}", exc_info=True)
456
+
457
+ def flush_buffers(self) -> None:
458
+ """Flush all buffered telemetry events to disk."""
459
+ try:
460
+ self._service.flush_all_buffers()
461
+ except Exception as e:
462
+ self.logger.error(f"Failed to flush telemetry buffers: {e}", exc_info=True)
463
+
464
+ def get_health_stats(self) -> Dict[str, Any]:
465
+ """Get telemetry health statistics.
466
+
467
+ Returns:
468
+ Dictionary containing health metrics
469
+ """
470
+ try:
471
+ return self._service.get_health_stats()
472
+ except Exception as e:
473
+ self.logger.error(f"Failed to get health stats: {e}", exc_info=True)
474
+ return {'status': 'error', 'error': str(e)}
475
+
476
+ def capture_event(self, event: Any) -> None:
477
+ """Capture arbitrary telemetry event.
478
+
479
+ For events not yet having dedicated methods, use generic capture.
480
+
481
+ Args:
482
+ event: Any telemetry event
483
+ """
484
+ try:
485
+ self._service.capture(event, session_id=self._session_id)
486
+ except Exception as e:
487
+ self.logger.error(f"Failed to capture event: {e}", exc_info=True)
488
+
489
+ def capture_tool_execution(
490
+ self,
491
+ step: int,
492
+ tool_name: str,
493
+ action_name: str,
494
+ parameters: Dict[str, Any],
495
+ duration: float,
496
+ success: bool,
497
+ error: Optional[str] = None,
498
+ result_size: Optional[int] = None,
499
+ result_truncated: bool = False,
500
+ result_preview: Optional[str] = None
501
+ ) -> None:
502
+ """Capture a tool execution event.
503
+
504
+ Args:
505
+ step: Current step number
506
+ tool_name: Name of the tool (e.g., 'filesystem', 'browser')
507
+ action_name: Name of the action (e.g., 'read_file', 'click')
508
+ parameters: Action parameters (will be sanitized)
509
+ duration: Execution duration in seconds
510
+ success: Whether execution succeeded
511
+ error: Error message if failed
512
+ result_size: Size of result in characters
513
+ result_truncated: Whether result was truncated
514
+ result_preview: Preview of result (first 200 chars)
515
+ """
516
+ try:
517
+ from agents.task.telemetry.views import ToolExecutionTelemetryEvent
518
+
519
+ event = ToolExecutionTelemetryEvent(
520
+ agent_id=self._agent_id or f"unknown_{self._session_id}",
521
+ step=step,
522
+ tool_name=tool_name,
523
+ action_name=action_name,
524
+ parameters=parameters,
525
+ duration_seconds=duration,
526
+ success=success,
527
+ error=error,
528
+ result_size=result_size,
529
+ result_truncated=result_truncated,
530
+ result_preview=result_preview,
531
+ session_id=self._session_id
532
+ )
533
+ self._service.capture(event, session_id=self._session_id)
534
+ except Exception as e:
535
+ self.logger.error(f"Failed to capture tool execution: {e}", exc_info=True)
536
+
537
+ def capture_error(
538
+ self,
539
+ step: int,
540
+ error_type: str,
541
+ error_message: str,
542
+ error_stack: Optional[str] = None,
543
+ recoverable: bool = True,
544
+ context: Optional[Dict[str, Any]] = None
545
+ ) -> None:
546
+ """Capture an error event.
547
+
548
+ Args:
549
+ step: Current step number
550
+ error_type: Type of error ('tool_error', 'llm_error', 'validation_error', etc.)
551
+ error_message: Error message
552
+ error_stack: Stack trace (will be sanitized)
553
+ recoverable: Whether error is recoverable
554
+ context: Additional context
555
+ """
556
+ try:
557
+ from agents.task.telemetry.views import ErrorTelemetryEvent
558
+
559
+ event = ErrorTelemetryEvent(
560
+ agent_id=self._agent_id or f"unknown_{self._session_id}",
561
+ step=step,
562
+ error_type=error_type,
563
+ error_message=error_message,
564
+ error_stack=error_stack,
565
+ recoverable=recoverable,
566
+ context=context or {},
567
+ session_id=self._session_id
568
+ )
569
+ self._service.capture(event, session_id=self._session_id)
570
+ except Exception as e:
571
+ self.logger.error(f"Failed to capture error: {e}", exc_info=True)
@@ -0,0 +1,66 @@
1
+ """First-class memory observability events (T4-02, 2026-07-06 structural review).
2
+
3
+ Memory recall and memory writes were invisible on every surface: the producers
4
+ (`memory_prefetch.build_prefetch_message`, `memory_writer` sync, the curated
5
+ `memory` tool) logged only at debug, and recall rode an ephemeral LLM message no
6
+ owner view ever rendered — a self-evolution channel with zero audit.
7
+
8
+ `emit_memory_event` records `memory_recall` / `memory_write` rows on the durable
9
+ event log (telemetry_events.db), which the `/telemetry` CLI queries and the
10
+ webview `/activity` hub tails. Each row carries:
11
+
12
+ - ``scope`` — cross_session | kb | cross_session+kb | curated
13
+ - ``chars`` — size of the recalled/written content
14
+ - ``preview`` — ≤120-char single-line, secret-scrubbed excerpt
15
+ - ``source`` — the producing seam (prefetch / sync_turn / memory_tool)
16
+
17
+ Fail-open throughout: telemetry must never break the memory path it observes.
18
+ """
19
+ import logging
20
+
21
+ logger = logging.getLogger("task.telemetry.memory_events")
22
+
23
+ PREVIEW_CAP = 120
24
+
25
+
26
+ def scrubbed_preview(text, cap: int = PREVIEW_CAP) -> str:
27
+ """Single-line, secret-scrubbed, ≤cap-char excerpt of *text*."""
28
+ t = " ".join(str(text or "").split())
29
+ try:
30
+ from core.secret_scrub import scrub_secret_shapes
31
+ t = scrub_secret_shapes(t)
32
+ except Exception:
33
+ pass
34
+ return t[:cap]
35
+
36
+
37
+ def emit_memory_event(kind: str, *, user_id: str = "", session_id: str = "",
38
+ source: str = "", scope: str = "", content: str = "",
39
+ **attrs):
40
+ """Record one memory event on the durable event log. Fail-open.
41
+
42
+ Returns the recorded attrs dict (scope/chars/preview + extras) so callers
43
+ with a live-feed handle can mirror the event there, or None when the log is
44
+ disabled/unavailable.
45
+ """
46
+ try:
47
+ from agents.task.telemetry.event_log import event_log_enabled, get_event_log
48
+ if not event_log_enabled():
49
+ return None
50
+ payload = dict(
51
+ scope=scope,
52
+ chars=len(str(content or "")),
53
+ preview=scrubbed_preview(content),
54
+ **attrs,
55
+ )
56
+ get_event_log().record(
57
+ kind,
58
+ user_id=str(user_id or ""),
59
+ session_id=str(session_id or ""),
60
+ source=source,
61
+ **payload,
62
+ )
63
+ return payload
64
+ except Exception as e:
65
+ logger.debug(f"memory event emit skipped: {e}")
66
+ return None
@@ -0,0 +1,53 @@
1
+ """First-class self-modification observability (T4-06, 2026-07-06 review).
2
+
3
+ Skill writes, self-context edits, owner promotions/rejections, and curator
4
+ archives previously surfaced only as generic ``tool_execution`` — no owner
5
+ surface could answer "what did the agent change about itself?".
6
+
7
+ ``emit_self_modification`` records one ``self_modification`` row on the durable
8
+ event log (telemetry_events.db → `/telemetry` CLI + webview `/activity`):
9
+
10
+ - ``kind`` — skill | self_context
11
+ - ``action`` — create | patch | delete | promote | reject | archive | reactivate
12
+ - ``item_id`` — the skill id, or the tenant for a self-context doc
13
+ - ``pending`` — True when the write landed in the review quarantine
14
+ - ``created_by`` — provenance (agent | background_review | owner)
15
+ - ``ok`` — whether the mutation took effect
16
+ - ``source`` — the producing seam (skill_manage / self_context_manage /
17
+ owner_review / curator)
18
+
19
+ Fail-open throughout: telemetry must never break the write path it observes.
20
+ """
21
+ import logging
22
+
23
+ logger = logging.getLogger("task.telemetry.self_events")
24
+
25
+
26
+ def emit_self_modification(*, kind: str, action: str, item_id: str,
27
+ user_id: str = "", session_id: str = "",
28
+ pending=None, created_by: str = "", source: str = "",
29
+ ok: bool = True, **attrs) -> None:
30
+ """Record one self_modification event on the durable event log. Fail-open."""
31
+ try:
32
+ from agents.task.telemetry.event_log import event_log_enabled, get_event_log
33
+ if not event_log_enabled():
34
+ return
35
+ # NOTE: `kind` collides with record()'s positional event-kind param, so
36
+ # the attributes ride the explicit attrs-dict escape hatch.
37
+ get_event_log().record(
38
+ "self_modification",
39
+ user_id=str(user_id or ""),
40
+ session_id=str(session_id or ""),
41
+ source=source,
42
+ attrs={
43
+ "kind": kind,
44
+ "action": action,
45
+ "item_id": str(item_id or ""),
46
+ "pending": pending,
47
+ "created_by": created_by,
48
+ "ok": bool(ok),
49
+ **attrs,
50
+ },
51
+ )
52
+ except Exception as e:
53
+ logger.debug(f"self_modification event emit skipped: {e}")