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.
- agents/README.md +453 -0
- agents/__init__.py +164 -0
- agents/base_agent.py +743 -0
- agents/personality/character.py +119 -0
- agents/personality/character_manager.py +309 -0
- agents/personality/characters/rob.character.json +56 -0
- agents/personality/characters/trump.character.json +63 -0
- agents/personality/persona_render.py +78 -0
- agents/personality/persona_resolver.py +115 -0
- agents/prompt/__init__.py +58 -0
- agents/prompt/base_prompt.py +92 -0
- agents/prompt/system.py +417 -0
- agents/task/README_PATH_MANAGEMENT.md +141 -0
- agents/task/__init__.py +162 -0
- agents/task/agent/__init__.py +70 -0
- agents/task/agent/agent_state.py +408 -0
- agents/task/agent/async_delegation.py +274 -0
- agents/task/agent/autonomy_state.py +275 -0
- agents/task/agent/conversation.py +75 -0
- agents/task/agent/core/__init__.py +6 -0
- agents/task/agent/core/aux_metering.py +61 -0
- agents/task/agent/core/background_review.py +157 -0
- agents/task/agent/core/construction.py +1179 -0
- agents/task/agent/core/conversational_exit.py +49 -0
- agents/task/agent/core/correspondent_gate.py +227 -0
- agents/task/agent/core/curator.py +246 -0
- agents/task/agent/core/episodic_digest.py +103 -0
- agents/task/agent/core/error_recovery.py +480 -0
- agents/task/agent/core/history_io.py +257 -0
- agents/task/agent/core/llm_provisioning.py +287 -0
- agents/task/agent/core/llm_runner.py +547 -0
- agents/task/agent/core/logging_io.py +276 -0
- agents/task/agent/core/loop_detection.py +262 -0
- agents/task/agent/core/memory_prefetch.py +325 -0
- agents/task/agent/core/memory_writer.py +667 -0
- agents/task/agent/core/model_introspection.py +82 -0
- agents/task/agent/core/model_swap.py +177 -0
- agents/task/agent/core/next_action_internal.py +1331 -0
- agents/task/agent/core/output_validation.py +303 -0
- agents/task/agent/core/project_context.py +272 -0
- agents/task/agent/core/resources.py +93 -0
- agents/task/agent/core/result_processing.py +389 -0
- agents/task/agent/core/run_loop.py +661 -0
- agents/task/agent/core/safety_lifecycle.py +228 -0
- agents/task/agent/core/secret_guard.py +293 -0
- agents/task/agent/core/self_wake.py +280 -0
- agents/task/agent/core/session_metadata.py +104 -0
- agents/task/agent/core/step.py +781 -0
- agents/task/agent/core/step_execution.py +398 -0
- agents/task/agent/core/step_telemetry.py +222 -0
- agents/task/agent/core/test_aux_metering.py +50 -0
- agents/task/agent/core/test_billing_failover.py +68 -0
- agents/task/agent/core/test_fatal_error_classifier.py +38 -0
- agents/task/agent/core/test_judge_validation.py +275 -0
- agents/task/agent/core/test_model_swap.py +190 -0
- agents/task/agent/core/test_reflection_offload.py +54 -0
- agents/task/agent/core/turn_input.py +8 -0
- agents/task/agent/core/untrusted_wrap.py +103 -0
- agents/task/agent/core/user_ingress.py +228 -0
- agents/task/agent/hitl_manager.py +396 -0
- agents/task/agent/log_sanitize.py +36 -0
- agents/task/agent/message_manager/config.py +97 -0
- agents/task/agent/message_manager/service.py +758 -0
- agents/task/agent/message_manager/tests.py +305 -0
- agents/task/agent/message_manager/tool_call_builder.py +539 -0
- agents/task/agent/message_manager/tool_message_repair.py +364 -0
- agents/task/agent/message_manager/views.py +143 -0
- agents/task/agent/messages/__init__.py +8 -0
- agents/task/agent/messages/builders.py +309 -0
- agents/task/agent/messages/compactor.py +611 -0
- agents/task/agent/messages/context_references.py +271 -0
- agents/task/agent/messages/filters.py +333 -0
- agents/task/agent/messages/guidance.py +328 -0
- agents/task/agent/messages/persistence.py +448 -0
- agents/task/agent/messages/retrieval.py +506 -0
- agents/task/agent/messages/sqlite_persistence.py +85 -0
- agents/task/agent/messages/test_compaction_upgrade.py +349 -0
- agents/task/agent/messages/test_persistence_subdir_fix.py +28 -0
- agents/task/agent/messages/test_sqlite_persistence.py +54 -0
- agents/task/agent/messages/token_counter.py +532 -0
- agents/task/agent/orchestrator.py +776 -0
- agents/task/agent/profile_manager.py +105 -0
- agents/task/agent/profile_registry.py +173 -0
- agents/task/agent/prompts.py +1090 -0
- agents/task/agent/scenario_registry.py +226 -0
- agents/task/agent/service.py +509 -0
- agents/task/agent/session.py +984 -0
- agents/task/agent/skill_discovery.py +110 -0
- agents/task/agent/skill_frontmatter.py +94 -0
- agents/task/agent/skill_manager.py +1201 -0
- agents/task/agent/skill_store.py +627 -0
- agents/task/agent/skill_validation.py +56 -0
- agents/task/agent/skill_writer.py +492 -0
- agents/task/agent/sub_agent_manager.py +1137 -0
- agents/task/agent/test_session_disk_recovery.py +34 -0
- agents/task/agent/tests.py +513 -0
- agents/task/agent/tool_call_tracker.py +511 -0
- agents/task/agent/views.py +469 -0
- agents/task/config.py +432 -0
- agents/task/constants.py +1384 -0
- agents/task/flag_defaults.py +63 -0
- agents/task/goals/__init__.py +1 -0
- agents/task/goals/autonomy_marker.py +28 -0
- agents/task/goals/board.py +690 -0
- agents/task/goals/completion_judge.py +247 -0
- agents/task/goals/context.py +62 -0
- agents/task/goals/dispatcher.py +848 -0
- agents/task/goals/escalation.py +102 -0
- agents/task/goals/planner.py +114 -0
- agents/task/logging_config.py +155 -0
- agents/task/path.py +991 -0
- agents/task/robust_parse_config.py +400 -0
- agents/task/runtime/__init__.py +0 -0
- agents/task/runtime/run_as_session.py +130 -0
- agents/task/runtime_safety.py +308 -0
- agents/task/session/__init__.py +5 -0
- agents/task/session/browser_pool.py +130 -0
- agents/task/session/cleanup.py +612 -0
- agents/task/session/execution.py +397 -0
- agents/task/session/feed.py +200 -0
- agents/task/session/hitl_ingress.py +201 -0
- agents/task/session/hooks.py +83 -0
- agents/task/session/multi_agent.py +243 -0
- agents/task/session/workspace.py +91 -0
- agents/task/session_registry.py +91 -0
- agents/task/session_route.py +35 -0
- agents/task/sqlite_session_registry.py +261 -0
- agents/task/surface_config.py +185 -0
- agents/task/telemetry/__init__.py +58 -0
- agents/task/telemetry/event_log.py +180 -0
- agents/task/telemetry/formatters.py +642 -0
- agents/task/telemetry/manager.py +571 -0
- agents/task/telemetry/memory_events.py +66 -0
- agents/task/telemetry/self_events.py +53 -0
- agents/task/telemetry/sequence.py +160 -0
- agents/task/telemetry/service.py +1265 -0
- agents/task/telemetry/views.py +882 -0
- agents/task/templates.py +98 -0
- agents/task/test_aux_chain.py +151 -0
- agents/task/test_aux_router.py +41 -0
- agents/task/tests/test_parse_robustness.py +170 -0
- agents/task/tool_defaults.py +110 -0
- agents/task/utils.py +762 -0
- agents/task/utils_json.py +768 -0
- agents/task/utils_webview.py +86 -0
- agents/task/workspace_context.py +229 -0
- agents/task_agent_lite.py +2398 -0
- api/README.md +683 -0
- api/TASK_API_DOCS.md +151 -0
- api/__init__.py +0 -0
- api/a2a/__init__.py +37 -0
- api/a2a/agent_card.py +337 -0
- api/a2a/client.py +657 -0
- api/a2a/endpoints.py +375 -0
- api/a2a/models.py +268 -0
- api/a2a/streaming.py +419 -0
- api/a2a/task_handler.py +929 -0
- api/admin_endpoints.py +1584 -0
- api/app.py +923 -0
- api/auth_constants.py +28 -0
- api/auth_endpoints.py +402 -0
- api/auth_state.py +36 -0
- api/chat_via_task.py +42 -0
- api/conversation_manager.py +231 -0
- api/dependencies.py +186 -0
- api/eip8004_endpoints.py +452 -0
- api/hyperliquid_models.py +174 -0
- api/hyperliquid_routes.py +450 -0
- api/interfaces.py +207 -0
- api/jwt_middleware.py +83 -0
- api/kb/__init__.py +1 -0
- api/kb/endpoints.py +314 -0
- api/mcp_models.py +279 -0
- api/mcp_routes.py +438 -0
- api/middleware.py +526 -0
- api/models.py +176 -0
- api/openai_compat/__init__.py +0 -0
- api/openai_compat/model_map.py +25 -0
- api/openai_compat/models.py +59 -0
- api/openai_compat/router.py +140 -0
- api/payment_endpoints.py +444 -0
- api/payment_verification.py +138 -0
- api/polymarket_models.py +155 -0
- api/polymarket_routes.py +501 -0
- api/pricing_endpoints.py +89 -0
- api/session_routing.py +54 -0
- api/skill_endpoints.py +453 -0
- api/task_http_api.py +1856 -0
- api/webhooks.py +52 -0
- api/x402_endpoints.py +280 -0
- avatar/README.md +44 -0
- avatar/__init__.py +1 -0
- avatar/config/rob.json +7 -0
- avatar/mindprint.js +395 -0
- avatar/renders/rob.meta.json +20 -0
- avatar/renders/rob.png +0 -0
- avatar/studio.html +373 -0
- avatar/webview/avatar-live.js +44 -0
- cli/README.md +89 -0
- cli/__init__.py +0 -0
- cli/cli_surface.py +67 -0
- cli/commands/__init__.py +0 -0
- cli/commands/_bootstrap.py +49 -0
- cli/commands/_errors.py +53 -0
- cli/commands/chat.py +973 -0
- cli/commands/config.py +100 -0
- cli/commands/dashboard.py +103 -0
- cli/commands/doctor.py +222 -0
- cli/commands/email.py +174 -0
- cli/commands/gateway.py +346 -0
- cli/commands/goals.py +509 -0
- cli/commands/init.py +276 -0
- cli/commands/journey.py +30 -0
- cli/commands/kb.py +280 -0
- cli/commands/model.py +107 -0
- cli/commands/owner.py +431 -0
- cli/commands/pfp.py +232 -0
- cli/commands/run.py +414 -0
- cli/commands/serve.py +41 -0
- cli/commands/session.py +684 -0
- cli/commands/skill_install.py +786 -0
- cli/commands/skills.py +128 -0
- cli/commands/subagents.py +100 -0
- cli/commands/surface.py +81 -0
- cli/commands/telegram.py +185 -0
- cli/commands/todos.py +209 -0
- cli/commands/tools.py +102 -0
- cli/commands/update.py +316 -0
- cli/commands/whatsapp.py +175 -0
- cli/config_store.py +276 -0
- cli/gitignore.py +43 -0
- cli/inventory.py +46 -0
- cli/keys.py +101 -0
- cli/persona.py +17 -0
- cli/polyrob.py +137 -0
- cli/ui/__init__.py +64 -0
- cli/ui/activity.py +141 -0
- cli/ui/app.py +538 -0
- cli/ui/banner.py +233 -0
- cli/ui/blocks.py +534 -0
- cli/ui/bootstrap_notice.py +47 -0
- cli/ui/commands/__init__.py +41 -0
- cli/ui/commands/h_cron.py +64 -0
- cli/ui/commands/h_journey.py +164 -0
- cli/ui/commands/h_kb.py +121 -0
- cli/ui/commands/h_learn.py +100 -0
- cli/ui/commands/h_mcp.py +215 -0
- cli/ui/commands/h_self.py +113 -0
- cli/ui/commands/h_skills.py +314 -0
- cli/ui/commands/handlers.py +1672 -0
- cli/ui/commands/registry.py +426 -0
- cli/ui/dialog.py +425 -0
- cli/ui/event_registry.py +110 -0
- cli/ui/event_specs.py +45 -0
- cli/ui/events.py +433 -0
- cli/ui/identity.py +15 -0
- cli/ui/lifecycle.py +159 -0
- cli/ui/live_hooks.py +43 -0
- cli/ui/model_selector.py +532 -0
- cli/ui/persistent_loop.py +181 -0
- cli/ui/pick.py +113 -0
- cli/ui/plain_renderer.py +351 -0
- cli/ui/renderer.py +384 -0
- cli/ui/rich_renderer.py +533 -0
- cli/ui/secrets.py +115 -0
- cli/ui/state.py +376 -0
- cli/ui/statusbar.py +231 -0
- cli/ui/streaming.py +254 -0
- cli/ui/terminal_render.py +105 -0
- cli/ui/theme.py +132 -0
- cli/update/__init__.py +6 -0
- cli/update/context.py +121 -0
- cli/update/detect.py +176 -0
- cli/update/engine.py +95 -0
- cli/update/migrate_guarded.py +55 -0
- cli/update/process_guard.py +215 -0
- cli/update/runners.py +78 -0
- cli/update/snapshot.py +270 -0
- cli/update/versions.py +205 -0
- core/README.md +377 -0
- core/__init__.py +174 -0
- core/assets.py +87 -0
- core/async_bridge.py +76 -0
- core/autonomy_runtime.py +259 -0
- core/base_component.py +302 -0
- core/bootstrap.py +681 -0
- core/bot.py +310 -0
- core/config.py +833 -0
- core/constants.py +126 -0
- core/container.py +462 -0
- core/db_manifest.py +101 -0
- core/embedding.py +57 -0
- core/env.py +39 -0
- core/exceptions.py +287 -0
- core/flags.py +144 -0
- core/flags_catalog.py +345 -0
- core/home_migration.py +62 -0
- core/identity.py +118 -0
- core/initialization.py +1004 -0
- core/instance.py +537 -0
- core/interactive_gate.py +96 -0
- core/logging.py +436 -0
- core/owner_doc_writer.py +176 -0
- core/pairing.py +193 -0
- core/path_safety.py +20 -0
- core/paths.py +27 -0
- core/payment_config.py +21 -0
- core/permissions.py +322 -0
- core/runtime_config.py +96 -0
- core/runtime_paths.py +135 -0
- core/seams.py +35 -0
- core/secret_scan.py +25 -0
- core/secret_scrub.py +71 -0
- core/secrets.py +35 -0
- core/security_logging_filter.py +148 -0
- core/self_context_writer.py +333 -0
- core/self_evolution.py +294 -0
- core/session_context.py +47 -0
- core/sqlite_util.py +59 -0
- core/surfaces/__init__.py +16 -0
- core/surfaces/access.py +118 -0
- core/surfaces/binding.py +88 -0
- core/surfaces/bootstrap.py +78 -0
- core/surfaces/circuit.py +168 -0
- core/surfaces/continuity.py +77 -0
- core/surfaces/correspondents.py +228 -0
- core/surfaces/dispatcher.py +216 -0
- core/surfaces/envelopes.py +75 -0
- core/surfaces/gc.py +30 -0
- core/surfaces/idempotency.py +57 -0
- core/surfaces/inbound_webhook.py +124 -0
- core/surfaces/media.py +32 -0
- core/surfaces/message_router.py +91 -0
- core/surfaces/outbound_allowlist.py +80 -0
- core/surfaces/outbound_dispatcher.py +110 -0
- core/surfaces/outbound_mirror.py +37 -0
- core/surfaces/outbound_queue.py +107 -0
- core/surfaces/outbound_target.py +12 -0
- core/surfaces/owner_admin.py +29 -0
- core/surfaces/proactive.py +78 -0
- core/surfaces/progress.py +108 -0
- core/surfaces/rate_bucket.py +21 -0
- core/surfaces/registry.py +51 -0
- core/surfaces/rendering.py +53 -0
- core/surfaces/send_policy.py +14 -0
- core/surfaces/serialize.py +24 -0
- core/surfaces/session_chat_registry.py +112 -0
- core/surfaces/session_policy.py +60 -0
- core/surfaces/surface.py +288 -0
- core/surfaces/transcription.py +88 -0
- core/surfaces/voice_echo.py +26 -0
- core/surfaces/voice_guard.py +23 -0
- core/tickers.py +174 -0
- core/tool_catalog.py +192 -0
- core/version.py +75 -0
- core/wallet/__init__.py +5 -0
- core/wallet/agent_wallet.py +59 -0
- core/wallet/audit_sink.py +61 -0
- core/wallet/config.py +70 -0
- core/wallet/factory.py +87 -0
- core/wallet/policy.py +104 -0
- core/wallet/signer.py +51 -0
- cron/README.md +65 -0
- cron/__init__.py +0 -0
- cron/delivery.py +277 -0
- cron/digest.py +124 -0
- cron/jobs.py +207 -0
- cron/runner.py +297 -0
- cron/schedule.py +194 -0
- cron/scheduler.py +201 -0
- cron/service.py +57 -0
- cron/wake_gate.py +223 -0
- data/__init__.py +1 -0
- data/prompts/autov2_prompts.json +87 -0
- data/prompts/skills/browser-automation/SKILL.md +43 -0
- data/prompts/skills/coding-workflow/SKILL.md +36 -0
- data/prompts/skills/crypto-trading-safety/SKILL.md +53 -0
- data/prompts/skills/document-writing/SKILL.md +33 -0
- data/prompts/skills/email-comms/SKILL.md +33 -0
- data/prompts/skills/file-data-ops/SKILL.md +35 -0
- data/prompts/skills/hyperliquid-account-review/SKILL.md +48 -0
- data/prompts/skills/hyperliquid-market-data/SKILL.md +52 -0
- data/prompts/skills/hyperliquid-trading/SKILL.md +59 -0
- data/prompts/skills/lead-research/SKILL.md +86 -0
- data/prompts/skills/market-research-brief/SKILL.md +104 -0
- data/prompts/skills/person-analyzer/SKILL.md +124 -0
- data/prompts/skills/polymarket-market-research/SKILL.md +54 -0
- data/prompts/skills/polymarket-portfolio-review/SKILL.md +50 -0
- data/prompts/skills/polymarket-trading/SKILL.md +55 -0
- data/prompts/skills/presentation-creator/SKILL.md +36 -0
- data/prompts/skills/project-analyzer/SKILL.md +169 -0
- data/prompts/skills/rules.json +268 -0
- data/prompts/skills/secret-handling/SKILL.md +20 -0
- data/prompts/skills/skill-authoring/SKILL.md +31 -0
- data/prompts/skills/skill-security-review/SKILL.md +27 -0
- data/prompts/skills/social-discovery/SKILL.md +57 -0
- data/prompts/skills/task-planning/SKILL.md +33 -0
- data/prompts/skills/web-research/SKILL.md +39 -0
- data/prompts/skills/web-scraping/SKILL.md +73 -0
- data/prompts/skills/x-engagement/SKILL.md +69 -0
- data/prompts/system_prompts.json +4 -0
- data/subscription_channels.json +5 -0
- modules/README.md +503 -0
- modules/__init__.py +124 -0
- modules/auth/__init__.py +13 -0
- modules/auth/api_key_manager.py +157 -0
- modules/auth/identity_mapper.py +380 -0
- modules/auth/siwe_auth.py +273 -0
- modules/auth/tier_manager.py +173 -0
- modules/base_module.py +190 -0
- modules/credits/__init__.py +29 -0
- modules/credits/balance_manager.py +237 -0
- modules/credits/cost_utils.py +129 -0
- modules/credits/pricing.py +139 -0
- modules/credits/unified_ledger.py +148 -0
- modules/credits/usage_meter.py +310 -0
- modules/credits/usage_tracker.py +674 -0
- modules/database/__init__.py +33 -0
- modules/database/audit_log.py +322 -0
- modules/database/auth_tables.py +276 -0
- modules/database/connection.py +644 -0
- modules/database/connection_pool.py +305 -0
- modules/database/conversation_contexts.py +446 -0
- modules/database/database_manager.py +237 -0
- modules/database/hyperliquid.py +375 -0
- modules/database/polymarket.py +574 -0
- modules/database/user_mcp_servers.py +728 -0
- modules/database/user_profiles.py +562 -0
- modules/database/utils.py +107 -0
- modules/database/x402_tables.py +92 -0
- modules/eip8004/README.md +1069 -0
- modules/eip8004/__init__.py +65 -0
- modules/eip8004/contracts.py +498 -0
- modules/eip8004/models.py +271 -0
- modules/eip8004/registration.py +148 -0
- modules/eip8004/reputation.py +367 -0
- modules/eip8004/validation.py +277 -0
- modules/llm/__init__.py +97 -0
- modules/llm/adapters.py +963 -0
- modules/llm/anthropic_client.py +831 -0
- modules/llm/available_models.py +106 -0
- modules/llm/brain_scrubber.py +137 -0
- modules/llm/cache_hints.py +162 -0
- modules/llm/deepseek_client.py +562 -0
- modules/llm/gemini_client.py +1367 -0
- modules/llm/llm_client.py +1139 -0
- modules/llm/llm_client_registry.py +188 -0
- modules/llm/llm_factory.py +237 -0
- modules/llm/llm_manager.py +1036 -0
- modules/llm/messages.py +374 -0
- modules/llm/model_registry.py +1935 -0
- modules/llm/nvidia_client.py +125 -0
- modules/llm/openai_client.py +800 -0
- modules/llm/openrouter_client.py +969 -0
- modules/llm/profiles.py +178 -0
- modules/llm/test_anthropic_cache_capture.py +35 -0
- modules/llm/test_cached_pricing_derivation.py +24 -0
- modules/llm/think_scrubber.py +444 -0
- modules/llm/token_counter.py +268 -0
- modules/memory/__init__.py +35 -0
- modules/memory/backend_factory.py +83 -0
- modules/memory/cache_manager.py +186 -0
- modules/memory/episodic.py +108 -0
- modules/memory/local_vector_memory_provider.py +552 -0
- modules/memory/memory_manager.py +225 -0
- modules/memory/models.py +312 -0
- modules/memory/provider.py +210 -0
- modules/memory/registry.py +205 -0
- modules/memory/sqlite_memory_provider.py +767 -0
- modules/memory/task/__init__.py +52 -0
- modules/memory/task/compaction_manager.py +157 -0
- modules/memory/task/context_retriever.py +809 -0
- modules/memory/task/hierarchical_memory.py +1002 -0
- modules/memory/task/lexical_retriever.py +71 -0
- modules/memory/task/null_context_manager.py +213 -0
- modules/memory/task/phase_manager.py +625 -0
- modules/memory/task/reflection_service.py +157 -0
- modules/memory/task/semantic_retriever.py +218 -0
- modules/memory/task/task_context_manager.py +1165 -0
- modules/memory/task/test_forgetting_engages.py +24 -0
- modules/memory/task/test_reflection_llm.py +39 -0
- modules/memory/task/test_threat_scan.py +53 -0
- modules/memory/task/threat_scan.py +90 -0
- modules/memory/test_sqlite_memory_provider.py +106 -0
- modules/memory/user_profile_manager.py +527 -0
- modules/payments/__init__.py +11 -0
- modules/payments/deposit_monitor.py +478 -0
- modules/payments/price_oracle.py +70 -0
- modules/payments/treasury_sweeper.py +401 -0
- modules/payments/wallet_generator.py +145 -0
- modules/pfp/__init__.py +1 -0
- modules/pfp/config.py +92 -0
- modules/pfp/mesh.py +565 -0
- modules/pfp/push.py +69 -0
- modules/pfp/renderer.py +85 -0
- modules/pfp/store.py +82 -0
- modules/skills/__init__.py +1 -0
- modules/skills/skill_usage.py +248 -0
- modules/transcription/__init__.py +24 -0
- modules/transcription/base.py +20 -0
- modules/transcription/faster_whisper_transcriber.py +55 -0
- modules/x402/README.md +249 -0
- modules/x402/__init__.py +22 -0
- modules/x402/invoicing.py +416 -0
- modules/x402/middleware.py +364 -0
- modules/x402/settlement_watcher.py +145 -0
- modules/x402/x402_integration.py +344 -0
- polyrob-0.5.0.dist-info/METADATA +482 -0
- polyrob-0.5.0.dist-info/RECORD +745 -0
- polyrob-0.5.0.dist-info/WHEEL +5 -0
- polyrob-0.5.0.dist-info/entry_points.txt +2 -0
- polyrob-0.5.0.dist-info/licenses/LICENSE +21 -0
- polyrob-0.5.0.dist-info/top_level.txt +12 -0
- surfaces/README.md +70 -0
- surfaces/__init__.py +0 -0
- surfaces/email/__init__.py +0 -0
- surfaces/email/dedup.py +44 -0
- surfaces/email/harness.py +187 -0
- surfaces/email/inbound.py +159 -0
- surfaces/email/seed.py +60 -0
- surfaces/email/surface.py +105 -0
- surfaces/telegram/__init__.py +0 -0
- surfaces/telegram/dedup.py +83 -0
- surfaces/telegram/harness.py +886 -0
- surfaces/telegram/inbound.py +145 -0
- surfaces/telegram/interactive_tools.py +49 -0
- surfaces/telegram/markdown.py +347 -0
- surfaces/telegram/rate_limit.py +167 -0
- surfaces/telegram/surface.py +187 -0
- surfaces/telegram/voice.py +52 -0
- surfaces/whatsapp/__init__.py +0 -0
- surfaces/whatsapp/client.py +51 -0
- surfaces/whatsapp/harness.py +62 -0
- surfaces/whatsapp/inbound.py +132 -0
- surfaces/whatsapp/surface.py +64 -0
- surfaces/whatsapp/window.py +34 -0
- tools/README.md +578 -0
- tools/__init__.py +424 -0
- tools/alchemy/__init__.py +5 -0
- tools/alchemy/alchemy_tool.py +389 -0
- tools/anysite/__init__.py +17 -0
- tools/anysite/client.py +88 -0
- tools/anysite/tool.py +89 -0
- tools/base_tool.py +468 -0
- tools/browser/__init__.py +22 -0
- tools/browser/actions.py +118 -0
- tools/browser/browser.py +1457 -0
- tools/browser/browser_manager.py +690 -0
- tools/browser/context.py +1748 -0
- tools/browser/playwright_utils.py +137 -0
- tools/browser/views.py +56 -0
- tools/code_exec/SANDBOX_SECURITY.md +144 -0
- tools/code_exec/__init__.py +178 -0
- tools/code_exec/backend.py +73 -0
- tools/code_exec/backends/__init__.py +1 -0
- tools/code_exec/backends/docker.py +779 -0
- tools/code_exec/backends/local_subprocess.py +154 -0
- tools/code_exec/env_policy.py +45 -0
- tools/code_exec/result.py +42 -0
- tools/code_exec/sandbox_guard.py +59 -0
- tools/code_exec/tool.py +227 -0
- tools/coding/__init__.py +50 -0
- tools/coding/edit.py +107 -0
- tools/coding/search.py +113 -0
- tools/coding/tool.py +353 -0
- tools/collabland/__init__.py +5 -0
- tools/collabland/collabland_tool.py +471 -0
- tools/controller/__init__.py +0 -0
- tools/controller/_helpers.py +165 -0
- tools/controller/action_registration.py +1765 -0
- tools/controller/approval.py +244 -0
- tools/controller/approval_interactive.py +90 -0
- tools/controller/delegation.py +195 -0
- tools/controller/execution.py +797 -0
- tools/controller/execution_context.py +141 -0
- tools/controller/hooks.py +135 -0
- tools/controller/introspection.py +344 -0
- tools/controller/mcp_registrar.py +190 -0
- tools/controller/message_send.py +31 -0
- tools/controller/registry/__init__.py +4 -0
- tools/controller/registry/schema_generators.py +395 -0
- tools/controller/registry/schema_sanitizer.py +406 -0
- tools/controller/registry/service.py +1266 -0
- tools/controller/registry/views.py +151 -0
- tools/controller/service.py +409 -0
- tools/controller/tool_management.py +334 -0
- tools/controller/types.py +28 -0
- tools/controller/views.py +450 -0
- tools/cronjob_tools.py +166 -0
- tools/crypto_trade_gate.py +59 -0
- tools/descriptors.py +452 -0
- tools/dom/__init__.py +0 -0
- tools/dom/history_tree_processor/service.py +244 -0
- tools/dom/history_tree_processor/view.py +99 -0
- tools/dom/service.py +471 -0
- tools/dom/views.py +346 -0
- tools/email_tool.py +403 -0
- tools/exceptions.py +169 -0
- tools/filesystem.py +1038 -0
- tools/filesystem_docproc.py +331 -0
- tools/filesystem_pdf.py +755 -0
- tools/git/__init__.py +42 -0
- tools/git/tool.py +258 -0
- tools/github/__init__.py +33 -0
- tools/github/client.py +94 -0
- tools/github/tool.py +237 -0
- tools/goal_tools.py +309 -0
- tools/hyperliquid/__init__.py +56 -0
- tools/hyperliquid/models.py +233 -0
- tools/hyperliquid/service.py +1680 -0
- tools/knowledge_ingest.py +950 -0
- tools/mcp/README.md +535 -0
- tools/mcp/__init__.py +52 -0
- tools/mcp/catalog.py +115 -0
- tools/mcp/config.py +337 -0
- tools/mcp/mcp_tool.py +1415 -0
- tools/mcp/param_coercion.py +289 -0
- tools/mcp/protocol.py +1520 -0
- tools/mcp/rate_limit.py +50 -0
- tools/mcp/security.py +424 -0
- tools/mcp/self_install.py +111 -0
- tools/mcp/server_manager.py +829 -0
- tools/mcp/subscriptions.py +72 -0
- tools/mcp/user_mcp_service.py +899 -0
- tools/mcp/validation_tracker.py +89 -0
- tools/mcp/views.py +346 -0
- tools/oauth/__init__.py +17 -0
- tools/oauth/manager.py +75 -0
- tools/oauth/provider.py +69 -0
- tools/oauth/providers/__init__.py +1 -0
- tools/oauth/providers/generic_oauth2.py +96 -0
- tools/perplexity_tool.py +280 -0
- tools/polymarket/__init__.py +41 -0
- tools/polymarket/clob_adapter.py +76 -0
- tools/polymarket/models.py +182 -0
- tools/polymarket/service.py +2082 -0
- tools/self_env/__init__.py +61 -0
- tools/self_env/tool.py +274 -0
- tools/shell/__init__.py +80 -0
- tools/shell/backend_pool.py +118 -0
- tools/shell/discipline.py +62 -0
- tools/shell/executor.py +157 -0
- tools/shell/loopback_allow.py +87 -0
- tools/shell/process_registry.py +113 -0
- tools/shell/process_tool.py +131 -0
- tools/shell/state.py +129 -0
- tools/shell/tool.py +151 -0
- tools/task_tool.py +637 -0
- tools/twitter_tool.py +2086 -0
- tools/user_directory.py +179 -0
- tools/web_fetch/__init__.py +3 -0
- tools/web_fetch/fetcher.py +144 -0
- tools/web_fetch/render.py +44 -0
- tools/web_fetch/tool.py +60 -0
- tools/x402/__init__.py +60 -0
- tools/x402/client.py +47 -0
- tools/x402/invoice_tool.py +143 -0
- tools/x402/real_client.py +250 -0
- tools/x402/service.py +131 -0
- utils/README.md +498 -0
- utils/__init__.py +46 -0
- utils/auth_utils.py +114 -0
- utils/bounded_collections.py +162 -0
- utils/circuit_breaker.py +389 -0
- utils/gif_utils.py +435 -0
- utils/markdown_utils.py +291 -0
- utils/message_utils.py +147 -0
- utils/metrics.py +36 -0
- utils/path_validator.py +227 -0
- utils/rate_limit_manager.py +399 -0
- utils/result_size.py +296 -0
- utils/time_utils.py +206 -0
- utils/user_utils.py +188 -0
- webview/README.md +111 -0
- webview/RENAME_AND_ALIGN_HANDOFF.md +200 -0
- webview/__init__.py +8 -0
- webview/activity.py +636 -0
- webview/owner_auth.py +108 -0
- webview/pages.py +448 -0
- webview/repair_sessions.py +399 -0
- webview/server.py +4323 -0
- webview/server_launcher.py +112 -0
- webview/static/css/activity.css +89 -0
- webview/static/css/chat.css +1772 -0
- webview/static/css/components.css +1190 -0
- webview/static/css/config-panel.css +651 -0
- webview/static/css/pages/admin.css +766 -0
- webview/static/css/pages/profile.css +231 -0
- webview/static/css/pages/settings.css +297 -0
- webview/static/css/pages/signin.css +316 -0
- webview/static/css/style.css +4250 -0
- webview/static/css/variables.css +147 -0
- webview/static/css/workspace-fullwidth-fix.css +109 -0
- webview/static/img/favicon.ico +0 -0
- webview/static/js/activity.js +394 -0
- webview/static/js/admin/activity.js +186 -0
- webview/static/js/admin/dashboard.js +163 -0
- webview/static/js/admin/user_detail.js +400 -0
- webview/static/js/admin/users.js +174 -0
- webview/static/js/admin/utils.js +214 -0
- webview/static/js/chat.js +3178 -0
- webview/static/js/config-panel.js +522 -0
- webview/static/js/constants.js +20 -0
- webview/static/js/error-handler.js +226 -0
- webview/static/js/ethers.min.js +1 -0
- webview/static/js/event-filter.js +137 -0
- webview/static/js/event-store.js +351 -0
- webview/static/js/file-attachments.js +374 -0
- webview/static/js/file-loader.js +163 -0
- webview/static/js/index.js +103 -0
- webview/static/js/performance-utils.js +196 -0
- webview/static/js/profile.js +396 -0
- webview/static/js/screenshot.js +386 -0
- webview/static/js/session.js +1527 -0
- webview/static/js/settings.js +1288 -0
- webview/static/js/sidebar-data.js +766 -0
- webview/static/js/sidebar-toggle.js +296 -0
- webview/static/js/socket.io.min.js +7 -0
- webview/static/js/stats.js +355 -0
- webview/static/js/ui-utils.js +420 -0
- webview/static/js/workspace.js +966 -0
- webview/stats_service.py +613 -0
- webview/templates/__init__.py +1 -0
- webview/templates/__pycache__/__init__.cpython-311.pyc +0 -0
- webview/templates/activity.html +36 -0
- webview/templates/admin/activity.html +122 -0
- webview/templates/admin/dashboard.html +112 -0
- webview/templates/admin/user_detail.html +228 -0
- webview/templates/admin/users.html +105 -0
- webview/templates/autonomy.html +60 -0
- webview/templates/error.html +133 -0
- webview/templates/finance.html +90 -0
- webview/templates/identity.html +73 -0
- webview/templates/index.html +42 -0
- webview/templates/layout.html +125 -0
- webview/templates/memory.html +59 -0
- webview/templates/owner_login.html +15 -0
- webview/templates/profile.html +121 -0
- webview/templates/session.html +312 -0
- webview/templates/settings.html +534 -0
- webview/templates/sidebar.html +112 -0
- webview/templates/signin.html +213 -0
- webview/templates/status.html +14 -0
- webview/templates/system.html +45 -0
- 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}")
|