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,509 @@
|
|
|
1
|
+
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import asyncio
|
|
5
|
+
import base64
|
|
6
|
+
import http
|
|
7
|
+
import importlib
|
|
8
|
+
import json
|
|
9
|
+
import logging
|
|
10
|
+
import os
|
|
11
|
+
import re
|
|
12
|
+
import subprocess
|
|
13
|
+
import traceback
|
|
14
|
+
import time
|
|
15
|
+
from dataclasses import dataclass, field
|
|
16
|
+
from datetime import datetime
|
|
17
|
+
from io import BytesIO
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
from typing import Any, Callable, Dict, List, Optional, Type, TypeVar, Union, Tuple
|
|
20
|
+
from collections import deque # ADDED: Import deque for bounded collections
|
|
21
|
+
from agents.task.agent.tool_call_tracker import ToolCallTracker # Robust tool call ID tracking
|
|
22
|
+
|
|
23
|
+
from dotenv import load_dotenv
|
|
24
|
+
|
|
25
|
+
# Import centralized constants
|
|
26
|
+
from agents.task.constants import (
|
|
27
|
+
IMG_TOKENS,
|
|
28
|
+
LoopDetectionConfig,
|
|
29
|
+
DEFAULT_USER_ID,
|
|
30
|
+
MemoryConfig,
|
|
31
|
+
MAX_MCP_PER_STEP
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
# Import POLYROB exceptions
|
|
35
|
+
from core.exceptions import (
|
|
36
|
+
AgentError,
|
|
37
|
+
ValidationError as ROBValidationError,
|
|
38
|
+
LLMResponseError,
|
|
39
|
+
ToolError
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
# Import billing exception for fail-fast handling
|
|
43
|
+
from core.exceptions import InsufficientCreditsError
|
|
44
|
+
|
|
45
|
+
# Import centralized utilities to avoid repeated inline imports
|
|
46
|
+
from agents.task.utils_json import normalize_action_schema
|
|
47
|
+
from core.env import bool_env as _bool_env
|
|
48
|
+
# Model limits now come from modules.llm.model_registry
|
|
49
|
+
|
|
50
|
+
# Native message types
|
|
51
|
+
from modules.llm.messages import (
|
|
52
|
+
AIMessage,
|
|
53
|
+
BaseMessage,
|
|
54
|
+
HumanMessage,
|
|
55
|
+
SystemMessage,
|
|
56
|
+
ToolMessage,
|
|
57
|
+
MessageOrigin,
|
|
58
|
+
make_control_message,
|
|
59
|
+
)
|
|
60
|
+
from modules.llm.adapters import BaseChatModel
|
|
61
|
+
from core.exceptions import (
|
|
62
|
+
RateLimitError,
|
|
63
|
+
LLMError,
|
|
64
|
+
LLMRateLimitError,
|
|
65
|
+
LLMAuthenticationError,
|
|
66
|
+
LLMConnectionError,
|
|
67
|
+
LLMContextLengthError,
|
|
68
|
+
LLMResponseError,
|
|
69
|
+
LLMPermanentError,
|
|
70
|
+
LLMProviderExhaustedError
|
|
71
|
+
)
|
|
72
|
+
# PIL Image imported locally in save_screenshot() method where needed
|
|
73
|
+
from pydantic import BaseModel, ConfigDict, ValidationError
|
|
74
|
+
|
|
75
|
+
from tools.browser.views import BrowserStateHistory, BrowserState
|
|
76
|
+
from agents.task.agent.message_manager.service import MessageManager
|
|
77
|
+
from agents.task.agent.core.llm_runner import LLMRunnerMixin
|
|
78
|
+
from agents.task.agent.core.memory_writer import MemoryWriterMixin
|
|
79
|
+
from agents.task.agent.core.memory_prefetch import MemoryPrefetchMixin
|
|
80
|
+
from agents.task.agent.core.background_review import BackgroundReviewMixin
|
|
81
|
+
from agents.task.agent.core.step import StepMixin
|
|
82
|
+
from agents.task.agent.core.history_io import HistoryIOMixin
|
|
83
|
+
from agents.task.agent.core.logging_io import LoggingIOMixin
|
|
84
|
+
from agents.task.agent.core.safety_lifecycle import SafetyLifecycleMixin
|
|
85
|
+
from agents.task.agent.core.user_ingress import UserIngressMixin
|
|
86
|
+
from agents.task.agent.core.llm_provisioning import LLMProvisioningMixin
|
|
87
|
+
from agents.task.agent.core.model_swap import ModelSwapMixin
|
|
88
|
+
from agents.task.agent.core.model_introspection import ModelIntrospectionMixin
|
|
89
|
+
from agents.task.agent.core.loop_detection import LoopDetectionMixin
|
|
90
|
+
from agents.task.agent.core.turn_input import TurnInputMixin
|
|
91
|
+
from agents.task.agent.core.resources import ResourceMixin
|
|
92
|
+
from agents.task.agent.core.session_metadata import SessionMetadataMixin
|
|
93
|
+
from agents.task.agent.core.error_recovery import ErrorRecoveryMixin
|
|
94
|
+
from agents.task.agent.core.step_telemetry import StepTelemetryMixin
|
|
95
|
+
from agents.task.agent.core.output_validation import OutputValidationMixin
|
|
96
|
+
from agents.task.agent.core.result_processing import ResultProcessingMixin
|
|
97
|
+
from agents.task.agent.core.next_action_internal import NextActionInternalMixin
|
|
98
|
+
from agents.task.agent.core.step_execution import StepExecutionMixin
|
|
99
|
+
from agents.task.agent.core.run_loop import RunLoopMixin
|
|
100
|
+
from agents.task.agent.core.construction import AgentConstructionMixin
|
|
101
|
+
from agents.task.agent.prompts import SystemPrompt, AgentMessagePrompt
|
|
102
|
+
from agents.task.agent.views import (
|
|
103
|
+
ActionModel,
|
|
104
|
+
AgentBrain,
|
|
105
|
+
AgentError,
|
|
106
|
+
AgentHistory,
|
|
107
|
+
AgentHistoryList,
|
|
108
|
+
AgentOutput,
|
|
109
|
+
AgentStepInfo,
|
|
110
|
+
ActionResult,
|
|
111
|
+
)
|
|
112
|
+
from tools.browser.context import BrowserContext
|
|
113
|
+
from tools.dom.views import DOMElementNode, SelectorMap
|
|
114
|
+
from agents.task.telemetry.views import (
|
|
115
|
+
HumanApprovalRequestedEvent,
|
|
116
|
+
HumanApprovalDecisionEvent,
|
|
117
|
+
TodoStatusEvent,
|
|
118
|
+
AgentRunTelemetryEvent,
|
|
119
|
+
AgentEndTelemetryEvent,
|
|
120
|
+
ProviderFailureEvent,
|
|
121
|
+
ProviderFallbackSuccessEvent,
|
|
122
|
+
)
|
|
123
|
+
# ProductTelemetry no longer directly used - accessed via TelemetryManager
|
|
124
|
+
from agents.task.utils import time_execution_async, detect_llm_provider, extract_token_usage
|
|
125
|
+
# Safely import Google API exceptions
|
|
126
|
+
try:
|
|
127
|
+
from google.api_core.exceptions import ResourceExhausted
|
|
128
|
+
except ImportError:
|
|
129
|
+
# Create a dummy exception class if google-api-core is not installed
|
|
130
|
+
class ResourceExhausted(Exception):
|
|
131
|
+
pass
|
|
132
|
+
|
|
133
|
+
# Import from our own logging config
|
|
134
|
+
from agents.task.logging_config import get_task_logger
|
|
135
|
+
|
|
136
|
+
# Import centralized path management
|
|
137
|
+
from agents.task.path import pm
|
|
138
|
+
|
|
139
|
+
load_dotenv()
|
|
140
|
+
|
|
141
|
+
# Generic logger for the module itself (not instances)
|
|
142
|
+
logger = get_task_logger('agent')
|
|
143
|
+
|
|
144
|
+
T = TypeVar('T', bound=BaseModel)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def _normalize_llm_content(content: Any) -> str:
|
|
149
|
+
"""
|
|
150
|
+
Normalize LLM response content to string format.
|
|
151
|
+
|
|
152
|
+
Some providers (like Gemini) return content as a list of content blocks,
|
|
153
|
+
while others (OpenAI, Anthropic) return it as a string.
|
|
154
|
+
|
|
155
|
+
Args:
|
|
156
|
+
content: LLM response content (str, list, or other)
|
|
157
|
+
|
|
158
|
+
Returns:
|
|
159
|
+
Normalized string content
|
|
160
|
+
"""
|
|
161
|
+
if content is None:
|
|
162
|
+
return ""
|
|
163
|
+
|
|
164
|
+
if isinstance(content, str):
|
|
165
|
+
return content
|
|
166
|
+
|
|
167
|
+
if isinstance(content, list):
|
|
168
|
+
# Extract text from content blocks
|
|
169
|
+
content_parts = []
|
|
170
|
+
for block in content:
|
|
171
|
+
if isinstance(block, str):
|
|
172
|
+
content_parts.append(block)
|
|
173
|
+
elif hasattr(block, 'text'):
|
|
174
|
+
content_parts.append(block.text)
|
|
175
|
+
elif isinstance(block, dict) and 'text' in block:
|
|
176
|
+
content_parts.append(block['text'])
|
|
177
|
+
else:
|
|
178
|
+
content_parts.append(str(block))
|
|
179
|
+
return "".join(content_parts)
|
|
180
|
+
|
|
181
|
+
# Fallback to string conversion
|
|
182
|
+
return str(content)
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
# Known tool/service names that namespace their actions
|
|
186
|
+
_KNOWN_TOOLS = {
|
|
187
|
+
'polymarket', 'mcp', 'twitter', 'email', 'perplexity',
|
|
188
|
+
'filesystem', 'browser', 'collabland', 'alchemy', 'task'
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def _detect_service_for_action(action_name: str) -> str:
|
|
193
|
+
"""Detect which service an action belongs to based on its name.
|
|
194
|
+
|
|
195
|
+
Uses a multi-tier detection strategy:
|
|
196
|
+
1. Check for known tool prefix (e.g., 'polymarket_get_markets' → 'polymarket')
|
|
197
|
+
2. Fall back to keyword-based detection for legacy actions
|
|
198
|
+
3. Return 'default' if no match found
|
|
199
|
+
|
|
200
|
+
Args:
|
|
201
|
+
action_name: The name of the action
|
|
202
|
+
|
|
203
|
+
Returns:
|
|
204
|
+
The service name or 'default' if not detected
|
|
205
|
+
"""
|
|
206
|
+
action_name_lower = action_name.lower()
|
|
207
|
+
|
|
208
|
+
# Strategy 1: Check for known tool prefix pattern (tool_action)
|
|
209
|
+
for tool in _KNOWN_TOOLS:
|
|
210
|
+
if action_name_lower.startswith(f"{tool}_"):
|
|
211
|
+
return tool
|
|
212
|
+
|
|
213
|
+
# Strategy 2: Keyword-based detection for actions without prefix
|
|
214
|
+
if 'perplexity' in action_name_lower or 'search_web' in action_name_lower:
|
|
215
|
+
return 'perplexity'
|
|
216
|
+
elif any(kw in action_name_lower for kw in ['document', 'doc_', 'extract_text', 'process_',
|
|
217
|
+
'file', 'write_file', 'read_file', 'append_file',
|
|
218
|
+
'delete_file', 'create_directory', 'list_directory']):
|
|
219
|
+
return 'filesystem'
|
|
220
|
+
elif any(kw in action_name_lower for kw in ['click', 'scroll', 'input', 'navigate', 'go_to',
|
|
221
|
+
'browse_to', 'back', 'forward', 'reload', 'screenshot']):
|
|
222
|
+
return 'browser'
|
|
223
|
+
elif 'mcp' in action_name_lower:
|
|
224
|
+
return 'mcp'
|
|
225
|
+
|
|
226
|
+
# Strategy 3: Try to extract prefix from first underscore
|
|
227
|
+
if '_' in action_name_lower:
|
|
228
|
+
potential_tool = action_name_lower.split('_')[0]
|
|
229
|
+
if len(potential_tool) >= 3 and potential_tool not in {'get', 'set', 'add', 'del', 'run'}:
|
|
230
|
+
return potential_tool
|
|
231
|
+
|
|
232
|
+
return 'default'
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
@dataclass
|
|
236
|
+
class AgentDeps:
|
|
237
|
+
"""Injected collaborators an Agent needs (objects/callables, not config values).
|
|
238
|
+
|
|
239
|
+
Split out of the old 31-param Agent.__init__ (PR9 item #2). Construct via
|
|
240
|
+
Agent(config, deps), or use Agent.from_params(**kwargs) for the legacy kwarg
|
|
241
|
+
interface.
|
|
242
|
+
"""
|
|
243
|
+
llm: "BaseChatModel"
|
|
244
|
+
orchestrator: Any # Required: provides session_id/user_id + infrastructure
|
|
245
|
+
page_extraction_llm: Optional["BaseChatModel"] = None
|
|
246
|
+
system_prompt_class: Type[SystemPrompt] = SystemPrompt
|
|
247
|
+
register_new_step_callback: Optional[Callable[['BrowserState', 'AgentOutput', int], None]] = None
|
|
248
|
+
register_done_callback: Optional[Callable[['AgentHistoryList'], None]] = None
|
|
249
|
+
# UP-05: an explicit Controller to bind instead of orchestrator.controller — used
|
|
250
|
+
# to give a delegated sub-agent a least-privilege child Controller. None => the
|
|
251
|
+
# shared orchestrator controller (default, pre-UP-05 behaviour).
|
|
252
|
+
controller: Optional[Any] = None
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
@dataclass
|
|
256
|
+
class AgentConfig:
|
|
257
|
+
"""Scalar/behavioural configuration for an Agent (everything that isn't a
|
|
258
|
+
collaborator). Defaults match the historical Agent.__init__ defaults exactly."""
|
|
259
|
+
task: str
|
|
260
|
+
use_vision: bool = True
|
|
261
|
+
save_conversation_path: Optional[str] = None
|
|
262
|
+
save_conversation_path_encoding: Optional[str] = 'utf-8'
|
|
263
|
+
max_failures: int = 5
|
|
264
|
+
retry_delay: int = 10
|
|
265
|
+
max_input_tokens: Optional[int] = None # model-specific limit if not provided
|
|
266
|
+
# CO-F1: judge-backed output validation of the agent's final answer. Default OFF
|
|
267
|
+
# (env `VALIDATE_OUTPUT`, core.env SSOT falsey-set); an explicit AgentConfig
|
|
268
|
+
# kwarg still wins over the env default (this is a plain field, not a
|
|
269
|
+
# default_factory, so callers that pass validate_output=... are unaffected).
|
|
270
|
+
validate_output: bool = field(default_factory=lambda: _bool_env("VALIDATE_OUTPUT", False))
|
|
271
|
+
generate_gif: bool | str = True
|
|
272
|
+
sensitive_data: Optional[Dict[str, str]] = None
|
|
273
|
+
available_file_paths: Optional[list[str]] = None
|
|
274
|
+
include_attributes: Optional[list[str]] = None
|
|
275
|
+
max_error_length: int = 400
|
|
276
|
+
max_actions_per_step: int = 10
|
|
277
|
+
initial_actions: Optional[List[Dict[str, Dict[str, Any]]]] = None
|
|
278
|
+
tool_calling_method: Optional[str] = 'auto'
|
|
279
|
+
agent_name: str = "agent"
|
|
280
|
+
session_config: Optional[Dict[str, Any]] = None
|
|
281
|
+
profile_id: Optional[str] = None
|
|
282
|
+
profile_overrides: Optional[Dict[str, Any]] = None
|
|
283
|
+
use_native_tools: bool = True
|
|
284
|
+
step_timeout_seconds: Optional[int] = 600
|
|
285
|
+
stall_timeout_seconds: Optional[int] = 600
|
|
286
|
+
max_step_timeout: int = 900
|
|
287
|
+
is_sub_agent: bool = False
|
|
288
|
+
parent_session_id: Optional[str] = None
|
|
289
|
+
role: str = "orchestrator" # "orchestrator" may delegate; sub-agents get "leaf"
|
|
290
|
+
persona_block: Optional[str] = None # S1: chat-mode persona text → SystemPrompt <identity>
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
# Keys that belong to AgentDeps; everything else in a kwargs blob is AgentConfig.
|
|
294
|
+
_AGENT_DEP_KEYS = frozenset({
|
|
295
|
+
'llm', 'orchestrator', 'page_extraction_llm', 'system_prompt_class',
|
|
296
|
+
'register_new_step_callback', 'register_done_callback', 'controller',
|
|
297
|
+
})
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
class Agent(AgentConstructionMixin, RunLoopMixin, StepMixin, StepExecutionMixin, StepTelemetryMixin, ResultProcessingMixin, LLMRunnerMixin, NextActionInternalMixin, ErrorRecoveryMixin, OutputValidationMixin, MemoryWriterMixin, MemoryPrefetchMixin, BackgroundReviewMixin, HistoryIOMixin, LoggingIOMixin, SafetyLifecycleMixin, UserIngressMixin, TurnInputMixin, LLMProvisioningMixin, ModelSwapMixin, ModelIntrospectionMixin, LoopDetectionMixin, ResourceMixin, SessionMetadataMixin):
|
|
301
|
+
@classmethod
|
|
302
|
+
def from_params(cls, **kwargs) -> "Agent":
|
|
303
|
+
"""Build an Agent from the legacy flat keyword arguments.
|
|
304
|
+
|
|
305
|
+
Splits kwargs into AgentDeps (the collaborators in _AGENT_DEP_KEYS) and
|
|
306
|
+
AgentConfig (everything else), then calls Agent(config, deps). This keeps
|
|
307
|
+
every existing call site (orchestrator.create_agent, tests) working with a
|
|
308
|
+
one-token change while Agent.__init__ itself takes just (config, deps).
|
|
309
|
+
"""
|
|
310
|
+
dep_kwargs = {k: kwargs.pop(k) for k in list(kwargs) if k in _AGENT_DEP_KEYS}
|
|
311
|
+
config = AgentConfig(**kwargs)
|
|
312
|
+
deps = AgentDeps(**dep_kwargs)
|
|
313
|
+
return cls(config, deps)
|
|
314
|
+
|
|
315
|
+
def _save_initial_task(self):
|
|
316
|
+
"""Save the initial task to task.json for webview chat.
|
|
317
|
+
|
|
318
|
+
Creates a task.json file in the session directory that contains:
|
|
319
|
+
- task: The initial task description
|
|
320
|
+
- timestamp: When the task was created
|
|
321
|
+
- agent_name: Name of the agent handling the task
|
|
322
|
+
|
|
323
|
+
This file is used by the webview chat tab to display the initial
|
|
324
|
+
user message/task at the top of the conversation.
|
|
325
|
+
"""
|
|
326
|
+
try:
|
|
327
|
+
from agents.task.path import pm
|
|
328
|
+
|
|
329
|
+
session_id = pm().clean_session_id(self.session_id)
|
|
330
|
+
session_dir = pm().get_data_dir(session_id, user_id=self.user_id)
|
|
331
|
+
task_file = session_dir / "task.json"
|
|
332
|
+
|
|
333
|
+
task_data = {
|
|
334
|
+
"task": self.task,
|
|
335
|
+
"timestamp": time.time(),
|
|
336
|
+
"agent_name": self.agent_name
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
with open(task_file, 'w') as f:
|
|
340
|
+
json.dump(task_data, f, indent=2)
|
|
341
|
+
|
|
342
|
+
self.logger.info(f"✓ Saved task.json for session {session_id}")
|
|
343
|
+
except Exception as e:
|
|
344
|
+
self.logger.warning(f"Failed to save task.json: {e}")
|
|
345
|
+
|
|
346
|
+
def _has_active_browser_usage(self) -> bool:
|
|
347
|
+
"""Check if browser was ACTIVELY used in recent steps.
|
|
348
|
+
|
|
349
|
+
FIX (Jan 2026): Simplified detection - only check recent action history.
|
|
350
|
+
The AgentMessagePrompt._has_meaningful_browser_state() handles the
|
|
351
|
+
current state check. This method only checks if browser TOOLS were used.
|
|
352
|
+
|
|
353
|
+
CRITICAL: Does NOT check:
|
|
354
|
+
- browser_context existence (always exists for browser-capable agents)
|
|
355
|
+
- task keywords (too aggressive, e.g. "parse URL from file")
|
|
356
|
+
|
|
357
|
+
DOES check:
|
|
358
|
+
- If recent actions include browser tool usage
|
|
359
|
+
- If last browser state has a real URL (not empty/placeholder)
|
|
360
|
+
|
|
361
|
+
Returns:
|
|
362
|
+
True if browser was actively used recently, False otherwise
|
|
363
|
+
"""
|
|
364
|
+
# Check 1: Were browser tools used in recent actions?
|
|
365
|
+
if hasattr(self, '_previous_actions') and self._previous_actions:
|
|
366
|
+
browser_action_prefixes = ('browser_go_to', 'browser_click', 'browser_type',
|
|
367
|
+
'browser_scroll', 'browser_screenshot',
|
|
368
|
+
'browser_extract', 'browser_navigate')
|
|
369
|
+
for action in self._previous_actions:
|
|
370
|
+
action_name = str(action).lower() if action else ""
|
|
371
|
+
if any(prefix in action_name for prefix in browser_action_prefixes):
|
|
372
|
+
return True
|
|
373
|
+
|
|
374
|
+
# Check 2: Does the last browser state have a real URL?
|
|
375
|
+
if hasattr(self, '_last_browser_states') and self._last_browser_states:
|
|
376
|
+
last_state = self._last_browser_states[-1] if self._last_browser_states else None
|
|
377
|
+
if last_state and hasattr(last_state, 'url'):
|
|
378
|
+
url = last_state.url
|
|
379
|
+
# Real URL must be non-empty and not a placeholder
|
|
380
|
+
if url and url.strip() and url != "about:blank":
|
|
381
|
+
return True
|
|
382
|
+
|
|
383
|
+
# Default: Browser not actively used
|
|
384
|
+
return False
|
|
385
|
+
|
|
386
|
+
@property
|
|
387
|
+
def session_id(self) -> str:
|
|
388
|
+
"""Get session_id from orchestrator (single source of truth)."""
|
|
389
|
+
return self.orchestrator.session_id
|
|
390
|
+
|
|
391
|
+
@property
|
|
392
|
+
def effective_session_id(self) -> str:
|
|
393
|
+
"""Get the effective session_id for this agent.
|
|
394
|
+
|
|
395
|
+
For main agents: returns orchestrator.session_id
|
|
396
|
+
For sub-agents: returns the virtual session_id (isolated context)
|
|
397
|
+
|
|
398
|
+
Use this for action execution contexts and file paths.
|
|
399
|
+
"""
|
|
400
|
+
if self._is_sub_agent and hasattr(self, 'message_manager') and self.message_manager:
|
|
401
|
+
# Sub-agents use their isolated session_id from message_manager
|
|
402
|
+
return getattr(self.message_manager, 'session_id', self.orchestrator.session_id)
|
|
403
|
+
return self.orchestrator.session_id
|
|
404
|
+
|
|
405
|
+
@property
|
|
406
|
+
def user_id(self) -> Optional[str]:
|
|
407
|
+
"""Get user_id from orchestrator (single source of truth)."""
|
|
408
|
+
return self.orchestrator.user_id
|
|
409
|
+
|
|
410
|
+
@property
|
|
411
|
+
def model_name(self) -> str:
|
|
412
|
+
"""Get model_name from MessageManager (single source of truth)."""
|
|
413
|
+
return self.message_manager.model_name
|
|
414
|
+
|
|
415
|
+
@model_name.setter
|
|
416
|
+
def model_name(self, value: str) -> None:
|
|
417
|
+
"""Update model_name via MessageManager (for LLM fallback scenarios)."""
|
|
418
|
+
self.message_manager.model_name = value
|
|
419
|
+
|
|
420
|
+
@property
|
|
421
|
+
def provider_name(self) -> str:
|
|
422
|
+
"""Get provider_name from MessageManager (single source of truth)."""
|
|
423
|
+
return self.message_manager.provider_name
|
|
424
|
+
|
|
425
|
+
@provider_name.setter
|
|
426
|
+
def provider_name(self, value: str) -> None:
|
|
427
|
+
"""Update provider_name via MessageManager (for live model swaps).
|
|
428
|
+
|
|
429
|
+
Mirrors the ``model_name`` setter: MessageManager is the SSOT and the
|
|
430
|
+
Agent property is a thin mirror. Needed so ``swap_model`` can set the
|
|
431
|
+
registry-canonical provider label authoritatively after a swap."""
|
|
432
|
+
self.message_manager.provider_name = value
|
|
433
|
+
|
|
434
|
+
@property
|
|
435
|
+
def container(self) -> Optional[Any]:
|
|
436
|
+
"""Get container from orchestrator (single source of truth).
|
|
437
|
+
|
|
438
|
+
Returns:
|
|
439
|
+
Container instance from orchestrator, or None if not available.
|
|
440
|
+
|
|
441
|
+
Note:
|
|
442
|
+
This property provides unified access to the container without
|
|
443
|
+
duplicating storage. The orchestrator is the single owner.
|
|
444
|
+
"""
|
|
445
|
+
return self.orchestrator.container if self.orchestrator else None
|
|
446
|
+
|
|
447
|
+
# LLM provisioning (_supports_streaming, _create_llm_from_config[_async],
|
|
448
|
+
# set_token_limits, _get_model_max_completion_tokens, _reconcile_native_tools,
|
|
449
|
+
# set_tool_calling_method) lives in core/llm_provisioning.py::LLMProvisioningMixin (P9).
|
|
450
|
+
# REMOVED: _set_model_names() - deprecated; chat_model_library set in __init__;
|
|
451
|
+
# model_name is a property delegating to MessageManager.
|
|
452
|
+
|
|
453
|
+
def _save_session_config(self) -> None:
|
|
454
|
+
"""Save the session configuration to the session directory for persistence and debugging."""
|
|
455
|
+
if not self.session_config:
|
|
456
|
+
return
|
|
457
|
+
|
|
458
|
+
try:
|
|
459
|
+
from agents.task.path import pm
|
|
460
|
+
from pathlib import Path
|
|
461
|
+
|
|
462
|
+
# Get session directory
|
|
463
|
+
session_dir = pm().get_session_root(self.session_id)
|
|
464
|
+
config_file = session_dir / "task_config.json"
|
|
465
|
+
|
|
466
|
+
# Save configuration
|
|
467
|
+
self.session_config.save(config_file)
|
|
468
|
+
self.logger.info(f"Saved session config to {config_file}")
|
|
469
|
+
|
|
470
|
+
# Also log a summary
|
|
471
|
+
self.logger.info(f"Config summary:\n{self.session_config.summary()}")
|
|
472
|
+
|
|
473
|
+
except Exception as e:
|
|
474
|
+
self.logger.warning(f"Failed to save session config: {e}")
|
|
475
|
+
|
|
476
|
+
def add_new_task(self, new_task: str) -> None:
|
|
477
|
+
self.message_manager.add_new_task(new_task)
|
|
478
|
+
|
|
479
|
+
async def _save_progress_on_timeout(self) -> None:
|
|
480
|
+
"""Save progress when a step times out to enable recovery."""
|
|
481
|
+
try:
|
|
482
|
+
# Save current todo state using TaskTool
|
|
483
|
+
if self.controller:
|
|
484
|
+
task_tool = self.controller.get_tool('task')
|
|
485
|
+
if task_tool and hasattr(task_tool, '_save_to_file'):
|
|
486
|
+
try:
|
|
487
|
+
task_tool._save_to_file(self.session_id)
|
|
488
|
+
self.logger.info("Saved todo progress on timeout")
|
|
489
|
+
except Exception as e:
|
|
490
|
+
self.logger.warning(f"Failed to save todos on timeout: {e}")
|
|
491
|
+
|
|
492
|
+
# Save message history checkpoint
|
|
493
|
+
if hasattr(self, 'message_manager'):
|
|
494
|
+
self.message_manager.checkpoint_history()
|
|
495
|
+
self.logger.info("Checkpointed message history on timeout")
|
|
496
|
+
|
|
497
|
+
except Exception as e:
|
|
498
|
+
self.logger.warning(f"Failed to save progress on timeout: {e}")
|
|
499
|
+
|
|
500
|
+
def _sanitize_text_for_log(self, text: str) -> str:
|
|
501
|
+
"""Trim inline base64 images or very long strings for logging (P9: see log_sanitize)."""
|
|
502
|
+
from agents.task.agent.log_sanitize import sanitize_text_for_log
|
|
503
|
+
return sanitize_text_for_log(text)
|
|
504
|
+
|
|
505
|
+
def _sanitize_structure_for_log(self, data):
|
|
506
|
+
"""Recursively sanitise nested structures for logging (P9: see log_sanitize)."""
|
|
507
|
+
from agents.task.agent.log_sanitize import sanitize_structure_for_log
|
|
508
|
+
return sanitize_structure_for_log(data)
|
|
509
|
+
|